Skip to content

Instantly share code, notes, and snippets.

@madtrick
Created June 27, 2016 13:53
Show Gist options
  • Save madtrick/4922fc0a7aad55dc69103d0df4e89dee to your computer and use it in GitHub Desktop.
Save madtrick/4922fc0a7aad55dc69103d0df4e89dee to your computer and use it in GitHub Desktop.
requirebin sketch
// Welcome! require() some modules from npm (like you were using browserify)
// and then hit Run Code to run your code on the right side.
// Modules get downloaded from browserify-cdn and bundled in your browser.
var contentful = require('contentful-management');
var client = contentful.createClient({
accessToken: ''
})
var space = client.getSpace('')
.then((space) => {
return space.createContentType({
name: 'The Content Type',
fields: [
{type: 'Symbol', id: 'shortText', name: 'Short text'},
{type: 'Location', id: 'location', name: 'Location'}
]
})
.then((contentType) => {
return space.createEntry('deleteme', {
fields: {
shortText: {
'en-US': 'en-US',
'en': 'en'
},
location: {
'en-US': {lat: 0, lon: 0},
'en': {lat: 1, lon: 1}
}
}
})
.then((entry) => {
console.log('Created entry', entry, entry.fields.location);
return entry.update();
})
.then((entry) => {
console.log('Updated entry', entry, entry.fields.location);
return space.getEntry(entry.sys.id);
})
.then((entry) => {
console.log('Fetched entry', entry, entry.fields.location);
console.log(entry);
});
});
});
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){
// 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');
};
},{}],2:[function(require,module,exports){
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = createClient;
var _defaults = require('lodash/defaults');
var _defaults2 = _interopRequireDefault(_defaults);
var _assign = require('lodash/assign');
var _assign2 = _interopRequireDefault(_assign);
var _cloneDeep = require('lodash/cloneDeep');
var _cloneDeep2 = _interopRequireDefault(_cloneDeep);
var _createHttpClient = require('contentful-sdk-core/create-http-client');
var _createHttpClient2 = _interopRequireDefault(_createHttpClient);
var _wrapHttpClient = require('./wrap-http-client');
var _wrapHttpClient2 = _interopRequireDefault(_wrapHttpClient);
var _version = require('../version');
var _version2 = _interopRequireDefault(_version);
var _createContentfulApi = require('./create-contentful-api');
var _createContentfulApi2 = _interopRequireDefault(_createContentfulApi);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* Create a client instance
* @func
* @name createClient
* @memberof contentfulManagement
* @param {object} params - Client initialization parameters
* @prop {string} params.accessToken - Contentful CDA Access Token
* @prop {boolean=} params.insecure - Requests will be made over http instead of the default https (default: true)
* @prop {string=} params.host - API host (default: cda.contentful.com)
* @prop {object=} params.agent - Optional Node.js HTTP agent for proxying (see <a href="https://nodejs.org/api/http.html#http_class_http_agent">Node.js docs</a> and <a href="https://www.npmjs.com/package/https-proxy-agent">https-proxy-agent</a>)
* @prop {object=} params.headers - Optional additional headers
* @prop {number=} params.concurrency - Number of allowed concurrent requests. Changing this value is not recommended. (default: 6)
* @prop {number=} params.delay - Delay in milliseconds for waiting after hitting the allowed number of concurrent requests. Changing this value is not recommended. (default: 1000)
* @prop {number=} params.maxRetries - Maximum number of retries when a 429 is received (default: 5)
* @prop {boolean=} params.retryOnTooManyRequests - If we should retry on 429s (default: true)
* @returns {ContentfulClientAPI.ClientAPI}
* @example
* const client = contentfulManagement.createClient({
* accessToken: 'myAccessToken'
* })
*/
function createClient(axios, params) {
params = (0, _defaults2.default)((0, _cloneDeep2.default)(params), {
rateLimit: 6,
rateLimitPeriod: 1000,
maxRetries: 5,
retryOnTooManyRequests: true
});
if (!params.accessToken) {
throw new TypeError('Expected parameter accessToken');
}
params.defaultHostname = 'api.contentful.com';
params.headers = (0, _assign2.default)(params.headers, {
'Content-Type': 'application/vnd.contentful.management.v1+json',
'X-Contentful-User-Agent': 'contentful-management.js/' + _version2.default
});
var http = (0, _wrapHttpClient2.default)((0, _createHttpClient2.default)(axios, params), {
concurrency: params.rateLimit,
delay: params.rateLimitPeriod,
maxRetries: params.maxRetries,
retryOnTooManyRequests: params.retryOnTooManyRequests
});
var api = (0, _createContentfulApi2.default)({
http: http
});
return api;
} /**
* Contentful Management API SDK. Allows you to create instances of a client
* with access to the Contentful Content Management API.
* @namespace contentfulManagement
* @see ContentfulClientAPI
*/
},{"../version":304,"./create-contentful-api":4,"./wrap-http-client":21,"contentful-sdk-core/create-http-client":126,"lodash/assign":268,"lodash/cloneDeep":270,"lodash/defaults":271}],3:[function(require,module,exports){
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _promise = require('babel-runtime/core-js/promise');
var _promise2 = _interopRequireDefault(_promise);
exports.default = createBackoff;
var _promisedWait = require('./promised-wait');
var _promisedWait2 = _interopRequireDefault(_promisedWait);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* Returns a wrapper method which waits a given amount of time before calling
* wrapped method.
* If the call to the wrapped method fails, retries `maxRetries` times, and if
* all those fail, it returns a rejected promise.
* @private
* @param {number} maxRetries - max number of retries before aborting
*/
function createBackoff(maxRetries) {
var attempt = 0;
return function maybeRetry(error, retry) {
if (attempt < maxRetries) {
return (0, _promisedWait2.default)(Math.pow(2, attempt++) * 1000).then(retry);
} else {
return _promise2.default.reject(error);
}
};
}
},{"./promised-wait":19,"babel-runtime/core-js/promise":28}],4:[function(require,module,exports){
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = createSpaceApi;
var _errorHandler = require('./error-handler');
var _errorHandler2 = _interopRequireDefault(_errorHandler);
var _entities = require('./entities');
var _entities2 = _interopRequireDefault(_entities);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* Creates API object with methods to access functionality from Contentful's
* Management API
* @private
* @param {Object} params - API initialization params
* @prop {Object} http - HTTP client instance
* @prop {Function} shouldLinksResolve - Link resolver preconfigured with global setting
* @return {ClientAPI}
*/
/**
* Contentful Management API Client. Contains methods which allow access to
* any operations that can be performed with a management token.
* @namespace ContentfulClientAPI
*/
/**
* Types for meta information found across the different entities in Contentful
* @namespace Meta
*/
/**
* System metadata. See <a href="https://www.contentful.com/developers/docs/references/content-delivery-api/#/introduction/common-resource-attributes">Common Resource Attributes</a> for more details.
* @memberof Meta
* @typedef Sys
* @prop {string} type
* @prop {string} id
* @prop {Meta.Link} space
* @prop {string} createdAt
* @prop {string} updatedAt
* @prop {number} revision
*/
/**
* Link to another entity. See <a href="https://www.contentful.com/developers/docs/concepts/links/">Links</a> for more details.
* @memberof Meta
* @typedef Link
* @prop {string} type - type of this entity. Always link.
* @prop {string} id
* @prop {string} linkType - type of this link. If defined, either Entry or Asset
*/
/**
* @memberof ContentfulClientAPI
* @typedef {Object} ClientAPI
* @prop {function} getSpace
* @prop {function} getSpaces
* @prop {function} createSpace
*/
function createSpaceApi(_ref) {
var http = _ref.http;
var _entities$space = _entities2.default.space;
var wrapSpace = _entities$space.wrapSpace;
var wrapSpaceCollection = _entities$space.wrapSpaceCollection;
/**
* Gets all spaces
* @memberof ContentfulClientAPI
* @return {Promise<Space.SpaceCollection>} Promise for a collection of Spaces
* @example
* client.getSpaces()
* .then(spaces => console.log(spaces.items))
*/
function getSpaces() {
return http.get('').then(function (response) {
return wrapSpaceCollection(http, response.data);
}, _errorHandler2.default);
}
/**
* Gets a space
* @memberof ContentfulClientAPI
* @param {string} id - Space ID
* @return {Promise<Space.Space>} Promise for a Space
* @example
* client.getSpace('spaceid')
* .then(space => console.log(space))
*/
function getSpace(id) {
return http.get(id).then(function (response) {
return wrapSpace(http, response.data);
}, _errorHandler2.default);
}
/**
* Creates a space
* @memberof ContentfulClientAPI
* @see {Space.Space}
* @param {object} data - Object representation of the Space to be created
* @param {string=} organizationId - Organization ID, if the associated token can manage more than one organization.
* @return {Promise<Space.Space>} Promise for the newly created Space
* @example
* client.createSpace({name: 'Space Name'})
* .then(space => console.log(space))
*/
function createSpace(data, organizationId) {
return http.post('', data, {
headers: organizationId ? { 'X-Contentful-Organization': organizationId } : {}
}).then(function (response) {
return wrapSpace(http, response.data);
}, _errorHandler2.default);
}
return {
getSpaces: getSpaces,
getSpace: getSpace,
createSpace: createSpace
};
}
},{"./entities":11,"./error-handler":17}],5:[function(require,module,exports){
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = createSpaceApi;
var _createRequestConfig = require('contentful-sdk-core/create-request-config');
var _createRequestConfig2 = _interopRequireDefault(_createRequestConfig);
var _errorHandler = require('./error-handler');
var _errorHandler2 = _interopRequireDefault(_errorHandler);
var _entities = require('./entities');
var _entities2 = _interopRequireDefault(_entities);
var _omit = require('lodash/omit');
var _omit2 = _interopRequireDefault(_omit);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* @memberof ContentfulSpaceAPI
* @typedef {Object} ClientAPI
* @prop {function} getContentType
* @prop {function} getContentTypes
* @prop {function} getEntry
* @prop {function} getEntries
* @prop {function} getAsset
* @prop {function} getAssets
*/
/**
* Creates API object with methods to access the Space API
* @private
* @param {Object} params - API initialization params
* @prop {Object} http - HTTP client instance
* @prop {Object} entities - Object with wrapper methods for each kind of entity
* @return {ClientAPI}
*/
/**
* Contentful Space API. Contains methods to access any operations at a space
* level, such as creating and reading entities contained in a space.
* @namespace ContentfulSpaceAPI
*/
function createSpaceApi(_ref) {
var http = _ref.http;
var wrapSpace = _entities2.default.space.wrapSpace;
var _entities$contentType = _entities2.default.contentType;
var wrapContentType = _entities$contentType.wrapContentType;
var wrapContentTypeCollection = _entities$contentType.wrapContentTypeCollection;
var _entities$entry = _entities2.default.entry;
var wrapEntry = _entities$entry.wrapEntry;
var wrapEntryCollection = _entities$entry.wrapEntryCollection;
var _entities$asset = _entities2.default.asset;
var wrapAsset = _entities$asset.wrapAsset;
var wrapAssetCollection = _entities$asset.wrapAssetCollection;
var _entities$locale = _entities2.default.locale;
var wrapLocale = _entities$locale.wrapLocale;
var wrapLocaleCollection = _entities$locale.wrapLocaleCollection;
var _entities$webhook = _entities2.default.webhook;
var wrapWebhook = _entities$webhook.wrapWebhook;
var wrapWebhookCollection = _entities$webhook.wrapWebhookCollection;
var _entities$role = _entities2.default.role;
var wrapRole = _entities$role.wrapRole;
var wrapRoleCollection = _entities$role.wrapRoleCollection;
var _entities$spaceMember = _entities2.default.spaceMembership;
var wrapSpaceMembership = _entities$spaceMember.wrapSpaceMembership;
var wrapSpaceMembershipCollection = _entities$spaceMember.wrapSpaceMembershipCollection;
var _entities$apiKey = _entities2.default.apiKey;
var wrapApiKey = _entities$apiKey.wrapApiKey;
var wrapApiKeyCollection = _entities$apiKey.wrapApiKeyCollection;
/**
* Space instances.
* @namespace Space
*/
/**
* Deletes the space
* @memberof Space
* @func delete
* @return {Promise} Promise for the deletion. It contains no data, but the Promise error case should be handled.
* @example
* space.delete()
* .catch(err => console.log(err))
*/
function deleteSpace() {
return http.delete('').then(function (response) {}, _errorHandler2.default);
}
/**
* Updates the space
* @memberof Space
* @func update
* @return {Promise<Space.Space>} Promise for the updated space.
* @example
* space.name = 'Updated Space Name'
* space.update()
* .then(space => console.log(space))
*/
function updateSpace() {
var raw = this.toPlainObject();
var data = (0, _omit2.default)(raw, ['sys']);
return http.put('', data, {
headers: {
'X-Contentful-Version': raw.sys.version
}
}).then(function (response) {
return wrapSpace(http, response.data);
}, _errorHandler2.default);
}
/**
* Gets a Content Type
* @memberof ContentfulSpaceAPI
* @param {string} id
* @return {Promise<ContentType.ContentType>} Promise for a Content Type
* @example
* space.getContentType('contentTypeId')
* .then(contentType => console.log(contentType))
*/
function getContentType(id) {
return http.get('content_types/' + id).then(function (response) {
return wrapContentType(http, response.data);
}, _errorHandler2.default);
}
/**
* Gets a collection of Content Types
* @memberof ContentfulSpaceAPI
* @param {Object=} query - Object with search parameters. Check the <a href="https://www.contentful.com/developers/docs/javascript/tutorials/using-js-cda-sdk/#retrieving-entries-with-search-parameters">JS SDK tutorial</a> and the <a href="https://www.contentful.com/developers/docs/references/content-delivery-api/#/reference/search-parameters">REST API reference</a> for more details.
* @return {Promise<ContentType.ContentTypeCollection>} Promise for a collection of Content Types
* @example
* space.getContentTypes()
* .then(contentTypes => console.log(contentTypes.items))
*/
function getContentTypes() {
var query = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
return http.get('content_types', (0, _createRequestConfig2.default)({ query: query })).then(function (response) {
return wrapContentTypeCollection(http, response.data);
}, _errorHandler2.default);
}
/**
* Creates a Content Type
* @memberof ContentfulSpaceAPI
* @see {ContentType.ContentType}
* @param {object} data - Object representation of the Content Type to be created
* @return {Promise<ContentType.ContentType>} Promise for the newly created Content Type
* @example
* space.createContentType({name: 'Post', fields: []})
* .then(ct => console.log(ct))
*/
function createContentType(data) {
return http.post('content_types', data).then(function (response) {
return wrapContentType(http, response.data);
}, _errorHandler2.default);
}
/**
* Creates a Content Type with a specific id
* @memberof ContentfulSpaceAPI
* @see {ContentType.ContentType}
* @param {string} id - Content Type ID
* @param {object} data - Object representation of the Content Type to be created
* @return {Promise<ContentType.ContentType>} Promise for the newly created Content Type
* @example
* space.createContentType('post', {name: 'Post', fields: []})
* .then(ct => console.log(ct))
*/
function createContentTypeWithId(id, data) {
return http.put('content_types/' + id, data).then(function (response) {
return wrapContentType(http, response.data);
}, _errorHandler2.default);
}
/**
* Gets an Entry
* @memberof ContentfulSpaceAPI
* @param {string} id
* @param {Object=} query - Object with search parameters. In this method it's only useful for `locale`.
* @return {Promise<Entry.Entry>} Promise for an Entry
* @example
* space.getEntry('entryId')
* .then(entry => console.log(entry))
*/
function getEntry(id) {
var query = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
return http.get('entries/' + id, (0, _createRequestConfig2.default)({ query: query })).then(function (response) {
return wrapEntry(http, response.data);
}, _errorHandler2.default);
}
/**
* Gets a collection of Entries
* @memberof ContentfulSpaceAPI
* @param {Object=} query - Object with search parameters. Check the <a href="https://www.contentful.com/developers/docs/javascript/tutorials/using-js-cda-sdk/#retrieving-entries-with-search-parameters">JS SDK tutorial</a> and the <a href="https://www.contentful.com/developers/docs/references/content-delivery-api/#/reference/search-parameters">REST API reference</a> for more details.
* @return {Promise<Entry.EntryCollection>} Promise for a collection of Entries
* @example
* space.getEntries({content_type: 'contentTypeId'})
* .then(entries => console.log(entries.items))
*/
function getEntries() {
var query = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
return http.get('entries', (0, _createRequestConfig2.default)({ query: query })).then(function (response) {
return wrapEntryCollection(http, response.data);
}, _errorHandler2.default);
}
/**
* Creates a Entry
* @memberof ContentfulSpaceAPI
* @see {Entry.Entry}
* @param {string} contentTypeId - The Content Type which this Entry is based on
* @param {object} data - Object representation of the Entry to be created
* @return {Promise<Entry.Entry>} Promise for the newly created Entry
* @example
* space.createEntry('contentTypeId', {
* fields: {
* title: {
* 'en-US': 'english content',
* 'de-DE': 'german content'
* }
* }
* })
* .then(e => console.log(e))
*/
function createEntry(contentTypeId, data) {
return http.post('entries', data, {
headers: {
'X-Contentful-Content-Type': contentTypeId
}
}).then(function (response) {
return wrapEntry(http, response.data);
}, _errorHandler2.default);
}
/**
* Creates a Entry with a specific id
* @memberof ContentfulSpaceAPI
* @see {Entry.Entry}
* @param {string} id - Entry ID
* @param {string} contentTypeId - The Content Type which this Entry is based on
* @param {object} data - Object representation of the Entry to be created
* @return {Promise<Entry.Entry>} Promise for the newly created Entry
* @example
* space.createEntryWithId('contentTypeId', 'entryId', {
* fields: {
* title: {
* 'en-US': 'english content',
* 'de-DE': 'german content'
* }
* }
* })
* .then(e => console.log(e))
*/
function createEntryWithId(contentTypeId, id, data) {
return http.put('entries/' + id, data, {
headers: {
'X-Contentful-Content-Type': contentTypeId
}
}).then(function (response) {
return wrapEntry(http, response.data);
}, _errorHandler2.default);
}
/**
* Gets an Asset
* @memberof ContentfulSpaceAPI
* @param {string} id
* @param {Object=} query - Object with search parameters. In this method it's only useful for `locale`.
* @return {Promise<Asset.Asset>} Promise for an Asset
* @example
* space.getAsset('assetId')
* .then(asset => console.log(asset))
*/
function getAsset(id) {
var query = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
return http.get('assets/' + id, (0, _createRequestConfig2.default)({ query: query })).then(function (response) {
return wrapAsset(http, response.data);
}, _errorHandler2.default);
}
/**
* Gets a collection of Assets
* @memberof ContentfulSpaceAPI
* @param {Object=} query - Object with search parameters. Check the <a href="https://www.contentful.com/developers/docs/javascript/tutorials/using-js-cda-sdk/#retrieving-entries-with-search-parameters">JS SDK tutorial</a> and the <a href="https://www.contentful.com/developers/docs/references/content-delivery-api/#/reference/search-parameters">REST API reference</a> for more details.
* @return {Promise<Asset.AssetCollection>} Promise for a collection of Assets
* @example
* space.getAssets()
* .then(assets => console.log(assets.items))
*/
function getAssets() {
var query = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
return http.get('assets', (0, _createRequestConfig2.default)({ query: query })).then(function (response) {
return wrapAssetCollection(http, response.data);
}, _errorHandler2.default);
}
/**
* Creates a Asset. After creation, call asset.processForLocale or asset.processForAllLocales to start asset processing.
* @memberof ContentfulSpaceAPI
* @see {Asset.Asset}
* @param {object} data - Object representation of the Asset to be created. Note that the field object should have an upload property on asset creation, which will be removed and replaced with an url property when processing is finished.
* @return {Promise<Asset.Asset>} Promise for the newly created Asset
* @example
* space.createAsset({fields: {
* fields: {
* file: {
* 'en-US': {
* contentType: 'image/jpeg',
* fileName: 'filename_english.jpg',
* upload: 'http://example.com/filename_original_en.jpg'
* },
* 'de-DE': {
* contentType: 'image/jpeg',
* fileName: 'filename_german.jpg',
* upload: 'http://example.com/filename_original_de.jpg'
* }
* }
* }
* })
* .then(e => console.log(e))
*/
function createAsset(data) {
return http.post('assets', data).then(function (response) {
return wrapAsset(http, response.data);
}, _errorHandler2.default);
}
/**
* Creates a Asset with a specific id. After creation, call asset.processForLocale or asset.processForAllLocales to start asset processing.
* @memberof ContentfulSpaceAPI
* @see {Asset.Asset}
* @param {string} id - Asset ID
* @param {object} data - Object representation of the Asset to be created. Note that the field object should have an upload property on asset creation, which will be removed and replaced with an url property when processing is finished.
* @return {Promise<Asset.Asset>} Promise for the newly created Asset
* @example
* space.createAssetWithId('image', {
* fields: {
* file: {
* 'en-US': {
* contentType: 'image/jpeg',
* fileName: 'filename_english.jpg',
* upload: 'http://example.com/filename_original_en.jpg'
* },
* 'de-DE': {
* contentType: 'image/jpeg',
* fileName: 'filename_german.jpg',
* upload: 'http://example.com/filename_original_de.jpg'
* }
* }
* }
* })
* .then(e => console.log(e))
*/
function createAssetWithId(id, data) {
return http.put('assets/' + id, data).then(function (response) {
return wrapAsset(http, response.data);
}, _errorHandler2.default);
}
/**
* Gets a Locale
* @memberof ContentfulSpaceAPI
* @param {string} id
* @return {Promise<Locale.Locale>} Promise for an Locale
* @example
* space.getLocale('localeId')
* .then(locale => console.log(locale))
*/
function getLocale(id) {
return http.get('locales/' + id).then(function (response) {
return wrapLocale(http, response.data);
}, _errorHandler2.default);
}
/**
* Gets a collection of Locales
* @memberof ContentfulSpaceAPI
* @return {Promise<Locale.LocaleCollection>} Promise for a collection of Locales
* @example
* space.getLocales()
* .then(locales => console.log(locales.items))
*/
function getLocales() {
return http.get('locales').then(function (response) {
return wrapLocaleCollection(http, response.data);
}, _errorHandler2.default);
}
/**
* Creates a Locale
* @memberof ContentfulSpaceAPI
* @see {Locale.Locale}
* @param {object} data - Object representation of the Locale to be created
* @return {Promise<Locale.Locale>} Promise for the newly created Locale
* @example
* space.createLocale({name: 'German (Germany)', code: 'de-DE'})
* .then(e => console.log(e))
*/
function createLocale(data) {
return http.post('locales', data).then(function (response) {
return wrapLocale(http, response.data);
}, _errorHandler2.default);
}
/**
* Gets a Webhook
* @memberof ContentfulSpaceAPI
* @param {string} id
* @return {Promise<Webhook.Webhook>} Promise for a Webhook
* @example
* space.getWebhook('id')
* .then(webhook => console.log(webhook))
*/
function getWebhook(id) {
return http.get('webhook_definitions/' + id).then(function (response) {
return wrapWebhook(http, response.data);
}, _errorHandler2.default);
}
/**
* Gets a collection of Webhooks
* @memberof ContentfulSpaceAPI
* @return {Promise<Webhook.WebhookCollection>} Promise for a collection of Webhooks
* @example
* space.getWebhooks()
* .then(webhooks => console.log(webhooks.items))
*/
function getWebhooks() {
return http.get('webhook_definitions').then(function (response) {
return wrapWebhookCollection(http, response.data);
}, _errorHandler2.default);
}
/**
* Creates a Webhook
* @memberof ContentfulSpaceAPI
* @see {Webhook.Webhook}
* @param {object} data - Object representation of the Webhook to be created
* @return {Promise<Webhook.Webhook>} Promise for the newly created Webhook
* @example
* space.createWebhook({})
* .then(webhook => console.log(webhook))
*/
function createWebhook(data) {
return http.post('webhook_definitions', data).then(function (response) {
return wrapWebhook(http, response.data);
}, _errorHandler2.default);
}
/**
* Creates a Webhook with a specific id
* @memberof ContentfulSpaceAPI
* @see {Webhook.Webhook}
* @param {string} id - Webhook ID
* @param {object} data - Object representation of the Webhook to be created
* @return {Promise<Webhook.Webhook>} Promise for the newly created Webhook
* @example
* space.createWebhook('id', {})
* .then(webhook => console.log(webhook))
*/
function createWebhookWithId(id, data) {
return http.put('webhook_definitions/' + id, data).then(function (response) {
return wrapWebhook(http, response.data);
}, _errorHandler2.default);
}
/**
* Gets a Space Membership
* @memberof ContentfulSpaceAPI
* @param {string} id
* @return {Promise<SpaceMembership.SpaceMembership>} Promise for a Space Membership
* @example
* space.getSpaceMembership('id')
* .then(spaceMembership => console.log(spaceMembership))
*/
function getSpaceMembership(id) {
return http.get('space_memberships/' + id).then(function (response) {
return wrapSpaceMembership(http, response.data);
}, _errorHandler2.default);
}
/**
* Gets a collection of Space Memberships
* @memberof ContentfulSpaceAPI
* @return {Promise<SpaceMembership.SpaceMembershipCollection>} Promise for a collection of Space Memberships
* @example
* space.getSpaceMemberships()
* .then(spaceMemberships => console.log(spaceMemberships.items))
*/
function getSpaceMemberships() {
return http.get('space_memberships').then(function (response) {
return wrapSpaceMembershipCollection(http, response.data);
}, _errorHandler2.default);
}
/**
* Creates a Space Membership
* @memberof ContentfulSpaceAPI
* @see {SpaceMembership.SpaceMembership}
* @param {object} data - Object representation of the Space Membership to be created
* @return {Promise<SpaceMembership.SpaceMembership>} Promise for the newly created Space Membership
* @example
* space.createSpaceMembership({})
* .then(spaceMembership => console.log(spaceMembership))
*/
function createSpaceMembership(data) {
return http.post('space_memberships', data).then(function (response) {
return wrapSpaceMembership(http, response.data);
}, _errorHandler2.default);
}
/**
* Creates a Space Membership with a specific id
* @memberof ContentfulSpaceAPI
* @see {SpaceMembership.SpaceMembership}
* @param {string} id - Space Membership ID
* @param {object} data - Object representation of the Space Membership to be created
* @return {Promise<SpaceMembership.SpaceMembership>} Promise for the newly created Space Membership
* @example
* space.createSpaceMembership('id', {})
* .then(spaceMembership => console.log(spaceMembership))
*/
function createSpaceMembershipWithId(id, data) {
return http.put('space_memberships/' + id, data).then(function (response) {
return wrapSpaceMembership(http, response.data);
}, _errorHandler2.default);
}
/**
* Gets a Role
* @memberof ContentfulSpaceAPI
* @param {string} id
* @return {Promise<Role.Role>} Promise for a Role
* @example
* space.getRole('id')
* .then(role => console.log(role))
*/
function getRole(id) {
return http.get('roles/' + id).then(function (response) {
return wrapRole(http, response.data);
}, _errorHandler2.default);
}
/**
* Gets a collection of Roles
* @memberof ContentfulSpaceAPI
* @return {Promise<Role.RoleCollection>} Promise for a collection of Roles
* @example
* space.getRoles()
* .then(roles => console.log(roles.items))
*/
function getRoles() {
return http.get('roles').then(function (response) {
return wrapRoleCollection(http, response.data);
}, _errorHandler2.default);
}
/**
* Creates a Role
* @memberof ContentfulSpaceAPI
* @see {Role.Role}
* @param {object} data - Object representation of the Role to be created
* @return {Promise<Role.Role>} Promise for the newly created Role
* @example
* space.createRole({})
* .then(role => console.log(role))
*/
function createRole(data) {
return http.post('roles', data).then(function (response) {
return wrapRole(http, response.data);
}, _errorHandler2.default);
}
/**
* Creates a Role with a specific id
* @memberof ContentfulSpaceAPI
* @see {Role.Role}
* @param {string} id - Role ID
* @param {object} data - Object representation of the Role to be created
* @return {Promise<Role.Role>} Promise for the newly created Role
* @example
* space.createRole('id', {})
* .then(role => console.log(role))
*/
function createRoleWithId(id, data) {
return http.put('roles/' + id, data).then(function (response) {
return wrapRole(http, response.data);
}, _errorHandler2.default);
}
/**
* Gets a Api Key
* @memberof ContentfulSpaceAPI
* @param {string} id
* @return {Promise<ApiKey.ApiKey>} Promise for a Api Key
* @example
* space.getApiKey('id')
* .then(apiKey => console.log(apiKey))
*/
function getApiKey(id) {
return http.get('api_keys/' + id).then(function (response) {
return wrapApiKey(http, response.data);
}, _errorHandler2.default);
}
/**
* Gets a collection of Api Keys
* @memberof ContentfulSpaceAPI
* @return {Promise<ApiKey.ApiKeyCollection>} Promise for a collection of Api Keys
* @example
* space.getApiKeys()
* .then(apiKeys => console.log(apiKeys.items))
*/
function getApiKeys() {
return http.get('api_keys').then(function (response) {
return wrapApiKeyCollection(http, response.data);
}, _errorHandler2.default);
}
/**
* Creates a Api Key
* @memberof ContentfulSpaceAPI
* @see {ApiKey.ApiKey}
* @param {object} data - Object representation of the Api Key to be created
* @return {Promise<ApiKey.ApiKey>} Promise for the newly created Api Key
* @example
* space.createApiKey({})
* .then(apiKey => console.log(apiKey))
*/
function createApiKey(data) {
return http.post('api_keys', data).then(function (response) {
return wrapApiKey(http, response.data);
}, _errorHandler2.default);
}
/**
* Creates a Api Key with a specific id
* @memberof ContentfulSpaceAPI
* @see {ApiKey.ApiKey}
* @param {string} id - Api Key ID
* @param {object} data - Object representation of the Api Key to be created
* @return {Promise<ApiKey.ApiKey>} Promise for the newly created Api Key
* @example
* space.createApiKey('id', {})
* .then(apiKey => console.log(apiKey))
*/
function createApiKeyWithId(id, data) {
return http.put('api_keys/' + id, data).then(function (response) {
return wrapApiKey(http, response.data);
}, _errorHandler2.default);
}
return {
delete: deleteSpace,
update: updateSpace,
getContentType: getContentType,
getContentTypes: getContentTypes,
createContentType: createContentType,
createContentTypeWithId: createContentTypeWithId,
getEntry: getEntry,
getEntries: getEntries,
createEntry: createEntry,
createEntryWithId: createEntryWithId,
getAsset: getAsset,
getAssets: getAssets,
createAsset: createAsset,
createAssetWithId: createAssetWithId,
getLocale: getLocale,
getLocales: getLocales,
createLocale: createLocale,
getWebhook: getWebhook,
getWebhooks: getWebhooks,
createWebhook: createWebhook,
createWebhookWithId: createWebhookWithId,
getRole: getRole,
getRoles: getRoles,
createRole: createRole,
createRoleWithId: createRoleWithId,
getSpaceMembership: getSpaceMembership,
getSpaceMemberships: getSpaceMemberships,
createSpaceMembership: createSpaceMembership,
createSpaceMembershipWithId: createSpaceMembershipWithId,
getApiKey: getApiKey,
getApiKeys: getApiKeys,
createApiKey: createApiKey,
createApiKeyWithId: createApiKeyWithId
};
}
},{"./entities":11,"./error-handler":17,"contentful-sdk-core/create-request-config":127,"lodash/omit":294}],6:[function(require,module,exports){
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _defineProperty = require('babel-runtime/core-js/object/define-property');
var _defineProperty2 = _interopRequireDefault(_defineProperty);
exports.default = enhanceWithMethods;
var _reduce = require('lodash/reduce');
var _reduce2 = _interopRequireDefault(_reduce);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* This method enhances a base object which would normally contain data, with
* methods from another object that might work on manipulating that data.
* All the added methods are set as non enumerable, non configurable, and non
* writable properties. This ensures that if we try to clone or stringify the
* base object, we don't have to worry about these additional methods.
* @private
* @param {object} baseObject - Base object with data
* @param {object} methodsObject - Object with methods as properties. The key
* values used here will be the same that will be defined on the baseObject.
*/
function enhanceWithMethods(baseObject, methodsObject) {
return (0, _reduce2.default)(methodsObject, function (baseObject, method, methodName) {
(0, _defineProperty2.default)(baseObject, methodName, {
enumerable: false,
configurable: false,
writable: false,
value: method
});
return baseObject;
}, baseObject);
}
},{"babel-runtime/core-js/object/define-property":25,"lodash/reduce":296}],7:[function(require,module,exports){
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.wrapApiKey = wrapApiKey;
exports.wrapApiKeyCollection = wrapApiKeyCollection;
var _cloneDeep = require('lodash/cloneDeep');
var _cloneDeep2 = _interopRequireDefault(_cloneDeep);
var _freezeSys = require('contentful-sdk-core/freeze-sys');
var _freezeSys2 = _interopRequireDefault(_freezeSys);
var _enhanceWithMethods = require('../enhance-with-methods');
var _enhanceWithMethods2 = _interopRequireDefault(_enhanceWithMethods);
var _toPlainObject = require('contentful-sdk-core/mixins/to-plain-object');
var _toPlainObject2 = _interopRequireDefault(_toPlainObject);
var _instanceActions = require('../instance-actions');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* @memberof ApiKey
* @typedef ApiKey
* @prop {Meta.Sys} sys - System metadata
* @prop {string} name
* @prop {string} description
* @prop {function(): Object} toPlainObject() - Returns this Api Key as a plain JS object
*/
function createApiKeyApi(http) {
return {
/**
* Sends an update to the server with any changes made to the object's properties
* @memberof ApiKey
* @func update
* @return {Promise<ApiKey>} Object returned from the server with updated changes.
* @example
* apiKey.name = 'New name'
* apiKey.update()
* .then(apiKey => console.log(apiKey.name))
*/
update: (0, _instanceActions.createUpdateEntity)({
http: http,
entityPath: 'api_keys',
wrapperMethod: wrapApiKey
}),
/**
* Deletes this object on the server.
* @memberof ApiKey
* @func delete
* @return {Promise} Promise for the deletion. It contains no data, but the Promise error case should be handled.
* @example
* apiKey.delete()
* .catch(err => console.log(err))
*/
delete: (0, _instanceActions.createDeleteEntity)({
http: http,
entityPath: 'api_keys'
})
};
}
/**
* @private
* @param {Object} http - HTTP client instance
* @param {Object} data - Raw api key data
* @return {ApiKey} Wrapped api key data
*/
/**
* Api Key instances
* @namespace ApiKey
*/
function wrapApiKey(http, data) {
var apiKey = (0, _toPlainObject2.default)((0, _cloneDeep2.default)(data));
(0, _enhanceWithMethods2.default)(apiKey, createApiKeyApi(http));
return (0, _freezeSys2.default)(apiKey);
}
/**
* @memberof ApiKey
* @typedef ApiKeyCollection
* @prop {number} total
* @prop {number} skip
* @prop {number} limit
* @prop {Array<ApiKey.ApiKey>} items
* @prop {function(): Object} toPlainObject() - Returns this Api Key collection as a plain JS object
*/
/**
* @private
* @param {Object} http - HTTP client instance
* @param {Object} data - Raw api key collection data
* @return {ApiKeyCollection} Wrapped api key collection data
*/
function wrapApiKeyCollection(http, data) {
var apiKeys = (0, _toPlainObject2.default)((0, _cloneDeep2.default)(data));
apiKeys.items = apiKeys.items.map(function (entity) {
return wrapApiKey(http, entity);
});
return (0, _freezeSys2.default)(apiKeys);
}
},{"../enhance-with-methods":6,"../instance-actions":18,"contentful-sdk-core/freeze-sys":128,"contentful-sdk-core/mixins/to-plain-object":129,"lodash/cloneDeep":270}],8:[function(require,module,exports){
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _keys = require('babel-runtime/core-js/object/keys');
var _keys2 = _interopRequireDefault(_keys);
var _promise = require('babel-runtime/core-js/promise');
var _promise2 = _interopRequireDefault(_promise);
exports.wrapAsset = wrapAsset;
exports.wrapAssetCollection = wrapAssetCollection;
var _cloneDeep = require('lodash/cloneDeep');
var _cloneDeep2 = _interopRequireDefault(_cloneDeep);
var _freezeSys = require('contentful-sdk-core/freeze-sys');
var _freezeSys2 = _interopRequireDefault(_freezeSys);
var _enhanceWithMethods = require('../enhance-with-methods');
var _enhanceWithMethods2 = _interopRequireDefault(_enhanceWithMethods);
var _toPlainObject = require('contentful-sdk-core/mixins/to-plain-object');
var _toPlainObject2 = _interopRequireDefault(_toPlainObject);
var _errorHandler = require('../error-handler');
var _errorHandler2 = _interopRequireDefault(_errorHandler);
var _instanceActions = require('../instance-actions');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* Asset instances
* @namespace Asset
*/
var ASSET_PROCESSING_CHECK_WAIT = 500;
var ASSET_PROCESSING_CHECK_RETRIES = 5;
/**
* @memberof Asset
* @typedef Asset
* @prop {Meta.Sys} sys - Standard system metadata with additional asset specific properties
* @prop {string=} sys.locale - If present, indicates the locale which this asset uses
* @prop {Object} fields - Object with content for each field
* @prop {string} fields.title - Title for this asset
* @prop {string} fields.description - Description for this asset
* @prop {Object} fields.file - File object for this asset
* @prop {Object} fields.file.fileName - Name for the file
* @prop {string} fields.file.contentType - Mime type for the file
* @prop {string=} fields.file.upload - Url where the file is available to be downloaded from, into the Contentful asset system. After the asset is processed this field is gone.
* @prop {string=} fields.file.url - Url where the file is available at the Contentful media asset system. This field won't be available until the asset is processed.
* @prop {Object} fields.file.details - Details for the file, depending on file type (example: image size in bytes, etc)
* @prop {function(): Object} toPlainObject() - Returns this Asset as a plain JS object
*/
function createAssetApi(http) {
function checkIfAssetHasUrl(_ref) {
var resolve = _ref.resolve;
var reject = _ref.reject;
var id = _ref.id;
var locale = _ref.locale;
var _ref$processingCheckW = _ref.processingCheckWait;
var processingCheckWait = _ref$processingCheckW === undefined ? ASSET_PROCESSING_CHECK_WAIT : _ref$processingCheckW;
var _ref$processingCheckR = _ref.processingCheckRetries;
var processingCheckRetries = _ref$processingCheckR === undefined ? ASSET_PROCESSING_CHECK_RETRIES : _ref$processingCheckR;
var _ref$checkCount = _ref.checkCount;
var checkCount = _ref$checkCount === undefined ? 0 : _ref$checkCount;
http.get('assets/' + id).then(function (response) {
return wrapAsset(http, response.data);
}, _errorHandler2.default).then(function (asset) {
if (asset.fields.file[locale].url) {
resolve(asset);
} else if (checkCount === processingCheckRetries) {
var error = new Error();
error.name = 'AssetProcessingTimeout';
error.message = 'Asset is taking longer then expected to process.';
reject(error);
} else {
checkCount++;
setTimeout(function () {
return checkIfAssetHasUrl({
resolve: resolve,
reject: reject,
id: id,
locale: locale,
checkCount: checkCount
});
}, processingCheckWait);
}
});
}
function processForLocale(locale) {
var _ref2 = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
var processingCheckWait = _ref2.processingCheckWait;
var processingCheckRetries = _ref2.processingCheckRetries;
var assetId = this.sys.id;
return http.put('assets/' + this.sys.id + '/files/' + locale + '/process', null, {
headers: {
'X-Contentful-Version': this.sys.version
}
}).then(function () {
return new _promise2.default(function (resolve, reject) {
return checkIfAssetHasUrl({
resolve: resolve,
reject: reject,
id: assetId,
locale: locale,
processingCheckWait: processingCheckWait,
processingCheckRetries: processingCheckRetries
});
});
}, _errorHandler2.default);
}
function processForAllLocales() {
var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
var self = this;
var locales = (0, _keys2.default)(this.fields.file);
return _promise2.default.all(locales.map(function (locale) {
return processForLocale.call(self, locale, options);
})).then(function (assets) {
return assets[0];
});
}
return {
/**
* Sends an update to the server with any changes made to the object's properties
* @memberof Asset
* @func update
* @return {Promise<Asset>} Object returned from the server with updated changes.
* @example
* contentType.fields.name['en-US'] = 'Blog Post'
* asset.update()
* .then(asset => console.log(asset.fields.name['en-US']))
*/
update: (0, _instanceActions.createUpdateEntity)({
http: http,
entityPath: 'assets',
wrapperMethod: wrapAsset
}),
/**
* Deletes this object on the server.
* @memberof Asset
* @func delete
* @return {Promise} Promise for the deletion. It contains no data, but the Promise error case should be handled.
* @example
* asset.delete()
* .catch(err => console.log(err))
*/
delete: (0, _instanceActions.createDeleteEntity)({
http: http,
entityPath: 'assets'
}),
/**
* Publishes the object
* @memberof Asset
* @func publish
* @return {Promise<Asset>} Object returned from the server with updated metadata.
* @example
* asset.publish()
* .then(asset => console.log(asset.sys.publishedVersion))
*/
publish: (0, _instanceActions.createPublishEntity)({
http: http,
entityPath: 'assets',
wrapperMethod: wrapAsset
}),
/**
* Unpublishes the object
* @memberof Asset
* @func unpublish
* @return {Promise<Asset>} Object returned from the server with updated metadata.
* @example
* asset.unpublish()
* .then(asset => console.log(asset.sys))
*/
unpublish: (0, _instanceActions.createUnpublishEntity)({
http: http,
entityPath: 'assets',
wrapperMethod: wrapAsset
}),
/**
* Archives the object
* @memberof Asset
* @func archive
* @return {Promise<Asset>} Object returned from the server with updated metadata.
* @example
* asset.archive()
* .then(asset => console.log(asset.sys.archivedVersion))
*/
archive: (0, _instanceActions.createArchiveEntity)({
http: http,
entityPath: 'assets',
wrapperMethod: wrapAsset
}),
/**
* Unarchives the object
* @memberof Asset
* @func unarchive
* @return {Promise<Asset>} Object returned from the server with updated metadata.
* @example
* asset.unarchive()
* .then(asset => console.log(asset.sys))
*/
unarchive: (0, _instanceActions.createUnarchiveEntity)({
http: http,
entityPath: 'assets',
wrapperMethod: wrapAsset
}),
/**
* Triggers asset processing after an upload, for the file uploaded to a specific locale.
* @memberof Asset
* @func processForLocale
* @param {string} locale - Locale which processing should be triggered for
* @param {object} options - Additional options for processing
* @prop {number} options.processingCheckWait - Time in milliseconds to wait before checking again if the asset has been processed (default: 500ms)
* @prop {number} options.processingCheckRetries - Maximum amount of times to check if the asset has been processed (default: 5)
* @return {Promise<Asset>} Object returned from the server with updated metadata.
* @throws {AssetProcessingTimeout} If the asset takes too long to process. If this happens, retrieve the asset again, and if the url property is available, then processing has succeeded. If not, your file might be damaged.
* @example
* asset.processForLocale('en-US')
* .then(asset => console.log(asset.fields.file['en-US'].url))
*/
processForLocale: processForLocale,
/**
* Triggers asset processing after an upload, for the files uploaded to all locales of an asset.
* @memberof Asset
* @func processForAllLocales
* @param {object} options - Additional options for processing
* @prop {number} options.processingCheckWait - Time in milliseconds to wait before checking again if the asset has been processed (default: 500ms)
* @prop {number} options.processingCheckRetries - Maximum amount of times to check if the asset has been processed (default: 5)
* @return {Promise<Asset>} Object returned from the server with updated metadata.
* @throws {AssetProcessingTimeout} If the asset takes too long to process. If this happens, retrieve the asset again, and if the url property is available, then processing has succeeded. If not, your file might be damaged.
* @example
* asset.processForAllLocales()
* .then(asset => console.log(asset.fields.file['en-US'].url, asset.fields.file['de-DE'].url))
*/
processForAllLocales: processForAllLocales,
/**
* Checks if the asset is published. A published asset might have unpublished changes (@see {Asset.isUpdated})
* @memberof Asset
* @func isPublished
* @return {boolean}
*/
isPublished: (0, _instanceActions.createPublishedChecker)(),
/**
* Checks if the asset is updated. This means the asset was previously published but has unpublished changes.
* @memberof Asset
* @func isUpdated
* @return {boolean}
*/
isUpdated: (0, _instanceActions.createUpdatedChecker)(),
/**
* Checks if the asset is in draft mode. This means it is not published.
* @memberof Asset
* @func isDraft
* @return {boolean}
*/
isDraft: (0, _instanceActions.createDraftChecker)(),
/**
* Checks if asset is archived. This means it's not exposed to the Delivery/Preview APIs.
* @memberof Asset
* @func isArchived
* @return {boolean}
*/
isArchived: (0, _instanceActions.createArchivedChecker)()
};
}
/**
* @private
* @param {Object} http - HTTP client instance
* @param {Object} data - Raw asset data
* @return {Asset} Wrapped asset data
*/
function wrapAsset(http, data) {
var asset = (0, _toPlainObject2.default)((0, _cloneDeep2.default)(data));
(0, _enhanceWithMethods2.default)(asset, createAssetApi(http));
return (0, _freezeSys2.default)(asset);
}
/**
* @memberof Asset
* @typedef AssetCollection
* @prop {number} total
* @prop {number} skip
* @prop {number} limit
* @prop {Array<Asset.Asset>} items
* @prop {function(): Object} toPlainObject() - Returns this Asset collection as a plain JS object
*/
/**
* @private
* @param {Object} http - HTTP client instance
* @param {Object} data - Raw asset collection data
* @return {AssetCollection} Wrapped asset collection data
*/
function wrapAssetCollection(http, data) {
var assets = (0, _toPlainObject2.default)((0, _cloneDeep2.default)(data));
assets.items = assets.items.map(function (entity) {
return wrapAsset(http, entity);
});
return (0, _freezeSys2.default)(assets);
}
},{"../enhance-with-methods":6,"../error-handler":17,"../instance-actions":18,"babel-runtime/core-js/object/keys":27,"babel-runtime/core-js/promise":28,"contentful-sdk-core/freeze-sys":128,"contentful-sdk-core/mixins/to-plain-object":129,"lodash/cloneDeep":270}],9:[function(require,module,exports){
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.wrapContentType = wrapContentType;
exports.wrapContentTypeCollection = wrapContentTypeCollection;
var _cloneDeep = require('lodash/cloneDeep');
var _cloneDeep2 = _interopRequireDefault(_cloneDeep);
var _freezeSys = require('contentful-sdk-core/freeze-sys');
var _freezeSys2 = _interopRequireDefault(_freezeSys);
var _enhanceWithMethods = require('../enhance-with-methods');
var _enhanceWithMethods2 = _interopRequireDefault(_enhanceWithMethods);
var _toPlainObject = require('contentful-sdk-core/mixins/to-plain-object');
var _toPlainObject2 = _interopRequireDefault(_toPlainObject);
var _instanceActions = require('../instance-actions');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* @memberof ContentType
* @typedef ContentType
* @prop {Meta.Sys} sys - System metadata
* @prop {string} name
* @prop {string} description
* @prop {string} displayField - Field used as the main display field for Entries
* @prop {string} Array<Field> - All the fields contained in this Content Type
* @prop {function(): Object} toPlainObject() - Returns this Content Type as a plain JS object
*/
function createContentTypeApi(http) {
return {
/**
* Sends an update to the server with any changes made to the object's properties
* @memberof ContentType
* @func update
* @return {Promise<ContentType>} Object returned from the server with updated changes.
* @example
* contentType.name = 'New name'
* contentType.update()
* .then(contentType => console.log(contentType.name))
*/
update: (0, _instanceActions.createUpdateEntity)({
http: http,
entityPath: 'content_types',
wrapperMethod: wrapContentType
}),
/**
* Deletes this object on the server.
* @memberof ContentType
* @func delete
* @return {Promise} Promise for the deletion. It contains no data, but the Promise error case should be handled.
* @example
* contentType.delete()
* .catch(err => console.log(err))
*/
delete: (0, _instanceActions.createDeleteEntity)({
http: http,
entityPath: 'content_types'
}),
/**
* Publishes the object
* @memberof ContentType
* @func publish
* @return {Promise<ContentType>} Object returned from the server with updated metadata.
* @example
* contentType.publish()
* .then(contentType => console.log(contentType.sys.publishedVersion))
*/
publish: (0, _instanceActions.createPublishEntity)({
http: http,
entityPath: 'content_types',
wrapperMethod: wrapContentType
}),
/**
* Unpublishes the object
* @memberof ContentType
* @func unpublish
* @return {Promise<ContentType>} Object returned from the server with updated metadata.
* @example
* contentType.unpublish()
* .then(contentType => console.log(contentType.sys))
*/
unpublish: (0, _instanceActions.createUnpublishEntity)({
http: http,
entityPath: 'content_types',
wrapperMethod: wrapContentType
}),
/**
* Checks if the contentType is published. A published contentType might have unpublished changes (@see {ContentType.isUpdated})
* @memberof ContentType
* @func isPublished
* @return {boolean}
*/
isPublished: (0, _instanceActions.createPublishedChecker)(),
/**
* Checks if the contentType is updated. This means the contentType was previously published but has unpublished changes.
* @memberof ContentType
* @func isUpdated
* @return {boolean}
*/
isUpdated: (0, _instanceActions.createUpdatedChecker)(),
/**
* Checks if the contentType is in draft mode. This means it is not published.
* @memberof ContentType
* @func isDraft
* @return {boolean}
*/
isDraft: (0, _instanceActions.createDraftChecker)()
};
}
/**
* @private
* @param {Object} http - HTTP client instance
* @param {Object} data - Raw content type data
* @return {ContentType} Wrapped content type data
*/
/**
* Content Type instances
* @namespace ContentType
*/
function wrapContentType(http, data) {
var contentType = (0, _toPlainObject2.default)((0, _cloneDeep2.default)(data));
(0, _enhanceWithMethods2.default)(contentType, createContentTypeApi(http));
return (0, _freezeSys2.default)(contentType);
}
/**
* @memberof ContentType
* @typedef ContentTypeCollection
* @prop {number} total
* @prop {number} skip
* @prop {number} limit
* @prop {Array<ContentType.ContentType>} items
* @prop {function(): Object} toPlainObject() - Returns this Content Type collection as a plain JS object
*/
/**
* @private
* @param {Object} http - HTTP client instance
* @param {Object} data - Raw content type collection data
* @return {ContentTypeCollection} Wrapped content type collection data
*/
function wrapContentTypeCollection(http, data) {
var contentTypes = (0, _toPlainObject2.default)((0, _cloneDeep2.default)(data));
contentTypes.items = contentTypes.items.map(function (entity) {
return wrapContentType(http, entity);
});
return (0, _freezeSys2.default)(contentTypes);
}
},{"../enhance-with-methods":6,"../instance-actions":18,"contentful-sdk-core/freeze-sys":128,"contentful-sdk-core/mixins/to-plain-object":129,"lodash/cloneDeep":270}],10:[function(require,module,exports){
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.wrapEntry = wrapEntry;
exports.wrapEntryCollection = wrapEntryCollection;
var _cloneDeep = require('lodash/cloneDeep');
var _cloneDeep2 = _interopRequireDefault(_cloneDeep);
var _freezeSys = require('contentful-sdk-core/freeze-sys');
var _freezeSys2 = _interopRequireDefault(_freezeSys);
var _enhanceWithMethods = require('../enhance-with-methods');
var _enhanceWithMethods2 = _interopRequireDefault(_enhanceWithMethods);
var _toPlainObject = require('contentful-sdk-core/mixins/to-plain-object');
var _toPlainObject2 = _interopRequireDefault(_toPlainObject);
var _instanceActions = require('../instance-actions');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* Types of fields found in an Entry
* @namespace EntryFields
*/
/**
* @memberof EntryFields
* @typedef Symbol
* @type string
*/
/**
* @memberof EntryFields
* @typedef Text
* @type string
*/
/**
* @memberof EntryFields
* @typedef Integer
* @type number
*/
/**
* @memberof EntryFields
* @typedef Number
* @type number
*/
/**
* @memberof EntryFields
* @typedef Date
* @type string
*/
/**
* @memberof EntryFields
* @typedef Boolean
* @type boolean
*/
/**
* @memberof EntryFields
* @typedef Location
* @prop {string} lat - latitude
* @prop {string} lon - longitude
*/
/**
* A Field in an Entry can have one of the following types that can be defined in Contentful. See <a href="https://www.contentful.com/developers/docs/references/field-type/">Field Types</a> for more details.
* @memberof EntryFields
* @typedef Field
* @type EntryFields.Symbol | EntryFields.Text | EntryFields.Integer | EntryFields.Number | EntryFields.Date | EntryFields.Boolean | EntryFields.Location | Meta.Link | Array<EntryFields.Symbol|Meta.Link> | Object
*/
/**
* @memberof Entry
* @typedef Entry
* @prop {Meta.Sys} sys - Standard system metadata with additional entry specific properties
* @prop {Meta.Link} sys.contentType - Content Type used by this Entry
* @prop {string=} sys.locale - If present, indicates the locale which this entry uses
* @prop {Object<EntryFields.Field>} fields - Object with content for each field
* @prop {function(): Object} toPlainObject() - Returns this Entry as a plain JS object
*/
function createEntryApi(http) {
return {
/**
* Sends an update to the server with any changes made to the object's properties
* @memberof Entry
* @func update
* @return {Promise<Entry>} Object returned from the server with updated changes.
* @example
* entry.fields.name['en-US'] = 'Blog Post'
* entry.update()
* .then(entry => console.log(entry.fields.name['en-US']))
*/
update: (0, _instanceActions.createUpdateEntity)({
http: http,
entityPath: 'entries',
wrapperMethod: wrapEntry
}),
/**
* Deletes this object on the server.
* @memberof Entry
* @func delete
* @return {Promise} Promise for the deletion. It contains no data, but the Promise error case should be handled.
* @example
* entry.delete()
* .catch(err => console.log(err))
*/
delete: (0, _instanceActions.createDeleteEntity)({
http: http,
entityPath: 'entries'
}),
/**
* Publishes the object
* @memberof Entry
* @func publish
* @return {Promise<Entry>} Object returned from the server with updated metadata.
* @example
* entry.publish()
* .then(entry => console.log(entry.sys.publishedVersion))
*/
publish: (0, _instanceActions.createPublishEntity)({
http: http,
entityPath: 'entries',
wrapperMethod: wrapEntry
}),
/**
* Unpublishes the object
* @memberof Entry
* @func unpublish
* @return {Promise<Entry>} Object returned from the server with updated metadata.
* @example
* entry.unpublish()
* .then(entry => console.log(entry.sys))
*/
unpublish: (0, _instanceActions.createUnpublishEntity)({
http: http,
entityPath: 'entries',
wrapperMethod: wrapEntry
}),
/**
* Archives the object
* @memberof Entry
* @func archive
* @return {Promise<Entry>} Object returned from the server with updated metadata.
* @example
* entry.archive()
* .then(entry => console.log(entry.sys.archivedVersion))
*/
archive: (0, _instanceActions.createArchiveEntity)({
http: http,
entityPath: 'entries',
wrapperMethod: wrapEntry
}),
/**
* Unarchives the object
* @memberof Entry
* @func unarchive
* @return {Promise<Entry>} Object returned from the server with updated metadata.
* @example
* entry.unarchive()
* .then(entry => console.log(entry.sys))
*/
unarchive: (0, _instanceActions.createUnarchiveEntity)({
http: http,
entityPath: 'entries',
wrapperMethod: wrapEntry
}),
/**
* Checks if the entry is published. A published entry might have unpublished changes (@see {Entry.isUpdated})
* @memberof Entry
* @func isPublished
* @return {boolean}
*/
isPublished: (0, _instanceActions.createPublishedChecker)(),
/**
* Checks if the entry is updated. This means the entry was previously published but has unpublished changes.
* @memberof Entry
* @func isUpdated
* @return {boolean}
*/
isUpdated: (0, _instanceActions.createUpdatedChecker)(),
/**
* Checks if the entry is in draft mode. This means it is not published.
* @memberof Entry
* @func isDraft
* @return {boolean}
*/
isDraft: (0, _instanceActions.createDraftChecker)(),
/**
* Checks if entry is archived. This means it's not exposed to the Delivery/Preview APIs.
* @memberof Entry
* @func isArchived
* @return {boolean}
*/
isArchived: (0, _instanceActions.createArchivedChecker)()
};
}
/**
* @private
* @param {Object} http - HTTP client instance
* @param {Object} data - Raw entry data
* @return {Entry} Wrapped entry data
*/
/**
* Entry instances
* @namespace Entry
*/
function wrapEntry(http, data) {
var entry = (0, _toPlainObject2.default)((0, _cloneDeep2.default)(data));
(0, _enhanceWithMethods2.default)(entry, createEntryApi(http));
return (0, _freezeSys2.default)(entry);
}
/**
* @memberof Entry
* @typedef EntryCollection
* @prop {number} total
* @prop {number} skip
* @prop {number} limit
* @prop {Array<Entry.Entry>} items
* @prop {Array<Object>=} errors - Array of errors that might occur when retrieving entries.
* @prop {function(): Object} toPlainObject() - Returns this Entry collection as a plain JS object
*/
/**
* Data is also mixed in with link getters if links exist and includes were requested
* @private
* @param {Object} http - HTTP client instance
* @param {Object} data - Raw entry collection data
* @return {EntryCollection} Wrapped entry collection data
*/
function wrapEntryCollection(http, data, resolveLinks) {
var entries = (0, _toPlainObject2.default)((0, _cloneDeep2.default)(data));
entries.items = entries.items.map(function (entity) {
return wrapEntry(http, entity);
});
return (0, _freezeSys2.default)(entries);
}
},{"../enhance-with-methods":6,"../instance-actions":18,"contentful-sdk-core/freeze-sys":128,"contentful-sdk-core/mixins/to-plain-object":129,"lodash/cloneDeep":270}],11:[function(require,module,exports){
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _space = require('./space');
var space = _interopRequireWildcard(_space);
var _entry = require('./entry');
var entry = _interopRequireWildcard(_entry);
var _asset = require('./asset');
var asset = _interopRequireWildcard(_asset);
var _contentType = require('./content-type');
var contentType = _interopRequireWildcard(_contentType);
var _locale = require('./locale');
var locale = _interopRequireWildcard(_locale);
var _webhook = require('./webhook');
var webhook = _interopRequireWildcard(_webhook);
var _spaceMembership = require('./space-membership');
var spaceMembership = _interopRequireWildcard(_spaceMembership);
var _role = require('./role');
var role = _interopRequireWildcard(_role);
var _apiKey = require('./api-key');
var apiKey = _interopRequireWildcard(_apiKey);
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; } }
exports.default = {
space: space,
entry: entry,
asset: asset,
contentType: contentType,
locale: locale,
webhook: webhook,
spaceMembership: spaceMembership,
role: role,
apiKey: apiKey
};
},{"./api-key":7,"./asset":8,"./content-type":9,"./entry":10,"./locale":12,"./role":13,"./space":15,"./space-membership":14,"./webhook":16}],12:[function(require,module,exports){
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.wrapLocale = wrapLocale;
exports.wrapLocaleCollection = wrapLocaleCollection;
var _cloneDeep = require('lodash/cloneDeep');
var _cloneDeep2 = _interopRequireDefault(_cloneDeep);
var _freezeSys = require('contentful-sdk-core/freeze-sys');
var _freezeSys2 = _interopRequireDefault(_freezeSys);
var _enhanceWithMethods = require('../enhance-with-methods');
var _enhanceWithMethods2 = _interopRequireDefault(_enhanceWithMethods);
var _toPlainObject = require('contentful-sdk-core/mixins/to-plain-object');
var _toPlainObject2 = _interopRequireDefault(_toPlainObject);
var _instanceActions = require('../instance-actions');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* @memberof Locale
* @typedef Locale
* @prop {Meta.Sys} sys - System metadata
* @prop {string} name
* @prop {string} code - Locale code (example: en-us)
* @prop {boolean} contentDeliveryApi - If the content under this locale should be available on the CDA (for public reading)
* @prop {boolean} contentManagementApi - If the content under this locale should be available on the CMA (for editing)
* @prop {boolean} default - If this is the default locale
* @prop {boolean} optional - If the locale needs to be filled in on entries or not
* @prop {function(): Object} toPlainObject() - Returns this Locale as a plain JS object
*/
function createLocaleApi(http) {
return {
/**
* Sends an update to the server with any changes made to the object's properties
* @memberof Locale
* @func update
* @return {Promise<Locale>} Object returned from the server with updated changes.
* @example
* locale.name = 'English'
* locale.update()
* .then(locale => console.log(locale.name))
*/
update: function update() {
// delete some properties which are returned by the server but shouldn't
// be sent back.
var locale = this;
delete locale.default;
delete locale.fallback_code;
return (0, _instanceActions.createUpdateEntity)({
http: http,
entityPath: 'locales',
wrapperMethod: wrapLocale
}).call(locale);
},
/**
* Deletes this object on the server.
* @memberof Locale
* @func delete
* @return {Promise} Promise for the deletion. It contains no data, but the Promise error case should be handled.
* @example
* locale.delete()
* .catch(err => console.log(err))
*/
delete: (0, _instanceActions.createDeleteEntity)({
http: http,
entityPath: 'locales'
})
};
}
/**
* @private
* @param {Object} http - HTTP client instance
* @param {Object} data - Raw locale data
* @return {Locale} Wrapped locale data
*/
function wrapLocale(http, data) {
var locale = (0, _toPlainObject2.default)((0, _cloneDeep2.default)(data));
delete locale.internal_code;
(0, _enhanceWithMethods2.default)(locale, createLocaleApi(http));
return (0, _freezeSys2.default)(locale);
}
/**
* @memberof Locale
* @typedef LocaleCollection
* @prop {number} total
* @prop {number} skip
* @prop {number} limit
* @prop {Array<Locale.Locale>} items
* @prop {function(): Object} toPlainObject() - Returns this Locale collection as a plain JS object
*/
/**
* @private
* @param {Object} http - HTTP client instance
* @param {Object} data - Raw locale collection data
* @return {LocaleCollection} Wrapped locale collection data
*/
function wrapLocaleCollection(http, data) {
var locales = (0, _toPlainObject2.default)((0, _cloneDeep2.default)(data));
locales.items = locales.items.map(function (entity) {
return wrapLocale(http, entity);
});
return (0, _freezeSys2.default)(locales);
}
},{"../enhance-with-methods":6,"../instance-actions":18,"contentful-sdk-core/freeze-sys":128,"contentful-sdk-core/mixins/to-plain-object":129,"lodash/cloneDeep":270}],13:[function(require,module,exports){
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.wrapRole = wrapRole;
exports.wrapRoleCollection = wrapRoleCollection;
var _cloneDeep = require('lodash/cloneDeep');
var _cloneDeep2 = _interopRequireDefault(_cloneDeep);
var _freezeSys = require('contentful-sdk-core/freeze-sys');
var _freezeSys2 = _interopRequireDefault(_freezeSys);
var _enhanceWithMethods = require('../enhance-with-methods');
var _enhanceWithMethods2 = _interopRequireDefault(_enhanceWithMethods);
var _toPlainObject = require('contentful-sdk-core/mixins/to-plain-object');
var _toPlainObject2 = _interopRequireDefault(_toPlainObject);
var _instanceActions = require('../instance-actions');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* See https://www.contentful.com/developers/docs/references/content-management-api/#/reference/roles/create-a-role
* @memberof Role
* @typedef Role
* @prop {Meta.Sys} sys - System metadata
* @prop {string} name
* @prop {object} permissions - Permissions for application sections
* @prop {object} policies
* @prop {function(): Object} toPlainObject() - Returns this Role as a plain JS object
*/
function createRoleApi(http) {
return {
/**
* Sends an update to the server with any changes made to the object's properties
* @memberof Role
* @func update
* @return {Promise<Role>} Object returned from the server with updated changes.
* @example
* role.name = 'New name'
* role.update()
* .then(role => console.log(role.name))
*/
update: (0, _instanceActions.createUpdateEntity)({
http: http,
entityPath: 'roles',
wrapperMethod: wrapRole
}),
/**
* Deletes this object on the server.
* @memberof Role
* @func delete
* @return {Promise} Promise for the deletion. It contains no data, but the Promise error case should be handled.
* @example
* role.delete()
* .catch(err => console.log(err))
*/
delete: (0, _instanceActions.createDeleteEntity)({
http: http,
entityPath: 'roles'
})
};
}
/**
* @private
* @param {Object} http - HTTP client instance
* @param {Object} data - Raw role data
* @return {Role} Wrapped role data
*/
/**
* Role instances
* @namespace Role
*/
function wrapRole(http, data) {
var role = (0, _toPlainObject2.default)((0, _cloneDeep2.default)(data));
(0, _enhanceWithMethods2.default)(role, createRoleApi(http));
return (0, _freezeSys2.default)(role);
}
/**
* @memberof Role
* @typedef RoleCollection
* @prop {number} total
* @prop {number} skip
* @prop {number} limit
* @prop {Array<Role.Role>} items
* @prop {function(): Object} toPlainObject() - Returns this Role collection as a plain JS object
*/
/**
* @private
* @param {Object} http - HTTP client instance
* @param {Object} data - Raw role collection data
* @return {RoleCollection} Wrapped role collection data
*/
function wrapRoleCollection(http, data) {
var roles = (0, _toPlainObject2.default)((0, _cloneDeep2.default)(data));
roles.items = roles.items.map(function (entity) {
return wrapRole(http, entity);
});
return (0, _freezeSys2.default)(roles);
}
},{"../enhance-with-methods":6,"../instance-actions":18,"contentful-sdk-core/freeze-sys":128,"contentful-sdk-core/mixins/to-plain-object":129,"lodash/cloneDeep":270}],14:[function(require,module,exports){
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.wrapSpaceMembership = wrapSpaceMembership;
exports.wrapSpaceMembershipCollection = wrapSpaceMembershipCollection;
var _cloneDeep = require('lodash/cloneDeep');
var _cloneDeep2 = _interopRequireDefault(_cloneDeep);
var _freezeSys = require('contentful-sdk-core/freeze-sys');
var _freezeSys2 = _interopRequireDefault(_freezeSys);
var _enhanceWithMethods = require('../enhance-with-methods');
var _enhanceWithMethods2 = _interopRequireDefault(_enhanceWithMethods);
var _toPlainObject = require('contentful-sdk-core/mixins/to-plain-object');
var _toPlainObject2 = _interopRequireDefault(_toPlainObject);
var _instanceActions = require('../instance-actions');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* @memberof SpaceMembership
* @typedef SpaceMembership
* @prop {Meta.Sys} sys - System metadata
* @prop {string} name
* @prop {boolean} admin - User is an admin
* @prop {array} roles - Array of Role Links
* @prop {function(): Object} toPlainObject() - Returns this Space Membership as a plain JS object
*/
function createSpaceMembershipApi(http) {
return {
/**
* Sends an update to the server with any changes made to the object's properties
* @memberof SpaceMembership
* @func update
* @return {Promise<SpaceMembership>} Object returned from the server with updated changes.
* @example
* spaceMembership.name = 'New name'
* spaceMembership.update()
* .then(spaceMembership => console.log(spaceMembership.name))
*/
update: (0, _instanceActions.createUpdateEntity)({
http: http,
entityPath: 'space_memberships',
wrapperMethod: wrapSpaceMembership
}),
/**
* Deletes this object on the server.
* @memberof SpaceMembership
* @func delete
* @return {Promise} Promise for the deletion. It contains no data, but the Promise error case should be handled.
* @example
* spaceMembership.delete()
* .catch(err => console.log(err))
*/
delete: (0, _instanceActions.createDeleteEntity)({
http: http,
entityPath: 'space_memberships'
})
};
}
/**
* @private
* @param {Object} http - HTTP client instance
* @param {Object} data - Raw space membership data
* @return {SpaceMembership} Wrapped space membership data
*/
/**
* Space Membership instances
* @namespace SpaceMembership
*/
function wrapSpaceMembership(http, data) {
var spaceMembership = (0, _toPlainObject2.default)((0, _cloneDeep2.default)(data));
(0, _enhanceWithMethods2.default)(spaceMembership, createSpaceMembershipApi(http));
return (0, _freezeSys2.default)(spaceMembership);
}
/**
* @memberof SpaceMembership
* @typedef SpaceMembershipCollection
* @prop {number} total
* @prop {number} skip
* @prop {number} limit
* @prop {Array<SpaceMembership.SpaceMembership>} items
* @prop {function(): Object} toPlainObject() - Returns this Space Membership collection as a plain JS object
*/
/**
* @private
* @param {Object} http - HTTP client instance
* @param {Object} data - Raw space membership collection data
* @return {SpaceMembershipCollection} Wrapped space membership collection data
*/
function wrapSpaceMembershipCollection(http, data) {
var spaceMemberships = (0, _toPlainObject2.default)((0, _cloneDeep2.default)(data));
spaceMemberships.items = spaceMemberships.items.map(function (entity) {
return wrapSpaceMembership(http, entity);
});
return (0, _freezeSys2.default)(spaceMemberships);
}
},{"../enhance-with-methods":6,"../instance-actions":18,"contentful-sdk-core/freeze-sys":128,"contentful-sdk-core/mixins/to-plain-object":129,"lodash/cloneDeep":270}],15:[function(require,module,exports){
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.wrapSpace = wrapSpace;
exports.wrapSpaceCollection = wrapSpaceCollection;
var _cloneDeep = require('lodash/cloneDeep');
var _cloneDeep2 = _interopRequireDefault(_cloneDeep);
var _freezeSys = require('contentful-sdk-core/freeze-sys');
var _freezeSys2 = _interopRequireDefault(_freezeSys);
var _toPlainObject = require('contentful-sdk-core/mixins/to-plain-object');
var _toPlainObject2 = _interopRequireDefault(_toPlainObject);
var _enhanceWithMethods = require('../enhance-with-methods');
var _enhanceWithMethods2 = _interopRequireDefault(_enhanceWithMethods);
var _wrapHttpClient = require('../wrap-http-client');
var _wrapHttpClient2 = _interopRequireDefault(_wrapHttpClient);
var _createSpaceApi = require('../create-space-api');
var _createSpaceApi2 = _interopRequireDefault(_createSpaceApi);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* @memberof Space
* @typedef Space
* @prop {Object} sys - System metadata
* @prop {string} sys.id - Space id
* @prop {string} sys.type - Entity type
* @prop {string} name - Space name
* @prop {Array<string>} locales - Array with locale codes
* @prop {function(): Object} toPlainObject() - Returns this Space as a plain JS object
*/
/**
* @memberof Space
* @typedef SpaceCollection
* @prop {number} total
* @prop {number} skip
* @prop {number} limit
* @prop {Array<Space.Space>} items
* @prop {function(): Object} toPlainObject() - Returns this Space collection as a plain JS object
*/
/**
* This method creates the API for the given space with all the methods for
* reading and creating other entities. It also passes down a clone of the
* http client with a space id, so the base path for requests now has the
* space id already set.
* @private
* @param {Object} http - HTTP client instance
* @param {Object} data - API response for a Space
* @return {Space}
*/
function wrapSpace(http, data) {
var space = (0, _toPlainObject2.default)((0, _cloneDeep2.default)(data));
var _http$httpClientParam = http.httpClientParams;
var rateLimit = _http$httpClientParam.rateLimit;
var rateLimitPeriod = _http$httpClientParam.rateLimitPeriod;
var maxRetries = _http$httpClientParam.maxRetries;
var retryOnTooManyRequests = _http$httpClientParam.retryOnTooManyRequests;
var httpClientParams = {
concurrency: rateLimit,
delay: rateLimitPeriod,
maxRetries: maxRetries,
retryOnTooManyRequests: retryOnTooManyRequests
};
var spaceScopedHttpClient = (0, _wrapHttpClient2.default)(http.cloneWithNewParams({
space: space.sys.id
}), httpClientParams);
var spaceApi = (0, _createSpaceApi2.default)({
http: spaceScopedHttpClient
});
var enhancedSpace = (0, _enhanceWithMethods2.default)(space, spaceApi);
return (0, _freezeSys2.default)(enhancedSpace);
}
/**
* This method wraps each space in a collection with the space API. See wrapSpace
* above for more details.
* @private
* @param {Object} http - HTTP client instance
* @param {Object} data - API response for a Space collection
* @return {SpaceCollection}
*/
function wrapSpaceCollection(http, data) {
var spaces = (0, _toPlainObject2.default)((0, _cloneDeep2.default)(data));
spaces.items = spaces.items.map(function (entity) {
return wrapSpace(http, entity);
});
return (0, _freezeSys2.default)(spaces);
}
},{"../create-space-api":5,"../enhance-with-methods":6,"../wrap-http-client":21,"contentful-sdk-core/freeze-sys":128,"contentful-sdk-core/mixins/to-plain-object":129,"lodash/cloneDeep":270}],16:[function(require,module,exports){
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.wrapWebhook = wrapWebhook;
exports.wrapWebhookCollection = wrapWebhookCollection;
var _cloneDeep = require('lodash/cloneDeep');
var _cloneDeep2 = _interopRequireDefault(_cloneDeep);
var _freezeSys = require('contentful-sdk-core/freeze-sys');
var _freezeSys2 = _interopRequireDefault(_freezeSys);
var _enhanceWithMethods = require('../enhance-with-methods');
var _enhanceWithMethods2 = _interopRequireDefault(_enhanceWithMethods);
var _toPlainObject = require('contentful-sdk-core/mixins/to-plain-object');
var _toPlainObject2 = _interopRequireDefault(_toPlainObject);
var _errorHandler = require('../error-handler');
var _errorHandler2 = _interopRequireDefault(_errorHandler);
var _instanceActions = require('../instance-actions');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* @memberof Webhook
* @typedef Webhook
* @prop {Meta.Sys} sys - System metadata
* @prop {string} name
* @prop {string} url - Url which the webhook will call
* @prop {string} httpBasicUsername - Username for basic HTTP authentication
* @prop {string} httpBasicPassword - Password for basic HTTP authentication
* @prop {object} headers - Key value pairs of additional headers to be sent with every webhook call.
* @prop {array} topics - Topics which this webhook should be subscribed to. See https://www.contentful.com/developers/docs/references/content-management-api/#/reference/webhooks/create-a-webhook for more details
* @prop {function(): Object} toPlainObject() - Returns this Webhook as a plain JS object
*/
/**
* Webhook instances
* @namespace Webhook
*/
function createWebhookApi(http) {
return {
/**
* Sends an update to the server with any changes made to the object's properties
* @memberof Webhook
* @func update
* @return {Promise<Webhook>} Object returned from the server with updated changes.
* @example
* webhook.name = 'New name'
* webhook.update()
* .then(webhook => console.log(webhook.name))
*/
update: (0, _instanceActions.createUpdateEntity)({
http: http,
entityPath: 'webhook_definitions',
wrapperMethod: wrapWebhook
}),
/**
* Deletes this object on the server.
* @memberof Webhook
* @func delete
* @return {Promise} Promise for the deletion. It contains no data, but the Promise error case should be handled.
* @example
* webhook.delete()
* .catch(err => console.log(err))
*/
delete: (0, _instanceActions.createDeleteEntity)({
http: http,
entityPath: 'webhook_definitions'
}),
/**
* List of the most recent webhook calls. See https://www.contentful.com/developers/docs/references/content-management-api/#/reference/webhook-calls/webhook-call-overviews for more details.
* @memberof Webhook
* @func getCalls
* @return {Promise<object>} Promise for list of calls
* @example
* webhook.getCalls()
* .then(calls => console.log(calls.items))
*/
getCalls: function getCalls() {
return http.get('webhooks/' + this.sys.id + '/calls').then(function (response) {
return response.data;
}, _errorHandler2.default);
},
/**
* Webhook call with specific id. See https://www.contentful.com/developers/docs/references/content-management-api/#/reference/webhook-calls/webhook-call-overviews for more details
* @memberof Webhook
* @func getCalls
* @return {Promise<object>} Promise for call details
* @example
* webhook.getCall('kjsdk1jeasd')
* .then(call => console.log(call))
*/
getCall: function getCall(id) {
return http.get('webhooks/' + this.sys.id + '/calls/' + id).then(function (response) {
return response.data;
}, _errorHandler2.default);
},
/**
* Overview of the health of webhook calls. See https://www.contentful.com/developers/docs/references/content-management-api/#/reference/webhook-calls/webhook-call-overviews for more details.
* @memberof Webhook
* @func getHealth
* @return {Promise<object>} Promise for health info
* @example
* webhook.getHealth()
* .then(health => console.log(health))
*/
getHealth: function getHealth() {
return http.get('webhooks/' + this.sys.id + '/health').then(function (response) {
return response.data;
}, _errorHandler2.default);
}
};
}
/**
* @private
* @param {Object} http - HTTP client instance
* @param {Object} data - Raw webhook data
* @return {Webhook} Wrapped webhook data
*/
function wrapWebhook(http, data) {
var webhook = (0, _toPlainObject2.default)((0, _cloneDeep2.default)(data));
(0, _enhanceWithMethods2.default)(webhook, createWebhookApi(http));
return (0, _freezeSys2.default)(webhook);
}
/**
* @memberof Webhook
* @typedef WebhookCollection
* @prop {number} total
* @prop {number} skip
* @prop {number} limit
* @prop {Array<Webhook.Webhook>} items
* @prop {function(): Object} toPlainObject() - Returns this Webhook collection as a plain JS object
*/
/**
* @private
* @param {Object} http - HTTP client instance
* @param {Object} data - Raw webhook collection data
* @return {WebhookCollection} Wrapped webhook collection data
*/
function wrapWebhookCollection(http, data) {
var webhooks = (0, _toPlainObject2.default)((0, _cloneDeep2.default)(data));
webhooks.items = webhooks.items.map(function (entity) {
return wrapWebhook(http, entity);
});
return (0, _freezeSys2.default)(webhooks);
}
},{"../enhance-with-methods":6,"../error-handler":17,"../instance-actions":18,"contentful-sdk-core/freeze-sys":128,"contentful-sdk-core/mixins/to-plain-object":129,"lodash/cloneDeep":270}],17:[function(require,module,exports){
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _stringify = require('babel-runtime/core-js/json/stringify');
var _stringify2 = _interopRequireDefault(_stringify);
exports.default = errorHandler;
var _get = require('lodash/get');
var _get2 = _interopRequireDefault(_get);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* Errors received from server requests
* @memberof ContentfulClientAPI
* @typedef ErrorResponse
* @prop {string} name - Error name. Usually refers to the sys.id returned on the
* error server response. If that's not available or is unknown, it defaults to
* the HTTP error code and status text.
* @prop {string} message - Stringified JSON object with request information,
* HTTP response details and error details payload (if available). The `requestId`
* property is internal to Contentful and it can be used when contacting support
* about unusual errors.
*/
/**
* Handles errors received from the server. Parses the error into a more useful
* format, places it in an exception and throws it.
* See https://www.contentful.com/developers/docs/references/content-management-api/#/introduction/errors
* for more details on the data received on the errorResponse.data property
* and the expected error codes.
* @private
* @param {Object} errorResponse - Error received from an axios request
* @throws {ErrorResponse}
*/
function errorHandler(errorResponse) {
var data = errorResponse.data;
var status = errorResponse.status;
var statusText = errorResponse.statusText;
var config = errorResponse.config;
var errorData = {
request: {
url: config.url,
headers: config.headers,
method: config.method,
payloadData: config.data
},
status: status,
statusText: statusText
};
if ((0, _get2.default)(data, 'sys.type') === 'Error') {
errorData.message = data.message;
errorData.requestId = data.requestId;
if (data.details) {
errorData.details = data.details;
}
}
var error = new Error();
var errorName = (0, _get2.default)(data, 'sys.id');
error.name = errorName && errorName !== 'Unknown' ? errorName : status + ' ' + statusText;
error.message = (0, _stringify2.default)(errorData, null, ' ');
throw error;
}
},{"babel-runtime/core-js/json/stringify":24,"lodash/get":275}],18:[function(require,module,exports){
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.createUpdateEntity = createUpdateEntity;
exports.createDeleteEntity = createDeleteEntity;
exports.createPublishEntity = createPublishEntity;
exports.createUnpublishEntity = createUnpublishEntity;
exports.createArchiveEntity = createArchiveEntity;
exports.createUnarchiveEntity = createUnarchiveEntity;
exports.createPublishedChecker = createPublishedChecker;
exports.createUpdatedChecker = createUpdatedChecker;
exports.createDraftChecker = createDraftChecker;
exports.createArchivedChecker = createArchivedChecker;
var _omit = require('lodash/omit');
var _omit2 = _interopRequireDefault(_omit);
var _errorHandler = require('./error-handler');
var _errorHandler2 = _interopRequireDefault(_errorHandler);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function createUpdateEntity(_ref) {
var http = _ref.http;
var entityPath = _ref.entityPath;
var wrapperMethod = _ref.wrapperMethod;
return function () {
var raw = this.toPlainObject();
var data = (0, _omit2.default)(raw, ['sys']);
return http.put(entityPath + '/' + this.sys.id, data, {
headers: {
'X-Contentful-Version': this.sys.version
}
}).then(function (response) {
return wrapperMethod(http, response.data);
}, _errorHandler2.default);
};
}
function createDeleteEntity(_ref2) {
var http = _ref2.http;
var entityPath = _ref2.entityPath;
return function () {
return http.delete(entityPath + '/' + this.sys.id).then(function (response) {}, _errorHandler2.default);
};
}
function createPublishEntity(_ref3) {
var http = _ref3.http;
var entityPath = _ref3.entityPath;
var wrapperMethod = _ref3.wrapperMethod;
return function () {
return http.put(entityPath + '/' + this.sys.id + '/published', null, {
headers: {
'X-Contentful-Version': this.sys.version
}
}).then(function (response) {
return wrapperMethod(http, response.data);
}, _errorHandler2.default);
};
}
function createUnpublishEntity(_ref4) {
var http = _ref4.http;
var entityPath = _ref4.entityPath;
var wrapperMethod = _ref4.wrapperMethod;
return function () {
return http.delete(entityPath + '/' + this.sys.id + '/published').then(function (response) {
return wrapperMethod(http, response.data);
}, _errorHandler2.default);
};
}
function createArchiveEntity(_ref5) {
var http = _ref5.http;
var entityPath = _ref5.entityPath;
var wrapperMethod = _ref5.wrapperMethod;
return function () {
return http.put(entityPath + '/' + this.sys.id + '/archived').then(function (response) {
return wrapperMethod(http, response.data);
}, _errorHandler2.default);
};
}
function createUnarchiveEntity(_ref6) {
var http = _ref6.http;
var entityPath = _ref6.entityPath;
var wrapperMethod = _ref6.wrapperMethod;
return function () {
return http.delete(entityPath + '/' + this.sys.id + '/archived').then(function (response) {
return wrapperMethod(http, response.data);
}, _errorHandler2.default);
};
}
function createPublishedChecker() {
return function () {
return !!this.sys.publishedVersion;
};
}
function createUpdatedChecker() {
return function () {
// The act of publishing an entity increases its version by 1, so any entry which has
// 2 versions higher or more than the publishedVersion has unpublished changes.
return this.sys.publishedVersion && this.sys.version > this.sys.publishedVersion + 1;
};
}
function createDraftChecker() {
return function () {
return !this.sys.publishedVersion;
};
}
function createArchivedChecker() {
return function () {
return !!this.sys.archivedVersion;
};
}
},{"./error-handler":17,"lodash/omit":294}],19:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _promise = require("babel-runtime/core-js/promise");
var _promise2 = _interopRequireDefault(_promise);
exports.default = promisedWait;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function promisedWait(ms) {
return new _promise2.default(function (resolve) {
setTimeout(resolve, ms || 3000);
});
}
},{"babel-runtime/core-js/promise":28}],20:[function(require,module,exports){
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _promise = require('babel-runtime/core-js/promise');
var _promise2 = _interopRequireDefault(_promise);
exports.default = rateLimit;
var _promisedWait = require('./promised-wait');
var _promisedWait2 = _interopRequireDefault(_promisedWait);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* Promise-based rate limiting of a function. Assumes that the passed in
* function will return a Promise.
* Queues calls made to the wrapped function, and if more calls are made than
* the allowed level of concurrency waits until a certain amount of time has
* passed before continuing to clear calls from the queue.
* @private
* @param {Function} fn - call to be rate limited
* @param {number} concurrency - Number of allowed concurrent requests
* @param {number} delay - Delay in milliseconds for waiting after hitting the
*/
function rateLimit(fn, concurrency, delay) {
concurrency = positiveInteger('concurrency', concurrency);
delay = positiveInteger('delay', delay);
var callQueue = [];
var inFlight = 0;
function shift() {
if (inFlight >= concurrency) {
return;
}
var start = new Date().getTime();
if (callQueue.length) {
var call = callQueue.shift();
inFlight++;
var result = void 0;
try {
// call the wrapped method
var tmp = _promise2.default.resolve(fn.apply(call.self, call.args));
// resolve the call with a possibly rejected promise
call.resolve(tmp);
// rate-limiting doesn't care about errors
result = tmp.catch(function () {});
} catch (err) {
call.reject(err);
result = _promise2.default.resolve();
}
// If this request completed faster than our rate-limit would
// allow, wait the appropriate amount of time before marking the
// request as finished.
result.then(maybeWait).then(goToNextCall);
}
function maybeWait() {
var duration = start - new Date().getTime();
if (duration < delay) {
return (0, _promisedWait2.default)(delay - duration);
}
}
}
function goToNextCall() {
inFlight--;
shift();
}
return function () /* wrapped method arguments */{
var self = this;
var args = Array.prototype.slice.call(arguments);
return new _promise2.default(function (resolve, reject) {
callQueue.push({
reject: reject,
resolve: resolve,
self: self,
args: args
});
shift();
});
};
}
function positiveInteger(name, value) {
value = parseInt(value, 10);
if (isNaN(value) || value < 1) {
throw new TypeError(name + ' must be a positive integer');
}
return value;
}
},{"./promised-wait":19,"babel-runtime/core-js/promise":28}],21:[function(require,module,exports){
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = wrapHttpClient;
var _reduce = require('lodash/reduce');
var _reduce2 = _interopRequireDefault(_reduce);
var _cloneDeep = require('lodash/cloneDeep');
var _cloneDeep2 = _interopRequireDefault(_cloneDeep);
var _rateLimit = require('./rate-limit');
var _rateLimit2 = _interopRequireDefault(_rateLimit);
var _createBackoff = require('./create-backoff');
var _createBackoff2 = _interopRequireDefault(_createBackoff);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* Wraps the http client with a rate limiter, and a backoff functionality.
* The rate limiter queues calls and attempts to prevent the server side rate
* limit from ever being hit.
* The backoff is triggered if a 429 Too Many Requests error is received from
* the server, and every time if it is received repeateadly the wait time
* for the next try will increase exponentially.
* @private
* @param {Object} http - HTTP Client instances
* @param {Object} options - Options for the wrapper methods
* @prop {number} concurrency - Number of allowed concurrent requests
* @prop {number} delay - Delay in milliseconds for waiting after hitting the
* allowed number of concurrent requests
* @prop {number} maxRetries - Maximum number of retries when a 429 is received
* @prop {boolean} retryOnTooManyRequests - If we should retry on 429s
*/
function wrapHttpClient(http, _ref) {
var concurrency = _ref.concurrency;
var delay = _ref.delay;
var maxRetries = _ref.maxRetries;
var retryOnTooManyRequests = _ref.retryOnTooManyRequests;
return (0, _reduce2.default)(['get', 'post', 'put', 'delete', 'patch', 'head'], function (http, methodName) {
var httpCall = http[methodName].bind(http);
if (retryOnTooManyRequests) {
httpCall = maybeBackoff(httpCall, maxRetries);
}
http[methodName] = (0, _rateLimit2.default)(httpCall, concurrency, delay);
return http;
}, (0, _cloneDeep2.default)(http));
}
function maybeBackoff(fn, maxRetries) {
return function httpCall() {
var self = this;
self.backoff = self.backoff || (0, _createBackoff2.default)(maxRetries);
var args = Array.prototype.slice.call(arguments);
var response = fn.apply(self, args);
response = response.catch(function (error) {
// Rate-limited by the server, maybe backoff and retry
if (error.status === 429) {
return self.backoff(error, function () {
return httpCall.apply(self, args);
});
}
throw error;
});
return response;
};
}
},{"./create-backoff":3,"./rate-limit":20,"lodash/cloneDeep":270,"lodash/reduce":296}],22:[function(require,module,exports){
module.exports = { "default": require("core-js/library/fn/get-iterator"), __esModule: true };
},{"core-js/library/fn/get-iterator":33}],23:[function(require,module,exports){
module.exports = { "default": require("core-js/library/fn/is-iterable"), __esModule: true };
},{"core-js/library/fn/is-iterable":34}],24:[function(require,module,exports){
module.exports = { "default": require("core-js/library/fn/json/stringify"), __esModule: true };
},{"core-js/library/fn/json/stringify":35}],25:[function(require,module,exports){
module.exports = { "default": require("core-js/library/fn/object/define-property"), __esModule: true };
},{"core-js/library/fn/object/define-property":36}],26:[function(require,module,exports){
module.exports = { "default": require("core-js/library/fn/object/freeze"), __esModule: true };
},{"core-js/library/fn/object/freeze":37}],27:[function(require,module,exports){
module.exports = { "default": require("core-js/library/fn/object/keys"), __esModule: true };
},{"core-js/library/fn/object/keys":38}],28:[function(require,module,exports){
module.exports = { "default": require("core-js/library/fn/promise"), __esModule: true };
},{"core-js/library/fn/promise":39}],29:[function(require,module,exports){
module.exports = { "default": require("core-js/library/fn/symbol"), __esModule: true };
},{"core-js/library/fn/symbol":40}],30:[function(require,module,exports){
module.exports = { "default": require("core-js/library/fn/symbol/iterator"), __esModule: true };
},{"core-js/library/fn/symbol/iterator":41}],31:[function(require,module,exports){
"use strict";
exports.__esModule = true;
var _isIterable2 = require("../core-js/is-iterable");
var _isIterable3 = _interopRequireDefault(_isIterable2);
var _getIterator2 = require("../core-js/get-iterator");
var _getIterator3 = _interopRequireDefault(_getIterator2);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
exports.default = function () {
function sliceIterator(arr, i) {
var _arr = [];
var _n = true;
var _d = false;
var _e = undefined;
try {
for (var _i = (0, _getIterator3.default)(arr), _s; !(_n = (_s = _i.next()).done); _n = true) {
_arr.push(_s.value);
if (i && _arr.length === i) break;
}
} catch (err) {
_d = true;
_e = err;
} finally {
try {
if (!_n && _i["return"]) _i["return"]();
} finally {
if (_d) throw _e;
}
}
return _arr;
}
return function (arr, i) {
if (Array.isArray(arr)) {
return arr;
} else if ((0, _isIterable3.default)(Object(arr))) {
return sliceIterator(arr, i);
} else {
throw new TypeError("Invalid attempt to destructure non-iterable instance");
}
};
}();
},{"../core-js/get-iterator":22,"../core-js/is-iterable":23}],32:[function(require,module,exports){
"use strict";
exports.__esModule = true;
var _iterator = require("../core-js/symbol/iterator");
var _iterator2 = _interopRequireDefault(_iterator);
var _symbol = require("../core-js/symbol");
var _symbol2 = _interopRequireDefault(_symbol);
var _typeof = typeof _symbol2.default === "function" && typeof _iterator2.default === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof _symbol2.default === "function" && obj.constructor === _symbol2.default ? "symbol" : typeof obj; };
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
exports.default = typeof _symbol2.default === "function" && _typeof(_iterator2.default) === "symbol" ? function (obj) {
return typeof obj === "undefined" ? "undefined" : _typeof(obj);
} : function (obj) {
return obj && typeof _symbol2.default === "function" && obj.constructor === _symbol2.default ? "symbol" : typeof obj === "undefined" ? "undefined" : _typeof(obj);
};
},{"../core-js/symbol":29,"../core-js/symbol/iterator":30}],33:[function(require,module,exports){
require('../modules/web.dom.iterable');
require('../modules/es6.string.iterator');
module.exports = require('../modules/core.get-iterator');
},{"../modules/core.get-iterator":113,"../modules/es6.string.iterator":121,"../modules/web.dom.iterable":125}],34:[function(require,module,exports){
require('../modules/web.dom.iterable');
require('../modules/es6.string.iterator');
module.exports = require('../modules/core.is-iterable');
},{"../modules/core.is-iterable":114,"../modules/es6.string.iterator":121,"../modules/web.dom.iterable":125}],35:[function(require,module,exports){
var core = require('../../modules/_core')
, $JSON = core.JSON || (core.JSON = {stringify: JSON.stringify});
module.exports = function stringify(it){ // eslint-disable-line no-unused-vars
return $JSON.stringify.apply($JSON, arguments);
};
},{"../../modules/_core":49}],36:[function(require,module,exports){
require('../../modules/es6.object.define-property');
var $Object = require('../../modules/_core').Object;
module.exports = function defineProperty(it, key, desc){
return $Object.defineProperty(it, key, desc);
};
},{"../../modules/_core":49,"../../modules/es6.object.define-property":116}],37:[function(require,module,exports){
require('../../modules/es6.object.freeze');
module.exports = require('../../modules/_core').Object.freeze;
},{"../../modules/_core":49,"../../modules/es6.object.freeze":117}],38:[function(require,module,exports){
require('../../modules/es6.object.keys');
module.exports = require('../../modules/_core').Object.keys;
},{"../../modules/_core":49,"../../modules/es6.object.keys":118}],39:[function(require,module,exports){
require('../modules/es6.object.to-string');
require('../modules/es6.string.iterator');
require('../modules/web.dom.iterable');
require('../modules/es6.promise');
module.exports = require('../modules/_core').Promise;
},{"../modules/_core":49,"../modules/es6.object.to-string":119,"../modules/es6.promise":120,"../modules/es6.string.iterator":121,"../modules/web.dom.iterable":125}],40:[function(require,module,exports){
require('../../modules/es6.symbol');
require('../../modules/es6.object.to-string');
require('../../modules/es7.symbol.async-iterator');
require('../../modules/es7.symbol.observable');
module.exports = require('../../modules/_core').Symbol;
},{"../../modules/_core":49,"../../modules/es6.object.to-string":119,"../../modules/es6.symbol":122,"../../modules/es7.symbol.async-iterator":123,"../../modules/es7.symbol.observable":124}],41:[function(require,module,exports){
require('../../modules/es6.string.iterator');
require('../../modules/web.dom.iterable');
module.exports = require('../../modules/_wks-ext').f('iterator');
},{"../../modules/_wks-ext":110,"../../modules/es6.string.iterator":121,"../../modules/web.dom.iterable":125}],42:[function(require,module,exports){
module.exports = function(it){
if(typeof it != 'function')throw TypeError(it + ' is not a function!');
return it;
};
},{}],43:[function(require,module,exports){
module.exports = function(){ /* empty */ };
},{}],44:[function(require,module,exports){
module.exports = function(it, Constructor, name, forbiddenField){
if(!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)){
throw TypeError(name + ': incorrect invocation!');
} return it;
};
},{}],45:[function(require,module,exports){
var isObject = require('./_is-object');
module.exports = function(it){
if(!isObject(it))throw TypeError(it + ' is not an object!');
return it;
};
},{"./_is-object":68}],46:[function(require,module,exports){
// false -> Array#indexOf
// true -> Array#includes
var toIObject = require('./_to-iobject')
, toLength = require('./_to-length')
, toIndex = require('./_to-index');
module.exports = function(IS_INCLUDES){
return function($this, el, fromIndex){
var O = toIObject($this)
, length = toLength(O.length)
, index = toIndex(fromIndex, length)
, value;
// Array#includes uses SameValueZero equality algorithm
if(IS_INCLUDES && el != el)while(length > index){
value = O[index++];
if(value != value)return true;
// Array#toIndex ignores holes, Array#includes - not
} else for(;length > index; index++)if(IS_INCLUDES || index in O){
if(O[index] === el)return IS_INCLUDES || index || 0;
} return !IS_INCLUDES && -1;
};
};
},{"./_to-index":102,"./_to-iobject":104,"./_to-length":105}],47:[function(require,module,exports){
// getting tag from 19.1.3.6 Object.prototype.toString()
var cof = require('./_cof')
, TAG = require('./_wks')('toStringTag')
// ES3 wrong here
, ARG = cof(function(){ return arguments; }()) == 'Arguments';
// fallback for IE11 Script Access Denied error
var tryGet = function(it, key){
try {
return it[key];
} catch(e){ /* empty */ }
};
module.exports = function(it){
var O, T, B;
return it === undefined ? 'Undefined' : it === null ? 'Null'
// @@toStringTag case
: typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T
// builtinTag case
: ARG ? cof(O)
// ES3 arguments fallback
: (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;
};
},{"./_cof":48,"./_wks":111}],48:[function(require,module,exports){
var toString = {}.toString;
module.exports = function(it){
return toString.call(it).slice(8, -1);
};
},{}],49:[function(require,module,exports){
var core = module.exports = {version: '2.4.0'};
if(typeof __e == 'number')__e = core; // eslint-disable-line no-undef
},{}],50:[function(require,module,exports){
// optional / simple context binding
var aFunction = require('./_a-function');
module.exports = function(fn, that, length){
aFunction(fn);
if(that === undefined)return fn;
switch(length){
case 1: return function(a){
return fn.call(that, a);
};
case 2: return function(a, b){
return fn.call(that, a, b);
};
case 3: return function(a, b, c){
return fn.call(that, a, b, c);
};
}
return function(/* ...args */){
return fn.apply(that, arguments);
};
};
},{"./_a-function":42}],51:[function(require,module,exports){
// 7.2.1 RequireObjectCoercible(argument)
module.exports = function(it){
if(it == undefined)throw TypeError("Can't call method on " + it);
return it;
};
},{}],52:[function(require,module,exports){
// Thank's IE8 for his funny defineProperty
module.exports = !require('./_fails')(function(){
return Object.defineProperty({}, 'a', {get: function(){ return 7; }}).a != 7;
});
},{"./_fails":57}],53:[function(require,module,exports){
var isObject = require('./_is-object')
, document = require('./_global').document
// in old IE typeof document.createElement is 'object'
, is = isObject(document) && isObject(document.createElement);
module.exports = function(it){
return is ? document.createElement(it) : {};
};
},{"./_global":59,"./_is-object":68}],54:[function(require,module,exports){
// IE 8- don't enum bug keys
module.exports = (
'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'
).split(',');
},{}],55:[function(require,module,exports){
// all enumerable object keys, includes symbols
var getKeys = require('./_object-keys')
, gOPS = require('./_object-gops')
, pIE = require('./_object-pie');
module.exports = function(it){
var result = getKeys(it)
, getSymbols = gOPS.f;
if(getSymbols){
var symbols = getSymbols(it)
, isEnum = pIE.f
, i = 0
, key;
while(symbols.length > i)if(isEnum.call(it, key = symbols[i++]))result.push(key);
} return result;
};
},{"./_object-gops":85,"./_object-keys":88,"./_object-pie":89}],56:[function(require,module,exports){
var global = require('./_global')
, core = require('./_core')
, ctx = require('./_ctx')
, hide = require('./_hide')
, PROTOTYPE = 'prototype';
var $export = function(type, name, source){
var IS_FORCED = type & $export.F
, IS_GLOBAL = type & $export.G
, IS_STATIC = type & $export.S
, IS_PROTO = type & $export.P
, IS_BIND = type & $export.B
, IS_WRAP = type & $export.W
, exports = IS_GLOBAL ? core : core[name] || (core[name] = {})
, expProto = exports[PROTOTYPE]
, target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE]
, key, own, out;
if(IS_GLOBAL)source = name;
for(key in source){
// contains in native
own = !IS_FORCED && target && target[key] !== undefined;
if(own && key in exports)continue;
// export native or passed
out = own ? target[key] : source[key];
// prevent global pollution for namespaces
exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key]
// bind timers to global for call from export context
: IS_BIND && own ? ctx(out, global)
// wrap global constructors for prevent change them in library
: IS_WRAP && target[key] == out ? (function(C){
var F = function(a, b, c){
if(this instanceof C){
switch(arguments.length){
case 0: return new C;
case 1: return new C(a);
case 2: return new C(a, b);
} return new C(a, b, c);
} return C.apply(this, arguments);
};
F[PROTOTYPE] = C[PROTOTYPE];
return F;
// make static versions for prototype methods
})(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;
// export proto methods to core.%CONSTRUCTOR%.methods.%NAME%
if(IS_PROTO){
(exports.virtual || (exports.virtual = {}))[key] = out;
// export proto methods to core.%CONSTRUCTOR%.prototype.%NAME%
if(type & $export.R && expProto && !expProto[key])hide(expProto, key, out);
}
}
};
// type bitmap
$export.F = 1; // forced
$export.G = 2; // global
$export.S = 4; // static
$export.P = 8; // proto
$export.B = 16; // bind
$export.W = 32; // wrap
$export.U = 64; // safe
$export.R = 128; // real proto method for `library`
module.exports = $export;
},{"./_core":49,"./_ctx":50,"./_global":59,"./_hide":61}],57:[function(require,module,exports){
module.exports = function(exec){
try {
return !!exec();
} catch(e){
return true;
}
};
},{}],58:[function(require,module,exports){
var ctx = require('./_ctx')
, call = require('./_iter-call')
, isArrayIter = require('./_is-array-iter')
, anObject = require('./_an-object')
, toLength = require('./_to-length')
, getIterFn = require('./core.get-iterator-method')
, BREAK = {}
, RETURN = {};
var exports = module.exports = function(iterable, entries, fn, that, ITERATOR){
var iterFn = ITERATOR ? function(){ return iterable; } : getIterFn(iterable)
, f = ctx(fn, that, entries ? 2 : 1)
, index = 0
, length, step, iterator, result;
if(typeof iterFn != 'function')throw TypeError(iterable + ' is not iterable!');
// fast case for arrays with default iterator
if(isArrayIter(iterFn))for(length = toLength(iterable.length); length > index; index++){
result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]);
if(result === BREAK || result === RETURN)return result;
} else for(iterator = iterFn.call(iterable); !(step = iterator.next()).done; ){
result = call(iterator, f, step.value, entries);
if(result === BREAK || result === RETURN)return result;
}
};
exports.BREAK = BREAK;
exports.RETURN = RETURN;
},{"./_an-object":45,"./_ctx":50,"./_is-array-iter":66,"./_iter-call":69,"./_to-length":105,"./core.get-iterator-method":112}],59:[function(require,module,exports){
// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
var global = module.exports = typeof window != 'undefined' && window.Math == Math
? window : typeof self != 'undefined' && self.Math == Math ? self : Function('return this')();
if(typeof __g == 'number')__g = global; // eslint-disable-line no-undef
},{}],60:[function(require,module,exports){
var hasOwnProperty = {}.hasOwnProperty;
module.exports = function(it, key){
return hasOwnProperty.call(it, key);
};
},{}],61:[function(require,module,exports){
var dP = require('./_object-dp')
, createDesc = require('./_property-desc');
module.exports = require('./_descriptors') ? function(object, key, value){
return dP.f(object, key, createDesc(1, value));
} : function(object, key, value){
object[key] = value;
return object;
};
},{"./_descriptors":52,"./_object-dp":80,"./_property-desc":91}],62:[function(require,module,exports){
module.exports = require('./_global').document && document.documentElement;
},{"./_global":59}],63:[function(require,module,exports){
module.exports = !require('./_descriptors') && !require('./_fails')(function(){
return Object.defineProperty(require('./_dom-create')('div'), 'a', {get: function(){ return 7; }}).a != 7;
});
},{"./_descriptors":52,"./_dom-create":53,"./_fails":57}],64:[function(require,module,exports){
// fast apply, http://jsperf.lnkit.com/fast-apply/5
module.exports = function(fn, args, that){
var un = that === undefined;
switch(args.length){
case 0: return un ? fn()
: fn.call(that);
case 1: return un ? fn(args[0])
: fn.call(that, args[0]);
case 2: return un ? fn(args[0], args[1])
: fn.call(that, args[0], args[1]);
case 3: return un ? fn(args[0], args[1], args[2])
: fn.call(that, args[0], args[1], args[2]);
case 4: return un ? fn(args[0], args[1], args[2], args[3])
: fn.call(that, args[0], args[1], args[2], args[3]);
} return fn.apply(that, args);
};
},{}],65:[function(require,module,exports){
// fallback for non-array-like ES3 and non-enumerable old V8 strings
var cof = require('./_cof');
module.exports = Object('z').propertyIsEnumerable(0) ? Object : function(it){
return cof(it) == 'String' ? it.split('') : Object(it);
};
},{"./_cof":48}],66:[function(require,module,exports){
// check on default Array iterator
var Iterators = require('./_iterators')
, ITERATOR = require('./_wks')('iterator')
, ArrayProto = Array.prototype;
module.exports = function(it){
return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it);
};
},{"./_iterators":74,"./_wks":111}],67:[function(require,module,exports){
// 7.2.2 IsArray(argument)
var cof = require('./_cof');
module.exports = Array.isArray || function isArray(arg){
return cof(arg) == 'Array';
};
},{"./_cof":48}],68:[function(require,module,exports){
module.exports = function(it){
return typeof it === 'object' ? it !== null : typeof it === 'function';
};
},{}],69:[function(require,module,exports){
// call something on iterator step with safe closing on error
var anObject = require('./_an-object');
module.exports = function(iterator, fn, value, entries){
try {
return entries ? fn(anObject(value)[0], value[1]) : fn(value);
// 7.4.6 IteratorClose(iterator, completion)
} catch(e){
var ret = iterator['return'];
if(ret !== undefined)anObject(ret.call(iterator));
throw e;
}
};
},{"./_an-object":45}],70:[function(require,module,exports){
'use strict';
var create = require('./_object-create')
, descriptor = require('./_property-desc')
, setToStringTag = require('./_set-to-string-tag')
, IteratorPrototype = {};
// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()
require('./_hide')(IteratorPrototype, require('./_wks')('iterator'), function(){ return this; });
module.exports = function(Constructor, NAME, next){
Constructor.prototype = create(IteratorPrototype, {next: descriptor(1, next)});
setToStringTag(Constructor, NAME + ' Iterator');
};
},{"./_hide":61,"./_object-create":79,"./_property-desc":91,"./_set-to-string-tag":96,"./_wks":111}],71:[function(require,module,exports){
'use strict';
var LIBRARY = require('./_library')
, $export = require('./_export')
, redefine = require('./_redefine')
, hide = require('./_hide')
, has = require('./_has')
, Iterators = require('./_iterators')
, $iterCreate = require('./_iter-create')
, setToStringTag = require('./_set-to-string-tag')
, getPrototypeOf = require('./_object-gpo')
, ITERATOR = require('./_wks')('iterator')
, BUGGY = !([].keys && 'next' in [].keys()) // Safari has buggy iterators w/o `next`
, FF_ITERATOR = '@@iterator'
, KEYS = 'keys'
, VALUES = 'values';
var returnThis = function(){ return this; };
module.exports = function(Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED){
$iterCreate(Constructor, NAME, next);
var getMethod = function(kind){
if(!BUGGY && kind in proto)return proto[kind];
switch(kind){
case KEYS: return function keys(){ return new Constructor(this, kind); };
case VALUES: return function values(){ return new Constructor(this, kind); };
} return function entries(){ return new Constructor(this, kind); };
};
var TAG = NAME + ' Iterator'
, DEF_VALUES = DEFAULT == VALUES
, VALUES_BUG = false
, proto = Base.prototype
, $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT]
, $default = $native || getMethod(DEFAULT)
, $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined
, $anyNative = NAME == 'Array' ? proto.entries || $native : $native
, methods, key, IteratorPrototype;
// Fix native
if($anyNative){
IteratorPrototype = getPrototypeOf($anyNative.call(new Base));
if(IteratorPrototype !== Object.prototype){
// Set @@toStringTag to native iterators
setToStringTag(IteratorPrototype, TAG, true);
// fix for some old engines
if(!LIBRARY && !has(IteratorPrototype, ITERATOR))hide(IteratorPrototype, ITERATOR, returnThis);
}
}
// fix Array#{values, @@iterator}.name in V8 / FF
if(DEF_VALUES && $native && $native.name !== VALUES){
VALUES_BUG = true;
$default = function values(){ return $native.call(this); };
}
// Define iterator
if((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])){
hide(proto, ITERATOR, $default);
}
// Plug for library
Iterators[NAME] = $default;
Iterators[TAG] = returnThis;
if(DEFAULT){
methods = {
values: DEF_VALUES ? $default : getMethod(VALUES),
keys: IS_SET ? $default : getMethod(KEYS),
entries: $entries
};
if(FORCED)for(key in methods){
if(!(key in proto))redefine(proto, key, methods[key]);
} else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);
}
return methods;
};
},{"./_export":56,"./_has":60,"./_hide":61,"./_iter-create":70,"./_iterators":74,"./_library":76,"./_object-gpo":86,"./_redefine":93,"./_set-to-string-tag":96,"./_wks":111}],72:[function(require,module,exports){
var ITERATOR = require('./_wks')('iterator')
, SAFE_CLOSING = false;
try {
var riter = [7][ITERATOR]();
riter['return'] = function(){ SAFE_CLOSING = true; };
Array.from(riter, function(){ throw 2; });
} catch(e){ /* empty */ }
module.exports = function(exec, skipClosing){
if(!skipClosing && !SAFE_CLOSING)return false;
var safe = false;
try {
var arr = [7]
, iter = arr[ITERATOR]();
iter.next = function(){ return {done: safe = true}; };
arr[ITERATOR] = function(){ return iter; };
exec(arr);
} catch(e){ /* empty */ }
return safe;
};
},{"./_wks":111}],73:[function(require,module,exports){
module.exports = function(done, value){
return {value: value, done: !!done};
};
},{}],74:[function(require,module,exports){
module.exports = {};
},{}],75:[function(require,module,exports){
var getKeys = require('./_object-keys')
, toIObject = require('./_to-iobject');
module.exports = function(object, el){
var O = toIObject(object)
, keys = getKeys(O)
, length = keys.length
, index = 0
, key;
while(length > index)if(O[key = keys[index++]] === el)return key;
};
},{"./_object-keys":88,"./_to-iobject":104}],76:[function(require,module,exports){
module.exports = true;
},{}],77:[function(require,module,exports){
var META = require('./_uid')('meta')
, isObject = require('./_is-object')
, has = require('./_has')
, setDesc = require('./_object-dp').f
, id = 0;
var isExtensible = Object.isExtensible || function(){
return true;
};
var FREEZE = !require('./_fails')(function(){
return isExtensible(Object.preventExtensions({}));
});
var setMeta = function(it){
setDesc(it, META, {value: {
i: 'O' + ++id, // object ID
w: {} // weak collections IDs
}});
};
var fastKey = function(it, create){
// return primitive with prefix
if(!isObject(it))return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;
if(!has(it, META)){
// can't set metadata to uncaught frozen object
if(!isExtensible(it))return 'F';
// not necessary to add metadata
if(!create)return 'E';
// add missing metadata
setMeta(it);
// return object ID
} return it[META].i;
};
var getWeak = function(it, create){
if(!has(it, META)){
// can't set metadata to uncaught frozen object
if(!isExtensible(it))return true;
// not necessary to add metadata
if(!create)return false;
// add missing metadata
setMeta(it);
// return hash weak collections IDs
} return it[META].w;
};
// add metadata on freeze-family methods calling
var onFreeze = function(it){
if(FREEZE && meta.NEED && isExtensible(it) && !has(it, META))setMeta(it);
return it;
};
var meta = module.exports = {
KEY: META,
NEED: false,
fastKey: fastKey,
getWeak: getWeak,
onFreeze: onFreeze
};
},{"./_fails":57,"./_has":60,"./_is-object":68,"./_object-dp":80,"./_uid":108}],78:[function(require,module,exports){
var global = require('./_global')
, macrotask = require('./_task').set
, Observer = global.MutationObserver || global.WebKitMutationObserver
, process = global.process
, Promise = global.Promise
, isNode = require('./_cof')(process) == 'process';
module.exports = function(){
var head, last, notify;
var flush = function(){
var parent, fn;
if(isNode && (parent = process.domain))parent.exit();
while(head){
fn = head.fn;
head = head.next;
try {
fn();
} catch(e){
if(head)notify();
else last = undefined;
throw e;
}
} last = undefined;
if(parent)parent.enter();
};
// Node.js
if(isNode){
notify = function(){
process.nextTick(flush);
};
// browsers with MutationObserver
} else if(Observer){
var toggle = true
, node = document.createTextNode('');
new Observer(flush).observe(node, {characterData: true}); // eslint-disable-line no-new
notify = function(){
node.data = toggle = !toggle;
};
// environments with maybe non-completely correct, but existent Promise
} else if(Promise && Promise.resolve){
var promise = Promise.resolve();
notify = function(){
promise.then(flush);
};
// for other environments - macrotask based on:
// - setImmediate
// - MessageChannel
// - window.postMessag
// - onreadystatechange
// - setTimeout
} else {
notify = function(){
// strange IE + webpack dev server bug - use .call(global)
macrotask.call(global, flush);
};
}
return function(fn){
var task = {fn: fn, next: undefined};
if(last)last.next = task;
if(!head){
head = task;
notify();
} last = task;
};
};
},{"./_cof":48,"./_global":59,"./_task":101}],79:[function(require,module,exports){
// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])
var anObject = require('./_an-object')
, dPs = require('./_object-dps')
, enumBugKeys = require('./_enum-bug-keys')
, IE_PROTO = require('./_shared-key')('IE_PROTO')
, Empty = function(){ /* empty */ }
, PROTOTYPE = 'prototype';
// Create object with fake `null` prototype: use iframe Object with cleared prototype
var createDict = function(){
// Thrash, waste and sodomy: IE GC bug
var iframe = require('./_dom-create')('iframe')
, i = enumBugKeys.length
, gt = '>'
, iframeDocument;
iframe.style.display = 'none';
require('./_html').appendChild(iframe);
iframe.src = 'javascript:'; // eslint-disable-line no-script-url
// createDict = iframe.contentWindow.Object;
// html.removeChild(iframe);
iframeDocument = iframe.contentWindow.document;
iframeDocument.open();
iframeDocument.write('<script>document.F=Object</script' + gt);
iframeDocument.close();
createDict = iframeDocument.F;
while(i--)delete createDict[PROTOTYPE][enumBugKeys[i]];
return createDict();
};
module.exports = Object.create || function create(O, Properties){
var result;
if(O !== null){
Empty[PROTOTYPE] = anObject(O);
result = new Empty;
Empty[PROTOTYPE] = null;
// add "__proto__" for Object.getPrototypeOf polyfill
result[IE_PROTO] = O;
} else result = createDict();
return Properties === undefined ? result : dPs(result, Properties);
};
},{"./_an-object":45,"./_dom-create":53,"./_enum-bug-keys":54,"./_html":62,"./_object-dps":81,"./_shared-key":97}],80:[function(require,module,exports){
var anObject = require('./_an-object')
, IE8_DOM_DEFINE = require('./_ie8-dom-define')
, toPrimitive = require('./_to-primitive')
, dP = Object.defineProperty;
exports.f = require('./_descriptors') ? Object.defineProperty : function defineProperty(O, P, Attributes){
anObject(O);
P = toPrimitive(P, true);
anObject(Attributes);
if(IE8_DOM_DEFINE)try {
return dP(O, P, Attributes);
} catch(e){ /* empty */ }
if('get' in Attributes || 'set' in Attributes)throw TypeError('Accessors not supported!');
if('value' in Attributes)O[P] = Attributes.value;
return O;
};
},{"./_an-object":45,"./_descriptors":52,"./_ie8-dom-define":63,"./_to-primitive":107}],81:[function(require,module,exports){
var dP = require('./_object-dp')
, anObject = require('./_an-object')
, getKeys = require('./_object-keys');
module.exports = require('./_descriptors') ? Object.defineProperties : function defineProperties(O, Properties){
anObject(O);
var keys = getKeys(Properties)
, length = keys.length
, i = 0
, P;
while(length > i)dP.f(O, P = keys[i++], Properties[P]);
return O;
};
},{"./_an-object":45,"./_descriptors":52,"./_object-dp":80,"./_object-keys":88}],82:[function(require,module,exports){
var pIE = require('./_object-pie')
, createDesc = require('./_property-desc')
, toIObject = require('./_to-iobject')
, toPrimitive = require('./_to-primitive')
, has = require('./_has')
, IE8_DOM_DEFINE = require('./_ie8-dom-define')
, gOPD = Object.getOwnPropertyDescriptor;
exports.f = require('./_descriptors') ? gOPD : function getOwnPropertyDescriptor(O, P){
O = toIObject(O);
P = toPrimitive(P, true);
if(IE8_DOM_DEFINE)try {
return gOPD(O, P);
} catch(e){ /* empty */ }
if(has(O, P))return createDesc(!pIE.f.call(O, P), O[P]);
};
},{"./_descriptors":52,"./_has":60,"./_ie8-dom-define":63,"./_object-pie":89,"./_property-desc":91,"./_to-iobject":104,"./_to-primitive":107}],83:[function(require,module,exports){
// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window
var toIObject = require('./_to-iobject')
, gOPN = require('./_object-gopn').f
, toString = {}.toString;
var windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames
? Object.getOwnPropertyNames(window) : [];
var getWindowNames = function(it){
try {
return gOPN(it);
} catch(e){
return windowNames.slice();
}
};
module.exports.f = function getOwnPropertyNames(it){
return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it));
};
},{"./_object-gopn":84,"./_to-iobject":104}],84:[function(require,module,exports){
// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)
var $keys = require('./_object-keys-internal')
, hiddenKeys = require('./_enum-bug-keys').concat('length', 'prototype');
exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O){
return $keys(O, hiddenKeys);
};
},{"./_enum-bug-keys":54,"./_object-keys-internal":87}],85:[function(require,module,exports){
exports.f = Object.getOwnPropertySymbols;
},{}],86:[function(require,module,exports){
// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)
var has = require('./_has')
, toObject = require('./_to-object')
, IE_PROTO = require('./_shared-key')('IE_PROTO')
, ObjectProto = Object.prototype;
module.exports = Object.getPrototypeOf || function(O){
O = toObject(O);
if(has(O, IE_PROTO))return O[IE_PROTO];
if(typeof O.constructor == 'function' && O instanceof O.constructor){
return O.constructor.prototype;
} return O instanceof Object ? ObjectProto : null;
};
},{"./_has":60,"./_shared-key":97,"./_to-object":106}],87:[function(require,module,exports){
var has = require('./_has')
, toIObject = require('./_to-iobject')
, arrayIndexOf = require('./_array-includes')(false)
, IE_PROTO = require('./_shared-key')('IE_PROTO');
module.exports = function(object, names){
var O = toIObject(object)
, i = 0
, result = []
, key;
for(key in O)if(key != IE_PROTO)has(O, key) && result.push(key);
// Don't enum bug & hidden keys
while(names.length > i)if(has(O, key = names[i++])){
~arrayIndexOf(result, key) || result.push(key);
}
return result;
};
},{"./_array-includes":46,"./_has":60,"./_shared-key":97,"./_to-iobject":104}],88:[function(require,module,exports){
// 19.1.2.14 / 15.2.3.14 Object.keys(O)
var $keys = require('./_object-keys-internal')
, enumBugKeys = require('./_enum-bug-keys');
module.exports = Object.keys || function keys(O){
return $keys(O, enumBugKeys);
};
},{"./_enum-bug-keys":54,"./_object-keys-internal":87}],89:[function(require,module,exports){
exports.f = {}.propertyIsEnumerable;
},{}],90:[function(require,module,exports){
// most Object methods by ES6 should accept primitives
var $export = require('./_export')
, core = require('./_core')
, fails = require('./_fails');
module.exports = function(KEY, exec){
var fn = (core.Object || {})[KEY] || Object[KEY]
, exp = {};
exp[KEY] = exec(fn);
$export($export.S + $export.F * fails(function(){ fn(1); }), 'Object', exp);
};
},{"./_core":49,"./_export":56,"./_fails":57}],91:[function(require,module,exports){
module.exports = function(bitmap, value){
return {
enumerable : !(bitmap & 1),
configurable: !(bitmap & 2),
writable : !(bitmap & 4),
value : value
};
};
},{}],92:[function(require,module,exports){
var hide = require('./_hide');
module.exports = function(target, src, safe){
for(var key in src){
if(safe && target[key])target[key] = src[key];
else hide(target, key, src[key]);
} return target;
};
},{"./_hide":61}],93:[function(require,module,exports){
module.exports = require('./_hide');
},{"./_hide":61}],94:[function(require,module,exports){
// Works with __proto__ only. Old v8 can't work with null proto objects.
/* eslint-disable no-proto */
var isObject = require('./_is-object')
, anObject = require('./_an-object');
var check = function(O, proto){
anObject(O);
if(!isObject(proto) && proto !== null)throw TypeError(proto + ": can't set as prototype!");
};
module.exports = {
set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line
function(test, buggy, set){
try {
set = require('./_ctx')(Function.call, require('./_object-gopd').f(Object.prototype, '__proto__').set, 2);
set(test, []);
buggy = !(test instanceof Array);
} catch(e){ buggy = true; }
return function setPrototypeOf(O, proto){
check(O, proto);
if(buggy)O.__proto__ = proto;
else set(O, proto);
return O;
};
}({}, false) : undefined),
check: check
};
},{"./_an-object":45,"./_ctx":50,"./_is-object":68,"./_object-gopd":82}],95:[function(require,module,exports){
'use strict';
var global = require('./_global')
, core = require('./_core')
, dP = require('./_object-dp')
, DESCRIPTORS = require('./_descriptors')
, SPECIES = require('./_wks')('species');
module.exports = function(KEY){
var C = typeof core[KEY] == 'function' ? core[KEY] : global[KEY];
if(DESCRIPTORS && C && !C[SPECIES])dP.f(C, SPECIES, {
configurable: true,
get: function(){ return this; }
});
};
},{"./_core":49,"./_descriptors":52,"./_global":59,"./_object-dp":80,"./_wks":111}],96:[function(require,module,exports){
var def = require('./_object-dp').f
, has = require('./_has')
, TAG = require('./_wks')('toStringTag');
module.exports = function(it, tag, stat){
if(it && !has(it = stat ? it : it.prototype, TAG))def(it, TAG, {configurable: true, value: tag});
};
},{"./_has":60,"./_object-dp":80,"./_wks":111}],97:[function(require,module,exports){
var shared = require('./_shared')('keys')
, uid = require('./_uid');
module.exports = function(key){
return shared[key] || (shared[key] = uid(key));
};
},{"./_shared":98,"./_uid":108}],98:[function(require,module,exports){
var global = require('./_global')
, SHARED = '__core-js_shared__'
, store = global[SHARED] || (global[SHARED] = {});
module.exports = function(key){
return store[key] || (store[key] = {});
};
},{"./_global":59}],99:[function(require,module,exports){
// 7.3.20 SpeciesConstructor(O, defaultConstructor)
var anObject = require('./_an-object')
, aFunction = require('./_a-function')
, SPECIES = require('./_wks')('species');
module.exports = function(O, D){
var C = anObject(O).constructor, S;
return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S);
};
},{"./_a-function":42,"./_an-object":45,"./_wks":111}],100:[function(require,module,exports){
var toInteger = require('./_to-integer')
, defined = require('./_defined');
// true -> String#at
// false -> String#codePointAt
module.exports = function(TO_STRING){
return function(that, pos){
var s = String(defined(that))
, i = toInteger(pos)
, l = s.length
, a, b;
if(i < 0 || i >= l)return TO_STRING ? '' : undefined;
a = s.charCodeAt(i);
return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff
? TO_STRING ? s.charAt(i) : a
: TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;
};
};
},{"./_defined":51,"./_to-integer":103}],101:[function(require,module,exports){
var ctx = require('./_ctx')
, invoke = require('./_invoke')
, html = require('./_html')
, cel = require('./_dom-create')
, global = require('./_global')
, process = global.process
, setTask = global.setImmediate
, clearTask = global.clearImmediate
, MessageChannel = global.MessageChannel
, counter = 0
, queue = {}
, ONREADYSTATECHANGE = 'onreadystatechange'
, defer, channel, port;
var run = function(){
var id = +this;
if(queue.hasOwnProperty(id)){
var fn = queue[id];
delete queue[id];
fn();
}
};
var listener = function(event){
run.call(event.data);
};
// Node.js 0.9+ & IE10+ has setImmediate, otherwise:
if(!setTask || !clearTask){
setTask = function setImmediate(fn){
var args = [], i = 1;
while(arguments.length > i)args.push(arguments[i++]);
queue[++counter] = function(){
invoke(typeof fn == 'function' ? fn : Function(fn), args);
};
defer(counter);
return counter;
};
clearTask = function clearImmediate(id){
delete queue[id];
};
// Node.js 0.8-
if(require('./_cof')(process) == 'process'){
defer = function(id){
process.nextTick(ctx(run, id, 1));
};
// Browsers with MessageChannel, includes WebWorkers
} else if(MessageChannel){
channel = new MessageChannel;
port = channel.port2;
channel.port1.onmessage = listener;
defer = ctx(port.postMessage, port, 1);
// Browsers with postMessage, skip WebWorkers
// IE8 has postMessage, but it's sync & typeof its postMessage is 'object'
} else if(global.addEventListener && typeof postMessage == 'function' && !global.importScripts){
defer = function(id){
global.postMessage(id + '', '*');
};
global.addEventListener('message', listener, false);
// IE8-
} else if(ONREADYSTATECHANGE in cel('script')){
defer = function(id){
html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function(){
html.removeChild(this);
run.call(id);
};
};
// Rest old browsers
} else {
defer = function(id){
setTimeout(ctx(run, id, 1), 0);
};
}
}
module.exports = {
set: setTask,
clear: clearTask
};
},{"./_cof":48,"./_ctx":50,"./_dom-create":53,"./_global":59,"./_html":62,"./_invoke":64}],102:[function(require,module,exports){
var toInteger = require('./_to-integer')
, max = Math.max
, min = Math.min;
module.exports = function(index, length){
index = toInteger(index);
return index < 0 ? max(index + length, 0) : min(index, length);
};
},{"./_to-integer":103}],103:[function(require,module,exports){
// 7.1.4 ToInteger
var ceil = Math.ceil
, floor = Math.floor;
module.exports = function(it){
return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);
};
},{}],104:[function(require,module,exports){
// to indexed object, toObject with fallback for non-array-like ES3 strings
var IObject = require('./_iobject')
, defined = require('./_defined');
module.exports = function(it){
return IObject(defined(it));
};
},{"./_defined":51,"./_iobject":65}],105:[function(require,module,exports){
// 7.1.15 ToLength
var toInteger = require('./_to-integer')
, min = Math.min;
module.exports = function(it){
return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991
};
},{"./_to-integer":103}],106:[function(require,module,exports){
// 7.1.13 ToObject(argument)
var defined = require('./_defined');
module.exports = function(it){
return Object(defined(it));
};
},{"./_defined":51}],107:[function(require,module,exports){
// 7.1.1 ToPrimitive(input [, PreferredType])
var isObject = require('./_is-object');
// instead of the ES6 spec version, we didn't implement @@toPrimitive case
// and the second argument - flag - preferred type is a string
module.exports = function(it, S){
if(!isObject(it))return it;
var fn, val;
if(S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it)))return val;
if(typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it)))return val;
if(!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it)))return val;
throw TypeError("Can't convert object to primitive value");
};
},{"./_is-object":68}],108:[function(require,module,exports){
var id = 0
, px = Math.random();
module.exports = function(key){
return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));
};
},{}],109:[function(require,module,exports){
var global = require('./_global')
, core = require('./_core')
, LIBRARY = require('./_library')
, wksExt = require('./_wks-ext')
, defineProperty = require('./_object-dp').f;
module.exports = function(name){
var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});
if(name.charAt(0) != '_' && !(name in $Symbol))defineProperty($Symbol, name, {value: wksExt.f(name)});
};
},{"./_core":49,"./_global":59,"./_library":76,"./_object-dp":80,"./_wks-ext":110}],110:[function(require,module,exports){
exports.f = require('./_wks');
},{"./_wks":111}],111:[function(require,module,exports){
var store = require('./_shared')('wks')
, uid = require('./_uid')
, Symbol = require('./_global').Symbol
, USE_SYMBOL = typeof Symbol == 'function';
var $exports = module.exports = function(name){
return store[name] || (store[name] =
USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));
};
$exports.store = store;
},{"./_global":59,"./_shared":98,"./_uid":108}],112:[function(require,module,exports){
var classof = require('./_classof')
, ITERATOR = require('./_wks')('iterator')
, Iterators = require('./_iterators');
module.exports = require('./_core').getIteratorMethod = function(it){
if(it != undefined)return it[ITERATOR]
|| it['@@iterator']
|| Iterators[classof(it)];
};
},{"./_classof":47,"./_core":49,"./_iterators":74,"./_wks":111}],113:[function(require,module,exports){
var anObject = require('./_an-object')
, get = require('./core.get-iterator-method');
module.exports = require('./_core').getIterator = function(it){
var iterFn = get(it);
if(typeof iterFn != 'function')throw TypeError(it + ' is not iterable!');
return anObject(iterFn.call(it));
};
},{"./_an-object":45,"./_core":49,"./core.get-iterator-method":112}],114:[function(require,module,exports){
var classof = require('./_classof')
, ITERATOR = require('./_wks')('iterator')
, Iterators = require('./_iterators');
module.exports = require('./_core').isIterable = function(it){
var O = Object(it);
return O[ITERATOR] !== undefined
|| '@@iterator' in O
|| Iterators.hasOwnProperty(classof(O));
};
},{"./_classof":47,"./_core":49,"./_iterators":74,"./_wks":111}],115:[function(require,module,exports){
'use strict';
var addToUnscopables = require('./_add-to-unscopables')
, step = require('./_iter-step')
, Iterators = require('./_iterators')
, toIObject = require('./_to-iobject');
// 22.1.3.4 Array.prototype.entries()
// 22.1.3.13 Array.prototype.keys()
// 22.1.3.29 Array.prototype.values()
// 22.1.3.30 Array.prototype[@@iterator]()
module.exports = require('./_iter-define')(Array, 'Array', function(iterated, kind){
this._t = toIObject(iterated); // target
this._i = 0; // next index
this._k = kind; // kind
// 22.1.5.2.1 %ArrayIteratorPrototype%.next()
}, function(){
var O = this._t
, kind = this._k
, index = this._i++;
if(!O || index >= O.length){
this._t = undefined;
return step(1);
}
if(kind == 'keys' )return step(0, index);
if(kind == 'values')return step(0, O[index]);
return step(0, [index, O[index]]);
}, 'values');
// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)
Iterators.Arguments = Iterators.Array;
addToUnscopables('keys');
addToUnscopables('values');
addToUnscopables('entries');
},{"./_add-to-unscopables":43,"./_iter-define":71,"./_iter-step":73,"./_iterators":74,"./_to-iobject":104}],116:[function(require,module,exports){
var $export = require('./_export');
// 19.1.2.4 / 15.2.3.6 Object.defineProperty(O, P, Attributes)
$export($export.S + $export.F * !require('./_descriptors'), 'Object', {defineProperty: require('./_object-dp').f});
},{"./_descriptors":52,"./_export":56,"./_object-dp":80}],117:[function(require,module,exports){
// 19.1.2.5 Object.freeze(O)
var isObject = require('./_is-object')
, meta = require('./_meta').onFreeze;
require('./_object-sap')('freeze', function($freeze){
return function freeze(it){
return $freeze && isObject(it) ? $freeze(meta(it)) : it;
};
});
},{"./_is-object":68,"./_meta":77,"./_object-sap":90}],118:[function(require,module,exports){
// 19.1.2.14 Object.keys(O)
var toObject = require('./_to-object')
, $keys = require('./_object-keys');
require('./_object-sap')('keys', function(){
return function keys(it){
return $keys(toObject(it));
};
});
},{"./_object-keys":88,"./_object-sap":90,"./_to-object":106}],119:[function(require,module,exports){
},{}],120:[function(require,module,exports){
'use strict';
var LIBRARY = require('./_library')
, global = require('./_global')
, ctx = require('./_ctx')
, classof = require('./_classof')
, $export = require('./_export')
, isObject = require('./_is-object')
, anObject = require('./_an-object')
, aFunction = require('./_a-function')
, anInstance = require('./_an-instance')
, forOf = require('./_for-of')
, setProto = require('./_set-proto').set
, speciesConstructor = require('./_species-constructor')
, task = require('./_task').set
, microtask = require('./_microtask')()
, PROMISE = 'Promise'
, TypeError = global.TypeError
, process = global.process
, $Promise = global[PROMISE]
, process = global.process
, isNode = classof(process) == 'process'
, empty = function(){ /* empty */ }
, Internal, GenericPromiseCapability, Wrapper;
var USE_NATIVE = !!function(){
try {
// correct subclassing with @@species support
var promise = $Promise.resolve(1)
, FakePromise = (promise.constructor = {})[require('./_wks')('species')] = function(exec){ exec(empty, empty); };
// unhandled rejections tracking support, NodeJS Promise without it fails @@species test
return (isNode || typeof PromiseRejectionEvent == 'function') && promise.then(empty) instanceof FakePromise;
} catch(e){ /* empty */ }
}();
// helpers
var sameConstructor = function(a, b){
// with library wrapper special case
return a === b || a === $Promise && b === Wrapper;
};
var isThenable = function(it){
var then;
return isObject(it) && typeof (then = it.then) == 'function' ? then : false;
};
var newPromiseCapability = function(C){
return sameConstructor($Promise, C)
? new PromiseCapability(C)
: new GenericPromiseCapability(C);
};
var PromiseCapability = GenericPromiseCapability = function(C){
var resolve, reject;
this.promise = new C(function($$resolve, $$reject){
if(resolve !== undefined || reject !== undefined)throw TypeError('Bad Promise constructor');
resolve = $$resolve;
reject = $$reject;
});
this.resolve = aFunction(resolve);
this.reject = aFunction(reject);
};
var perform = function(exec){
try {
exec();
} catch(e){
return {error: e};
}
};
var notify = function(promise, isReject){
if(promise._n)return;
promise._n = true;
var chain = promise._c;
microtask(function(){
var value = promise._v
, ok = promise._s == 1
, i = 0;
var run = function(reaction){
var handler = ok ? reaction.ok : reaction.fail
, resolve = reaction.resolve
, reject = reaction.reject
, domain = reaction.domain
, result, then;
try {
if(handler){
if(!ok){
if(promise._h == 2)onHandleUnhandled(promise);
promise._h = 1;
}
if(handler === true)result = value;
else {
if(domain)domain.enter();
result = handler(value);
if(domain)domain.exit();
}
if(result === reaction.promise){
reject(TypeError('Promise-chain cycle'));
} else if(then = isThenable(result)){
then.call(result, resolve, reject);
} else resolve(result);
} else reject(value);
} catch(e){
reject(e);
}
};
while(chain.length > i)run(chain[i++]); // variable length - can't use forEach
promise._c = [];
promise._n = false;
if(isReject && !promise._h)onUnhandled(promise);
});
};
var onUnhandled = function(promise){
task.call(global, function(){
var value = promise._v
, abrupt, handler, console;
if(isUnhandled(promise)){
abrupt = perform(function(){
if(isNode){
process.emit('unhandledRejection', value, promise);
} else if(handler = global.onunhandledrejection){
handler({promise: promise, reason: value});
} else if((console = global.console) && console.error){
console.error('Unhandled promise rejection', value);
}
});
// Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should
promise._h = isNode || isUnhandled(promise) ? 2 : 1;
} promise._a = undefined;
if(abrupt)throw abrupt.error;
});
};
var isUnhandled = function(promise){
if(promise._h == 1)return false;
var chain = promise._a || promise._c
, i = 0
, reaction;
while(chain.length > i){
reaction = chain[i++];
if(reaction.fail || !isUnhandled(reaction.promise))return false;
} return true;
};
var onHandleUnhandled = function(promise){
task.call(global, function(){
var handler;
if(isNode){
process.emit('rejectionHandled', promise);
} else if(handler = global.onrejectionhandled){
handler({promise: promise, reason: promise._v});
}
});
};
var $reject = function(value){
var promise = this;
if(promise._d)return;
promise._d = true;
promise = promise._w || promise; // unwrap
promise._v = value;
promise._s = 2;
if(!promise._a)promise._a = promise._c.slice();
notify(promise, true);
};
var $resolve = function(value){
var promise = this
, then;
if(promise._d)return;
promise._d = true;
promise = promise._w || promise; // unwrap
try {
if(promise === value)throw TypeError("Promise can't be resolved itself");
if(then = isThenable(value)){
microtask(function(){
var wrapper = {_w: promise, _d: false}; // wrap
try {
then.call(value, ctx($resolve, wrapper, 1), ctx($reject, wrapper, 1));
} catch(e){
$reject.call(wrapper, e);
}
});
} else {
promise._v = value;
promise._s = 1;
notify(promise, false);
}
} catch(e){
$reject.call({_w: promise, _d: false}, e); // wrap
}
};
// constructor polyfill
if(!USE_NATIVE){
// 25.4.3.1 Promise(executor)
$Promise = function Promise(executor){
anInstance(this, $Promise, PROMISE, '_h');
aFunction(executor);
Internal.call(this);
try {
executor(ctx($resolve, this, 1), ctx($reject, this, 1));
} catch(err){
$reject.call(this, err);
}
};
Internal = function Promise(executor){
this._c = []; // <- awaiting reactions
this._a = undefined; // <- checked in isUnhandled reactions
this._s = 0; // <- state
this._d = false; // <- done
this._v = undefined; // <- value
this._h = 0; // <- rejection state, 0 - default, 1 - handled, 2 - unhandled
this._n = false; // <- notify
};
Internal.prototype = require('./_redefine-all')($Promise.prototype, {
// 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected)
then: function then(onFulfilled, onRejected){
var reaction = newPromiseCapability(speciesConstructor(this, $Promise));
reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;
reaction.fail = typeof onRejected == 'function' && onRejected;
reaction.domain = isNode ? process.domain : undefined;
this._c.push(reaction);
if(this._a)this._a.push(reaction);
if(this._s)notify(this, false);
return reaction.promise;
},
// 25.4.5.1 Promise.prototype.catch(onRejected)
'catch': function(onRejected){
return this.then(undefined, onRejected);
}
});
PromiseCapability = function(){
var promise = new Internal;
this.promise = promise;
this.resolve = ctx($resolve, promise, 1);
this.reject = ctx($reject, promise, 1);
};
}
$export($export.G + $export.W + $export.F * !USE_NATIVE, {Promise: $Promise});
require('./_set-to-string-tag')($Promise, PROMISE);
require('./_set-species')(PROMISE);
Wrapper = require('./_core')[PROMISE];
// statics
$export($export.S + $export.F * !USE_NATIVE, PROMISE, {
// 25.4.4.5 Promise.reject(r)
reject: function reject(r){
var capability = newPromiseCapability(this)
, $$reject = capability.reject;
$$reject(r);
return capability.promise;
}
});
$export($export.S + $export.F * (LIBRARY || !USE_NATIVE), PROMISE, {
// 25.4.4.6 Promise.resolve(x)
resolve: function resolve(x){
// instanceof instead of internal slot check because we should fix it without replacement native Promise core
if(x instanceof $Promise && sameConstructor(x.constructor, this))return x;
var capability = newPromiseCapability(this)
, $$resolve = capability.resolve;
$$resolve(x);
return capability.promise;
}
});
$export($export.S + $export.F * !(USE_NATIVE && require('./_iter-detect')(function(iter){
$Promise.all(iter)['catch'](empty);
})), PROMISE, {
// 25.4.4.1 Promise.all(iterable)
all: function all(iterable){
var C = this
, capability = newPromiseCapability(C)
, resolve = capability.resolve
, reject = capability.reject;
var abrupt = perform(function(){
var values = []
, index = 0
, remaining = 1;
forOf(iterable, false, function(promise){
var $index = index++
, alreadyCalled = false;
values.push(undefined);
remaining++;
C.resolve(promise).then(function(value){
if(alreadyCalled)return;
alreadyCalled = true;
values[$index] = value;
--remaining || resolve(values);
}, reject);
});
--remaining || resolve(values);
});
if(abrupt)reject(abrupt.error);
return capability.promise;
},
// 25.4.4.4 Promise.race(iterable)
race: function race(iterable){
var C = this
, capability = newPromiseCapability(C)
, reject = capability.reject;
var abrupt = perform(function(){
forOf(iterable, false, function(promise){
C.resolve(promise).then(capability.resolve, reject);
});
});
if(abrupt)reject(abrupt.error);
return capability.promise;
}
});
},{"./_a-function":42,"./_an-instance":44,"./_an-object":45,"./_classof":47,"./_core":49,"./_ctx":50,"./_export":56,"./_for-of":58,"./_global":59,"./_is-object":68,"./_iter-detect":72,"./_library":76,"./_microtask":78,"./_redefine-all":92,"./_set-proto":94,"./_set-species":95,"./_set-to-string-tag":96,"./_species-constructor":99,"./_task":101,"./_wks":111}],121:[function(require,module,exports){
'use strict';
var $at = require('./_string-at')(true);
// 21.1.3.27 String.prototype[@@iterator]()
require('./_iter-define')(String, 'String', function(iterated){
this._t = String(iterated); // target
this._i = 0; // next index
// 21.1.5.2.1 %StringIteratorPrototype%.next()
}, function(){
var O = this._t
, index = this._i
, point;
if(index >= O.length)return {value: undefined, done: true};
point = $at(O, index);
this._i += point.length;
return {value: point, done: false};
});
},{"./_iter-define":71,"./_string-at":100}],122:[function(require,module,exports){
'use strict';
// ECMAScript 6 symbols shim
var global = require('./_global')
, has = require('./_has')
, DESCRIPTORS = require('./_descriptors')
, $export = require('./_export')
, redefine = require('./_redefine')
, META = require('./_meta').KEY
, $fails = require('./_fails')
, shared = require('./_shared')
, setToStringTag = require('./_set-to-string-tag')
, uid = require('./_uid')
, wks = require('./_wks')
, wksExt = require('./_wks-ext')
, wksDefine = require('./_wks-define')
, keyOf = require('./_keyof')
, enumKeys = require('./_enum-keys')
, isArray = require('./_is-array')
, anObject = require('./_an-object')
, toIObject = require('./_to-iobject')
, toPrimitive = require('./_to-primitive')
, createDesc = require('./_property-desc')
, _create = require('./_object-create')
, gOPNExt = require('./_object-gopn-ext')
, $GOPD = require('./_object-gopd')
, $DP = require('./_object-dp')
, $keys = require('./_object-keys')
, gOPD = $GOPD.f
, dP = $DP.f
, gOPN = gOPNExt.f
, $Symbol = global.Symbol
, $JSON = global.JSON
, _stringify = $JSON && $JSON.stringify
, PROTOTYPE = 'prototype'
, HIDDEN = wks('_hidden')
, TO_PRIMITIVE = wks('toPrimitive')
, isEnum = {}.propertyIsEnumerable
, SymbolRegistry = shared('symbol-registry')
, AllSymbols = shared('symbols')
, OPSymbols = shared('op-symbols')
, ObjectProto = Object[PROTOTYPE]
, USE_NATIVE = typeof $Symbol == 'function'
, QObject = global.QObject;
// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173
var setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;
// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687
var setSymbolDesc = DESCRIPTORS && $fails(function(){
return _create(dP({}, 'a', {
get: function(){ return dP(this, 'a', {value: 7}).a; }
})).a != 7;
}) ? function(it, key, D){
var protoDesc = gOPD(ObjectProto, key);
if(protoDesc)delete ObjectProto[key];
dP(it, key, D);
if(protoDesc && it !== ObjectProto)dP(ObjectProto, key, protoDesc);
} : dP;
var wrap = function(tag){
var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]);
sym._k = tag;
return sym;
};
var isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function(it){
return typeof it == 'symbol';
} : function(it){
return it instanceof $Symbol;
};
var $defineProperty = function defineProperty(it, key, D){
if(it === ObjectProto)$defineProperty(OPSymbols, key, D);
anObject(it);
key = toPrimitive(key, true);
anObject(D);
if(has(AllSymbols, key)){
if(!D.enumerable){
if(!has(it, HIDDEN))dP(it, HIDDEN, createDesc(1, {}));
it[HIDDEN][key] = true;
} else {
if(has(it, HIDDEN) && it[HIDDEN][key])it[HIDDEN][key] = false;
D = _create(D, {enumerable: createDesc(0, false)});
} return setSymbolDesc(it, key, D);
} return dP(it, key, D);
};
var $defineProperties = function defineProperties(it, P){
anObject(it);
var keys = enumKeys(P = toIObject(P))
, i = 0
, l = keys.length
, key;
while(l > i)$defineProperty(it, key = keys[i++], P[key]);
return it;
};
var $create = function create(it, P){
return P === undefined ? _create(it) : $defineProperties(_create(it), P);
};
var $propertyIsEnumerable = function propertyIsEnumerable(key){
var E = isEnum.call(this, key = toPrimitive(key, true));
if(this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key))return false;
return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;
};
var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key){
it = toIObject(it);
key = toPrimitive(key, true);
if(it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key))return;
var D = gOPD(it, key);
if(D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key]))D.enumerable = true;
return D;
};
var $getOwnPropertyNames = function getOwnPropertyNames(it){
var names = gOPN(toIObject(it))
, result = []
, i = 0
, key;
while(names.length > i){
if(!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META)result.push(key);
} return result;
};
var $getOwnPropertySymbols = function getOwnPropertySymbols(it){
var IS_OP = it === ObjectProto
, names = gOPN(IS_OP ? OPSymbols : toIObject(it))
, result = []
, i = 0
, key;
while(names.length > i){
if(has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true))result.push(AllSymbols[key]);
} return result;
};
// 19.4.1.1 Symbol([description])
if(!USE_NATIVE){
$Symbol = function Symbol(){
if(this instanceof $Symbol)throw TypeError('Symbol is not a constructor!');
var tag = uid(arguments.length > 0 ? arguments[0] : undefined);
var $set = function(value){
if(this === ObjectProto)$set.call(OPSymbols, value);
if(has(this, HIDDEN) && has(this[HIDDEN], tag))this[HIDDEN][tag] = false;
setSymbolDesc(this, tag, createDesc(1, value));
};
if(DESCRIPTORS && setter)setSymbolDesc(ObjectProto, tag, {configurable: true, set: $set});
return wrap(tag);
};
redefine($Symbol[PROTOTYPE], 'toString', function toString(){
return this._k;
});
$GOPD.f = $getOwnPropertyDescriptor;
$DP.f = $defineProperty;
require('./_object-gopn').f = gOPNExt.f = $getOwnPropertyNames;
require('./_object-pie').f = $propertyIsEnumerable;
require('./_object-gops').f = $getOwnPropertySymbols;
if(DESCRIPTORS && !require('./_library')){
redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);
}
wksExt.f = function(name){
return wrap(wks(name));
}
}
$export($export.G + $export.W + $export.F * !USE_NATIVE, {Symbol: $Symbol});
for(var symbols = (
// 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14
'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'
).split(','), i = 0; symbols.length > i; )wks(symbols[i++]);
for(var symbols = $keys(wks.store), i = 0; symbols.length > i; )wksDefine(symbols[i++]);
$export($export.S + $export.F * !USE_NATIVE, 'Symbol', {
// 19.4.2.1 Symbol.for(key)
'for': function(key){
return has(SymbolRegistry, key += '')
? SymbolRegistry[key]
: SymbolRegistry[key] = $Symbol(key);
},
// 19.4.2.5 Symbol.keyFor(sym)
keyFor: function keyFor(key){
if(isSymbol(key))return keyOf(SymbolRegistry, key);
throw TypeError(key + ' is not a symbol!');
},
useSetter: function(){ setter = true; },
useSimple: function(){ setter = false; }
});
$export($export.S + $export.F * !USE_NATIVE, 'Object', {
// 19.1.2.2 Object.create(O [, Properties])
create: $create,
// 19.1.2.4 Object.defineProperty(O, P, Attributes)
defineProperty: $defineProperty,
// 19.1.2.3 Object.defineProperties(O, Properties)
defineProperties: $defineProperties,
// 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)
getOwnPropertyDescriptor: $getOwnPropertyDescriptor,
// 19.1.2.7 Object.getOwnPropertyNames(O)
getOwnPropertyNames: $getOwnPropertyNames,
// 19.1.2.8 Object.getOwnPropertySymbols(O)
getOwnPropertySymbols: $getOwnPropertySymbols
});
// 24.3.2 JSON.stringify(value [, replacer [, space]])
$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function(){
var S = $Symbol();
// MS Edge converts symbol values to JSON as {}
// WebKit converts symbol values to JSON as null
// V8 throws on boxed symbols
return _stringify([S]) != '[null]' || _stringify({a: S}) != '{}' || _stringify(Object(S)) != '{}';
})), 'JSON', {
stringify: function stringify(it){
if(it === undefined || isSymbol(it))return; // IE8 returns string on undefined
var args = [it]
, i = 1
, replacer, $replacer;
while(arguments.length > i)args.push(arguments[i++]);
replacer = args[1];
if(typeof replacer == 'function')$replacer = replacer;
if($replacer || !isArray(replacer))replacer = function(key, value){
if($replacer)value = $replacer.call(this, key, value);
if(!isSymbol(value))return value;
};
args[1] = replacer;
return _stringify.apply($JSON, args);
}
});
// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)
$Symbol[PROTOTYPE][TO_PRIMITIVE] || require('./_hide')($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);
// 19.4.3.5 Symbol.prototype[@@toStringTag]
setToStringTag($Symbol, 'Symbol');
// 20.2.1.9 Math[@@toStringTag]
setToStringTag(Math, 'Math', true);
// 24.3.3 JSON[@@toStringTag]
setToStringTag(global.JSON, 'JSON', true);
},{"./_an-object":45,"./_descriptors":52,"./_enum-keys":55,"./_export":56,"./_fails":57,"./_global":59,"./_has":60,"./_hide":61,"./_is-array":67,"./_keyof":75,"./_library":76,"./_meta":77,"./_object-create":79,"./_object-dp":80,"./_object-gopd":82,"./_object-gopn":84,"./_object-gopn-ext":83,"./_object-gops":85,"./_object-keys":88,"./_object-pie":89,"./_property-desc":91,"./_redefine":93,"./_set-to-string-tag":96,"./_shared":98,"./_to-iobject":104,"./_to-primitive":107,"./_uid":108,"./_wks":111,"./_wks-define":109,"./_wks-ext":110}],123:[function(require,module,exports){
require('./_wks-define')('asyncIterator');
},{"./_wks-define":109}],124:[function(require,module,exports){
require('./_wks-define')('observable');
},{"./_wks-define":109}],125:[function(require,module,exports){
require('./es6.array.iterator');
var global = require('./_global')
, hide = require('./_hide')
, Iterators = require('./_iterators')
, TO_STRING_TAG = require('./_wks')('toStringTag');
for(var collections = ['NodeList', 'DOMTokenList', 'MediaList', 'StyleSheetList', 'CSSRuleList'], i = 0; i < 5; i++){
var NAME = collections[i]
, Collection = global[NAME]
, proto = Collection && Collection.prototype;
if(proto && !proto[TO_STRING_TAG])hide(proto, TO_STRING_TAG, NAME);
Iterators[NAME] = Iterators.Array;
}
},{"./_global":59,"./_hide":61,"./_iterators":74,"./_wks":111,"./es6.array.iterator":115}],126:[function(require,module,exports){
(function (process){
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _slicedToArray2 = require('babel-runtime/helpers/slicedToArray');
var _slicedToArray3 = _interopRequireDefault(_slicedToArray2);
exports.default = createHttpClient;
var _qs = require('qs');
var _qs2 = _interopRequireDefault(_qs);
var _cloneDeep = require('lodash/cloneDeep');
var _cloneDeep2 = _interopRequireDefault(_cloneDeep);
var _assign = require('lodash/assign');
var _assign2 = _interopRequireDefault(_assign);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* Create pre configured axios instance
* @private
* @param {Object} axios - Axios library
* @param {Object} httpClientParams - Initialization parameters for the HTTP client
* @prop {string} space - Space ID
* @prop {string} accessToken - Access Token
* @prop {boolean=} insecure - If we should use http instead
* @prop {string=} host - Alternate host
* @prop {Object=} agent - HTTP agent for node
* @prop {Object=} headers - Additional headers
* @return {Object} Initialized axios instance
*/
function createHttpClient(axios, httpClientParams) {
var space = httpClientParams.space;
var accessToken = httpClientParams.accessToken;
var insecure = httpClientParams.insecure;
var host = httpClientParams.host;
var defaultHostname = httpClientParams.defaultHostname;
var agent = httpClientParams.agent;
var headers = httpClientParams.headers;
var _ref = host && host.split(':') || [];
var _ref2 = (0, _slicedToArray3.default)(_ref, 2);
var hostname = _ref2[0];
var port = _ref2[1];
hostname = hostname || defaultHostname;
port = port || (insecure ? 80 : 443);
var baseURL = (insecure ? 'http' : 'https') + '://' + hostname + ':' + port + '/spaces/';
if (space) {
baseURL += space + '/';
}
headers = headers || {};
headers['Authorization'] = 'Bearer ' + accessToken;
// Set these headers only for node because browsers don't like it when you
// override user-agent or accept-encoding.
// The SDKs should set their own X-Contentful-User-Agent.
if (process && process.release && process.release.name === 'node') {
headers['user-agent'] = 'node.js/' + process.version;
headers['Accept-Encoding'] = 'gzip';
}
var instance = axios.create({
baseURL: baseURL,
headers: headers,
agent: agent,
paramsSerializer: _qs2.default.stringify
});
instance.httpClientParams = httpClientParams;
/**
* Creates a new axios instance with the same default base parameters as the
* current one, and with any overrides passed to the newParams object
* This is useful as the SDKs use dependency injection to get the axios library
* and the version of the library comes from different places depending
* on whether it's a browser build or a node.js build.
* @private
* @param {Object} httpClientParams - Initialization parameters for the HTTP client
* @return {Object} Initialized axios instance
*/
instance.cloneWithNewParams = function (newParams) {
return createHttpClient(axios, (0, _assign2.default)((0, _cloneDeep2.default)(httpClientParams), newParams));
};
return instance;
}
}).call(this,require('_process'))
//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9jb250ZW50ZnVsLXNkay1jb3JlL2NyZWF0ZS1odHRwLWNsaWVudC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfc2xpY2VkVG9BcnJheTIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvc2xpY2VkVG9BcnJheScpO1xuXG52YXIgX3NsaWNlZFRvQXJyYXkzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfc2xpY2VkVG9BcnJheTIpO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBjcmVhdGVIdHRwQ2xpZW50O1xuXG52YXIgX3FzID0gcmVxdWlyZSgncXMnKTtcblxudmFyIF9xczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9xcyk7XG5cbnZhciBfY2xvbmVEZWVwID0gcmVxdWlyZSgnbG9kYXNoL2Nsb25lRGVlcCcpO1xuXG52YXIgX2Nsb25lRGVlcDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbG9uZURlZXApO1xuXG52YXIgX2Fzc2lnbiA9IHJlcXVpcmUoJ2xvZGFzaC9hc3NpZ24nKTtcblxudmFyIF9hc3NpZ24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfYXNzaWduKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuLyoqXG4gKiBDcmVhdGUgcHJlIGNvbmZpZ3VyZWQgYXhpb3MgaW5zdGFuY2VcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gYXhpb3MgLSBBeGlvcyBsaWJyYXJ5XG4gKiBAcGFyYW0ge09iamVjdH0gaHR0cENsaWVudFBhcmFtcyAtIEluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMgZm9yIHRoZSBIVFRQIGNsaWVudFxuICogQHByb3Age3N0cmluZ30gc3BhY2UgLSBTcGFjZSBJRFxuICogQHByb3Age3N0cmluZ30gYWNjZXNzVG9rZW4gLSBBY2Nlc3MgVG9rZW5cbiAqIEBwcm9wIHtib29sZWFuPX0gaW5zZWN1cmUgLSBJZiB3ZSBzaG91bGQgdXNlIGh0dHAgaW5zdGVhZFxuICogQHByb3Age3N0cmluZz19IGhvc3QgLSBBbHRlcm5hdGUgaG9zdFxuICogQHByb3Age09iamVjdD19IGFnZW50IC0gSFRUUCBhZ2VudCBmb3Igbm9kZVxuICogQHByb3Age09iamVjdD19IGhlYWRlcnMgLSBBZGRpdGlvbmFsIGhlYWRlcnNcbiAqIEByZXR1cm4ge09iamVjdH0gSW5pdGlhbGl6ZWQgYXhpb3MgaW5zdGFuY2VcbiAqL1xuZnVuY3Rpb24gY3JlYXRlSHR0cENsaWVudChheGlvcywgaHR0cENsaWVudFBhcmFtcykge1xuICB2YXIgc3BhY2UgPSBodHRwQ2xpZW50UGFyYW1zLnNwYWNlO1xuICB2YXIgYWNjZXNzVG9rZW4gPSBodHRwQ2xpZW50UGFyYW1zLmFjY2Vzc1Rva2VuO1xuICB2YXIgaW5zZWN1cmUgPSBodHRwQ2xpZW50UGFyYW1zLmluc2VjdXJlO1xuICB2YXIgaG9zdCA9IGh0dHBDbGllbnRQYXJhbXMuaG9zdDtcbiAgdmFyIGRlZmF1bHRIb3N0bmFtZSA9IGh0dHBDbGllbnRQYXJhbXMuZGVmYXVsdEhvc3RuYW1lO1xuICB2YXIgYWdlbnQgPSBodHRwQ2xpZW50UGFyYW1zLmFnZW50O1xuICB2YXIgaGVhZGVycyA9IGh0dHBDbGllbnRQYXJhbXMuaGVhZGVycztcblxuICB2YXIgX3JlZiA9IGhvc3QgJiYgaG9zdC5zcGxpdCgnOicpIHx8IFtdO1xuXG4gIHZhciBfcmVmMiA9ICgwLCBfc2xpY2VkVG9BcnJheTMuZGVmYXVsdCkoX3JlZiwgMik7XG5cbiAgdmFyIGhvc3RuYW1lID0gX3JlZjJbMF07XG4gIHZhciBwb3J0ID0gX3JlZjJbMV07XG5cbiAgaG9zdG5hbWUgPSBob3N0bmFtZSB8fCBkZWZhdWx0SG9zdG5hbWU7XG4gIHBvcnQgPSBwb3J0IHx8IChpbnNlY3VyZSA/IDgwIDogNDQzKTtcbiAgdmFyIGJhc2VVUkwgPSAoaW5zZWN1cmUgPyAnaHR0cCcgOiAnaHR0cHMnKSArICc6Ly8nICsgaG9zdG5hbWUgKyAnOicgKyBwb3J0ICsgJy9zcGFjZXMvJztcbiAgaWYgKHNwYWNlKSB7XG4gICAgYmFzZVVSTCArPSBzcGFjZSArICcvJztcbiAgfVxuICBoZWFkZXJzID0gaGVhZGVycyB8fCB7fTtcbiAgaGVhZGVyc1snQXV0aG9yaXphdGlvbiddID0gJ0JlYXJlciAnICsgYWNjZXNzVG9rZW47XG5cbiAgLy8gU2V0IHRoZXNlIGhlYWRlcnMgb25seSBmb3Igbm9kZSBiZWNhdXNlIGJyb3dzZXJzIGRvbid0IGxpa2UgaXQgd2hlbiB5b3VcbiAgLy8gb3ZlcnJpZGUgdXNlci1hZ2VudCBvciBhY2NlcHQtZW5jb2RpbmcuXG4gIC8vIFRoZSBTREtzIHNob3VsZCBzZXQgdGhlaXIgb3duIFgtQ29udGVudGZ1bC1Vc2VyLUFnZW50LlxuICBpZiAocHJvY2VzcyAmJiBwcm9jZXNzLnJlbGVhc2UgJiYgcHJvY2Vzcy5yZWxlYXNlLm5hbWUgPT09ICdub2RlJykge1xuICAgIGhlYWRlcnNbJ3VzZXItYWdlbnQnXSA9ICdub2RlLmpzLycgKyBwcm9jZXNzLnZlcnNpb247XG4gICAgaGVhZGVyc1snQWNjZXB0LUVuY29kaW5nJ10gPSAnZ3ppcCc7XG4gIH1cblxuICB2YXIgaW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoe1xuICAgIGJhc2VVUkw6IGJhc2VVUkwsXG4gICAgaGVhZGVyczogaGVhZGVycyxcbiAgICBhZ2VudDogYWdlbnQsXG4gICAgcGFyYW1zU2VyaWFsaXplcjogX3FzMi5kZWZhdWx0LnN0cmluZ2lmeVxuICB9KTtcbiAgaW5zdGFuY2UuaHR0cENsaWVudFBhcmFtcyA9IGh0dHBDbGllbnRQYXJhbXM7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgYXhpb3MgaW5zdGFuY2Ugd2l0aCB0aGUgc2FtZSBkZWZhdWx0IGJhc2UgcGFyYW1ldGVycyBhcyB0aGVcbiAgICogY3VycmVudCBvbmUsIGFuZCB3aXRoIGFueSBvdmVycmlkZXMgcGFzc2VkIHRvIHRoZSBuZXdQYXJhbXMgb2JqZWN0XG4gICAqIFRoaXMgaXMgdXNlZnVsIGFzIHRoZSBTREtzIHVzZSBkZXBlbmRlbmN5IGluamVjdGlvbiB0byBnZXQgdGhlIGF4aW9zIGxpYnJhcnlcbiAgICogYW5kIHRoZSB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IGNvbWVzIGZyb20gZGlmZmVyZW50IHBsYWNlcyBkZXBlbmRpbmdcbiAgICogb24gd2hldGhlciBpdCdzIGEgYnJvd3NlciBidWlsZCBvciBhIG5vZGUuanMgYnVpbGQuXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBodHRwQ2xpZW50UGFyYW1zIC0gSW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycyBmb3IgdGhlIEhUVFAgY2xpZW50XG4gICAqIEByZXR1cm4ge09iamVjdH0gSW5pdGlhbGl6ZWQgYXhpb3MgaW5zdGFuY2VcbiAgICovXG4gIGluc3RhbmNlLmNsb25lV2l0aE5ld1BhcmFtcyA9IGZ1bmN0aW9uIChuZXdQYXJhbXMpIHtcbiAgICByZXR1cm4gY3JlYXRlSHR0cENsaWVudChheGlvcywgKDAsIF9hc3NpZ24yLmRlZmF1bHQpKCgwLCBfY2xvbmVEZWVwMi5kZWZhdWx0KShodHRwQ2xpZW50UGFyYW1zKSwgbmV3UGFyYW1zKSk7XG4gIH07XG5cbiAgcmV0dXJuIGluc3RhbmNlO1xufSJdfQ==
},{"_process":1,"babel-runtime/helpers/slicedToArray":31,"lodash/assign":268,"lodash/cloneDeep":270,"qs":130}],127:[function(require,module,exports){
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = createRequestConfig;
var _cloneDeep = require('lodash/cloneDeep');
var _cloneDeep2 = _interopRequireDefault(_cloneDeep);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* Creates request parameters configuration by parsing an existing query object
* @private
* @param {Object} query
* @return {Object} Config object with `params` property, ready to be used in axios
*/
function createRequestConfig(_ref) {
var query = _ref.query;
var config = {};
delete query.resolveLinks;
config.params = (0, _cloneDeep2.default)(query);
return config;
}
},{"lodash/cloneDeep":270}],128:[function(require,module,exports){
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _freeze = require('babel-runtime/core-js/object/freeze');
var _freeze2 = _interopRequireDefault(_freeze);
exports.default = freezeSys;
var _each = require('lodash/each');
var _each2 = _interopRequireDefault(_each);
var _isPlainObject = require('lodash/isPlainObject');
var _isPlainObject2 = _interopRequireDefault(_isPlainObject);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function freezeObjectDeep(obj) {
(0, _each2.default)(obj, function (value, key) {
if ((0, _isPlainObject2.default)(value)) {
freezeObjectDeep(value);
}
});
return (0, _freeze2.default)(obj);
}
function freezeSys(obj) {
freezeObjectDeep(obj.sys);
return obj;
}
},{"babel-runtime/core-js/object/freeze":26,"lodash/each":272,"lodash/isPlainObject":287}],129:[function(require,module,exports){
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = mixinToPlainObject;
var _cloneDeep = require('lodash/cloneDeep');
var _cloneDeep2 = _interopRequireDefault(_cloneDeep);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* Mixes in a method to return just a plain object with no additional methods
* @private
* @param {Object} data - Any plain JSON response returned from the API
* @return {Object} Enhanced object with toPlainObject method
*/
function mixinToPlainObject(data) {
return Object.defineProperty(data, 'toPlainObject', {
enumerable: false,
configurable: false,
writable: false,
value: function value() {
return (0, _cloneDeep2.default)(this);
}
});
}
},{"lodash/cloneDeep":270}],130:[function(require,module,exports){
'use strict';
var Stringify = require('./stringify');
var Parse = require('./parse');
module.exports = {
stringify: Stringify,
parse: Parse
};
},{"./parse":131,"./stringify":132}],131:[function(require,module,exports){
'use strict';
var Utils = require('./utils');
var defaults = {
delimiter: '&',
depth: 5,
arrayLimit: 20,
parameterLimit: 1000,
strictNullHandling: false,
plainObjects: false,
allowPrototypes: false,
allowDots: false,
decoder: Utils.decode
};
var parseValues = function parseValues(str, options) {
var obj = {};
var parts = str.split(options.delimiter, options.parameterLimit === Infinity ? undefined : options.parameterLimit);
for (var i = 0; i < parts.length; ++i) {
var part = parts[i];
var pos = part.indexOf(']=') === -1 ? part.indexOf('=') : part.indexOf(']=') + 1;
if (pos === -1) {
obj[options.decoder(part)] = '';
if (options.strictNullHandling) {
obj[options.decoder(part)] = null;
}
} else {
var key = options.decoder(part.slice(0, pos));
var val = options.decoder(part.slice(pos + 1));
if (Object.prototype.hasOwnProperty.call(obj, key)) {
obj[key] = [].concat(obj[key]).concat(val);
} else {
obj[key] = val;
}
}
}
return obj;
};
var parseObject = function parseObject(chain, val, options) {
if (!chain.length) {
return val;
}
var root = chain.shift();
var obj;
if (root === '[]') {
obj = [];
obj = obj.concat(parseObject(chain, val, options));
} else {
obj = options.plainObjects ? Object.create(null) : {};
var cleanRoot = root[0] === '[' && root[root.length - 1] === ']' ? root.slice(1, root.length - 1) : root;
var index = parseInt(cleanRoot, 10);
if (
!isNaN(index) &&
root !== cleanRoot &&
String(index) === cleanRoot &&
index >= 0 &&
(options.parseArrays && index <= options.arrayLimit)
) {
obj = [];
obj[index] = parseObject(chain, val, options);
} else {
obj[cleanRoot] = parseObject(chain, val, options);
}
}
return obj;
};
var parseKeys = function parseKeys(givenKey, val, options) {
if (!givenKey) {
return;
}
// Transform dot notation to bracket notation
var key = options.allowDots ? givenKey.replace(/\.([^\.\[]+)/g, '[$1]') : givenKey;
// The regex chunks
var parent = /^([^\[\]]*)/;
var child = /(\[[^\[\]]*\])/g;
// Get the parent
var segment = parent.exec(key);
// Stash the parent if it exists
var keys = [];
if (segment[1]) {
// If we aren't using plain objects, optionally prefix keys
// that would overwrite object prototype properties
if (!options.plainObjects && Object.prototype.hasOwnProperty(segment[1])) {
if (!options.allowPrototypes) {
return;
}
}
keys.push(segment[1]);
}
// Loop through children appending to the array until we hit depth
var i = 0;
while ((segment = child.exec(key)) !== null && i < options.depth) {
i += 1;
if (!options.plainObjects && Object.prototype.hasOwnProperty(segment[1].replace(/\[|\]/g, ''))) {
if (!options.allowPrototypes) {
continue;
}
}
keys.push(segment[1]);
}
// If there's a remainder, just add whatever is left
if (segment) {
keys.push('[' + key.slice(segment.index) + ']');
}
return parseObject(keys, val, options);
};
module.exports = function (str, opts) {
var options = opts || {};
if (options.decoder !== null && options.decoder !== undefined && typeof options.decoder !== 'function') {
throw new TypeError('Decoder has to be a function.');
}
options.delimiter = typeof options.delimiter === 'string' || Utils.isRegExp(options.delimiter) ? options.delimiter : defaults.delimiter;
options.depth = typeof options.depth === 'number' ? options.depth : defaults.depth;
options.arrayLimit = typeof options.arrayLimit === 'number' ? options.arrayLimit : defaults.arrayLimit;
options.parseArrays = options.parseArrays !== false;
options.decoder = typeof options.decoder === 'function' ? options.decoder : defaults.decoder;
options.allowDots = typeof options.allowDots === 'boolean' ? options.allowDots : defaults.allowDots;
options.plainObjects = typeof options.plainObjects === 'boolean' ? options.plainObjects : defaults.plainObjects;
options.allowPrototypes = typeof options.allowPrototypes === 'boolean' ? options.allowPrototypes : defaults.allowPrototypes;
options.parameterLimit = typeof options.parameterLimit === 'number' ? options.parameterLimit : defaults.parameterLimit;
options.strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : defaults.strictNullHandling;
if (str === '' || str === null || typeof str === 'undefined') {
return options.plainObjects ? Object.create(null) : {};
}
var tempObj = typeof str === 'string' ? parseValues(str, options) : str;
var obj = options.plainObjects ? Object.create(null) : {};
// Iterate over the keys and setup the new object
var keys = Object.keys(tempObj);
for (var i = 0; i < keys.length; ++i) {
var key = keys[i];
var newObj = parseKeys(key, tempObj[key], options);
obj = Utils.merge(obj, newObj, options);
}
return Utils.compact(obj);
};
},{"./utils":133}],132:[function(require,module,exports){
'use strict';
var Utils = require('./utils');
var arrayPrefixGenerators = {
brackets: function brackets(prefix) {
return prefix + '[]';
},
indices: function indices(prefix, key) {
return prefix + '[' + key + ']';
},
repeat: function repeat(prefix) {
return prefix;
}
};
var defaults = {
delimiter: '&',
strictNullHandling: false,
skipNulls: false,
encode: true,
encoder: Utils.encode
};
var stringify = function stringify(object, prefix, generateArrayPrefix, strictNullHandling, skipNulls, encoder, filter, sort, allowDots) {
var obj = object;
if (typeof filter === 'function') {
obj = filter(prefix, obj);
} else if (obj instanceof Date) {
obj = obj.toISOString();
} else if (obj === null) {
if (strictNullHandling) {
return encoder ? encoder(prefix) : prefix;
}
obj = '';
}
if (typeof obj === 'string' || typeof obj === 'number' || typeof obj === 'boolean' || Utils.isBuffer(obj)) {
if (encoder) {
return [encoder(prefix) + '=' + encoder(obj)];
}
return [prefix + '=' + String(obj)];
}
var values = [];
if (typeof obj === 'undefined') {
return values;
}
var objKeys;
if (Array.isArray(filter)) {
objKeys = filter;
} else {
var keys = Object.keys(obj);
objKeys = sort ? keys.sort(sort) : keys;
}
for (var i = 0; i < objKeys.length; ++i) {
var key = objKeys[i];
if (skipNulls && obj[key] === null) {
continue;
}
if (Array.isArray(obj)) {
values = values.concat(stringify(obj[key], generateArrayPrefix(prefix, key), generateArrayPrefix, strictNullHandling, skipNulls, encoder, filter, sort, allowDots));
} else {
values = values.concat(stringify(obj[key], prefix + (allowDots ? '.' + key : '[' + key + ']'), generateArrayPrefix, strictNullHandling, skipNulls, encoder, filter, sort, allowDots));
}
}
return values;
};
module.exports = function (object, opts) {
var obj = object;
var options = opts || {};
var delimiter = typeof options.delimiter === 'undefined' ? defaults.delimiter : options.delimiter;
var strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : defaults.strictNullHandling;
var skipNulls = typeof options.skipNulls === 'boolean' ? options.skipNulls : defaults.skipNulls;
var encode = typeof options.encode === 'boolean' ? options.encode : defaults.encode;
var encoder = encode ? (typeof options.encoder === 'function' ? options.encoder : defaults.encoder) : null;
var sort = typeof options.sort === 'function' ? options.sort : null;
var allowDots = typeof options.allowDots === 'undefined' ? false : options.allowDots;
var objKeys;
var filter;
if (options.encoder !== null && options.encoder !== undefined && typeof options.encoder !== 'function') {
throw new TypeError('Encoder has to be a function.');
}
if (typeof options.filter === 'function') {
filter = options.filter;
obj = filter('', obj);
} else if (Array.isArray(options.filter)) {
objKeys = filter = options.filter;
}
var keys = [];
if (typeof obj !== 'object' || obj === null) {
return '';
}
var arrayFormat;
if (options.arrayFormat in arrayPrefixGenerators) {
arrayFormat = options.arrayFormat;
} else if ('indices' in options) {
arrayFormat = options.indices ? 'indices' : 'repeat';
} else {
arrayFormat = 'indices';
}
var generateArrayPrefix = arrayPrefixGenerators[arrayFormat];
if (!objKeys) {
objKeys = Object.keys(obj);
}
if (sort) {
objKeys.sort(sort);
}
for (var i = 0; i < objKeys.length; ++i) {
var key = objKeys[i];
if (skipNulls && obj[key] === null) {
continue;
}
keys = keys.concat(stringify(obj[key], key, generateArrayPrefix, strictNullHandling, skipNulls, encoder, filter, sort, allowDots));
}
return keys.join(delimiter);
};
},{"./utils":133}],133:[function(require,module,exports){
'use strict';
var hexTable = (function () {
var array = new Array(256);
for (var i = 0; i < 256; ++i) {
array[i] = '%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase();
}
return array;
}());
exports.arrayToObject = function (source, options) {
var obj = options.plainObjects ? Object.create(null) : {};
for (var i = 0; i < source.length; ++i) {
if (typeof source[i] !== 'undefined') {
obj[i] = source[i];
}
}
return obj;
};
exports.merge = function (target, source, options) {
if (!source) {
return target;
}
if (typeof source !== 'object') {
if (Array.isArray(target)) {
target.push(source);
} else if (typeof target === 'object') {
target[source] = true;
} else {
return [target, source];
}
return target;
}
if (typeof target !== 'object') {
return [target].concat(source);
}
var mergeTarget = target;
if (Array.isArray(target) && !Array.isArray(source)) {
mergeTarget = exports.arrayToObject(target, options);
}
return Object.keys(source).reduce(function (acc, key) {
var value = source[key];
if (Object.prototype.hasOwnProperty.call(acc, key)) {
acc[key] = exports.merge(acc[key], value, options);
} else {
acc[key] = value;
}
return acc;
}, mergeTarget);
};
exports.decode = function (str) {
try {
return decodeURIComponent(str.replace(/\+/g, ' '));
} catch (e) {
return str;
}
};
exports.encode = function (str) {
// This code was originally written by Brian White (mscdex) for the io.js core querystring library.
// It has been adapted here for stricter adherence to RFC 3986
if (str.length === 0) {
return str;
}
var string = typeof str === 'string' ? str : String(str);
var out = '';
for (var i = 0; i < string.length; ++i) {
var c = string.charCodeAt(i);
if (
c === 0x2D || // -
c === 0x2E || // .
c === 0x5F || // _
c === 0x7E || // ~
(c >= 0x30 && c <= 0x39) || // 0-9
(c >= 0x41 && c <= 0x5A) || // a-z
(c >= 0x61 && c <= 0x7A) // A-Z
) {
out += string.charAt(i);
continue;
}
if (c < 0x80) {
out = out + hexTable[c];
continue;
}
if (c < 0x800) {
out = out + (hexTable[0xC0 | (c >> 6)] + hexTable[0x80 | (c & 0x3F)]);
continue;
}
if (c < 0xD800 || c >= 0xE000) {
out = out + (hexTable[0xE0 | (c >> 12)] + hexTable[0x80 | ((c >> 6) & 0x3F)] + hexTable[0x80 | (c & 0x3F)]);
continue;
}
i += 1;
c = 0x10000 + (((c & 0x3FF) << 10) | (string.charCodeAt(i) & 0x3FF));
out += hexTable[0xF0 | (c >> 18)] + hexTable[0x80 | ((c >> 12) & 0x3F)] + hexTable[0x80 | ((c >> 6) & 0x3F)] + hexTable[0x80 | (c & 0x3F)];
}
return out;
};
exports.compact = function (obj, references) {
if (typeof obj !== 'object' || obj === null) {
return obj;
}
var refs = references || [];
var lookup = refs.indexOf(obj);
if (lookup !== -1) {
return refs[lookup];
}
refs.push(obj);
if (Array.isArray(obj)) {
var compacted = [];
for (var i = 0; i < obj.length; ++i) {
if (obj[i] && typeof obj[i] === 'object') {
compacted.push(exports.compact(obj[i], refs));
} else if (typeof obj[i] !== 'undefined') {
compacted.push(obj[i]);
}
}
return compacted;
}
var keys = Object.keys(obj);
for (var j = 0; j < keys.length; ++j) {
var key = keys[j];
obj[key] = exports.compact(obj[key], refs);
}
return obj;
};
exports.isRegExp = function (obj) {
return Object.prototype.toString.call(obj) === '[object RegExp]';
};
exports.isBuffer = function (obj) {
if (obj === null || typeof obj === 'undefined') {
return false;
}
return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj));
};
},{}],134:[function(require,module,exports){
(function (process){
'use strict';
var _stringify = require('babel-runtime/core-js/json/stringify');
var _stringify2 = _interopRequireDefault(_stringify);
var _promise = require('babel-runtime/core-js/promise');
var _promise2 = _interopRequireDefault(_promise);
var _typeof2 = require('babel-runtime/helpers/typeof');
var _typeof3 = _interopRequireDefault(_typeof2);
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : { default: obj };
}
/* axios v0.9.1 | (c) 2016 by Matt Zabriskie */
(function webpackUniversalModuleDefinition(root, factory) {
if ((typeof exports === 'undefined' ? 'undefined' : (0, _typeof3.default)(exports)) === 'object' && (typeof module === 'undefined' ? 'undefined' : (0, _typeof3.default)(module)) === 'object') module.exports = factory();else if (typeof define === 'function' && define.amd) define([], factory);else if ((typeof exports === 'undefined' ? 'undefined' : (0, _typeof3.default)(exports)) === 'object') exports["axios"] = factory();else root["axios"] = factory();
})(undefined, function () {
return (/******/function (modules) {
// webpackBootstrap
/******/ // The module cache
/******/var installedModules = {};
/******/
/******/ // The require function
/******/function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/if (installedModules[moduleId])
/******/return installedModules[moduleId].exports;
/******/
/******/ // Create a new module (and put it into the cache)
/******/var module = installedModules[moduleId] = {
/******/exports: {},
/******/id: moduleId,
/******/loaded: false
/******/ };
/******/
/******/ // Execute the module function
/******/modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/module.loaded = true;
/******/
/******/ // Return the exports of the module
/******/return module.exports;
/******/
}
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/__webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/__webpack_require__.c = installedModules;
/******/
/******/ // __webpack_public_path__
/******/__webpack_require__.p = "";
/******/
/******/ // Load entry module and return exports
/******/return __webpack_require__(0);
/******/
}(
/************************************************************************/
/******/[
/* 0 */
/***/function (module, exports, __webpack_require__) {
module.exports = __webpack_require__(1);
/***/
},
/* 1 */
/***/function (module, exports, __webpack_require__) {
'use strict';
var defaults = __webpack_require__(2);
var utils = __webpack_require__(3);
var dispatchRequest = __webpack_require__(4);
var InterceptorManager = __webpack_require__(12);
var isAbsoluteURL = __webpack_require__(13);
var combineURLs = __webpack_require__(14);
var bind = __webpack_require__(15);
var transformData = __webpack_require__(8);
function Axios(defaultConfig) {
this.defaults = utils.merge({}, defaultConfig);
this.interceptors = {
request: new InterceptorManager(),
response: new InterceptorManager()
};
}
Axios.prototype.request = function request(config) {
/*eslint no-param-reassign:0*/
// Allow for axios('example/url'[, config]) a la fetch API
if (typeof config === 'string') {
config = utils.merge({
url: arguments[0]
}, arguments[1]);
}
config = utils.merge(defaults, this.defaults, { method: 'get' }, config);
// Support baseURL config
if (config.baseURL && !isAbsoluteURL(config.url)) {
config.url = combineURLs(config.baseURL, config.url);
}
// Don't allow overriding defaults.withCredentials
config.withCredentials = config.withCredentials || this.defaults.withCredentials;
// Transform request data
config.data = transformData(config.data, config.headers, config.transformRequest);
// Flatten headers
config.headers = utils.merge(config.headers.common || {}, config.headers[config.method] || {}, config.headers || {});
utils.forEach(['delete', 'get', 'head', 'post', 'put', 'patch', 'common'], function cleanHeaderConfig(method) {
delete config.headers[method];
});
// Hook up interceptors middleware
var chain = [dispatchRequest, undefined];
var promise = _promise2.default.resolve(config);
this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {
chain.unshift(interceptor.fulfilled, interceptor.rejected);
});
this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {
chain.push(interceptor.fulfilled, interceptor.rejected);
});
while (chain.length) {
promise = promise.then(chain.shift(), chain.shift());
}
return promise;
};
var defaultInstance = new Axios(defaults);
var axios = module.exports = bind(Axios.prototype.request, defaultInstance);
axios.create = function create(defaultConfig) {
return new Axios(defaultConfig);
};
// Expose defaults
axios.defaults = defaultInstance.defaults;
// Expose all/spread
axios.all = function all(promises) {
return _promise2.default.all(promises);
};
axios.spread = __webpack_require__(16);
// Expose interceptors
axios.interceptors = defaultInstance.interceptors;
// Provide aliases for supported request methods
utils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) {
/*eslint func-names:0*/
Axios.prototype[method] = function (url, config) {
return this.request(utils.merge(config || {}, {
method: method,
url: url
}));
};
axios[method] = bind(Axios.prototype[method], defaultInstance);
});
utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {
/*eslint func-names:0*/
Axios.prototype[method] = function (url, data, config) {
return this.request(utils.merge(config || {}, {
method: method,
url: url,
data: data
}));
};
axios[method] = bind(Axios.prototype[method], defaultInstance);
});
/***/
},
/* 2 */
/***/function (module, exports, __webpack_require__) {
'use strict';
var utils = __webpack_require__(3);
var PROTECTION_PREFIX = /^\)\]\}',?\n/;
var DEFAULT_CONTENT_TYPE = {
'Content-Type': 'application/x-www-form-urlencoded'
};
module.exports = {
transformRequest: [function transformResponseJSON(data, headers) {
if (utils.isFormData(data)) {
return data;
}
if (utils.isArrayBuffer(data)) {
return data;
}
if (utils.isArrayBufferView(data)) {
return data.buffer;
}
if (utils.isObject(data) && !utils.isFile(data) && !utils.isBlob(data)) {
// Set application/json if no Content-Type has been specified
if (!utils.isUndefined(headers)) {
utils.forEach(headers, function processContentTypeHeader(val, key) {
if (key.toLowerCase() === 'content-type') {
headers['Content-Type'] = val;
}
});
if (utils.isUndefined(headers['Content-Type'])) {
headers['Content-Type'] = 'application/json;charset=utf-8';
}
}
return (0, _stringify2.default)(data);
}
return data;
}],
transformResponse: [function transformResponseJSON(data) {
/*eslint no-param-reassign:0*/
if (typeof data === 'string') {
data = data.replace(PROTECTION_PREFIX, '');
try {
data = JSON.parse(data);
} catch (e) {/* Ignore */}
}
return data;
}],
headers: {
common: {
'Accept': 'application/json, text/plain, */*'
},
patch: utils.merge(DEFAULT_CONTENT_TYPE),
post: utils.merge(DEFAULT_CONTENT_TYPE),
put: utils.merge(DEFAULT_CONTENT_TYPE)
},
timeout: 0,
xsrfCookieName: 'XSRF-TOKEN',
xsrfHeaderName: 'X-XSRF-TOKEN'
};
/***/
},
/* 3 */
/***/function (module, exports) {
'use strict';
/*global toString:true*/
// utils is a library of generic helper functions non-specific to axios
var toString = Object.prototype.toString;
/**
* Determine if a value is an Array
*
* @param {Object} val The value to test
* @returns {boolean} True if value is an Array, otherwise false
*/
function isArray(val) {
return toString.call(val) === '[object Array]';
}
/**
* Determine if a value is an ArrayBuffer
*
* @param {Object} val The value to test
* @returns {boolean} True if value is an ArrayBuffer, otherwise false
*/
function isArrayBuffer(val) {
return toString.call(val) === '[object ArrayBuffer]';
}
/**
* Determine if a value is a FormData
*
* @param {Object} val The value to test
* @returns {boolean} True if value is an FormData, otherwise false
*/
function isFormData(val) {
return toString.call(val) === '[object FormData]';
}
/**
* Determine if a value is a view on an ArrayBuffer
*
* @param {Object} val The value to test
* @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false
*/
function isArrayBufferView(val) {
var result;
if (typeof ArrayBuffer !== 'undefined' && ArrayBuffer.isView) {
result = ArrayBuffer.isView(val);
} else {
result = val && val.buffer && val.buffer instanceof ArrayBuffer;
}
return result;
}
/**
* Determine if a value is a String
*
* @param {Object} val The value to test
* @returns {boolean} True if value is a String, otherwise false
*/
function isString(val) {
return typeof val === 'string';
}
/**
* Determine if a value is a Number
*
* @param {Object} val The value to test
* @returns {boolean} True if value is a Number, otherwise false
*/
function isNumber(val) {
return typeof val === 'number';
}
/**
* Determine if a value is undefined
*
* @param {Object} val The value to test
* @returns {boolean} True if the value is undefined, otherwise false
*/
function isUndefined(val) {
return typeof val === 'undefined';
}
/**
* Determine if a value is an Object
*
* @param {Object} val The value to test
* @returns {boolean} True if value is an Object, otherwise false
*/
function isObject(val) {
return val !== null && (typeof val === 'undefined' ? 'undefined' : (0, _typeof3.default)(val)) === 'object';
}
/**
* Determine if a value is a Date
*
* @param {Object} val The value to test
* @returns {boolean} True if value is a Date, otherwise false
*/
function isDate(val) {
return toString.call(val) === '[object Date]';
}
/**
* Determine if a value is a File
*
* @param {Object} val The value to test
* @returns {boolean} True if value is a File, otherwise false
*/
function isFile(val) {
return toString.call(val) === '[object File]';
}
/**
* Determine if a value is a Blob
*
* @param {Object} val The value to test
* @returns {boolean} True if value is a Blob, otherwise false
*/
function isBlob(val) {
return toString.call(val) === '[object Blob]';
}
/**
* Trim excess whitespace off the beginning and end of a string
*
* @param {String} str The String to trim
* @returns {String} The String freed of excess whitespace
*/
function trim(str) {
return str.replace(/^\s*/, '').replace(/\s*$/, '');
}
/**
* Determine if we're running in a standard browser environment
*
* This allows axios to run in a web worker, and react-native.
* Both environments support XMLHttpRequest, but not fully standard globals.
*
* web workers:
* typeof window -> undefined
* typeof document -> undefined
*
* react-native:
* typeof document.createElement -> undefined
*/
function isStandardBrowserEnv() {
return typeof window !== 'undefined' && typeof document !== 'undefined' && typeof document.createElement === 'function';
}
/**
* Iterate over an Array or an Object invoking a function for each item.
*
* If `obj` is an Array callback will be called passing
* the value, index, and complete array for each item.
*
* If 'obj' is an Object callback will be called passing
* the value, key, and complete object for each property.
*
* @param {Object|Array} obj The object to iterate
* @param {Function} fn The callback to invoke for each item
*/
function forEach(obj, fn) {
// Don't bother if no value provided
if (obj === null || typeof obj === 'undefined') {
return;
}
// Force an array if not already something iterable
if ((typeof obj === 'undefined' ? 'undefined' : (0, _typeof3.default)(obj)) !== 'object' && !isArray(obj)) {
/*eslint no-param-reassign:0*/
obj = [obj];
}
if (isArray(obj)) {
// Iterate over array values
for (var i = 0, l = obj.length; i < l; i++) {
fn.call(null, obj[i], i, obj);
}
} else {
// Iterate over object keys
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
fn.call(null, obj[key], key, obj);
}
}
}
}
/**
* Accepts varargs expecting each argument to be an object, then
* immutably merges the properties of each object and returns result.
*
* When multiple objects contain the same key the later object in
* the arguments list will take precedence.
*
* Example:
*
* ```js
* var result = merge({foo: 123}, {foo: 456});
* console.log(result.foo); // outputs 456
* ```
*
* @param {Object} obj1 Object to merge
* @returns {Object} Result of all merge properties
*/
function merge() /* obj1, obj2, obj3, ... */{
var result = {};
function assignValue(val, key) {
if ((0, _typeof3.default)(result[key]) === 'object' && (typeof val === 'undefined' ? 'undefined' : (0, _typeof3.default)(val)) === 'object') {
result[key] = merge(result[key], val);
} else {
result[key] = val;
}
}
for (var i = 0, l = arguments.length; i < l; i++) {
forEach(arguments[i], assignValue);
}
return result;
}
module.exports = {
isArray: isArray,
isArrayBuffer: isArrayBuffer,
isFormData: isFormData,
isArrayBufferView: isArrayBufferView,
isString: isString,
isNumber: isNumber,
isObject: isObject,
isUndefined: isUndefined,
isDate: isDate,
isFile: isFile,
isBlob: isBlob,
isStandardBrowserEnv: isStandardBrowserEnv,
forEach: forEach,
merge: merge,
trim: trim
};
/***/
},
/* 4 */
/***/function (module, exports, __webpack_require__) {
'use strict';
/**
* Dispatch a request to the server using whichever adapter
* is supported by the current environment.
*
* @param {object} config The config that is to be used for the request
* @returns {Promise} The Promise to be fulfilled
*/
module.exports = function dispatchRequest(config) {
return new _promise2.default(function executor(resolve, reject) {
try {
var adapter;
if (typeof config.adapter === 'function') {
// For custom adapter support
adapter = config.adapter;
} else if (typeof XMLHttpRequest !== 'undefined') {
// For browsers use XHR adapter
adapter = __webpack_require__(5);
} else if (typeof process !== 'undefined') {
// For node use HTTP adapter
adapter = __webpack_require__(5);
}
if (typeof adapter === 'function') {
adapter(resolve, reject, config);
}
} catch (e) {
reject(e);
}
});
};
/***/
},
/* 5 */
/***/function (module, exports, __webpack_require__) {
'use strict';
var utils = __webpack_require__(3);
var buildURL = __webpack_require__(6);
var parseHeaders = __webpack_require__(7);
var transformData = __webpack_require__(8);
var isURLSameOrigin = __webpack_require__(9);
var btoa = window.btoa || __webpack_require__(10);
module.exports = function xhrAdapter(resolve, reject, config) {
var requestData = config.data;
var requestHeaders = config.headers;
if (utils.isFormData(requestData)) {
delete requestHeaders['Content-Type']; // Let the browser set it
}
var request = new XMLHttpRequest();
// For IE 8/9 CORS support
// Only supports POST and GET calls and doesn't returns the response headers.
if (window.XDomainRequest && !('withCredentials' in request) && !isURLSameOrigin(config.url)) {
request = new window.XDomainRequest();
}
// HTTP basic authentication
if (config.auth) {
var username = config.auth.username || '';
var password = config.auth.password || '';
requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password);
}
request.open(config.method.toUpperCase(), buildURL(config.url, config.params, config.paramsSerializer), true);
// Set the request timeout in MS
request.timeout = config.timeout;
// Listen for ready state
request.onload = function handleLoad() {
if (!request) {
return;
}
// Prepare the response
var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null;
var responseData = ['text', ''].indexOf(config.responseType || '') !== -1 ? request.responseText : request.response;
var response = {
data: transformData(responseData, responseHeaders, config.transformResponse),
// IE sends 1223 instead of 204 (https://github.com/mzabriskie/axios/issues/201)
status: request.status === 1223 ? 204 : request.status,
statusText: request.status === 1223 ? 'No Content' : request.statusText,
headers: responseHeaders,
config: config
};
// Resolve or reject the Promise based on the status
(response.status >= 200 && response.status < 300 || !('status' in request) && response.responseText ? resolve : reject)(response);
// Clean up request
request = null;
};
// Handle low level network errors
request.onerror = function handleError() {
// Real errors are hidden from us by the browser
// onerror should only fire if it's a network error
reject(new Error('Network Error'));
// Clean up request
request = null;
};
// Add xsrf header
// This is only done if running in a standard browser environment.
// Specifically not if we're in a web worker, or react-native.
if (utils.isStandardBrowserEnv()) {
var cookies = __webpack_require__(11);
// Add xsrf header
var xsrfValue = config.withCredentials || isURLSameOrigin(config.url) ? cookies.read(config.xsrfCookieName) : undefined;
if (xsrfValue) {
requestHeaders[config.xsrfHeaderName] = xsrfValue;
}
}
// Add headers to the request
if ('setRequestHeader' in request) {
utils.forEach(requestHeaders, function setRequestHeader(val, key) {
if (typeof requestData === 'undefined' && key.toLowerCase() === 'content-type') {
// Remove Content-Type if data is undefined
delete requestHeaders[key];
} else {
// Otherwise add header to the request
request.setRequestHeader(key, val);
}
});
}
// Add withCredentials to request if needed
if (config.withCredentials) {
request.withCredentials = true;
}
// Add responseType to request if needed
if (config.responseType) {
try {
request.responseType = config.responseType;
} catch (e) {
if (request.responseType !== 'json') {
throw e;
}
}
}
if (utils.isArrayBuffer(requestData)) {
requestData = new DataView(requestData);
}
// Send the request
request.send(requestData);
};
/***/
},
/* 6 */
/***/function (module, exports, __webpack_require__) {
'use strict';
var utils = __webpack_require__(3);
function encode(val) {
return encodeURIComponent(val).replace(/%40/gi, '@').replace(/%3A/gi, ':').replace(/%24/g, '$').replace(/%2C/gi, ',').replace(/%20/g, '+').replace(/%5B/gi, '[').replace(/%5D/gi, ']');
}
/**
* Build a URL by appending params to the end
*
* @param {string} url The base of the url (e.g., http://www.google.com)
* @param {object} [params] The params to be appended
* @returns {string} The formatted url
*/
module.exports = function buildURL(url, params, paramsSerializer) {
/*eslint no-param-reassign:0*/
if (!params) {
return url;
}
var serializedParams;
if (paramsSerializer) {
serializedParams = paramsSerializer(params);
} else {
var parts = [];
utils.forEach(params, function serialize(val, key) {
if (val === null || typeof val === 'undefined') {
return;
}
if (utils.isArray(val)) {
key = key + '[]';
}
if (!utils.isArray(val)) {
val = [val];
}
utils.forEach(val, function parseValue(v) {
if (utils.isDate(v)) {
v = v.toISOString();
} else if (utils.isObject(v)) {
v = (0, _stringify2.default)(v);
}
parts.push(encode(key) + '=' + encode(v));
});
});
serializedParams = parts.join('&');
}
if (serializedParams) {
url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;
}
return url;
};
/***/
},
/* 7 */
/***/function (module, exports, __webpack_require__) {
'use strict';
var utils = __webpack_require__(3);
/**
* Parse headers into an object
*
* ```
* Date: Wed, 27 Aug 2014 08:58:49 GMT
* Content-Type: application/json
* Connection: keep-alive
* Transfer-Encoding: chunked
* ```
*
* @param {String} headers Headers needing to be parsed
* @returns {Object} Headers parsed into an object
*/
module.exports = function parseHeaders(headers) {
var parsed = {};
var key;
var val;
var i;
if (!headers) {
return parsed;
}
utils.forEach(headers.split('\n'), function parser(line) {
i = line.indexOf(':');
key = utils.trim(line.substr(0, i)).toLowerCase();
val = utils.trim(line.substr(i + 1));
if (key) {
parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;
}
});
return parsed;
};
/***/
},
/* 8 */
/***/function (module, exports, __webpack_require__) {
'use strict';
var utils = __webpack_require__(3);
/**
* Transform the data for a request or a response
*
* @param {Object|String} data The data to be transformed
* @param {Array} headers The headers for the request or response
* @param {Array|Function} fns A single function or Array of functions
* @returns {*} The resulting transformed data
*/
module.exports = function transformData(data, headers, fns) {
/*eslint no-param-reassign:0*/
utils.forEach(fns, function transform(fn) {
data = fn(data, headers);
});
return data;
};
/***/
},
/* 9 */
/***/function (module, exports, __webpack_require__) {
'use strict';
var utils = __webpack_require__(3);
module.exports = utils.isStandardBrowserEnv() ?
// Standard browser envs have full support of the APIs needed to test
// whether the request URL is of the same origin as current location.
function standardBrowserEnv() {
var msie = /(msie|trident)/i.test(navigator.userAgent);
var urlParsingNode = document.createElement('a');
var originURL;
/**
* Parse a URL to discover it's components
*
* @param {String} url The URL to be parsed
* @returns {Object}
*/
function resolveURL(url) {
var href = url;
if (msie) {
// IE needs attribute set twice to normalize properties
urlParsingNode.setAttribute('href', href);
href = urlParsingNode.href;
}
urlParsingNode.setAttribute('href', href);
// urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils
return {
href: urlParsingNode.href,
protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',
host: urlParsingNode.host,
search: urlParsingNode.search ? urlParsingNode.search.replace(/^\?/, '') : '',
hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',
hostname: urlParsingNode.hostname,
port: urlParsingNode.port,
pathname: urlParsingNode.pathname.charAt(0) === '/' ? urlParsingNode.pathname : '/' + urlParsingNode.pathname
};
}
originURL = resolveURL(window.location.href);
/**
* Determine if a URL shares the same origin as the current location
*
* @param {String} requestURL The URL to test
* @returns {boolean} True if URL shares the same origin, otherwise false
*/
return function isURLSameOrigin(requestURL) {
var parsed = utils.isString(requestURL) ? resolveURL(requestURL) : requestURL;
return parsed.protocol === originURL.protocol && parsed.host === originURL.host;
};
}() :
// Non standard browser envs (web workers, react-native) lack needed support.
function nonStandardBrowserEnv() {
return function isURLSameOrigin() {
return true;
};
}();
/***/
},
/* 10 */
/***/function (module, exports) {
'use strict';
// btoa polyfill for IE<10 courtesy https://github.com/davidchambers/Base64.js
var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
function InvalidCharacterError(message) {
this.message = message;
}
InvalidCharacterError.prototype = new Error();
InvalidCharacterError.prototype.code = 5;
InvalidCharacterError.prototype.name = 'InvalidCharacterError';
function btoa(input) {
var str = String(input);
var output = '';
for (
// initialize result and counter
var block, charCode, idx = 0, map = chars;
// if the next str index does not exist:
// change the mapping table to "="
// check if d has no fractional digits
str.charAt(idx | 0) || (map = '=', idx % 1);
// "8 - idx % 1 * 8" generates the sequence 2, 4, 6, 8
output += map.charAt(63 & block >> 8 - idx % 1 * 8)) {
charCode = str.charCodeAt(idx += 3 / 4);
if (charCode > 0xFF) {
throw new InvalidCharacterError('INVALID_CHARACTER_ERR: DOM Exception 5');
}
block = block << 8 | charCode;
}
return output;
}
module.exports = btoa;
/***/
},
/* 11 */
/***/function (module, exports, __webpack_require__) {
'use strict';
var utils = __webpack_require__(3);
module.exports = utils.isStandardBrowserEnv() ?
// Standard browser envs support document.cookie
function standardBrowserEnv() {
return {
write: function write(name, value, expires, path, domain, secure) {
var cookie = [];
cookie.push(name + '=' + encodeURIComponent(value));
if (utils.isNumber(expires)) {
cookie.push('expires=' + new Date(expires).toGMTString());
}
if (utils.isString(path)) {
cookie.push('path=' + path);
}
if (utils.isString(domain)) {
cookie.push('domain=' + domain);
}
if (secure === true) {
cookie.push('secure');
}
document.cookie = cookie.join('; ');
},
read: function read(name) {
var match = document.cookie.match(new RegExp('(^|;\\s*)(' + name + ')=([^;]*)'));
return match ? decodeURIComponent(match[3]) : null;
},
remove: function remove(name) {
this.write(name, '', Date.now() - 86400000);
}
};
}() :
// Non standard browser env (web workers, react-native) lack needed support.
function nonStandardBrowserEnv() {
return {
write: function write() {},
read: function read() {
return null;
},
remove: function remove() {}
};
}();
/***/
},
/* 12 */
/***/function (module, exports, __webpack_require__) {
'use strict';
var utils = __webpack_require__(3);
function InterceptorManager() {
this.handlers = [];
}
/**
* Add a new interceptor to the stack
*
* @param {Function} fulfilled The function to handle `then` for a `Promise`
* @param {Function} rejected The function to handle `reject` for a `Promise`
*
* @return {Number} An ID used to remove interceptor later
*/
InterceptorManager.prototype.use = function use(fulfilled, rejected) {
this.handlers.push({
fulfilled: fulfilled,
rejected: rejected
});
return this.handlers.length - 1;
};
/**
* Remove an interceptor from the stack
*
* @param {Number} id The ID that was returned by `use`
*/
InterceptorManager.prototype.eject = function eject(id) {
if (this.handlers[id]) {
this.handlers[id] = null;
}
};
/**
* Iterate over all the registered interceptors
*
* This method is particularly useful for skipping over any
* interceptors that may have become `null` calling `eject`.
*
* @param {Function} fn The function to call for each interceptor
*/
InterceptorManager.prototype.forEach = function forEach(fn) {
utils.forEach(this.handlers, function forEachHandler(h) {
if (h !== null) {
fn(h);
}
});
};
module.exports = InterceptorManager;
/***/
},
/* 13 */
/***/function (module, exports) {
'use strict';
/**
* Determines whether the specified URL is absolute
*
* @param {string} url The URL to test
* @returns {boolean} True if the specified URL is absolute, otherwise false
*/
module.exports = function isAbsoluteURL(url) {
// A URL is considered absolute if it begins with "<scheme>://" or "//" (protocol-relative URL).
// RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed
// by any combination of letters, digits, plus, period, or hyphen.
return (/^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(url)
);
};
/***/
},
/* 14 */
/***/function (module, exports) {
'use strict';
/**
* Creates a new URL by combining the specified URLs
*
* @param {string} baseURL The base URL
* @param {string} relativeURL The relative URL
* @returns {string} The combined URL
*/
module.exports = function combineURLs(baseURL, relativeURL) {
return baseURL.replace(/\/+$/, '') + '/' + relativeURL.replace(/^\/+/, '');
};
/***/
},
/* 15 */
/***/function (module, exports) {
'use strict';
module.exports = function bind(fn, thisArg) {
return function wrap() {
var args = new Array(arguments.length);
for (var i = 0; i < args.length; i++) {
args[i] = arguments[i];
}
return fn.apply(thisArg, args);
};
};
/***/
},
/* 16 */
/***/function (module, exports) {
'use strict';
/**
* Syntactic sugar for invoking a function and expanding an array for arguments.
*
* Common use case would be to use `Function.prototype.apply`.
*
* ```js
* function f(x, y, z) {}
* var args = [1, 2, 3];
* f.apply(null, args);
* ```
*
* With `spread` this example can be re-written.
*
* ```js
* spread(function(x, y, z) {})([1, 2, 3]);
* ```
*
* @param {Function} callback
* @returns {Function}
*/
module.exports = function spread(callback) {
return function wrap(arr) {
return callback.apply(null, arr);
};
};
/***/
}
/******/])
);
});
;
}).call(this,require('_process'))
//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9jb250ZW50ZnVsLXNkay1jb3JlL3ZlbmRvci1icm93c2VyL2F4aW9zLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3N0cmluZ2lmeSA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9qc29uL3N0cmluZ2lmeScpO1xuXG52YXIgX3N0cmluZ2lmeTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9zdHJpbmdpZnkpO1xuXG52YXIgX3Byb21pc2UgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2NvcmUtanMvcHJvbWlzZScpO1xuXG52YXIgX3Byb21pc2UyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvbWlzZSk7XG5cbnZhciBfdHlwZW9mMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy90eXBlb2YnKTtcblxudmFyIF90eXBlb2YzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdHlwZW9mMik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7XG5cdHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9O1xufVxuXG4vKiBheGlvcyB2MC45LjEgfCAoYykgMjAxNiBieSBNYXR0IFphYnJpc2tpZSAqL1xuKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYgKCh0eXBlb2YgZXhwb3J0cyA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6ICgwLCBfdHlwZW9mMy5kZWZhdWx0KShleHBvcnRzKSkgPT09ICdvYmplY3QnICYmICh0eXBlb2YgbW9kdWxlID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogKDAsIF90eXBlb2YzLmRlZmF1bHQpKG1vZHVsZSkpID09PSAnb2JqZWN0JykgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7ZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSBkZWZpbmUoW10sIGZhY3RvcnkpO2Vsc2UgaWYgKCh0eXBlb2YgZXhwb3J0cyA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6ICgwLCBfdHlwZW9mMy5kZWZhdWx0KShleHBvcnRzKSkgPT09ICdvYmplY3QnKSBleHBvcnRzW1wiYXhpb3NcIl0gPSBmYWN0b3J5KCk7ZWxzZSByb290W1wiYXhpb3NcIl0gPSBmYWN0b3J5KCk7XG59KSh1bmRlZmluZWQsIGZ1bmN0aW9uICgpIHtcblx0cmV0dXJuICgvKioqKioqL2Z1bmN0aW9uIChtb2R1bGVzKSB7XG5cdFx0XHQvLyB3ZWJwYWNrQm9vdHN0cmFwXG5cdFx0XHQvKioqKioqLyAvLyBUaGUgbW9kdWxlIGNhY2hlXG5cdFx0XHQvKioqKioqL3ZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cdFx0XHQvKioqKioqL1xuXHRcdFx0LyoqKioqKi8gLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cblx0XHRcdC8qKioqKiovZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHRcdFx0XHQvKioqKioqL1xuXHRcdFx0XHQvKioqKioqLyAvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0XHRcdFx0LyoqKioqKi9pZiAoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pXG5cdFx0XHRcdFx0LyoqKioqKi9yZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcblx0XHRcdFx0LyoqKioqKi9cblx0XHRcdFx0LyoqKioqKi8gLy8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0XHRcdFx0LyoqKioqKi92YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG5cdFx0XHRcdFx0LyoqKioqKi9leHBvcnRzOiB7fSxcblx0XHRcdFx0XHQvKioqKioqL2lkOiBtb2R1bGVJZCxcblx0XHRcdFx0XHQvKioqKioqL2xvYWRlZDogZmFsc2Vcblx0XHRcdFx0XHQvKioqKioqLyB9O1xuXHRcdFx0XHQvKioqKioqL1xuXHRcdFx0XHQvKioqKioqLyAvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0XHRcdFx0LyoqKioqKi9tb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblx0XHRcdFx0LyoqKioqKi9cblx0XHRcdFx0LyoqKioqKi8gLy8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuXHRcdFx0XHQvKioqKioqL21vZHVsZS5sb2FkZWQgPSB0cnVlO1xuXHRcdFx0XHQvKioqKioqL1xuXHRcdFx0XHQvKioqKioqLyAvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRcdFx0XHQvKioqKioqL3JldHVybiBtb2R1bGUuZXhwb3J0cztcblx0XHRcdFx0LyoqKioqKi9cblx0XHRcdH1cblx0XHRcdC8qKioqKiovXG5cdFx0XHQvKioqKioqL1xuXHRcdFx0LyoqKioqKi8gLy8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcblx0XHRcdC8qKioqKiovX193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblx0XHRcdC8qKioqKiovXG5cdFx0XHQvKioqKioqLyAvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuXHRcdFx0LyoqKioqKi9fX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXHRcdFx0LyoqKioqKi9cblx0XHRcdC8qKioqKiovIC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG5cdFx0XHQvKioqKioqL19fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cdFx0XHQvKioqKioqL1xuXHRcdFx0LyoqKioqKi8gLy8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG5cdFx0XHQvKioqKioqL3JldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuXHRcdFx0LyoqKioqKi9cblx0XHR9KFxuXHRcdC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cdFx0LyoqKioqKi9bXG5cdFx0LyogMCAqL1xuXHRcdC8qKiovZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdFx0XHRtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG5cblx0XHRcdC8qKiovXG5cdFx0fSxcblx0XHQvKiAxICovXG5cdFx0LyoqKi9mdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0XHRcdCd1c2Ugc3RyaWN0JztcblxuXHRcdFx0dmFyIGRlZmF1bHRzID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcblx0XHRcdHZhciB1dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oMyk7XG5cdFx0XHR2YXIgZGlzcGF0Y2hSZXF1ZXN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTtcblx0XHRcdHZhciBJbnRlcmNlcHRvck1hbmFnZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyKTtcblx0XHRcdHZhciBpc0Fic29sdXRlVVJMID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMyk7XG5cdFx0XHR2YXIgY29tYmluZVVSTHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE0KTtcblx0XHRcdHZhciBiaW5kID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNSk7XG5cdFx0XHR2YXIgdHJhbnNmb3JtRGF0YSA9IF9fd2VicGFja19yZXF1aXJlX18oOCk7XG5cblx0XHRcdGZ1bmN0aW9uIEF4aW9zKGRlZmF1bHRDb25maWcpIHtcblx0XHRcdFx0dGhpcy5kZWZhdWx0cyA9IHV0aWxzLm1lcmdlKHt9LCBkZWZhdWx0Q29uZmlnKTtcblx0XHRcdFx0dGhpcy5pbnRlcmNlcHRvcnMgPSB7XG5cdFx0XHRcdFx0cmVxdWVzdDogbmV3IEludGVyY2VwdG9yTWFuYWdlcigpLFxuXHRcdFx0XHRcdHJlc3BvbnNlOiBuZXcgSW50ZXJjZXB0b3JNYW5hZ2VyKClcblx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0QXhpb3MucHJvdG90eXBlLnJlcXVlc3QgPSBmdW5jdGlvbiByZXF1ZXN0KGNvbmZpZykge1xuXHRcdFx0XHQvKmVzbGludCBuby1wYXJhbS1yZWFzc2lnbjowKi9cblx0XHRcdFx0Ly8gQWxsb3cgZm9yIGF4aW9zKCdleGFtcGxlL3VybCdbLCBjb25maWddKSBhIGxhIGZldGNoIEFQSVxuXHRcdFx0XHRpZiAodHlwZW9mIGNvbmZpZyA9PT0gJ3N0cmluZycpIHtcblx0XHRcdFx0XHRjb25maWcgPSB1dGlscy5tZXJnZSh7XG5cdFx0XHRcdFx0XHR1cmw6IGFyZ3VtZW50c1swXVxuXHRcdFx0XHRcdH0sIGFyZ3VtZW50c1sxXSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25maWcgPSB1dGlscy5tZXJnZShkZWZhdWx0cywgdGhpcy5kZWZhdWx0cywgeyBtZXRob2Q6ICdnZXQnIH0sIGNvbmZpZyk7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydCBiYXNlVVJMIGNvbmZpZ1xuXHRcdFx0XHRpZiAoY29uZmlnLmJhc2VVUkwgJiYgIWlzQWJzb2x1dGVVUkwoY29uZmlnLnVybCkpIHtcblx0XHRcdFx0XHRjb25maWcudXJsID0gY29tYmluZVVSTHMoY29uZmlnLmJhc2VVUkwsIGNvbmZpZy51cmwpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gRG9uJ3QgYWxsb3cgb3ZlcnJpZGluZyBkZWZhdWx0cy53aXRoQ3JlZGVudGlhbHNcblx0XHRcdFx0Y29uZmlnLndpdGhDcmVkZW50aWFscyA9IGNvbmZpZy53aXRoQ3JlZGVudGlhbHMgfHwgdGhpcy5kZWZhdWx0cy53aXRoQ3JlZGVudGlhbHM7XG5cblx0XHRcdFx0Ly8gVHJhbnNmb3JtIHJlcXVlc3QgZGF0YVxuXHRcdFx0XHRjb25maWcuZGF0YSA9IHRyYW5zZm9ybURhdGEoY29uZmlnLmRhdGEsIGNvbmZpZy5oZWFkZXJzLCBjb25maWcudHJhbnNmb3JtUmVxdWVzdCk7XG5cblx0XHRcdFx0Ly8gRmxhdHRlbiBoZWFkZXJzXG5cdFx0XHRcdGNvbmZpZy5oZWFkZXJzID0gdXRpbHMubWVyZ2UoY29uZmlnLmhlYWRlcnMuY29tbW9uIHx8IHt9LCBjb25maWcuaGVhZGVyc1tjb25maWcubWV0aG9kXSB8fCB7fSwgY29uZmlnLmhlYWRlcnMgfHwge30pO1xuXG5cdFx0XHRcdHV0aWxzLmZvckVhY2goWydkZWxldGUnLCAnZ2V0JywgJ2hlYWQnLCAncG9zdCcsICdwdXQnLCAncGF0Y2gnLCAnY29tbW9uJ10sIGZ1bmN0aW9uIGNsZWFuSGVhZGVyQ29uZmlnKG1ldGhvZCkge1xuXHRcdFx0XHRcdGRlbGV0ZSBjb25maWcuaGVhZGVyc1ttZXRob2RdO1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHQvLyBIb29rIHVwIGludGVyY2VwdG9ycyBtaWRkbGV3YXJlXG5cdFx0XHRcdHZhciBjaGFpbiA9IFtkaXNwYXRjaFJlcXVlc3QsIHVuZGVmaW5lZF07XG5cdFx0XHRcdHZhciBwcm9taXNlID0gX3Byb21pc2UyLmRlZmF1bHQucmVzb2x2ZShjb25maWcpO1xuXG5cdFx0XHRcdHRoaXMuaW50ZXJjZXB0b3JzLnJlcXVlc3QuZm9yRWFjaChmdW5jdGlvbiB1bnNoaWZ0UmVxdWVzdEludGVyY2VwdG9ycyhpbnRlcmNlcHRvcikge1xuXHRcdFx0XHRcdGNoYWluLnVuc2hpZnQoaW50ZXJjZXB0b3IuZnVsZmlsbGVkLCBpbnRlcmNlcHRvci5yZWplY3RlZCk7XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdHRoaXMuaW50ZXJjZXB0b3JzLnJlc3BvbnNlLmZvckVhY2goZnVuY3Rpb24gcHVzaFJlc3BvbnNlSW50ZXJjZXB0b3JzKGludGVyY2VwdG9yKSB7XG5cdFx0XHRcdFx0Y2hhaW4ucHVzaChpbnRlcmNlcHRvci5mdWxmaWxsZWQsIGludGVyY2VwdG9yLnJlamVjdGVkKTtcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0d2hpbGUgKGNoYWluLmxlbmd0aCkge1xuXHRcdFx0XHRcdHByb21pc2UgPSBwcm9taXNlLnRoZW4oY2hhaW4uc2hpZnQoKSwgY2hhaW4uc2hpZnQoKSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gcHJvbWlzZTtcblx0XHRcdH07XG5cblx0XHRcdHZhciBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgQXhpb3MoZGVmYXVsdHMpO1xuXHRcdFx0dmFyIGF4aW9zID0gbW9kdWxlLmV4cG9ydHMgPSBiaW5kKEF4aW9zLnByb3RvdHlwZS5yZXF1ZXN0LCBkZWZhdWx0SW5zdGFuY2UpO1xuXG5cdFx0XHRheGlvcy5jcmVhdGUgPSBmdW5jdGlvbiBjcmVhdGUoZGVmYXVsdENvbmZpZykge1xuXHRcdFx0XHRyZXR1cm4gbmV3IEF4aW9zKGRlZmF1bHRDb25maWcpO1xuXHRcdFx0fTtcblxuXHRcdFx0Ly8gRXhwb3NlIGRlZmF1bHRzXG5cdFx0XHRheGlvcy5kZWZhdWx0cyA9IGRlZmF1bHRJbnN0YW5jZS5kZWZhdWx0cztcblxuXHRcdFx0Ly8gRXhwb3NlIGFsbC9zcHJlYWRcblx0XHRcdGF4aW9zLmFsbCA9IGZ1bmN0aW9uIGFsbChwcm9taXNlcykge1xuXHRcdFx0XHRyZXR1cm4gX3Byb21pc2UyLmRlZmF1bHQuYWxsKHByb21pc2VzKTtcblx0XHRcdH07XG5cdFx0XHRheGlvcy5zcHJlYWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2KTtcblxuXHRcdFx0Ly8gRXhwb3NlIGludGVyY2VwdG9yc1xuXHRcdFx0YXhpb3MuaW50ZXJjZXB0b3JzID0gZGVmYXVsdEluc3RhbmNlLmludGVyY2VwdG9ycztcblxuXHRcdFx0Ly8gUHJvdmlkZSBhbGlhc2VzIGZvciBzdXBwb3J0ZWQgcmVxdWVzdCBtZXRob2RzXG5cdFx0XHR1dGlscy5mb3JFYWNoKFsnZGVsZXRlJywgJ2dldCcsICdoZWFkJ10sIGZ1bmN0aW9uIGZvckVhY2hNZXRob2ROb0RhdGEobWV0aG9kKSB7XG5cdFx0XHRcdC8qZXNsaW50IGZ1bmMtbmFtZXM6MCovXG5cdFx0XHRcdEF4aW9zLnByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24gKHVybCwgY29uZmlnKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMucmVxdWVzdCh1dGlscy5tZXJnZShjb25maWcgfHwge30sIHtcblx0XHRcdFx0XHRcdG1ldGhvZDogbWV0aG9kLFxuXHRcdFx0XHRcdFx0dXJsOiB1cmxcblx0XHRcdFx0XHR9KSk7XG5cdFx0XHRcdH07XG5cdFx0XHRcdGF4aW9zW21ldGhvZF0gPSBiaW5kKEF4aW9zLnByb3RvdHlwZVttZXRob2RdLCBkZWZhdWx0SW5zdGFuY2UpO1xuXHRcdFx0fSk7XG5cblx0XHRcdHV0aWxzLmZvckVhY2goWydwb3N0JywgJ3B1dCcsICdwYXRjaCddLCBmdW5jdGlvbiBmb3JFYWNoTWV0aG9kV2l0aERhdGEobWV0aG9kKSB7XG5cdFx0XHRcdC8qZXNsaW50IGZ1bmMtbmFtZXM6MCovXG5cdFx0XHRcdEF4aW9zLnByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24gKHVybCwgZGF0YSwgY29uZmlnKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMucmVxdWVzdCh1dGlscy5tZXJnZShjb25maWcgfHwge30sIHtcblx0XHRcdFx0XHRcdG1ldGhvZDogbWV0aG9kLFxuXHRcdFx0XHRcdFx0dXJsOiB1cmwsXG5cdFx0XHRcdFx0XHRkYXRhOiBkYXRhXG5cdFx0XHRcdFx0fSkpO1xuXHRcdFx0XHR9O1xuXHRcdFx0XHRheGlvc1ttZXRob2RdID0gYmluZChBeGlvcy5wcm90b3R5cGVbbWV0aG9kXSwgZGVmYXVsdEluc3RhbmNlKTtcblx0XHRcdH0pO1xuXG5cdFx0XHQvKioqL1xuXHRcdH0sXG5cdFx0LyogMiAqL1xuXHRcdC8qKiovZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdFx0XHQndXNlIHN0cmljdCc7XG5cblx0XHRcdHZhciB1dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oMyk7XG5cblx0XHRcdHZhciBQUk9URUNUSU9OX1BSRUZJWCA9IC9eXFwpXFxdXFx9Jyw/XFxuLztcblx0XHRcdHZhciBERUZBVUxUX0NPTlRFTlRfVFlQRSA9IHtcblx0XHRcdFx0J0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnXG5cdFx0XHR9O1xuXG5cdFx0XHRtb2R1bGUuZXhwb3J0cyA9IHtcblx0XHRcdFx0dHJhbnNmb3JtUmVxdWVzdDogW2Z1bmN0aW9uIHRyYW5zZm9ybVJlc3BvbnNlSlNPTihkYXRhLCBoZWFkZXJzKSB7XG5cdFx0XHRcdFx0aWYgKHV0aWxzLmlzRm9ybURhdGEoZGF0YSkpIHtcblx0XHRcdFx0XHRcdHJldHVybiBkYXRhO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAodXRpbHMuaXNBcnJheUJ1ZmZlcihkYXRhKSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGRhdGE7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICh1dGlscy5pc0FycmF5QnVmZmVyVmlldyhkYXRhKSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGRhdGEuYnVmZmVyO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAodXRpbHMuaXNPYmplY3QoZGF0YSkgJiYgIXV0aWxzLmlzRmlsZShkYXRhKSAmJiAhdXRpbHMuaXNCbG9iKGRhdGEpKSB7XG5cdFx0XHRcdFx0XHQvLyBTZXQgYXBwbGljYXRpb24vanNvbiBpZiBubyBDb250ZW50LVR5cGUgaGFzIGJlZW4gc3BlY2lmaWVkXG5cdFx0XHRcdFx0XHRpZiAoIXV0aWxzLmlzVW5kZWZpbmVkKGhlYWRlcnMpKSB7XG5cdFx0XHRcdFx0XHRcdHV0aWxzLmZvckVhY2goaGVhZGVycywgZnVuY3Rpb24gcHJvY2Vzc0NvbnRlbnRUeXBlSGVhZGVyKHZhbCwga2V5KSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKGtleS50b0xvd2VyQ2FzZSgpID09PSAnY29udGVudC10eXBlJykge1xuXHRcdFx0XHRcdFx0XHRcdFx0aGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSB2YWw7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRcdFx0XHRpZiAodXRpbHMuaXNVbmRlZmluZWQoaGVhZGVyc1snQ29udGVudC1UeXBlJ10pKSB7XG5cdFx0XHRcdFx0XHRcdFx0aGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04Jztcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cmV0dXJuICgwLCBfc3RyaW5naWZ5Mi5kZWZhdWx0KShkYXRhKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIGRhdGE7XG5cdFx0XHRcdH1dLFxuXG5cdFx0XHRcdHRyYW5zZm9ybVJlc3BvbnNlOiBbZnVuY3Rpb24gdHJhbnNmb3JtUmVzcG9uc2VKU09OKGRhdGEpIHtcblx0XHRcdFx0XHQvKmVzbGludCBuby1wYXJhbS1yZWFzc2lnbjowKi9cblx0XHRcdFx0XHRpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRcdFx0XHRkYXRhID0gZGF0YS5yZXBsYWNlKFBST1RFQ1RJT05fUFJFRklYLCAnJyk7XG5cdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRkYXRhID0gSlNPTi5wYXJzZShkYXRhKTtcblx0XHRcdFx0XHRcdH0gY2F0Y2ggKGUpIHsvKiBJZ25vcmUgKi99XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBkYXRhO1xuXHRcdFx0XHR9XSxcblxuXHRcdFx0XHRoZWFkZXJzOiB7XG5cdFx0XHRcdFx0Y29tbW9uOiB7XG5cdFx0XHRcdFx0XHQnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL2pzb24sIHRleHQvcGxhaW4sICovKidcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHBhdGNoOiB1dGlscy5tZXJnZShERUZBVUxUX0NPTlRFTlRfVFlQRSksXG5cdFx0XHRcdFx0cG9zdDogdXRpbHMubWVyZ2UoREVGQVVMVF9DT05URU5UX1RZUEUpLFxuXHRcdFx0XHRcdHB1dDogdXRpbHMubWVyZ2UoREVGQVVMVF9DT05URU5UX1RZUEUpXG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0dGltZW91dDogMCxcblxuXHRcdFx0XHR4c3JmQ29va2llTmFtZTogJ1hTUkYtVE9LRU4nLFxuXHRcdFx0XHR4c3JmSGVhZGVyTmFtZTogJ1gtWFNSRi1UT0tFTidcblx0XHRcdH07XG5cblx0XHRcdC8qKiovXG5cdFx0fSxcblx0XHQvKiAzICovXG5cdFx0LyoqKi9mdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7XG5cblx0XHRcdCd1c2Ugc3RyaWN0JztcblxuXHRcdFx0LypnbG9iYWwgdG9TdHJpbmc6dHJ1ZSovXG5cblx0XHRcdC8vIHV0aWxzIGlzIGEgbGlicmFyeSBvZiBnZW5lcmljIGhlbHBlciBmdW5jdGlvbnMgbm9uLXNwZWNpZmljIHRvIGF4aW9zXG5cblx0XHRcdHZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cblx0XHRcdC8qKlxuICAgICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYW4gQXJyYXlcbiAgICAqXG4gICAgKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhbiBBcnJheSwgb3RoZXJ3aXNlIGZhbHNlXG4gICAgKi9cblx0XHRcdGZ1bmN0aW9uIGlzQXJyYXkodmFsKSB7XG5cdFx0XHRcdHJldHVybiB0b1N0cmluZy5jYWxsKHZhbCkgPT09ICdbb2JqZWN0IEFycmF5XSc7XG5cdFx0XHR9XG5cblx0XHRcdC8qKlxuICAgICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYW4gQXJyYXlCdWZmZXJcbiAgICAqXG4gICAgKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhbiBBcnJheUJ1ZmZlciwgb3RoZXJ3aXNlIGZhbHNlXG4gICAgKi9cblx0XHRcdGZ1bmN0aW9uIGlzQXJyYXlCdWZmZXIodmFsKSB7XG5cdFx0XHRcdHJldHVybiB0b1N0cmluZy5jYWxsKHZhbCkgPT09ICdbb2JqZWN0IEFycmF5QnVmZmVyXSc7XG5cdFx0XHR9XG5cblx0XHRcdC8qKlxuICAgICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBGb3JtRGF0YVxuICAgICpcbiAgICAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAgICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGFuIEZvcm1EYXRhLCBvdGhlcndpc2UgZmFsc2VcbiAgICAqL1xuXHRcdFx0ZnVuY3Rpb24gaXNGb3JtRGF0YSh2YWwpIHtcblx0XHRcdFx0cmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsKSA9PT0gJ1tvYmplY3QgRm9ybURhdGFdJztcblx0XHRcdH1cblxuXHRcdFx0LyoqXG4gICAgKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIHZpZXcgb24gYW4gQXJyYXlCdWZmZXJcbiAgICAqXG4gICAgKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIHZpZXcgb24gYW4gQXJyYXlCdWZmZXIsIG90aGVyd2lzZSBmYWxzZVxuICAgICovXG5cdFx0XHRmdW5jdGlvbiBpc0FycmF5QnVmZmVyVmlldyh2YWwpIHtcblx0XHRcdFx0dmFyIHJlc3VsdDtcblx0XHRcdFx0aWYgKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiYgQXJyYXlCdWZmZXIuaXNWaWV3KSB7XG5cdFx0XHRcdFx0cmVzdWx0ID0gQXJyYXlCdWZmZXIuaXNWaWV3KHZhbCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmVzdWx0ID0gdmFsICYmIHZhbC5idWZmZXIgJiYgdmFsLmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0XHR9XG5cblx0XHRcdC8qKlxuICAgICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBTdHJpbmdcbiAgICAqXG4gICAgKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIFN0cmluZywgb3RoZXJ3aXNlIGZhbHNlXG4gICAgKi9cblx0XHRcdGZ1bmN0aW9uIGlzU3RyaW5nKHZhbCkge1xuXHRcdFx0XHRyZXR1cm4gdHlwZW9mIHZhbCA9PT0gJ3N0cmluZyc7XG5cdFx0XHR9XG5cblx0XHRcdC8qKlxuICAgICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBOdW1iZXJcbiAgICAqXG4gICAgKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIE51bWJlciwgb3RoZXJ3aXNlIGZhbHNlXG4gICAgKi9cblx0XHRcdGZ1bmN0aW9uIGlzTnVtYmVyKHZhbCkge1xuXHRcdFx0XHRyZXR1cm4gdHlwZW9mIHZhbCA9PT0gJ251bWJlcic7XG5cdFx0XHR9XG5cblx0XHRcdC8qKlxuICAgICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgdW5kZWZpbmVkXG4gICAgKlxuICAgICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHZhbHVlIGlzIHVuZGVmaW5lZCwgb3RoZXJ3aXNlIGZhbHNlXG4gICAgKi9cblx0XHRcdGZ1bmN0aW9uIGlzVW5kZWZpbmVkKHZhbCkge1xuXHRcdFx0XHRyZXR1cm4gdHlwZW9mIHZhbCA9PT0gJ3VuZGVmaW5lZCc7XG5cdFx0XHR9XG5cblx0XHRcdC8qKlxuICAgICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYW4gT2JqZWN0XG4gICAgKlxuICAgICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYW4gT2JqZWN0LCBvdGhlcndpc2UgZmFsc2VcbiAgICAqL1xuXHRcdFx0ZnVuY3Rpb24gaXNPYmplY3QodmFsKSB7XG5cdFx0XHRcdHJldHVybiB2YWwgIT09IG51bGwgJiYgKHR5cGVvZiB2YWwgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiAoMCwgX3R5cGVvZjMuZGVmYXVsdCkodmFsKSkgPT09ICdvYmplY3QnO1xuXHRcdFx0fVxuXG5cdFx0XHQvKipcbiAgICAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRGF0ZVxuICAgICpcbiAgICAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAgICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgRGF0ZSwgb3RoZXJ3aXNlIGZhbHNlXG4gICAgKi9cblx0XHRcdGZ1bmN0aW9uIGlzRGF0ZSh2YWwpIHtcblx0XHRcdFx0cmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsKSA9PT0gJ1tvYmplY3QgRGF0ZV0nO1xuXHRcdFx0fVxuXG5cdFx0XHQvKipcbiAgICAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRmlsZVxuICAgICpcbiAgICAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAgICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgRmlsZSwgb3RoZXJ3aXNlIGZhbHNlXG4gICAgKi9cblx0XHRcdGZ1bmN0aW9uIGlzRmlsZSh2YWwpIHtcblx0XHRcdFx0cmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsKSA9PT0gJ1tvYmplY3QgRmlsZV0nO1xuXHRcdFx0fVxuXG5cdFx0XHQvKipcbiAgICAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgQmxvYlxuICAgICpcbiAgICAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAgICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgQmxvYiwgb3RoZXJ3aXNlIGZhbHNlXG4gICAgKi9cblx0XHRcdGZ1bmN0aW9uIGlzQmxvYih2YWwpIHtcblx0XHRcdFx0cmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsKSA9PT0gJ1tvYmplY3QgQmxvYl0nO1xuXHRcdFx0fVxuXG5cdFx0XHQvKipcbiAgICAqIFRyaW0gZXhjZXNzIHdoaXRlc3BhY2Ugb2ZmIHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBvZiBhIHN0cmluZ1xuICAgICpcbiAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgVGhlIFN0cmluZyB0byB0cmltXG4gICAgKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgU3RyaW5nIGZyZWVkIG9mIGV4Y2VzcyB3aGl0ZXNwYWNlXG4gICAgKi9cblx0XHRcdGZ1bmN0aW9uIHRyaW0oc3RyKSB7XG5cdFx0XHRcdHJldHVybiBzdHIucmVwbGFjZSgvXlxccyovLCAnJykucmVwbGFjZSgvXFxzKiQvLCAnJyk7XG5cdFx0XHR9XG5cblx0XHRcdC8qKlxuICAgICogRGV0ZXJtaW5lIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gYSBzdGFuZGFyZCBicm93c2VyIGVudmlyb25tZW50XG4gICAgKlxuICAgICogVGhpcyBhbGxvd3MgYXhpb3MgdG8gcnVuIGluIGEgd2ViIHdvcmtlciwgYW5kIHJlYWN0LW5hdGl2ZS5cbiAgICAqIEJvdGggZW52aXJvbm1lbnRzIHN1cHBvcnQgWE1MSHR0cFJlcXVlc3QsIGJ1dCBub3QgZnVsbHkgc3RhbmRhcmQgZ2xvYmFscy5cbiAgICAqXG4gICAgKiB3ZWIgd29ya2VyczpcbiAgICAqICB0eXBlb2Ygd2luZG93IC0+IHVuZGVmaW5lZFxuICAgICogIHR5cGVvZiBkb2N1bWVudCAtPiB1bmRlZmluZWRcbiAgICAqXG4gICAgKiByZWFjdC1uYXRpdmU6XG4gICAgKiAgdHlwZW9mIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgLT4gdW5kZWZpbmVkXG4gICAgKi9cblx0XHRcdGZ1bmN0aW9uIGlzU3RhbmRhcmRCcm93c2VyRW52KCkge1xuXHRcdFx0XHRyZXR1cm4gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCA9PT0gJ2Z1bmN0aW9uJztcblx0XHRcdH1cblxuXHRcdFx0LyoqXG4gICAgKiBJdGVyYXRlIG92ZXIgYW4gQXJyYXkgb3IgYW4gT2JqZWN0IGludm9raW5nIGEgZnVuY3Rpb24gZm9yIGVhY2ggaXRlbS5cbiAgICAqXG4gICAgKiBJZiBgb2JqYCBpcyBhbiBBcnJheSBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBwYXNzaW5nXG4gICAgKiB0aGUgdmFsdWUsIGluZGV4LCBhbmQgY29tcGxldGUgYXJyYXkgZm9yIGVhY2ggaXRlbS5cbiAgICAqXG4gICAgKiBJZiAnb2JqJyBpcyBhbiBPYmplY3QgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgcGFzc2luZ1xuICAgICogdGhlIHZhbHVlLCBrZXksIGFuZCBjb21wbGV0ZSBvYmplY3QgZm9yIGVhY2ggcHJvcGVydHkuXG4gICAgKlxuICAgICogQHBhcmFtIHtPYmplY3R8QXJyYXl9IG9iaiBUaGUgb2JqZWN0IHRvIGl0ZXJhdGVcbiAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBjYWxsYmFjayB0byBpbnZva2UgZm9yIGVhY2ggaXRlbVxuICAgICovXG5cdFx0XHRmdW5jdGlvbiBmb3JFYWNoKG9iaiwgZm4pIHtcblx0XHRcdFx0Ly8gRG9uJ3QgYm90aGVyIGlmIG5vIHZhbHVlIHByb3ZpZGVkXG5cdFx0XHRcdGlmIChvYmogPT09IG51bGwgfHwgdHlwZW9mIG9iaiA9PT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBGb3JjZSBhbiBhcnJheSBpZiBub3QgYWxyZWFkeSBzb21ldGhpbmcgaXRlcmFibGVcblx0XHRcdFx0aWYgKCh0eXBlb2Ygb2JqID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogKDAsIF90eXBlb2YzLmRlZmF1bHQpKG9iaikpICE9PSAnb2JqZWN0JyAmJiAhaXNBcnJheShvYmopKSB7XG5cdFx0XHRcdFx0Lyplc2xpbnQgbm8tcGFyYW0tcmVhc3NpZ246MCovXG5cdFx0XHRcdFx0b2JqID0gW29ial07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoaXNBcnJheShvYmopKSB7XG5cdFx0XHRcdFx0Ly8gSXRlcmF0ZSBvdmVyIGFycmF5IHZhbHVlc1xuXHRcdFx0XHRcdGZvciAodmFyIGkgPSAwLCBsID0gb2JqLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuXHRcdFx0XHRcdFx0Zm4uY2FsbChudWxsLCBvYmpbaV0sIGksIG9iaik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIEl0ZXJhdGUgb3ZlciBvYmplY3Qga2V5c1xuXHRcdFx0XHRcdGZvciAodmFyIGtleSBpbiBvYmopIHtcblx0XHRcdFx0XHRcdGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkge1xuXHRcdFx0XHRcdFx0XHRmbi5jYWxsKG51bGwsIG9ialtrZXldLCBrZXksIG9iaik7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8qKlxuICAgICogQWNjZXB0cyB2YXJhcmdzIGV4cGVjdGluZyBlYWNoIGFyZ3VtZW50IHRvIGJlIGFuIG9iamVjdCwgdGhlblxuICAgICogaW1tdXRhYmx5IG1lcmdlcyB0aGUgcHJvcGVydGllcyBvZiBlYWNoIG9iamVjdCBhbmQgcmV0dXJucyByZXN1bHQuXG4gICAgKlxuICAgICogV2hlbiBtdWx0aXBsZSBvYmplY3RzIGNvbnRhaW4gdGhlIHNhbWUga2V5IHRoZSBsYXRlciBvYmplY3QgaW5cbiAgICAqIHRoZSBhcmd1bWVudHMgbGlzdCB3aWxsIHRha2UgcHJlY2VkZW5jZS5cbiAgICAqXG4gICAgKiBFeGFtcGxlOlxuICAgICpcbiAgICAqIGBgYGpzXG4gICAgKiB2YXIgcmVzdWx0ID0gbWVyZ2Uoe2ZvbzogMTIzfSwge2ZvbzogNDU2fSk7XG4gICAgKiBjb25zb2xlLmxvZyhyZXN1bHQuZm9vKTsgLy8gb3V0cHV0cyA0NTZcbiAgICAqIGBgYFxuICAgICpcbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmoxIE9iamVjdCB0byBtZXJnZVxuICAgICogQHJldHVybnMge09iamVjdH0gUmVzdWx0IG9mIGFsbCBtZXJnZSBwcm9wZXJ0aWVzXG4gICAgKi9cblx0XHRcdGZ1bmN0aW9uIG1lcmdlKCkgLyogb2JqMSwgb2JqMiwgb2JqMywgLi4uICove1xuXHRcdFx0XHR2YXIgcmVzdWx0ID0ge307XG5cdFx0XHRcdGZ1bmN0aW9uIGFzc2lnblZhbHVlKHZhbCwga2V5KSB7XG5cdFx0XHRcdFx0aWYgKCgwLCBfdHlwZW9mMy5kZWZhdWx0KShyZXN1bHRba2V5XSkgPT09ICdvYmplY3QnICYmICh0eXBlb2YgdmFsID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogKDAsIF90eXBlb2YzLmRlZmF1bHQpKHZhbCkpID09PSAnb2JqZWN0Jykge1xuXHRcdFx0XHRcdFx0cmVzdWx0W2tleV0gPSBtZXJnZShyZXN1bHRba2V5XSwgdmFsKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmVzdWx0W2tleV0gPSB2YWw7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Zm9yICh2YXIgaSA9IDAsIGwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG5cdFx0XHRcdFx0Zm9yRWFjaChhcmd1bWVudHNbaV0sIGFzc2lnblZhbHVlKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdFx0fVxuXG5cdFx0XHRtb2R1bGUuZXhwb3J0cyA9IHtcblx0XHRcdFx0aXNBcnJheTogaXNBcnJheSxcblx0XHRcdFx0aXNBcnJheUJ1ZmZlcjogaXNBcnJheUJ1ZmZlcixcblx0XHRcdFx0aXNGb3JtRGF0YTogaXNGb3JtRGF0YSxcblx0XHRcdFx0aXNBcnJheUJ1ZmZlclZpZXc6IGlzQXJyYXlCdWZmZXJWaWV3LFxuXHRcdFx0XHRpc1N0cmluZzogaXNTdHJpbmcsXG5cdFx0XHRcdGlzTnVtYmVyOiBpc051bWJlcixcblx0XHRcdFx0aXNPYmplY3Q6IGlzT2JqZWN0LFxuXHRcdFx0XHRpc1VuZGVmaW5lZDogaXNVbmRlZmluZWQsXG5cdFx0XHRcdGlzRGF0ZTogaXNEYXRlLFxuXHRcdFx0XHRpc0ZpbGU6IGlzRmlsZSxcblx0XHRcdFx0aXNCbG9iOiBpc0Jsb2IsXG5cdFx0XHRcdGlzU3RhbmRhcmRCcm93c2VyRW52OiBpc1N0YW5kYXJkQnJvd3NlckVudixcblx0XHRcdFx0Zm9yRWFjaDogZm9yRWFjaCxcblx0XHRcdFx0bWVyZ2U6IG1lcmdlLFxuXHRcdFx0XHR0cmltOiB0cmltXG5cdFx0XHR9O1xuXG5cdFx0XHQvKioqL1xuXHRcdH0sXG5cdFx0LyogNCAqL1xuXHRcdC8qKiovZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdFx0XHQndXNlIHN0cmljdCc7XG5cblx0XHRcdC8qKlxuICAgICogRGlzcGF0Y2ggYSByZXF1ZXN0IHRvIHRoZSBzZXJ2ZXIgdXNpbmcgd2hpY2hldmVyIGFkYXB0ZXJcbiAgICAqIGlzIHN1cHBvcnRlZCBieSB0aGUgY3VycmVudCBlbnZpcm9ubWVudC5cbiAgICAqXG4gICAgKiBAcGFyYW0ge29iamVjdH0gY29uZmlnIFRoZSBjb25maWcgdGhhdCBpcyB0byBiZSB1c2VkIGZvciB0aGUgcmVxdWVzdFxuICAgICogQHJldHVybnMge1Byb21pc2V9IFRoZSBQcm9taXNlIHRvIGJlIGZ1bGZpbGxlZFxuICAgICovXG5cblx0XHRcdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZGlzcGF0Y2hSZXF1ZXN0KGNvbmZpZykge1xuXHRcdFx0XHRyZXR1cm4gbmV3IF9wcm9taXNlMi5kZWZhdWx0KGZ1bmN0aW9uIGV4ZWN1dG9yKHJlc29sdmUsIHJlamVjdCkge1xuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHR2YXIgYWRhcHRlcjtcblxuXHRcdFx0XHRcdFx0aWYgKHR5cGVvZiBjb25maWcuYWRhcHRlciA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0XHRcdFx0XHQvLyBGb3IgY3VzdG9tIGFkYXB0ZXIgc3VwcG9ydFxuXHRcdFx0XHRcdFx0XHRhZGFwdGVyID0gY29uZmlnLmFkYXB0ZXI7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiBYTUxIdHRwUmVxdWVzdCAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRcdFx0XHRcdFx0Ly8gRm9yIGJyb3dzZXJzIHVzZSBYSFIgYWRhcHRlclxuXHRcdFx0XHRcdFx0XHRhZGFwdGVyID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAodHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnKSB7XG5cdFx0XHRcdFx0XHRcdC8vIEZvciBub2RlIHVzZSBIVFRQIGFkYXB0ZXJcblx0XHRcdFx0XHRcdFx0YWRhcHRlciA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmICh0eXBlb2YgYWRhcHRlciA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0XHRcdFx0XHRhZGFwdGVyKHJlc29sdmUsIHJlamVjdCwgY29uZmlnKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdFx0XHRyZWplY3QoZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH07XG5cblx0XHRcdC8qKiovXG5cdFx0fSxcblx0XHQvKiA1ICovXG5cdFx0LyoqKi9mdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0XHRcdCd1c2Ugc3RyaWN0JztcblxuXHRcdFx0dmFyIHV0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKTtcblx0XHRcdHZhciBidWlsZFVSTCA9IF9fd2VicGFja19yZXF1aXJlX18oNik7XG5cdFx0XHR2YXIgcGFyc2VIZWFkZXJzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3KTtcblx0XHRcdHZhciB0cmFuc2Zvcm1EYXRhID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4KTtcblx0XHRcdHZhciBpc1VSTFNhbWVPcmlnaW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkpO1xuXHRcdFx0dmFyIGJ0b2EgPSB3aW5kb3cuYnRvYSB8fCBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwKTtcblxuXHRcdFx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB4aHJBZGFwdGVyKHJlc29sdmUsIHJlamVjdCwgY29uZmlnKSB7XG5cdFx0XHRcdHZhciByZXF1ZXN0RGF0YSA9IGNvbmZpZy5kYXRhO1xuXHRcdFx0XHR2YXIgcmVxdWVzdEhlYWRlcnMgPSBjb25maWcuaGVhZGVycztcblxuXHRcdFx0XHRpZiAodXRpbHMuaXNGb3JtRGF0YShyZXF1ZXN0RGF0YSkpIHtcblx0XHRcdFx0XHRkZWxldGUgcmVxdWVzdEhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddOyAvLyBMZXQgdGhlIGJyb3dzZXIgc2V0IGl0XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR2YXIgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuXG5cdFx0XHRcdC8vIEZvciBJRSA4LzkgQ09SUyBzdXBwb3J0XG5cdFx0XHRcdC8vIE9ubHkgc3VwcG9ydHMgUE9TVCBhbmQgR0VUIGNhbGxzIGFuZCBkb2Vzbid0IHJldHVybnMgdGhlIHJlc3BvbnNlIGhlYWRlcnMuXG5cdFx0XHRcdGlmICh3aW5kb3cuWERvbWFpblJlcXVlc3QgJiYgISgnd2l0aENyZWRlbnRpYWxzJyBpbiByZXF1ZXN0KSAmJiAhaXNVUkxTYW1lT3JpZ2luKGNvbmZpZy51cmwpKSB7XG5cdFx0XHRcdFx0cmVxdWVzdCA9IG5ldyB3aW5kb3cuWERvbWFpblJlcXVlc3QoKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEhUVFAgYmFzaWMgYXV0aGVudGljYXRpb25cblx0XHRcdFx0aWYgKGNvbmZpZy5hdXRoKSB7XG5cdFx0XHRcdFx0dmFyIHVzZXJuYW1lID0gY29uZmlnLmF1dGgudXNlcm5hbWUgfHwgJyc7XG5cdFx0XHRcdFx0dmFyIHBhc3N3b3JkID0gY29uZmlnLmF1dGgucGFzc3dvcmQgfHwgJyc7XG5cdFx0XHRcdFx0cmVxdWVzdEhlYWRlcnMuQXV0aG9yaXphdGlvbiA9ICdCYXNpYyAnICsgYnRvYSh1c2VybmFtZSArICc6JyArIHBhc3N3b3JkKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJlcXVlc3Qub3Blbihjb25maWcubWV0aG9kLnRvVXBwZXJDYXNlKCksIGJ1aWxkVVJMKGNvbmZpZy51cmwsIGNvbmZpZy5wYXJhbXMsIGNvbmZpZy5wYXJhbXNTZXJpYWxpemVyKSwgdHJ1ZSk7XG5cblx0XHRcdFx0Ly8gU2V0IHRoZSByZXF1ZXN0IHRpbWVvdXQgaW4gTVNcblx0XHRcdFx0cmVxdWVzdC50aW1lb3V0ID0gY29uZmlnLnRpbWVvdXQ7XG5cblx0XHRcdFx0Ly8gTGlzdGVuIGZvciByZWFkeSBzdGF0ZVxuXHRcdFx0XHRyZXF1ZXN0Lm9ubG9hZCA9IGZ1bmN0aW9uIGhhbmRsZUxvYWQoKSB7XG5cdFx0XHRcdFx0aWYgKCFyZXF1ZXN0KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC8vIFByZXBhcmUgdGhlIHJlc3BvbnNlXG5cdFx0XHRcdFx0dmFyIHJlc3BvbnNlSGVhZGVycyA9ICdnZXRBbGxSZXNwb25zZUhlYWRlcnMnIGluIHJlcXVlc3QgPyBwYXJzZUhlYWRlcnMocmVxdWVzdC5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSkgOiBudWxsO1xuXHRcdFx0XHRcdHZhciByZXNwb25zZURhdGEgPSBbJ3RleHQnLCAnJ10uaW5kZXhPZihjb25maWcucmVzcG9uc2VUeXBlIHx8ICcnKSAhPT0gLTEgPyByZXF1ZXN0LnJlc3BvbnNlVGV4dCA6IHJlcXVlc3QucmVzcG9uc2U7XG5cdFx0XHRcdFx0dmFyIHJlc3BvbnNlID0ge1xuXHRcdFx0XHRcdFx0ZGF0YTogdHJhbnNmb3JtRGF0YShyZXNwb25zZURhdGEsIHJlc3BvbnNlSGVhZGVycywgY29uZmlnLnRyYW5zZm9ybVJlc3BvbnNlKSxcblx0XHRcdFx0XHRcdC8vIElFIHNlbmRzIDEyMjMgaW5zdGVhZCBvZiAyMDQgKGh0dHBzOi8vZ2l0aHViLmNvbS9temFicmlza2llL2F4aW9zL2lzc3Vlcy8yMDEpXG5cdFx0XHRcdFx0XHRzdGF0dXM6IHJlcXVlc3Quc3RhdHVzID09PSAxMjIzID8gMjA0IDogcmVxdWVzdC5zdGF0dXMsXG5cdFx0XHRcdFx0XHRzdGF0dXNUZXh0OiByZXF1ZXN0LnN0YXR1cyA9PT0gMTIyMyA/ICdObyBDb250ZW50JyA6IHJlcXVlc3Quc3RhdHVzVGV4dCxcblx0XHRcdFx0XHRcdGhlYWRlcnM6IHJlc3BvbnNlSGVhZGVycyxcblx0XHRcdFx0XHRcdGNvbmZpZzogY29uZmlnXG5cdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdC8vIFJlc29sdmUgb3IgcmVqZWN0IHRoZSBQcm9taXNlIGJhc2VkIG9uIHRoZSBzdGF0dXNcblx0XHRcdFx0XHQocmVzcG9uc2Uuc3RhdHVzID49IDIwMCAmJiByZXNwb25zZS5zdGF0dXMgPCAzMDAgfHwgISgnc3RhdHVzJyBpbiByZXF1ZXN0KSAmJiByZXNwb25zZS5yZXNwb25zZVRleHQgPyByZXNvbHZlIDogcmVqZWN0KShyZXNwb25zZSk7XG5cblx0XHRcdFx0XHQvLyBDbGVhbiB1cCByZXF1ZXN0XG5cdFx0XHRcdFx0cmVxdWVzdCA9IG51bGw7XG5cdFx0XHRcdH07XG5cblx0XHRcdFx0Ly8gSGFuZGxlIGxvdyBsZXZlbCBuZXR3b3JrIGVycm9yc1xuXHRcdFx0XHRyZXF1ZXN0Lm9uZXJyb3IgPSBmdW5jdGlvbiBoYW5kbGVFcnJvcigpIHtcblx0XHRcdFx0XHQvLyBSZWFsIGVycm9ycyBhcmUgaGlkZGVuIGZyb20gdXMgYnkgdGhlIGJyb3dzZXJcblx0XHRcdFx0XHQvLyBvbmVycm9yIHNob3VsZCBvbmx5IGZpcmUgaWYgaXQncyBhIG5ldHdvcmsgZXJyb3Jcblx0XHRcdFx0XHRyZWplY3QobmV3IEVycm9yKCdOZXR3b3JrIEVycm9yJykpO1xuXG5cdFx0XHRcdFx0Ly8gQ2xlYW4gdXAgcmVxdWVzdFxuXHRcdFx0XHRcdHJlcXVlc3QgPSBudWxsO1xuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdC8vIEFkZCB4c3JmIGhlYWRlclxuXHRcdFx0XHQvLyBUaGlzIGlzIG9ubHkgZG9uZSBpZiBydW5uaW5nIGluIGEgc3RhbmRhcmQgYnJvd3NlciBlbnZpcm9ubWVudC5cblx0XHRcdFx0Ly8gU3BlY2lmaWNhbGx5IG5vdCBpZiB3ZSdyZSBpbiBhIHdlYiB3b3JrZXIsIG9yIHJlYWN0LW5hdGl2ZS5cblx0XHRcdFx0aWYgKHV0aWxzLmlzU3RhbmRhcmRCcm93c2VyRW52KCkpIHtcblx0XHRcdFx0XHR2YXIgY29va2llcyA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpO1xuXG5cdFx0XHRcdFx0Ly8gQWRkIHhzcmYgaGVhZGVyXG5cdFx0XHRcdFx0dmFyIHhzcmZWYWx1ZSA9IGNvbmZpZy53aXRoQ3JlZGVudGlhbHMgfHwgaXNVUkxTYW1lT3JpZ2luKGNvbmZpZy51cmwpID8gY29va2llcy5yZWFkKGNvbmZpZy54c3JmQ29va2llTmFtZSkgOiB1bmRlZmluZWQ7XG5cblx0XHRcdFx0XHRpZiAoeHNyZlZhbHVlKSB7XG5cdFx0XHRcdFx0XHRyZXF1ZXN0SGVhZGVyc1tjb25maWcueHNyZkhlYWRlck5hbWVdID0geHNyZlZhbHVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEFkZCBoZWFkZXJzIHRvIHRoZSByZXF1ZXN0XG5cdFx0XHRcdGlmICgnc2V0UmVxdWVzdEhlYWRlcicgaW4gcmVxdWVzdCkge1xuXHRcdFx0XHRcdHV0aWxzLmZvckVhY2gocmVxdWVzdEhlYWRlcnMsIGZ1bmN0aW9uIHNldFJlcXVlc3RIZWFkZXIodmFsLCBrZXkpIHtcblx0XHRcdFx0XHRcdGlmICh0eXBlb2YgcmVxdWVzdERhdGEgPT09ICd1bmRlZmluZWQnICYmIGtleS50b0xvd2VyQ2FzZSgpID09PSAnY29udGVudC10eXBlJykge1xuXHRcdFx0XHRcdFx0XHQvLyBSZW1vdmUgQ29udGVudC1UeXBlIGlmIGRhdGEgaXMgdW5kZWZpbmVkXG5cdFx0XHRcdFx0XHRcdGRlbGV0ZSByZXF1ZXN0SGVhZGVyc1trZXldO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Ly8gT3RoZXJ3aXNlIGFkZCBoZWFkZXIgdG8gdGhlIHJlcXVlc3Rcblx0XHRcdFx0XHRcdFx0cmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKGtleSwgdmFsKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEFkZCB3aXRoQ3JlZGVudGlhbHMgdG8gcmVxdWVzdCBpZiBuZWVkZWRcblx0XHRcdFx0aWYgKGNvbmZpZy53aXRoQ3JlZGVudGlhbHMpIHtcblx0XHRcdFx0XHRyZXF1ZXN0LndpdGhDcmVkZW50aWFscyA9IHRydWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBBZGQgcmVzcG9uc2VUeXBlIHRvIHJlcXVlc3QgaWYgbmVlZGVkXG5cdFx0XHRcdGlmIChjb25maWcucmVzcG9uc2VUeXBlKSB7XG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdHJlcXVlc3QucmVzcG9uc2VUeXBlID0gY29uZmlnLnJlc3BvbnNlVHlwZTtcblx0XHRcdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdFx0XHRpZiAocmVxdWVzdC5yZXNwb25zZVR5cGUgIT09ICdqc29uJykge1xuXHRcdFx0XHRcdFx0XHR0aHJvdyBlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICh1dGlscy5pc0FycmF5QnVmZmVyKHJlcXVlc3REYXRhKSkge1xuXHRcdFx0XHRcdHJlcXVlc3REYXRhID0gbmV3IERhdGFWaWV3KHJlcXVlc3REYXRhKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFNlbmQgdGhlIHJlcXVlc3Rcblx0XHRcdFx0cmVxdWVzdC5zZW5kKHJlcXVlc3REYXRhKTtcblx0XHRcdH07XG5cblx0XHRcdC8qKiovXG5cdFx0fSxcblx0XHQvKiA2ICovXG5cdFx0LyoqKi9mdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0XHRcdCd1c2Ugc3RyaWN0JztcblxuXHRcdFx0dmFyIHV0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKTtcblxuXHRcdFx0ZnVuY3Rpb24gZW5jb2RlKHZhbCkge1xuXHRcdFx0XHRyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHZhbCkucmVwbGFjZSgvJTQwL2dpLCAnQCcpLnJlcGxhY2UoLyUzQS9naSwgJzonKS5yZXBsYWNlKC8lMjQvZywgJyQnKS5yZXBsYWNlKC8lMkMvZ2ksICcsJykucmVwbGFjZSgvJTIwL2csICcrJykucmVwbGFjZSgvJTVCL2dpLCAnWycpLnJlcGxhY2UoLyU1RC9naSwgJ10nKTtcblx0XHRcdH1cblxuXHRcdFx0LyoqXG4gICAgKiBCdWlsZCBhIFVSTCBieSBhcHBlbmRpbmcgcGFyYW1zIHRvIHRoZSBlbmRcbiAgICAqXG4gICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFRoZSBiYXNlIG9mIHRoZSB1cmwgKGUuZy4sIGh0dHA6Ly93d3cuZ29vZ2xlLmNvbSlcbiAgICAqIEBwYXJhbSB7b2JqZWN0fSBbcGFyYW1zXSBUaGUgcGFyYW1zIHRvIGJlIGFwcGVuZGVkXG4gICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgZm9ybWF0dGVkIHVybFxuICAgICovXG5cdFx0XHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGJ1aWxkVVJMKHVybCwgcGFyYW1zLCBwYXJhbXNTZXJpYWxpemVyKSB7XG5cdFx0XHRcdC8qZXNsaW50IG5vLXBhcmFtLXJlYXNzaWduOjAqL1xuXHRcdFx0XHRpZiAoIXBhcmFtcykge1xuXHRcdFx0XHRcdHJldHVybiB1cmw7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR2YXIgc2VyaWFsaXplZFBhcmFtcztcblx0XHRcdFx0aWYgKHBhcmFtc1NlcmlhbGl6ZXIpIHtcblx0XHRcdFx0XHRzZXJpYWxpemVkUGFyYW1zID0gcGFyYW1zU2VyaWFsaXplcihwYXJhbXMpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHZhciBwYXJ0cyA9IFtdO1xuXG5cdFx0XHRcdFx0dXRpbHMuZm9yRWFjaChwYXJhbXMsIGZ1bmN0aW9uIHNlcmlhbGl6ZSh2YWwsIGtleSkge1xuXHRcdFx0XHRcdFx0aWYgKHZhbCA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsID09PSAndW5kZWZpbmVkJykge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmICh1dGlscy5pc0FycmF5KHZhbCkpIHtcblx0XHRcdFx0XHRcdFx0a2V5ID0ga2V5ICsgJ1tdJztcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKCF1dGlscy5pc0FycmF5KHZhbCkpIHtcblx0XHRcdFx0XHRcdFx0dmFsID0gW3ZhbF07XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdHV0aWxzLmZvckVhY2godmFsLCBmdW5jdGlvbiBwYXJzZVZhbHVlKHYpIHtcblx0XHRcdFx0XHRcdFx0aWYgKHV0aWxzLmlzRGF0ZSh2KSkge1xuXHRcdFx0XHRcdFx0XHRcdHYgPSB2LnRvSVNPU3RyaW5nKCk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAodXRpbHMuaXNPYmplY3QodikpIHtcblx0XHRcdFx0XHRcdFx0XHR2ID0gKDAsIF9zdHJpbmdpZnkyLmRlZmF1bHQpKHYpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHBhcnRzLnB1c2goZW5jb2RlKGtleSkgKyAnPScgKyBlbmNvZGUodikpO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRzZXJpYWxpemVkUGFyYW1zID0gcGFydHMuam9pbignJicpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHNlcmlhbGl6ZWRQYXJhbXMpIHtcblx0XHRcdFx0XHR1cmwgKz0gKHVybC5pbmRleE9mKCc/JykgPT09IC0xID8gJz8nIDogJyYnKSArIHNlcmlhbGl6ZWRQYXJhbXM7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gdXJsO1xuXHRcdFx0fTtcblxuXHRcdFx0LyoqKi9cblx0XHR9LFxuXHRcdC8qIDcgKi9cblx0XHQvKioqL2Z1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRcdFx0J3VzZSBzdHJpY3QnO1xuXG5cdFx0XHR2YXIgdXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpO1xuXG5cdFx0XHQvKipcbiAgICAqIFBhcnNlIGhlYWRlcnMgaW50byBhbiBvYmplY3RcbiAgICAqXG4gICAgKiBgYGBcbiAgICAqIERhdGU6IFdlZCwgMjcgQXVnIDIwMTQgMDg6NTg6NDkgR01UXG4gICAgKiBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbiAgICAqIENvbm5lY3Rpb246IGtlZXAtYWxpdmVcbiAgICAqIFRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkXG4gICAgKiBgYGBcbiAgICAqXG4gICAgKiBAcGFyYW0ge1N0cmluZ30gaGVhZGVycyBIZWFkZXJzIG5lZWRpbmcgdG8gYmUgcGFyc2VkXG4gICAgKiBAcmV0dXJucyB7T2JqZWN0fSBIZWFkZXJzIHBhcnNlZCBpbnRvIGFuIG9iamVjdFxuICAgICovXG5cdFx0XHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHBhcnNlSGVhZGVycyhoZWFkZXJzKSB7XG5cdFx0XHRcdHZhciBwYXJzZWQgPSB7fTtcblx0XHRcdFx0dmFyIGtleTtcblx0XHRcdFx0dmFyIHZhbDtcblx0XHRcdFx0dmFyIGk7XG5cblx0XHRcdFx0aWYgKCFoZWFkZXJzKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHBhcnNlZDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHV0aWxzLmZvckVhY2goaGVhZGVycy5zcGxpdCgnXFxuJyksIGZ1bmN0aW9uIHBhcnNlcihsaW5lKSB7XG5cdFx0XHRcdFx0aSA9IGxpbmUuaW5kZXhPZignOicpO1xuXHRcdFx0XHRcdGtleSA9IHV0aWxzLnRyaW0obGluZS5zdWJzdHIoMCwgaSkpLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRcdFx0dmFsID0gdXRpbHMudHJpbShsaW5lLnN1YnN0cihpICsgMSkpO1xuXG5cdFx0XHRcdFx0aWYgKGtleSkge1xuXHRcdFx0XHRcdFx0cGFyc2VkW2tleV0gPSBwYXJzZWRba2V5XSA/IHBhcnNlZFtrZXldICsgJywgJyArIHZhbCA6IHZhbDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdHJldHVybiBwYXJzZWQ7XG5cdFx0XHR9O1xuXG5cdFx0XHQvKioqL1xuXHRcdH0sXG5cdFx0LyogOCAqL1xuXHRcdC8qKiovZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdFx0XHQndXNlIHN0cmljdCc7XG5cblx0XHRcdHZhciB1dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oMyk7XG5cblx0XHRcdC8qKlxuICAgICogVHJhbnNmb3JtIHRoZSBkYXRhIGZvciBhIHJlcXVlc3Qgb3IgYSByZXNwb25zZVxuICAgICpcbiAgICAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gZGF0YSBUaGUgZGF0YSB0byBiZSB0cmFuc2Zvcm1lZFxuICAgICogQHBhcmFtIHtBcnJheX0gaGVhZGVycyBUaGUgaGVhZGVycyBmb3IgdGhlIHJlcXVlc3Qgb3IgcmVzcG9uc2VcbiAgICAqIEBwYXJhbSB7QXJyYXl8RnVuY3Rpb259IGZucyBBIHNpbmdsZSBmdW5jdGlvbiBvciBBcnJheSBvZiBmdW5jdGlvbnNcbiAgICAqIEByZXR1cm5zIHsqfSBUaGUgcmVzdWx0aW5nIHRyYW5zZm9ybWVkIGRhdGFcbiAgICAqL1xuXHRcdFx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB0cmFuc2Zvcm1EYXRhKGRhdGEsIGhlYWRlcnMsIGZucykge1xuXHRcdFx0XHQvKmVzbGludCBuby1wYXJhbS1yZWFzc2lnbjowKi9cblx0XHRcdFx0dXRpbHMuZm9yRWFjaChmbnMsIGZ1bmN0aW9uIHRyYW5zZm9ybShmbikge1xuXHRcdFx0XHRcdGRhdGEgPSBmbihkYXRhLCBoZWFkZXJzKTtcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0cmV0dXJuIGRhdGE7XG5cdFx0XHR9O1xuXG5cdFx0XHQvKioqL1xuXHRcdH0sXG5cdFx0LyogOSAqL1xuXHRcdC8qKiovZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdFx0XHQndXNlIHN0cmljdCc7XG5cblx0XHRcdHZhciB1dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oMyk7XG5cblx0XHRcdG1vZHVsZS5leHBvcnRzID0gdXRpbHMuaXNTdGFuZGFyZEJyb3dzZXJFbnYoKSA/XG5cblx0XHRcdC8vIFN0YW5kYXJkIGJyb3dzZXIgZW52cyBoYXZlIGZ1bGwgc3VwcG9ydCBvZiB0aGUgQVBJcyBuZWVkZWQgdG8gdGVzdFxuXHRcdFx0Ly8gd2hldGhlciB0aGUgcmVxdWVzdCBVUkwgaXMgb2YgdGhlIHNhbWUgb3JpZ2luIGFzIGN1cnJlbnQgbG9jYXRpb24uXG5cdFx0XHRmdW5jdGlvbiBzdGFuZGFyZEJyb3dzZXJFbnYoKSB7XG5cdFx0XHRcdHZhciBtc2llID0gLyhtc2llfHRyaWRlbnQpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcblx0XHRcdFx0dmFyIHVybFBhcnNpbmdOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuXHRcdFx0XHR2YXIgb3JpZ2luVVJMO1xuXG5cdFx0XHRcdC8qKlxuICAgICogUGFyc2UgYSBVUkwgdG8gZGlzY292ZXIgaXQncyBjb21wb25lbnRzXG4gICAgKlxuICAgICogQHBhcmFtIHtTdHJpbmd9IHVybCBUaGUgVVJMIHRvIGJlIHBhcnNlZFxuICAgICogQHJldHVybnMge09iamVjdH1cbiAgICAqL1xuXHRcdFx0XHRmdW5jdGlvbiByZXNvbHZlVVJMKHVybCkge1xuXHRcdFx0XHRcdHZhciBocmVmID0gdXJsO1xuXG5cdFx0XHRcdFx0aWYgKG1zaWUpIHtcblx0XHRcdFx0XHRcdC8vIElFIG5lZWRzIGF0dHJpYnV0ZSBzZXQgdHdpY2UgdG8gbm9ybWFsaXplIHByb3BlcnRpZXNcblx0XHRcdFx0XHRcdHVybFBhcnNpbmdOb2RlLnNldEF0dHJpYnV0ZSgnaHJlZicsIGhyZWYpO1xuXHRcdFx0XHRcdFx0aHJlZiA9IHVybFBhcnNpbmdOb2RlLmhyZWY7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dXJsUGFyc2luZ05vZGUuc2V0QXR0cmlidXRlKCdocmVmJywgaHJlZik7XG5cblx0XHRcdFx0XHQvLyB1cmxQYXJzaW5nTm9kZSBwcm92aWRlcyB0aGUgVXJsVXRpbHMgaW50ZXJmYWNlIC0gaHR0cDovL3VybC5zcGVjLndoYXR3Zy5vcmcvI3VybHV0aWxzXG5cdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdGhyZWY6IHVybFBhcnNpbmdOb2RlLmhyZWYsXG5cdFx0XHRcdFx0XHRwcm90b2NvbDogdXJsUGFyc2luZ05vZGUucHJvdG9jb2wgPyB1cmxQYXJzaW5nTm9kZS5wcm90b2NvbC5yZXBsYWNlKC86JC8sICcnKSA6ICcnLFxuXHRcdFx0XHRcdFx0aG9zdDogdXJsUGFyc2luZ05vZGUuaG9zdCxcblx0XHRcdFx0XHRcdHNlYXJjaDogdXJsUGFyc2luZ05vZGUuc2VhcmNoID8gdXJsUGFyc2luZ05vZGUuc2VhcmNoLnJlcGxhY2UoL15cXD8vLCAnJykgOiAnJyxcblx0XHRcdFx0XHRcdGhhc2g6IHVybFBhcnNpbmdOb2RlLmhhc2ggPyB1cmxQYXJzaW5nTm9kZS5oYXNoLnJlcGxhY2UoL14jLywgJycpIDogJycsXG5cdFx0XHRcdFx0XHRob3N0bmFtZTogdXJsUGFyc2luZ05vZGUuaG9zdG5hbWUsXG5cdFx0XHRcdFx0XHRwb3J0OiB1cmxQYXJzaW5nTm9kZS5wb3J0LFxuXHRcdFx0XHRcdFx0cGF0aG5hbWU6IHVybFBhcnNpbmdOb2RlLnBhdGhuYW1lLmNoYXJBdCgwKSA9PT0gJy8nID8gdXJsUGFyc2luZ05vZGUucGF0aG5hbWUgOiAnLycgKyB1cmxQYXJzaW5nTm9kZS5wYXRobmFtZVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRvcmlnaW5VUkwgPSByZXNvbHZlVVJMKHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcblxuXHRcdFx0XHQvKipcbiAgICAqIERldGVybWluZSBpZiBhIFVSTCBzaGFyZXMgdGhlIHNhbWUgb3JpZ2luIGFzIHRoZSBjdXJyZW50IGxvY2F0aW9uXG4gICAgKlxuICAgICogQHBhcmFtIHtTdHJpbmd9IHJlcXVlc3RVUkwgVGhlIFVSTCB0byB0ZXN0XG4gICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBVUkwgc2hhcmVzIHRoZSBzYW1lIG9yaWdpbiwgb3RoZXJ3aXNlIGZhbHNlXG4gICAgKi9cblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uIGlzVVJMU2FtZU9yaWdpbihyZXF1ZXN0VVJMKSB7XG5cdFx0XHRcdFx0dmFyIHBhcnNlZCA9IHV0aWxzLmlzU3RyaW5nKHJlcXVlc3RVUkwpID8gcmVzb2x2ZVVSTChyZXF1ZXN0VVJMKSA6IHJlcXVlc3RVUkw7XG5cdFx0XHRcdFx0cmV0dXJuIHBhcnNlZC5wcm90b2NvbCA9PT0gb3JpZ2luVVJMLnByb3RvY29sICYmIHBhcnNlZC5ob3N0ID09PSBvcmlnaW5VUkwuaG9zdDtcblx0XHRcdFx0fTtcblx0XHRcdH0oKSA6XG5cblx0XHRcdC8vIE5vbiBzdGFuZGFyZCBicm93c2VyIGVudnMgKHdlYiB3b3JrZXJzLCByZWFjdC1uYXRpdmUpIGxhY2sgbmVlZGVkIHN1cHBvcnQuXG5cdFx0XHRmdW5jdGlvbiBub25TdGFuZGFyZEJyb3dzZXJFbnYoKSB7XG5cdFx0XHRcdHJldHVybiBmdW5jdGlvbiBpc1VSTFNhbWVPcmlnaW4oKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH07XG5cdFx0XHR9KCk7XG5cblx0XHRcdC8qKiovXG5cdFx0fSxcblx0XHQvKiAxMCAqL1xuXHRcdC8qKiovZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdFx0XHQndXNlIHN0cmljdCc7XG5cblx0XHRcdC8vIGJ0b2EgcG9seWZpbGwgZm9yIElFPDEwIGNvdXJ0ZXN5IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXZpZGNoYW1iZXJzL0Jhc2U2NC5qc1xuXG5cdFx0XHR2YXIgY2hhcnMgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0nO1xuXG5cdFx0XHRmdW5jdGlvbiBJbnZhbGlkQ2hhcmFjdGVyRXJyb3IobWVzc2FnZSkge1xuXHRcdFx0XHR0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuXHRcdFx0fVxuXHRcdFx0SW52YWxpZENoYXJhY3RlckVycm9yLnByb3RvdHlwZSA9IG5ldyBFcnJvcigpO1xuXHRcdFx0SW52YWxpZENoYXJhY3RlckVycm9yLnByb3RvdHlwZS5jb2RlID0gNTtcblx0XHRcdEludmFsaWRDaGFyYWN0ZXJFcnJvci5wcm90b3R5cGUubmFtZSA9ICdJbnZhbGlkQ2hhcmFjdGVyRXJyb3InO1xuXG5cdFx0XHRmdW5jdGlvbiBidG9hKGlucHV0KSB7XG5cdFx0XHRcdHZhciBzdHIgPSBTdHJpbmcoaW5wdXQpO1xuXHRcdFx0XHR2YXIgb3V0cHV0ID0gJyc7XG5cdFx0XHRcdGZvciAoXG5cdFx0XHRcdC8vIGluaXRpYWxpemUgcmVzdWx0IGFuZCBjb3VudGVyXG5cdFx0XHRcdHZhciBibG9jaywgY2hhckNvZGUsIGlkeCA9IDAsIG1hcCA9IGNoYXJzO1xuXHRcdFx0XHQvLyBpZiB0aGUgbmV4dCBzdHIgaW5kZXggZG9lcyBub3QgZXhpc3Q6XG5cdFx0XHRcdC8vICAgY2hhbmdlIHRoZSBtYXBwaW5nIHRhYmxlIHRvIFwiPVwiXG5cdFx0XHRcdC8vICAgY2hlY2sgaWYgZCBoYXMgbm8gZnJhY3Rpb25hbCBkaWdpdHNcblx0XHRcdFx0c3RyLmNoYXJBdChpZHggfCAwKSB8fCAobWFwID0gJz0nLCBpZHggJSAxKTtcblx0XHRcdFx0Ly8gXCI4IC0gaWR4ICUgMSAqIDhcIiBnZW5lcmF0ZXMgdGhlIHNlcXVlbmNlIDIsIDQsIDYsIDhcblx0XHRcdFx0b3V0cHV0ICs9IG1hcC5jaGFyQXQoNjMgJiBibG9jayA+PiA4IC0gaWR4ICUgMSAqIDgpKSB7XG5cdFx0XHRcdFx0Y2hhckNvZGUgPSBzdHIuY2hhckNvZGVBdChpZHggKz0gMyAvIDQpO1xuXHRcdFx0XHRcdGlmIChjaGFyQ29kZSA+IDB4RkYpIHtcblx0XHRcdFx0XHRcdHRocm93IG5ldyBJbnZhbGlkQ2hhcmFjdGVyRXJyb3IoJ0lOVkFMSURfQ0hBUkFDVEVSX0VSUjogRE9NIEV4Y2VwdGlvbiA1Jyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGJsb2NrID0gYmxvY2sgPDwgOCB8IGNoYXJDb2RlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBvdXRwdXQ7XG5cdFx0XHR9XG5cblx0XHRcdG1vZHVsZS5leHBvcnRzID0gYnRvYTtcblxuXHRcdFx0LyoqKi9cblx0XHR9LFxuXHRcdC8qIDExICovXG5cdFx0LyoqKi9mdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0XHRcdCd1c2Ugc3RyaWN0JztcblxuXHRcdFx0dmFyIHV0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKTtcblxuXHRcdFx0bW9kdWxlLmV4cG9ydHMgPSB1dGlscy5pc1N0YW5kYXJkQnJvd3NlckVudigpID9cblxuXHRcdFx0Ly8gU3RhbmRhcmQgYnJvd3NlciBlbnZzIHN1cHBvcnQgZG9jdW1lbnQuY29va2llXG5cdFx0XHRmdW5jdGlvbiBzdGFuZGFyZEJyb3dzZXJFbnYoKSB7XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0d3JpdGU6IGZ1bmN0aW9uIHdyaXRlKG5hbWUsIHZhbHVlLCBleHBpcmVzLCBwYXRoLCBkb21haW4sIHNlY3VyZSkge1xuXHRcdFx0XHRcdFx0dmFyIGNvb2tpZSA9IFtdO1xuXHRcdFx0XHRcdFx0Y29va2llLnB1c2gobmFtZSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSkpO1xuXG5cdFx0XHRcdFx0XHRpZiAodXRpbHMuaXNOdW1iZXIoZXhwaXJlcykpIHtcblx0XHRcdFx0XHRcdFx0Y29va2llLnB1c2goJ2V4cGlyZXM9JyArIG5ldyBEYXRlKGV4cGlyZXMpLnRvR01UU3RyaW5nKCkpO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAodXRpbHMuaXNTdHJpbmcocGF0aCkpIHtcblx0XHRcdFx0XHRcdFx0Y29va2llLnB1c2goJ3BhdGg9JyArIHBhdGgpO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAodXRpbHMuaXNTdHJpbmcoZG9tYWluKSkge1xuXHRcdFx0XHRcdFx0XHRjb29raWUucHVzaCgnZG9tYWluPScgKyBkb21haW4pO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAoc2VjdXJlID09PSB0cnVlKSB7XG5cdFx0XHRcdFx0XHRcdGNvb2tpZS5wdXNoKCdzZWN1cmUnKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0ZG9jdW1lbnQuY29va2llID0gY29va2llLmpvaW4oJzsgJyk7XG5cdFx0XHRcdFx0fSxcblxuXHRcdFx0XHRcdHJlYWQ6IGZ1bmN0aW9uIHJlYWQobmFtZSkge1xuXHRcdFx0XHRcdFx0dmFyIG1hdGNoID0gZG9jdW1lbnQuY29va2llLm1hdGNoKG5ldyBSZWdFeHAoJyhefDtcXFxccyopKCcgKyBuYW1lICsgJyk9KFteO10qKScpKTtcblx0XHRcdFx0XHRcdHJldHVybiBtYXRjaCA/IGRlY29kZVVSSUNvbXBvbmVudChtYXRjaFszXSkgOiBudWxsO1xuXHRcdFx0XHRcdH0sXG5cblx0XHRcdFx0XHRyZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZShuYW1lKSB7XG5cdFx0XHRcdFx0XHR0aGlzLndyaXRlKG5hbWUsICcnLCBEYXRlLm5vdygpIC0gODY0MDAwMDApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHRcdH0oKSA6XG5cblx0XHRcdC8vIE5vbiBzdGFuZGFyZCBicm93c2VyIGVudiAod2ViIHdvcmtlcnMsIHJlYWN0LW5hdGl2ZSkgbGFjayBuZWVkZWQgc3VwcG9ydC5cblx0XHRcdGZ1bmN0aW9uIG5vblN0YW5kYXJkQnJvd3NlckVudigpIHtcblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHR3cml0ZTogZnVuY3Rpb24gd3JpdGUoKSB7fSxcblx0XHRcdFx0XHRyZWFkOiBmdW5jdGlvbiByZWFkKCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRyZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZSgpIHt9XG5cdFx0XHRcdH07XG5cdFx0XHR9KCk7XG5cblx0XHRcdC8qKiovXG5cdFx0fSxcblx0XHQvKiAxMiAqL1xuXHRcdC8qKiovZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdFx0XHQndXNlIHN0cmljdCc7XG5cblx0XHRcdHZhciB1dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oMyk7XG5cblx0XHRcdGZ1bmN0aW9uIEludGVyY2VwdG9yTWFuYWdlcigpIHtcblx0XHRcdFx0dGhpcy5oYW5kbGVycyA9IFtdO1xuXHRcdFx0fVxuXG5cdFx0XHQvKipcbiAgICAqIEFkZCBhIG5ldyBpbnRlcmNlcHRvciB0byB0aGUgc3RhY2tcbiAgICAqXG4gICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdWxmaWxsZWQgVGhlIGZ1bmN0aW9uIHRvIGhhbmRsZSBgdGhlbmAgZm9yIGEgYFByb21pc2VgXG4gICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSByZWplY3RlZCBUaGUgZnVuY3Rpb24gdG8gaGFuZGxlIGByZWplY3RgIGZvciBhIGBQcm9taXNlYFxuICAgICpcbiAgICAqIEByZXR1cm4ge051bWJlcn0gQW4gSUQgdXNlZCB0byByZW1vdmUgaW50ZXJjZXB0b3IgbGF0ZXJcbiAgICAqL1xuXHRcdFx0SW50ZXJjZXB0b3JNYW5hZ2VyLnByb3RvdHlwZS51c2UgPSBmdW5jdGlvbiB1c2UoZnVsZmlsbGVkLCByZWplY3RlZCkge1xuXHRcdFx0XHR0aGlzLmhhbmRsZXJzLnB1c2goe1xuXHRcdFx0XHRcdGZ1bGZpbGxlZDogZnVsZmlsbGVkLFxuXHRcdFx0XHRcdHJlamVjdGVkOiByZWplY3RlZFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0cmV0dXJuIHRoaXMuaGFuZGxlcnMubGVuZ3RoIC0gMTtcblx0XHRcdH07XG5cblx0XHRcdC8qKlxuICAgICogUmVtb3ZlIGFuIGludGVyY2VwdG9yIGZyb20gdGhlIHN0YWNrXG4gICAgKlxuICAgICogQHBhcmFtIHtOdW1iZXJ9IGlkIFRoZSBJRCB0aGF0IHdhcyByZXR1cm5lZCBieSBgdXNlYFxuICAgICovXG5cdFx0XHRJbnRlcmNlcHRvck1hbmFnZXIucHJvdG90eXBlLmVqZWN0ID0gZnVuY3Rpb24gZWplY3QoaWQpIHtcblx0XHRcdFx0aWYgKHRoaXMuaGFuZGxlcnNbaWRdKSB7XG5cdFx0XHRcdFx0dGhpcy5oYW5kbGVyc1tpZF0gPSBudWxsO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXG5cdFx0XHQvKipcbiAgICAqIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIHJlZ2lzdGVyZWQgaW50ZXJjZXB0b3JzXG4gICAgKlxuICAgICogVGhpcyBtZXRob2QgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBmb3Igc2tpcHBpbmcgb3ZlciBhbnlcbiAgICAqIGludGVyY2VwdG9ycyB0aGF0IG1heSBoYXZlIGJlY29tZSBgbnVsbGAgY2FsbGluZyBgZWplY3RgLlxuICAgICpcbiAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBjYWxsIGZvciBlYWNoIGludGVyY2VwdG9yXG4gICAgKi9cblx0XHRcdEludGVyY2VwdG9yTWFuYWdlci5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uIGZvckVhY2goZm4pIHtcblx0XHRcdFx0dXRpbHMuZm9yRWFjaCh0aGlzLmhhbmRsZXJzLCBmdW5jdGlvbiBmb3JFYWNoSGFuZGxlcihoKSB7XG5cdFx0XHRcdFx0aWYgKGggIT09IG51bGwpIHtcblx0XHRcdFx0XHRcdGZuKGgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9O1xuXG5cdFx0XHRtb2R1bGUuZXhwb3J0cyA9IEludGVyY2VwdG9yTWFuYWdlcjtcblxuXHRcdFx0LyoqKi9cblx0XHR9LFxuXHRcdC8qIDEzICovXG5cdFx0LyoqKi9mdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7XG5cblx0XHRcdCd1c2Ugc3RyaWN0JztcblxuXHRcdFx0LyoqXG4gICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBVUkwgaXMgYWJzb2x1dGVcbiAgICAqXG4gICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFRoZSBVUkwgdG8gdGVzdFxuICAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHNwZWNpZmllZCBVUkwgaXMgYWJzb2x1dGUsIG90aGVyd2lzZSBmYWxzZVxuICAgICovXG5cblx0XHRcdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNBYnNvbHV0ZVVSTCh1cmwpIHtcblx0XHRcdFx0Ly8gQSBVUkwgaXMgY29uc2lkZXJlZCBhYnNvbHV0ZSBpZiBpdCBiZWdpbnMgd2l0aCBcIjxzY2hlbWU+Oi8vXCIgb3IgXCIvL1wiIChwcm90b2NvbC1yZWxhdGl2ZSBVUkwpLlxuXHRcdFx0XHQvLyBSRkMgMzk4NiBkZWZpbmVzIHNjaGVtZSBuYW1lIGFzIGEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyBiZWdpbm5pbmcgd2l0aCBhIGxldHRlciBhbmQgZm9sbG93ZWRcblx0XHRcdFx0Ly8gYnkgYW55IGNvbWJpbmF0aW9uIG9mIGxldHRlcnMsIGRpZ2l0cywgcGx1cywgcGVyaW9kLCBvciBoeXBoZW4uXG5cdFx0XHRcdHJldHVybiAoL14oW2Etel1bYS16XFxkXFwrXFwtXFwuXSo6KT9cXC9cXC8vaS50ZXN0KHVybClcblx0XHRcdFx0KTtcblx0XHRcdH07XG5cblx0XHRcdC8qKiovXG5cdFx0fSxcblx0XHQvKiAxNCAqL1xuXHRcdC8qKiovZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdFx0XHQndXNlIHN0cmljdCc7XG5cblx0XHRcdC8qKlxuICAgICogQ3JlYXRlcyBhIG5ldyBVUkwgYnkgY29tYmluaW5nIHRoZSBzcGVjaWZpZWQgVVJMc1xuICAgICpcbiAgICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlVVJMIFRoZSBiYXNlIFVSTFxuICAgICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0aXZlVVJMIFRoZSByZWxhdGl2ZSBVUkxcbiAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBjb21iaW5lZCBVUkxcbiAgICAqL1xuXG5cdFx0XHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGNvbWJpbmVVUkxzKGJhc2VVUkwsIHJlbGF0aXZlVVJMKSB7XG5cdFx0XHRcdHJldHVybiBiYXNlVVJMLnJlcGxhY2UoL1xcLyskLywgJycpICsgJy8nICsgcmVsYXRpdmVVUkwucmVwbGFjZSgvXlxcLysvLCAnJyk7XG5cdFx0XHR9O1xuXG5cdFx0XHQvKioqL1xuXHRcdH0sXG5cdFx0LyogMTUgKi9cblx0XHQvKioqL2Z1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHRcdFx0J3VzZSBzdHJpY3QnO1xuXG5cdFx0XHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGJpbmQoZm4sIHRoaXNBcmcpIHtcblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uIHdyYXAoKSB7XG5cdFx0XHRcdFx0dmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCk7XG5cdFx0XHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRhcmdzW2ldID0gYXJndW1lbnRzW2ldO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gZm4uYXBwbHkodGhpc0FyZywgYXJncyk7XG5cdFx0XHRcdH07XG5cdFx0XHR9O1xuXG5cdFx0XHQvKioqL1xuXHRcdH0sXG5cdFx0LyogMTYgKi9cblx0XHQvKioqL2Z1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHRcdFx0J3VzZSBzdHJpY3QnO1xuXG5cdFx0XHQvKipcbiAgICAqIFN5bnRhY3RpYyBzdWdhciBmb3IgaW52b2tpbmcgYSBmdW5jdGlvbiBhbmQgZXhwYW5kaW5nIGFuIGFycmF5IGZvciBhcmd1bWVudHMuXG4gICAgKlxuICAgICogQ29tbW9uIHVzZSBjYXNlIHdvdWxkIGJlIHRvIHVzZSBgRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5YC5cbiAgICAqXG4gICAgKiAgYGBganNcbiAgICAqICBmdW5jdGlvbiBmKHgsIHksIHopIHt9XG4gICAgKiAgdmFyIGFyZ3MgPSBbMSwgMiwgM107XG4gICAgKiAgZi5hcHBseShudWxsLCBhcmdzKTtcbiAgICAqICBgYGBcbiAgICAqXG4gICAgKiBXaXRoIGBzcHJlYWRgIHRoaXMgZXhhbXBsZSBjYW4gYmUgcmUtd3JpdHRlbi5cbiAgICAqXG4gICAgKiAgYGBganNcbiAgICAqICBzcHJlYWQoZnVuY3Rpb24oeCwgeSwgeikge30pKFsxLCAyLCAzXSk7XG4gICAgKiAgYGBgXG4gICAgKlxuICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn1cbiAgICAqL1xuXG5cdFx0XHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHNwcmVhZChjYWxsYmFjaykge1xuXHRcdFx0XHRyZXR1cm4gZnVuY3Rpb24gd3JhcChhcnIpIHtcblx0XHRcdFx0XHRyZXR1cm4gY2FsbGJhY2suYXBwbHkobnVsbCwgYXJyKTtcblx0XHRcdFx0fTtcblx0XHRcdH07XG5cblx0XHRcdC8qKiovXG5cdFx0fVxuXHRcdC8qKioqKiovXSlcblx0KTtcbn0pO1xuO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXhpb3MubWFwIl19
},{"_process":1,"babel-runtime/core-js/json/stringify":24,"babel-runtime/core-js/promise":28,"babel-runtime/helpers/typeof":32}],135:[function(require,module,exports){
var getNative = require('./_getNative'),
root = require('./_root');
/* Built-in method references that are verified to be native. */
var DataView = getNative(root, 'DataView');
module.exports = DataView;
},{"./_getNative":216,"./_root":256}],136:[function(require,module,exports){
var hashClear = require('./_hashClear'),
hashDelete = require('./_hashDelete'),
hashGet = require('./_hashGet'),
hashHas = require('./_hashHas'),
hashSet = require('./_hashSet');
/**
* Creates a hash object.
*
* @private
* @constructor
* @param {Array} [entries] The key-value pairs to cache.
*/
function Hash(entries) {
var index = -1,
length = entries ? entries.length : 0;
this.clear();
while (++index < length) {
var entry = entries[index];
this.set(entry[0], entry[1]);
}
}
// Add methods to `Hash`.
Hash.prototype.clear = hashClear;
Hash.prototype['delete'] = hashDelete;
Hash.prototype.get = hashGet;
Hash.prototype.has = hashHas;
Hash.prototype.set = hashSet;
module.exports = Hash;
},{"./_hashClear":223,"./_hashDelete":224,"./_hashGet":225,"./_hashHas":226,"./_hashSet":227}],137:[function(require,module,exports){
var listCacheClear = require('./_listCacheClear'),
listCacheDelete = require('./_listCacheDelete'),
listCacheGet = require('./_listCacheGet'),
listCacheHas = require('./_listCacheHas'),
listCacheSet = require('./_listCacheSet');
/**
* Creates an list cache object.
*
* @private
* @constructor
* @param {Array} [entries] The key-value pairs to cache.
*/
function ListCache(entries) {
var index = -1,
length = entries ? entries.length : 0;
this.clear();
while (++index < length) {
var entry = entries[index];
this.set(entry[0], entry[1]);
}
}
// Add methods to `ListCache`.
ListCache.prototype.clear = listCacheClear;
ListCache.prototype['delete'] = listCacheDelete;
ListCache.prototype.get = listCacheGet;
ListCache.prototype.has = listCacheHas;
ListCache.prototype.set = listCacheSet;
module.exports = ListCache;
},{"./_listCacheClear":243,"./_listCacheDelete":244,"./_listCacheGet":245,"./_listCacheHas":246,"./_listCacheSet":247}],138:[function(require,module,exports){
var getNative = require('./_getNative'),
root = require('./_root');
/* Built-in method references that are verified to be native. */
var Map = getNative(root, 'Map');
module.exports = Map;
},{"./_getNative":216,"./_root":256}],139:[function(require,module,exports){
var mapCacheClear = require('./_mapCacheClear'),
mapCacheDelete = require('./_mapCacheDelete'),
mapCacheGet = require('./_mapCacheGet'),
mapCacheHas = require('./_mapCacheHas'),
mapCacheSet = require('./_mapCacheSet');
/**
* Creates a map cache object to store key-value pairs.
*
* @private
* @constructor
* @param {Array} [entries] The key-value pairs to cache.
*/
function MapCache(entries) {
var index = -1,
length = entries ? entries.length : 0;
this.clear();
while (++index < length) {
var entry = entries[index];
this.set(entry[0], entry[1]);
}
}
// Add methods to `MapCache`.
MapCache.prototype.clear = mapCacheClear;
MapCache.prototype['delete'] = mapCacheDelete;
MapCache.prototype.get = mapCacheGet;
MapCache.prototype.has = mapCacheHas;
MapCache.prototype.set = mapCacheSet;
module.exports = MapCache;
},{"./_mapCacheClear":248,"./_mapCacheDelete":249,"./_mapCacheGet":250,"./_mapCacheHas":251,"./_mapCacheSet":252}],140:[function(require,module,exports){
var getNative = require('./_getNative'),
root = require('./_root');
/* Built-in method references that are verified to be native. */
var Promise = getNative(root, 'Promise');
module.exports = Promise;
},{"./_getNative":216,"./_root":256}],141:[function(require,module,exports){
var root = require('./_root');
/** Built-in value references. */
var Reflect = root.Reflect;
module.exports = Reflect;
},{"./_root":256}],142:[function(require,module,exports){
var getNative = require('./_getNative'),
root = require('./_root');
/* Built-in method references that are verified to be native. */
var Set = getNative(root, 'Set');
module.exports = Set;
},{"./_getNative":216,"./_root":256}],143:[function(require,module,exports){
var MapCache = require('./_MapCache'),
setCacheAdd = require('./_setCacheAdd'),
setCacheHas = require('./_setCacheHas');
/**
*
* Creates an array cache object to store unique values.
*
* @private
* @constructor
* @param {Array} [values] The values to cache.
*/
function SetCache(values) {
var index = -1,
length = values ? values.length : 0;
this.__data__ = new MapCache;
while (++index < length) {
this.add(values[index]);
}
}
// Add methods to `SetCache`.
SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;
SetCache.prototype.has = setCacheHas;
module.exports = SetCache;
},{"./_MapCache":139,"./_setCacheAdd":257,"./_setCacheHas":258}],144:[function(require,module,exports){
var ListCache = require('./_ListCache'),
stackClear = require('./_stackClear'),
stackDelete = require('./_stackDelete'),
stackGet = require('./_stackGet'),
stackHas = require('./_stackHas'),
stackSet = require('./_stackSet');
/**
* Creates a stack cache object to store key-value pairs.
*
* @private
* @constructor
* @param {Array} [entries] The key-value pairs to cache.
*/
function Stack(entries) {
this.__data__ = new ListCache(entries);
}
// Add methods to `Stack`.
Stack.prototype.clear = stackClear;
Stack.prototype['delete'] = stackDelete;
Stack.prototype.get = stackGet;
Stack.prototype.has = stackHas;
Stack.prototype.set = stackSet;
module.exports = Stack;
},{"./_ListCache":137,"./_stackClear":260,"./_stackDelete":261,"./_stackGet":262,"./_stackHas":263,"./_stackSet":264}],145:[function(require,module,exports){
var root = require('./_root');
/** Built-in value references. */
var Symbol = root.Symbol;
module.exports = Symbol;
},{"./_root":256}],146:[function(require,module,exports){
var root = require('./_root');
/** Built-in value references. */
var Uint8Array = root.Uint8Array;
module.exports = Uint8Array;
},{"./_root":256}],147:[function(require,module,exports){
var getNative = require('./_getNative'),
root = require('./_root');
/* Built-in method references that are verified to be native. */
var WeakMap = getNative(root, 'WeakMap');
module.exports = WeakMap;
},{"./_getNative":216,"./_root":256}],148:[function(require,module,exports){
/**
* Adds the key-value `pair` to `map`.
*
* @private
* @param {Object} map The map to modify.
* @param {Array} pair The key-value pair to add.
* @returns {Object} Returns `map`.
*/
function addMapEntry(map, pair) {
// Don't return `Map#set` because it doesn't return the map instance in IE 11.
map.set(pair[0], pair[1]);
return map;
}
module.exports = addMapEntry;
},{}],149:[function(require,module,exports){
/**
* Adds `value` to `set`.
*
* @private
* @param {Object} set The set to modify.
* @param {*} value The value to add.
* @returns {Object} Returns `set`.
*/
function addSetEntry(set, value) {
set.add(value);
return set;
}
module.exports = addSetEntry;
},{}],150:[function(require,module,exports){
/**
* A faster alternative to `Function#apply`, this function invokes `func`
* with the `this` binding of `thisArg` and the arguments of `args`.
*
* @private
* @param {Function} func The function to invoke.
* @param {*} thisArg The `this` binding of `func`.
* @param {Array} args The arguments to invoke `func` with.
* @returns {*} Returns the result of `func`.
*/
function apply(func, thisArg, args) {
var length = args.length;
switch (length) {
case 0: return func.call(thisArg);
case 1: return func.call(thisArg, args[0]);
case 2: return func.call(thisArg, args[0], args[1]);
case 3: return func.call(thisArg, args[0], args[1], args[2]);
}
return func.apply(thisArg, args);
}
module.exports = apply;
},{}],151:[function(require,module,exports){
/**
* A specialized version of `_.forEach` for arrays without support for
* iteratee shorthands.
*
* @private
* @param {Array} [array] The array to iterate over.
* @param {Function} iteratee The function invoked per iteration.
* @returns {Array} Returns `array`.
*/
function arrayEach(array, iteratee) {
var index = -1,
length = array ? array.length : 0;
while (++index < length) {
if (iteratee(array[index], index, array) === false) {
break;
}
}
return array;
}
module.exports = arrayEach;
},{}],152:[function(require,module,exports){
var baseIndexOf = require('./_baseIndexOf');
/**
* A specialized version of `_.includes` for arrays without support for
* specifying an index to search from.
*
* @private
* @param {Array} [array] The array to search.
* @param {*} target The value to search for.
* @returns {boolean} Returns `true` if `target` is found, else `false`.
*/
function arrayIncludes(array, value) {
var length = array ? array.length : 0;
return !!length && baseIndexOf(array, value, 0) > -1;
}
module.exports = arrayIncludes;
},{"./_baseIndexOf":173}],153:[function(require,module,exports){
/**
* This function is like `arrayIncludes` except that it accepts a comparator.
*
* @private
* @param {Array} [array] The array to search.
* @param {*} target The value to search for.
* @param {Function} comparator The comparator invoked per element.
* @returns {boolean} Returns `true` if `target` is found, else `false`.
*/
function arrayIncludesWith(array, value, comparator) {
var index = -1,
length = array ? array.length : 0;
while (++index < length) {
if (comparator(value, array[index])) {
return true;
}
}
return false;
}
module.exports = arrayIncludesWith;
},{}],154:[function(require,module,exports){
/**
* A specialized version of `_.map` for arrays without support for iteratee
* shorthands.
*
* @private
* @param {Array} [array] The array to iterate over.
* @param {Function} iteratee The function invoked per iteration.
* @returns {Array} Returns the new mapped array.
*/
function arrayMap(array, iteratee) {
var index = -1,
length = array ? array.length : 0,
result = Array(length);
while (++index < length) {
result[index] = iteratee(array[index], index, array);
}
return result;
}
module.exports = arrayMap;
},{}],155:[function(require,module,exports){
/**
* Appends the elements of `values` to `array`.
*
* @private
* @param {Array} array The array to modify.
* @param {Array} values The values to append.
* @returns {Array} Returns `array`.
*/
function arrayPush(array, values) {
var index = -1,
length = values.length,
offset = array.length;
while (++index < length) {
array[offset + index] = values[index];
}
return array;
}
module.exports = arrayPush;
},{}],156:[function(require,module,exports){
/**
* A specialized version of `_.reduce` for arrays without support for
* iteratee shorthands.
*
* @private
* @param {Array} [array] The array to iterate over.
* @param {Function} iteratee The function invoked per iteration.
* @param {*} [accumulator] The initial value.
* @param {boolean} [initAccum] Specify using the first element of `array` as
* the initial value.
* @returns {*} Returns the accumulated value.
*/
function arrayReduce(array, iteratee, accumulator, initAccum) {
var index = -1,
length = array ? array.length : 0;
if (initAccum && length) {
accumulator = array[++index];
}
while (++index < length) {
accumulator = iteratee(accumulator, array[index], index, array);
}
return accumulator;
}
module.exports = arrayReduce;
},{}],157:[function(require,module,exports){
/**
* A specialized version of `_.some` for arrays without support for iteratee
* shorthands.
*
* @private
* @param {Array} [array] The array to iterate over.
* @param {Function} predicate The function invoked per iteration.
* @returns {boolean} Returns `true` if any element passes the predicate check,
* else `false`.
*/
function arraySome(array, predicate) {
var index = -1,
length = array ? array.length : 0;
while (++index < length) {
if (predicate(array[index], index, array)) {
return true;
}
}
return false;
}
module.exports = arraySome;
},{}],158:[function(require,module,exports){
var eq = require('./eq');
/** Used for built-in method references. */
var objectProto = Object.prototype;
/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;
/**
* Used by `_.defaults` to customize its `_.assignIn` use.
*
* @private
* @param {*} objValue The destination value.
* @param {*} srcValue The source value.
* @param {string} key The key of the property to assign.
* @param {Object} object The parent object of `objValue`.
* @returns {*} Returns the value to assign.
*/
function assignInDefaults(objValue, srcValue, key, object) {
if (objValue === undefined ||
(eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) {
return srcValue;
}
return objValue;
}
module.exports = assignInDefaults;
},{"./eq":273}],159:[function(require,module,exports){
var eq = require('./eq');
/** Used for built-in method references. */
var objectProto = Object.prototype;
/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;
/**
* Assigns `value` to `key` of `object` if the existing value is not equivalent
* using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
* for equality comparisons.
*
* @private
* @param {Object} object The object to modify.
* @param {string} key The key of the property to assign.
* @param {*} value The value to assign.
*/
function assignValue(object, key, value) {
var objValue = object[key];
if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||
(value === undefined && !(key in object))) {
object[key] = value;
}
}
module.exports = assignValue;
},{"./eq":273}],160:[function(require,module,exports){
var eq = require('./eq');
/**
* Gets the index at which the `key` is found in `array` of key-value pairs.
*
* @private
* @param {Array} array The array to search.
* @param {*} key The key to search for.
* @returns {number} Returns the index of the matched value, else `-1`.
*/
function assocIndexOf(array, key) {
var length = array.length;
while (length--) {
if (eq(array[length][0], key)) {
return length;
}
}
return -1;
}
module.exports = assocIndexOf;
},{"./eq":273}],161:[function(require,module,exports){
var copyObject = require('./_copyObject'),
keys = require('./keys');
/**
* The base implementation of `_.assign` without support for multiple sources
* or `customizer` functions.
*
* @private
* @param {Object} object The destination object.
* @param {Object} source The source object.
* @returns {Object} Returns `object`.
*/
function baseAssign(object, source) {
return object && copyObject(source, keys(source), object);
}
module.exports = baseAssign;
},{"./_copyObject":202,"./keys":291}],162:[function(require,module,exports){
var Stack = require('./_Stack'),
arrayEach = require('./_arrayEach'),
assignValue = require('./_assignValue'),
baseAssign = require('./_baseAssign'),
cloneBuffer = require('./_cloneBuffer'),
copyArray = require('./_copyArray'),
copySymbols = require('./_copySymbols'),
getAllKeys = require('./_getAllKeys'),
getTag = require('./_getTag'),
initCloneArray = require('./_initCloneArray'),
initCloneByTag = require('./_initCloneByTag'),
initCloneObject = require('./_initCloneObject'),
isArray = require('./isArray'),
isBuffer = require('./isBuffer'),
isHostObject = require('./_isHostObject'),
isObject = require('./isObject'),
keys = require('./keys');
/** `Object#toString` result references. */
var argsTag = '[object Arguments]',
arrayTag = '[object Array]',
boolTag = '[object Boolean]',
dateTag = '[object Date]',
errorTag = '[object Error]',
funcTag = '[object Function]',
genTag = '[object GeneratorFunction]',
mapTag = '[object Map]',
numberTag = '[object Number]',
objectTag = '[object Object]',
regexpTag = '[object RegExp]',
setTag = '[object Set]',
stringTag = '[object String]',
symbolTag = '[object Symbol]',
weakMapTag = '[object WeakMap]';
var arrayBufferTag = '[object ArrayBuffer]',
dataViewTag = '[object DataView]',
float32Tag = '[object Float32Array]',
float64Tag = '[object Float64Array]',
int8Tag = '[object Int8Array]',
int16Tag = '[object Int16Array]',
int32Tag = '[object Int32Array]',
uint8Tag = '[object Uint8Array]',
uint8ClampedTag = '[object Uint8ClampedArray]',
uint16Tag = '[object Uint16Array]',
uint32Tag = '[object Uint32Array]';
/** Used to identify `toStringTag` values supported by `_.clone`. */
var cloneableTags = {};
cloneableTags[argsTag] = cloneableTags[arrayTag] =
cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =
cloneableTags[boolTag] = cloneableTags[dateTag] =
cloneableTags[float32Tag] = cloneableTags[float64Tag] =
cloneableTags[int8Tag] = cloneableTags[int16Tag] =
cloneableTags[int32Tag] = cloneableTags[mapTag] =
cloneableTags[numberTag] = cloneableTags[objectTag] =
cloneableTags[regexpTag] = cloneableTags[setTag] =
cloneableTags[stringTag] = cloneableTags[symbolTag] =
cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =
cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;
cloneableTags[errorTag] = cloneableTags[funcTag] =
cloneableTags[weakMapTag] = false;
/**
* The base implementation of `_.clone` and `_.cloneDeep` which tracks
* traversed objects.
*
* @private
* @param {*} value The value to clone.
* @param {boolean} [isDeep] Specify a deep clone.
* @param {boolean} [isFull] Specify a clone including symbols.
* @param {Function} [customizer] The function to customize cloning.
* @param {string} [key] The key of `value`.
* @param {Object} [object] The parent object of `value`.
* @param {Object} [stack] Tracks traversed objects and their clone counterparts.
* @returns {*} Returns the cloned value.
*/
function baseClone(value, isDeep, isFull, customizer, key, object, stack) {
var result;
if (customizer) {
result = object ? customizer(value, key, object, stack) : customizer(value);
}
if (result !== undefined) {
return result;
}
if (!isObject(value)) {
return value;
}
var isArr = isArray(value);
if (isArr) {
result = initCloneArray(value);
if (!isDeep) {
return copyArray(value, result);
}
} else {
var tag = getTag(value),
isFunc = tag == funcTag || tag == genTag;
if (isBuffer(value)) {
return cloneBuffer(value, isDeep);
}
if (tag == objectTag || tag == argsTag || (isFunc && !object)) {
if (isHostObject(value)) {
return object ? value : {};
}
result = initCloneObject(isFunc ? {} : value);
if (!isDeep) {
return copySymbols(value, baseAssign(result, value));
}
} else {
if (!cloneableTags[tag]) {
return object ? value : {};
}
result = initCloneByTag(value, tag, baseClone, isDeep);
}
}
// Check for circular references and return its corresponding clone.
stack || (stack = new Stack);
var stacked = stack.get(value);
if (stacked) {
return stacked;
}
stack.set(value, result);
if (!isArr) {
var props = isFull ? getAllKeys(value) : keys(value);
}
// Recursively populate clone (susceptible to call stack limits).
arrayEach(props || value, function(subValue, key) {
if (props) {
key = subValue;
subValue = value[key];
}
assignValue(result, key, baseClone(subValue, isDeep, isFull, customizer, key, value, stack));
});
return result;
}
module.exports = baseClone;
},{"./_Stack":144,"./_arrayEach":151,"./_assignValue":159,"./_baseAssign":161,"./_cloneBuffer":194,"./_copyArray":201,"./_copySymbols":203,"./_getAllKeys":211,"./_getTag":220,"./_initCloneArray":230,"./_initCloneByTag":231,"./_initCloneObject":232,"./_isHostObject":234,"./isArray":279,"./isBuffer":282,"./isObject":285,"./keys":291}],163:[function(require,module,exports){
var isObject = require('./isObject');
/** Built-in value references. */
var objectCreate = Object.create;
/**
* The base implementation of `_.create` without support for assigning
* properties to the created object.
*
* @private
* @param {Object} prototype The object to inherit from.
* @returns {Object} Returns the new object.
*/
function baseCreate(proto) {
return isObject(proto) ? objectCreate(proto) : {};
}
module.exports = baseCreate;
},{"./isObject":285}],164:[function(require,module,exports){
var SetCache = require('./_SetCache'),
arrayIncludes = require('./_arrayIncludes'),
arrayIncludesWith = require('./_arrayIncludesWith'),
arrayMap = require('./_arrayMap'),
baseUnary = require('./_baseUnary'),
cacheHas = require('./_cacheHas');
/** Used as the size to enable large array optimizations. */
var LARGE_ARRAY_SIZE = 200;
/**
* The base implementation of methods like `_.difference` without support
* for excluding multiple arrays or iteratee shorthands.
*
* @private
* @param {Array} array The array to inspect.
* @param {Array} values The values to exclude.
* @param {Function} [iteratee] The iteratee invoked per element.
* @param {Function} [comparator] The comparator invoked per element.
* @returns {Array} Returns the new array of filtered values.
*/
function baseDifference(array, values, iteratee, comparator) {
var index = -1,
includes = arrayIncludes,
isCommon = true,
length = array.length,
result = [],
valuesLength = values.length;
if (!length) {
return result;
}
if (iteratee) {
values = arrayMap(values, baseUnary(iteratee));
}
if (comparator) {
includes = arrayIncludesWith;
isCommon = false;
}
else if (values.length >= LARGE_ARRAY_SIZE) {
includes = cacheHas;
isCommon = false;
values = new SetCache(values);
}
outer:
while (++index < length) {
var value = array[index],
computed = iteratee ? iteratee(value) : value;
value = (comparator || value !== 0) ? value : 0;
if (isCommon && computed === computed) {
var valuesIndex = valuesLength;
while (valuesIndex--) {
if (values[valuesIndex] === computed) {
continue outer;
}
}
result.push(value);
}
else if (!includes(values, computed, comparator)) {
result.push(value);
}
}
return result;
}
module.exports = baseDifference;
},{"./_SetCache":143,"./_arrayIncludes":152,"./_arrayIncludesWith":153,"./_arrayMap":154,"./_baseUnary":189,"./_cacheHas":190}],165:[function(require,module,exports){
var baseForOwn = require('./_baseForOwn'),
createBaseEach = require('./_createBaseEach');
/**
* The base implementation of `_.forEach` without support for iteratee shorthands.
*
* @private
* @param {Array|Object} collection The collection to iterate over.
* @param {Function} iteratee The function invoked per iteration.
* @returns {Array|Object} Returns `collection`.
*/
var baseEach = createBaseEach(baseForOwn);
module.exports = baseEach;
},{"./_baseForOwn":168,"./_createBaseEach":206}],166:[function(require,module,exports){
var arrayPush = require('./_arrayPush'),
isFlattenable = require('./_isFlattenable');
/**
* The base implementation of `_.flatten` with support for restricting flattening.
*
* @private
* @param {Array} array The array to flatten.
* @param {number} depth The maximum recursion depth.
* @param {boolean} [predicate=isFlattenable] The function invoked per iteration.
* @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.
* @param {Array} [result=[]] The initial result value.
* @returns {Array} Returns the new flattened array.
*/
function baseFlatten(array, depth, predicate, isStrict, result) {
var index = -1,
length = array.length;
predicate || (predicate = isFlattenable);
result || (result = []);
while (++index < length) {
var value = array[index];
if (depth > 0 && predicate(value)) {
if (depth > 1) {
// Recursively flatten arrays (susceptible to call stack limits).
baseFlatten(value, depth - 1, predicate, isStrict, result);
} else {
arrayPush(result, value);
}
} else if (!isStrict) {
result[result.length] = value;
}
}
return result;
}
module.exports = baseFlatten;
},{"./_arrayPush":155,"./_isFlattenable":233}],167:[function(require,module,exports){
var createBaseFor = require('./_createBaseFor');
/**
* The base implementation of `baseForOwn` which iterates over `object`
* properties returned by `keysFunc` and invokes `iteratee` for each property.
* Iteratee functions may exit iteration early by explicitly returning `false`.
*
* @private
* @param {Object} object The object to iterate over.
* @param {Function} iteratee The function invoked per iteration.
* @param {Function} keysFunc The function to get the keys of `object`.
* @returns {Object} Returns `object`.
*/
var baseFor = createBaseFor();
module.exports = baseFor;
},{"./_createBaseFor":207}],168:[function(require,module,exports){
var baseFor = require('./_baseFor'),
keys = require('./keys');
/**
* The base implementation of `_.forOwn` without support for iteratee shorthands.
*
* @private
* @param {Object} object The object to iterate over.
* @param {Function} iteratee The function invoked per iteration.
* @returns {Object} Returns `object`.
*/
function baseForOwn(object, iteratee) {
return object && baseFor(object, iteratee, keys);
}
module.exports = baseForOwn;
},{"./_baseFor":167,"./keys":291}],169:[function(require,module,exports){
var castPath = require('./_castPath'),
isKey = require('./_isKey'),
toKey = require('./_toKey');
/**
* The base implementation of `_.get` without support for default values.
*
* @private
* @param {Object} object The object to query.
* @param {Array|string} path The path of the property to get.
* @returns {*} Returns the resolved value.
*/
function baseGet(object, path) {
path = isKey(path, object) ? [path] : castPath(path);
var index = 0,
length = path.length;
while (object != null && index < length) {
object = object[toKey(path[index++])];
}
return (index && index == length) ? object : undefined;
}
module.exports = baseGet;
},{"./_castPath":191,"./_isKey":237,"./_toKey":266}],170:[function(require,module,exports){
var arrayPush = require('./_arrayPush'),
isArray = require('./isArray');
/**
* The base implementation of `getAllKeys` and `getAllKeysIn` which uses
* `keysFunc` and `symbolsFunc` to get the enumerable property names and
* symbols of `object`.
*
* @private
* @param {Object} object The object to query.
* @param {Function} keysFunc The function to get the keys of `object`.
* @param {Function} symbolsFunc The function to get the symbols of `object`.
* @returns {Array} Returns the array of property names and symbols.
*/
function baseGetAllKeys(object, keysFunc, symbolsFunc) {
var result = keysFunc(object);
return isArray(object) ? result : arrayPush(result, symbolsFunc(object));
}
module.exports = baseGetAllKeys;
},{"./_arrayPush":155,"./isArray":279}],171:[function(require,module,exports){
var getPrototype = require('./_getPrototype');
/** Used for built-in method references. */
var objectProto = Object.prototype;
/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;
/**
* The base implementation of `_.has` without support for deep paths.
*
* @private
* @param {Object} [object] The object to query.
* @param {Array|string} key The key to check.
* @returns {boolean} Returns `true` if `key` exists, else `false`.
*/
function baseHas(object, key) {
// Avoid a bug in IE 10-11 where objects with a [[Prototype]] of `null`,
// that are composed entirely of index properties, return `false` for
// `hasOwnProperty` checks of them.
return object != null &&
(hasOwnProperty.call(object, key) ||
(typeof object == 'object' && key in object && getPrototype(object) === null));
}
module.exports = baseHas;
},{"./_getPrototype":217}],172:[function(require,module,exports){
/**
* The base implementation of `_.hasIn` without support for deep paths.
*
* @private
* @param {Object} [object] The object to query.
* @param {Array|string} key The key to check.
* @returns {boolean} Returns `true` if `key` exists, else `false`.
*/
function baseHasIn(object, key) {
return object != null && key in Object(object);
}
module.exports = baseHasIn;
},{}],173:[function(require,module,exports){
var indexOfNaN = require('./_indexOfNaN');
/**
* The base implementation of `_.indexOf` without `fromIndex` bounds checks.
*
* @private
* @param {Array} array The array to search.
* @param {*} value The value to search for.
* @param {number} fromIndex The index to search from.
* @returns {number} Returns the index of the matched value, else `-1`.
*/
function baseIndexOf(array, value, fromIndex) {
if (value !== value) {
return indexOfNaN(array, fromIndex);
}
var index = fromIndex - 1,
length = array.length;
while (++index < length) {
if (array[index] === value) {
return index;
}
}
return -1;
}
module.exports = baseIndexOf;
},{"./_indexOfNaN":229}],174:[function(require,module,exports){
var baseIsEqualDeep = require('./_baseIsEqualDeep'),
isObject = require('./isObject'),
isObjectLike = require('./isObjectLike');
/**
* The base implementation of `_.isEqual` which supports partial comparisons
* and tracks traversed objects.
*
* @private
* @param {*} value The value to compare.
* @param {*} other The other value to compare.
* @param {Function} [customizer] The function to customize comparisons.
* @param {boolean} [bitmask] The bitmask of comparison flags.
* The bitmask may be composed of the following flags:
* 1 - Unordered comparison
* 2 - Partial comparison
* @param {Object} [stack] Tracks traversed `value` and `other` objects.
* @returns {boolean} Returns `true` if the values are equivalent, else `false`.
*/
function baseIsEqual(value, other, customizer, bitmask, stack) {
if (value === other) {
return true;
}
if (value == null || other == null || (!isObject(value) && !isObjectLike(other))) {
return value !== value && other !== other;
}
return baseIsEqualDeep(value, other, baseIsEqual, customizer, bitmask, stack);
}
module.exports = baseIsEqual;
},{"./_baseIsEqualDeep":175,"./isObject":285,"./isObjectLike":286}],175:[function(require,module,exports){
var Stack = require('./_Stack'),
equalArrays = require('./_equalArrays'),
equalByTag = require('./_equalByTag'),
equalObjects = require('./_equalObjects'),
getTag = require('./_getTag'),
isArray = require('./isArray'),
isHostObject = require('./_isHostObject'),
isTypedArray = require('./isTypedArray');
/** Used to compose bitmasks for comparison styles. */
var PARTIAL_COMPARE_FLAG = 2;
/** `Object#toString` result references. */
var argsTag = '[object Arguments]',
arrayTag = '[object Array]',
objectTag = '[object Object]';
/** Used for built-in method references. */
var objectProto = Object.prototype;
/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;
/**
* A specialized version of `baseIsEqual` for arrays and objects which performs
* deep comparisons and tracks traversed objects enabling objects with circular
* references to be compared.
*
* @private
* @param {Object} object The object to compare.
* @param {Object} other The other object to compare.
* @param {Function} equalFunc The function to determine equivalents of values.
* @param {Function} [customizer] The function to customize comparisons.
* @param {number} [bitmask] The bitmask of comparison flags. See `baseIsEqual`
* for more details.
* @param {Object} [stack] Tracks traversed `object` and `other` objects.
* @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
*/
function baseIsEqualDeep(object, other, equalFunc, customizer, bitmask, stack) {
var objIsArr = isArray(object),
othIsArr = isArray(other),
objTag = arrayTag,
othTag = arrayTag;
if (!objIsArr) {
objTag = getTag(object);
objTag = objTag == argsTag ? objectTag : objTag;
}
if (!othIsArr) {
othTag = getTag(other);
othTag = othTag == argsTag ? objectTag : othTag;
}
var objIsObj = objTag == objectTag && !isHostObject(object),
othIsObj = othTag == objectTag && !isHostObject(other),
isSameTag = objTag == othTag;
if (isSameTag && !objIsObj) {
stack || (stack = new Stack);
return (objIsArr || isTypedArray(object))
? equalArrays(object, other, equalFunc, customizer, bitmask, stack)
: equalByTag(object, other, objTag, equalFunc, customizer, bitmask, stack);
}
if (!(bitmask & PARTIAL_COMPARE_FLAG)) {
var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),
othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');
if (objIsWrapped || othIsWrapped) {
var objUnwrapped = objIsWrapped ? object.value() : object,
othUnwrapped = othIsWrapped ? other.value() : other;
stack || (stack = new Stack);
return equalFunc(objUnwrapped, othUnwrapped, customizer, bitmask, stack);
}
}
if (!isSameTag) {
return false;
}
stack || (stack = new Stack);
return equalObjects(object, other, equalFunc, customizer, bitmask, stack);
}
module.exports = baseIsEqualDeep;
},{"./_Stack":144,"./_equalArrays":208,"./_equalByTag":209,"./_equalObjects":210,"./_getTag":220,"./_isHostObject":234,"./isArray":279,"./isTypedArray":290}],176:[function(require,module,exports){
var Stack = require('./_Stack'),
baseIsEqual = require('./_baseIsEqual');
/** Used to compose bitmasks for comparison styles. */
var UNORDERED_COMPARE_FLAG = 1,
PARTIAL_COMPARE_FLAG = 2;
/**
* The base implementation of `_.isMatch` without support for iteratee shorthands.
*
* @private
* @param {Object} object The object to inspect.
* @param {Object} source The object of property values to match.
* @param {Array} matchData The property names, values, and compare flags to match.
* @param {Function} [customizer] The function to customize comparisons.
* @returns {boolean} Returns `true` if `object` is a match, else `false`.
*/
function baseIsMatch(object, source, matchData, customizer) {
var index = matchData.length,
length = index,
noCustomizer = !customizer;
if (object == null) {
return !length;
}
object = Object(object);
while (index--) {
var data = matchData[index];
if ((noCustomizer && data[2])
? data[1] !== object[data[0]]
: !(data[0] in object)
) {
return false;
}
}
while (++index < length) {
data = matchData[index];
var key = data[0],
objValue = object[key],
srcValue = data[1];
if (noCustomizer && data[2]) {
if (objValue === undefined && !(key in object)) {
return false;
}
} else {
var stack = new Stack;
if (customizer) {
var result = customizer(objValue, srcValue, key, object, source, stack);
}
if (!(result === undefined
? baseIsEqual(srcValue, objValue, customizer, UNORDERED_COMPARE_FLAG | PARTIAL_COMPARE_FLAG, stack)
: result
)) {
return false;
}
}
}
return true;
}
module.exports = baseIsMatch;
},{"./_Stack":144,"./_baseIsEqual":174}],177:[function(require,module,exports){
var isFunction = require('./isFunction'),
isHostObject = require('./_isHostObject'),
isMasked = require('./_isMasked'),
isObject = require('./isObject'),
toSource = require('./_toSource');
/**
* Used to match `RegExp`
* [syntax characters](http://ecma-international.org/ecma-262/6.0/#sec-patterns).
*/
var reRegExpChar = /[\\^$.*+?()[\]{}|]/g;
/** Used to detect host constructors (Safari). */
var reIsHostCtor = /^\[object .+?Constructor\]$/;
/** Used for built-in method references. */
var objectProto = Object.prototype;
/** Used to resolve the decompiled source of functions. */
var funcToString = Function.prototype.toString;
/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;
/** Used to detect if a method is native. */
var reIsNative = RegExp('^' +
funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&')
.replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
);
/**
* The base implementation of `_.isNative` without bad shim checks.
*
* @private
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is a native function,
* else `false`.
*/
function baseIsNative(value) {
if (!isObject(value) || isMasked(value)) {
return false;
}
var pattern = (isFunction(value) || isHostObject(value)) ? reIsNative : reIsHostCtor;
return pattern.test(toSource(value));
}
module.exports = baseIsNative;
},{"./_isHostObject":234,"./_isMasked":239,"./_toSource":267,"./isFunction":283,"./isObject":285}],178:[function(require,module,exports){
var baseMatches = require('./_baseMatches'),
baseMatchesProperty = require('./_baseMatchesProperty'),
identity = require('./identity'),
isArray = require('./isArray'),
property = require('./property');
/**
* The base implementation of `_.iteratee`.
*
* @private
* @param {*} [value=_.identity] The value to convert to an iteratee.
* @returns {Function} Returns the iteratee.
*/
function baseIteratee(value) {
// Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.
// See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.
if (typeof value == 'function') {
return value;
}
if (value == null) {
return identity;
}
if (typeof value == 'object') {
return isArray(value)
? baseMatchesProperty(value[0], value[1])
: baseMatches(value);
}
return property(value);
}
module.exports = baseIteratee;
},{"./_baseMatches":181,"./_baseMatchesProperty":182,"./identity":277,"./isArray":279,"./property":295}],179:[function(require,module,exports){
/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeKeys = Object.keys;
/**
* The base implementation of `_.keys` which doesn't skip the constructor
* property of prototypes or treat sparse arrays as dense.
*
* @private
* @param {Object} object The object to query.
* @returns {Array} Returns the array of property names.
*/
function baseKeys(object) {
return nativeKeys(Object(object));
}
module.exports = baseKeys;
},{}],180:[function(require,module,exports){
var Reflect = require('./_Reflect'),
iteratorToArray = require('./_iteratorToArray');
/** Used for built-in method references. */
var objectProto = Object.prototype;
/** Built-in value references. */
var enumerate = Reflect ? Reflect.enumerate : undefined,
propertyIsEnumerable = objectProto.propertyIsEnumerable;
/**
* The base implementation of `_.keysIn` which doesn't skip the constructor
* property of prototypes or treat sparse arrays as dense.
*
* @private
* @param {Object} object The object to query.
* @returns {Array} Returns the array of property names.
*/
function baseKeysIn(object) {
object = object == null ? object : Object(object);
var result = [];
for (var key in object) {
result.push(key);
}
return result;
}
// Fallback for IE < 9 with es6-shim.
if (enumerate && !propertyIsEnumerable.call({ 'valueOf': 1 }, 'valueOf')) {
baseKeysIn = function(object) {
return iteratorToArray(enumerate(object));
};
}
module.exports = baseKeysIn;
},{"./_Reflect":141,"./_iteratorToArray":242}],181:[function(require,module,exports){
var baseIsMatch = require('./_baseIsMatch'),
getMatchData = require('./_getMatchData'),
matchesStrictComparable = require('./_matchesStrictComparable');
/**
* The base implementation of `_.matches` which doesn't clone `source`.
*
* @private
* @param {Object} source The object of property values to match.
* @returns {Function} Returns the new spec function.
*/
function baseMatches(source) {
var matchData = getMatchData(source);
if (matchData.length == 1 && matchData[0][2]) {
return matchesStrictComparable(matchData[0][0], matchData[0][1]);
}
return function(object) {
return object === source || baseIsMatch(object, source, matchData);
};
}
module.exports = baseMatches;
},{"./_baseIsMatch":176,"./_getMatchData":215,"./_matchesStrictComparable":254}],182:[function(require,module,exports){
var baseIsEqual = require('./_baseIsEqual'),
get = require('./get'),
hasIn = require('./hasIn'),
isKey = require('./_isKey'),
isStrictComparable = require('./_isStrictComparable'),
matchesStrictComparable = require('./_matchesStrictComparable'),
toKey = require('./_toKey');
/** Used to compose bitmasks for comparison styles. */
var UNORDERED_COMPARE_FLAG = 1,
PARTIAL_COMPARE_FLAG = 2;
/**
* The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.
*
* @private
* @param {string} path The path of the property to get.
* @param {*} srcValue The value to match.
* @returns {Function} Returns the new spec function.
*/
function baseMatchesProperty(path, srcValue) {
if (isKey(path) && isStrictComparable(srcValue)) {
return matchesStrictComparable(toKey(path), srcValue);
}
return function(object) {
var objValue = get(object, path);
return (objValue === undefined && objValue === srcValue)
? hasIn(object, path)
: baseIsEqual(srcValue, objValue, undefined, UNORDERED_COMPARE_FLAG | PARTIAL_COMPARE_FLAG);
};
}
module.exports = baseMatchesProperty;
},{"./_baseIsEqual":174,"./_isKey":237,"./_isStrictComparable":241,"./_matchesStrictComparable":254,"./_toKey":266,"./get":275,"./hasIn":276}],183:[function(require,module,exports){
var arrayReduce = require('./_arrayReduce');
/**
* The base implementation of `_.pick` without support for individual
* property identifiers.
*
* @private
* @param {Object} object The source object.
* @param {string[]} props The property identifiers to pick.
* @returns {Object} Returns the new object.
*/
function basePick(object, props) {
object = Object(object);
return arrayReduce(props, function(result, key) {
if (key in object) {
result[key] = object[key];
}
return result;
}, {});
}
module.exports = basePick;
},{"./_arrayReduce":156}],184:[function(require,module,exports){
/**
* The base implementation of `_.property` without support for deep paths.
*
* @private
* @param {string} key The key of the property to get.
* @returns {Function} Returns the new accessor function.
*/
function baseProperty(key) {
return function(object) {
return object == null ? undefined : object[key];
};
}
module.exports = baseProperty;
},{}],185:[function(require,module,exports){
var baseGet = require('./_baseGet');
/**
* A specialized version of `baseProperty` which supports deep paths.
*
* @private
* @param {Array|string} path The path of the property to get.
* @returns {Function} Returns the new accessor function.
*/
function basePropertyDeep(path) {
return function(object) {
return baseGet(object, path);
};
}
module.exports = basePropertyDeep;
},{"./_baseGet":169}],186:[function(require,module,exports){
/**
* The base implementation of `_.reduce` and `_.reduceRight`, without support
* for iteratee shorthands, which iterates over `collection` using `eachFunc`.
*
* @private
* @param {Array|Object} collection The collection to iterate over.
* @param {Function} iteratee The function invoked per iteration.
* @param {*} accumulator The initial value.
* @param {boolean} initAccum Specify using the first or last element of
* `collection` as the initial value.
* @param {Function} eachFunc The function to iterate over `collection`.
* @returns {*} Returns the accumulated value.
*/
function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {
eachFunc(collection, function(value, index, collection) {
accumulator = initAccum
? (initAccum = false, value)
: iteratee(accumulator, value, index, collection);
});
return accumulator;
}
module.exports = baseReduce;
},{}],187:[function(require,module,exports){
/**
* The base implementation of `_.times` without support for iteratee shorthands
* or max array length checks.
*
* @private
* @param {number} n The number of times to invoke `iteratee`.
* @param {Function} iteratee The function invoked per iteration.
* @returns {Array} Returns the array of results.
*/
function baseTimes(n, iteratee) {
var index = -1,
result = Array(n);
while (++index < n) {
result[index] = iteratee(index);
}
return result;
}
module.exports = baseTimes;
},{}],188:[function(require,module,exports){
var Symbol = require('./_Symbol'),
isSymbol = require('./isSymbol');
/** Used as references for various `Number` constants. */
var INFINITY = 1 / 0;
/** Used to convert symbols to primitives and strings. */
var symbolProto = Symbol ? Symbol.prototype : undefined,
symbolToString = symbolProto ? symbolProto.toString : undefined;
/**
* The base implementation of `_.toString` which doesn't convert nullish
* values to empty strings.
*
* @private
* @param {*} value The value to process.
* @returns {string} Returns the string.
*/
function baseToString(value) {
// Exit early for strings to avoid a performance hit in some environments.
if (typeof value == 'string') {
return value;
}
if (isSymbol(value)) {
return symbolToString ? symbolToString.call(value) : '';
}
var result = (value + '');
return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
}
module.exports = baseToString;
},{"./_Symbol":145,"./isSymbol":289}],189:[function(require,module,exports){
/**
* The base implementation of `_.unary` without support for storing wrapper metadata.
*
* @private
* @param {Function} func The function to cap arguments for.
* @returns {Function} Returns the new capped function.
*/
function baseUnary(func) {
return function(value) {
return func(value);
};
}
module.exports = baseUnary;
},{}],190:[function(require,module,exports){
/**
* Checks if a cache value for `key` exists.
*
* @private
* @param {Object} cache The cache to query.
* @param {string} key The key of the entry to check.
* @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
*/
function cacheHas(cache, key) {
return cache.has(key);
}
module.exports = cacheHas;
},{}],191:[function(require,module,exports){
var isArray = require('./isArray'),
stringToPath = require('./_stringToPath');
/**
* Casts `value` to a path array if it's not one.
*
* @private
* @param {*} value The value to inspect.
* @returns {Array} Returns the cast property path array.
*/
function castPath(value) {
return isArray(value) ? value : stringToPath(value);
}
module.exports = castPath;
},{"./_stringToPath":265,"./isArray":279}],192:[function(require,module,exports){
/**
* Checks if `value` is a global object.
*
* @private
* @param {*} value The value to check.
* @returns {null|Object} Returns `value` if it's a global object, else `null`.
*/
function checkGlobal(value) {
return (value && value.Object === Object) ? value : null;
}
module.exports = checkGlobal;
},{}],193:[function(require,module,exports){
var Uint8Array = require('./_Uint8Array');
/**
* Creates a clone of `arrayBuffer`.
*
* @private
* @param {ArrayBuffer} arrayBuffer The array buffer to clone.
* @returns {ArrayBuffer} Returns the cloned array buffer.
*/
function cloneArrayBuffer(arrayBuffer) {
var result = new arrayBuffer.constructor(arrayBuffer.byteLength);
new Uint8Array(result).set(new Uint8Array(arrayBuffer));
return result;
}
module.exports = cloneArrayBuffer;
},{"./_Uint8Array":146}],194:[function(require,module,exports){
/**
* Creates a clone of `buffer`.
*
* @private
* @param {Buffer} buffer The buffer to clone.
* @param {boolean} [isDeep] Specify a deep clone.
* @returns {Buffer} Returns the cloned buffer.
*/
function cloneBuffer(buffer, isDeep) {
if (isDeep) {
return buffer.slice();
}
var result = new buffer.constructor(buffer.length);
buffer.copy(result);
return result;
}
module.exports = cloneBuffer;
},{}],195:[function(require,module,exports){
var cloneArrayBuffer = require('./_cloneArrayBuffer');
/**
* Creates a clone of `dataView`.
*
* @private
* @param {Object} dataView The data view to clone.
* @param {boolean} [isDeep] Specify a deep clone.
* @returns {Object} Returns the cloned data view.
*/
function cloneDataView(dataView, isDeep) {
var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;
return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);
}
module.exports = cloneDataView;
},{"./_cloneArrayBuffer":193}],196:[function(require,module,exports){
var addMapEntry = require('./_addMapEntry'),
arrayReduce = require('./_arrayReduce'),
mapToArray = require('./_mapToArray');
/**
* Creates a clone of `map`.
*
* @private
* @param {Object} map The map to clone.
* @param {Function} cloneFunc The function to clone values.
* @param {boolean} [isDeep] Specify a deep clone.
* @returns {Object} Returns the cloned map.
*/
function cloneMap(map, isDeep, cloneFunc) {
var array = isDeep ? cloneFunc(mapToArray(map), true) : mapToArray(map);
return arrayReduce(array, addMapEntry, new map.constructor);
}
module.exports = cloneMap;
},{"./_addMapEntry":148,"./_arrayReduce":156,"./_mapToArray":253}],197:[function(require,module,exports){
/** Used to match `RegExp` flags from their coerced string values. */
var reFlags = /\w*$/;
/**
* Creates a clone of `regexp`.
*
* @private
* @param {Object} regexp The regexp to clone.
* @returns {Object} Returns the cloned regexp.
*/
function cloneRegExp(regexp) {
var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));
result.lastIndex = regexp.lastIndex;
return result;
}
module.exports = cloneRegExp;
},{}],198:[function(require,module,exports){
var addSetEntry = require('./_addSetEntry'),
arrayReduce = require('./_arrayReduce'),
setToArray = require('./_setToArray');
/**
* Creates a clone of `set`.
*
* @private
* @param {Object} set The set to clone.
* @param {Function} cloneFunc The function to clone values.
* @param {boolean} [isDeep] Specify a deep clone.
* @returns {Object} Returns the cloned set.
*/
function cloneSet(set, isDeep, cloneFunc) {
var array = isDeep ? cloneFunc(setToArray(set), true) : setToArray(set);
return arrayReduce(array, addSetEntry, new set.constructor);
}
module.exports = cloneSet;
},{"./_addSetEntry":149,"./_arrayReduce":156,"./_setToArray":259}],199:[function(require,module,exports){
var Symbol = require('./_Symbol');
/** Used to convert symbols to primitives and strings. */
var symbolProto = Symbol ? Symbol.prototype : undefined,
symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;
/**
* Creates a clone of the `symbol` object.
*
* @private
* @param {Object} symbol The symbol object to clone.
* @returns {Object} Returns the cloned symbol object.
*/
function cloneSymbol(symbol) {
return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};
}
module.exports = cloneSymbol;
},{"./_Symbol":145}],200:[function(require,module,exports){
var cloneArrayBuffer = require('./_cloneArrayBuffer');
/**
* Creates a clone of `typedArray`.
*
* @private
* @param {Object} typedArray The typed array to clone.
* @param {boolean} [isDeep] Specify a deep clone.
* @returns {Object} Returns the cloned typed array.
*/
function cloneTypedArray(typedArray, isDeep) {
var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;
return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);
}
module.exports = cloneTypedArray;
},{"./_cloneArrayBuffer":193}],201:[function(require,module,exports){
/**
* Copies the values of `source` to `array`.
*
* @private
* @param {Array} source The array to copy values from.
* @param {Array} [array=[]] The array to copy values to.
* @returns {Array} Returns `array`.
*/
function copyArray(source, array) {
var index = -1,
length = source.length;
array || (array = Array(length));
while (++index < length) {
array[index] = source[index];
}
return array;
}
module.exports = copyArray;
},{}],202:[function(require,module,exports){
var assignValue = require('./_assignValue');
/**
* Copies properties of `source` to `object`.
*
* @private
* @param {Object} source The object to copy properties from.
* @param {Array} props The property identifiers to copy.
* @param {Object} [object={}] The object to copy properties to.
* @param {Function} [customizer] The function to customize copied values.
* @returns {Object} Returns `object`.
*/
function copyObject(source, props, object, customizer) {
object || (object = {});
var index = -1,
length = props.length;
while (++index < length) {
var key = props[index];
var newValue = customizer
? customizer(object[key], source[key], key, object, source)
: source[key];
assignValue(object, key, newValue);
}
return object;
}
module.exports = copyObject;
},{"./_assignValue":159}],203:[function(require,module,exports){
var copyObject = require('./_copyObject'),
getSymbols = require('./_getSymbols');
/**
* Copies own symbol properties of `source` to `object`.
*
* @private
* @param {Object} source The object to copy symbols from.
* @param {Object} [object={}] The object to copy symbols to.
* @returns {Object} Returns `object`.
*/
function copySymbols(source, object) {
return copyObject(source, getSymbols(source), object);
}
module.exports = copySymbols;
},{"./_copyObject":202,"./_getSymbols":218}],204:[function(require,module,exports){
var root = require('./_root');
/** Used to detect overreaching core-js shims. */
var coreJsData = root['__core-js_shared__'];
module.exports = coreJsData;
},{"./_root":256}],205:[function(require,module,exports){
var isIterateeCall = require('./_isIterateeCall'),
rest = require('./rest');
/**
* Creates a function like `_.assign`.
*
* @private
* @param {Function} assigner The function to assign values.
* @returns {Function} Returns the new assigner function.
*/
function createAssigner(assigner) {
return rest(function(object, sources) {
var index = -1,
length = sources.length,
customizer = length > 1 ? sources[length - 1] : undefined,
guard = length > 2 ? sources[2] : undefined;
customizer = (assigner.length > 3 && typeof customizer == 'function')
? (length--, customizer)
: undefined;
if (guard && isIterateeCall(sources[0], sources[1], guard)) {
customizer = length < 3 ? undefined : customizer;
length = 1;
}
object = Object(object);
while (++index < length) {
var source = sources[index];
if (source) {
assigner(object, source, index, customizer);
}
}
return object;
});
}
module.exports = createAssigner;
},{"./_isIterateeCall":236,"./rest":297}],206:[function(require,module,exports){
var isArrayLike = require('./isArrayLike');
/**
* Creates a `baseEach` or `baseEachRight` function.
*
* @private
* @param {Function} eachFunc The function to iterate over a collection.
* @param {boolean} [fromRight] Specify iterating from right to left.
* @returns {Function} Returns the new base function.
*/
function createBaseEach(eachFunc, fromRight) {
return function(collection, iteratee) {
if (collection == null) {
return collection;
}
if (!isArrayLike(collection)) {
return eachFunc(collection, iteratee);
}
var length = collection.length,
index = fromRight ? length : -1,
iterable = Object(collection);
while ((fromRight ? index-- : ++index < length)) {
if (iteratee(iterable[index], index, iterable) === false) {
break;
}
}
return collection;
};
}
module.exports = createBaseEach;
},{"./isArrayLike":280}],207:[function(require,module,exports){
/**
* Creates a base function for methods like `_.forIn` and `_.forOwn`.
*
* @private
* @param {boolean} [fromRight] Specify iterating from right to left.
* @returns {Function} Returns the new base function.
*/
function createBaseFor(fromRight) {
return function(object, iteratee, keysFunc) {
var index = -1,
iterable = Object(object),
props = keysFunc(object),
length = props.length;
while (length--) {
var key = props[fromRight ? length : ++index];
if (iteratee(iterable[key], key, iterable) === false) {
break;
}
}
return object;
};
}
module.exports = createBaseFor;
},{}],208:[function(require,module,exports){
var SetCache = require('./_SetCache'),
arraySome = require('./_arraySome');
/** Used to compose bitmasks for comparison styles. */
var UNORDERED_COMPARE_FLAG = 1,
PARTIAL_COMPARE_FLAG = 2;
/**
* A specialized version of `baseIsEqualDeep` for arrays with support for
* partial deep comparisons.
*
* @private
* @param {Array} array The array to compare.
* @param {Array} other The other array to compare.
* @param {Function} equalFunc The function to determine equivalents of values.
* @param {Function} customizer The function to customize comparisons.
* @param {number} bitmask The bitmask of comparison flags. See `baseIsEqual`
* for more details.
* @param {Object} stack Tracks traversed `array` and `other` objects.
* @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.
*/
function equalArrays(array, other, equalFunc, customizer, bitmask, stack) {
var isPartial = bitmask & PARTIAL_COMPARE_FLAG,
arrLength = array.length,
othLength = other.length;
if (arrLength != othLength && !(isPartial && othLength > arrLength)) {
return false;
}
// Assume cyclic values are equal.
var stacked = stack.get(array);
if (stacked) {
return stacked == other;
}
var index = -1,
result = true,
seen = (bitmask & UNORDERED_COMPARE_FLAG) ? new SetCache : undefined;
stack.set(array, other);
// Ignore non-index properties.
while (++index < arrLength) {
var arrValue = array[index],
othValue = other[index];
if (customizer) {
var compared = isPartial
? customizer(othValue, arrValue, index, other, array, stack)
: customizer(arrValue, othValue, index, array, other, stack);
}
if (compared !== undefined) {
if (compared) {
continue;
}
result = false;
break;
}
// Recursively compare arrays (susceptible to call stack limits).
if (seen) {
if (!arraySome(other, function(othValue, othIndex) {
if (!seen.has(othIndex) &&
(arrValue === othValue || equalFunc(arrValue, othValue, customizer, bitmask, stack))) {
return seen.add(othIndex);
}
})) {
result = false;
break;
}
} else if (!(
arrValue === othValue ||
equalFunc(arrValue, othValue, customizer, bitmask, stack)
)) {
result = false;
break;
}
}
stack['delete'](array);
return result;
}
module.exports = equalArrays;
},{"./_SetCache":143,"./_arraySome":157}],209:[function(require,module,exports){
var Symbol = require('./_Symbol'),
Uint8Array = require('./_Uint8Array'),
equalArrays = require('./_equalArrays'),
mapToArray = require('./_mapToArray'),
setToArray = require('./_setToArray');
/** Used to compose bitmasks for comparison styles. */
var UNORDERED_COMPARE_FLAG = 1,
PARTIAL_COMPARE_FLAG = 2;
/** `Object#toString` result references. */
var boolTag = '[object Boolean]',
dateTag = '[object Date]',
errorTag = '[object Error]',
mapTag = '[object Map]',
numberTag = '[object Number]',
regexpTag = '[object RegExp]',
setTag = '[object Set]',
stringTag = '[object String]',
symbolTag = '[object Symbol]';
var arrayBufferTag = '[object ArrayBuffer]',
dataViewTag = '[object DataView]';
/** Used to convert symbols to primitives and strings. */
var symbolProto = Symbol ? Symbol.prototype : undefined,
symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;
/**
* A specialized version of `baseIsEqualDeep` for comparing objects of
* the same `toStringTag`.
*
* **Note:** This function only supports comparing values with tags of
* `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
*
* @private
* @param {Object} object The object to compare.
* @param {Object} other The other object to compare.
* @param {string} tag The `toStringTag` of the objects to compare.
* @param {Function} equalFunc The function to determine equivalents of values.
* @param {Function} customizer The function to customize comparisons.
* @param {number} bitmask The bitmask of comparison flags. See `baseIsEqual`
* for more details.
* @param {Object} stack Tracks traversed `object` and `other` objects.
* @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
*/
function equalByTag(object, other, tag, equalFunc, customizer, bitmask, stack) {
switch (tag) {
case dataViewTag:
if ((object.byteLength != other.byteLength) ||
(object.byteOffset != other.byteOffset)) {
return false;
}
object = object.buffer;
other = other.buffer;
case arrayBufferTag:
if ((object.byteLength != other.byteLength) ||
!equalFunc(new Uint8Array(object), new Uint8Array(other))) {
return false;
}
return true;
case boolTag:
case dateTag:
// Coerce dates and booleans to numbers, dates to milliseconds and
// booleans to `1` or `0` treating invalid dates coerced to `NaN` as
// not equal.
return +object == +other;
case errorTag:
return object.name == other.name && object.message == other.message;
case numberTag:
// Treat `NaN` vs. `NaN` as equal.
return (object != +object) ? other != +other : object == +other;
case regexpTag:
case stringTag:
// Coerce regexes to strings and treat strings, primitives and objects,
// as equal. See http://www.ecma-international.org/ecma-262/6.0/#sec-regexp.prototype.tostring
// for more details.
return object == (other + '');
case mapTag:
var convert = mapToArray;
case setTag:
var isPartial = bitmask & PARTIAL_COMPARE_FLAG;
convert || (convert = setToArray);
if (object.size != other.size && !isPartial) {
return false;
}
// Assume cyclic values are equal.
var stacked = stack.get(object);
if (stacked) {
return stacked == other;
}
bitmask |= UNORDERED_COMPARE_FLAG;
stack.set(object, other);
// Recursively compare objects (susceptible to call stack limits).
return equalArrays(convert(object), convert(other), equalFunc, customizer, bitmask, stack);
case symbolTag:
if (symbolValueOf) {
return symbolValueOf.call(object) == symbolValueOf.call(other);
}
}
return false;
}
module.exports = equalByTag;
},{"./_Symbol":145,"./_Uint8Array":146,"./_equalArrays":208,"./_mapToArray":253,"./_setToArray":259}],210:[function(require,module,exports){
var baseHas = require('./_baseHas'),
keys = require('./keys');
/** Used to compose bitmasks for comparison styles. */
var PARTIAL_COMPARE_FLAG = 2;
/**
* A specialized version of `baseIsEqualDeep` for objects with support for
* partial deep comparisons.
*
* @private
* @param {Object} object The object to compare.
* @param {Object} other The other object to compare.
* @param {Function} equalFunc The function to determine equivalents of values.
* @param {Function} customizer The function to customize comparisons.
* @param {number} bitmask The bitmask of comparison flags. See `baseIsEqual`
* for more details.
* @param {Object} stack Tracks traversed `object` and `other` objects.
* @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
*/
function equalObjects(object, other, equalFunc, customizer, bitmask, stack) {
var isPartial = bitmask & PARTIAL_COMPARE_FLAG,
objProps = keys(object),
objLength = objProps.length,
othProps = keys(other),
othLength = othProps.length;
if (objLength != othLength && !isPartial) {
return false;
}
var index = objLength;
while (index--) {
var key = objProps[index];
if (!(isPartial ? key in other : baseHas(other, key))) {
return false;
}
}
// Assume cyclic values are equal.
var stacked = stack.get(object);
if (stacked) {
return stacked == other;
}
var result = true;
stack.set(object, other);
var skipCtor = isPartial;
while (++index < objLength) {
key = objProps[index];
var objValue = object[key],
othValue = other[key];
if (customizer) {
var compared = isPartial
? customizer(othValue, objValue, key, other, object, stack)
: customizer(objValue, othValue, key, object, other, stack);
}
// Recursively compare objects (susceptible to call stack limits).
if (!(compared === undefined
? (objValue === othValue || equalFunc(objValue, othValue, customizer, bitmask, stack))
: compared
)) {
result = false;
break;
}
skipCtor || (skipCtor = key == 'constructor');
}
if (result && !skipCtor) {
var objCtor = object.constructor,
othCtor = other.constructor;
// Non `Object` object instances with different constructors are not equal.
if (objCtor != othCtor &&
('constructor' in object && 'constructor' in other) &&
!(typeof objCtor == 'function' && objCtor instanceof objCtor &&
typeof othCtor == 'function' && othCtor instanceof othCtor)) {
result = false;
}
}
stack['delete'](object);
return result;
}
module.exports = equalObjects;
},{"./_baseHas":171,"./keys":291}],211:[function(require,module,exports){
var baseGetAllKeys = require('./_baseGetAllKeys'),
getSymbols = require('./_getSymbols'),
keys = require('./keys');
/**
* Creates an array of own enumerable property names and symbols of `object`.
*
* @private
* @param {Object} object The object to query.
* @returns {Array} Returns the array of property names and symbols.
*/
function getAllKeys(object) {
return baseGetAllKeys(object, keys, getSymbols);
}
module.exports = getAllKeys;
},{"./_baseGetAllKeys":170,"./_getSymbols":218,"./keys":291}],212:[function(require,module,exports){
var baseGetAllKeys = require('./_baseGetAllKeys'),
getSymbolsIn = require('./_getSymbolsIn'),
keysIn = require('./keysIn');
/**
* Creates an array of own and inherited enumerable property names and
* symbols of `object`.
*
* @private
* @param {Object} object The object to query.
* @returns {Array} Returns the array of property names and symbols.
*/
function getAllKeysIn(object) {
return baseGetAllKeys(object, keysIn, getSymbolsIn);
}
module.exports = getAllKeysIn;
},{"./_baseGetAllKeys":170,"./_getSymbolsIn":219,"./keysIn":292}],213:[function(require,module,exports){
var baseProperty = require('./_baseProperty');
/**
* Gets the "length" property value of `object`.
*
* **Note:** This function is used to avoid a
* [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792) that affects
* Safari on at least iOS 8.1-8.3 ARM64.
*
* @private
* @param {Object} object The object to query.
* @returns {*} Returns the "length" value.
*/
var getLength = baseProperty('length');
module.exports = getLength;
},{"./_baseProperty":184}],214:[function(require,module,exports){
var isKeyable = require('./_isKeyable');
/**
* Gets the data for `map`.
*
* @private
* @param {Object} map The map to query.
* @param {string} key The reference key.
* @returns {*} Returns the map data.
*/
function getMapData(map, key) {
var data = map.__data__;
return isKeyable(key)
? data[typeof key == 'string' ? 'string' : 'hash']
: data.map;
}
module.exports = getMapData;
},{"./_isKeyable":238}],215:[function(require,module,exports){
var isStrictComparable = require('./_isStrictComparable'),
keys = require('./keys');
/**
* Gets the property names, values, and compare flags of `object`.
*
* @private
* @param {Object} object The object to query.
* @returns {Array} Returns the match data of `object`.
*/
function getMatchData(object) {
var result = keys(object),
length = result.length;
while (length--) {
var key = result[length],
value = object[key];
result[length] = [key, value, isStrictComparable(value)];
}
return result;
}
module.exports = getMatchData;
},{"./_isStrictComparable":241,"./keys":291}],216:[function(require,module,exports){
var baseIsNative = require('./_baseIsNative'),
getValue = require('./_getValue');
/**
* Gets the native function at `key` of `object`.
*
* @private
* @param {Object} object The object to query.
* @param {string} key The key of the method to get.
* @returns {*} Returns the function if it's native, else `undefined`.
*/
function getNative(object, key) {
var value = getValue(object, key);
return baseIsNative(value) ? value : undefined;
}
module.exports = getNative;
},{"./_baseIsNative":177,"./_getValue":221}],217:[function(require,module,exports){
/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeGetPrototype = Object.getPrototypeOf;
/**
* Gets the `[[Prototype]]` of `value`.
*
* @private
* @param {*} value The value to query.
* @returns {null|Object} Returns the `[[Prototype]]`.
*/
function getPrototype(value) {
return nativeGetPrototype(Object(value));
}
module.exports = getPrototype;
},{}],218:[function(require,module,exports){
var stubArray = require('./stubArray');
/** Built-in value references. */
var getOwnPropertySymbols = Object.getOwnPropertySymbols;
/**
* Creates an array of the own enumerable symbol properties of `object`.
*
* @private
* @param {Object} object The object to query.
* @returns {Array} Returns the array of symbols.
*/
function getSymbols(object) {
// Coerce `object` to an object to avoid non-object errors in V8.
// See https://bugs.chromium.org/p/v8/issues/detail?id=3443 for more details.
return getOwnPropertySymbols(Object(object));
}
// Fallback for IE < 11.
if (!getOwnPropertySymbols) {
getSymbols = stubArray;
}
module.exports = getSymbols;
},{"./stubArray":298}],219:[function(require,module,exports){
var arrayPush = require('./_arrayPush'),
getPrototype = require('./_getPrototype'),
getSymbols = require('./_getSymbols');
/** Built-in value references. */
var getOwnPropertySymbols = Object.getOwnPropertySymbols;
/**
* Creates an array of the own and inherited enumerable symbol properties
* of `object`.
*
* @private
* @param {Object} object The object to query.
* @returns {Array} Returns the array of symbols.
*/
var getSymbolsIn = !getOwnPropertySymbols ? getSymbols : function(object) {
var result = [];
while (object) {
arrayPush(result, getSymbols(object));
object = getPrototype(object);
}
return result;
};
module.exports = getSymbolsIn;
},{"./_arrayPush":155,"./_getPrototype":217,"./_getSymbols":218}],220:[function(require,module,exports){
var DataView = require('./_DataView'),
Map = require('./_Map'),
Promise = require('./_Promise'),
Set = require('./_Set'),
WeakMap = require('./_WeakMap'),
toSource = require('./_toSource');
/** `Object#toString` result references. */
var mapTag = '[object Map]',
objectTag = '[object Object]',
promiseTag = '[object Promise]',
setTag = '[object Set]',
weakMapTag = '[object WeakMap]';
var dataViewTag = '[object DataView]';
/** Used for built-in method references. */
var objectProto = Object.prototype;
/**
* Used to resolve the
* [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
* of values.
*/
var objectToString = objectProto.toString;
/** Used to detect maps, sets, and weakmaps. */
var dataViewCtorString = toSource(DataView),
mapCtorString = toSource(Map),
promiseCtorString = toSource(Promise),
setCtorString = toSource(Set),
weakMapCtorString = toSource(WeakMap);
/**
* Gets the `toStringTag` of `value`.
*
* @private
* @param {*} value The value to query.
* @returns {string} Returns the `toStringTag`.
*/
function getTag(value) {
return objectToString.call(value);
}
// Fallback for data views, maps, sets, and weak maps in IE 11,
// for data views in Edge, and promises in Node.js.
if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||
(Map && getTag(new Map) != mapTag) ||
(Promise && getTag(Promise.resolve()) != promiseTag) ||
(Set && getTag(new Set) != setTag) ||
(WeakMap && getTag(new WeakMap) != weakMapTag)) {
getTag = function(value) {
var result = objectToString.call(value),
Ctor = result == objectTag ? value.constructor : undefined,
ctorString = Ctor ? toSource(Ctor) : undefined;
if (ctorString) {
switch (ctorString) {
case dataViewCtorString: return dataViewTag;
case mapCtorString: return mapTag;
case promiseCtorString: return promiseTag;
case setCtorString: return setTag;
case weakMapCtorString: return weakMapTag;
}
}
return result;
};
}
module.exports = getTag;
},{"./_DataView":135,"./_Map":138,"./_Promise":140,"./_Set":142,"./_WeakMap":147,"./_toSource":267}],221:[function(require,module,exports){
/**
* Gets the value at `key` of `object`.
*
* @private
* @param {Object} [object] The object to query.
* @param {string} key The key of the property to get.
* @returns {*} Returns the property value.
*/
function getValue(object, key) {
return object == null ? undefined : object[key];
}
module.exports = getValue;
},{}],222:[function(require,module,exports){
var castPath = require('./_castPath'),
isArguments = require('./isArguments'),
isArray = require('./isArray'),
isIndex = require('./_isIndex'),
isKey = require('./_isKey'),
isLength = require('./isLength'),
isString = require('./isString'),
toKey = require('./_toKey');
/**
* Checks if `path` exists on `object`.
*
* @private
* @param {Object} object The object to query.
* @param {Array|string} path The path to check.
* @param {Function} hasFunc The function to check properties.
* @returns {boolean} Returns `true` if `path` exists, else `false`.
*/
function hasPath(object, path, hasFunc) {
path = isKey(path, object) ? [path] : castPath(path);
var result,
index = -1,
length = path.length;
while (++index < length) {
var key = toKey(path[index]);
if (!(result = object != null && hasFunc(object, key))) {
break;
}
object = object[key];
}
if (result) {
return result;
}
var length = object ? object.length : 0;
return !!length && isLength(length) && isIndex(key, length) &&
(isArray(object) || isString(object) || isArguments(object));
}
module.exports = hasPath;
},{"./_castPath":191,"./_isIndex":235,"./_isKey":237,"./_toKey":266,"./isArguments":278,"./isArray":279,"./isLength":284,"./isString":288}],223:[function(require,module,exports){
var nativeCreate = require('./_nativeCreate');
/**
* Removes all key-value entries from the hash.
*
* @private
* @name clear
* @memberOf Hash
*/
function hashClear() {
this.__data__ = nativeCreate ? nativeCreate(null) : {};
}
module.exports = hashClear;
},{"./_nativeCreate":255}],224:[function(require,module,exports){
/**
* Removes `key` and its value from the hash.
*
* @private
* @name delete
* @memberOf Hash
* @param {Object} hash The hash to modify.
* @param {string} key The key of the value to remove.
* @returns {boolean} Returns `true` if the entry was removed, else `false`.
*/
function hashDelete(key) {
return this.has(key) && delete this.__data__[key];
}
module.exports = hashDelete;
},{}],225:[function(require,module,exports){
var nativeCreate = require('./_nativeCreate');
/** Used to stand-in for `undefined` hash values. */
var HASH_UNDEFINED = '__lodash_hash_undefined__';
/** Used for built-in method references. */
var objectProto = Object.prototype;
/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;
/**
* Gets the hash value for `key`.
*
* @private
* @name get
* @memberOf Hash
* @param {string} key The key of the value to get.
* @returns {*} Returns the entry value.
*/
function hashGet(key) {
var data = this.__data__;
if (nativeCreate) {
var result = data[key];
return result === HASH_UNDEFINED ? undefined : result;
}
return hasOwnProperty.call(data, key) ? data[key] : undefined;
}
module.exports = hashGet;
},{"./_nativeCreate":255}],226:[function(require,module,exports){
var nativeCreate = require('./_nativeCreate');
/** Used for built-in method references. */
var objectProto = Object.prototype;
/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;
/**
* Checks if a hash value for `key` exists.
*
* @private
* @name has
* @memberOf Hash
* @param {string} key The key of the entry to check.
* @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
*/
function hashHas(key) {
var data = this.__data__;
return nativeCreate ? data[key] !== undefined : hasOwnProperty.call(data, key);
}
module.exports = hashHas;
},{"./_nativeCreate":255}],227:[function(require,module,exports){
var nativeCreate = require('./_nativeCreate');
/** Used to stand-in for `undefined` hash values. */
var HASH_UNDEFINED = '__lodash_hash_undefined__';
/**
* Sets the hash `key` to `value`.
*
* @private
* @name set
* @memberOf Hash
* @param {string} key The key of the value to set.
* @param {*} value The value to set.
* @returns {Object} Returns the hash instance.
*/
function hashSet(key, value) {
var data = this.__data__;
data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;
return this;
}
module.exports = hashSet;
},{"./_nativeCreate":255}],228:[function(require,module,exports){
var baseTimes = require('./_baseTimes'),
isArguments = require('./isArguments'),
isArray = require('./isArray'),
isLength = require('./isLength'),
isString = require('./isString');
/**
* Creates an array of index keys for `object` values of arrays,
* `arguments` objects, and strings, otherwise `null` is returned.
*
* @private
* @param {Object} object The object to query.
* @returns {Array|null} Returns index keys, else `null`.
*/
function indexKeys(object) {
var length = object ? object.length : undefined;
if (isLength(length) &&
(isArray(object) || isString(object) || isArguments(object))) {
return baseTimes(length, String);
}
return null;
}
module.exports = indexKeys;
},{"./_baseTimes":187,"./isArguments":278,"./isArray":279,"./isLength":284,"./isString":288}],229:[function(require,module,exports){
/**
* Gets the index at which the first occurrence of `NaN` is found in `array`.
*
* @private
* @param {Array} array The array to search.
* @param {number} fromIndex The index to search from.
* @param {boolean} [fromRight] Specify iterating from right to left.
* @returns {number} Returns the index of the matched `NaN`, else `-1`.
*/
function indexOfNaN(array, fromIndex, fromRight) {
var length = array.length,
index = fromIndex + (fromRight ? 1 : -1);
while ((fromRight ? index-- : ++index < length)) {
var other = array[index];
if (other !== other) {
return index;
}
}
return -1;
}
module.exports = indexOfNaN;
},{}],230:[function(require,module,exports){
/** Used for built-in method references. */
var objectProto = Object.prototype;
/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;
/**
* Initializes an array clone.
*
* @private
* @param {Array} array The array to clone.
* @returns {Array} Returns the initialized clone.
*/
function initCloneArray(array) {
var length = array.length,
result = array.constructor(length);
// Add properties assigned by `RegExp#exec`.
if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {
result.index = array.index;
result.input = array.input;
}
return result;
}
module.exports = initCloneArray;
},{}],231:[function(require,module,exports){
var cloneArrayBuffer = require('./_cloneArrayBuffer'),
cloneDataView = require('./_cloneDataView'),
cloneMap = require('./_cloneMap'),
cloneRegExp = require('./_cloneRegExp'),
cloneSet = require('./_cloneSet'),
cloneSymbol = require('./_cloneSymbol'),
cloneTypedArray = require('./_cloneTypedArray');
/** `Object#toString` result references. */
var boolTag = '[object Boolean]',
dateTag = '[object Date]',
mapTag = '[object Map]',
numberTag = '[object Number]',
regexpTag = '[object RegExp]',
setTag = '[object Set]',
stringTag = '[object String]',
symbolTag = '[object Symbol]';
var arrayBufferTag = '[object ArrayBuffer]',
dataViewTag = '[object DataView]',
float32Tag = '[object Float32Array]',
float64Tag = '[object Float64Array]',
int8Tag = '[object Int8Array]',
int16Tag = '[object Int16Array]',
int32Tag = '[object Int32Array]',
uint8Tag = '[object Uint8Array]',
uint8ClampedTag = '[object Uint8ClampedArray]',
uint16Tag = '[object Uint16Array]',
uint32Tag = '[object Uint32Array]';
/**
* Initializes an object clone based on its `toStringTag`.
*
* **Note:** This function only supports cloning values with tags of
* `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
*
* @private
* @param {Object} object The object to clone.
* @param {string} tag The `toStringTag` of the object to clone.
* @param {Function} cloneFunc The function to clone values.
* @param {boolean} [isDeep] Specify a deep clone.
* @returns {Object} Returns the initialized clone.
*/
function initCloneByTag(object, tag, cloneFunc, isDeep) {
var Ctor = object.constructor;
switch (tag) {
case arrayBufferTag:
return cloneArrayBuffer(object);
case boolTag:
case dateTag:
return new Ctor(+object);
case dataViewTag:
return cloneDataView(object, isDeep);
case float32Tag: case float64Tag:
case int8Tag: case int16Tag: case int32Tag:
case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:
return cloneTypedArray(object, isDeep);
case mapTag:
return cloneMap(object, isDeep, cloneFunc);
case numberTag:
case stringTag:
return new Ctor(object);
case regexpTag:
return cloneRegExp(object);
case setTag:
return cloneSet(object, isDeep, cloneFunc);
case symbolTag:
return cloneSymbol(object);
}
}
module.exports = initCloneByTag;
},{"./_cloneArrayBuffer":193,"./_cloneDataView":195,"./_cloneMap":196,"./_cloneRegExp":197,"./_cloneSet":198,"./_cloneSymbol":199,"./_cloneTypedArray":200}],232:[function(require,module,exports){
var baseCreate = require('./_baseCreate'),
getPrototype = require('./_getPrototype'),
isPrototype = require('./_isPrototype');
/**
* Initializes an object clone.
*
* @private
* @param {Object} object The object to clone.
* @returns {Object} Returns the initialized clone.
*/
function initCloneObject(object) {
return (typeof object.constructor == 'function' && !isPrototype(object))
? baseCreate(getPrototype(object))
: {};
}
module.exports = initCloneObject;
},{"./_baseCreate":163,"./_getPrototype":217,"./_isPrototype":240}],233:[function(require,module,exports){
var isArguments = require('./isArguments'),
isArray = require('./isArray');
/**
* Checks if `value` is a flattenable `arguments` object or array.
*
* @private
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is flattenable, else `false`.
*/
function isFlattenable(value) {
return isArray(value) || isArguments(value);
}
module.exports = isFlattenable;
},{"./isArguments":278,"./isArray":279}],234:[function(require,module,exports){
/**
* Checks if `value` is a host object in IE < 9.
*
* @private
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is a host object, else `false`.
*/
function isHostObject(value) {
// Many host objects are `Object` objects that can coerce to strings
// despite having improperly defined `toString` methods.
var result = false;
if (value != null && typeof value.toString != 'function') {
try {
result = !!(value + '');
} catch (e) {}
}
return result;
}
module.exports = isHostObject;
},{}],235:[function(require,module,exports){
/** Used as references for various `Number` constants. */
var MAX_SAFE_INTEGER = 9007199254740991;
/** Used to detect unsigned integer values. */
var reIsUint = /^(?:0|[1-9]\d*)$/;
/**
* Checks if `value` is a valid array-like index.
*
* @private
* @param {*} value The value to check.
* @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
* @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
*/
function isIndex(value, length) {
length = length == null ? MAX_SAFE_INTEGER : length;
return !!length &&
(typeof value == 'number' || reIsUint.test(value)) &&
(value > -1 && value % 1 == 0 && value < length);
}
module.exports = isIndex;
},{}],236:[function(require,module,exports){
var eq = require('./eq'),
isArrayLike = require('./isArrayLike'),
isIndex = require('./_isIndex'),
isObject = require('./isObject');
/**
* Checks if the given arguments are from an iteratee call.
*
* @private
* @param {*} value The potential iteratee value argument.
* @param {*} index The potential iteratee index or key argument.
* @param {*} object The potential iteratee object argument.
* @returns {boolean} Returns `true` if the arguments are from an iteratee call,
* else `false`.
*/
function isIterateeCall(value, index, object) {
if (!isObject(object)) {
return false;
}
var type = typeof index;
if (type == 'number'
? (isArrayLike(object) && isIndex(index, object.length))
: (type == 'string' && index in object)
) {
return eq(object[index], value);
}
return false;
}
module.exports = isIterateeCall;
},{"./_isIndex":235,"./eq":273,"./isArrayLike":280,"./isObject":285}],237:[function(require,module,exports){
var isArray = require('./isArray'),
isSymbol = require('./isSymbol');
/** Used to match property names within property paths. */
var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,
reIsPlainProp = /^\w*$/;
/**
* Checks if `value` is a property name and not a property path.
*
* @private
* @param {*} value The value to check.
* @param {Object} [object] The object to query keys on.
* @returns {boolean} Returns `true` if `value` is a property name, else `false`.
*/
function isKey(value, object) {
if (isArray(value)) {
return false;
}
var type = typeof value;
if (type == 'number' || type == 'symbol' || type == 'boolean' ||
value == null || isSymbol(value)) {
return true;
}
return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||
(object != null && value in Object(object));
}
module.exports = isKey;
},{"./isArray":279,"./isSymbol":289}],238:[function(require,module,exports){
/**
* Checks if `value` is suitable for use as unique object key.
*
* @private
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is suitable, else `false`.
*/
function isKeyable(value) {
var type = typeof value;
return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')
? (value !== '__proto__')
: (value === null);
}
module.exports = isKeyable;
},{}],239:[function(require,module,exports){
var coreJsData = require('./_coreJsData');
/** Used to detect methods masquerading as native. */
var maskSrcKey = (function() {
var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');
return uid ? ('Symbol(src)_1.' + uid) : '';
}());
/**
* Checks if `func` has its source masked.
*
* @private
* @param {Function} func The function to check.
* @returns {boolean} Returns `true` if `func` is masked, else `false`.
*/
function isMasked(func) {
return !!maskSrcKey && (maskSrcKey in func);
}
module.exports = isMasked;
},{"./_coreJsData":204}],240:[function(require,module,exports){
/** Used for built-in method references. */
var objectProto = Object.prototype;
/**
* Checks if `value` is likely a prototype object.
*
* @private
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is a prototype, else `false`.
*/
function isPrototype(value) {
var Ctor = value && value.constructor,
proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;
return value === proto;
}
module.exports = isPrototype;
},{}],241:[function(require,module,exports){
var isObject = require('./isObject');
/**
* Checks if `value` is suitable for strict equality comparisons, i.e. `===`.
*
* @private
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` if suitable for strict
* equality comparisons, else `false`.
*/
function isStrictComparable(value) {
return value === value && !isObject(value);
}
module.exports = isStrictComparable;
},{"./isObject":285}],242:[function(require,module,exports){
/**
* Converts `iterator` to an array.
*
* @private
* @param {Object} iterator The iterator to convert.
* @returns {Array} Returns the converted array.
*/
function iteratorToArray(iterator) {
var data,
result = [];
while (!(data = iterator.next()).done) {
result.push(data.value);
}
return result;
}
module.exports = iteratorToArray;
},{}],243:[function(require,module,exports){
/**
* Removes all key-value entries from the list cache.
*
* @private
* @name clear
* @memberOf ListCache
*/
function listCacheClear() {
this.__data__ = [];
}
module.exports = listCacheClear;
},{}],244:[function(require,module,exports){
var assocIndexOf = require('./_assocIndexOf');
/** Used for built-in method references. */
var arrayProto = Array.prototype;
/** Built-in value references. */
var splice = arrayProto.splice;
/**
* Removes `key` and its value from the list cache.
*
* @private
* @name delete
* @memberOf ListCache
* @param {string} key The key of the value to remove.
* @returns {boolean} Returns `true` if the entry was removed, else `false`.
*/
function listCacheDelete(key) {
var data = this.__data__,
index = assocIndexOf(data, key);
if (index < 0) {
return false;
}
var lastIndex = data.length - 1;
if (index == lastIndex) {
data.pop();
} else {
splice.call(data, index, 1);
}
return true;
}
module.exports = listCacheDelete;
},{"./_assocIndexOf":160}],245:[function(require,module,exports){
var assocIndexOf = require('./_assocIndexOf');
/**
* Gets the list cache value for `key`.
*
* @private
* @name get
* @memberOf ListCache
* @param {string} key The key of the value to get.
* @returns {*} Returns the entry value.
*/
function listCacheGet(key) {
var data = this.__data__,
index = assocIndexOf(data, key);
return index < 0 ? undefined : data[index][1];
}
module.exports = listCacheGet;
},{"./_assocIndexOf":160}],246:[function(require,module,exports){
var assocIndexOf = require('./_assocIndexOf');
/**
* Checks if a list cache value for `key` exists.
*
* @private
* @name has
* @memberOf ListCache
* @param {string} key The key of the entry to check.
* @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
*/
function listCacheHas(key) {
return assocIndexOf(this.__data__, key) > -1;
}
module.exports = listCacheHas;
},{"./_assocIndexOf":160}],247:[function(require,module,exports){
var assocIndexOf = require('./_assocIndexOf');
/**
* Sets the list cache `key` to `value`.
*
* @private
* @name set
* @memberOf ListCache
* @param {string} key The key of the value to set.
* @param {*} value The value to set.
* @returns {Object} Returns the list cache instance.
*/
function listCacheSet(key, value) {
var data = this.__data__,
index = assocIndexOf(data, key);
if (index < 0) {
data.push([key, value]);
} else {
data[index][1] = value;
}
return this;
}
module.exports = listCacheSet;
},{"./_assocIndexOf":160}],248:[function(require,module,exports){
var Hash = require('./_Hash'),
ListCache = require('./_ListCache'),
Map = require('./_Map');
/**
* Removes all key-value entries from the map.
*
* @private
* @name clear
* @memberOf MapCache
*/
function mapCacheClear() {
this.__data__ = {
'hash': new Hash,
'map': new (Map || ListCache),
'string': new Hash
};
}
module.exports = mapCacheClear;
},{"./_Hash":136,"./_ListCache":137,"./_Map":138}],249:[function(require,module,exports){
var getMapData = require('./_getMapData');
/**
* Removes `key` and its value from the map.
*
* @private
* @name delete
* @memberOf MapCache
* @param {string} key The key of the value to remove.
* @returns {boolean} Returns `true` if the entry was removed, else `false`.
*/
function mapCacheDelete(key) {
return getMapData(this, key)['delete'](key);
}
module.exports = mapCacheDelete;
},{"./_getMapData":214}],250:[function(require,module,exports){
var getMapData = require('./_getMapData');
/**
* Gets the map value for `key`.
*
* @private
* @name get
* @memberOf MapCache
* @param {string} key The key of the value to get.
* @returns {*} Returns the entry value.
*/
function mapCacheGet(key) {
return getMapData(this, key).get(key);
}
module.exports = mapCacheGet;
},{"./_getMapData":214}],251:[function(require,module,exports){
var getMapData = require('./_getMapData');
/**
* Checks if a map value for `key` exists.
*
* @private
* @name has
* @memberOf MapCache
* @param {string} key The key of the entry to check.
* @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
*/
function mapCacheHas(key) {
return getMapData(this, key).has(key);
}
module.exports = mapCacheHas;
},{"./_getMapData":214}],252:[function(require,module,exports){
var getMapData = require('./_getMapData');
/**
* Sets the map `key` to `value`.
*
* @private
* @name set
* @memberOf MapCache
* @param {string} key The key of the value to set.
* @param {*} value The value to set.
* @returns {Object} Returns the map cache instance.
*/
function mapCacheSet(key, value) {
getMapData(this, key).set(key, value);
return this;
}
module.exports = mapCacheSet;
},{"./_getMapData":214}],253:[function(require,module,exports){
/**
* Converts `map` to its key-value pairs.
*
* @private
* @param {Object} map The map to convert.
* @returns {Array} Returns the key-value pairs.
*/
function mapToArray(map) {
var index = -1,
result = Array(map.size);
map.forEach(function(value, key) {
result[++index] = [key, value];
});
return result;
}
module.exports = mapToArray;
},{}],254:[function(require,module,exports){
/**
* A specialized version of `matchesProperty` for source values suitable
* for strict equality comparisons, i.e. `===`.
*
* @private
* @param {string} key The key of the property to get.
* @param {*} srcValue The value to match.
* @returns {Function} Returns the new spec function.
*/
function matchesStrictComparable(key, srcValue) {
return function(object) {
if (object == null) {
return false;
}
return object[key] === srcValue &&
(srcValue !== undefined || (key in Object(object)));
};
}
module.exports = matchesStrictComparable;
},{}],255:[function(require,module,exports){
var getNative = require('./_getNative');
/* Built-in method references that are verified to be native. */
var nativeCreate = getNative(Object, 'create');
module.exports = nativeCreate;
},{"./_getNative":216}],256:[function(require,module,exports){
(function (global){
var checkGlobal = require('./_checkGlobal');
/** Detect free variable `global` from Node.js. */
var freeGlobal = checkGlobal(typeof global == 'object' && global);
/** Detect free variable `self`. */
var freeSelf = checkGlobal(typeof self == 'object' && self);
/** Detect `this` as the global object. */
var thisGlobal = checkGlobal(typeof this == 'object' && this);
/** Used as a reference to the global object. */
var root = freeGlobal || freeSelf || thisGlobal || Function('return this')();
module.exports = root;
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX3Jvb3QuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgY2hlY2tHbG9iYWwgPSByZXF1aXJlKCcuL19jaGVja0dsb2JhbCcpO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGdsb2JhbGAgZnJvbSBOb2RlLmpzLiAqL1xudmFyIGZyZWVHbG9iYWwgPSBjaGVja0dsb2JhbCh0eXBlb2YgZ2xvYmFsID09ICdvYmplY3QnICYmIGdsb2JhbCk7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgc2VsZmAuICovXG52YXIgZnJlZVNlbGYgPSBjaGVja0dsb2JhbCh0eXBlb2Ygc2VsZiA9PSAnb2JqZWN0JyAmJiBzZWxmKTtcblxuLyoqIERldGVjdCBgdGhpc2AgYXMgdGhlIGdsb2JhbCBvYmplY3QuICovXG52YXIgdGhpc0dsb2JhbCA9IGNoZWNrR2xvYmFsKHR5cGVvZiB0aGlzID09ICdvYmplY3QnICYmIHRoaXMpO1xuXG4vKiogVXNlZCBhcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdC4gKi9cbnZhciByb290ID0gZnJlZUdsb2JhbCB8fCBmcmVlU2VsZiB8fCB0aGlzR2xvYmFsIHx8IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cbm1vZHVsZS5leHBvcnRzID0gcm9vdDtcbiJdfQ==
},{"./_checkGlobal":192}],257:[function(require,module,exports){
/** Used to stand-in for `undefined` hash values. */
var HASH_UNDEFINED = '__lodash_hash_undefined__';
/**
* Adds `value` to the array cache.
*
* @private
* @name add
* @memberOf SetCache
* @alias push
* @param {*} value The value to cache.
* @returns {Object} Returns the cache instance.
*/
function setCacheAdd(value) {
this.__data__.set(value, HASH_UNDEFINED);
return this;
}
module.exports = setCacheAdd;
},{}],258:[function(require,module,exports){
/**
* Checks if `value` is in the array cache.
*
* @private
* @name has
* @memberOf SetCache
* @param {*} value The value to search for.
* @returns {number} Returns `true` if `value` is found, else `false`.
*/
function setCacheHas(value) {
return this.__data__.has(value);
}
module.exports = setCacheHas;
},{}],259:[function(require,module,exports){
/**
* Converts `set` to an array of its values.
*
* @private
* @param {Object} set The set to convert.
* @returns {Array} Returns the values.
*/
function setToArray(set) {
var index = -1,
result = Array(set.size);
set.forEach(function(value) {
result[++index] = value;
});
return result;
}
module.exports = setToArray;
},{}],260:[function(require,module,exports){
var ListCache = require('./_ListCache');
/**
* Removes all key-value entries from the stack.
*
* @private
* @name clear
* @memberOf Stack
*/
function stackClear() {
this.__data__ = new ListCache;
}
module.exports = stackClear;
},{"./_ListCache":137}],261:[function(require,module,exports){
/**
* Removes `key` and its value from the stack.
*
* @private
* @name delete
* @memberOf Stack
* @param {string} key The key of the value to remove.
* @returns {boolean} Returns `true` if the entry was removed, else `false`.
*/
function stackDelete(key) {
return this.__data__['delete'](key);
}
module.exports = stackDelete;
},{}],262:[function(require,module,exports){
/**
* Gets the stack value for `key`.
*
* @private
* @name get
* @memberOf Stack
* @param {string} key The key of the value to get.
* @returns {*} Returns the entry value.
*/
function stackGet(key) {
return this.__data__.get(key);
}
module.exports = stackGet;
},{}],263:[function(require,module,exports){
/**
* Checks if a stack value for `key` exists.
*
* @private
* @name has
* @memberOf Stack
* @param {string} key The key of the entry to check.
* @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
*/
function stackHas(key) {
return this.__data__.has(key);
}
module.exports = stackHas;
},{}],264:[function(require,module,exports){
var ListCache = require('./_ListCache'),
MapCache = require('./_MapCache');
/** Used as the size to enable large array optimizations. */
var LARGE_ARRAY_SIZE = 200;
/**
* Sets the stack `key` to `value`.
*
* @private
* @name set
* @memberOf Stack
* @param {string} key The key of the value to set.
* @param {*} value The value to set.
* @returns {Object} Returns the stack cache instance.
*/
function stackSet(key, value) {
var cache = this.__data__;
if (cache instanceof ListCache && cache.__data__.length == LARGE_ARRAY_SIZE) {
cache = this.__data__ = new MapCache(cache.__data__);
}
cache.set(key, value);
return this;
}
module.exports = stackSet;
},{"./_ListCache":137,"./_MapCache":139}],265:[function(require,module,exports){
var memoize = require('./memoize'),
toString = require('./toString');
/** Used to match property names within property paths. */
var rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(\.|\[\])(?:\4|$))/g;
/** Used to match backslashes in property paths. */
var reEscapeChar = /\\(\\)?/g;
/**
* Converts `string` to a property path array.
*
* @private
* @param {string} string The string to convert.
* @returns {Array} Returns the property path array.
*/
var stringToPath = memoize(function(string) {
var result = [];
toString(string).replace(rePropName, function(match, number, quote, string) {
result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match));
});
return result;
});
module.exports = stringToPath;
},{"./memoize":293,"./toString":303}],266:[function(require,module,exports){
var isSymbol = require('./isSymbol');
/** Used as references for various `Number` constants. */
var INFINITY = 1 / 0;
/**
* Converts `value` to a string key if it's not a string or symbol.
*
* @private
* @param {*} value The value to inspect.
* @returns {string|symbol} Returns the key.
*/
function toKey(value) {
if (typeof value == 'string' || isSymbol(value)) {
return value;
}
var result = (value + '');
return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
}
module.exports = toKey;
},{"./isSymbol":289}],267:[function(require,module,exports){
/** Used to resolve the decompiled source of functions. */
var funcToString = Function.prototype.toString;
/**
* Converts `func` to its source code.
*
* @private
* @param {Function} func The function to process.
* @returns {string} Returns the source code.
*/
function toSource(func) {
if (func != null) {
try {
return funcToString.call(func);
} catch (e) {}
try {
return (func + '');
} catch (e) {}
}
return '';
}
module.exports = toSource;
},{}],268:[function(require,module,exports){
var assignValue = require('./_assignValue'),
copyObject = require('./_copyObject'),
createAssigner = require('./_createAssigner'),
isArrayLike = require('./isArrayLike'),
isPrototype = require('./_isPrototype'),
keys = require('./keys');
/** Used for built-in method references. */
var objectProto = Object.prototype;
/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;
/** Built-in value references. */
var propertyIsEnumerable = objectProto.propertyIsEnumerable;
/** Detect if properties shadowing those on `Object.prototype` are non-enumerable. */
var nonEnumShadows = !propertyIsEnumerable.call({ 'valueOf': 1 }, 'valueOf');
/**
* Assigns own enumerable string keyed properties of source objects to the
* destination object. Source objects are applied from left to right.
* Subsequent sources overwrite property assignments of previous sources.
*
* **Note:** This method mutates `object` and is loosely based on
* [`Object.assign`](https://mdn.io/Object/assign).
*
* @static
* @memberOf _
* @since 0.10.0
* @category Object
* @param {Object} object The destination object.
* @param {...Object} [sources] The source objects.
* @returns {Object} Returns `object`.
* @see _.assignIn
* @example
*
* function Foo() {
* this.c = 3;
* }
*
* function Bar() {
* this.e = 5;
* }
*
* Foo.prototype.d = 4;
* Bar.prototype.f = 6;
*
* _.assign({ 'a': 1 }, new Foo, new Bar);
* // => { 'a': 1, 'c': 3, 'e': 5 }
*/
var assign = createAssigner(function(object, source) {
if (nonEnumShadows || isPrototype(source) || isArrayLike(source)) {
copyObject(source, keys(source), object);
return;
}
for (var key in source) {
if (hasOwnProperty.call(source, key)) {
assignValue(object, key, source[key]);
}
}
});
module.exports = assign;
},{"./_assignValue":159,"./_copyObject":202,"./_createAssigner":205,"./_isPrototype":240,"./isArrayLike":280,"./keys":291}],269:[function(require,module,exports){
var copyObject = require('./_copyObject'),
createAssigner = require('./_createAssigner'),
keysIn = require('./keysIn');
/**
* This method is like `_.assignIn` except that it accepts `customizer`
* which is invoked to produce the assigned values. If `customizer` returns
* `undefined`, assignment is handled by the method instead. The `customizer`
* is invoked with five arguments: (objValue, srcValue, key, object, source).
*
* **Note:** This method mutates `object`.
*
* @static
* @memberOf _
* @since 4.0.0
* @alias extendWith
* @category Object
* @param {Object} object The destination object.
* @param {...Object} sources The source objects.
* @param {Function} [customizer] The function to customize assigned values.
* @returns {Object} Returns `object`.
* @see _.assignWith
* @example
*
* function customizer(objValue, srcValue) {
* return _.isUndefined(objValue) ? srcValue : objValue;
* }
*
* var defaults = _.partialRight(_.assignInWith, customizer);
*
* defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
* // => { 'a': 1, 'b': 2 }
*/
var assignInWith = createAssigner(function(object, source, srcIndex, customizer) {
copyObject(source, keysIn(source), object, customizer);
});
module.exports = assignInWith;
},{"./_copyObject":202,"./_createAssigner":205,"./keysIn":292}],270:[function(require,module,exports){
var baseClone = require('./_baseClone');
/**
* This method is like `_.clone` except that it recursively clones `value`.
*
* @static
* @memberOf _
* @since 1.0.0
* @category Lang
* @param {*} value The value to recursively clone.
* @returns {*} Returns the deep cloned value.
* @see _.clone
* @example
*
* var objects = [{ 'a': 1 }, { 'b': 2 }];
*
* var deep = _.cloneDeep(objects);
* console.log(deep[0] === objects[0]);
* // => false
*/
function cloneDeep(value) {
return baseClone(value, true, true);
}
module.exports = cloneDeep;
},{"./_baseClone":162}],271:[function(require,module,exports){
var apply = require('./_apply'),
assignInDefaults = require('./_assignInDefaults'),
assignInWith = require('./assignInWith'),
rest = require('./rest');
/**
* Assigns own and inherited enumerable string keyed properties of source
* objects to the destination object for all destination properties that
* resolve to `undefined`. Source objects are applied from left to right.
* Once a property is set, additional values of the same property are ignored.
*
* **Note:** This method mutates `object`.
*
* @static
* @since 0.1.0
* @memberOf _
* @category Object
* @param {Object} object The destination object.
* @param {...Object} [sources] The source objects.
* @returns {Object} Returns `object`.
* @see _.defaultsDeep
* @example
*
* _.defaults({ 'user': 'barney' }, { 'age': 36 }, { 'user': 'fred' });
* // => { 'user': 'barney', 'age': 36 }
*/
var defaults = rest(function(args) {
args.push(undefined, assignInDefaults);
return apply(assignInWith, undefined, args);
});
module.exports = defaults;
},{"./_apply":150,"./_assignInDefaults":158,"./assignInWith":269,"./rest":297}],272:[function(require,module,exports){
module.exports = require('./forEach');
},{"./forEach":274}],273:[function(require,module,exports){
/**
* Performs a
* [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
* comparison between two values to determine if they are equivalent.
*
* @static
* @memberOf _
* @since 4.0.0
* @category Lang
* @param {*} value The value to compare.
* @param {*} other The other value to compare.
* @returns {boolean} Returns `true` if the values are equivalent, else `false`.
* @example
*
* var object = { 'user': 'fred' };
* var other = { 'user': 'fred' };
*
* _.eq(object, object);
* // => true
*
* _.eq(object, other);
* // => false
*
* _.eq('a', 'a');
* // => true
*
* _.eq('a', Object('a'));
* // => false
*
* _.eq(NaN, NaN);
* // => true
*/
function eq(value, other) {
return value === other || (value !== value && other !== other);
}
module.exports = eq;
},{}],274:[function(require,module,exports){
var arrayEach = require('./_arrayEach'),
baseEach = require('./_baseEach'),
baseIteratee = require('./_baseIteratee'),
isArray = require('./isArray');
/**
* Iterates over elements of `collection` and invokes `iteratee` for each element.
* The iteratee is invoked with three arguments: (value, index|key, collection).
* Iteratee functions may exit iteration early by explicitly returning `false`.
*
* **Note:** As with other "Collections" methods, objects with a "length"
* property are iterated like arrays. To avoid this behavior use `_.forIn`
* or `_.forOwn` for object iteration.
*
* @static
* @memberOf _
* @since 0.1.0
* @alias each
* @category Collection
* @param {Array|Object} collection The collection to iterate over.
* @param {Function} [iteratee=_.identity] The function invoked per iteration.
* @returns {Array|Object} Returns `collection`.
* @see _.forEachRight
* @example
*
* _([1, 2]).forEach(function(value) {
* console.log(value);
* });
* // => Logs `1` then `2`.
*
* _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {
* console.log(key);
* });
* // => Logs 'a' then 'b' (iteration order is not guaranteed).
*/
function forEach(collection, iteratee) {
var func = isArray(collection) ? arrayEach : baseEach;
return func(collection, baseIteratee(iteratee, 3));
}
module.exports = forEach;
},{"./_arrayEach":151,"./_baseEach":165,"./_baseIteratee":178,"./isArray":279}],275:[function(require,module,exports){
var baseGet = require('./_baseGet');
/**
* Gets the value at `path` of `object`. If the resolved value is
* `undefined`, the `defaultValue` is used in its place.
*
* @static
* @memberOf _
* @since 3.7.0
* @category Object
* @param {Object} object The object to query.
* @param {Array|string} path The path of the property to get.
* @param {*} [defaultValue] The value returned for `undefined` resolved values.
* @returns {*} Returns the resolved value.
* @example
*
* var object = { 'a': [{ 'b': { 'c': 3 } }] };
*
* _.get(object, 'a[0].b.c');
* // => 3
*
* _.get(object, ['a', '0', 'b', 'c']);
* // => 3
*
* _.get(object, 'a.b.c', 'default');
* // => 'default'
*/
function get(object, path, defaultValue) {
var result = object == null ? undefined : baseGet(object, path);
return result === undefined ? defaultValue : result;
}
module.exports = get;
},{"./_baseGet":169}],276:[function(require,module,exports){
var baseHasIn = require('./_baseHasIn'),
hasPath = require('./_hasPath');
/**
* Checks if `path` is a direct or inherited property of `object`.
*
* @static
* @memberOf _
* @since 4.0.0
* @category Object
* @param {Object} object The object to query.
* @param {Array|string} path The path to check.
* @returns {boolean} Returns `true` if `path` exists, else `false`.
* @example
*
* var object = _.create({ 'a': _.create({ 'b': 2 }) });
*
* _.hasIn(object, 'a');
* // => true
*
* _.hasIn(object, 'a.b');
* // => true
*
* _.hasIn(object, ['a', 'b']);
* // => true
*
* _.hasIn(object, 'b');
* // => false
*/
function hasIn(object, path) {
return object != null && hasPath(object, path, baseHasIn);
}
module.exports = hasIn;
},{"./_baseHasIn":172,"./_hasPath":222}],277:[function(require,module,exports){
/**
* This method returns the first argument given to it.
*
* @static
* @since 0.1.0
* @memberOf _
* @category Util
* @param {*} value Any value.
* @returns {*} Returns `value`.
* @example
*
* var object = { 'user': 'fred' };
*
* console.log(_.identity(object) === object);
* // => true
*/
function identity(value) {
return value;
}
module.exports = identity;
},{}],278:[function(require,module,exports){
var isArrayLikeObject = require('./isArrayLikeObject');
/** `Object#toString` result references. */
var argsTag = '[object Arguments]';
/** Used for built-in method references. */
var objectProto = Object.prototype;
/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;
/**
* Used to resolve the
* [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
* of values.
*/
var objectToString = objectProto.toString;
/** Built-in value references. */
var propertyIsEnumerable = objectProto.propertyIsEnumerable;
/**
* Checks if `value` is likely an `arguments` object.
*
* @static
* @memberOf _
* @since 0.1.0
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is correctly classified,
* else `false`.
* @example
*
* _.isArguments(function() { return arguments; }());
* // => true
*
* _.isArguments([1, 2, 3]);
* // => false
*/
function isArguments(value) {
// Safari 8.1 incorrectly makes `arguments.callee` enumerable in strict mode.
return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') &&
(!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag);
}
module.exports = isArguments;
},{"./isArrayLikeObject":281}],279:[function(require,module,exports){
/**
* Checks if `value` is classified as an `Array` object.
*
* @static
* @memberOf _
* @since 0.1.0
* @type {Function}
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is correctly classified,
* else `false`.
* @example
*
* _.isArray([1, 2, 3]);
* // => true
*
* _.isArray(document.body.children);
* // => false
*
* _.isArray('abc');
* // => false
*
* _.isArray(_.noop);
* // => false
*/
var isArray = Array.isArray;
module.exports = isArray;
},{}],280:[function(require,module,exports){
var getLength = require('./_getLength'),
isFunction = require('./isFunction'),
isLength = require('./isLength');
/**
* Checks if `value` is array-like. A value is considered array-like if it's
* not a function and has a `value.length` that's an integer greater than or
* equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
*
* @static
* @memberOf _
* @since 4.0.0
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is array-like, else `false`.
* @example
*
* _.isArrayLike([1, 2, 3]);
* // => true
*
* _.isArrayLike(document.body.children);
* // => true
*
* _.isArrayLike('abc');
* // => true
*
* _.isArrayLike(_.noop);
* // => false
*/
function isArrayLike(value) {
return value != null && isLength(getLength(value)) && !isFunction(value);
}
module.exports = isArrayLike;
},{"./_getLength":213,"./isFunction":283,"./isLength":284}],281:[function(require,module,exports){
var isArrayLike = require('./isArrayLike'),
isObjectLike = require('./isObjectLike');
/**
* This method is like `_.isArrayLike` except that it also checks if `value`
* is an object.
*
* @static
* @memberOf _
* @since 4.0.0
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is an array-like object,
* else `false`.
* @example
*
* _.isArrayLikeObject([1, 2, 3]);
* // => true
*
* _.isArrayLikeObject(document.body.children);
* // => true
*
* _.isArrayLikeObject('abc');
* // => false
*
* _.isArrayLikeObject(_.noop);
* // => false
*/
function isArrayLikeObject(value) {
return isObjectLike(value) && isArrayLike(value);
}
module.exports = isArrayLikeObject;
},{"./isArrayLike":280,"./isObjectLike":286}],282:[function(require,module,exports){
var root = require('./_root'),
stubFalse = require('./stubFalse');
/** Detect free variable `exports`. */
var freeExports = typeof exports == 'object' && exports;
/** Detect free variable `module`. */
var freeModule = freeExports && typeof module == 'object' && module;
/** Detect the popular CommonJS extension `module.exports`. */
var moduleExports = freeModule && freeModule.exports === freeExports;
/** Built-in value references. */
var Buffer = moduleExports ? root.Buffer : undefined;
/**
* Checks if `value` is a buffer.
*
* @static
* @memberOf _
* @since 4.3.0
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is a buffer, else `false`.
* @example
*
* _.isBuffer(new Buffer(2));
* // => true
*
* _.isBuffer(new Uint8Array(2));
* // => false
*/
var isBuffer = !Buffer ? stubFalse : function(value) {
return value instanceof Buffer;
};
module.exports = isBuffer;
},{"./_root":256,"./stubFalse":299}],283:[function(require,module,exports){
var isObject = require('./isObject');
/** `Object#toString` result references. */
var funcTag = '[object Function]',
genTag = '[object GeneratorFunction]';
/** Used for built-in method references. */
var objectProto = Object.prototype;
/**
* Used to resolve the
* [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
* of values.
*/
var objectToString = objectProto.toString;
/**
* Checks if `value` is classified as a `Function` object.
*
* @static
* @memberOf _
* @since 0.1.0
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is correctly classified,
* else `false`.
* @example
*
* _.isFunction(_);
* // => true
*
* _.isFunction(/abc/);
* // => false
*/
function isFunction(value) {
// The use of `Object#toString` avoids issues with the `typeof` operator
// in Safari 8 which returns 'object' for typed array and weak map constructors,
// and PhantomJS 1.9 which returns 'function' for `NodeList` instances.
var tag = isObject(value) ? objectToString.call(value) : '';
return tag == funcTag || tag == genTag;
}
module.exports = isFunction;
},{"./isObject":285}],284:[function(require,module,exports){
/** Used as references for various `Number` constants. */
var MAX_SAFE_INTEGER = 9007199254740991;
/**
* Checks if `value` is a valid array-like length.
*
* **Note:** This function is loosely based on
* [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength).
*
* @static
* @memberOf _
* @since 4.0.0
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is a valid length,
* else `false`.
* @example
*
* _.isLength(3);
* // => true
*
* _.isLength(Number.MIN_VALUE);
* // => false
*
* _.isLength(Infinity);
* // => false
*
* _.isLength('3');
* // => false
*/
function isLength(value) {
return typeof value == 'number' &&
value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
}
module.exports = isLength;
},{}],285:[function(require,module,exports){
/**
* Checks if `value` is the
* [language type](http://www.ecma-international.org/ecma-262/6.0/#sec-ecmascript-language-types)
* of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
*
* @static
* @memberOf _
* @since 0.1.0
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is an object, else `false`.
* @example
*
* _.isObject({});
* // => true
*
* _.isObject([1, 2, 3]);
* // => true
*
* _.isObject(_.noop);
* // => true
*
* _.isObject(null);
* // => false
*/
function isObject(value) {
var type = typeof value;
return !!value && (type == 'object' || type == 'function');
}
module.exports = isObject;
},{}],286:[function(require,module,exports){
/**
* Checks if `value` is object-like. A value is object-like if it's not `null`
* and has a `typeof` result of "object".
*
* @static
* @memberOf _
* @since 4.0.0
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is object-like, else `false`.
* @example
*
* _.isObjectLike({});
* // => true
*
* _.isObjectLike([1, 2, 3]);
* // => true
*
* _.isObjectLike(_.noop);
* // => false
*
* _.isObjectLike(null);
* // => false
*/
function isObjectLike(value) {
return !!value && typeof value == 'object';
}
module.exports = isObjectLike;
},{}],287:[function(require,module,exports){
var getPrototype = require('./_getPrototype'),
isHostObject = require('./_isHostObject'),
isObjectLike = require('./isObjectLike');
/** `Object#toString` result references. */
var objectTag = '[object Object]';
/** Used for built-in method references. */
var objectProto = Object.prototype;
/** Used to resolve the decompiled source of functions. */
var funcToString = Function.prototype.toString;
/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;
/** Used to infer the `Object` constructor. */
var objectCtorString = funcToString.call(Object);
/**
* Used to resolve the
* [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
* of values.
*/
var objectToString = objectProto.toString;
/**
* Checks if `value` is a plain object, that is, an object created by the
* `Object` constructor or one with a `[[Prototype]]` of `null`.
*
* @static
* @memberOf _
* @since 0.8.0
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is a plain object,
* else `false`.
* @example
*
* function Foo() {
* this.a = 1;
* }
*
* _.isPlainObject(new Foo);
* // => false
*
* _.isPlainObject([1, 2, 3]);
* // => false
*
* _.isPlainObject({ 'x': 0, 'y': 0 });
* // => true
*
* _.isPlainObject(Object.create(null));
* // => true
*/
function isPlainObject(value) {
if (!isObjectLike(value) ||
objectToString.call(value) != objectTag || isHostObject(value)) {
return false;
}
var proto = getPrototype(value);
if (proto === null) {
return true;
}
var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;
return (typeof Ctor == 'function' &&
Ctor instanceof Ctor && funcToString.call(Ctor) == objectCtorString);
}
module.exports = isPlainObject;
},{"./_getPrototype":217,"./_isHostObject":234,"./isObjectLike":286}],288:[function(require,module,exports){
var isArray = require('./isArray'),
isObjectLike = require('./isObjectLike');
/** `Object#toString` result references. */
var stringTag = '[object String]';
/** Used for built-in method references. */
var objectProto = Object.prototype;
/**
* Used to resolve the
* [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
* of values.
*/
var objectToString = objectProto.toString;
/**
* Checks if `value` is classified as a `String` primitive or object.
*
* @static
* @since 0.1.0
* @memberOf _
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is correctly classified,
* else `false`.
* @example
*
* _.isString('abc');
* // => true
*
* _.isString(1);
* // => false
*/
function isString(value) {
return typeof value == 'string' ||
(!isArray(value) && isObjectLike(value) && objectToString.call(value) == stringTag);
}
module.exports = isString;
},{"./isArray":279,"./isObjectLike":286}],289:[function(require,module,exports){
var isObjectLike = require('./isObjectLike');
/** `Object#toString` result references. */
var symbolTag = '[object Symbol]';
/** Used for built-in method references. */
var objectProto = Object.prototype;
/**
* Used to resolve the
* [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
* of values.
*/
var objectToString = objectProto.toString;
/**
* Checks if `value` is classified as a `Symbol` primitive or object.
*
* @static
* @memberOf _
* @since 4.0.0
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is correctly classified,
* else `false`.
* @example
*
* _.isSymbol(Symbol.iterator);
* // => true
*
* _.isSymbol('abc');
* // => false
*/
function isSymbol(value) {
return typeof value == 'symbol' ||
(isObjectLike(value) && objectToString.call(value) == symbolTag);
}
module.exports = isSymbol;
},{"./isObjectLike":286}],290:[function(require,module,exports){
var isLength = require('./isLength'),
isObjectLike = require('./isObjectLike');
/** `Object#toString` result references. */
var argsTag = '[object Arguments]',
arrayTag = '[object Array]',
boolTag = '[object Boolean]',
dateTag = '[object Date]',
errorTag = '[object Error]',
funcTag = '[object Function]',
mapTag = '[object Map]',
numberTag = '[object Number]',
objectTag = '[object Object]',
regexpTag = '[object RegExp]',
setTag = '[object Set]',
stringTag = '[object String]',
weakMapTag = '[object WeakMap]';
var arrayBufferTag = '[object ArrayBuffer]',
dataViewTag = '[object DataView]',
float32Tag = '[object Float32Array]',
float64Tag = '[object Float64Array]',
int8Tag = '[object Int8Array]',
int16Tag = '[object Int16Array]',
int32Tag = '[object Int32Array]',
uint8Tag = '[object Uint8Array]',
uint8ClampedTag = '[object Uint8ClampedArray]',
uint16Tag = '[object Uint16Array]',
uint32Tag = '[object Uint32Array]';
/** Used to identify `toStringTag` values of typed arrays. */
var typedArrayTags = {};
typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =
typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =
typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =
typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =
typedArrayTags[uint32Tag] = true;
typedArrayTags[argsTag] = typedArrayTags[arrayTag] =
typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =
typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =
typedArrayTags[errorTag] = typedArrayTags[funcTag] =
typedArrayTags[mapTag] = typedArrayTags[numberTag] =
typedArrayTags[objectTag] = typedArrayTags[regexpTag] =
typedArrayTags[setTag] = typedArrayTags[stringTag] =
typedArrayTags[weakMapTag] = false;
/** Used for built-in method references. */
var objectProto = Object.prototype;
/**
* Used to resolve the
* [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
* of values.
*/
var objectToString = objectProto.toString;
/**
* Checks if `value` is classified as a typed array.
*
* @static
* @memberOf _
* @since 3.0.0
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is correctly classified,
* else `false`.
* @example
*
* _.isTypedArray(new Uint8Array);
* // => true
*
* _.isTypedArray([]);
* // => false
*/
function isTypedArray(value) {
return isObjectLike(value) &&
isLength(value.length) && !!typedArrayTags[objectToString.call(value)];
}
module.exports = isTypedArray;
},{"./isLength":284,"./isObjectLike":286}],291:[function(require,module,exports){
var baseHas = require('./_baseHas'),
baseKeys = require('./_baseKeys'),
indexKeys = require('./_indexKeys'),
isArrayLike = require('./isArrayLike'),
isIndex = require('./_isIndex'),
isPrototype = require('./_isPrototype');
/**
* Creates an array of the own enumerable property names of `object`.
*
* **Note:** Non-object values are coerced to objects. See the
* [ES spec](http://ecma-international.org/ecma-262/6.0/#sec-object.keys)
* for more details.
*
* @static
* @since 0.1.0
* @memberOf _
* @category Object
* @param {Object} object The object to query.
* @returns {Array} Returns the array of property names.
* @example
*
* function Foo() {
* this.a = 1;
* this.b = 2;
* }
*
* Foo.prototype.c = 3;
*
* _.keys(new Foo);
* // => ['a', 'b'] (iteration order is not guaranteed)
*
* _.keys('hi');
* // => ['0', '1']
*/
function keys(object) {
var isProto = isPrototype(object);
if (!(isProto || isArrayLike(object))) {
return baseKeys(object);
}
var indexes = indexKeys(object),
skipIndexes = !!indexes,
result = indexes || [],
length = result.length;
for (var key in object) {
if (baseHas(object, key) &&
!(skipIndexes && (key == 'length' || isIndex(key, length))) &&
!(isProto && key == 'constructor')) {
result.push(key);
}
}
return result;
}
module.exports = keys;
},{"./_baseHas":171,"./_baseKeys":179,"./_indexKeys":228,"./_isIndex":235,"./_isPrototype":240,"./isArrayLike":280}],292:[function(require,module,exports){
var baseKeysIn = require('./_baseKeysIn'),
indexKeys = require('./_indexKeys'),
isIndex = require('./_isIndex'),
isPrototype = require('./_isPrototype');
/** Used for built-in method references. */
var objectProto = Object.prototype;
/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;
/**
* Creates an array of the own and inherited enumerable property names of `object`.
*
* **Note:** Non-object values are coerced to objects.
*
* @static
* @memberOf _
* @since 3.0.0
* @category Object
* @param {Object} object The object to query.
* @returns {Array} Returns the array of property names.
* @example
*
* function Foo() {
* this.a = 1;
* this.b = 2;
* }
*
* Foo.prototype.c = 3;
*
* _.keysIn(new Foo);
* // => ['a', 'b', 'c'] (iteration order is not guaranteed)
*/
function keysIn(object) {
var index = -1,
isProto = isPrototype(object),
props = baseKeysIn(object),
propsLength = props.length,
indexes = indexKeys(object),
skipIndexes = !!indexes,
result = indexes || [],
length = result.length;
while (++index < propsLength) {
var key = props[index];
if (!(skipIndexes && (key == 'length' || isIndex(key, length))) &&
!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {
result.push(key);
}
}
return result;
}
module.exports = keysIn;
},{"./_baseKeysIn":180,"./_indexKeys":228,"./_isIndex":235,"./_isPrototype":240}],293:[function(require,module,exports){
var MapCache = require('./_MapCache');
/** Used as the `TypeError` message for "Functions" methods. */
var FUNC_ERROR_TEXT = 'Expected a function';
/**
* Creates a function that memoizes the result of `func`. If `resolver` is
* provided, it determines the cache key for storing the result based on the
* arguments provided to the memoized function. By default, the first argument
* provided to the memoized function is used as the map cache key. The `func`
* is invoked with the `this` binding of the memoized function.
*
* **Note:** The cache is exposed as the `cache` property on the memoized
* function. Its creation may be customized by replacing the `_.memoize.Cache`
* constructor with one whose instances implement the
* [`Map`](http://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-map-prototype-object)
* method interface of `delete`, `get`, `has`, and `set`.
*
* @static
* @memberOf _
* @since 0.1.0
* @category Function
* @param {Function} func The function to have its output memoized.
* @param {Function} [resolver] The function to resolve the cache key.
* @returns {Function} Returns the new memoized function.
* @example
*
* var object = { 'a': 1, 'b': 2 };
* var other = { 'c': 3, 'd': 4 };
*
* var values = _.memoize(_.values);
* values(object);
* // => [1, 2]
*
* values(other);
* // => [3, 4]
*
* object.a = 2;
* values(object);
* // => [1, 2]
*
* // Modify the result cache.
* values.cache.set(object, ['a', 'b']);
* values(object);
* // => ['a', 'b']
*
* // Replace `_.memoize.Cache`.
* _.memoize.Cache = WeakMap;
*/
function memoize(func, resolver) {
if (typeof func != 'function' || (resolver && typeof resolver != 'function')) {
throw new TypeError(FUNC_ERROR_TEXT);
}
var memoized = function() {
var args = arguments,
key = resolver ? resolver.apply(this, args) : args[0],
cache = memoized.cache;
if (cache.has(key)) {
return cache.get(key);
}
var result = func.apply(this, args);
memoized.cache = cache.set(key, result);
return result;
};
memoized.cache = new (memoize.Cache || MapCache);
return memoized;
}
// Assign cache to `_.memoize`.
memoize.Cache = MapCache;
module.exports = memoize;
},{"./_MapCache":139}],294:[function(require,module,exports){
var arrayMap = require('./_arrayMap'),
baseDifference = require('./_baseDifference'),
baseFlatten = require('./_baseFlatten'),
basePick = require('./_basePick'),
getAllKeysIn = require('./_getAllKeysIn'),
rest = require('./rest'),
toKey = require('./_toKey');
/**
* The opposite of `_.pick`; this method creates an object composed of the
* own and inherited enumerable string keyed properties of `object` that are
* not omitted.
*
* @static
* @since 0.1.0
* @memberOf _
* @category Object
* @param {Object} object The source object.
* @param {...(string|string[])} [props] The property identifiers to omit.
* @returns {Object} Returns the new object.
* @example
*
* var object = { 'a': 1, 'b': '2', 'c': 3 };
*
* _.omit(object, ['a', 'c']);
* // => { 'b': '2' }
*/
var omit = rest(function(object, props) {
if (object == null) {
return {};
}
props = arrayMap(baseFlatten(props, 1), toKey);
return basePick(object, baseDifference(getAllKeysIn(object), props));
});
module.exports = omit;
},{"./_arrayMap":154,"./_baseDifference":164,"./_baseFlatten":166,"./_basePick":183,"./_getAllKeysIn":212,"./_toKey":266,"./rest":297}],295:[function(require,module,exports){
var baseProperty = require('./_baseProperty'),
basePropertyDeep = require('./_basePropertyDeep'),
isKey = require('./_isKey'),
toKey = require('./_toKey');
/**
* Creates a function that returns the value at `path` of a given object.
*
* @static
* @memberOf _
* @since 2.4.0
* @category Util
* @param {Array|string} path The path of the property to get.
* @returns {Function} Returns the new accessor function.
* @example
*
* var objects = [
* { 'a': { 'b': 2 } },
* { 'a': { 'b': 1 } }
* ];
*
* _.map(objects, _.property('a.b'));
* // => [2, 1]
*
* _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');
* // => [1, 2]
*/
function property(path) {
return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);
}
module.exports = property;
},{"./_baseProperty":184,"./_basePropertyDeep":185,"./_isKey":237,"./_toKey":266}],296:[function(require,module,exports){
var arrayReduce = require('./_arrayReduce'),
baseEach = require('./_baseEach'),
baseIteratee = require('./_baseIteratee'),
baseReduce = require('./_baseReduce'),
isArray = require('./isArray');
/**
* Reduces `collection` to a value which is the accumulated result of running
* each element in `collection` thru `iteratee`, where each successive
* invocation is supplied the return value of the previous. If `accumulator`
* is not given, the first element of `collection` is used as the initial
* value. The iteratee is invoked with four arguments:
* (accumulator, value, index|key, collection).
*
* Many lodash methods are guarded to work as iteratees for methods like
* `_.reduce`, `_.reduceRight`, and `_.transform`.
*
* The guarded methods are:
* `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,
* and `sortBy`
*
* @static
* @memberOf _
* @since 0.1.0
* @category Collection
* @param {Array|Object} collection The collection to iterate over.
* @param {Function} [iteratee=_.identity] The function invoked per iteration.
* @param {*} [accumulator] The initial value.
* @returns {*} Returns the accumulated value.
* @see _.reduceRight
* @example
*
* _.reduce([1, 2], function(sum, n) {
* return sum + n;
* }, 0);
* // => 3
*
* _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
* (result[value] || (result[value] = [])).push(key);
* return result;
* }, {});
* // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)
*/
function reduce(collection, iteratee, accumulator) {
var func = isArray(collection) ? arrayReduce : baseReduce,
initAccum = arguments.length < 3;
return func(collection, baseIteratee(iteratee, 4), accumulator, initAccum, baseEach);
}
module.exports = reduce;
},{"./_arrayReduce":156,"./_baseEach":165,"./_baseIteratee":178,"./_baseReduce":186,"./isArray":279}],297:[function(require,module,exports){
var apply = require('./_apply'),
toInteger = require('./toInteger');
/** Used as the `TypeError` message for "Functions" methods. */
var FUNC_ERROR_TEXT = 'Expected a function';
/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeMax = Math.max;
/**
* Creates a function that invokes `func` with the `this` binding of the
* created function and arguments from `start` and beyond provided as
* an array.
*
* **Note:** This method is based on the
* [rest parameter](https://mdn.io/rest_parameters).
*
* @static
* @memberOf _
* @since 4.0.0
* @category Function
* @param {Function} func The function to apply a rest parameter to.
* @param {number} [start=func.length-1] The start position of the rest parameter.
* @returns {Function} Returns the new function.
* @example
*
* var say = _.rest(function(what, names) {
* return what + ' ' + _.initial(names).join(', ') +
* (_.size(names) > 1 ? ', & ' : '') + _.last(names);
* });
*
* say('hello', 'fred', 'barney', 'pebbles');
* // => 'hello fred, barney, & pebbles'
*/
function rest(func, start) {
if (typeof func != 'function') {
throw new TypeError(FUNC_ERROR_TEXT);
}
start = nativeMax(start === undefined ? (func.length - 1) : toInteger(start), 0);
return function() {
var args = arguments,
index = -1,
length = nativeMax(args.length - start, 0),
array = Array(length);
while (++index < length) {
array[index] = args[start + index];
}
switch (start) {
case 0: return func.call(this, array);
case 1: return func.call(this, args[0], array);
case 2: return func.call(this, args[0], args[1], array);
}
var otherArgs = Array(start + 1);
index = -1;
while (++index < start) {
otherArgs[index] = args[index];
}
otherArgs[start] = array;
return apply(func, this, otherArgs);
};
}
module.exports = rest;
},{"./_apply":150,"./toInteger":301}],298:[function(require,module,exports){
/**
* A method that returns a new empty array.
*
* @static
* @memberOf _
* @since 4.13.0
* @category Util
* @returns {Array} Returns the new empty array.
* @example
*
* var arrays = _.times(2, _.stubArray);
*
* console.log(arrays);
* // => [[], []]
*
* console.log(arrays[0] === arrays[1]);
* // => false
*/
function stubArray() {
return [];
}
module.exports = stubArray;
},{}],299:[function(require,module,exports){
/**
* A method that returns `false`.
*
* @static
* @memberOf _
* @since 4.13.0
* @category Util
* @returns {boolean} Returns `false`.
* @example
*
* _.times(2, _.stubFalse);
* // => [false, false]
*/
function stubFalse() {
return false;
}
module.exports = stubFalse;
},{}],300:[function(require,module,exports){
var toNumber = require('./toNumber');
/** Used as references for various `Number` constants. */
var INFINITY = 1 / 0,
MAX_INTEGER = 1.7976931348623157e+308;
/**
* Converts `value` to a finite number.
*
* @static
* @memberOf _
* @since 4.12.0
* @category Lang
* @param {*} value The value to convert.
* @returns {number} Returns the converted number.
* @example
*
* _.toFinite(3.2);
* // => 3.2
*
* _.toFinite(Number.MIN_VALUE);
* // => 5e-324
*
* _.toFinite(Infinity);
* // => 1.7976931348623157e+308
*
* _.toFinite('3.2');
* // => 3.2
*/
function toFinite(value) {
if (!value) {
return value === 0 ? value : 0;
}
value = toNumber(value);
if (value === INFINITY || value === -INFINITY) {
var sign = (value < 0 ? -1 : 1);
return sign * MAX_INTEGER;
}
return value === value ? value : 0;
}
module.exports = toFinite;
},{"./toNumber":302}],301:[function(require,module,exports){
var toFinite = require('./toFinite');
/**
* Converts `value` to an integer.
*
* **Note:** This method is loosely based on
* [`ToInteger`](http://www.ecma-international.org/ecma-262/6.0/#sec-tointeger).
*
* @static
* @memberOf _
* @since 4.0.0
* @category Lang
* @param {*} value The value to convert.
* @returns {number} Returns the converted integer.
* @example
*
* _.toInteger(3.2);
* // => 3
*
* _.toInteger(Number.MIN_VALUE);
* // => 0
*
* _.toInteger(Infinity);
* // => 1.7976931348623157e+308
*
* _.toInteger('3.2');
* // => 3
*/
function toInteger(value) {
var result = toFinite(value),
remainder = result % 1;
return result === result ? (remainder ? result - remainder : result) : 0;
}
module.exports = toInteger;
},{"./toFinite":300}],302:[function(require,module,exports){
var isFunction = require('./isFunction'),
isObject = require('./isObject'),
isSymbol = require('./isSymbol');
/** Used as references for various `Number` constants. */
var NAN = 0 / 0;
/** Used to match leading and trailing whitespace. */
var reTrim = /^\s+|\s+$/g;
/** Used to detect bad signed hexadecimal string values. */
var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
/** Used to detect binary string values. */
var reIsBinary = /^0b[01]+$/i;
/** Used to detect octal string values. */
var reIsOctal = /^0o[0-7]+$/i;
/** Built-in method references without a dependency on `root`. */
var freeParseInt = parseInt;
/**
* Converts `value` to a number.
*
* @static
* @memberOf _
* @since 4.0.0
* @category Lang
* @param {*} value The value to process.
* @returns {number} Returns the number.
* @example
*
* _.toNumber(3.2);
* // => 3.2
*
* _.toNumber(Number.MIN_VALUE);
* // => 5e-324
*
* _.toNumber(Infinity);
* // => Infinity
*
* _.toNumber('3.2');
* // => 3.2
*/
function toNumber(value) {
if (typeof value == 'number') {
return value;
}
if (isSymbol(value)) {
return NAN;
}
if (isObject(value)) {
var other = isFunction(value.valueOf) ? value.valueOf() : value;
value = isObject(other) ? (other + '') : other;
}
if (typeof value != 'string') {
return value === 0 ? value : +value;
}
value = value.replace(reTrim, '');
var isBinary = reIsBinary.test(value);
return (isBinary || reIsOctal.test(value))
? freeParseInt(value.slice(2), isBinary ? 2 : 8)
: (reIsBadHex.test(value) ? NAN : +value);
}
module.exports = toNumber;
},{"./isFunction":283,"./isObject":285,"./isSymbol":289}],303:[function(require,module,exports){
var baseToString = require('./_baseToString');
/**
* Converts `value` to a string. An empty string is returned for `null`
* and `undefined` values. The sign of `-0` is preserved.
*
* @static
* @memberOf _
* @since 4.0.0
* @category Lang
* @param {*} value The value to process.
* @returns {string} Returns the string.
* @example
*
* _.toString(null);
* // => ''
*
* _.toString(-0);
* // => '-0'
*
* _.toString([1, 2, 3]);
* // => '1,2,3'
*/
function toString(value) {
return value == null ? '' : baseToString(value);
}
module.exports = toString;
},{"./_baseToString":188}],304:[function(require,module,exports){
module.exports = '1.0.4'
},{}],"contentful-management":[function(require,module,exports){
// To understand why axios is vendored, check SETUP.md
var axios = require('contentful-sdk-core/vendor-browser/axios')
var contentfulManagement = require('./dist/contentful-management').default
module.exports = {
createClient: function (params) {
return contentfulManagement(axios, params)
}
}
},{"./dist/contentful-management":2,"contentful-sdk-core/vendor-browser/axios":134}]},{},[])
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2Jyb3dzZXItcGFjay9fcHJlbHVkZS5qcyIsIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3Byb2Nlc3MvYnJvd3Nlci5qcyIsImRpc3QvY29udGVudGZ1bC1tYW5hZ2VtZW50LmpzIiwiZGlzdC9jcmVhdGUtYmFja29mZi5qcyIsImRpc3QvY3JlYXRlLWNvbnRlbnRmdWwtYXBpLmpzIiwiZGlzdC9jcmVhdGUtc3BhY2UtYXBpLmpzIiwiZGlzdC9lbmhhbmNlLXdpdGgtbWV0aG9kcy5qcyIsImRpc3QvZW50aXRpZXMvYXBpLWtleS5qcyIsImRpc3QvZW50aXRpZXMvYXNzZXQuanMiLCJkaXN0L2VudGl0aWVzL2NvbnRlbnQtdHlwZS5qcyIsImRpc3QvZW50aXRpZXMvZW50cnkuanMiLCJkaXN0L2VudGl0aWVzL2luZGV4LmpzIiwiZGlzdC9lbnRpdGllcy9sb2NhbGUuanMiLCJkaXN0L2VudGl0aWVzL3JvbGUuanMiLCJkaXN0L2VudGl0aWVzL3NwYWNlLW1lbWJlcnNoaXAuanMiLCJkaXN0L2VudGl0aWVzL3NwYWNlLmpzIiwiZGlzdC9lbnRpdGllcy93ZWJob29rLmpzIiwiZGlzdC9lcnJvci1oYW5kbGVyLmpzIiwiZGlzdC9pbnN0YW5jZS1hY3Rpb25zLmpzIiwiZGlzdC9wcm9taXNlZC13YWl0LmpzIiwiZGlzdC9yYXRlLWxpbWl0LmpzIiwiZGlzdC93cmFwLWh0dHAtY2xpZW50LmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9nZXQtaXRlcmF0b3IuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9jb3JlLWpzL2lzLWl0ZXJhYmxlLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9qc29uL3N0cmluZ2lmeS5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2NvcmUtanMvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eS5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2NvcmUtanMvb2JqZWN0L2ZyZWV6ZS5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2NvcmUtanMvb2JqZWN0L2tleXMuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9jb3JlLWpzL3Byb21pc2UuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9jb3JlLWpzL3N5bWJvbC5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2NvcmUtanMvc3ltYm9sL2l0ZXJhdG9yLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvaGVscGVycy9zbGljZWRUb0FycmF5LmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvaGVscGVycy90eXBlb2YuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L2ZuL2dldC1pdGVyYXRvci5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vaXMtaXRlcmFibGUuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L2ZuL2pzb24vc3RyaW5naWZ5LmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvZGVmaW5lLXByb3BlcnR5LmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvZnJlZXplLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9vYmplY3Qva2V5cy5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vcHJvbWlzZS5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vc3ltYm9sL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9zeW1ib2wvaXRlcmF0b3IuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2EtZnVuY3Rpb24uanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2FkZC10by11bnNjb3BhYmxlcy5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fYW4taW5zdGFuY2UuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2FuLW9iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fYXJyYXktaW5jbHVkZXMuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2NsYXNzb2YuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2NvZi5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fY29yZS5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fY3R4LmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19kZWZpbmVkLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19kZXNjcmlwdG9ycy5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZG9tLWNyZWF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZW51bS1idWcta2V5cy5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZW51bS1rZXlzLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19leHBvcnQuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2ZhaWxzLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19mb3Itb2YuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2dsb2JhbC5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faGFzLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19oaWRlLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19odG1sLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pZTgtZG9tLWRlZmluZS5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faW52b2tlLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pb2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pcy1hcnJheS1pdGVyLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pcy1hcnJheS5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faXMtb2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pdGVyLWNhbGwuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2l0ZXItY3JlYXRlLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pdGVyLWRlZmluZS5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faXRlci1kZXRlY3QuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2l0ZXItc3RlcC5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faXRlcmF0b3JzLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19rZXlvZi5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fbGlicmFyeS5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fbWV0YS5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fbWljcm90YXNrLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtY3JlYXRlLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtZHAuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1kcHMuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1nb3BkLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtZ29wbi1leHQuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1nb3BuLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtZ29wcy5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWdwby5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWtleXMtaW50ZXJuYWwuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1rZXlzLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtcGllLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3Qtc2FwLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19wcm9wZXJ0eS1kZXNjLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19yZWRlZmluZS1hbGwuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3JlZGVmaW5lLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19zZXQtcHJvdG8uanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3NldC1zcGVjaWVzLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19zZXQtdG8tc3RyaW5nLXRhZy5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fc2hhcmVkLWtleS5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fc2hhcmVkLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19zcGVjaWVzLWNvbnN0cnVjdG9yLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19zdHJpbmctYXQuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3Rhc2suanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3RvLWluZGV4LmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL190by1pbnRlZ2VyLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL190by1pb2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL190by1sZW5ndGguanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3RvLW9iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdG8tcHJpbWl0aXZlLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL191aWQuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3drcy1kZWZpbmUuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3drcy1leHQuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3drcy5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9jb3JlLmdldC1pdGVyYXRvci1tZXRob2QuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvY29yZS5nZXQtaXRlcmF0b3IuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvY29yZS5pcy1pdGVyYWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYuYXJyYXkuaXRlcmF0b3IuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2Lm9iamVjdC5kZWZpbmUtcHJvcGVydHkuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2Lm9iamVjdC5mcmVlemUuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2Lm9iamVjdC5rZXlzLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5vYmplY3QudG8tc3RyaW5nLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5wcm9taXNlLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5zdHJpbmcuaXRlcmF0b3IuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2LnN5bWJvbC5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczcuc3ltYm9sLmFzeW5jLWl0ZXJhdG9yLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNy5zeW1ib2wub2JzZXJ2YWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy93ZWIuZG9tLml0ZXJhYmxlLmpzIiwibm9kZV9tb2R1bGVzL2NvbnRlbnRmdWwtc2RrLWNvcmUvY3JlYXRlLWh0dHAtY2xpZW50LmpzIiwibm9kZV9tb2R1bGVzL2NvbnRlbnRmdWwtc2RrLWNvcmUvY3JlYXRlLXJlcXVlc3QtY29uZmlnLmpzIiwibm9kZV9tb2R1bGVzL2NvbnRlbnRmdWwtc2RrLWNvcmUvZnJlZXplLXN5cy5qcyIsIm5vZGVfbW9kdWxlcy9jb250ZW50ZnVsLXNkay1jb3JlL21peGlucy90by1wbGFpbi1vYmplY3QuanMiLCJub2RlX21vZHVsZXMvY29udGVudGZ1bC1zZGstY29yZS9ub2RlX21vZHVsZXMvcXMvbGliL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2NvbnRlbnRmdWwtc2RrLWNvcmUvbm9kZV9tb2R1bGVzL3FzL2xpYi9wYXJzZS5qcyIsIm5vZGVfbW9kdWxlcy9jb250ZW50ZnVsLXNkay1jb3JlL25vZGVfbW9kdWxlcy9xcy9saWIvc3RyaW5naWZ5LmpzIiwibm9kZV9tb2R1bGVzL2NvbnRlbnRmdWwtc2RrLWNvcmUvbm9kZV9tb2R1bGVzL3FzL2xpYi91dGlscy5qcyIsIm5vZGVfbW9kdWxlcy9jb250ZW50ZnVsLXNkay1jb3JlL3ZlbmRvci1icm93c2VyL2F4aW9zLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fRGF0YVZpZXcuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19IYXNoLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fTGlzdENhY2hlLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fTWFwLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fTWFwQ2FjaGUuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19Qcm9taXNlLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fUmVmbGVjdC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX1NldC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX1NldENhY2hlLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fU3RhY2suanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19TeW1ib2wuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19VaW50OEFycmF5LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fV2Vha01hcC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2FkZE1hcEVudHJ5LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fYWRkU2V0RW50cnkuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19hcHBseS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2FycmF5RWFjaC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2FycmF5SW5jbHVkZXMuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19hcnJheUluY2x1ZGVzV2l0aC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2FycmF5TWFwLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fYXJyYXlQdXNoLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fYXJyYXlSZWR1Y2UuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19hcnJheVNvbWUuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19hc3NpZ25JbkRlZmF1bHRzLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fYXNzaWduVmFsdWUuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19hc3NvY0luZGV4T2YuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlQXNzaWduLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUNsb25lLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUNyZWF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VEaWZmZXJlbmNlLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUVhY2guanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlRmxhdHRlbi5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VGb3IuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlRm9yT3duLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUdldC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VHZXRBbGxLZXlzLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUhhcy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VIYXNJbi5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJbmRleE9mLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUlzRXF1YWwuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSXNFcXVhbERlZXAuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSXNNYXRjaC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJc05hdGl2ZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJdGVyYXRlZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VLZXlzLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUtleXNJbi5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VNYXRjaGVzLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZU1hdGNoZXNQcm9wZXJ0eS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VQaWNrLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVByb3BlcnR5LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVByb3BlcnR5RGVlcC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VSZWR1Y2UuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlVGltZXMuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlVG9TdHJpbmcuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlVW5hcnkuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19jYWNoZUhhcy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Nhc3RQYXRoLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fY2hlY2tHbG9iYWwuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19jbG9uZUFycmF5QnVmZmVyLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fY2xvbmVCdWZmZXIuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19jbG9uZURhdGFWaWV3LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fY2xvbmVNYXAuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19jbG9uZVJlZ0V4cC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Nsb25lU2V0LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fY2xvbmVTeW1ib2wuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19jbG9uZVR5cGVkQXJyYXkuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19jb3B5QXJyYXkuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19jb3B5T2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fY29weVN5bWJvbHMuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19jb3JlSnNEYXRhLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fY3JlYXRlQXNzaWduZXIuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19jcmVhdGVCYXNlRWFjaC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2NyZWF0ZUJhc2VGb3IuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19lcXVhbEFycmF5cy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2VxdWFsQnlUYWcuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19lcXVhbE9iamVjdHMuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19nZXRBbGxLZXlzLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0QWxsS2V5c0luLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0TGVuZ3RoLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0TWFwRGF0YS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldE1hdGNoRGF0YS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldE5hdGl2ZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldFByb3RvdHlwZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldFN5bWJvbHMuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19nZXRTeW1ib2xzSW4uanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19nZXRUYWcuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19nZXRWYWx1ZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2hhc1BhdGguanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19oYXNoQ2xlYXIuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19oYXNoRGVsZXRlLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9faGFzaEdldC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2hhc2hIYXMuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19oYXNoU2V0LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9faW5kZXhLZXlzLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9faW5kZXhPZk5hTi5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2luaXRDbG9uZUFycmF5LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9faW5pdENsb25lQnlUYWcuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19pbml0Q2xvbmVPYmplY3QuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19pc0ZsYXR0ZW5hYmxlLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9faXNIb3N0T2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9faXNJbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2lzSXRlcmF0ZWVDYWxsLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9faXNLZXkuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19pc0tleWFibGUuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19pc01hc2tlZC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2lzUHJvdG90eXBlLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9faXNTdHJpY3RDb21wYXJhYmxlLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9faXRlcmF0b3JUb0FycmF5LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fbGlzdENhY2hlQ2xlYXIuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19saXN0Q2FjaGVEZWxldGUuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19saXN0Q2FjaGVHZXQuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19saXN0Q2FjaGVIYXMuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19saXN0Q2FjaGVTZXQuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19tYXBDYWNoZUNsZWFyLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fbWFwQ2FjaGVEZWxldGUuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19tYXBDYWNoZUdldC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX21hcENhY2hlSGFzLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fbWFwQ2FjaGVTZXQuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19tYXBUb0FycmF5LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fbWF0Y2hlc1N0cmljdENvbXBhcmFibGUuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19uYXRpdmVDcmVhdGUuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19yb290LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fc2V0Q2FjaGVBZGQuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19zZXRDYWNoZUhhcy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX3NldFRvQXJyYXkuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19zdGFja0NsZWFyLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fc3RhY2tEZWxldGUuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19zdGFja0dldC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX3N0YWNrSGFzLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fc3RhY2tTZXQuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19zdHJpbmdUb1BhdGguanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL190b0tleS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX3RvU291cmNlLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9hc3NpZ24uanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL2Fzc2lnbkluV2l0aC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvY2xvbmVEZWVwLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9kZWZhdWx0cy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvZWFjaC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvZXEuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL2ZvckVhY2guanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL2dldC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvaGFzSW4uanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL2lkZW50aXR5LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9pc0FyZ3VtZW50cy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvaXNBcnJheS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvaXNBcnJheUxpa2UuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL2lzQXJyYXlMaWtlT2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9pc0J1ZmZlci5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvaXNGdW5jdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvaXNMZW5ndGguanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL2lzT2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9pc09iamVjdExpa2UuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL2lzUGxhaW5PYmplY3QuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL2lzU3RyaW5nLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9pc1N5bWJvbC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvaXNUeXBlZEFycmF5LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9rZXlzLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9rZXlzSW4uanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL21lbW9pemUuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL29taXQuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL3Byb3BlcnR5LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9yZWR1Y2UuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL3Jlc3QuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL3N0dWJBcnJheS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvc3R1YkZhbHNlLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC90b0Zpbml0ZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvdG9JbnRlZ2VyLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC90b051bWJlci5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvdG9TdHJpbmcuanMiLCJ2ZXJzaW9uLmpzIiwiYnJvd3Nlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5ckJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1VUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0S0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9HQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25LQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaklBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVFQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQkE7QUFDQTtBQUNBOztBQ0ZBO0FBQ0E7QUFDQTs7QUNGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTs7QUNEQTtBQUNBOztBQ0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7O0FDRkE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBOztBQ0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4QkE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTs7QUNBQTtBQUNBO0FBQ0E7O0FDRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBOztBQ0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BCQTtBQUNBO0FBQ0E7O0FDRkE7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVEE7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ05BOztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ05BOztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTkE7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDYkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBOztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakNBO0FBQ0E7QUFDQTs7QUNGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBOztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxT0E7O0FDQUE7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2S0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzltQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0lBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25FQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9DQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDYkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDYkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQ0E7QUFDQTs7QUNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1QkE7QUFDQTs7QUNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKTt0aHJvdyBmLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pIiwiLy8gc2hpbSBmb3IgdXNpbmcgcHJvY2VzcyBpbiBicm93c2VyXG5cbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxucHJvY2Vzcy5uZXh0VGljayA9IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGNhblNldEltbWVkaWF0ZSA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnXG4gICAgJiYgd2luZG93LnNldEltbWVkaWF0ZTtcbiAgICB2YXIgY2FuTXV0YXRpb25PYnNlcnZlciA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnXG4gICAgJiYgd2luZG93Lk11dGF0aW9uT2JzZXJ2ZXI7XG4gICAgdmFyIGNhblBvc3QgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJ1xuICAgICYmIHdpbmRvdy5wb3N0TWVzc2FnZSAmJiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lclxuICAgIDtcblxuICAgIGlmIChjYW5TZXRJbW1lZGlhdGUpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChmKSB7IHJldHVybiB3aW5kb3cuc2V0SW1tZWRpYXRlKGYpIH07XG4gICAgfVxuXG4gICAgdmFyIHF1ZXVlID0gW107XG5cbiAgICBpZiAoY2FuTXV0YXRpb25PYnNlcnZlcikge1xuICAgICAgICB2YXIgaGlkZGVuRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdmFyIG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHF1ZXVlTGlzdCA9IHF1ZXVlLnNsaWNlKCk7XG4gICAgICAgICAgICBxdWV1ZS5sZW5ndGggPSAwO1xuICAgICAgICAgICAgcXVldWVMaXN0LmZvckVhY2goZnVuY3Rpb24gKGZuKSB7XG4gICAgICAgICAgICAgICAgZm4oKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBvYnNlcnZlci5vYnNlcnZlKGhpZGRlbkRpdiwgeyBhdHRyaWJ1dGVzOiB0cnVlIH0pO1xuXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBuZXh0VGljayhmbikge1xuICAgICAgICAgICAgaWYgKCFxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBoaWRkZW5EaXYuc2V0QXR0cmlidXRlKCd5ZXMnLCAnbm8nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHF1ZXVlLnB1c2goZm4pO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGlmIChjYW5Qb3N0KSB7XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgICB2YXIgc291cmNlID0gZXYuc291cmNlO1xuICAgICAgICAgICAgaWYgKChzb3VyY2UgPT09IHdpbmRvdyB8fCBzb3VyY2UgPT09IG51bGwpICYmIGV2LmRhdGEgPT09ICdwcm9jZXNzLXRpY2snKSB7XG4gICAgICAgICAgICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgaWYgKHF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGZuID0gcXVldWUuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgZm4oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHRydWUpO1xuXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBuZXh0VGljayhmbikge1xuICAgICAgICAgICAgcXVldWUucHVzaChmbik7XG4gICAgICAgICAgICB3aW5kb3cucG9zdE1lc3NhZ2UoJ3Byb2Nlc3MtdGljaycsICcqJyk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIG5leHRUaWNrKGZuKSB7XG4gICAgICAgIHNldFRpbWVvdXQoZm4sIDApO1xuICAgIH07XG59KSgpO1xuXG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbnByb2Nlc3Mub24gPSBub29wO1xucHJvY2Vzcy5hZGRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLm9uY2UgPSBub29wO1xucHJvY2Vzcy5vZmYgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUFsbExpc3RlbmVycyA9IG5vb3A7XG5wcm9jZXNzLmVtaXQgPSBub29wO1xuXG5wcm9jZXNzLmJpbmRpbmcgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5cbi8vIFRPRE8oc2h0eWxtYW4pXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xucHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IGNyZWF0ZUNsaWVudDtcblxudmFyIF9kZWZhdWx0cyA9IHJlcXVpcmUoJ2xvZGFzaC9kZWZhdWx0cycpO1xuXG52YXIgX2RlZmF1bHRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2RlZmF1bHRzKTtcblxudmFyIF9hc3NpZ24gPSByZXF1aXJlKCdsb2Rhc2gvYXNzaWduJyk7XG5cbnZhciBfYXNzaWduMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2Fzc2lnbik7XG5cbnZhciBfY2xvbmVEZWVwID0gcmVxdWlyZSgnbG9kYXNoL2Nsb25lRGVlcCcpO1xuXG52YXIgX2Nsb25lRGVlcDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbG9uZURlZXApO1xuXG52YXIgX2NyZWF0ZUh0dHBDbGllbnQgPSByZXF1aXJlKCdjb250ZW50ZnVsLXNkay1jb3JlL2NyZWF0ZS1odHRwLWNsaWVudCcpO1xuXG52YXIgX2NyZWF0ZUh0dHBDbGllbnQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY3JlYXRlSHR0cENsaWVudCk7XG5cbnZhciBfd3JhcEh0dHBDbGllbnQgPSByZXF1aXJlKCcuL3dyYXAtaHR0cC1jbGllbnQnKTtcblxudmFyIF93cmFwSHR0cENsaWVudDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF93cmFwSHR0cENsaWVudCk7XG5cbnZhciBfdmVyc2lvbiA9IHJlcXVpcmUoJy4uL3ZlcnNpb24nKTtcblxudmFyIF92ZXJzaW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3ZlcnNpb24pO1xuXG52YXIgX2NyZWF0ZUNvbnRlbnRmdWxBcGkgPSByZXF1aXJlKCcuL2NyZWF0ZS1jb250ZW50ZnVsLWFwaScpO1xuXG52YXIgX2NyZWF0ZUNvbnRlbnRmdWxBcGkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY3JlYXRlQ29udGVudGZ1bEFwaSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbi8qKlxuICogQ3JlYXRlIGEgY2xpZW50IGluc3RhbmNlXG4gKiBAZnVuY1xuICogQG5hbWUgY3JlYXRlQ2xpZW50XG4gKiBAbWVtYmVyb2YgY29udGVudGZ1bE1hbmFnZW1lbnRcbiAqIEBwYXJhbSB7b2JqZWN0fSBwYXJhbXMgLSBDbGllbnQgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyc1xuICogQHByb3Age3N0cmluZ30gcGFyYW1zLmFjY2Vzc1Rva2VuIC0gQ29udGVudGZ1bCBDREEgQWNjZXNzIFRva2VuXG4gKiBAcHJvcCB7Ym9vbGVhbj19IHBhcmFtcy5pbnNlY3VyZSAtIFJlcXVlc3RzIHdpbGwgYmUgbWFkZSBvdmVyIGh0dHAgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBodHRwcyAoZGVmYXVsdDogdHJ1ZSlcbiAqIEBwcm9wIHtzdHJpbmc9fSBwYXJhbXMuaG9zdCAtIEFQSSBob3N0IChkZWZhdWx0OiBjZGEuY29udGVudGZ1bC5jb20pXG4gKiBAcHJvcCB7b2JqZWN0PX0gcGFyYW1zLmFnZW50IC0gT3B0aW9uYWwgTm9kZS5qcyBIVFRQIGFnZW50IGZvciBwcm94eWluZyAoc2VlIDxhIGhyZWY9XCJodHRwczovL25vZGVqcy5vcmcvYXBpL2h0dHAuaHRtbCNodHRwX2NsYXNzX2h0dHBfYWdlbnRcIj5Ob2RlLmpzIGRvY3M8L2E+IGFuZCA8YSBocmVmPVwiaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvaHR0cHMtcHJveHktYWdlbnRcIj5odHRwcy1wcm94eS1hZ2VudDwvYT4pXG4gKiBAcHJvcCB7b2JqZWN0PX0gcGFyYW1zLmhlYWRlcnMgLSBPcHRpb25hbCBhZGRpdGlvbmFsIGhlYWRlcnNcbiAqIEBwcm9wIHtudW1iZXI9fSBwYXJhbXMuY29uY3VycmVuY3kgLSBOdW1iZXIgb2YgYWxsb3dlZCBjb25jdXJyZW50IHJlcXVlc3RzLiBDaGFuZ2luZyB0aGlzIHZhbHVlIGlzIG5vdCByZWNvbW1lbmRlZC4gKGRlZmF1bHQ6IDYpXG4gKiBAcHJvcCB7bnVtYmVyPX0gcGFyYW1zLmRlbGF5IC0gRGVsYXkgaW4gbWlsbGlzZWNvbmRzIGZvciB3YWl0aW5nIGFmdGVyIGhpdHRpbmcgdGhlIGFsbG93ZWQgbnVtYmVyIG9mIGNvbmN1cnJlbnQgcmVxdWVzdHMuIENoYW5naW5nIHRoaXMgdmFsdWUgaXMgbm90IHJlY29tbWVuZGVkLiAoZGVmYXVsdDogMTAwMClcbiAqIEBwcm9wIHtudW1iZXI9fSBwYXJhbXMubWF4UmV0cmllcyAtIE1heGltdW0gbnVtYmVyIG9mIHJldHJpZXMgd2hlbiBhIDQyOSBpcyByZWNlaXZlZCAoZGVmYXVsdDogNSlcbiAqIEBwcm9wIHtib29sZWFuPX0gcGFyYW1zLnJldHJ5T25Ub29NYW55UmVxdWVzdHMgLSBJZiB3ZSBzaG91bGQgcmV0cnkgb24gNDI5cyAoZGVmYXVsdDogdHJ1ZSlcbiAqIEByZXR1cm5zIHtDb250ZW50ZnVsQ2xpZW50QVBJLkNsaWVudEFQSX1cbiAqIEBleGFtcGxlXG4gKiBjb25zdCBjbGllbnQgPSBjb250ZW50ZnVsTWFuYWdlbWVudC5jcmVhdGVDbGllbnQoe1xuICogIGFjY2Vzc1Rva2VuOiAnbXlBY2Nlc3NUb2tlbidcbiAqIH0pXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUNsaWVudChheGlvcywgcGFyYW1zKSB7XG4gIHBhcmFtcyA9ICgwLCBfZGVmYXVsdHMyLmRlZmF1bHQpKCgwLCBfY2xvbmVEZWVwMi5kZWZhdWx0KShwYXJhbXMpLCB7XG4gICAgcmF0ZUxpbWl0OiA2LFxuICAgIHJhdGVMaW1pdFBlcmlvZDogMTAwMCxcbiAgICBtYXhSZXRyaWVzOiA1LFxuICAgIHJldHJ5T25Ub29NYW55UmVxdWVzdHM6IHRydWVcbiAgfSk7XG5cbiAgaWYgKCFwYXJhbXMuYWNjZXNzVG9rZW4pIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBwYXJhbWV0ZXIgYWNjZXNzVG9rZW4nKTtcbiAgfVxuXG4gIHBhcmFtcy5kZWZhdWx0SG9zdG5hbWUgPSAnYXBpLmNvbnRlbnRmdWwuY29tJztcbiAgcGFyYW1zLmhlYWRlcnMgPSAoMCwgX2Fzc2lnbjIuZGVmYXVsdCkocGFyYW1zLmhlYWRlcnMsIHtcbiAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL3ZuZC5jb250ZW50ZnVsLm1hbmFnZW1lbnQudjEranNvbicsXG4gICAgJ1gtQ29udGVudGZ1bC1Vc2VyLUFnZW50JzogJ2NvbnRlbnRmdWwtbWFuYWdlbWVudC5qcy8nICsgX3ZlcnNpb24yLmRlZmF1bHRcbiAgfSk7XG5cbiAgdmFyIGh0dHAgPSAoMCwgX3dyYXBIdHRwQ2xpZW50Mi5kZWZhdWx0KSgoMCwgX2NyZWF0ZUh0dHBDbGllbnQyLmRlZmF1bHQpKGF4aW9zLCBwYXJhbXMpLCB7XG4gICAgY29uY3VycmVuY3k6IHBhcmFtcy5yYXRlTGltaXQsXG4gICAgZGVsYXk6IHBhcmFtcy5yYXRlTGltaXRQZXJpb2QsXG4gICAgbWF4UmV0cmllczogcGFyYW1zLm1heFJldHJpZXMsXG4gICAgcmV0cnlPblRvb01hbnlSZXF1ZXN0czogcGFyYW1zLnJldHJ5T25Ub29NYW55UmVxdWVzdHNcbiAgfSk7XG4gIHZhciBhcGkgPSAoMCwgX2NyZWF0ZUNvbnRlbnRmdWxBcGkyLmRlZmF1bHQpKHtcbiAgICBodHRwOiBodHRwXG4gIH0pO1xuXG4gIHJldHVybiBhcGk7XG59IC8qKlxuICAgKiBDb250ZW50ZnVsIE1hbmFnZW1lbnQgQVBJIFNESy4gQWxsb3dzIHlvdSB0byBjcmVhdGUgaW5zdGFuY2VzIG9mIGEgY2xpZW50XG4gICAqIHdpdGggYWNjZXNzIHRvIHRoZSBDb250ZW50ZnVsIENvbnRlbnQgTWFuYWdlbWVudCBBUEkuXG4gICAqIEBuYW1lc3BhY2UgY29udGVudGZ1bE1hbmFnZW1lbnRcbiAgICogQHNlZSBDb250ZW50ZnVsQ2xpZW50QVBJXG4gICAqLyIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9wcm9taXNlID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9jb3JlLWpzL3Byb21pc2UnKTtcblxudmFyIF9wcm9taXNlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Byb21pc2UpO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBjcmVhdGVCYWNrb2ZmO1xuXG52YXIgX3Byb21pc2VkV2FpdCA9IHJlcXVpcmUoJy4vcHJvbWlzZWQtd2FpdCcpO1xuXG52YXIgX3Byb21pc2VkV2FpdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wcm9taXNlZFdhaXQpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG4vKipcbiAqIFJldHVybnMgYSB3cmFwcGVyIG1ldGhvZCB3aGljaCB3YWl0cyBhIGdpdmVuIGFtb3VudCBvZiB0aW1lIGJlZm9yZSBjYWxsaW5nXG4gKiB3cmFwcGVkIG1ldGhvZC5cbiAqIElmIHRoZSBjYWxsIHRvIHRoZSB3cmFwcGVkIG1ldGhvZCBmYWlscywgcmV0cmllcyBgbWF4UmV0cmllc2AgdGltZXMsIGFuZCBpZlxuICogYWxsIHRob3NlIGZhaWwsIGl0IHJldHVybnMgYSByZWplY3RlZCBwcm9taXNlLlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7bnVtYmVyfSBtYXhSZXRyaWVzIC0gbWF4IG51bWJlciBvZiByZXRyaWVzIGJlZm9yZSBhYm9ydGluZ1xuICovXG5mdW5jdGlvbiBjcmVhdGVCYWNrb2ZmKG1heFJldHJpZXMpIHtcbiAgdmFyIGF0dGVtcHQgPSAwO1xuICByZXR1cm4gZnVuY3Rpb24gbWF5YmVSZXRyeShlcnJvciwgcmV0cnkpIHtcbiAgICBpZiAoYXR0ZW1wdCA8IG1heFJldHJpZXMpIHtcbiAgICAgIHJldHVybiAoMCwgX3Byb21pc2VkV2FpdDIuZGVmYXVsdCkoTWF0aC5wb3coMiwgYXR0ZW1wdCsrKSAqIDEwMDApLnRoZW4ocmV0cnkpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gX3Byb21pc2UyLmRlZmF1bHQucmVqZWN0KGVycm9yKTtcbiAgICB9XG4gIH07XG59IiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gY3JlYXRlU3BhY2VBcGk7XG5cbnZhciBfZXJyb3JIYW5kbGVyID0gcmVxdWlyZSgnLi9lcnJvci1oYW5kbGVyJyk7XG5cbnZhciBfZXJyb3JIYW5kbGVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2Vycm9ySGFuZGxlcik7XG5cbnZhciBfZW50aXRpZXMgPSByZXF1aXJlKCcuL2VudGl0aWVzJyk7XG5cbnZhciBfZW50aXRpZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZW50aXRpZXMpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG4vKipcbiAqIENyZWF0ZXMgQVBJIG9iamVjdCB3aXRoIG1ldGhvZHMgdG8gYWNjZXNzIGZ1bmN0aW9uYWxpdHkgZnJvbSBDb250ZW50ZnVsJ3NcbiAqIE1hbmFnZW1lbnQgQVBJXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIEFQSSBpbml0aWFsaXphdGlvbiBwYXJhbXNcbiAqIEBwcm9wIHtPYmplY3R9IGh0dHAgLSBIVFRQIGNsaWVudCBpbnN0YW5jZVxuICogQHByb3Age0Z1bmN0aW9ufSBzaG91bGRMaW5rc1Jlc29sdmUgLSBMaW5rIHJlc29sdmVyIHByZWNvbmZpZ3VyZWQgd2l0aCBnbG9iYWwgc2V0dGluZ1xuICogQHJldHVybiB7Q2xpZW50QVBJfVxuICovXG4vKipcbiAqIENvbnRlbnRmdWwgTWFuYWdlbWVudCBBUEkgQ2xpZW50LiBDb250YWlucyBtZXRob2RzIHdoaWNoIGFsbG93IGFjY2VzcyB0b1xuICogYW55IG9wZXJhdGlvbnMgdGhhdCBjYW4gYmUgcGVyZm9ybWVkIHdpdGggYSBtYW5hZ2VtZW50IHRva2VuLlxuICogQG5hbWVzcGFjZSBDb250ZW50ZnVsQ2xpZW50QVBJXG4gKi9cblxuLyoqXG4gKiBUeXBlcyBmb3IgbWV0YSBpbmZvcm1hdGlvbiBmb3VuZCBhY3Jvc3MgdGhlIGRpZmZlcmVudCBlbnRpdGllcyBpbiBDb250ZW50ZnVsXG4gKiBAbmFtZXNwYWNlIE1ldGFcbiAqL1xuXG4vKipcbiAqIFN5c3RlbSBtZXRhZGF0YS4gU2VlIDxhIGhyZWY9XCJodHRwczovL3d3dy5jb250ZW50ZnVsLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVmZXJlbmNlcy9jb250ZW50LWRlbGl2ZXJ5LWFwaS8jL2ludHJvZHVjdGlvbi9jb21tb24tcmVzb3VyY2UtYXR0cmlidXRlc1wiPkNvbW1vbiBSZXNvdXJjZSBBdHRyaWJ1dGVzPC9hPiBmb3IgbW9yZSBkZXRhaWxzLlxuICogQG1lbWJlcm9mIE1ldGFcbiAqIEB0eXBlZGVmIFN5c1xuICogQHByb3Age3N0cmluZ30gdHlwZVxuICogQHByb3Age3N0cmluZ30gaWRcbiAqIEBwcm9wIHtNZXRhLkxpbmt9IHNwYWNlXG4gKiBAcHJvcCB7c3RyaW5nfSBjcmVhdGVkQXRcbiAqIEBwcm9wIHtzdHJpbmd9IHVwZGF0ZWRBdFxuICogQHByb3Age251bWJlcn0gcmV2aXNpb25cbiAqL1xuXG4vKipcbiAqIExpbmsgdG8gYW5vdGhlciBlbnRpdHkuIFNlZSA8YSBocmVmPVwiaHR0cHM6Ly93d3cuY29udGVudGZ1bC5jb20vZGV2ZWxvcGVycy9kb2NzL2NvbmNlcHRzL2xpbmtzL1wiPkxpbmtzPC9hPiBmb3IgbW9yZSBkZXRhaWxzLlxuICogQG1lbWJlcm9mIE1ldGFcbiAqIEB0eXBlZGVmIExpbmtcbiAqIEBwcm9wIHtzdHJpbmd9IHR5cGUgLSB0eXBlIG9mIHRoaXMgZW50aXR5LiBBbHdheXMgbGluay5cbiAqIEBwcm9wIHtzdHJpbmd9IGlkXG4gKiBAcHJvcCB7c3RyaW5nfSBsaW5rVHlwZSAtIHR5cGUgb2YgdGhpcyBsaW5rLiBJZiBkZWZpbmVkLCBlaXRoZXIgRW50cnkgb3IgQXNzZXRcbiAqL1xuXG4vKipcbiAqIEBtZW1iZXJvZiBDb250ZW50ZnVsQ2xpZW50QVBJXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDbGllbnRBUElcbiAqIEBwcm9wIHtmdW5jdGlvbn0gZ2V0U3BhY2VcbiAqIEBwcm9wIHtmdW5jdGlvbn0gZ2V0U3BhY2VzXG4gKiBAcHJvcCB7ZnVuY3Rpb259IGNyZWF0ZVNwYWNlXG4gKi9cblxuZnVuY3Rpb24gY3JlYXRlU3BhY2VBcGkoX3JlZikge1xuICB2YXIgaHR0cCA9IF9yZWYuaHR0cDtcbiAgdmFyIF9lbnRpdGllcyRzcGFjZSA9IF9lbnRpdGllczIuZGVmYXVsdC5zcGFjZTtcbiAgdmFyIHdyYXBTcGFjZSA9IF9lbnRpdGllcyRzcGFjZS53cmFwU3BhY2U7XG4gIHZhciB3cmFwU3BhY2VDb2xsZWN0aW9uID0gX2VudGl0aWVzJHNwYWNlLndyYXBTcGFjZUNvbGxlY3Rpb247XG5cbiAgLyoqXG4gICAqIEdldHMgYWxsIHNwYWNlc1xuICAgKiBAbWVtYmVyb2YgQ29udGVudGZ1bENsaWVudEFQSVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFNwYWNlLlNwYWNlQ29sbGVjdGlvbj59IFByb21pc2UgZm9yIGEgY29sbGVjdGlvbiBvZiBTcGFjZXNcbiAgICogQGV4YW1wbGVcbiAgICogY2xpZW50LmdldFNwYWNlcygpXG4gICAqIC50aGVuKHNwYWNlcyA9PiBjb25zb2xlLmxvZyhzcGFjZXMuaXRlbXMpKVxuICAgKi9cblxuICBmdW5jdGlvbiBnZXRTcGFjZXMoKSB7XG4gICAgcmV0dXJuIGh0dHAuZ2V0KCcnKS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgcmV0dXJuIHdyYXBTcGFjZUNvbGxlY3Rpb24oaHR0cCwgcmVzcG9uc2UuZGF0YSk7XG4gICAgfSwgX2Vycm9ySGFuZGxlcjIuZGVmYXVsdCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIHNwYWNlXG4gICAqIEBtZW1iZXJvZiBDb250ZW50ZnVsQ2xpZW50QVBJXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIFNwYWNlIElEXG4gICAqIEByZXR1cm4ge1Byb21pc2U8U3BhY2UuU3BhY2U+fSBQcm9taXNlIGZvciBhIFNwYWNlXG4gICAqIEBleGFtcGxlXG4gICAqIGNsaWVudC5nZXRTcGFjZSgnc3BhY2VpZCcpXG4gICAqIC50aGVuKHNwYWNlID0+IGNvbnNvbGUubG9nKHNwYWNlKSlcbiAgICovXG4gIGZ1bmN0aW9uIGdldFNwYWNlKGlkKSB7XG4gICAgcmV0dXJuIGh0dHAuZ2V0KGlkKS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgcmV0dXJuIHdyYXBTcGFjZShodHRwLCByZXNwb25zZS5kYXRhKTtcbiAgICB9LCBfZXJyb3JIYW5kbGVyMi5kZWZhdWx0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgc3BhY2VcbiAgICogQG1lbWJlcm9mIENvbnRlbnRmdWxDbGllbnRBUElcbiAgICogQHNlZSB7U3BhY2UuU3BhY2V9XG4gICAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhIC0gT2JqZWN0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBTcGFjZSB0byBiZSBjcmVhdGVkXG4gICAqIEBwYXJhbSB7c3RyaW5nPX0gb3JnYW5pemF0aW9uSWQgLSBPcmdhbml6YXRpb24gSUQsIGlmIHRoZSBhc3NvY2lhdGVkIHRva2VuIGNhbiBtYW5hZ2UgbW9yZSB0aGFuIG9uZSBvcmdhbml6YXRpb24uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8U3BhY2UuU3BhY2U+fSBQcm9taXNlIGZvciB0aGUgbmV3bHkgY3JlYXRlZCBTcGFjZVxuICAgKiBAZXhhbXBsZVxuICAgKiBjbGllbnQuY3JlYXRlU3BhY2Uoe25hbWU6ICdTcGFjZSBOYW1lJ30pXG4gICAqIC50aGVuKHNwYWNlID0+IGNvbnNvbGUubG9nKHNwYWNlKSlcbiAgICovXG4gIGZ1bmN0aW9uIGNyZWF0ZVNwYWNlKGRhdGEsIG9yZ2FuaXphdGlvbklkKSB7XG4gICAgcmV0dXJuIGh0dHAucG9zdCgnJywgZGF0YSwge1xuICAgICAgaGVhZGVyczogb3JnYW5pemF0aW9uSWQgPyB7ICdYLUNvbnRlbnRmdWwtT3JnYW5pemF0aW9uJzogb3JnYW5pemF0aW9uSWQgfSA6IHt9XG4gICAgfSkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgIHJldHVybiB3cmFwU3BhY2UoaHR0cCwgcmVzcG9uc2UuZGF0YSk7XG4gICAgfSwgX2Vycm9ySGFuZGxlcjIuZGVmYXVsdCk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGdldFNwYWNlczogZ2V0U3BhY2VzLFxuICAgIGdldFNwYWNlOiBnZXRTcGFjZSxcbiAgICBjcmVhdGVTcGFjZTogY3JlYXRlU3BhY2VcbiAgfTtcbn0iLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBjcmVhdGVTcGFjZUFwaTtcblxudmFyIF9jcmVhdGVSZXF1ZXN0Q29uZmlnID0gcmVxdWlyZSgnY29udGVudGZ1bC1zZGstY29yZS9jcmVhdGUtcmVxdWVzdC1jb25maWcnKTtcblxudmFyIF9jcmVhdGVSZXF1ZXN0Q29uZmlnMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NyZWF0ZVJlcXVlc3RDb25maWcpO1xuXG52YXIgX2Vycm9ySGFuZGxlciA9IHJlcXVpcmUoJy4vZXJyb3ItaGFuZGxlcicpO1xuXG52YXIgX2Vycm9ySGFuZGxlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9lcnJvckhhbmRsZXIpO1xuXG52YXIgX2VudGl0aWVzID0gcmVxdWlyZSgnLi9lbnRpdGllcycpO1xuXG52YXIgX2VudGl0aWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2VudGl0aWVzKTtcblxudmFyIF9vbWl0ID0gcmVxdWlyZSgnbG9kYXNoL29taXQnKTtcblxudmFyIF9vbWl0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29taXQpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG4vKipcbiAqIEBtZW1iZXJvZiBDb250ZW50ZnVsU3BhY2VBUElcbiAqIEB0eXBlZGVmIHtPYmplY3R9IENsaWVudEFQSVxuICogQHByb3Age2Z1bmN0aW9ufSBnZXRDb250ZW50VHlwZVxuICogQHByb3Age2Z1bmN0aW9ufSBnZXRDb250ZW50VHlwZXNcbiAqIEBwcm9wIHtmdW5jdGlvbn0gZ2V0RW50cnlcbiAqIEBwcm9wIHtmdW5jdGlvbn0gZ2V0RW50cmllc1xuICogQHByb3Age2Z1bmN0aW9ufSBnZXRBc3NldFxuICogQHByb3Age2Z1bmN0aW9ufSBnZXRBc3NldHNcbiAqL1xuXG4vKipcbiAqIENyZWF0ZXMgQVBJIG9iamVjdCB3aXRoIG1ldGhvZHMgdG8gYWNjZXNzIHRoZSBTcGFjZSBBUElcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gQVBJIGluaXRpYWxpemF0aW9uIHBhcmFtc1xuICogQHByb3Age09iamVjdH0gaHR0cCAtIEhUVFAgY2xpZW50IGluc3RhbmNlXG4gKiBAcHJvcCB7T2JqZWN0fSBlbnRpdGllcyAtIE9iamVjdCB3aXRoIHdyYXBwZXIgbWV0aG9kcyBmb3IgZWFjaCBraW5kIG9mIGVudGl0eVxuICogQHJldHVybiB7Q2xpZW50QVBJfVxuICovXG4vKipcbiAqIENvbnRlbnRmdWwgU3BhY2UgQVBJLiBDb250YWlucyBtZXRob2RzIHRvIGFjY2VzcyBhbnkgb3BlcmF0aW9ucyBhdCBhIHNwYWNlXG4gKiBsZXZlbCwgc3VjaCBhcyBjcmVhdGluZyBhbmQgcmVhZGluZyBlbnRpdGllcyBjb250YWluZWQgaW4gYSBzcGFjZS5cbiAqIEBuYW1lc3BhY2UgQ29udGVudGZ1bFNwYWNlQVBJXG4gKi9cblxuZnVuY3Rpb24gY3JlYXRlU3BhY2VBcGkoX3JlZikge1xuICB2YXIgaHR0cCA9IF9yZWYuaHR0cDtcbiAgdmFyIHdyYXBTcGFjZSA9IF9lbnRpdGllczIuZGVmYXVsdC5zcGFjZS53cmFwU3BhY2U7XG4gIHZhciBfZW50aXRpZXMkY29udGVudFR5cGUgPSBfZW50aXRpZXMyLmRlZmF1bHQuY29udGVudFR5cGU7XG4gIHZhciB3cmFwQ29udGVudFR5cGUgPSBfZW50aXRpZXMkY29udGVudFR5cGUud3JhcENvbnRlbnRUeXBlO1xuICB2YXIgd3JhcENvbnRlbnRUeXBlQ29sbGVjdGlvbiA9IF9lbnRpdGllcyRjb250ZW50VHlwZS53cmFwQ29udGVudFR5cGVDb2xsZWN0aW9uO1xuICB2YXIgX2VudGl0aWVzJGVudHJ5ID0gX2VudGl0aWVzMi5kZWZhdWx0LmVudHJ5O1xuICB2YXIgd3JhcEVudHJ5ID0gX2VudGl0aWVzJGVudHJ5LndyYXBFbnRyeTtcbiAgdmFyIHdyYXBFbnRyeUNvbGxlY3Rpb24gPSBfZW50aXRpZXMkZW50cnkud3JhcEVudHJ5Q29sbGVjdGlvbjtcbiAgdmFyIF9lbnRpdGllcyRhc3NldCA9IF9lbnRpdGllczIuZGVmYXVsdC5hc3NldDtcbiAgdmFyIHdyYXBBc3NldCA9IF9lbnRpdGllcyRhc3NldC53cmFwQXNzZXQ7XG4gIHZhciB3cmFwQXNzZXRDb2xsZWN0aW9uID0gX2VudGl0aWVzJGFzc2V0LndyYXBBc3NldENvbGxlY3Rpb247XG4gIHZhciBfZW50aXRpZXMkbG9jYWxlID0gX2VudGl0aWVzMi5kZWZhdWx0LmxvY2FsZTtcbiAgdmFyIHdyYXBMb2NhbGUgPSBfZW50aXRpZXMkbG9jYWxlLndyYXBMb2NhbGU7XG4gIHZhciB3cmFwTG9jYWxlQ29sbGVjdGlvbiA9IF9lbnRpdGllcyRsb2NhbGUud3JhcExvY2FsZUNvbGxlY3Rpb247XG4gIHZhciBfZW50aXRpZXMkd2ViaG9vayA9IF9lbnRpdGllczIuZGVmYXVsdC53ZWJob29rO1xuICB2YXIgd3JhcFdlYmhvb2sgPSBfZW50aXRpZXMkd2ViaG9vay53cmFwV2ViaG9vaztcbiAgdmFyIHdyYXBXZWJob29rQ29sbGVjdGlvbiA9IF9lbnRpdGllcyR3ZWJob29rLndyYXBXZWJob29rQ29sbGVjdGlvbjtcbiAgdmFyIF9lbnRpdGllcyRyb2xlID0gX2VudGl0aWVzMi5kZWZhdWx0LnJvbGU7XG4gIHZhciB3cmFwUm9sZSA9IF9lbnRpdGllcyRyb2xlLndyYXBSb2xlO1xuICB2YXIgd3JhcFJvbGVDb2xsZWN0aW9uID0gX2VudGl0aWVzJHJvbGUud3JhcFJvbGVDb2xsZWN0aW9uO1xuICB2YXIgX2VudGl0aWVzJHNwYWNlTWVtYmVyID0gX2VudGl0aWVzMi5kZWZhdWx0LnNwYWNlTWVtYmVyc2hpcDtcbiAgdmFyIHdyYXBTcGFjZU1lbWJlcnNoaXAgPSBfZW50aXRpZXMkc3BhY2VNZW1iZXIud3JhcFNwYWNlTWVtYmVyc2hpcDtcbiAgdmFyIHdyYXBTcGFjZU1lbWJlcnNoaXBDb2xsZWN0aW9uID0gX2VudGl0aWVzJHNwYWNlTWVtYmVyLndyYXBTcGFjZU1lbWJlcnNoaXBDb2xsZWN0aW9uO1xuICB2YXIgX2VudGl0aWVzJGFwaUtleSA9IF9lbnRpdGllczIuZGVmYXVsdC5hcGlLZXk7XG4gIHZhciB3cmFwQXBpS2V5ID0gX2VudGl0aWVzJGFwaUtleS53cmFwQXBpS2V5O1xuICB2YXIgd3JhcEFwaUtleUNvbGxlY3Rpb24gPSBfZW50aXRpZXMkYXBpS2V5LndyYXBBcGlLZXlDb2xsZWN0aW9uO1xuXG4gIC8qKlxuICAgKiBTcGFjZSBpbnN0YW5jZXMuXG4gICAqIEBuYW1lc3BhY2UgU3BhY2VcbiAgICovXG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgdGhlIHNwYWNlXG4gICAqIEBtZW1iZXJvZiBTcGFjZVxuICAgKiBAZnVuYyBkZWxldGVcbiAgICogQHJldHVybiB7UHJvbWlzZX0gUHJvbWlzZSBmb3IgdGhlIGRlbGV0aW9uLiBJdCBjb250YWlucyBubyBkYXRhLCBidXQgdGhlIFByb21pc2UgZXJyb3IgY2FzZSBzaG91bGQgYmUgaGFuZGxlZC5cbiAgICogQGV4YW1wbGVcbiAgICogc3BhY2UuZGVsZXRlKClcbiAgICogLmNhdGNoKGVyciA9PiBjb25zb2xlLmxvZyhlcnIpKVxuICAgKi9cblxuICBmdW5jdGlvbiBkZWxldGVTcGFjZSgpIHtcbiAgICByZXR1cm4gaHR0cC5kZWxldGUoJycpLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7fSwgX2Vycm9ySGFuZGxlcjIuZGVmYXVsdCk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgc3BhY2VcbiAgICogQG1lbWJlcm9mIFNwYWNlXG4gICAqIEBmdW5jIHVwZGF0ZVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFNwYWNlLlNwYWNlPn0gUHJvbWlzZSBmb3IgdGhlIHVwZGF0ZWQgc3BhY2UuXG4gICAqIEBleGFtcGxlXG4gICAqIHNwYWNlLm5hbWUgPSAnVXBkYXRlZCBTcGFjZSBOYW1lJ1xuICAgKiBzcGFjZS51cGRhdGUoKVxuICAgKiAudGhlbihzcGFjZSA9PiBjb25zb2xlLmxvZyhzcGFjZSkpXG4gICAqL1xuICBmdW5jdGlvbiB1cGRhdGVTcGFjZSgpIHtcbiAgICB2YXIgcmF3ID0gdGhpcy50b1BsYWluT2JqZWN0KCk7XG4gICAgdmFyIGRhdGEgPSAoMCwgX29taXQyLmRlZmF1bHQpKHJhdywgWydzeXMnXSk7XG4gICAgcmV0dXJuIGh0dHAucHV0KCcnLCBkYXRhLCB7XG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICdYLUNvbnRlbnRmdWwtVmVyc2lvbic6IHJhdy5zeXMudmVyc2lvblxuICAgICAgfVxuICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICByZXR1cm4gd3JhcFNwYWNlKGh0dHAsIHJlc3BvbnNlLmRhdGEpO1xuICAgIH0sIF9lcnJvckhhbmRsZXIyLmRlZmF1bHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSBDb250ZW50IFR5cGVcbiAgICogQG1lbWJlcm9mIENvbnRlbnRmdWxTcGFjZUFQSVxuICAgKiBAcGFyYW0gIHtzdHJpbmd9IGlkXG4gICAqIEByZXR1cm4ge1Byb21pc2U8Q29udGVudFR5cGUuQ29udGVudFR5cGU+fSBQcm9taXNlIGZvciBhIENvbnRlbnQgVHlwZVxuICAgKiBAZXhhbXBsZVxuICAgKiBzcGFjZS5nZXRDb250ZW50VHlwZSgnY29udGVudFR5cGVJZCcpXG4gICAqIC50aGVuKGNvbnRlbnRUeXBlID0+IGNvbnNvbGUubG9nKGNvbnRlbnRUeXBlKSlcbiAgICovXG4gIGZ1bmN0aW9uIGdldENvbnRlbnRUeXBlKGlkKSB7XG4gICAgcmV0dXJuIGh0dHAuZ2V0KCdjb250ZW50X3R5cGVzLycgKyBpZCkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgIHJldHVybiB3cmFwQ29udGVudFR5cGUoaHR0cCwgcmVzcG9uc2UuZGF0YSk7XG4gICAgfSwgX2Vycm9ySGFuZGxlcjIuZGVmYXVsdCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIGNvbGxlY3Rpb24gb2YgQ29udGVudCBUeXBlc1xuICAgKiBAbWVtYmVyb2YgQ29udGVudGZ1bFNwYWNlQVBJXG4gICAqIEBwYXJhbSAge09iamVjdD19IHF1ZXJ5IC0gT2JqZWN0IHdpdGggc2VhcmNoIHBhcmFtZXRlcnMuIENoZWNrIHRoZSA8YSBocmVmPVwiaHR0cHM6Ly93d3cuY29udGVudGZ1bC5jb20vZGV2ZWxvcGVycy9kb2NzL2phdmFzY3JpcHQvdHV0b3JpYWxzL3VzaW5nLWpzLWNkYS1zZGsvI3JldHJpZXZpbmctZW50cmllcy13aXRoLXNlYXJjaC1wYXJhbWV0ZXJzXCI+SlMgU0RLIHR1dG9yaWFsPC9hPiBhbmQgdGhlIDxhIGhyZWY9XCJodHRwczovL3d3dy5jb250ZW50ZnVsLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVmZXJlbmNlcy9jb250ZW50LWRlbGl2ZXJ5LWFwaS8jL3JlZmVyZW5jZS9zZWFyY2gtcGFyYW1ldGVyc1wiPlJFU1QgQVBJIHJlZmVyZW5jZTwvYT4gZm9yIG1vcmUgZGV0YWlscy5cbiAgICogQHJldHVybiB7UHJvbWlzZTxDb250ZW50VHlwZS5Db250ZW50VHlwZUNvbGxlY3Rpb24+fSBQcm9taXNlIGZvciBhIGNvbGxlY3Rpb24gb2YgQ29udGVudCBUeXBlc1xuICAgKiBAZXhhbXBsZVxuICAgKiBzcGFjZS5nZXRDb250ZW50VHlwZXMoKVxuICAgKiAudGhlbihjb250ZW50VHlwZXMgPT4gY29uc29sZS5sb2coY29udGVudFR5cGVzLml0ZW1zKSlcbiAgICovXG4gIGZ1bmN0aW9uIGdldENvbnRlbnRUeXBlcygpIHtcbiAgICB2YXIgcXVlcnkgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDAgfHwgYXJndW1lbnRzWzBdID09PSB1bmRlZmluZWQgPyB7fSA6IGFyZ3VtZW50c1swXTtcblxuICAgIHJldHVybiBodHRwLmdldCgnY29udGVudF90eXBlcycsICgwLCBfY3JlYXRlUmVxdWVzdENvbmZpZzIuZGVmYXVsdCkoeyBxdWVyeTogcXVlcnkgfSkpLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICByZXR1cm4gd3JhcENvbnRlbnRUeXBlQ29sbGVjdGlvbihodHRwLCByZXNwb25zZS5kYXRhKTtcbiAgICB9LCBfZXJyb3JIYW5kbGVyMi5kZWZhdWx0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgQ29udGVudCBUeXBlXG4gICAqIEBtZW1iZXJvZiBDb250ZW50ZnVsU3BhY2VBUElcbiAgICogQHNlZSB7Q29udGVudFR5cGUuQ29udGVudFR5cGV9XG4gICAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhIC0gT2JqZWN0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBDb250ZW50IFR5cGUgdG8gYmUgY3JlYXRlZFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPENvbnRlbnRUeXBlLkNvbnRlbnRUeXBlPn0gUHJvbWlzZSBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQgQ29udGVudCBUeXBlXG4gICAqIEBleGFtcGxlXG4gICAqIHNwYWNlLmNyZWF0ZUNvbnRlbnRUeXBlKHtuYW1lOiAnUG9zdCcsIGZpZWxkczogW119KVxuICAgKiAudGhlbihjdCA9PiBjb25zb2xlLmxvZyhjdCkpXG4gICAqL1xuICBmdW5jdGlvbiBjcmVhdGVDb250ZW50VHlwZShkYXRhKSB7XG4gICAgcmV0dXJuIGh0dHAucG9zdCgnY29udGVudF90eXBlcycsIGRhdGEpLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICByZXR1cm4gd3JhcENvbnRlbnRUeXBlKGh0dHAsIHJlc3BvbnNlLmRhdGEpO1xuICAgIH0sIF9lcnJvckhhbmRsZXIyLmRlZmF1bHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBDb250ZW50IFR5cGUgd2l0aCBhIHNwZWNpZmljIGlkXG4gICAqIEBtZW1iZXJvZiBDb250ZW50ZnVsU3BhY2VBUElcbiAgICogQHNlZSB7Q29udGVudFR5cGUuQ29udGVudFR5cGV9XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIENvbnRlbnQgVHlwZSBJRFxuICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YSAtIE9iamVjdCByZXByZXNlbnRhdGlvbiBvZiB0aGUgQ29udGVudCBUeXBlIHRvIGJlIGNyZWF0ZWRcbiAgICogQHJldHVybiB7UHJvbWlzZTxDb250ZW50VHlwZS5Db250ZW50VHlwZT59IFByb21pc2UgZm9yIHRoZSBuZXdseSBjcmVhdGVkIENvbnRlbnQgVHlwZVxuICAgKiBAZXhhbXBsZVxuICAgKiBzcGFjZS5jcmVhdGVDb250ZW50VHlwZSgncG9zdCcsIHtuYW1lOiAnUG9zdCcsIGZpZWxkczogW119KVxuICAgKiAudGhlbihjdCA9PiBjb25zb2xlLmxvZyhjdCkpXG4gICAqL1xuICBmdW5jdGlvbiBjcmVhdGVDb250ZW50VHlwZVdpdGhJZChpZCwgZGF0YSkge1xuICAgIHJldHVybiBodHRwLnB1dCgnY29udGVudF90eXBlcy8nICsgaWQsIGRhdGEpLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICByZXR1cm4gd3JhcENvbnRlbnRUeXBlKGh0dHAsIHJlc3BvbnNlLmRhdGEpO1xuICAgIH0sIF9lcnJvckhhbmRsZXIyLmRlZmF1bHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYW4gRW50cnlcbiAgICogQG1lbWJlcm9mIENvbnRlbnRmdWxTcGFjZUFQSVxuICAgKiBAcGFyYW0gIHtzdHJpbmd9IGlkXG4gICAqIEBwYXJhbSAge09iamVjdD19IHF1ZXJ5IC0gT2JqZWN0IHdpdGggc2VhcmNoIHBhcmFtZXRlcnMuIEluIHRoaXMgbWV0aG9kIGl0J3Mgb25seSB1c2VmdWwgZm9yIGBsb2NhbGVgLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPEVudHJ5LkVudHJ5Pn0gUHJvbWlzZSBmb3IgYW4gRW50cnlcbiAgICogQGV4YW1wbGVcbiAgICogc3BhY2UuZ2V0RW50cnkoJ2VudHJ5SWQnKVxuICAgKiAudGhlbihlbnRyeSA9PiBjb25zb2xlLmxvZyhlbnRyeSkpXG4gICAqL1xuICBmdW5jdGlvbiBnZXRFbnRyeShpZCkge1xuICAgIHZhciBxdWVyeSA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMSB8fCBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IHt9IDogYXJndW1lbnRzWzFdO1xuXG4gICAgcmV0dXJuIGh0dHAuZ2V0KCdlbnRyaWVzLycgKyBpZCwgKDAsIF9jcmVhdGVSZXF1ZXN0Q29uZmlnMi5kZWZhdWx0KSh7IHF1ZXJ5OiBxdWVyeSB9KSkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgIHJldHVybiB3cmFwRW50cnkoaHR0cCwgcmVzcG9uc2UuZGF0YSk7XG4gICAgfSwgX2Vycm9ySGFuZGxlcjIuZGVmYXVsdCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIGNvbGxlY3Rpb24gb2YgRW50cmllc1xuICAgKiBAbWVtYmVyb2YgQ29udGVudGZ1bFNwYWNlQVBJXG4gICAqIEBwYXJhbSAge09iamVjdD19IHF1ZXJ5IC0gT2JqZWN0IHdpdGggc2VhcmNoIHBhcmFtZXRlcnMuIENoZWNrIHRoZSA8YSBocmVmPVwiaHR0cHM6Ly93d3cuY29udGVudGZ1bC5jb20vZGV2ZWxvcGVycy9kb2NzL2phdmFzY3JpcHQvdHV0b3JpYWxzL3VzaW5nLWpzLWNkYS1zZGsvI3JldHJpZXZpbmctZW50cmllcy13aXRoLXNlYXJjaC1wYXJhbWV0ZXJzXCI+SlMgU0RLIHR1dG9yaWFsPC9hPiBhbmQgdGhlIDxhIGhyZWY9XCJodHRwczovL3d3dy5jb250ZW50ZnVsLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVmZXJlbmNlcy9jb250ZW50LWRlbGl2ZXJ5LWFwaS8jL3JlZmVyZW5jZS9zZWFyY2gtcGFyYW1ldGVyc1wiPlJFU1QgQVBJIHJlZmVyZW5jZTwvYT4gZm9yIG1vcmUgZGV0YWlscy5cbiAgICogQHJldHVybiB7UHJvbWlzZTxFbnRyeS5FbnRyeUNvbGxlY3Rpb24+fSBQcm9taXNlIGZvciBhIGNvbGxlY3Rpb24gb2YgRW50cmllc1xuICAgKiBAZXhhbXBsZVxuICAgKiBzcGFjZS5nZXRFbnRyaWVzKHtjb250ZW50X3R5cGU6ICdjb250ZW50VHlwZUlkJ30pXG4gICAqIC50aGVuKGVudHJpZXMgPT4gY29uc29sZS5sb2coZW50cmllcy5pdGVtcykpXG4gICAqL1xuICBmdW5jdGlvbiBnZXRFbnRyaWVzKCkge1xuICAgIHZhciBxdWVyeSA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMCB8fCBhcmd1bWVudHNbMF0gPT09IHVuZGVmaW5lZCA/IHt9IDogYXJndW1lbnRzWzBdO1xuXG4gICAgcmV0dXJuIGh0dHAuZ2V0KCdlbnRyaWVzJywgKDAsIF9jcmVhdGVSZXF1ZXN0Q29uZmlnMi5kZWZhdWx0KSh7IHF1ZXJ5OiBxdWVyeSB9KSkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgIHJldHVybiB3cmFwRW50cnlDb2xsZWN0aW9uKGh0dHAsIHJlc3BvbnNlLmRhdGEpO1xuICAgIH0sIF9lcnJvckhhbmRsZXIyLmRlZmF1bHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBFbnRyeVxuICAgKiBAbWVtYmVyb2YgQ29udGVudGZ1bFNwYWNlQVBJXG4gICAqIEBzZWUge0VudHJ5LkVudHJ5fVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29udGVudFR5cGVJZCAtIFRoZSBDb250ZW50IFR5cGUgd2hpY2ggdGhpcyBFbnRyeSBpcyBiYXNlZCBvblxuICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YSAtIE9iamVjdCByZXByZXNlbnRhdGlvbiBvZiB0aGUgRW50cnkgdG8gYmUgY3JlYXRlZFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPEVudHJ5LkVudHJ5Pn0gUHJvbWlzZSBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQgRW50cnlcbiAgICogQGV4YW1wbGVcbiAgICogc3BhY2UuY3JlYXRlRW50cnkoJ2NvbnRlbnRUeXBlSWQnLCB7XG4gICAqICAgZmllbGRzOiB7XG4gICAqICAgICB0aXRsZToge1xuICAgKiAgICAgICAnZW4tVVMnOiAnZW5nbGlzaCBjb250ZW50JyxcbiAgICogICAgICAgJ2RlLURFJzogJ2dlcm1hbiBjb250ZW50J1xuICAgKiAgICAgfVxuICAgKiAgIH1cbiAgICogfSlcbiAgICogLnRoZW4oZSA9PiBjb25zb2xlLmxvZyhlKSlcbiAgICovXG4gIGZ1bmN0aW9uIGNyZWF0ZUVudHJ5KGNvbnRlbnRUeXBlSWQsIGRhdGEpIHtcbiAgICByZXR1cm4gaHR0cC5wb3N0KCdlbnRyaWVzJywgZGF0YSwge1xuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnWC1Db250ZW50ZnVsLUNvbnRlbnQtVHlwZSc6IGNvbnRlbnRUeXBlSWRcbiAgICAgIH1cbiAgICB9KS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgcmV0dXJuIHdyYXBFbnRyeShodHRwLCByZXNwb25zZS5kYXRhKTtcbiAgICB9LCBfZXJyb3JIYW5kbGVyMi5kZWZhdWx0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgRW50cnkgd2l0aCBhIHNwZWNpZmljIGlkXG4gICAqIEBtZW1iZXJvZiBDb250ZW50ZnVsU3BhY2VBUElcbiAgICogQHNlZSB7RW50cnkuRW50cnl9XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIEVudHJ5IElEXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50VHlwZUlkIC0gVGhlIENvbnRlbnQgVHlwZSB3aGljaCB0aGlzIEVudHJ5IGlzIGJhc2VkIG9uXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhIC0gT2JqZWN0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBFbnRyeSB0byBiZSBjcmVhdGVkXG4gICAqIEByZXR1cm4ge1Byb21pc2U8RW50cnkuRW50cnk+fSBQcm9taXNlIGZvciB0aGUgbmV3bHkgY3JlYXRlZCBFbnRyeVxuICAgKiBAZXhhbXBsZVxuICAgKiBzcGFjZS5jcmVhdGVFbnRyeVdpdGhJZCgnY29udGVudFR5cGVJZCcsICdlbnRyeUlkJywge1xuICAgKiAgIGZpZWxkczoge1xuICAgKiAgICAgdGl0bGU6IHtcbiAgICogICAgICAgJ2VuLVVTJzogJ2VuZ2xpc2ggY29udGVudCcsXG4gICAqICAgICAgICdkZS1ERSc6ICdnZXJtYW4gY29udGVudCdcbiAgICogICAgIH1cbiAgICogICB9XG4gICAqIH0pXG4gICAqIC50aGVuKGUgPT4gY29uc29sZS5sb2coZSkpXG4gICAqL1xuICBmdW5jdGlvbiBjcmVhdGVFbnRyeVdpdGhJZChjb250ZW50VHlwZUlkLCBpZCwgZGF0YSkge1xuICAgIHJldHVybiBodHRwLnB1dCgnZW50cmllcy8nICsgaWQsIGRhdGEsIHtcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ1gtQ29udGVudGZ1bC1Db250ZW50LVR5cGUnOiBjb250ZW50VHlwZUlkXG4gICAgICB9XG4gICAgfSkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgIHJldHVybiB3cmFwRW50cnkoaHR0cCwgcmVzcG9uc2UuZGF0YSk7XG4gICAgfSwgX2Vycm9ySGFuZGxlcjIuZGVmYXVsdCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhbiBBc3NldFxuICAgKiBAbWVtYmVyb2YgQ29udGVudGZ1bFNwYWNlQVBJXG4gICAqIEBwYXJhbSAge3N0cmluZ30gaWRcbiAgICogQHBhcmFtICB7T2JqZWN0PX0gcXVlcnkgLSBPYmplY3Qgd2l0aCBzZWFyY2ggcGFyYW1ldGVycy4gSW4gdGhpcyBtZXRob2QgaXQncyBvbmx5IHVzZWZ1bCBmb3IgYGxvY2FsZWAuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8QXNzZXQuQXNzZXQ+fSBQcm9taXNlIGZvciBhbiBBc3NldFxuICAgKiBAZXhhbXBsZVxuICAgKiBzcGFjZS5nZXRBc3NldCgnYXNzZXRJZCcpXG4gICAqIC50aGVuKGFzc2V0ID0+IGNvbnNvbGUubG9nKGFzc2V0KSlcbiAgICovXG4gIGZ1bmN0aW9uIGdldEFzc2V0KGlkKSB7XG4gICAgdmFyIHF1ZXJ5ID0gYXJndW1lbnRzLmxlbmd0aCA8PSAxIHx8IGFyZ3VtZW50c1sxXSA9PT0gdW5kZWZpbmVkID8ge30gOiBhcmd1bWVudHNbMV07XG5cbiAgICByZXR1cm4gaHR0cC5nZXQoJ2Fzc2V0cy8nICsgaWQsICgwLCBfY3JlYXRlUmVxdWVzdENvbmZpZzIuZGVmYXVsdCkoeyBxdWVyeTogcXVlcnkgfSkpLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICByZXR1cm4gd3JhcEFzc2V0KGh0dHAsIHJlc3BvbnNlLmRhdGEpO1xuICAgIH0sIF9lcnJvckhhbmRsZXIyLmRlZmF1bHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSBjb2xsZWN0aW9uIG9mIEFzc2V0c1xuICAgKiBAbWVtYmVyb2YgQ29udGVudGZ1bFNwYWNlQVBJXG4gICAqIEBwYXJhbSAge09iamVjdD19IHF1ZXJ5IC0gT2JqZWN0IHdpdGggc2VhcmNoIHBhcmFtZXRlcnMuIENoZWNrIHRoZSA8YSBocmVmPVwiaHR0cHM6Ly93d3cuY29udGVudGZ1bC5jb20vZGV2ZWxvcGVycy9kb2NzL2phdmFzY3JpcHQvdHV0b3JpYWxzL3VzaW5nLWpzLWNkYS1zZGsvI3JldHJpZXZpbmctZW50cmllcy13aXRoLXNlYXJjaC1wYXJhbWV0ZXJzXCI+SlMgU0RLIHR1dG9yaWFsPC9hPiBhbmQgdGhlIDxhIGhyZWY9XCJodHRwczovL3d3dy5jb250ZW50ZnVsLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVmZXJlbmNlcy9jb250ZW50LWRlbGl2ZXJ5LWFwaS8jL3JlZmVyZW5jZS9zZWFyY2gtcGFyYW1ldGVyc1wiPlJFU1QgQVBJIHJlZmVyZW5jZTwvYT4gZm9yIG1vcmUgZGV0YWlscy5cbiAgICogQHJldHVybiB7UHJvbWlzZTxBc3NldC5Bc3NldENvbGxlY3Rpb24+fSBQcm9taXNlIGZvciBhIGNvbGxlY3Rpb24gb2YgQXNzZXRzXG4gICAqIEBleGFtcGxlXG4gICAqIHNwYWNlLmdldEFzc2V0cygpXG4gICAqIC50aGVuKGFzc2V0cyA9PiBjb25zb2xlLmxvZyhhc3NldHMuaXRlbXMpKVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0QXNzZXRzKCkge1xuICAgIHZhciBxdWVyeSA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMCB8fCBhcmd1bWVudHNbMF0gPT09IHVuZGVmaW5lZCA/IHt9IDogYXJndW1lbnRzWzBdO1xuXG4gICAgcmV0dXJuIGh0dHAuZ2V0KCdhc3NldHMnLCAoMCwgX2NyZWF0ZVJlcXVlc3RDb25maWcyLmRlZmF1bHQpKHsgcXVlcnk6IHF1ZXJ5IH0pKS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgcmV0dXJuIHdyYXBBc3NldENvbGxlY3Rpb24oaHR0cCwgcmVzcG9uc2UuZGF0YSk7XG4gICAgfSwgX2Vycm9ySGFuZGxlcjIuZGVmYXVsdCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIEFzc2V0LiBBZnRlciBjcmVhdGlvbiwgY2FsbCBhc3NldC5wcm9jZXNzRm9yTG9jYWxlIG9yIGFzc2V0LnByb2Nlc3NGb3JBbGxMb2NhbGVzIHRvIHN0YXJ0IGFzc2V0IHByb2Nlc3NpbmcuXG4gICAqIEBtZW1iZXJvZiBDb250ZW50ZnVsU3BhY2VBUElcbiAgICogQHNlZSB7QXNzZXQuQXNzZXR9XG4gICAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhIC0gT2JqZWN0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBBc3NldCB0byBiZSBjcmVhdGVkLiBOb3RlIHRoYXQgdGhlIGZpZWxkIG9iamVjdCBzaG91bGQgaGF2ZSBhbiB1cGxvYWQgcHJvcGVydHkgb24gYXNzZXQgY3JlYXRpb24sIHdoaWNoIHdpbGwgYmUgcmVtb3ZlZCBhbmQgcmVwbGFjZWQgd2l0aCBhbiB1cmwgcHJvcGVydHkgd2hlbiBwcm9jZXNzaW5nIGlzIGZpbmlzaGVkLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPEFzc2V0LkFzc2V0Pn0gUHJvbWlzZSBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQgQXNzZXRcbiAgICogQGV4YW1wbGVcbiAgICogc3BhY2UuY3JlYXRlQXNzZXQoe2ZpZWxkczoge1xuICAgKiAgIGZpZWxkczoge1xuICAgKiAgICAgZmlsZToge1xuICAgKiAgICAgICAnZW4tVVMnOiB7XG4gICAqICAgICAgICAgIGNvbnRlbnRUeXBlOiAnaW1hZ2UvanBlZycsXG4gICAqICAgICAgICAgIGZpbGVOYW1lOiAnZmlsZW5hbWVfZW5nbGlzaC5qcGcnLFxuICAgKiAgICAgICAgICB1cGxvYWQ6ICdodHRwOi8vZXhhbXBsZS5jb20vZmlsZW5hbWVfb3JpZ2luYWxfZW4uanBnJ1xuICAgKiAgICAgICB9LFxuICAgKiAgICAgICAnZGUtREUnOiB7XG4gICAqICAgICAgICAgIGNvbnRlbnRUeXBlOiAnaW1hZ2UvanBlZycsXG4gICAqICAgICAgICAgIGZpbGVOYW1lOiAnZmlsZW5hbWVfZ2VybWFuLmpwZycsXG4gICAqICAgICAgICAgIHVwbG9hZDogJ2h0dHA6Ly9leGFtcGxlLmNvbS9maWxlbmFtZV9vcmlnaW5hbF9kZS5qcGcnXG4gICAqICAgICAgIH1cbiAgICogICAgIH1cbiAgICogICB9XG4gICAqIH0pXG4gICAqIC50aGVuKGUgPT4gY29uc29sZS5sb2coZSkpXG4gICAqL1xuICBmdW5jdGlvbiBjcmVhdGVBc3NldChkYXRhKSB7XG4gICAgcmV0dXJuIGh0dHAucG9zdCgnYXNzZXRzJywgZGF0YSkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgIHJldHVybiB3cmFwQXNzZXQoaHR0cCwgcmVzcG9uc2UuZGF0YSk7XG4gICAgfSwgX2Vycm9ySGFuZGxlcjIuZGVmYXVsdCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIEFzc2V0IHdpdGggYSBzcGVjaWZpYyBpZC4gQWZ0ZXIgY3JlYXRpb24sIGNhbGwgYXNzZXQucHJvY2Vzc0ZvckxvY2FsZSBvciBhc3NldC5wcm9jZXNzRm9yQWxsTG9jYWxlcyB0byBzdGFydCBhc3NldCBwcm9jZXNzaW5nLlxuICAgKiBAbWVtYmVyb2YgQ29udGVudGZ1bFNwYWNlQVBJXG4gICAqIEBzZWUge0Fzc2V0LkFzc2V0fVxuICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgLSBBc3NldCBJRFxuICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YSAtIE9iamVjdCByZXByZXNlbnRhdGlvbiBvZiB0aGUgQXNzZXQgdG8gYmUgY3JlYXRlZC4gTm90ZSB0aGF0IHRoZSBmaWVsZCBvYmplY3Qgc2hvdWxkIGhhdmUgYW4gdXBsb2FkIHByb3BlcnR5IG9uIGFzc2V0IGNyZWF0aW9uLCB3aGljaCB3aWxsIGJlIHJlbW92ZWQgYW5kIHJlcGxhY2VkIHdpdGggYW4gdXJsIHByb3BlcnR5IHdoZW4gcHJvY2Vzc2luZyBpcyBmaW5pc2hlZC5cbiAgICogQHJldHVybiB7UHJvbWlzZTxBc3NldC5Bc3NldD59IFByb21pc2UgZm9yIHRoZSBuZXdseSBjcmVhdGVkIEFzc2V0XG4gICAqIEBleGFtcGxlXG4gICAqIHNwYWNlLmNyZWF0ZUFzc2V0V2l0aElkKCdpbWFnZScsIHtcbiAgICogICBmaWVsZHM6IHtcbiAgICogICAgIGZpbGU6IHtcbiAgICogICAgICAgJ2VuLVVTJzoge1xuICAgKiAgICAgICAgICBjb250ZW50VHlwZTogJ2ltYWdlL2pwZWcnLFxuICAgKiAgICAgICAgICBmaWxlTmFtZTogJ2ZpbGVuYW1lX2VuZ2xpc2guanBnJyxcbiAgICogICAgICAgICAgdXBsb2FkOiAnaHR0cDovL2V4YW1wbGUuY29tL2ZpbGVuYW1lX29yaWdpbmFsX2VuLmpwZydcbiAgICogICAgICAgfSxcbiAgICogICAgICAgJ2RlLURFJzoge1xuICAgKiAgICAgICAgICBjb250ZW50VHlwZTogJ2ltYWdlL2pwZWcnLFxuICAgKiAgICAgICAgICBmaWxlTmFtZTogJ2ZpbGVuYW1lX2dlcm1hbi5qcGcnLFxuICAgKiAgICAgICAgICB1cGxvYWQ6ICdodHRwOi8vZXhhbXBsZS5jb20vZmlsZW5hbWVfb3JpZ2luYWxfZGUuanBnJ1xuICAgKiAgICAgICB9XG4gICAqICAgICB9XG4gICAqICAgfVxuICAgKiB9KVxuICAgKiAudGhlbihlID0+IGNvbnNvbGUubG9nKGUpKVxuICAgKi9cbiAgZnVuY3Rpb24gY3JlYXRlQXNzZXRXaXRoSWQoaWQsIGRhdGEpIHtcbiAgICByZXR1cm4gaHR0cC5wdXQoJ2Fzc2V0cy8nICsgaWQsIGRhdGEpLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICByZXR1cm4gd3JhcEFzc2V0KGh0dHAsIHJlc3BvbnNlLmRhdGEpO1xuICAgIH0sIF9lcnJvckhhbmRsZXIyLmRlZmF1bHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSBMb2NhbGVcbiAgICogQG1lbWJlcm9mIENvbnRlbnRmdWxTcGFjZUFQSVxuICAgKiBAcGFyYW0gIHtzdHJpbmd9IGlkXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TG9jYWxlLkxvY2FsZT59IFByb21pc2UgZm9yIGFuIExvY2FsZVxuICAgKiBAZXhhbXBsZVxuICAgKiBzcGFjZS5nZXRMb2NhbGUoJ2xvY2FsZUlkJylcbiAgICogLnRoZW4obG9jYWxlID0+IGNvbnNvbGUubG9nKGxvY2FsZSkpXG4gICAqL1xuICBmdW5jdGlvbiBnZXRMb2NhbGUoaWQpIHtcbiAgICByZXR1cm4gaHR0cC5nZXQoJ2xvY2FsZXMvJyArIGlkKS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgcmV0dXJuIHdyYXBMb2NhbGUoaHR0cCwgcmVzcG9uc2UuZGF0YSk7XG4gICAgfSwgX2Vycm9ySGFuZGxlcjIuZGVmYXVsdCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIGNvbGxlY3Rpb24gb2YgTG9jYWxlc1xuICAgKiBAbWVtYmVyb2YgQ29udGVudGZ1bFNwYWNlQVBJXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TG9jYWxlLkxvY2FsZUNvbGxlY3Rpb24+fSBQcm9taXNlIGZvciBhIGNvbGxlY3Rpb24gb2YgTG9jYWxlc1xuICAgKiBAZXhhbXBsZVxuICAgKiBzcGFjZS5nZXRMb2NhbGVzKClcbiAgICogLnRoZW4obG9jYWxlcyA9PiBjb25zb2xlLmxvZyhsb2NhbGVzLml0ZW1zKSlcbiAgICovXG4gIGZ1bmN0aW9uIGdldExvY2FsZXMoKSB7XG4gICAgcmV0dXJuIGh0dHAuZ2V0KCdsb2NhbGVzJykudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgIHJldHVybiB3cmFwTG9jYWxlQ29sbGVjdGlvbihodHRwLCByZXNwb25zZS5kYXRhKTtcbiAgICB9LCBfZXJyb3JIYW5kbGVyMi5kZWZhdWx0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgTG9jYWxlXG4gICAqIEBtZW1iZXJvZiBDb250ZW50ZnVsU3BhY2VBUElcbiAgICogQHNlZSB7TG9jYWxlLkxvY2FsZX1cbiAgICogQHBhcmFtIHtvYmplY3R9IGRhdGEgLSBPYmplY3QgcmVwcmVzZW50YXRpb24gb2YgdGhlIExvY2FsZSB0byBiZSBjcmVhdGVkXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TG9jYWxlLkxvY2FsZT59IFByb21pc2UgZm9yIHRoZSBuZXdseSBjcmVhdGVkIExvY2FsZVxuICAgKiBAZXhhbXBsZVxuICAgKiBzcGFjZS5jcmVhdGVMb2NhbGUoe25hbWU6ICdHZXJtYW4gKEdlcm1hbnkpJywgY29kZTogJ2RlLURFJ30pXG4gICAqIC50aGVuKGUgPT4gY29uc29sZS5sb2coZSkpXG4gICAqL1xuICBmdW5jdGlvbiBjcmVhdGVMb2NhbGUoZGF0YSkge1xuICAgIHJldHVybiBodHRwLnBvc3QoJ2xvY2FsZXMnLCBkYXRhKS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgcmV0dXJuIHdyYXBMb2NhbGUoaHR0cCwgcmVzcG9uc2UuZGF0YSk7XG4gICAgfSwgX2Vycm9ySGFuZGxlcjIuZGVmYXVsdCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIFdlYmhvb2tcbiAgICogQG1lbWJlcm9mIENvbnRlbnRmdWxTcGFjZUFQSVxuICAgKiBAcGFyYW0gIHtzdHJpbmd9IGlkXG4gICAqIEByZXR1cm4ge1Byb21pc2U8V2ViaG9vay5XZWJob29rPn0gUHJvbWlzZSBmb3IgYSBXZWJob29rXG4gICAqIEBleGFtcGxlXG4gICAqIHNwYWNlLmdldFdlYmhvb2soJ2lkJylcbiAgICogLnRoZW4od2ViaG9vayA9PiBjb25zb2xlLmxvZyh3ZWJob29rKSlcbiAgICovXG4gIGZ1bmN0aW9uIGdldFdlYmhvb2soaWQpIHtcbiAgICByZXR1cm4gaHR0cC5nZXQoJ3dlYmhvb2tfZGVmaW5pdGlvbnMvJyArIGlkKS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgcmV0dXJuIHdyYXBXZWJob29rKGh0dHAsIHJlc3BvbnNlLmRhdGEpO1xuICAgIH0sIF9lcnJvckhhbmRsZXIyLmRlZmF1bHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSBjb2xsZWN0aW9uIG9mIFdlYmhvb2tzXG4gICAqIEBtZW1iZXJvZiBDb250ZW50ZnVsU3BhY2VBUElcbiAgICogQHJldHVybiB7UHJvbWlzZTxXZWJob29rLldlYmhvb2tDb2xsZWN0aW9uPn0gUHJvbWlzZSBmb3IgYSBjb2xsZWN0aW9uIG9mIFdlYmhvb2tzXG4gICAqIEBleGFtcGxlXG4gICAqIHNwYWNlLmdldFdlYmhvb2tzKClcbiAgICogLnRoZW4od2ViaG9va3MgPT4gY29uc29sZS5sb2cod2ViaG9va3MuaXRlbXMpKVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0V2ViaG9va3MoKSB7XG4gICAgcmV0dXJuIGh0dHAuZ2V0KCd3ZWJob29rX2RlZmluaXRpb25zJykudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgIHJldHVybiB3cmFwV2ViaG9va0NvbGxlY3Rpb24oaHR0cCwgcmVzcG9uc2UuZGF0YSk7XG4gICAgfSwgX2Vycm9ySGFuZGxlcjIuZGVmYXVsdCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIFdlYmhvb2tcbiAgICogQG1lbWJlcm9mIENvbnRlbnRmdWxTcGFjZUFQSVxuICAgKiBAc2VlIHtXZWJob29rLldlYmhvb2t9XG4gICAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhIC0gT2JqZWN0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBXZWJob29rIHRvIGJlIGNyZWF0ZWRcbiAgICogQHJldHVybiB7UHJvbWlzZTxXZWJob29rLldlYmhvb2s+fSBQcm9taXNlIGZvciB0aGUgbmV3bHkgY3JlYXRlZCBXZWJob29rXG4gICAqIEBleGFtcGxlXG4gICAqIHNwYWNlLmNyZWF0ZVdlYmhvb2soe30pXG4gICAqIC50aGVuKHdlYmhvb2sgPT4gY29uc29sZS5sb2cod2ViaG9vaykpXG4gICAqL1xuICBmdW5jdGlvbiBjcmVhdGVXZWJob29rKGRhdGEpIHtcbiAgICByZXR1cm4gaHR0cC5wb3N0KCd3ZWJob29rX2RlZmluaXRpb25zJywgZGF0YSkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgIHJldHVybiB3cmFwV2ViaG9vayhodHRwLCByZXNwb25zZS5kYXRhKTtcbiAgICB9LCBfZXJyb3JIYW5kbGVyMi5kZWZhdWx0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgV2ViaG9vayB3aXRoIGEgc3BlY2lmaWMgaWRcbiAgICogQG1lbWJlcm9mIENvbnRlbnRmdWxTcGFjZUFQSVxuICAgKiBAc2VlIHtXZWJob29rLldlYmhvb2t9XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIFdlYmhvb2sgSURcbiAgICogQHBhcmFtIHtvYmplY3R9IGRhdGEgLSBPYmplY3QgcmVwcmVzZW50YXRpb24gb2YgdGhlIFdlYmhvb2sgdG8gYmUgY3JlYXRlZFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFdlYmhvb2suV2ViaG9vaz59IFByb21pc2UgZm9yIHRoZSBuZXdseSBjcmVhdGVkIFdlYmhvb2tcbiAgICogQGV4YW1wbGVcbiAgICogc3BhY2UuY3JlYXRlV2ViaG9vaygnaWQnLCB7fSlcbiAgICogLnRoZW4od2ViaG9vayA9PiBjb25zb2xlLmxvZyh3ZWJob29rKSlcbiAgICovXG4gIGZ1bmN0aW9uIGNyZWF0ZVdlYmhvb2tXaXRoSWQoaWQsIGRhdGEpIHtcbiAgICByZXR1cm4gaHR0cC5wdXQoJ3dlYmhvb2tfZGVmaW5pdGlvbnMvJyArIGlkLCBkYXRhKS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgcmV0dXJuIHdyYXBXZWJob29rKGh0dHAsIHJlc3BvbnNlLmRhdGEpO1xuICAgIH0sIF9lcnJvckhhbmRsZXIyLmRlZmF1bHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSBTcGFjZSBNZW1iZXJzaGlwXG4gICAqIEBtZW1iZXJvZiBDb250ZW50ZnVsU3BhY2VBUElcbiAgICogQHBhcmFtICB7c3RyaW5nfSBpZFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFNwYWNlTWVtYmVyc2hpcC5TcGFjZU1lbWJlcnNoaXA+fSBQcm9taXNlIGZvciBhIFNwYWNlIE1lbWJlcnNoaXBcbiAgICogQGV4YW1wbGVcbiAgICogc3BhY2UuZ2V0U3BhY2VNZW1iZXJzaGlwKCdpZCcpXG4gICAqIC50aGVuKHNwYWNlTWVtYmVyc2hpcCA9PiBjb25zb2xlLmxvZyhzcGFjZU1lbWJlcnNoaXApKVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0U3BhY2VNZW1iZXJzaGlwKGlkKSB7XG4gICAgcmV0dXJuIGh0dHAuZ2V0KCdzcGFjZV9tZW1iZXJzaGlwcy8nICsgaWQpLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICByZXR1cm4gd3JhcFNwYWNlTWVtYmVyc2hpcChodHRwLCByZXNwb25zZS5kYXRhKTtcbiAgICB9LCBfZXJyb3JIYW5kbGVyMi5kZWZhdWx0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGEgY29sbGVjdGlvbiBvZiBTcGFjZSBNZW1iZXJzaGlwc1xuICAgKiBAbWVtYmVyb2YgQ29udGVudGZ1bFNwYWNlQVBJXG4gICAqIEByZXR1cm4ge1Byb21pc2U8U3BhY2VNZW1iZXJzaGlwLlNwYWNlTWVtYmVyc2hpcENvbGxlY3Rpb24+fSBQcm9taXNlIGZvciBhIGNvbGxlY3Rpb24gb2YgU3BhY2UgTWVtYmVyc2hpcHNcbiAgICogQGV4YW1wbGVcbiAgICogc3BhY2UuZ2V0U3BhY2VNZW1iZXJzaGlwcygpXG4gICAqIC50aGVuKHNwYWNlTWVtYmVyc2hpcHMgPT4gY29uc29sZS5sb2coc3BhY2VNZW1iZXJzaGlwcy5pdGVtcykpXG4gICAqL1xuICBmdW5jdGlvbiBnZXRTcGFjZU1lbWJlcnNoaXBzKCkge1xuICAgIHJldHVybiBodHRwLmdldCgnc3BhY2VfbWVtYmVyc2hpcHMnKS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgcmV0dXJuIHdyYXBTcGFjZU1lbWJlcnNoaXBDb2xsZWN0aW9uKGh0dHAsIHJlc3BvbnNlLmRhdGEpO1xuICAgIH0sIF9lcnJvckhhbmRsZXIyLmRlZmF1bHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBTcGFjZSBNZW1iZXJzaGlwXG4gICAqIEBtZW1iZXJvZiBDb250ZW50ZnVsU3BhY2VBUElcbiAgICogQHNlZSB7U3BhY2VNZW1iZXJzaGlwLlNwYWNlTWVtYmVyc2hpcH1cbiAgICogQHBhcmFtIHtvYmplY3R9IGRhdGEgLSBPYmplY3QgcmVwcmVzZW50YXRpb24gb2YgdGhlIFNwYWNlIE1lbWJlcnNoaXAgdG8gYmUgY3JlYXRlZFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFNwYWNlTWVtYmVyc2hpcC5TcGFjZU1lbWJlcnNoaXA+fSBQcm9taXNlIGZvciB0aGUgbmV3bHkgY3JlYXRlZCBTcGFjZSBNZW1iZXJzaGlwXG4gICAqIEBleGFtcGxlXG4gICAqIHNwYWNlLmNyZWF0ZVNwYWNlTWVtYmVyc2hpcCh7fSlcbiAgICogLnRoZW4oc3BhY2VNZW1iZXJzaGlwID0+IGNvbnNvbGUubG9nKHNwYWNlTWVtYmVyc2hpcCkpXG4gICAqL1xuICBmdW5jdGlvbiBjcmVhdGVTcGFjZU1lbWJlcnNoaXAoZGF0YSkge1xuICAgIHJldHVybiBodHRwLnBvc3QoJ3NwYWNlX21lbWJlcnNoaXBzJywgZGF0YSkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgIHJldHVybiB3cmFwU3BhY2VNZW1iZXJzaGlwKGh0dHAsIHJlc3BvbnNlLmRhdGEpO1xuICAgIH0sIF9lcnJvckhhbmRsZXIyLmRlZmF1bHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBTcGFjZSBNZW1iZXJzaGlwIHdpdGggYSBzcGVjaWZpYyBpZFxuICAgKiBAbWVtYmVyb2YgQ29udGVudGZ1bFNwYWNlQVBJXG4gICAqIEBzZWUge1NwYWNlTWVtYmVyc2hpcC5TcGFjZU1lbWJlcnNoaXB9XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIFNwYWNlIE1lbWJlcnNoaXAgSURcbiAgICogQHBhcmFtIHtvYmplY3R9IGRhdGEgLSBPYmplY3QgcmVwcmVzZW50YXRpb24gb2YgdGhlIFNwYWNlIE1lbWJlcnNoaXAgdG8gYmUgY3JlYXRlZFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFNwYWNlTWVtYmVyc2hpcC5TcGFjZU1lbWJlcnNoaXA+fSBQcm9taXNlIGZvciB0aGUgbmV3bHkgY3JlYXRlZCBTcGFjZSBNZW1iZXJzaGlwXG4gICAqIEBleGFtcGxlXG4gICAqIHNwYWNlLmNyZWF0ZVNwYWNlTWVtYmVyc2hpcCgnaWQnLCB7fSlcbiAgICogLnRoZW4oc3BhY2VNZW1iZXJzaGlwID0+IGNvbnNvbGUubG9nKHNwYWNlTWVtYmVyc2hpcCkpXG4gICAqL1xuICBmdW5jdGlvbiBjcmVhdGVTcGFjZU1lbWJlcnNoaXBXaXRoSWQoaWQsIGRhdGEpIHtcbiAgICByZXR1cm4gaHR0cC5wdXQoJ3NwYWNlX21lbWJlcnNoaXBzLycgKyBpZCwgZGF0YSkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgIHJldHVybiB3cmFwU3BhY2VNZW1iZXJzaGlwKGh0dHAsIHJlc3BvbnNlLmRhdGEpO1xuICAgIH0sIF9lcnJvckhhbmRsZXIyLmRlZmF1bHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSBSb2xlXG4gICAqIEBtZW1iZXJvZiBDb250ZW50ZnVsU3BhY2VBUElcbiAgICogQHBhcmFtICB7c3RyaW5nfSBpZFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJvbGUuUm9sZT59IFByb21pc2UgZm9yIGEgUm9sZVxuICAgKiBAZXhhbXBsZVxuICAgKiBzcGFjZS5nZXRSb2xlKCdpZCcpXG4gICAqIC50aGVuKHJvbGUgPT4gY29uc29sZS5sb2cocm9sZSkpXG4gICAqL1xuICBmdW5jdGlvbiBnZXRSb2xlKGlkKSB7XG4gICAgcmV0dXJuIGh0dHAuZ2V0KCdyb2xlcy8nICsgaWQpLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICByZXR1cm4gd3JhcFJvbGUoaHR0cCwgcmVzcG9uc2UuZGF0YSk7XG4gICAgfSwgX2Vycm9ySGFuZGxlcjIuZGVmYXVsdCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIGNvbGxlY3Rpb24gb2YgUm9sZXNcbiAgICogQG1lbWJlcm9mIENvbnRlbnRmdWxTcGFjZUFQSVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJvbGUuUm9sZUNvbGxlY3Rpb24+fSBQcm9taXNlIGZvciBhIGNvbGxlY3Rpb24gb2YgUm9sZXNcbiAgICogQGV4YW1wbGVcbiAgICogc3BhY2UuZ2V0Um9sZXMoKVxuICAgKiAudGhlbihyb2xlcyA9PiBjb25zb2xlLmxvZyhyb2xlcy5pdGVtcykpXG4gICAqL1xuICBmdW5jdGlvbiBnZXRSb2xlcygpIHtcbiAgICByZXR1cm4gaHR0cC5nZXQoJ3JvbGVzJykudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgIHJldHVybiB3cmFwUm9sZUNvbGxlY3Rpb24oaHR0cCwgcmVzcG9uc2UuZGF0YSk7XG4gICAgfSwgX2Vycm9ySGFuZGxlcjIuZGVmYXVsdCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIFJvbGVcbiAgICogQG1lbWJlcm9mIENvbnRlbnRmdWxTcGFjZUFQSVxuICAgKiBAc2VlIHtSb2xlLlJvbGV9XG4gICAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhIC0gT2JqZWN0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBSb2xlIHRvIGJlIGNyZWF0ZWRcbiAgICogQHJldHVybiB7UHJvbWlzZTxSb2xlLlJvbGU+fSBQcm9taXNlIGZvciB0aGUgbmV3bHkgY3JlYXRlZCBSb2xlXG4gICAqIEBleGFtcGxlXG4gICAqIHNwYWNlLmNyZWF0ZVJvbGUoe30pXG4gICAqIC50aGVuKHJvbGUgPT4gY29uc29sZS5sb2cocm9sZSkpXG4gICAqL1xuICBmdW5jdGlvbiBjcmVhdGVSb2xlKGRhdGEpIHtcbiAgICByZXR1cm4gaHR0cC5wb3N0KCdyb2xlcycsIGRhdGEpLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICByZXR1cm4gd3JhcFJvbGUoaHR0cCwgcmVzcG9uc2UuZGF0YSk7XG4gICAgfSwgX2Vycm9ySGFuZGxlcjIuZGVmYXVsdCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIFJvbGUgd2l0aCBhIHNwZWNpZmljIGlkXG4gICAqIEBtZW1iZXJvZiBDb250ZW50ZnVsU3BhY2VBUElcbiAgICogQHNlZSB7Um9sZS5Sb2xlfVxuICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgLSBSb2xlIElEXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhIC0gT2JqZWN0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBSb2xlIHRvIGJlIGNyZWF0ZWRcbiAgICogQHJldHVybiB7UHJvbWlzZTxSb2xlLlJvbGU+fSBQcm9taXNlIGZvciB0aGUgbmV3bHkgY3JlYXRlZCBSb2xlXG4gICAqIEBleGFtcGxlXG4gICAqIHNwYWNlLmNyZWF0ZVJvbGUoJ2lkJywge30pXG4gICAqIC50aGVuKHJvbGUgPT4gY29uc29sZS5sb2cocm9sZSkpXG4gICAqL1xuICBmdW5jdGlvbiBjcmVhdGVSb2xlV2l0aElkKGlkLCBkYXRhKSB7XG4gICAgcmV0dXJuIGh0dHAucHV0KCdyb2xlcy8nICsgaWQsIGRhdGEpLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICByZXR1cm4gd3JhcFJvbGUoaHR0cCwgcmVzcG9uc2UuZGF0YSk7XG4gICAgfSwgX2Vycm9ySGFuZGxlcjIuZGVmYXVsdCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIEFwaSBLZXlcbiAgICogQG1lbWJlcm9mIENvbnRlbnRmdWxTcGFjZUFQSVxuICAgKiBAcGFyYW0gIHtzdHJpbmd9IGlkXG4gICAqIEByZXR1cm4ge1Byb21pc2U8QXBpS2V5LkFwaUtleT59IFByb21pc2UgZm9yIGEgQXBpIEtleVxuICAgKiBAZXhhbXBsZVxuICAgKiBzcGFjZS5nZXRBcGlLZXkoJ2lkJylcbiAgICogLnRoZW4oYXBpS2V5ID0+IGNvbnNvbGUubG9nKGFwaUtleSkpXG4gICAqL1xuICBmdW5jdGlvbiBnZXRBcGlLZXkoaWQpIHtcbiAgICByZXR1cm4gaHR0cC5nZXQoJ2FwaV9rZXlzLycgKyBpZCkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgIHJldHVybiB3cmFwQXBpS2V5KGh0dHAsIHJlc3BvbnNlLmRhdGEpO1xuICAgIH0sIF9lcnJvckhhbmRsZXIyLmRlZmF1bHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSBjb2xsZWN0aW9uIG9mIEFwaSBLZXlzXG4gICAqIEBtZW1iZXJvZiBDb250ZW50ZnVsU3BhY2VBUElcbiAgICogQHJldHVybiB7UHJvbWlzZTxBcGlLZXkuQXBpS2V5Q29sbGVjdGlvbj59IFByb21pc2UgZm9yIGEgY29sbGVjdGlvbiBvZiBBcGkgS2V5c1xuICAgKiBAZXhhbXBsZVxuICAgKiBzcGFjZS5nZXRBcGlLZXlzKClcbiAgICogLnRoZW4oYXBpS2V5cyA9PiBjb25zb2xlLmxvZyhhcGlLZXlzLml0ZW1zKSlcbiAgICovXG4gIGZ1bmN0aW9uIGdldEFwaUtleXMoKSB7XG4gICAgcmV0dXJuIGh0dHAuZ2V0KCdhcGlfa2V5cycpLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICByZXR1cm4gd3JhcEFwaUtleUNvbGxlY3Rpb24oaHR0cCwgcmVzcG9uc2UuZGF0YSk7XG4gICAgfSwgX2Vycm9ySGFuZGxlcjIuZGVmYXVsdCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIEFwaSBLZXlcbiAgICogQG1lbWJlcm9mIENvbnRlbnRmdWxTcGFjZUFQSVxuICAgKiBAc2VlIHtBcGlLZXkuQXBpS2V5fVxuICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YSAtIE9iamVjdCByZXByZXNlbnRhdGlvbiBvZiB0aGUgQXBpIEtleSB0byBiZSBjcmVhdGVkXG4gICAqIEByZXR1cm4ge1Byb21pc2U8QXBpS2V5LkFwaUtleT59IFByb21pc2UgZm9yIHRoZSBuZXdseSBjcmVhdGVkIEFwaSBLZXlcbiAgICogQGV4YW1wbGVcbiAgICogc3BhY2UuY3JlYXRlQXBpS2V5KHt9KVxuICAgKiAudGhlbihhcGlLZXkgPT4gY29uc29sZS5sb2coYXBpS2V5KSlcbiAgICovXG4gIGZ1bmN0aW9uIGNyZWF0ZUFwaUtleShkYXRhKSB7XG4gICAgcmV0dXJuIGh0dHAucG9zdCgnYXBpX2tleXMnLCBkYXRhKS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgcmV0dXJuIHdyYXBBcGlLZXkoaHR0cCwgcmVzcG9uc2UuZGF0YSk7XG4gICAgfSwgX2Vycm9ySGFuZGxlcjIuZGVmYXVsdCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIEFwaSBLZXkgd2l0aCBhIHNwZWNpZmljIGlkXG4gICAqIEBtZW1iZXJvZiBDb250ZW50ZnVsU3BhY2VBUElcbiAgICogQHNlZSB7QXBpS2V5LkFwaUtleX1cbiAgICogQHBhcmFtIHtzdHJpbmd9IGlkIC0gQXBpIEtleSBJRFxuICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YSAtIE9iamVjdCByZXByZXNlbnRhdGlvbiBvZiB0aGUgQXBpIEtleSB0byBiZSBjcmVhdGVkXG4gICAqIEByZXR1cm4ge1Byb21pc2U8QXBpS2V5LkFwaUtleT59IFByb21pc2UgZm9yIHRoZSBuZXdseSBjcmVhdGVkIEFwaSBLZXlcbiAgICogQGV4YW1wbGVcbiAgICogc3BhY2UuY3JlYXRlQXBpS2V5KCdpZCcsIHt9KVxuICAgKiAudGhlbihhcGlLZXkgPT4gY29uc29sZS5sb2coYXBpS2V5KSlcbiAgICovXG4gIGZ1bmN0aW9uIGNyZWF0ZUFwaUtleVdpdGhJZChpZCwgZGF0YSkge1xuICAgIHJldHVybiBodHRwLnB1dCgnYXBpX2tleXMvJyArIGlkLCBkYXRhKS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgcmV0dXJuIHdyYXBBcGlLZXkoaHR0cCwgcmVzcG9uc2UuZGF0YSk7XG4gICAgfSwgX2Vycm9ySGFuZGxlcjIuZGVmYXVsdCk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGRlbGV0ZTogZGVsZXRlU3BhY2UsXG4gICAgdXBkYXRlOiB1cGRhdGVTcGFjZSxcbiAgICBnZXRDb250ZW50VHlwZTogZ2V0Q29udGVudFR5cGUsXG4gICAgZ2V0Q29udGVudFR5cGVzOiBnZXRDb250ZW50VHlwZXMsXG4gICAgY3JlYXRlQ29udGVudFR5cGU6IGNyZWF0ZUNvbnRlbnRUeXBlLFxuICAgIGNyZWF0ZUNvbnRlbnRUeXBlV2l0aElkOiBjcmVhdGVDb250ZW50VHlwZVdpdGhJZCxcbiAgICBnZXRFbnRyeTogZ2V0RW50cnksXG4gICAgZ2V0RW50cmllczogZ2V0RW50cmllcyxcbiAgICBjcmVhdGVFbnRyeTogY3JlYXRlRW50cnksXG4gICAgY3JlYXRlRW50cnlXaXRoSWQ6IGNyZWF0ZUVudHJ5V2l0aElkLFxuICAgIGdldEFzc2V0OiBnZXRBc3NldCxcbiAgICBnZXRBc3NldHM6IGdldEFzc2V0cyxcbiAgICBjcmVhdGVBc3NldDogY3JlYXRlQXNzZXQsXG4gICAgY3JlYXRlQXNzZXRXaXRoSWQ6IGNyZWF0ZUFzc2V0V2l0aElkLFxuICAgIGdldExvY2FsZTogZ2V0TG9jYWxlLFxuICAgIGdldExvY2FsZXM6IGdldExvY2FsZXMsXG4gICAgY3JlYXRlTG9jYWxlOiBjcmVhdGVMb2NhbGUsXG4gICAgZ2V0V2ViaG9vazogZ2V0V2ViaG9vayxcbiAgICBnZXRXZWJob29rczogZ2V0V2ViaG9va3MsXG4gICAgY3JlYXRlV2ViaG9vazogY3JlYXRlV2ViaG9vayxcbiAgICBjcmVhdGVXZWJob29rV2l0aElkOiBjcmVhdGVXZWJob29rV2l0aElkLFxuICAgIGdldFJvbGU6IGdldFJvbGUsXG4gICAgZ2V0Um9sZXM6IGdldFJvbGVzLFxuICAgIGNyZWF0ZVJvbGU6IGNyZWF0ZVJvbGUsXG4gICAgY3JlYXRlUm9sZVdpdGhJZDogY3JlYXRlUm9sZVdpdGhJZCxcbiAgICBnZXRTcGFjZU1lbWJlcnNoaXA6IGdldFNwYWNlTWVtYmVyc2hpcCxcbiAgICBnZXRTcGFjZU1lbWJlcnNoaXBzOiBnZXRTcGFjZU1lbWJlcnNoaXBzLFxuICAgIGNyZWF0ZVNwYWNlTWVtYmVyc2hpcDogY3JlYXRlU3BhY2VNZW1iZXJzaGlwLFxuICAgIGNyZWF0ZVNwYWNlTWVtYmVyc2hpcFdpdGhJZDogY3JlYXRlU3BhY2VNZW1iZXJzaGlwV2l0aElkLFxuICAgIGdldEFwaUtleTogZ2V0QXBpS2V5LFxuICAgIGdldEFwaUtleXM6IGdldEFwaUtleXMsXG4gICAgY3JlYXRlQXBpS2V5OiBjcmVhdGVBcGlLZXksXG4gICAgY3JlYXRlQXBpS2V5V2l0aElkOiBjcmVhdGVBcGlLZXlXaXRoSWRcbiAgfTtcbn0iLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2NvcmUtanMvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eScpO1xuXG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2RlZmluZVByb3BlcnR5KTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gZW5oYW5jZVdpdGhNZXRob2RzO1xuXG52YXIgX3JlZHVjZSA9IHJlcXVpcmUoJ2xvZGFzaC9yZWR1Y2UnKTtcblxudmFyIF9yZWR1Y2UyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVkdWNlKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBlbmhhbmNlcyBhIGJhc2Ugb2JqZWN0IHdoaWNoIHdvdWxkIG5vcm1hbGx5IGNvbnRhaW4gZGF0YSwgd2l0aFxuICogbWV0aG9kcyBmcm9tIGFub3RoZXIgb2JqZWN0IHRoYXQgbWlnaHQgd29yayBvbiBtYW5pcHVsYXRpbmcgdGhhdCBkYXRhLlxuICogQWxsIHRoZSBhZGRlZCBtZXRob2RzIGFyZSBzZXQgYXMgbm9uIGVudW1lcmFibGUsIG5vbiBjb25maWd1cmFibGUsIGFuZCBub25cbiAqIHdyaXRhYmxlIHByb3BlcnRpZXMuIFRoaXMgZW5zdXJlcyB0aGF0IGlmIHdlIHRyeSB0byBjbG9uZSBvciBzdHJpbmdpZnkgdGhlXG4gKiBiYXNlIG9iamVjdCwgd2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCB0aGVzZSBhZGRpdGlvbmFsIG1ldGhvZHMuXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtvYmplY3R9IGJhc2VPYmplY3QgLSBCYXNlIG9iamVjdCB3aXRoIGRhdGFcbiAqIEBwYXJhbSB7b2JqZWN0fSBtZXRob2RzT2JqZWN0IC0gT2JqZWN0IHdpdGggbWV0aG9kcyBhcyBwcm9wZXJ0aWVzLiBUaGUga2V5XG4gKiB2YWx1ZXMgdXNlZCBoZXJlIHdpbGwgYmUgdGhlIHNhbWUgdGhhdCB3aWxsIGJlIGRlZmluZWQgb24gdGhlIGJhc2VPYmplY3QuXG4gKi9cbmZ1bmN0aW9uIGVuaGFuY2VXaXRoTWV0aG9kcyhiYXNlT2JqZWN0LCBtZXRob2RzT2JqZWN0KSB7XG4gIHJldHVybiAoMCwgX3JlZHVjZTIuZGVmYXVsdCkobWV0aG9kc09iamVjdCwgZnVuY3Rpb24gKGJhc2VPYmplY3QsIG1ldGhvZCwgbWV0aG9kTmFtZSkge1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKGJhc2VPYmplY3QsIG1ldGhvZE5hbWUsIHtcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIHZhbHVlOiBtZXRob2RcbiAgICB9KTtcbiAgICByZXR1cm4gYmFzZU9iamVjdDtcbiAgfSwgYmFzZU9iamVjdCk7XG59IiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy53cmFwQXBpS2V5ID0gd3JhcEFwaUtleTtcbmV4cG9ydHMud3JhcEFwaUtleUNvbGxlY3Rpb24gPSB3cmFwQXBpS2V5Q29sbGVjdGlvbjtcblxudmFyIF9jbG9uZURlZXAgPSByZXF1aXJlKCdsb2Rhc2gvY2xvbmVEZWVwJyk7XG5cbnZhciBfY2xvbmVEZWVwMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2Nsb25lRGVlcCk7XG5cbnZhciBfZnJlZXplU3lzID0gcmVxdWlyZSgnY29udGVudGZ1bC1zZGstY29yZS9mcmVlemUtc3lzJyk7XG5cbnZhciBfZnJlZXplU3lzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2ZyZWV6ZVN5cyk7XG5cbnZhciBfZW5oYW5jZVdpdGhNZXRob2RzID0gcmVxdWlyZSgnLi4vZW5oYW5jZS13aXRoLW1ldGhvZHMnKTtcblxudmFyIF9lbmhhbmNlV2l0aE1ldGhvZHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZW5oYW5jZVdpdGhNZXRob2RzKTtcblxudmFyIF90b1BsYWluT2JqZWN0ID0gcmVxdWlyZSgnY29udGVudGZ1bC1zZGstY29yZS9taXhpbnMvdG8tcGxhaW4tb2JqZWN0Jyk7XG5cbnZhciBfdG9QbGFpbk9iamVjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF90b1BsYWluT2JqZWN0KTtcblxudmFyIF9pbnN0YW5jZUFjdGlvbnMgPSByZXF1aXJlKCcuLi9pbnN0YW5jZS1hY3Rpb25zJyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbi8qKlxuICogQG1lbWJlcm9mIEFwaUtleVxuICogQHR5cGVkZWYgQXBpS2V5XG4gKiBAcHJvcCB7TWV0YS5TeXN9IHN5cyAtIFN5c3RlbSBtZXRhZGF0YVxuICogQHByb3Age3N0cmluZ30gbmFtZVxuICogQHByb3Age3N0cmluZ30gZGVzY3JpcHRpb25cbiAqIEBwcm9wIHtmdW5jdGlvbigpOiBPYmplY3R9IHRvUGxhaW5PYmplY3QoKSAtIFJldHVybnMgdGhpcyBBcGkgS2V5IGFzIGEgcGxhaW4gSlMgb2JqZWN0XG4gKi9cblxuZnVuY3Rpb24gY3JlYXRlQXBpS2V5QXBpKGh0dHApIHtcbiAgcmV0dXJuIHtcblxuICAgIC8qKlxuICAgICAqIFNlbmRzIGFuIHVwZGF0ZSB0byB0aGUgc2VydmVyIHdpdGggYW55IGNoYW5nZXMgbWFkZSB0byB0aGUgb2JqZWN0J3MgcHJvcGVydGllc1xuICAgICAqIEBtZW1iZXJvZiBBcGlLZXlcbiAgICAgKiBAZnVuYyB1cGRhdGVcbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlPEFwaUtleT59IE9iamVjdCByZXR1cm5lZCBmcm9tIHRoZSBzZXJ2ZXIgd2l0aCB1cGRhdGVkIGNoYW5nZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBhcGlLZXkubmFtZSA9ICdOZXcgbmFtZSdcbiAgICAgKiBhcGlLZXkudXBkYXRlKClcbiAgICAgKiAudGhlbihhcGlLZXkgPT4gY29uc29sZS5sb2coYXBpS2V5Lm5hbWUpKVxuICAgICAqL1xuICAgIHVwZGF0ZTogKDAsIF9pbnN0YW5jZUFjdGlvbnMuY3JlYXRlVXBkYXRlRW50aXR5KSh7XG4gICAgICBodHRwOiBodHRwLFxuICAgICAgZW50aXR5UGF0aDogJ2FwaV9rZXlzJyxcbiAgICAgIHdyYXBwZXJNZXRob2Q6IHdyYXBBcGlLZXlcbiAgICB9KSxcblxuICAgIC8qKlxuICAgICAqIERlbGV0ZXMgdGhpcyBvYmplY3Qgb24gdGhlIHNlcnZlci5cbiAgICAgKiBAbWVtYmVyb2YgQXBpS2V5XG4gICAgICogQGZ1bmMgZGVsZXRlXG4gICAgICogQHJldHVybiB7UHJvbWlzZX0gUHJvbWlzZSBmb3IgdGhlIGRlbGV0aW9uLiBJdCBjb250YWlucyBubyBkYXRhLCBidXQgdGhlIFByb21pc2UgZXJyb3IgY2FzZSBzaG91bGQgYmUgaGFuZGxlZC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGFwaUtleS5kZWxldGUoKVxuICAgICAqIC5jYXRjaChlcnIgPT4gY29uc29sZS5sb2coZXJyKSlcbiAgICAgKi9cbiAgICBkZWxldGU6ICgwLCBfaW5zdGFuY2VBY3Rpb25zLmNyZWF0ZURlbGV0ZUVudGl0eSkoe1xuICAgICAgaHR0cDogaHR0cCxcbiAgICAgIGVudGl0eVBhdGg6ICdhcGlfa2V5cydcbiAgICB9KVxuICB9O1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gaHR0cCAtIEhUVFAgY2xpZW50IGluc3RhbmNlXG4gKiBAcGFyYW0ge09iamVjdH0gZGF0YSAtIFJhdyBhcGkga2V5IGRhdGFcbiAqIEByZXR1cm4ge0FwaUtleX0gV3JhcHBlZCBhcGkga2V5IGRhdGFcbiAqL1xuLyoqXG4gKiBBcGkgS2V5IGluc3RhbmNlc1xuICogQG5hbWVzcGFjZSBBcGlLZXlcbiAqL1xuZnVuY3Rpb24gd3JhcEFwaUtleShodHRwLCBkYXRhKSB7XG4gIHZhciBhcGlLZXkgPSAoMCwgX3RvUGxhaW5PYmplY3QyLmRlZmF1bHQpKCgwLCBfY2xvbmVEZWVwMi5kZWZhdWx0KShkYXRhKSk7XG4gICgwLCBfZW5oYW5jZVdpdGhNZXRob2RzMi5kZWZhdWx0KShhcGlLZXksIGNyZWF0ZUFwaUtleUFwaShodHRwKSk7XG4gIHJldHVybiAoMCwgX2ZyZWV6ZVN5czIuZGVmYXVsdCkoYXBpS2V5KTtcbn1cblxuLyoqXG4gKiBAbWVtYmVyb2YgQXBpS2V5XG4gKiBAdHlwZWRlZiBBcGlLZXlDb2xsZWN0aW9uXG4gKiBAcHJvcCB7bnVtYmVyfSB0b3RhbFxuICogQHByb3Age251bWJlcn0gc2tpcFxuICogQHByb3Age251bWJlcn0gbGltaXRcbiAqIEBwcm9wIHtBcnJheTxBcGlLZXkuQXBpS2V5Pn0gaXRlbXNcbiAqIEBwcm9wIHtmdW5jdGlvbigpOiBPYmplY3R9IHRvUGxhaW5PYmplY3QoKSAtIFJldHVybnMgdGhpcyBBcGkgS2V5IGNvbGxlY3Rpb24gYXMgYSBwbGFpbiBKUyBvYmplY3RcbiAqL1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gaHR0cCAtIEhUVFAgY2xpZW50IGluc3RhbmNlXG4gKiBAcGFyYW0ge09iamVjdH0gZGF0YSAtIFJhdyBhcGkga2V5IGNvbGxlY3Rpb24gZGF0YVxuICogQHJldHVybiB7QXBpS2V5Q29sbGVjdGlvbn0gV3JhcHBlZCBhcGkga2V5IGNvbGxlY3Rpb24gZGF0YVxuICovXG5mdW5jdGlvbiB3cmFwQXBpS2V5Q29sbGVjdGlvbihodHRwLCBkYXRhKSB7XG4gIHZhciBhcGlLZXlzID0gKDAsIF90b1BsYWluT2JqZWN0Mi5kZWZhdWx0KSgoMCwgX2Nsb25lRGVlcDIuZGVmYXVsdCkoZGF0YSkpO1xuICBhcGlLZXlzLml0ZW1zID0gYXBpS2V5cy5pdGVtcy5tYXAoZnVuY3Rpb24gKGVudGl0eSkge1xuICAgIHJldHVybiB3cmFwQXBpS2V5KGh0dHAsIGVudGl0eSk7XG4gIH0pO1xuICByZXR1cm4gKDAsIF9mcmVlemVTeXMyLmRlZmF1bHQpKGFwaUtleXMpO1xufSIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9rZXlzID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9jb3JlLWpzL29iamVjdC9rZXlzJyk7XG5cbnZhciBfa2V5czIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9rZXlzKTtcblxudmFyIF9wcm9taXNlID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9jb3JlLWpzL3Byb21pc2UnKTtcblxudmFyIF9wcm9taXNlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Byb21pc2UpO1xuXG5leHBvcnRzLndyYXBBc3NldCA9IHdyYXBBc3NldDtcbmV4cG9ydHMud3JhcEFzc2V0Q29sbGVjdGlvbiA9IHdyYXBBc3NldENvbGxlY3Rpb247XG5cbnZhciBfY2xvbmVEZWVwID0gcmVxdWlyZSgnbG9kYXNoL2Nsb25lRGVlcCcpO1xuXG52YXIgX2Nsb25lRGVlcDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbG9uZURlZXApO1xuXG52YXIgX2ZyZWV6ZVN5cyA9IHJlcXVpcmUoJ2NvbnRlbnRmdWwtc2RrLWNvcmUvZnJlZXplLXN5cycpO1xuXG52YXIgX2ZyZWV6ZVN5czIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9mcmVlemVTeXMpO1xuXG52YXIgX2VuaGFuY2VXaXRoTWV0aG9kcyA9IHJlcXVpcmUoJy4uL2VuaGFuY2Utd2l0aC1tZXRob2RzJyk7XG5cbnZhciBfZW5oYW5jZVdpdGhNZXRob2RzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2VuaGFuY2VXaXRoTWV0aG9kcyk7XG5cbnZhciBfdG9QbGFpbk9iamVjdCA9IHJlcXVpcmUoJ2NvbnRlbnRmdWwtc2RrLWNvcmUvbWl4aW5zL3RvLXBsYWluLW9iamVjdCcpO1xuXG52YXIgX3RvUGxhaW5PYmplY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdG9QbGFpbk9iamVjdCk7XG5cbnZhciBfZXJyb3JIYW5kbGVyID0gcmVxdWlyZSgnLi4vZXJyb3ItaGFuZGxlcicpO1xuXG52YXIgX2Vycm9ySGFuZGxlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9lcnJvckhhbmRsZXIpO1xuXG52YXIgX2luc3RhbmNlQWN0aW9ucyA9IHJlcXVpcmUoJy4uL2luc3RhbmNlLWFjdGlvbnMnKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuLyoqXG4gKiBBc3NldCBpbnN0YW5jZXNcbiAqIEBuYW1lc3BhY2UgQXNzZXRcbiAqL1xuXG5cbnZhciBBU1NFVF9QUk9DRVNTSU5HX0NIRUNLX1dBSVQgPSA1MDA7XG52YXIgQVNTRVRfUFJPQ0VTU0lOR19DSEVDS19SRVRSSUVTID0gNTtcblxuLyoqXG4gKiBAbWVtYmVyb2YgQXNzZXRcbiAqIEB0eXBlZGVmIEFzc2V0XG4gKiBAcHJvcCB7TWV0YS5TeXN9IHN5cyAtIFN0YW5kYXJkIHN5c3RlbSBtZXRhZGF0YSB3aXRoIGFkZGl0aW9uYWwgYXNzZXQgc3BlY2lmaWMgcHJvcGVydGllc1xuICogQHByb3Age3N0cmluZz19IHN5cy5sb2NhbGUgLSBJZiBwcmVzZW50LCBpbmRpY2F0ZXMgdGhlIGxvY2FsZSB3aGljaCB0aGlzIGFzc2V0IHVzZXNcbiAqIEBwcm9wIHtPYmplY3R9IGZpZWxkcyAtIE9iamVjdCB3aXRoIGNvbnRlbnQgZm9yIGVhY2ggZmllbGRcbiAqIEBwcm9wIHtzdHJpbmd9IGZpZWxkcy50aXRsZSAtIFRpdGxlIGZvciB0aGlzIGFzc2V0XG4gKiBAcHJvcCB7c3RyaW5nfSBmaWVsZHMuZGVzY3JpcHRpb24gLSBEZXNjcmlwdGlvbiBmb3IgdGhpcyBhc3NldFxuICogQHByb3Age09iamVjdH0gZmllbGRzLmZpbGUgLSBGaWxlIG9iamVjdCBmb3IgdGhpcyBhc3NldFxuICogQHByb3Age09iamVjdH0gZmllbGRzLmZpbGUuZmlsZU5hbWUgLSBOYW1lIGZvciB0aGUgZmlsZVxuICogQHByb3Age3N0cmluZ30gZmllbGRzLmZpbGUuY29udGVudFR5cGUgLSBNaW1lIHR5cGUgZm9yIHRoZSBmaWxlXG4gKiBAcHJvcCB7c3RyaW5nPX0gZmllbGRzLmZpbGUudXBsb2FkIC0gVXJsIHdoZXJlIHRoZSBmaWxlIGlzIGF2YWlsYWJsZSB0byBiZSBkb3dubG9hZGVkIGZyb20sIGludG8gdGhlIENvbnRlbnRmdWwgYXNzZXQgc3lzdGVtLiBBZnRlciB0aGUgYXNzZXQgaXMgcHJvY2Vzc2VkIHRoaXMgZmllbGQgaXMgZ29uZS5cbiAqIEBwcm9wIHtzdHJpbmc9fSBmaWVsZHMuZmlsZS51cmwgLSBVcmwgd2hlcmUgdGhlIGZpbGUgaXMgYXZhaWxhYmxlIGF0IHRoZSBDb250ZW50ZnVsIG1lZGlhIGFzc2V0IHN5c3RlbS4gVGhpcyBmaWVsZCB3b24ndCBiZSBhdmFpbGFibGUgdW50aWwgdGhlIGFzc2V0IGlzIHByb2Nlc3NlZC5cbiAqIEBwcm9wIHtPYmplY3R9IGZpZWxkcy5maWxlLmRldGFpbHMgLSBEZXRhaWxzIGZvciB0aGUgZmlsZSwgZGVwZW5kaW5nIG9uIGZpbGUgdHlwZSAoZXhhbXBsZTogaW1hZ2Ugc2l6ZSBpbiBieXRlcywgZXRjKVxuICogQHByb3Age2Z1bmN0aW9uKCk6IE9iamVjdH0gdG9QbGFpbk9iamVjdCgpIC0gUmV0dXJucyB0aGlzIEFzc2V0IGFzIGEgcGxhaW4gSlMgb2JqZWN0XG4gKi9cblxuZnVuY3Rpb24gY3JlYXRlQXNzZXRBcGkoaHR0cCkge1xuICBmdW5jdGlvbiBjaGVja0lmQXNzZXRIYXNVcmwoX3JlZikge1xuICAgIHZhciByZXNvbHZlID0gX3JlZi5yZXNvbHZlO1xuICAgIHZhciByZWplY3QgPSBfcmVmLnJlamVjdDtcbiAgICB2YXIgaWQgPSBfcmVmLmlkO1xuICAgIHZhciBsb2NhbGUgPSBfcmVmLmxvY2FsZTtcbiAgICB2YXIgX3JlZiRwcm9jZXNzaW5nQ2hlY2tXID0gX3JlZi5wcm9jZXNzaW5nQ2hlY2tXYWl0O1xuICAgIHZhciBwcm9jZXNzaW5nQ2hlY2tXYWl0ID0gX3JlZiRwcm9jZXNzaW5nQ2hlY2tXID09PSB1bmRlZmluZWQgPyBBU1NFVF9QUk9DRVNTSU5HX0NIRUNLX1dBSVQgOiBfcmVmJHByb2Nlc3NpbmdDaGVja1c7XG4gICAgdmFyIF9yZWYkcHJvY2Vzc2luZ0NoZWNrUiA9IF9yZWYucHJvY2Vzc2luZ0NoZWNrUmV0cmllcztcbiAgICB2YXIgcHJvY2Vzc2luZ0NoZWNrUmV0cmllcyA9IF9yZWYkcHJvY2Vzc2luZ0NoZWNrUiA9PT0gdW5kZWZpbmVkID8gQVNTRVRfUFJPQ0VTU0lOR19DSEVDS19SRVRSSUVTIDogX3JlZiRwcm9jZXNzaW5nQ2hlY2tSO1xuICAgIHZhciBfcmVmJGNoZWNrQ291bnQgPSBfcmVmLmNoZWNrQ291bnQ7XG4gICAgdmFyIGNoZWNrQ291bnQgPSBfcmVmJGNoZWNrQ291bnQgPT09IHVuZGVmaW5lZCA/IDAgOiBfcmVmJGNoZWNrQ291bnQ7XG5cbiAgICBodHRwLmdldCgnYXNzZXRzLycgKyBpZCkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgIHJldHVybiB3cmFwQXNzZXQoaHR0cCwgcmVzcG9uc2UuZGF0YSk7XG4gICAgfSwgX2Vycm9ySGFuZGxlcjIuZGVmYXVsdCkudGhlbihmdW5jdGlvbiAoYXNzZXQpIHtcbiAgICAgIGlmIChhc3NldC5maWVsZHMuZmlsZVtsb2NhbGVdLnVybCkge1xuICAgICAgICByZXNvbHZlKGFzc2V0KTtcbiAgICAgIH0gZWxzZSBpZiAoY2hlY2tDb3VudCA9PT0gcHJvY2Vzc2luZ0NoZWNrUmV0cmllcykge1xuICAgICAgICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IoKTtcbiAgICAgICAgZXJyb3IubmFtZSA9ICdBc3NldFByb2Nlc3NpbmdUaW1lb3V0JztcbiAgICAgICAgZXJyb3IubWVzc2FnZSA9ICdBc3NldCBpcyB0YWtpbmcgbG9uZ2VyIHRoZW4gZXhwZWN0ZWQgdG8gcHJvY2Vzcy4nO1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2hlY2tDb3VudCsrO1xuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gY2hlY2tJZkFzc2V0SGFzVXJsKHtcbiAgICAgICAgICAgIHJlc29sdmU6IHJlc29sdmUsXG4gICAgICAgICAgICByZWplY3Q6IHJlamVjdCxcbiAgICAgICAgICAgIGlkOiBpZCxcbiAgICAgICAgICAgIGxvY2FsZTogbG9jYWxlLFxuICAgICAgICAgICAgY2hlY2tDb3VudDogY2hlY2tDb3VudFxuICAgICAgICAgIH0pO1xuICAgICAgICB9LCBwcm9jZXNzaW5nQ2hlY2tXYWl0KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHByb2Nlc3NGb3JMb2NhbGUobG9jYWxlKSB7XG4gICAgdmFyIF9yZWYyID0gYXJndW1lbnRzLmxlbmd0aCA8PSAxIHx8IGFyZ3VtZW50c1sxXSA9PT0gdW5kZWZpbmVkID8ge30gOiBhcmd1bWVudHNbMV07XG5cbiAgICB2YXIgcHJvY2Vzc2luZ0NoZWNrV2FpdCA9IF9yZWYyLnByb2Nlc3NpbmdDaGVja1dhaXQ7XG4gICAgdmFyIHByb2Nlc3NpbmdDaGVja1JldHJpZXMgPSBfcmVmMi5wcm9jZXNzaW5nQ2hlY2tSZXRyaWVzO1xuXG4gICAgdmFyIGFzc2V0SWQgPSB0aGlzLnN5cy5pZDtcbiAgICByZXR1cm4gaHR0cC5wdXQoJ2Fzc2V0cy8nICsgdGhpcy5zeXMuaWQgKyAnL2ZpbGVzLycgKyBsb2NhbGUgKyAnL3Byb2Nlc3MnLCBudWxsLCB7XG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICdYLUNvbnRlbnRmdWwtVmVyc2lvbic6IHRoaXMuc3lzLnZlcnNpb25cbiAgICAgIH1cbiAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBuZXcgX3Byb21pc2UyLmRlZmF1bHQoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICByZXR1cm4gY2hlY2tJZkFzc2V0SGFzVXJsKHtcbiAgICAgICAgICByZXNvbHZlOiByZXNvbHZlLFxuICAgICAgICAgIHJlamVjdDogcmVqZWN0LFxuICAgICAgICAgIGlkOiBhc3NldElkLFxuICAgICAgICAgIGxvY2FsZTogbG9jYWxlLFxuICAgICAgICAgIHByb2Nlc3NpbmdDaGVja1dhaXQ6IHByb2Nlc3NpbmdDaGVja1dhaXQsXG4gICAgICAgICAgcHJvY2Vzc2luZ0NoZWNrUmV0cmllczogcHJvY2Vzc2luZ0NoZWNrUmV0cmllc1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0sIF9lcnJvckhhbmRsZXIyLmRlZmF1bHQpO1xuICB9XG5cbiAgZnVuY3Rpb24gcHJvY2Vzc0ZvckFsbExvY2FsZXMoKSB7XG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDAgfHwgYXJndW1lbnRzWzBdID09PSB1bmRlZmluZWQgPyB7fSA6IGFyZ3VtZW50c1swXTtcblxuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgbG9jYWxlcyA9ICgwLCBfa2V5czIuZGVmYXVsdCkodGhpcy5maWVsZHMuZmlsZSk7XG4gICAgcmV0dXJuIF9wcm9taXNlMi5kZWZhdWx0LmFsbChsb2NhbGVzLm1hcChmdW5jdGlvbiAobG9jYWxlKSB7XG4gICAgICByZXR1cm4gcHJvY2Vzc0ZvckxvY2FsZS5jYWxsKHNlbGYsIGxvY2FsZSwgb3B0aW9ucyk7XG4gICAgfSkpLnRoZW4oZnVuY3Rpb24gKGFzc2V0cykge1xuICAgICAgcmV0dXJuIGFzc2V0c1swXTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLyoqXG4gICAgICogU2VuZHMgYW4gdXBkYXRlIHRvIHRoZSBzZXJ2ZXIgd2l0aCBhbnkgY2hhbmdlcyBtYWRlIHRvIHRoZSBvYmplY3QncyBwcm9wZXJ0aWVzXG4gICAgICogQG1lbWJlcm9mIEFzc2V0XG4gICAgICogQGZ1bmMgdXBkYXRlXG4gICAgICogQHJldHVybiB7UHJvbWlzZTxBc3NldD59IE9iamVjdCByZXR1cm5lZCBmcm9tIHRoZSBzZXJ2ZXIgd2l0aCB1cGRhdGVkIGNoYW5nZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb250ZW50VHlwZS5maWVsZHMubmFtZVsnZW4tVVMnXSA9ICdCbG9nIFBvc3QnXG4gICAgICogYXNzZXQudXBkYXRlKClcbiAgICAgKiAudGhlbihhc3NldCA9PiBjb25zb2xlLmxvZyhhc3NldC5maWVsZHMubmFtZVsnZW4tVVMnXSkpXG4gICAgICovXG4gICAgdXBkYXRlOiAoMCwgX2luc3RhbmNlQWN0aW9ucy5jcmVhdGVVcGRhdGVFbnRpdHkpKHtcbiAgICAgIGh0dHA6IGh0dHAsXG4gICAgICBlbnRpdHlQYXRoOiAnYXNzZXRzJyxcbiAgICAgIHdyYXBwZXJNZXRob2Q6IHdyYXBBc3NldFxuICAgIH0pLFxuXG4gICAgLyoqXG4gICAgICogRGVsZXRlcyB0aGlzIG9iamVjdCBvbiB0aGUgc2VydmVyLlxuICAgICAqIEBtZW1iZXJvZiBBc3NldFxuICAgICAqIEBmdW5jIGRlbGV0ZVxuICAgICAqIEByZXR1cm4ge1Byb21pc2V9IFByb21pc2UgZm9yIHRoZSBkZWxldGlvbi4gSXQgY29udGFpbnMgbm8gZGF0YSwgYnV0IHRoZSBQcm9taXNlIGVycm9yIGNhc2Ugc2hvdWxkIGJlIGhhbmRsZWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBhc3NldC5kZWxldGUoKVxuICAgICAqIC5jYXRjaChlcnIgPT4gY29uc29sZS5sb2coZXJyKSlcbiAgICAgKi9cbiAgICBkZWxldGU6ICgwLCBfaW5zdGFuY2VBY3Rpb25zLmNyZWF0ZURlbGV0ZUVudGl0eSkoe1xuICAgICAgaHR0cDogaHR0cCxcbiAgICAgIGVudGl0eVBhdGg6ICdhc3NldHMnXG4gICAgfSksXG5cbiAgICAvKipcbiAgICAgKiBQdWJsaXNoZXMgdGhlIG9iamVjdFxuICAgICAqIEBtZW1iZXJvZiBBc3NldFxuICAgICAqIEBmdW5jIHB1Ymxpc2hcbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlPEFzc2V0Pn0gT2JqZWN0IHJldHVybmVkIGZyb20gdGhlIHNlcnZlciB3aXRoIHVwZGF0ZWQgbWV0YWRhdGEuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBhc3NldC5wdWJsaXNoKClcbiAgICAgKiAudGhlbihhc3NldCA9PiBjb25zb2xlLmxvZyhhc3NldC5zeXMucHVibGlzaGVkVmVyc2lvbikpXG4gICAgICovXG4gICAgcHVibGlzaDogKDAsIF9pbnN0YW5jZUFjdGlvbnMuY3JlYXRlUHVibGlzaEVudGl0eSkoe1xuICAgICAgaHR0cDogaHR0cCxcbiAgICAgIGVudGl0eVBhdGg6ICdhc3NldHMnLFxuICAgICAgd3JhcHBlck1ldGhvZDogd3JhcEFzc2V0XG4gICAgfSksXG5cbiAgICAvKipcbiAgICAgKiBVbnB1Ymxpc2hlcyB0aGUgb2JqZWN0XG4gICAgICogQG1lbWJlcm9mIEFzc2V0XG4gICAgICogQGZ1bmMgdW5wdWJsaXNoXG4gICAgICogQHJldHVybiB7UHJvbWlzZTxBc3NldD59IE9iamVjdCByZXR1cm5lZCBmcm9tIHRoZSBzZXJ2ZXIgd2l0aCB1cGRhdGVkIG1ldGFkYXRhLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYXNzZXQudW5wdWJsaXNoKClcbiAgICAgKiAudGhlbihhc3NldCA9PiBjb25zb2xlLmxvZyhhc3NldC5zeXMpKVxuICAgICAqL1xuICAgIHVucHVibGlzaDogKDAsIF9pbnN0YW5jZUFjdGlvbnMuY3JlYXRlVW5wdWJsaXNoRW50aXR5KSh7XG4gICAgICBodHRwOiBodHRwLFxuICAgICAgZW50aXR5UGF0aDogJ2Fzc2V0cycsXG4gICAgICB3cmFwcGVyTWV0aG9kOiB3cmFwQXNzZXRcbiAgICB9KSxcblxuICAgIC8qKlxuICAgICAqIEFyY2hpdmVzIHRoZSBvYmplY3RcbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRcbiAgICAgKiBAZnVuYyBhcmNoaXZlXG4gICAgICogQHJldHVybiB7UHJvbWlzZTxBc3NldD59IE9iamVjdCByZXR1cm5lZCBmcm9tIHRoZSBzZXJ2ZXIgd2l0aCB1cGRhdGVkIG1ldGFkYXRhLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYXNzZXQuYXJjaGl2ZSgpXG4gICAgICogLnRoZW4oYXNzZXQgPT4gY29uc29sZS5sb2coYXNzZXQuc3lzLmFyY2hpdmVkVmVyc2lvbikpXG4gICAgICovXG4gICAgYXJjaGl2ZTogKDAsIF9pbnN0YW5jZUFjdGlvbnMuY3JlYXRlQXJjaGl2ZUVudGl0eSkoe1xuICAgICAgaHR0cDogaHR0cCxcbiAgICAgIGVudGl0eVBhdGg6ICdhc3NldHMnLFxuICAgICAgd3JhcHBlck1ldGhvZDogd3JhcEFzc2V0XG4gICAgfSksXG5cbiAgICAvKipcbiAgICAgKiBVbmFyY2hpdmVzIHRoZSBvYmplY3RcbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRcbiAgICAgKiBAZnVuYyB1bmFyY2hpdmVcbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlPEFzc2V0Pn0gT2JqZWN0IHJldHVybmVkIGZyb20gdGhlIHNlcnZlciB3aXRoIHVwZGF0ZWQgbWV0YWRhdGEuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBhc3NldC51bmFyY2hpdmUoKVxuICAgICAqIC50aGVuKGFzc2V0ID0+IGNvbnNvbGUubG9nKGFzc2V0LnN5cykpXG4gICAgICovXG4gICAgdW5hcmNoaXZlOiAoMCwgX2luc3RhbmNlQWN0aW9ucy5jcmVhdGVVbmFyY2hpdmVFbnRpdHkpKHtcbiAgICAgIGh0dHA6IGh0dHAsXG4gICAgICBlbnRpdHlQYXRoOiAnYXNzZXRzJyxcbiAgICAgIHdyYXBwZXJNZXRob2Q6IHdyYXBBc3NldFxuICAgIH0pLFxuXG4gICAgLyoqXG4gICAgICogVHJpZ2dlcnMgYXNzZXQgcHJvY2Vzc2luZyBhZnRlciBhbiB1cGxvYWQsIGZvciB0aGUgZmlsZSB1cGxvYWRlZCB0byBhIHNwZWNpZmljIGxvY2FsZS5cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRcbiAgICAgKiBAZnVuYyBwcm9jZXNzRm9yTG9jYWxlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxvY2FsZSAtIExvY2FsZSB3aGljaCBwcm9jZXNzaW5nIHNob3VsZCBiZSB0cmlnZ2VyZWQgZm9yXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgLSBBZGRpdGlvbmFsIG9wdGlvbnMgZm9yIHByb2Nlc3NpbmdcbiAgICAgKiBAcHJvcCB7bnVtYmVyfSBvcHRpb25zLnByb2Nlc3NpbmdDaGVja1dhaXQgLSBUaW1lIGluIG1pbGxpc2Vjb25kcyB0byB3YWl0IGJlZm9yZSBjaGVja2luZyBhZ2FpbiBpZiB0aGUgYXNzZXQgaGFzIGJlZW4gcHJvY2Vzc2VkIChkZWZhdWx0OiA1MDBtcylcbiAgICAgKiBAcHJvcCB7bnVtYmVyfSBvcHRpb25zLnByb2Nlc3NpbmdDaGVja1JldHJpZXMgLSBNYXhpbXVtIGFtb3VudCBvZiB0aW1lcyB0byBjaGVjayBpZiB0aGUgYXNzZXQgaGFzIGJlZW4gcHJvY2Vzc2VkIChkZWZhdWx0OiA1KVxuICAgICAqIEByZXR1cm4ge1Byb21pc2U8QXNzZXQ+fSBPYmplY3QgcmV0dXJuZWQgZnJvbSB0aGUgc2VydmVyIHdpdGggdXBkYXRlZCBtZXRhZGF0YS5cbiAgICAgKiBAdGhyb3dzIHtBc3NldFByb2Nlc3NpbmdUaW1lb3V0fSBJZiB0aGUgYXNzZXQgdGFrZXMgdG9vIGxvbmcgdG8gcHJvY2Vzcy4gSWYgdGhpcyBoYXBwZW5zLCByZXRyaWV2ZSB0aGUgYXNzZXQgYWdhaW4sIGFuZCBpZiB0aGUgdXJsIHByb3BlcnR5IGlzIGF2YWlsYWJsZSwgdGhlbiBwcm9jZXNzaW5nIGhhcyBzdWNjZWVkZWQuIElmIG5vdCwgeW91ciBmaWxlIG1pZ2h0IGJlIGRhbWFnZWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBhc3NldC5wcm9jZXNzRm9yTG9jYWxlKCdlbi1VUycpXG4gICAgICogLnRoZW4oYXNzZXQgPT4gY29uc29sZS5sb2coYXNzZXQuZmllbGRzLmZpbGVbJ2VuLVVTJ10udXJsKSlcbiAgICAgKi9cbiAgICBwcm9jZXNzRm9yTG9jYWxlOiBwcm9jZXNzRm9yTG9jYWxlLFxuXG4gICAgLyoqXG4gICAgICogVHJpZ2dlcnMgYXNzZXQgcHJvY2Vzc2luZyBhZnRlciBhbiB1cGxvYWQsIGZvciB0aGUgZmlsZXMgdXBsb2FkZWQgdG8gYWxsIGxvY2FsZXMgb2YgYW4gYXNzZXQuXG4gICAgICogQG1lbWJlcm9mIEFzc2V0XG4gICAgICogQGZ1bmMgcHJvY2Vzc0ZvckFsbExvY2FsZXNcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyAtIEFkZGl0aW9uYWwgb3B0aW9ucyBmb3IgcHJvY2Vzc2luZ1xuICAgICAqIEBwcm9wIHtudW1iZXJ9IG9wdGlvbnMucHJvY2Vzc2luZ0NoZWNrV2FpdCAtIFRpbWUgaW4gbWlsbGlzZWNvbmRzIHRvIHdhaXQgYmVmb3JlIGNoZWNraW5nIGFnYWluIGlmIHRoZSBhc3NldCBoYXMgYmVlbiBwcm9jZXNzZWQgKGRlZmF1bHQ6IDUwMG1zKVxuICAgICAqIEBwcm9wIHtudW1iZXJ9IG9wdGlvbnMucHJvY2Vzc2luZ0NoZWNrUmV0cmllcyAtIE1heGltdW0gYW1vdW50IG9mIHRpbWVzIHRvIGNoZWNrIGlmIHRoZSBhc3NldCBoYXMgYmVlbiBwcm9jZXNzZWQgKGRlZmF1bHQ6IDUpXG4gICAgICogQHJldHVybiB7UHJvbWlzZTxBc3NldD59IE9iamVjdCByZXR1cm5lZCBmcm9tIHRoZSBzZXJ2ZXIgd2l0aCB1cGRhdGVkIG1ldGFkYXRhLlxuICAgICAqIEB0aHJvd3Mge0Fzc2V0UHJvY2Vzc2luZ1RpbWVvdXR9IElmIHRoZSBhc3NldCB0YWtlcyB0b28gbG9uZyB0byBwcm9jZXNzLiBJZiB0aGlzIGhhcHBlbnMsIHJldHJpZXZlIHRoZSBhc3NldCBhZ2FpbiwgYW5kIGlmIHRoZSB1cmwgcHJvcGVydHkgaXMgYXZhaWxhYmxlLCB0aGVuIHByb2Nlc3NpbmcgaGFzIHN1Y2NlZWRlZC4gSWYgbm90LCB5b3VyIGZpbGUgbWlnaHQgYmUgZGFtYWdlZC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGFzc2V0LnByb2Nlc3NGb3JBbGxMb2NhbGVzKClcbiAgICAgKiAudGhlbihhc3NldCA9PiBjb25zb2xlLmxvZyhhc3NldC5maWVsZHMuZmlsZVsnZW4tVVMnXS51cmwsIGFzc2V0LmZpZWxkcy5maWxlWydkZS1ERSddLnVybCkpXG4gICAgICovXG4gICAgcHJvY2Vzc0ZvckFsbExvY2FsZXM6IHByb2Nlc3NGb3JBbGxMb2NhbGVzLFxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSBhc3NldCBpcyBwdWJsaXNoZWQuIEEgcHVibGlzaGVkIGFzc2V0IG1pZ2h0IGhhdmUgdW5wdWJsaXNoZWQgY2hhbmdlcyAoQHNlZSB7QXNzZXQuaXNVcGRhdGVkfSlcbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRcbiAgICAgKiBAZnVuYyBpc1B1Ymxpc2hlZFxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAgICovXG4gICAgaXNQdWJsaXNoZWQ6ICgwLCBfaW5zdGFuY2VBY3Rpb25zLmNyZWF0ZVB1Ymxpc2hlZENoZWNrZXIpKCksXG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlIGFzc2V0IGlzIHVwZGF0ZWQuIFRoaXMgbWVhbnMgdGhlIGFzc2V0IHdhcyBwcmV2aW91c2x5IHB1Ymxpc2hlZCBidXQgaGFzIHVucHVibGlzaGVkIGNoYW5nZXMuXG4gICAgICogQG1lbWJlcm9mIEFzc2V0XG4gICAgICogQGZ1bmMgaXNVcGRhdGVkXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBpc1VwZGF0ZWQ6ICgwLCBfaW5zdGFuY2VBY3Rpb25zLmNyZWF0ZVVwZGF0ZWRDaGVja2VyKSgpLFxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSBhc3NldCBpcyBpbiBkcmFmdCBtb2RlLiBUaGlzIG1lYW5zIGl0IGlzIG5vdCBwdWJsaXNoZWQuXG4gICAgICogQG1lbWJlcm9mIEFzc2V0XG4gICAgICogQGZ1bmMgaXNEcmFmdFxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAgICovXG4gICAgaXNEcmFmdDogKDAsIF9pbnN0YW5jZUFjdGlvbnMuY3JlYXRlRHJhZnRDaGVja2VyKSgpLFxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGFzc2V0IGlzIGFyY2hpdmVkLiBUaGlzIG1lYW5zIGl0J3Mgbm90IGV4cG9zZWQgdG8gdGhlIERlbGl2ZXJ5L1ByZXZpZXcgQVBJcy5cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRcbiAgICAgKiBAZnVuYyBpc0FyY2hpdmVkXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBpc0FyY2hpdmVkOiAoMCwgX2luc3RhbmNlQWN0aW9ucy5jcmVhdGVBcmNoaXZlZENoZWNrZXIpKClcbiAgfTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IGh0dHAgLSBIVFRQIGNsaWVudCBpbnN0YW5jZVxuICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSBSYXcgYXNzZXQgZGF0YVxuICogQHJldHVybiB7QXNzZXR9IFdyYXBwZWQgYXNzZXQgZGF0YVxuICovXG5mdW5jdGlvbiB3cmFwQXNzZXQoaHR0cCwgZGF0YSkge1xuICB2YXIgYXNzZXQgPSAoMCwgX3RvUGxhaW5PYmplY3QyLmRlZmF1bHQpKCgwLCBfY2xvbmVEZWVwMi5kZWZhdWx0KShkYXRhKSk7XG4gICgwLCBfZW5oYW5jZVdpdGhNZXRob2RzMi5kZWZhdWx0KShhc3NldCwgY3JlYXRlQXNzZXRBcGkoaHR0cCkpO1xuICByZXR1cm4gKDAsIF9mcmVlemVTeXMyLmRlZmF1bHQpKGFzc2V0KTtcbn1cblxuLyoqXG4gKiBAbWVtYmVyb2YgQXNzZXRcbiAqIEB0eXBlZGVmIEFzc2V0Q29sbGVjdGlvblxuICogQHByb3Age251bWJlcn0gdG90YWxcbiAqIEBwcm9wIHtudW1iZXJ9IHNraXBcbiAqIEBwcm9wIHtudW1iZXJ9IGxpbWl0XG4gKiBAcHJvcCB7QXJyYXk8QXNzZXQuQXNzZXQ+fSBpdGVtc1xuICogQHByb3Age2Z1bmN0aW9uKCk6IE9iamVjdH0gdG9QbGFpbk9iamVjdCgpIC0gUmV0dXJucyB0aGlzIEFzc2V0IGNvbGxlY3Rpb24gYXMgYSBwbGFpbiBKUyBvYmplY3RcbiAqL1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gaHR0cCAtIEhUVFAgY2xpZW50IGluc3RhbmNlXG4gKiBAcGFyYW0ge09iamVjdH0gZGF0YSAtIFJhdyBhc3NldCBjb2xsZWN0aW9uIGRhdGFcbiAqIEByZXR1cm4ge0Fzc2V0Q29sbGVjdGlvbn0gV3JhcHBlZCBhc3NldCBjb2xsZWN0aW9uIGRhdGFcbiAqL1xuZnVuY3Rpb24gd3JhcEFzc2V0Q29sbGVjdGlvbihodHRwLCBkYXRhKSB7XG4gIHZhciBhc3NldHMgPSAoMCwgX3RvUGxhaW5PYmplY3QyLmRlZmF1bHQpKCgwLCBfY2xvbmVEZWVwMi5kZWZhdWx0KShkYXRhKSk7XG4gIGFzc2V0cy5pdGVtcyA9IGFzc2V0cy5pdGVtcy5tYXAoZnVuY3Rpb24gKGVudGl0eSkge1xuICAgIHJldHVybiB3cmFwQXNzZXQoaHR0cCwgZW50aXR5KTtcbiAgfSk7XG4gIHJldHVybiAoMCwgX2ZyZWV6ZVN5czIuZGVmYXVsdCkoYXNzZXRzKTtcbn0iLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLndyYXBDb250ZW50VHlwZSA9IHdyYXBDb250ZW50VHlwZTtcbmV4cG9ydHMud3JhcENvbnRlbnRUeXBlQ29sbGVjdGlvbiA9IHdyYXBDb250ZW50VHlwZUNvbGxlY3Rpb247XG5cbnZhciBfY2xvbmVEZWVwID0gcmVxdWlyZSgnbG9kYXNoL2Nsb25lRGVlcCcpO1xuXG52YXIgX2Nsb25lRGVlcDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbG9uZURlZXApO1xuXG52YXIgX2ZyZWV6ZVN5cyA9IHJlcXVpcmUoJ2NvbnRlbnRmdWwtc2RrLWNvcmUvZnJlZXplLXN5cycpO1xuXG52YXIgX2ZyZWV6ZVN5czIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9mcmVlemVTeXMpO1xuXG52YXIgX2VuaGFuY2VXaXRoTWV0aG9kcyA9IHJlcXVpcmUoJy4uL2VuaGFuY2Utd2l0aC1tZXRob2RzJyk7XG5cbnZhciBfZW5oYW5jZVdpdGhNZXRob2RzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2VuaGFuY2VXaXRoTWV0aG9kcyk7XG5cbnZhciBfdG9QbGFpbk9iamVjdCA9IHJlcXVpcmUoJ2NvbnRlbnRmdWwtc2RrLWNvcmUvbWl4aW5zL3RvLXBsYWluLW9iamVjdCcpO1xuXG52YXIgX3RvUGxhaW5PYmplY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdG9QbGFpbk9iamVjdCk7XG5cbnZhciBfaW5zdGFuY2VBY3Rpb25zID0gcmVxdWlyZSgnLi4vaW5zdGFuY2UtYWN0aW9ucycpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG4vKipcbiAqIEBtZW1iZXJvZiBDb250ZW50VHlwZVxuICogQHR5cGVkZWYgQ29udGVudFR5cGVcbiAqIEBwcm9wIHtNZXRhLlN5c30gc3lzIC0gU3lzdGVtIG1ldGFkYXRhXG4gKiBAcHJvcCB7c3RyaW5nfSBuYW1lXG4gKiBAcHJvcCB7c3RyaW5nfSBkZXNjcmlwdGlvblxuICogQHByb3Age3N0cmluZ30gZGlzcGxheUZpZWxkIC0gRmllbGQgdXNlZCBhcyB0aGUgbWFpbiBkaXNwbGF5IGZpZWxkIGZvciBFbnRyaWVzXG4gKiBAcHJvcCB7c3RyaW5nfSBBcnJheTxGaWVsZD4gLSBBbGwgdGhlIGZpZWxkcyBjb250YWluZWQgaW4gdGhpcyBDb250ZW50IFR5cGVcbiAqIEBwcm9wIHtmdW5jdGlvbigpOiBPYmplY3R9IHRvUGxhaW5PYmplY3QoKSAtIFJldHVybnMgdGhpcyBDb250ZW50IFR5cGUgYXMgYSBwbGFpbiBKUyBvYmplY3RcbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVDb250ZW50VHlwZUFwaShodHRwKSB7XG4gIHJldHVybiB7XG5cbiAgICAvKipcbiAgICAgKiBTZW5kcyBhbiB1cGRhdGUgdG8gdGhlIHNlcnZlciB3aXRoIGFueSBjaGFuZ2VzIG1hZGUgdG8gdGhlIG9iamVjdCdzIHByb3BlcnRpZXNcbiAgICAgKiBAbWVtYmVyb2YgQ29udGVudFR5cGVcbiAgICAgKiBAZnVuYyB1cGRhdGVcbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlPENvbnRlbnRUeXBlPn0gT2JqZWN0IHJldHVybmVkIGZyb20gdGhlIHNlcnZlciB3aXRoIHVwZGF0ZWQgY2hhbmdlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnRlbnRUeXBlLm5hbWUgPSAnTmV3IG5hbWUnXG4gICAgICogY29udGVudFR5cGUudXBkYXRlKClcbiAgICAgKiAudGhlbihjb250ZW50VHlwZSA9PiBjb25zb2xlLmxvZyhjb250ZW50VHlwZS5uYW1lKSlcbiAgICAgKi9cbiAgICB1cGRhdGU6ICgwLCBfaW5zdGFuY2VBY3Rpb25zLmNyZWF0ZVVwZGF0ZUVudGl0eSkoe1xuICAgICAgaHR0cDogaHR0cCxcbiAgICAgIGVudGl0eVBhdGg6ICdjb250ZW50X3R5cGVzJyxcbiAgICAgIHdyYXBwZXJNZXRob2Q6IHdyYXBDb250ZW50VHlwZVxuICAgIH0pLFxuXG4gICAgLyoqXG4gICAgICogRGVsZXRlcyB0aGlzIG9iamVjdCBvbiB0aGUgc2VydmVyLlxuICAgICAqIEBtZW1iZXJvZiBDb250ZW50VHlwZVxuICAgICAqIEBmdW5jIGRlbGV0ZVxuICAgICAqIEByZXR1cm4ge1Byb21pc2V9IFByb21pc2UgZm9yIHRoZSBkZWxldGlvbi4gSXQgY29udGFpbnMgbm8gZGF0YSwgYnV0IHRoZSBQcm9taXNlIGVycm9yIGNhc2Ugc2hvdWxkIGJlIGhhbmRsZWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb250ZW50VHlwZS5kZWxldGUoKVxuICAgICAqIC5jYXRjaChlcnIgPT4gY29uc29sZS5sb2coZXJyKSlcbiAgICAgKi9cbiAgICBkZWxldGU6ICgwLCBfaW5zdGFuY2VBY3Rpb25zLmNyZWF0ZURlbGV0ZUVudGl0eSkoe1xuICAgICAgaHR0cDogaHR0cCxcbiAgICAgIGVudGl0eVBhdGg6ICdjb250ZW50X3R5cGVzJ1xuICAgIH0pLFxuXG4gICAgLyoqXG4gICAgICogUHVibGlzaGVzIHRoZSBvYmplY3RcbiAgICAgKiBAbWVtYmVyb2YgQ29udGVudFR5cGVcbiAgICAgKiBAZnVuYyBwdWJsaXNoXG4gICAgICogQHJldHVybiB7UHJvbWlzZTxDb250ZW50VHlwZT59IE9iamVjdCByZXR1cm5lZCBmcm9tIHRoZSBzZXJ2ZXIgd2l0aCB1cGRhdGVkIG1ldGFkYXRhLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29udGVudFR5cGUucHVibGlzaCgpXG4gICAgICogLnRoZW4oY29udGVudFR5cGUgPT4gY29uc29sZS5sb2coY29udGVudFR5cGUuc3lzLnB1Ymxpc2hlZFZlcnNpb24pKVxuICAgICAqL1xuICAgIHB1Ymxpc2g6ICgwLCBfaW5zdGFuY2VBY3Rpb25zLmNyZWF0ZVB1Ymxpc2hFbnRpdHkpKHtcbiAgICAgIGh0dHA6IGh0dHAsXG4gICAgICBlbnRpdHlQYXRoOiAnY29udGVudF90eXBlcycsXG4gICAgICB3cmFwcGVyTWV0aG9kOiB3cmFwQ29udGVudFR5cGVcbiAgICB9KSxcblxuICAgIC8qKlxuICAgICAqIFVucHVibGlzaGVzIHRoZSBvYmplY3RcbiAgICAgKiBAbWVtYmVyb2YgQ29udGVudFR5cGVcbiAgICAgKiBAZnVuYyB1bnB1Ymxpc2hcbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlPENvbnRlbnRUeXBlPn0gT2JqZWN0IHJldHVybmVkIGZyb20gdGhlIHNlcnZlciB3aXRoIHVwZGF0ZWQgbWV0YWRhdGEuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb250ZW50VHlwZS51bnB1Ymxpc2goKVxuICAgICAqIC50aGVuKGNvbnRlbnRUeXBlID0+IGNvbnNvbGUubG9nKGNvbnRlbnRUeXBlLnN5cykpXG4gICAgICovXG4gICAgdW5wdWJsaXNoOiAoMCwgX2luc3RhbmNlQWN0aW9ucy5jcmVhdGVVbnB1Ymxpc2hFbnRpdHkpKHtcbiAgICAgIGh0dHA6IGh0dHAsXG4gICAgICBlbnRpdHlQYXRoOiAnY29udGVudF90eXBlcycsXG4gICAgICB3cmFwcGVyTWV0aG9kOiB3cmFwQ29udGVudFR5cGVcbiAgICB9KSxcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgY29udGVudFR5cGUgaXMgcHVibGlzaGVkLiBBIHB1Ymxpc2hlZCBjb250ZW50VHlwZSBtaWdodCBoYXZlIHVucHVibGlzaGVkIGNoYW5nZXMgKEBzZWUge0NvbnRlbnRUeXBlLmlzVXBkYXRlZH0pXG4gICAgICogQG1lbWJlcm9mIENvbnRlbnRUeXBlXG4gICAgICogQGZ1bmMgaXNQdWJsaXNoZWRcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgICAqL1xuICAgIGlzUHVibGlzaGVkOiAoMCwgX2luc3RhbmNlQWN0aW9ucy5jcmVhdGVQdWJsaXNoZWRDaGVja2VyKSgpLFxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSBjb250ZW50VHlwZSBpcyB1cGRhdGVkLiBUaGlzIG1lYW5zIHRoZSBjb250ZW50VHlwZSB3YXMgcHJldmlvdXNseSBwdWJsaXNoZWQgYnV0IGhhcyB1bnB1Ymxpc2hlZCBjaGFuZ2VzLlxuICAgICAqIEBtZW1iZXJvZiBDb250ZW50VHlwZVxuICAgICAqIEBmdW5jIGlzVXBkYXRlZFxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAgICovXG4gICAgaXNVcGRhdGVkOiAoMCwgX2luc3RhbmNlQWN0aW9ucy5jcmVhdGVVcGRhdGVkQ2hlY2tlcikoKSxcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgY29udGVudFR5cGUgaXMgaW4gZHJhZnQgbW9kZS4gVGhpcyBtZWFucyBpdCBpcyBub3QgcHVibGlzaGVkLlxuICAgICAqIEBtZW1iZXJvZiBDb250ZW50VHlwZVxuICAgICAqIEBmdW5jIGlzRHJhZnRcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgICAqL1xuICAgIGlzRHJhZnQ6ICgwLCBfaW5zdGFuY2VBY3Rpb25zLmNyZWF0ZURyYWZ0Q2hlY2tlcikoKVxuICB9O1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gaHR0cCAtIEhUVFAgY2xpZW50IGluc3RhbmNlXG4gKiBAcGFyYW0ge09iamVjdH0gZGF0YSAtIFJhdyBjb250ZW50IHR5cGUgZGF0YVxuICogQHJldHVybiB7Q29udGVudFR5cGV9IFdyYXBwZWQgY29udGVudCB0eXBlIGRhdGFcbiAqL1xuLyoqXG4gKiBDb250ZW50IFR5cGUgaW5zdGFuY2VzXG4gKiBAbmFtZXNwYWNlIENvbnRlbnRUeXBlXG4gKi9cbmZ1bmN0aW9uIHdyYXBDb250ZW50VHlwZShodHRwLCBkYXRhKSB7XG4gIHZhciBjb250ZW50VHlwZSA9ICgwLCBfdG9QbGFpbk9iamVjdDIuZGVmYXVsdCkoKDAsIF9jbG9uZURlZXAyLmRlZmF1bHQpKGRhdGEpKTtcbiAgKDAsIF9lbmhhbmNlV2l0aE1ldGhvZHMyLmRlZmF1bHQpKGNvbnRlbnRUeXBlLCBjcmVhdGVDb250ZW50VHlwZUFwaShodHRwKSk7XG4gIHJldHVybiAoMCwgX2ZyZWV6ZVN5czIuZGVmYXVsdCkoY29udGVudFR5cGUpO1xufVxuXG4vKipcbiAqIEBtZW1iZXJvZiBDb250ZW50VHlwZVxuICogQHR5cGVkZWYgQ29udGVudFR5cGVDb2xsZWN0aW9uXG4gKiBAcHJvcCB7bnVtYmVyfSB0b3RhbFxuICogQHByb3Age251bWJlcn0gc2tpcFxuICogQHByb3Age251bWJlcn0gbGltaXRcbiAqIEBwcm9wIHtBcnJheTxDb250ZW50VHlwZS5Db250ZW50VHlwZT59IGl0ZW1zXG4gKiBAcHJvcCB7ZnVuY3Rpb24oKTogT2JqZWN0fSB0b1BsYWluT2JqZWN0KCkgLSBSZXR1cm5zIHRoaXMgQ29udGVudCBUeXBlIGNvbGxlY3Rpb24gYXMgYSBwbGFpbiBKUyBvYmplY3RcbiAqL1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gaHR0cCAtIEhUVFAgY2xpZW50IGluc3RhbmNlXG4gKiBAcGFyYW0ge09iamVjdH0gZGF0YSAtIFJhdyBjb250ZW50IHR5cGUgY29sbGVjdGlvbiBkYXRhXG4gKiBAcmV0dXJuIHtDb250ZW50VHlwZUNvbGxlY3Rpb259IFdyYXBwZWQgY29udGVudCB0eXBlIGNvbGxlY3Rpb24gZGF0YVxuICovXG5mdW5jdGlvbiB3cmFwQ29udGVudFR5cGVDb2xsZWN0aW9uKGh0dHAsIGRhdGEpIHtcbiAgdmFyIGNvbnRlbnRUeXBlcyA9ICgwLCBfdG9QbGFpbk9iamVjdDIuZGVmYXVsdCkoKDAsIF9jbG9uZURlZXAyLmRlZmF1bHQpKGRhdGEpKTtcbiAgY29udGVudFR5cGVzLml0ZW1zID0gY29udGVudFR5cGVzLml0ZW1zLm1hcChmdW5jdGlvbiAoZW50aXR5KSB7XG4gICAgcmV0dXJuIHdyYXBDb250ZW50VHlwZShodHRwLCBlbnRpdHkpO1xuICB9KTtcbiAgcmV0dXJuICgwLCBfZnJlZXplU3lzMi5kZWZhdWx0KShjb250ZW50VHlwZXMpO1xufSIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMud3JhcEVudHJ5ID0gd3JhcEVudHJ5O1xuZXhwb3J0cy53cmFwRW50cnlDb2xsZWN0aW9uID0gd3JhcEVudHJ5Q29sbGVjdGlvbjtcblxudmFyIF9jbG9uZURlZXAgPSByZXF1aXJlKCdsb2Rhc2gvY2xvbmVEZWVwJyk7XG5cbnZhciBfY2xvbmVEZWVwMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2Nsb25lRGVlcCk7XG5cbnZhciBfZnJlZXplU3lzID0gcmVxdWlyZSgnY29udGVudGZ1bC1zZGstY29yZS9mcmVlemUtc3lzJyk7XG5cbnZhciBfZnJlZXplU3lzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2ZyZWV6ZVN5cyk7XG5cbnZhciBfZW5oYW5jZVdpdGhNZXRob2RzID0gcmVxdWlyZSgnLi4vZW5oYW5jZS13aXRoLW1ldGhvZHMnKTtcblxudmFyIF9lbmhhbmNlV2l0aE1ldGhvZHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZW5oYW5jZVdpdGhNZXRob2RzKTtcblxudmFyIF90b1BsYWluT2JqZWN0ID0gcmVxdWlyZSgnY29udGVudGZ1bC1zZGstY29yZS9taXhpbnMvdG8tcGxhaW4tb2JqZWN0Jyk7XG5cbnZhciBfdG9QbGFpbk9iamVjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF90b1BsYWluT2JqZWN0KTtcblxudmFyIF9pbnN0YW5jZUFjdGlvbnMgPSByZXF1aXJlKCcuLi9pbnN0YW5jZS1hY3Rpb25zJyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbi8qKlxuICogVHlwZXMgb2YgZmllbGRzIGZvdW5kIGluIGFuIEVudHJ5XG4gKiBAbmFtZXNwYWNlIEVudHJ5RmllbGRzXG4gKi9cblxuLyoqXG4gKiBAbWVtYmVyb2YgRW50cnlGaWVsZHNcbiAqIEB0eXBlZGVmIFN5bWJvbFxuICogQHR5cGUgc3RyaW5nXG4gKi9cblxuLyoqXG4gKiBAbWVtYmVyb2YgRW50cnlGaWVsZHNcbiAqIEB0eXBlZGVmIFRleHRcbiAqIEB0eXBlIHN0cmluZ1xuICovXG5cbi8qKlxuICogQG1lbWJlcm9mIEVudHJ5RmllbGRzXG4gKiBAdHlwZWRlZiBJbnRlZ2VyXG4gKiBAdHlwZSBudW1iZXJcbiAqL1xuXG4vKipcbiAqIEBtZW1iZXJvZiBFbnRyeUZpZWxkc1xuICogQHR5cGVkZWYgTnVtYmVyXG4gKiBAdHlwZSBudW1iZXJcbiAqL1xuXG4vKipcbiAqIEBtZW1iZXJvZiBFbnRyeUZpZWxkc1xuICogQHR5cGVkZWYgRGF0ZVxuICogQHR5cGUgc3RyaW5nXG4gKi9cblxuLyoqXG4gKiBAbWVtYmVyb2YgRW50cnlGaWVsZHNcbiAqIEB0eXBlZGVmIEJvb2xlYW5cbiAqIEB0eXBlIGJvb2xlYW5cbiAqL1xuXG4vKipcbiAqIEBtZW1iZXJvZiBFbnRyeUZpZWxkc1xuICogQHR5cGVkZWYgTG9jYXRpb25cbiAqIEBwcm9wIHtzdHJpbmd9IGxhdCAtIGxhdGl0dWRlXG4gKiBAcHJvcCB7c3RyaW5nfSBsb24gLSBsb25naXR1ZGVcbiAqL1xuXG4vKipcbiAqIEEgRmllbGQgaW4gYW4gRW50cnkgY2FuIGhhdmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdHlwZXMgdGhhdCBjYW4gYmUgZGVmaW5lZCBpbiBDb250ZW50ZnVsLiBTZWUgPGEgaHJlZj1cImh0dHBzOi8vd3d3LmNvbnRlbnRmdWwuY29tL2RldmVsb3BlcnMvZG9jcy9yZWZlcmVuY2VzL2ZpZWxkLXR5cGUvXCI+RmllbGQgVHlwZXM8L2E+IGZvciBtb3JlIGRldGFpbHMuXG4gKiBAbWVtYmVyb2YgRW50cnlGaWVsZHNcbiAqIEB0eXBlZGVmIEZpZWxkXG4gKiBAdHlwZSBFbnRyeUZpZWxkcy5TeW1ib2wgfCBFbnRyeUZpZWxkcy5UZXh0IHwgRW50cnlGaWVsZHMuSW50ZWdlciB8IEVudHJ5RmllbGRzLk51bWJlciB8IEVudHJ5RmllbGRzLkRhdGUgfCBFbnRyeUZpZWxkcy5Cb29sZWFuIHwgRW50cnlGaWVsZHMuTG9jYXRpb24gfCBNZXRhLkxpbmsgfCBBcnJheTxFbnRyeUZpZWxkcy5TeW1ib2x8TWV0YS5MaW5rPiB8IE9iamVjdFxuICovXG5cbi8qKlxuICogQG1lbWJlcm9mIEVudHJ5XG4gKiBAdHlwZWRlZiBFbnRyeVxuICogQHByb3Age01ldGEuU3lzfSBzeXMgLSBTdGFuZGFyZCBzeXN0ZW0gbWV0YWRhdGEgd2l0aCBhZGRpdGlvbmFsIGVudHJ5IHNwZWNpZmljIHByb3BlcnRpZXNcbiAqIEBwcm9wIHtNZXRhLkxpbmt9IHN5cy5jb250ZW50VHlwZSAtIENvbnRlbnQgVHlwZSB1c2VkIGJ5IHRoaXMgRW50cnlcbiAqIEBwcm9wIHtzdHJpbmc9fSBzeXMubG9jYWxlIC0gSWYgcHJlc2VudCwgaW5kaWNhdGVzIHRoZSBsb2NhbGUgd2hpY2ggdGhpcyBlbnRyeSB1c2VzXG4gKiBAcHJvcCB7T2JqZWN0PEVudHJ5RmllbGRzLkZpZWxkPn0gZmllbGRzIC0gT2JqZWN0IHdpdGggY29udGVudCBmb3IgZWFjaCBmaWVsZFxuICogQHByb3Age2Z1bmN0aW9uKCk6IE9iamVjdH0gdG9QbGFpbk9iamVjdCgpIC0gUmV0dXJucyB0aGlzIEVudHJ5IGFzIGEgcGxhaW4gSlMgb2JqZWN0XG4gKi9cblxuZnVuY3Rpb24gY3JlYXRlRW50cnlBcGkoaHR0cCkge1xuICByZXR1cm4ge1xuXG4gICAgLyoqXG4gICAgICogU2VuZHMgYW4gdXBkYXRlIHRvIHRoZSBzZXJ2ZXIgd2l0aCBhbnkgY2hhbmdlcyBtYWRlIHRvIHRoZSBvYmplY3QncyBwcm9wZXJ0aWVzXG4gICAgICogQG1lbWJlcm9mIEVudHJ5XG4gICAgICogQGZ1bmMgdXBkYXRlXG4gICAgICogQHJldHVybiB7UHJvbWlzZTxFbnRyeT59IE9iamVjdCByZXR1cm5lZCBmcm9tIHRoZSBzZXJ2ZXIgd2l0aCB1cGRhdGVkIGNoYW5nZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBlbnRyeS5maWVsZHMubmFtZVsnZW4tVVMnXSA9ICdCbG9nIFBvc3QnXG4gICAgICogZW50cnkudXBkYXRlKClcbiAgICAgKiAudGhlbihlbnRyeSA9PiBjb25zb2xlLmxvZyhlbnRyeS5maWVsZHMubmFtZVsnZW4tVVMnXSkpXG4gICAgICovXG4gICAgdXBkYXRlOiAoMCwgX2luc3RhbmNlQWN0aW9ucy5jcmVhdGVVcGRhdGVFbnRpdHkpKHtcbiAgICAgIGh0dHA6IGh0dHAsXG4gICAgICBlbnRpdHlQYXRoOiAnZW50cmllcycsXG4gICAgICB3cmFwcGVyTWV0aG9kOiB3cmFwRW50cnlcbiAgICB9KSxcblxuICAgIC8qKlxuICAgICAqIERlbGV0ZXMgdGhpcyBvYmplY3Qgb24gdGhlIHNlcnZlci5cbiAgICAgKiBAbWVtYmVyb2YgRW50cnlcbiAgICAgKiBAZnVuYyBkZWxldGVcbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlfSBQcm9taXNlIGZvciB0aGUgZGVsZXRpb24uIEl0IGNvbnRhaW5zIG5vIGRhdGEsIGJ1dCB0aGUgUHJvbWlzZSBlcnJvciBjYXNlIHNob3VsZCBiZSBoYW5kbGVkLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogZW50cnkuZGVsZXRlKClcbiAgICAgKiAuY2F0Y2goZXJyID0+IGNvbnNvbGUubG9nKGVycikpXG4gICAgICovXG4gICAgZGVsZXRlOiAoMCwgX2luc3RhbmNlQWN0aW9ucy5jcmVhdGVEZWxldGVFbnRpdHkpKHtcbiAgICAgIGh0dHA6IGh0dHAsXG4gICAgICBlbnRpdHlQYXRoOiAnZW50cmllcydcbiAgICB9KSxcblxuICAgIC8qKlxuICAgICAqIFB1Ymxpc2hlcyB0aGUgb2JqZWN0XG4gICAgICogQG1lbWJlcm9mIEVudHJ5XG4gICAgICogQGZ1bmMgcHVibGlzaFxuICAgICAqIEByZXR1cm4ge1Byb21pc2U8RW50cnk+fSBPYmplY3QgcmV0dXJuZWQgZnJvbSB0aGUgc2VydmVyIHdpdGggdXBkYXRlZCBtZXRhZGF0YS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGVudHJ5LnB1Ymxpc2goKVxuICAgICAqIC50aGVuKGVudHJ5ID0+IGNvbnNvbGUubG9nKGVudHJ5LnN5cy5wdWJsaXNoZWRWZXJzaW9uKSlcbiAgICAgKi9cbiAgICBwdWJsaXNoOiAoMCwgX2luc3RhbmNlQWN0aW9ucy5jcmVhdGVQdWJsaXNoRW50aXR5KSh7XG4gICAgICBodHRwOiBodHRwLFxuICAgICAgZW50aXR5UGF0aDogJ2VudHJpZXMnLFxuICAgICAgd3JhcHBlck1ldGhvZDogd3JhcEVudHJ5XG4gICAgfSksXG5cbiAgICAvKipcbiAgICAgKiBVbnB1Ymxpc2hlcyB0aGUgb2JqZWN0XG4gICAgICogQG1lbWJlcm9mIEVudHJ5XG4gICAgICogQGZ1bmMgdW5wdWJsaXNoXG4gICAgICogQHJldHVybiB7UHJvbWlzZTxFbnRyeT59IE9iamVjdCByZXR1cm5lZCBmcm9tIHRoZSBzZXJ2ZXIgd2l0aCB1cGRhdGVkIG1ldGFkYXRhLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogZW50cnkudW5wdWJsaXNoKClcbiAgICAgKiAudGhlbihlbnRyeSA9PiBjb25zb2xlLmxvZyhlbnRyeS5zeXMpKVxuICAgICAqL1xuICAgIHVucHVibGlzaDogKDAsIF9pbnN0YW5jZUFjdGlvbnMuY3JlYXRlVW5wdWJsaXNoRW50aXR5KSh7XG4gICAgICBodHRwOiBodHRwLFxuICAgICAgZW50aXR5UGF0aDogJ2VudHJpZXMnLFxuICAgICAgd3JhcHBlck1ldGhvZDogd3JhcEVudHJ5XG4gICAgfSksXG5cbiAgICAvKipcbiAgICAgKiBBcmNoaXZlcyB0aGUgb2JqZWN0XG4gICAgICogQG1lbWJlcm9mIEVudHJ5XG4gICAgICogQGZ1bmMgYXJjaGl2ZVxuICAgICAqIEByZXR1cm4ge1Byb21pc2U8RW50cnk+fSBPYmplY3QgcmV0dXJuZWQgZnJvbSB0aGUgc2VydmVyIHdpdGggdXBkYXRlZCBtZXRhZGF0YS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGVudHJ5LmFyY2hpdmUoKVxuICAgICAqIC50aGVuKGVudHJ5ID0+IGNvbnNvbGUubG9nKGVudHJ5LnN5cy5hcmNoaXZlZFZlcnNpb24pKVxuICAgICAqL1xuICAgIGFyY2hpdmU6ICgwLCBfaW5zdGFuY2VBY3Rpb25zLmNyZWF0ZUFyY2hpdmVFbnRpdHkpKHtcbiAgICAgIGh0dHA6IGh0dHAsXG4gICAgICBlbnRpdHlQYXRoOiAnZW50cmllcycsXG4gICAgICB3cmFwcGVyTWV0aG9kOiB3cmFwRW50cnlcbiAgICB9KSxcblxuICAgIC8qKlxuICAgICAqIFVuYXJjaGl2ZXMgdGhlIG9iamVjdFxuICAgICAqIEBtZW1iZXJvZiBFbnRyeVxuICAgICAqIEBmdW5jIHVuYXJjaGl2ZVxuICAgICAqIEByZXR1cm4ge1Byb21pc2U8RW50cnk+fSBPYmplY3QgcmV0dXJuZWQgZnJvbSB0aGUgc2VydmVyIHdpdGggdXBkYXRlZCBtZXRhZGF0YS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGVudHJ5LnVuYXJjaGl2ZSgpXG4gICAgICogLnRoZW4oZW50cnkgPT4gY29uc29sZS5sb2coZW50cnkuc3lzKSlcbiAgICAgKi9cbiAgICB1bmFyY2hpdmU6ICgwLCBfaW5zdGFuY2VBY3Rpb25zLmNyZWF0ZVVuYXJjaGl2ZUVudGl0eSkoe1xuICAgICAgaHR0cDogaHR0cCxcbiAgICAgIGVudGl0eVBhdGg6ICdlbnRyaWVzJyxcbiAgICAgIHdyYXBwZXJNZXRob2Q6IHdyYXBFbnRyeVxuICAgIH0pLFxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSBlbnRyeSBpcyBwdWJsaXNoZWQuIEEgcHVibGlzaGVkIGVudHJ5IG1pZ2h0IGhhdmUgdW5wdWJsaXNoZWQgY2hhbmdlcyAoQHNlZSB7RW50cnkuaXNVcGRhdGVkfSlcbiAgICAgKiBAbWVtYmVyb2YgRW50cnlcbiAgICAgKiBAZnVuYyBpc1B1Ymxpc2hlZFxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAgICovXG4gICAgaXNQdWJsaXNoZWQ6ICgwLCBfaW5zdGFuY2VBY3Rpb25zLmNyZWF0ZVB1Ymxpc2hlZENoZWNrZXIpKCksXG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlIGVudHJ5IGlzIHVwZGF0ZWQuIFRoaXMgbWVhbnMgdGhlIGVudHJ5IHdhcyBwcmV2aW91c2x5IHB1Ymxpc2hlZCBidXQgaGFzIHVucHVibGlzaGVkIGNoYW5nZXMuXG4gICAgICogQG1lbWJlcm9mIEVudHJ5XG4gICAgICogQGZ1bmMgaXNVcGRhdGVkXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBpc1VwZGF0ZWQ6ICgwLCBfaW5zdGFuY2VBY3Rpb25zLmNyZWF0ZVVwZGF0ZWRDaGVja2VyKSgpLFxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSBlbnRyeSBpcyBpbiBkcmFmdCBtb2RlLiBUaGlzIG1lYW5zIGl0IGlzIG5vdCBwdWJsaXNoZWQuXG4gICAgICogQG1lbWJlcm9mIEVudHJ5XG4gICAgICogQGZ1bmMgaXNEcmFmdFxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAgICovXG4gICAgaXNEcmFmdDogKDAsIF9pbnN0YW5jZUFjdGlvbnMuY3JlYXRlRHJhZnRDaGVja2VyKSgpLFxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGVudHJ5IGlzIGFyY2hpdmVkLiBUaGlzIG1lYW5zIGl0J3Mgbm90IGV4cG9zZWQgdG8gdGhlIERlbGl2ZXJ5L1ByZXZpZXcgQVBJcy5cbiAgICAgKiBAbWVtYmVyb2YgRW50cnlcbiAgICAgKiBAZnVuYyBpc0FyY2hpdmVkXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBpc0FyY2hpdmVkOiAoMCwgX2luc3RhbmNlQWN0aW9ucy5jcmVhdGVBcmNoaXZlZENoZWNrZXIpKClcbiAgfTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IGh0dHAgLSBIVFRQIGNsaWVudCBpbnN0YW5jZVxuICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSBSYXcgZW50cnkgZGF0YVxuICogQHJldHVybiB7RW50cnl9IFdyYXBwZWQgZW50cnkgZGF0YVxuICovXG4vKipcbiAqIEVudHJ5IGluc3RhbmNlc1xuICogQG5hbWVzcGFjZSBFbnRyeVxuICovXG5mdW5jdGlvbiB3cmFwRW50cnkoaHR0cCwgZGF0YSkge1xuICB2YXIgZW50cnkgPSAoMCwgX3RvUGxhaW5PYmplY3QyLmRlZmF1bHQpKCgwLCBfY2xvbmVEZWVwMi5kZWZhdWx0KShkYXRhKSk7XG4gICgwLCBfZW5oYW5jZVdpdGhNZXRob2RzMi5kZWZhdWx0KShlbnRyeSwgY3JlYXRlRW50cnlBcGkoaHR0cCkpO1xuICByZXR1cm4gKDAsIF9mcmVlemVTeXMyLmRlZmF1bHQpKGVudHJ5KTtcbn1cblxuLyoqXG4gKiBAbWVtYmVyb2YgRW50cnlcbiAqIEB0eXBlZGVmIEVudHJ5Q29sbGVjdGlvblxuICogQHByb3Age251bWJlcn0gdG90YWxcbiAqIEBwcm9wIHtudW1iZXJ9IHNraXBcbiAqIEBwcm9wIHtudW1iZXJ9IGxpbWl0XG4gKiBAcHJvcCB7QXJyYXk8RW50cnkuRW50cnk+fSBpdGVtc1xuICogQHByb3Age0FycmF5PE9iamVjdD49fSBlcnJvcnMgLSBBcnJheSBvZiBlcnJvcnMgdGhhdCBtaWdodCBvY2N1ciB3aGVuIHJldHJpZXZpbmcgZW50cmllcy5cbiAqIEBwcm9wIHtmdW5jdGlvbigpOiBPYmplY3R9IHRvUGxhaW5PYmplY3QoKSAtIFJldHVybnMgdGhpcyBFbnRyeSBjb2xsZWN0aW9uIGFzIGEgcGxhaW4gSlMgb2JqZWN0XG4gKi9cblxuLyoqXG4gKiBEYXRhIGlzIGFsc28gbWl4ZWQgaW4gd2l0aCBsaW5rIGdldHRlcnMgaWYgbGlua3MgZXhpc3QgYW5kIGluY2x1ZGVzIHdlcmUgcmVxdWVzdGVkXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IGh0dHAgLSBIVFRQIGNsaWVudCBpbnN0YW5jZVxuICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSBSYXcgZW50cnkgY29sbGVjdGlvbiBkYXRhXG4gKiBAcmV0dXJuIHtFbnRyeUNvbGxlY3Rpb259IFdyYXBwZWQgZW50cnkgY29sbGVjdGlvbiBkYXRhXG4gKi9cbmZ1bmN0aW9uIHdyYXBFbnRyeUNvbGxlY3Rpb24oaHR0cCwgZGF0YSwgcmVzb2x2ZUxpbmtzKSB7XG4gIHZhciBlbnRyaWVzID0gKDAsIF90b1BsYWluT2JqZWN0Mi5kZWZhdWx0KSgoMCwgX2Nsb25lRGVlcDIuZGVmYXVsdCkoZGF0YSkpO1xuICBlbnRyaWVzLml0ZW1zID0gZW50cmllcy5pdGVtcy5tYXAoZnVuY3Rpb24gKGVudGl0eSkge1xuICAgIHJldHVybiB3cmFwRW50cnkoaHR0cCwgZW50aXR5KTtcbiAgfSk7XG4gIHJldHVybiAoMCwgX2ZyZWV6ZVN5czIuZGVmYXVsdCkoZW50cmllcyk7XG59IiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX3NwYWNlID0gcmVxdWlyZSgnLi9zcGFjZScpO1xuXG52YXIgc3BhY2UgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChfc3BhY2UpO1xuXG52YXIgX2VudHJ5ID0gcmVxdWlyZSgnLi9lbnRyeScpO1xuXG52YXIgZW50cnkgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChfZW50cnkpO1xuXG52YXIgX2Fzc2V0ID0gcmVxdWlyZSgnLi9hc3NldCcpO1xuXG52YXIgYXNzZXQgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChfYXNzZXQpO1xuXG52YXIgX2NvbnRlbnRUeXBlID0gcmVxdWlyZSgnLi9jb250ZW50LXR5cGUnKTtcblxudmFyIGNvbnRlbnRUeXBlID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoX2NvbnRlbnRUeXBlKTtcblxudmFyIF9sb2NhbGUgPSByZXF1aXJlKCcuL2xvY2FsZScpO1xuXG52YXIgbG9jYWxlID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoX2xvY2FsZSk7XG5cbnZhciBfd2ViaG9vayA9IHJlcXVpcmUoJy4vd2ViaG9vaycpO1xuXG52YXIgd2ViaG9vayA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF93ZWJob29rKTtcblxudmFyIF9zcGFjZU1lbWJlcnNoaXAgPSByZXF1aXJlKCcuL3NwYWNlLW1lbWJlcnNoaXAnKTtcblxudmFyIHNwYWNlTWVtYmVyc2hpcCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9zcGFjZU1lbWJlcnNoaXApO1xuXG52YXIgX3JvbGUgPSByZXF1aXJlKCcuL3JvbGUnKTtcblxudmFyIHJvbGUgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChfcm9sZSk7XG5cbnZhciBfYXBpS2V5ID0gcmVxdWlyZSgnLi9hcGkta2V5Jyk7XG5cbnZhciBhcGlLZXkgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChfYXBpS2V5KTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQob2JqKSB7IGlmIChvYmogJiYgb2JqLl9fZXNNb2R1bGUpIHsgcmV0dXJuIG9iajsgfSBlbHNlIHsgdmFyIG5ld09iaiA9IHt9OyBpZiAob2JqICE9IG51bGwpIHsgZm9yICh2YXIga2V5IGluIG9iaikgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgbmV3T2JqW2tleV0gPSBvYmpba2V5XTsgfSB9IG5ld09iai5kZWZhdWx0ID0gb2JqOyByZXR1cm4gbmV3T2JqOyB9IH1cblxuZXhwb3J0cy5kZWZhdWx0ID0ge1xuICBzcGFjZTogc3BhY2UsXG4gIGVudHJ5OiBlbnRyeSxcbiAgYXNzZXQ6IGFzc2V0LFxuICBjb250ZW50VHlwZTogY29udGVudFR5cGUsXG4gIGxvY2FsZTogbG9jYWxlLFxuICB3ZWJob29rOiB3ZWJob29rLFxuICBzcGFjZU1lbWJlcnNoaXA6IHNwYWNlTWVtYmVyc2hpcCxcbiAgcm9sZTogcm9sZSxcbiAgYXBpS2V5OiBhcGlLZXlcbn07IiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy53cmFwTG9jYWxlID0gd3JhcExvY2FsZTtcbmV4cG9ydHMud3JhcExvY2FsZUNvbGxlY3Rpb24gPSB3cmFwTG9jYWxlQ29sbGVjdGlvbjtcblxudmFyIF9jbG9uZURlZXAgPSByZXF1aXJlKCdsb2Rhc2gvY2xvbmVEZWVwJyk7XG5cbnZhciBfY2xvbmVEZWVwMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2Nsb25lRGVlcCk7XG5cbnZhciBfZnJlZXplU3lzID0gcmVxdWlyZSgnY29udGVudGZ1bC1zZGstY29yZS9mcmVlemUtc3lzJyk7XG5cbnZhciBfZnJlZXplU3lzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2ZyZWV6ZVN5cyk7XG5cbnZhciBfZW5oYW5jZVdpdGhNZXRob2RzID0gcmVxdWlyZSgnLi4vZW5oYW5jZS13aXRoLW1ldGhvZHMnKTtcblxudmFyIF9lbmhhbmNlV2l0aE1ldGhvZHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZW5oYW5jZVdpdGhNZXRob2RzKTtcblxudmFyIF90b1BsYWluT2JqZWN0ID0gcmVxdWlyZSgnY29udGVudGZ1bC1zZGstY29yZS9taXhpbnMvdG8tcGxhaW4tb2JqZWN0Jyk7XG5cbnZhciBfdG9QbGFpbk9iamVjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF90b1BsYWluT2JqZWN0KTtcblxudmFyIF9pbnN0YW5jZUFjdGlvbnMgPSByZXF1aXJlKCcuLi9pbnN0YW5jZS1hY3Rpb25zJyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbi8qKlxuICogQG1lbWJlcm9mIExvY2FsZVxuICogQHR5cGVkZWYgTG9jYWxlXG4gKiBAcHJvcCB7TWV0YS5TeXN9IHN5cyAtIFN5c3RlbSBtZXRhZGF0YVxuICogQHByb3Age3N0cmluZ30gbmFtZVxuICogQHByb3Age3N0cmluZ30gY29kZSAtIExvY2FsZSBjb2RlIChleGFtcGxlOiBlbi11cylcbiAqIEBwcm9wIHtib29sZWFufSBjb250ZW50RGVsaXZlcnlBcGkgLSBJZiB0aGUgY29udGVudCB1bmRlciB0aGlzIGxvY2FsZSBzaG91bGQgYmUgYXZhaWxhYmxlIG9uIHRoZSBDREEgKGZvciBwdWJsaWMgcmVhZGluZylcbiAqIEBwcm9wIHtib29sZWFufSBjb250ZW50TWFuYWdlbWVudEFwaSAtIElmIHRoZSBjb250ZW50IHVuZGVyIHRoaXMgbG9jYWxlIHNob3VsZCBiZSBhdmFpbGFibGUgb24gdGhlIENNQSAoZm9yIGVkaXRpbmcpXG4gKiBAcHJvcCB7Ym9vbGVhbn0gZGVmYXVsdCAtIElmIHRoaXMgaXMgdGhlIGRlZmF1bHQgbG9jYWxlXG4gKiBAcHJvcCB7Ym9vbGVhbn0gb3B0aW9uYWwgLSBJZiB0aGUgbG9jYWxlIG5lZWRzIHRvIGJlIGZpbGxlZCBpbiBvbiBlbnRyaWVzIG9yIG5vdFxuICogQHByb3Age2Z1bmN0aW9uKCk6IE9iamVjdH0gdG9QbGFpbk9iamVjdCgpIC0gUmV0dXJucyB0aGlzIExvY2FsZSBhcyBhIHBsYWluIEpTIG9iamVjdFxuICovXG5cbmZ1bmN0aW9uIGNyZWF0ZUxvY2FsZUFwaShodHRwKSB7XG4gIHJldHVybiB7XG4gICAgLyoqXG4gICAgICogU2VuZHMgYW4gdXBkYXRlIHRvIHRoZSBzZXJ2ZXIgd2l0aCBhbnkgY2hhbmdlcyBtYWRlIHRvIHRoZSBvYmplY3QncyBwcm9wZXJ0aWVzXG4gICAgICogQG1lbWJlcm9mIExvY2FsZVxuICAgICAqIEBmdW5jIHVwZGF0ZVxuICAgICAqIEByZXR1cm4ge1Byb21pc2U8TG9jYWxlPn0gT2JqZWN0IHJldHVybmVkIGZyb20gdGhlIHNlcnZlciB3aXRoIHVwZGF0ZWQgY2hhbmdlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGxvY2FsZS5uYW1lID0gJ0VuZ2xpc2gnXG4gICAgICogbG9jYWxlLnVwZGF0ZSgpXG4gICAgICogLnRoZW4obG9jYWxlID0+IGNvbnNvbGUubG9nKGxvY2FsZS5uYW1lKSlcbiAgICAgKi9cbiAgICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZSgpIHtcbiAgICAgIC8vIGRlbGV0ZSBzb21lIHByb3BlcnRpZXMgd2hpY2ggYXJlIHJldHVybmVkIGJ5IHRoZSBzZXJ2ZXIgYnV0IHNob3VsZG4ndFxuICAgICAgLy8gYmUgc2VudCBiYWNrLlxuICAgICAgdmFyIGxvY2FsZSA9IHRoaXM7XG4gICAgICBkZWxldGUgbG9jYWxlLmRlZmF1bHQ7XG4gICAgICBkZWxldGUgbG9jYWxlLmZhbGxiYWNrX2NvZGU7XG4gICAgICByZXR1cm4gKDAsIF9pbnN0YW5jZUFjdGlvbnMuY3JlYXRlVXBkYXRlRW50aXR5KSh7XG4gICAgICAgIGh0dHA6IGh0dHAsXG4gICAgICAgIGVudGl0eVBhdGg6ICdsb2NhbGVzJyxcbiAgICAgICAgd3JhcHBlck1ldGhvZDogd3JhcExvY2FsZVxuICAgICAgfSkuY2FsbChsb2NhbGUpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBEZWxldGVzIHRoaXMgb2JqZWN0IG9uIHRoZSBzZXJ2ZXIuXG4gICAgICogQG1lbWJlcm9mIExvY2FsZVxuICAgICAqIEBmdW5jIGRlbGV0ZVxuICAgICAqIEByZXR1cm4ge1Byb21pc2V9IFByb21pc2UgZm9yIHRoZSBkZWxldGlvbi4gSXQgY29udGFpbnMgbm8gZGF0YSwgYnV0IHRoZSBQcm9taXNlIGVycm9yIGNhc2Ugc2hvdWxkIGJlIGhhbmRsZWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBsb2NhbGUuZGVsZXRlKClcbiAgICAgKiAuY2F0Y2goZXJyID0+IGNvbnNvbGUubG9nKGVycikpXG4gICAgICovXG4gICAgZGVsZXRlOiAoMCwgX2luc3RhbmNlQWN0aW9ucy5jcmVhdGVEZWxldGVFbnRpdHkpKHtcbiAgICAgIGh0dHA6IGh0dHAsXG4gICAgICBlbnRpdHlQYXRoOiAnbG9jYWxlcydcbiAgICB9KVxuICB9O1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gaHR0cCAtIEhUVFAgY2xpZW50IGluc3RhbmNlXG4gKiBAcGFyYW0ge09iamVjdH0gZGF0YSAtIFJhdyBsb2NhbGUgZGF0YVxuICogQHJldHVybiB7TG9jYWxlfSBXcmFwcGVkIGxvY2FsZSBkYXRhXG4gKi9cbmZ1bmN0aW9uIHdyYXBMb2NhbGUoaHR0cCwgZGF0YSkge1xuICB2YXIgbG9jYWxlID0gKDAsIF90b1BsYWluT2JqZWN0Mi5kZWZhdWx0KSgoMCwgX2Nsb25lRGVlcDIuZGVmYXVsdCkoZGF0YSkpO1xuICBkZWxldGUgbG9jYWxlLmludGVybmFsX2NvZGU7XG4gICgwLCBfZW5oYW5jZVdpdGhNZXRob2RzMi5kZWZhdWx0KShsb2NhbGUsIGNyZWF0ZUxvY2FsZUFwaShodHRwKSk7XG4gIHJldHVybiAoMCwgX2ZyZWV6ZVN5czIuZGVmYXVsdCkobG9jYWxlKTtcbn1cblxuLyoqXG4gKiBAbWVtYmVyb2YgTG9jYWxlXG4gKiBAdHlwZWRlZiBMb2NhbGVDb2xsZWN0aW9uXG4gKiBAcHJvcCB7bnVtYmVyfSB0b3RhbFxuICogQHByb3Age251bWJlcn0gc2tpcFxuICogQHByb3Age251bWJlcn0gbGltaXRcbiAqIEBwcm9wIHtBcnJheTxMb2NhbGUuTG9jYWxlPn0gaXRlbXNcbiAqIEBwcm9wIHtmdW5jdGlvbigpOiBPYmplY3R9IHRvUGxhaW5PYmplY3QoKSAtIFJldHVybnMgdGhpcyBMb2NhbGUgY29sbGVjdGlvbiBhcyBhIHBsYWluIEpTIG9iamVjdFxuICovXG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBodHRwIC0gSFRUUCBjbGllbnQgaW5zdGFuY2VcbiAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIC0gUmF3IGxvY2FsZSBjb2xsZWN0aW9uIGRhdGFcbiAqIEByZXR1cm4ge0xvY2FsZUNvbGxlY3Rpb259IFdyYXBwZWQgbG9jYWxlIGNvbGxlY3Rpb24gZGF0YVxuICovXG5mdW5jdGlvbiB3cmFwTG9jYWxlQ29sbGVjdGlvbihodHRwLCBkYXRhKSB7XG4gIHZhciBsb2NhbGVzID0gKDAsIF90b1BsYWluT2JqZWN0Mi5kZWZhdWx0KSgoMCwgX2Nsb25lRGVlcDIuZGVmYXVsdCkoZGF0YSkpO1xuICBsb2NhbGVzLml0ZW1zID0gbG9jYWxlcy5pdGVtcy5tYXAoZnVuY3Rpb24gKGVudGl0eSkge1xuICAgIHJldHVybiB3cmFwTG9jYWxlKGh0dHAsIGVudGl0eSk7XG4gIH0pO1xuICByZXR1cm4gKDAsIF9mcmVlemVTeXMyLmRlZmF1bHQpKGxvY2FsZXMpO1xufSIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMud3JhcFJvbGUgPSB3cmFwUm9sZTtcbmV4cG9ydHMud3JhcFJvbGVDb2xsZWN0aW9uID0gd3JhcFJvbGVDb2xsZWN0aW9uO1xuXG52YXIgX2Nsb25lRGVlcCA9IHJlcXVpcmUoJ2xvZGFzaC9jbG9uZURlZXAnKTtcblxudmFyIF9jbG9uZURlZXAyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xvbmVEZWVwKTtcblxudmFyIF9mcmVlemVTeXMgPSByZXF1aXJlKCdjb250ZW50ZnVsLXNkay1jb3JlL2ZyZWV6ZS1zeXMnKTtcblxudmFyIF9mcmVlemVTeXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZnJlZXplU3lzKTtcblxudmFyIF9lbmhhbmNlV2l0aE1ldGhvZHMgPSByZXF1aXJlKCcuLi9lbmhhbmNlLXdpdGgtbWV0aG9kcycpO1xuXG52YXIgX2VuaGFuY2VXaXRoTWV0aG9kczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9lbmhhbmNlV2l0aE1ldGhvZHMpO1xuXG52YXIgX3RvUGxhaW5PYmplY3QgPSByZXF1aXJlKCdjb250ZW50ZnVsLXNkay1jb3JlL21peGlucy90by1wbGFpbi1vYmplY3QnKTtcblxudmFyIF90b1BsYWluT2JqZWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3RvUGxhaW5PYmplY3QpO1xuXG52YXIgX2luc3RhbmNlQWN0aW9ucyA9IHJlcXVpcmUoJy4uL2luc3RhbmNlLWFjdGlvbnMnKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuLyoqXG4gKiBTZWUgaHR0cHM6Ly93d3cuY29udGVudGZ1bC5jb20vZGV2ZWxvcGVycy9kb2NzL3JlZmVyZW5jZXMvY29udGVudC1tYW5hZ2VtZW50LWFwaS8jL3JlZmVyZW5jZS9yb2xlcy9jcmVhdGUtYS1yb2xlXG4gKiBAbWVtYmVyb2YgUm9sZVxuICogQHR5cGVkZWYgUm9sZVxuICogQHByb3Age01ldGEuU3lzfSBzeXMgLSBTeXN0ZW0gbWV0YWRhdGFcbiAqIEBwcm9wIHtzdHJpbmd9IG5hbWVcbiAqIEBwcm9wIHtvYmplY3R9IHBlcm1pc3Npb25zIC0gUGVybWlzc2lvbnMgZm9yIGFwcGxpY2F0aW9uIHNlY3Rpb25zXG4gKiBAcHJvcCB7b2JqZWN0fSBwb2xpY2llc1xuICogQHByb3Age2Z1bmN0aW9uKCk6IE9iamVjdH0gdG9QbGFpbk9iamVjdCgpIC0gUmV0dXJucyB0aGlzIFJvbGUgYXMgYSBwbGFpbiBKUyBvYmplY3RcbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVSb2xlQXBpKGh0dHApIHtcbiAgcmV0dXJuIHtcblxuICAgIC8qKlxuICAgICAqIFNlbmRzIGFuIHVwZGF0ZSB0byB0aGUgc2VydmVyIHdpdGggYW55IGNoYW5nZXMgbWFkZSB0byB0aGUgb2JqZWN0J3MgcHJvcGVydGllc1xuICAgICAqIEBtZW1iZXJvZiBSb2xlXG4gICAgICogQGZ1bmMgdXBkYXRlXG4gICAgICogQHJldHVybiB7UHJvbWlzZTxSb2xlPn0gT2JqZWN0IHJldHVybmVkIGZyb20gdGhlIHNlcnZlciB3aXRoIHVwZGF0ZWQgY2hhbmdlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHJvbGUubmFtZSA9ICdOZXcgbmFtZSdcbiAgICAgKiByb2xlLnVwZGF0ZSgpXG4gICAgICogLnRoZW4ocm9sZSA9PiBjb25zb2xlLmxvZyhyb2xlLm5hbWUpKVxuICAgICAqL1xuICAgIHVwZGF0ZTogKDAsIF9pbnN0YW5jZUFjdGlvbnMuY3JlYXRlVXBkYXRlRW50aXR5KSh7XG4gICAgICBodHRwOiBodHRwLFxuICAgICAgZW50aXR5UGF0aDogJ3JvbGVzJyxcbiAgICAgIHdyYXBwZXJNZXRob2Q6IHdyYXBSb2xlXG4gICAgfSksXG5cbiAgICAvKipcbiAgICAgKiBEZWxldGVzIHRoaXMgb2JqZWN0IG9uIHRoZSBzZXJ2ZXIuXG4gICAgICogQG1lbWJlcm9mIFJvbGVcbiAgICAgKiBAZnVuYyBkZWxldGVcbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlfSBQcm9taXNlIGZvciB0aGUgZGVsZXRpb24uIEl0IGNvbnRhaW5zIG5vIGRhdGEsIGJ1dCB0aGUgUHJvbWlzZSBlcnJvciBjYXNlIHNob3VsZCBiZSBoYW5kbGVkLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogcm9sZS5kZWxldGUoKVxuICAgICAqIC5jYXRjaChlcnIgPT4gY29uc29sZS5sb2coZXJyKSlcbiAgICAgKi9cbiAgICBkZWxldGU6ICgwLCBfaW5zdGFuY2VBY3Rpb25zLmNyZWF0ZURlbGV0ZUVudGl0eSkoe1xuICAgICAgaHR0cDogaHR0cCxcbiAgICAgIGVudGl0eVBhdGg6ICdyb2xlcydcbiAgICB9KVxuICB9O1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gaHR0cCAtIEhUVFAgY2xpZW50IGluc3RhbmNlXG4gKiBAcGFyYW0ge09iamVjdH0gZGF0YSAtIFJhdyByb2xlIGRhdGFcbiAqIEByZXR1cm4ge1JvbGV9IFdyYXBwZWQgcm9sZSBkYXRhXG4gKi9cbi8qKlxuICogUm9sZSBpbnN0YW5jZXNcbiAqIEBuYW1lc3BhY2UgUm9sZVxuICovXG5mdW5jdGlvbiB3cmFwUm9sZShodHRwLCBkYXRhKSB7XG4gIHZhciByb2xlID0gKDAsIF90b1BsYWluT2JqZWN0Mi5kZWZhdWx0KSgoMCwgX2Nsb25lRGVlcDIuZGVmYXVsdCkoZGF0YSkpO1xuICAoMCwgX2VuaGFuY2VXaXRoTWV0aG9kczIuZGVmYXVsdCkocm9sZSwgY3JlYXRlUm9sZUFwaShodHRwKSk7XG4gIHJldHVybiAoMCwgX2ZyZWV6ZVN5czIuZGVmYXVsdCkocm9sZSk7XG59XG5cbi8qKlxuICogQG1lbWJlcm9mIFJvbGVcbiAqIEB0eXBlZGVmIFJvbGVDb2xsZWN0aW9uXG4gKiBAcHJvcCB7bnVtYmVyfSB0b3RhbFxuICogQHByb3Age251bWJlcn0gc2tpcFxuICogQHByb3Age251bWJlcn0gbGltaXRcbiAqIEBwcm9wIHtBcnJheTxSb2xlLlJvbGU+fSBpdGVtc1xuICogQHByb3Age2Z1bmN0aW9uKCk6IE9iamVjdH0gdG9QbGFpbk9iamVjdCgpIC0gUmV0dXJucyB0aGlzIFJvbGUgY29sbGVjdGlvbiBhcyBhIHBsYWluIEpTIG9iamVjdFxuICovXG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBodHRwIC0gSFRUUCBjbGllbnQgaW5zdGFuY2VcbiAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIC0gUmF3IHJvbGUgY29sbGVjdGlvbiBkYXRhXG4gKiBAcmV0dXJuIHtSb2xlQ29sbGVjdGlvbn0gV3JhcHBlZCByb2xlIGNvbGxlY3Rpb24gZGF0YVxuICovXG5mdW5jdGlvbiB3cmFwUm9sZUNvbGxlY3Rpb24oaHR0cCwgZGF0YSkge1xuICB2YXIgcm9sZXMgPSAoMCwgX3RvUGxhaW5PYmplY3QyLmRlZmF1bHQpKCgwLCBfY2xvbmVEZWVwMi5kZWZhdWx0KShkYXRhKSk7XG4gIHJvbGVzLml0ZW1zID0gcm9sZXMuaXRlbXMubWFwKGZ1bmN0aW9uIChlbnRpdHkpIHtcbiAgICByZXR1cm4gd3JhcFJvbGUoaHR0cCwgZW50aXR5KTtcbiAgfSk7XG4gIHJldHVybiAoMCwgX2ZyZWV6ZVN5czIuZGVmYXVsdCkocm9sZXMpO1xufSIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMud3JhcFNwYWNlTWVtYmVyc2hpcCA9IHdyYXBTcGFjZU1lbWJlcnNoaXA7XG5leHBvcnRzLndyYXBTcGFjZU1lbWJlcnNoaXBDb2xsZWN0aW9uID0gd3JhcFNwYWNlTWVtYmVyc2hpcENvbGxlY3Rpb247XG5cbnZhciBfY2xvbmVEZWVwID0gcmVxdWlyZSgnbG9kYXNoL2Nsb25lRGVlcCcpO1xuXG52YXIgX2Nsb25lRGVlcDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbG9uZURlZXApO1xuXG52YXIgX2ZyZWV6ZVN5cyA9IHJlcXVpcmUoJ2NvbnRlbnRmdWwtc2RrLWNvcmUvZnJlZXplLXN5cycpO1xuXG52YXIgX2ZyZWV6ZVN5czIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9mcmVlemVTeXMpO1xuXG52YXIgX2VuaGFuY2VXaXRoTWV0aG9kcyA9IHJlcXVpcmUoJy4uL2VuaGFuY2Utd2l0aC1tZXRob2RzJyk7XG5cbnZhciBfZW5oYW5jZVdpdGhNZXRob2RzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2VuaGFuY2VXaXRoTWV0aG9kcyk7XG5cbnZhciBfdG9QbGFpbk9iamVjdCA9IHJlcXVpcmUoJ2NvbnRlbnRmdWwtc2RrLWNvcmUvbWl4aW5zL3RvLXBsYWluLW9iamVjdCcpO1xuXG52YXIgX3RvUGxhaW5PYmplY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdG9QbGFpbk9iamVjdCk7XG5cbnZhciBfaW5zdGFuY2VBY3Rpb25zID0gcmVxdWlyZSgnLi4vaW5zdGFuY2UtYWN0aW9ucycpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG4vKipcbiAqIEBtZW1iZXJvZiBTcGFjZU1lbWJlcnNoaXBcbiAqIEB0eXBlZGVmIFNwYWNlTWVtYmVyc2hpcFxuICogQHByb3Age01ldGEuU3lzfSBzeXMgLSBTeXN0ZW0gbWV0YWRhdGFcbiAqIEBwcm9wIHtzdHJpbmd9IG5hbWVcbiAqIEBwcm9wIHtib29sZWFufSBhZG1pbiAtIFVzZXIgaXMgYW4gYWRtaW5cbiAqIEBwcm9wIHthcnJheX0gcm9sZXMgLSBBcnJheSBvZiBSb2xlIExpbmtzXG4gKiBAcHJvcCB7ZnVuY3Rpb24oKTogT2JqZWN0fSB0b1BsYWluT2JqZWN0KCkgLSBSZXR1cm5zIHRoaXMgU3BhY2UgTWVtYmVyc2hpcCBhcyBhIHBsYWluIEpTIG9iamVjdFxuICovXG5cbmZ1bmN0aW9uIGNyZWF0ZVNwYWNlTWVtYmVyc2hpcEFwaShodHRwKSB7XG4gIHJldHVybiB7XG5cbiAgICAvKipcbiAgICAgKiBTZW5kcyBhbiB1cGRhdGUgdG8gdGhlIHNlcnZlciB3aXRoIGFueSBjaGFuZ2VzIG1hZGUgdG8gdGhlIG9iamVjdCdzIHByb3BlcnRpZXNcbiAgICAgKiBAbWVtYmVyb2YgU3BhY2VNZW1iZXJzaGlwXG4gICAgICogQGZ1bmMgdXBkYXRlXG4gICAgICogQHJldHVybiB7UHJvbWlzZTxTcGFjZU1lbWJlcnNoaXA+fSBPYmplY3QgcmV0dXJuZWQgZnJvbSB0aGUgc2VydmVyIHdpdGggdXBkYXRlZCBjaGFuZ2VzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogc3BhY2VNZW1iZXJzaGlwLm5hbWUgPSAnTmV3IG5hbWUnXG4gICAgICogc3BhY2VNZW1iZXJzaGlwLnVwZGF0ZSgpXG4gICAgICogLnRoZW4oc3BhY2VNZW1iZXJzaGlwID0+IGNvbnNvbGUubG9nKHNwYWNlTWVtYmVyc2hpcC5uYW1lKSlcbiAgICAgKi9cbiAgICB1cGRhdGU6ICgwLCBfaW5zdGFuY2VBY3Rpb25zLmNyZWF0ZVVwZGF0ZUVudGl0eSkoe1xuICAgICAgaHR0cDogaHR0cCxcbiAgICAgIGVudGl0eVBhdGg6ICdzcGFjZV9tZW1iZXJzaGlwcycsXG4gICAgICB3cmFwcGVyTWV0aG9kOiB3cmFwU3BhY2VNZW1iZXJzaGlwXG4gICAgfSksXG5cbiAgICAvKipcbiAgICAgKiBEZWxldGVzIHRoaXMgb2JqZWN0IG9uIHRoZSBzZXJ2ZXIuXG4gICAgICogQG1lbWJlcm9mIFNwYWNlTWVtYmVyc2hpcFxuICAgICAqIEBmdW5jIGRlbGV0ZVxuICAgICAqIEByZXR1cm4ge1Byb21pc2V9IFByb21pc2UgZm9yIHRoZSBkZWxldGlvbi4gSXQgY29udGFpbnMgbm8gZGF0YSwgYnV0IHRoZSBQcm9taXNlIGVycm9yIGNhc2Ugc2hvdWxkIGJlIGhhbmRsZWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBzcGFjZU1lbWJlcnNoaXAuZGVsZXRlKClcbiAgICAgKiAuY2F0Y2goZXJyID0+IGNvbnNvbGUubG9nKGVycikpXG4gICAgICovXG4gICAgZGVsZXRlOiAoMCwgX2luc3RhbmNlQWN0aW9ucy5jcmVhdGVEZWxldGVFbnRpdHkpKHtcbiAgICAgIGh0dHA6IGh0dHAsXG4gICAgICBlbnRpdHlQYXRoOiAnc3BhY2VfbWVtYmVyc2hpcHMnXG4gICAgfSlcbiAgfTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IGh0dHAgLSBIVFRQIGNsaWVudCBpbnN0YW5jZVxuICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSBSYXcgc3BhY2UgbWVtYmVyc2hpcCBkYXRhXG4gKiBAcmV0dXJuIHtTcGFjZU1lbWJlcnNoaXB9IFdyYXBwZWQgc3BhY2UgbWVtYmVyc2hpcCBkYXRhXG4gKi9cbi8qKlxuICogU3BhY2UgTWVtYmVyc2hpcCBpbnN0YW5jZXNcbiAqIEBuYW1lc3BhY2UgU3BhY2VNZW1iZXJzaGlwXG4gKi9cbmZ1bmN0aW9uIHdyYXBTcGFjZU1lbWJlcnNoaXAoaHR0cCwgZGF0YSkge1xuICB2YXIgc3BhY2VNZW1iZXJzaGlwID0gKDAsIF90b1BsYWluT2JqZWN0Mi5kZWZhdWx0KSgoMCwgX2Nsb25lRGVlcDIuZGVmYXVsdCkoZGF0YSkpO1xuICAoMCwgX2VuaGFuY2VXaXRoTWV0aG9kczIuZGVmYXVsdCkoc3BhY2VNZW1iZXJzaGlwLCBjcmVhdGVTcGFjZU1lbWJlcnNoaXBBcGkoaHR0cCkpO1xuICByZXR1cm4gKDAsIF9mcmVlemVTeXMyLmRlZmF1bHQpKHNwYWNlTWVtYmVyc2hpcCk7XG59XG5cbi8qKlxuICogQG1lbWJlcm9mIFNwYWNlTWVtYmVyc2hpcFxuICogQHR5cGVkZWYgU3BhY2VNZW1iZXJzaGlwQ29sbGVjdGlvblxuICogQHByb3Age251bWJlcn0gdG90YWxcbiAqIEBwcm9wIHtudW1iZXJ9IHNraXBcbiAqIEBwcm9wIHtudW1iZXJ9IGxpbWl0XG4gKiBAcHJvcCB7QXJyYXk8U3BhY2VNZW1iZXJzaGlwLlNwYWNlTWVtYmVyc2hpcD59IGl0ZW1zXG4gKiBAcHJvcCB7ZnVuY3Rpb24oKTogT2JqZWN0fSB0b1BsYWluT2JqZWN0KCkgLSBSZXR1cm5zIHRoaXMgU3BhY2UgTWVtYmVyc2hpcCBjb2xsZWN0aW9uIGFzIGEgcGxhaW4gSlMgb2JqZWN0XG4gKi9cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IGh0dHAgLSBIVFRQIGNsaWVudCBpbnN0YW5jZVxuICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSBSYXcgc3BhY2UgbWVtYmVyc2hpcCBjb2xsZWN0aW9uIGRhdGFcbiAqIEByZXR1cm4ge1NwYWNlTWVtYmVyc2hpcENvbGxlY3Rpb259IFdyYXBwZWQgc3BhY2UgbWVtYmVyc2hpcCBjb2xsZWN0aW9uIGRhdGFcbiAqL1xuZnVuY3Rpb24gd3JhcFNwYWNlTWVtYmVyc2hpcENvbGxlY3Rpb24oaHR0cCwgZGF0YSkge1xuICB2YXIgc3BhY2VNZW1iZXJzaGlwcyA9ICgwLCBfdG9QbGFpbk9iamVjdDIuZGVmYXVsdCkoKDAsIF9jbG9uZURlZXAyLmRlZmF1bHQpKGRhdGEpKTtcbiAgc3BhY2VNZW1iZXJzaGlwcy5pdGVtcyA9IHNwYWNlTWVtYmVyc2hpcHMuaXRlbXMubWFwKGZ1bmN0aW9uIChlbnRpdHkpIHtcbiAgICByZXR1cm4gd3JhcFNwYWNlTWVtYmVyc2hpcChodHRwLCBlbnRpdHkpO1xuICB9KTtcbiAgcmV0dXJuICgwLCBfZnJlZXplU3lzMi5kZWZhdWx0KShzcGFjZU1lbWJlcnNoaXBzKTtcbn0iLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLndyYXBTcGFjZSA9IHdyYXBTcGFjZTtcbmV4cG9ydHMud3JhcFNwYWNlQ29sbGVjdGlvbiA9IHdyYXBTcGFjZUNvbGxlY3Rpb247XG5cbnZhciBfY2xvbmVEZWVwID0gcmVxdWlyZSgnbG9kYXNoL2Nsb25lRGVlcCcpO1xuXG52YXIgX2Nsb25lRGVlcDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbG9uZURlZXApO1xuXG52YXIgX2ZyZWV6ZVN5cyA9IHJlcXVpcmUoJ2NvbnRlbnRmdWwtc2RrLWNvcmUvZnJlZXplLXN5cycpO1xuXG52YXIgX2ZyZWV6ZVN5czIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9mcmVlemVTeXMpO1xuXG52YXIgX3RvUGxhaW5PYmplY3QgPSByZXF1aXJlKCdjb250ZW50ZnVsLXNkay1jb3JlL21peGlucy90by1wbGFpbi1vYmplY3QnKTtcblxudmFyIF90b1BsYWluT2JqZWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3RvUGxhaW5PYmplY3QpO1xuXG52YXIgX2VuaGFuY2VXaXRoTWV0aG9kcyA9IHJlcXVpcmUoJy4uL2VuaGFuY2Utd2l0aC1tZXRob2RzJyk7XG5cbnZhciBfZW5oYW5jZVdpdGhNZXRob2RzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2VuaGFuY2VXaXRoTWV0aG9kcyk7XG5cbnZhciBfd3JhcEh0dHBDbGllbnQgPSByZXF1aXJlKCcuLi93cmFwLWh0dHAtY2xpZW50Jyk7XG5cbnZhciBfd3JhcEh0dHBDbGllbnQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfd3JhcEh0dHBDbGllbnQpO1xuXG52YXIgX2NyZWF0ZVNwYWNlQXBpID0gcmVxdWlyZSgnLi4vY3JlYXRlLXNwYWNlLWFwaScpO1xuXG52YXIgX2NyZWF0ZVNwYWNlQXBpMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NyZWF0ZVNwYWNlQXBpKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuLyoqXG4gKiBAbWVtYmVyb2YgU3BhY2VcbiAqIEB0eXBlZGVmIFNwYWNlXG4gKiBAcHJvcCB7T2JqZWN0fSBzeXMgLSBTeXN0ZW0gbWV0YWRhdGFcbiAqIEBwcm9wIHtzdHJpbmd9IHN5cy5pZCAtIFNwYWNlIGlkXG4gKiBAcHJvcCB7c3RyaW5nfSBzeXMudHlwZSAtIEVudGl0eSB0eXBlXG4gKiBAcHJvcCB7c3RyaW5nfSBuYW1lIC0gU3BhY2UgbmFtZVxuICogQHByb3Age0FycmF5PHN0cmluZz59IGxvY2FsZXMgLSBBcnJheSB3aXRoIGxvY2FsZSBjb2Rlc1xuICogQHByb3Age2Z1bmN0aW9uKCk6IE9iamVjdH0gdG9QbGFpbk9iamVjdCgpIC0gUmV0dXJucyB0aGlzIFNwYWNlIGFzIGEgcGxhaW4gSlMgb2JqZWN0XG4gKi9cblxuLyoqXG4gKiBAbWVtYmVyb2YgU3BhY2VcbiAqIEB0eXBlZGVmIFNwYWNlQ29sbGVjdGlvblxuICogQHByb3Age251bWJlcn0gdG90YWxcbiAqIEBwcm9wIHtudW1iZXJ9IHNraXBcbiAqIEBwcm9wIHtudW1iZXJ9IGxpbWl0XG4gKiBAcHJvcCB7QXJyYXk8U3BhY2UuU3BhY2U+fSBpdGVtc1xuICogQHByb3Age2Z1bmN0aW9uKCk6IE9iamVjdH0gdG9QbGFpbk9iamVjdCgpIC0gUmV0dXJucyB0aGlzIFNwYWNlIGNvbGxlY3Rpb24gYXMgYSBwbGFpbiBKUyBvYmplY3RcbiAqL1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGNyZWF0ZXMgdGhlIEFQSSBmb3IgdGhlIGdpdmVuIHNwYWNlIHdpdGggYWxsIHRoZSBtZXRob2RzIGZvclxuICogcmVhZGluZyBhbmQgY3JlYXRpbmcgb3RoZXIgZW50aXRpZXMuIEl0IGFsc28gcGFzc2VzIGRvd24gYSBjbG9uZSBvZiB0aGVcbiAqIGh0dHAgY2xpZW50IHdpdGggYSBzcGFjZSBpZCwgc28gdGhlIGJhc2UgcGF0aCBmb3IgcmVxdWVzdHMgbm93IGhhcyB0aGVcbiAqIHNwYWNlIGlkIGFscmVhZHkgc2V0LlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSAge09iamVjdH0gaHR0cCAtIEhUVFAgY2xpZW50IGluc3RhbmNlXG4gKiBAcGFyYW0gIHtPYmplY3R9IGRhdGEgLSBBUEkgcmVzcG9uc2UgZm9yIGEgU3BhY2VcbiAqIEByZXR1cm4ge1NwYWNlfVxuICovXG5mdW5jdGlvbiB3cmFwU3BhY2UoaHR0cCwgZGF0YSkge1xuICB2YXIgc3BhY2UgPSAoMCwgX3RvUGxhaW5PYmplY3QyLmRlZmF1bHQpKCgwLCBfY2xvbmVEZWVwMi5kZWZhdWx0KShkYXRhKSk7XG4gIHZhciBfaHR0cCRodHRwQ2xpZW50UGFyYW0gPSBodHRwLmh0dHBDbGllbnRQYXJhbXM7XG4gIHZhciByYXRlTGltaXQgPSBfaHR0cCRodHRwQ2xpZW50UGFyYW0ucmF0ZUxpbWl0O1xuICB2YXIgcmF0ZUxpbWl0UGVyaW9kID0gX2h0dHAkaHR0cENsaWVudFBhcmFtLnJhdGVMaW1pdFBlcmlvZDtcbiAgdmFyIG1heFJldHJpZXMgPSBfaHR0cCRodHRwQ2xpZW50UGFyYW0ubWF4UmV0cmllcztcbiAgdmFyIHJldHJ5T25Ub29NYW55UmVxdWVzdHMgPSBfaHR0cCRodHRwQ2xpZW50UGFyYW0ucmV0cnlPblRvb01hbnlSZXF1ZXN0cztcblxuICB2YXIgaHR0cENsaWVudFBhcmFtcyA9IHtcbiAgICBjb25jdXJyZW5jeTogcmF0ZUxpbWl0LFxuICAgIGRlbGF5OiByYXRlTGltaXRQZXJpb2QsXG4gICAgbWF4UmV0cmllczogbWF4UmV0cmllcyxcbiAgICByZXRyeU9uVG9vTWFueVJlcXVlc3RzOiByZXRyeU9uVG9vTWFueVJlcXVlc3RzXG4gIH07XG4gIHZhciBzcGFjZVNjb3BlZEh0dHBDbGllbnQgPSAoMCwgX3dyYXBIdHRwQ2xpZW50Mi5kZWZhdWx0KShodHRwLmNsb25lV2l0aE5ld1BhcmFtcyh7XG4gICAgc3BhY2U6IHNwYWNlLnN5cy5pZFxuICB9KSwgaHR0cENsaWVudFBhcmFtcyk7XG4gIHZhciBzcGFjZUFwaSA9ICgwLCBfY3JlYXRlU3BhY2VBcGkyLmRlZmF1bHQpKHtcbiAgICBodHRwOiBzcGFjZVNjb3BlZEh0dHBDbGllbnRcbiAgfSk7XG4gIHZhciBlbmhhbmNlZFNwYWNlID0gKDAsIF9lbmhhbmNlV2l0aE1ldGhvZHMyLmRlZmF1bHQpKHNwYWNlLCBzcGFjZUFwaSk7XG4gIHJldHVybiAoMCwgX2ZyZWV6ZVN5czIuZGVmYXVsdCkoZW5oYW5jZWRTcGFjZSk7XG59XG5cbi8qKlxuICogVGhpcyBtZXRob2Qgd3JhcHMgZWFjaCBzcGFjZSBpbiBhIGNvbGxlY3Rpb24gd2l0aCB0aGUgc3BhY2UgQVBJLiBTZWUgd3JhcFNwYWNlXG4gKiBhYm92ZSBmb3IgbW9yZSBkZXRhaWxzLlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSAge09iamVjdH0gaHR0cCAtIEhUVFAgY2xpZW50IGluc3RhbmNlXG4gKiBAcGFyYW0gIHtPYmplY3R9IGRhdGEgLSBBUEkgcmVzcG9uc2UgZm9yIGEgU3BhY2UgY29sbGVjdGlvblxuICogQHJldHVybiB7U3BhY2VDb2xsZWN0aW9ufVxuICovXG5mdW5jdGlvbiB3cmFwU3BhY2VDb2xsZWN0aW9uKGh0dHAsIGRhdGEpIHtcbiAgdmFyIHNwYWNlcyA9ICgwLCBfdG9QbGFpbk9iamVjdDIuZGVmYXVsdCkoKDAsIF9jbG9uZURlZXAyLmRlZmF1bHQpKGRhdGEpKTtcbiAgc3BhY2VzLml0ZW1zID0gc3BhY2VzLml0ZW1zLm1hcChmdW5jdGlvbiAoZW50aXR5KSB7XG4gICAgcmV0dXJuIHdyYXBTcGFjZShodHRwLCBlbnRpdHkpO1xuICB9KTtcbiAgcmV0dXJuICgwLCBfZnJlZXplU3lzMi5kZWZhdWx0KShzcGFjZXMpO1xufSIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMud3JhcFdlYmhvb2sgPSB3cmFwV2ViaG9vaztcbmV4cG9ydHMud3JhcFdlYmhvb2tDb2xsZWN0aW9uID0gd3JhcFdlYmhvb2tDb2xsZWN0aW9uO1xuXG52YXIgX2Nsb25lRGVlcCA9IHJlcXVpcmUoJ2xvZGFzaC9jbG9uZURlZXAnKTtcblxudmFyIF9jbG9uZURlZXAyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xvbmVEZWVwKTtcblxudmFyIF9mcmVlemVTeXMgPSByZXF1aXJlKCdjb250ZW50ZnVsLXNkay1jb3JlL2ZyZWV6ZS1zeXMnKTtcblxudmFyIF9mcmVlemVTeXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZnJlZXplU3lzKTtcblxudmFyIF9lbmhhbmNlV2l0aE1ldGhvZHMgPSByZXF1aXJlKCcuLi9lbmhhbmNlLXdpdGgtbWV0aG9kcycpO1xuXG52YXIgX2VuaGFuY2VXaXRoTWV0aG9kczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9lbmhhbmNlV2l0aE1ldGhvZHMpO1xuXG52YXIgX3RvUGxhaW5PYmplY3QgPSByZXF1aXJlKCdjb250ZW50ZnVsLXNkay1jb3JlL21peGlucy90by1wbGFpbi1vYmplY3QnKTtcblxudmFyIF90b1BsYWluT2JqZWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3RvUGxhaW5PYmplY3QpO1xuXG52YXIgX2Vycm9ySGFuZGxlciA9IHJlcXVpcmUoJy4uL2Vycm9yLWhhbmRsZXInKTtcblxudmFyIF9lcnJvckhhbmRsZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXJyb3JIYW5kbGVyKTtcblxudmFyIF9pbnN0YW5jZUFjdGlvbnMgPSByZXF1aXJlKCcuLi9pbnN0YW5jZS1hY3Rpb25zJyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbi8qKlxuICogQG1lbWJlcm9mIFdlYmhvb2tcbiAqIEB0eXBlZGVmIFdlYmhvb2tcbiAqIEBwcm9wIHtNZXRhLlN5c30gc3lzIC0gU3lzdGVtIG1ldGFkYXRhXG4gKiBAcHJvcCB7c3RyaW5nfSBuYW1lXG4gKiBAcHJvcCB7c3RyaW5nfSB1cmwgLSBVcmwgd2hpY2ggdGhlIHdlYmhvb2sgd2lsbCBjYWxsXG4gKiBAcHJvcCB7c3RyaW5nfSBodHRwQmFzaWNVc2VybmFtZSAtIFVzZXJuYW1lIGZvciBiYXNpYyBIVFRQIGF1dGhlbnRpY2F0aW9uXG4gKiBAcHJvcCB7c3RyaW5nfSBodHRwQmFzaWNQYXNzd29yZCAtIFBhc3N3b3JkIGZvciBiYXNpYyBIVFRQIGF1dGhlbnRpY2F0aW9uXG4gKiBAcHJvcCB7b2JqZWN0fSBoZWFkZXJzIC0gS2V5IHZhbHVlIHBhaXJzIG9mIGFkZGl0aW9uYWwgaGVhZGVycyB0byBiZSBzZW50IHdpdGggZXZlcnkgd2ViaG9vayBjYWxsLlxuICogQHByb3Age2FycmF5fSB0b3BpY3MgLSBUb3BpY3Mgd2hpY2ggdGhpcyB3ZWJob29rIHNob3VsZCBiZSBzdWJzY3JpYmVkIHRvLiBTZWUgaHR0cHM6Ly93d3cuY29udGVudGZ1bC5jb20vZGV2ZWxvcGVycy9kb2NzL3JlZmVyZW5jZXMvY29udGVudC1tYW5hZ2VtZW50LWFwaS8jL3JlZmVyZW5jZS93ZWJob29rcy9jcmVhdGUtYS13ZWJob29rIGZvciBtb3JlIGRldGFpbHNcbiAqIEBwcm9wIHtmdW5jdGlvbigpOiBPYmplY3R9IHRvUGxhaW5PYmplY3QoKSAtIFJldHVybnMgdGhpcyBXZWJob29rIGFzIGEgcGxhaW4gSlMgb2JqZWN0XG4gKi9cblxuLyoqXG4gKiBXZWJob29rIGluc3RhbmNlc1xuICogQG5hbWVzcGFjZSBXZWJob29rXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVdlYmhvb2tBcGkoaHR0cCkge1xuICByZXR1cm4ge1xuXG4gICAgLyoqXG4gICAgICogU2VuZHMgYW4gdXBkYXRlIHRvIHRoZSBzZXJ2ZXIgd2l0aCBhbnkgY2hhbmdlcyBtYWRlIHRvIHRoZSBvYmplY3QncyBwcm9wZXJ0aWVzXG4gICAgICogQG1lbWJlcm9mIFdlYmhvb2tcbiAgICAgKiBAZnVuYyB1cGRhdGVcbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlPFdlYmhvb2s+fSBPYmplY3QgcmV0dXJuZWQgZnJvbSB0aGUgc2VydmVyIHdpdGggdXBkYXRlZCBjaGFuZ2VzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogd2ViaG9vay5uYW1lID0gJ05ldyBuYW1lJ1xuICAgICAqIHdlYmhvb2sudXBkYXRlKClcbiAgICAgKiAudGhlbih3ZWJob29rID0+IGNvbnNvbGUubG9nKHdlYmhvb2submFtZSkpXG4gICAgICovXG4gICAgdXBkYXRlOiAoMCwgX2luc3RhbmNlQWN0aW9ucy5jcmVhdGVVcGRhdGVFbnRpdHkpKHtcbiAgICAgIGh0dHA6IGh0dHAsXG4gICAgICBlbnRpdHlQYXRoOiAnd2ViaG9va19kZWZpbml0aW9ucycsXG4gICAgICB3cmFwcGVyTWV0aG9kOiB3cmFwV2ViaG9va1xuICAgIH0pLFxuXG4gICAgLyoqXG4gICAgICogRGVsZXRlcyB0aGlzIG9iamVjdCBvbiB0aGUgc2VydmVyLlxuICAgICAqIEBtZW1iZXJvZiBXZWJob29rXG4gICAgICogQGZ1bmMgZGVsZXRlXG4gICAgICogQHJldHVybiB7UHJvbWlzZX0gUHJvbWlzZSBmb3IgdGhlIGRlbGV0aW9uLiBJdCBjb250YWlucyBubyBkYXRhLCBidXQgdGhlIFByb21pc2UgZXJyb3IgY2FzZSBzaG91bGQgYmUgaGFuZGxlZC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHdlYmhvb2suZGVsZXRlKClcbiAgICAgKiAuY2F0Y2goZXJyID0+IGNvbnNvbGUubG9nKGVycikpXG4gICAgICovXG4gICAgZGVsZXRlOiAoMCwgX2luc3RhbmNlQWN0aW9ucy5jcmVhdGVEZWxldGVFbnRpdHkpKHtcbiAgICAgIGh0dHA6IGh0dHAsXG4gICAgICBlbnRpdHlQYXRoOiAnd2ViaG9va19kZWZpbml0aW9ucydcbiAgICB9KSxcblxuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgdGhlIG1vc3QgcmVjZW50IHdlYmhvb2sgY2FsbHMuIFNlZSBodHRwczovL3d3dy5jb250ZW50ZnVsLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVmZXJlbmNlcy9jb250ZW50LW1hbmFnZW1lbnQtYXBpLyMvcmVmZXJlbmNlL3dlYmhvb2stY2FsbHMvd2ViaG9vay1jYWxsLW92ZXJ2aWV3cyBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqIEBtZW1iZXJvZiBXZWJob29rXG4gICAgICogQGZ1bmMgZ2V0Q2FsbHNcbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlPG9iamVjdD59IFByb21pc2UgZm9yIGxpc3Qgb2YgY2FsbHNcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHdlYmhvb2suZ2V0Q2FsbHMoKVxuICAgICAqIC50aGVuKGNhbGxzID0+IGNvbnNvbGUubG9nKGNhbGxzLml0ZW1zKSlcbiAgICAgKi9cbiAgICBnZXRDYWxsczogZnVuY3Rpb24gZ2V0Q2FsbHMoKSB7XG4gICAgICByZXR1cm4gaHR0cC5nZXQoJ3dlYmhvb2tzLycgKyB0aGlzLnN5cy5pZCArICcvY2FsbHMnKS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YTtcbiAgICAgIH0sIF9lcnJvckhhbmRsZXIyLmRlZmF1bHQpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBXZWJob29rIGNhbGwgd2l0aCBzcGVjaWZpYyBpZC4gU2VlIGh0dHBzOi8vd3d3LmNvbnRlbnRmdWwuY29tL2RldmVsb3BlcnMvZG9jcy9yZWZlcmVuY2VzL2NvbnRlbnQtbWFuYWdlbWVudC1hcGkvIy9yZWZlcmVuY2Uvd2ViaG9vay1jYWxscy93ZWJob29rLWNhbGwtb3ZlcnZpZXdzIGZvciBtb3JlIGRldGFpbHNcbiAgICAgKiBAbWVtYmVyb2YgV2ViaG9va1xuICAgICAqIEBmdW5jIGdldENhbGxzXG4gICAgICogQHJldHVybiB7UHJvbWlzZTxvYmplY3Q+fSBQcm9taXNlIGZvciBjYWxsIGRldGFpbHNcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHdlYmhvb2suZ2V0Q2FsbCgna2pzZGsxamVhc2QnKVxuICAgICAqIC50aGVuKGNhbGwgPT4gY29uc29sZS5sb2coY2FsbCkpXG4gICAgICovXG4gICAgZ2V0Q2FsbDogZnVuY3Rpb24gZ2V0Q2FsbChpZCkge1xuICAgICAgcmV0dXJuIGh0dHAuZ2V0KCd3ZWJob29rcy8nICsgdGhpcy5zeXMuaWQgKyAnL2NhbGxzLycgKyBpZCkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE7XG4gICAgICB9LCBfZXJyb3JIYW5kbGVyMi5kZWZhdWx0KTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogT3ZlcnZpZXcgb2YgdGhlIGhlYWx0aCBvZiB3ZWJob29rIGNhbGxzLiBTZWUgaHR0cHM6Ly93d3cuY29udGVudGZ1bC5jb20vZGV2ZWxvcGVycy9kb2NzL3JlZmVyZW5jZXMvY29udGVudC1tYW5hZ2VtZW50LWFwaS8jL3JlZmVyZW5jZS93ZWJob29rLWNhbGxzL3dlYmhvb2stY2FsbC1vdmVydmlld3MgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAbWVtYmVyb2YgV2ViaG9va1xuICAgICAqIEBmdW5jIGdldEhlYWx0aFxuICAgICAqIEByZXR1cm4ge1Byb21pc2U8b2JqZWN0Pn0gUHJvbWlzZSBmb3IgaGVhbHRoIGluZm9cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHdlYmhvb2suZ2V0SGVhbHRoKClcbiAgICAgKiAudGhlbihoZWFsdGggPT4gY29uc29sZS5sb2coaGVhbHRoKSlcbiAgICAgKi9cbiAgICBnZXRIZWFsdGg6IGZ1bmN0aW9uIGdldEhlYWx0aCgpIHtcbiAgICAgIHJldHVybiBodHRwLmdldCgnd2ViaG9va3MvJyArIHRoaXMuc3lzLmlkICsgJy9oZWFsdGgnKS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YTtcbiAgICAgIH0sIF9lcnJvckhhbmRsZXIyLmRlZmF1bHQpO1xuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IGh0dHAgLSBIVFRQIGNsaWVudCBpbnN0YW5jZVxuICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSBSYXcgd2ViaG9vayBkYXRhXG4gKiBAcmV0dXJuIHtXZWJob29rfSBXcmFwcGVkIHdlYmhvb2sgZGF0YVxuICovXG5mdW5jdGlvbiB3cmFwV2ViaG9vayhodHRwLCBkYXRhKSB7XG4gIHZhciB3ZWJob29rID0gKDAsIF90b1BsYWluT2JqZWN0Mi5kZWZhdWx0KSgoMCwgX2Nsb25lRGVlcDIuZGVmYXVsdCkoZGF0YSkpO1xuICAoMCwgX2VuaGFuY2VXaXRoTWV0aG9kczIuZGVmYXVsdCkod2ViaG9vaywgY3JlYXRlV2ViaG9va0FwaShodHRwKSk7XG4gIHJldHVybiAoMCwgX2ZyZWV6ZVN5czIuZGVmYXVsdCkod2ViaG9vayk7XG59XG5cbi8qKlxuICogQG1lbWJlcm9mIFdlYmhvb2tcbiAqIEB0eXBlZGVmIFdlYmhvb2tDb2xsZWN0aW9uXG4gKiBAcHJvcCB7bnVtYmVyfSB0b3RhbFxuICogQHByb3Age251bWJlcn0gc2tpcFxuICogQHByb3Age251bWJlcn0gbGltaXRcbiAqIEBwcm9wIHtBcnJheTxXZWJob29rLldlYmhvb2s+fSBpdGVtc1xuICogQHByb3Age2Z1bmN0aW9uKCk6IE9iamVjdH0gdG9QbGFpbk9iamVjdCgpIC0gUmV0dXJucyB0aGlzIFdlYmhvb2sgY29sbGVjdGlvbiBhcyBhIHBsYWluIEpTIG9iamVjdFxuICovXG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBodHRwIC0gSFRUUCBjbGllbnQgaW5zdGFuY2VcbiAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIC0gUmF3IHdlYmhvb2sgY29sbGVjdGlvbiBkYXRhXG4gKiBAcmV0dXJuIHtXZWJob29rQ29sbGVjdGlvbn0gV3JhcHBlZCB3ZWJob29rIGNvbGxlY3Rpb24gZGF0YVxuICovXG5mdW5jdGlvbiB3cmFwV2ViaG9va0NvbGxlY3Rpb24oaHR0cCwgZGF0YSkge1xuICB2YXIgd2ViaG9va3MgPSAoMCwgX3RvUGxhaW5PYmplY3QyLmRlZmF1bHQpKCgwLCBfY2xvbmVEZWVwMi5kZWZhdWx0KShkYXRhKSk7XG4gIHdlYmhvb2tzLml0ZW1zID0gd2ViaG9va3MuaXRlbXMubWFwKGZ1bmN0aW9uIChlbnRpdHkpIHtcbiAgICByZXR1cm4gd3JhcFdlYmhvb2soaHR0cCwgZW50aXR5KTtcbiAgfSk7XG4gIHJldHVybiAoMCwgX2ZyZWV6ZVN5czIuZGVmYXVsdCkod2ViaG9va3MpO1xufSIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9zdHJpbmdpZnkgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2NvcmUtanMvanNvbi9zdHJpbmdpZnknKTtcblxudmFyIF9zdHJpbmdpZnkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfc3RyaW5naWZ5KTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gZXJyb3JIYW5kbGVyO1xuXG52YXIgX2dldCA9IHJlcXVpcmUoJ2xvZGFzaC9nZXQnKTtcblxudmFyIF9nZXQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZ2V0KTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuLyoqXG4gKiBFcnJvcnMgcmVjZWl2ZWQgZnJvbSBzZXJ2ZXIgcmVxdWVzdHNcbiAqIEBtZW1iZXJvZiBDb250ZW50ZnVsQ2xpZW50QVBJXG4gKiBAdHlwZWRlZiBFcnJvclJlc3BvbnNlXG4gKiBAcHJvcCB7c3RyaW5nfSBuYW1lIC0gRXJyb3IgbmFtZS4gVXN1YWxseSByZWZlcnMgdG8gdGhlIHN5cy5pZCByZXR1cm5lZCBvbiB0aGVcbiAqIGVycm9yIHNlcnZlciByZXNwb25zZS4gSWYgdGhhdCdzIG5vdCBhdmFpbGFibGUgb3IgaXMgdW5rbm93biwgaXQgZGVmYXVsdHMgdG9cbiAqIHRoZSBIVFRQIGVycm9yIGNvZGUgYW5kIHN0YXR1cyB0ZXh0LlxuICogQHByb3Age3N0cmluZ30gbWVzc2FnZSAtIFN0cmluZ2lmaWVkIEpTT04gb2JqZWN0IHdpdGggcmVxdWVzdCBpbmZvcm1hdGlvbixcbiAqIEhUVFAgcmVzcG9uc2UgZGV0YWlscyBhbmQgZXJyb3IgZGV0YWlscyBwYXlsb2FkIChpZiBhdmFpbGFibGUpLiBUaGUgYHJlcXVlc3RJZGBcbiAqIHByb3BlcnR5IGlzIGludGVybmFsIHRvIENvbnRlbnRmdWwgYW5kIGl0IGNhbiBiZSB1c2VkIHdoZW4gY29udGFjdGluZyBzdXBwb3J0XG4gKiBhYm91dCB1bnVzdWFsIGVycm9ycy5cbiAqL1xuXG4vKipcbiAqIEhhbmRsZXMgZXJyb3JzIHJlY2VpdmVkIGZyb20gdGhlIHNlcnZlci4gUGFyc2VzIHRoZSBlcnJvciBpbnRvIGEgbW9yZSB1c2VmdWxcbiAqIGZvcm1hdCwgcGxhY2VzIGl0IGluIGFuIGV4Y2VwdGlvbiBhbmQgdGhyb3dzIGl0LlxuICogU2VlIGh0dHBzOi8vd3d3LmNvbnRlbnRmdWwuY29tL2RldmVsb3BlcnMvZG9jcy9yZWZlcmVuY2VzL2NvbnRlbnQtbWFuYWdlbWVudC1hcGkvIy9pbnRyb2R1Y3Rpb24vZXJyb3JzXG4gKiBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoZSBkYXRhIHJlY2VpdmVkIG9uIHRoZSBlcnJvclJlc3BvbnNlLmRhdGEgcHJvcGVydHlcbiAqIGFuZCB0aGUgZXhwZWN0ZWQgZXJyb3IgY29kZXMuXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IGVycm9yUmVzcG9uc2UgLSBFcnJvciByZWNlaXZlZCBmcm9tIGFuIGF4aW9zIHJlcXVlc3RcbiAqIEB0aHJvd3Mge0Vycm9yUmVzcG9uc2V9XG4gKi9cbmZ1bmN0aW9uIGVycm9ySGFuZGxlcihlcnJvclJlc3BvbnNlKSB7XG4gIHZhciBkYXRhID0gZXJyb3JSZXNwb25zZS5kYXRhO1xuICB2YXIgc3RhdHVzID0gZXJyb3JSZXNwb25zZS5zdGF0dXM7XG4gIHZhciBzdGF0dXNUZXh0ID0gZXJyb3JSZXNwb25zZS5zdGF0dXNUZXh0O1xuICB2YXIgY29uZmlnID0gZXJyb3JSZXNwb25zZS5jb25maWc7XG5cbiAgdmFyIGVycm9yRGF0YSA9IHtcbiAgICByZXF1ZXN0OiB7XG4gICAgICB1cmw6IGNvbmZpZy51cmwsXG4gICAgICBoZWFkZXJzOiBjb25maWcuaGVhZGVycyxcbiAgICAgIG1ldGhvZDogY29uZmlnLm1ldGhvZCxcbiAgICAgIHBheWxvYWREYXRhOiBjb25maWcuZGF0YVxuICAgIH0sXG4gICAgc3RhdHVzOiBzdGF0dXMsXG4gICAgc3RhdHVzVGV4dDogc3RhdHVzVGV4dFxuICB9O1xuICBpZiAoKDAsIF9nZXQyLmRlZmF1bHQpKGRhdGEsICdzeXMudHlwZScpID09PSAnRXJyb3InKSB7XG4gICAgZXJyb3JEYXRhLm1lc3NhZ2UgPSBkYXRhLm1lc3NhZ2U7XG4gICAgZXJyb3JEYXRhLnJlcXVlc3RJZCA9IGRhdGEucmVxdWVzdElkO1xuICAgIGlmIChkYXRhLmRldGFpbHMpIHtcbiAgICAgIGVycm9yRGF0YS5kZXRhaWxzID0gZGF0YS5kZXRhaWxzO1xuICAgIH1cbiAgfVxuICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IoKTtcbiAgdmFyIGVycm9yTmFtZSA9ICgwLCBfZ2V0Mi5kZWZhdWx0KShkYXRhLCAnc3lzLmlkJyk7XG4gIGVycm9yLm5hbWUgPSBlcnJvck5hbWUgJiYgZXJyb3JOYW1lICE9PSAnVW5rbm93bicgPyBlcnJvck5hbWUgOiBzdGF0dXMgKyAnICcgKyBzdGF0dXNUZXh0O1xuICBlcnJvci5tZXNzYWdlID0gKDAsIF9zdHJpbmdpZnkyLmRlZmF1bHQpKGVycm9yRGF0YSwgbnVsbCwgJyAgJyk7XG4gIHRocm93IGVycm9yO1xufSIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuY3JlYXRlVXBkYXRlRW50aXR5ID0gY3JlYXRlVXBkYXRlRW50aXR5O1xuZXhwb3J0cy5jcmVhdGVEZWxldGVFbnRpdHkgPSBjcmVhdGVEZWxldGVFbnRpdHk7XG5leHBvcnRzLmNyZWF0ZVB1Ymxpc2hFbnRpdHkgPSBjcmVhdGVQdWJsaXNoRW50aXR5O1xuZXhwb3J0cy5jcmVhdGVVbnB1Ymxpc2hFbnRpdHkgPSBjcmVhdGVVbnB1Ymxpc2hFbnRpdHk7XG5leHBvcnRzLmNyZWF0ZUFyY2hpdmVFbnRpdHkgPSBjcmVhdGVBcmNoaXZlRW50aXR5O1xuZXhwb3J0cy5jcmVhdGVVbmFyY2hpdmVFbnRpdHkgPSBjcmVhdGVVbmFyY2hpdmVFbnRpdHk7XG5leHBvcnRzLmNyZWF0ZVB1Ymxpc2hlZENoZWNrZXIgPSBjcmVhdGVQdWJsaXNoZWRDaGVja2VyO1xuZXhwb3J0cy5jcmVhdGVVcGRhdGVkQ2hlY2tlciA9IGNyZWF0ZVVwZGF0ZWRDaGVja2VyO1xuZXhwb3J0cy5jcmVhdGVEcmFmdENoZWNrZXIgPSBjcmVhdGVEcmFmdENoZWNrZXI7XG5leHBvcnRzLmNyZWF0ZUFyY2hpdmVkQ2hlY2tlciA9IGNyZWF0ZUFyY2hpdmVkQ2hlY2tlcjtcblxudmFyIF9vbWl0ID0gcmVxdWlyZSgnbG9kYXNoL29taXQnKTtcblxudmFyIF9vbWl0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29taXQpO1xuXG52YXIgX2Vycm9ySGFuZGxlciA9IHJlcXVpcmUoJy4vZXJyb3ItaGFuZGxlcicpO1xuXG52YXIgX2Vycm9ySGFuZGxlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9lcnJvckhhbmRsZXIpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiBjcmVhdGVVcGRhdGVFbnRpdHkoX3JlZikge1xuICB2YXIgaHR0cCA9IF9yZWYuaHR0cDtcbiAgdmFyIGVudGl0eVBhdGggPSBfcmVmLmVudGl0eVBhdGg7XG4gIHZhciB3cmFwcGVyTWV0aG9kID0gX3JlZi53cmFwcGVyTWV0aG9kO1xuXG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHJhdyA9IHRoaXMudG9QbGFpbk9iamVjdCgpO1xuICAgIHZhciBkYXRhID0gKDAsIF9vbWl0Mi5kZWZhdWx0KShyYXcsIFsnc3lzJ10pO1xuICAgIHJldHVybiBodHRwLnB1dChlbnRpdHlQYXRoICsgJy8nICsgdGhpcy5zeXMuaWQsIGRhdGEsIHtcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ1gtQ29udGVudGZ1bC1WZXJzaW9uJzogdGhpcy5zeXMudmVyc2lvblxuICAgICAgfVxuICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICByZXR1cm4gd3JhcHBlck1ldGhvZChodHRwLCByZXNwb25zZS5kYXRhKTtcbiAgICB9LCBfZXJyb3JIYW5kbGVyMi5kZWZhdWx0KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRGVsZXRlRW50aXR5KF9yZWYyKSB7XG4gIHZhciBodHRwID0gX3JlZjIuaHR0cDtcbiAgdmFyIGVudGl0eVBhdGggPSBfcmVmMi5lbnRpdHlQYXRoO1xuXG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGh0dHAuZGVsZXRlKGVudGl0eVBhdGggKyAnLycgKyB0aGlzLnN5cy5pZCkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHt9LCBfZXJyb3JIYW5kbGVyMi5kZWZhdWx0KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlUHVibGlzaEVudGl0eShfcmVmMykge1xuICB2YXIgaHR0cCA9IF9yZWYzLmh0dHA7XG4gIHZhciBlbnRpdHlQYXRoID0gX3JlZjMuZW50aXR5UGF0aDtcbiAgdmFyIHdyYXBwZXJNZXRob2QgPSBfcmVmMy53cmFwcGVyTWV0aG9kO1xuXG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGh0dHAucHV0KGVudGl0eVBhdGggKyAnLycgKyB0aGlzLnN5cy5pZCArICcvcHVibGlzaGVkJywgbnVsbCwge1xuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnWC1Db250ZW50ZnVsLVZlcnNpb24nOiB0aGlzLnN5cy52ZXJzaW9uXG4gICAgICB9XG4gICAgfSkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgIHJldHVybiB3cmFwcGVyTWV0aG9kKGh0dHAsIHJlc3BvbnNlLmRhdGEpO1xuICAgIH0sIF9lcnJvckhhbmRsZXIyLmRlZmF1bHQpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVVbnB1Ymxpc2hFbnRpdHkoX3JlZjQpIHtcbiAgdmFyIGh0dHAgPSBfcmVmNC5odHRwO1xuICB2YXIgZW50aXR5UGF0aCA9IF9yZWY0LmVudGl0eVBhdGg7XG4gIHZhciB3cmFwcGVyTWV0aG9kID0gX3JlZjQud3JhcHBlck1ldGhvZDtcblxuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBodHRwLmRlbGV0ZShlbnRpdHlQYXRoICsgJy8nICsgdGhpcy5zeXMuaWQgKyAnL3B1Ymxpc2hlZCcpLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICByZXR1cm4gd3JhcHBlck1ldGhvZChodHRwLCByZXNwb25zZS5kYXRhKTtcbiAgICB9LCBfZXJyb3JIYW5kbGVyMi5kZWZhdWx0KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQXJjaGl2ZUVudGl0eShfcmVmNSkge1xuICB2YXIgaHR0cCA9IF9yZWY1Lmh0dHA7XG4gIHZhciBlbnRpdHlQYXRoID0gX3JlZjUuZW50aXR5UGF0aDtcbiAgdmFyIHdyYXBwZXJNZXRob2QgPSBfcmVmNS53cmFwcGVyTWV0aG9kO1xuXG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGh0dHAucHV0KGVudGl0eVBhdGggKyAnLycgKyB0aGlzLnN5cy5pZCArICcvYXJjaGl2ZWQnKS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgcmV0dXJuIHdyYXBwZXJNZXRob2QoaHR0cCwgcmVzcG9uc2UuZGF0YSk7XG4gICAgfSwgX2Vycm9ySGFuZGxlcjIuZGVmYXVsdCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVVuYXJjaGl2ZUVudGl0eShfcmVmNikge1xuICB2YXIgaHR0cCA9IF9yZWY2Lmh0dHA7XG4gIHZhciBlbnRpdHlQYXRoID0gX3JlZjYuZW50aXR5UGF0aDtcbiAgdmFyIHdyYXBwZXJNZXRob2QgPSBfcmVmNi53cmFwcGVyTWV0aG9kO1xuXG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGh0dHAuZGVsZXRlKGVudGl0eVBhdGggKyAnLycgKyB0aGlzLnN5cy5pZCArICcvYXJjaGl2ZWQnKS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgcmV0dXJuIHdyYXBwZXJNZXRob2QoaHR0cCwgcmVzcG9uc2UuZGF0YSk7XG4gICAgfSwgX2Vycm9ySGFuZGxlcjIuZGVmYXVsdCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVB1Ymxpc2hlZENoZWNrZXIoKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5zeXMucHVibGlzaGVkVmVyc2lvbjtcbiAgfTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlVXBkYXRlZENoZWNrZXIoKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgLy8gVGhlIGFjdCBvZiBwdWJsaXNoaW5nIGFuIGVudGl0eSBpbmNyZWFzZXMgaXRzIHZlcnNpb24gYnkgMSwgc28gYW55IGVudHJ5IHdoaWNoIGhhc1xuICAgIC8vIDIgdmVyc2lvbnMgaGlnaGVyIG9yIG1vcmUgdGhhbiB0aGUgcHVibGlzaGVkVmVyc2lvbiBoYXMgdW5wdWJsaXNoZWQgY2hhbmdlcy5cbiAgICByZXR1cm4gdGhpcy5zeXMucHVibGlzaGVkVmVyc2lvbiAmJiB0aGlzLnN5cy52ZXJzaW9uID4gdGhpcy5zeXMucHVibGlzaGVkVmVyc2lvbiArIDE7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZURyYWZ0Q2hlY2tlcigpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gIXRoaXMuc3lzLnB1Ymxpc2hlZFZlcnNpb247XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUFyY2hpdmVkQ2hlY2tlcigpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gISF0aGlzLnN5cy5hcmNoaXZlZFZlcnNpb247XG4gIH07XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfcHJvbWlzZSA9IHJlcXVpcmUoXCJiYWJlbC1ydW50aW1lL2NvcmUtanMvcHJvbWlzZVwiKTtcblxudmFyIF9wcm9taXNlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Byb21pc2UpO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBwcm9taXNlZFdhaXQ7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIHByb21pc2VkV2FpdChtcykge1xuICByZXR1cm4gbmV3IF9wcm9taXNlMi5kZWZhdWx0KGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgc2V0VGltZW91dChyZXNvbHZlLCBtcyB8fCAzMDAwKTtcbiAgfSk7XG59IiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX3Byb21pc2UgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2NvcmUtanMvcHJvbWlzZScpO1xuXG52YXIgX3Byb21pc2UyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvbWlzZSk7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IHJhdGVMaW1pdDtcblxudmFyIF9wcm9taXNlZFdhaXQgPSByZXF1aXJlKCcuL3Byb21pc2VkLXdhaXQnKTtcblxudmFyIF9wcm9taXNlZFdhaXQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvbWlzZWRXYWl0KTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuLyoqXG4gKiBQcm9taXNlLWJhc2VkIHJhdGUgbGltaXRpbmcgb2YgYSBmdW5jdGlvbi4gQXNzdW1lcyB0aGF0IHRoZSBwYXNzZWQgaW5cbiAqIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGEgUHJvbWlzZS5cbiAqIFF1ZXVlcyBjYWxscyBtYWRlIHRvIHRoZSB3cmFwcGVkIGZ1bmN0aW9uLCBhbmQgaWYgbW9yZSBjYWxscyBhcmUgbWFkZSB0aGFuXG4gKiB0aGUgYWxsb3dlZCBsZXZlbCBvZiBjb25jdXJyZW5jeSB3YWl0cyB1bnRpbCBhIGNlcnRhaW4gYW1vdW50IG9mIHRpbWUgaGFzXG4gKiBwYXNzZWQgYmVmb3JlIGNvbnRpbnVpbmcgdG8gY2xlYXIgY2FsbHMgZnJvbSB0aGUgcXVldWUuXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gLSBjYWxsIHRvIGJlIHJhdGUgbGltaXRlZFxuICogQHBhcmFtIHtudW1iZXJ9IGNvbmN1cnJlbmN5IC0gTnVtYmVyIG9mIGFsbG93ZWQgY29uY3VycmVudCByZXF1ZXN0c1xuICogQHBhcmFtIHtudW1iZXJ9IGRlbGF5IC0gRGVsYXkgaW4gbWlsbGlzZWNvbmRzIGZvciB3YWl0aW5nIGFmdGVyIGhpdHRpbmcgdGhlXG4gKi9cbmZ1bmN0aW9uIHJhdGVMaW1pdChmbiwgY29uY3VycmVuY3ksIGRlbGF5KSB7XG4gIGNvbmN1cnJlbmN5ID0gcG9zaXRpdmVJbnRlZ2VyKCdjb25jdXJyZW5jeScsIGNvbmN1cnJlbmN5KTtcbiAgZGVsYXkgPSBwb3NpdGl2ZUludGVnZXIoJ2RlbGF5JywgZGVsYXkpO1xuXG4gIHZhciBjYWxsUXVldWUgPSBbXTtcbiAgdmFyIGluRmxpZ2h0ID0gMDtcblxuICBmdW5jdGlvbiBzaGlmdCgpIHtcbiAgICBpZiAoaW5GbGlnaHQgPj0gY29uY3VycmVuY3kpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgc3RhcnQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcblxuICAgIGlmIChjYWxsUXVldWUubGVuZ3RoKSB7XG4gICAgICB2YXIgY2FsbCA9IGNhbGxRdWV1ZS5zaGlmdCgpO1xuICAgICAgaW5GbGlnaHQrKztcblxuICAgICAgdmFyIHJlc3VsdCA9IHZvaWQgMDtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIGNhbGwgdGhlIHdyYXBwZWQgbWV0aG9kXG4gICAgICAgIHZhciB0bXAgPSBfcHJvbWlzZTIuZGVmYXVsdC5yZXNvbHZlKGZuLmFwcGx5KGNhbGwuc2VsZiwgY2FsbC5hcmdzKSk7XG4gICAgICAgIC8vIHJlc29sdmUgdGhlIGNhbGwgd2l0aCBhIHBvc3NpYmx5IHJlamVjdGVkIHByb21pc2VcbiAgICAgICAgY2FsbC5yZXNvbHZlKHRtcCk7XG4gICAgICAgIC8vIHJhdGUtbGltaXRpbmcgZG9lc24ndCBjYXJlIGFib3V0IGVycm9yc1xuICAgICAgICByZXN1bHQgPSB0bXAuY2F0Y2goZnVuY3Rpb24gKCkge30pO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNhbGwucmVqZWN0KGVycik7XG4gICAgICAgIHJlc3VsdCA9IF9wcm9taXNlMi5kZWZhdWx0LnJlc29sdmUoKTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgdGhpcyByZXF1ZXN0IGNvbXBsZXRlZCBmYXN0ZXIgdGhhbiBvdXIgcmF0ZS1saW1pdCB3b3VsZFxuICAgICAgLy8gYWxsb3csIHdhaXQgdGhlIGFwcHJvcHJpYXRlIGFtb3VudCBvZiB0aW1lIGJlZm9yZSBtYXJraW5nIHRoZVxuICAgICAgLy8gcmVxdWVzdCBhcyBmaW5pc2hlZC5cbiAgICAgIHJlc3VsdC50aGVuKG1heWJlV2FpdCkudGhlbihnb1RvTmV4dENhbGwpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1heWJlV2FpdCgpIHtcbiAgICAgIHZhciBkdXJhdGlvbiA9IHN0YXJ0IC0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICBpZiAoZHVyYXRpb24gPCBkZWxheSkge1xuICAgICAgICByZXR1cm4gKDAsIF9wcm9taXNlZFdhaXQyLmRlZmF1bHQpKGRlbGF5IC0gZHVyYXRpb24pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGdvVG9OZXh0Q2FsbCgpIHtcbiAgICBpbkZsaWdodC0tO1xuICAgIHNoaWZ0KCk7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKCkgLyogd3JhcHBlZCBtZXRob2QgYXJndW1lbnRzICove1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG4gICAgcmV0dXJuIG5ldyBfcHJvbWlzZTIuZGVmYXVsdChmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICBjYWxsUXVldWUucHVzaCh7XG4gICAgICAgIHJlamVjdDogcmVqZWN0LFxuICAgICAgICByZXNvbHZlOiByZXNvbHZlLFxuICAgICAgICBzZWxmOiBzZWxmLFxuICAgICAgICBhcmdzOiBhcmdzXG4gICAgICB9KTtcbiAgICAgIHNoaWZ0KCk7XG4gICAgfSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHBvc2l0aXZlSW50ZWdlcihuYW1lLCB2YWx1ZSkge1xuICB2YWx1ZSA9IHBhcnNlSW50KHZhbHVlLCAxMCk7XG4gIGlmIChpc05hTih2YWx1ZSkgfHwgdmFsdWUgPCAxKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihuYW1lICsgJyBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlcicpO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn0iLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB3cmFwSHR0cENsaWVudDtcblxudmFyIF9yZWR1Y2UgPSByZXF1aXJlKCdsb2Rhc2gvcmVkdWNlJyk7XG5cbnZhciBfcmVkdWNlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlZHVjZSk7XG5cbnZhciBfY2xvbmVEZWVwID0gcmVxdWlyZSgnbG9kYXNoL2Nsb25lRGVlcCcpO1xuXG52YXIgX2Nsb25lRGVlcDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbG9uZURlZXApO1xuXG52YXIgX3JhdGVMaW1pdCA9IHJlcXVpcmUoJy4vcmF0ZS1saW1pdCcpO1xuXG52YXIgX3JhdGVMaW1pdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yYXRlTGltaXQpO1xuXG52YXIgX2NyZWF0ZUJhY2tvZmYgPSByZXF1aXJlKCcuL2NyZWF0ZS1iYWNrb2ZmJyk7XG5cbnZhciBfY3JlYXRlQmFja29mZjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jcmVhdGVCYWNrb2ZmKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuLyoqXG4gKiBXcmFwcyB0aGUgaHR0cCBjbGllbnQgd2l0aCBhIHJhdGUgbGltaXRlciwgYW5kIGEgYmFja29mZiBmdW5jdGlvbmFsaXR5LlxuICogVGhlIHJhdGUgbGltaXRlciBxdWV1ZXMgY2FsbHMgYW5kIGF0dGVtcHRzIHRvIHByZXZlbnQgdGhlIHNlcnZlciBzaWRlIHJhdGVcbiAqIGxpbWl0IGZyb20gZXZlciBiZWluZyBoaXQuXG4gKiBUaGUgYmFja29mZiBpcyB0cmlnZ2VyZWQgaWYgYSA0MjkgVG9vIE1hbnkgUmVxdWVzdHMgZXJyb3IgaXMgcmVjZWl2ZWQgZnJvbVxuICogdGhlIHNlcnZlciwgYW5kIGV2ZXJ5IHRpbWUgaWYgaXQgaXMgcmVjZWl2ZWQgcmVwZWF0ZWFkbHkgdGhlIHdhaXQgdGltZVxuICogZm9yIHRoZSBuZXh0IHRyeSB3aWxsIGluY3JlYXNlIGV4cG9uZW50aWFsbHkuXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IGh0dHAgLSBIVFRQIENsaWVudCBpbnN0YW5jZXNcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gT3B0aW9ucyBmb3IgdGhlIHdyYXBwZXIgbWV0aG9kc1xuICogQHByb3Age251bWJlcn0gY29uY3VycmVuY3kgLSBOdW1iZXIgb2YgYWxsb3dlZCBjb25jdXJyZW50IHJlcXVlc3RzXG4gKiBAcHJvcCB7bnVtYmVyfSBkZWxheSAtIERlbGF5IGluIG1pbGxpc2Vjb25kcyBmb3Igd2FpdGluZyBhZnRlciBoaXR0aW5nIHRoZVxuICogYWxsb3dlZCBudW1iZXIgb2YgY29uY3VycmVudCByZXF1ZXN0c1xuICogQHByb3Age251bWJlcn0gbWF4UmV0cmllcyAtIE1heGltdW0gbnVtYmVyIG9mIHJldHJpZXMgd2hlbiBhIDQyOSBpcyByZWNlaXZlZFxuICogQHByb3Age2Jvb2xlYW59IHJldHJ5T25Ub29NYW55UmVxdWVzdHMgLSBJZiB3ZSBzaG91bGQgcmV0cnkgb24gNDI5c1xuICovXG5mdW5jdGlvbiB3cmFwSHR0cENsaWVudChodHRwLCBfcmVmKSB7XG4gIHZhciBjb25jdXJyZW5jeSA9IF9yZWYuY29uY3VycmVuY3k7XG4gIHZhciBkZWxheSA9IF9yZWYuZGVsYXk7XG4gIHZhciBtYXhSZXRyaWVzID0gX3JlZi5tYXhSZXRyaWVzO1xuICB2YXIgcmV0cnlPblRvb01hbnlSZXF1ZXN0cyA9IF9yZWYucmV0cnlPblRvb01hbnlSZXF1ZXN0cztcblxuICByZXR1cm4gKDAsIF9yZWR1Y2UyLmRlZmF1bHQpKFsnZ2V0JywgJ3Bvc3QnLCAncHV0JywgJ2RlbGV0ZScsICdwYXRjaCcsICdoZWFkJ10sIGZ1bmN0aW9uIChodHRwLCBtZXRob2ROYW1lKSB7XG4gICAgdmFyIGh0dHBDYWxsID0gaHR0cFttZXRob2ROYW1lXS5iaW5kKGh0dHApO1xuICAgIGlmIChyZXRyeU9uVG9vTWFueVJlcXVlc3RzKSB7XG4gICAgICBodHRwQ2FsbCA9IG1heWJlQmFja29mZihodHRwQ2FsbCwgbWF4UmV0cmllcyk7XG4gICAgfVxuICAgIGh0dHBbbWV0aG9kTmFtZV0gPSAoMCwgX3JhdGVMaW1pdDIuZGVmYXVsdCkoaHR0cENhbGwsIGNvbmN1cnJlbmN5LCBkZWxheSk7XG4gICAgcmV0dXJuIGh0dHA7XG4gIH0sICgwLCBfY2xvbmVEZWVwMi5kZWZhdWx0KShodHRwKSk7XG59XG5cbmZ1bmN0aW9uIG1heWJlQmFja29mZihmbiwgbWF4UmV0cmllcykge1xuICByZXR1cm4gZnVuY3Rpb24gaHR0cENhbGwoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHNlbGYuYmFja29mZiA9IHNlbGYuYmFja29mZiB8fCAoMCwgX2NyZWF0ZUJhY2tvZmYyLmRlZmF1bHQpKG1heFJldHJpZXMpO1xuICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcbiAgICB2YXIgcmVzcG9uc2UgPSBmbi5hcHBseShzZWxmLCBhcmdzKTtcblxuICAgIHJlc3BvbnNlID0gcmVzcG9uc2UuY2F0Y2goZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAvLyBSYXRlLWxpbWl0ZWQgYnkgdGhlIHNlcnZlciwgbWF5YmUgYmFja29mZiBhbmQgcmV0cnlcbiAgICAgIGlmIChlcnJvci5zdGF0dXMgPT09IDQyOSkge1xuICAgICAgICByZXR1cm4gc2VsZi5iYWNrb2ZmKGVycm9yLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGh0dHBDYWxsLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9O1xufSIsIm1vZHVsZS5leHBvcnRzID0geyBcImRlZmF1bHRcIjogcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9nZXQtaXRlcmF0b3JcIiksIF9fZXNNb2R1bGU6IHRydWUgfTsiLCJtb2R1bGUuZXhwb3J0cyA9IHsgXCJkZWZhdWx0XCI6IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vaXMtaXRlcmFibGVcIiksIF9fZXNNb2R1bGU6IHRydWUgfTsiLCJtb2R1bGUuZXhwb3J0cyA9IHsgXCJkZWZhdWx0XCI6IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vanNvbi9zdHJpbmdpZnlcIiksIF9fZXNNb2R1bGU6IHRydWUgfTsiLCJtb2R1bGUuZXhwb3J0cyA9IHsgXCJkZWZhdWx0XCI6IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKSwgX19lc01vZHVsZTogdHJ1ZSB9OyIsIm1vZHVsZS5leHBvcnRzID0geyBcImRlZmF1bHRcIjogcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvZnJlZXplXCIpLCBfX2VzTW9kdWxlOiB0cnVlIH07IiwibW9kdWxlLmV4cG9ydHMgPSB7IFwiZGVmYXVsdFwiOiByZXF1aXJlKFwiY29yZS1qcy9saWJyYXJ5L2ZuL29iamVjdC9rZXlzXCIpLCBfX2VzTW9kdWxlOiB0cnVlIH07IiwibW9kdWxlLmV4cG9ydHMgPSB7IFwiZGVmYXVsdFwiOiByZXF1aXJlKFwiY29yZS1qcy9saWJyYXJ5L2ZuL3Byb21pc2VcIiksIF9fZXNNb2R1bGU6IHRydWUgfTsiLCJtb2R1bGUuZXhwb3J0cyA9IHsgXCJkZWZhdWx0XCI6IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vc3ltYm9sXCIpLCBfX2VzTW9kdWxlOiB0cnVlIH07IiwibW9kdWxlLmV4cG9ydHMgPSB7IFwiZGVmYXVsdFwiOiByZXF1aXJlKFwiY29yZS1qcy9saWJyYXJ5L2ZuL3N5bWJvbC9pdGVyYXRvclwiKSwgX19lc01vZHVsZTogdHJ1ZSB9OyIsIlwidXNlIHN0cmljdFwiO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX2lzSXRlcmFibGUyID0gcmVxdWlyZShcIi4uL2NvcmUtanMvaXMtaXRlcmFibGVcIik7XG5cbnZhciBfaXNJdGVyYWJsZTMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pc0l0ZXJhYmxlMik7XG5cbnZhciBfZ2V0SXRlcmF0b3IyID0gcmVxdWlyZShcIi4uL2NvcmUtanMvZ2V0LWl0ZXJhdG9yXCIpO1xuXG52YXIgX2dldEl0ZXJhdG9yMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2dldEl0ZXJhdG9yMik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmV4cG9ydHMuZGVmYXVsdCA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gc2xpY2VJdGVyYXRvcihhcnIsIGkpIHtcbiAgICB2YXIgX2FyciA9IFtdO1xuICAgIHZhciBfbiA9IHRydWU7XG4gICAgdmFyIF9kID0gZmFsc2U7XG4gICAgdmFyIF9lID0gdW5kZWZpbmVkO1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvciAodmFyIF9pID0gKDAsIF9nZXRJdGVyYXRvcjMuZGVmYXVsdCkoYXJyKSwgX3M7ICEoX24gPSAoX3MgPSBfaS5uZXh0KCkpLmRvbmUpOyBfbiA9IHRydWUpIHtcbiAgICAgICAgX2Fyci5wdXNoKF9zLnZhbHVlKTtcblxuICAgICAgICBpZiAoaSAmJiBfYXJyLmxlbmd0aCA9PT0gaSkgYnJlYWs7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBfZCA9IHRydWU7XG4gICAgICBfZSA9IGVycjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFfbiAmJiBfaVtcInJldHVyblwiXSkgX2lbXCJyZXR1cm5cIl0oKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChfZCkgdGhyb3cgX2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIF9hcnI7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKGFyciwgaSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGFycikpIHtcbiAgICAgIHJldHVybiBhcnI7XG4gICAgfSBlbHNlIGlmICgoMCwgX2lzSXRlcmFibGUzLmRlZmF1bHQpKE9iamVjdChhcnIpKSkge1xuICAgICAgcmV0dXJuIHNsaWNlSXRlcmF0b3IoYXJyLCBpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2VcIik7XG4gICAgfVxuICB9O1xufSgpOyIsIlwidXNlIHN0cmljdFwiO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX2l0ZXJhdG9yID0gcmVxdWlyZShcIi4uL2NvcmUtanMvc3ltYm9sL2l0ZXJhdG9yXCIpO1xuXG52YXIgX2l0ZXJhdG9yMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2l0ZXJhdG9yKTtcblxudmFyIF9zeW1ib2wgPSByZXF1aXJlKFwiLi4vY29yZS1qcy9zeW1ib2xcIik7XG5cbnZhciBfc3ltYm9sMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3N5bWJvbCk7XG5cbnZhciBfdHlwZW9mID0gdHlwZW9mIF9zeW1ib2wyLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgX2l0ZXJhdG9yMi5kZWZhdWx0ID09PSBcInN5bWJvbFwiID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgX3N5bWJvbDIuZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gX3N5bWJvbDIuZGVmYXVsdCA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9O1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5leHBvcnRzLmRlZmF1bHQgPSB0eXBlb2YgX3N5bWJvbDIuZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiICYmIF90eXBlb2YoX2l0ZXJhdG9yMi5kZWZhdWx0KSA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmogPT09IFwidW5kZWZpbmVkXCIgPyBcInVuZGVmaW5lZFwiIDogX3R5cGVvZihvYmopO1xufSA6IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuIG9iaiAmJiB0eXBlb2YgX3N5bWJvbDIuZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gX3N5bWJvbDIuZGVmYXVsdCA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqID09PSBcInVuZGVmaW5lZFwiID8gXCJ1bmRlZmluZWRcIiA6IF90eXBlb2Yob2JqKTtcbn07IiwicmVxdWlyZSgnLi4vbW9kdWxlcy93ZWIuZG9tLml0ZXJhYmxlJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5zdHJpbmcuaXRlcmF0b3InKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vbW9kdWxlcy9jb3JlLmdldC1pdGVyYXRvcicpOyIsInJlcXVpcmUoJy4uL21vZHVsZXMvd2ViLmRvbS5pdGVyYWJsZScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYuc3RyaW5nLml0ZXJhdG9yJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL21vZHVsZXMvY29yZS5pcy1pdGVyYWJsZScpOyIsInZhciBjb3JlICA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKVxuICAsICRKU09OID0gY29yZS5KU09OIHx8IChjb3JlLkpTT04gPSB7c3RyaW5naWZ5OiBKU09OLnN0cmluZ2lmeX0pO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzdHJpbmdpZnkoaXQpeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gIHJldHVybiAkSlNPTi5zdHJpbmdpZnkuYXBwbHkoJEpTT04sIGFyZ3VtZW50cyk7XG59OyIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM2Lm9iamVjdC5kZWZpbmUtcHJvcGVydHknKTtcbnZhciAkT2JqZWN0ID0gcmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9fY29yZScpLk9iamVjdDtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoaXQsIGtleSwgZGVzYyl7XG4gIHJldHVybiAkT2JqZWN0LmRlZmluZVByb3BlcnR5KGl0LCBrZXksIGRlc2MpO1xufTsiLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNi5vYmplY3QuZnJlZXplJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKS5PYmplY3QuZnJlZXplOyIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM2Lm9iamVjdC5rZXlzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKS5PYmplY3Qua2V5czsiLCJyZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5vYmplY3QudG8tc3RyaW5nJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5zdHJpbmcuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvd2ViLmRvbS5pdGVyYWJsZScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYucHJvbWlzZScpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9tb2R1bGVzL19jb3JlJykuUHJvbWlzZTsiLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNi5zeW1ib2wnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM2Lm9iamVjdC50by1zdHJpbmcnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM3LnN5bWJvbC5hc3luYy1pdGVyYXRvcicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczcuc3ltYm9sLm9ic2VydmFibGUnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9fY29yZScpLlN5bWJvbDsiLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNi5zdHJpbmcuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvd2ViLmRvbS5pdGVyYWJsZScpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi8uLi9tb2R1bGVzL193a3MtZXh0JykuZignaXRlcmF0b3InKTsiLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgaWYodHlwZW9mIGl0ICE9ICdmdW5jdGlvbicpdGhyb3cgVHlwZUVycm9yKGl0ICsgJyBpcyBub3QgYSBmdW5jdGlvbiEnKTtcbiAgcmV0dXJuIGl0O1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCl7IC8qIGVtcHR5ICovIH07IiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCwgQ29uc3RydWN0b3IsIG5hbWUsIGZvcmJpZGRlbkZpZWxkKXtcbiAgaWYoIShpdCBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSB8fCAoZm9yYmlkZGVuRmllbGQgIT09IHVuZGVmaW5lZCAmJiBmb3JiaWRkZW5GaWVsZCBpbiBpdCkpe1xuICAgIHRocm93IFR5cGVFcnJvcihuYW1lICsgJzogaW5jb3JyZWN0IGludm9jYXRpb24hJyk7XG4gIH0gcmV0dXJuIGl0O1xufTsiLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICBpZighaXNPYmplY3QoaXQpKXRocm93IFR5cGVFcnJvcihpdCArICcgaXMgbm90IGFuIG9iamVjdCEnKTtcbiAgcmV0dXJuIGl0O1xufTsiLCIvLyBmYWxzZSAtPiBBcnJheSNpbmRleE9mXG4vLyB0cnVlICAtPiBBcnJheSNpbmNsdWRlc1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKVxuICAsIHRvTGVuZ3RoICA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpXG4gICwgdG9JbmRleCAgID0gcmVxdWlyZSgnLi9fdG8taW5kZXgnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oSVNfSU5DTFVERVMpe1xuICByZXR1cm4gZnVuY3Rpb24oJHRoaXMsIGVsLCBmcm9tSW5kZXgpe1xuICAgIHZhciBPICAgICAgPSB0b0lPYmplY3QoJHRoaXMpXG4gICAgICAsIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKVxuICAgICAgLCBpbmRleCAgPSB0b0luZGV4KGZyb21JbmRleCwgbGVuZ3RoKVxuICAgICAgLCB2YWx1ZTtcbiAgICAvLyBBcnJheSNpbmNsdWRlcyB1c2VzIFNhbWVWYWx1ZVplcm8gZXF1YWxpdHkgYWxnb3JpdGhtXG4gICAgaWYoSVNfSU5DTFVERVMgJiYgZWwgIT0gZWwpd2hpbGUobGVuZ3RoID4gaW5kZXgpe1xuICAgICAgdmFsdWUgPSBPW2luZGV4KytdO1xuICAgICAgaWYodmFsdWUgIT0gdmFsdWUpcmV0dXJuIHRydWU7XG4gICAgLy8gQXJyYXkjdG9JbmRleCBpZ25vcmVzIGhvbGVzLCBBcnJheSNpbmNsdWRlcyAtIG5vdFxuICAgIH0gZWxzZSBmb3IoO2xlbmd0aCA+IGluZGV4OyBpbmRleCsrKWlmKElTX0lOQ0xVREVTIHx8IGluZGV4IGluIE8pe1xuICAgICAgaWYoT1tpbmRleF0gPT09IGVsKXJldHVybiBJU19JTkNMVURFUyB8fCBpbmRleCB8fCAwO1xuICAgIH0gcmV0dXJuICFJU19JTkNMVURFUyAmJiAtMTtcbiAgfTtcbn07IiwiLy8gZ2V0dGluZyB0YWcgZnJvbSAxOS4xLjMuNiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nKClcbnZhciBjb2YgPSByZXF1aXJlKCcuL19jb2YnKVxuICAsIFRBRyA9IHJlcXVpcmUoJy4vX3drcycpKCd0b1N0cmluZ1RhZycpXG4gIC8vIEVTMyB3cm9uZyBoZXJlXG4gICwgQVJHID0gY29mKGZ1bmN0aW9uKCl7IHJldHVybiBhcmd1bWVudHM7IH0oKSkgPT0gJ0FyZ3VtZW50cyc7XG5cbi8vIGZhbGxiYWNrIGZvciBJRTExIFNjcmlwdCBBY2Nlc3MgRGVuaWVkIGVycm9yXG52YXIgdHJ5R2V0ID0gZnVuY3Rpb24oaXQsIGtleSl7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGl0W2tleV07XG4gIH0gY2F0Y2goZSl7IC8qIGVtcHR5ICovIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICB2YXIgTywgVCwgQjtcbiAgcmV0dXJuIGl0ID09PSB1bmRlZmluZWQgPyAnVW5kZWZpbmVkJyA6IGl0ID09PSBudWxsID8gJ051bGwnXG4gICAgLy8gQEB0b1N0cmluZ1RhZyBjYXNlXG4gICAgOiB0eXBlb2YgKFQgPSB0cnlHZXQoTyA9IE9iamVjdChpdCksIFRBRykpID09ICdzdHJpbmcnID8gVFxuICAgIC8vIGJ1aWx0aW5UYWcgY2FzZVxuICAgIDogQVJHID8gY29mKE8pXG4gICAgLy8gRVMzIGFyZ3VtZW50cyBmYWxsYmFja1xuICAgIDogKEIgPSBjb2YoTykpID09ICdPYmplY3QnICYmIHR5cGVvZiBPLmNhbGxlZSA9PSAnZnVuY3Rpb24nID8gJ0FyZ3VtZW50cycgOiBCO1xufTsiLCJ2YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKGl0KS5zbGljZSg4LCAtMSk7XG59OyIsInZhciBjb3JlID0gbW9kdWxlLmV4cG9ydHMgPSB7dmVyc2lvbjogJzIuNC4wJ307XG5pZih0eXBlb2YgX19lID09ICdudW1iZXInKV9fZSA9IGNvcmU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWYiLCIvLyBvcHRpb25hbCAvIHNpbXBsZSBjb250ZXh0IGJpbmRpbmdcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGZuLCB0aGF0LCBsZW5ndGgpe1xuICBhRnVuY3Rpb24oZm4pO1xuICBpZih0aGF0ID09PSB1bmRlZmluZWQpcmV0dXJuIGZuO1xuICBzd2l0Y2gobGVuZ3RoKXtcbiAgICBjYXNlIDE6IHJldHVybiBmdW5jdGlvbihhKXtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEpO1xuICAgIH07XG4gICAgY2FzZSAyOiByZXR1cm4gZnVuY3Rpb24oYSwgYil7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhLCBiKTtcbiAgICB9O1xuICAgIGNhc2UgMzogcmV0dXJuIGZ1bmN0aW9uKGEsIGIsIGMpe1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSwgYiwgYyk7XG4gICAgfTtcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24oLyogLi4uYXJncyAqLyl7XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoYXQsIGFyZ3VtZW50cyk7XG4gIH07XG59OyIsIi8vIDcuMi4xIFJlcXVpcmVPYmplY3RDb2VyY2libGUoYXJndW1lbnQpXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgaWYoaXQgPT0gdW5kZWZpbmVkKXRocm93IFR5cGVFcnJvcihcIkNhbid0IGNhbGwgbWV0aG9kIG9uICBcIiArIGl0KTtcbiAgcmV0dXJuIGl0O1xufTsiLCIvLyBUaGFuaydzIElFOCBmb3IgaGlzIGZ1bm55IGRlZmluZVByb3BlcnR5XG5tb2R1bGUuZXhwb3J0cyA9ICFyZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uKCl7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdhJywge2dldDogZnVuY3Rpb24oKXsgcmV0dXJuIDc7IH19KS5hICE9IDc7XG59KTsiLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKVxuICAsIGRvY3VtZW50ID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuZG9jdW1lbnRcbiAgLy8gaW4gb2xkIElFIHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFbGVtZW50IGlzICdvYmplY3QnXG4gICwgaXMgPSBpc09iamVjdChkb2N1bWVudCkgJiYgaXNPYmplY3QoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIGlzID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChpdCkgOiB7fTtcbn07IiwiLy8gSUUgOC0gZG9uJ3QgZW51bSBidWcga2V5c1xyXG5tb2R1bGUuZXhwb3J0cyA9IChcclxuICAnY29uc3RydWN0b3IsaGFzT3duUHJvcGVydHksaXNQcm90b3R5cGVPZixwcm9wZXJ0eUlzRW51bWVyYWJsZSx0b0xvY2FsZVN0cmluZyx0b1N0cmluZyx2YWx1ZU9mJ1xyXG4pLnNwbGl0KCcsJyk7IiwiLy8gYWxsIGVudW1lcmFibGUgb2JqZWN0IGtleXMsIGluY2x1ZGVzIHN5bWJvbHNcbnZhciBnZXRLZXlzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKVxuICAsIGdPUFMgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wcycpXG4gICwgcElFICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1waWUnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICB2YXIgcmVzdWx0ICAgICA9IGdldEtleXMoaXQpXG4gICAgLCBnZXRTeW1ib2xzID0gZ09QUy5mO1xuICBpZihnZXRTeW1ib2xzKXtcbiAgICB2YXIgc3ltYm9scyA9IGdldFN5bWJvbHMoaXQpXG4gICAgICAsIGlzRW51bSAgPSBwSUUuZlxuICAgICAgLCBpICAgICAgID0gMFxuICAgICAgLCBrZXk7XG4gICAgd2hpbGUoc3ltYm9scy5sZW5ndGggPiBpKWlmKGlzRW51bS5jYWxsKGl0LCBrZXkgPSBzeW1ib2xzW2krK10pKXJlc3VsdC5wdXNoKGtleSk7XG4gIH0gcmV0dXJuIHJlc3VsdDtcbn07IiwidmFyIGdsb2JhbCAgICA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpXG4gICwgY29yZSAgICAgID0gcmVxdWlyZSgnLi9fY29yZScpXG4gICwgY3R4ICAgICAgID0gcmVxdWlyZSgnLi9fY3R4JylcbiAgLCBoaWRlICAgICAgPSByZXF1aXJlKCcuL19oaWRlJylcbiAgLCBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcblxudmFyICRleHBvcnQgPSBmdW5jdGlvbih0eXBlLCBuYW1lLCBzb3VyY2Upe1xuICB2YXIgSVNfRk9SQ0VEID0gdHlwZSAmICRleHBvcnQuRlxuICAgICwgSVNfR0xPQkFMID0gdHlwZSAmICRleHBvcnQuR1xuICAgICwgSVNfU1RBVElDID0gdHlwZSAmICRleHBvcnQuU1xuICAgICwgSVNfUFJPVE8gID0gdHlwZSAmICRleHBvcnQuUFxuICAgICwgSVNfQklORCAgID0gdHlwZSAmICRleHBvcnQuQlxuICAgICwgSVNfV1JBUCAgID0gdHlwZSAmICRleHBvcnQuV1xuICAgICwgZXhwb3J0cyAgID0gSVNfR0xPQkFMID8gY29yZSA6IGNvcmVbbmFtZV0gfHwgKGNvcmVbbmFtZV0gPSB7fSlcbiAgICAsIGV4cFByb3RvICA9IGV4cG9ydHNbUFJPVE9UWVBFXVxuICAgICwgdGFyZ2V0ICAgID0gSVNfR0xPQkFMID8gZ2xvYmFsIDogSVNfU1RBVElDID8gZ2xvYmFsW25hbWVdIDogKGdsb2JhbFtuYW1lXSB8fCB7fSlbUFJPVE9UWVBFXVxuICAgICwga2V5LCBvd24sIG91dDtcbiAgaWYoSVNfR0xPQkFMKXNvdXJjZSA9IG5hbWU7XG4gIGZvcihrZXkgaW4gc291cmNlKXtcbiAgICAvLyBjb250YWlucyBpbiBuYXRpdmVcbiAgICBvd24gPSAhSVNfRk9SQ0VEICYmIHRhcmdldCAmJiB0YXJnZXRba2V5XSAhPT0gdW5kZWZpbmVkO1xuICAgIGlmKG93biAmJiBrZXkgaW4gZXhwb3J0cyljb250aW51ZTtcbiAgICAvLyBleHBvcnQgbmF0aXZlIG9yIHBhc3NlZFxuICAgIG91dCA9IG93biA/IHRhcmdldFtrZXldIDogc291cmNlW2tleV07XG4gICAgLy8gcHJldmVudCBnbG9iYWwgcG9sbHV0aW9uIGZvciBuYW1lc3BhY2VzXG4gICAgZXhwb3J0c1trZXldID0gSVNfR0xPQkFMICYmIHR5cGVvZiB0YXJnZXRba2V5XSAhPSAnZnVuY3Rpb24nID8gc291cmNlW2tleV1cbiAgICAvLyBiaW5kIHRpbWVycyB0byBnbG9iYWwgZm9yIGNhbGwgZnJvbSBleHBvcnQgY29udGV4dFxuICAgIDogSVNfQklORCAmJiBvd24gPyBjdHgob3V0LCBnbG9iYWwpXG4gICAgLy8gd3JhcCBnbG9iYWwgY29uc3RydWN0b3JzIGZvciBwcmV2ZW50IGNoYW5nZSB0aGVtIGluIGxpYnJhcnlcbiAgICA6IElTX1dSQVAgJiYgdGFyZ2V0W2tleV0gPT0gb3V0ID8gKGZ1bmN0aW9uKEMpe1xuICAgICAgdmFyIEYgPSBmdW5jdGlvbihhLCBiLCBjKXtcbiAgICAgICAgaWYodGhpcyBpbnN0YW5jZW9mIEMpe1xuICAgICAgICAgIHN3aXRjaChhcmd1bWVudHMubGVuZ3RoKXtcbiAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIG5ldyBDO1xuICAgICAgICAgICAgY2FzZSAxOiByZXR1cm4gbmV3IEMoYSk7XG4gICAgICAgICAgICBjYXNlIDI6IHJldHVybiBuZXcgQyhhLCBiKTtcbiAgICAgICAgICB9IHJldHVybiBuZXcgQyhhLCBiLCBjKTtcbiAgICAgICAgfSByZXR1cm4gQy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfTtcbiAgICAgIEZbUFJPVE9UWVBFXSA9IENbUFJPVE9UWVBFXTtcbiAgICAgIHJldHVybiBGO1xuICAgIC8vIG1ha2Ugc3RhdGljIHZlcnNpb25zIGZvciBwcm90b3R5cGUgbWV0aG9kc1xuICAgIH0pKG91dCkgOiBJU19QUk9UTyAmJiB0eXBlb2Ygb3V0ID09ICdmdW5jdGlvbicgPyBjdHgoRnVuY3Rpb24uY2FsbCwgb3V0KSA6IG91dDtcbiAgICAvLyBleHBvcnQgcHJvdG8gbWV0aG9kcyB0byBjb3JlLiVDT05TVFJVQ1RPUiUubWV0aG9kcy4lTkFNRSVcbiAgICBpZihJU19QUk9UTyl7XG4gICAgICAoZXhwb3J0cy52aXJ0dWFsIHx8IChleHBvcnRzLnZpcnR1YWwgPSB7fSkpW2tleV0gPSBvdXQ7XG4gICAgICAvLyBleHBvcnQgcHJvdG8gbWV0aG9kcyB0byBjb3JlLiVDT05TVFJVQ1RPUiUucHJvdG90eXBlLiVOQU1FJVxuICAgICAgaWYodHlwZSAmICRleHBvcnQuUiAmJiBleHBQcm90byAmJiAhZXhwUHJvdG9ba2V5XSloaWRlKGV4cFByb3RvLCBrZXksIG91dCk7XG4gICAgfVxuICB9XG59O1xuLy8gdHlwZSBiaXRtYXBcbiRleHBvcnQuRiA9IDE7ICAgLy8gZm9yY2VkXG4kZXhwb3J0LkcgPSAyOyAgIC8vIGdsb2JhbFxuJGV4cG9ydC5TID0gNDsgICAvLyBzdGF0aWNcbiRleHBvcnQuUCA9IDg7ICAgLy8gcHJvdG9cbiRleHBvcnQuQiA9IDE2OyAgLy8gYmluZFxuJGV4cG9ydC5XID0gMzI7ICAvLyB3cmFwXG4kZXhwb3J0LlUgPSA2NDsgIC8vIHNhZmVcbiRleHBvcnQuUiA9IDEyODsgLy8gcmVhbCBwcm90byBtZXRob2QgZm9yIGBsaWJyYXJ5YCBcbm1vZHVsZS5leHBvcnRzID0gJGV4cG9ydDsiLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGV4ZWMpe1xuICB0cnkge1xuICAgIHJldHVybiAhIWV4ZWMoKTtcbiAgfSBjYXRjaChlKXtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufTsiLCJ2YXIgY3R4ICAgICAgICAgPSByZXF1aXJlKCcuL19jdHgnKVxuICAsIGNhbGwgICAgICAgID0gcmVxdWlyZSgnLi9faXRlci1jYWxsJylcbiAgLCBpc0FycmF5SXRlciA9IHJlcXVpcmUoJy4vX2lzLWFycmF5LWl0ZXInKVxuICAsIGFuT2JqZWN0ICAgID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0JylcbiAgLCB0b0xlbmd0aCAgICA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpXG4gICwgZ2V0SXRlckZuICAgPSByZXF1aXJlKCcuL2NvcmUuZ2V0LWl0ZXJhdG9yLW1ldGhvZCcpXG4gICwgQlJFQUsgICAgICAgPSB7fVxuICAsIFJFVFVSTiAgICAgID0ge307XG52YXIgZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXRlcmFibGUsIGVudHJpZXMsIGZuLCB0aGF0LCBJVEVSQVRPUil7XG4gIHZhciBpdGVyRm4gPSBJVEVSQVRPUiA/IGZ1bmN0aW9uKCl7IHJldHVybiBpdGVyYWJsZTsgfSA6IGdldEl0ZXJGbihpdGVyYWJsZSlcbiAgICAsIGYgICAgICA9IGN0eChmbiwgdGhhdCwgZW50cmllcyA/IDIgOiAxKVxuICAgICwgaW5kZXggID0gMFxuICAgICwgbGVuZ3RoLCBzdGVwLCBpdGVyYXRvciwgcmVzdWx0O1xuICBpZih0eXBlb2YgaXRlckZuICE9ICdmdW5jdGlvbicpdGhyb3cgVHlwZUVycm9yKGl0ZXJhYmxlICsgJyBpcyBub3QgaXRlcmFibGUhJyk7XG4gIC8vIGZhc3QgY2FzZSBmb3IgYXJyYXlzIHdpdGggZGVmYXVsdCBpdGVyYXRvclxuICBpZihpc0FycmF5SXRlcihpdGVyRm4pKWZvcihsZW5ndGggPSB0b0xlbmd0aChpdGVyYWJsZS5sZW5ndGgpOyBsZW5ndGggPiBpbmRleDsgaW5kZXgrKyl7XG4gICAgcmVzdWx0ID0gZW50cmllcyA/IGYoYW5PYmplY3Qoc3RlcCA9IGl0ZXJhYmxlW2luZGV4XSlbMF0sIHN0ZXBbMV0pIDogZihpdGVyYWJsZVtpbmRleF0pO1xuICAgIGlmKHJlc3VsdCA9PT0gQlJFQUsgfHwgcmVzdWx0ID09PSBSRVRVUk4pcmV0dXJuIHJlc3VsdDtcbiAgfSBlbHNlIGZvcihpdGVyYXRvciA9IGl0ZXJGbi5jYWxsKGl0ZXJhYmxlKTsgIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lOyApe1xuICAgIHJlc3VsdCA9IGNhbGwoaXRlcmF0b3IsIGYsIHN0ZXAudmFsdWUsIGVudHJpZXMpO1xuICAgIGlmKHJlc3VsdCA9PT0gQlJFQUsgfHwgcmVzdWx0ID09PSBSRVRVUk4pcmV0dXJuIHJlc3VsdDtcbiAgfVxufTtcbmV4cG9ydHMuQlJFQUsgID0gQlJFQUs7XG5leHBvcnRzLlJFVFVSTiA9IFJFVFVSTjsiLCIvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvODYjaXNzdWVjb21tZW50LTExNTc1OTAyOFxudmFyIGdsb2JhbCA9IG1vZHVsZS5leHBvcnRzID0gdHlwZW9mIHdpbmRvdyAhPSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuTWF0aCA9PSBNYXRoXG4gID8gd2luZG93IDogdHlwZW9mIHNlbGYgIT0gJ3VuZGVmaW5lZCcgJiYgc2VsZi5NYXRoID09IE1hdGggPyBzZWxmIDogRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcbmlmKHR5cGVvZiBfX2cgPT0gJ251bWJlcicpX19nID0gZ2xvYmFsOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmIiwidmFyIGhhc093blByb3BlcnR5ID0ge30uaGFzT3duUHJvcGVydHk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0LCBrZXkpe1xuICByZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChpdCwga2V5KTtcbn07IiwidmFyIGRQICAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKVxuICAsIGNyZWF0ZURlc2MgPSByZXF1aXJlKCcuL19wcm9wZXJ0eS1kZXNjJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgPyBmdW5jdGlvbihvYmplY3QsIGtleSwgdmFsdWUpe1xuICByZXR1cm4gZFAuZihvYmplY3QsIGtleSwgY3JlYXRlRGVzYygxLCB2YWx1ZSkpO1xufSA6IGZ1bmN0aW9uKG9iamVjdCwga2V5LCB2YWx1ZSl7XG4gIG9iamVjdFtrZXldID0gdmFsdWU7XG4gIHJldHVybiBvYmplY3Q7XG59OyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuZG9jdW1lbnQgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OyIsIm1vZHVsZS5leHBvcnRzID0gIXJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgJiYgIXJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24oKXtcclxuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlcXVpcmUoJy4vX2RvbS1jcmVhdGUnKSgnZGl2JyksICdhJywge2dldDogZnVuY3Rpb24oKXsgcmV0dXJuIDc7IH19KS5hICE9IDc7XHJcbn0pOyIsIi8vIGZhc3QgYXBwbHksIGh0dHA6Ly9qc3BlcmYubG5raXQuY29tL2Zhc3QtYXBwbHkvNVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihmbiwgYXJncywgdGhhdCl7XG4gIHZhciB1biA9IHRoYXQgPT09IHVuZGVmaW5lZDtcbiAgc3dpdGNoKGFyZ3MubGVuZ3RoKXtcbiAgICBjYXNlIDA6IHJldHVybiB1biA/IGZuKClcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCk7XG4gICAgY2FzZSAxOiByZXR1cm4gdW4gPyBmbihhcmdzWzBdKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0LCBhcmdzWzBdKTtcbiAgICBjYXNlIDI6IHJldHVybiB1biA/IGZuKGFyZ3NbMF0sIGFyZ3NbMV0pXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQsIGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgIGNhc2UgMzogcmV0dXJuIHVuID8gZm4oYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSlcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCwgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gICAgY2FzZSA0OiByZXR1cm4gdW4gPyBmbihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0LCBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdKTtcbiAgfSByZXR1cm4gICAgICAgICAgICAgIGZuLmFwcGx5KHRoYXQsIGFyZ3MpO1xufTsiLCIvLyBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIGFuZCBub24tZW51bWVyYWJsZSBvbGQgVjggc3RyaW5nc1xudmFyIGNvZiA9IHJlcXVpcmUoJy4vX2NvZicpO1xubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QoJ3onKS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgwKSA/IE9iamVjdCA6IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIGNvZihpdCkgPT0gJ1N0cmluZycgPyBpdC5zcGxpdCgnJykgOiBPYmplY3QoaXQpO1xufTsiLCIvLyBjaGVjayBvbiBkZWZhdWx0IEFycmF5IGl0ZXJhdG9yXG52YXIgSXRlcmF0b3JzICA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpXG4gICwgSVRFUkFUT1IgICA9IHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpXG4gICwgQXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiBpdCAhPT0gdW5kZWZpbmVkICYmIChJdGVyYXRvcnMuQXJyYXkgPT09IGl0IHx8IEFycmF5UHJvdG9bSVRFUkFUT1JdID09PSBpdCk7XG59OyIsIi8vIDcuMi4yIElzQXJyYXkoYXJndW1lbnQpXG52YXIgY29mID0gcmVxdWlyZSgnLi9fY29mJyk7XG5tb2R1bGUuZXhwb3J0cyA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gaXNBcnJheShhcmcpe1xuICByZXR1cm4gY29mKGFyZykgPT0gJ0FycmF5Jztcbn07IiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiB0eXBlb2YgaXQgPT09ICdvYmplY3QnID8gaXQgIT09IG51bGwgOiB0eXBlb2YgaXQgPT09ICdmdW5jdGlvbic7XG59OyIsIi8vIGNhbGwgc29tZXRoaW5nIG9uIGl0ZXJhdG9yIHN0ZXAgd2l0aCBzYWZlIGNsb3Npbmcgb24gZXJyb3JcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdGVyYXRvciwgZm4sIHZhbHVlLCBlbnRyaWVzKXtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZW50cmllcyA/IGZuKGFuT2JqZWN0KHZhbHVlKVswXSwgdmFsdWVbMV0pIDogZm4odmFsdWUpO1xuICAvLyA3LjQuNiBJdGVyYXRvckNsb3NlKGl0ZXJhdG9yLCBjb21wbGV0aW9uKVxuICB9IGNhdGNoKGUpe1xuICAgIHZhciByZXQgPSBpdGVyYXRvclsncmV0dXJuJ107XG4gICAgaWYocmV0ICE9PSB1bmRlZmluZWQpYW5PYmplY3QocmV0LmNhbGwoaXRlcmF0b3IpKTtcbiAgICB0aHJvdyBlO1xuICB9XG59OyIsIid1c2Ugc3RyaWN0JztcbnZhciBjcmVhdGUgICAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1jcmVhdGUnKVxuICAsIGRlc2NyaXB0b3IgICAgID0gcmVxdWlyZSgnLi9fcHJvcGVydHktZGVzYycpXG4gICwgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpXG4gICwgSXRlcmF0b3JQcm90b3R5cGUgPSB7fTtcblxuLy8gMjUuMS4yLjEuMSAlSXRlcmF0b3JQcm90b3R5cGUlW0BAaXRlcmF0b3JdKClcbnJlcXVpcmUoJy4vX2hpZGUnKShJdGVyYXRvclByb3RvdHlwZSwgcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyksIGZ1bmN0aW9uKCl7IHJldHVybiB0aGlzOyB9KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCl7XG4gIENvbnN0cnVjdG9yLnByb3RvdHlwZSA9IGNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSwge25leHQ6IGRlc2NyaXB0b3IoMSwgbmV4dCl9KTtcbiAgc2V0VG9TdHJpbmdUYWcoQ29uc3RydWN0b3IsIE5BTUUgKyAnIEl0ZXJhdG9yJyk7XG59OyIsIid1c2Ugc3RyaWN0JztcbnZhciBMSUJSQVJZICAgICAgICA9IHJlcXVpcmUoJy4vX2xpYnJhcnknKVxuICAsICRleHBvcnQgICAgICAgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCByZWRlZmluZSAgICAgICA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJylcbiAgLCBoaWRlICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2hpZGUnKVxuICAsIGhhcyAgICAgICAgICAgID0gcmVxdWlyZSgnLi9faGFzJylcbiAgLCBJdGVyYXRvcnMgICAgICA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpXG4gICwgJGl0ZXJDcmVhdGUgICAgPSByZXF1aXJlKCcuL19pdGVyLWNyZWF0ZScpXG4gICwgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpXG4gICwgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuL19vYmplY3QtZ3BvJylcbiAgLCBJVEVSQVRPUiAgICAgICA9IHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpXG4gICwgQlVHR1kgICAgICAgICAgPSAhKFtdLmtleXMgJiYgJ25leHQnIGluIFtdLmtleXMoKSkgLy8gU2FmYXJpIGhhcyBidWdneSBpdGVyYXRvcnMgdy9vIGBuZXh0YFxuICAsIEZGX0lURVJBVE9SICAgID0gJ0BAaXRlcmF0b3InXG4gICwgS0VZUyAgICAgICAgICAgPSAna2V5cydcbiAgLCBWQUxVRVMgICAgICAgICA9ICd2YWx1ZXMnO1xuXG52YXIgcmV0dXJuVGhpcyA9IGZ1bmN0aW9uKCl7IHJldHVybiB0aGlzOyB9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKEJhc2UsIE5BTUUsIENvbnN0cnVjdG9yLCBuZXh0LCBERUZBVUxULCBJU19TRVQsIEZPUkNFRCl7XG4gICRpdGVyQ3JlYXRlKENvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KTtcbiAgdmFyIGdldE1ldGhvZCA9IGZ1bmN0aW9uKGtpbmQpe1xuICAgIGlmKCFCVUdHWSAmJiBraW5kIGluIHByb3RvKXJldHVybiBwcm90b1traW5kXTtcbiAgICBzd2l0Y2goa2luZCl7XG4gICAgICBjYXNlIEtFWVM6IHJldHVybiBmdW5jdGlvbiBrZXlzKCl7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG4gICAgICBjYXNlIFZBTFVFUzogcmV0dXJuIGZ1bmN0aW9uIHZhbHVlcygpeyByZXR1cm4gbmV3IENvbnN0cnVjdG9yKHRoaXMsIGtpbmQpOyB9O1xuICAgIH0gcmV0dXJuIGZ1bmN0aW9uIGVudHJpZXMoKXsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcbiAgfTtcbiAgdmFyIFRBRyAgICAgICAgPSBOQU1FICsgJyBJdGVyYXRvcidcbiAgICAsIERFRl9WQUxVRVMgPSBERUZBVUxUID09IFZBTFVFU1xuICAgICwgVkFMVUVTX0JVRyA9IGZhbHNlXG4gICAgLCBwcm90byAgICAgID0gQmFzZS5wcm90b3R5cGVcbiAgICAsICRuYXRpdmUgICAgPSBwcm90b1tJVEVSQVRPUl0gfHwgcHJvdG9bRkZfSVRFUkFUT1JdIHx8IERFRkFVTFQgJiYgcHJvdG9bREVGQVVMVF1cbiAgICAsICRkZWZhdWx0ICAgPSAkbmF0aXZlIHx8IGdldE1ldGhvZChERUZBVUxUKVxuICAgICwgJGVudHJpZXMgICA9IERFRkFVTFQgPyAhREVGX1ZBTFVFUyA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKCdlbnRyaWVzJykgOiB1bmRlZmluZWRcbiAgICAsICRhbnlOYXRpdmUgPSBOQU1FID09ICdBcnJheScgPyBwcm90by5lbnRyaWVzIHx8ICRuYXRpdmUgOiAkbmF0aXZlXG4gICAgLCBtZXRob2RzLCBrZXksIEl0ZXJhdG9yUHJvdG90eXBlO1xuICAvLyBGaXggbmF0aXZlXG4gIGlmKCRhbnlOYXRpdmUpe1xuICAgIEl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG90eXBlT2YoJGFueU5hdGl2ZS5jYWxsKG5ldyBCYXNlKSk7XG4gICAgaWYoSXRlcmF0b3JQcm90b3R5cGUgIT09IE9iamVjdC5wcm90b3R5cGUpe1xuICAgICAgLy8gU2V0IEBAdG9TdHJpbmdUYWcgdG8gbmF0aXZlIGl0ZXJhdG9yc1xuICAgICAgc2V0VG9TdHJpbmdUYWcoSXRlcmF0b3JQcm90b3R5cGUsIFRBRywgdHJ1ZSk7XG4gICAgICAvLyBmaXggZm9yIHNvbWUgb2xkIGVuZ2luZXNcbiAgICAgIGlmKCFMSUJSQVJZICYmICFoYXMoSXRlcmF0b3JQcm90b3R5cGUsIElURVJBVE9SKSloaWRlKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgcmV0dXJuVGhpcyk7XG4gICAgfVxuICB9XG4gIC8vIGZpeCBBcnJheSN7dmFsdWVzLCBAQGl0ZXJhdG9yfS5uYW1lIGluIFY4IC8gRkZcbiAgaWYoREVGX1ZBTFVFUyAmJiAkbmF0aXZlICYmICRuYXRpdmUubmFtZSAhPT0gVkFMVUVTKXtcbiAgICBWQUxVRVNfQlVHID0gdHJ1ZTtcbiAgICAkZGVmYXVsdCA9IGZ1bmN0aW9uIHZhbHVlcygpeyByZXR1cm4gJG5hdGl2ZS5jYWxsKHRoaXMpOyB9O1xuICB9XG4gIC8vIERlZmluZSBpdGVyYXRvclxuICBpZigoIUxJQlJBUlkgfHwgRk9SQ0VEKSAmJiAoQlVHR1kgfHwgVkFMVUVTX0JVRyB8fCAhcHJvdG9bSVRFUkFUT1JdKSl7XG4gICAgaGlkZShwcm90bywgSVRFUkFUT1IsICRkZWZhdWx0KTtcbiAgfVxuICAvLyBQbHVnIGZvciBsaWJyYXJ5XG4gIEl0ZXJhdG9yc1tOQU1FXSA9ICRkZWZhdWx0O1xuICBJdGVyYXRvcnNbVEFHXSAgPSByZXR1cm5UaGlzO1xuICBpZihERUZBVUxUKXtcbiAgICBtZXRob2RzID0ge1xuICAgICAgdmFsdWVzOiAgREVGX1ZBTFVFUyA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKFZBTFVFUyksXG4gICAgICBrZXlzOiAgICBJU19TRVQgICAgID8gJGRlZmF1bHQgOiBnZXRNZXRob2QoS0VZUyksXG4gICAgICBlbnRyaWVzOiAkZW50cmllc1xuICAgIH07XG4gICAgaWYoRk9SQ0VEKWZvcihrZXkgaW4gbWV0aG9kcyl7XG4gICAgICBpZighKGtleSBpbiBwcm90bykpcmVkZWZpbmUocHJvdG8sIGtleSwgbWV0aG9kc1trZXldKTtcbiAgICB9IGVsc2UgJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAoQlVHR1kgfHwgVkFMVUVTX0JVRyksIE5BTUUsIG1ldGhvZHMpO1xuICB9XG4gIHJldHVybiBtZXRob2RzO1xufTsiLCJ2YXIgSVRFUkFUT1IgICAgID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJylcbiAgLCBTQUZFX0NMT1NJTkcgPSBmYWxzZTtcblxudHJ5IHtcbiAgdmFyIHJpdGVyID0gWzddW0lURVJBVE9SXSgpO1xuICByaXRlclsncmV0dXJuJ10gPSBmdW5jdGlvbigpeyBTQUZFX0NMT1NJTkcgPSB0cnVlOyB9O1xuICBBcnJheS5mcm9tKHJpdGVyLCBmdW5jdGlvbigpeyB0aHJvdyAyOyB9KTtcbn0gY2F0Y2goZSl7IC8qIGVtcHR5ICovIH1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihleGVjLCBza2lwQ2xvc2luZyl7XG4gIGlmKCFza2lwQ2xvc2luZyAmJiAhU0FGRV9DTE9TSU5HKXJldHVybiBmYWxzZTtcbiAgdmFyIHNhZmUgPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICB2YXIgYXJyICA9IFs3XVxuICAgICAgLCBpdGVyID0gYXJyW0lURVJBVE9SXSgpO1xuICAgIGl0ZXIubmV4dCA9IGZ1bmN0aW9uKCl7IHJldHVybiB7ZG9uZTogc2FmZSA9IHRydWV9OyB9O1xuICAgIGFycltJVEVSQVRPUl0gPSBmdW5jdGlvbigpeyByZXR1cm4gaXRlcjsgfTtcbiAgICBleGVjKGFycik7XG4gIH0gY2F0Y2goZSl7IC8qIGVtcHR5ICovIH1cbiAgcmV0dXJuIHNhZmU7XG59OyIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZG9uZSwgdmFsdWUpe1xuICByZXR1cm4ge3ZhbHVlOiB2YWx1ZSwgZG9uZTogISFkb25lfTtcbn07IiwibW9kdWxlLmV4cG9ydHMgPSB7fTsiLCJ2YXIgZ2V0S2V5cyAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKVxuICAsIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24ob2JqZWN0LCBlbCl7XG4gIHZhciBPICAgICAgPSB0b0lPYmplY3Qob2JqZWN0KVxuICAgICwga2V5cyAgID0gZ2V0S2V5cyhPKVxuICAgICwgbGVuZ3RoID0ga2V5cy5sZW5ndGhcbiAgICAsIGluZGV4ICA9IDBcbiAgICAsIGtleTtcbiAgd2hpbGUobGVuZ3RoID4gaW5kZXgpaWYoT1trZXkgPSBrZXlzW2luZGV4KytdXSA9PT0gZWwpcmV0dXJuIGtleTtcbn07IiwibW9kdWxlLmV4cG9ydHMgPSB0cnVlOyIsInZhciBNRVRBICAgICA9IHJlcXVpcmUoJy4vX3VpZCcpKCdtZXRhJylcbiAgLCBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpXG4gICwgaGFzICAgICAgPSByZXF1aXJlKCcuL19oYXMnKVxuICAsIHNldERlc2MgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZlxuICAsIGlkICAgICAgID0gMDtcbnZhciBpc0V4dGVuc2libGUgPSBPYmplY3QuaXNFeHRlbnNpYmxlIHx8IGZ1bmN0aW9uKCl7XG4gIHJldHVybiB0cnVlO1xufTtcbnZhciBGUkVFWkUgPSAhcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbigpe1xuICByZXR1cm4gaXNFeHRlbnNpYmxlKE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyh7fSkpO1xufSk7XG52YXIgc2V0TWV0YSA9IGZ1bmN0aW9uKGl0KXtcbiAgc2V0RGVzYyhpdCwgTUVUQSwge3ZhbHVlOiB7XG4gICAgaTogJ08nICsgKytpZCwgLy8gb2JqZWN0IElEXG4gICAgdzoge30gICAgICAgICAgLy8gd2VhayBjb2xsZWN0aW9ucyBJRHNcbiAgfX0pO1xufTtcbnZhciBmYXN0S2V5ID0gZnVuY3Rpb24oaXQsIGNyZWF0ZSl7XG4gIC8vIHJldHVybiBwcmltaXRpdmUgd2l0aCBwcmVmaXhcbiAgaWYoIWlzT2JqZWN0KGl0KSlyZXR1cm4gdHlwZW9mIGl0ID09ICdzeW1ib2wnID8gaXQgOiAodHlwZW9mIGl0ID09ICdzdHJpbmcnID8gJ1MnIDogJ1AnKSArIGl0O1xuICBpZighaGFzKGl0LCBNRVRBKSl7XG4gICAgLy8gY2FuJ3Qgc2V0IG1ldGFkYXRhIHRvIHVuY2F1Z2h0IGZyb3plbiBvYmplY3RcbiAgICBpZighaXNFeHRlbnNpYmxlKGl0KSlyZXR1cm4gJ0YnO1xuICAgIC8vIG5vdCBuZWNlc3NhcnkgdG8gYWRkIG1ldGFkYXRhXG4gICAgaWYoIWNyZWF0ZSlyZXR1cm4gJ0UnO1xuICAgIC8vIGFkZCBtaXNzaW5nIG1ldGFkYXRhXG4gICAgc2V0TWV0YShpdCk7XG4gIC8vIHJldHVybiBvYmplY3QgSURcbiAgfSByZXR1cm4gaXRbTUVUQV0uaTtcbn07XG52YXIgZ2V0V2VhayA9IGZ1bmN0aW9uKGl0LCBjcmVhdGUpe1xuICBpZighaGFzKGl0LCBNRVRBKSl7XG4gICAgLy8gY2FuJ3Qgc2V0IG1ldGFkYXRhIHRvIHVuY2F1Z2h0IGZyb3plbiBvYmplY3RcbiAgICBpZighaXNFeHRlbnNpYmxlKGl0KSlyZXR1cm4gdHJ1ZTtcbiAgICAvLyBub3QgbmVjZXNzYXJ5IHRvIGFkZCBtZXRhZGF0YVxuICAgIGlmKCFjcmVhdGUpcmV0dXJuIGZhbHNlO1xuICAgIC8vIGFkZCBtaXNzaW5nIG1ldGFkYXRhXG4gICAgc2V0TWV0YShpdCk7XG4gIC8vIHJldHVybiBoYXNoIHdlYWsgY29sbGVjdGlvbnMgSURzXG4gIH0gcmV0dXJuIGl0W01FVEFdLnc7XG59O1xuLy8gYWRkIG1ldGFkYXRhIG9uIGZyZWV6ZS1mYW1pbHkgbWV0aG9kcyBjYWxsaW5nXG52YXIgb25GcmVlemUgPSBmdW5jdGlvbihpdCl7XG4gIGlmKEZSRUVaRSAmJiBtZXRhLk5FRUQgJiYgaXNFeHRlbnNpYmxlKGl0KSAmJiAhaGFzKGl0LCBNRVRBKSlzZXRNZXRhKGl0KTtcbiAgcmV0dXJuIGl0O1xufTtcbnZhciBtZXRhID0gbW9kdWxlLmV4cG9ydHMgPSB7XG4gIEtFWTogICAgICBNRVRBLFxuICBORUVEOiAgICAgZmFsc2UsXG4gIGZhc3RLZXk6ICBmYXN0S2V5LFxuICBnZXRXZWFrOiAgZ2V0V2VhayxcbiAgb25GcmVlemU6IG9uRnJlZXplXG59OyIsInZhciBnbG9iYWwgICAgPSByZXF1aXJlKCcuL19nbG9iYWwnKVxuICAsIG1hY3JvdGFzayA9IHJlcXVpcmUoJy4vX3Rhc2snKS5zZXRcbiAgLCBPYnNlcnZlciAgPSBnbG9iYWwuTXV0YXRpb25PYnNlcnZlciB8fCBnbG9iYWwuV2ViS2l0TXV0YXRpb25PYnNlcnZlclxuICAsIHByb2Nlc3MgICA9IGdsb2JhbC5wcm9jZXNzXG4gICwgUHJvbWlzZSAgID0gZ2xvYmFsLlByb21pc2VcbiAgLCBpc05vZGUgICAgPSByZXF1aXJlKCcuL19jb2YnKShwcm9jZXNzKSA9PSAncHJvY2Vzcyc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKXtcbiAgdmFyIGhlYWQsIGxhc3QsIG5vdGlmeTtcblxuICB2YXIgZmx1c2ggPSBmdW5jdGlvbigpe1xuICAgIHZhciBwYXJlbnQsIGZuO1xuICAgIGlmKGlzTm9kZSAmJiAocGFyZW50ID0gcHJvY2Vzcy5kb21haW4pKXBhcmVudC5leGl0KCk7XG4gICAgd2hpbGUoaGVhZCl7XG4gICAgICBmbiAgID0gaGVhZC5mbjtcbiAgICAgIGhlYWQgPSBoZWFkLm5leHQ7XG4gICAgICB0cnkge1xuICAgICAgICBmbigpO1xuICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgaWYoaGVhZClub3RpZnkoKTtcbiAgICAgICAgZWxzZSBsYXN0ID0gdW5kZWZpbmVkO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH0gbGFzdCA9IHVuZGVmaW5lZDtcbiAgICBpZihwYXJlbnQpcGFyZW50LmVudGVyKCk7XG4gIH07XG5cbiAgLy8gTm9kZS5qc1xuICBpZihpc05vZGUpe1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uKCl7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGZsdXNoKTtcbiAgICB9O1xuICAvLyBicm93c2VycyB3aXRoIE11dGF0aW9uT2JzZXJ2ZXJcbiAgfSBlbHNlIGlmKE9ic2VydmVyKXtcbiAgICB2YXIgdG9nZ2xlID0gdHJ1ZVxuICAgICAgLCBub2RlICAgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnJyk7XG4gICAgbmV3IE9ic2VydmVyKGZsdXNoKS5vYnNlcnZlKG5vZGUsIHtjaGFyYWN0ZXJEYXRhOiB0cnVlfSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24oKXtcbiAgICAgIG5vZGUuZGF0YSA9IHRvZ2dsZSA9ICF0b2dnbGU7XG4gICAgfTtcbiAgLy8gZW52aXJvbm1lbnRzIHdpdGggbWF5YmUgbm9uLWNvbXBsZXRlbHkgY29ycmVjdCwgYnV0IGV4aXN0ZW50IFByb21pc2VcbiAgfSBlbHNlIGlmKFByb21pc2UgJiYgUHJvbWlzZS5yZXNvbHZlKXtcbiAgICB2YXIgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uKCl7XG4gICAgICBwcm9taXNlLnRoZW4oZmx1c2gpO1xuICAgIH07XG4gIC8vIGZvciBvdGhlciBlbnZpcm9ubWVudHMgLSBtYWNyb3Rhc2sgYmFzZWQgb246XG4gIC8vIC0gc2V0SW1tZWRpYXRlXG4gIC8vIC0gTWVzc2FnZUNoYW5uZWxcbiAgLy8gLSB3aW5kb3cucG9zdE1lc3NhZ1xuICAvLyAtIG9ucmVhZHlzdGF0ZWNoYW5nZVxuICAvLyAtIHNldFRpbWVvdXRcbiAgfSBlbHNlIHtcbiAgICBub3RpZnkgPSBmdW5jdGlvbigpe1xuICAgICAgLy8gc3RyYW5nZSBJRSArIHdlYnBhY2sgZGV2IHNlcnZlciBidWcgLSB1c2UgLmNhbGwoZ2xvYmFsKVxuICAgICAgbWFjcm90YXNrLmNhbGwoZ2xvYmFsLCBmbHVzaCk7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbihmbil7XG4gICAgdmFyIHRhc2sgPSB7Zm46IGZuLCBuZXh0OiB1bmRlZmluZWR9O1xuICAgIGlmKGxhc3QpbGFzdC5uZXh0ID0gdGFzaztcbiAgICBpZighaGVhZCl7XG4gICAgICBoZWFkID0gdGFzaztcbiAgICAgIG5vdGlmeSgpO1xuICAgIH0gbGFzdCA9IHRhc2s7XG4gIH07XG59OyIsIi8vIDE5LjEuMi4yIC8gMTUuMi4zLjUgT2JqZWN0LmNyZWF0ZShPIFssIFByb3BlcnRpZXNdKVxyXG52YXIgYW5PYmplY3QgICAgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKVxyXG4gICwgZFBzICAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZHBzJylcclxuICAsIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi9fZW51bS1idWcta2V5cycpXHJcbiAgLCBJRV9QUk9UTyAgICA9IHJlcXVpcmUoJy4vX3NoYXJlZC1rZXknKSgnSUVfUFJPVE8nKVxyXG4gICwgRW1wdHkgICAgICAgPSBmdW5jdGlvbigpeyAvKiBlbXB0eSAqLyB9XHJcbiAgLCBQUk9UT1RZUEUgICA9ICdwcm90b3R5cGUnO1xyXG5cclxuLy8gQ3JlYXRlIG9iamVjdCB3aXRoIGZha2UgYG51bGxgIHByb3RvdHlwZTogdXNlIGlmcmFtZSBPYmplY3Qgd2l0aCBjbGVhcmVkIHByb3RvdHlwZVxyXG52YXIgY3JlYXRlRGljdCA9IGZ1bmN0aW9uKCl7XHJcbiAgLy8gVGhyYXNoLCB3YXN0ZSBhbmQgc29kb215OiBJRSBHQyBidWdcclxuICB2YXIgaWZyYW1lID0gcmVxdWlyZSgnLi9fZG9tLWNyZWF0ZScpKCdpZnJhbWUnKVxyXG4gICAgLCBpICAgICAgPSBlbnVtQnVnS2V5cy5sZW5ndGhcclxuICAgICwgZ3QgICAgID0gJz4nXHJcbiAgICAsIGlmcmFtZURvY3VtZW50O1xyXG4gIGlmcmFtZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gIHJlcXVpcmUoJy4vX2h0bWwnKS5hcHBlbmRDaGlsZChpZnJhbWUpO1xyXG4gIGlmcmFtZS5zcmMgPSAnamF2YXNjcmlwdDonOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNjcmlwdC11cmxcclxuICAvLyBjcmVhdGVEaWN0ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuT2JqZWN0O1xyXG4gIC8vIGh0bWwucmVtb3ZlQ2hpbGQoaWZyYW1lKTtcclxuICBpZnJhbWVEb2N1bWVudCA9IGlmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50O1xyXG4gIGlmcmFtZURvY3VtZW50Lm9wZW4oKTtcclxuICBpZnJhbWVEb2N1bWVudC53cml0ZSgnPHNjcmlwdD5kb2N1bWVudC5GPU9iamVjdDwvc2NyaXB0JyArIGd0KTtcclxuICBpZnJhbWVEb2N1bWVudC5jbG9zZSgpO1xyXG4gIGNyZWF0ZURpY3QgPSBpZnJhbWVEb2N1bWVudC5GO1xyXG4gIHdoaWxlKGktLSlkZWxldGUgY3JlYXRlRGljdFtQUk9UT1RZUEVdW2VudW1CdWdLZXlzW2ldXTtcclxuICByZXR1cm4gY3JlYXRlRGljdCgpO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuY3JlYXRlIHx8IGZ1bmN0aW9uIGNyZWF0ZShPLCBQcm9wZXJ0aWVzKXtcclxuICB2YXIgcmVzdWx0O1xyXG4gIGlmKE8gIT09IG51bGwpe1xyXG4gICAgRW1wdHlbUFJPVE9UWVBFXSA9IGFuT2JqZWN0KE8pO1xyXG4gICAgcmVzdWx0ID0gbmV3IEVtcHR5O1xyXG4gICAgRW1wdHlbUFJPVE9UWVBFXSA9IG51bGw7XHJcbiAgICAvLyBhZGQgXCJfX3Byb3RvX19cIiBmb3IgT2JqZWN0LmdldFByb3RvdHlwZU9mIHBvbHlmaWxsXHJcbiAgICByZXN1bHRbSUVfUFJPVE9dID0gTztcclxuICB9IGVsc2UgcmVzdWx0ID0gY3JlYXRlRGljdCgpO1xyXG4gIHJldHVybiBQcm9wZXJ0aWVzID09PSB1bmRlZmluZWQgPyByZXN1bHQgOiBkUHMocmVzdWx0LCBQcm9wZXJ0aWVzKTtcclxufTsiLCJ2YXIgYW5PYmplY3QgICAgICAgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKVxuICAsIElFOF9ET01fREVGSU5FID0gcmVxdWlyZSgnLi9faWU4LWRvbS1kZWZpbmUnKVxuICAsIHRvUHJpbWl0aXZlICAgID0gcmVxdWlyZSgnLi9fdG8tcHJpbWl0aXZlJylcbiAgLCBkUCAgICAgICAgICAgICA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcblxuZXhwb3J0cy5mID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpe1xuICBhbk9iamVjdChPKTtcbiAgUCA9IHRvUHJpbWl0aXZlKFAsIHRydWUpO1xuICBhbk9iamVjdChBdHRyaWJ1dGVzKTtcbiAgaWYoSUU4X0RPTV9ERUZJTkUpdHJ5IHtcbiAgICByZXR1cm4gZFAoTywgUCwgQXR0cmlidXRlcyk7XG4gIH0gY2F0Y2goZSl7IC8qIGVtcHR5ICovIH1cbiAgaWYoJ2dldCcgaW4gQXR0cmlidXRlcyB8fCAnc2V0JyBpbiBBdHRyaWJ1dGVzKXRocm93IFR5cGVFcnJvcignQWNjZXNzb3JzIG5vdCBzdXBwb3J0ZWQhJyk7XG4gIGlmKCd2YWx1ZScgaW4gQXR0cmlidXRlcylPW1BdID0gQXR0cmlidXRlcy52YWx1ZTtcbiAgcmV0dXJuIE87XG59OyIsInZhciBkUCAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpXHJcbiAgLCBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpXHJcbiAgLCBnZXRLZXlzICA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzJyk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXMoTywgUHJvcGVydGllcyl7XHJcbiAgYW5PYmplY3QoTyk7XHJcbiAgdmFyIGtleXMgICA9IGdldEtleXMoUHJvcGVydGllcylcclxuICAgICwgbGVuZ3RoID0ga2V5cy5sZW5ndGhcclxuICAgICwgaSA9IDBcclxuICAgICwgUDtcclxuICB3aGlsZShsZW5ndGggPiBpKWRQLmYoTywgUCA9IGtleXNbaSsrXSwgUHJvcGVydGllc1tQXSk7XHJcbiAgcmV0dXJuIE87XHJcbn07IiwidmFyIHBJRSAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LXBpZScpXHJcbiAgLCBjcmVhdGVEZXNjICAgICA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKVxyXG4gICwgdG9JT2JqZWN0ICAgICAgPSByZXF1aXJlKCcuL190by1pb2JqZWN0JylcclxuICAsIHRvUHJpbWl0aXZlICAgID0gcmVxdWlyZSgnLi9fdG8tcHJpbWl0aXZlJylcclxuICAsIGhhcyAgICAgICAgICAgID0gcmVxdWlyZSgnLi9faGFzJylcclxuICAsIElFOF9ET01fREVGSU5FID0gcmVxdWlyZSgnLi9faWU4LWRvbS1kZWZpbmUnKVxyXG4gICwgZ09QRCAgICAgICAgICAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xyXG5cclxuZXhwb3J0cy5mID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSA/IGdPUEQgOiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCl7XHJcbiAgTyA9IHRvSU9iamVjdChPKTtcclxuICBQID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7XHJcbiAgaWYoSUU4X0RPTV9ERUZJTkUpdHJ5IHtcclxuICAgIHJldHVybiBnT1BEKE8sIFApO1xyXG4gIH0gY2F0Y2goZSl7IC8qIGVtcHR5ICovIH1cclxuICBpZihoYXMoTywgUCkpcmV0dXJuIGNyZWF0ZURlc2MoIXBJRS5mLmNhbGwoTywgUCksIE9bUF0pO1xyXG59OyIsIi8vIGZhbGxiYWNrIGZvciBJRTExIGJ1Z2d5IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIHdpdGggaWZyYW1lIGFuZCB3aW5kb3dcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0JylcbiAgLCBnT1BOICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wbicpLmZcbiAgLCB0b1N0cmluZyAgPSB7fS50b1N0cmluZztcblxudmFyIHdpbmRvd05hbWVzID0gdHlwZW9mIHdpbmRvdyA9PSAnb2JqZWN0JyAmJiB3aW5kb3cgJiYgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXNcbiAgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh3aW5kb3cpIDogW107XG5cbnZhciBnZXRXaW5kb3dOYW1lcyA9IGZ1bmN0aW9uKGl0KXtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZ09QTihpdCk7XG4gIH0gY2F0Y2goZSl7XG4gICAgcmV0dXJuIHdpbmRvd05hbWVzLnNsaWNlKCk7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzLmYgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKGl0KXtcbiAgcmV0dXJuIHdpbmRvd05hbWVzICYmIHRvU3RyaW5nLmNhbGwoaXQpID09ICdbb2JqZWN0IFdpbmRvd10nID8gZ2V0V2luZG93TmFtZXMoaXQpIDogZ09QTih0b0lPYmplY3QoaXQpKTtcbn07XG4iLCIvLyAxOS4xLjIuNyAvIDE1LjIuMy40IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKE8pXHJcbnZhciAka2V5cyAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMtaW50ZXJuYWwnKVxyXG4gICwgaGlkZGVuS2V5cyA9IHJlcXVpcmUoJy4vX2VudW0tYnVnLWtleXMnKS5jb25jYXQoJ2xlbmd0aCcsICdwcm90b3R5cGUnKTtcclxuXHJcbmV4cG9ydHMuZiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIHx8IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoTyl7XHJcbiAgcmV0dXJuICRrZXlzKE8sIGhpZGRlbktleXMpO1xyXG59OyIsImV4cG9ydHMuZiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7IiwiLy8gMTkuMS4yLjkgLyAxNS4yLjMuMiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoTylcclxudmFyIGhhcyAgICAgICAgID0gcmVxdWlyZSgnLi9faGFzJylcclxuICAsIHRvT2JqZWN0ICAgID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0JylcclxuICAsIElFX1BST1RPICAgID0gcmVxdWlyZSgnLi9fc2hhcmVkLWtleScpKCdJRV9QUk9UTycpXHJcbiAgLCBPYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbihPKXtcclxuICBPID0gdG9PYmplY3QoTyk7XHJcbiAgaWYoaGFzKE8sIElFX1BST1RPKSlyZXR1cm4gT1tJRV9QUk9UT107XHJcbiAgaWYodHlwZW9mIE8uY29uc3RydWN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBPIGluc3RhbmNlb2YgTy5jb25zdHJ1Y3Rvcil7XHJcbiAgICByZXR1cm4gTy5jb25zdHJ1Y3Rvci5wcm90b3R5cGU7XHJcbiAgfSByZXR1cm4gTyBpbnN0YW5jZW9mIE9iamVjdCA/IE9iamVjdFByb3RvIDogbnVsbDtcclxufTsiLCJ2YXIgaGFzICAgICAgICAgID0gcmVxdWlyZSgnLi9faGFzJylcclxuICAsIHRvSU9iamVjdCAgICA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKVxyXG4gICwgYXJyYXlJbmRleE9mID0gcmVxdWlyZSgnLi9fYXJyYXktaW5jbHVkZXMnKShmYWxzZSlcclxuICAsIElFX1BST1RPICAgICA9IHJlcXVpcmUoJy4vX3NoYXJlZC1rZXknKSgnSUVfUFJPVE8nKTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24ob2JqZWN0LCBuYW1lcyl7XHJcbiAgdmFyIE8gICAgICA9IHRvSU9iamVjdChvYmplY3QpXHJcbiAgICAsIGkgICAgICA9IDBcclxuICAgICwgcmVzdWx0ID0gW11cclxuICAgICwga2V5O1xyXG4gIGZvcihrZXkgaW4gTylpZihrZXkgIT0gSUVfUFJPVE8paGFzKE8sIGtleSkgJiYgcmVzdWx0LnB1c2goa2V5KTtcclxuICAvLyBEb24ndCBlbnVtIGJ1ZyAmIGhpZGRlbiBrZXlzXHJcbiAgd2hpbGUobmFtZXMubGVuZ3RoID4gaSlpZihoYXMoTywga2V5ID0gbmFtZXNbaSsrXSkpe1xyXG4gICAgfmFycmF5SW5kZXhPZihyZXN1bHQsIGtleSkgfHwgcmVzdWx0LnB1c2goa2V5KTtcclxuICB9XHJcbiAgcmV0dXJuIHJlc3VsdDtcclxufTsiLCIvLyAxOS4xLjIuMTQgLyAxNS4yLjMuMTQgT2JqZWN0LmtleXMoTylcclxudmFyICRrZXlzICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMtaW50ZXJuYWwnKVxyXG4gICwgZW51bUJ1Z0tleXMgPSByZXF1aXJlKCcuL19lbnVtLWJ1Zy1rZXlzJyk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIGtleXMoTyl7XHJcbiAgcmV0dXJuICRrZXlzKE8sIGVudW1CdWdLZXlzKTtcclxufTsiLCJleHBvcnRzLmYgPSB7fS5wcm9wZXJ0eUlzRW51bWVyYWJsZTsiLCIvLyBtb3N0IE9iamVjdCBtZXRob2RzIGJ5IEVTNiBzaG91bGQgYWNjZXB0IHByaW1pdGl2ZXNcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCBjb3JlICAgID0gcmVxdWlyZSgnLi9fY29yZScpXG4gICwgZmFpbHMgICA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKEtFWSwgZXhlYyl7XG4gIHZhciBmbiAgPSAoY29yZS5PYmplY3QgfHwge30pW0tFWV0gfHwgT2JqZWN0W0tFWV1cbiAgICAsIGV4cCA9IHt9O1xuICBleHBbS0VZXSA9IGV4ZWMoZm4pO1xuICAkZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqIGZhaWxzKGZ1bmN0aW9uKCl7IGZuKDEpOyB9KSwgJ09iamVjdCcsIGV4cCk7XG59OyIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oYml0bWFwLCB2YWx1ZSl7XG4gIHJldHVybiB7XG4gICAgZW51bWVyYWJsZSAgOiAhKGJpdG1hcCAmIDEpLFxuICAgIGNvbmZpZ3VyYWJsZTogIShiaXRtYXAgJiAyKSxcbiAgICB3cml0YWJsZSAgICA6ICEoYml0bWFwICYgNCksXG4gICAgdmFsdWUgICAgICAgOiB2YWx1ZVxuICB9O1xufTsiLCJ2YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24odGFyZ2V0LCBzcmMsIHNhZmUpe1xuICBmb3IodmFyIGtleSBpbiBzcmMpe1xuICAgIGlmKHNhZmUgJiYgdGFyZ2V0W2tleV0pdGFyZ2V0W2tleV0gPSBzcmNba2V5XTtcbiAgICBlbHNlIGhpZGUodGFyZ2V0LCBrZXksIHNyY1trZXldKTtcbiAgfSByZXR1cm4gdGFyZ2V0O1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2hpZGUnKTsiLCIvLyBXb3JrcyB3aXRoIF9fcHJvdG9fXyBvbmx5LiBPbGQgdjggY2FuJ3Qgd29yayB3aXRoIG51bGwgcHJvdG8gb2JqZWN0cy5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvICovXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKVxuICAsIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgY2hlY2sgPSBmdW5jdGlvbihPLCBwcm90byl7XG4gIGFuT2JqZWN0KE8pO1xuICBpZighaXNPYmplY3QocHJvdG8pICYmIHByb3RvICE9PSBudWxsKXRocm93IFR5cGVFcnJvcihwcm90byArIFwiOiBjYW4ndCBzZXQgYXMgcHJvdG90eXBlIVwiKTtcbn07XG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgc2V0OiBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgKCdfX3Byb3RvX18nIGluIHt9ID8gLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgIGZ1bmN0aW9uKHRlc3QsIGJ1Z2d5LCBzZXQpe1xuICAgICAgdHJ5IHtcbiAgICAgICAgc2V0ID0gcmVxdWlyZSgnLi9fY3R4JykoRnVuY3Rpb24uY2FsbCwgcmVxdWlyZSgnLi9fb2JqZWN0LWdvcGQnKS5mKE9iamVjdC5wcm90b3R5cGUsICdfX3Byb3RvX18nKS5zZXQsIDIpO1xuICAgICAgICBzZXQodGVzdCwgW10pO1xuICAgICAgICBidWdneSA9ICEodGVzdCBpbnN0YW5jZW9mIEFycmF5KTtcbiAgICAgIH0gY2F0Y2goZSl7IGJ1Z2d5ID0gdHJ1ZTsgfVxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIHNldFByb3RvdHlwZU9mKE8sIHByb3RvKXtcbiAgICAgICAgY2hlY2soTywgcHJvdG8pO1xuICAgICAgICBpZihidWdneSlPLl9fcHJvdG9fXyA9IHByb3RvO1xuICAgICAgICBlbHNlIHNldChPLCBwcm90byk7XG4gICAgICAgIHJldHVybiBPO1xuICAgICAgfTtcbiAgICB9KHt9LCBmYWxzZSkgOiB1bmRlZmluZWQpLFxuICBjaGVjazogY2hlY2tcbn07IiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbCAgICAgID0gcmVxdWlyZSgnLi9fZ2xvYmFsJylcbiAgLCBjb3JlICAgICAgICA9IHJlcXVpcmUoJy4vX2NvcmUnKVxuICAsIGRQICAgICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJylcbiAgLCBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJylcbiAgLCBTUEVDSUVTICAgICA9IHJlcXVpcmUoJy4vX3drcycpKCdzcGVjaWVzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oS0VZKXtcbiAgdmFyIEMgPSB0eXBlb2YgY29yZVtLRVldID09ICdmdW5jdGlvbicgPyBjb3JlW0tFWV0gOiBnbG9iYWxbS0VZXTtcbiAgaWYoREVTQ1JJUFRPUlMgJiYgQyAmJiAhQ1tTUEVDSUVTXSlkUC5mKEMsIFNQRUNJRVMsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbigpeyByZXR1cm4gdGhpczsgfVxuICB9KTtcbn07IiwidmFyIGRlZiA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmZcbiAgLCBoYXMgPSByZXF1aXJlKCcuL19oYXMnKVxuICAsIFRBRyA9IHJlcXVpcmUoJy4vX3drcycpKCd0b1N0cmluZ1RhZycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0LCB0YWcsIHN0YXQpe1xuICBpZihpdCAmJiAhaGFzKGl0ID0gc3RhdCA/IGl0IDogaXQucHJvdG90eXBlLCBUQUcpKWRlZihpdCwgVEFHLCB7Y29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogdGFnfSk7XG59OyIsInZhciBzaGFyZWQgPSByZXF1aXJlKCcuL19zaGFyZWQnKSgna2V5cycpXHJcbiAgLCB1aWQgICAgPSByZXF1aXJlKCcuL191aWQnKTtcclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihrZXkpe1xyXG4gIHJldHVybiBzaGFyZWRba2V5XSB8fCAoc2hhcmVkW2tleV0gPSB1aWQoa2V5KSk7XHJcbn07IiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpXG4gICwgU0hBUkVEID0gJ19fY29yZS1qc19zaGFyZWRfXydcbiAgLCBzdG9yZSAgPSBnbG9iYWxbU0hBUkVEXSB8fCAoZ2xvYmFsW1NIQVJFRF0gPSB7fSk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGtleSl7XG4gIHJldHVybiBzdG9yZVtrZXldIHx8IChzdG9yZVtrZXldID0ge30pO1xufTsiLCIvLyA3LjMuMjAgU3BlY2llc0NvbnN0cnVjdG9yKE8sIGRlZmF1bHRDb25zdHJ1Y3RvcilcbnZhciBhbk9iamVjdCAgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKVxuICAsIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKVxuICAsIFNQRUNJRVMgICA9IHJlcXVpcmUoJy4vX3drcycpKCdzcGVjaWVzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKE8sIEQpe1xuICB2YXIgQyA9IGFuT2JqZWN0KE8pLmNvbnN0cnVjdG9yLCBTO1xuICByZXR1cm4gQyA9PT0gdW5kZWZpbmVkIHx8IChTID0gYW5PYmplY3QoQylbU1BFQ0lFU10pID09IHVuZGVmaW5lZCA/IEQgOiBhRnVuY3Rpb24oUyk7XG59OyIsInZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJylcbiAgLCBkZWZpbmVkICAgPSByZXF1aXJlKCcuL19kZWZpbmVkJyk7XG4vLyB0cnVlICAtPiBTdHJpbmcjYXRcbi8vIGZhbHNlIC0+IFN0cmluZyNjb2RlUG9pbnRBdFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihUT19TVFJJTkcpe1xuICByZXR1cm4gZnVuY3Rpb24odGhhdCwgcG9zKXtcbiAgICB2YXIgcyA9IFN0cmluZyhkZWZpbmVkKHRoYXQpKVxuICAgICAgLCBpID0gdG9JbnRlZ2VyKHBvcylcbiAgICAgICwgbCA9IHMubGVuZ3RoXG4gICAgICAsIGEsIGI7XG4gICAgaWYoaSA8IDAgfHwgaSA+PSBsKXJldHVybiBUT19TVFJJTkcgPyAnJyA6IHVuZGVmaW5lZDtcbiAgICBhID0gcy5jaGFyQ29kZUF0KGkpO1xuICAgIHJldHVybiBhIDwgMHhkODAwIHx8IGEgPiAweGRiZmYgfHwgaSArIDEgPT09IGwgfHwgKGIgPSBzLmNoYXJDb2RlQXQoaSArIDEpKSA8IDB4ZGMwMCB8fCBiID4gMHhkZmZmXG4gICAgICA/IFRPX1NUUklORyA/IHMuY2hhckF0KGkpIDogYVxuICAgICAgOiBUT19TVFJJTkcgPyBzLnNsaWNlKGksIGkgKyAyKSA6IChhIC0gMHhkODAwIDw8IDEwKSArIChiIC0gMHhkYzAwKSArIDB4MTAwMDA7XG4gIH07XG59OyIsInZhciBjdHggICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19jdHgnKVxuICAsIGludm9rZSAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2ludm9rZScpXG4gICwgaHRtbCAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9faHRtbCcpXG4gICwgY2VsICAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fZG9tLWNyZWF0ZScpXG4gICwgZ2xvYmFsICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fZ2xvYmFsJylcbiAgLCBwcm9jZXNzICAgICAgICAgICAgPSBnbG9iYWwucHJvY2Vzc1xuICAsIHNldFRhc2sgICAgICAgICAgICA9IGdsb2JhbC5zZXRJbW1lZGlhdGVcbiAgLCBjbGVhclRhc2sgICAgICAgICAgPSBnbG9iYWwuY2xlYXJJbW1lZGlhdGVcbiAgLCBNZXNzYWdlQ2hhbm5lbCAgICAgPSBnbG9iYWwuTWVzc2FnZUNoYW5uZWxcbiAgLCBjb3VudGVyICAgICAgICAgICAgPSAwXG4gICwgcXVldWUgICAgICAgICAgICAgID0ge31cbiAgLCBPTlJFQURZU1RBVEVDSEFOR0UgPSAnb25yZWFkeXN0YXRlY2hhbmdlJ1xuICAsIGRlZmVyLCBjaGFubmVsLCBwb3J0O1xudmFyIHJ1biA9IGZ1bmN0aW9uKCl7XG4gIHZhciBpZCA9ICt0aGlzO1xuICBpZihxdWV1ZS5oYXNPd25Qcm9wZXJ0eShpZCkpe1xuICAgIHZhciBmbiA9IHF1ZXVlW2lkXTtcbiAgICBkZWxldGUgcXVldWVbaWRdO1xuICAgIGZuKCk7XG4gIH1cbn07XG52YXIgbGlzdGVuZXIgPSBmdW5jdGlvbihldmVudCl7XG4gIHJ1bi5jYWxsKGV2ZW50LmRhdGEpO1xufTtcbi8vIE5vZGUuanMgMC45KyAmIElFMTArIGhhcyBzZXRJbW1lZGlhdGUsIG90aGVyd2lzZTpcbmlmKCFzZXRUYXNrIHx8ICFjbGVhclRhc2spe1xuICBzZXRUYXNrID0gZnVuY3Rpb24gc2V0SW1tZWRpYXRlKGZuKXtcbiAgICB2YXIgYXJncyA9IFtdLCBpID0gMTtcbiAgICB3aGlsZShhcmd1bWVudHMubGVuZ3RoID4gaSlhcmdzLnB1c2goYXJndW1lbnRzW2krK10pO1xuICAgIHF1ZXVlWysrY291bnRlcl0gPSBmdW5jdGlvbigpe1xuICAgICAgaW52b2tlKHR5cGVvZiBmbiA9PSAnZnVuY3Rpb24nID8gZm4gOiBGdW5jdGlvbihmbiksIGFyZ3MpO1xuICAgIH07XG4gICAgZGVmZXIoY291bnRlcik7XG4gICAgcmV0dXJuIGNvdW50ZXI7XG4gIH07XG4gIGNsZWFyVGFzayA9IGZ1bmN0aW9uIGNsZWFySW1tZWRpYXRlKGlkKXtcbiAgICBkZWxldGUgcXVldWVbaWRdO1xuICB9O1xuICAvLyBOb2RlLmpzIDAuOC1cbiAgaWYocmVxdWlyZSgnLi9fY29mJykocHJvY2VzcykgPT0gJ3Byb2Nlc3MnKXtcbiAgICBkZWZlciA9IGZ1bmN0aW9uKGlkKXtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soY3R4KHJ1biwgaWQsIDEpKTtcbiAgICB9O1xuICAvLyBCcm93c2VycyB3aXRoIE1lc3NhZ2VDaGFubmVsLCBpbmNsdWRlcyBXZWJXb3JrZXJzXG4gIH0gZWxzZSBpZihNZXNzYWdlQ2hhbm5lbCl7XG4gICAgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbDtcbiAgICBwb3J0ICAgID0gY2hhbm5lbC5wb3J0MjtcbiAgICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGxpc3RlbmVyO1xuICAgIGRlZmVyID0gY3R4KHBvcnQucG9zdE1lc3NhZ2UsIHBvcnQsIDEpO1xuICAvLyBCcm93c2VycyB3aXRoIHBvc3RNZXNzYWdlLCBza2lwIFdlYldvcmtlcnNcbiAgLy8gSUU4IGhhcyBwb3N0TWVzc2FnZSwgYnV0IGl0J3Mgc3luYyAmIHR5cGVvZiBpdHMgcG9zdE1lc3NhZ2UgaXMgJ29iamVjdCdcbiAgfSBlbHNlIGlmKGdsb2JhbC5hZGRFdmVudExpc3RlbmVyICYmIHR5cGVvZiBwb3N0TWVzc2FnZSA9PSAnZnVuY3Rpb24nICYmICFnbG9iYWwuaW1wb3J0U2NyaXB0cyl7XG4gICAgZGVmZXIgPSBmdW5jdGlvbihpZCl7XG4gICAgICBnbG9iYWwucG9zdE1lc3NhZ2UoaWQgKyAnJywgJyonKTtcbiAgICB9O1xuICAgIGdsb2JhbC5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgbGlzdGVuZXIsIGZhbHNlKTtcbiAgLy8gSUU4LVxuICB9IGVsc2UgaWYoT05SRUFEWVNUQVRFQ0hBTkdFIGluIGNlbCgnc2NyaXB0Jykpe1xuICAgIGRlZmVyID0gZnVuY3Rpb24oaWQpe1xuICAgICAgaHRtbC5hcHBlbmRDaGlsZChjZWwoJ3NjcmlwdCcpKVtPTlJFQURZU1RBVEVDSEFOR0VdID0gZnVuY3Rpb24oKXtcbiAgICAgICAgaHRtbC5yZW1vdmVDaGlsZCh0aGlzKTtcbiAgICAgICAgcnVuLmNhbGwoaWQpO1xuICAgICAgfTtcbiAgICB9O1xuICAvLyBSZXN0IG9sZCBicm93c2Vyc1xuICB9IGVsc2Uge1xuICAgIGRlZmVyID0gZnVuY3Rpb24oaWQpe1xuICAgICAgc2V0VGltZW91dChjdHgocnVuLCBpZCwgMSksIDApO1xuICAgIH07XG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0ge1xuICBzZXQ6ICAgc2V0VGFzayxcbiAgY2xlYXI6IGNsZWFyVGFza1xufTsiLCJ2YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpXG4gICwgbWF4ICAgICAgID0gTWF0aC5tYXhcbiAgLCBtaW4gICAgICAgPSBNYXRoLm1pbjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaW5kZXgsIGxlbmd0aCl7XG4gIGluZGV4ID0gdG9JbnRlZ2VyKGluZGV4KTtcbiAgcmV0dXJuIGluZGV4IDwgMCA/IG1heChpbmRleCArIGxlbmd0aCwgMCkgOiBtaW4oaW5kZXgsIGxlbmd0aCk7XG59OyIsIi8vIDcuMS40IFRvSW50ZWdlclxudmFyIGNlaWwgID0gTWF0aC5jZWlsXG4gICwgZmxvb3IgPSBNYXRoLmZsb29yO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiBpc05hTihpdCA9ICtpdCkgPyAwIDogKGl0ID4gMCA/IGZsb29yIDogY2VpbCkoaXQpO1xufTsiLCIvLyB0byBpbmRleGVkIG9iamVjdCwgdG9PYmplY3Qgd2l0aCBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIHN0cmluZ3NcbnZhciBJT2JqZWN0ID0gcmVxdWlyZSgnLi9faW9iamVjdCcpXG4gICwgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gSU9iamVjdChkZWZpbmVkKGl0KSk7XG59OyIsIi8vIDcuMS4xNSBUb0xlbmd0aFxudmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vX3RvLWludGVnZXInKVxuICAsIG1pbiAgICAgICA9IE1hdGgubWluO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiBpdCA+IDAgPyBtaW4odG9JbnRlZ2VyKGl0KSwgMHgxZmZmZmZmZmZmZmZmZikgOiAwOyAvLyBwb3coMiwgNTMpIC0gMSA9PSA5MDA3MTk5MjU0NzQwOTkxXG59OyIsIi8vIDcuMS4xMyBUb09iamVjdChhcmd1bWVudClcbnZhciBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiBPYmplY3QoZGVmaW5lZChpdCkpO1xufTsiLCIvLyA3LjEuMSBUb1ByaW1pdGl2ZShpbnB1dCBbLCBQcmVmZXJyZWRUeXBlXSlcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xuLy8gaW5zdGVhZCBvZiB0aGUgRVM2IHNwZWMgdmVyc2lvbiwgd2UgZGlkbid0IGltcGxlbWVudCBAQHRvUHJpbWl0aXZlIGNhc2Vcbi8vIGFuZCB0aGUgc2Vjb25kIGFyZ3VtZW50IC0gZmxhZyAtIHByZWZlcnJlZCB0eXBlIGlzIGEgc3RyaW5nXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0LCBTKXtcbiAgaWYoIWlzT2JqZWN0KGl0KSlyZXR1cm4gaXQ7XG4gIHZhciBmbiwgdmFsO1xuICBpZihTICYmIHR5cGVvZiAoZm4gPSBpdC50b1N0cmluZykgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKXJldHVybiB2YWw7XG4gIGlmKHR5cGVvZiAoZm4gPSBpdC52YWx1ZU9mKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpcmV0dXJuIHZhbDtcbiAgaWYoIVMgJiYgdHlwZW9mIChmbiA9IGl0LnRvU3RyaW5nKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpcmV0dXJuIHZhbDtcbiAgdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlXCIpO1xufTsiLCJ2YXIgaWQgPSAwXG4gICwgcHggPSBNYXRoLnJhbmRvbSgpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihrZXkpe1xuICByZXR1cm4gJ1N5bWJvbCgnLmNvbmNhdChrZXkgPT09IHVuZGVmaW5lZCA/ICcnIDoga2V5LCAnKV8nLCAoKytpZCArIHB4KS50b1N0cmluZygzNikpO1xufTsiLCJ2YXIgZ2xvYmFsICAgICAgICAgPSByZXF1aXJlKCcuL19nbG9iYWwnKVxyXG4gICwgY29yZSAgICAgICAgICAgPSByZXF1aXJlKCcuL19jb3JlJylcclxuICAsIExJQlJBUlkgICAgICAgID0gcmVxdWlyZSgnLi9fbGlicmFyeScpXHJcbiAgLCB3a3NFeHQgICAgICAgICA9IHJlcXVpcmUoJy4vX3drcy1leHQnKVxyXG4gICwgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mO1xyXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG5hbWUpe1xyXG4gIHZhciAkU3ltYm9sID0gY29yZS5TeW1ib2wgfHwgKGNvcmUuU3ltYm9sID0gTElCUkFSWSA/IHt9IDogZ2xvYmFsLlN5bWJvbCB8fCB7fSk7XHJcbiAgaWYobmFtZS5jaGFyQXQoMCkgIT0gJ18nICYmICEobmFtZSBpbiAkU3ltYm9sKSlkZWZpbmVQcm9wZXJ0eSgkU3ltYm9sLCBuYW1lLCB7dmFsdWU6IHdrc0V4dC5mKG5hbWUpfSk7XHJcbn07IiwiZXhwb3J0cy5mID0gcmVxdWlyZSgnLi9fd2tzJyk7IiwidmFyIHN0b3JlICAgICAgPSByZXF1aXJlKCcuL19zaGFyZWQnKSgnd2tzJylcbiAgLCB1aWQgICAgICAgID0gcmVxdWlyZSgnLi9fdWlkJylcbiAgLCBTeW1ib2wgICAgID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuU3ltYm9sXG4gICwgVVNFX1NZTUJPTCA9IHR5cGVvZiBTeW1ib2wgPT0gJ2Z1bmN0aW9uJztcblxudmFyICRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihuYW1lKXtcbiAgcmV0dXJuIHN0b3JlW25hbWVdIHx8IChzdG9yZVtuYW1lXSA9XG4gICAgVVNFX1NZTUJPTCAmJiBTeW1ib2xbbmFtZV0gfHwgKFVTRV9TWU1CT0wgPyBTeW1ib2wgOiB1aWQpKCdTeW1ib2wuJyArIG5hbWUpKTtcbn07XG5cbiRleHBvcnRzLnN0b3JlID0gc3RvcmU7IiwidmFyIGNsYXNzb2YgICA9IHJlcXVpcmUoJy4vX2NsYXNzb2YnKVxuICAsIElURVJBVE9SICA9IHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpXG4gICwgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2NvcmUnKS5nZXRJdGVyYXRvck1ldGhvZCA9IGZ1bmN0aW9uKGl0KXtcbiAgaWYoaXQgIT0gdW5kZWZpbmVkKXJldHVybiBpdFtJVEVSQVRPUl1cbiAgICB8fCBpdFsnQEBpdGVyYXRvciddXG4gICAgfHwgSXRlcmF0b3JzW2NsYXNzb2YoaXQpXTtcbn07IiwidmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0JylcbiAgLCBnZXQgICAgICA9IHJlcXVpcmUoJy4vY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2NvcmUnKS5nZXRJdGVyYXRvciA9IGZ1bmN0aW9uKGl0KXtcbiAgdmFyIGl0ZXJGbiA9IGdldChpdCk7XG4gIGlmKHR5cGVvZiBpdGVyRm4gIT0gJ2Z1bmN0aW9uJyl0aHJvdyBUeXBlRXJyb3IoaXQgKyAnIGlzIG5vdCBpdGVyYWJsZSEnKTtcbiAgcmV0dXJuIGFuT2JqZWN0KGl0ZXJGbi5jYWxsKGl0KSk7XG59OyIsInZhciBjbGFzc29mICAgPSByZXF1aXJlKCcuL19jbGFzc29mJylcbiAgLCBJVEVSQVRPUiAgPSByZXF1aXJlKCcuL193a3MnKSgnaXRlcmF0b3InKVxuICAsIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19jb3JlJykuaXNJdGVyYWJsZSA9IGZ1bmN0aW9uKGl0KXtcbiAgdmFyIE8gPSBPYmplY3QoaXQpO1xuICByZXR1cm4gT1tJVEVSQVRPUl0gIT09IHVuZGVmaW5lZFxuICAgIHx8ICdAQGl0ZXJhdG9yJyBpbiBPXG4gICAgfHwgSXRlcmF0b3JzLmhhc093blByb3BlcnR5KGNsYXNzb2YoTykpO1xufTsiLCIndXNlIHN0cmljdCc7XG52YXIgYWRkVG9VbnNjb3BhYmxlcyA9IHJlcXVpcmUoJy4vX2FkZC10by11bnNjb3BhYmxlcycpXG4gICwgc3RlcCAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2l0ZXItc3RlcCcpXG4gICwgSXRlcmF0b3JzICAgICAgICA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpXG4gICwgdG9JT2JqZWN0ICAgICAgICA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcblxuLy8gMjIuMS4zLjQgQXJyYXkucHJvdG90eXBlLmVudHJpZXMoKVxuLy8gMjIuMS4zLjEzIEFycmF5LnByb3RvdHlwZS5rZXlzKClcbi8vIDIyLjEuMy4yOSBBcnJheS5wcm90b3R5cGUudmFsdWVzKClcbi8vIDIyLjEuMy4zMCBBcnJheS5wcm90b3R5cGVbQEBpdGVyYXRvcl0oKVxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19pdGVyLWRlZmluZScpKEFycmF5LCAnQXJyYXknLCBmdW5jdGlvbihpdGVyYXRlZCwga2luZCl7XG4gIHRoaXMuX3QgPSB0b0lPYmplY3QoaXRlcmF0ZWQpOyAvLyB0YXJnZXRcbiAgdGhpcy5faSA9IDA7ICAgICAgICAgICAgICAgICAgIC8vIG5leHQgaW5kZXhcbiAgdGhpcy5fayA9IGtpbmQ7ICAgICAgICAgICAgICAgIC8vIGtpbmRcbi8vIDIyLjEuNS4yLjEgJUFycmF5SXRlcmF0b3JQcm90b3R5cGUlLm5leHQoKVxufSwgZnVuY3Rpb24oKXtcbiAgdmFyIE8gICAgID0gdGhpcy5fdFxuICAgICwga2luZCAgPSB0aGlzLl9rXG4gICAgLCBpbmRleCA9IHRoaXMuX2krKztcbiAgaWYoIU8gfHwgaW5kZXggPj0gTy5sZW5ndGgpe1xuICAgIHRoaXMuX3QgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHN0ZXAoMSk7XG4gIH1cbiAgaWYoa2luZCA9PSAna2V5cycgIClyZXR1cm4gc3RlcCgwLCBpbmRleCk7XG4gIGlmKGtpbmQgPT0gJ3ZhbHVlcycpcmV0dXJuIHN0ZXAoMCwgT1tpbmRleF0pO1xuICByZXR1cm4gc3RlcCgwLCBbaW5kZXgsIE9baW5kZXhdXSk7XG59LCAndmFsdWVzJyk7XG5cbi8vIGFyZ3VtZW50c0xpc3RbQEBpdGVyYXRvcl0gaXMgJUFycmF5UHJvdG9fdmFsdWVzJSAoOS40LjQuNiwgOS40LjQuNylcbkl0ZXJhdG9ycy5Bcmd1bWVudHMgPSBJdGVyYXRvcnMuQXJyYXk7XG5cbmFkZFRvVW5zY29wYWJsZXMoJ2tleXMnKTtcbmFkZFRvVW5zY29wYWJsZXMoJ3ZhbHVlcycpO1xuYWRkVG9VbnNjb3BhYmxlcygnZW50cmllcycpOyIsInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XHJcbi8vIDE5LjEuMi40IC8gMTUuMi4zLjYgT2JqZWN0LmRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpXHJcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIXJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJyksICdPYmplY3QnLCB7ZGVmaW5lUHJvcGVydHk6IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmZ9KTsiLCIvLyAxOS4xLjIuNSBPYmplY3QuZnJlZXplKE8pXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKVxuICAsIG1ldGEgICAgID0gcmVxdWlyZSgnLi9fbWV0YScpLm9uRnJlZXplO1xuXG5yZXF1aXJlKCcuL19vYmplY3Qtc2FwJykoJ2ZyZWV6ZScsIGZ1bmN0aW9uKCRmcmVlemUpe1xuICByZXR1cm4gZnVuY3Rpb24gZnJlZXplKGl0KXtcbiAgICByZXR1cm4gJGZyZWV6ZSAmJiBpc09iamVjdChpdCkgPyAkZnJlZXplKG1ldGEoaXQpKSA6IGl0O1xuICB9O1xufSk7IiwiLy8gMTkuMS4yLjE0IE9iamVjdC5rZXlzKE8pXG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKVxuICAsICRrZXlzICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKTtcblxucmVxdWlyZSgnLi9fb2JqZWN0LXNhcCcpKCdrZXlzJywgZnVuY3Rpb24oKXtcbiAgcmV0dXJuIGZ1bmN0aW9uIGtleXMoaXQpe1xuICAgIHJldHVybiAka2V5cyh0b09iamVjdChpdCkpO1xuICB9O1xufSk7IixudWxsLCIndXNlIHN0cmljdCc7XG52YXIgTElCUkFSWSAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fbGlicmFyeScpXG4gICwgZ2xvYmFsICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fZ2xvYmFsJylcbiAgLCBjdHggICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19jdHgnKVxuICAsIGNsYXNzb2YgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2NsYXNzb2YnKVxuICAsICRleHBvcnQgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgaXNPYmplY3QgICAgICAgICAgID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0JylcbiAgLCBhbk9iamVjdCAgICAgICAgICAgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKVxuICAsIGFGdW5jdGlvbiAgICAgICAgICA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKVxuICAsIGFuSW5zdGFuY2UgICAgICAgICA9IHJlcXVpcmUoJy4vX2FuLWluc3RhbmNlJylcbiAgLCBmb3JPZiAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19mb3Itb2YnKVxuICAsIHNldFByb3RvICAgICAgICAgICA9IHJlcXVpcmUoJy4vX3NldC1wcm90bycpLnNldFxuICAsIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4vX3NwZWNpZXMtY29uc3RydWN0b3InKVxuICAsIHRhc2sgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX3Rhc2snKS5zZXRcbiAgLCBtaWNyb3Rhc2sgICAgICAgICAgPSByZXF1aXJlKCcuL19taWNyb3Rhc2snKSgpXG4gICwgUFJPTUlTRSAgICAgICAgICAgID0gJ1Byb21pc2UnXG4gICwgVHlwZUVycm9yICAgICAgICAgID0gZ2xvYmFsLlR5cGVFcnJvclxuICAsIHByb2Nlc3MgICAgICAgICAgICA9IGdsb2JhbC5wcm9jZXNzXG4gICwgJFByb21pc2UgICAgICAgICAgID0gZ2xvYmFsW1BST01JU0VdXG4gICwgcHJvY2VzcyAgICAgICAgICAgID0gZ2xvYmFsLnByb2Nlc3NcbiAgLCBpc05vZGUgICAgICAgICAgICAgPSBjbGFzc29mKHByb2Nlc3MpID09ICdwcm9jZXNzJ1xuICAsIGVtcHR5ICAgICAgICAgICAgICA9IGZ1bmN0aW9uKCl7IC8qIGVtcHR5ICovIH1cbiAgLCBJbnRlcm5hbCwgR2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5LCBXcmFwcGVyO1xuXG52YXIgVVNFX05BVElWRSA9ICEhZnVuY3Rpb24oKXtcbiAgdHJ5IHtcbiAgICAvLyBjb3JyZWN0IHN1YmNsYXNzaW5nIHdpdGggQEBzcGVjaWVzIHN1cHBvcnRcbiAgICB2YXIgcHJvbWlzZSAgICAgPSAkUHJvbWlzZS5yZXNvbHZlKDEpXG4gICAgICAsIEZha2VQcm9taXNlID0gKHByb21pc2UuY29uc3RydWN0b3IgPSB7fSlbcmVxdWlyZSgnLi9fd2tzJykoJ3NwZWNpZXMnKV0gPSBmdW5jdGlvbihleGVjKXsgZXhlYyhlbXB0eSwgZW1wdHkpOyB9O1xuICAgIC8vIHVuaGFuZGxlZCByZWplY3Rpb25zIHRyYWNraW5nIHN1cHBvcnQsIE5vZGVKUyBQcm9taXNlIHdpdGhvdXQgaXQgZmFpbHMgQEBzcGVjaWVzIHRlc3RcbiAgICByZXR1cm4gKGlzTm9kZSB8fCB0eXBlb2YgUHJvbWlzZVJlamVjdGlvbkV2ZW50ID09ICdmdW5jdGlvbicpICYmIHByb21pc2UudGhlbihlbXB0eSkgaW5zdGFuY2VvZiBGYWtlUHJvbWlzZTtcbiAgfSBjYXRjaChlKXsgLyogZW1wdHkgKi8gfVxufSgpO1xuXG4vLyBoZWxwZXJzXG52YXIgc2FtZUNvbnN0cnVjdG9yID0gZnVuY3Rpb24oYSwgYil7XG4gIC8vIHdpdGggbGlicmFyeSB3cmFwcGVyIHNwZWNpYWwgY2FzZVxuICByZXR1cm4gYSA9PT0gYiB8fCBhID09PSAkUHJvbWlzZSAmJiBiID09PSBXcmFwcGVyO1xufTtcbnZhciBpc1RoZW5hYmxlID0gZnVuY3Rpb24oaXQpe1xuICB2YXIgdGhlbjtcbiAgcmV0dXJuIGlzT2JqZWN0KGl0KSAmJiB0eXBlb2YgKHRoZW4gPSBpdC50aGVuKSA9PSAnZnVuY3Rpb24nID8gdGhlbiA6IGZhbHNlO1xufTtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IGZ1bmN0aW9uKEMpe1xuICByZXR1cm4gc2FtZUNvbnN0cnVjdG9yKCRQcm9taXNlLCBDKVxuICAgID8gbmV3IFByb21pc2VDYXBhYmlsaXR5KEMpXG4gICAgOiBuZXcgR2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5KEMpO1xufTtcbnZhciBQcm9taXNlQ2FwYWJpbGl0eSA9IEdlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eSA9IGZ1bmN0aW9uKEMpe1xuICB2YXIgcmVzb2x2ZSwgcmVqZWN0O1xuICB0aGlzLnByb21pc2UgPSBuZXcgQyhmdW5jdGlvbigkJHJlc29sdmUsICQkcmVqZWN0KXtcbiAgICBpZihyZXNvbHZlICE9PSB1bmRlZmluZWQgfHwgcmVqZWN0ICE9PSB1bmRlZmluZWQpdGhyb3cgVHlwZUVycm9yKCdCYWQgUHJvbWlzZSBjb25zdHJ1Y3RvcicpO1xuICAgIHJlc29sdmUgPSAkJHJlc29sdmU7XG4gICAgcmVqZWN0ICA9ICQkcmVqZWN0O1xuICB9KTtcbiAgdGhpcy5yZXNvbHZlID0gYUZ1bmN0aW9uKHJlc29sdmUpO1xuICB0aGlzLnJlamVjdCAgPSBhRnVuY3Rpb24ocmVqZWN0KTtcbn07XG52YXIgcGVyZm9ybSA9IGZ1bmN0aW9uKGV4ZWMpe1xuICB0cnkge1xuICAgIGV4ZWMoKTtcbiAgfSBjYXRjaChlKXtcbiAgICByZXR1cm4ge2Vycm9yOiBlfTtcbiAgfVxufTtcbnZhciBub3RpZnkgPSBmdW5jdGlvbihwcm9taXNlLCBpc1JlamVjdCl7XG4gIGlmKHByb21pc2UuX24pcmV0dXJuO1xuICBwcm9taXNlLl9uID0gdHJ1ZTtcbiAgdmFyIGNoYWluID0gcHJvbWlzZS5fYztcbiAgbWljcm90YXNrKGZ1bmN0aW9uKCl7XG4gICAgdmFyIHZhbHVlID0gcHJvbWlzZS5fdlxuICAgICAgLCBvayAgICA9IHByb21pc2UuX3MgPT0gMVxuICAgICAgLCBpICAgICA9IDA7XG4gICAgdmFyIHJ1biA9IGZ1bmN0aW9uKHJlYWN0aW9uKXtcbiAgICAgIHZhciBoYW5kbGVyID0gb2sgPyByZWFjdGlvbi5vayA6IHJlYWN0aW9uLmZhaWxcbiAgICAgICAgLCByZXNvbHZlID0gcmVhY3Rpb24ucmVzb2x2ZVxuICAgICAgICAsIHJlamVjdCAgPSByZWFjdGlvbi5yZWplY3RcbiAgICAgICAgLCBkb21haW4gID0gcmVhY3Rpb24uZG9tYWluXG4gICAgICAgICwgcmVzdWx0LCB0aGVuO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYoaGFuZGxlcil7XG4gICAgICAgICAgaWYoIW9rKXtcbiAgICAgICAgICAgIGlmKHByb21pc2UuX2ggPT0gMilvbkhhbmRsZVVuaGFuZGxlZChwcm9taXNlKTtcbiAgICAgICAgICAgIHByb21pc2UuX2ggPSAxO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZihoYW5kbGVyID09PSB0cnVlKXJlc3VsdCA9IHZhbHVlO1xuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYoZG9tYWluKWRvbWFpbi5lbnRlcigpO1xuICAgICAgICAgICAgcmVzdWx0ID0gaGFuZGxlcih2YWx1ZSk7XG4gICAgICAgICAgICBpZihkb21haW4pZG9tYWluLmV4aXQoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYocmVzdWx0ID09PSByZWFjdGlvbi5wcm9taXNlKXtcbiAgICAgICAgICAgIHJlamVjdChUeXBlRXJyb3IoJ1Byb21pc2UtY2hhaW4gY3ljbGUnKSk7XG4gICAgICAgICAgfSBlbHNlIGlmKHRoZW4gPSBpc1RoZW5hYmxlKHJlc3VsdCkpe1xuICAgICAgICAgICAgdGhlbi5jYWxsKHJlc3VsdCwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9IGVsc2UgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9IGVsc2UgcmVqZWN0KHZhbHVlKTtcbiAgICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHdoaWxlKGNoYWluLmxlbmd0aCA+IGkpcnVuKGNoYWluW2krK10pOyAvLyB2YXJpYWJsZSBsZW5ndGggLSBjYW4ndCB1c2UgZm9yRWFjaFxuICAgIHByb21pc2UuX2MgPSBbXTtcbiAgICBwcm9taXNlLl9uID0gZmFsc2U7XG4gICAgaWYoaXNSZWplY3QgJiYgIXByb21pc2UuX2gpb25VbmhhbmRsZWQocHJvbWlzZSk7XG4gIH0pO1xufTtcbnZhciBvblVuaGFuZGxlZCA9IGZ1bmN0aW9uKHByb21pc2Upe1xuICB0YXNrLmNhbGwoZ2xvYmFsLCBmdW5jdGlvbigpe1xuICAgIHZhciB2YWx1ZSA9IHByb21pc2UuX3ZcbiAgICAgICwgYWJydXB0LCBoYW5kbGVyLCBjb25zb2xlO1xuICAgIGlmKGlzVW5oYW5kbGVkKHByb21pc2UpKXtcbiAgICAgIGFicnVwdCA9IHBlcmZvcm0oZnVuY3Rpb24oKXtcbiAgICAgICAgaWYoaXNOb2RlKXtcbiAgICAgICAgICBwcm9jZXNzLmVtaXQoJ3VuaGFuZGxlZFJlamVjdGlvbicsIHZhbHVlLCBwcm9taXNlKTtcbiAgICAgICAgfSBlbHNlIGlmKGhhbmRsZXIgPSBnbG9iYWwub251bmhhbmRsZWRyZWplY3Rpb24pe1xuICAgICAgICAgIGhhbmRsZXIoe3Byb21pc2U6IHByb21pc2UsIHJlYXNvbjogdmFsdWV9KTtcbiAgICAgICAgfSBlbHNlIGlmKChjb25zb2xlID0gZ2xvYmFsLmNvbnNvbGUpICYmIGNvbnNvbGUuZXJyb3Ipe1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1VuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbicsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICAvLyBCcm93c2VycyBzaG91bGQgbm90IHRyaWdnZXIgYHJlamVjdGlvbkhhbmRsZWRgIGV2ZW50IGlmIGl0IHdhcyBoYW5kbGVkIGhlcmUsIE5vZGVKUyAtIHNob3VsZFxuICAgICAgcHJvbWlzZS5faCA9IGlzTm9kZSB8fCBpc1VuaGFuZGxlZChwcm9taXNlKSA/IDIgOiAxO1xuICAgIH0gcHJvbWlzZS5fYSA9IHVuZGVmaW5lZDtcbiAgICBpZihhYnJ1cHQpdGhyb3cgYWJydXB0LmVycm9yO1xuICB9KTtcbn07XG52YXIgaXNVbmhhbmRsZWQgPSBmdW5jdGlvbihwcm9taXNlKXtcbiAgaWYocHJvbWlzZS5faCA9PSAxKXJldHVybiBmYWxzZTtcbiAgdmFyIGNoYWluID0gcHJvbWlzZS5fYSB8fCBwcm9taXNlLl9jXG4gICAgLCBpICAgICA9IDBcbiAgICAsIHJlYWN0aW9uO1xuICB3aGlsZShjaGFpbi5sZW5ndGggPiBpKXtcbiAgICByZWFjdGlvbiA9IGNoYWluW2krK107XG4gICAgaWYocmVhY3Rpb24uZmFpbCB8fCAhaXNVbmhhbmRsZWQocmVhY3Rpb24ucHJvbWlzZSkpcmV0dXJuIGZhbHNlO1xuICB9IHJldHVybiB0cnVlO1xufTtcbnZhciBvbkhhbmRsZVVuaGFuZGxlZCA9IGZ1bmN0aW9uKHByb21pc2Upe1xuICB0YXNrLmNhbGwoZ2xvYmFsLCBmdW5jdGlvbigpe1xuICAgIHZhciBoYW5kbGVyO1xuICAgIGlmKGlzTm9kZSl7XG4gICAgICBwcm9jZXNzLmVtaXQoJ3JlamVjdGlvbkhhbmRsZWQnLCBwcm9taXNlKTtcbiAgICB9IGVsc2UgaWYoaGFuZGxlciA9IGdsb2JhbC5vbnJlamVjdGlvbmhhbmRsZWQpe1xuICAgICAgaGFuZGxlcih7cHJvbWlzZTogcHJvbWlzZSwgcmVhc29uOiBwcm9taXNlLl92fSk7XG4gICAgfVxuICB9KTtcbn07XG52YXIgJHJlamVjdCA9IGZ1bmN0aW9uKHZhbHVlKXtcbiAgdmFyIHByb21pc2UgPSB0aGlzO1xuICBpZihwcm9taXNlLl9kKXJldHVybjtcbiAgcHJvbWlzZS5fZCA9IHRydWU7XG4gIHByb21pc2UgPSBwcm9taXNlLl93IHx8IHByb21pc2U7IC8vIHVud3JhcFxuICBwcm9taXNlLl92ID0gdmFsdWU7XG4gIHByb21pc2UuX3MgPSAyO1xuICBpZighcHJvbWlzZS5fYSlwcm9taXNlLl9hID0gcHJvbWlzZS5fYy5zbGljZSgpO1xuICBub3RpZnkocHJvbWlzZSwgdHJ1ZSk7XG59O1xudmFyICRyZXNvbHZlID0gZnVuY3Rpb24odmFsdWUpe1xuICB2YXIgcHJvbWlzZSA9IHRoaXNcbiAgICAsIHRoZW47XG4gIGlmKHByb21pc2UuX2QpcmV0dXJuO1xuICBwcm9taXNlLl9kID0gdHJ1ZTtcbiAgcHJvbWlzZSA9IHByb21pc2UuX3cgfHwgcHJvbWlzZTsgLy8gdW53cmFwXG4gIHRyeSB7XG4gICAgaWYocHJvbWlzZSA9PT0gdmFsdWUpdGhyb3cgVHlwZUVycm9yKFwiUHJvbWlzZSBjYW4ndCBiZSByZXNvbHZlZCBpdHNlbGZcIik7XG4gICAgaWYodGhlbiA9IGlzVGhlbmFibGUodmFsdWUpKXtcbiAgICAgIG1pY3JvdGFzayhmdW5jdGlvbigpe1xuICAgICAgICB2YXIgd3JhcHBlciA9IHtfdzogcHJvbWlzZSwgX2Q6IGZhbHNlfTsgLy8gd3JhcFxuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoZW4uY2FsbCh2YWx1ZSwgY3R4KCRyZXNvbHZlLCB3cmFwcGVyLCAxKSwgY3R4KCRyZWplY3QsIHdyYXBwZXIsIDEpKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAkcmVqZWN0LmNhbGwod3JhcHBlciwgZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9taXNlLl92ID0gdmFsdWU7XG4gICAgICBwcm9taXNlLl9zID0gMTtcbiAgICAgIG5vdGlmeShwcm9taXNlLCBmYWxzZSk7XG4gICAgfVxuICB9IGNhdGNoKGUpe1xuICAgICRyZWplY3QuY2FsbCh7X3c6IHByb21pc2UsIF9kOiBmYWxzZX0sIGUpOyAvLyB3cmFwXG4gIH1cbn07XG5cbi8vIGNvbnN0cnVjdG9yIHBvbHlmaWxsXG5pZighVVNFX05BVElWRSl7XG4gIC8vIDI1LjQuMy4xIFByb21pc2UoZXhlY3V0b3IpXG4gICRQcm9taXNlID0gZnVuY3Rpb24gUHJvbWlzZShleGVjdXRvcil7XG4gICAgYW5JbnN0YW5jZSh0aGlzLCAkUHJvbWlzZSwgUFJPTUlTRSwgJ19oJyk7XG4gICAgYUZ1bmN0aW9uKGV4ZWN1dG9yKTtcbiAgICBJbnRlcm5hbC5jYWxsKHRoaXMpO1xuICAgIHRyeSB7XG4gICAgICBleGVjdXRvcihjdHgoJHJlc29sdmUsIHRoaXMsIDEpLCBjdHgoJHJlamVjdCwgdGhpcywgMSkpO1xuICAgIH0gY2F0Y2goZXJyKXtcbiAgICAgICRyZWplY3QuY2FsbCh0aGlzLCBlcnIpO1xuICAgIH1cbiAgfTtcbiAgSW50ZXJuYWwgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKXtcbiAgICB0aGlzLl9jID0gW107ICAgICAgICAgICAgIC8vIDwtIGF3YWl0aW5nIHJlYWN0aW9uc1xuICAgIHRoaXMuX2EgPSB1bmRlZmluZWQ7ICAgICAgLy8gPC0gY2hlY2tlZCBpbiBpc1VuaGFuZGxlZCByZWFjdGlvbnNcbiAgICB0aGlzLl9zID0gMDsgICAgICAgICAgICAgIC8vIDwtIHN0YXRlXG4gICAgdGhpcy5fZCA9IGZhbHNlOyAgICAgICAgICAvLyA8LSBkb25lXG4gICAgdGhpcy5fdiA9IHVuZGVmaW5lZDsgICAgICAvLyA8LSB2YWx1ZVxuICAgIHRoaXMuX2ggPSAwOyAgICAgICAgICAgICAgLy8gPC0gcmVqZWN0aW9uIHN0YXRlLCAwIC0gZGVmYXVsdCwgMSAtIGhhbmRsZWQsIDIgLSB1bmhhbmRsZWRcbiAgICB0aGlzLl9uID0gZmFsc2U7ICAgICAgICAgIC8vIDwtIG5vdGlmeVxuICB9O1xuICBJbnRlcm5hbC5wcm90b3R5cGUgPSByZXF1aXJlKCcuL19yZWRlZmluZS1hbGwnKSgkUHJvbWlzZS5wcm90b3R5cGUsIHtcbiAgICAvLyAyNS40LjUuMyBQcm9taXNlLnByb3RvdHlwZS50aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKVxuICAgIHRoZW46IGZ1bmN0aW9uIHRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpe1xuICAgICAgdmFyIHJlYWN0aW9uICAgID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoc3BlY2llc0NvbnN0cnVjdG9yKHRoaXMsICRQcm9taXNlKSk7XG4gICAgICByZWFjdGlvbi5vayAgICAgPSB0eXBlb2Ygb25GdWxmaWxsZWQgPT0gJ2Z1bmN0aW9uJyA/IG9uRnVsZmlsbGVkIDogdHJ1ZTtcbiAgICAgIHJlYWN0aW9uLmZhaWwgICA9IHR5cGVvZiBvblJlamVjdGVkID09ICdmdW5jdGlvbicgJiYgb25SZWplY3RlZDtcbiAgICAgIHJlYWN0aW9uLmRvbWFpbiA9IGlzTm9kZSA/IHByb2Nlc3MuZG9tYWluIDogdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fYy5wdXNoKHJlYWN0aW9uKTtcbiAgICAgIGlmKHRoaXMuX2EpdGhpcy5fYS5wdXNoKHJlYWN0aW9uKTtcbiAgICAgIGlmKHRoaXMuX3Mpbm90aWZ5KHRoaXMsIGZhbHNlKTtcbiAgICAgIHJldHVybiByZWFjdGlvbi5wcm9taXNlO1xuICAgIH0sXG4gICAgLy8gMjUuNC41LjEgUHJvbWlzZS5wcm90b3R5cGUuY2F0Y2gob25SZWplY3RlZClcbiAgICAnY2F0Y2gnOiBmdW5jdGlvbihvblJlamVjdGVkKXtcbiAgICAgIHJldHVybiB0aGlzLnRoZW4odW5kZWZpbmVkLCBvblJlamVjdGVkKTtcbiAgICB9XG4gIH0pO1xuICBQcm9taXNlQ2FwYWJpbGl0eSA9IGZ1bmN0aW9uKCl7XG4gICAgdmFyIHByb21pc2UgID0gbmV3IEludGVybmFsO1xuICAgIHRoaXMucHJvbWlzZSA9IHByb21pc2U7XG4gICAgdGhpcy5yZXNvbHZlID0gY3R4KCRyZXNvbHZlLCBwcm9taXNlLCAxKTtcbiAgICB0aGlzLnJlamVjdCAgPSBjdHgoJHJlamVjdCwgcHJvbWlzZSwgMSk7XG4gIH07XG59XG5cbiRleHBvcnQoJGV4cG9ydC5HICsgJGV4cG9ydC5XICsgJGV4cG9ydC5GICogIVVTRV9OQVRJVkUsIHtQcm9taXNlOiAkUHJvbWlzZX0pO1xucmVxdWlyZSgnLi9fc2V0LXRvLXN0cmluZy10YWcnKSgkUHJvbWlzZSwgUFJPTUlTRSk7XG5yZXF1aXJlKCcuL19zZXQtc3BlY2llcycpKFBST01JU0UpO1xuV3JhcHBlciA9IHJlcXVpcmUoJy4vX2NvcmUnKVtQUk9NSVNFXTtcblxuLy8gc3RhdGljc1xuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwgUFJPTUlTRSwge1xuICAvLyAyNS40LjQuNSBQcm9taXNlLnJlamVjdChyKVxuICByZWplY3Q6IGZ1bmN0aW9uIHJlamVjdChyKXtcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KHRoaXMpXG4gICAgICAsICQkcmVqZWN0ICAgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICAkJHJlamVjdChyKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTtcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogKExJQlJBUlkgfHwgIVVTRV9OQVRJVkUpLCBQUk9NSVNFLCB7XG4gIC8vIDI1LjQuNC42IFByb21pc2UucmVzb2x2ZSh4KVxuICByZXNvbHZlOiBmdW5jdGlvbiByZXNvbHZlKHgpe1xuICAgIC8vIGluc3RhbmNlb2YgaW5zdGVhZCBvZiBpbnRlcm5hbCBzbG90IGNoZWNrIGJlY2F1c2Ugd2Ugc2hvdWxkIGZpeCBpdCB3aXRob3V0IHJlcGxhY2VtZW50IG5hdGl2ZSBQcm9taXNlIGNvcmVcbiAgICBpZih4IGluc3RhbmNlb2YgJFByb21pc2UgJiYgc2FtZUNvbnN0cnVjdG9yKHguY29uc3RydWN0b3IsIHRoaXMpKXJldHVybiB4O1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkodGhpcylcbiAgICAgICwgJCRyZXNvbHZlICA9IGNhcGFiaWxpdHkucmVzb2x2ZTtcbiAgICAkJHJlc29sdmUoeCk7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7XG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICEoVVNFX05BVElWRSAmJiByZXF1aXJlKCcuL19pdGVyLWRldGVjdCcpKGZ1bmN0aW9uKGl0ZXIpe1xuICAkUHJvbWlzZS5hbGwoaXRlcilbJ2NhdGNoJ10oZW1wdHkpO1xufSkpLCBQUk9NSVNFLCB7XG4gIC8vIDI1LjQuNC4xIFByb21pc2UuYWxsKGl0ZXJhYmxlKVxuICBhbGw6IGZ1bmN0aW9uIGFsbChpdGVyYWJsZSl7XG4gICAgdmFyIEMgICAgICAgICAgPSB0aGlzXG4gICAgICAsIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShDKVxuICAgICAgLCByZXNvbHZlICAgID0gY2FwYWJpbGl0eS5yZXNvbHZlXG4gICAgICAsIHJlamVjdCAgICAgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICB2YXIgYWJydXB0ID0gcGVyZm9ybShmdW5jdGlvbigpe1xuICAgICAgdmFyIHZhbHVlcyAgICA9IFtdXG4gICAgICAgICwgaW5kZXggICAgID0gMFxuICAgICAgICAsIHJlbWFpbmluZyA9IDE7XG4gICAgICBmb3JPZihpdGVyYWJsZSwgZmFsc2UsIGZ1bmN0aW9uKHByb21pc2Upe1xuICAgICAgICB2YXIgJGluZGV4ICAgICAgICA9IGluZGV4KytcbiAgICAgICAgICAsIGFscmVhZHlDYWxsZWQgPSBmYWxzZTtcbiAgICAgICAgdmFsdWVzLnB1c2godW5kZWZpbmVkKTtcbiAgICAgICAgcmVtYWluaW5nKys7XG4gICAgICAgIEMucmVzb2x2ZShwcm9taXNlKS50aGVuKGZ1bmN0aW9uKHZhbHVlKXtcbiAgICAgICAgICBpZihhbHJlYWR5Q2FsbGVkKXJldHVybjtcbiAgICAgICAgICBhbHJlYWR5Q2FsbGVkICA9IHRydWU7XG4gICAgICAgICAgdmFsdWVzWyRpbmRleF0gPSB2YWx1ZTtcbiAgICAgICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgICAgIH0sIHJlamVjdCk7XG4gICAgICB9KTtcbiAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTtcbiAgICB9KTtcbiAgICBpZihhYnJ1cHQpcmVqZWN0KGFicnVwdC5lcnJvcik7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfSxcbiAgLy8gMjUuNC40LjQgUHJvbWlzZS5yYWNlKGl0ZXJhYmxlKVxuICByYWNlOiBmdW5jdGlvbiByYWNlKGl0ZXJhYmxlKXtcbiAgICB2YXIgQyAgICAgICAgICA9IHRoaXNcbiAgICAgICwgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KEMpXG4gICAgICAsIHJlamVjdCAgICAgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICB2YXIgYWJydXB0ID0gcGVyZm9ybShmdW5jdGlvbigpe1xuICAgICAgZm9yT2YoaXRlcmFibGUsIGZhbHNlLCBmdW5jdGlvbihwcm9taXNlKXtcbiAgICAgICAgQy5yZXNvbHZlKHByb21pc2UpLnRoZW4oY2FwYWJpbGl0eS5yZXNvbHZlLCByZWplY3QpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgaWYoYWJydXB0KXJlamVjdChhYnJ1cHQuZXJyb3IpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pOyIsIid1c2Ugc3RyaWN0JztcbnZhciAkYXQgID0gcmVxdWlyZSgnLi9fc3RyaW5nLWF0JykodHJ1ZSk7XG5cbi8vIDIxLjEuMy4yNyBTdHJpbmcucHJvdG90eXBlW0BAaXRlcmF0b3JdKClcbnJlcXVpcmUoJy4vX2l0ZXItZGVmaW5lJykoU3RyaW5nLCAnU3RyaW5nJywgZnVuY3Rpb24oaXRlcmF0ZWQpe1xuICB0aGlzLl90ID0gU3RyaW5nKGl0ZXJhdGVkKTsgLy8gdGFyZ2V0XG4gIHRoaXMuX2kgPSAwOyAgICAgICAgICAgICAgICAvLyBuZXh0IGluZGV4XG4vLyAyMS4xLjUuMi4xICVTdHJpbmdJdGVyYXRvclByb3RvdHlwZSUubmV4dCgpXG59LCBmdW5jdGlvbigpe1xuICB2YXIgTyAgICAgPSB0aGlzLl90XG4gICAgLCBpbmRleCA9IHRoaXMuX2lcbiAgICAsIHBvaW50O1xuICBpZihpbmRleCA+PSBPLmxlbmd0aClyZXR1cm4ge3ZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWV9O1xuICBwb2ludCA9ICRhdChPLCBpbmRleCk7XG4gIHRoaXMuX2kgKz0gcG9pbnQubGVuZ3RoO1xuICByZXR1cm4ge3ZhbHVlOiBwb2ludCwgZG9uZTogZmFsc2V9O1xufSk7IiwiJ3VzZSBzdHJpY3QnO1xuLy8gRUNNQVNjcmlwdCA2IHN5bWJvbHMgc2hpbVxudmFyIGdsb2JhbCAgICAgICAgID0gcmVxdWlyZSgnLi9fZ2xvYmFsJylcbiAgLCBoYXMgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2hhcycpXG4gICwgREVTQ1JJUFRPUlMgICAgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpXG4gICwgJGV4cG9ydCAgICAgICAgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAsIHJlZGVmaW5lICAgICAgID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUnKVxuICAsIE1FVEEgICAgICAgICAgID0gcmVxdWlyZSgnLi9fbWV0YScpLktFWVxuICAsICRmYWlscyAgICAgICAgID0gcmVxdWlyZSgnLi9fZmFpbHMnKVxuICAsIHNoYXJlZCAgICAgICAgID0gcmVxdWlyZSgnLi9fc2hhcmVkJylcbiAgLCBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4vX3NldC10by1zdHJpbmctdGFnJylcbiAgLCB1aWQgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX3VpZCcpXG4gICwgd2tzICAgICAgICAgICAgPSByZXF1aXJlKCcuL193a3MnKVxuICAsIHdrc0V4dCAgICAgICAgID0gcmVxdWlyZSgnLi9fd2tzLWV4dCcpXG4gICwgd2tzRGVmaW5lICAgICAgPSByZXF1aXJlKCcuL193a3MtZGVmaW5lJylcbiAgLCBrZXlPZiAgICAgICAgICA9IHJlcXVpcmUoJy4vX2tleW9mJylcbiAgLCBlbnVtS2V5cyAgICAgICA9IHJlcXVpcmUoJy4vX2VudW0ta2V5cycpXG4gICwgaXNBcnJheSAgICAgICAgPSByZXF1aXJlKCcuL19pcy1hcnJheScpXG4gICwgYW5PYmplY3QgICAgICAgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKVxuICAsIHRvSU9iamVjdCAgICAgID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpXG4gICwgdG9QcmltaXRpdmUgICAgPSByZXF1aXJlKCcuL190by1wcmltaXRpdmUnKVxuICAsIGNyZWF0ZURlc2MgICAgID0gcmVxdWlyZSgnLi9fcHJvcGVydHktZGVzYycpXG4gICwgX2NyZWF0ZSAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtY3JlYXRlJylcbiAgLCBnT1BORXh0ICAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BuLWV4dCcpXG4gICwgJEdPUEQgICAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wZCcpXG4gICwgJERQICAgICAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKVxuICAsICRrZXlzICAgICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKVxuICAsIGdPUEQgICAgICAgICAgID0gJEdPUEQuZlxuICAsIGRQICAgICAgICAgICAgID0gJERQLmZcbiAgLCBnT1BOICAgICAgICAgICA9IGdPUE5FeHQuZlxuICAsICRTeW1ib2wgICAgICAgID0gZ2xvYmFsLlN5bWJvbFxuICAsICRKU09OICAgICAgICAgID0gZ2xvYmFsLkpTT05cbiAgLCBfc3RyaW5naWZ5ICAgICA9ICRKU09OICYmICRKU09OLnN0cmluZ2lmeVxuICAsIFBST1RPVFlQRSAgICAgID0gJ3Byb3RvdHlwZSdcbiAgLCBISURERU4gICAgICAgICA9IHdrcygnX2hpZGRlbicpXG4gICwgVE9fUFJJTUlUSVZFICAgPSB3a3MoJ3RvUHJpbWl0aXZlJylcbiAgLCBpc0VudW0gICAgICAgICA9IHt9LnByb3BlcnR5SXNFbnVtZXJhYmxlXG4gICwgU3ltYm9sUmVnaXN0cnkgPSBzaGFyZWQoJ3N5bWJvbC1yZWdpc3RyeScpXG4gICwgQWxsU3ltYm9scyAgICAgPSBzaGFyZWQoJ3N5bWJvbHMnKVxuICAsIE9QU3ltYm9scyAgICAgID0gc2hhcmVkKCdvcC1zeW1ib2xzJylcbiAgLCBPYmplY3RQcm90byAgICA9IE9iamVjdFtQUk9UT1RZUEVdXG4gICwgVVNFX05BVElWRSAgICAgPSB0eXBlb2YgJFN5bWJvbCA9PSAnZnVuY3Rpb24nXG4gICwgUU9iamVjdCAgICAgICAgPSBnbG9iYWwuUU9iamVjdDtcbi8vIERvbid0IHVzZSBzZXR0ZXJzIGluIFF0IFNjcmlwdCwgaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzE3M1xudmFyIHNldHRlciA9ICFRT2JqZWN0IHx8ICFRT2JqZWN0W1BST1RPVFlQRV0gfHwgIVFPYmplY3RbUFJPVE9UWVBFXS5maW5kQ2hpbGQ7XG5cbi8vIGZhbGxiYWNrIGZvciBvbGQgQW5kcm9pZCwgaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTY4N1xudmFyIHNldFN5bWJvbERlc2MgPSBERVNDUklQVE9SUyAmJiAkZmFpbHMoZnVuY3Rpb24oKXtcbiAgcmV0dXJuIF9jcmVhdGUoZFAoe30sICdhJywge1xuICAgIGdldDogZnVuY3Rpb24oKXsgcmV0dXJuIGRQKHRoaXMsICdhJywge3ZhbHVlOiA3fSkuYTsgfVxuICB9KSkuYSAhPSA3O1xufSkgPyBmdW5jdGlvbihpdCwga2V5LCBEKXtcbiAgdmFyIHByb3RvRGVzYyA9IGdPUEQoT2JqZWN0UHJvdG8sIGtleSk7XG4gIGlmKHByb3RvRGVzYylkZWxldGUgT2JqZWN0UHJvdG9ba2V5XTtcbiAgZFAoaXQsIGtleSwgRCk7XG4gIGlmKHByb3RvRGVzYyAmJiBpdCAhPT0gT2JqZWN0UHJvdG8pZFAoT2JqZWN0UHJvdG8sIGtleSwgcHJvdG9EZXNjKTtcbn0gOiBkUDtcblxudmFyIHdyYXAgPSBmdW5jdGlvbih0YWcpe1xuICB2YXIgc3ltID0gQWxsU3ltYm9sc1t0YWddID0gX2NyZWF0ZSgkU3ltYm9sW1BST1RPVFlQRV0pO1xuICBzeW0uX2sgPSB0YWc7XG4gIHJldHVybiBzeW07XG59O1xuXG52YXIgaXNTeW1ib2wgPSBVU0VfTkFUSVZFICYmIHR5cGVvZiAkU3ltYm9sLml0ZXJhdG9yID09ICdzeW1ib2wnID8gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gdHlwZW9mIGl0ID09ICdzeW1ib2wnO1xufSA6IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIGl0IGluc3RhbmNlb2YgJFN5bWJvbDtcbn07XG5cbnZhciAkZGVmaW5lUHJvcGVydHkgPSBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShpdCwga2V5LCBEKXtcbiAgaWYoaXQgPT09IE9iamVjdFByb3RvKSRkZWZpbmVQcm9wZXJ0eShPUFN5bWJvbHMsIGtleSwgRCk7XG4gIGFuT2JqZWN0KGl0KTtcbiAga2V5ID0gdG9QcmltaXRpdmUoa2V5LCB0cnVlKTtcbiAgYW5PYmplY3QoRCk7XG4gIGlmKGhhcyhBbGxTeW1ib2xzLCBrZXkpKXtcbiAgICBpZighRC5lbnVtZXJhYmxlKXtcbiAgICAgIGlmKCFoYXMoaXQsIEhJRERFTikpZFAoaXQsIEhJRERFTiwgY3JlYXRlRGVzYygxLCB7fSkpO1xuICAgICAgaXRbSElEREVOXVtrZXldID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYoaGFzKGl0LCBISURERU4pICYmIGl0W0hJRERFTl1ba2V5XSlpdFtISURERU5dW2tleV0gPSBmYWxzZTtcbiAgICAgIEQgPSBfY3JlYXRlKEQsIHtlbnVtZXJhYmxlOiBjcmVhdGVEZXNjKDAsIGZhbHNlKX0pO1xuICAgIH0gcmV0dXJuIHNldFN5bWJvbERlc2MoaXQsIGtleSwgRCk7XG4gIH0gcmV0dXJuIGRQKGl0LCBrZXksIEQpO1xufTtcbnZhciAkZGVmaW5lUHJvcGVydGllcyA9IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXMoaXQsIFApe1xuICBhbk9iamVjdChpdCk7XG4gIHZhciBrZXlzID0gZW51bUtleXMoUCA9IHRvSU9iamVjdChQKSlcbiAgICAsIGkgICAgPSAwXG4gICAgLCBsID0ga2V5cy5sZW5ndGhcbiAgICAsIGtleTtcbiAgd2hpbGUobCA+IGkpJGRlZmluZVByb3BlcnR5KGl0LCBrZXkgPSBrZXlzW2krK10sIFBba2V5XSk7XG4gIHJldHVybiBpdDtcbn07XG52YXIgJGNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZShpdCwgUCl7XG4gIHJldHVybiBQID09PSB1bmRlZmluZWQgPyBfY3JlYXRlKGl0KSA6ICRkZWZpbmVQcm9wZXJ0aWVzKF9jcmVhdGUoaXQpLCBQKTtcbn07XG52YXIgJHByb3BlcnR5SXNFbnVtZXJhYmxlID0gZnVuY3Rpb24gcHJvcGVydHlJc0VudW1lcmFibGUoa2V5KXtcbiAgdmFyIEUgPSBpc0VudW0uY2FsbCh0aGlzLCBrZXkgPSB0b1ByaW1pdGl2ZShrZXksIHRydWUpKTtcbiAgaWYodGhpcyA9PT0gT2JqZWN0UHJvdG8gJiYgaGFzKEFsbFN5bWJvbHMsIGtleSkgJiYgIWhhcyhPUFN5bWJvbHMsIGtleSkpcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gRSB8fCAhaGFzKHRoaXMsIGtleSkgfHwgIWhhcyhBbGxTeW1ib2xzLCBrZXkpIHx8IGhhcyh0aGlzLCBISURERU4pICYmIHRoaXNbSElEREVOXVtrZXldID8gRSA6IHRydWU7XG59O1xudmFyICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaXQsIGtleSl7XG4gIGl0ICA9IHRvSU9iamVjdChpdCk7XG4gIGtleSA9IHRvUHJpbWl0aXZlKGtleSwgdHJ1ZSk7XG4gIGlmKGl0ID09PSBPYmplY3RQcm90byAmJiBoYXMoQWxsU3ltYm9scywga2V5KSAmJiAhaGFzKE9QU3ltYm9scywga2V5KSlyZXR1cm47XG4gIHZhciBEID0gZ09QRChpdCwga2V5KTtcbiAgaWYoRCAmJiBoYXMoQWxsU3ltYm9scywga2V5KSAmJiAhKGhhcyhpdCwgSElEREVOKSAmJiBpdFtISURERU5dW2tleV0pKUQuZW51bWVyYWJsZSA9IHRydWU7XG4gIHJldHVybiBEO1xufTtcbnZhciAkZ2V0T3duUHJvcGVydHlOYW1lcyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoaXQpe1xuICB2YXIgbmFtZXMgID0gZ09QTih0b0lPYmplY3QoaXQpKVxuICAgICwgcmVzdWx0ID0gW11cbiAgICAsIGkgICAgICA9IDBcbiAgICAsIGtleTtcbiAgd2hpbGUobmFtZXMubGVuZ3RoID4gaSl7XG4gICAgaWYoIWhhcyhBbGxTeW1ib2xzLCBrZXkgPSBuYW1lc1tpKytdKSAmJiBrZXkgIT0gSElEREVOICYmIGtleSAhPSBNRVRBKXJlc3VsdC5wdXNoKGtleSk7XG4gIH0gcmV0dXJuIHJlc3VsdDtcbn07XG52YXIgJGdldE93blByb3BlcnR5U3ltYm9scyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5U3ltYm9scyhpdCl7XG4gIHZhciBJU19PUCAgPSBpdCA9PT0gT2JqZWN0UHJvdG9cbiAgICAsIG5hbWVzICA9IGdPUE4oSVNfT1AgPyBPUFN5bWJvbHMgOiB0b0lPYmplY3QoaXQpKVxuICAgICwgcmVzdWx0ID0gW11cbiAgICAsIGkgICAgICA9IDBcbiAgICAsIGtleTtcbiAgd2hpbGUobmFtZXMubGVuZ3RoID4gaSl7XG4gICAgaWYoaGFzKEFsbFN5bWJvbHMsIGtleSA9IG5hbWVzW2krK10pICYmIChJU19PUCA/IGhhcyhPYmplY3RQcm90bywga2V5KSA6IHRydWUpKXJlc3VsdC5wdXNoKEFsbFN5bWJvbHNba2V5XSk7XG4gIH0gcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8vIDE5LjQuMS4xIFN5bWJvbChbZGVzY3JpcHRpb25dKVxuaWYoIVVTRV9OQVRJVkUpe1xuICAkU3ltYm9sID0gZnVuY3Rpb24gU3ltYm9sKCl7XG4gICAgaWYodGhpcyBpbnN0YW5jZW9mICRTeW1ib2wpdGhyb3cgVHlwZUVycm9yKCdTeW1ib2wgaXMgbm90IGEgY29uc3RydWN0b3IhJyk7XG4gICAgdmFyIHRhZyA9IHVpZChhcmd1bWVudHMubGVuZ3RoID4gMCA/IGFyZ3VtZW50c1swXSA6IHVuZGVmaW5lZCk7XG4gICAgdmFyICRzZXQgPSBmdW5jdGlvbih2YWx1ZSl7XG4gICAgICBpZih0aGlzID09PSBPYmplY3RQcm90bykkc2V0LmNhbGwoT1BTeW1ib2xzLCB2YWx1ZSk7XG4gICAgICBpZihoYXModGhpcywgSElEREVOKSAmJiBoYXModGhpc1tISURERU5dLCB0YWcpKXRoaXNbSElEREVOXVt0YWddID0gZmFsc2U7XG4gICAgICBzZXRTeW1ib2xEZXNjKHRoaXMsIHRhZywgY3JlYXRlRGVzYygxLCB2YWx1ZSkpO1xuICAgIH07XG4gICAgaWYoREVTQ1JJUFRPUlMgJiYgc2V0dGVyKXNldFN5bWJvbERlc2MoT2JqZWN0UHJvdG8sIHRhZywge2NvbmZpZ3VyYWJsZTogdHJ1ZSwgc2V0OiAkc2V0fSk7XG4gICAgcmV0dXJuIHdyYXAodGFnKTtcbiAgfTtcbiAgcmVkZWZpbmUoJFN5bWJvbFtQUk9UT1RZUEVdLCAndG9TdHJpbmcnLCBmdW5jdGlvbiB0b1N0cmluZygpe1xuICAgIHJldHVybiB0aGlzLl9rO1xuICB9KTtcblxuICAkR09QRC5mID0gJGdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbiAgJERQLmYgICA9ICRkZWZpbmVQcm9wZXJ0eTtcbiAgcmVxdWlyZSgnLi9fb2JqZWN0LWdvcG4nKS5mID0gZ09QTkV4dC5mID0gJGdldE93blByb3BlcnR5TmFtZXM7XG4gIHJlcXVpcmUoJy4vX29iamVjdC1waWUnKS5mICA9ICRwcm9wZXJ0eUlzRW51bWVyYWJsZTtcbiAgcmVxdWlyZSgnLi9fb2JqZWN0LWdvcHMnKS5mID0gJGdldE93blByb3BlcnR5U3ltYm9scztcblxuICBpZihERVNDUklQVE9SUyAmJiAhcmVxdWlyZSgnLi9fbGlicmFyeScpKXtcbiAgICByZWRlZmluZShPYmplY3RQcm90bywgJ3Byb3BlcnR5SXNFbnVtZXJhYmxlJywgJHByb3BlcnR5SXNFbnVtZXJhYmxlLCB0cnVlKTtcbiAgfVxuXG4gIHdrc0V4dC5mID0gZnVuY3Rpb24obmFtZSl7XG4gICAgcmV0dXJuIHdyYXAod2tzKG5hbWUpKTtcbiAgfVxufVxuXG4kZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuVyArICRleHBvcnQuRiAqICFVU0VfTkFUSVZFLCB7U3ltYm9sOiAkU3ltYm9sfSk7XG5cbmZvcih2YXIgc3ltYm9scyA9IChcbiAgLy8gMTkuNC4yLjIsIDE5LjQuMi4zLCAxOS40LjIuNCwgMTkuNC4yLjYsIDE5LjQuMi44LCAxOS40LjIuOSwgMTkuNC4yLjEwLCAxOS40LjIuMTEsIDE5LjQuMi4xMiwgMTkuNC4yLjEzLCAxOS40LjIuMTRcbiAgJ2hhc0luc3RhbmNlLGlzQ29uY2F0U3ByZWFkYWJsZSxpdGVyYXRvcixtYXRjaCxyZXBsYWNlLHNlYXJjaCxzcGVjaWVzLHNwbGl0LHRvUHJpbWl0aXZlLHRvU3RyaW5nVGFnLHVuc2NvcGFibGVzJ1xuKS5zcGxpdCgnLCcpLCBpID0gMDsgc3ltYm9scy5sZW5ndGggPiBpOyApd2tzKHN5bWJvbHNbaSsrXSk7XG5cbmZvcih2YXIgc3ltYm9scyA9ICRrZXlzKHdrcy5zdG9yZSksIGkgPSAwOyBzeW1ib2xzLmxlbmd0aCA+IGk7ICl3a3NEZWZpbmUoc3ltYm9sc1tpKytdKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwgJ1N5bWJvbCcsIHtcbiAgLy8gMTkuNC4yLjEgU3ltYm9sLmZvcihrZXkpXG4gICdmb3InOiBmdW5jdGlvbihrZXkpe1xuICAgIHJldHVybiBoYXMoU3ltYm9sUmVnaXN0cnksIGtleSArPSAnJylcbiAgICAgID8gU3ltYm9sUmVnaXN0cnlba2V5XVxuICAgICAgOiBTeW1ib2xSZWdpc3RyeVtrZXldID0gJFN5bWJvbChrZXkpO1xuICB9LFxuICAvLyAxOS40LjIuNSBTeW1ib2wua2V5Rm9yKHN5bSlcbiAga2V5Rm9yOiBmdW5jdGlvbiBrZXlGb3Ioa2V5KXtcbiAgICBpZihpc1N5bWJvbChrZXkpKXJldHVybiBrZXlPZihTeW1ib2xSZWdpc3RyeSwga2V5KTtcbiAgICB0aHJvdyBUeXBlRXJyb3Ioa2V5ICsgJyBpcyBub3QgYSBzeW1ib2whJyk7XG4gIH0sXG4gIHVzZVNldHRlcjogZnVuY3Rpb24oKXsgc2V0dGVyID0gdHJ1ZTsgfSxcbiAgdXNlU2ltcGxlOiBmdW5jdGlvbigpeyBzZXR0ZXIgPSBmYWxzZTsgfVxufSk7XG5cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIVVTRV9OQVRJVkUsICdPYmplY3QnLCB7XG4gIC8vIDE5LjEuMi4yIE9iamVjdC5jcmVhdGUoTyBbLCBQcm9wZXJ0aWVzXSlcbiAgY3JlYXRlOiAkY3JlYXRlLFxuICAvLyAxOS4xLjIuNCBPYmplY3QuZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcylcbiAgZGVmaW5lUHJvcGVydHk6ICRkZWZpbmVQcm9wZXJ0eSxcbiAgLy8gMTkuMS4yLjMgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoTywgUHJvcGVydGllcylcbiAgZGVmaW5lUHJvcGVydGllczogJGRlZmluZVByb3BlcnRpZXMsXG4gIC8vIDE5LjEuMi42IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUClcbiAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLFxuICAvLyAxOS4xLjIuNyBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhPKVxuICBnZXRPd25Qcm9wZXJ0eU5hbWVzOiAkZ2V0T3duUHJvcGVydHlOYW1lcyxcbiAgLy8gMTkuMS4yLjggT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhPKVxuICBnZXRPd25Qcm9wZXJ0eVN5bWJvbHM6ICRnZXRPd25Qcm9wZXJ0eVN5bWJvbHNcbn0pO1xuXG4vLyAyNC4zLjIgSlNPTi5zdHJpbmdpZnkodmFsdWUgWywgcmVwbGFjZXIgWywgc3BhY2VdXSlcbiRKU09OICYmICRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogKCFVU0VfTkFUSVZFIHx8ICRmYWlscyhmdW5jdGlvbigpe1xuICB2YXIgUyA9ICRTeW1ib2woKTtcbiAgLy8gTVMgRWRnZSBjb252ZXJ0cyBzeW1ib2wgdmFsdWVzIHRvIEpTT04gYXMge31cbiAgLy8gV2ViS2l0IGNvbnZlcnRzIHN5bWJvbCB2YWx1ZXMgdG8gSlNPTiBhcyBudWxsXG4gIC8vIFY4IHRocm93cyBvbiBib3hlZCBzeW1ib2xzXG4gIHJldHVybiBfc3RyaW5naWZ5KFtTXSkgIT0gJ1tudWxsXScgfHwgX3N0cmluZ2lmeSh7YTogU30pICE9ICd7fScgfHwgX3N0cmluZ2lmeShPYmplY3QoUykpICE9ICd7fSc7XG59KSksICdKU09OJywge1xuICBzdHJpbmdpZnk6IGZ1bmN0aW9uIHN0cmluZ2lmeShpdCl7XG4gICAgaWYoaXQgPT09IHVuZGVmaW5lZCB8fCBpc1N5bWJvbChpdCkpcmV0dXJuOyAvLyBJRTggcmV0dXJucyBzdHJpbmcgb24gdW5kZWZpbmVkXG4gICAgdmFyIGFyZ3MgPSBbaXRdXG4gICAgICAsIGkgICAgPSAxXG4gICAgICAsIHJlcGxhY2VyLCAkcmVwbGFjZXI7XG4gICAgd2hpbGUoYXJndW1lbnRzLmxlbmd0aCA+IGkpYXJncy5wdXNoKGFyZ3VtZW50c1tpKytdKTtcbiAgICByZXBsYWNlciA9IGFyZ3NbMV07XG4gICAgaWYodHlwZW9mIHJlcGxhY2VyID09ICdmdW5jdGlvbicpJHJlcGxhY2VyID0gcmVwbGFjZXI7XG4gICAgaWYoJHJlcGxhY2VyIHx8ICFpc0FycmF5KHJlcGxhY2VyKSlyZXBsYWNlciA9IGZ1bmN0aW9uKGtleSwgdmFsdWUpe1xuICAgICAgaWYoJHJlcGxhY2VyKXZhbHVlID0gJHJlcGxhY2VyLmNhbGwodGhpcywga2V5LCB2YWx1ZSk7XG4gICAgICBpZighaXNTeW1ib2wodmFsdWUpKXJldHVybiB2YWx1ZTtcbiAgICB9O1xuICAgIGFyZ3NbMV0gPSByZXBsYWNlcjtcbiAgICByZXR1cm4gX3N0cmluZ2lmeS5hcHBseSgkSlNPTiwgYXJncyk7XG4gIH1cbn0pO1xuXG4vLyAxOS40LjMuNCBTeW1ib2wucHJvdG90eXBlW0BAdG9QcmltaXRpdmVdKGhpbnQpXG4kU3ltYm9sW1BST1RPVFlQRV1bVE9fUFJJTUlUSVZFXSB8fCByZXF1aXJlKCcuL19oaWRlJykoJFN5bWJvbFtQUk9UT1RZUEVdLCBUT19QUklNSVRJVkUsICRTeW1ib2xbUFJPVE9UWVBFXS52YWx1ZU9mKTtcbi8vIDE5LjQuMy41IFN5bWJvbC5wcm90b3R5cGVbQEB0b1N0cmluZ1RhZ11cbnNldFRvU3RyaW5nVGFnKCRTeW1ib2wsICdTeW1ib2wnKTtcbi8vIDIwLjIuMS45IE1hdGhbQEB0b1N0cmluZ1RhZ11cbnNldFRvU3RyaW5nVGFnKE1hdGgsICdNYXRoJywgdHJ1ZSk7XG4vLyAyNC4zLjMgSlNPTltAQHRvU3RyaW5nVGFnXVxuc2V0VG9TdHJpbmdUYWcoZ2xvYmFsLkpTT04sICdKU09OJywgdHJ1ZSk7IiwicmVxdWlyZSgnLi9fd2tzLWRlZmluZScpKCdhc3luY0l0ZXJhdG9yJyk7IiwicmVxdWlyZSgnLi9fd2tzLWRlZmluZScpKCdvYnNlcnZhYmxlJyk7IiwicmVxdWlyZSgnLi9lczYuYXJyYXkuaXRlcmF0b3InKTtcbnZhciBnbG9iYWwgICAgICAgID0gcmVxdWlyZSgnLi9fZ2xvYmFsJylcbiAgLCBoaWRlICAgICAgICAgID0gcmVxdWlyZSgnLi9faGlkZScpXG4gICwgSXRlcmF0b3JzICAgICA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpXG4gICwgVE9fU1RSSU5HX1RBRyA9IHJlcXVpcmUoJy4vX3drcycpKCd0b1N0cmluZ1RhZycpO1xuXG5mb3IodmFyIGNvbGxlY3Rpb25zID0gWydOb2RlTGlzdCcsICdET01Ub2tlbkxpc3QnLCAnTWVkaWFMaXN0JywgJ1N0eWxlU2hlZXRMaXN0JywgJ0NTU1J1bGVMaXN0J10sIGkgPSAwOyBpIDwgNTsgaSsrKXtcbiAgdmFyIE5BTUUgICAgICAgPSBjb2xsZWN0aW9uc1tpXVxuICAgICwgQ29sbGVjdGlvbiA9IGdsb2JhbFtOQU1FXVxuICAgICwgcHJvdG8gICAgICA9IENvbGxlY3Rpb24gJiYgQ29sbGVjdGlvbi5wcm90b3R5cGU7XG4gIGlmKHByb3RvICYmICFwcm90b1tUT19TVFJJTkdfVEFHXSloaWRlKHByb3RvLCBUT19TVFJJTkdfVEFHLCBOQU1FKTtcbiAgSXRlcmF0b3JzW05BTUVdID0gSXRlcmF0b3JzLkFycmF5O1xufSIsIihmdW5jdGlvbiAocHJvY2Vzcyl7XG4ndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfc2xpY2VkVG9BcnJheTIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvc2xpY2VkVG9BcnJheScpO1xuXG52YXIgX3NsaWNlZFRvQXJyYXkzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfc2xpY2VkVG9BcnJheTIpO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBjcmVhdGVIdHRwQ2xpZW50O1xuXG52YXIgX3FzID0gcmVxdWlyZSgncXMnKTtcblxudmFyIF9xczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9xcyk7XG5cbnZhciBfY2xvbmVEZWVwID0gcmVxdWlyZSgnbG9kYXNoL2Nsb25lRGVlcCcpO1xuXG52YXIgX2Nsb25lRGVlcDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbG9uZURlZXApO1xuXG52YXIgX2Fzc2lnbiA9IHJlcXVpcmUoJ2xvZGFzaC9hc3NpZ24nKTtcblxudmFyIF9hc3NpZ24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfYXNzaWduKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuLyoqXG4gKiBDcmVhdGUgcHJlIGNvbmZpZ3VyZWQgYXhpb3MgaW5zdGFuY2VcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gYXhpb3MgLSBBeGlvcyBsaWJyYXJ5XG4gKiBAcGFyYW0ge09iamVjdH0gaHR0cENsaWVudFBhcmFtcyAtIEluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMgZm9yIHRoZSBIVFRQIGNsaWVudFxuICogQHByb3Age3N0cmluZ30gc3BhY2UgLSBTcGFjZSBJRFxuICogQHByb3Age3N0cmluZ30gYWNjZXNzVG9rZW4gLSBBY2Nlc3MgVG9rZW5cbiAqIEBwcm9wIHtib29sZWFuPX0gaW5zZWN1cmUgLSBJZiB3ZSBzaG91bGQgdXNlIGh0dHAgaW5zdGVhZFxuICogQHByb3Age3N0cmluZz19IGhvc3QgLSBBbHRlcm5hdGUgaG9zdFxuICogQHByb3Age09iamVjdD19IGFnZW50IC0gSFRUUCBhZ2VudCBmb3Igbm9kZVxuICogQHByb3Age09iamVjdD19IGhlYWRlcnMgLSBBZGRpdGlvbmFsIGhlYWRlcnNcbiAqIEByZXR1cm4ge09iamVjdH0gSW5pdGlhbGl6ZWQgYXhpb3MgaW5zdGFuY2VcbiAqL1xuZnVuY3Rpb24gY3JlYXRlSHR0cENsaWVudChheGlvcywgaHR0cENsaWVudFBhcmFtcykge1xuICB2YXIgc3BhY2UgPSBodHRwQ2xpZW50UGFyYW1zLnNwYWNlO1xuICB2YXIgYWNjZXNzVG9rZW4gPSBodHRwQ2xpZW50UGFyYW1zLmFjY2Vzc1Rva2VuO1xuICB2YXIgaW5zZWN1cmUgPSBodHRwQ2xpZW50UGFyYW1zLmluc2VjdXJlO1xuICB2YXIgaG9zdCA9IGh0dHBDbGllbnRQYXJhbXMuaG9zdDtcbiAgdmFyIGRlZmF1bHRIb3N0bmFtZSA9IGh0dHBDbGllbnRQYXJhbXMuZGVmYXVsdEhvc3RuYW1lO1xuICB2YXIgYWdlbnQgPSBodHRwQ2xpZW50UGFyYW1zLmFnZW50O1xuICB2YXIgaGVhZGVycyA9IGh0dHBDbGllbnRQYXJhbXMuaGVhZGVycztcblxuICB2YXIgX3JlZiA9IGhvc3QgJiYgaG9zdC5zcGxpdCgnOicpIHx8IFtdO1xuXG4gIHZhciBfcmVmMiA9ICgwLCBfc2xpY2VkVG9BcnJheTMuZGVmYXVsdCkoX3JlZiwgMik7XG5cbiAgdmFyIGhvc3RuYW1lID0gX3JlZjJbMF07XG4gIHZhciBwb3J0ID0gX3JlZjJbMV07XG5cbiAgaG9zdG5hbWUgPSBob3N0bmFtZSB8fCBkZWZhdWx0SG9zdG5hbWU7XG4gIHBvcnQgPSBwb3J0IHx8IChpbnNlY3VyZSA/IDgwIDogNDQzKTtcbiAgdmFyIGJhc2VVUkwgPSAoaW5zZWN1cmUgPyAnaHR0cCcgOiAnaHR0cHMnKSArICc6Ly8nICsgaG9zdG5hbWUgKyAnOicgKyBwb3J0ICsgJy9zcGFjZXMvJztcbiAgaWYgKHNwYWNlKSB7XG4gICAgYmFzZVVSTCArPSBzcGFjZSArICcvJztcbiAgfVxuICBoZWFkZXJzID0gaGVhZGVycyB8fCB7fTtcbiAgaGVhZGVyc1snQXV0aG9yaXphdGlvbiddID0gJ0JlYXJlciAnICsgYWNjZXNzVG9rZW47XG5cbiAgLy8gU2V0IHRoZXNlIGhlYWRlcnMgb25seSBmb3Igbm9kZSBiZWNhdXNlIGJyb3dzZXJzIGRvbid0IGxpa2UgaXQgd2hlbiB5b3VcbiAgLy8gb3ZlcnJpZGUgdXNlci1hZ2VudCBvciBhY2NlcHQtZW5jb2RpbmcuXG4gIC8vIFRoZSBTREtzIHNob3VsZCBzZXQgdGhlaXIgb3duIFgtQ29udGVudGZ1bC1Vc2VyLUFnZW50LlxuICBpZiAocHJvY2VzcyAmJiBwcm9jZXNzLnJlbGVhc2UgJiYgcHJvY2Vzcy5yZWxlYXNlLm5hbWUgPT09ICdub2RlJykge1xuICAgIGhlYWRlcnNbJ3VzZXItYWdlbnQnXSA9ICdub2RlLmpzLycgKyBwcm9jZXNzLnZlcnNpb247XG4gICAgaGVhZGVyc1snQWNjZXB0LUVuY29kaW5nJ10gPSAnZ3ppcCc7XG4gIH1cblxuICB2YXIgaW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoe1xuICAgIGJhc2VVUkw6IGJhc2VVUkwsXG4gICAgaGVhZGVyczogaGVhZGVycyxcbiAgICBhZ2VudDogYWdlbnQsXG4gICAgcGFyYW1zU2VyaWFsaXplcjogX3FzMi5kZWZhdWx0LnN0cmluZ2lmeVxuICB9KTtcbiAgaW5zdGFuY2UuaHR0cENsaWVudFBhcmFtcyA9IGh0dHBDbGllbnRQYXJhbXM7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgYXhpb3MgaW5zdGFuY2Ugd2l0aCB0aGUgc2FtZSBkZWZhdWx0IGJhc2UgcGFyYW1ldGVycyBhcyB0aGVcbiAgICogY3VycmVudCBvbmUsIGFuZCB3aXRoIGFueSBvdmVycmlkZXMgcGFzc2VkIHRvIHRoZSBuZXdQYXJhbXMgb2JqZWN0XG4gICAqIFRoaXMgaXMgdXNlZnVsIGFzIHRoZSBTREtzIHVzZSBkZXBlbmRlbmN5IGluamVjdGlvbiB0byBnZXQgdGhlIGF4aW9zIGxpYnJhcnlcbiAgICogYW5kIHRoZSB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IGNvbWVzIGZyb20gZGlmZmVyZW50IHBsYWNlcyBkZXBlbmRpbmdcbiAgICogb24gd2hldGhlciBpdCdzIGEgYnJvd3NlciBidWlsZCBvciBhIG5vZGUuanMgYnVpbGQuXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBodHRwQ2xpZW50UGFyYW1zIC0gSW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycyBmb3IgdGhlIEhUVFAgY2xpZW50XG4gICAqIEByZXR1cm4ge09iamVjdH0gSW5pdGlhbGl6ZWQgYXhpb3MgaW5zdGFuY2VcbiAgICovXG4gIGluc3RhbmNlLmNsb25lV2l0aE5ld1BhcmFtcyA9IGZ1bmN0aW9uIChuZXdQYXJhbXMpIHtcbiAgICByZXR1cm4gY3JlYXRlSHR0cENsaWVudChheGlvcywgKDAsIF9hc3NpZ24yLmRlZmF1bHQpKCgwLCBfY2xvbmVEZWVwMi5kZWZhdWx0KShodHRwQ2xpZW50UGFyYW1zKSwgbmV3UGFyYW1zKSk7XG4gIH07XG5cbiAgcmV0dXJuIGluc3RhbmNlO1xufVxufSkuY2FsbCh0aGlzLHJlcXVpcmUoJ19wcm9jZXNzJykpXG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldDp1dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJbTV2WkdWZmJXOWtkV3hsY3k5amIyNTBaVzUwWm5Wc0xYTmtheTFqYjNKbEwyTnlaV0YwWlMxb2RIUndMV05zYVdWdWRDNXFjeUpkTENKdVlXMWxjeUk2VzEwc0ltMWhjSEJwYm1keklqb2lPMEZCUVVFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CSWl3aVptbHNaU0k2SW1kbGJtVnlZWFJsWkM1cWN5SXNJbk52ZFhKalpWSnZiM1FpT2lJaUxDSnpiM1Z5WTJWelEyOXVkR1Z1ZENJNld5SW5kWE5sSUhOMGNtbGpkQ2M3WEc1Y2JrOWlhbVZqZEM1a1pXWnBibVZRY205d1pYSjBlU2hsZUhCdmNuUnpMQ0JjSWw5ZlpYTk5iMlIxYkdWY0lpd2dlMXh1SUNCMllXeDFaVG9nZEhKMVpWeHVmU2s3WEc1Y2JuWmhjaUJmYzJ4cFkyVmtWRzlCY25KaGVUSWdQU0J5WlhGMWFYSmxLQ2RpWVdKbGJDMXlkVzUwYVcxbEwyaGxiSEJsY25NdmMyeHBZMlZrVkc5QmNuSmhlU2NwTzF4dVhHNTJZWElnWDNOc2FXTmxaRlJ2UVhKeVlYa3pJRDBnWDJsdWRHVnliM0JTWlhGMWFYSmxSR1ZtWVhWc2RDaGZjMnhwWTJWa1ZHOUJjbkpoZVRJcE8xeHVYRzVsZUhCdmNuUnpMbVJsWm1GMWJIUWdQU0JqY21WaGRHVklkSFJ3UTJ4cFpXNTBPMXh1WEc1MllYSWdYM0Z6SUQwZ2NtVnhkV2x5WlNnbmNYTW5LVHRjYmx4dWRtRnlJRjl4Y3pJZ1BTQmZhVzUwWlhKdmNGSmxjWFZwY21WRVpXWmhkV3gwS0Y5eGN5azdYRzVjYm5aaGNpQmZZMnh2Ym1WRVpXVndJRDBnY21WeGRXbHlaU2duYkc5a1lYTm9MMk5zYjI1bFJHVmxjQ2NwTzF4dVhHNTJZWElnWDJOc2IyNWxSR1ZsY0RJZ1BTQmZhVzUwWlhKdmNGSmxjWFZwY21WRVpXWmhkV3gwS0Y5amJHOXVaVVJsWlhBcE8xeHVYRzUyWVhJZ1gyRnpjMmxuYmlBOUlISmxjWFZwY21Vb0oyeHZaR0Z6YUM5aGMzTnBaMjRuS1R0Y2JseHVkbUZ5SUY5aGMzTnBaMjR5SUQwZ1gybHVkR1Z5YjNCU1pYRjFhWEpsUkdWbVlYVnNkQ2hmWVhOemFXZHVLVHRjYmx4dVpuVnVZM1JwYjI0Z1gybHVkR1Z5YjNCU1pYRjFhWEpsUkdWbVlYVnNkQ2h2WW1vcElIc2djbVYwZFhKdUlHOWlhaUFtSmlCdlltb3VYMTlsYzAxdlpIVnNaU0EvSUc5aWFpQTZJSHNnWkdWbVlYVnNkRG9nYjJKcUlIMDdJSDFjYmx4dUx5b3FYRzRnS2lCRGNtVmhkR1VnY0hKbElHTnZibVpwWjNWeVpXUWdZWGhwYjNNZ2FXNXpkR0Z1WTJWY2JpQXFJRUJ3Y21sMllYUmxYRzRnS2lCQWNHRnlZVzBnZTA5aWFtVmpkSDBnWVhocGIzTWdMU0JCZUdsdmN5QnNhV0p5WVhKNVhHNGdLaUJBY0dGeVlXMGdlMDlpYW1WamRIMGdhSFIwY0VOc2FXVnVkRkJoY21GdGN5QXRJRWx1YVhScFlXeHBlbUYwYVc5dUlIQmhjbUZ0WlhSbGNuTWdabTl5SUhSb1pTQklWRlJRSUdOc2FXVnVkRnh1SUNvZ1FIQnliM0FnZTNOMGNtbHVaMzBnYzNCaFkyVWdMU0JUY0dGalpTQkpSRnh1SUNvZ1FIQnliM0FnZTNOMGNtbHVaMzBnWVdOalpYTnpWRzlyWlc0Z0xTQkJZMk5sYzNNZ1ZHOXJaVzVjYmlBcUlFQndjbTl3SUh0aWIyOXNaV0Z1UFgwZ2FXNXpaV04xY21VZ0xTQkpaaUIzWlNCemFHOTFiR1FnZFhObElHaDBkSEFnYVc1emRHVmhaRnh1SUNvZ1FIQnliM0FnZTNOMGNtbHVaejE5SUdodmMzUWdMU0JCYkhSbGNtNWhkR1VnYUc5emRGeHVJQ29nUUhCeWIzQWdlMDlpYW1WamREMTlJR0ZuWlc1MElDMGdTRlJVVUNCaFoyVnVkQ0JtYjNJZ2JtOWtaVnh1SUNvZ1FIQnliM0FnZTA5aWFtVmpkRDE5SUdobFlXUmxjbk1nTFNCQlpHUnBkR2x2Ym1Gc0lHaGxZV1JsY25OY2JpQXFJRUJ5WlhSMWNtNGdlMDlpYW1WamRIMGdTVzVwZEdsaGJHbDZaV1FnWVhocGIzTWdhVzV6ZEdGdVkyVmNiaUFxTDF4dVpuVnVZM1JwYjI0Z1kzSmxZWFJsU0hSMGNFTnNhV1Z1ZENoaGVHbHZjeXdnYUhSMGNFTnNhV1Z1ZEZCaGNtRnRjeWtnZTF4dUlDQjJZWElnYzNCaFkyVWdQU0JvZEhSd1EyeHBaVzUwVUdGeVlXMXpMbk53WVdObE8xeHVJQ0IyWVhJZ1lXTmpaWE56Vkc5clpXNGdQU0JvZEhSd1EyeHBaVzUwVUdGeVlXMXpMbUZqWTJWemMxUnZhMlZ1TzF4dUlDQjJZWElnYVc1elpXTjFjbVVnUFNCb2RIUndRMnhwWlc1MFVHRnlZVzF6TG1sdWMyVmpkWEpsTzF4dUlDQjJZWElnYUc5emRDQTlJR2gwZEhCRGJHbGxiblJRWVhKaGJYTXVhRzl6ZER0Y2JpQWdkbUZ5SUdSbFptRjFiSFJJYjNOMGJtRnRaU0E5SUdoMGRIQkRiR2xsYm5SUVlYSmhiWE11WkdWbVlYVnNkRWh2YzNSdVlXMWxPMXh1SUNCMllYSWdZV2RsYm5RZ1BTQm9kSFJ3UTJ4cFpXNTBVR0Z5WVcxekxtRm5aVzUwTzF4dUlDQjJZWElnYUdWaFpHVnljeUE5SUdoMGRIQkRiR2xsYm5SUVlYSmhiWE11YUdWaFpHVnljenRjYmx4dUlDQjJZWElnWDNKbFppQTlJR2h2YzNRZ0ppWWdhRzl6ZEM1emNHeHBkQ2duT2ljcElIeDhJRnRkTzF4dVhHNGdJSFpoY2lCZmNtVm1NaUE5SUNnd0xDQmZjMnhwWTJWa1ZHOUJjbkpoZVRNdVpHVm1ZWFZzZENrb1gzSmxaaXdnTWlrN1hHNWNiaUFnZG1GeUlHaHZjM1J1WVcxbElEMGdYM0psWmpKYk1GMDdYRzRnSUhaaGNpQndiM0owSUQwZ1gzSmxaakpiTVYwN1hHNWNiaUFnYUc5emRHNWhiV1VnUFNCb2IzTjBibUZ0WlNCOGZDQmtaV1poZFd4MFNHOXpkRzVoYldVN1hHNGdJSEJ2Y25RZ1BTQndiM0owSUh4OElDaHBibk5sWTNWeVpTQS9JRGd3SURvZ05EUXpLVHRjYmlBZ2RtRnlJR0poYzJWVlVrd2dQU0FvYVc1elpXTjFjbVVnUHlBbmFIUjBjQ2NnT2lBbmFIUjBjSE1uS1NBcklDYzZMeThuSUNzZ2FHOXpkRzVoYldVZ0t5QW5PaWNnS3lCd2IzSjBJQ3NnSnk5emNHRmpaWE12Snp0Y2JpQWdhV1lnS0hOd1lXTmxLU0I3WEc0Z0lDQWdZbUZ6WlZWU1RDQXJQU0J6Y0dGalpTQXJJQ2N2Snp0Y2JpQWdmVnh1SUNCb1pXRmtaWEp6SUQwZ2FHVmhaR1Z5Y3lCOGZDQjdmVHRjYmlBZ2FHVmhaR1Z5YzFzblFYVjBhRzl5YVhwaGRHbHZiaWRkSUQwZ0owSmxZWEpsY2lBbklDc2dZV05qWlhOelZHOXJaVzQ3WEc1Y2JpQWdMeThnVTJWMElIUm9aWE5sSUdobFlXUmxjbk1nYjI1c2VTQm1iM0lnYm05a1pTQmlaV05oZFhObElHSnliM2R6WlhKeklHUnZiaWQwSUd4cGEyVWdhWFFnZDJobGJpQjViM1ZjYmlBZ0x5OGdiM1psY25KcFpHVWdkWE5sY2kxaFoyVnVkQ0J2Y2lCaFkyTmxjSFF0Wlc1amIyUnBibWN1WEc0Z0lDOHZJRlJvWlNCVFJFdHpJSE5vYjNWc1pDQnpaWFFnZEdobGFYSWdiM2R1SUZndFEyOXVkR1Z1ZEdaMWJDMVZjMlZ5TFVGblpXNTBMbHh1SUNCcFppQW9jSEp2WTJWemN5QW1KaUJ3Y205alpYTnpMbkpsYkdWaGMyVWdKaVlnY0hKdlkyVnpjeTV5Wld4bFlYTmxMbTVoYldVZ1BUMDlJQ2R1YjJSbEp5a2dlMXh1SUNBZ0lHaGxZV1JsY25OYkozVnpaWEl0WVdkbGJuUW5YU0E5SUNkdWIyUmxMbXB6THljZ0t5QndjbTlqWlhOekxuWmxjbk5wYjI0N1hHNGdJQ0FnYUdWaFpHVnljMXNuUVdOalpYQjBMVVZ1WTI5a2FXNW5KMTBnUFNBblozcHBjQ2M3WEc0Z0lIMWNibHh1SUNCMllYSWdhVzV6ZEdGdVkyVWdQU0JoZUdsdmN5NWpjbVZoZEdVb2UxeHVJQ0FnSUdKaGMyVlZVa3c2SUdKaGMyVlZVa3dzWEc0Z0lDQWdhR1ZoWkdWeWN6b2dhR1ZoWkdWeWN5eGNiaUFnSUNCaFoyVnVkRG9nWVdkbGJuUXNYRzRnSUNBZ2NHRnlZVzF6VTJWeWFXRnNhWHBsY2pvZ1gzRnpNaTVrWldaaGRXeDBMbk4wY21sdVoybG1lVnh1SUNCOUtUdGNiaUFnYVc1emRHRnVZMlV1YUhSMGNFTnNhV1Z1ZEZCaGNtRnRjeUE5SUdoMGRIQkRiR2xsYm5SUVlYSmhiWE03WEc1Y2JpQWdMeW9xWEc0Z0lDQXFJRU55WldGMFpYTWdZU0J1WlhjZ1lYaHBiM01nYVc1emRHRnVZMlVnZDJsMGFDQjBhR1VnYzJGdFpTQmtaV1poZFd4MElHSmhjMlVnY0dGeVlXMWxkR1Z5Y3lCaGN5QjBhR1ZjYmlBZ0lDb2dZM1Z5Y21WdWRDQnZibVVzSUdGdVpDQjNhWFJvSUdGdWVTQnZkbVZ5Y21sa1pYTWdjR0Z6YzJWa0lIUnZJSFJvWlNCdVpYZFFZWEpoYlhNZ2IySnFaV04wWEc0Z0lDQXFJRlJvYVhNZ2FYTWdkWE5sWm5Wc0lHRnpJSFJvWlNCVFJFdHpJSFZ6WlNCa1pYQmxibVJsYm1ONUlHbHVhbVZqZEdsdmJpQjBieUJuWlhRZ2RHaGxJR0Y0YVc5eklHeHBZbkpoY25sY2JpQWdJQ29nWVc1a0lIUm9aU0IyWlhKemFXOXVJRzltSUhSb1pTQnNhV0p5WVhKNUlHTnZiV1Z6SUdaeWIyMGdaR2xtWm1WeVpXNTBJSEJzWVdObGN5QmtaWEJsYm1ScGJtZGNiaUFnSUNvZ2IyNGdkMmhsZEdobGNpQnBkQ2R6SUdFZ1luSnZkM05sY2lCaWRXbHNaQ0J2Y2lCaElHNXZaR1V1YW5NZ1luVnBiR1F1WEc0Z0lDQXFJRUJ3Y21sMllYUmxYRzRnSUNBcUlFQndZWEpoYlNCN1QySnFaV04wZlNCb2RIUndRMnhwWlc1MFVHRnlZVzF6SUMwZ1NXNXBkR2xoYkdsNllYUnBiMjRnY0dGeVlXMWxkR1Z5Y3lCbWIzSWdkR2hsSUVoVVZGQWdZMnhwWlc1MFhHNGdJQ0FxSUVCeVpYUjFjbTRnZTA5aWFtVmpkSDBnU1c1cGRHbGhiR2w2WldRZ1lYaHBiM01nYVc1emRHRnVZMlZjYmlBZ0lDb3ZYRzRnSUdsdWMzUmhibU5sTG1Oc2IyNWxWMmwwYUU1bGQxQmhjbUZ0Y3lBOUlHWjFibU4wYVc5dUlDaHVaWGRRWVhKaGJYTXBJSHRjYmlBZ0lDQnlaWFIxY200Z1kzSmxZWFJsU0hSMGNFTnNhV1Z1ZENoaGVHbHZjeXdnS0RBc0lGOWhjM05wWjI0eUxtUmxabUYxYkhRcEtDZ3dMQ0JmWTJ4dmJtVkVaV1Z3TWk1a1pXWmhkV3gwS1Nob2RIUndRMnhwWlc1MFVHRnlZVzF6S1N3Z2JtVjNVR0Z5WVcxektTazdYRzRnSUgwN1hHNWNiaUFnY21WMGRYSnVJR2x1YzNSaGJtTmxPMXh1ZlNKZGZRPT0iLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBjcmVhdGVSZXF1ZXN0Q29uZmlnO1xuXG52YXIgX2Nsb25lRGVlcCA9IHJlcXVpcmUoJ2xvZGFzaC9jbG9uZURlZXAnKTtcblxudmFyIF9jbG9uZURlZXAyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xvbmVEZWVwKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuLyoqXG4gKiBDcmVhdGVzIHJlcXVlc3QgcGFyYW1ldGVycyBjb25maWd1cmF0aW9uIGJ5IHBhcnNpbmcgYW4gZXhpc3RpbmcgcXVlcnkgb2JqZWN0XG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHF1ZXJ5XG4gKiBAcmV0dXJuIHtPYmplY3R9IENvbmZpZyBvYmplY3Qgd2l0aCBgcGFyYW1zYCBwcm9wZXJ0eSwgcmVhZHkgdG8gYmUgdXNlZCBpbiBheGlvc1xuICovXG5mdW5jdGlvbiBjcmVhdGVSZXF1ZXN0Q29uZmlnKF9yZWYpIHtcbiAgdmFyIHF1ZXJ5ID0gX3JlZi5xdWVyeTtcblxuICB2YXIgY29uZmlnID0ge307XG4gIGRlbGV0ZSBxdWVyeS5yZXNvbHZlTGlua3M7XG4gIGNvbmZpZy5wYXJhbXMgPSAoMCwgX2Nsb25lRGVlcDIuZGVmYXVsdCkocXVlcnkpO1xuICByZXR1cm4gY29uZmlnO1xufSIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9mcmVlemUgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2NvcmUtanMvb2JqZWN0L2ZyZWV6ZScpO1xuXG52YXIgX2ZyZWV6ZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9mcmVlemUpO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBmcmVlemVTeXM7XG5cbnZhciBfZWFjaCA9IHJlcXVpcmUoJ2xvZGFzaC9lYWNoJyk7XG5cbnZhciBfZWFjaDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9lYWNoKTtcblxudmFyIF9pc1BsYWluT2JqZWN0ID0gcmVxdWlyZSgnbG9kYXNoL2lzUGxhaW5PYmplY3QnKTtcblxudmFyIF9pc1BsYWluT2JqZWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2lzUGxhaW5PYmplY3QpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiBmcmVlemVPYmplY3REZWVwKG9iaikge1xuICAoMCwgX2VhY2gyLmRlZmF1bHQpKG9iaiwgZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICBpZiAoKDAsIF9pc1BsYWluT2JqZWN0Mi5kZWZhdWx0KSh2YWx1ZSkpIHtcbiAgICAgIGZyZWV6ZU9iamVjdERlZXAodmFsdWUpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiAoMCwgX2ZyZWV6ZTIuZGVmYXVsdCkob2JqKTtcbn1cblxuZnVuY3Rpb24gZnJlZXplU3lzKG9iaikge1xuICBmcmVlemVPYmplY3REZWVwKG9iai5zeXMpO1xuICByZXR1cm4gb2JqO1xufSIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IG1peGluVG9QbGFpbk9iamVjdDtcblxudmFyIF9jbG9uZURlZXAgPSByZXF1aXJlKCdsb2Rhc2gvY2xvbmVEZWVwJyk7XG5cbnZhciBfY2xvbmVEZWVwMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2Nsb25lRGVlcCk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbi8qKlxuICogTWl4ZXMgaW4gYSBtZXRob2QgdG8gcmV0dXJuIGp1c3QgYSBwbGFpbiBvYmplY3Qgd2l0aCBubyBhZGRpdGlvbmFsIG1ldGhvZHNcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gZGF0YSAtIEFueSBwbGFpbiBKU09OIHJlc3BvbnNlIHJldHVybmVkIGZyb20gdGhlIEFQSVxuICogQHJldHVybiB7T2JqZWN0fSBFbmhhbmNlZCBvYmplY3Qgd2l0aCB0b1BsYWluT2JqZWN0IG1ldGhvZFxuICovXG5mdW5jdGlvbiBtaXhpblRvUGxhaW5PYmplY3QoZGF0YSkge1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGRhdGEsICd0b1BsYWluT2JqZWN0Jywge1xuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgd3JpdGFibGU6IGZhbHNlLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZSgpIHtcbiAgICAgIHJldHVybiAoMCwgX2Nsb25lRGVlcDIuZGVmYXVsdCkodGhpcyk7XG4gICAgfVxuICB9KTtcbn0iLCIndXNlIHN0cmljdCc7XG5cbnZhciBTdHJpbmdpZnkgPSByZXF1aXJlKCcuL3N0cmluZ2lmeScpO1xudmFyIFBhcnNlID0gcmVxdWlyZSgnLi9wYXJzZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBzdHJpbmdpZnk6IFN0cmluZ2lmeSxcbiAgICBwYXJzZTogUGFyc2Vcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBVdGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcblxudmFyIGRlZmF1bHRzID0ge1xuICAgIGRlbGltaXRlcjogJyYnLFxuICAgIGRlcHRoOiA1LFxuICAgIGFycmF5TGltaXQ6IDIwLFxuICAgIHBhcmFtZXRlckxpbWl0OiAxMDAwLFxuICAgIHN0cmljdE51bGxIYW5kbGluZzogZmFsc2UsXG4gICAgcGxhaW5PYmplY3RzOiBmYWxzZSxcbiAgICBhbGxvd1Byb3RvdHlwZXM6IGZhbHNlLFxuICAgIGFsbG93RG90czogZmFsc2UsXG4gICAgZGVjb2RlcjogVXRpbHMuZGVjb2RlXG59O1xuXG52YXIgcGFyc2VWYWx1ZXMgPSBmdW5jdGlvbiBwYXJzZVZhbHVlcyhzdHIsIG9wdGlvbnMpIHtcbiAgICB2YXIgb2JqID0ge307XG4gICAgdmFyIHBhcnRzID0gc3RyLnNwbGl0KG9wdGlvbnMuZGVsaW1pdGVyLCBvcHRpb25zLnBhcmFtZXRlckxpbWl0ID09PSBJbmZpbml0eSA/IHVuZGVmaW5lZCA6IG9wdGlvbnMucGFyYW1ldGVyTGltaXQpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIgcGFydCA9IHBhcnRzW2ldO1xuICAgICAgICB2YXIgcG9zID0gcGFydC5pbmRleE9mKCddPScpID09PSAtMSA/IHBhcnQuaW5kZXhPZignPScpIDogcGFydC5pbmRleE9mKCddPScpICsgMTtcblxuICAgICAgICBpZiAocG9zID09PSAtMSkge1xuICAgICAgICAgICAgb2JqW29wdGlvbnMuZGVjb2RlcihwYXJ0KV0gPSAnJztcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuc3RyaWN0TnVsbEhhbmRsaW5nKSB7XG4gICAgICAgICAgICAgICAgb2JqW29wdGlvbnMuZGVjb2RlcihwYXJ0KV0gPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIGtleSA9IG9wdGlvbnMuZGVjb2RlcihwYXJ0LnNsaWNlKDAsIHBvcykpO1xuICAgICAgICAgICAgdmFyIHZhbCA9IG9wdGlvbnMuZGVjb2RlcihwYXJ0LnNsaWNlKHBvcyArIDEpKTtcblxuICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHtcbiAgICAgICAgICAgICAgICBvYmpba2V5XSA9IFtdLmNvbmNhdChvYmpba2V5XSkuY29uY2F0KHZhbCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG9ialtrZXldID0gdmFsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9iajtcbn07XG5cbnZhciBwYXJzZU9iamVjdCA9IGZ1bmN0aW9uIHBhcnNlT2JqZWN0KGNoYWluLCB2YWwsIG9wdGlvbnMpIHtcbiAgICBpZiAoIWNoYWluLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gdmFsO1xuICAgIH1cblxuICAgIHZhciByb290ID0gY2hhaW4uc2hpZnQoKTtcblxuICAgIHZhciBvYmo7XG4gICAgaWYgKHJvb3QgPT09ICdbXScpIHtcbiAgICAgICAgb2JqID0gW107XG4gICAgICAgIG9iaiA9IG9iai5jb25jYXQocGFyc2VPYmplY3QoY2hhaW4sIHZhbCwgb3B0aW9ucykpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIG9iaiA9IG9wdGlvbnMucGxhaW5PYmplY3RzID8gT2JqZWN0LmNyZWF0ZShudWxsKSA6IHt9O1xuICAgICAgICB2YXIgY2xlYW5Sb290ID0gcm9vdFswXSA9PT0gJ1snICYmIHJvb3Rbcm9vdC5sZW5ndGggLSAxXSA9PT0gJ10nID8gcm9vdC5zbGljZSgxLCByb290Lmxlbmd0aCAtIDEpIDogcm9vdDtcbiAgICAgICAgdmFyIGluZGV4ID0gcGFyc2VJbnQoY2xlYW5Sb290LCAxMCk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgICFpc05hTihpbmRleCkgJiZcbiAgICAgICAgICAgIHJvb3QgIT09IGNsZWFuUm9vdCAmJlxuICAgICAgICAgICAgU3RyaW5nKGluZGV4KSA9PT0gY2xlYW5Sb290ICYmXG4gICAgICAgICAgICBpbmRleCA+PSAwICYmXG4gICAgICAgICAgICAob3B0aW9ucy5wYXJzZUFycmF5cyAmJiBpbmRleCA8PSBvcHRpb25zLmFycmF5TGltaXQpXG4gICAgICAgICkge1xuICAgICAgICAgICAgb2JqID0gW107XG4gICAgICAgICAgICBvYmpbaW5kZXhdID0gcGFyc2VPYmplY3QoY2hhaW4sIHZhbCwgb3B0aW9ucyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvYmpbY2xlYW5Sb290XSA9IHBhcnNlT2JqZWN0KGNoYWluLCB2YWwsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9iajtcbn07XG5cbnZhciBwYXJzZUtleXMgPSBmdW5jdGlvbiBwYXJzZUtleXMoZ2l2ZW5LZXksIHZhbCwgb3B0aW9ucykge1xuICAgIGlmICghZ2l2ZW5LZXkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFRyYW5zZm9ybSBkb3Qgbm90YXRpb24gdG8gYnJhY2tldCBub3RhdGlvblxuICAgIHZhciBrZXkgPSBvcHRpb25zLmFsbG93RG90cyA/IGdpdmVuS2V5LnJlcGxhY2UoL1xcLihbXlxcLlxcW10rKS9nLCAnWyQxXScpIDogZ2l2ZW5LZXk7XG5cbiAgICAvLyBUaGUgcmVnZXggY2h1bmtzXG5cbiAgICB2YXIgcGFyZW50ID0gL14oW15cXFtcXF1dKikvO1xuICAgIHZhciBjaGlsZCA9IC8oXFxbW15cXFtcXF1dKlxcXSkvZztcblxuICAgIC8vIEdldCB0aGUgcGFyZW50XG5cbiAgICB2YXIgc2VnbWVudCA9IHBhcmVudC5leGVjKGtleSk7XG5cbiAgICAvLyBTdGFzaCB0aGUgcGFyZW50IGlmIGl0IGV4aXN0c1xuXG4gICAgdmFyIGtleXMgPSBbXTtcbiAgICBpZiAoc2VnbWVudFsxXSkge1xuICAgICAgICAvLyBJZiB3ZSBhcmVuJ3QgdXNpbmcgcGxhaW4gb2JqZWN0cywgb3B0aW9uYWxseSBwcmVmaXgga2V5c1xuICAgICAgICAvLyB0aGF0IHdvdWxkIG92ZXJ3cml0ZSBvYmplY3QgcHJvdG90eXBlIHByb3BlcnRpZXNcbiAgICAgICAgaWYgKCFvcHRpb25zLnBsYWluT2JqZWN0cyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5KHNlZ21lbnRbMV0pKSB7XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMuYWxsb3dQcm90b3R5cGVzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAga2V5cy5wdXNoKHNlZ21lbnRbMV0pO1xuICAgIH1cblxuICAgIC8vIExvb3AgdGhyb3VnaCBjaGlsZHJlbiBhcHBlbmRpbmcgdG8gdGhlIGFycmF5IHVudGlsIHdlIGhpdCBkZXB0aFxuXG4gICAgdmFyIGkgPSAwO1xuICAgIHdoaWxlICgoc2VnbWVudCA9IGNoaWxkLmV4ZWMoa2V5KSkgIT09IG51bGwgJiYgaSA8IG9wdGlvbnMuZGVwdGgpIHtcbiAgICAgICAgaSArPSAxO1xuICAgICAgICBpZiAoIW9wdGlvbnMucGxhaW5PYmplY3RzICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkoc2VnbWVudFsxXS5yZXBsYWNlKC9cXFt8XFxdL2csICcnKSkpIHtcbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5hbGxvd1Byb3RvdHlwZXMpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBrZXlzLnB1c2goc2VnbWVudFsxXSk7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlcmUncyBhIHJlbWFpbmRlciwganVzdCBhZGQgd2hhdGV2ZXIgaXMgbGVmdFxuXG4gICAgaWYgKHNlZ21lbnQpIHtcbiAgICAgICAga2V5cy5wdXNoKCdbJyArIGtleS5zbGljZShzZWdtZW50LmluZGV4KSArICddJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcnNlT2JqZWN0KGtleXMsIHZhbCwgb3B0aW9ucyk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChzdHIsIG9wdHMpIHtcbiAgICB2YXIgb3B0aW9ucyA9IG9wdHMgfHwge307XG5cbiAgICBpZiAob3B0aW9ucy5kZWNvZGVyICE9PSBudWxsICYmIG9wdGlvbnMuZGVjb2RlciAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvcHRpb25zLmRlY29kZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRGVjb2RlciBoYXMgdG8gYmUgYSBmdW5jdGlvbi4nKTtcbiAgICB9XG5cbiAgICBvcHRpb25zLmRlbGltaXRlciA9IHR5cGVvZiBvcHRpb25zLmRlbGltaXRlciA9PT0gJ3N0cmluZycgfHwgVXRpbHMuaXNSZWdFeHAob3B0aW9ucy5kZWxpbWl0ZXIpID8gb3B0aW9ucy5kZWxpbWl0ZXIgOiBkZWZhdWx0cy5kZWxpbWl0ZXI7XG4gICAgb3B0aW9ucy5kZXB0aCA9IHR5cGVvZiBvcHRpb25zLmRlcHRoID09PSAnbnVtYmVyJyA/IG9wdGlvbnMuZGVwdGggOiBkZWZhdWx0cy5kZXB0aDtcbiAgICBvcHRpb25zLmFycmF5TGltaXQgPSB0eXBlb2Ygb3B0aW9ucy5hcnJheUxpbWl0ID09PSAnbnVtYmVyJyA/IG9wdGlvbnMuYXJyYXlMaW1pdCA6IGRlZmF1bHRzLmFycmF5TGltaXQ7XG4gICAgb3B0aW9ucy5wYXJzZUFycmF5cyA9IG9wdGlvbnMucGFyc2VBcnJheXMgIT09IGZhbHNlO1xuICAgIG9wdGlvbnMuZGVjb2RlciA9IHR5cGVvZiBvcHRpb25zLmRlY29kZXIgPT09ICdmdW5jdGlvbicgPyBvcHRpb25zLmRlY29kZXIgOiBkZWZhdWx0cy5kZWNvZGVyO1xuICAgIG9wdGlvbnMuYWxsb3dEb3RzID0gdHlwZW9mIG9wdGlvbnMuYWxsb3dEb3RzID09PSAnYm9vbGVhbicgPyBvcHRpb25zLmFsbG93RG90cyA6IGRlZmF1bHRzLmFsbG93RG90cztcbiAgICBvcHRpb25zLnBsYWluT2JqZWN0cyA9IHR5cGVvZiBvcHRpb25zLnBsYWluT2JqZWN0cyA9PT0gJ2Jvb2xlYW4nID8gb3B0aW9ucy5wbGFpbk9iamVjdHMgOiBkZWZhdWx0cy5wbGFpbk9iamVjdHM7XG4gICAgb3B0aW9ucy5hbGxvd1Byb3RvdHlwZXMgPSB0eXBlb2Ygb3B0aW9ucy5hbGxvd1Byb3RvdHlwZXMgPT09ICdib29sZWFuJyA/IG9wdGlvbnMuYWxsb3dQcm90b3R5cGVzIDogZGVmYXVsdHMuYWxsb3dQcm90b3R5cGVzO1xuICAgIG9wdGlvbnMucGFyYW1ldGVyTGltaXQgPSB0eXBlb2Ygb3B0aW9ucy5wYXJhbWV0ZXJMaW1pdCA9PT0gJ251bWJlcicgPyBvcHRpb25zLnBhcmFtZXRlckxpbWl0IDogZGVmYXVsdHMucGFyYW1ldGVyTGltaXQ7XG4gICAgb3B0aW9ucy5zdHJpY3ROdWxsSGFuZGxpbmcgPSB0eXBlb2Ygb3B0aW9ucy5zdHJpY3ROdWxsSGFuZGxpbmcgPT09ICdib29sZWFuJyA/IG9wdGlvbnMuc3RyaWN0TnVsbEhhbmRsaW5nIDogZGVmYXVsdHMuc3RyaWN0TnVsbEhhbmRsaW5nO1xuXG4gICAgaWYgKHN0ciA9PT0gJycgfHwgc3RyID09PSBudWxsIHx8IHR5cGVvZiBzdHIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBvcHRpb25zLnBsYWluT2JqZWN0cyA/IE9iamVjdC5jcmVhdGUobnVsbCkgOiB7fTtcbiAgICB9XG5cbiAgICB2YXIgdGVtcE9iaiA9IHR5cGVvZiBzdHIgPT09ICdzdHJpbmcnID8gcGFyc2VWYWx1ZXMoc3RyLCBvcHRpb25zKSA6IHN0cjtcbiAgICB2YXIgb2JqID0gb3B0aW9ucy5wbGFpbk9iamVjdHMgPyBPYmplY3QuY3JlYXRlKG51bGwpIDoge307XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgdGhlIGtleXMgYW5kIHNldHVwIHRoZSBuZXcgb2JqZWN0XG5cbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHRlbXBPYmopO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICAgICAgdmFyIG5ld09iaiA9IHBhcnNlS2V5cyhrZXksIHRlbXBPYmpba2V5XSwgb3B0aW9ucyk7XG4gICAgICAgIG9iaiA9IFV0aWxzLm1lcmdlKG9iaiwgbmV3T2JqLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICByZXR1cm4gVXRpbHMuY29tcGFjdChvYmopO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xuXG52YXIgYXJyYXlQcmVmaXhHZW5lcmF0b3JzID0ge1xuICAgIGJyYWNrZXRzOiBmdW5jdGlvbiBicmFja2V0cyhwcmVmaXgpIHtcbiAgICAgICAgcmV0dXJuIHByZWZpeCArICdbXSc7XG4gICAgfSxcbiAgICBpbmRpY2VzOiBmdW5jdGlvbiBpbmRpY2VzKHByZWZpeCwga2V5KSB7XG4gICAgICAgIHJldHVybiBwcmVmaXggKyAnWycgKyBrZXkgKyAnXSc7XG4gICAgfSxcbiAgICByZXBlYXQ6IGZ1bmN0aW9uIHJlcGVhdChwcmVmaXgpIHtcbiAgICAgICAgcmV0dXJuIHByZWZpeDtcbiAgICB9XG59O1xuXG52YXIgZGVmYXVsdHMgPSB7XG4gICAgZGVsaW1pdGVyOiAnJicsXG4gICAgc3RyaWN0TnVsbEhhbmRsaW5nOiBmYWxzZSxcbiAgICBza2lwTnVsbHM6IGZhbHNlLFxuICAgIGVuY29kZTogdHJ1ZSxcbiAgICBlbmNvZGVyOiBVdGlscy5lbmNvZGVcbn07XG5cbnZhciBzdHJpbmdpZnkgPSBmdW5jdGlvbiBzdHJpbmdpZnkob2JqZWN0LCBwcmVmaXgsIGdlbmVyYXRlQXJyYXlQcmVmaXgsIHN0cmljdE51bGxIYW5kbGluZywgc2tpcE51bGxzLCBlbmNvZGVyLCBmaWx0ZXIsIHNvcnQsIGFsbG93RG90cykge1xuICAgIHZhciBvYmogPSBvYmplY3Q7XG4gICAgaWYgKHR5cGVvZiBmaWx0ZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgb2JqID0gZmlsdGVyKHByZWZpeCwgb2JqKTtcbiAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgb2JqID0gb2JqLnRvSVNPU3RyaW5nKCk7XG4gICAgfSBlbHNlIGlmIChvYmogPT09IG51bGwpIHtcbiAgICAgICAgaWYgKHN0cmljdE51bGxIYW5kbGluZykge1xuICAgICAgICAgICAgcmV0dXJuIGVuY29kZXIgPyBlbmNvZGVyKHByZWZpeCkgOiBwcmVmaXg7XG4gICAgICAgIH1cblxuICAgICAgICBvYmogPSAnJztcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIG9iaiA9PT0gJ251bWJlcicgfHwgdHlwZW9mIG9iaiA9PT0gJ2Jvb2xlYW4nIHx8IFV0aWxzLmlzQnVmZmVyKG9iaikpIHtcbiAgICAgICAgaWYgKGVuY29kZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBbZW5jb2RlcihwcmVmaXgpICsgJz0nICsgZW5jb2RlcihvYmopXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW3ByZWZpeCArICc9JyArIFN0cmluZyhvYmopXTtcbiAgICB9XG5cbiAgICB2YXIgdmFsdWVzID0gW107XG5cbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlcztcbiAgICB9XG5cbiAgICB2YXIgb2JqS2V5cztcbiAgICBpZiAoQXJyYXkuaXNBcnJheShmaWx0ZXIpKSB7XG4gICAgICAgIG9iaktleXMgPSBmaWx0ZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuICAgICAgICBvYmpLZXlzID0gc29ydCA/IGtleXMuc29ydChzb3J0KSA6IGtleXM7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvYmpLZXlzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHZhciBrZXkgPSBvYmpLZXlzW2ldO1xuXG4gICAgICAgIGlmIChza2lwTnVsbHMgJiYgb2JqW2tleV0gPT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgICAgICAgdmFsdWVzID0gdmFsdWVzLmNvbmNhdChzdHJpbmdpZnkob2JqW2tleV0sIGdlbmVyYXRlQXJyYXlQcmVmaXgocHJlZml4LCBrZXkpLCBnZW5lcmF0ZUFycmF5UHJlZml4LCBzdHJpY3ROdWxsSGFuZGxpbmcsIHNraXBOdWxscywgZW5jb2RlciwgZmlsdGVyLCBzb3J0LCBhbGxvd0RvdHMpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhbHVlcyA9IHZhbHVlcy5jb25jYXQoc3RyaW5naWZ5KG9ialtrZXldLCBwcmVmaXggKyAoYWxsb3dEb3RzID8gJy4nICsga2V5IDogJ1snICsga2V5ICsgJ10nKSwgZ2VuZXJhdGVBcnJheVByZWZpeCwgc3RyaWN0TnVsbEhhbmRsaW5nLCBza2lwTnVsbHMsIGVuY29kZXIsIGZpbHRlciwgc29ydCwgYWxsb3dEb3RzKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWVzO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0LCBvcHRzKSB7XG4gICAgdmFyIG9iaiA9IG9iamVjdDtcbiAgICB2YXIgb3B0aW9ucyA9IG9wdHMgfHwge307XG4gICAgdmFyIGRlbGltaXRlciA9IHR5cGVvZiBvcHRpb25zLmRlbGltaXRlciA9PT0gJ3VuZGVmaW5lZCcgPyBkZWZhdWx0cy5kZWxpbWl0ZXIgOiBvcHRpb25zLmRlbGltaXRlcjtcbiAgICB2YXIgc3RyaWN0TnVsbEhhbmRsaW5nID0gdHlwZW9mIG9wdGlvbnMuc3RyaWN0TnVsbEhhbmRsaW5nID09PSAnYm9vbGVhbicgPyBvcHRpb25zLnN0cmljdE51bGxIYW5kbGluZyA6IGRlZmF1bHRzLnN0cmljdE51bGxIYW5kbGluZztcbiAgICB2YXIgc2tpcE51bGxzID0gdHlwZW9mIG9wdGlvbnMuc2tpcE51bGxzID09PSAnYm9vbGVhbicgPyBvcHRpb25zLnNraXBOdWxscyA6IGRlZmF1bHRzLnNraXBOdWxscztcbiAgICB2YXIgZW5jb2RlID0gdHlwZW9mIG9wdGlvbnMuZW5jb2RlID09PSAnYm9vbGVhbicgPyBvcHRpb25zLmVuY29kZSA6IGRlZmF1bHRzLmVuY29kZTtcbiAgICB2YXIgZW5jb2RlciA9IGVuY29kZSA/ICh0eXBlb2Ygb3B0aW9ucy5lbmNvZGVyID09PSAnZnVuY3Rpb24nID8gb3B0aW9ucy5lbmNvZGVyIDogZGVmYXVsdHMuZW5jb2RlcikgOiBudWxsO1xuICAgIHZhciBzb3J0ID0gdHlwZW9mIG9wdGlvbnMuc29ydCA9PT0gJ2Z1bmN0aW9uJyA/IG9wdGlvbnMuc29ydCA6IG51bGw7XG4gICAgdmFyIGFsbG93RG90cyA9IHR5cGVvZiBvcHRpb25zLmFsbG93RG90cyA9PT0gJ3VuZGVmaW5lZCcgPyBmYWxzZSA6IG9wdGlvbnMuYWxsb3dEb3RzO1xuICAgIHZhciBvYmpLZXlzO1xuICAgIHZhciBmaWx0ZXI7XG5cbiAgICBpZiAob3B0aW9ucy5lbmNvZGVyICE9PSBudWxsICYmIG9wdGlvbnMuZW5jb2RlciAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvcHRpb25zLmVuY29kZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRW5jb2RlciBoYXMgdG8gYmUgYSBmdW5jdGlvbi4nKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMuZmlsdGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGZpbHRlciA9IG9wdGlvbnMuZmlsdGVyO1xuICAgICAgICBvYmogPSBmaWx0ZXIoJycsIG9iaik7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbnMuZmlsdGVyKSkge1xuICAgICAgICBvYmpLZXlzID0gZmlsdGVyID0gb3B0aW9ucy5maWx0ZXI7XG4gICAgfVxuXG4gICAgdmFyIGtleXMgPSBbXTtcblxuICAgIGlmICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyB8fCBvYmogPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIHZhciBhcnJheUZvcm1hdDtcbiAgICBpZiAob3B0aW9ucy5hcnJheUZvcm1hdCBpbiBhcnJheVByZWZpeEdlbmVyYXRvcnMpIHtcbiAgICAgICAgYXJyYXlGb3JtYXQgPSBvcHRpb25zLmFycmF5Rm9ybWF0O1xuICAgIH0gZWxzZSBpZiAoJ2luZGljZXMnIGluIG9wdGlvbnMpIHtcbiAgICAgICAgYXJyYXlGb3JtYXQgPSBvcHRpb25zLmluZGljZXMgPyAnaW5kaWNlcycgOiAncmVwZWF0JztcbiAgICB9IGVsc2Uge1xuICAgICAgICBhcnJheUZvcm1hdCA9ICdpbmRpY2VzJztcbiAgICB9XG5cbiAgICB2YXIgZ2VuZXJhdGVBcnJheVByZWZpeCA9IGFycmF5UHJlZml4R2VuZXJhdG9yc1thcnJheUZvcm1hdF07XG5cbiAgICBpZiAoIW9iaktleXMpIHtcbiAgICAgICAgb2JqS2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XG4gICAgfVxuXG4gICAgaWYgKHNvcnQpIHtcbiAgICAgICAgb2JqS2V5cy5zb3J0KHNvcnQpO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb2JqS2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIga2V5ID0gb2JqS2V5c1tpXTtcblxuICAgICAgICBpZiAoc2tpcE51bGxzICYmIG9ialtrZXldID09PSBudWxsKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGtleXMgPSBrZXlzLmNvbmNhdChzdHJpbmdpZnkob2JqW2tleV0sIGtleSwgZ2VuZXJhdGVBcnJheVByZWZpeCwgc3RyaWN0TnVsbEhhbmRsaW5nLCBza2lwTnVsbHMsIGVuY29kZXIsIGZpbHRlciwgc29ydCwgYWxsb3dEb3RzKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGtleXMuam9pbihkZWxpbWl0ZXIpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGhleFRhYmxlID0gKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgYXJyYXkgPSBuZXcgQXJyYXkoMjU2KTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDI1NjsgKytpKSB7XG4gICAgICAgIGFycmF5W2ldID0gJyUnICsgKChpIDwgMTYgPyAnMCcgOiAnJykgKyBpLnRvU3RyaW5nKDE2KSkudG9VcHBlckNhc2UoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXJyYXk7XG59KCkpO1xuXG5leHBvcnRzLmFycmF5VG9PYmplY3QgPSBmdW5jdGlvbiAoc291cmNlLCBvcHRpb25zKSB7XG4gICAgdmFyIG9iaiA9IG9wdGlvbnMucGxhaW5PYmplY3RzID8gT2JqZWN0LmNyZWF0ZShudWxsKSA6IHt9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc291cmNlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc291cmNlW2ldICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgb2JqW2ldID0gc291cmNlW2ldO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9iajtcbn07XG5cbmV4cG9ydHMubWVyZ2UgPSBmdW5jdGlvbiAodGFyZ2V0LCBzb3VyY2UsIG9wdGlvbnMpIHtcbiAgICBpZiAoIXNvdXJjZSkge1xuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygc291cmNlICE9PSAnb2JqZWN0Jykge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0YXJnZXQpKSB7XG4gICAgICAgICAgICB0YXJnZXQucHVzaChzb3VyY2UpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0YXJnZXQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICB0YXJnZXRbc291cmNlXSA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gW3RhcmdldCwgc291cmNlXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB0YXJnZXQgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBbdGFyZ2V0XS5jb25jYXQoc291cmNlKTtcbiAgICB9XG5cbiAgICB2YXIgbWVyZ2VUYXJnZXQgPSB0YXJnZXQ7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGFyZ2V0KSAmJiAhQXJyYXkuaXNBcnJheShzb3VyY2UpKSB7XG4gICAgICAgIG1lcmdlVGFyZ2V0ID0gZXhwb3J0cy5hcnJheVRvT2JqZWN0KHRhcmdldCwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHNvdXJjZSkucmVkdWNlKGZ1bmN0aW9uIChhY2MsIGtleSkge1xuICAgICAgICB2YXIgdmFsdWUgPSBzb3VyY2Vba2V5XTtcblxuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGFjYywga2V5KSkge1xuICAgICAgICAgICAgYWNjW2tleV0gPSBleHBvcnRzLm1lcmdlKGFjY1trZXldLCB2YWx1ZSwgb3B0aW9ucyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhY2Nba2V5XSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgfSwgbWVyZ2VUYXJnZXQpO1xufTtcblxuZXhwb3J0cy5kZWNvZGUgPSBmdW5jdGlvbiAoc3RyKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChzdHIucmVwbGFjZSgvXFwrL2csICcgJykpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG59O1xuXG5leHBvcnRzLmVuY29kZSA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgICAvLyBUaGlzIGNvZGUgd2FzIG9yaWdpbmFsbHkgd3JpdHRlbiBieSBCcmlhbiBXaGl0ZSAobXNjZGV4KSBmb3IgdGhlIGlvLmpzIGNvcmUgcXVlcnlzdHJpbmcgbGlicmFyeS5cbiAgICAvLyBJdCBoYXMgYmVlbiBhZGFwdGVkIGhlcmUgZm9yIHN0cmljdGVyIGFkaGVyZW5jZSB0byBSRkMgMzk4NlxuICAgIGlmIChzdHIubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuXG4gICAgdmFyIHN0cmluZyA9IHR5cGVvZiBzdHIgPT09ICdzdHJpbmcnID8gc3RyIDogU3RyaW5nKHN0cik7XG5cbiAgICB2YXIgb3V0ID0gJyc7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHJpbmcubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIGMgPSBzdHJpbmcuY2hhckNvZGVBdChpKTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBjID09PSAweDJEIHx8IC8vIC1cbiAgICAgICAgICAgIGMgPT09IDB4MkUgfHwgLy8gLlxuICAgICAgICAgICAgYyA9PT0gMHg1RiB8fCAvLyBfXG4gICAgICAgICAgICBjID09PSAweDdFIHx8IC8vIH5cbiAgICAgICAgICAgIChjID49IDB4MzAgJiYgYyA8PSAweDM5KSB8fCAvLyAwLTlcbiAgICAgICAgICAgIChjID49IDB4NDEgJiYgYyA8PSAweDVBKSB8fCAvLyBhLXpcbiAgICAgICAgICAgIChjID49IDB4NjEgJiYgYyA8PSAweDdBKSAvLyBBLVpcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBvdXQgKz0gc3RyaW5nLmNoYXJBdChpKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGMgPCAweDgwKSB7XG4gICAgICAgICAgICBvdXQgPSBvdXQgKyBoZXhUYWJsZVtjXTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGMgPCAweDgwMCkge1xuICAgICAgICAgICAgb3V0ID0gb3V0ICsgKGhleFRhYmxlWzB4QzAgfCAoYyA+PiA2KV0gKyBoZXhUYWJsZVsweDgwIHwgKGMgJiAweDNGKV0pO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYyA8IDB4RDgwMCB8fCBjID49IDB4RTAwMCkge1xuICAgICAgICAgICAgb3V0ID0gb3V0ICsgKGhleFRhYmxlWzB4RTAgfCAoYyA+PiAxMildICsgaGV4VGFibGVbMHg4MCB8ICgoYyA+PiA2KSAmIDB4M0YpXSArIGhleFRhYmxlWzB4ODAgfCAoYyAmIDB4M0YpXSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGkgKz0gMTtcbiAgICAgICAgYyA9IDB4MTAwMDAgKyAoKChjICYgMHgzRkYpIDw8IDEwKSB8IChzdHJpbmcuY2hhckNvZGVBdChpKSAmIDB4M0ZGKSk7XG4gICAgICAgIG91dCArPSBoZXhUYWJsZVsweEYwIHwgKGMgPj4gMTgpXSArIGhleFRhYmxlWzB4ODAgfCAoKGMgPj4gMTIpICYgMHgzRildICsgaGV4VGFibGVbMHg4MCB8ICgoYyA+PiA2KSAmIDB4M0YpXSArIGhleFRhYmxlWzB4ODAgfCAoYyAmIDB4M0YpXTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3V0O1xufTtcblxuZXhwb3J0cy5jb21wYWN0ID0gZnVuY3Rpb24gKG9iaiwgcmVmZXJlbmNlcykge1xuICAgIGlmICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyB8fCBvYmogPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICB9XG5cbiAgICB2YXIgcmVmcyA9IHJlZmVyZW5jZXMgfHwgW107XG4gICAgdmFyIGxvb2t1cCA9IHJlZnMuaW5kZXhPZihvYmopO1xuICAgIGlmIChsb29rdXAgIT09IC0xKSB7XG4gICAgICAgIHJldHVybiByZWZzW2xvb2t1cF07XG4gICAgfVxuXG4gICAgcmVmcy5wdXNoKG9iaik7XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICAgIHZhciBjb21wYWN0ZWQgPSBbXTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9iai5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgaWYgKG9ialtpXSAmJiB0eXBlb2Ygb2JqW2ldID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIGNvbXBhY3RlZC5wdXNoKGV4cG9ydHMuY29tcGFjdChvYmpbaV0sIHJlZnMpKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG9ialtpXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBjb21wYWN0ZWQucHVzaChvYmpbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvbXBhY3RlZDtcbiAgICB9XG5cbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBrZXlzLmxlbmd0aDsgKytqKSB7XG4gICAgICAgIHZhciBrZXkgPSBrZXlzW2pdO1xuICAgICAgICBvYmpba2V5XSA9IGV4cG9ydHMuY29tcGFjdChvYmpba2V5XSwgcmVmcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9iajtcbn07XG5cbmV4cG9ydHMuaXNSZWdFeHAgPSBmdW5jdGlvbiAob2JqKSB7XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopID09PSAnW29iamVjdCBSZWdFeHBdJztcbn07XG5cbmV4cG9ydHMuaXNCdWZmZXIgPSBmdW5jdGlvbiAob2JqKSB7XG4gICAgaWYgKG9iaiA9PT0gbnVsbCB8fCB0eXBlb2Ygb2JqID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuICEhKG9iai5jb25zdHJ1Y3RvciAmJiBvYmouY29uc3RydWN0b3IuaXNCdWZmZXIgJiYgb2JqLmNvbnN0cnVjdG9yLmlzQnVmZmVyKG9iaikpO1xufTtcbiIsIihmdW5jdGlvbiAocHJvY2Vzcyl7XG4ndXNlIHN0cmljdCc7XG5cbnZhciBfc3RyaW5naWZ5ID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9jb3JlLWpzL2pzb24vc3RyaW5naWZ5Jyk7XG5cbnZhciBfc3RyaW5naWZ5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3N0cmluZ2lmeSk7XG5cbnZhciBfcHJvbWlzZSA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9wcm9taXNlJyk7XG5cbnZhciBfcHJvbWlzZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wcm9taXNlKTtcblxudmFyIF90eXBlb2YyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL3R5cGVvZicpO1xuXG52YXIgX3R5cGVvZjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF90eXBlb2YyKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHtcblx0cmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07XG59XG5cbi8qIGF4aW9zIHYwLjkuMSB8IChjKSAyMDE2IGJ5IE1hdHQgWmFicmlza2llICovXG4oZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZiAoKHR5cGVvZiBleHBvcnRzID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogKDAsIF90eXBlb2YzLmRlZmF1bHQpKGV4cG9ydHMpKSA9PT0gJ29iamVjdCcgJiYgKHR5cGVvZiBtb2R1bGUgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiAoMCwgX3R5cGVvZjMuZGVmYXVsdCkobW9kdWxlKSkgPT09ICdvYmplY3QnKSBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIGRlZmluZShbXSwgZmFjdG9yeSk7ZWxzZSBpZiAoKHR5cGVvZiBleHBvcnRzID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogKDAsIF90eXBlb2YzLmRlZmF1bHQpKGV4cG9ydHMpKSA9PT0gJ29iamVjdCcpIGV4cG9ydHNbXCJheGlvc1wiXSA9IGZhY3RvcnkoKTtlbHNlIHJvb3RbXCJheGlvc1wiXSA9IGZhY3RvcnkoKTtcbn0pKHVuZGVmaW5lZCwgZnVuY3Rpb24gKCkge1xuXHRyZXR1cm4gKC8qKioqKiovZnVuY3Rpb24gKG1vZHVsZXMpIHtcblx0XHRcdC8vIHdlYnBhY2tCb290c3RyYXBcblx0XHRcdC8qKioqKiovIC8vIFRoZSBtb2R1bGUgY2FjaGVcblx0XHRcdC8qKioqKiovdmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblx0XHRcdC8qKioqKiovXG5cdFx0XHQvKioqKioqLyAvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuXHRcdFx0LyoqKioqKi9mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdFx0XHRcdC8qKioqKiovXG5cdFx0XHRcdC8qKioqKiovIC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHRcdFx0XHQvKioqKioqL2lmIChpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcblx0XHRcdFx0XHQvKioqKioqL3JldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuXHRcdFx0XHQvKioqKioqL1xuXHRcdFx0XHQvKioqKioqLyAvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHRcdFx0XHQvKioqKioqL3ZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcblx0XHRcdFx0XHQvKioqKioqL2V4cG9ydHM6IHt9LFxuXHRcdFx0XHRcdC8qKioqKiovaWQ6IG1vZHVsZUlkLFxuXHRcdFx0XHRcdC8qKioqKiovbG9hZGVkOiBmYWxzZVxuXHRcdFx0XHRcdC8qKioqKiovIH07XG5cdFx0XHRcdC8qKioqKiovXG5cdFx0XHRcdC8qKioqKiovIC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRcdFx0XHQvKioqKioqL21vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXHRcdFx0XHQvKioqKioqL1xuXHRcdFx0XHQvKioqKioqLyAvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG5cdFx0XHRcdC8qKioqKiovbW9kdWxlLmxvYWRlZCA9IHRydWU7XG5cdFx0XHRcdC8qKioqKiovXG5cdFx0XHRcdC8qKioqKiovIC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdFx0XHRcdC8qKioqKiovcmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuXHRcdFx0XHQvKioqKioqL1xuXHRcdFx0fVxuXHRcdFx0LyoqKioqKi9cblx0XHRcdC8qKioqKiovXG5cdFx0XHQvKioqKioqLyAvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuXHRcdFx0LyoqKioqKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXHRcdFx0LyoqKioqKi9cblx0XHRcdC8qKioqKiovIC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG5cdFx0XHQvKioqKioqL19fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cdFx0XHQvKioqKioqL1xuXHRcdFx0LyoqKioqKi8gLy8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cblx0XHRcdC8qKioqKiovX193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblx0XHRcdC8qKioqKiovXG5cdFx0XHQvKioqKioqLyAvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcblx0XHRcdC8qKioqKiovcmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oMCk7XG5cdFx0XHQvKioqKioqL1xuXHRcdH0oXG5cdFx0LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblx0XHQvKioqKioqL1tcblx0XHQvKiAwICovXG5cdFx0LyoqKi9mdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0XHRcdG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcblxuXHRcdFx0LyoqKi9cblx0XHR9LFxuXHRcdC8qIDEgKi9cblx0XHQvKioqL2Z1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRcdFx0J3VzZSBzdHJpY3QnO1xuXG5cdFx0XHR2YXIgZGVmYXVsdHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpO1xuXHRcdFx0dmFyIHV0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKTtcblx0XHRcdHZhciBkaXNwYXRjaFJlcXVlc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpO1xuXHRcdFx0dmFyIEludGVyY2VwdG9yTWFuYWdlciA9IF9fd2VicGFja19yZXF1aXJlX18oMTIpO1xuXHRcdFx0dmFyIGlzQWJzb2x1dGVVUkwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzKTtcblx0XHRcdHZhciBjb21iaW5lVVJMcyA9IF9fd2VicGFja19yZXF1aXJlX18oMTQpO1xuXHRcdFx0dmFyIGJpbmQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE1KTtcblx0XHRcdHZhciB0cmFuc2Zvcm1EYXRhID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4KTtcblxuXHRcdFx0ZnVuY3Rpb24gQXhpb3MoZGVmYXVsdENvbmZpZykge1xuXHRcdFx0XHR0aGlzLmRlZmF1bHRzID0gdXRpbHMubWVyZ2Uoe30sIGRlZmF1bHRDb25maWcpO1xuXHRcdFx0XHR0aGlzLmludGVyY2VwdG9ycyA9IHtcblx0XHRcdFx0XHRyZXF1ZXN0OiBuZXcgSW50ZXJjZXB0b3JNYW5hZ2VyKCksXG5cdFx0XHRcdFx0cmVzcG9uc2U6IG5ldyBJbnRlcmNlcHRvck1hbmFnZXIoKVxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHRBeGlvcy5wcm90b3R5cGUucmVxdWVzdCA9IGZ1bmN0aW9uIHJlcXVlc3QoY29uZmlnKSB7XG5cdFx0XHRcdC8qZXNsaW50IG5vLXBhcmFtLXJlYXNzaWduOjAqL1xuXHRcdFx0XHQvLyBBbGxvdyBmb3IgYXhpb3MoJ2V4YW1wbGUvdXJsJ1ssIGNvbmZpZ10pIGEgbGEgZmV0Y2ggQVBJXG5cdFx0XHRcdGlmICh0eXBlb2YgY29uZmlnID09PSAnc3RyaW5nJykge1xuXHRcdFx0XHRcdGNvbmZpZyA9IHV0aWxzLm1lcmdlKHtcblx0XHRcdFx0XHRcdHVybDogYXJndW1lbnRzWzBdXG5cdFx0XHRcdFx0fSwgYXJndW1lbnRzWzFdKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbmZpZyA9IHV0aWxzLm1lcmdlKGRlZmF1bHRzLCB0aGlzLmRlZmF1bHRzLCB7IG1ldGhvZDogJ2dldCcgfSwgY29uZmlnKTtcblxuXHRcdFx0XHQvLyBTdXBwb3J0IGJhc2VVUkwgY29uZmlnXG5cdFx0XHRcdGlmIChjb25maWcuYmFzZVVSTCAmJiAhaXNBYnNvbHV0ZVVSTChjb25maWcudXJsKSkge1xuXHRcdFx0XHRcdGNvbmZpZy51cmwgPSBjb21iaW5lVVJMcyhjb25maWcuYmFzZVVSTCwgY29uZmlnLnVybCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBEb24ndCBhbGxvdyBvdmVycmlkaW5nIGRlZmF1bHRzLndpdGhDcmVkZW50aWFsc1xuXHRcdFx0XHRjb25maWcud2l0aENyZWRlbnRpYWxzID0gY29uZmlnLndpdGhDcmVkZW50aWFscyB8fCB0aGlzLmRlZmF1bHRzLndpdGhDcmVkZW50aWFscztcblxuXHRcdFx0XHQvLyBUcmFuc2Zvcm0gcmVxdWVzdCBkYXRhXG5cdFx0XHRcdGNvbmZpZy5kYXRhID0gdHJhbnNmb3JtRGF0YShjb25maWcuZGF0YSwgY29uZmlnLmhlYWRlcnMsIGNvbmZpZy50cmFuc2Zvcm1SZXF1ZXN0KTtcblxuXHRcdFx0XHQvLyBGbGF0dGVuIGhlYWRlcnNcblx0XHRcdFx0Y29uZmlnLmhlYWRlcnMgPSB1dGlscy5tZXJnZShjb25maWcuaGVhZGVycy5jb21tb24gfHwge30sIGNvbmZpZy5oZWFkZXJzW2NvbmZpZy5tZXRob2RdIHx8IHt9LCBjb25maWcuaGVhZGVycyB8fCB7fSk7XG5cblx0XHRcdFx0dXRpbHMuZm9yRWFjaChbJ2RlbGV0ZScsICdnZXQnLCAnaGVhZCcsICdwb3N0JywgJ3B1dCcsICdwYXRjaCcsICdjb21tb24nXSwgZnVuY3Rpb24gY2xlYW5IZWFkZXJDb25maWcobWV0aG9kKSB7XG5cdFx0XHRcdFx0ZGVsZXRlIGNvbmZpZy5oZWFkZXJzW21ldGhvZF07XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdC8vIEhvb2sgdXAgaW50ZXJjZXB0b3JzIG1pZGRsZXdhcmVcblx0XHRcdFx0dmFyIGNoYWluID0gW2Rpc3BhdGNoUmVxdWVzdCwgdW5kZWZpbmVkXTtcblx0XHRcdFx0dmFyIHByb21pc2UgPSBfcHJvbWlzZTIuZGVmYXVsdC5yZXNvbHZlKGNvbmZpZyk7XG5cblx0XHRcdFx0dGhpcy5pbnRlcmNlcHRvcnMucmVxdWVzdC5mb3JFYWNoKGZ1bmN0aW9uIHVuc2hpZnRSZXF1ZXN0SW50ZXJjZXB0b3JzKGludGVyY2VwdG9yKSB7XG5cdFx0XHRcdFx0Y2hhaW4udW5zaGlmdChpbnRlcmNlcHRvci5mdWxmaWxsZWQsIGludGVyY2VwdG9yLnJlamVjdGVkKTtcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0dGhpcy5pbnRlcmNlcHRvcnMucmVzcG9uc2UuZm9yRWFjaChmdW5jdGlvbiBwdXNoUmVzcG9uc2VJbnRlcmNlcHRvcnMoaW50ZXJjZXB0b3IpIHtcblx0XHRcdFx0XHRjaGFpbi5wdXNoKGludGVyY2VwdG9yLmZ1bGZpbGxlZCwgaW50ZXJjZXB0b3IucmVqZWN0ZWQpO1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHR3aGlsZSAoY2hhaW4ubGVuZ3RoKSB7XG5cdFx0XHRcdFx0cHJvbWlzZSA9IHByb21pc2UudGhlbihjaGFpbi5zaGlmdCgpLCBjaGFpbi5zaGlmdCgpKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBwcm9taXNlO1xuXHRcdFx0fTtcblxuXHRcdFx0dmFyIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBBeGlvcyhkZWZhdWx0cyk7XG5cdFx0XHR2YXIgYXhpb3MgPSBtb2R1bGUuZXhwb3J0cyA9IGJpbmQoQXhpb3MucHJvdG90eXBlLnJlcXVlc3QsIGRlZmF1bHRJbnN0YW5jZSk7XG5cblx0XHRcdGF4aW9zLmNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZShkZWZhdWx0Q29uZmlnKSB7XG5cdFx0XHRcdHJldHVybiBuZXcgQXhpb3MoZGVmYXVsdENvbmZpZyk7XG5cdFx0XHR9O1xuXG5cdFx0XHQvLyBFeHBvc2UgZGVmYXVsdHNcblx0XHRcdGF4aW9zLmRlZmF1bHRzID0gZGVmYXVsdEluc3RhbmNlLmRlZmF1bHRzO1xuXG5cdFx0XHQvLyBFeHBvc2UgYWxsL3NwcmVhZFxuXHRcdFx0YXhpb3MuYWxsID0gZnVuY3Rpb24gYWxsKHByb21pc2VzKSB7XG5cdFx0XHRcdHJldHVybiBfcHJvbWlzZTIuZGVmYXVsdC5hbGwocHJvbWlzZXMpO1xuXHRcdFx0fTtcblx0XHRcdGF4aW9zLnNwcmVhZCA9IF9fd2VicGFja19yZXF1aXJlX18oMTYpO1xuXG5cdFx0XHQvLyBFeHBvc2UgaW50ZXJjZXB0b3JzXG5cdFx0XHRheGlvcy5pbnRlcmNlcHRvcnMgPSBkZWZhdWx0SW5zdGFuY2UuaW50ZXJjZXB0b3JzO1xuXG5cdFx0XHQvLyBQcm92aWRlIGFsaWFzZXMgZm9yIHN1cHBvcnRlZCByZXF1ZXN0IG1ldGhvZHNcblx0XHRcdHV0aWxzLmZvckVhY2goWydkZWxldGUnLCAnZ2V0JywgJ2hlYWQnXSwgZnVuY3Rpb24gZm9yRWFjaE1ldGhvZE5vRGF0YShtZXRob2QpIHtcblx0XHRcdFx0Lyplc2xpbnQgZnVuYy1uYW1lczowKi9cblx0XHRcdFx0QXhpb3MucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbiAodXJsLCBjb25maWcpIHtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5yZXF1ZXN0KHV0aWxzLm1lcmdlKGNvbmZpZyB8fCB7fSwge1xuXHRcdFx0XHRcdFx0bWV0aG9kOiBtZXRob2QsXG5cdFx0XHRcdFx0XHR1cmw6IHVybFxuXHRcdFx0XHRcdH0pKTtcblx0XHRcdFx0fTtcblx0XHRcdFx0YXhpb3NbbWV0aG9kXSA9IGJpbmQoQXhpb3MucHJvdG90eXBlW21ldGhvZF0sIGRlZmF1bHRJbnN0YW5jZSk7XG5cdFx0XHR9KTtcblxuXHRcdFx0dXRpbHMuZm9yRWFjaChbJ3Bvc3QnLCAncHV0JywgJ3BhdGNoJ10sIGZ1bmN0aW9uIGZvckVhY2hNZXRob2RXaXRoRGF0YShtZXRob2QpIHtcblx0XHRcdFx0Lyplc2xpbnQgZnVuYy1uYW1lczowKi9cblx0XHRcdFx0QXhpb3MucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbiAodXJsLCBkYXRhLCBjb25maWcpIHtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5yZXF1ZXN0KHV0aWxzLm1lcmdlKGNvbmZpZyB8fCB7fSwge1xuXHRcdFx0XHRcdFx0bWV0aG9kOiBtZXRob2QsXG5cdFx0XHRcdFx0XHR1cmw6IHVybCxcblx0XHRcdFx0XHRcdGRhdGE6IGRhdGFcblx0XHRcdFx0XHR9KSk7XG5cdFx0XHRcdH07XG5cdFx0XHRcdGF4aW9zW21ldGhvZF0gPSBiaW5kKEF4aW9zLnByb3RvdHlwZVttZXRob2RdLCBkZWZhdWx0SW5zdGFuY2UpO1xuXHRcdFx0fSk7XG5cblx0XHRcdC8qKiovXG5cdFx0fSxcblx0XHQvKiAyICovXG5cdFx0LyoqKi9mdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0XHRcdCd1c2Ugc3RyaWN0JztcblxuXHRcdFx0dmFyIHV0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKTtcblxuXHRcdFx0dmFyIFBST1RFQ1RJT05fUFJFRklYID0gL15cXClcXF1cXH0nLD9cXG4vO1xuXHRcdFx0dmFyIERFRkFVTFRfQ09OVEVOVF9UWVBFID0ge1xuXHRcdFx0XHQnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCdcblx0XHRcdH07XG5cblx0XHRcdG1vZHVsZS5leHBvcnRzID0ge1xuXHRcdFx0XHR0cmFuc2Zvcm1SZXF1ZXN0OiBbZnVuY3Rpb24gdHJhbnNmb3JtUmVzcG9uc2VKU09OKGRhdGEsIGhlYWRlcnMpIHtcblx0XHRcdFx0XHRpZiAodXRpbHMuaXNGb3JtRGF0YShkYXRhKSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGRhdGE7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICh1dGlscy5pc0FycmF5QnVmZmVyKGRhdGEpKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZGF0YTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKHV0aWxzLmlzQXJyYXlCdWZmZXJWaWV3KGRhdGEpKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZGF0YS5idWZmZXI7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICh1dGlscy5pc09iamVjdChkYXRhKSAmJiAhdXRpbHMuaXNGaWxlKGRhdGEpICYmICF1dGlscy5pc0Jsb2IoZGF0YSkpIHtcblx0XHRcdFx0XHRcdC8vIFNldCBhcHBsaWNhdGlvbi9qc29uIGlmIG5vIENvbnRlbnQtVHlwZSBoYXMgYmVlbiBzcGVjaWZpZWRcblx0XHRcdFx0XHRcdGlmICghdXRpbHMuaXNVbmRlZmluZWQoaGVhZGVycykpIHtcblx0XHRcdFx0XHRcdFx0dXRpbHMuZm9yRWFjaChoZWFkZXJzLCBmdW5jdGlvbiBwcm9jZXNzQ29udGVudFR5cGVIZWFkZXIodmFsLCBrZXkpIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoa2V5LnRvTG93ZXJDYXNlKCkgPT09ICdjb250ZW50LXR5cGUnKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9IHZhbDtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0XHRcdGlmICh1dGlscy5pc1VuZGVmaW5lZChoZWFkZXJzWydDb250ZW50LVR5cGUnXSkpIHtcblx0XHRcdFx0XHRcdFx0XHRoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTgnO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRyZXR1cm4gKDAsIF9zdHJpbmdpZnkyLmRlZmF1bHQpKGRhdGEpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gZGF0YTtcblx0XHRcdFx0fV0sXG5cblx0XHRcdFx0dHJhbnNmb3JtUmVzcG9uc2U6IFtmdW5jdGlvbiB0cmFuc2Zvcm1SZXNwb25zZUpTT04oZGF0YSkge1xuXHRcdFx0XHRcdC8qZXNsaW50IG5vLXBhcmFtLXJlYXNzaWduOjAqL1xuXHRcdFx0XHRcdGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcblx0XHRcdFx0XHRcdGRhdGEgPSBkYXRhLnJlcGxhY2UoUFJPVEVDVElPTl9QUkVGSVgsICcnKTtcblx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdGRhdGEgPSBKU09OLnBhcnNlKGRhdGEpO1xuXHRcdFx0XHRcdFx0fSBjYXRjaCAoZSkgey8qIElnbm9yZSAqL31cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIGRhdGE7XG5cdFx0XHRcdH1dLFxuXG5cdFx0XHRcdGhlYWRlcnM6IHtcblx0XHRcdFx0XHRjb21tb246IHtcblx0XHRcdFx0XHRcdCdBY2NlcHQnOiAnYXBwbGljYXRpb24vanNvbiwgdGV4dC9wbGFpbiwgKi8qJ1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0cGF0Y2g6IHV0aWxzLm1lcmdlKERFRkFVTFRfQ09OVEVOVF9UWVBFKSxcblx0XHRcdFx0XHRwb3N0OiB1dGlscy5tZXJnZShERUZBVUxUX0NPTlRFTlRfVFlQRSksXG5cdFx0XHRcdFx0cHV0OiB1dGlscy5tZXJnZShERUZBVUxUX0NPTlRFTlRfVFlQRSlcblx0XHRcdFx0fSxcblxuXHRcdFx0XHR0aW1lb3V0OiAwLFxuXG5cdFx0XHRcdHhzcmZDb29raWVOYW1lOiAnWFNSRi1UT0tFTicsXG5cdFx0XHRcdHhzcmZIZWFkZXJOYW1lOiAnWC1YU1JGLVRPS0VOJ1xuXHRcdFx0fTtcblxuXHRcdFx0LyoqKi9cblx0XHR9LFxuXHRcdC8qIDMgKi9cblx0XHQvKioqL2Z1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHRcdFx0J3VzZSBzdHJpY3QnO1xuXG5cdFx0XHQvKmdsb2JhbCB0b1N0cmluZzp0cnVlKi9cblxuXHRcdFx0Ly8gdXRpbHMgaXMgYSBsaWJyYXJ5IG9mIGdlbmVyaWMgaGVscGVyIGZ1bmN0aW9ucyBub24tc3BlY2lmaWMgdG8gYXhpb3NcblxuXHRcdFx0dmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxuXHRcdFx0LyoqXG4gICAgKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhbiBBcnJheVxuICAgICpcbiAgICAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAgICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGFuIEFycmF5LCBvdGhlcndpc2UgZmFsc2VcbiAgICAqL1xuXHRcdFx0ZnVuY3Rpb24gaXNBcnJheSh2YWwpIHtcblx0XHRcdFx0cmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsKSA9PT0gJ1tvYmplY3QgQXJyYXldJztcblx0XHRcdH1cblxuXHRcdFx0LyoqXG4gICAgKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhbiBBcnJheUJ1ZmZlclxuICAgICpcbiAgICAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAgICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGFuIEFycmF5QnVmZmVyLCBvdGhlcndpc2UgZmFsc2VcbiAgICAqL1xuXHRcdFx0ZnVuY3Rpb24gaXNBcnJheUJ1ZmZlcih2YWwpIHtcblx0XHRcdFx0cmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsKSA9PT0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJztcblx0XHRcdH1cblxuXHRcdFx0LyoqXG4gICAgKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEZvcm1EYXRhXG4gICAgKlxuICAgICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYW4gRm9ybURhdGEsIG90aGVyd2lzZSBmYWxzZVxuICAgICovXG5cdFx0XHRmdW5jdGlvbiBpc0Zvcm1EYXRhKHZhbCkge1xuXHRcdFx0XHRyZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWwpID09PSAnW29iamVjdCBGb3JtRGF0YV0nO1xuXHRcdFx0fVxuXG5cdFx0XHQvKipcbiAgICAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgdmlldyBvbiBhbiBBcnJheUJ1ZmZlclxuICAgICpcbiAgICAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAgICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgdmlldyBvbiBhbiBBcnJheUJ1ZmZlciwgb3RoZXJ3aXNlIGZhbHNlXG4gICAgKi9cblx0XHRcdGZ1bmN0aW9uIGlzQXJyYXlCdWZmZXJWaWV3KHZhbCkge1xuXHRcdFx0XHR2YXIgcmVzdWx0O1xuXHRcdFx0XHRpZiAodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJiBBcnJheUJ1ZmZlci5pc1ZpZXcpIHtcblx0XHRcdFx0XHRyZXN1bHQgPSBBcnJheUJ1ZmZlci5pc1ZpZXcodmFsKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZXN1bHQgPSB2YWwgJiYgdmFsLmJ1ZmZlciAmJiB2YWwuYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXI7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHRcdH1cblxuXHRcdFx0LyoqXG4gICAgKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIFN0cmluZ1xuICAgICpcbiAgICAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAgICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgU3RyaW5nLCBvdGhlcndpc2UgZmFsc2VcbiAgICAqL1xuXHRcdFx0ZnVuY3Rpb24gaXNTdHJpbmcodmFsKSB7XG5cdFx0XHRcdHJldHVybiB0eXBlb2YgdmFsID09PSAnc3RyaW5nJztcblx0XHRcdH1cblxuXHRcdFx0LyoqXG4gICAgKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIE51bWJlclxuICAgICpcbiAgICAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAgICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgTnVtYmVyLCBvdGhlcndpc2UgZmFsc2VcbiAgICAqL1xuXHRcdFx0ZnVuY3Rpb24gaXNOdW1iZXIodmFsKSB7XG5cdFx0XHRcdHJldHVybiB0eXBlb2YgdmFsID09PSAnbnVtYmVyJztcblx0XHRcdH1cblxuXHRcdFx0LyoqXG4gICAgKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyB1bmRlZmluZWRcbiAgICAqXG4gICAgKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgdW5kZWZpbmVkLCBvdGhlcndpc2UgZmFsc2VcbiAgICAqL1xuXHRcdFx0ZnVuY3Rpb24gaXNVbmRlZmluZWQodmFsKSB7XG5cdFx0XHRcdHJldHVybiB0eXBlb2YgdmFsID09PSAndW5kZWZpbmVkJztcblx0XHRcdH1cblxuXHRcdFx0LyoqXG4gICAgKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhbiBPYmplY3RcbiAgICAqXG4gICAgKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhbiBPYmplY3QsIG90aGVyd2lzZSBmYWxzZVxuICAgICovXG5cdFx0XHRmdW5jdGlvbiBpc09iamVjdCh2YWwpIHtcblx0XHRcdFx0cmV0dXJuIHZhbCAhPT0gbnVsbCAmJiAodHlwZW9mIHZhbCA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6ICgwLCBfdHlwZW9mMy5kZWZhdWx0KSh2YWwpKSA9PT0gJ29iamVjdCc7XG5cdFx0XHR9XG5cblx0XHRcdC8qKlxuICAgICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBEYXRlXG4gICAgKlxuICAgICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBEYXRlLCBvdGhlcndpc2UgZmFsc2VcbiAgICAqL1xuXHRcdFx0ZnVuY3Rpb24gaXNEYXRlKHZhbCkge1xuXHRcdFx0XHRyZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWwpID09PSAnW29iamVjdCBEYXRlXSc7XG5cdFx0XHR9XG5cblx0XHRcdC8qKlxuICAgICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBGaWxlXG4gICAgKlxuICAgICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBGaWxlLCBvdGhlcndpc2UgZmFsc2VcbiAgICAqL1xuXHRcdFx0ZnVuY3Rpb24gaXNGaWxlKHZhbCkge1xuXHRcdFx0XHRyZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWwpID09PSAnW29iamVjdCBGaWxlXSc7XG5cdFx0XHR9XG5cblx0XHRcdC8qKlxuICAgICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBCbG9iXG4gICAgKlxuICAgICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBCbG9iLCBvdGhlcndpc2UgZmFsc2VcbiAgICAqL1xuXHRcdFx0ZnVuY3Rpb24gaXNCbG9iKHZhbCkge1xuXHRcdFx0XHRyZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWwpID09PSAnW29iamVjdCBCbG9iXSc7XG5cdFx0XHR9XG5cblx0XHRcdC8qKlxuICAgICogVHJpbSBleGNlc3Mgd2hpdGVzcGFjZSBvZmYgdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIGEgc3RyaW5nXG4gICAgKlxuICAgICogQHBhcmFtIHtTdHJpbmd9IHN0ciBUaGUgU3RyaW5nIHRvIHRyaW1cbiAgICAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSBTdHJpbmcgZnJlZWQgb2YgZXhjZXNzIHdoaXRlc3BhY2VcbiAgICAqL1xuXHRcdFx0ZnVuY3Rpb24gdHJpbShzdHIpIHtcblx0XHRcdFx0cmV0dXJuIHN0ci5yZXBsYWNlKC9eXFxzKi8sICcnKS5yZXBsYWNlKC9cXHMqJC8sICcnKTtcblx0XHRcdH1cblxuXHRcdFx0LyoqXG4gICAgKiBEZXRlcm1pbmUgaWYgd2UncmUgcnVubmluZyBpbiBhIHN0YW5kYXJkIGJyb3dzZXIgZW52aXJvbm1lbnRcbiAgICAqXG4gICAgKiBUaGlzIGFsbG93cyBheGlvcyB0byBydW4gaW4gYSB3ZWIgd29ya2VyLCBhbmQgcmVhY3QtbmF0aXZlLlxuICAgICogQm90aCBlbnZpcm9ubWVudHMgc3VwcG9ydCBYTUxIdHRwUmVxdWVzdCwgYnV0IG5vdCBmdWxseSBzdGFuZGFyZCBnbG9iYWxzLlxuICAgICpcbiAgICAqIHdlYiB3b3JrZXJzOlxuICAgICogIHR5cGVvZiB3aW5kb3cgLT4gdW5kZWZpbmVkXG4gICAgKiAgdHlwZW9mIGRvY3VtZW50IC0+IHVuZGVmaW5lZFxuICAgICpcbiAgICAqIHJlYWN0LW5hdGl2ZTpcbiAgICAqICB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAtPiB1bmRlZmluZWRcbiAgICAqL1xuXHRcdFx0ZnVuY3Rpb24gaXNTdGFuZGFyZEJyb3dzZXJFbnYoKSB7XG5cdFx0XHRcdHJldHVybiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFbGVtZW50ID09PSAnZnVuY3Rpb24nO1xuXHRcdFx0fVxuXG5cdFx0XHQvKipcbiAgICAqIEl0ZXJhdGUgb3ZlciBhbiBBcnJheSBvciBhbiBPYmplY3QgaW52b2tpbmcgYSBmdW5jdGlvbiBmb3IgZWFjaCBpdGVtLlxuICAgICpcbiAgICAqIElmIGBvYmpgIGlzIGFuIEFycmF5IGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIHBhc3NpbmdcbiAgICAqIHRoZSB2YWx1ZSwgaW5kZXgsIGFuZCBjb21wbGV0ZSBhcnJheSBmb3IgZWFjaCBpdGVtLlxuICAgICpcbiAgICAqIElmICdvYmonIGlzIGFuIE9iamVjdCBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBwYXNzaW5nXG4gICAgKiB0aGUgdmFsdWUsIGtleSwgYW5kIGNvbXBsZXRlIG9iamVjdCBmb3IgZWFjaCBwcm9wZXJ0eS5cbiAgICAqXG4gICAgKiBAcGFyYW0ge09iamVjdHxBcnJheX0gb2JqIFRoZSBvYmplY3QgdG8gaXRlcmF0ZVxuICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGNhbGxiYWNrIHRvIGludm9rZSBmb3IgZWFjaCBpdGVtXG4gICAgKi9cblx0XHRcdGZ1bmN0aW9uIGZvckVhY2gob2JqLCBmbikge1xuXHRcdFx0XHQvLyBEb24ndCBib3RoZXIgaWYgbm8gdmFsdWUgcHJvdmlkZWRcblx0XHRcdFx0aWYgKG9iaiA9PT0gbnVsbCB8fCB0eXBlb2Ygb2JqID09PSAndW5kZWZpbmVkJykge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEZvcmNlIGFuIGFycmF5IGlmIG5vdCBhbHJlYWR5IHNvbWV0aGluZyBpdGVyYWJsZVxuXHRcdFx0XHRpZiAoKHR5cGVvZiBvYmogPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiAoMCwgX3R5cGVvZjMuZGVmYXVsdCkob2JqKSkgIT09ICdvYmplY3QnICYmICFpc0FycmF5KG9iaikpIHtcblx0XHRcdFx0XHQvKmVzbGludCBuby1wYXJhbS1yZWFzc2lnbjowKi9cblx0XHRcdFx0XHRvYmogPSBbb2JqXTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChpc0FycmF5KG9iaikpIHtcblx0XHRcdFx0XHQvLyBJdGVyYXRlIG92ZXIgYXJyYXkgdmFsdWVzXG5cdFx0XHRcdFx0Zm9yICh2YXIgaSA9IDAsIGwgPSBvYmoubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRmbi5jYWxsKG51bGwsIG9ialtpXSwgaSwgb2JqKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gSXRlcmF0ZSBvdmVyIG9iamVjdCBrZXlzXG5cdFx0XHRcdFx0Zm9yICh2YXIga2V5IGluIG9iaikge1xuXHRcdFx0XHRcdFx0aWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG5cdFx0XHRcdFx0XHRcdGZuLmNhbGwobnVsbCwgb2JqW2tleV0sIGtleSwgb2JqKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0LyoqXG4gICAgKiBBY2NlcHRzIHZhcmFyZ3MgZXhwZWN0aW5nIGVhY2ggYXJndW1lbnQgdG8gYmUgYW4gb2JqZWN0LCB0aGVuXG4gICAgKiBpbW11dGFibHkgbWVyZ2VzIHRoZSBwcm9wZXJ0aWVzIG9mIGVhY2ggb2JqZWN0IGFuZCByZXR1cm5zIHJlc3VsdC5cbiAgICAqXG4gICAgKiBXaGVuIG11bHRpcGxlIG9iamVjdHMgY29udGFpbiB0aGUgc2FtZSBrZXkgdGhlIGxhdGVyIG9iamVjdCBpblxuICAgICogdGhlIGFyZ3VtZW50cyBsaXN0IHdpbGwgdGFrZSBwcmVjZWRlbmNlLlxuICAgICpcbiAgICAqIEV4YW1wbGU6XG4gICAgKlxuICAgICogYGBganNcbiAgICAqIHZhciByZXN1bHQgPSBtZXJnZSh7Zm9vOiAxMjN9LCB7Zm9vOiA0NTZ9KTtcbiAgICAqIGNvbnNvbGUubG9nKHJlc3VsdC5mb28pOyAvLyBvdXRwdXRzIDQ1NlxuICAgICogYGBgXG4gICAgKlxuICAgICogQHBhcmFtIHtPYmplY3R9IG9iajEgT2JqZWN0IHRvIG1lcmdlXG4gICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXN1bHQgb2YgYWxsIG1lcmdlIHByb3BlcnRpZXNcbiAgICAqL1xuXHRcdFx0ZnVuY3Rpb24gbWVyZ2UoKSAvKiBvYmoxLCBvYmoyLCBvYmozLCAuLi4gKi97XG5cdFx0XHRcdHZhciByZXN1bHQgPSB7fTtcblx0XHRcdFx0ZnVuY3Rpb24gYXNzaWduVmFsdWUodmFsLCBrZXkpIHtcblx0XHRcdFx0XHRpZiAoKDAsIF90eXBlb2YzLmRlZmF1bHQpKHJlc3VsdFtrZXldKSA9PT0gJ29iamVjdCcgJiYgKHR5cGVvZiB2YWwgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiAoMCwgX3R5cGVvZjMuZGVmYXVsdCkodmFsKSkgPT09ICdvYmplY3QnKSB7XG5cdFx0XHRcdFx0XHRyZXN1bHRba2V5XSA9IG1lcmdlKHJlc3VsdFtrZXldLCB2YWwpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRyZXN1bHRba2V5XSA9IHZhbDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRmb3IgKHZhciBpID0gMCwgbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcblx0XHRcdFx0XHRmb3JFYWNoKGFyZ3VtZW50c1tpXSwgYXNzaWduVmFsdWUpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0XHR9XG5cblx0XHRcdG1vZHVsZS5leHBvcnRzID0ge1xuXHRcdFx0XHRpc0FycmF5OiBpc0FycmF5LFxuXHRcdFx0XHRpc0FycmF5QnVmZmVyOiBpc0FycmF5QnVmZmVyLFxuXHRcdFx0XHRpc0Zvcm1EYXRhOiBpc0Zvcm1EYXRhLFxuXHRcdFx0XHRpc0FycmF5QnVmZmVyVmlldzogaXNBcnJheUJ1ZmZlclZpZXcsXG5cdFx0XHRcdGlzU3RyaW5nOiBpc1N0cmluZyxcblx0XHRcdFx0aXNOdW1iZXI6IGlzTnVtYmVyLFxuXHRcdFx0XHRpc09iamVjdDogaXNPYmplY3QsXG5cdFx0XHRcdGlzVW5kZWZpbmVkOiBpc1VuZGVmaW5lZCxcblx0XHRcdFx0aXNEYXRlOiBpc0RhdGUsXG5cdFx0XHRcdGlzRmlsZTogaXNGaWxlLFxuXHRcdFx0XHRpc0Jsb2I6IGlzQmxvYixcblx0XHRcdFx0aXNTdGFuZGFyZEJyb3dzZXJFbnY6IGlzU3RhbmRhcmRCcm93c2VyRW52LFxuXHRcdFx0XHRmb3JFYWNoOiBmb3JFYWNoLFxuXHRcdFx0XHRtZXJnZTogbWVyZ2UsXG5cdFx0XHRcdHRyaW06IHRyaW1cblx0XHRcdH07XG5cblx0XHRcdC8qKiovXG5cdFx0fSxcblx0XHQvKiA0ICovXG5cdFx0LyoqKi9mdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0XHRcdCd1c2Ugc3RyaWN0JztcblxuXHRcdFx0LyoqXG4gICAgKiBEaXNwYXRjaCBhIHJlcXVlc3QgdG8gdGhlIHNlcnZlciB1c2luZyB3aGljaGV2ZXIgYWRhcHRlclxuICAgICogaXMgc3VwcG9ydGVkIGJ5IHRoZSBjdXJyZW50IGVudmlyb25tZW50LlxuICAgICpcbiAgICAqIEBwYXJhbSB7b2JqZWN0fSBjb25maWcgVGhlIGNvbmZpZyB0aGF0IGlzIHRvIGJlIHVzZWQgZm9yIHRoZSByZXF1ZXN0XG4gICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gVGhlIFByb21pc2UgdG8gYmUgZnVsZmlsbGVkXG4gICAgKi9cblxuXHRcdFx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBkaXNwYXRjaFJlcXVlc3QoY29uZmlnKSB7XG5cdFx0XHRcdHJldHVybiBuZXcgX3Byb21pc2UyLmRlZmF1bHQoZnVuY3Rpb24gZXhlY3V0b3IocmVzb2x2ZSwgcmVqZWN0KSB7XG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdHZhciBhZGFwdGVyO1xuXG5cdFx0XHRcdFx0XHRpZiAodHlwZW9mIGNvbmZpZy5hZGFwdGVyID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdFx0XHRcdC8vIEZvciBjdXN0b20gYWRhcHRlciBzdXBwb3J0XG5cdFx0XHRcdFx0XHRcdGFkYXB0ZXIgPSBjb25maWcuYWRhcHRlcjtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAodHlwZW9mIFhNTEh0dHBSZXF1ZXN0ICE9PSAndW5kZWZpbmVkJykge1xuXHRcdFx0XHRcdFx0XHQvLyBGb3IgYnJvd3NlcnMgdXNlIFhIUiBhZGFwdGVyXG5cdFx0XHRcdFx0XHRcdGFkYXB0ZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRcdFx0XHRcdFx0Ly8gRm9yIG5vZGUgdXNlIEhUVFAgYWRhcHRlclxuXHRcdFx0XHRcdFx0XHRhZGFwdGVyID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKHR5cGVvZiBhZGFwdGVyID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdFx0XHRcdGFkYXB0ZXIocmVzb2x2ZSwgcmVqZWN0LCBjb25maWcpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0XHRcdHJlamVjdChlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fTtcblxuXHRcdFx0LyoqKi9cblx0XHR9LFxuXHRcdC8qIDUgKi9cblx0XHQvKioqL2Z1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRcdFx0J3VzZSBzdHJpY3QnO1xuXG5cdFx0XHR2YXIgdXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpO1xuXHRcdFx0dmFyIGJ1aWxkVVJMID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2KTtcblx0XHRcdHZhciBwYXJzZUhlYWRlcnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcpO1xuXHRcdFx0dmFyIHRyYW5zZm9ybURhdGEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgpO1xuXHRcdFx0dmFyIGlzVVJMU2FtZU9yaWdpbiA9IF9fd2VicGFja19yZXF1aXJlX18oOSk7XG5cdFx0XHR2YXIgYnRvYSA9IHdpbmRvdy5idG9hIHx8IF9fd2VicGFja19yZXF1aXJlX18oMTApO1xuXG5cdFx0XHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHhockFkYXB0ZXIocmVzb2x2ZSwgcmVqZWN0LCBjb25maWcpIHtcblx0XHRcdFx0dmFyIHJlcXVlc3REYXRhID0gY29uZmlnLmRhdGE7XG5cdFx0XHRcdHZhciByZXF1ZXN0SGVhZGVycyA9IGNvbmZpZy5oZWFkZXJzO1xuXG5cdFx0XHRcdGlmICh1dGlscy5pc0Zvcm1EYXRhKHJlcXVlc3REYXRhKSkge1xuXHRcdFx0XHRcdGRlbGV0ZSByZXF1ZXN0SGVhZGVyc1snQ29udGVudC1UeXBlJ107IC8vIExldCB0aGUgYnJvd3NlciBzZXQgaXRcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHZhciByZXF1ZXN0ID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG5cblx0XHRcdFx0Ly8gRm9yIElFIDgvOSBDT1JTIHN1cHBvcnRcblx0XHRcdFx0Ly8gT25seSBzdXBwb3J0cyBQT1NUIGFuZCBHRVQgY2FsbHMgYW5kIGRvZXNuJ3QgcmV0dXJucyB0aGUgcmVzcG9uc2UgaGVhZGVycy5cblx0XHRcdFx0aWYgKHdpbmRvdy5YRG9tYWluUmVxdWVzdCAmJiAhKCd3aXRoQ3JlZGVudGlhbHMnIGluIHJlcXVlc3QpICYmICFpc1VSTFNhbWVPcmlnaW4oY29uZmlnLnVybCkpIHtcblx0XHRcdFx0XHRyZXF1ZXN0ID0gbmV3IHdpbmRvdy5YRG9tYWluUmVxdWVzdCgpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gSFRUUCBiYXNpYyBhdXRoZW50aWNhdGlvblxuXHRcdFx0XHRpZiAoY29uZmlnLmF1dGgpIHtcblx0XHRcdFx0XHR2YXIgdXNlcm5hbWUgPSBjb25maWcuYXV0aC51c2VybmFtZSB8fCAnJztcblx0XHRcdFx0XHR2YXIgcGFzc3dvcmQgPSBjb25maWcuYXV0aC5wYXNzd29yZCB8fCAnJztcblx0XHRcdFx0XHRyZXF1ZXN0SGVhZGVycy5BdXRob3JpemF0aW9uID0gJ0Jhc2ljICcgKyBidG9hKHVzZXJuYW1lICsgJzonICsgcGFzc3dvcmQpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmVxdWVzdC5vcGVuKGNvbmZpZy5tZXRob2QudG9VcHBlckNhc2UoKSwgYnVpbGRVUkwoY29uZmlnLnVybCwgY29uZmlnLnBhcmFtcywgY29uZmlnLnBhcmFtc1NlcmlhbGl6ZXIpLCB0cnVlKTtcblxuXHRcdFx0XHQvLyBTZXQgdGhlIHJlcXVlc3QgdGltZW91dCBpbiBNU1xuXHRcdFx0XHRyZXF1ZXN0LnRpbWVvdXQgPSBjb25maWcudGltZW91dDtcblxuXHRcdFx0XHQvLyBMaXN0ZW4gZm9yIHJlYWR5IHN0YXRlXG5cdFx0XHRcdHJlcXVlc3Qub25sb2FkID0gZnVuY3Rpb24gaGFuZGxlTG9hZCgpIHtcblx0XHRcdFx0XHRpZiAoIXJlcXVlc3QpIHtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Ly8gUHJlcGFyZSB0aGUgcmVzcG9uc2Vcblx0XHRcdFx0XHR2YXIgcmVzcG9uc2VIZWFkZXJzID0gJ2dldEFsbFJlc3BvbnNlSGVhZGVycycgaW4gcmVxdWVzdCA/IHBhcnNlSGVhZGVycyhyZXF1ZXN0LmdldEFsbFJlc3BvbnNlSGVhZGVycygpKSA6IG51bGw7XG5cdFx0XHRcdFx0dmFyIHJlc3BvbnNlRGF0YSA9IFsndGV4dCcsICcnXS5pbmRleE9mKGNvbmZpZy5yZXNwb25zZVR5cGUgfHwgJycpICE9PSAtMSA/IHJlcXVlc3QucmVzcG9uc2VUZXh0IDogcmVxdWVzdC5yZXNwb25zZTtcblx0XHRcdFx0XHR2YXIgcmVzcG9uc2UgPSB7XG5cdFx0XHRcdFx0XHRkYXRhOiB0cmFuc2Zvcm1EYXRhKHJlc3BvbnNlRGF0YSwgcmVzcG9uc2VIZWFkZXJzLCBjb25maWcudHJhbnNmb3JtUmVzcG9uc2UpLFxuXHRcdFx0XHRcdFx0Ly8gSUUgc2VuZHMgMTIyMyBpbnN0ZWFkIG9mIDIwNCAoaHR0cHM6Ly9naXRodWIuY29tL216YWJyaXNraWUvYXhpb3MvaXNzdWVzLzIwMSlcblx0XHRcdFx0XHRcdHN0YXR1czogcmVxdWVzdC5zdGF0dXMgPT09IDEyMjMgPyAyMDQgOiByZXF1ZXN0LnN0YXR1cyxcblx0XHRcdFx0XHRcdHN0YXR1c1RleHQ6IHJlcXVlc3Quc3RhdHVzID09PSAxMjIzID8gJ05vIENvbnRlbnQnIDogcmVxdWVzdC5zdGF0dXNUZXh0LFxuXHRcdFx0XHRcdFx0aGVhZGVyczogcmVzcG9uc2VIZWFkZXJzLFxuXHRcdFx0XHRcdFx0Y29uZmlnOiBjb25maWdcblx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0Ly8gUmVzb2x2ZSBvciByZWplY3QgdGhlIFByb21pc2UgYmFzZWQgb24gdGhlIHN0YXR1c1xuXHRcdFx0XHRcdChyZXNwb25zZS5zdGF0dXMgPj0gMjAwICYmIHJlc3BvbnNlLnN0YXR1cyA8IDMwMCB8fCAhKCdzdGF0dXMnIGluIHJlcXVlc3QpICYmIHJlc3BvbnNlLnJlc3BvbnNlVGV4dCA/IHJlc29sdmUgOiByZWplY3QpKHJlc3BvbnNlKTtcblxuXHRcdFx0XHRcdC8vIENsZWFuIHVwIHJlcXVlc3Rcblx0XHRcdFx0XHRyZXF1ZXN0ID0gbnVsbDtcblx0XHRcdFx0fTtcblxuXHRcdFx0XHQvLyBIYW5kbGUgbG93IGxldmVsIG5ldHdvcmsgZXJyb3JzXG5cdFx0XHRcdHJlcXVlc3Qub25lcnJvciA9IGZ1bmN0aW9uIGhhbmRsZUVycm9yKCkge1xuXHRcdFx0XHRcdC8vIFJlYWwgZXJyb3JzIGFyZSBoaWRkZW4gZnJvbSB1cyBieSB0aGUgYnJvd3NlclxuXHRcdFx0XHRcdC8vIG9uZXJyb3Igc2hvdWxkIG9ubHkgZmlyZSBpZiBpdCdzIGEgbmV0d29yayBlcnJvclxuXHRcdFx0XHRcdHJlamVjdChuZXcgRXJyb3IoJ05ldHdvcmsgRXJyb3InKSk7XG5cblx0XHRcdFx0XHQvLyBDbGVhbiB1cCByZXF1ZXN0XG5cdFx0XHRcdFx0cmVxdWVzdCA9IG51bGw7XG5cdFx0XHRcdH07XG5cblx0XHRcdFx0Ly8gQWRkIHhzcmYgaGVhZGVyXG5cdFx0XHRcdC8vIFRoaXMgaXMgb25seSBkb25lIGlmIHJ1bm5pbmcgaW4gYSBzdGFuZGFyZCBicm93c2VyIGVudmlyb25tZW50LlxuXHRcdFx0XHQvLyBTcGVjaWZpY2FsbHkgbm90IGlmIHdlJ3JlIGluIGEgd2ViIHdvcmtlciwgb3IgcmVhY3QtbmF0aXZlLlxuXHRcdFx0XHRpZiAodXRpbHMuaXNTdGFuZGFyZEJyb3dzZXJFbnYoKSkge1xuXHRcdFx0XHRcdHZhciBjb29raWVzID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMSk7XG5cblx0XHRcdFx0XHQvLyBBZGQgeHNyZiBoZWFkZXJcblx0XHRcdFx0XHR2YXIgeHNyZlZhbHVlID0gY29uZmlnLndpdGhDcmVkZW50aWFscyB8fCBpc1VSTFNhbWVPcmlnaW4oY29uZmlnLnVybCkgPyBjb29raWVzLnJlYWQoY29uZmlnLnhzcmZDb29raWVOYW1lKSA6IHVuZGVmaW5lZDtcblxuXHRcdFx0XHRcdGlmICh4c3JmVmFsdWUpIHtcblx0XHRcdFx0XHRcdHJlcXVlc3RIZWFkZXJzW2NvbmZpZy54c3JmSGVhZGVyTmFtZV0gPSB4c3JmVmFsdWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQWRkIGhlYWRlcnMgdG8gdGhlIHJlcXVlc3Rcblx0XHRcdFx0aWYgKCdzZXRSZXF1ZXN0SGVhZGVyJyBpbiByZXF1ZXN0KSB7XG5cdFx0XHRcdFx0dXRpbHMuZm9yRWFjaChyZXF1ZXN0SGVhZGVycywgZnVuY3Rpb24gc2V0UmVxdWVzdEhlYWRlcih2YWwsIGtleSkge1xuXHRcdFx0XHRcdFx0aWYgKHR5cGVvZiByZXF1ZXN0RGF0YSA9PT0gJ3VuZGVmaW5lZCcgJiYga2V5LnRvTG93ZXJDYXNlKCkgPT09ICdjb250ZW50LXR5cGUnKSB7XG5cdFx0XHRcdFx0XHRcdC8vIFJlbW92ZSBDb250ZW50LVR5cGUgaWYgZGF0YSBpcyB1bmRlZmluZWRcblx0XHRcdFx0XHRcdFx0ZGVsZXRlIHJlcXVlc3RIZWFkZXJzW2tleV07XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHQvLyBPdGhlcndpc2UgYWRkIGhlYWRlciB0byB0aGUgcmVxdWVzdFxuXHRcdFx0XHRcdFx0XHRyZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoa2V5LCB2YWwpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQWRkIHdpdGhDcmVkZW50aWFscyB0byByZXF1ZXN0IGlmIG5lZWRlZFxuXHRcdFx0XHRpZiAoY29uZmlnLndpdGhDcmVkZW50aWFscykge1xuXHRcdFx0XHRcdHJlcXVlc3Qud2l0aENyZWRlbnRpYWxzID0gdHJ1ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEFkZCByZXNwb25zZVR5cGUgdG8gcmVxdWVzdCBpZiBuZWVkZWRcblx0XHRcdFx0aWYgKGNvbmZpZy5yZXNwb25zZVR5cGUpIHtcblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0cmVxdWVzdC5yZXNwb25zZVR5cGUgPSBjb25maWcucmVzcG9uc2VUeXBlO1xuXHRcdFx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0XHRcdGlmIChyZXF1ZXN0LnJlc3BvbnNlVHlwZSAhPT0gJ2pzb24nKSB7XG5cdFx0XHRcdFx0XHRcdHRocm93IGU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHV0aWxzLmlzQXJyYXlCdWZmZXIocmVxdWVzdERhdGEpKSB7XG5cdFx0XHRcdFx0cmVxdWVzdERhdGEgPSBuZXcgRGF0YVZpZXcocmVxdWVzdERhdGEpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gU2VuZCB0aGUgcmVxdWVzdFxuXHRcdFx0XHRyZXF1ZXN0LnNlbmQocmVxdWVzdERhdGEpO1xuXHRcdFx0fTtcblxuXHRcdFx0LyoqKi9cblx0XHR9LFxuXHRcdC8qIDYgKi9cblx0XHQvKioqL2Z1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRcdFx0J3VzZSBzdHJpY3QnO1xuXG5cdFx0XHR2YXIgdXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpO1xuXG5cdFx0XHRmdW5jdGlvbiBlbmNvZGUodmFsKSB7XG5cdFx0XHRcdHJldHVybiBlbmNvZGVVUklDb21wb25lbnQodmFsKS5yZXBsYWNlKC8lNDAvZ2ksICdAJykucmVwbGFjZSgvJTNBL2dpLCAnOicpLnJlcGxhY2UoLyUyNC9nLCAnJCcpLnJlcGxhY2UoLyUyQy9naSwgJywnKS5yZXBsYWNlKC8lMjAvZywgJysnKS5yZXBsYWNlKC8lNUIvZ2ksICdbJykucmVwbGFjZSgvJTVEL2dpLCAnXScpO1xuXHRcdFx0fVxuXG5cdFx0XHQvKipcbiAgICAqIEJ1aWxkIGEgVVJMIGJ5IGFwcGVuZGluZyBwYXJhbXMgdG8gdGhlIGVuZFxuICAgICpcbiAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVGhlIGJhc2Ugb2YgdGhlIHVybCAoZS5nLiwgaHR0cDovL3d3dy5nb29nbGUuY29tKVxuICAgICogQHBhcmFtIHtvYmplY3R9IFtwYXJhbXNdIFRoZSBwYXJhbXMgdG8gYmUgYXBwZW5kZWRcbiAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBmb3JtYXR0ZWQgdXJsXG4gICAgKi9cblx0XHRcdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gYnVpbGRVUkwodXJsLCBwYXJhbXMsIHBhcmFtc1NlcmlhbGl6ZXIpIHtcblx0XHRcdFx0Lyplc2xpbnQgbm8tcGFyYW0tcmVhc3NpZ246MCovXG5cdFx0XHRcdGlmICghcGFyYW1zKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHVybDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHZhciBzZXJpYWxpemVkUGFyYW1zO1xuXHRcdFx0XHRpZiAocGFyYW1zU2VyaWFsaXplcikge1xuXHRcdFx0XHRcdHNlcmlhbGl6ZWRQYXJhbXMgPSBwYXJhbXNTZXJpYWxpemVyKHBhcmFtcyk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dmFyIHBhcnRzID0gW107XG5cblx0XHRcdFx0XHR1dGlscy5mb3JFYWNoKHBhcmFtcywgZnVuY3Rpb24gc2VyaWFsaXplKHZhbCwga2V5KSB7XG5cdFx0XHRcdFx0XHRpZiAodmFsID09PSBudWxsIHx8IHR5cGVvZiB2YWwgPT09ICd1bmRlZmluZWQnKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKHV0aWxzLmlzQXJyYXkodmFsKSkge1xuXHRcdFx0XHRcdFx0XHRrZXkgPSBrZXkgKyAnW10nO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAoIXV0aWxzLmlzQXJyYXkodmFsKSkge1xuXHRcdFx0XHRcdFx0XHR2YWwgPSBbdmFsXTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0dXRpbHMuZm9yRWFjaCh2YWwsIGZ1bmN0aW9uIHBhcnNlVmFsdWUodikge1xuXHRcdFx0XHRcdFx0XHRpZiAodXRpbHMuaXNEYXRlKHYpKSB7XG5cdFx0XHRcdFx0XHRcdFx0diA9IHYudG9JU09TdHJpbmcoKTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmICh1dGlscy5pc09iamVjdCh2KSkge1xuXHRcdFx0XHRcdFx0XHRcdHYgPSAoMCwgX3N0cmluZ2lmeTIuZGVmYXVsdCkodik7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0cGFydHMucHVzaChlbmNvZGUoa2V5KSArICc9JyArIGVuY29kZSh2KSk7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRcdHNlcmlhbGl6ZWRQYXJhbXMgPSBwYXJ0cy5qb2luKCcmJyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoc2VyaWFsaXplZFBhcmFtcykge1xuXHRcdFx0XHRcdHVybCArPSAodXJsLmluZGV4T2YoJz8nKSA9PT0gLTEgPyAnPycgOiAnJicpICsgc2VyaWFsaXplZFBhcmFtcztcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiB1cmw7XG5cdFx0XHR9O1xuXG5cdFx0XHQvKioqL1xuXHRcdH0sXG5cdFx0LyogNyAqL1xuXHRcdC8qKiovZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdFx0XHQndXNlIHN0cmljdCc7XG5cblx0XHRcdHZhciB1dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oMyk7XG5cblx0XHRcdC8qKlxuICAgICogUGFyc2UgaGVhZGVycyBpbnRvIGFuIG9iamVjdFxuICAgICpcbiAgICAqIGBgYFxuICAgICogRGF0ZTogV2VkLCAyNyBBdWcgMjAxNCAwODo1ODo0OSBHTVRcbiAgICAqIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvblxuICAgICogQ29ubmVjdGlvbjoga2VlcC1hbGl2ZVxuICAgICogVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWRcbiAgICAqIGBgYFxuICAgICpcbiAgICAqIEBwYXJhbSB7U3RyaW5nfSBoZWFkZXJzIEhlYWRlcnMgbmVlZGluZyB0byBiZSBwYXJzZWRcbiAgICAqIEByZXR1cm5zIHtPYmplY3R9IEhlYWRlcnMgcGFyc2VkIGludG8gYW4gb2JqZWN0XG4gICAgKi9cblx0XHRcdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gcGFyc2VIZWFkZXJzKGhlYWRlcnMpIHtcblx0XHRcdFx0dmFyIHBhcnNlZCA9IHt9O1xuXHRcdFx0XHR2YXIga2V5O1xuXHRcdFx0XHR2YXIgdmFsO1xuXHRcdFx0XHR2YXIgaTtcblxuXHRcdFx0XHRpZiAoIWhlYWRlcnMpIHtcblx0XHRcdFx0XHRyZXR1cm4gcGFyc2VkO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dXRpbHMuZm9yRWFjaChoZWFkZXJzLnNwbGl0KCdcXG4nKSwgZnVuY3Rpb24gcGFyc2VyKGxpbmUpIHtcblx0XHRcdFx0XHRpID0gbGluZS5pbmRleE9mKCc6Jyk7XG5cdFx0XHRcdFx0a2V5ID0gdXRpbHMudHJpbShsaW5lLnN1YnN0cigwLCBpKSkudG9Mb3dlckNhc2UoKTtcblx0XHRcdFx0XHR2YWwgPSB1dGlscy50cmltKGxpbmUuc3Vic3RyKGkgKyAxKSk7XG5cblx0XHRcdFx0XHRpZiAoa2V5KSB7XG5cdFx0XHRcdFx0XHRwYXJzZWRba2V5XSA9IHBhcnNlZFtrZXldID8gcGFyc2VkW2tleV0gKyAnLCAnICsgdmFsIDogdmFsO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0cmV0dXJuIHBhcnNlZDtcblx0XHRcdH07XG5cblx0XHRcdC8qKiovXG5cdFx0fSxcblx0XHQvKiA4ICovXG5cdFx0LyoqKi9mdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0XHRcdCd1c2Ugc3RyaWN0JztcblxuXHRcdFx0dmFyIHV0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKTtcblxuXHRcdFx0LyoqXG4gICAgKiBUcmFuc2Zvcm0gdGhlIGRhdGEgZm9yIGEgcmVxdWVzdCBvciBhIHJlc3BvbnNlXG4gICAgKlxuICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSBkYXRhIFRoZSBkYXRhIHRvIGJlIHRyYW5zZm9ybWVkXG4gICAgKiBAcGFyYW0ge0FycmF5fSBoZWFkZXJzIFRoZSBoZWFkZXJzIGZvciB0aGUgcmVxdWVzdCBvciByZXNwb25zZVxuICAgICogQHBhcmFtIHtBcnJheXxGdW5jdGlvbn0gZm5zIEEgc2luZ2xlIGZ1bmN0aW9uIG9yIEFycmF5IG9mIGZ1bmN0aW9uc1xuICAgICogQHJldHVybnMgeyp9IFRoZSByZXN1bHRpbmcgdHJhbnNmb3JtZWQgZGF0YVxuICAgICovXG5cdFx0XHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHRyYW5zZm9ybURhdGEoZGF0YSwgaGVhZGVycywgZm5zKSB7XG5cdFx0XHRcdC8qZXNsaW50IG5vLXBhcmFtLXJlYXNzaWduOjAqL1xuXHRcdFx0XHR1dGlscy5mb3JFYWNoKGZucywgZnVuY3Rpb24gdHJhbnNmb3JtKGZuKSB7XG5cdFx0XHRcdFx0ZGF0YSA9IGZuKGRhdGEsIGhlYWRlcnMpO1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRyZXR1cm4gZGF0YTtcblx0XHRcdH07XG5cblx0XHRcdC8qKiovXG5cdFx0fSxcblx0XHQvKiA5ICovXG5cdFx0LyoqKi9mdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0XHRcdCd1c2Ugc3RyaWN0JztcblxuXHRcdFx0dmFyIHV0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKTtcblxuXHRcdFx0bW9kdWxlLmV4cG9ydHMgPSB1dGlscy5pc1N0YW5kYXJkQnJvd3NlckVudigpID9cblxuXHRcdFx0Ly8gU3RhbmRhcmQgYnJvd3NlciBlbnZzIGhhdmUgZnVsbCBzdXBwb3J0IG9mIHRoZSBBUElzIG5lZWRlZCB0byB0ZXN0XG5cdFx0XHQvLyB3aGV0aGVyIHRoZSByZXF1ZXN0IFVSTCBpcyBvZiB0aGUgc2FtZSBvcmlnaW4gYXMgY3VycmVudCBsb2NhdGlvbi5cblx0XHRcdGZ1bmN0aW9uIHN0YW5kYXJkQnJvd3NlckVudigpIHtcblx0XHRcdFx0dmFyIG1zaWUgPSAvKG1zaWV8dHJpZGVudCkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xuXHRcdFx0XHR2YXIgdXJsUGFyc2luZ05vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG5cdFx0XHRcdHZhciBvcmlnaW5VUkw7XG5cblx0XHRcdFx0LyoqXG4gICAgKiBQYXJzZSBhIFVSTCB0byBkaXNjb3ZlciBpdCdzIGNvbXBvbmVudHNcbiAgICAqXG4gICAgKiBAcGFyYW0ge1N0cmluZ30gdXJsIFRoZSBVUkwgdG8gYmUgcGFyc2VkXG4gICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICovXG5cdFx0XHRcdGZ1bmN0aW9uIHJlc29sdmVVUkwodXJsKSB7XG5cdFx0XHRcdFx0dmFyIGhyZWYgPSB1cmw7XG5cblx0XHRcdFx0XHRpZiAobXNpZSkge1xuXHRcdFx0XHRcdFx0Ly8gSUUgbmVlZHMgYXR0cmlidXRlIHNldCB0d2ljZSB0byBub3JtYWxpemUgcHJvcGVydGllc1xuXHRcdFx0XHRcdFx0dXJsUGFyc2luZ05vZGUuc2V0QXR0cmlidXRlKCdocmVmJywgaHJlZik7XG5cdFx0XHRcdFx0XHRocmVmID0gdXJsUGFyc2luZ05vZGUuaHJlZjtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR1cmxQYXJzaW5nTm9kZS5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCBocmVmKTtcblxuXHRcdFx0XHRcdC8vIHVybFBhcnNpbmdOb2RlIHByb3ZpZGVzIHRoZSBVcmxVdGlscyBpbnRlcmZhY2UgLSBodHRwOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jdXJsdXRpbHNcblx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0aHJlZjogdXJsUGFyc2luZ05vZGUuaHJlZixcblx0XHRcdFx0XHRcdHByb3RvY29sOiB1cmxQYXJzaW5nTm9kZS5wcm90b2NvbCA/IHVybFBhcnNpbmdOb2RlLnByb3RvY29sLnJlcGxhY2UoLzokLywgJycpIDogJycsXG5cdFx0XHRcdFx0XHRob3N0OiB1cmxQYXJzaW5nTm9kZS5ob3N0LFxuXHRcdFx0XHRcdFx0c2VhcmNoOiB1cmxQYXJzaW5nTm9kZS5zZWFyY2ggPyB1cmxQYXJzaW5nTm9kZS5zZWFyY2gucmVwbGFjZSgvXlxcPy8sICcnKSA6ICcnLFxuXHRcdFx0XHRcdFx0aGFzaDogdXJsUGFyc2luZ05vZGUuaGFzaCA/IHVybFBhcnNpbmdOb2RlLmhhc2gucmVwbGFjZSgvXiMvLCAnJykgOiAnJyxcblx0XHRcdFx0XHRcdGhvc3RuYW1lOiB1cmxQYXJzaW5nTm9kZS5ob3N0bmFtZSxcblx0XHRcdFx0XHRcdHBvcnQ6IHVybFBhcnNpbmdOb2RlLnBvcnQsXG5cdFx0XHRcdFx0XHRwYXRobmFtZTogdXJsUGFyc2luZ05vZGUucGF0aG5hbWUuY2hhckF0KDApID09PSAnLycgPyB1cmxQYXJzaW5nTm9kZS5wYXRobmFtZSA6ICcvJyArIHVybFBhcnNpbmdOb2RlLnBhdGhuYW1lXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdG9yaWdpblVSTCA9IHJlc29sdmVVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpO1xuXG5cdFx0XHRcdC8qKlxuICAgICogRGV0ZXJtaW5lIGlmIGEgVVJMIHNoYXJlcyB0aGUgc2FtZSBvcmlnaW4gYXMgdGhlIGN1cnJlbnQgbG9jYXRpb25cbiAgICAqXG4gICAgKiBAcGFyYW0ge1N0cmluZ30gcmVxdWVzdFVSTCBUaGUgVVJMIHRvIHRlc3RcbiAgICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIFVSTCBzaGFyZXMgdGhlIHNhbWUgb3JpZ2luLCBvdGhlcndpc2UgZmFsc2VcbiAgICAqL1xuXHRcdFx0XHRyZXR1cm4gZnVuY3Rpb24gaXNVUkxTYW1lT3JpZ2luKHJlcXVlc3RVUkwpIHtcblx0XHRcdFx0XHR2YXIgcGFyc2VkID0gdXRpbHMuaXNTdHJpbmcocmVxdWVzdFVSTCkgPyByZXNvbHZlVVJMKHJlcXVlc3RVUkwpIDogcmVxdWVzdFVSTDtcblx0XHRcdFx0XHRyZXR1cm4gcGFyc2VkLnByb3RvY29sID09PSBvcmlnaW5VUkwucHJvdG9jb2wgJiYgcGFyc2VkLmhvc3QgPT09IG9yaWdpblVSTC5ob3N0O1xuXHRcdFx0XHR9O1xuXHRcdFx0fSgpIDpcblxuXHRcdFx0Ly8gTm9uIHN0YW5kYXJkIGJyb3dzZXIgZW52cyAod2ViIHdvcmtlcnMsIHJlYWN0LW5hdGl2ZSkgbGFjayBuZWVkZWQgc3VwcG9ydC5cblx0XHRcdGZ1bmN0aW9uIG5vblN0YW5kYXJkQnJvd3NlckVudigpIHtcblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uIGlzVVJMU2FtZU9yaWdpbigpIHtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fTtcblx0XHRcdH0oKTtcblxuXHRcdFx0LyoqKi9cblx0XHR9LFxuXHRcdC8qIDEwICovXG5cdFx0LyoqKi9mdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7XG5cblx0XHRcdCd1c2Ugc3RyaWN0JztcblxuXHRcdFx0Ly8gYnRvYSBwb2x5ZmlsbCBmb3IgSUU8MTAgY291cnRlc3kgaHR0cHM6Ly9naXRodWIuY29tL2RhdmlkY2hhbWJlcnMvQmFzZTY0LmpzXG5cblx0XHRcdHZhciBjaGFycyA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSc7XG5cblx0XHRcdGZ1bmN0aW9uIEludmFsaWRDaGFyYWN0ZXJFcnJvcihtZXNzYWdlKSB7XG5cdFx0XHRcdHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG5cdFx0XHR9XG5cdFx0XHRJbnZhbGlkQ2hhcmFjdGVyRXJyb3IucHJvdG90eXBlID0gbmV3IEVycm9yKCk7XG5cdFx0XHRJbnZhbGlkQ2hhcmFjdGVyRXJyb3IucHJvdG90eXBlLmNvZGUgPSA1O1xuXHRcdFx0SW52YWxpZENoYXJhY3RlckVycm9yLnByb3RvdHlwZS5uYW1lID0gJ0ludmFsaWRDaGFyYWN0ZXJFcnJvcic7XG5cblx0XHRcdGZ1bmN0aW9uIGJ0b2EoaW5wdXQpIHtcblx0XHRcdFx0dmFyIHN0ciA9IFN0cmluZyhpbnB1dCk7XG5cdFx0XHRcdHZhciBvdXRwdXQgPSAnJztcblx0XHRcdFx0Zm9yIChcblx0XHRcdFx0Ly8gaW5pdGlhbGl6ZSByZXN1bHQgYW5kIGNvdW50ZXJcblx0XHRcdFx0dmFyIGJsb2NrLCBjaGFyQ29kZSwgaWR4ID0gMCwgbWFwID0gY2hhcnM7XG5cdFx0XHRcdC8vIGlmIHRoZSBuZXh0IHN0ciBpbmRleCBkb2VzIG5vdCBleGlzdDpcblx0XHRcdFx0Ly8gICBjaGFuZ2UgdGhlIG1hcHBpbmcgdGFibGUgdG8gXCI9XCJcblx0XHRcdFx0Ly8gICBjaGVjayBpZiBkIGhhcyBubyBmcmFjdGlvbmFsIGRpZ2l0c1xuXHRcdFx0XHRzdHIuY2hhckF0KGlkeCB8IDApIHx8IChtYXAgPSAnPScsIGlkeCAlIDEpO1xuXHRcdFx0XHQvLyBcIjggLSBpZHggJSAxICogOFwiIGdlbmVyYXRlcyB0aGUgc2VxdWVuY2UgMiwgNCwgNiwgOFxuXHRcdFx0XHRvdXRwdXQgKz0gbWFwLmNoYXJBdCg2MyAmIGJsb2NrID4+IDggLSBpZHggJSAxICogOCkpIHtcblx0XHRcdFx0XHRjaGFyQ29kZSA9IHN0ci5jaGFyQ29kZUF0KGlkeCArPSAzIC8gNCk7XG5cdFx0XHRcdFx0aWYgKGNoYXJDb2RlID4gMHhGRikge1xuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IEludmFsaWRDaGFyYWN0ZXJFcnJvcignSU5WQUxJRF9DSEFSQUNURVJfRVJSOiBET00gRXhjZXB0aW9uIDUnKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YmxvY2sgPSBibG9jayA8PCA4IHwgY2hhckNvZGU7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIG91dHB1dDtcblx0XHRcdH1cblxuXHRcdFx0bW9kdWxlLmV4cG9ydHMgPSBidG9hO1xuXG5cdFx0XHQvKioqL1xuXHRcdH0sXG5cdFx0LyogMTEgKi9cblx0XHQvKioqL2Z1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRcdFx0J3VzZSBzdHJpY3QnO1xuXG5cdFx0XHR2YXIgdXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpO1xuXG5cdFx0XHRtb2R1bGUuZXhwb3J0cyA9IHV0aWxzLmlzU3RhbmRhcmRCcm93c2VyRW52KCkgP1xuXG5cdFx0XHQvLyBTdGFuZGFyZCBicm93c2VyIGVudnMgc3VwcG9ydCBkb2N1bWVudC5jb29raWVcblx0XHRcdGZ1bmN0aW9uIHN0YW5kYXJkQnJvd3NlckVudigpIHtcblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHR3cml0ZTogZnVuY3Rpb24gd3JpdGUobmFtZSwgdmFsdWUsIGV4cGlyZXMsIHBhdGgsIGRvbWFpbiwgc2VjdXJlKSB7XG5cdFx0XHRcdFx0XHR2YXIgY29va2llID0gW107XG5cdFx0XHRcdFx0XHRjb29raWUucHVzaChuYW1lICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKSk7XG5cblx0XHRcdFx0XHRcdGlmICh1dGlscy5pc051bWJlcihleHBpcmVzKSkge1xuXHRcdFx0XHRcdFx0XHRjb29raWUucHVzaCgnZXhwaXJlcz0nICsgbmV3IERhdGUoZXhwaXJlcykudG9HTVRTdHJpbmcoKSk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmICh1dGlscy5pc1N0cmluZyhwYXRoKSkge1xuXHRcdFx0XHRcdFx0XHRjb29raWUucHVzaCgncGF0aD0nICsgcGF0aCk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmICh1dGlscy5pc1N0cmluZyhkb21haW4pKSB7XG5cdFx0XHRcdFx0XHRcdGNvb2tpZS5wdXNoKCdkb21haW49JyArIGRvbWFpbik7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmIChzZWN1cmUgPT09IHRydWUpIHtcblx0XHRcdFx0XHRcdFx0Y29va2llLnB1c2goJ3NlY3VyZScpO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRkb2N1bWVudC5jb29raWUgPSBjb29raWUuam9pbignOyAnKTtcblx0XHRcdFx0XHR9LFxuXG5cdFx0XHRcdFx0cmVhZDogZnVuY3Rpb24gcmVhZChuYW1lKSB7XG5cdFx0XHRcdFx0XHR2YXIgbWF0Y2ggPSBkb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgnKF58O1xcXFxzKikoJyArIG5hbWUgKyAnKT0oW147XSopJykpO1xuXHRcdFx0XHRcdFx0cmV0dXJuIG1hdGNoID8gZGVjb2RlVVJJQ29tcG9uZW50KG1hdGNoWzNdKSA6IG51bGw7XG5cdFx0XHRcdFx0fSxcblxuXHRcdFx0XHRcdHJlbW92ZTogZnVuY3Rpb24gcmVtb3ZlKG5hbWUpIHtcblx0XHRcdFx0XHRcdHRoaXMud3JpdGUobmFtZSwgJycsIERhdGUubm93KCkgLSA4NjQwMDAwMCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdFx0fSgpIDpcblxuXHRcdFx0Ly8gTm9uIHN0YW5kYXJkIGJyb3dzZXIgZW52ICh3ZWIgd29ya2VycywgcmVhY3QtbmF0aXZlKSBsYWNrIG5lZWRlZCBzdXBwb3J0LlxuXHRcdFx0ZnVuY3Rpb24gbm9uU3RhbmRhcmRCcm93c2VyRW52KCkge1xuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdHdyaXRlOiBmdW5jdGlvbiB3cml0ZSgpIHt9LFxuXHRcdFx0XHRcdHJlYWQ6IGZ1bmN0aW9uIHJlYWQoKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHJlbW92ZTogZnVuY3Rpb24gcmVtb3ZlKCkge31cblx0XHRcdFx0fTtcblx0XHRcdH0oKTtcblxuXHRcdFx0LyoqKi9cblx0XHR9LFxuXHRcdC8qIDEyICovXG5cdFx0LyoqKi9mdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0XHRcdCd1c2Ugc3RyaWN0JztcblxuXHRcdFx0dmFyIHV0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKTtcblxuXHRcdFx0ZnVuY3Rpb24gSW50ZXJjZXB0b3JNYW5hZ2VyKCkge1xuXHRcdFx0XHR0aGlzLmhhbmRsZXJzID0gW107XG5cdFx0XHR9XG5cblx0XHRcdC8qKlxuICAgICogQWRkIGEgbmV3IGludGVyY2VwdG9yIHRvIHRoZSBzdGFja1xuICAgICpcbiAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bGZpbGxlZCBUaGUgZnVuY3Rpb24gdG8gaGFuZGxlIGB0aGVuYCBmb3IgYSBgUHJvbWlzZWBcbiAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHJlamVjdGVkIFRoZSBmdW5jdGlvbiB0byBoYW5kbGUgYHJlamVjdGAgZm9yIGEgYFByb21pc2VgXG4gICAgKlxuICAgICogQHJldHVybiB7TnVtYmVyfSBBbiBJRCB1c2VkIHRvIHJlbW92ZSBpbnRlcmNlcHRvciBsYXRlclxuICAgICovXG5cdFx0XHRJbnRlcmNlcHRvck1hbmFnZXIucHJvdG90eXBlLnVzZSA9IGZ1bmN0aW9uIHVzZShmdWxmaWxsZWQsIHJlamVjdGVkKSB7XG5cdFx0XHRcdHRoaXMuaGFuZGxlcnMucHVzaCh7XG5cdFx0XHRcdFx0ZnVsZmlsbGVkOiBmdWxmaWxsZWQsXG5cdFx0XHRcdFx0cmVqZWN0ZWQ6IHJlamVjdGVkXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5oYW5kbGVycy5sZW5ndGggLSAxO1xuXHRcdFx0fTtcblxuXHRcdFx0LyoqXG4gICAgKiBSZW1vdmUgYW4gaW50ZXJjZXB0b3IgZnJvbSB0aGUgc3RhY2tcbiAgICAqXG4gICAgKiBAcGFyYW0ge051bWJlcn0gaWQgVGhlIElEIHRoYXQgd2FzIHJldHVybmVkIGJ5IGB1c2VgXG4gICAgKi9cblx0XHRcdEludGVyY2VwdG9yTWFuYWdlci5wcm90b3R5cGUuZWplY3QgPSBmdW5jdGlvbiBlamVjdChpZCkge1xuXHRcdFx0XHRpZiAodGhpcy5oYW5kbGVyc1tpZF0pIHtcblx0XHRcdFx0XHR0aGlzLmhhbmRsZXJzW2lkXSA9IG51bGw7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cblx0XHRcdC8qKlxuICAgICogSXRlcmF0ZSBvdmVyIGFsbCB0aGUgcmVnaXN0ZXJlZCBpbnRlcmNlcHRvcnNcbiAgICAqXG4gICAgKiBUaGlzIG1ldGhvZCBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIGZvciBza2lwcGluZyBvdmVyIGFueVxuICAgICogaW50ZXJjZXB0b3JzIHRoYXQgbWF5IGhhdmUgYmVjb21lIGBudWxsYCBjYWxsaW5nIGBlamVjdGAuXG4gICAgKlxuICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVhY2ggaW50ZXJjZXB0b3JcbiAgICAqL1xuXHRcdFx0SW50ZXJjZXB0b3JNYW5hZ2VyLnByb3RvdHlwZS5mb3JFYWNoID0gZnVuY3Rpb24gZm9yRWFjaChmbikge1xuXHRcdFx0XHR1dGlscy5mb3JFYWNoKHRoaXMuaGFuZGxlcnMsIGZ1bmN0aW9uIGZvckVhY2hIYW5kbGVyKGgpIHtcblx0XHRcdFx0XHRpZiAoaCAhPT0gbnVsbCkge1xuXHRcdFx0XHRcdFx0Zm4oaCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH07XG5cblx0XHRcdG1vZHVsZS5leHBvcnRzID0gSW50ZXJjZXB0b3JNYW5hZ2VyO1xuXG5cdFx0XHQvKioqL1xuXHRcdH0sXG5cdFx0LyogMTMgKi9cblx0XHQvKioqL2Z1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHRcdFx0J3VzZSBzdHJpY3QnO1xuXG5cdFx0XHQvKipcbiAgICAqIERldGVybWluZXMgd2hldGhlciB0aGUgc3BlY2lmaWVkIFVSTCBpcyBhYnNvbHV0ZVxuICAgICpcbiAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVGhlIFVSTCB0byB0ZXN0XG4gICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIFVSTCBpcyBhYnNvbHV0ZSwgb3RoZXJ3aXNlIGZhbHNlXG4gICAgKi9cblxuXHRcdFx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0Fic29sdXRlVVJMKHVybCkge1xuXHRcdFx0XHQvLyBBIFVSTCBpcyBjb25zaWRlcmVkIGFic29sdXRlIGlmIGl0IGJlZ2lucyB3aXRoIFwiPHNjaGVtZT46Ly9cIiBvciBcIi8vXCIgKHByb3RvY29sLXJlbGF0aXZlIFVSTCkuXG5cdFx0XHRcdC8vIFJGQyAzOTg2IGRlZmluZXMgc2NoZW1lIG5hbWUgYXMgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIGJlZ2lubmluZyB3aXRoIGEgbGV0dGVyIGFuZCBmb2xsb3dlZFxuXHRcdFx0XHQvLyBieSBhbnkgY29tYmluYXRpb24gb2YgbGV0dGVycywgZGlnaXRzLCBwbHVzLCBwZXJpb2QsIG9yIGh5cGhlbi5cblx0XHRcdFx0cmV0dXJuICgvXihbYS16XVthLXpcXGRcXCtcXC1cXC5dKjopP1xcL1xcLy9pLnRlc3QodXJsKVxuXHRcdFx0XHQpO1xuXHRcdFx0fTtcblxuXHRcdFx0LyoqKi9cblx0XHR9LFxuXHRcdC8qIDE0ICovXG5cdFx0LyoqKi9mdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7XG5cblx0XHRcdCd1c2Ugc3RyaWN0JztcblxuXHRcdFx0LyoqXG4gICAgKiBDcmVhdGVzIGEgbmV3IFVSTCBieSBjb21iaW5pbmcgdGhlIHNwZWNpZmllZCBVUkxzXG4gICAgKlxuICAgICogQHBhcmFtIHtzdHJpbmd9IGJhc2VVUkwgVGhlIGJhc2UgVVJMXG4gICAgKiBAcGFyYW0ge3N0cmluZ30gcmVsYXRpdmVVUkwgVGhlIHJlbGF0aXZlIFVSTFxuICAgICogQHJldHVybnMge3N0cmluZ30gVGhlIGNvbWJpbmVkIFVSTFxuICAgICovXG5cblx0XHRcdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gY29tYmluZVVSTHMoYmFzZVVSTCwgcmVsYXRpdmVVUkwpIHtcblx0XHRcdFx0cmV0dXJuIGJhc2VVUkwucmVwbGFjZSgvXFwvKyQvLCAnJykgKyAnLycgKyByZWxhdGl2ZVVSTC5yZXBsYWNlKC9eXFwvKy8sICcnKTtcblx0XHRcdH07XG5cblx0XHRcdC8qKiovXG5cdFx0fSxcblx0XHQvKiAxNSAqL1xuXHRcdC8qKiovZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdFx0XHQndXNlIHN0cmljdCc7XG5cblx0XHRcdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gYmluZChmbiwgdGhpc0FyZykge1xuXHRcdFx0XHRyZXR1cm4gZnVuY3Rpb24gd3JhcCgpIHtcblx0XHRcdFx0XHR2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKTtcblx0XHRcdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRcdGFyZ3NbaV0gPSBhcmd1bWVudHNbaV07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBmbi5hcHBseSh0aGlzQXJnLCBhcmdzKTtcblx0XHRcdFx0fTtcblx0XHRcdH07XG5cblx0XHRcdC8qKiovXG5cdFx0fSxcblx0XHQvKiAxNiAqL1xuXHRcdC8qKiovZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdFx0XHQndXNlIHN0cmljdCc7XG5cblx0XHRcdC8qKlxuICAgICogU3ludGFjdGljIHN1Z2FyIGZvciBpbnZva2luZyBhIGZ1bmN0aW9uIGFuZCBleHBhbmRpbmcgYW4gYXJyYXkgZm9yIGFyZ3VtZW50cy5cbiAgICAqXG4gICAgKiBDb21tb24gdXNlIGNhc2Ugd291bGQgYmUgdG8gdXNlIGBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHlgLlxuICAgICpcbiAgICAqICBgYGBqc1xuICAgICogIGZ1bmN0aW9uIGYoeCwgeSwgeikge31cbiAgICAqICB2YXIgYXJncyA9IFsxLCAyLCAzXTtcbiAgICAqICBmLmFwcGx5KG51bGwsIGFyZ3MpO1xuICAgICogIGBgYFxuICAgICpcbiAgICAqIFdpdGggYHNwcmVhZGAgdGhpcyBleGFtcGxlIGNhbiBiZSByZS13cml0dGVuLlxuICAgICpcbiAgICAqICBgYGBqc1xuICAgICogIHNwcmVhZChmdW5jdGlvbih4LCB5LCB6KSB7fSkoWzEsIDIsIDNdKTtcbiAgICAqICBgYGBcbiAgICAqXG4gICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgICogQHJldHVybnMge0Z1bmN0aW9ufVxuICAgICovXG5cblx0XHRcdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gc3ByZWFkKGNhbGxiYWNrKSB7XG5cdFx0XHRcdHJldHVybiBmdW5jdGlvbiB3cmFwKGFycikge1xuXHRcdFx0XHRcdHJldHVybiBjYWxsYmFjay5hcHBseShudWxsLCBhcnIpO1xuXHRcdFx0XHR9O1xuXHRcdFx0fTtcblxuXHRcdFx0LyoqKi9cblx0XHR9XG5cdFx0LyoqKioqKi9dKVxuXHQpO1xufSk7XG47XG5cbn0pLmNhbGwodGhpcyxyZXF1aXJlKCdfcHJvY2VzcycpKVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ6dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSW01dlpHVmZiVzlrZFd4bGN5OWpiMjUwWlc1MFpuVnNMWE5rYXkxamIzSmxMM1psYm1SdmNpMWljbTkzYzJWeUwyRjRhVzl6TG1weklsMHNJbTVoYldWeklqcGJYU3dpYldGd2NHbHVaM01pT2lJN1FVRkJRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVNJc0ltWnBiR1VpT2lKblpXNWxjbUYwWldRdWFuTWlMQ0p6YjNWeVkyVlNiMjkwSWpvaUlpd2ljMjkxY21ObGMwTnZiblJsYm5RaU9sc2lKM1Z6WlNCemRISnBZM1FuTzF4dVhHNTJZWElnWDNOMGNtbHVaMmxtZVNBOUlISmxjWFZwY21Vb0oySmhZbVZzTFhKMWJuUnBiV1V2WTI5eVpTMXFjeTlxYzI5dUwzTjBjbWx1WjJsbWVTY3BPMXh1WEc1MllYSWdYM04wY21sdVoybG1lVElnUFNCZmFXNTBaWEp2Y0ZKbGNYVnBjbVZFWldaaGRXeDBLRjl6ZEhKcGJtZHBabmtwTzF4dVhHNTJZWElnWDNCeWIyMXBjMlVnUFNCeVpYRjFhWEpsS0NkaVlXSmxiQzF5ZFc1MGFXMWxMMk52Y21VdGFuTXZjSEp2YldselpTY3BPMXh1WEc1MllYSWdYM0J5YjIxcGMyVXlJRDBnWDJsdWRHVnliM0JTWlhGMWFYSmxSR1ZtWVhWc2RDaGZjSEp2YldselpTazdYRzVjYm5aaGNpQmZkSGx3Wlc5bU1pQTlJSEpsY1hWcGNtVW9KMkpoWW1Wc0xYSjFiblJwYldVdmFHVnNjR1Z5Y3k5MGVYQmxiMlluS1R0Y2JseHVkbUZ5SUY5MGVYQmxiMll6SUQwZ1gybHVkR1Z5YjNCU1pYRjFhWEpsUkdWbVlYVnNkQ2hmZEhsd1pXOW1NaWs3WEc1Y2JtWjFibU4wYVc5dUlGOXBiblJsY205d1VtVnhkV2x5WlVSbFptRjFiSFFvYjJKcUtTQjdYRzVjZEhKbGRIVnliaUJ2WW1vZ0ppWWdiMkpxTGw5ZlpYTk5iMlIxYkdVZ1B5QnZZbW9nT2lCN0lHUmxabUYxYkhRNklHOWlhaUI5TzF4dWZWeHVYRzR2S2lCaGVHbHZjeUIyTUM0NUxqRWdmQ0FvWXlrZ01qQXhOaUJpZVNCTllYUjBJRnBoWW5KcGMydHBaU0FxTDF4dUtHWjFibU4wYVc5dUlIZGxZbkJoWTJ0VmJtbDJaWEp6WVd4TmIyUjFiR1ZFWldacGJtbDBhVzl1S0hKdmIzUXNJR1poWTNSdmNua3BJSHRjYmx4MGFXWWdLQ2gwZVhCbGIyWWdaWGh3YjNKMGN5QTlQVDBnSjNWdVpHVm1hVzVsWkNjZ1B5QW5kVzVrWldacGJtVmtKeUE2SUNnd0xDQmZkSGx3Wlc5bU15NWtaV1poZFd4MEtTaGxlSEJ2Y25SektTa2dQVDA5SUNkdlltcGxZM1FuSUNZbUlDaDBlWEJsYjJZZ2JXOWtkV3hsSUQwOVBTQW5kVzVrWldacGJtVmtKeUEvSUNkMWJtUmxabWx1WldRbklEb2dLREFzSUY5MGVYQmxiMll6TG1SbFptRjFiSFFwS0cxdlpIVnNaU2twSUQwOVBTQW5iMkpxWldOMEp5a2diVzlrZFd4bExtVjRjRzl5ZEhNZ1BTQm1ZV04wYjNKNUtDazdaV3h6WlNCcFppQW9kSGx3Wlc5bUlHUmxabWx1WlNBOVBUMGdKMloxYm1OMGFXOXVKeUFtSmlCa1pXWnBibVV1WVcxa0tTQmtaV1pwYm1Vb1cxMHNJR1poWTNSdmNua3BPMlZzYzJVZ2FXWWdLQ2gwZVhCbGIyWWdaWGh3YjNKMGN5QTlQVDBnSjNWdVpHVm1hVzVsWkNjZ1B5QW5kVzVrWldacGJtVmtKeUE2SUNnd0xDQmZkSGx3Wlc5bU15NWtaV1poZFd4MEtTaGxlSEJ2Y25SektTa2dQVDA5SUNkdlltcGxZM1FuS1NCbGVIQnZjblJ6VzF3aVlYaHBiM05jSWwwZ1BTQm1ZV04wYjNKNUtDazdaV3h6WlNCeWIyOTBXMXdpWVhocGIzTmNJbDBnUFNCbVlXTjBiM0o1S0NrN1hHNTlLU2gxYm1SbFptbHVaV1FzSUdaMWJtTjBhVzl1SUNncElIdGNibHgwY21WMGRYSnVJQ2d2S2lvcUtpb3FMMloxYm1OMGFXOXVJQ2h0YjJSMWJHVnpLU0I3WEc1Y2RGeDBYSFF2THlCM1pXSndZV05yUW05dmRITjBjbUZ3WEc1Y2RGeDBYSFF2S2lvcUtpb3FMeUF2THlCVWFHVWdiVzlrZFd4bElHTmhZMmhsWEc1Y2RGeDBYSFF2S2lvcUtpb3FMM1poY2lCcGJuTjBZV3hzWldSTmIyUjFiR1Z6SUQwZ2UzMDdYRzVjZEZ4MFhIUXZLaW9xS2lvcUwxeHVYSFJjZEZ4MEx5b3FLaW9xS2k4Z0x5OGdWR2hsSUhKbGNYVnBjbVVnWm5WdVkzUnBiMjVjYmx4MFhIUmNkQzhxS2lvcUtpb3ZablZ1WTNScGIyNGdYMTkzWldKd1lXTnJYM0psY1hWcGNtVmZYeWh0YjJSMWJHVkpaQ2tnZTF4dVhIUmNkRngwWEhRdktpb3FLaW9xTDF4dVhIUmNkRngwWEhRdktpb3FLaW9xTHlBdkx5QkRhR1ZqYXlCcFppQnRiMlIxYkdVZ2FYTWdhVzRnWTJGamFHVmNibHgwWEhSY2RGeDBMeW9xS2lvcUtpOXBaaUFvYVc1emRHRnNiR1ZrVFc5a2RXeGxjMXR0YjJSMWJHVkpaRjBwWEc1Y2RGeDBYSFJjZEZ4MEx5b3FLaW9xS2k5eVpYUjFjbTRnYVc1emRHRnNiR1ZrVFc5a2RXeGxjMXR0YjJSMWJHVkpaRjB1Wlhod2IzSjBjenRjYmx4MFhIUmNkRngwTHlvcUtpb3FLaTljYmx4MFhIUmNkRngwTHlvcUtpb3FLaThnTHk4Z1EzSmxZWFJsSUdFZ2JtVjNJRzF2WkhWc1pTQW9ZVzVrSUhCMWRDQnBkQ0JwYm5SdklIUm9aU0JqWVdOb1pTbGNibHgwWEhSY2RGeDBMeW9xS2lvcUtpOTJZWElnYlc5a2RXeGxJRDBnYVc1emRHRnNiR1ZrVFc5a2RXeGxjMXR0YjJSMWJHVkpaRjBnUFNCN1hHNWNkRngwWEhSY2RGeDBMeW9xS2lvcUtpOWxlSEJ2Y25Sek9pQjdmU3hjYmx4MFhIUmNkRngwWEhRdktpb3FLaW9xTDJsa09pQnRiMlIxYkdWSlpDeGNibHgwWEhSY2RGeDBYSFF2S2lvcUtpb3FMMnh2WVdSbFpEb2dabUZzYzJWY2JseDBYSFJjZEZ4MFhIUXZLaW9xS2lvcUx5QjlPMXh1WEhSY2RGeDBYSFF2S2lvcUtpb3FMMXh1WEhSY2RGeDBYSFF2S2lvcUtpb3FMeUF2THlCRmVHVmpkWFJsSUhSb1pTQnRiMlIxYkdVZ1puVnVZM1JwYjI1Y2JseDBYSFJjZEZ4MEx5b3FLaW9xS2k5dGIyUjFiR1Z6VzIxdlpIVnNaVWxrWFM1allXeHNLRzF2WkhWc1pTNWxlSEJ2Y25SekxDQnRiMlIxYkdVc0lHMXZaSFZzWlM1bGVIQnZjblJ6TENCZlgzZGxZbkJoWTJ0ZmNtVnhkV2x5WlY5ZktUdGNibHgwWEhSY2RGeDBMeW9xS2lvcUtpOWNibHgwWEhSY2RGeDBMeW9xS2lvcUtpOGdMeThnUm14aFp5QjBhR1VnYlc5a2RXeGxJR0Z6SUd4dllXUmxaRnh1WEhSY2RGeDBYSFF2S2lvcUtpb3FMMjF2WkhWc1pTNXNiMkZrWldRZ1BTQjBjblZsTzF4dVhIUmNkRngwWEhRdktpb3FLaW9xTDF4dVhIUmNkRngwWEhRdktpb3FLaW9xTHlBdkx5QlNaWFIxY200Z2RHaGxJR1Y0Y0c5eWRITWdiMllnZEdobElHMXZaSFZzWlZ4dVhIUmNkRngwWEhRdktpb3FLaW9xTDNKbGRIVnliaUJ0YjJSMWJHVXVaWGh3YjNKMGN6dGNibHgwWEhSY2RGeDBMeW9xS2lvcUtpOWNibHgwWEhSY2RIMWNibHgwWEhSY2RDOHFLaW9xS2lvdlhHNWNkRngwWEhRdktpb3FLaW9xTDF4dVhIUmNkRngwTHlvcUtpb3FLaThnTHk4Z1pYaHdiM05sSUhSb1pTQnRiMlIxYkdWeklHOWlhbVZqZENBb1gxOTNaV0p3WVdOclgyMXZaSFZzWlhOZlh5bGNibHgwWEhSY2RDOHFLaW9xS2lvdlgxOTNaV0p3WVdOclgzSmxjWFZwY21WZlh5NXRJRDBnYlc5a2RXeGxjenRjYmx4MFhIUmNkQzhxS2lvcUtpb3ZYRzVjZEZ4MFhIUXZLaW9xS2lvcUx5QXZMeUJsZUhCdmMyVWdkR2hsSUcxdlpIVnNaU0JqWVdOb1pWeHVYSFJjZEZ4MEx5b3FLaW9xS2k5ZlgzZGxZbkJoWTJ0ZmNtVnhkV2x5WlY5ZkxtTWdQU0JwYm5OMFlXeHNaV1JOYjJSMWJHVnpPMXh1WEhSY2RGeDBMeW9xS2lvcUtpOWNibHgwWEhSY2RDOHFLaW9xS2lvdklDOHZJRjlmZDJWaWNHRmphMTl3ZFdKc2FXTmZjR0YwYUY5ZlhHNWNkRngwWEhRdktpb3FLaW9xTDE5ZmQyVmljR0ZqYTE5eVpYRjFhWEpsWDE4dWNDQTlJRndpWENJN1hHNWNkRngwWEhRdktpb3FLaW9xTDF4dVhIUmNkRngwTHlvcUtpb3FLaThnTHk4Z1RHOWhaQ0JsYm5SeWVTQnRiMlIxYkdVZ1lXNWtJSEpsZEhWeWJpQmxlSEJ2Y25SelhHNWNkRngwWEhRdktpb3FLaW9xTDNKbGRIVnliaUJmWDNkbFluQmhZMnRmY21WeGRXbHlaVjlmS0RBcE8xeHVYSFJjZEZ4MEx5b3FLaW9xS2k5Y2JseDBYSFI5S0Z4dVhIUmNkQzhxS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW92WEc1Y2RGeDBMeW9xS2lvcUtpOWJYRzVjZEZ4MEx5b2dNQ0FxTDF4dVhIUmNkQzhxS2lvdlpuVnVZM1JwYjI0Z0tHMXZaSFZzWlN3Z1pYaHdiM0owY3l3Z1gxOTNaV0p3WVdOclgzSmxjWFZwY21WZlh5a2dlMXh1WEc1Y2RGeDBYSFJ0YjJSMWJHVXVaWGh3YjNKMGN5QTlJRjlmZDJWaWNHRmphMTl5WlhGMWFYSmxYMThvTVNrN1hHNWNibHgwWEhSY2RDOHFLaW92WEc1Y2RGeDBmU3hjYmx4MFhIUXZLaUF4SUNvdlhHNWNkRngwTHlvcUtpOW1kVzVqZEdsdmJpQW9iVzlrZFd4bExDQmxlSEJ2Y25SekxDQmZYM2RsWW5CaFkydGZjbVZ4ZFdseVpWOWZLU0I3WEc1Y2JseDBYSFJjZENkMWMyVWdjM1J5YVdOMEp6dGNibHh1WEhSY2RGeDBkbUZ5SUdSbFptRjFiSFJ6SUQwZ1gxOTNaV0p3WVdOclgzSmxjWFZwY21WZlh5Z3lLVHRjYmx4MFhIUmNkSFpoY2lCMWRHbHNjeUE5SUY5ZmQyVmljR0ZqYTE5eVpYRjFhWEpsWDE4b015azdYRzVjZEZ4MFhIUjJZWElnWkdsemNHRjBZMmhTWlhGMVpYTjBJRDBnWDE5M1pXSndZV05yWDNKbGNYVnBjbVZmWHlnMEtUdGNibHgwWEhSY2RIWmhjaUJKYm5SbGNtTmxjSFJ2Y2sxaGJtRm5aWElnUFNCZlgzZGxZbkJoWTJ0ZmNtVnhkV2x5WlY5ZktERXlLVHRjYmx4MFhIUmNkSFpoY2lCcGMwRmljMjlzZFhSbFZWSk1JRDBnWDE5M1pXSndZV05yWDNKbGNYVnBjbVZmWHlneE15azdYRzVjZEZ4MFhIUjJZWElnWTI5dFltbHVaVlZTVEhNZ1BTQmZYM2RsWW5CaFkydGZjbVZ4ZFdseVpWOWZLREUwS1R0Y2JseDBYSFJjZEhaaGNpQmlhVzVrSUQwZ1gxOTNaV0p3WVdOclgzSmxjWFZwY21WZlh5Z3hOU2s3WEc1Y2RGeDBYSFIyWVhJZ2RISmhibk5tYjNKdFJHRjBZU0E5SUY5ZmQyVmljR0ZqYTE5eVpYRjFhWEpsWDE4b09DazdYRzVjYmx4MFhIUmNkR1oxYm1OMGFXOXVJRUY0YVc5ektHUmxabUYxYkhSRGIyNW1hV2NwSUh0Y2JseDBYSFJjZEZ4MGRHaHBjeTVrWldaaGRXeDBjeUE5SUhWMGFXeHpMbTFsY21kbEtIdDlMQ0JrWldaaGRXeDBRMjl1Wm1sbktUdGNibHgwWEhSY2RGeDBkR2hwY3k1cGJuUmxjbU5sY0hSdmNuTWdQU0I3WEc1Y2RGeDBYSFJjZEZ4MGNtVnhkV1Z6ZERvZ2JtVjNJRWx1ZEdWeVkyVndkRzl5VFdGdVlXZGxjaWdwTEZ4dVhIUmNkRngwWEhSY2RISmxjM0J2Ym5ObE9pQnVaWGNnU1c1MFpYSmpaWEIwYjNKTllXNWhaMlZ5S0NsY2JseDBYSFJjZEZ4MGZUdGNibHgwWEhSY2RIMWNibHh1WEhSY2RGeDBRWGhwYjNNdWNISnZkRzkwZVhCbExuSmxjWFZsYzNRZ1BTQm1kVzVqZEdsdmJpQnlaWEYxWlhOMEtHTnZibVpwWnlrZ2UxeHVYSFJjZEZ4MFhIUXZLbVZ6YkdsdWRDQnVieTF3WVhKaGJTMXlaV0Z6YzJsbmJqb3dLaTljYmx4MFhIUmNkRngwTHk4Z1FXeHNiM2NnWm05eUlHRjRhVzl6S0NkbGVHRnRjR3hsTDNWeWJDZGJMQ0JqYjI1bWFXZGRLU0JoSUd4aElHWmxkR05vSUVGUVNWeHVYSFJjZEZ4MFhIUnBaaUFvZEhsd1pXOW1JR052Ym1acFp5QTlQVDBnSjNOMGNtbHVaeWNwSUh0Y2JseDBYSFJjZEZ4MFhIUmpiMjVtYVdjZ1BTQjFkR2xzY3k1dFpYSm5aU2g3WEc1Y2RGeDBYSFJjZEZ4MFhIUjFjbXc2SUdGeVozVnRaVzUwYzFzd1hWeHVYSFJjZEZ4MFhIUmNkSDBzSUdGeVozVnRaVzUwYzFzeFhTazdYRzVjZEZ4MFhIUmNkSDFjYmx4dVhIUmNkRngwWEhSamIyNW1hV2NnUFNCMWRHbHNjeTV0WlhKblpTaGtaV1poZFd4MGN5d2dkR2hwY3k1a1pXWmhkV3gwY3l3Z2V5QnRaWFJvYjJRNklDZG5aWFFuSUgwc0lHTnZibVpwWnlrN1hHNWNibHgwWEhSY2RGeDBMeThnVTNWd2NHOXlkQ0JpWVhObFZWSk1JR052Ym1acFoxeHVYSFJjZEZ4MFhIUnBaaUFvWTI5dVptbG5MbUpoYzJWVlVrd2dKaVlnSVdselFXSnpiMngxZEdWVlVrd29ZMjl1Wm1sbkxuVnliQ2twSUh0Y2JseDBYSFJjZEZ4MFhIUmpiMjVtYVdjdWRYSnNJRDBnWTI5dFltbHVaVlZTVEhNb1kyOXVabWxuTG1KaGMyVlZVa3dzSUdOdmJtWnBaeTUxY213cE8xeHVYSFJjZEZ4MFhIUjlYRzVjYmx4MFhIUmNkRngwTHk4Z1JHOXVKM1FnWVd4c2IzY2diM1psY25KcFpHbHVaeUJrWldaaGRXeDBjeTUzYVhSb1EzSmxaR1Z1ZEdsaGJITmNibHgwWEhSY2RGeDBZMjl1Wm1sbkxuZHBkR2hEY21Wa1pXNTBhV0ZzY3lBOUlHTnZibVpwWnk1M2FYUm9RM0psWkdWdWRHbGhiSE1nZkh3Z2RHaHBjeTVrWldaaGRXeDBjeTUzYVhSb1EzSmxaR1Z1ZEdsaGJITTdYRzVjYmx4MFhIUmNkRngwTHk4Z1ZISmhibk5tYjNKdElISmxjWFZsYzNRZ1pHRjBZVnh1WEhSY2RGeDBYSFJqYjI1bWFXY3VaR0YwWVNBOUlIUnlZVzV6Wm05eWJVUmhkR0VvWTI5dVptbG5MbVJoZEdFc0lHTnZibVpwWnk1b1pXRmtaWEp6TENCamIyNW1hV2N1ZEhKaGJuTm1iM0p0VW1WeGRXVnpkQ2s3WEc1Y2JseDBYSFJjZEZ4MEx5OGdSbXhoZEhSbGJpQm9aV0ZrWlhKelhHNWNkRngwWEhSY2RHTnZibVpwWnk1b1pXRmtaWEp6SUQwZ2RYUnBiSE11YldWeVoyVW9ZMjl1Wm1sbkxtaGxZV1JsY25NdVkyOXRiVzl1SUh4OElIdDlMQ0JqYjI1bWFXY3VhR1ZoWkdWeWMxdGpiMjVtYVdjdWJXVjBhRzlrWFNCOGZDQjdmU3dnWTI5dVptbG5MbWhsWVdSbGNuTWdmSHdnZTMwcE8xeHVYRzVjZEZ4MFhIUmNkSFYwYVd4ekxtWnZja1ZoWTJnb1d5ZGtaV3hsZEdVbkxDQW5aMlYwSnl3Z0oyaGxZV1FuTENBbmNHOXpkQ2NzSUNkd2RYUW5MQ0FuY0dGMFkyZ25MQ0FuWTI5dGJXOXVKMTBzSUdaMWJtTjBhVzl1SUdOc1pXRnVTR1ZoWkdWeVEyOXVabWxuS0cxbGRHaHZaQ2tnZTF4dVhIUmNkRngwWEhSY2RHUmxiR1YwWlNCamIyNW1hV2N1YUdWaFpHVnljMXR0WlhSb2IyUmRPMXh1WEhSY2RGeDBYSFI5S1R0Y2JseHVYSFJjZEZ4MFhIUXZMeUJJYjI5cklIVndJR2x1ZEdWeVkyVndkRzl5Y3lCdGFXUmtiR1YzWVhKbFhHNWNkRngwWEhSY2RIWmhjaUJqYUdGcGJpQTlJRnRrYVhOd1lYUmphRkpsY1hWbGMzUXNJSFZ1WkdWbWFXNWxaRjA3WEc1Y2RGeDBYSFJjZEhaaGNpQndjbTl0YVhObElEMGdYM0J5YjIxcGMyVXlMbVJsWm1GMWJIUXVjbVZ6YjJ4MlpTaGpiMjVtYVdjcE8xeHVYRzVjZEZ4MFhIUmNkSFJvYVhNdWFXNTBaWEpqWlhCMGIzSnpMbkpsY1hWbGMzUXVabTl5UldGamFDaG1kVzVqZEdsdmJpQjFibk5vYVdaMFVtVnhkV1Z6ZEVsdWRHVnlZMlZ3ZEc5eWN5aHBiblJsY21ObGNIUnZjaWtnZTF4dVhIUmNkRngwWEhSY2RHTm9ZV2x1TG5WdWMyaHBablFvYVc1MFpYSmpaWEIwYjNJdVpuVnNabWxzYkdWa0xDQnBiblJsY21ObGNIUnZjaTV5WldwbFkzUmxaQ2s3WEc1Y2RGeDBYSFJjZEgwcE8xeHVYRzVjZEZ4MFhIUmNkSFJvYVhNdWFXNTBaWEpqWlhCMGIzSnpMbkpsYzNCdmJuTmxMbVp2Y2tWaFkyZ29ablZ1WTNScGIyNGdjSFZ6YUZKbGMzQnZibk5sU1c1MFpYSmpaWEIwYjNKektHbHVkR1Z5WTJWd2RHOXlLU0I3WEc1Y2RGeDBYSFJjZEZ4MFkyaGhhVzR1Y0hWemFDaHBiblJsY21ObGNIUnZjaTVtZFd4bWFXeHNaV1FzSUdsdWRHVnlZMlZ3ZEc5eUxuSmxhbVZqZEdWa0tUdGNibHgwWEhSY2RGeDBmU2s3WEc1Y2JseDBYSFJjZEZ4MGQyaHBiR1VnS0dOb1lXbHVMbXhsYm1kMGFDa2dlMXh1WEhSY2RGeDBYSFJjZEhCeWIyMXBjMlVnUFNCd2NtOXRhWE5sTG5Sb1pXNG9ZMmhoYVc0dWMyaHBablFvS1N3Z1kyaGhhVzR1YzJocFpuUW9LU2s3WEc1Y2RGeDBYSFJjZEgxY2JseHVYSFJjZEZ4MFhIUnlaWFIxY200Z2NISnZiV2x6WlR0Y2JseDBYSFJjZEgwN1hHNWNibHgwWEhSY2RIWmhjaUJrWldaaGRXeDBTVzV6ZEdGdVkyVWdQU0J1WlhjZ1FYaHBiM01vWkdWbVlYVnNkSE1wTzF4dVhIUmNkRngwZG1GeUlHRjRhVzl6SUQwZ2JXOWtkV3hsTG1WNGNHOXlkSE1nUFNCaWFXNWtLRUY0YVc5ekxuQnliM1J2ZEhsd1pTNXlaWEYxWlhOMExDQmtaV1poZFd4MFNXNXpkR0Z1WTJVcE8xeHVYRzVjZEZ4MFhIUmhlR2x2Y3k1amNtVmhkR1VnUFNCbWRXNWpkR2x2YmlCamNtVmhkR1VvWkdWbVlYVnNkRU52Ym1acFp5a2dlMXh1WEhSY2RGeDBYSFJ5WlhSMWNtNGdibVYzSUVGNGFXOXpLR1JsWm1GMWJIUkRiMjVtYVdjcE8xeHVYSFJjZEZ4MGZUdGNibHh1WEhSY2RGeDBMeThnUlhod2IzTmxJR1JsWm1GMWJIUnpYRzVjZEZ4MFhIUmhlR2x2Y3k1a1pXWmhkV3gwY3lBOUlHUmxabUYxYkhSSmJuTjBZVzVqWlM1a1pXWmhkV3gwY3p0Y2JseHVYSFJjZEZ4MEx5OGdSWGh3YjNObElHRnNiQzl6Y0hKbFlXUmNibHgwWEhSY2RHRjRhVzl6TG1Gc2JDQTlJR1oxYm1OMGFXOXVJR0ZzYkNod2NtOXRhWE5sY3lrZ2UxeHVYSFJjZEZ4MFhIUnlaWFIxY200Z1gzQnliMjFwYzJVeUxtUmxabUYxYkhRdVlXeHNLSEJ5YjIxcGMyVnpLVHRjYmx4MFhIUmNkSDA3WEc1Y2RGeDBYSFJoZUdsdmN5NXpjSEpsWVdRZ1BTQmZYM2RsWW5CaFkydGZjbVZ4ZFdseVpWOWZLREUyS1R0Y2JseHVYSFJjZEZ4MEx5OGdSWGh3YjNObElHbHVkR1Z5WTJWd2RHOXljMXh1WEhSY2RGeDBZWGhwYjNNdWFXNTBaWEpqWlhCMGIzSnpJRDBnWkdWbVlYVnNkRWx1YzNSaGJtTmxMbWx1ZEdWeVkyVndkRzl5Y3p0Y2JseHVYSFJjZEZ4MEx5OGdVSEp2ZG1sa1pTQmhiR2xoYzJWeklHWnZjaUJ6ZFhCd2IzSjBaV1FnY21WeGRXVnpkQ0J0WlhSb2IyUnpYRzVjZEZ4MFhIUjFkR2xzY3k1bWIzSkZZV05vS0ZzblpHVnNaWFJsSnl3Z0oyZGxkQ2NzSUNkb1pXRmtKMTBzSUdaMWJtTjBhVzl1SUdadmNrVmhZMmhOWlhSb2IyUk9iMFJoZEdFb2JXVjBhRzlrS1NCN1hHNWNkRngwWEhSY2RDOHFaWE5zYVc1MElHWjFibU10Ym1GdFpYTTZNQ292WEc1Y2RGeDBYSFJjZEVGNGFXOXpMbkJ5YjNSdmRIbHdaVnR0WlhSb2IyUmRJRDBnWm5WdVkzUnBiMjRnS0hWeWJDd2dZMjl1Wm1sbktTQjdYRzVjZEZ4MFhIUmNkRngwY21WMGRYSnVJSFJvYVhNdWNtVnhkV1Z6ZENoMWRHbHNjeTV0WlhKblpTaGpiMjVtYVdjZ2ZId2dlMzBzSUh0Y2JseDBYSFJjZEZ4MFhIUmNkRzFsZEdodlpEb2diV1YwYUc5a0xGeHVYSFJjZEZ4MFhIUmNkRngwZFhKc09pQjFjbXhjYmx4MFhIUmNkRngwWEhSOUtTazdYRzVjZEZ4MFhIUmNkSDA3WEc1Y2RGeDBYSFJjZEdGNGFXOXpXMjFsZEdodlpGMGdQU0JpYVc1a0tFRjRhVzl6TG5CeWIzUnZkSGx3WlZ0dFpYUm9iMlJkTENCa1pXWmhkV3gwU1c1emRHRnVZMlVwTzF4dVhIUmNkRngwZlNrN1hHNWNibHgwWEhSY2RIVjBhV3h6TG1admNrVmhZMmdvV3lkd2IzTjBKeXdnSjNCMWRDY3NJQ2R3WVhSamFDZGRMQ0JtZFc1amRHbHZiaUJtYjNKRllXTm9UV1YwYUc5a1YybDBhRVJoZEdFb2JXVjBhRzlrS1NCN1hHNWNkRngwWEhSY2RDOHFaWE5zYVc1MElHWjFibU10Ym1GdFpYTTZNQ292WEc1Y2RGeDBYSFJjZEVGNGFXOXpMbkJ5YjNSdmRIbHdaVnR0WlhSb2IyUmRJRDBnWm5WdVkzUnBiMjRnS0hWeWJDd2daR0YwWVN3Z1kyOXVabWxuS1NCN1hHNWNkRngwWEhSY2RGeDBjbVYwZFhKdUlIUm9hWE11Y21WeGRXVnpkQ2gxZEdsc2N5NXRaWEpuWlNoamIyNW1hV2NnZkh3Z2UzMHNJSHRjYmx4MFhIUmNkRngwWEhSY2RHMWxkR2h2WkRvZ2JXVjBhRzlrTEZ4dVhIUmNkRngwWEhSY2RGeDBkWEpzT2lCMWNtd3NYRzVjZEZ4MFhIUmNkRngwWEhSa1lYUmhPaUJrWVhSaFhHNWNkRngwWEhSY2RGeDBmU2twTzF4dVhIUmNkRngwWEhSOU8xeHVYSFJjZEZ4MFhIUmhlR2x2YzF0dFpYUm9iMlJkSUQwZ1ltbHVaQ2hCZUdsdmN5NXdjbTkwYjNSNWNHVmJiV1YwYUc5a1hTd2daR1ZtWVhWc2RFbHVjM1JoYm1ObEtUdGNibHgwWEhSY2RIMHBPMXh1WEc1Y2RGeDBYSFF2S2lvcUwxeHVYSFJjZEgwc1hHNWNkRngwTHlvZ01pQXFMMXh1WEhSY2RDOHFLaW92Wm5WdVkzUnBiMjRnS0cxdlpIVnNaU3dnWlhod2IzSjBjeXdnWDE5M1pXSndZV05yWDNKbGNYVnBjbVZmWHlrZ2UxeHVYRzVjZEZ4MFhIUW5kWE5sSUhOMGNtbGpkQ2M3WEc1Y2JseDBYSFJjZEhaaGNpQjFkR2xzY3lBOUlGOWZkMlZpY0dGamExOXlaWEYxYVhKbFgxOG9NeWs3WEc1Y2JseDBYSFJjZEhaaGNpQlFVazlVUlVOVVNVOU9YMUJTUlVaSldDQTlJQzllWEZ3cFhGeGRYRng5Snl3L1hGeHVMenRjYmx4MFhIUmNkSFpoY2lCRVJVWkJWVXhVWDBOUFRsUkZUbFJmVkZsUVJTQTlJSHRjYmx4MFhIUmNkRngwSjBOdmJuUmxiblF0Vkhsd1pTYzZJQ2RoY0hCc2FXTmhkR2x2Ymk5NExYZDNkeTFtYjNKdExYVnliR1Z1WTI5a1pXUW5YRzVjZEZ4MFhIUjlPMXh1WEc1Y2RGeDBYSFJ0YjJSMWJHVXVaWGh3YjNKMGN5QTlJSHRjYmx4MFhIUmNkRngwZEhKaGJuTm1iM0p0VW1WeGRXVnpkRG9nVzJaMWJtTjBhVzl1SUhSeVlXNXpabTl5YlZKbGMzQnZibk5sU2xOUFRpaGtZWFJoTENCb1pXRmtaWEp6S1NCN1hHNWNkRngwWEhSY2RGeDBhV1lnS0hWMGFXeHpMbWx6Um05eWJVUmhkR0VvWkdGMFlTa3BJSHRjYmx4MFhIUmNkRngwWEhSY2RISmxkSFZ5YmlCa1lYUmhPMXh1WEhSY2RGeDBYSFJjZEgxY2JseDBYSFJjZEZ4MFhIUnBaaUFvZFhScGJITXVhWE5CY25KaGVVSjFabVpsY2loa1lYUmhLU2tnZTF4dVhIUmNkRngwWEhSY2RGeDBjbVYwZFhKdUlHUmhkR0U3WEc1Y2RGeDBYSFJjZEZ4MGZWeHVYSFJjZEZ4MFhIUmNkR2xtSUNoMWRHbHNjeTVwYzBGeWNtRjVRblZtWm1WeVZtbGxkeWhrWVhSaEtTa2dlMXh1WEhSY2RGeDBYSFJjZEZ4MGNtVjBkWEp1SUdSaGRHRXVZblZtWm1WeU8xeHVYSFJjZEZ4MFhIUmNkSDFjYmx4MFhIUmNkRngwWEhScFppQW9kWFJwYkhNdWFYTlBZbXBsWTNRb1pHRjBZU2tnSmlZZ0lYVjBhV3h6TG1selJtbHNaU2hrWVhSaEtTQW1KaUFoZFhScGJITXVhWE5DYkc5aUtHUmhkR0VwS1NCN1hHNWNkRngwWEhSY2RGeDBYSFF2THlCVFpYUWdZWEJ3YkdsallYUnBiMjR2YW5OdmJpQnBaaUJ1YnlCRGIyNTBaVzUwTFZSNWNHVWdhR0Z6SUdKbFpXNGdjM0JsWTJsbWFXVmtYRzVjZEZ4MFhIUmNkRngwWEhScFppQW9JWFYwYVd4ekxtbHpWVzVrWldacGJtVmtLR2hsWVdSbGNuTXBLU0I3WEc1Y2RGeDBYSFJjZEZ4MFhIUmNkSFYwYVd4ekxtWnZja1ZoWTJnb2FHVmhaR1Z5Y3l3Z1puVnVZM1JwYjI0Z2NISnZZMlZ6YzBOdmJuUmxiblJVZVhCbFNHVmhaR1Z5S0haaGJDd2dhMlY1S1NCN1hHNWNkRngwWEhSY2RGeDBYSFJjZEZ4MGFXWWdLR3RsZVM1MGIweHZkMlZ5UTJGelpTZ3BJRDA5UFNBblkyOXVkR1Z1ZEMxMGVYQmxKeWtnZTF4dVhIUmNkRngwWEhSY2RGeDBYSFJjZEZ4MGFHVmhaR1Z5YzFzblEyOXVkR1Z1ZEMxVWVYQmxKMTBnUFNCMllXdzdYRzVjZEZ4MFhIUmNkRngwWEhSY2RGeDBmVnh1WEhSY2RGeDBYSFJjZEZ4MFhIUjlLVHRjYmx4dVhIUmNkRngwWEhSY2RGeDBYSFJwWmlBb2RYUnBiSE11YVhOVmJtUmxabWx1WldRb2FHVmhaR1Z5YzFzblEyOXVkR1Z1ZEMxVWVYQmxKMTBwS1NCN1hHNWNkRngwWEhSY2RGeDBYSFJjZEZ4MGFHVmhaR1Z5YzFzblEyOXVkR1Z1ZEMxVWVYQmxKMTBnUFNBbllYQndiR2xqWVhScGIyNHZhbk52Ymp0amFHRnljMlYwUFhWMFppMDRKenRjYmx4MFhIUmNkRngwWEhSY2RGeDBmVnh1WEhSY2RGeDBYSFJjZEZ4MGZWeHVYSFJjZEZ4MFhIUmNkRngwY21WMGRYSnVJQ2d3TENCZmMzUnlhVzVuYVdaNU1pNWtaV1poZFd4MEtTaGtZWFJoS1R0Y2JseDBYSFJjZEZ4MFhIUjlYRzVjZEZ4MFhIUmNkRngwY21WMGRYSnVJR1JoZEdFN1hHNWNkRngwWEhSY2RIMWRMRnh1WEc1Y2RGeDBYSFJjZEhSeVlXNXpabTl5YlZKbGMzQnZibk5sT2lCYlpuVnVZM1JwYjI0Z2RISmhibk5tYjNKdFVtVnpjRzl1YzJWS1UwOU9LR1JoZEdFcElIdGNibHgwWEhSY2RGeDBYSFF2S21WemJHbHVkQ0J1Ynkxd1lYSmhiUzF5WldGemMybG5iam93S2k5Y2JseDBYSFJjZEZ4MFhIUnBaaUFvZEhsd1pXOW1JR1JoZEdFZ1BUMDlJQ2R6ZEhKcGJtY25LU0I3WEc1Y2RGeDBYSFJjZEZ4MFhIUmtZWFJoSUQwZ1pHRjBZUzV5WlhCc1lXTmxLRkJTVDFSRlExUkpUMDVmVUZKRlJrbFlMQ0FuSnlrN1hHNWNkRngwWEhSY2RGeDBYSFIwY25rZ2UxeHVYSFJjZEZ4MFhIUmNkRngwWEhSa1lYUmhJRDBnU2xOUFRpNXdZWEp6WlNoa1lYUmhLVHRjYmx4MFhIUmNkRngwWEhSY2RIMGdZMkYwWTJnZ0tHVXBJSHN2S2lCSloyNXZjbVVnS2k5OVhHNWNkRngwWEhSY2RGeDBmVnh1WEhSY2RGeDBYSFJjZEhKbGRIVnliaUJrWVhSaE8xeHVYSFJjZEZ4MFhIUjlYU3hjYmx4dVhIUmNkRngwWEhSb1pXRmtaWEp6T2lCN1hHNWNkRngwWEhSY2RGeDBZMjl0Ylc5dU9pQjdYRzVjZEZ4MFhIUmNkRngwWEhRblFXTmpaWEIwSnpvZ0oyRndjR3hwWTJGMGFXOXVMMnB6YjI0c0lIUmxlSFF2Y0d4aGFXNHNJQ292S2lkY2JseDBYSFJjZEZ4MFhIUjlMRnh1WEhSY2RGeDBYSFJjZEhCaGRHTm9PaUIxZEdsc2N5NXRaWEpuWlNoRVJVWkJWVXhVWDBOUFRsUkZUbFJmVkZsUVJTa3NYRzVjZEZ4MFhIUmNkRngwY0c5emREb2dkWFJwYkhNdWJXVnlaMlVvUkVWR1FWVk1WRjlEVDA1VVJVNVVYMVJaVUVVcExGeHVYSFJjZEZ4MFhIUmNkSEIxZERvZ2RYUnBiSE11YldWeVoyVW9SRVZHUVZWTVZGOURUMDVVUlU1VVgxUlpVRVVwWEc1Y2RGeDBYSFJjZEgwc1hHNWNibHgwWEhSY2RGeDBkR2x0Wlc5MWREb2dNQ3hjYmx4dVhIUmNkRngwWEhSNGMzSm1RMjl2YTJsbFRtRnRaVG9nSjFoVFVrWXRWRTlMUlU0bkxGeHVYSFJjZEZ4MFhIUjRjM0ptU0dWaFpHVnlUbUZ0WlRvZ0oxZ3RXRk5TUmkxVVQwdEZUaWRjYmx4MFhIUmNkSDA3WEc1Y2JseDBYSFJjZEM4cUtpb3ZYRzVjZEZ4MGZTeGNibHgwWEhRdktpQXpJQ292WEc1Y2RGeDBMeW9xS2k5bWRXNWpkR2x2YmlBb2JXOWtkV3hsTENCbGVIQnZjblJ6S1NCN1hHNWNibHgwWEhSY2RDZDFjMlVnYzNSeWFXTjBKenRjYmx4dVhIUmNkRngwTHlwbmJHOWlZV3dnZEc5VGRISnBibWM2ZEhKMVpTb3ZYRzVjYmx4MFhIUmNkQzh2SUhWMGFXeHpJR2x6SUdFZ2JHbGljbUZ5ZVNCdlppQm5aVzVsY21saklHaGxiSEJsY2lCbWRXNWpkR2x2Ym5NZ2JtOXVMWE53WldOcFptbGpJSFJ2SUdGNGFXOXpYRzVjYmx4MFhIUmNkSFpoY2lCMGIxTjBjbWx1WnlBOUlFOWlhbVZqZEM1d2NtOTBiM1I1Y0dVdWRHOVRkSEpwYm1jN1hHNWNibHgwWEhSY2RDOHFLbHh1SUNBZ0lDb2dSR1YwWlhKdGFXNWxJR2xtSUdFZ2RtRnNkV1VnYVhNZ1lXNGdRWEp5WVhsY2JpQWdJQ0FxWEc0Z0lDQWdLaUJBY0dGeVlXMGdlMDlpYW1WamRIMGdkbUZzSUZSb1pTQjJZV3gxWlNCMGJ5QjBaWE4wWEc0Z0lDQWdLaUJBY21WMGRYSnVjeUI3WW05dmJHVmhibjBnVkhKMVpTQnBaaUIyWVd4MVpTQnBjeUJoYmlCQmNuSmhlU3dnYjNSb1pYSjNhWE5sSUdaaGJITmxYRzRnSUNBZ0tpOWNibHgwWEhSY2RHWjFibU4wYVc5dUlHbHpRWEp5WVhrb2RtRnNLU0I3WEc1Y2RGeDBYSFJjZEhKbGRIVnliaUIwYjFOMGNtbHVaeTVqWVd4c0tIWmhiQ2tnUFQwOUlDZGJiMkpxWldOMElFRnljbUY1WFNjN1hHNWNkRngwWEhSOVhHNWNibHgwWEhSY2RDOHFLbHh1SUNBZ0lDb2dSR1YwWlhKdGFXNWxJR2xtSUdFZ2RtRnNkV1VnYVhNZ1lXNGdRWEp5WVhsQ2RXWm1aWEpjYmlBZ0lDQXFYRzRnSUNBZ0tpQkFjR0Z5WVcwZ2UwOWlhbVZqZEgwZ2RtRnNJRlJvWlNCMllXeDFaU0IwYnlCMFpYTjBYRzRnSUNBZ0tpQkFjbVYwZFhKdWN5QjdZbTl2YkdWaGJuMGdWSEoxWlNCcFppQjJZV3gxWlNCcGN5QmhiaUJCY25KaGVVSjFabVpsY2l3Z2IzUm9aWEozYVhObElHWmhiSE5sWEc0Z0lDQWdLaTljYmx4MFhIUmNkR1oxYm1OMGFXOXVJR2x6UVhKeVlYbENkV1ptWlhJb2RtRnNLU0I3WEc1Y2RGeDBYSFJjZEhKbGRIVnliaUIwYjFOMGNtbHVaeTVqWVd4c0tIWmhiQ2tnUFQwOUlDZGJiMkpxWldOMElFRnljbUY1UW5WbVptVnlYU2M3WEc1Y2RGeDBYSFI5WEc1Y2JseDBYSFJjZEM4cUtseHVJQ0FnSUNvZ1JHVjBaWEp0YVc1bElHbG1JR0VnZG1Gc2RXVWdhWE1nWVNCR2IzSnRSR0YwWVZ4dUlDQWdJQ3BjYmlBZ0lDQXFJRUJ3WVhKaGJTQjdUMkpxWldOMGZTQjJZV3dnVkdobElIWmhiSFZsSUhSdklIUmxjM1JjYmlBZ0lDQXFJRUJ5WlhSMWNtNXpJSHRpYjI5c1pXRnVmU0JVY25WbElHbG1JSFpoYkhWbElHbHpJR0Z1SUVadmNtMUVZWFJoTENCdmRHaGxjbmRwYzJVZ1ptRnNjMlZjYmlBZ0lDQXFMMXh1WEhSY2RGeDBablZ1WTNScGIyNGdhWE5HYjNKdFJHRjBZU2gyWVd3cElIdGNibHgwWEhSY2RGeDBjbVYwZFhKdUlIUnZVM1J5YVc1bkxtTmhiR3dvZG1Gc0tTQTlQVDBnSjF0dlltcGxZM1FnUm05eWJVUmhkR0ZkSnp0Y2JseDBYSFJjZEgxY2JseHVYSFJjZEZ4MEx5b3FYRzRnSUNBZ0tpQkVaWFJsY20xcGJtVWdhV1lnWVNCMllXeDFaU0JwY3lCaElIWnBaWGNnYjI0Z1lXNGdRWEp5WVhsQ2RXWm1aWEpjYmlBZ0lDQXFYRzRnSUNBZ0tpQkFjR0Z5WVcwZ2UwOWlhbVZqZEgwZ2RtRnNJRlJvWlNCMllXeDFaU0IwYnlCMFpYTjBYRzRnSUNBZ0tpQkFjbVYwZFhKdWN5QjdZbTl2YkdWaGJuMGdWSEoxWlNCcFppQjJZV3gxWlNCcGN5QmhJSFpwWlhjZ2IyNGdZVzRnUVhKeVlYbENkV1ptWlhJc0lHOTBhR1Z5ZDJselpTQm1ZV3h6WlZ4dUlDQWdJQ292WEc1Y2RGeDBYSFJtZFc1amRHbHZiaUJwYzBGeWNtRjVRblZtWm1WeVZtbGxkeWgyWVd3cElIdGNibHgwWEhSY2RGeDBkbUZ5SUhKbGMzVnNkRHRjYmx4MFhIUmNkRngwYVdZZ0tIUjVjR1Z2WmlCQmNuSmhlVUoxWm1abGNpQWhQVDBnSjNWdVpHVm1hVzVsWkNjZ0ppWWdRWEp5WVhsQ2RXWm1aWEl1YVhOV2FXVjNLU0I3WEc1Y2RGeDBYSFJjZEZ4MGNtVnpkV3gwSUQwZ1FYSnlZWGxDZFdabVpYSXVhWE5XYVdWM0tIWmhiQ2s3WEc1Y2RGeDBYSFJjZEgwZ1pXeHpaU0I3WEc1Y2RGeDBYSFJjZEZ4MGNtVnpkV3gwSUQwZ2RtRnNJQ1ltSUhaaGJDNWlkV1ptWlhJZ0ppWWdkbUZzTG1KMVptWmxjaUJwYm5OMFlXNWpaVzltSUVGeWNtRjVRblZtWm1WeU8xeHVYSFJjZEZ4MFhIUjlYRzVjZEZ4MFhIUmNkSEpsZEhWeWJpQnlaWE4xYkhRN1hHNWNkRngwWEhSOVhHNWNibHgwWEhSY2RDOHFLbHh1SUNBZ0lDb2dSR1YwWlhKdGFXNWxJR2xtSUdFZ2RtRnNkV1VnYVhNZ1lTQlRkSEpwYm1kY2JpQWdJQ0FxWEc0Z0lDQWdLaUJBY0dGeVlXMGdlMDlpYW1WamRIMGdkbUZzSUZSb1pTQjJZV3gxWlNCMGJ5QjBaWE4wWEc0Z0lDQWdLaUJBY21WMGRYSnVjeUI3WW05dmJHVmhibjBnVkhKMVpTQnBaaUIyWVd4MVpTQnBjeUJoSUZOMGNtbHVaeXdnYjNSb1pYSjNhWE5sSUdaaGJITmxYRzRnSUNBZ0tpOWNibHgwWEhSY2RHWjFibU4wYVc5dUlHbHpVM1J5YVc1bktIWmhiQ2tnZTF4dVhIUmNkRngwWEhSeVpYUjFjbTRnZEhsd1pXOW1JSFpoYkNBOVBUMGdKM04wY21sdVp5YzdYRzVjZEZ4MFhIUjlYRzVjYmx4MFhIUmNkQzhxS2x4dUlDQWdJQ29nUkdWMFpYSnRhVzVsSUdsbUlHRWdkbUZzZFdVZ2FYTWdZU0JPZFcxaVpYSmNiaUFnSUNBcVhHNGdJQ0FnS2lCQWNHRnlZVzBnZTA5aWFtVmpkSDBnZG1Gc0lGUm9aU0IyWVd4MVpTQjBieUIwWlhOMFhHNGdJQ0FnS2lCQWNtVjBkWEp1Y3lCN1ltOXZiR1ZoYm4wZ1ZISjFaU0JwWmlCMllXeDFaU0JwY3lCaElFNTFiV0psY2l3Z2IzUm9aWEozYVhObElHWmhiSE5sWEc0Z0lDQWdLaTljYmx4MFhIUmNkR1oxYm1OMGFXOXVJR2x6VG5WdFltVnlLSFpoYkNrZ2UxeHVYSFJjZEZ4MFhIUnlaWFIxY200Z2RIbHdaVzltSUhaaGJDQTlQVDBnSjI1MWJXSmxjaWM3WEc1Y2RGeDBYSFI5WEc1Y2JseDBYSFJjZEM4cUtseHVJQ0FnSUNvZ1JHVjBaWEp0YVc1bElHbG1JR0VnZG1Gc2RXVWdhWE1nZFc1a1pXWnBibVZrWEc0Z0lDQWdLbHh1SUNBZ0lDb2dRSEJoY21GdElIdFBZbXBsWTNSOUlIWmhiQ0JVYUdVZ2RtRnNkV1VnZEc4Z2RHVnpkRnh1SUNBZ0lDb2dRSEpsZEhWeWJuTWdlMkp2YjJ4bFlXNTlJRlJ5ZFdVZ2FXWWdkR2hsSUhaaGJIVmxJR2x6SUhWdVpHVm1hVzVsWkN3Z2IzUm9aWEozYVhObElHWmhiSE5sWEc0Z0lDQWdLaTljYmx4MFhIUmNkR1oxYm1OMGFXOXVJR2x6Vlc1a1pXWnBibVZrS0haaGJDa2dlMXh1WEhSY2RGeDBYSFJ5WlhSMWNtNGdkSGx3Wlc5bUlIWmhiQ0E5UFQwZ0ozVnVaR1ZtYVc1bFpDYzdYRzVjZEZ4MFhIUjlYRzVjYmx4MFhIUmNkQzhxS2x4dUlDQWdJQ29nUkdWMFpYSnRhVzVsSUdsbUlHRWdkbUZzZFdVZ2FYTWdZVzRnVDJKcVpXTjBYRzRnSUNBZ0tseHVJQ0FnSUNvZ1FIQmhjbUZ0SUh0UFltcGxZM1I5SUhaaGJDQlVhR1VnZG1Gc2RXVWdkRzhnZEdWemRGeHVJQ0FnSUNvZ1FISmxkSFZ5Ym5NZ2UySnZiMnhsWVc1OUlGUnlkV1VnYVdZZ2RtRnNkV1VnYVhNZ1lXNGdUMkpxWldOMExDQnZkR2hsY25kcGMyVWdabUZzYzJWY2JpQWdJQ0FxTDF4dVhIUmNkRngwWm5WdVkzUnBiMjRnYVhOUFltcGxZM1FvZG1Gc0tTQjdYRzVjZEZ4MFhIUmNkSEpsZEhWeWJpQjJZV3dnSVQwOUlHNTFiR3dnSmlZZ0tIUjVjR1Z2WmlCMllXd2dQVDA5SUNkMWJtUmxabWx1WldRbklEOGdKM1Z1WkdWbWFXNWxaQ2NnT2lBb01Dd2dYM1I1Y0dWdlpqTXVaR1ZtWVhWc2RDa29kbUZzS1NrZ1BUMDlJQ2R2WW1wbFkzUW5PMXh1WEhSY2RGeDBmVnh1WEc1Y2RGeDBYSFF2S2lwY2JpQWdJQ0FxSUVSbGRHVnliV2x1WlNCcFppQmhJSFpoYkhWbElHbHpJR0VnUkdGMFpWeHVJQ0FnSUNwY2JpQWdJQ0FxSUVCd1lYSmhiU0I3VDJKcVpXTjBmU0IyWVd3Z1ZHaGxJSFpoYkhWbElIUnZJSFJsYzNSY2JpQWdJQ0FxSUVCeVpYUjFjbTV6SUh0aWIyOXNaV0Z1ZlNCVWNuVmxJR2xtSUhaaGJIVmxJR2x6SUdFZ1JHRjBaU3dnYjNSb1pYSjNhWE5sSUdaaGJITmxYRzRnSUNBZ0tpOWNibHgwWEhSY2RHWjFibU4wYVc5dUlHbHpSR0YwWlNoMllXd3BJSHRjYmx4MFhIUmNkRngwY21WMGRYSnVJSFJ2VTNSeWFXNW5MbU5oYkd3b2RtRnNLU0E5UFQwZ0oxdHZZbXBsWTNRZ1JHRjBaVjBuTzF4dVhIUmNkRngwZlZ4dVhHNWNkRngwWEhRdktpcGNiaUFnSUNBcUlFUmxkR1Z5YldsdVpTQnBaaUJoSUhaaGJIVmxJR2x6SUdFZ1JtbHNaVnh1SUNBZ0lDcGNiaUFnSUNBcUlFQndZWEpoYlNCN1QySnFaV04wZlNCMllXd2dWR2hsSUhaaGJIVmxJSFJ2SUhSbGMzUmNiaUFnSUNBcUlFQnlaWFIxY201eklIdGliMjlzWldGdWZTQlVjblZsSUdsbUlIWmhiSFZsSUdseklHRWdSbWxzWlN3Z2IzUm9aWEozYVhObElHWmhiSE5sWEc0Z0lDQWdLaTljYmx4MFhIUmNkR1oxYm1OMGFXOXVJR2x6Um1sc1pTaDJZV3dwSUh0Y2JseDBYSFJjZEZ4MGNtVjBkWEp1SUhSdlUzUnlhVzVuTG1OaGJHd29kbUZzS1NBOVBUMGdKMXR2WW1wbFkzUWdSbWxzWlYwbk8xeHVYSFJjZEZ4MGZWeHVYRzVjZEZ4MFhIUXZLaXBjYmlBZ0lDQXFJRVJsZEdWeWJXbHVaU0JwWmlCaElIWmhiSFZsSUdseklHRWdRbXh2WWx4dUlDQWdJQ3BjYmlBZ0lDQXFJRUJ3WVhKaGJTQjdUMkpxWldOMGZTQjJZV3dnVkdobElIWmhiSFZsSUhSdklIUmxjM1JjYmlBZ0lDQXFJRUJ5WlhSMWNtNXpJSHRpYjI5c1pXRnVmU0JVY25WbElHbG1JSFpoYkhWbElHbHpJR0VnUW14dllpd2diM1JvWlhKM2FYTmxJR1poYkhObFhHNGdJQ0FnS2k5Y2JseDBYSFJjZEdaMWJtTjBhVzl1SUdselFteHZZaWgyWVd3cElIdGNibHgwWEhSY2RGeDBjbVYwZFhKdUlIUnZVM1J5YVc1bkxtTmhiR3dvZG1Gc0tTQTlQVDBnSjF0dlltcGxZM1FnUW14dllsMG5PMXh1WEhSY2RGeDBmVnh1WEc1Y2RGeDBYSFF2S2lwY2JpQWdJQ0FxSUZSeWFXMGdaWGhqWlhOeklIZG9hWFJsYzNCaFkyVWdiMlptSUhSb1pTQmlaV2RwYm01cGJtY2dZVzVrSUdWdVpDQnZaaUJoSUhOMGNtbHVaMXh1SUNBZ0lDcGNiaUFnSUNBcUlFQndZWEpoYlNCN1UzUnlhVzVuZlNCemRISWdWR2hsSUZOMGNtbHVaeUIwYnlCMGNtbHRYRzRnSUNBZ0tpQkFjbVYwZFhKdWN5QjdVM1J5YVc1bmZTQlVhR1VnVTNSeWFXNW5JR1p5WldWa0lHOW1JR1Y0WTJWemN5QjNhR2wwWlhOd1lXTmxYRzRnSUNBZ0tpOWNibHgwWEhSY2RHWjFibU4wYVc5dUlIUnlhVzBvYzNSeUtTQjdYRzVjZEZ4MFhIUmNkSEpsZEhWeWJpQnpkSEl1Y21Wd2JHRmpaU2d2WGx4Y2N5b3ZMQ0FuSnlrdWNtVndiR0ZqWlNndlhGeHpLaVF2TENBbkp5azdYRzVjZEZ4MFhIUjlYRzVjYmx4MFhIUmNkQzhxS2x4dUlDQWdJQ29nUkdWMFpYSnRhVzVsSUdsbUlIZGxKM0psSUhKMWJtNXBibWNnYVc0Z1lTQnpkR0Z1WkdGeVpDQmljbTkzYzJWeUlHVnVkbWx5YjI1dFpXNTBYRzRnSUNBZ0tseHVJQ0FnSUNvZ1ZHaHBjeUJoYkd4dmQzTWdZWGhwYjNNZ2RHOGdjblZ1SUdsdUlHRWdkMlZpSUhkdmNtdGxjaXdnWVc1a0lISmxZV04wTFc1aGRHbDJaUzVjYmlBZ0lDQXFJRUp2ZEdnZ1pXNTJhWEp2Ym0xbGJuUnpJSE4xY0hCdmNuUWdXRTFNU0hSMGNGSmxjWFZsYzNRc0lHSjFkQ0J1YjNRZ1puVnNiSGtnYzNSaGJtUmhjbVFnWjJ4dlltRnNjeTVjYmlBZ0lDQXFYRzRnSUNBZ0tpQjNaV0lnZDI5eWEyVnljenBjYmlBZ0lDQXFJQ0IwZVhCbGIyWWdkMmx1Wkc5M0lDMCtJSFZ1WkdWbWFXNWxaRnh1SUNBZ0lDb2dJSFI1Y0dWdlppQmtiMk4xYldWdWRDQXRQaUIxYm1SbFptbHVaV1JjYmlBZ0lDQXFYRzRnSUNBZ0tpQnlaV0ZqZEMxdVlYUnBkbVU2WEc0Z0lDQWdLaUFnZEhsd1pXOW1JR1J2WTNWdFpXNTBMbU55WldGMFpVVnNaVzFsYm5RZ0xUNGdkVzVrWldacGJtVmtYRzRnSUNBZ0tpOWNibHgwWEhSY2RHWjFibU4wYVc5dUlHbHpVM1JoYm1SaGNtUkNjbTkzYzJWeVJXNTJLQ2tnZTF4dVhIUmNkRngwWEhSeVpYUjFjbTRnZEhsd1pXOW1JSGRwYm1SdmR5QWhQVDBnSjNWdVpHVm1hVzVsWkNjZ0ppWWdkSGx3Wlc5bUlHUnZZM1Z0Wlc1MElDRTlQU0FuZFc1a1pXWnBibVZrSnlBbUppQjBlWEJsYjJZZ1pHOWpkVzFsYm5RdVkzSmxZWFJsUld4bGJXVnVkQ0E5UFQwZ0oyWjFibU4wYVc5dUp6dGNibHgwWEhSY2RIMWNibHh1WEhSY2RGeDBMeW9xWEc0Z0lDQWdLaUJKZEdWeVlYUmxJRzkyWlhJZ1lXNGdRWEp5WVhrZ2IzSWdZVzRnVDJKcVpXTjBJR2x1ZG05cmFXNW5JR0VnWm5WdVkzUnBiMjRnWm05eUlHVmhZMmdnYVhSbGJTNWNiaUFnSUNBcVhHNGdJQ0FnS2lCSlppQmdiMkpxWUNCcGN5QmhiaUJCY25KaGVTQmpZV3hzWW1GamF5QjNhV3hzSUdKbElHTmhiR3hsWkNCd1lYTnphVzVuWEc0Z0lDQWdLaUIwYUdVZ2RtRnNkV1VzSUdsdVpHVjRMQ0JoYm1RZ1kyOXRjR3hsZEdVZ1lYSnlZWGtnWm05eUlHVmhZMmdnYVhSbGJTNWNiaUFnSUNBcVhHNGdJQ0FnS2lCSlppQW5iMkpxSnlCcGN5QmhiaUJQWW1wbFkzUWdZMkZzYkdKaFkyc2dkMmxzYkNCaVpTQmpZV3hzWldRZ2NHRnpjMmx1WjF4dUlDQWdJQ29nZEdobElIWmhiSFZsTENCclpYa3NJR0Z1WkNCamIyMXdiR1YwWlNCdlltcGxZM1FnWm05eUlHVmhZMmdnY0hKdmNHVnlkSGt1WEc0Z0lDQWdLbHh1SUNBZ0lDb2dRSEJoY21GdElIdFBZbXBsWTNSOFFYSnlZWGw5SUc5aWFpQlVhR1VnYjJKcVpXTjBJSFJ2SUdsMFpYSmhkR1ZjYmlBZ0lDQXFJRUJ3WVhKaGJTQjdSblZ1WTNScGIyNTlJR1p1SUZSb1pTQmpZV3hzWW1GamF5QjBieUJwYm5admEyVWdabTl5SUdWaFkyZ2dhWFJsYlZ4dUlDQWdJQ292WEc1Y2RGeDBYSFJtZFc1amRHbHZiaUJtYjNKRllXTm9LRzlpYWl3Z1ptNHBJSHRjYmx4MFhIUmNkRngwTHk4Z1JHOXVKM1FnWW05MGFHVnlJR2xtSUc1dklIWmhiSFZsSUhCeWIzWnBaR1ZrWEc1Y2RGeDBYSFJjZEdsbUlDaHZZbW9nUFQwOUlHNTFiR3dnZkh3Z2RIbHdaVzltSUc5aWFpQTlQVDBnSjNWdVpHVm1hVzVsWkNjcElIdGNibHgwWEhSY2RGeDBYSFJ5WlhSMWNtNDdYRzVjZEZ4MFhIUmNkSDFjYmx4dVhIUmNkRngwWEhRdkx5QkdiM0pqWlNCaGJpQmhjbkpoZVNCcFppQnViM1FnWVd4eVpXRmtlU0J6YjIxbGRHaHBibWNnYVhSbGNtRmliR1ZjYmx4MFhIUmNkRngwYVdZZ0tDaDBlWEJsYjJZZ2IySnFJRDA5UFNBbmRXNWtaV1pwYm1Wa0p5QS9JQ2QxYm1SbFptbHVaV1FuSURvZ0tEQXNJRjkwZVhCbGIyWXpMbVJsWm1GMWJIUXBLRzlpYWlrcElDRTlQU0FuYjJKcVpXTjBKeUFtSmlBaGFYTkJjbkpoZVNodlltb3BLU0I3WEc1Y2RGeDBYSFJjZEZ4MEx5cGxjMnhwYm5RZ2JtOHRjR0Z5WVcwdGNtVmhjM05wWjI0Nk1Db3ZYRzVjZEZ4MFhIUmNkRngwYjJKcUlEMGdXMjlpYWwwN1hHNWNkRngwWEhSY2RIMWNibHh1WEhSY2RGeDBYSFJwWmlBb2FYTkJjbkpoZVNodlltb3BLU0I3WEc1Y2RGeDBYSFJjZEZ4MEx5OGdTWFJsY21GMFpTQnZkbVZ5SUdGeWNtRjVJSFpoYkhWbGMxeHVYSFJjZEZ4MFhIUmNkR1p2Y2lBb2RtRnlJR2tnUFNBd0xDQnNJRDBnYjJKcUxteGxibWQwYURzZ2FTQThJR3c3SUdrckt5a2dlMXh1WEhSY2RGeDBYSFJjZEZ4MFptNHVZMkZzYkNodWRXeHNMQ0J2WW1wYmFWMHNJR2tzSUc5aWFpazdYRzVjZEZ4MFhIUmNkRngwZlZ4dVhIUmNkRngwWEhSOUlHVnNjMlVnZTF4dVhIUmNkRngwWEhSY2RDOHZJRWwwWlhKaGRHVWdiM1psY2lCdlltcGxZM1FnYTJWNWMxeHVYSFJjZEZ4MFhIUmNkR1p2Y2lBb2RtRnlJR3RsZVNCcGJpQnZZbW9wSUh0Y2JseDBYSFJjZEZ4MFhIUmNkR2xtSUNodlltb3VhR0Z6VDNkdVVISnZjR1Z5ZEhrb2EyVjVLU2tnZTF4dVhIUmNkRngwWEhSY2RGeDBYSFJtYmk1allXeHNLRzUxYkd3c0lHOWlhbHRyWlhsZExDQnJaWGtzSUc5aWFpazdYRzVjZEZ4MFhIUmNkRngwWEhSOVhHNWNkRngwWEhSY2RGeDBmVnh1WEhSY2RGeDBYSFI5WEc1Y2RGeDBYSFI5WEc1Y2JseDBYSFJjZEM4cUtseHVJQ0FnSUNvZ1FXTmpaWEIwY3lCMllYSmhjbWR6SUdWNGNHVmpkR2x1WnlCbFlXTm9JR0Z5WjNWdFpXNTBJSFJ2SUdKbElHRnVJRzlpYW1WamRDd2dkR2hsYmx4dUlDQWdJQ29nYVcxdGRYUmhZbXg1SUcxbGNtZGxjeUIwYUdVZ2NISnZjR1Z5ZEdsbGN5QnZaaUJsWVdOb0lHOWlhbVZqZENCaGJtUWdjbVYwZFhKdWN5QnlaWE4xYkhRdVhHNGdJQ0FnS2x4dUlDQWdJQ29nVjJobGJpQnRkV3gwYVhCc1pTQnZZbXBsWTNSeklHTnZiblJoYVc0Z2RHaGxJSE5oYldVZ2EyVjVJSFJvWlNCc1lYUmxjaUJ2WW1wbFkzUWdhVzVjYmlBZ0lDQXFJSFJvWlNCaGNtZDFiV1Z1ZEhNZ2JHbHpkQ0IzYVd4c0lIUmhhMlVnY0hKbFkyVmtaVzVqWlM1Y2JpQWdJQ0FxWEc0Z0lDQWdLaUJGZUdGdGNHeGxPbHh1SUNBZ0lDcGNiaUFnSUNBcUlHQmdZR3B6WEc0Z0lDQWdLaUIyWVhJZ2NtVnpkV3gwSUQwZ2JXVnlaMlVvZTJadmJ6b2dNVEl6ZlN3Z2UyWnZiem9nTkRVMmZTazdYRzRnSUNBZ0tpQmpiMjV6YjJ4bExteHZaeWh5WlhOMWJIUXVabTl2S1RzZ0x5OGdiM1YwY0hWMGN5QTBOVFpjYmlBZ0lDQXFJR0JnWUZ4dUlDQWdJQ3BjYmlBZ0lDQXFJRUJ3WVhKaGJTQjdUMkpxWldOMGZTQnZZbW94SUU5aWFtVmpkQ0IwYnlCdFpYSm5aVnh1SUNBZ0lDb2dRSEpsZEhWeWJuTWdlMDlpYW1WamRIMGdVbVZ6ZFd4MElHOW1JR0ZzYkNCdFpYSm5aU0J3Y205d1pYSjBhV1Z6WEc0Z0lDQWdLaTljYmx4MFhIUmNkR1oxYm1OMGFXOXVJRzFsY21kbEtDa2dMeW9nYjJKcU1Td2diMkpxTWl3Z2IySnFNeXdnTGk0dUlDb3ZlMXh1WEhSY2RGeDBYSFIyWVhJZ2NtVnpkV3gwSUQwZ2UzMDdYRzVjZEZ4MFhIUmNkR1oxYm1OMGFXOXVJR0Z6YzJsbmJsWmhiSFZsS0haaGJDd2dhMlY1S1NCN1hHNWNkRngwWEhSY2RGeDBhV1lnS0Nnd0xDQmZkSGx3Wlc5bU15NWtaV1poZFd4MEtTaHlaWE4xYkhSYmEyVjVYU2tnUFQwOUlDZHZZbXBsWTNRbklDWW1JQ2gwZVhCbGIyWWdkbUZzSUQwOVBTQW5kVzVrWldacGJtVmtKeUEvSUNkMWJtUmxabWx1WldRbklEb2dLREFzSUY5MGVYQmxiMll6TG1SbFptRjFiSFFwS0haaGJDa3BJRDA5UFNBbmIySnFaV04wSnlrZ2UxeHVYSFJjZEZ4MFhIUmNkRngwY21WemRXeDBXMnRsZVYwZ1BTQnRaWEpuWlNoeVpYTjFiSFJiYTJWNVhTd2dkbUZzS1R0Y2JseDBYSFJjZEZ4MFhIUjlJR1ZzYzJVZ2UxeHVYSFJjZEZ4MFhIUmNkRngwY21WemRXeDBXMnRsZVYwZ1BTQjJZV3c3WEc1Y2RGeDBYSFJjZEZ4MGZWeHVYSFJjZEZ4MFhIUjlYRzVjYmx4MFhIUmNkRngwWm05eUlDaDJZWElnYVNBOUlEQXNJR3dnUFNCaGNtZDFiV1Z1ZEhNdWJHVnVaM1JvT3lCcElEd2diRHNnYVNzcktTQjdYRzVjZEZ4MFhIUmNkRngwWm05eVJXRmphQ2hoY21kMWJXVnVkSE5iYVYwc0lHRnpjMmxuYmxaaGJIVmxLVHRjYmx4MFhIUmNkRngwZlZ4dVhIUmNkRngwWEhSeVpYUjFjbTRnY21WemRXeDBPMXh1WEhSY2RGeDBmVnh1WEc1Y2RGeDBYSFJ0YjJSMWJHVXVaWGh3YjNKMGN5QTlJSHRjYmx4MFhIUmNkRngwYVhOQmNuSmhlVG9nYVhOQmNuSmhlU3hjYmx4MFhIUmNkRngwYVhOQmNuSmhlVUoxWm1abGNqb2dhWE5CY25KaGVVSjFabVpsY2l4Y2JseDBYSFJjZEZ4MGFYTkdiM0p0UkdGMFlUb2dhWE5HYjNKdFJHRjBZU3hjYmx4MFhIUmNkRngwYVhOQmNuSmhlVUoxWm1abGNsWnBaWGM2SUdselFYSnlZWGxDZFdabVpYSldhV1YzTEZ4dVhIUmNkRngwWEhScGMxTjBjbWx1WnpvZ2FYTlRkSEpwYm1jc1hHNWNkRngwWEhSY2RHbHpUblZ0WW1WeU9pQnBjMDUxYldKbGNpeGNibHgwWEhSY2RGeDBhWE5QWW1wbFkzUTZJR2x6VDJKcVpXTjBMRnh1WEhSY2RGeDBYSFJwYzFWdVpHVm1hVzVsWkRvZ2FYTlZibVJsWm1sdVpXUXNYRzVjZEZ4MFhIUmNkR2x6UkdGMFpUb2dhWE5FWVhSbExGeHVYSFJjZEZ4MFhIUnBjMFpwYkdVNklHbHpSbWxzWlN4Y2JseDBYSFJjZEZ4MGFYTkNiRzlpT2lCcGMwSnNiMklzWEc1Y2RGeDBYSFJjZEdselUzUmhibVJoY21SQ2NtOTNjMlZ5Ulc1Mk9pQnBjMU4wWVc1a1lYSmtRbkp2ZDNObGNrVnVkaXhjYmx4MFhIUmNkRngwWm05eVJXRmphRG9nWm05eVJXRmphQ3hjYmx4MFhIUmNkRngwYldWeVoyVTZJRzFsY21kbExGeHVYSFJjZEZ4MFhIUjBjbWx0T2lCMGNtbHRYRzVjZEZ4MFhIUjlPMXh1WEc1Y2RGeDBYSFF2S2lvcUwxeHVYSFJjZEgwc1hHNWNkRngwTHlvZ05DQXFMMXh1WEhSY2RDOHFLaW92Wm5WdVkzUnBiMjRnS0cxdlpIVnNaU3dnWlhod2IzSjBjeXdnWDE5M1pXSndZV05yWDNKbGNYVnBjbVZmWHlrZ2UxeHVYRzVjZEZ4MFhIUW5kWE5sSUhOMGNtbGpkQ2M3WEc1Y2JseDBYSFJjZEM4cUtseHVJQ0FnSUNvZ1JHbHpjR0YwWTJnZ1lTQnlaWEYxWlhOMElIUnZJSFJvWlNCelpYSjJaWElnZFhOcGJtY2dkMmhwWTJobGRtVnlJR0ZrWVhCMFpYSmNiaUFnSUNBcUlHbHpJSE4xY0hCdmNuUmxaQ0JpZVNCMGFHVWdZM1Z5Y21WdWRDQmxiblpwY205dWJXVnVkQzVjYmlBZ0lDQXFYRzRnSUNBZ0tpQkFjR0Z5WVcwZ2UyOWlhbVZqZEgwZ1kyOXVabWxuSUZSb1pTQmpiMjVtYVdjZ2RHaGhkQ0JwY3lCMGJ5QmlaU0IxYzJWa0lHWnZjaUIwYUdVZ2NtVnhkV1Z6ZEZ4dUlDQWdJQ29nUUhKbGRIVnlibk1nZTFCeWIyMXBjMlY5SUZSb1pTQlFjbTl0YVhObElIUnZJR0psSUdaMWJHWnBiR3hsWkZ4dUlDQWdJQ292WEc1Y2JseDBYSFJjZEcxdlpIVnNaUzVsZUhCdmNuUnpJRDBnWm5WdVkzUnBiMjRnWkdsemNHRjBZMmhTWlhGMVpYTjBLR052Ym1acFp5a2dlMXh1WEhSY2RGeDBYSFJ5WlhSMWNtNGdibVYzSUY5d2NtOXRhWE5sTWk1a1pXWmhkV3gwS0daMWJtTjBhVzl1SUdWNFpXTjFkRzl5S0hKbGMyOXNkbVVzSUhKbGFtVmpkQ2tnZTF4dVhIUmNkRngwWEhSY2RIUnllU0I3WEc1Y2RGeDBYSFJjZEZ4MFhIUjJZWElnWVdSaGNIUmxjanRjYmx4dVhIUmNkRngwWEhSY2RGeDBhV1lnS0hSNWNHVnZaaUJqYjI1bWFXY3VZV1JoY0hSbGNpQTlQVDBnSjJaMWJtTjBhVzl1SnlrZ2UxeHVYSFJjZEZ4MFhIUmNkRngwWEhRdkx5QkdiM0lnWTNWemRHOXRJR0ZrWVhCMFpYSWdjM1Z3Y0c5eWRGeHVYSFJjZEZ4MFhIUmNkRngwWEhSaFpHRndkR1Z5SUQwZ1kyOXVabWxuTG1Ga1lYQjBaWEk3WEc1Y2RGeDBYSFJjZEZ4MFhIUjlJR1ZzYzJVZ2FXWWdLSFI1Y0dWdlppQllUVXhJZEhSd1VtVnhkV1Z6ZENBaFBUMGdKM1Z1WkdWbWFXNWxaQ2NwSUh0Y2JseDBYSFJjZEZ4MFhIUmNkRngwTHk4Z1JtOXlJR0p5YjNkelpYSnpJSFZ6WlNCWVNGSWdZV1JoY0hSbGNseHVYSFJjZEZ4MFhIUmNkRngwWEhSaFpHRndkR1Z5SUQwZ1gxOTNaV0p3WVdOclgzSmxjWFZwY21WZlh5ZzFLVHRjYmx4MFhIUmNkRngwWEhSY2RIMGdaV3h6WlNCcFppQW9kSGx3Wlc5bUlIQnliMk5sYzNNZ0lUMDlJQ2QxYm1SbFptbHVaV1FuS1NCN1hHNWNkRngwWEhSY2RGeDBYSFJjZEM4dklFWnZjaUJ1YjJSbElIVnpaU0JJVkZSUUlHRmtZWEIwWlhKY2JseDBYSFJjZEZ4MFhIUmNkRngwWVdSaGNIUmxjaUE5SUY5ZmQyVmljR0ZqYTE5eVpYRjFhWEpsWDE4b05TazdYRzVjZEZ4MFhIUmNkRngwWEhSOVhHNWNibHgwWEhSY2RGeDBYSFJjZEdsbUlDaDBlWEJsYjJZZ1lXUmhjSFJsY2lBOVBUMGdKMloxYm1OMGFXOXVKeWtnZTF4dVhIUmNkRngwWEhSY2RGeDBYSFJoWkdGd2RHVnlLSEpsYzI5c2RtVXNJSEpsYW1WamRDd2dZMjl1Wm1sbktUdGNibHgwWEhSY2RGeDBYSFJjZEgxY2JseDBYSFJjZEZ4MFhIUjlJR05oZEdOb0lDaGxLU0I3WEc1Y2RGeDBYSFJjZEZ4MFhIUnlaV3BsWTNRb1pTazdYRzVjZEZ4MFhIUmNkRngwZlZ4dVhIUmNkRngwWEhSOUtUdGNibHgwWEhSY2RIMDdYRzVjYmx4MFhIUmNkQzhxS2lvdlhHNWNkRngwZlN4Y2JseDBYSFF2S2lBMUlDb3ZYRzVjZEZ4MEx5b3FLaTltZFc1amRHbHZiaUFvYlc5a2RXeGxMQ0JsZUhCdmNuUnpMQ0JmWDNkbFluQmhZMnRmY21WeGRXbHlaVjlmS1NCN1hHNWNibHgwWEhSY2RDZDFjMlVnYzNSeWFXTjBKenRjYmx4dVhIUmNkRngwZG1GeUlIVjBhV3h6SUQwZ1gxOTNaV0p3WVdOclgzSmxjWFZwY21WZlh5Z3pLVHRjYmx4MFhIUmNkSFpoY2lCaWRXbHNaRlZTVENBOUlGOWZkMlZpY0dGamExOXlaWEYxYVhKbFgxOG9OaWs3WEc1Y2RGeDBYSFIyWVhJZ2NHRnljMlZJWldGa1pYSnpJRDBnWDE5M1pXSndZV05yWDNKbGNYVnBjbVZmWHlnM0tUdGNibHgwWEhSY2RIWmhjaUIwY21GdWMyWnZjbTFFWVhSaElEMGdYMTkzWldKd1lXTnJYM0psY1hWcGNtVmZYeWc0S1R0Y2JseDBYSFJjZEhaaGNpQnBjMVZTVEZOaGJXVlBjbWxuYVc0Z1BTQmZYM2RsWW5CaFkydGZjbVZ4ZFdseVpWOWZLRGtwTzF4dVhIUmNkRngwZG1GeUlHSjBiMkVnUFNCM2FXNWtiM2N1WW5SdllTQjhmQ0JmWDNkbFluQmhZMnRmY21WeGRXbHlaVjlmS0RFd0tUdGNibHh1WEhSY2RGeDBiVzlrZFd4bExtVjRjRzl5ZEhNZ1BTQm1kVzVqZEdsdmJpQjRhSEpCWkdGd2RHVnlLSEpsYzI5c2RtVXNJSEpsYW1WamRDd2dZMjl1Wm1sbktTQjdYRzVjZEZ4MFhIUmNkSFpoY2lCeVpYRjFaWE4wUkdGMFlTQTlJR052Ym1acFp5NWtZWFJoTzF4dVhIUmNkRngwWEhSMllYSWdjbVZ4ZFdWemRFaGxZV1JsY25NZ1BTQmpiMjVtYVdjdWFHVmhaR1Z5Y3p0Y2JseHVYSFJjZEZ4MFhIUnBaaUFvZFhScGJITXVhWE5HYjNKdFJHRjBZU2h5WlhGMVpYTjBSR0YwWVNrcElIdGNibHgwWEhSY2RGeDBYSFJrWld4bGRHVWdjbVZ4ZFdWemRFaGxZV1JsY25OYkowTnZiblJsYm5RdFZIbHdaU2RkT3lBdkx5Qk1aWFFnZEdobElHSnliM2R6WlhJZ2MyVjBJR2wwWEc1Y2RGeDBYSFJjZEgxY2JseHVYSFJjZEZ4MFhIUjJZWElnY21WeGRXVnpkQ0E5SUc1bGR5QllUVXhJZEhSd1VtVnhkV1Z6ZENncE8xeHVYRzVjZEZ4MFhIUmNkQzh2SUVadmNpQkpSU0E0THprZ1EwOVNVeUJ6ZFhCd2IzSjBYRzVjZEZ4MFhIUmNkQzh2SUU5dWJIa2djM1Z3Y0c5eWRITWdVRTlUVkNCaGJtUWdSMFZVSUdOaGJHeHpJR0Z1WkNCa2IyVnpiaWQwSUhKbGRIVnlibk1nZEdobElISmxjM0J2Ym5ObElHaGxZV1JsY25NdVhHNWNkRngwWEhSY2RHbG1JQ2gzYVc1a2IzY3VXRVJ2YldGcGJsSmxjWFZsYzNRZ0ppWWdJU2duZDJsMGFFTnlaV1JsYm5ScFlXeHpKeUJwYmlCeVpYRjFaWE4wS1NBbUppQWhhWE5WVWt4VFlXMWxUM0pwWjJsdUtHTnZibVpwWnk1MWNtd3BLU0I3WEc1Y2RGeDBYSFJjZEZ4MGNtVnhkV1Z6ZENBOUlHNWxkeUIzYVc1a2IzY3VXRVJ2YldGcGJsSmxjWFZsYzNRb0tUdGNibHgwWEhSY2RGeDBmVnh1WEc1Y2RGeDBYSFJjZEM4dklFaFVWRkFnWW1GemFXTWdZWFYwYUdWdWRHbGpZWFJwYjI1Y2JseDBYSFJjZEZ4MGFXWWdLR052Ym1acFp5NWhkWFJvS1NCN1hHNWNkRngwWEhSY2RGeDBkbUZ5SUhWelpYSnVZVzFsSUQwZ1kyOXVabWxuTG1GMWRHZ3VkWE5sY201aGJXVWdmSHdnSnljN1hHNWNkRngwWEhSY2RGeDBkbUZ5SUhCaGMzTjNiM0prSUQwZ1kyOXVabWxuTG1GMWRHZ3VjR0Z6YzNkdmNtUWdmSHdnSnljN1hHNWNkRngwWEhSY2RGeDBjbVZ4ZFdWemRFaGxZV1JsY25NdVFYVjBhRzl5YVhwaGRHbHZiaUE5SUNkQ1lYTnBZeUFuSUNzZ1luUnZZU2gxYzJWeWJtRnRaU0FySUNjNkp5QXJJSEJoYzNOM2IzSmtLVHRjYmx4MFhIUmNkRngwZlZ4dVhHNWNkRngwWEhSY2RISmxjWFZsYzNRdWIzQmxiaWhqYjI1bWFXY3ViV1YwYUc5a0xuUnZWWEJ3WlhKRFlYTmxLQ2tzSUdKMWFXeGtWVkpNS0dOdmJtWnBaeTUxY213c0lHTnZibVpwWnk1d1lYSmhiWE1zSUdOdmJtWnBaeTV3WVhKaGJYTlRaWEpwWVd4cGVtVnlLU3dnZEhKMVpTazdYRzVjYmx4MFhIUmNkRngwTHk4Z1UyVjBJSFJvWlNCeVpYRjFaWE4wSUhScGJXVnZkWFFnYVc0Z1RWTmNibHgwWEhSY2RGeDBjbVZ4ZFdWemRDNTBhVzFsYjNWMElEMGdZMjl1Wm1sbkxuUnBiV1Z2ZFhRN1hHNWNibHgwWEhSY2RGeDBMeThnVEdsemRHVnVJR1p2Y2lCeVpXRmtlU0J6ZEdGMFpWeHVYSFJjZEZ4MFhIUnlaWEYxWlhOMExtOXViRzloWkNBOUlHWjFibU4wYVc5dUlHaGhibVJzWlV4dllXUW9LU0I3WEc1Y2RGeDBYSFJjZEZ4MGFXWWdLQ0Z5WlhGMVpYTjBLU0I3WEc1Y2RGeDBYSFJjZEZ4MFhIUnlaWFIxY200N1hHNWNkRngwWEhSY2RGeDBmVnh1WEhSY2RGeDBYSFJjZEM4dklGQnlaWEJoY21VZ2RHaGxJSEpsYzNCdmJuTmxYRzVjZEZ4MFhIUmNkRngwZG1GeUlISmxjM0J2Ym5ObFNHVmhaR1Z5Y3lBOUlDZG5aWFJCYkd4U1pYTndiMjV6WlVobFlXUmxjbk1uSUdsdUlISmxjWFZsYzNRZ1B5QndZWEp6WlVobFlXUmxjbk1vY21WeGRXVnpkQzVuWlhSQmJHeFNaWE53YjI1elpVaGxZV1JsY25Nb0tTa2dPaUJ1ZFd4c08xeHVYSFJjZEZ4MFhIUmNkSFpoY2lCeVpYTndiMjV6WlVSaGRHRWdQU0JiSjNSbGVIUW5MQ0FuSjEwdWFXNWtaWGhQWmloamIyNW1hV2N1Y21WemNHOXVjMlZVZVhCbElIeDhJQ2NuS1NBaFBUMGdMVEVnUHlCeVpYRjFaWE4wTG5KbGMzQnZibk5sVkdWNGRDQTZJSEpsY1hWbGMzUXVjbVZ6Y0c5dWMyVTdYRzVjZEZ4MFhIUmNkRngwZG1GeUlISmxjM0J2Ym5ObElEMGdlMXh1WEhSY2RGeDBYSFJjZEZ4MFpHRjBZVG9nZEhKaGJuTm1iM0p0UkdGMFlTaHlaWE53YjI1elpVUmhkR0VzSUhKbGMzQnZibk5sU0dWaFpHVnljeXdnWTI5dVptbG5MblJ5WVc1elptOXliVkpsYzNCdmJuTmxLU3hjYmx4MFhIUmNkRngwWEhSY2RDOHZJRWxGSUhObGJtUnpJREV5TWpNZ2FXNXpkR1ZoWkNCdlppQXlNRFFnS0doMGRIQnpPaTh2WjJsMGFIVmlMbU52YlM5dGVtRmljbWx6YTJsbEwyRjRhVzl6TDJsemMzVmxjeTh5TURFcFhHNWNkRngwWEhSY2RGeDBYSFJ6ZEdGMGRYTTZJSEpsY1hWbGMzUXVjM1JoZEhWeklEMDlQU0F4TWpJeklEOGdNakEwSURvZ2NtVnhkV1Z6ZEM1emRHRjBkWE1zWEc1Y2RGeDBYSFJjZEZ4MFhIUnpkR0YwZFhOVVpYaDBPaUJ5WlhGMVpYTjBMbk4wWVhSMWN5QTlQVDBnTVRJeU15QS9JQ2RPYnlCRGIyNTBaVzUwSnlBNklISmxjWFZsYzNRdWMzUmhkSFZ6VkdWNGRDeGNibHgwWEhSY2RGeDBYSFJjZEdobFlXUmxjbk02SUhKbGMzQnZibk5sU0dWaFpHVnljeXhjYmx4MFhIUmNkRngwWEhSY2RHTnZibVpwWnpvZ1kyOXVabWxuWEc1Y2RGeDBYSFJjZEZ4MGZUdGNibHh1WEhSY2RGeDBYSFJjZEM4dklGSmxjMjlzZG1VZ2IzSWdjbVZxWldOMElIUm9aU0JRY205dGFYTmxJR0poYzJWa0lHOXVJSFJvWlNCemRHRjBkWE5jYmx4MFhIUmNkRngwWEhRb2NtVnpjRzl1YzJVdWMzUmhkSFZ6SUQ0OUlESXdNQ0FtSmlCeVpYTndiMjV6WlM1emRHRjBkWE1nUENBek1EQWdmSHdnSVNnbmMzUmhkSFZ6SnlCcGJpQnlaWEYxWlhOMEtTQW1KaUJ5WlhOd2IyNXpaUzV5WlhOd2IyNXpaVlJsZUhRZ1B5QnlaWE52YkhabElEb2djbVZxWldOMEtTaHlaWE53YjI1elpTazdYRzVjYmx4MFhIUmNkRngwWEhRdkx5QkRiR1ZoYmlCMWNDQnlaWEYxWlhOMFhHNWNkRngwWEhSY2RGeDBjbVZ4ZFdWemRDQTlJRzUxYkd3N1hHNWNkRngwWEhSY2RIMDdYRzVjYmx4MFhIUmNkRngwTHk4Z1NHRnVaR3hsSUd4dmR5QnNaWFpsYkNCdVpYUjNiM0pySUdWeWNtOXljMXh1WEhSY2RGeDBYSFJ5WlhGMVpYTjBMbTl1WlhKeWIzSWdQU0JtZFc1amRHbHZiaUJvWVc1a2JHVkZjbkp2Y2lncElIdGNibHgwWEhSY2RGeDBYSFF2THlCU1pXRnNJR1Z5Y205eWN5QmhjbVVnYUdsa1pHVnVJR1p5YjIwZ2RYTWdZbmtnZEdobElHSnliM2R6WlhKY2JseDBYSFJjZEZ4MFhIUXZMeUJ2Ym1WeWNtOXlJSE5vYjNWc1pDQnZibXg1SUdacGNtVWdhV1lnYVhRbmN5QmhJRzVsZEhkdmNtc2daWEp5YjNKY2JseDBYSFJjZEZ4MFhIUnlaV3BsWTNRb2JtVjNJRVZ5Y205eUtDZE9aWFIzYjNKcklFVnljbTl5SnlrcE8xeHVYRzVjZEZ4MFhIUmNkRngwTHk4Z1EyeGxZVzRnZFhBZ2NtVnhkV1Z6ZEZ4dVhIUmNkRngwWEhSY2RISmxjWFZsYzNRZ1BTQnVkV3hzTzF4dVhIUmNkRngwWEhSOU8xeHVYRzVjZEZ4MFhIUmNkQzh2SUVGa1pDQjRjM0ptSUdobFlXUmxjbHh1WEhSY2RGeDBYSFF2THlCVWFHbHpJR2x6SUc5dWJIa2daRzl1WlNCcFppQnlkVzV1YVc1bklHbHVJR0VnYzNSaGJtUmhjbVFnWW5KdmQzTmxjaUJsYm5acGNtOXViV1Z1ZEM1Y2JseDBYSFJjZEZ4MEx5OGdVM0JsWTJsbWFXTmhiR3g1SUc1dmRDQnBaaUIzWlNkeVpTQnBiaUJoSUhkbFlpQjNiM0pyWlhJc0lHOXlJSEpsWVdOMExXNWhkR2wyWlM1Y2JseDBYSFJjZEZ4MGFXWWdLSFYwYVd4ekxtbHpVM1JoYm1SaGNtUkNjbTkzYzJWeVJXNTJLQ2twSUh0Y2JseDBYSFJjZEZ4MFhIUjJZWElnWTI5dmEybGxjeUE5SUY5ZmQyVmljR0ZqYTE5eVpYRjFhWEpsWDE4b01URXBPMXh1WEc1Y2RGeDBYSFJjZEZ4MEx5OGdRV1JrSUhoemNtWWdhR1ZoWkdWeVhHNWNkRngwWEhSY2RGeDBkbUZ5SUhoemNtWldZV3gxWlNBOUlHTnZibVpwWnk1M2FYUm9RM0psWkdWdWRHbGhiSE1nZkh3Z2FYTlZVa3hUWVcxbFQzSnBaMmx1S0dOdmJtWnBaeTUxY213cElEOGdZMjl2YTJsbGN5NXlaV0ZrS0dOdmJtWnBaeTU0YzNKbVEyOXZhMmxsVG1GdFpTa2dPaUIxYm1SbFptbHVaV1E3WEc1Y2JseDBYSFJjZEZ4MFhIUnBaaUFvZUhOeVpsWmhiSFZsS1NCN1hHNWNkRngwWEhSY2RGeDBYSFJ5WlhGMVpYTjBTR1ZoWkdWeWMxdGpiMjVtYVdjdWVITnlaa2hsWVdSbGNrNWhiV1ZkSUQwZ2VITnlabFpoYkhWbE8xeHVYSFJjZEZ4MFhIUmNkSDFjYmx4MFhIUmNkRngwZlZ4dVhHNWNkRngwWEhSY2RDOHZJRUZrWkNCb1pXRmtaWEp6SUhSdklIUm9aU0J5WlhGMVpYTjBYRzVjZEZ4MFhIUmNkR2xtSUNnbmMyVjBVbVZ4ZFdWemRFaGxZV1JsY2ljZ2FXNGdjbVZ4ZFdWemRDa2dlMXh1WEhSY2RGeDBYSFJjZEhWMGFXeHpMbVp2Y2tWaFkyZ29jbVZ4ZFdWemRFaGxZV1JsY25Nc0lHWjFibU4wYVc5dUlITmxkRkpsY1hWbGMzUklaV0ZrWlhJb2RtRnNMQ0JyWlhrcElIdGNibHgwWEhSY2RGeDBYSFJjZEdsbUlDaDBlWEJsYjJZZ2NtVnhkV1Z6ZEVSaGRHRWdQVDA5SUNkMWJtUmxabWx1WldRbklDWW1JR3RsZVM1MGIweHZkMlZ5UTJGelpTZ3BJRDA5UFNBblkyOXVkR1Z1ZEMxMGVYQmxKeWtnZTF4dVhIUmNkRngwWEhSY2RGeDBYSFF2THlCU1pXMXZkbVVnUTI5dWRHVnVkQzFVZVhCbElHbG1JR1JoZEdFZ2FYTWdkVzVrWldacGJtVmtYRzVjZEZ4MFhIUmNkRngwWEhSY2RHUmxiR1YwWlNCeVpYRjFaWE4wU0dWaFpHVnljMXRyWlhsZE8xeHVYSFJjZEZ4MFhIUmNkRngwZlNCbGJITmxJSHRjYmx4MFhIUmNkRngwWEhSY2RGeDBMeThnVDNSb1pYSjNhWE5sSUdGa1pDQm9aV0ZrWlhJZ2RHOGdkR2hsSUhKbGNYVmxjM1JjYmx4MFhIUmNkRngwWEhSY2RGeDBjbVZ4ZFdWemRDNXpaWFJTWlhGMVpYTjBTR1ZoWkdWeUtHdGxlU3dnZG1Gc0tUdGNibHgwWEhSY2RGeDBYSFJjZEgxY2JseDBYSFJjZEZ4MFhIUjlLVHRjYmx4MFhIUmNkRngwZlZ4dVhHNWNkRngwWEhSY2RDOHZJRUZrWkNCM2FYUm9RM0psWkdWdWRHbGhiSE1nZEc4Z2NtVnhkV1Z6ZENCcFppQnVaV1ZrWldSY2JseDBYSFJjZEZ4MGFXWWdLR052Ym1acFp5NTNhWFJvUTNKbFpHVnVkR2xoYkhNcElIdGNibHgwWEhSY2RGeDBYSFJ5WlhGMVpYTjBMbmRwZEdoRGNtVmtaVzUwYVdGc2N5QTlJSFJ5ZFdVN1hHNWNkRngwWEhSY2RIMWNibHh1WEhSY2RGeDBYSFF2THlCQlpHUWdjbVZ6Y0c5dWMyVlVlWEJsSUhSdklISmxjWFZsYzNRZ2FXWWdibVZsWkdWa1hHNWNkRngwWEhSY2RHbG1JQ2hqYjI1bWFXY3VjbVZ6Y0c5dWMyVlVlWEJsS1NCN1hHNWNkRngwWEhSY2RGeDBkSEo1SUh0Y2JseDBYSFJjZEZ4MFhIUmNkSEpsY1hWbGMzUXVjbVZ6Y0c5dWMyVlVlWEJsSUQwZ1kyOXVabWxuTG5KbGMzQnZibk5sVkhsd1pUdGNibHgwWEhSY2RGeDBYSFI5SUdOaGRHTm9JQ2hsS1NCN1hHNWNkRngwWEhSY2RGeDBYSFJwWmlBb2NtVnhkV1Z6ZEM1eVpYTndiMjV6WlZSNWNHVWdJVDA5SUNkcWMyOXVKeWtnZTF4dVhIUmNkRngwWEhSY2RGeDBYSFIwYUhKdmR5QmxPMXh1WEhSY2RGeDBYSFJjZEZ4MGZWeHVYSFJjZEZ4MFhIUmNkSDFjYmx4MFhIUmNkRngwZlZ4dVhHNWNkRngwWEhSY2RHbG1JQ2gxZEdsc2N5NXBjMEZ5Y21GNVFuVm1abVZ5S0hKbGNYVmxjM1JFWVhSaEtTa2dlMXh1WEhSY2RGeDBYSFJjZEhKbGNYVmxjM1JFWVhSaElEMGdibVYzSUVSaGRHRldhV1YzS0hKbGNYVmxjM1JFWVhSaEtUdGNibHgwWEhSY2RGeDBmVnh1WEc1Y2RGeDBYSFJjZEM4dklGTmxibVFnZEdobElISmxjWFZsYzNSY2JseDBYSFJjZEZ4MGNtVnhkV1Z6ZEM1elpXNWtLSEpsY1hWbGMzUkVZWFJoS1R0Y2JseDBYSFJjZEgwN1hHNWNibHgwWEhSY2RDOHFLaW92WEc1Y2RGeDBmU3hjYmx4MFhIUXZLaUEySUNvdlhHNWNkRngwTHlvcUtpOW1kVzVqZEdsdmJpQW9iVzlrZFd4bExDQmxlSEJ2Y25SekxDQmZYM2RsWW5CaFkydGZjbVZ4ZFdseVpWOWZLU0I3WEc1Y2JseDBYSFJjZENkMWMyVWdjM1J5YVdOMEp6dGNibHh1WEhSY2RGeDBkbUZ5SUhWMGFXeHpJRDBnWDE5M1pXSndZV05yWDNKbGNYVnBjbVZmWHlnektUdGNibHh1WEhSY2RGeDBablZ1WTNScGIyNGdaVzVqYjJSbEtIWmhiQ2tnZTF4dVhIUmNkRngwWEhSeVpYUjFjbTRnWlc1amIyUmxWVkpKUTI5dGNHOXVaVzUwS0haaGJDa3VjbVZ3YkdGalpTZ3ZKVFF3TDJkcExDQW5RQ2NwTG5KbGNHeGhZMlVvTHlVelFTOW5hU3dnSnpvbktTNXlaWEJzWVdObEtDOGxNalF2Wnl3Z0p5UW5LUzV5WlhCc1lXTmxLQzhsTWtNdloya3NJQ2NzSnlrdWNtVndiR0ZqWlNndkpUSXdMMmNzSUNjckp5a3VjbVZ3YkdGalpTZ3ZKVFZDTDJkcExDQW5XeWNwTG5KbGNHeGhZMlVvTHlVMVJDOW5hU3dnSjEwbktUdGNibHgwWEhSY2RIMWNibHh1WEhSY2RGeDBMeW9xWEc0Z0lDQWdLaUJDZFdsc1pDQmhJRlZTVENCaWVTQmhjSEJsYm1ScGJtY2djR0Z5WVcxeklIUnZJSFJvWlNCbGJtUmNiaUFnSUNBcVhHNGdJQ0FnS2lCQWNHRnlZVzBnZTNOMGNtbHVaMzBnZFhKc0lGUm9aU0JpWVhObElHOW1JSFJvWlNCMWNtd2dLR1V1Wnk0c0lHaDBkSEE2THk5M2QzY3VaMjl2WjJ4bExtTnZiU2xjYmlBZ0lDQXFJRUJ3WVhKaGJTQjdiMkpxWldOMGZTQmJjR0Z5WVcxelhTQlVhR1VnY0dGeVlXMXpJSFJ2SUdKbElHRndjR1Z1WkdWa1hHNGdJQ0FnS2lCQWNtVjBkWEp1Y3lCN2MzUnlhVzVuZlNCVWFHVWdabTl5YldGMGRHVmtJSFZ5YkZ4dUlDQWdJQ292WEc1Y2RGeDBYSFJ0YjJSMWJHVXVaWGh3YjNKMGN5QTlJR1oxYm1OMGFXOXVJR0oxYVd4a1ZWSk1LSFZ5YkN3Z2NHRnlZVzF6TENCd1lYSmhiWE5UWlhKcFlXeHBlbVZ5S1NCN1hHNWNkRngwWEhSY2RDOHFaWE5zYVc1MElHNXZMWEJoY21GdExYSmxZWE56YVdkdU9qQXFMMXh1WEhSY2RGeDBYSFJwWmlBb0lYQmhjbUZ0Y3lrZ2UxeHVYSFJjZEZ4MFhIUmNkSEpsZEhWeWJpQjFjbXc3WEc1Y2RGeDBYSFJjZEgxY2JseHVYSFJjZEZ4MFhIUjJZWElnYzJWeWFXRnNhWHBsWkZCaGNtRnRjenRjYmx4MFhIUmNkRngwYVdZZ0tIQmhjbUZ0YzFObGNtbGhiR2w2WlhJcElIdGNibHgwWEhSY2RGeDBYSFJ6WlhKcFlXeHBlbVZrVUdGeVlXMXpJRDBnY0dGeVlXMXpVMlZ5YVdGc2FYcGxjaWh3WVhKaGJYTXBPMXh1WEhSY2RGeDBYSFI5SUdWc2MyVWdlMXh1WEhSY2RGeDBYSFJjZEhaaGNpQndZWEowY3lBOUlGdGRPMXh1WEc1Y2RGeDBYSFJjZEZ4MGRYUnBiSE11Wm05eVJXRmphQ2h3WVhKaGJYTXNJR1oxYm1OMGFXOXVJSE5sY21saGJHbDZaU2gyWVd3c0lHdGxlU2tnZTF4dVhIUmNkRngwWEhSY2RGeDBhV1lnS0haaGJDQTlQVDBnYm5Wc2JDQjhmQ0IwZVhCbGIyWWdkbUZzSUQwOVBTQW5kVzVrWldacGJtVmtKeWtnZTF4dVhIUmNkRngwWEhSY2RGeDBYSFJ5WlhSMWNtNDdYRzVjZEZ4MFhIUmNkRngwWEhSOVhHNWNibHgwWEhSY2RGeDBYSFJjZEdsbUlDaDFkR2xzY3k1cGMwRnljbUY1S0haaGJDa3BJSHRjYmx4MFhIUmNkRngwWEhSY2RGeDBhMlY1SUQwZ2EyVjVJQ3NnSjF0ZEp6dGNibHgwWEhSY2RGeDBYSFJjZEgxY2JseHVYSFJjZEZ4MFhIUmNkRngwYVdZZ0tDRjFkR2xzY3k1cGMwRnljbUY1S0haaGJDa3BJSHRjYmx4MFhIUmNkRngwWEhSY2RGeDBkbUZzSUQwZ1czWmhiRjA3WEc1Y2RGeDBYSFJjZEZ4MFhIUjlYRzVjYmx4MFhIUmNkRngwWEhSY2RIVjBhV3h6TG1admNrVmhZMmdvZG1Gc0xDQm1kVzVqZEdsdmJpQndZWEp6WlZaaGJIVmxLSFlwSUh0Y2JseDBYSFJjZEZ4MFhIUmNkRngwYVdZZ0tIVjBhV3h6TG1selJHRjBaU2gyS1NrZ2UxeHVYSFJjZEZ4MFhIUmNkRngwWEhSY2RIWWdQU0IyTG5SdlNWTlBVM1J5YVc1bktDazdYRzVjZEZ4MFhIUmNkRngwWEhSY2RIMGdaV3h6WlNCcFppQW9kWFJwYkhNdWFYTlBZbXBsWTNRb2Rpa3BJSHRjYmx4MFhIUmNkRngwWEhSY2RGeDBYSFIySUQwZ0tEQXNJRjl6ZEhKcGJtZHBabmt5TG1SbFptRjFiSFFwS0hZcE8xeHVYSFJjZEZ4MFhIUmNkRngwWEhSOVhHNWNkRngwWEhSY2RGeDBYSFJjZEhCaGNuUnpMbkIxYzJnb1pXNWpiMlJsS0d0bGVTa2dLeUFuUFNjZ0t5QmxibU52WkdVb2Rpa3BPMXh1WEhSY2RGeDBYSFJjZEZ4MGZTazdYRzVjZEZ4MFhIUmNkRngwZlNrN1hHNWNibHgwWEhSY2RGeDBYSFJ6WlhKcFlXeHBlbVZrVUdGeVlXMXpJRDBnY0dGeWRITXVhbTlwYmlnbkppY3BPMXh1WEhSY2RGeDBYSFI5WEc1Y2JseDBYSFJjZEZ4MGFXWWdLSE5sY21saGJHbDZaV1JRWVhKaGJYTXBJSHRjYmx4MFhIUmNkRngwWEhSMWNtd2dLejBnS0hWeWJDNXBibVJsZUU5bUtDYy9KeWtnUFQwOUlDMHhJRDhnSno4bklEb2dKeVluS1NBcklITmxjbWxoYkdsNlpXUlFZWEpoYlhNN1hHNWNkRngwWEhSY2RIMWNibHh1WEhSY2RGeDBYSFJ5WlhSMWNtNGdkWEpzTzF4dVhIUmNkRngwZlR0Y2JseHVYSFJjZEZ4MEx5b3FLaTljYmx4MFhIUjlMRnh1WEhSY2RDOHFJRGNnS2k5Y2JseDBYSFF2S2lvcUwyWjFibU4wYVc5dUlDaHRiMlIxYkdVc0lHVjRjRzl5ZEhNc0lGOWZkMlZpY0dGamExOXlaWEYxYVhKbFgxOHBJSHRjYmx4dVhIUmNkRngwSjNWelpTQnpkSEpwWTNRbk8xeHVYRzVjZEZ4MFhIUjJZWElnZFhScGJITWdQU0JmWDNkbFluQmhZMnRmY21WeGRXbHlaVjlmS0RNcE8xeHVYRzVjZEZ4MFhIUXZLaXBjYmlBZ0lDQXFJRkJoY25ObElHaGxZV1JsY25NZ2FXNTBieUJoYmlCdlltcGxZM1JjYmlBZ0lDQXFYRzRnSUNBZ0tpQmdZR0JjYmlBZ0lDQXFJRVJoZEdVNklGZGxaQ3dnTWpjZ1FYVm5JREl3TVRRZ01EZzZOVGc2TkRrZ1IwMVVYRzRnSUNBZ0tpQkRiMjUwWlc1MExWUjVjR1U2SUdGd2NHeHBZMkYwYVc5dUwycHpiMjVjYmlBZ0lDQXFJRU52Ym01bFkzUnBiMjQ2SUd0bFpYQXRZV3hwZG1WY2JpQWdJQ0FxSUZSeVlXNXpabVZ5TFVWdVkyOWthVzVuT2lCamFIVnVhMlZrWEc0Z0lDQWdLaUJnWUdCY2JpQWdJQ0FxWEc0Z0lDQWdLaUJBY0dGeVlXMGdlMU4wY21sdVozMGdhR1ZoWkdWeWN5QklaV0ZrWlhKeklHNWxaV1JwYm1jZ2RHOGdZbVVnY0dGeWMyVmtYRzRnSUNBZ0tpQkFjbVYwZFhKdWN5QjdUMkpxWldOMGZTQklaV0ZrWlhKeklIQmhjbk5sWkNCcGJuUnZJR0Z1SUc5aWFtVmpkRnh1SUNBZ0lDb3ZYRzVjZEZ4MFhIUnRiMlIxYkdVdVpYaHdiM0owY3lBOUlHWjFibU4wYVc5dUlIQmhjbk5sU0dWaFpHVnljeWhvWldGa1pYSnpLU0I3WEc1Y2RGeDBYSFJjZEhaaGNpQndZWEp6WldRZ1BTQjdmVHRjYmx4MFhIUmNkRngwZG1GeUlHdGxlVHRjYmx4MFhIUmNkRngwZG1GeUlIWmhiRHRjYmx4MFhIUmNkRngwZG1GeUlHazdYRzVjYmx4MFhIUmNkRngwYVdZZ0tDRm9aV0ZrWlhKektTQjdYRzVjZEZ4MFhIUmNkRngwY21WMGRYSnVJSEJoY25ObFpEdGNibHgwWEhSY2RGeDBmVnh1WEc1Y2RGeDBYSFJjZEhWMGFXeHpMbVp2Y2tWaFkyZ29hR1ZoWkdWeWN5NXpjR3hwZENnblhGeHVKeWtzSUdaMWJtTjBhVzl1SUhCaGNuTmxjaWhzYVc1bEtTQjdYRzVjZEZ4MFhIUmNkRngwYVNBOUlHeHBibVV1YVc1a1pYaFBaaWduT2ljcE8xeHVYSFJjZEZ4MFhIUmNkR3RsZVNBOUlIVjBhV3h6TG5SeWFXMG9iR2x1WlM1emRXSnpkSElvTUN3Z2FTa3BMblJ2VEc5M1pYSkRZWE5sS0NrN1hHNWNkRngwWEhSY2RGeDBkbUZzSUQwZ2RYUnBiSE11ZEhKcGJTaHNhVzVsTG5OMVluTjBjaWhwSUNzZ01Ta3BPMXh1WEc1Y2RGeDBYSFJjZEZ4MGFXWWdLR3RsZVNrZ2UxeHVYSFJjZEZ4MFhIUmNkRngwY0dGeWMyVmtXMnRsZVYwZ1BTQndZWEp6WldSYmEyVjVYU0EvSUhCaGNuTmxaRnRyWlhsZElDc2dKeXdnSnlBcklIWmhiQ0E2SUhaaGJEdGNibHgwWEhSY2RGeDBYSFI5WEc1Y2RGeDBYSFJjZEgwcE8xeHVYRzVjZEZ4MFhIUmNkSEpsZEhWeWJpQndZWEp6WldRN1hHNWNkRngwWEhSOU8xeHVYRzVjZEZ4MFhIUXZLaW9xTDF4dVhIUmNkSDBzWEc1Y2RGeDBMeW9nT0NBcUwxeHVYSFJjZEM4cUtpb3ZablZ1WTNScGIyNGdLRzF2WkhWc1pTd2daWGh3YjNKMGN5d2dYMTkzWldKd1lXTnJYM0psY1hWcGNtVmZYeWtnZTF4dVhHNWNkRngwWEhRbmRYTmxJSE4wY21samRDYzdYRzVjYmx4MFhIUmNkSFpoY2lCMWRHbHNjeUE5SUY5ZmQyVmljR0ZqYTE5eVpYRjFhWEpsWDE4b015azdYRzVjYmx4MFhIUmNkQzhxS2x4dUlDQWdJQ29nVkhKaGJuTm1iM0p0SUhSb1pTQmtZWFJoSUdadmNpQmhJSEpsY1hWbGMzUWdiM0lnWVNCeVpYTndiMjV6WlZ4dUlDQWdJQ3BjYmlBZ0lDQXFJRUJ3WVhKaGJTQjdUMkpxWldOMGZGTjBjbWx1WjMwZ1pHRjBZU0JVYUdVZ1pHRjBZU0IwYnlCaVpTQjBjbUZ1YzJadmNtMWxaRnh1SUNBZ0lDb2dRSEJoY21GdElIdEJjbkpoZVgwZ2FHVmhaR1Z5Y3lCVWFHVWdhR1ZoWkdWeWN5Qm1iM0lnZEdobElISmxjWFZsYzNRZ2IzSWdjbVZ6Y0c5dWMyVmNiaUFnSUNBcUlFQndZWEpoYlNCN1FYSnlZWGw4Um5WdVkzUnBiMjU5SUdadWN5QkJJSE5wYm1kc1pTQm1kVzVqZEdsdmJpQnZjaUJCY25KaGVTQnZaaUJtZFc1amRHbHZibk5jYmlBZ0lDQXFJRUJ5WlhSMWNtNXpJSHNxZlNCVWFHVWdjbVZ6ZFd4MGFXNW5JSFJ5WVc1elptOXliV1ZrSUdSaGRHRmNiaUFnSUNBcUwxeHVYSFJjZEZ4MGJXOWtkV3hsTG1WNGNHOXlkSE1nUFNCbWRXNWpkR2x2YmlCMGNtRnVjMlp2Y20xRVlYUmhLR1JoZEdFc0lHaGxZV1JsY25Nc0lHWnVjeWtnZTF4dVhIUmNkRngwWEhRdkttVnpiR2x1ZENCdWJ5MXdZWEpoYlMxeVpXRnpjMmxuYmpvd0tpOWNibHgwWEhSY2RGeDBkWFJwYkhNdVptOXlSV0ZqYUNobWJuTXNJR1oxYm1OMGFXOXVJSFJ5WVc1elptOXliU2htYmlrZ2UxeHVYSFJjZEZ4MFhIUmNkR1JoZEdFZ1BTQm1iaWhrWVhSaExDQm9aV0ZrWlhKektUdGNibHgwWEhSY2RGeDBmU2s3WEc1Y2JseDBYSFJjZEZ4MGNtVjBkWEp1SUdSaGRHRTdYRzVjZEZ4MFhIUjlPMXh1WEc1Y2RGeDBYSFF2S2lvcUwxeHVYSFJjZEgwc1hHNWNkRngwTHlvZ09TQXFMMXh1WEhSY2RDOHFLaW92Wm5WdVkzUnBiMjRnS0cxdlpIVnNaU3dnWlhod2IzSjBjeXdnWDE5M1pXSndZV05yWDNKbGNYVnBjbVZmWHlrZ2UxeHVYRzVjZEZ4MFhIUW5kWE5sSUhOMGNtbGpkQ2M3WEc1Y2JseDBYSFJjZEhaaGNpQjFkR2xzY3lBOUlGOWZkMlZpY0dGamExOXlaWEYxYVhKbFgxOG9NeWs3WEc1Y2JseDBYSFJjZEcxdlpIVnNaUzVsZUhCdmNuUnpJRDBnZFhScGJITXVhWE5UZEdGdVpHRnlaRUp5YjNkelpYSkZibllvS1NBL1hHNWNibHgwWEhSY2RDOHZJRk4wWVc1a1lYSmtJR0p5YjNkelpYSWdaVzUyY3lCb1lYWmxJR1oxYkd3Z2MzVndjRzl5ZENCdlppQjBhR1VnUVZCSmN5QnVaV1ZrWldRZ2RHOGdkR1Z6ZEZ4dVhIUmNkRngwTHk4Z2QyaGxkR2hsY2lCMGFHVWdjbVZ4ZFdWemRDQlZVa3dnYVhNZ2IyWWdkR2hsSUhOaGJXVWdiM0pwWjJsdUlHRnpJR04xY25KbGJuUWdiRzlqWVhScGIyNHVYRzVjZEZ4MFhIUm1kVzVqZEdsdmJpQnpkR0Z1WkdGeVpFSnliM2R6WlhKRmJuWW9LU0I3WEc1Y2RGeDBYSFJjZEhaaGNpQnRjMmxsSUQwZ0x5aHRjMmxsZkhSeWFXUmxiblFwTDJrdWRHVnpkQ2h1WVhacFoyRjBiM0l1ZFhObGNrRm5aVzUwS1R0Y2JseDBYSFJjZEZ4MGRtRnlJSFZ5YkZCaGNuTnBibWRPYjJSbElEMGdaRzlqZFcxbGJuUXVZM0psWVhSbFJXeGxiV1Z1ZENnbllTY3BPMXh1WEhSY2RGeDBYSFIyWVhJZ2IzSnBaMmx1VlZKTU8xeHVYRzVjZEZ4MFhIUmNkQzhxS2x4dUlDQWdJQ29nVUdGeWMyVWdZU0JWVWt3Z2RHOGdaR2x6WTI5MlpYSWdhWFFuY3lCamIyMXdiMjVsYm5SelhHNGdJQ0FnS2x4dUlDQWdJQ29nUUhCaGNtRnRJSHRUZEhKcGJtZDlJSFZ5YkNCVWFHVWdWVkpNSUhSdklHSmxJSEJoY25ObFpGeHVJQ0FnSUNvZ1FISmxkSFZ5Ym5NZ2UwOWlhbVZqZEgxY2JpQWdJQ0FxTDF4dVhIUmNkRngwWEhSbWRXNWpkR2x2YmlCeVpYTnZiSFpsVlZKTUtIVnliQ2tnZTF4dVhIUmNkRngwWEhSY2RIWmhjaUJvY21WbUlEMGdkWEpzTzF4dVhHNWNkRngwWEhSY2RGeDBhV1lnS0cxemFXVXBJSHRjYmx4MFhIUmNkRngwWEhSY2RDOHZJRWxGSUc1bFpXUnpJR0YwZEhKcFluVjBaU0J6WlhRZ2RIZHBZMlVnZEc4Z2JtOXliV0ZzYVhwbElIQnliM0JsY25ScFpYTmNibHgwWEhSY2RGeDBYSFJjZEhWeWJGQmhjbk5wYm1kT2IyUmxMbk5sZEVGMGRISnBZblYwWlNnbmFISmxaaWNzSUdoeVpXWXBPMXh1WEhSY2RGeDBYSFJjZEZ4MGFISmxaaUE5SUhWeWJGQmhjbk5wYm1kT2IyUmxMbWh5WldZN1hHNWNkRngwWEhSY2RGeDBmVnh1WEc1Y2RGeDBYSFJjZEZ4MGRYSnNVR0Z5YzJsdVowNXZaR1V1YzJWMFFYUjBjbWxpZFhSbEtDZG9jbVZtSnl3Z2FISmxaaWs3WEc1Y2JseDBYSFJjZEZ4MFhIUXZMeUIxY214UVlYSnphVzVuVG05a1pTQndjbTkyYVdSbGN5QjBhR1VnVlhKc1ZYUnBiSE1nYVc1MFpYSm1ZV05sSUMwZ2FIUjBjRG92TDNWeWJDNXpjR1ZqTG5kb1lYUjNaeTV2Y21jdkkzVnliSFYwYVd4elhHNWNkRngwWEhSY2RGeDBjbVYwZFhKdUlIdGNibHgwWEhSY2RGeDBYSFJjZEdoeVpXWTZJSFZ5YkZCaGNuTnBibWRPYjJSbExtaHlaV1lzWEc1Y2RGeDBYSFJjZEZ4MFhIUndjbTkwYjJOdmJEb2dkWEpzVUdGeWMybHVaMDV2WkdVdWNISnZkRzlqYjJ3Z1B5QjFjbXhRWVhKemFXNW5UbTlrWlM1d2NtOTBiMk52YkM1eVpYQnNZV05sS0M4NkpDOHNJQ2NuS1NBNklDY25MRnh1WEhSY2RGeDBYSFJjZEZ4MGFHOXpkRG9nZFhKc1VHRnljMmx1WjA1dlpHVXVhRzl6ZEN4Y2JseDBYSFJjZEZ4MFhIUmNkSE5sWVhKamFEb2dkWEpzVUdGeWMybHVaMDV2WkdVdWMyVmhjbU5vSUQ4Z2RYSnNVR0Z5YzJsdVowNXZaR1V1YzJWaGNtTm9MbkpsY0d4aFkyVW9MMTVjWEQ4dkxDQW5KeWtnT2lBbkp5eGNibHgwWEhSY2RGeDBYSFJjZEdoaGMyZzZJSFZ5YkZCaGNuTnBibWRPYjJSbExtaGhjMmdnUHlCMWNteFFZWEp6YVc1blRtOWtaUzVvWVhOb0xuSmxjR3hoWTJVb0wxNGpMeXdnSnljcElEb2dKeWNzWEc1Y2RGeDBYSFJjZEZ4MFhIUm9iM04wYm1GdFpUb2dkWEpzVUdGeWMybHVaMDV2WkdVdWFHOXpkRzVoYldVc1hHNWNkRngwWEhSY2RGeDBYSFJ3YjNKME9pQjFjbXhRWVhKemFXNW5UbTlrWlM1d2IzSjBMRnh1WEhSY2RGeDBYSFJjZEZ4MGNHRjBhRzVoYldVNklIVnliRkJoY25OcGJtZE9iMlJsTG5CaGRHaHVZVzFsTG1Ob1lYSkJkQ2d3S1NBOVBUMGdKeThuSUQ4Z2RYSnNVR0Z5YzJsdVowNXZaR1V1Y0dGMGFHNWhiV1VnT2lBbkx5Y2dLeUIxY214UVlYSnphVzVuVG05a1pTNXdZWFJvYm1GdFpWeHVYSFJjZEZ4MFhIUmNkSDA3WEc1Y2RGeDBYSFJjZEgxY2JseHVYSFJjZEZ4MFhIUnZjbWxuYVc1VlVrd2dQU0J5WlhOdmJIWmxWVkpNS0hkcGJtUnZkeTVzYjJOaGRHbHZiaTVvY21WbUtUdGNibHh1WEhSY2RGeDBYSFF2S2lwY2JpQWdJQ0FxSUVSbGRHVnliV2x1WlNCcFppQmhJRlZTVENCemFHRnlaWE1nZEdobElITmhiV1VnYjNKcFoybHVJR0Z6SUhSb1pTQmpkWEp5Wlc1MElHeHZZMkYwYVc5dVhHNGdJQ0FnS2x4dUlDQWdJQ29nUUhCaGNtRnRJSHRUZEhKcGJtZDlJSEpsY1hWbGMzUlZVa3dnVkdobElGVlNUQ0IwYnlCMFpYTjBYRzRnSUNBZ0tpQkFjbVYwZFhKdWN5QjdZbTl2YkdWaGJuMGdWSEoxWlNCcFppQlZVa3dnYzJoaGNtVnpJSFJvWlNCellXMWxJRzl5YVdkcGJpd2diM1JvWlhKM2FYTmxJR1poYkhObFhHNGdJQ0FnS2k5Y2JseDBYSFJjZEZ4MGNtVjBkWEp1SUdaMWJtTjBhVzl1SUdselZWSk1VMkZ0WlU5eWFXZHBiaWh5WlhGMVpYTjBWVkpNS1NCN1hHNWNkRngwWEhSY2RGeDBkbUZ5SUhCaGNuTmxaQ0E5SUhWMGFXeHpMbWx6VTNSeWFXNW5LSEpsY1hWbGMzUlZVa3dwSUQ4Z2NtVnpiMngyWlZWU1RDaHlaWEYxWlhOMFZWSk1LU0E2SUhKbGNYVmxjM1JWVWt3N1hHNWNkRngwWEhSY2RGeDBjbVYwZFhKdUlIQmhjbk5sWkM1d2NtOTBiMk52YkNBOVBUMGdiM0pwWjJsdVZWSk1MbkJ5YjNSdlkyOXNJQ1ltSUhCaGNuTmxaQzVvYjNOMElEMDlQU0J2Y21sbmFXNVZVa3d1YUc5emREdGNibHgwWEhSY2RGeDBmVHRjYmx4MFhIUmNkSDBvS1NBNlhHNWNibHgwWEhSY2RDOHZJRTV2YmlCemRHRnVaR0Z5WkNCaWNtOTNjMlZ5SUdWdWRuTWdLSGRsWWlCM2IzSnJaWEp6TENCeVpXRmpkQzF1WVhScGRtVXBJR3hoWTJzZ2JtVmxaR1ZrSUhOMWNIQnZjblF1WEc1Y2RGeDBYSFJtZFc1amRHbHZiaUJ1YjI1VGRHRnVaR0Z5WkVKeWIzZHpaWEpGYm5Zb0tTQjdYRzVjZEZ4MFhIUmNkSEpsZEhWeWJpQm1kVzVqZEdsdmJpQnBjMVZTVEZOaGJXVlBjbWxuYVc0b0tTQjdYRzVjZEZ4MFhIUmNkRngwY21WMGRYSnVJSFJ5ZFdVN1hHNWNkRngwWEhSY2RIMDdYRzVjZEZ4MFhIUjlLQ2s3WEc1Y2JseDBYSFJjZEM4cUtpb3ZYRzVjZEZ4MGZTeGNibHgwWEhRdktpQXhNQ0FxTDF4dVhIUmNkQzhxS2lvdlpuVnVZM1JwYjI0Z0tHMXZaSFZzWlN3Z1pYaHdiM0owY3lrZ2UxeHVYRzVjZEZ4MFhIUW5kWE5sSUhOMGNtbGpkQ2M3WEc1Y2JseDBYSFJjZEM4dklHSjBiMkVnY0c5c2VXWnBiR3dnWm05eUlFbEZQREV3SUdOdmRYSjBaWE41SUdoMGRIQnpPaTh2WjJsMGFIVmlMbU52YlM5a1lYWnBaR05vWVcxaVpYSnpMMEpoYzJVMk5DNXFjMXh1WEc1Y2RGeDBYSFIyWVhJZ1kyaGhjbk1nUFNBblFVSkRSRVZHUjBoSlNrdE1UVTVQVUZGU1UxUlZWbGRZV1ZwaFltTmtaV1puYUdscWEyeHRibTl3Y1hKemRIVjJkM2g1ZWpBeE1qTTBOVFkzT0Rrckx6MG5PMXh1WEc1Y2RGeDBYSFJtZFc1amRHbHZiaUJKYm5aaGJHbGtRMmhoY21GamRHVnlSWEp5YjNJb2JXVnpjMkZuWlNrZ2UxeHVYSFJjZEZ4MFhIUjBhR2x6TG0xbGMzTmhaMlVnUFNCdFpYTnpZV2RsTzF4dVhIUmNkRngwZlZ4dVhIUmNkRngwU1c1MllXeHBaRU5vWVhKaFkzUmxja1Z5Y205eUxuQnliM1J2ZEhsd1pTQTlJRzVsZHlCRmNuSnZjaWdwTzF4dVhIUmNkRngwU1c1MllXeHBaRU5vWVhKaFkzUmxja1Z5Y205eUxuQnliM1J2ZEhsd1pTNWpiMlJsSUQwZ05UdGNibHgwWEhSY2RFbHVkbUZzYVdSRGFHRnlZV04wWlhKRmNuSnZjaTV3Y205MGIzUjVjR1V1Ym1GdFpTQTlJQ2RKYm5aaGJHbGtRMmhoY21GamRHVnlSWEp5YjNJbk8xeHVYRzVjZEZ4MFhIUm1kVzVqZEdsdmJpQmlkRzloS0dsdWNIVjBLU0I3WEc1Y2RGeDBYSFJjZEhaaGNpQnpkSElnUFNCVGRISnBibWNvYVc1d2RYUXBPMXh1WEhSY2RGeDBYSFIyWVhJZ2IzVjBjSFYwSUQwZ0p5YzdYRzVjZEZ4MFhIUmNkR1p2Y2lBb1hHNWNkRngwWEhSY2RDOHZJR2x1YVhScFlXeHBlbVVnY21WemRXeDBJR0Z1WkNCamIzVnVkR1Z5WEc1Y2RGeDBYSFJjZEhaaGNpQmliRzlqYXl3Z1kyaGhja052WkdVc0lHbGtlQ0E5SURBc0lHMWhjQ0E5SUdOb1lYSnpPMXh1WEhSY2RGeDBYSFF2THlCcFppQjBhR1VnYm1WNGRDQnpkSElnYVc1a1pYZ2daRzlsY3lCdWIzUWdaWGhwYzNRNlhHNWNkRngwWEhSY2RDOHZJQ0FnWTJoaGJtZGxJSFJvWlNCdFlYQndhVzVuSUhSaFlteGxJSFJ2SUZ3aVBWd2lYRzVjZEZ4MFhIUmNkQzh2SUNBZ1kyaGxZMnNnYVdZZ1pDQm9ZWE1nYm04Z1puSmhZM1JwYjI1aGJDQmthV2RwZEhOY2JseDBYSFJjZEZ4MGMzUnlMbU5vWVhKQmRDaHBaSGdnZkNBd0tTQjhmQ0FvYldGd0lEMGdKejBuTENCcFpIZ2dKU0F4S1R0Y2JseDBYSFJjZEZ4MEx5OGdYQ0k0SUMwZ2FXUjRJQ1VnTVNBcUlEaGNJaUJuWlc1bGNtRjBaWE1nZEdobElITmxjWFZsYm1ObElESXNJRFFzSURZc0lEaGNibHgwWEhSY2RGeDBiM1YwY0hWMElDczlJRzFoY0M1amFHRnlRWFFvTmpNZ0ppQmliRzlqYXlBK1BpQTRJQzBnYVdSNElDVWdNU0FxSURncEtTQjdYRzVjZEZ4MFhIUmNkRngwWTJoaGNrTnZaR1VnUFNCemRISXVZMmhoY2tOdlpHVkJkQ2hwWkhnZ0t6MGdNeUF2SURRcE8xeHVYSFJjZEZ4MFhIUmNkR2xtSUNoamFHRnlRMjlrWlNBK0lEQjRSa1lwSUh0Y2JseDBYSFJjZEZ4MFhIUmNkSFJvY205M0lHNWxkeUJKYm5aaGJHbGtRMmhoY21GamRHVnlSWEp5YjNJb0owbE9Wa0ZNU1VSZlEwaEJVa0ZEVkVWU1gwVlNVam9nUkU5TklFVjRZMlZ3ZEdsdmJpQTFKeWs3WEc1Y2RGeDBYSFJjZEZ4MGZWeHVYSFJjZEZ4MFhIUmNkR0pzYjJOcklEMGdZbXh2WTJzZ1BEd2dPQ0I4SUdOb1lYSkRiMlJsTzF4dVhIUmNkRngwWEhSOVhHNWNkRngwWEhSY2RISmxkSFZ5YmlCdmRYUndkWFE3WEc1Y2RGeDBYSFI5WEc1Y2JseDBYSFJjZEcxdlpIVnNaUzVsZUhCdmNuUnpJRDBnWW5SdllUdGNibHh1WEhSY2RGeDBMeW9xS2k5Y2JseDBYSFI5TEZ4dVhIUmNkQzhxSURFeElDb3ZYRzVjZEZ4MEx5b3FLaTltZFc1amRHbHZiaUFvYlc5a2RXeGxMQ0JsZUhCdmNuUnpMQ0JmWDNkbFluQmhZMnRmY21WeGRXbHlaVjlmS1NCN1hHNWNibHgwWEhSY2RDZDFjMlVnYzNSeWFXTjBKenRjYmx4dVhIUmNkRngwZG1GeUlIVjBhV3h6SUQwZ1gxOTNaV0p3WVdOclgzSmxjWFZwY21WZlh5Z3pLVHRjYmx4dVhIUmNkRngwYlc5a2RXeGxMbVY0Y0c5eWRITWdQU0IxZEdsc2N5NXBjMU4wWVc1a1lYSmtRbkp2ZDNObGNrVnVkaWdwSUQ5Y2JseHVYSFJjZEZ4MEx5OGdVM1JoYm1SaGNtUWdZbkp2ZDNObGNpQmxiblp6SUhOMWNIQnZjblFnWkc5amRXMWxiblF1WTI5dmEybGxYRzVjZEZ4MFhIUm1kVzVqZEdsdmJpQnpkR0Z1WkdGeVpFSnliM2R6WlhKRmJuWW9LU0I3WEc1Y2RGeDBYSFJjZEhKbGRIVnliaUI3WEc1Y2RGeDBYSFJjZEZ4MGQzSnBkR1U2SUdaMWJtTjBhVzl1SUhkeWFYUmxLRzVoYldVc0lIWmhiSFZsTENCbGVIQnBjbVZ6TENCd1lYUm9MQ0JrYjIxaGFXNHNJSE5sWTNWeVpTa2dlMXh1WEhSY2RGeDBYSFJjZEZ4MGRtRnlJR052YjJ0cFpTQTlJRnRkTzF4dVhIUmNkRngwWEhSY2RGeDBZMjl2YTJsbExuQjFjMmdvYm1GdFpTQXJJQ2M5SnlBcklHVnVZMjlrWlZWU1NVTnZiWEJ2Ym1WdWRDaDJZV3gxWlNrcE8xeHVYRzVjZEZ4MFhIUmNkRngwWEhScFppQW9kWFJwYkhNdWFYTk9kVzFpWlhJb1pYaHdhWEpsY3lrcElIdGNibHgwWEhSY2RGeDBYSFJjZEZ4MFkyOXZhMmxsTG5CMWMyZ29KMlY0Y0dseVpYTTlKeUFySUc1bGR5QkVZWFJsS0dWNGNHbHlaWE1wTG5SdlIwMVVVM1J5YVc1bktDa3BPMXh1WEhSY2RGeDBYSFJjZEZ4MGZWeHVYRzVjZEZ4MFhIUmNkRngwWEhScFppQW9kWFJwYkhNdWFYTlRkSEpwYm1jb2NHRjBhQ2twSUh0Y2JseDBYSFJjZEZ4MFhIUmNkRngwWTI5dmEybGxMbkIxYzJnb0ozQmhkR2c5SnlBcklIQmhkR2dwTzF4dVhIUmNkRngwWEhSY2RGeDBmVnh1WEc1Y2RGeDBYSFJjZEZ4MFhIUnBaaUFvZFhScGJITXVhWE5UZEhKcGJtY29aRzl0WVdsdUtTa2dlMXh1WEhSY2RGeDBYSFJjZEZ4MFhIUmpiMjlyYVdVdWNIVnphQ2duWkc5dFlXbHVQU2NnS3lCa2IyMWhhVzRwTzF4dVhIUmNkRngwWEhSY2RGeDBmVnh1WEc1Y2RGeDBYSFJjZEZ4MFhIUnBaaUFvYzJWamRYSmxJRDA5UFNCMGNuVmxLU0I3WEc1Y2RGeDBYSFJjZEZ4MFhIUmNkR052YjJ0cFpTNXdkWE5vS0NkelpXTjFjbVVuS1R0Y2JseDBYSFJjZEZ4MFhIUmNkSDFjYmx4dVhIUmNkRngwWEhSY2RGeDBaRzlqZFcxbGJuUXVZMjl2YTJsbElEMGdZMjl2YTJsbExtcHZhVzRvSnpzZ0p5azdYRzVjZEZ4MFhIUmNkRngwZlN4Y2JseHVYSFJjZEZ4MFhIUmNkSEpsWVdRNklHWjFibU4wYVc5dUlISmxZV1FvYm1GdFpTa2dlMXh1WEhSY2RGeDBYSFJjZEZ4MGRtRnlJRzFoZEdOb0lEMGdaRzlqZFcxbGJuUXVZMjl2YTJsbExtMWhkR05vS0c1bGR5QlNaV2RGZUhBb0p5aGVmRHRjWEZ4Y2N5b3BLQ2NnS3lCdVlXMWxJQ3NnSnlrOUtGdGVPMTBxS1NjcEtUdGNibHgwWEhSY2RGeDBYSFJjZEhKbGRIVnliaUJ0WVhSamFDQS9JR1JsWTI5a1pWVlNTVU52YlhCdmJtVnVkQ2h0WVhSamFGc3pYU2tnT2lCdWRXeHNPMXh1WEhSY2RGeDBYSFJjZEgwc1hHNWNibHgwWEhSY2RGeDBYSFJ5WlcxdmRtVTZJR1oxYm1OMGFXOXVJSEpsYlc5MlpTaHVZVzFsS1NCN1hHNWNkRngwWEhSY2RGeDBYSFIwYUdsekxuZHlhWFJsS0c1aGJXVXNJQ2NuTENCRVlYUmxMbTV2ZHlncElDMGdPRFkwTURBd01EQXBPMXh1WEhSY2RGeDBYSFJjZEgxY2JseDBYSFJjZEZ4MGZUdGNibHgwWEhSY2RIMG9LU0E2WEc1Y2JseDBYSFJjZEM4dklFNXZiaUJ6ZEdGdVpHRnlaQ0JpY205M2MyVnlJR1Z1ZGlBb2QyVmlJSGR2Y210bGNuTXNJSEpsWVdOMExXNWhkR2wyWlNrZ2JHRmpheUJ1WldWa1pXUWdjM1Z3Y0c5eWRDNWNibHgwWEhSY2RHWjFibU4wYVc5dUlHNXZibE4wWVc1a1lYSmtRbkp2ZDNObGNrVnVkaWdwSUh0Y2JseDBYSFJjZEZ4MGNtVjBkWEp1SUh0Y2JseDBYSFJjZEZ4MFhIUjNjbWwwWlRvZ1puVnVZM1JwYjI0Z2QzSnBkR1VvS1NCN2ZTeGNibHgwWEhSY2RGeDBYSFJ5WldGa09pQm1kVzVqZEdsdmJpQnlaV0ZrS0NrZ2UxeHVYSFJjZEZ4MFhIUmNkRngwY21WMGRYSnVJRzUxYkd3N1hHNWNkRngwWEhSY2RGeDBmU3hjYmx4MFhIUmNkRngwWEhSeVpXMXZkbVU2SUdaMWJtTjBhVzl1SUhKbGJXOTJaU2dwSUh0OVhHNWNkRngwWEhSY2RIMDdYRzVjZEZ4MFhIUjlLQ2s3WEc1Y2JseDBYSFJjZEM4cUtpb3ZYRzVjZEZ4MGZTeGNibHgwWEhRdktpQXhNaUFxTDF4dVhIUmNkQzhxS2lvdlpuVnVZM1JwYjI0Z0tHMXZaSFZzWlN3Z1pYaHdiM0owY3l3Z1gxOTNaV0p3WVdOclgzSmxjWFZwY21WZlh5a2dlMXh1WEc1Y2RGeDBYSFFuZFhObElITjBjbWxqZENjN1hHNWNibHgwWEhSY2RIWmhjaUIxZEdsc2N5QTlJRjlmZDJWaWNHRmphMTl5WlhGMWFYSmxYMThvTXlrN1hHNWNibHgwWEhSY2RHWjFibU4wYVc5dUlFbHVkR1Z5WTJWd2RHOXlUV0Z1WVdkbGNpZ3BJSHRjYmx4MFhIUmNkRngwZEdocGN5NW9ZVzVrYkdWeWN5QTlJRnRkTzF4dVhIUmNkRngwZlZ4dVhHNWNkRngwWEhRdktpcGNiaUFnSUNBcUlFRmtaQ0JoSUc1bGR5QnBiblJsY21ObGNIUnZjaUIwYnlCMGFHVWdjM1JoWTJ0Y2JpQWdJQ0FxWEc0Z0lDQWdLaUJBY0dGeVlXMGdlMFoxYm1OMGFXOXVmU0JtZFd4bWFXeHNaV1FnVkdobElHWjFibU4wYVc5dUlIUnZJR2hoYm1Sc1pTQmdkR2hsYm1BZ1ptOXlJR0VnWUZCeWIyMXBjMlZnWEc0Z0lDQWdLaUJBY0dGeVlXMGdlMFoxYm1OMGFXOXVmU0J5WldwbFkzUmxaQ0JVYUdVZ1puVnVZM1JwYjI0Z2RHOGdhR0Z1Wkd4bElHQnlaV3BsWTNSZ0lHWnZjaUJoSUdCUWNtOXRhWE5sWUZ4dUlDQWdJQ3BjYmlBZ0lDQXFJRUJ5WlhSMWNtNGdlMDUxYldKbGNuMGdRVzRnU1VRZ2RYTmxaQ0IwYnlCeVpXMXZkbVVnYVc1MFpYSmpaWEIwYjNJZ2JHRjBaWEpjYmlBZ0lDQXFMMXh1WEhSY2RGeDBTVzUwWlhKalpYQjBiM0pOWVc1aFoyVnlMbkJ5YjNSdmRIbHdaUzUxYzJVZ1BTQm1kVzVqZEdsdmJpQjFjMlVvWm5Wc1ptbHNiR1ZrTENCeVpXcGxZM1JsWkNrZ2UxeHVYSFJjZEZ4MFhIUjBhR2x6TG1oaGJtUnNaWEp6TG5CMWMyZ29lMXh1WEhSY2RGeDBYSFJjZEdaMWJHWnBiR3hsWkRvZ1puVnNabWxzYkdWa0xGeHVYSFJjZEZ4MFhIUmNkSEpsYW1WamRHVmtPaUJ5WldwbFkzUmxaRnh1WEhSY2RGeDBYSFI5S1R0Y2JseDBYSFJjZEZ4MGNtVjBkWEp1SUhSb2FYTXVhR0Z1Wkd4bGNuTXViR1Z1WjNSb0lDMGdNVHRjYmx4MFhIUmNkSDA3WEc1Y2JseDBYSFJjZEM4cUtseHVJQ0FnSUNvZ1VtVnRiM1psSUdGdUlHbHVkR1Z5WTJWd2RHOXlJR1p5YjIwZ2RHaGxJSE4wWVdOclhHNGdJQ0FnS2x4dUlDQWdJQ29nUUhCaGNtRnRJSHRPZFcxaVpYSjlJR2xrSUZSb1pTQkpSQ0IwYUdGMElIZGhjeUJ5WlhSMWNtNWxaQ0JpZVNCZ2RYTmxZRnh1SUNBZ0lDb3ZYRzVjZEZ4MFhIUkpiblJsY21ObGNIUnZjazFoYm1GblpYSXVjSEp2ZEc5MGVYQmxMbVZxWldOMElEMGdablZ1WTNScGIyNGdaV3BsWTNRb2FXUXBJSHRjYmx4MFhIUmNkRngwYVdZZ0tIUm9hWE11YUdGdVpHeGxjbk5iYVdSZEtTQjdYRzVjZEZ4MFhIUmNkRngwZEdocGN5NW9ZVzVrYkdWeWMxdHBaRjBnUFNCdWRXeHNPMXh1WEhSY2RGeDBYSFI5WEc1Y2RGeDBYSFI5TzF4dVhHNWNkRngwWEhRdktpcGNiaUFnSUNBcUlFbDBaWEpoZEdVZ2IzWmxjaUJoYkd3Z2RHaGxJSEpsWjJsemRHVnlaV1FnYVc1MFpYSmpaWEIwYjNKelhHNGdJQ0FnS2x4dUlDQWdJQ29nVkdocGN5QnRaWFJvYjJRZ2FYTWdjR0Z5ZEdsamRXeGhjbXg1SUhWelpXWjFiQ0JtYjNJZ2MydHBjSEJwYm1jZ2IzWmxjaUJoYm5sY2JpQWdJQ0FxSUdsdWRHVnlZMlZ3ZEc5eWN5QjBhR0YwSUcxaGVTQm9ZWFpsSUdKbFkyOXRaU0JnYm5Wc2JHQWdZMkZzYkdsdVp5QmdaV3BsWTNSZ0xseHVJQ0FnSUNwY2JpQWdJQ0FxSUVCd1lYSmhiU0I3Um5WdVkzUnBiMjU5SUdadUlGUm9aU0JtZFc1amRHbHZiaUIwYnlCallXeHNJR1p2Y2lCbFlXTm9JR2x1ZEdWeVkyVndkRzl5WEc0Z0lDQWdLaTljYmx4MFhIUmNkRWx1ZEdWeVkyVndkRzl5VFdGdVlXZGxjaTV3Y205MGIzUjVjR1V1Wm05eVJXRmphQ0E5SUdaMWJtTjBhVzl1SUdadmNrVmhZMmdvWm00cElIdGNibHgwWEhSY2RGeDBkWFJwYkhNdVptOXlSV0ZqYUNoMGFHbHpMbWhoYm1Sc1pYSnpMQ0JtZFc1amRHbHZiaUJtYjNKRllXTm9TR0Z1Wkd4bGNpaG9LU0I3WEc1Y2RGeDBYSFJjZEZ4MGFXWWdLR2dnSVQwOUlHNTFiR3dwSUh0Y2JseDBYSFJjZEZ4MFhIUmNkR1p1S0dncE8xeHVYSFJjZEZ4MFhIUmNkSDFjYmx4MFhIUmNkRngwZlNrN1hHNWNkRngwWEhSOU8xeHVYRzVjZEZ4MFhIUnRiMlIxYkdVdVpYaHdiM0owY3lBOUlFbHVkR1Z5WTJWd2RHOXlUV0Z1WVdkbGNqdGNibHh1WEhSY2RGeDBMeW9xS2k5Y2JseDBYSFI5TEZ4dVhIUmNkQzhxSURFeklDb3ZYRzVjZEZ4MEx5b3FLaTltZFc1amRHbHZiaUFvYlc5a2RXeGxMQ0JsZUhCdmNuUnpLU0I3WEc1Y2JseDBYSFJjZENkMWMyVWdjM1J5YVdOMEp6dGNibHh1WEhSY2RGeDBMeW9xWEc0Z0lDQWdLaUJFWlhSbGNtMXBibVZ6SUhkb1pYUm9aWElnZEdobElITndaV05wWm1sbFpDQlZVa3dnYVhNZ1lXSnpiMngxZEdWY2JpQWdJQ0FxWEc0Z0lDQWdLaUJBY0dGeVlXMGdlM04wY21sdVozMGdkWEpzSUZSb1pTQlZVa3dnZEc4Z2RHVnpkRnh1SUNBZ0lDb2dRSEpsZEhWeWJuTWdlMkp2YjJ4bFlXNTlJRlJ5ZFdVZ2FXWWdkR2hsSUhOd1pXTnBabWxsWkNCVlVrd2dhWE1nWVdKemIyeDFkR1VzSUc5MGFHVnlkMmx6WlNCbVlXeHpaVnh1SUNBZ0lDb3ZYRzVjYmx4MFhIUmNkRzF2WkhWc1pTNWxlSEJ2Y25SeklEMGdablZ1WTNScGIyNGdhWE5CWW5OdmJIVjBaVlZTVENoMWNtd3BJSHRjYmx4MFhIUmNkRngwTHk4Z1FTQlZVa3dnYVhNZ1kyOXVjMmxrWlhKbFpDQmhZbk52YkhWMFpTQnBaaUJwZENCaVpXZHBibk1nZDJsMGFDQmNJanh6WTJobGJXVStPaTh2WENJZ2IzSWdYQ0l2TDF3aUlDaHdjbTkwYjJOdmJDMXlaV3hoZEdsMlpTQlZVa3dwTGx4dVhIUmNkRngwWEhRdkx5QlNSa01nTXprNE5pQmtaV1pwYm1WeklITmphR1Z0WlNCdVlXMWxJR0Z6SUdFZ2MyVnhkV1Z1WTJVZ2IyWWdZMmhoY21GamRHVnljeUJpWldkcGJtNXBibWNnZDJsMGFDQmhJR3hsZEhSbGNpQmhibVFnWm05c2JHOTNaV1JjYmx4MFhIUmNkRngwTHk4Z1lua2dZVzU1SUdOdmJXSnBibUYwYVc5dUlHOW1JR3hsZEhSbGNuTXNJR1JwWjJsMGN5d2djR3gxY3l3Z2NHVnlhVzlrTENCdmNpQm9lWEJvWlc0dVhHNWNkRngwWEhSY2RISmxkSFZ5YmlBb0wxNG9XMkV0ZWwxYllTMTZYRnhrWEZ3clhGd3RYRnd1WFNvNktUOWNYQzljWEM4dmFTNTBaWE4wS0hWeWJDbGNibHgwWEhSY2RGeDBLVHRjYmx4MFhIUmNkSDA3WEc1Y2JseDBYSFJjZEM4cUtpb3ZYRzVjZEZ4MGZTeGNibHgwWEhRdktpQXhOQ0FxTDF4dVhIUmNkQzhxS2lvdlpuVnVZM1JwYjI0Z0tHMXZaSFZzWlN3Z1pYaHdiM0owY3lrZ2UxeHVYRzVjZEZ4MFhIUW5kWE5sSUhOMGNtbGpkQ2M3WEc1Y2JseDBYSFJjZEM4cUtseHVJQ0FnSUNvZ1EzSmxZWFJsY3lCaElHNWxkeUJWVWt3Z1lua2dZMjl0WW1sdWFXNW5JSFJvWlNCemNHVmphV1pwWldRZ1ZWSk1jMXh1SUNBZ0lDcGNiaUFnSUNBcUlFQndZWEpoYlNCN2MzUnlhVzVuZlNCaVlYTmxWVkpNSUZSb1pTQmlZWE5sSUZWU1RGeHVJQ0FnSUNvZ1FIQmhjbUZ0SUh0emRISnBibWQ5SUhKbGJHRjBhWFpsVlZKTUlGUm9aU0J5Wld4aGRHbDJaU0JWVWt4Y2JpQWdJQ0FxSUVCeVpYUjFjbTV6SUh0emRISnBibWQ5SUZSb1pTQmpiMjFpYVc1bFpDQlZVa3hjYmlBZ0lDQXFMMXh1WEc1Y2RGeDBYSFJ0YjJSMWJHVXVaWGh3YjNKMGN5QTlJR1oxYm1OMGFXOXVJR052YldKcGJtVlZVa3h6S0dKaGMyVlZVa3dzSUhKbGJHRjBhWFpsVlZKTUtTQjdYRzVjZEZ4MFhIUmNkSEpsZEhWeWJpQmlZWE5sVlZKTUxuSmxjR3hoWTJVb0wxeGNMeXNrTHl3Z0p5Y3BJQ3NnSnk4bklDc2djbVZzWVhScGRtVlZVa3d1Y21Wd2JHRmpaU2d2WGx4Y0x5c3ZMQ0FuSnlrN1hHNWNkRngwWEhSOU8xeHVYRzVjZEZ4MFhIUXZLaW9xTDF4dVhIUmNkSDBzWEc1Y2RGeDBMeW9nTVRVZ0tpOWNibHgwWEhRdktpb3FMMloxYm1OMGFXOXVJQ2h0YjJSMWJHVXNJR1Y0Y0c5eWRITXBJSHRjYmx4dVhIUmNkRngwSjNWelpTQnpkSEpwWTNRbk8xeHVYRzVjZEZ4MFhIUnRiMlIxYkdVdVpYaHdiM0owY3lBOUlHWjFibU4wYVc5dUlHSnBibVFvWm00c0lIUm9hWE5CY21jcElIdGNibHgwWEhSY2RGeDBjbVYwZFhKdUlHWjFibU4wYVc5dUlIZHlZWEFvS1NCN1hHNWNkRngwWEhSY2RGeDBkbUZ5SUdGeVozTWdQU0J1WlhjZ1FYSnlZWGtvWVhKbmRXMWxiblJ6TG14bGJtZDBhQ2s3WEc1Y2RGeDBYSFJjZEZ4MFptOXlJQ2gyWVhJZ2FTQTlJREE3SUdrZ1BDQmhjbWR6TG14bGJtZDBhRHNnYVNzcktTQjdYRzVjZEZ4MFhIUmNkRngwWEhSaGNtZHpXMmxkSUQwZ1lYSm5kVzFsYm5SelcybGRPMXh1WEhSY2RGeDBYSFJjZEgxY2JseDBYSFJjZEZ4MFhIUnlaWFIxY200Z1ptNHVZWEJ3Ykhrb2RHaHBjMEZ5Wnl3Z1lYSm5jeWs3WEc1Y2RGeDBYSFJjZEgwN1hHNWNkRngwWEhSOU8xeHVYRzVjZEZ4MFhIUXZLaW9xTDF4dVhIUmNkSDBzWEc1Y2RGeDBMeW9nTVRZZ0tpOWNibHgwWEhRdktpb3FMMloxYm1OMGFXOXVJQ2h0YjJSMWJHVXNJR1Y0Y0c5eWRITXBJSHRjYmx4dVhIUmNkRngwSjNWelpTQnpkSEpwWTNRbk8xeHVYRzVjZEZ4MFhIUXZLaXBjYmlBZ0lDQXFJRk41Ym5SaFkzUnBZeUJ6ZFdkaGNpQm1iM0lnYVc1MmIydHBibWNnWVNCbWRXNWpkR2x2YmlCaGJtUWdaWGh3WVc1a2FXNW5JR0Z1SUdGeWNtRjVJR1p2Y2lCaGNtZDFiV1Z1ZEhNdVhHNGdJQ0FnS2x4dUlDQWdJQ29nUTI5dGJXOXVJSFZ6WlNCallYTmxJSGR2ZFd4a0lHSmxJSFJ2SUhWelpTQmdSblZ1WTNScGIyNHVjSEp2ZEc5MGVYQmxMbUZ3Y0d4NVlDNWNiaUFnSUNBcVhHNGdJQ0FnS2lBZ1lHQmdhbk5jYmlBZ0lDQXFJQ0JtZFc1amRHbHZiaUJtS0hnc0lIa3NJSG9wSUh0OVhHNGdJQ0FnS2lBZ2RtRnlJR0Z5WjNNZ1BTQmJNU3dnTWl3Z00xMDdYRzRnSUNBZ0tpQWdaaTVoY0hCc2VTaHVkV3hzTENCaGNtZHpLVHRjYmlBZ0lDQXFJQ0JnWUdCY2JpQWdJQ0FxWEc0Z0lDQWdLaUJYYVhSb0lHQnpjSEpsWVdSZ0lIUm9hWE1nWlhoaGJYQnNaU0JqWVc0Z1ltVWdjbVV0ZDNKcGRIUmxiaTVjYmlBZ0lDQXFYRzRnSUNBZ0tpQWdZR0JnYW5OY2JpQWdJQ0FxSUNCemNISmxZV1FvWm5WdVkzUnBiMjRvZUN3Z2VTd2dlaWtnZTMwcEtGc3hMQ0F5TENBelhTazdYRzRnSUNBZ0tpQWdZR0JnWEc0Z0lDQWdLbHh1SUNBZ0lDb2dRSEJoY21GdElIdEdkVzVqZEdsdmJuMGdZMkZzYkdKaFkydGNiaUFnSUNBcUlFQnlaWFIxY201eklIdEdkVzVqZEdsdmJuMWNiaUFnSUNBcUwxeHVYRzVjZEZ4MFhIUnRiMlIxYkdVdVpYaHdiM0owY3lBOUlHWjFibU4wYVc5dUlITndjbVZoWkNoallXeHNZbUZqYXlrZ2UxeHVYSFJjZEZ4MFhIUnlaWFIxY200Z1puVnVZM1JwYjI0Z2QzSmhjQ2hoY25JcElIdGNibHgwWEhSY2RGeDBYSFJ5WlhSMWNtNGdZMkZzYkdKaFkyc3VZWEJ3Ykhrb2JuVnNiQ3dnWVhKeUtUdGNibHgwWEhSY2RGeDBmVHRjYmx4MFhIUmNkSDA3WEc1Y2JseDBYSFJjZEM4cUtpb3ZYRzVjZEZ4MGZWeHVYSFJjZEM4cUtpb3FLaW92WFNsY2JseDBLVHRjYm4wcE8xeHVPMXh1THk4aklITnZkWEpqWlUxaGNIQnBibWRWVWt3OVlYaHBiM011YldGd0lsMTkiLCJ2YXIgZ2V0TmF0aXZlID0gcmVxdWlyZSgnLi9fZ2V0TmF0aXZlJyksXG4gICAgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xudmFyIERhdGFWaWV3ID0gZ2V0TmF0aXZlKHJvb3QsICdEYXRhVmlldycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IERhdGFWaWV3O1xuIiwidmFyIGhhc2hDbGVhciA9IHJlcXVpcmUoJy4vX2hhc2hDbGVhcicpLFxuICAgIGhhc2hEZWxldGUgPSByZXF1aXJlKCcuL19oYXNoRGVsZXRlJyksXG4gICAgaGFzaEdldCA9IHJlcXVpcmUoJy4vX2hhc2hHZXQnKSxcbiAgICBoYXNoSGFzID0gcmVxdWlyZSgnLi9faGFzaEhhcycpLFxuICAgIGhhc2hTZXQgPSByZXF1aXJlKCcuL19oYXNoU2V0Jyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGhhc2ggb2JqZWN0LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICovXG5mdW5jdGlvbiBIYXNoKGVudHJpZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBlbnRyaWVzID8gZW50cmllcy5sZW5ndGggOiAwO1xuXG4gIHRoaXMuY2xlYXIoKTtcbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2luZGV4XTtcbiAgICB0aGlzLnNldChlbnRyeVswXSwgZW50cnlbMV0pO1xuICB9XG59XG5cbi8vIEFkZCBtZXRob2RzIHRvIGBIYXNoYC5cbkhhc2gucHJvdG90eXBlLmNsZWFyID0gaGFzaENsZWFyO1xuSGFzaC5wcm90b3R5cGVbJ2RlbGV0ZSddID0gaGFzaERlbGV0ZTtcbkhhc2gucHJvdG90eXBlLmdldCA9IGhhc2hHZXQ7XG5IYXNoLnByb3RvdHlwZS5oYXMgPSBoYXNoSGFzO1xuSGFzaC5wcm90b3R5cGUuc2V0ID0gaGFzaFNldDtcblxubW9kdWxlLmV4cG9ydHMgPSBIYXNoO1xuIiwidmFyIGxpc3RDYWNoZUNsZWFyID0gcmVxdWlyZSgnLi9fbGlzdENhY2hlQ2xlYXInKSxcbiAgICBsaXN0Q2FjaGVEZWxldGUgPSByZXF1aXJlKCcuL19saXN0Q2FjaGVEZWxldGUnKSxcbiAgICBsaXN0Q2FjaGVHZXQgPSByZXF1aXJlKCcuL19saXN0Q2FjaGVHZXQnKSxcbiAgICBsaXN0Q2FjaGVIYXMgPSByZXF1aXJlKCcuL19saXN0Q2FjaGVIYXMnKSxcbiAgICBsaXN0Q2FjaGVTZXQgPSByZXF1aXJlKCcuL19saXN0Q2FjaGVTZXQnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGxpc3QgY2FjaGUgb2JqZWN0LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICovXG5mdW5jdGlvbiBMaXN0Q2FjaGUoZW50cmllcykge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGVudHJpZXMgPyBlbnRyaWVzLmxlbmd0aCA6IDA7XG5cbiAgdGhpcy5jbGVhcigpO1xuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gIH1cbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYExpc3RDYWNoZWAuXG5MaXN0Q2FjaGUucHJvdG90eXBlLmNsZWFyID0gbGlzdENhY2hlQ2xlYXI7XG5MaXN0Q2FjaGUucHJvdG90eXBlWydkZWxldGUnXSA9IGxpc3RDYWNoZURlbGV0ZTtcbkxpc3RDYWNoZS5wcm90b3R5cGUuZ2V0ID0gbGlzdENhY2hlR2V0O1xuTGlzdENhY2hlLnByb3RvdHlwZS5oYXMgPSBsaXN0Q2FjaGVIYXM7XG5MaXN0Q2FjaGUucHJvdG90eXBlLnNldCA9IGxpc3RDYWNoZVNldDtcblxubW9kdWxlLmV4cG9ydHMgPSBMaXN0Q2FjaGU7XG4iLCJ2YXIgZ2V0TmF0aXZlID0gcmVxdWlyZSgnLi9fZ2V0TmF0aXZlJyksXG4gICAgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xudmFyIE1hcCA9IGdldE5hdGl2ZShyb290LCAnTWFwJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gTWFwO1xuIiwidmFyIG1hcENhY2hlQ2xlYXIgPSByZXF1aXJlKCcuL19tYXBDYWNoZUNsZWFyJyksXG4gICAgbWFwQ2FjaGVEZWxldGUgPSByZXF1aXJlKCcuL19tYXBDYWNoZURlbGV0ZScpLFxuICAgIG1hcENhY2hlR2V0ID0gcmVxdWlyZSgnLi9fbWFwQ2FjaGVHZXQnKSxcbiAgICBtYXBDYWNoZUhhcyA9IHJlcXVpcmUoJy4vX21hcENhY2hlSGFzJyksXG4gICAgbWFwQ2FjaGVTZXQgPSByZXF1aXJlKCcuL19tYXBDYWNoZVNldCcpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXAgY2FjaGUgb2JqZWN0IHRvIHN0b3JlIGtleS12YWx1ZSBwYWlycy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cbiAqL1xuZnVuY3Rpb24gTWFwQ2FjaGUoZW50cmllcykge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGVudHJpZXMgPyBlbnRyaWVzLmxlbmd0aCA6IDA7XG5cbiAgdGhpcy5jbGVhcigpO1xuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gIH1cbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYE1hcENhY2hlYC5cbk1hcENhY2hlLnByb3RvdHlwZS5jbGVhciA9IG1hcENhY2hlQ2xlYXI7XG5NYXBDYWNoZS5wcm90b3R5cGVbJ2RlbGV0ZSddID0gbWFwQ2FjaGVEZWxldGU7XG5NYXBDYWNoZS5wcm90b3R5cGUuZ2V0ID0gbWFwQ2FjaGVHZXQ7XG5NYXBDYWNoZS5wcm90b3R5cGUuaGFzID0gbWFwQ2FjaGVIYXM7XG5NYXBDYWNoZS5wcm90b3R5cGUuc2V0ID0gbWFwQ2FjaGVTZXQ7XG5cbm1vZHVsZS5leHBvcnRzID0gTWFwQ2FjaGU7XG4iLCJ2YXIgZ2V0TmF0aXZlID0gcmVxdWlyZSgnLi9fZ2V0TmF0aXZlJyksXG4gICAgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xudmFyIFByb21pc2UgPSBnZXROYXRpdmUocm9vdCwgJ1Byb21pc2UnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBQcm9taXNlO1xuIiwidmFyIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIFJlZmxlY3QgPSByb290LlJlZmxlY3Q7XG5cbm1vZHVsZS5leHBvcnRzID0gUmVmbGVjdDtcbiIsInZhciBnZXROYXRpdmUgPSByZXF1aXJlKCcuL19nZXROYXRpdmUnKSxcbiAgICByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB0aGF0IGFyZSB2ZXJpZmllZCB0byBiZSBuYXRpdmUuICovXG52YXIgU2V0ID0gZ2V0TmF0aXZlKHJvb3QsICdTZXQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBTZXQ7XG4iLCJ2YXIgTWFwQ2FjaGUgPSByZXF1aXJlKCcuL19NYXBDYWNoZScpLFxuICAgIHNldENhY2hlQWRkID0gcmVxdWlyZSgnLi9fc2V0Q2FjaGVBZGQnKSxcbiAgICBzZXRDYWNoZUhhcyA9IHJlcXVpcmUoJy4vX3NldENhY2hlSGFzJyk7XG5cbi8qKlxuICpcbiAqIENyZWF0ZXMgYW4gYXJyYXkgY2FjaGUgb2JqZWN0IHRvIHN0b3JlIHVuaXF1ZSB2YWx1ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtBcnJheX0gW3ZhbHVlc10gVGhlIHZhbHVlcyB0byBjYWNoZS5cbiAqL1xuZnVuY3Rpb24gU2V0Q2FjaGUodmFsdWVzKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gdmFsdWVzID8gdmFsdWVzLmxlbmd0aCA6IDA7XG5cbiAgdGhpcy5fX2RhdGFfXyA9IG5ldyBNYXBDYWNoZTtcbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB0aGlzLmFkZCh2YWx1ZXNbaW5kZXhdKTtcbiAgfVxufVxuXG4vLyBBZGQgbWV0aG9kcyB0byBgU2V0Q2FjaGVgLlxuU2V0Q2FjaGUucHJvdG90eXBlLmFkZCA9IFNldENhY2hlLnByb3RvdHlwZS5wdXNoID0gc2V0Q2FjaGVBZGQ7XG5TZXRDYWNoZS5wcm90b3R5cGUuaGFzID0gc2V0Q2FjaGVIYXM7XG5cbm1vZHVsZS5leHBvcnRzID0gU2V0Q2FjaGU7XG4iLCJ2YXIgTGlzdENhY2hlID0gcmVxdWlyZSgnLi9fTGlzdENhY2hlJyksXG4gICAgc3RhY2tDbGVhciA9IHJlcXVpcmUoJy4vX3N0YWNrQ2xlYXInKSxcbiAgICBzdGFja0RlbGV0ZSA9IHJlcXVpcmUoJy4vX3N0YWNrRGVsZXRlJyksXG4gICAgc3RhY2tHZXQgPSByZXF1aXJlKCcuL19zdGFja0dldCcpLFxuICAgIHN0YWNrSGFzID0gcmVxdWlyZSgnLi9fc3RhY2tIYXMnKSxcbiAgICBzdGFja1NldCA9IHJlcXVpcmUoJy4vX3N0YWNrU2V0Jyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIHN0YWNrIGNhY2hlIG9iamVjdCB0byBzdG9yZSBrZXktdmFsdWUgcGFpcnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuXG4gKi9cbmZ1bmN0aW9uIFN0YWNrKGVudHJpZXMpIHtcbiAgdGhpcy5fX2RhdGFfXyA9IG5ldyBMaXN0Q2FjaGUoZW50cmllcyk7XG59XG5cbi8vIEFkZCBtZXRob2RzIHRvIGBTdGFja2AuXG5TdGFjay5wcm90b3R5cGUuY2xlYXIgPSBzdGFja0NsZWFyO1xuU3RhY2sucHJvdG90eXBlWydkZWxldGUnXSA9IHN0YWNrRGVsZXRlO1xuU3RhY2sucHJvdG90eXBlLmdldCA9IHN0YWNrR2V0O1xuU3RhY2sucHJvdG90eXBlLmhhcyA9IHN0YWNrSGFzO1xuU3RhY2sucHJvdG90eXBlLnNldCA9IHN0YWNrU2V0O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFN0YWNrO1xuIiwidmFyIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIFN5bWJvbCA9IHJvb3QuU3ltYm9sO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFN5bWJvbDtcbiIsInZhciByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBVaW50OEFycmF5ID0gcm9vdC5VaW50OEFycmF5O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFVpbnQ4QXJyYXk7XG4iLCJ2YXIgZ2V0TmF0aXZlID0gcmVxdWlyZSgnLi9fZ2V0TmF0aXZlJyksXG4gICAgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xudmFyIFdlYWtNYXAgPSBnZXROYXRpdmUocm9vdCwgJ1dlYWtNYXAnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBXZWFrTWFwO1xuIiwiLyoqXG4gKiBBZGRzIHRoZSBrZXktdmFsdWUgYHBhaXJgIHRvIGBtYXBgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gbWFwIFRoZSBtYXAgdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtBcnJheX0gcGFpciBUaGUga2V5LXZhbHVlIHBhaXIgdG8gYWRkLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgbWFwYC5cbiAqL1xuZnVuY3Rpb24gYWRkTWFwRW50cnkobWFwLCBwYWlyKSB7XG4gIC8vIERvbid0IHJldHVybiBgTWFwI3NldGAgYmVjYXVzZSBpdCBkb2Vzbid0IHJldHVybiB0aGUgbWFwIGluc3RhbmNlIGluIElFIDExLlxuICBtYXAuc2V0KHBhaXJbMF0sIHBhaXJbMV0pO1xuICByZXR1cm4gbWFwO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFkZE1hcEVudHJ5O1xuIiwiLyoqXG4gKiBBZGRzIGB2YWx1ZWAgdG8gYHNldGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzZXQgVGhlIHNldCB0byBtb2RpZnkuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBhZGQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBzZXRgLlxuICovXG5mdW5jdGlvbiBhZGRTZXRFbnRyeShzZXQsIHZhbHVlKSB7XG4gIHNldC5hZGQodmFsdWUpO1xuICByZXR1cm4gc2V0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFkZFNldEVudHJ5O1xuIiwiLyoqXG4gKiBBIGZhc3RlciBhbHRlcm5hdGl2ZSB0byBgRnVuY3Rpb24jYXBwbHlgLCB0aGlzIGZ1bmN0aW9uIGludm9rZXMgYGZ1bmNgXG4gKiB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiBgdGhpc0FyZ2AgYW5kIHRoZSBhcmd1bWVudHMgb2YgYGFyZ3NgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBpbnZva2UuXG4gKiBAcGFyYW0geyp9IHRoaXNBcmcgVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAqIEBwYXJhbSB7QXJyYXl9IGFyZ3MgVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgYGZ1bmNgIHdpdGguXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzdWx0IG9mIGBmdW5jYC5cbiAqL1xuZnVuY3Rpb24gYXBwbHkoZnVuYywgdGhpc0FyZywgYXJncykge1xuICB2YXIgbGVuZ3RoID0gYXJncy5sZW5ndGg7XG4gIHN3aXRjaCAobGVuZ3RoKSB7XG4gICAgY2FzZSAwOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcpO1xuICAgIGNhc2UgMTogcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLCBhcmdzWzBdKTtcbiAgICBjYXNlIDI6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgY2FzZSAzOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICB9XG4gIHJldHVybiBmdW5jLmFwcGx5KHRoaXNBcmcsIGFyZ3MpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFwcGx5O1xuIiwiLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uZm9yRWFjaGAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gKi9cbmZ1bmN0aW9uIGFycmF5RWFjaChhcnJheSwgaXRlcmF0ZWUpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheSA/IGFycmF5Lmxlbmd0aCA6IDA7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBpZiAoaXRlcmF0ZWUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpID09PSBmYWxzZSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiBhcnJheTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhcnJheUVhY2g7XG4iLCJ2YXIgYmFzZUluZGV4T2YgPSByZXF1aXJlKCcuL19iYXNlSW5kZXhPZicpO1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5pbmNsdWRlc2AgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gKiBzcGVjaWZ5aW5nIGFuIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBzZWFyY2guXG4gKiBAcGFyYW0geyp9IHRhcmdldCBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdGFyZ2V0YCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBhcnJheUluY2x1ZGVzKGFycmF5LCB2YWx1ZSkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkgPyBhcnJheS5sZW5ndGggOiAwO1xuICByZXR1cm4gISFsZW5ndGggJiYgYmFzZUluZGV4T2YoYXJyYXksIHZhbHVlLCAwKSA+IC0xO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFycmF5SW5jbHVkZXM7XG4iLCIvKipcbiAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSBgYXJyYXlJbmNsdWRlc2AgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBhIGNvbXBhcmF0b3IuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIHNlYXJjaC5cbiAqIEBwYXJhbSB7Kn0gdGFyZ2V0IFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY29tcGFyYXRvciBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB0YXJnZXRgIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGFycmF5SW5jbHVkZXNXaXRoKGFycmF5LCB2YWx1ZSwgY29tcGFyYXRvcikge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5ID8gYXJyYXkubGVuZ3RoIDogMDtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGlmIChjb21wYXJhdG9yKHZhbHVlLCBhcnJheVtpbmRleF0pKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFycmF5SW5jbHVkZXNXaXRoO1xuIiwiLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ubWFwYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWVcbiAqIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBtYXBwZWQgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGFycmF5TWFwKGFycmF5LCBpdGVyYXRlZSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5ID8gYXJyYXkubGVuZ3RoIDogMCxcbiAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICByZXN1bHRbaW5kZXhdID0gaXRlcmF0ZWUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXJyYXlNYXA7XG4iLCIvKipcbiAqIEFwcGVuZHMgdGhlIGVsZW1lbnRzIG9mIGB2YWx1ZXNgIHRvIGBhcnJheWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byBhcHBlbmQuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAqL1xuZnVuY3Rpb24gYXJyYXlQdXNoKGFycmF5LCB2YWx1ZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSB2YWx1ZXMubGVuZ3RoLFxuICAgICAgb2Zmc2V0ID0gYXJyYXkubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgYXJyYXlbb2Zmc2V0ICsgaW5kZXhdID0gdmFsdWVzW2luZGV4XTtcbiAgfVxuICByZXR1cm4gYXJyYXk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXJyYXlQdXNoO1xuIiwiLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ucmVkdWNlYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0geyp9IFthY2N1bXVsYXRvcl0gVGhlIGluaXRpYWwgdmFsdWUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpbml0QWNjdW1dIFNwZWNpZnkgdXNpbmcgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYGFycmF5YCBhc1xuICogIHRoZSBpbml0aWFsIHZhbHVlLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICovXG5mdW5jdGlvbiBhcnJheVJlZHVjZShhcnJheSwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yLCBpbml0QWNjdW0pIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheSA/IGFycmF5Lmxlbmd0aCA6IDA7XG5cbiAgaWYgKGluaXRBY2N1bSAmJiBsZW5ndGgpIHtcbiAgICBhY2N1bXVsYXRvciA9IGFycmF5WysraW5kZXhdO1xuICB9XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgYWNjdW11bGF0b3IgPSBpdGVyYXRlZShhY2N1bXVsYXRvciwgYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpO1xuICB9XG4gIHJldHVybiBhY2N1bXVsYXRvcjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhcnJheVJlZHVjZTtcbiIsIi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLnNvbWVgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZVxuICogc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW55IGVsZW1lbnQgcGFzc2VzIHRoZSBwcmVkaWNhdGUgY2hlY2ssXG4gKiAgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBhcnJheVNvbWUoYXJyYXksIHByZWRpY2F0ZSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5ID8gYXJyYXkubGVuZ3RoIDogMDtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGlmIChwcmVkaWNhdGUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFycmF5U29tZTtcbiIsInZhciBlcSA9IHJlcXVpcmUoJy4vZXEnKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBVc2VkIGJ5IGBfLmRlZmF1bHRzYCB0byBjdXN0b21pemUgaXRzIGBfLmFzc2lnbkluYCB1c2UuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gb2JqVmFsdWUgVGhlIGRlc3RpbmF0aW9uIHZhbHVlLlxuICogQHBhcmFtIHsqfSBzcmNWYWx1ZSBUaGUgc291cmNlIHZhbHVlLlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBhc3NpZ24uXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBwYXJlbnQgb2JqZWN0IG9mIGBvYmpWYWx1ZWAuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgdmFsdWUgdG8gYXNzaWduLlxuICovXG5mdW5jdGlvbiBhc3NpZ25JbkRlZmF1bHRzKG9ialZhbHVlLCBzcmNWYWx1ZSwga2V5LCBvYmplY3QpIHtcbiAgaWYgKG9ialZhbHVlID09PSB1bmRlZmluZWQgfHxcbiAgICAgIChlcShvYmpWYWx1ZSwgb2JqZWN0UHJvdG9ba2V5XSkgJiYgIWhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpKSkge1xuICAgIHJldHVybiBzcmNWYWx1ZTtcbiAgfVxuICByZXR1cm4gb2JqVmFsdWU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXNzaWduSW5EZWZhdWx0cztcbiIsInZhciBlcSA9IHJlcXVpcmUoJy4vZXEnKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBBc3NpZ25zIGB2YWx1ZWAgdG8gYGtleWAgb2YgYG9iamVjdGAgaWYgdGhlIGV4aXN0aW5nIHZhbHVlIGlzIG5vdCBlcXVpdmFsZW50XG4gKiB1c2luZyBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBhc3NpZ24uXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBhc3NpZ24uXG4gKi9cbmZ1bmN0aW9uIGFzc2lnblZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICB2YXIgb2JqVmFsdWUgPSBvYmplY3Rba2V5XTtcbiAgaWYgKCEoaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkgJiYgZXEob2JqVmFsdWUsIHZhbHVlKSkgfHxcbiAgICAgICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmICEoa2V5IGluIG9iamVjdCkpKSB7XG4gICAgb2JqZWN0W2tleV0gPSB2YWx1ZTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFzc2lnblZhbHVlO1xuIiwidmFyIGVxID0gcmVxdWlyZSgnLi9lcScpO1xuXG4vKipcbiAqIEdldHMgdGhlIGluZGV4IGF0IHdoaWNoIHRoZSBga2V5YCBpcyBmb3VuZCBpbiBgYXJyYXlgIG9mIGtleS12YWx1ZSBwYWlycy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNlYXJjaC5cbiAqIEBwYXJhbSB7Kn0ga2V5IFRoZSBrZXkgdG8gc2VhcmNoIGZvci5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gKi9cbmZ1bmN0aW9uIGFzc29jSW5kZXhPZihhcnJheSwga2V5KSB7XG4gIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG4gIHdoaWxlIChsZW5ndGgtLSkge1xuICAgIGlmIChlcShhcnJheVtsZW5ndGhdWzBdLCBrZXkpKSB7XG4gICAgICByZXR1cm4gbGVuZ3RoO1xuICAgIH1cbiAgfVxuICByZXR1cm4gLTE7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXNzb2NJbmRleE9mO1xuIiwidmFyIGNvcHlPYmplY3QgPSByZXF1aXJlKCcuL19jb3B5T2JqZWN0JyksXG4gICAga2V5cyA9IHJlcXVpcmUoJy4va2V5cycpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmFzc2lnbmAgd2l0aG91dCBzdXBwb3J0IGZvciBtdWx0aXBsZSBzb3VyY2VzXG4gKiBvciBgY3VzdG9taXplcmAgZnVuY3Rpb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqL1xuZnVuY3Rpb24gYmFzZUFzc2lnbihvYmplY3QsIHNvdXJjZSkge1xuICByZXR1cm4gb2JqZWN0ICYmIGNvcHlPYmplY3Qoc291cmNlLCBrZXlzKHNvdXJjZSksIG9iamVjdCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUFzc2lnbjtcbiIsInZhciBT
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