From b3b88445e5e6cdd0d215876e979c82409cfca776 Mon Sep 17 00:00:00 2001 From: ryohey Date: Tue, 26 Dec 2017 17:22:38 +0900 Subject: [PATCH] Update builds --- bin/sf2.parser.js | 1593 +++++++------------ bin/sf2.synth.js | 3848 ++++++++++++++++++++------------------------- 2 files changed, 2327 insertions(+), 3114 deletions(-) diff --git a/bin/sf2.parser.js b/bin/sf2.parser.js index 131e753..34b5783 100644 --- a/bin/sf2.parser.js +++ b/bin/sf2.parser.js @@ -1,4 +1,14 @@ -/******/ (function(modules) { // webpackBootstrap +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(); + else if(typeof define === 'function' && define.amd) + define([], factory); + else if(typeof exports === 'object') + exports["parser"] = factory(); + else + root["parser"] = factory(); +})(typeof self !== 'undefined' ? self : this, function() { +return /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ @@ -6,21 +16,21 @@ /******/ function __webpack_require__(moduleId) { /******/ /******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) +/******/ 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 +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ /******/ // Flag the module as loaded -/******/ module.loaded = true; +/******/ module.l = true; /******/ /******/ // Return the exports of the module /******/ return module.exports; @@ -33,997 +43,610 @@ /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { +/******/ configurable: false, +/******/ enumerable: true, +/******/ get: getter +/******/ }); +/******/ } +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ /******/ // __webpack_public_path__ -/******/ __webpack_require__.p = "static"; +/******/ __webpack_require__.p = ""; /******/ /******/ // Load entry module and return exports -/******/ return __webpack_require__(0); +/******/ return __webpack_require__(__webpack_require__.s = 6); /******/ }) /************************************************************************/ /******/ ([ /* 0 */ -/***/ function(module, exports, __webpack_require__) { +/***/ (function(module, exports, __webpack_require__) { - "use strict"; - - Object.defineProperty(exports, "__esModule", { - value: true - }); - - var _sf = __webpack_require__(1); - - Object.keys(_sf).forEach(function (key) { - if (key === "default" || key === "__esModule") return; - Object.defineProperty(exports, key, { - enumerable: true, - get: function get() { - return _sf[key]; - } - }); - }); +"use strict"; -/***/ }, +exports.__esModule = true; +exports.GeneratorEnumeratorTable = [ + 'startAddrsOffset', + 'endAddrsOffset', + 'startloopAddrsOffset', + 'endloopAddrsOffset', + 'startAddrsCoarseOffset', + 'modLfoToPitch', + 'vibLfoToPitch', + 'modEnvToPitch', + 'initialFilterFc', + 'initialFilterQ', + 'modLfoToFilterFc', + 'modEnvToFilterFc', + 'endAddrsCoarseOffset', + 'modLfoToVolume', + undefined, + 'chorusEffectsSend', + 'reverbEffectsSend', + 'pan', + undefined, undefined, undefined, + 'delayModLFO', + 'freqModLFO', + 'delayVibLFO', + 'freqVibLFO', + 'delayModEnv', + 'attackModEnv', + 'holdModEnv', + 'decayModEnv', + 'sustainModEnv', + 'releaseModEnv', + 'keynumToModEnvHold', + 'keynumToModEnvDecay', + 'delayVolEnv', + 'attackVolEnv', + 'holdVolEnv', + 'decayVolEnv', + 'sustainVolEnv', + 'releaseVolEnv', + 'keynumToVolEnvHold', + 'keynumToVolEnvDecay', + 'instrument', + undefined, + 'keyRange', + 'velRange', + 'startloopAddrsCoarseOffset', + 'keynum', + 'velocity', + 'initialAttenuation', + undefined, + 'endloopAddrsCoarseOffset', + 'coarseTune', + 'fineTune', + 'sampleID', + 'sampleModes', + undefined, + 'scaleTuning', + 'exclusiveClass', + 'overridingRootKey' +]; +exports.InfoNameTable = { + ICMT: "comment", + ICOP: "copyright", + ICRD: "creation_date", + IENG: "engineer", + INAM: "name", + IPRD: "product", + ISFT: "software", + ifil: "version", + isng: "sound_engine", + irom: "rom_name", + iver: "rom_version" +}; + + +/***/ }), /* 1 */ -/***/ function(module, exports, __webpack_require__) { +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; - 'use strict'; - - Object.defineProperty(exports, "__esModule", { - value: true - }); - - var _riff = __webpack_require__(2); - - var _riff2 = _interopRequireDefault(_riff); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - /** - * @param {ByteArray} input - * @param {Object=} opt_params - * @constructor - */ - var Parser = function Parser(input, opt_params) { - opt_params = opt_params || {}; - /** @type {ByteArray} */ - this.input = input; - /** @type {(Object|undefined)} */ - this.parserOption = opt_params['parserOption']; - - /** @type {Array.} */ - this.presetHeader; - /** @type {Array.} */ - this.presetZone; - /** @type {Array.} */ - this.presetZoneModulator; - /** @type {Array.} */ - this.presetZoneGenerator; - /** @type {Array.} */ - this.instrument; - /** @type {Array.} */ - this.instrumentZone; - /** @type {Array.} */ - this.instrumentZoneModulator; - /** @type {Array.} */ - this.instrumentZoneGenerator; - /** @type {Array.} */ - this.sampleHeader; - }; - - Parser.prototype.parse = function () { - /** @type {Riff.Parser} */ - var parser = new _riff2.default.Parser(this.input, this.parserOption); - /** @type {?Riff.Chunk} */ - var chunk; - - // parse RIFF chunk - parser.parse(); - if (parser.chunkList.length !== 1) { - throw new Error('wrong chunk length'); - } - - chunk = parser.getChunk(0); - if (chunk === null) { - throw new Error('chunk not found'); - } - - this.parseRiffChunk(chunk); - //console.log(this.sampleHeader); - this.input = null; - }; - - /** - * @param {Riff.Chunk} chunk - */ - Parser.prototype.parseRiffChunk = function (chunk) { - /** @type {Riff.Parser} */ - var parser; - /** @type {ByteArray} */ - var data = this.input; - /** @type {number} */ - var ip = chunk.offset; - /** @type {string} */ - var signature; - - // check parse target - if (chunk.type !== 'RIFF') { - throw new Error('invalid chunk type:' + chunk.type); - } - - // check signature - signature = String.fromCharCode(data[ip++], data[ip++], data[ip++], data[ip++]); - if (signature !== 'sfbk') { - throw new Error('invalid signature:' + signature); - } - - // read structure - parser = new _riff2.default.Parser(data, { 'index': ip, 'length': chunk.size - 4 }); - parser.parse(); - if (parser.getNumberOfChunks() !== 3) { - throw new Error('invalid sfbk structure'); - } - - // INFO-list - this.parseInfoList( /** @type {!Riff.Chunk} */parser.getChunk(0)); - - // sdta-list - this.parseSdtaList( /** @type {!Riff.Chunk} */parser.getChunk(1)); - - // pdta-list - this.parsePdtaList( /** @type {!Riff.Chunk} */parser.getChunk(2)); - }; - - /** - * @param {Riff.Chunk} chunk - */ - Parser.prototype.parseInfoList = function (chunk) { - /** @type {Riff.Parser} */ - var parser; - /** @type {ByteArray} */ - var data = this.input; - /** @type {number} */ - var ip = chunk.offset; - /** @type {string} */ - var signature; - - // check parse target - if (chunk.type !== 'LIST') { - throw new Error('invalid chunk type:' + chunk.type); - } - - // check signature - signature = String.fromCharCode(data[ip++], data[ip++], data[ip++], data[ip++]); - if (signature !== 'INFO') { - throw new Error('invalid signature:' + signature); - } - - // read structure - parser = new _riff2.default.Parser(data, { 'index': ip, 'length': chunk.size - 4 }); - parser.parse(); - }; - - /** - * @param {Riff.Chunk} chunk - */ - Parser.prototype.parseSdtaList = function (chunk) { - /** @type {Riff.Parser} */ - var parser; - /** @type {ByteArray} */ - var data = this.input; - /** @type {number} */ - var ip = chunk.offset; - /** @type {string} */ - var signature; - - // check parse target - if (chunk.type !== 'LIST') { - throw new Error('invalid chunk type:' + chunk.type); - } - - // check signature - signature = String.fromCharCode(data[ip++], data[ip++], data[ip++], data[ip++]); - if (signature !== 'sdta') { - throw new Error('invalid signature:' + signature); - } - - // read structure - parser = new _riff2.default.Parser(data, { 'index': ip, 'length': chunk.size - 4 }); - parser.parse(); - if (parser.chunkList.length !== 1) { - throw new Error('TODO'); - } - this.samplingData = - /** @type {{type: string, size: number, offset: number}} */ - parser.getChunk(0); - }; - - /** - * @param {Riff.Chunk} chunk - */ - Parser.prototype.parsePdtaList = function (chunk) { - /** @type {Riff.Parser} */ - var parser; - /** @type {ByteArray} */ - var data = this.input; - /** @type {number} */ - var ip = chunk.offset; - /** @type {string} */ - var signature; - - // check parse target - if (chunk.type !== 'LIST') { - throw new Error('invalid chunk type:' + chunk.type); - } - - // check signature - signature = String.fromCharCode(data[ip++], data[ip++], data[ip++], data[ip++]); - if (signature !== 'pdta') { - throw new Error('invalid signature:' + signature); - } - - // read structure - parser = new _riff2.default.Parser(data, { 'index': ip, 'length': chunk.size - 4 }); - parser.parse(); - - // check number of chunks - if (parser.getNumberOfChunks() !== 9) { - throw new Error('invalid pdta chunk'); - } - - this.parsePhdr( /** @type {Riff.Chunk} */parser.getChunk(0)); - this.parsePbag( /** @type {Riff.Chunk} */parser.getChunk(1)); - this.parsePmod( /** @type {Riff.Chunk} */parser.getChunk(2)); - this.parsePgen( /** @type {Riff.Chunk} */parser.getChunk(3)); - this.parseInst( /** @type {Riff.Chunk} */parser.getChunk(4)); - this.parseIbag( /** @type {Riff.Chunk} */parser.getChunk(5)); - this.parseImod( /** @type {Riff.Chunk} */parser.getChunk(6)); - this.parseIgen( /** @type {Riff.Chunk} */parser.getChunk(7)); - this.parseShdr( /** @type {Riff.Chunk} */parser.getChunk(8)); - }; - - /** - * @param {Riff.Chunk} chunk - */ - Parser.prototype.parsePhdr = function (chunk) { - /** @type {ByteArray} */ - var data = this.input; - /** @type {number} */ - var ip = chunk.offset; - /** @type {Array.} */ - var presetHeader = this.presetHeader = []; - /** @type {number} */ - var size = chunk.offset + chunk.size; - - // check parse target - if (chunk.type !== 'phdr') { - throw new Error('invalid chunk type:' + chunk.type); - } - - while (ip < size) { - presetHeader.push({ - presetName: String.fromCharCode.apply(null, data.subarray(ip, ip += 20)), - preset: data[ip++] | data[ip++] << 8, - bank: data[ip++] | data[ip++] << 8, - presetBagIndex: data[ip++] | data[ip++] << 8, - library: (data[ip++] | data[ip++] << 8 | data[ip++] << 16 | data[ip++] << 24) >>> 0, - genre: (data[ip++] | data[ip++] << 8 | data[ip++] << 16 | data[ip++] << 24) >>> 0, - morphology: (data[ip++] | data[ip++] << 8 | data[ip++] << 16 | data[ip++] << 24) >>> 0 - }); - } - }; - - /** - * @param {Riff.Chunk} chunk - */ - Parser.prototype.parsePbag = function (chunk) { - /** @type {ByteArray} */ - var data = this.input; - /** @type {number} */ - var ip = chunk.offset; - /** @type {Array.} */ - var presetZone = this.presetZone = []; - /** @type {number} */ - var size = chunk.offset + chunk.size; - - // check parse target - if (chunk.type !== 'pbag') { - throw new Error('invalid chunk type:' + chunk.type); - } - - while (ip < size) { - presetZone.push({ - presetGeneratorIndex: data[ip++] | data[ip++] << 8, - presetModulatorIndex: data[ip++] | data[ip++] << 8 - }); - } - }; - - /** - * @param {Riff.Chunk} chunk - */ - Parser.prototype.parsePmod = function (chunk) { - // check parse target - if (chunk.type !== 'pmod') { - throw new Error('invalid chunk type:' + chunk.type); - } - - this.presetZoneModulator = this.parseModulator(chunk); - }; - - /** - * @param {Riff.Chunk} chunk - */ - Parser.prototype.parsePgen = function (chunk) { - // check parse target - if (chunk.type !== 'pgen') { - throw new Error('invalid chunk type:' + chunk.type); - } - this.presetZoneGenerator = this.parseGenerator(chunk); - }; - - /** - * @param {Riff.Chunk} chunk - */ - Parser.prototype.parseInst = function (chunk) { - /** @type {ByteArray} */ - var data = this.input; - /** @type {number} */ - var ip = chunk.offset; - /** @type {Array.} */ - var instrument = this.instrument = []; - /** @type {number} */ - var size = chunk.offset + chunk.size; - - // check parse target - if (chunk.type !== 'inst') { - throw new Error('invalid chunk type:' + chunk.type); - } - - while (ip < size) { - instrument.push({ - instrumentName: String.fromCharCode.apply(null, data.subarray(ip, ip += 20)), - instrumentBagIndex: data[ip++] | data[ip++] << 8 - }); - } - }; - - /** - * @param {Riff.Chunk} chunk - */ - Parser.prototype.parseIbag = function (chunk) { - /** @type {ByteArray} */ - var data = this.input; - /** @type {number} */ - var ip = chunk.offset; - /** @type {Array.} */ - var instrumentZone = this.instrumentZone = []; - /** @type {number} */ - var size = chunk.offset + chunk.size; - - // check parse target - if (chunk.type !== 'ibag') { - throw new Error('invalid chunk type:' + chunk.type); - } - - while (ip < size) { - instrumentZone.push({ - instrumentGeneratorIndex: data[ip++] | data[ip++] << 8, - instrumentModulatorIndex: data[ip++] | data[ip++] << 8 - }); - } - }; - - /** - * @param {Riff.Chunk} chunk - */ - Parser.prototype.parseImod = function (chunk) { - // check parse target - if (chunk.type !== 'imod') { - throw new Error('invalid chunk type:' + chunk.type); - } - - this.instrumentZoneModulator = this.parseModulator(chunk); - }; - - /** - * @param {Riff.Chunk} chunk - */ - Parser.prototype.parseIgen = function (chunk) { - // check parse target - if (chunk.type !== 'igen') { - throw new Error('invalid chunk type:' + chunk.type); - } - - this.instrumentZoneGenerator = this.parseGenerator(chunk); - }; - - /** - * @param {Riff.Chunk} chunk - */ - Parser.prototype.parseShdr = function (chunk) { - /** @type {ByteArray} */ - var data = this.input; - /** @type {number} */ - var ip = chunk.offset; - /** @type {Array.} */ - var samples = this.sample = []; - /** @type {Array.} */ - var sampleHeader = this.sampleHeader = []; - /** @type {number} */ - var size = chunk.offset + chunk.size; - /** @type {string} */ - var sampleName; - /** @type {number} */ - var start; - /** @type {number} */ - var end; - /** @type {number} */ - var startLoop; - /** @type {number} */ - var endLoop; - /** @type {number} */ - var sampleRate; - /** @type {number} */ - var originalPitch; - /** @type {number} */ - var pitchCorrection; - /** @type {number} */ - var sampleLink; - /** @type {number} */ - var sampleType; - - // check parse target - if (chunk.type !== 'shdr') { - throw new Error('invalid chunk type:' + chunk.type); - } - - while (ip < size) { - sampleName = String.fromCharCode.apply(null, data.subarray(ip, ip += 20)); - start = (data[ip++] << 0 | data[ip++] << 8 | data[ip++] << 16 | data[ip++] << 24) >>> 0; - end = (data[ip++] << 0 | data[ip++] << 8 | data[ip++] << 16 | data[ip++] << 24) >>> 0; - startLoop = (data[ip++] << 0 | data[ip++] << 8 | data[ip++] << 16 | data[ip++] << 24) >>> 0; - endLoop = (data[ip++] << 0 | data[ip++] << 8 | data[ip++] << 16 | data[ip++] << 24) >>> 0; - sampleRate = (data[ip++] << 0 | data[ip++] << 8 | data[ip++] << 16 | data[ip++] << 24) >>> 0; - originalPitch = data[ip++]; - pitchCorrection = data[ip++] << 24 >> 24; - sampleLink = data[ip++] | data[ip++] << 8; - sampleType = data[ip++] | data[ip++] << 8; - - //* - var sample = new Int16Array(new Uint8Array(data.subarray(this.samplingData.offset + start * 2, this.samplingData.offset + end * 2)).buffer); - - startLoop -= start; - endLoop -= start; - - if (sampleRate > 0) { - var adjust = this.adjustSampleData(sample, sampleRate); - sample = adjust.sample; - sampleRate *= adjust.multiply; - startLoop *= adjust.multiply; - endLoop *= adjust.multiply; - } - - samples.push(sample); - //*/ - - sampleHeader.push({ - sampleName: sampleName, - /* - start: start, - end: end, - */ - startLoop: startLoop, - endLoop: endLoop, - sampleRate: sampleRate, - originalPitch: originalPitch, - pitchCorrection: pitchCorrection, - sampleLink: sampleLink, - sampleType: sampleType - }); - } - }; - - Parser.prototype.adjustSampleData = function (sample, sampleRate) { - /** @type {Int16Array} */ - var newSample; - /** @type {number} */ - var i; - /** @type {number} */ - var il; - /** @type {number} */ - var j; - /** @type {number} */ - var multiply = 1; - - // buffer - while (sampleRate < 22050) { - newSample = new Int16Array(sample.length * 2); - for (i = j = 0, il = sample.length; i < il; ++i) { - newSample[j++] = sample[i]; - newSample[j++] = sample[i]; - } - sample = newSample; - multiply *= 2; - sampleRate *= 2; - } - - return { - sample: sample, - multiply: multiply - }; - }; - - /** - * @param {Riff.Chunk} chunk - * @return {Array.} - */ - Parser.prototype.parseModulator = function (chunk) { - /** @type {ByteArray} */ - var data = this.input; - /** @type {number} */ - var ip = chunk.offset; - /** @type {number} */ - var size = chunk.offset + chunk.size; - /** @type {number} */ - var code; - /** @type {string} */ - var key; - /** @type {Array.} */ - var output = []; - - while (ip < size) { - // Src Oper - // TODO - ip += 2; - - // Dest Oper - code = data[ip++] | data[ip++] << 8; - key = Parser.GeneratorEnumeratorTable[code]; - if (key === void 0) { - // Amount - output.push({ - type: key, - value: { - code: code, - amount: data[ip] | data[ip + 1] << 8 << 16 >> 16, - lo: data[ip++], - hi: data[ip++] - } - }); - } else { - // Amount - switch (key) { - case 'keyRange': /* FALLTHROUGH */ - case 'velRange': /* FALLTHROUGH */ - case 'keynum': /* FALLTHROUGH */ - case 'velocity': - output.push({ - type: key, - value: { - lo: data[ip++], - hi: data[ip++] - } - }); - break; - default: - output.push({ - type: key, - value: { - amount: data[ip++] | data[ip++] << 8 << 16 >> 16 - } - }); - break; - } - } - - // AmtSrcOper - // TODO - ip += 2; - - // Trans Oper - // TODO - ip += 2; - } - - return output; - }; - - /** - * @param {Riff.Chunk} chunk - * @return {Array.} - */ - Parser.prototype.parseGenerator = function (chunk) { - /** @type {ByteArray} */ - var data = this.input; - /** @type {number} */ - var ip = chunk.offset; - /** @type {number} */ - var size = chunk.offset + chunk.size; - /** @type {number} */ - var code; - /** @type {string} */ - var key; - /** @type {Array.} */ - var output = []; - - while (ip < size) { - code = data[ip++] | data[ip++] << 8; - key = Parser.GeneratorEnumeratorTable[code]; - if (key === void 0) { - output.push({ - type: key, - value: { - code: code, - amount: data[ip] | data[ip + 1] << 8 << 16 >> 16, - lo: data[ip++], - hi: data[ip++] - } - }); - continue; - } - - switch (key) { - case 'keynum': /* FALLTHROUGH */ - case 'keyRange': /* FALLTHROUGH */ - case 'velRange': /* FALLTHROUGH */ - case 'velocity': - output.push({ - type: key, - value: { - lo: data[ip++], - hi: data[ip++] - } - }); - break; - default: - output.push({ - type: key, - value: { - amount: data[ip++] | data[ip++] << 8 << 16 >> 16 - } - }); - break; - } - } - - return output; - }; - - Parser.prototype.createInstrument = function () { - /** @type {Array.} */ - var instrument = this.instrument; - /** @type {Array.} */ - var zone = this.instrumentZone; - /** @type {Array.} */ - var output = []; - /** @type {number} */ - var bagIndex; - /** @type {number} */ - var bagIndexEnd; - /** @type {Array.} */ - var zoneInfo; - /** @type {{generator: Object, generatorInfo: Array.}} */ - var instrumentGenerator; - /** @type {{modulator: Object, modulatorInfo: Array.}} */ - var instrumentModulator; - /** @type {number} */ - var i; - /** @type {number} */ - var il; - /** @type {number} */ - var j; - /** @type {number} */ - var jl; - - // instrument -> instrument bag -> generator / modulator - for (i = 0, il = instrument.length; i < il; ++i) { - bagIndex = instrument[i].instrumentBagIndex; - bagIndexEnd = instrument[i + 1] ? instrument[i + 1].instrumentBagIndex : zone.length; - zoneInfo = []; - - // instrument bag - for (j = bagIndex, jl = bagIndexEnd; j < jl; ++j) { - instrumentGenerator = this.createInstrumentGenerator_(zone, j); - instrumentModulator = this.createInstrumentModulator_(zone, j); - - zoneInfo.push({ - generator: instrumentGenerator.generator, - generatorSequence: instrumentGenerator.generatorInfo, - modulator: instrumentModulator.modulator, - modulatorSequence: instrumentModulator.modulatorInfo - }); - } - - output.push({ - name: instrument[i].instrumentName, - info: zoneInfo - }); - } - - return output; - }; - - Parser.prototype.createPreset = function () { - /** @type {Array.} */ - var preset = this.presetHeader; - /** @type {Array.} */ - var zone = this.presetZone; - /** @type {Array.} */ - var output = []; - /** @type {number} */ - var bagIndex; - /** @type {number} */ - var bagIndexEnd; - /** @type {Array.} */ - var zoneInfo; - /** @type {number} */ - var instrument; - /** @type {{generator: Object, generatorInfo: Array.}} */ - var presetGenerator; - /** @type {{modulator: Object, modulatorInfo: Array.}} */ - var presetModulator; - /** @type {number} */ - var i; - /** @type {number} */ - var il; - /** @type {number} */ - var j; - /** @type {number} */ - var jl; - - // preset -> preset bag -> generator / modulator - for (i = 0, il = preset.length; i < il; ++i) { - bagIndex = preset[i].presetBagIndex; - bagIndexEnd = preset[i + 1] ? preset[i + 1].presetBagIndex : zone.length; - zoneInfo = []; - - // preset bag - for (j = bagIndex, jl = bagIndexEnd; j < jl; ++j) { - presetGenerator = this.createPresetGenerator_(zone, j); - presetModulator = this.createPresetModulator_(zone, j); - - zoneInfo.push({ - generator: presetGenerator.generator, - generatorSequence: presetGenerator.generatorInfo, - modulator: presetModulator.modulator, - modulatorSequence: presetModulator.modulatorInfo - }); - - instrument = presetGenerator.generator['instrument'] !== void 0 ? presetGenerator.generator['instrument'].amount : presetModulator.modulator['instrument'] !== void 0 ? presetModulator.modulator['instrument'].amount : null; - } - - output.push({ - name: preset[i].presetName, - info: zoneInfo, - header: preset[i], - instrument: instrument - }); - } - - return output; - }; - - /** - * @param {Array.} zone - * @param {number} index - * @returns {{generator: Object, generatorInfo: Array.}} - * @private - */ - Parser.prototype.createInstrumentGenerator_ = function (zone, index) { - var modgen = this.createBagModGen_(zone, zone[index].instrumentGeneratorIndex, zone[index + 1] ? zone[index + 1].instrumentGeneratorIndex : this.instrumentZoneGenerator.length, this.instrumentZoneGenerator); - - return { - generator: modgen.modgen, - generatorInfo: modgen.modgenInfo - }; - }; - - /** - * @param {Array.} zone - * @param {number} index - * @returns {{modulator: Object, modulatorInfo: Array.}} - * @private - */ - Parser.prototype.createInstrumentModulator_ = function (zone, index) { - var modgen = this.createBagModGen_(zone, zone[index].presetModulatorIndex, zone[index + 1] ? zone[index + 1].instrumentModulatorIndex : this.instrumentZoneModulator.length, this.instrumentZoneModulator); - - return { - modulator: modgen.modgen, - modulatorInfo: modgen.modgenInfo - }; - }; - - /** - * @param {Array.} zone - * @param {number} index - * @returns {{generator: Object, generatorInfo: Array.}} - * @private - */ - Parser.prototype.createPresetGenerator_ = function (zone, index) { - var modgen = this.createBagModGen_(zone, zone[index].presetGeneratorIndex, zone[index + 1] ? zone[index + 1].presetGeneratorIndex : this.presetZoneGenerator.length, this.presetZoneGenerator); - - return { - generator: modgen.modgen, - generatorInfo: modgen.modgenInfo - }; - }; - - /** - * @param {Array.} zone - * @param {number} index - * @returns {{modulator: Object, modulatorInfo: Array.}} - * @private - */ - Parser.prototype.createPresetModulator_ = function (zone, index) { - /** @type {{modgen: Object, modgenInfo: Array.}} */ - var modgen = this.createBagModGen_(zone, zone[index].presetModulatorIndex, zone[index + 1] ? zone[index + 1].presetModulatorIndex : this.presetZoneModulator.length, this.presetZoneModulator); - - return { - modulator: modgen.modgen, - modulatorInfo: modgen.modgenInfo - }; - }; - - /** - * @param {Array.} zone - * @param {number} indexStart - * @param {number} indexEnd - * @param zoneModGen - * @returns {{modgen: Object, modgenInfo: Array.}} - * @private - */ - Parser.prototype.createBagModGen_ = function (zone, indexStart, indexEnd, zoneModGen) { - /** @type {Array.} */ - var modgenInfo = []; - /** @type {Object} */ - var modgen = { - unknown: [], - 'keyRange': { - hi: 127, - lo: 0 - } - }; // TODO - /** @type {Object} */ - var info; - /** @type {number} */ - var i; - /** @type {number} */ - var il; - - for (i = indexStart, il = indexEnd; i < il; ++i) { - info = zoneModGen[i]; - modgenInfo.push(info); - - if (info.type === 'unknown') { - modgen.unknown.push(info.value); - } else { - modgen[info.type] = info.value; - } - } - - return { - modgen: modgen, - modgenInfo: modgenInfo - }; - }; - - /** - * @type {Array.} - * @const - */ - Parser.GeneratorEnumeratorTable = ['startAddrsOffset', 'endAddrsOffset', 'startloopAddrsOffset', 'endloopAddrsOffset', 'startAddrsCoarseOffset', 'modLfoToPitch', 'vibLfoToPitch', 'modEnvToPitch', 'initialFilterFc', 'initialFilterQ', 'modLfoToFilterFc', 'modEnvToFilterFc', 'endAddrsCoarseOffset', 'modLfoToVolume',, // 14 - 'chorusEffectsSend', 'reverbEffectsSend', 'pan',,,, // 18,19,20 - 'delayModLFO', 'freqModLFO', 'delayVibLFO', 'freqVibLFO', 'delayModEnv', 'attackModEnv', 'holdModEnv', 'decayModEnv', 'sustainModEnv', 'releaseModEnv', 'keynumToModEnvHold', 'keynumToModEnvDecay', 'delayVolEnv', 'attackVolEnv', 'holdVolEnv', 'decayVolEnv', 'sustainVolEnv', 'releaseVolEnv', 'keynumToVolEnvHold', 'keynumToVolEnvDecay', 'instrument',, // 42 - 'keyRange', 'velRange', 'startloopAddrsCoarseOffset', 'keynum', 'velocity', 'initialAttenuation',, // 49 - 'endloopAddrsCoarseOffset', 'coarseTune', 'fineTune', 'sampleID', 'sampleModes',, // 55 - 'scaleTuning', 'exclusiveClass', 'overridingRootKey']; - - exports.default = Parser; +exports.__esModule = true; +var riff_ts_1 = __webpack_require__(2); +var sf2_data_ts_1 = __webpack_require__(3); +var helper_ts_1 = __webpack_require__(4); +var stream_ts_1 = __webpack_require__(5); +var constants_ts_1 = __webpack_require__(0); +var default_1 = /** @class */ (function () { + function default_1(input, opt_params) { + if (opt_params === void 0) { opt_params = {}; } + this.input = input; + this.parserOption = opt_params.parserOption; + } + default_1.prototype.parse = function () { + var parser = new riff_ts_1.Parser(this.input, this.parserOption); + // parse RIFF chunk + parser.parse(); + if (parser.chunkList.length !== 1) { + throw new Error('wrong chunk length'); + } + var chunk = parser.getChunk(0); + if (chunk === null) { + throw new Error('chunk not found'); + } + this.parseRiffChunk(chunk, this.input); + this.input = null; + }; + default_1.prototype.parseRiffChunk = function (chunk, data) { + var chunkList = getChunkList(chunk, data, "RIFF", "sfbk"); + if (chunkList.length !== 3) { + throw new Error('invalid sfbk structure'); + } + // INFO-list + this.info = parseInfoList(chunkList[0], data); + // sdta-list + this.samplingData = parseSdtaList(chunkList[1], data); + // pdta-list + this.parsePdtaList(chunkList[2], data); + }; + default_1.prototype.parsePdtaList = function (chunk, data) { + var chunkList = getChunkList(chunk, data, "LIST", "pdta"); + // check number of chunks + if (chunkList.length !== 9) { + throw new Error('invalid pdta chunk'); + } + this.presetHeader = parsePhdr(chunkList[0], data); + this.presetZone = parsePbag(chunkList[1], data); + this.presetZoneModulator = parsePmod(chunkList[2], data); + this.presetZoneGenerator = parsePgen(chunkList[3], data); + this.instrument = parseInst(chunkList[4], data); + this.instrumentZone = parseIbag(chunkList[5], data); + this.instrumentZoneModulator = parseImod(chunkList[6], data); + this.instrumentZoneGenerator = parseIgen(chunkList[7], data); + this.sampleHeader = parseShdr(chunkList[8], data); + this.sample = loadSample(this.sampleHeader, this.samplingData.offset, data); + }; + return default_1; +}()); +exports["default"] = default_1; +function getChunkList(chunk, data, expectedType, expectedSignature) { + // check parse target + if (chunk.type !== expectedType) { + throw new Error('invalid chunk type:' + chunk.type); + } + var stream = new stream_ts_1["default"](data, chunk.offset); + // check signature + var signature = stream.readString(4); + if (signature !== expectedSignature) { + throw new Error('invalid signature:' + signature); + } + // read structure + var parser = new riff_ts_1.Parser(data, { 'index': stream.ip, 'length': chunk.size - 4 }); + parser.parse(); + return parser.chunkList; +} +function parseInfoList(chunk, data) { + var info = {}; + var chunkList = getChunkList(chunk, data, "LIST", "INFO"); + for (var _i = 0, chunkList_1 = chunkList; _i < chunkList_1.length; _i++) { + var p = chunkList_1[_i]; + var offset = p.offset, size = p.size, type = p.type; + var name_1 = constants_ts_1.InfoNameTable[type] || type; + info[name_1] = helper_ts_1.readString(data, offset, offset + size); + } + return info; +} +function parseSdtaList(chunk, data) { + var chunkList = getChunkList(chunk, data, "LIST", "sdta"); + if (chunkList.length !== 1) { + throw new Error('TODO'); + } + return chunkList[0]; +} +function parseChunk(chunk, data, type, factory) { + var result = []; + if (chunk.type !== type) { + throw new Error('invalid chunk type:' + chunk.type); + } + var stream = new stream_ts_1["default"](data, chunk.offset); + var size = chunk.offset + chunk.size; + while (stream.ip < size) { + result.push(factory(stream)); + } + return result; +} +var parsePhdr = function (chunk, data) { return parseChunk(chunk, data, "phdr", function (stream) { return sf2_data_ts_1.PresetHeader.parse(stream); }); }; +var parsePbag = function (chunk, data) { return parseChunk(chunk, data, "pbag", function (stream) { return sf2_data_ts_1.PresetBag.parse(stream); }); }; +var parseInst = function (chunk, data) { return parseChunk(chunk, data, "inst", function (stream) { return sf2_data_ts_1.Instrument.parse(stream); }); }; +var parseIbag = function (chunk, data) { return parseChunk(chunk, data, "ibag", function (stream) { return sf2_data_ts_1.InstrumentBag.parse(stream); }); }; +var parsePmod = function (chunk, data) { return parseChunk(chunk, data, "pmod", function (stream) { return sf2_data_ts_1.ModulatorList.parse(stream); }); }; +var parseImod = function (chunk, data) { return parseChunk(chunk, data, "imod", function (stream) { return sf2_data_ts_1.ModulatorList.parse(stream); }); }; +var parsePgen = function (chunk, data) { return parseChunk(chunk, data, "pgen", function (stream) { return sf2_data_ts_1.GeneratorList.parse(stream); }); }; +var parseIgen = function (chunk, data) { return parseChunk(chunk, data, "igen", function (stream) { return sf2_data_ts_1.GeneratorList.parse(stream); }); }; +var parseShdr = function (chunk, data) { return parseChunk(chunk, data, "shdr", function (stream) { return sf2_data_ts_1.Sample.parse(stream); }); }; +function adjustSampleData(sample, sampleRate) { + var multiply = 1; + // buffer + while (sampleRate < 22050) { + var newSample = new Int16Array(sample.length * 2); + for (var i = 0, j = 0, il = sample.length; i < il; ++i) { + newSample[j++] = sample[i]; + newSample[j++] = sample[i]; + } + sample = newSample; + multiply *= 2; + sampleRate *= 2; + } + return { + sample: sample, + multiply: multiply + }; +} +function loadSample(sampleHeader, samplingDataOffset, data) { + var samples = []; + for (var _i = 0, sampleHeader_1 = sampleHeader; _i < sampleHeader_1.length; _i++) { + var header = sampleHeader_1[_i]; + var sample = new Int16Array(new Uint8Array(data.subarray(samplingDataOffset + header.start * 2, samplingDataOffset + header.end * 2)).buffer); + if (header.sampleRate > 0) { + var adjust = adjustSampleData(sample, header.sampleRate); + sample = adjust.sample; + header.sampleRate *= adjust.multiply; + header.startLoop *= adjust.multiply; + header.endLoop *= adjust.multiply; + } + samples.push(sample); + } + return samples; +} -/***/ }, + +/***/ }), /* 2 */ -/***/ function(module, exports) { +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +exports.__esModule = true; +var Parser = /** @class */ (function () { + function Parser(input, opt_params) { + if (opt_params === void 0) { opt_params = {}; } + this.chunkList = []; + this.input = input; + this.ip = opt_params['index'] || 0; + this.length = opt_params['length'] || input.length - this.ip; + this.chunkList = []; + this.offset = this.ip; + this.padding = + opt_params['padding'] !== void 0 ? opt_params['padding'] : true; + this.bigEndian = + opt_params['bigEndian'] !== void 0 ? opt_params['bigEndian'] : false; + } + Parser.prototype.parse = function () { + var length = this.length + this.offset; + this.chunkList = []; + while (this.ip < length) { + this.parseChunk(); + } + }; + Parser.prototype.parseChunk = function () { + var input = this.input; + var ip = this.ip; + var size; + this.chunkList.push(new Chunk(String.fromCharCode(input[ip++], input[ip++], input[ip++], input[ip++]), (size = this.bigEndian ? + ((input[ip++] << 24) | (input[ip++] << 16) | + (input[ip++] << 8) | (input[ip++])) >>> 0 : + ((input[ip++]) | (input[ip++] << 8) | + (input[ip++] << 16) | (input[ip++] << 24)) >>> 0), ip)); + ip += size; + // padding + if (this.padding && ((ip - this.offset) & 1) === 1) { + ip++; + } + this.ip = ip; + }; + Parser.prototype.getChunk = function (index) { + var chunk = this.chunkList[index]; + if (chunk === void 0) { + return null; + } + return chunk; + }; + Parser.prototype.getNumberOfChunks = function () { + return this.chunkList.length; + }; + return Parser; +}()); +exports.Parser = Parser; +var Chunk = /** @class */ (function () { + function Chunk(type, size, offset) { + this.type = type; + this.size = size; + this.offset = offset; + } + return Chunk; +}()); +exports.Chunk = Chunk; + + +/***/ }), +/* 3 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +exports.__esModule = true; +var constants_ts_1 = __webpack_require__(0); +var VersionTag = /** @class */ (function () { + function VersionTag() { + } + return VersionTag; +}()); +exports.VersionTag = VersionTag; +var PresetHeader = /** @class */ (function () { + function PresetHeader() { + } + PresetHeader.parse = function (stream) { + var p = new PresetHeader(); + p.presetName = stream.readString(20); + p.preset = stream.readWORD(); + p.bank = stream.readWORD(); + p.presetBagIndex = stream.readWORD(); + p.library = stream.readDWORD(); + p.genre = stream.readDWORD(); + p.morphology = stream.readDWORD(); + return p; + }; + return PresetHeader; +}()); +exports.PresetHeader = PresetHeader; +var PresetBag = /** @class */ (function () { + function PresetBag() { + } + PresetBag.parse = function (stream) { + var p = new PresetBag(); + p.presetGeneratorIndex = stream.readWORD(); + p.presetModulatorIndex = stream.readWORD(); + return p; + }; + return PresetBag; +}()); +exports.PresetBag = PresetBag; +var ModulatorList = /** @class */ (function () { + function ModulatorList() { + } + ModulatorList.parse = function (stream) { + var t = new ModulatorList(); + t.sourceOper = stream.readWORD(); + var code = stream.readWORD(); + t.destinationOper = code; + var key = constants_ts_1.GeneratorEnumeratorTable[code]; + t.type = key; + if (key === void 0) { + // Amount + t.value = { + code: code, + amount: stream.readInt16() + }; + } + else { + // Amount + switch (key) { + case 'keyRange': /* FALLTHROUGH */ + case 'velRange': /* FALLTHROUGH */ + case 'keynum': /* FALLTHROUGH */ + case 'velocity': + t.value = { + lo: stream.readByte(), + hi: stream.readByte() + }; + break; + default: + t.value = { + amount: stream.readInt16() + }; + break; + } + } + t.amountSourceOper = stream.readWORD(); + t.transOper = stream.readWORD(); + return t; + }; + return ModulatorList; +}()); +exports.ModulatorList = ModulatorList; +var GeneratorList = /** @class */ (function () { + function GeneratorList() { + } + GeneratorList.parse = function (stream) { + var t = new ModulatorList(); + var code = stream.readWORD(); + var key = constants_ts_1.GeneratorEnumeratorTable[code]; + t.type = key; + if (key === void 0) { + t.value = { + code: code, + amount: stream.readInt16() + }; + } + else { + switch (key) { + case 'keynum': /* FALLTHROUGH */ + case 'keyRange': /* FALLTHROUGH */ + case 'velRange': /* FALLTHROUGH */ + case 'velocity': + t.value = { + lo: stream.readByte(), + hi: stream.readByte() + }; + break; + default: + t.value = { + amount: stream.readInt16() + }; + break; + } + } + return t; + }; + return GeneratorList; +}()); +exports.GeneratorList = GeneratorList; +var Instrument = /** @class */ (function () { + function Instrument() { + } + Instrument.parse = function (stream) { + var t = new Instrument(); + t.instrumentName = stream.readString(20); + t.instrumentBagIndex = stream.readWORD(); + return t; + }; + return Instrument; +}()); +exports.Instrument = Instrument; +var InstrumentBag = /** @class */ (function () { + function InstrumentBag() { + } + InstrumentBag.parse = function (stream) { + var t = new InstrumentBag(); + t.instrumentGeneratorIndex = stream.readWORD(); + t.instrumentModulatorIndex = stream.readWORD(); + return t; + }; + return InstrumentBag; +}()); +exports.InstrumentBag = InstrumentBag; +var Sample = /** @class */ (function () { + function Sample() { + } + Sample.parse = function (stream) { + var s = new Sample(); + s.sampleName = stream.readString(20); + s.start = stream.readDWORD(); + s.end = stream.readDWORD(); + s.startLoop = stream.readDWORD(); + s.endLoop = stream.readDWORD(); + s.sampleRate = stream.readDWORD(); + s.originalPitch = stream.readByte(); + s.pitchCorrection = stream.readInt8(); + s.sampleLink = stream.readWORD(); + s.sampleType = stream.readWORD(); + s.startLoop -= s.start; + s.endLoop -= s.start; + return s; + }; + return Sample; +}()); +exports.Sample = Sample; +/** + * @enum {number} + */ +exports.SampleLink = { + monoSample: 1, + rightSample: 2, + leftSample: 4, + linkedSample: 8, + RomMonoSample: 0x8001, + RomRightSample: 0x8002, + RomLeftSample: 0x8004, + RomLinkedSample: 0x8008 +}; + + +/***/ }), +/* 4 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +exports.__esModule = true; +function readString(data, start, end) { + var str = String.fromCharCode.apply(null, data.subarray(start, end)); + var nullLocation = str.indexOf("\u0000"); + if (nullLocation > 0) { + return str.substr(0, nullLocation); + } + return str; +} +exports.readString = readString; + + +/***/ }), +/* 5 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +exports.__esModule = true; +var Stream = /** @class */ (function () { + function Stream(data, offset) { + this.data = data; + this.ip = offset; + } + Stream.prototype.readString = function (size) { + var str = String.fromCharCode.apply(null, this.data.subarray(this.ip, this.ip += size)); + var nullLocation = str.indexOf("\u0000"); + if (nullLocation > 0) { + return str.substr(0, nullLocation); + } + return str; + }; + Stream.prototype.readWORD = function () { + return this.data[this.ip++] | (this.data[this.ip++] << 8); + }; + Stream.prototype.readDWORD = function () { + return (this.data[this.ip++] | + (this.data[this.ip++] << 8) | + (this.data[this.ip++] << 16) | + (this.data[this.ip++] << 24)) >>> 0; + }; + Stream.prototype.readByte = function () { + return this.data[this.ip++]; + }; + Stream.prototype.readAt = function (offset) { + return this.data[this.ip + offset]; + }; + /* helper */ + Stream.prototype.readUInt8 = function () { + return this.readByte(); + }; + Stream.prototype.readInt8 = function () { + return (this.readByte() << 24) >> 24; + }; + Stream.prototype.readUInt16 = function () { + return this.readWORD(); + }; + Stream.prototype.readInt16 = function () { + return (this.readWORD() << 16) >> 16; + }; + Stream.prototype.readUInt32 = function () { + return this.readDWORD(); + }; + return Stream; +}()); +exports["default"] = Stream; + + +/***/ }), +/* 6 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__src_sf2_ts__ = __webpack_require__(1); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__src_sf2_ts___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0__src_sf2_ts__); - 'use strict'; - - Object.defineProperty(exports, "__esModule", { - value: true - }); - var Riff = {}; - - /** - * @param {ByteArray} input input buffer. - * @param {Object=} opt_params option parameters. - * @constructor - */ - Riff.Parser = function (input, opt_params) { - opt_params = opt_params || {}; - /** @type {ByteArray} */ - this.input = input; - /** @type {number} */ - this.ip = opt_params['index'] || 0; - /** @type {number} */ - this.length = opt_params['length'] || input.length - this.ip; - /** @type {Array.} */ - this.chunkList; - /** @type {number} */ - this.offset = this.ip; - /** @type {boolean} */ - this.padding = opt_params['padding'] !== void 0 ? opt_params['padding'] : true; - /** @type {boolean} */ - this.bigEndian = opt_params['bigEndian'] !== void 0 ? opt_params['bigEndian'] : false; - }; - - /** - * @param {string} type - * @param {number} size - * @param {number} offset - * @constructor - */ - Riff.Chunk = function (type, size, offset) { - /** @type {string} */ - this.type = type; - /** @type {number} */ - this.size = size; - /** @type {number} */ - this.offset = offset; - }; - - Riff.Parser.prototype.parse = function () { - /** @type {number} */ - var length = this.length + this.offset; - - this.chunkList = []; - - while (this.ip < length) { - this.parseChunk(); - } - }; - - Riff.Parser.prototype.parseChunk = function () { - /** @type {ByteArray} */ - var input = this.input; - /** @type {number} */ - var ip = this.ip; - /** @type {number} */ - var size; - - this.chunkList.push(new Riff.Chunk(String.fromCharCode(input[ip++], input[ip++], input[ip++], input[ip++]), size = this.bigEndian ? (input[ip++] << 24 | input[ip++] << 16 | input[ip++] << 8 | input[ip++]) >>> 0 : (input[ip++] | input[ip++] << 8 | input[ip++] << 16 | input[ip++] << 24) >>> 0, ip)); - - ip += size; - - // padding - if (this.padding && (ip - this.offset & 1) === 1) { - ip++; - } - - this.ip = ip; - }; - - /** - * @param {number} index chunk index. - * @return {?Riff.Chunk} - */ - Riff.Parser.prototype.getChunk = function (index) { - /** @type {Riff.Chunk} */ - var chunk = this.chunkList[index]; - - if (chunk === void 0) { - return null; - } - - return chunk; - }; - - /** - * @return {number} - */ - Riff.Parser.prototype.getNumberOfChunks = function () { - return this.chunkList.length; - }; - - exports.default = Riff; +/* harmony default export */ __webpack_exports__["default"] = (__WEBPACK_IMPORTED_MODULE_0__src_sf2_ts___default.a); -/***/ } +/***/ }) /******/ ]); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAgM2E3YTZiZGVkYmY2M2VlNWI1ZWQiLCJ3ZWJwYWNrOi8vLy4vZXhwb3J0L3BhcnNlci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvc2YyLmpzIiwid2VicGFjazovLy8uL3NyYy9yaWZmLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx1QkFBZTtBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7QUN0Q0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEk7Ozs7Ozs7Ozs7OztBQ0FBOzs7Ozs7QUFFQTs7Ozs7QUFLQSxLQUFNLFNBQVMsU0FBVCxNQUFTLENBQVMsS0FBVCxFQUFnQixVQUFoQixFQUE0QjtBQUN6QyxnQkFBYSxjQUFjLEVBQTNCO0FBQ0E7QUFDQSxRQUFLLEtBQUwsR0FBYSxLQUFiO0FBQ0E7QUFDQSxRQUFLLFlBQUwsR0FBb0IsV0FBVyxjQUFYLENBQXBCOztBQUVBO0FBQ0EsUUFBSyxZQUFMO0FBQ0E7QUFDQSxRQUFLLFVBQUw7QUFDQTtBQUNBLFFBQUssbUJBQUw7QUFDQTtBQUNBLFFBQUssbUJBQUw7QUFDQTtBQUNBLFFBQUssVUFBTDtBQUNBO0FBQ0EsUUFBSyxjQUFMO0FBQ0E7QUFDQSxRQUFLLHVCQUFMO0FBQ0E7QUFDQSxRQUFLLHVCQUFMO0FBQ0E7QUFDQSxRQUFLLFlBQUw7QUFDRCxFQXpCRDs7QUEyQkEsUUFBTyxTQUFQLENBQWlCLEtBQWpCLEdBQXlCLFlBQVc7QUFDbEM7QUFDQSxPQUFJLFNBQVMsSUFBSSxlQUFLLE1BQVQsQ0FBZ0IsS0FBSyxLQUFyQixFQUE0QixLQUFLLFlBQWpDLENBQWI7QUFDQTtBQUNBLE9BQUksS0FBSjs7QUFFQTtBQUNBLFVBQU8sS0FBUDtBQUNBLE9BQUksT0FBTyxTQUFQLENBQWlCLE1BQWpCLEtBQTRCLENBQWhDLEVBQW1DO0FBQ2pDLFdBQU0sSUFBSSxLQUFKLENBQVUsb0JBQVYsQ0FBTjtBQUNEOztBQUVELFdBQVEsT0FBTyxRQUFQLENBQWdCLENBQWhCLENBQVI7QUFDQSxPQUFJLFVBQVUsSUFBZCxFQUFvQjtBQUNsQixXQUFNLElBQUksS0FBSixDQUFVLGlCQUFWLENBQU47QUFDRDs7QUFFRCxRQUFLLGNBQUwsQ0FBb0IsS0FBcEI7QUFDRjtBQUNFLFFBQUssS0FBTCxHQUFhLElBQWI7QUFDRCxFQXBCRDs7QUFzQkE7OztBQUdBLFFBQU8sU0FBUCxDQUFpQixjQUFqQixHQUFrQyxVQUFTLEtBQVQsRUFBZ0I7QUFDaEQ7QUFDQSxPQUFJLE1BQUo7QUFDQTtBQUNBLE9BQUksT0FBTyxLQUFLLEtBQWhCO0FBQ0E7QUFDQSxPQUFJLEtBQUssTUFBTSxNQUFmO0FBQ0E7QUFDQSxPQUFJLFNBQUo7O0FBRUE7QUFDQSxPQUFJLE1BQU0sSUFBTixLQUFlLE1BQW5CLEVBQTJCO0FBQ3pCLFdBQU0sSUFBSSxLQUFKLENBQVUsd0JBQXdCLE1BQU0sSUFBeEMsQ0FBTjtBQUNEOztBQUVEO0FBQ0EsZUFBWSxPQUFPLFlBQVAsQ0FBb0IsS0FBSyxJQUFMLENBQXBCLEVBQWdDLEtBQUssSUFBTCxDQUFoQyxFQUE0QyxLQUFLLElBQUwsQ0FBNUMsRUFBd0QsS0FBSyxJQUFMLENBQXhELENBQVo7QUFDQSxPQUFJLGNBQWMsTUFBbEIsRUFBMEI7QUFDeEIsV0FBTSxJQUFJLEtBQUosQ0FBVSx1QkFBdUIsU0FBakMsQ0FBTjtBQUNEOztBQUVEO0FBQ0EsWUFBUyxJQUFJLGVBQUssTUFBVCxDQUFnQixJQUFoQixFQUFzQixFQUFDLFNBQVMsRUFBVixFQUFjLFVBQVUsTUFBTSxJQUFOLEdBQWEsQ0FBckMsRUFBdEIsQ0FBVDtBQUNBLFVBQU8sS0FBUDtBQUNBLE9BQUksT0FBTyxpQkFBUCxPQUErQixDQUFuQyxFQUFzQztBQUNwQyxXQUFNLElBQUksS0FBSixDQUFVLHdCQUFWLENBQU47QUFDRDs7QUFFRDtBQUNBLFFBQUssYUFBTCxFQUFtQiwwQkFBMkIsT0FBTyxRQUFQLENBQWdCLENBQWhCLENBQTlDOztBQUVBO0FBQ0EsUUFBSyxhQUFMLEVBQW1CLDBCQUEyQixPQUFPLFFBQVAsQ0FBZ0IsQ0FBaEIsQ0FBOUM7O0FBRUE7QUFDQSxRQUFLLGFBQUwsRUFBbUIsMEJBQTJCLE9BQU8sUUFBUCxDQUFnQixDQUFoQixDQUE5QztBQUNELEVBcENEOztBQXNDQTs7O0FBR0EsUUFBTyxTQUFQLENBQWlCLGFBQWpCLEdBQWlDLFVBQVMsS0FBVCxFQUFnQjtBQUMvQztBQUNBLE9BQUksTUFBSjtBQUNBO0FBQ0EsT0FBSSxPQUFPLEtBQUssS0FBaEI7QUFDQTtBQUNBLE9BQUksS0FBSyxNQUFNLE1BQWY7QUFDQTtBQUNBLE9BQUksU0FBSjs7QUFFQTtBQUNBLE9BQUksTUFBTSxJQUFOLEtBQWUsTUFBbkIsRUFBMkI7QUFDekIsV0FBTSxJQUFJLEtBQUosQ0FBVSx3QkFBd0IsTUFBTSxJQUF4QyxDQUFOO0FBQ0Q7O0FBRUQ7QUFDQSxlQUFZLE9BQU8sWUFBUCxDQUFvQixLQUFLLElBQUwsQ0FBcEIsRUFBZ0MsS0FBSyxJQUFMLENBQWhDLEVBQTRDLEtBQUssSUFBTCxDQUE1QyxFQUF3RCxLQUFLLElBQUwsQ0FBeEQsQ0FBWjtBQUNBLE9BQUksY0FBYyxNQUFsQixFQUEwQjtBQUN4QixXQUFNLElBQUksS0FBSixDQUFVLHVCQUF1QixTQUFqQyxDQUFOO0FBQ0Q7O0FBRUQ7QUFDQSxZQUFTLElBQUksZUFBSyxNQUFULENBQWdCLElBQWhCLEVBQXNCLEVBQUMsU0FBUyxFQUFWLEVBQWMsVUFBVSxNQUFNLElBQU4sR0FBYSxDQUFyQyxFQUF0QixDQUFUO0FBQ0EsVUFBTyxLQUFQO0FBQ0QsRUF4QkQ7O0FBMEJBOzs7QUFHQSxRQUFPLFNBQVAsQ0FBaUIsYUFBakIsR0FBaUMsVUFBUyxLQUFULEVBQWdCO0FBQy9DO0FBQ0EsT0FBSSxNQUFKO0FBQ0E7QUFDQSxPQUFJLE9BQU8sS0FBSyxLQUFoQjtBQUNBO0FBQ0EsT0FBSSxLQUFLLE1BQU0sTUFBZjtBQUNBO0FBQ0EsT0FBSSxTQUFKOztBQUVBO0FBQ0EsT0FBSSxNQUFNLElBQU4sS0FBZSxNQUFuQixFQUEyQjtBQUN6QixXQUFNLElBQUksS0FBSixDQUFVLHdCQUF3QixNQUFNLElBQXhDLENBQU47QUFDRDs7QUFFRDtBQUNBLGVBQVksT0FBTyxZQUFQLENBQW9CLEtBQUssSUFBTCxDQUFwQixFQUFnQyxLQUFLLElBQUwsQ0FBaEMsRUFBNEMsS0FBSyxJQUFMLENBQTVDLEVBQXdELEtBQUssSUFBTCxDQUF4RCxDQUFaO0FBQ0EsT0FBSSxjQUFjLE1BQWxCLEVBQTBCO0FBQ3hCLFdBQU0sSUFBSSxLQUFKLENBQVUsdUJBQXVCLFNBQWpDLENBQU47QUFDRDs7QUFFRDtBQUNBLFlBQVMsSUFBSSxlQUFLLE1BQVQsQ0FBZ0IsSUFBaEIsRUFBc0IsRUFBQyxTQUFTLEVBQVYsRUFBYyxVQUFVLE1BQU0sSUFBTixHQUFhLENBQXJDLEVBQXRCLENBQVQ7QUFDQSxVQUFPLEtBQVA7QUFDQSxPQUFJLE9BQU8sU0FBUCxDQUFpQixNQUFqQixLQUE0QixDQUFoQyxFQUFtQztBQUNqQyxXQUFNLElBQUksS0FBSixDQUFVLE1BQVYsQ0FBTjtBQUNEO0FBQ0QsUUFBSyxZQUFMO0FBQ0U7QUFDQyxVQUFPLFFBQVAsQ0FBZ0IsQ0FBaEIsQ0FGSDtBQUdELEVBOUJEOztBQWdDQTs7O0FBR0EsUUFBTyxTQUFQLENBQWlCLGFBQWpCLEdBQWlDLFVBQVMsS0FBVCxFQUFnQjtBQUMvQztBQUNBLE9BQUksTUFBSjtBQUNBO0FBQ0EsT0FBSSxPQUFPLEtBQUssS0FBaEI7QUFDQTtBQUNBLE9BQUksS0FBSyxNQUFNLE1BQWY7QUFDQTtBQUNBLE9BQUksU0FBSjs7QUFFQTtBQUNBLE9BQUksTUFBTSxJQUFOLEtBQWUsTUFBbkIsRUFBMkI7QUFDekIsV0FBTSxJQUFJLEtBQUosQ0FBVSx3QkFBd0IsTUFBTSxJQUF4QyxDQUFOO0FBQ0Q7O0FBRUQ7QUFDQSxlQUFZLE9BQU8sWUFBUCxDQUFvQixLQUFLLElBQUwsQ0FBcEIsRUFBZ0MsS0FBSyxJQUFMLENBQWhDLEVBQTRDLEtBQUssSUFBTCxDQUE1QyxFQUF3RCxLQUFLLElBQUwsQ0FBeEQsQ0FBWjtBQUNBLE9BQUksY0FBYyxNQUFsQixFQUEwQjtBQUN4QixXQUFNLElBQUksS0FBSixDQUFVLHVCQUF1QixTQUFqQyxDQUFOO0FBQ0Q7O0FBRUQ7QUFDQSxZQUFTLElBQUksZUFBSyxNQUFULENBQWdCLElBQWhCLEVBQXNCLEVBQUMsU0FBUyxFQUFWLEVBQWMsVUFBVSxNQUFNLElBQU4sR0FBYSxDQUFyQyxFQUF0QixDQUFUO0FBQ0EsVUFBTyxLQUFQOztBQUVBO0FBQ0EsT0FBSSxPQUFPLGlCQUFQLE9BQStCLENBQW5DLEVBQXNDO0FBQ3BDLFdBQU0sSUFBSSxLQUFKLENBQVUsb0JBQVYsQ0FBTjtBQUNEOztBQUVELFFBQUssU0FBTCxFQUFlLHlCQUEwQixPQUFPLFFBQVAsQ0FBZ0IsQ0FBaEIsQ0FBekM7QUFDQSxRQUFLLFNBQUwsRUFBZSx5QkFBMEIsT0FBTyxRQUFQLENBQWdCLENBQWhCLENBQXpDO0FBQ0EsUUFBSyxTQUFMLEVBQWUseUJBQTBCLE9BQU8sUUFBUCxDQUFnQixDQUFoQixDQUF6QztBQUNBLFFBQUssU0FBTCxFQUFlLHlCQUEwQixPQUFPLFFBQVAsQ0FBZ0IsQ0FBaEIsQ0FBekM7QUFDQSxRQUFLLFNBQUwsRUFBZSx5QkFBMEIsT0FBTyxRQUFQLENBQWdCLENBQWhCLENBQXpDO0FBQ0EsUUFBSyxTQUFMLEVBQWUseUJBQTBCLE9BQU8sUUFBUCxDQUFnQixDQUFoQixDQUF6QztBQUNBLFFBQUssU0FBTCxFQUFlLHlCQUEwQixPQUFPLFFBQVAsQ0FBZ0IsQ0FBaEIsQ0FBekM7QUFDQSxRQUFLLFNBQUwsRUFBZSx5QkFBMEIsT0FBTyxRQUFQLENBQWdCLENBQWhCLENBQXpDO0FBQ0EsUUFBSyxTQUFMLEVBQWUseUJBQTBCLE9BQU8sUUFBUCxDQUFnQixDQUFoQixDQUF6QztBQUNELEVBdkNEOztBQXlDQTs7O0FBR0EsUUFBTyxTQUFQLENBQWlCLFNBQWpCLEdBQTZCLFVBQVMsS0FBVCxFQUFnQjtBQUMzQztBQUNBLE9BQUksT0FBTyxLQUFLLEtBQWhCO0FBQ0E7QUFDQSxPQUFJLEtBQUssTUFBTSxNQUFmO0FBQ0E7QUFDQSxPQUFJLGVBQWUsS0FBSyxZQUFMLEdBQW9CLEVBQXZDO0FBQ0E7QUFDQSxPQUFJLE9BQU8sTUFBTSxNQUFOLEdBQWUsTUFBTSxJQUFoQzs7QUFFQTtBQUNBLE9BQUksTUFBTSxJQUFOLEtBQWUsTUFBbkIsRUFBMkI7QUFDekIsV0FBTSxJQUFJLEtBQUosQ0FBVSx3QkFBd0IsTUFBTSxJQUF4QyxDQUFOO0FBQ0Q7O0FBRUQsVUFBTyxLQUFLLElBQVosRUFBa0I7QUFDaEIsa0JBQWEsSUFBYixDQUFrQjtBQUNoQixtQkFBWSxPQUFPLFlBQVAsQ0FBb0IsS0FBcEIsQ0FBMEIsSUFBMUIsRUFBZ0MsS0FBSyxRQUFMLENBQWMsRUFBZCxFQUFrQixNQUFNLEVBQXhCLENBQWhDLENBREk7QUFFaEIsZUFBUSxLQUFLLElBQUwsSUFBYyxLQUFLLElBQUwsS0FBYyxDQUZwQjtBQUdoQixhQUFNLEtBQUssSUFBTCxJQUFjLEtBQUssSUFBTCxLQUFjLENBSGxCO0FBSWhCLHVCQUFnQixLQUFLLElBQUwsSUFBYyxLQUFLLElBQUwsS0FBYyxDQUo1QjtBQUtoQixnQkFBUyxDQUFDLEtBQUssSUFBTCxJQUFjLEtBQUssSUFBTCxLQUFjLENBQTVCLEdBQWtDLEtBQUssSUFBTCxLQUFjLEVBQWhELEdBQXVELEtBQUssSUFBTCxLQUFjLEVBQXRFLE1BQStFLENBTHhFO0FBTWhCLGNBQU8sQ0FBQyxLQUFLLElBQUwsSUFBYyxLQUFLLElBQUwsS0FBYyxDQUE1QixHQUFrQyxLQUFLLElBQUwsS0FBYyxFQUFoRCxHQUF1RCxLQUFLLElBQUwsS0FBYyxFQUF0RSxNQUErRSxDQU50RTtBQU9oQixtQkFBWSxDQUFDLEtBQUssSUFBTCxJQUFjLEtBQUssSUFBTCxLQUFjLENBQTVCLEdBQWtDLEtBQUssSUFBTCxLQUFjLEVBQWhELEdBQXVELEtBQUssSUFBTCxLQUFjLEVBQXRFLE1BQStFO0FBUDNFLE1BQWxCO0FBU0Q7QUFDRixFQTFCRDs7QUE0QkE7OztBQUdBLFFBQU8sU0FBUCxDQUFpQixTQUFqQixHQUE2QixVQUFTLEtBQVQsRUFBZ0I7QUFDM0M7QUFDQSxPQUFJLE9BQU8sS0FBSyxLQUFoQjtBQUNBO0FBQ0EsT0FBSSxLQUFLLE1BQU0sTUFBZjtBQUNBO0FBQ0EsT0FBSSxhQUFhLEtBQUssVUFBTCxHQUFrQixFQUFuQztBQUNBO0FBQ0EsT0FBSSxPQUFPLE1BQU0sTUFBTixHQUFlLE1BQU0sSUFBaEM7O0FBRUE7QUFDQSxPQUFJLE1BQU0sSUFBTixLQUFlLE1BQW5CLEVBQTJCO0FBQ3pCLFdBQU0sSUFBSSxLQUFKLENBQVUsd0JBQXlCLE1BQU0sSUFBekMsQ0FBTjtBQUNEOztBQUVELFVBQU8sS0FBSyxJQUFaLEVBQWtCO0FBQ2hCLGdCQUFXLElBQVgsQ0FBZ0I7QUFDZCw2QkFBc0IsS0FBSyxJQUFMLElBQWMsS0FBSyxJQUFMLEtBQWMsQ0FEcEM7QUFFZCw2QkFBc0IsS0FBSyxJQUFMLElBQWMsS0FBSyxJQUFMLEtBQWM7QUFGcEMsTUFBaEI7QUFJRDtBQUNGLEVBckJEOztBQXVCQTs7O0FBR0EsUUFBTyxTQUFQLENBQWlCLFNBQWpCLEdBQTZCLFVBQVMsS0FBVCxFQUFnQjtBQUMzQztBQUNBLE9BQUksTUFBTSxJQUFOLEtBQWUsTUFBbkIsRUFBMkI7QUFDekIsV0FBTSxJQUFJLEtBQUosQ0FBVSx3QkFBd0IsTUFBTSxJQUF4QyxDQUFOO0FBQ0Q7O0FBRUQsUUFBSyxtQkFBTCxHQUEyQixLQUFLLGNBQUwsQ0FBb0IsS0FBcEIsQ0FBM0I7QUFDRCxFQVBEOztBQVNBOzs7QUFHQSxRQUFPLFNBQVAsQ0FBaUIsU0FBakIsR0FBNkIsVUFBUyxLQUFULEVBQWdCO0FBQzNDO0FBQ0EsT0FBSSxNQUFNLElBQU4sS0FBZSxNQUFuQixFQUEyQjtBQUN6QixXQUFNLElBQUksS0FBSixDQUFVLHdCQUF3QixNQUFNLElBQXhDLENBQU47QUFDRDtBQUNELFFBQUssbUJBQUwsR0FBMkIsS0FBSyxjQUFMLENBQW9CLEtBQXBCLENBQTNCO0FBQ0QsRUFORDs7QUFRQTs7O0FBR0EsUUFBTyxTQUFQLENBQWlCLFNBQWpCLEdBQTZCLFVBQVMsS0FBVCxFQUFnQjtBQUMzQztBQUNBLE9BQUksT0FBTyxLQUFLLEtBQWhCO0FBQ0E7QUFDQSxPQUFJLEtBQUssTUFBTSxNQUFmO0FBQ0E7QUFDQSxPQUFJLGFBQWEsS0FBSyxVQUFMLEdBQWtCLEVBQW5DO0FBQ0E7QUFDQSxPQUFJLE9BQU8sTUFBTSxNQUFOLEdBQWUsTUFBTSxJQUFoQzs7QUFFQTtBQUNBLE9BQUksTUFBTSxJQUFOLEtBQWUsTUFBbkIsRUFBMkI7QUFDekIsV0FBTSxJQUFJLEtBQUosQ0FBVSx3QkFBd0IsTUFBTSxJQUF4QyxDQUFOO0FBQ0Q7O0FBRUQsVUFBTyxLQUFLLElBQVosRUFBa0I7QUFDaEIsZ0JBQVcsSUFBWCxDQUFnQjtBQUNkLHVCQUFnQixPQUFPLFlBQVAsQ0FBb0IsS0FBcEIsQ0FBMEIsSUFBMUIsRUFBZ0MsS0FBSyxRQUFMLENBQWMsRUFBZCxFQUFrQixNQUFNLEVBQXhCLENBQWhDLENBREY7QUFFZCwyQkFBb0IsS0FBSyxJQUFMLElBQWMsS0FBSyxJQUFMLEtBQWM7QUFGbEMsTUFBaEI7QUFJRDtBQUNGLEVBckJEOztBQXVCQTs7O0FBR0EsUUFBTyxTQUFQLENBQWlCLFNBQWpCLEdBQTZCLFVBQVMsS0FBVCxFQUFnQjtBQUMzQztBQUNBLE9BQUksT0FBTyxLQUFLLEtBQWhCO0FBQ0E7QUFDQSxPQUFJLEtBQUssTUFBTSxNQUFmO0FBQ0E7QUFDQSxPQUFJLGlCQUFpQixLQUFLLGNBQUwsR0FBc0IsRUFBM0M7QUFDQTtBQUNBLE9BQUksT0FBTyxNQUFNLE1BQU4sR0FBZSxNQUFNLElBQWhDOztBQUVBO0FBQ0EsT0FBSSxNQUFNLElBQU4sS0FBZSxNQUFuQixFQUEyQjtBQUN6QixXQUFNLElBQUksS0FBSixDQUFVLHdCQUF3QixNQUFNLElBQXhDLENBQU47QUFDRDs7QUFHRCxVQUFPLEtBQUssSUFBWixFQUFrQjtBQUNoQixvQkFBZSxJQUFmLENBQW9CO0FBQ2xCLGlDQUEwQixLQUFLLElBQUwsSUFBYyxLQUFLLElBQUwsS0FBYyxDQURwQztBQUVsQixpQ0FBMEIsS0FBSyxJQUFMLElBQWMsS0FBSyxJQUFMLEtBQWM7QUFGcEMsTUFBcEI7QUFJRDtBQUNGLEVBdEJEOztBQXdCQTs7O0FBR0EsUUFBTyxTQUFQLENBQWlCLFNBQWpCLEdBQTZCLFVBQVMsS0FBVCxFQUFnQjtBQUMzQztBQUNBLE9BQUksTUFBTSxJQUFOLEtBQWUsTUFBbkIsRUFBMkI7QUFDekIsV0FBTSxJQUFJLEtBQUosQ0FBVSx3QkFBd0IsTUFBTSxJQUF4QyxDQUFOO0FBQ0Q7O0FBRUQsUUFBSyx1QkFBTCxHQUErQixLQUFLLGNBQUwsQ0FBb0IsS0FBcEIsQ0FBL0I7QUFDRCxFQVBEOztBQVVBOzs7QUFHQSxRQUFPLFNBQVAsQ0FBaUIsU0FBakIsR0FBNkIsVUFBUyxLQUFULEVBQWdCO0FBQzNDO0FBQ0EsT0FBSSxNQUFNLElBQU4sS0FBZSxNQUFuQixFQUEyQjtBQUN6QixXQUFNLElBQUksS0FBSixDQUFVLHdCQUF3QixNQUFNLElBQXhDLENBQU47QUFDRDs7QUFFRCxRQUFLLHVCQUFMLEdBQStCLEtBQUssY0FBTCxDQUFvQixLQUFwQixDQUEvQjtBQUNELEVBUEQ7O0FBU0E7OztBQUdBLFFBQU8sU0FBUCxDQUFpQixTQUFqQixHQUE2QixVQUFTLEtBQVQsRUFBZ0I7QUFDM0M7QUFDQSxPQUFJLE9BQU8sS0FBSyxLQUFoQjtBQUNBO0FBQ0EsT0FBSSxLQUFLLE1BQU0sTUFBZjtBQUNBO0FBQ0EsT0FBSSxVQUFVLEtBQUssTUFBTCxHQUFjLEVBQTVCO0FBQ0E7QUFDQSxPQUFJLGVBQWUsS0FBSyxZQUFMLEdBQW9CLEVBQXZDO0FBQ0E7QUFDQSxPQUFJLE9BQU8sTUFBTSxNQUFOLEdBQWUsTUFBTSxJQUFoQztBQUNBO0FBQ0EsT0FBSSxVQUFKO0FBQ0E7QUFDQSxPQUFJLEtBQUo7QUFDQTtBQUNBLE9BQUksR0FBSjtBQUNBO0FBQ0EsT0FBSSxTQUFKO0FBQ0E7QUFDQSxPQUFJLE9BQUo7QUFDQTtBQUNBLE9BQUksVUFBSjtBQUNBO0FBQ0EsT0FBSSxhQUFKO0FBQ0E7QUFDQSxPQUFJLGVBQUo7QUFDQTtBQUNBLE9BQUksVUFBSjtBQUNBO0FBQ0EsT0FBSSxVQUFKOztBQUVBO0FBQ0EsT0FBSSxNQUFNLElBQU4sS0FBZSxNQUFuQixFQUEyQjtBQUN6QixXQUFNLElBQUksS0FBSixDQUFVLHdCQUF3QixNQUFNLElBQXhDLENBQU47QUFDRDs7QUFFRCxVQUFPLEtBQUssSUFBWixFQUFrQjtBQUNoQixrQkFBYSxPQUFPLFlBQVAsQ0FBb0IsS0FBcEIsQ0FBMEIsSUFBMUIsRUFBZ0MsS0FBSyxRQUFMLENBQWMsRUFBZCxFQUFrQixNQUFNLEVBQXhCLENBQWhDLENBQWI7QUFDQSxhQUFRLENBQ0wsS0FBSyxJQUFMLEtBQWMsQ0FBZixHQUFxQixLQUFLLElBQUwsS0FBYyxDQUFuQyxHQUF5QyxLQUFLLElBQUwsS0FBYyxFQUF2RCxHQUE4RCxLQUFLLElBQUwsS0FBYyxFQUR0RSxNQUVGLENBRk47QUFHQSxXQUFNLENBQ0gsS0FBSyxJQUFMLEtBQWMsQ0FBZixHQUFxQixLQUFLLElBQUwsS0FBYyxDQUFuQyxHQUF5QyxLQUFLLElBQUwsS0FBYyxFQUF2RCxHQUE4RCxLQUFLLElBQUwsS0FBYyxFQUR4RSxNQUVBLENBRk47QUFHQSxpQkFBWSxDQUNULEtBQUssSUFBTCxLQUFjLENBQWYsR0FBcUIsS0FBSyxJQUFMLEtBQWMsQ0FBbkMsR0FBeUMsS0FBSyxJQUFMLEtBQWMsRUFBdkQsR0FBOEQsS0FBSyxJQUFMLEtBQWMsRUFEbEUsTUFFTixDQUZOO0FBR0EsZUFBVyxDQUNSLEtBQUssSUFBTCxLQUFjLENBQWYsR0FBcUIsS0FBSyxJQUFMLEtBQWMsQ0FBbkMsR0FBeUMsS0FBSyxJQUFMLEtBQWMsRUFBdkQsR0FBOEQsS0FBSyxJQUFMLEtBQWMsRUFEbkUsTUFFTCxDQUZOO0FBR0Esa0JBQWEsQ0FDVixLQUFLLElBQUwsS0FBYyxDQUFmLEdBQXFCLEtBQUssSUFBTCxLQUFjLENBQW5DLEdBQXlDLEtBQUssSUFBTCxLQUFjLEVBQXZELEdBQThELEtBQUssSUFBTCxLQUFjLEVBRGpFLE1BRVAsQ0FGTjtBQUdBLHFCQUFnQixLQUFLLElBQUwsQ0FBaEI7QUFDQSx1QkFBbUIsS0FBSyxJQUFMLEtBQWMsRUFBZixJQUFzQixFQUF4QztBQUNBLGtCQUFhLEtBQUssSUFBTCxJQUFjLEtBQUssSUFBTCxLQUFjLENBQXpDO0FBQ0Esa0JBQWEsS0FBSyxJQUFMLElBQWMsS0FBSyxJQUFMLEtBQWMsQ0FBekM7O0FBRUE7QUFDQSxTQUFJLFNBQVMsSUFBSSxVQUFKLENBQWUsSUFBSSxVQUFKLENBQWUsS0FBSyxRQUFMLENBQ3pDLEtBQUssWUFBTCxDQUFrQixNQUFsQixHQUEyQixRQUFRLENBRE0sRUFFekMsS0FBSyxZQUFMLENBQWtCLE1BQWxCLEdBQTJCLE1BQVEsQ0FGTSxDQUFmLEVBR3pCLE1BSFUsQ0FBYjs7QUFLQSxrQkFBYSxLQUFiO0FBQ0EsZ0JBQVcsS0FBWDs7QUFFQSxTQUFJLGFBQWEsQ0FBakIsRUFBb0I7QUFDbEIsV0FBSSxTQUFTLEtBQUssZ0JBQUwsQ0FBc0IsTUFBdEIsRUFBOEIsVUFBOUIsQ0FBYjtBQUNBLGdCQUFTLE9BQU8sTUFBaEI7QUFDQSxxQkFBYyxPQUFPLFFBQXJCO0FBQ0Esb0JBQWEsT0FBTyxRQUFwQjtBQUNBLGtCQUFXLE9BQU8sUUFBbEI7QUFDRDs7QUFFRCxhQUFRLElBQVIsQ0FBYSxNQUFiO0FBQ0E7O0FBRUEsa0JBQWEsSUFBYixDQUFrQjtBQUNoQixtQkFBWSxVQURJO0FBRWhCOzs7O0FBSUEsa0JBQVcsU0FOSztBQU9oQixnQkFBUyxPQVBPO0FBUWhCLG1CQUFZLFVBUkk7QUFTaEIsc0JBQWUsYUFUQztBQVVoQix3QkFBaUIsZUFWRDtBQVdoQixtQkFBWSxVQVhJO0FBWWhCLG1CQUFZO0FBWkksTUFBbEI7QUFjRDtBQUNGLEVBOUZEOztBQWdHQSxRQUFPLFNBQVAsQ0FBaUIsZ0JBQWpCLEdBQW9DLFVBQVMsTUFBVCxFQUFpQixVQUFqQixFQUE2QjtBQUMvRDtBQUNBLE9BQUksU0FBSjtBQUNBO0FBQ0EsT0FBSSxDQUFKO0FBQ0E7QUFDQSxPQUFJLEVBQUo7QUFDQTtBQUNBLE9BQUksQ0FBSjtBQUNBO0FBQ0EsT0FBSSxXQUFXLENBQWY7O0FBRUE7QUFDQSxVQUFPLGFBQWEsS0FBcEIsRUFBMkI7QUFDekIsaUJBQVksSUFBSSxVQUFKLENBQWUsT0FBTyxNQUFQLEdBQWdCLENBQS9CLENBQVo7QUFDQSxVQUFLLElBQUksSUFBSSxDQUFSLEVBQVcsS0FBSyxPQUFPLE1BQTVCLEVBQW9DLElBQUksRUFBeEMsRUFBNEMsRUFBRSxDQUE5QyxFQUFpRDtBQUMvQyxpQkFBVSxHQUFWLElBQWlCLE9BQU8sQ0FBUCxDQUFqQjtBQUNBLGlCQUFVLEdBQVYsSUFBaUIsT0FBTyxDQUFQLENBQWpCO0FBQ0Q7QUFDRCxjQUFTLFNBQVQ7QUFDQSxpQkFBWSxDQUFaO0FBQ0EsbUJBQWMsQ0FBZDtBQUNEOztBQUVELFVBQU87QUFDTCxhQUFRLE1BREg7QUFFTCxlQUFVO0FBRkwsSUFBUDtBQUlELEVBNUJEOztBQThCQTs7OztBQUlBLFFBQU8sU0FBUCxDQUFpQixjQUFqQixHQUFrQyxVQUFTLEtBQVQsRUFBZ0I7QUFDaEQ7QUFDQSxPQUFJLE9BQU8sS0FBSyxLQUFoQjtBQUNBO0FBQ0EsT0FBSSxLQUFLLE1BQU0sTUFBZjtBQUNBO0FBQ0EsT0FBSSxPQUFPLE1BQU0sTUFBTixHQUFlLE1BQU0sSUFBaEM7QUFDQTtBQUNBLE9BQUksSUFBSjtBQUNBO0FBQ0EsT0FBSSxHQUFKO0FBQ0E7QUFDQSxPQUFJLFNBQVMsRUFBYjs7QUFFQSxVQUFPLEtBQUssSUFBWixFQUFrQjtBQUNoQjtBQUNBO0FBQ0EsV0FBTSxDQUFOOztBQUVBO0FBQ0EsWUFBTyxLQUFLLElBQUwsSUFBYyxLQUFLLElBQUwsS0FBYyxDQUFuQztBQUNBLFdBQU0sT0FBTyx3QkFBUCxDQUFnQyxJQUFoQyxDQUFOO0FBQ0EsU0FBSSxRQUFRLEtBQUssQ0FBakIsRUFBb0I7QUFDbEI7QUFDQSxjQUFPLElBQVAsQ0FBWTtBQUNWLGVBQU0sR0FESTtBQUVWLGdCQUFPO0FBQ0wsaUJBQU0sSUFERDtBQUVMLG1CQUFRLEtBQUssRUFBTCxJQUFZLEtBQUssS0FBRyxDQUFSLEtBQWMsQ0FBZixJQUFxQixFQUFyQixJQUEyQixFQUZ6QztBQUdMLGVBQUksS0FBSyxJQUFMLENBSEM7QUFJTCxlQUFJLEtBQUssSUFBTDtBQUpDO0FBRkcsUUFBWjtBQVNELE1BWEQsTUFXTztBQUNMO0FBQ0EsZUFBUSxHQUFSO0FBQ0UsY0FBSyxVQUFMLENBREYsQ0FDbUI7QUFDakIsY0FBSyxVQUFMLENBRkYsQ0FFbUI7QUFDakIsY0FBSyxRQUFMLENBSEYsQ0FHaUI7QUFDZixjQUFLLFVBQUw7QUFDRSxrQkFBTyxJQUFQLENBQVk7QUFDVixtQkFBTSxHQURJO0FBRVYsb0JBQU87QUFDTCxtQkFBSSxLQUFLLElBQUwsQ0FEQztBQUVMLG1CQUFJLEtBQUssSUFBTDtBQUZDO0FBRkcsWUFBWjtBQU9BO0FBQ0Y7QUFDRSxrQkFBTyxJQUFQLENBQVk7QUFDVixtQkFBTSxHQURJO0FBRVYsb0JBQU87QUFDTCx1QkFBUSxLQUFLLElBQUwsSUFBYyxLQUFLLElBQUwsS0FBYyxDQUFmLElBQXFCLEVBQXJCLElBQTJCO0FBRDNDO0FBRkcsWUFBWjtBQU1BO0FBcEJKO0FBc0JEOztBQUVEO0FBQ0E7QUFDQSxXQUFNLENBQU47O0FBRUE7QUFDQTtBQUNBLFdBQU0sQ0FBTjtBQUNEOztBQUVELFVBQU8sTUFBUDtBQUNELEVBckVEOztBQXVFQTs7OztBQUlBLFFBQU8sU0FBUCxDQUFpQixjQUFqQixHQUFrQyxVQUFTLEtBQVQsRUFBZ0I7QUFDaEQ7QUFDQSxPQUFJLE9BQU8sS0FBSyxLQUFoQjtBQUNBO0FBQ0EsT0FBSSxLQUFLLE1BQU0sTUFBZjtBQUNBO0FBQ0EsT0FBSSxPQUFPLE1BQU0sTUFBTixHQUFlLE1BQU0sSUFBaEM7QUFDQTtBQUNBLE9BQUksSUFBSjtBQUNBO0FBQ0EsT0FBSSxHQUFKO0FBQ0E7QUFDQSxPQUFJLFNBQVMsRUFBYjs7QUFFQSxVQUFPLEtBQUssSUFBWixFQUFrQjtBQUNoQixZQUFPLEtBQUssSUFBTCxJQUFjLEtBQUssSUFBTCxLQUFjLENBQW5DO0FBQ0EsV0FBTSxPQUFPLHdCQUFQLENBQWdDLElBQWhDLENBQU47QUFDQSxTQUFJLFFBQVEsS0FBSyxDQUFqQixFQUFvQjtBQUNsQixjQUFPLElBQVAsQ0FBWTtBQUNWLGVBQU0sR0FESTtBQUVWLGdCQUFPO0FBQ0wsaUJBQU0sSUFERDtBQUVMLG1CQUFRLEtBQUssRUFBTCxJQUFZLEtBQUssS0FBRyxDQUFSLEtBQWMsQ0FBZixJQUFxQixFQUFyQixJQUEyQixFQUZ6QztBQUdMLGVBQUksS0FBSyxJQUFMLENBSEM7QUFJTCxlQUFJLEtBQUssSUFBTDtBQUpDO0FBRkcsUUFBWjtBQVNBO0FBQ0Q7O0FBRUQsYUFBUSxHQUFSO0FBQ0UsWUFBSyxRQUFMLENBREYsQ0FDaUI7QUFDZixZQUFLLFVBQUwsQ0FGRixDQUVtQjtBQUNqQixZQUFLLFVBQUwsQ0FIRixDQUdtQjtBQUNqQixZQUFLLFVBQUw7QUFDRSxnQkFBTyxJQUFQLENBQVk7QUFDVixpQkFBTSxHQURJO0FBRVYsa0JBQU87QUFDTCxpQkFBSSxLQUFLLElBQUwsQ0FEQztBQUVMLGlCQUFJLEtBQUssSUFBTDtBQUZDO0FBRkcsVUFBWjtBQU9BO0FBQ0Y7QUFDRSxnQkFBTyxJQUFQLENBQVk7QUFDVixpQkFBTSxHQURJO0FBRVYsa0JBQU87QUFDTCxxQkFBUSxLQUFLLElBQUwsSUFBYyxLQUFLLElBQUwsS0FBYyxDQUFmLElBQXFCLEVBQXJCLElBQTJCO0FBRDNDO0FBRkcsVUFBWjtBQU1BO0FBcEJKO0FBc0JEOztBQUVELFVBQU8sTUFBUDtBQUNELEVBdkREOztBQXlEQSxRQUFPLFNBQVAsQ0FBaUIsZ0JBQWpCLEdBQW9DLFlBQVc7QUFDN0M7QUFDQSxPQUFJLGFBQWEsS0FBSyxVQUF0QjtBQUNBO0FBQ0EsT0FBSSxPQUFPLEtBQUssY0FBaEI7QUFDQTtBQUNBLE9BQUksU0FBUyxFQUFiO0FBQ0E7QUFDQSxPQUFJLFFBQUo7QUFDQTtBQUNBLE9BQUksV0FBSjtBQUNBO0FBQ0EsT0FBSSxRQUFKO0FBQ0E7QUFDQSxPQUFJLG1CQUFKO0FBQ0E7QUFDQSxPQUFJLG1CQUFKO0FBQ0E7QUFDQSxPQUFJLENBQUo7QUFDQTtBQUNBLE9BQUksRUFBSjtBQUNBO0FBQ0EsT0FBSSxDQUFKO0FBQ0E7QUFDQSxPQUFJLEVBQUo7O0FBRUE7QUFDQSxRQUFLLElBQUksQ0FBSixFQUFPLEtBQUssV0FBVyxNQUE1QixFQUFvQyxJQUFJLEVBQXhDLEVBQTRDLEVBQUUsQ0FBOUMsRUFBaUQ7QUFDL0MsZ0JBQWMsV0FBVyxDQUFYLEVBQWMsa0JBQTVCO0FBQ0EsbUJBQWMsV0FBVyxJQUFFLENBQWIsSUFBa0IsV0FBVyxJQUFFLENBQWIsRUFBZ0Isa0JBQWxDLEdBQXVELEtBQUssTUFBMUU7QUFDQSxnQkFBVyxFQUFYOztBQUVBO0FBQ0EsVUFBSyxJQUFJLFFBQUosRUFBYyxLQUFLLFdBQXhCLEVBQXFDLElBQUksRUFBekMsRUFBNkMsRUFBRSxDQUEvQyxFQUFrRDtBQUNoRCw2QkFBc0IsS0FBSywwQkFBTCxDQUFnQyxJQUFoQyxFQUFzQyxDQUF0QyxDQUF0QjtBQUNBLDZCQUFzQixLQUFLLDBCQUFMLENBQWdDLElBQWhDLEVBQXNDLENBQXRDLENBQXRCOztBQUVBLGdCQUFTLElBQVQsQ0FBYztBQUNaLG9CQUFXLG9CQUFvQixTQURuQjtBQUVaLDRCQUFtQixvQkFBb0IsYUFGM0I7QUFHWixvQkFBVyxvQkFBb0IsU0FIbkI7QUFJWiw0QkFBbUIsb0JBQW9CO0FBSjNCLFFBQWQ7QUFNRDs7QUFFRCxZQUFPLElBQVAsQ0FBWTtBQUNWLGFBQU0sV0FBVyxDQUFYLEVBQWMsY0FEVjtBQUVWLGFBQU07QUFGSSxNQUFaO0FBSUQ7O0FBRUQsVUFBTyxNQUFQO0FBQ0QsRUFwREQ7O0FBc0RBLFFBQU8sU0FBUCxDQUFpQixZQUFqQixHQUFnQyxZQUFXO0FBQ3pDO0FBQ0EsT0FBSSxTQUFXLEtBQUssWUFBcEI7QUFDQTtBQUNBLE9BQUksT0FBTyxLQUFLLFVBQWhCO0FBQ0E7QUFDQSxPQUFJLFNBQVMsRUFBYjtBQUNBO0FBQ0EsT0FBSSxRQUFKO0FBQ0E7QUFDQSxPQUFJLFdBQUo7QUFDQTtBQUNBLE9BQUksUUFBSjtBQUNBO0FBQ0EsT0FBSSxVQUFKO0FBQ0E7QUFDQSxPQUFJLGVBQUo7QUFDQTtBQUNBLE9BQUksZUFBSjtBQUNBO0FBQ0EsT0FBSSxDQUFKO0FBQ0E7QUFDQSxPQUFJLEVBQUo7QUFDQTtBQUNBLE9BQUksQ0FBSjtBQUNBO0FBQ0EsT0FBSSxFQUFKOztBQUVBO0FBQ0EsUUFBSyxJQUFJLENBQUosRUFBTyxLQUFLLE9BQU8sTUFBeEIsRUFBZ0MsSUFBSSxFQUFwQyxFQUF3QyxFQUFFLENBQTFDLEVBQTZDO0FBQzNDLGdCQUFjLE9BQU8sQ0FBUCxFQUFVLGNBQXhCO0FBQ0EsbUJBQWMsT0FBTyxJQUFFLENBQVQsSUFBYyxPQUFPLElBQUUsQ0FBVCxFQUFZLGNBQTFCLEdBQTJDLEtBQUssTUFBOUQ7QUFDQSxnQkFBVyxFQUFYOztBQUVBO0FBQ0EsVUFBSyxJQUFJLFFBQUosRUFBYyxLQUFLLFdBQXhCLEVBQXFDLElBQUksRUFBekMsRUFBNkMsRUFBRSxDQUEvQyxFQUFrRDtBQUNoRCx5QkFBa0IsS0FBSyxzQkFBTCxDQUE0QixJQUE1QixFQUFrQyxDQUFsQyxDQUFsQjtBQUNBLHlCQUFrQixLQUFLLHNCQUFMLENBQTRCLElBQTVCLEVBQWtDLENBQWxDLENBQWxCOztBQUVBLGdCQUFTLElBQVQsQ0FBYztBQUNaLG9CQUFXLGdCQUFnQixTQURmO0FBRVosNEJBQW1CLGdCQUFnQixhQUZ2QjtBQUdaLG9CQUFXLGdCQUFnQixTQUhmO0FBSVosNEJBQW1CLGdCQUFnQjtBQUp2QixRQUFkOztBQU9BLG9CQUNFLGdCQUFnQixTQUFoQixDQUEwQixZQUExQixNQUE0QyxLQUFLLENBQWpELEdBQ0UsZ0JBQWdCLFNBQWhCLENBQTBCLFlBQTFCLEVBQXdDLE1BRDFDLEdBRUEsZ0JBQWdCLFNBQWhCLENBQTBCLFlBQTFCLE1BQTRDLEtBQUssQ0FBakQsR0FDRSxnQkFBZ0IsU0FBaEIsQ0FBMEIsWUFBMUIsRUFBd0MsTUFEMUMsR0FFQSxJQUxGO0FBTUQ7O0FBRUQsWUFBTyxJQUFQLENBQVk7QUFDVixhQUFNLE9BQU8sQ0FBUCxFQUFVLFVBRE47QUFFVixhQUFNLFFBRkk7QUFHVixlQUFRLE9BQU8sQ0FBUCxDQUhFO0FBSVYsbUJBQVk7QUFKRixNQUFaO0FBTUQ7O0FBRUQsVUFBTyxNQUFQO0FBQ0QsRUEvREQ7O0FBaUVBOzs7Ozs7QUFNQSxRQUFPLFNBQVAsQ0FBaUIsMEJBQWpCLEdBQThDLFVBQVMsSUFBVCxFQUFlLEtBQWYsRUFBc0I7QUFDbEUsT0FBSSxTQUFTLEtBQUssZ0JBQUwsQ0FDWCxJQURXLEVBRVgsS0FBSyxLQUFMLEVBQVksd0JBRkQsRUFHWCxLQUFLLFFBQU0sQ0FBWCxJQUFnQixLQUFLLFFBQU0sQ0FBWCxFQUFjLHdCQUE5QixHQUF3RCxLQUFLLHVCQUFMLENBQTZCLE1BSDFFLEVBSVgsS0FBSyx1QkFKTSxDQUFiOztBQU9BLFVBQU87QUFDTCxnQkFBVyxPQUFPLE1BRGI7QUFFTCxvQkFBZSxPQUFPO0FBRmpCLElBQVA7QUFJRCxFQVpEOztBQWNBOzs7Ozs7QUFNQSxRQUFPLFNBQVAsQ0FBaUIsMEJBQWpCLEdBQThDLFVBQVMsSUFBVCxFQUFlLEtBQWYsRUFBc0I7QUFDbEUsT0FBSSxTQUFTLEtBQUssZ0JBQUwsQ0FDWCxJQURXLEVBRVgsS0FBSyxLQUFMLEVBQVksb0JBRkQsRUFHWCxLQUFLLFFBQU0sQ0FBWCxJQUFnQixLQUFLLFFBQU0sQ0FBWCxFQUFjLHdCQUE5QixHQUF3RCxLQUFLLHVCQUFMLENBQTZCLE1BSDFFLEVBSVgsS0FBSyx1QkFKTSxDQUFiOztBQU9BLFVBQU87QUFDTCxnQkFBVyxPQUFPLE1BRGI7QUFFTCxvQkFBZSxPQUFPO0FBRmpCLElBQVA7QUFJRCxFQVpEOztBQWNBOzs7Ozs7QUFNQSxRQUFPLFNBQVAsQ0FBaUIsc0JBQWpCLEdBQTBDLFVBQVMsSUFBVCxFQUFlLEtBQWYsRUFBc0I7QUFDOUQsT0FBSSxTQUFTLEtBQUssZ0JBQUwsQ0FDWCxJQURXLEVBRVgsS0FBSyxLQUFMLEVBQVksb0JBRkQsRUFHWCxLQUFLLFFBQU0sQ0FBWCxJQUFnQixLQUFLLFFBQU0sQ0FBWCxFQUFjLG9CQUE5QixHQUFxRCxLQUFLLG1CQUFMLENBQXlCLE1BSG5FLEVBSVgsS0FBSyxtQkFKTSxDQUFiOztBQU9BLFVBQU87QUFDTCxnQkFBVyxPQUFPLE1BRGI7QUFFTCxvQkFBZSxPQUFPO0FBRmpCLElBQVA7QUFJRCxFQVpEOztBQWNFOzs7Ozs7QUFNRixRQUFPLFNBQVAsQ0FBaUIsc0JBQWpCLEdBQTBDLFVBQVMsSUFBVCxFQUFlLEtBQWYsRUFBc0I7QUFDOUQ7QUFDQSxPQUFJLFNBQVMsS0FBSyxnQkFBTCxDQUNYLElBRFcsRUFFWCxLQUFLLEtBQUwsRUFBWSxvQkFGRCxFQUdYLEtBQUssUUFBTSxDQUFYLElBQWdCLEtBQUssUUFBTSxDQUFYLEVBQWMsb0JBQTlCLEdBQXFELEtBQUssbUJBQUwsQ0FBeUIsTUFIbkUsRUFJWCxLQUFLLG1CQUpNLENBQWI7O0FBT0EsVUFBTztBQUNMLGdCQUFXLE9BQU8sTUFEYjtBQUVMLG9CQUFlLE9BQU87QUFGakIsSUFBUDtBQUlELEVBYkQ7O0FBZUE7Ozs7Ozs7O0FBUUEsUUFBTyxTQUFQLENBQWlCLGdCQUFqQixHQUFvQyxVQUFTLElBQVQsRUFBZSxVQUFmLEVBQTJCLFFBQTNCLEVBQXFDLFVBQXJDLEVBQWlEO0FBQ25GO0FBQ0EsT0FBSSxhQUFhLEVBQWpCO0FBQ0E7QUFDQSxPQUFJLFNBQVM7QUFDWCxjQUFTLEVBREU7QUFFWCxpQkFBWTtBQUNWLFdBQUksR0FETTtBQUVWLFdBQUk7QUFGTTtBQUZELElBQWIsQ0FKbUYsQ0FVaEY7QUFDSDtBQUNBLE9BQUksSUFBSjtBQUNBO0FBQ0EsT0FBSSxDQUFKO0FBQ0E7QUFDQSxPQUFJLEVBQUo7O0FBRUEsUUFBSyxJQUFJLFVBQUosRUFBZ0IsS0FBSyxRQUExQixFQUFvQyxJQUFJLEVBQXhDLEVBQTRDLEVBQUUsQ0FBOUMsRUFBaUQ7QUFDL0MsWUFBTyxXQUFXLENBQVgsQ0FBUDtBQUNBLGdCQUFXLElBQVgsQ0FBZ0IsSUFBaEI7O0FBRUEsU0FBSSxLQUFLLElBQUwsS0FBYyxTQUFsQixFQUE2QjtBQUMzQixjQUFPLE9BQVAsQ0FBZSxJQUFmLENBQW9CLEtBQUssS0FBekI7QUFDRCxNQUZELE1BRU87QUFDTCxjQUFPLEtBQUssSUFBWixJQUFvQixLQUFLLEtBQXpCO0FBQ0Q7QUFDRjs7QUFFRCxVQUFPO0FBQ0wsYUFBUSxNQURIO0FBRUwsaUJBQVk7QUFGUCxJQUFQO0FBSUQsRUFqQ0Q7O0FBb0NBOzs7O0FBSUEsUUFBTyx3QkFBUCxHQUFrQyxDQUNoQyxrQkFEZ0MsRUFFaEMsZ0JBRmdDLEVBR2hDLHNCQUhnQyxFQUloQyxvQkFKZ0MsRUFLaEMsd0JBTGdDLEVBTWhDLGVBTmdDLEVBT2hDLGVBUGdDLEVBUWhDLGVBUmdDLEVBU2hDLGlCQVRnQyxFQVVoQyxnQkFWZ0MsRUFXaEMsa0JBWGdDLEVBWWhDLGtCQVpnQyxFQWFoQyxzQkFiZ0MsRUFjaEMsZ0JBZGdDLEdBZTlCO0FBQ0Ysb0JBaEJnQyxFQWlCaEMsbUJBakJnQyxFQWtCaEMsS0FsQmdDLEtBbUI1QjtBQUNKLGNBcEJnQyxFQXFCaEMsWUFyQmdDLEVBc0JoQyxhQXRCZ0MsRUF1QmhDLFlBdkJnQyxFQXdCaEMsYUF4QmdDLEVBeUJoQyxjQXpCZ0MsRUEwQmhDLFlBMUJnQyxFQTJCaEMsYUEzQmdDLEVBNEJoQyxlQTVCZ0MsRUE2QmhDLGVBN0JnQyxFQThCaEMsb0JBOUJnQyxFQStCaEMscUJBL0JnQyxFQWdDaEMsYUFoQ2dDLEVBaUNoQyxjQWpDZ0MsRUFrQ2hDLFlBbENnQyxFQW1DaEMsYUFuQ2dDLEVBb0NoQyxlQXBDZ0MsRUFxQ2hDLGVBckNnQyxFQXNDaEMsb0JBdENnQyxFQXVDaEMscUJBdkNnQyxFQXdDaEMsWUF4Q2dDLEdBeUM5QjtBQUNGLFdBMUNnQyxFQTJDaEMsVUEzQ2dDLEVBNENoQyw0QkE1Q2dDLEVBNkNoQyxRQTdDZ0MsRUE4Q2hDLFVBOUNnQyxFQStDaEMsb0JBL0NnQyxHQWdEOUI7QUFDRiwyQkFqRGdDLEVBa0RoQyxZQWxEZ0MsRUFtRGhDLFVBbkRnQyxFQW9EaEMsVUFwRGdDLEVBcURoQyxhQXJEZ0MsR0FzRDlCO0FBQ0YsY0F2RGdDLEVBd0RoQyxnQkF4RGdDLEVBeURoQyxtQkF6RGdDLENBQWxDOzttQkE0RGUsTTs7Ozs7Ozs7Ozs7QUN4NkJmLEtBQU0sT0FBTyxFQUFiOztBQUVBOzs7OztBQUtBLE1BQUssTUFBTCxHQUFjLFVBQVMsS0FBVCxFQUFnQixVQUFoQixFQUE0QjtBQUN4QyxnQkFBYSxjQUFjLEVBQTNCO0FBQ0E7QUFDQSxRQUFLLEtBQUwsR0FBYSxLQUFiO0FBQ0E7QUFDQSxRQUFLLEVBQUwsR0FBVSxXQUFXLE9BQVgsS0FBdUIsQ0FBakM7QUFDQTtBQUNBLFFBQUssTUFBTCxHQUFjLFdBQVcsUUFBWCxLQUF3QixNQUFNLE1BQU4sR0FBZSxLQUFLLEVBQTFEO0FBQ0E7QUFDQSxRQUFLLFNBQUw7QUFDQTtBQUNBLFFBQUssTUFBTCxHQUFjLEtBQUssRUFBbkI7QUFDQTtBQUNBLFFBQUssT0FBTCxHQUNFLFdBQVcsU0FBWCxNQUEwQixLQUFLLENBQS9CLEdBQW1DLFdBQVcsU0FBWCxDQUFuQyxHQUEyRCxJQUQ3RDtBQUVBO0FBQ0EsUUFBSyxTQUFMLEdBQ0UsV0FBVyxXQUFYLE1BQTRCLEtBQUssQ0FBakMsR0FBcUMsV0FBVyxXQUFYLENBQXJDLEdBQStELEtBRGpFO0FBRUQsRUFsQkQ7O0FBb0JBOzs7Ozs7QUFNQSxNQUFLLEtBQUwsR0FBYSxVQUFTLElBQVQsRUFBZSxJQUFmLEVBQXFCLE1BQXJCLEVBQTZCO0FBQ3hDO0FBQ0EsUUFBSyxJQUFMLEdBQVksSUFBWjtBQUNBO0FBQ0EsUUFBSyxJQUFMLEdBQVksSUFBWjtBQUNBO0FBQ0EsUUFBSyxNQUFMLEdBQWMsTUFBZDtBQUNELEVBUEQ7O0FBU0EsTUFBSyxNQUFMLENBQVksU0FBWixDQUFzQixLQUF0QixHQUE4QixZQUFXO0FBQ3ZDO0FBQ0EsT0FBSSxTQUFTLEtBQUssTUFBTCxHQUFjLEtBQUssTUFBaEM7O0FBRUEsUUFBSyxTQUFMLEdBQWlCLEVBQWpCOztBQUVBLFVBQU8sS0FBSyxFQUFMLEdBQVUsTUFBakIsRUFBeUI7QUFDdkIsVUFBSyxVQUFMO0FBQ0Q7QUFDRixFQVREOztBQVdBLE1BQUssTUFBTCxDQUFZLFNBQVosQ0FBc0IsVUFBdEIsR0FBbUMsWUFBVztBQUM1QztBQUNBLE9BQUksUUFBUSxLQUFLLEtBQWpCO0FBQ0E7QUFDQSxPQUFJLEtBQUssS0FBSyxFQUFkO0FBQ0E7QUFDQSxPQUFJLElBQUo7O0FBRUEsUUFBSyxTQUFMLENBQWUsSUFBZixDQUFvQixJQUFJLEtBQUssS0FBVCxDQUNsQixPQUFPLFlBQVAsQ0FBb0IsTUFBTSxJQUFOLENBQXBCLEVBQWlDLE1BQU0sSUFBTixDQUFqQyxFQUE4QyxNQUFNLElBQU4sQ0FBOUMsRUFBMkQsTUFBTSxJQUFOLENBQTNELENBRGtCLEVBRWpCLE9BQU8sS0FBSyxTQUFMLEdBQ0wsQ0FBRSxNQUFNLElBQU4sS0FBZSxFQUFoQixHQUF1QixNQUFNLElBQU4sS0FBZSxFQUF0QyxHQUNDLE1BQU0sSUFBTixLQUFnQixDQURqQixHQUN1QixNQUFNLElBQU4sQ0FEeEIsTUFDZ0QsQ0FGM0MsR0FHTCxDQUFFLE1BQU0sSUFBTixDQUFELEdBQXVCLE1BQU0sSUFBTixLQUFnQixDQUF2QyxHQUNDLE1BQU0sSUFBTixLQUFlLEVBRGhCLEdBQ3VCLE1BQU0sSUFBTixLQUFlLEVBRHZDLE1BQ2dELENBTmpDLEVBUWxCLEVBUmtCLENBQXBCOztBQVdBLFNBQU0sSUFBTjs7QUFFQTtBQUNBLE9BQUksS0FBSyxPQUFMLElBQWdCLENBQUUsS0FBSyxLQUFLLE1BQVgsR0FBcUIsQ0FBdEIsTUFBNkIsQ0FBakQsRUFBb0Q7QUFDbEQ7QUFDRDs7QUFFRCxRQUFLLEVBQUwsR0FBVSxFQUFWO0FBQ0QsRUEzQkQ7O0FBNkJBOzs7O0FBSUEsTUFBSyxNQUFMLENBQVksU0FBWixDQUFzQixRQUF0QixHQUFpQyxVQUFTLEtBQVQsRUFBZ0I7QUFDL0M7QUFDQSxPQUFJLFFBQVEsS0FBSyxTQUFMLENBQWUsS0FBZixDQUFaOztBQUVBLE9BQUksVUFBVSxLQUFLLENBQW5CLEVBQXNCO0FBQ3BCLFlBQU8sSUFBUDtBQUNEOztBQUVELFVBQU8sS0FBUDtBQUNELEVBVEQ7O0FBV0E7OztBQUdBLE1BQUssTUFBTCxDQUFZLFNBQVosQ0FBc0IsaUJBQXRCLEdBQTBDLFlBQVc7QUFDbkQsVUFBTyxLQUFLLFNBQUwsQ0FBZSxNQUF0QjtBQUNELEVBRkQ7O21CQUllLEkiLCJmaWxlIjoic2YyLnBhcnNlci5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKVxuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuXG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRleHBvcnRzOiB7fSxcbiBcdFx0XHRpZDogbW9kdWxlSWQsXG4gXHRcdFx0bG9hZGVkOiBmYWxzZVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sb2FkZWQgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcInN0YXRpY1wiO1xuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogd2VicGFjay9ib290c3RyYXAgM2E3YTZiZGVkYmY2M2VlNWI1ZWRcbiAqKi8iLCJleHBvcnQgKiBmcm9tIFwiLi4vc3JjL3NmMlwiXHJcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vZXhwb3J0L3BhcnNlci5qc1xuICoqLyIsImltcG9ydCBSaWZmIGZyb20gXCIuL3JpZmZcIlxyXG5cclxuLyoqXHJcbiAqIEBwYXJhbSB7Qnl0ZUFycmF5fSBpbnB1dFxyXG4gKiBAcGFyYW0ge09iamVjdD19IG9wdF9wYXJhbXNcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqL1xyXG5jb25zdCBQYXJzZXIgPSBmdW5jdGlvbihpbnB1dCwgb3B0X3BhcmFtcykge1xyXG4gIG9wdF9wYXJhbXMgPSBvcHRfcGFyYW1zIHx8IHt9O1xyXG4gIC8qKiBAdHlwZSB7Qnl0ZUFycmF5fSAqL1xyXG4gIHRoaXMuaW5wdXQgPSBpbnB1dDtcclxuICAvKiogQHR5cGUgeyhPYmplY3R8dW5kZWZpbmVkKX0gKi9cclxuICB0aGlzLnBhcnNlck9wdGlvbiA9IG9wdF9wYXJhbXNbJ3BhcnNlck9wdGlvbiddO1xyXG5cclxuICAvKiogQHR5cGUge0FycmF5LjxPYmplY3Q+fSAqL1xyXG4gIHRoaXMucHJlc2V0SGVhZGVyO1xyXG4gIC8qKiBAdHlwZSB7QXJyYXkuPE9iamVjdD59ICovXHJcbiAgdGhpcy5wcmVzZXRab25lO1xyXG4gIC8qKiBAdHlwZSB7QXJyYXkuPE9iamVjdD59ICovXHJcbiAgdGhpcy5wcmVzZXRab25lTW9kdWxhdG9yO1xyXG4gIC8qKiBAdHlwZSB7QXJyYXkuPE9iamVjdD59ICovXHJcbiAgdGhpcy5wcmVzZXRab25lR2VuZXJhdG9yO1xyXG4gIC8qKiBAdHlwZSB7QXJyYXkuPE9iamVjdD59ICovXHJcbiAgdGhpcy5pbnN0cnVtZW50O1xyXG4gIC8qKiBAdHlwZSB7QXJyYXkuPE9iamVjdD59ICovXHJcbiAgdGhpcy5pbnN0cnVtZW50Wm9uZTtcclxuICAvKiogQHR5cGUge0FycmF5LjxPYmplY3Q+fSAqL1xyXG4gIHRoaXMuaW5zdHJ1bWVudFpvbmVNb2R1bGF0b3I7XHJcbiAgLyoqIEB0eXBlIHtBcnJheS48T2JqZWN0Pn0gKi9cclxuICB0aGlzLmluc3RydW1lbnRab25lR2VuZXJhdG9yO1xyXG4gIC8qKiBAdHlwZSB7QXJyYXkuPE9iamVjdD59ICovXHJcbiAgdGhpcy5zYW1wbGVIZWFkZXI7XHJcbn07XHJcblxyXG5QYXJzZXIucHJvdG90eXBlLnBhcnNlID0gZnVuY3Rpb24oKSB7XHJcbiAgLyoqIEB0eXBlIHtSaWZmLlBhcnNlcn0gKi9cclxuICB2YXIgcGFyc2VyID0gbmV3IFJpZmYuUGFyc2VyKHRoaXMuaW5wdXQsIHRoaXMucGFyc2VyT3B0aW9uKTtcclxuICAvKiogQHR5cGUgez9SaWZmLkNodW5rfSAqL1xyXG4gIHZhciBjaHVuaztcclxuXHJcbiAgLy8gcGFyc2UgUklGRiBjaHVua1xyXG4gIHBhcnNlci5wYXJzZSgpO1xyXG4gIGlmIChwYXJzZXIuY2h1bmtMaXN0Lmxlbmd0aCAhPT0gMSkge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCd3cm9uZyBjaHVuayBsZW5ndGgnKTtcclxuICB9XHJcblxyXG4gIGNodW5rID0gcGFyc2VyLmdldENodW5rKDApO1xyXG4gIGlmIChjaHVuayA9PT0gbnVsbCkge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdjaHVuayBub3QgZm91bmQnKTtcclxuICB9XHJcblxyXG4gIHRoaXMucGFyc2VSaWZmQ2h1bmsoY2h1bmspO1xyXG4vL2NvbnNvbGUubG9nKHRoaXMuc2FtcGxlSGVhZGVyKTtcclxuICB0aGlzLmlucHV0ID0gbnVsbDtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBAcGFyYW0ge1JpZmYuQ2h1bmt9IGNodW5rXHJcbiAqL1xyXG5QYXJzZXIucHJvdG90eXBlLnBhcnNlUmlmZkNodW5rID0gZnVuY3Rpb24oY2h1bmspIHtcclxuICAvKiogQHR5cGUge1JpZmYuUGFyc2VyfSAqL1xyXG4gIHZhciBwYXJzZXI7XHJcbiAgLyoqIEB0eXBlIHtCeXRlQXJyYXl9ICovXHJcbiAgdmFyIGRhdGEgPSB0aGlzLmlucHV0O1xyXG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gIHZhciBpcCA9IGNodW5rLm9mZnNldDtcclxuICAvKiogQHR5cGUge3N0cmluZ30gKi9cclxuICB2YXIgc2lnbmF0dXJlO1xyXG5cclxuICAvLyBjaGVjayBwYXJzZSB0YXJnZXRcclxuICBpZiAoY2h1bmsudHlwZSAhPT0gJ1JJRkYnKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgY2h1bmsgdHlwZTonICsgY2h1bmsudHlwZSk7XHJcbiAgfVxyXG5cclxuICAvLyBjaGVjayBzaWduYXR1cmVcclxuICBzaWduYXR1cmUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGRhdGFbaXArK10sIGRhdGFbaXArK10sIGRhdGFbaXArK10sIGRhdGFbaXArK10pO1xyXG4gIGlmIChzaWduYXR1cmUgIT09ICdzZmJrJykge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHNpZ25hdHVyZTonICsgc2lnbmF0dXJlKTtcclxuICB9XHJcblxyXG4gIC8vIHJlYWQgc3RydWN0dXJlXHJcbiAgcGFyc2VyID0gbmV3IFJpZmYuUGFyc2VyKGRhdGEsIHsnaW5kZXgnOiBpcCwgJ2xlbmd0aCc6IGNodW5rLnNpemUgLSA0fSk7XHJcbiAgcGFyc2VyLnBhcnNlKCk7XHJcbiAgaWYgKHBhcnNlci5nZXROdW1iZXJPZkNodW5rcygpICE9PSAzKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgc2ZiayBzdHJ1Y3R1cmUnKTtcclxuICB9XHJcblxyXG4gIC8vIElORk8tbGlzdFxyXG4gIHRoaXMucGFyc2VJbmZvTGlzdCgvKiogQHR5cGUgeyFSaWZmLkNodW5rfSAqLyhwYXJzZXIuZ2V0Q2h1bmsoMCkpKTtcclxuXHJcbiAgLy8gc2R0YS1saXN0XHJcbiAgdGhpcy5wYXJzZVNkdGFMaXN0KC8qKiBAdHlwZSB7IVJpZmYuQ2h1bmt9ICovKHBhcnNlci5nZXRDaHVuaygxKSkpO1xyXG5cclxuICAvLyBwZHRhLWxpc3RcclxuICB0aGlzLnBhcnNlUGR0YUxpc3QoLyoqIEB0eXBlIHshUmlmZi5DaHVua30gKi8ocGFyc2VyLmdldENodW5rKDIpKSk7XHJcbn07XHJcblxyXG4vKipcclxuICogQHBhcmFtIHtSaWZmLkNodW5rfSBjaHVua1xyXG4gKi9cclxuUGFyc2VyLnByb3RvdHlwZS5wYXJzZUluZm9MaXN0ID0gZnVuY3Rpb24oY2h1bmspIHtcclxuICAvKiogQHR5cGUge1JpZmYuUGFyc2VyfSAqL1xyXG4gIHZhciBwYXJzZXI7XHJcbiAgLyoqIEB0eXBlIHtCeXRlQXJyYXl9ICovXHJcbiAgdmFyIGRhdGEgPSB0aGlzLmlucHV0O1xyXG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gIHZhciBpcCA9IGNodW5rLm9mZnNldDtcclxuICAvKiogQHR5cGUge3N0cmluZ30gKi9cclxuICB2YXIgc2lnbmF0dXJlO1xyXG5cclxuICAvLyBjaGVjayBwYXJzZSB0YXJnZXRcclxuICBpZiAoY2h1bmsudHlwZSAhPT0gJ0xJU1QnKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgY2h1bmsgdHlwZTonICsgY2h1bmsudHlwZSk7XHJcbiAgfVxyXG5cclxuICAvLyBjaGVjayBzaWduYXR1cmVcclxuICBzaWduYXR1cmUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGRhdGFbaXArK10sIGRhdGFbaXArK10sIGRhdGFbaXArK10sIGRhdGFbaXArK10pO1xyXG4gIGlmIChzaWduYXR1cmUgIT09ICdJTkZPJykge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHNpZ25hdHVyZTonICsgc2lnbmF0dXJlKTtcclxuICB9XHJcblxyXG4gIC8vIHJlYWQgc3RydWN0dXJlXHJcbiAgcGFyc2VyID0gbmV3IFJpZmYuUGFyc2VyKGRhdGEsIHsnaW5kZXgnOiBpcCwgJ2xlbmd0aCc6IGNodW5rLnNpemUgLSA0fSk7XHJcbiAgcGFyc2VyLnBhcnNlKCk7XHJcbn07XHJcblxyXG4vKipcclxuICogQHBhcmFtIHtSaWZmLkNodW5rfSBjaHVua1xyXG4gKi9cclxuUGFyc2VyLnByb3RvdHlwZS5wYXJzZVNkdGFMaXN0ID0gZnVuY3Rpb24oY2h1bmspIHtcclxuICAvKiogQHR5cGUge1JpZmYuUGFyc2VyfSAqL1xyXG4gIHZhciBwYXJzZXI7XHJcbiAgLyoqIEB0eXBlIHtCeXRlQXJyYXl9ICovXHJcbiAgdmFyIGRhdGEgPSB0aGlzLmlucHV0O1xyXG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gIHZhciBpcCA9IGNodW5rLm9mZnNldDtcclxuICAvKiogQHR5cGUge3N0cmluZ30gKi9cclxuICB2YXIgc2lnbmF0dXJlO1xyXG5cclxuICAvLyBjaGVjayBwYXJzZSB0YXJnZXRcclxuICBpZiAoY2h1bmsudHlwZSAhPT0gJ0xJU1QnKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgY2h1bmsgdHlwZTonICsgY2h1bmsudHlwZSk7XHJcbiAgfVxyXG5cclxuICAvLyBjaGVjayBzaWduYXR1cmVcclxuICBzaWduYXR1cmUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGRhdGFbaXArK10sIGRhdGFbaXArK10sIGRhdGFbaXArK10sIGRhdGFbaXArK10pO1xyXG4gIGlmIChzaWduYXR1cmUgIT09ICdzZHRhJykge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHNpZ25hdHVyZTonICsgc2lnbmF0dXJlKTtcclxuICB9XHJcblxyXG4gIC8vIHJlYWQgc3RydWN0dXJlXHJcbiAgcGFyc2VyID0gbmV3IFJpZmYuUGFyc2VyKGRhdGEsIHsnaW5kZXgnOiBpcCwgJ2xlbmd0aCc6IGNodW5rLnNpemUgLSA0fSk7XHJcbiAgcGFyc2VyLnBhcnNlKCk7XHJcbiAgaWYgKHBhcnNlci5jaHVua0xpc3QubGVuZ3RoICE9PSAxKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RPRE8nKTtcclxuICB9XHJcbiAgdGhpcy5zYW1wbGluZ0RhdGEgPVxyXG4gICAgLyoqIEB0eXBlIHt7dHlwZTogc3RyaW5nLCBzaXplOiBudW1iZXIsIG9mZnNldDogbnVtYmVyfX0gKi9cclxuICAgIChwYXJzZXIuZ2V0Q2h1bmsoMCkpO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIEBwYXJhbSB7UmlmZi5DaHVua30gY2h1bmtcclxuICovXHJcblBhcnNlci5wcm90b3R5cGUucGFyc2VQZHRhTGlzdCA9IGZ1bmN0aW9uKGNodW5rKSB7XHJcbiAgLyoqIEB0eXBlIHtSaWZmLlBhcnNlcn0gKi9cclxuICB2YXIgcGFyc2VyO1xyXG4gIC8qKiBAdHlwZSB7Qnl0ZUFycmF5fSAqL1xyXG4gIHZhciBkYXRhID0gdGhpcy5pbnB1dDtcclxuICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICB2YXIgaXAgPSBjaHVuay5vZmZzZXQ7XHJcbiAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXHJcbiAgdmFyIHNpZ25hdHVyZTtcclxuXHJcbiAgLy8gY2hlY2sgcGFyc2UgdGFyZ2V0XHJcbiAgaWYgKGNodW5rLnR5cGUgIT09ICdMSVNUJykge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGNodW5rIHR5cGU6JyArIGNodW5rLnR5cGUpO1xyXG4gIH1cclxuXHJcbiAgLy8gY2hlY2sgc2lnbmF0dXJlXHJcbiAgc2lnbmF0dXJlID0gU3RyaW5nLmZyb21DaGFyQ29kZShkYXRhW2lwKytdLCBkYXRhW2lwKytdLCBkYXRhW2lwKytdLCBkYXRhW2lwKytdKTtcclxuICBpZiAoc2lnbmF0dXJlICE9PSAncGR0YScpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzaWduYXR1cmU6JyArIHNpZ25hdHVyZSk7XHJcbiAgfVxyXG5cclxuICAvLyByZWFkIHN0cnVjdHVyZVxyXG4gIHBhcnNlciA9IG5ldyBSaWZmLlBhcnNlcihkYXRhLCB7J2luZGV4JzogaXAsICdsZW5ndGgnOiBjaHVuay5zaXplIC0gNH0pO1xyXG4gIHBhcnNlci5wYXJzZSgpO1xyXG5cclxuICAvLyBjaGVjayBudW1iZXIgb2YgY2h1bmtzXHJcbiAgaWYgKHBhcnNlci5nZXROdW1iZXJPZkNodW5rcygpICE9PSA5KSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcGR0YSBjaHVuaycpO1xyXG4gIH1cclxuXHJcbiAgdGhpcy5wYXJzZVBoZHIoLyoqIEB0eXBlIHtSaWZmLkNodW5rfSAqLyhwYXJzZXIuZ2V0Q2h1bmsoMCkpKTtcclxuICB0aGlzLnBhcnNlUGJhZygvKiogQHR5cGUge1JpZmYuQ2h1bmt9ICovKHBhcnNlci5nZXRDaHVuaygxKSkpO1xyXG4gIHRoaXMucGFyc2VQbW9kKC8qKiBAdHlwZSB7UmlmZi5DaHVua30gKi8ocGFyc2VyLmdldENodW5rKDIpKSk7XHJcbiAgdGhpcy5wYXJzZVBnZW4oLyoqIEB0eXBlIHtSaWZmLkNodW5rfSAqLyhwYXJzZXIuZ2V0Q2h1bmsoMykpKTtcclxuICB0aGlzLnBhcnNlSW5zdCgvKiogQHR5cGUge1JpZmYuQ2h1bmt9ICovKHBhcnNlci5nZXRDaHVuayg0KSkpO1xyXG4gIHRoaXMucGFyc2VJYmFnKC8qKiBAdHlwZSB7UmlmZi5DaHVua30gKi8ocGFyc2VyLmdldENodW5rKDUpKSk7XHJcbiAgdGhpcy5wYXJzZUltb2QoLyoqIEB0eXBlIHtSaWZmLkNodW5rfSAqLyhwYXJzZXIuZ2V0Q2h1bmsoNikpKTtcclxuICB0aGlzLnBhcnNlSWdlbigvKiogQHR5cGUge1JpZmYuQ2h1bmt9ICovKHBhcnNlci5nZXRDaHVuayg3KSkpO1xyXG4gIHRoaXMucGFyc2VTaGRyKC8qKiBAdHlwZSB7UmlmZi5DaHVua30gKi8ocGFyc2VyLmdldENodW5rKDgpKSk7XHJcbn07XHJcblxyXG4vKipcclxuICogQHBhcmFtIHtSaWZmLkNodW5rfSBjaHVua1xyXG4gKi9cclxuUGFyc2VyLnByb3RvdHlwZS5wYXJzZVBoZHIgPSBmdW5jdGlvbihjaHVuaykge1xyXG4gIC8qKiBAdHlwZSB7Qnl0ZUFycmF5fSAqL1xyXG4gIHZhciBkYXRhID0gdGhpcy5pbnB1dDtcclxuICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICB2YXIgaXAgPSBjaHVuay5vZmZzZXQ7XHJcbiAgLyoqIEB0eXBlIHtBcnJheS48T2JqZWN0Pn0gKi9cclxuICB2YXIgcHJlc2V0SGVhZGVyID0gdGhpcy5wcmVzZXRIZWFkZXIgPSBbXTtcclxuICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICB2YXIgc2l6ZSA9IGNodW5rLm9mZnNldCArIGNodW5rLnNpemU7XHJcblxyXG4gIC8vIGNoZWNrIHBhcnNlIHRhcmdldFxyXG4gIGlmIChjaHVuay50eXBlICE9PSAncGhkcicpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBjaHVuayB0eXBlOicgKyBjaHVuay50eXBlKTtcclxuICB9XHJcblxyXG4gIHdoaWxlIChpcCA8IHNpemUpIHtcclxuICAgIHByZXNldEhlYWRlci5wdXNoKHtcclxuICAgICAgcHJlc2V0TmFtZTogU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBkYXRhLnN1YmFycmF5KGlwLCBpcCArPSAyMCkpLFxyXG4gICAgICBwcmVzZXQ6IGRhdGFbaXArK10gfCAoZGF0YVtpcCsrXSA8PCA4KSxcclxuICAgICAgYmFuazogZGF0YVtpcCsrXSB8IChkYXRhW2lwKytdIDw8IDgpLFxyXG4gICAgICBwcmVzZXRCYWdJbmRleDogZGF0YVtpcCsrXSB8IChkYXRhW2lwKytdIDw8IDgpLFxyXG4gICAgICBsaWJyYXJ5OiAoZGF0YVtpcCsrXSB8IChkYXRhW2lwKytdIDw8IDgpIHwgKGRhdGFbaXArK10gPDwgMTYpIHwgKGRhdGFbaXArK10gPDwgMjQpKSA+Pj4gMCxcclxuICAgICAgZ2VucmU6IChkYXRhW2lwKytdIHwgKGRhdGFbaXArK10gPDwgOCkgfCAoZGF0YVtpcCsrXSA8PCAxNikgfCAoZGF0YVtpcCsrXSA8PCAyNCkpID4+PiAwLFxyXG4gICAgICBtb3JwaG9sb2d5OiAoZGF0YVtpcCsrXSB8IChkYXRhW2lwKytdIDw8IDgpIHwgKGRhdGFbaXArK10gPDwgMTYpIHwgKGRhdGFbaXArK10gPDwgMjQpKSA+Pj4gMFxyXG4gICAgfSk7XHJcbiAgfVxyXG59O1xyXG5cclxuLyoqXHJcbiAqIEBwYXJhbSB7UmlmZi5DaHVua30gY2h1bmtcclxuICovXHJcblBhcnNlci5wcm90b3R5cGUucGFyc2VQYmFnID0gZnVuY3Rpb24oY2h1bmspIHtcclxuICAvKiogQHR5cGUge0J5dGVBcnJheX0gKi9cclxuICB2YXIgZGF0YSA9IHRoaXMuaW5wdXQ7XHJcbiAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgdmFyIGlwID0gY2h1bmsub2Zmc2V0O1xyXG4gIC8qKiBAdHlwZSB7QXJyYXkuPE9iamVjdD59ICovXHJcbiAgdmFyIHByZXNldFpvbmUgPSB0aGlzLnByZXNldFpvbmUgPSBbXTtcclxuICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICB2YXIgc2l6ZSA9IGNodW5rLm9mZnNldCArIGNodW5rLnNpemU7XHJcblxyXG4gIC8vIGNoZWNrIHBhcnNlIHRhcmdldFxyXG4gIGlmIChjaHVuay50eXBlICE9PSAncGJhZycpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBjaHVuayB0eXBlOicgICsgY2h1bmsudHlwZSk7XHJcbiAgfVxyXG5cclxuICB3aGlsZSAoaXAgPCBzaXplKSB7XHJcbiAgICBwcmVzZXRab25lLnB1c2goe1xyXG4gICAgICBwcmVzZXRHZW5lcmF0b3JJbmRleDogZGF0YVtpcCsrXSB8IChkYXRhW2lwKytdIDw8IDgpLFxyXG4gICAgICBwcmVzZXRNb2R1bGF0b3JJbmRleDogZGF0YVtpcCsrXSB8IChkYXRhW2lwKytdIDw8IDgpXHJcbiAgICB9KTtcclxuICB9XHJcbn07XHJcblxyXG4vKipcclxuICogQHBhcmFtIHtSaWZmLkNodW5rfSBjaHVua1xyXG4gKi9cclxuUGFyc2VyLnByb3RvdHlwZS5wYXJzZVBtb2QgPSBmdW5jdGlvbihjaHVuaykge1xyXG4gIC8vIGNoZWNrIHBhcnNlIHRhcmdldFxyXG4gIGlmIChjaHVuay50eXBlICE9PSAncG1vZCcpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBjaHVuayB0eXBlOicgKyBjaHVuay50eXBlKTtcclxuICB9XHJcblxyXG4gIHRoaXMucHJlc2V0Wm9uZU1vZHVsYXRvciA9IHRoaXMucGFyc2VNb2R1bGF0b3IoY2h1bmspO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIEBwYXJhbSB7UmlmZi5DaHVua30gY2h1bmtcclxuICovXHJcblBhcnNlci5wcm90b3R5cGUucGFyc2VQZ2VuID0gZnVuY3Rpb24oY2h1bmspIHtcclxuICAvLyBjaGVjayBwYXJzZSB0YXJnZXRcclxuICBpZiAoY2h1bmsudHlwZSAhPT0gJ3BnZW4nKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgY2h1bmsgdHlwZTonICsgY2h1bmsudHlwZSk7XHJcbiAgfVxyXG4gIHRoaXMucHJlc2V0Wm9uZUdlbmVyYXRvciA9IHRoaXMucGFyc2VHZW5lcmF0b3IoY2h1bmspO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIEBwYXJhbSB7UmlmZi5DaHVua30gY2h1bmtcclxuICovXHJcblBhcnNlci5wcm90b3R5cGUucGFyc2VJbnN0ID0gZnVuY3Rpb24oY2h1bmspIHtcclxuICAvKiogQHR5cGUge0J5dGVBcnJheX0gKi9cclxuICB2YXIgZGF0YSA9IHRoaXMuaW5wdXQ7XHJcbiAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgdmFyIGlwID0gY2h1bmsub2Zmc2V0O1xyXG4gIC8qKiBAdHlwZSB7QXJyYXkuPE9iamVjdD59ICovXHJcbiAgdmFyIGluc3RydW1lbnQgPSB0aGlzLmluc3RydW1lbnQgPSBbXTtcclxuICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICB2YXIgc2l6ZSA9IGNodW5rLm9mZnNldCArIGNodW5rLnNpemU7XHJcblxyXG4gIC8vIGNoZWNrIHBhcnNlIHRhcmdldFxyXG4gIGlmIChjaHVuay50eXBlICE9PSAnaW5zdCcpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBjaHVuayB0eXBlOicgKyBjaHVuay50eXBlKTtcclxuICB9XHJcblxyXG4gIHdoaWxlIChpcCA8IHNpemUpIHtcclxuICAgIGluc3RydW1lbnQucHVzaCh7XHJcbiAgICAgIGluc3RydW1lbnROYW1lOiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGRhdGEuc3ViYXJyYXkoaXAsIGlwICs9IDIwKSksXHJcbiAgICAgIGluc3RydW1lbnRCYWdJbmRleDogZGF0YVtpcCsrXSB8IChkYXRhW2lwKytdIDw8IDgpXHJcbiAgICB9KTtcclxuICB9XHJcbn07XHJcblxyXG4vKipcclxuICogQHBhcmFtIHtSaWZmLkNodW5rfSBjaHVua1xyXG4gKi9cclxuUGFyc2VyLnByb3RvdHlwZS5wYXJzZUliYWcgPSBmdW5jdGlvbihjaHVuaykge1xyXG4gIC8qKiBAdHlwZSB7Qnl0ZUFycmF5fSAqL1xyXG4gIHZhciBkYXRhID0gdGhpcy5pbnB1dDtcclxuICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICB2YXIgaXAgPSBjaHVuay5vZmZzZXQ7XHJcbiAgLyoqIEB0eXBlIHtBcnJheS48T2JqZWN0Pn0gKi9cclxuICB2YXIgaW5zdHJ1bWVudFpvbmUgPSB0aGlzLmluc3RydW1lbnRab25lID0gW107XHJcbiAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgdmFyIHNpemUgPSBjaHVuay5vZmZzZXQgKyBjaHVuay5zaXplO1xyXG5cclxuICAvLyBjaGVjayBwYXJzZSB0YXJnZXRcclxuICBpZiAoY2h1bmsudHlwZSAhPT0gJ2liYWcnKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgY2h1bmsgdHlwZTonICsgY2h1bmsudHlwZSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgd2hpbGUgKGlwIDwgc2l6ZSkge1xyXG4gICAgaW5zdHJ1bWVudFpvbmUucHVzaCh7XHJcbiAgICAgIGluc3RydW1lbnRHZW5lcmF0b3JJbmRleDogZGF0YVtpcCsrXSB8IChkYXRhW2lwKytdIDw8IDgpLFxyXG4gICAgICBpbnN0cnVtZW50TW9kdWxhdG9ySW5kZXg6IGRhdGFbaXArK10gfCAoZGF0YVtpcCsrXSA8PCA4KVxyXG4gICAgfSk7XHJcbiAgfVxyXG59O1xyXG5cclxuLyoqXHJcbiAqIEBwYXJhbSB7UmlmZi5DaHVua30gY2h1bmtcclxuICovXHJcblBhcnNlci5wcm90b3R5cGUucGFyc2VJbW9kID0gZnVuY3Rpb24oY2h1bmspIHtcclxuICAvLyBjaGVjayBwYXJzZSB0YXJnZXRcclxuICBpZiAoY2h1bmsudHlwZSAhPT0gJ2ltb2QnKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgY2h1bmsgdHlwZTonICsgY2h1bmsudHlwZSk7XHJcbiAgfVxyXG5cclxuICB0aGlzLmluc3RydW1lbnRab25lTW9kdWxhdG9yID0gdGhpcy5wYXJzZU1vZHVsYXRvcihjaHVuayk7XHJcbn07XHJcblxyXG5cclxuLyoqXHJcbiAqIEBwYXJhbSB7UmlmZi5DaHVua30gY2h1bmtcclxuICovXHJcblBhcnNlci5wcm90b3R5cGUucGFyc2VJZ2VuID0gZnVuY3Rpb24oY2h1bmspIHtcclxuICAvLyBjaGVjayBwYXJzZSB0YXJnZXRcclxuICBpZiAoY2h1bmsudHlwZSAhPT0gJ2lnZW4nKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgY2h1bmsgdHlwZTonICsgY2h1bmsudHlwZSk7XHJcbiAgfVxyXG5cclxuICB0aGlzLmluc3RydW1lbnRab25lR2VuZXJhdG9yID0gdGhpcy5wYXJzZUdlbmVyYXRvcihjaHVuayk7XHJcbn07XHJcblxyXG4vKipcclxuICogQHBhcmFtIHtSaWZmLkNodW5rfSBjaHVua1xyXG4gKi9cclxuUGFyc2VyLnByb3RvdHlwZS5wYXJzZVNoZHIgPSBmdW5jdGlvbihjaHVuaykge1xyXG4gIC8qKiBAdHlwZSB7Qnl0ZUFycmF5fSAqL1xyXG4gIHZhciBkYXRhID0gdGhpcy5pbnB1dDtcclxuICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICB2YXIgaXAgPSBjaHVuay5vZmZzZXQ7XHJcbiAgLyoqIEB0eXBlIHtBcnJheS48T2JqZWN0Pn0gKi9cclxuICB2YXIgc2FtcGxlcyA9IHRoaXMuc2FtcGxlID0gW107XHJcbiAgLyoqIEB0eXBlIHtBcnJheS48T2JqZWN0Pn0gKi9cclxuICB2YXIgc2FtcGxlSGVhZGVyID0gdGhpcy5zYW1wbGVIZWFkZXIgPSBbXTtcclxuICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICB2YXIgc2l6ZSA9IGNodW5rLm9mZnNldCArIGNodW5rLnNpemU7XHJcbiAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXHJcbiAgdmFyIHNhbXBsZU5hbWU7XHJcbiAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgdmFyIHN0YXJ0O1xyXG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gIHZhciBlbmQ7XHJcbiAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgdmFyIHN0YXJ0TG9vcDtcclxuICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICB2YXIgZW5kTG9vcDtcclxuICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICB2YXIgc2FtcGxlUmF0ZTtcclxuICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICB2YXIgb3JpZ2luYWxQaXRjaDtcclxuICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICB2YXIgcGl0Y2hDb3JyZWN0aW9uO1xyXG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gIHZhciBzYW1wbGVMaW5rO1xyXG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gIHZhciBzYW1wbGVUeXBlO1xyXG5cclxuICAvLyBjaGVjayBwYXJzZSB0YXJnZXRcclxuICBpZiAoY2h1bmsudHlwZSAhPT0gJ3NoZHInKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgY2h1bmsgdHlwZTonICsgY2h1bmsudHlwZSk7XHJcbiAgfVxyXG5cclxuICB3aGlsZSAoaXAgPCBzaXplKSB7XHJcbiAgICBzYW1wbGVOYW1lID0gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBkYXRhLnN1YmFycmF5KGlwLCBpcCArPSAyMCkpO1xyXG4gICAgc3RhcnQgPSAoXHJcbiAgICAgIChkYXRhW2lwKytdIDw8IDApIHwgKGRhdGFbaXArK10gPDwgOCkgfCAoZGF0YVtpcCsrXSA8PCAxNikgfCAoZGF0YVtpcCsrXSA8PCAyNClcclxuICAgICkgPj4+IDA7XHJcbiAgICBlbmQgPSAoXHJcbiAgICAgIChkYXRhW2lwKytdIDw8IDApIHwgKGRhdGFbaXArK10gPDwgOCkgfCAoZGF0YVtpcCsrXSA8PCAxNikgfCAoZGF0YVtpcCsrXSA8PCAyNClcclxuICAgICkgPj4+IDA7XHJcbiAgICBzdGFydExvb3AgPSAoXHJcbiAgICAgIChkYXRhW2lwKytdIDw8IDApIHwgKGRhdGFbaXArK10gPDwgOCkgfCAoZGF0YVtpcCsrXSA8PCAxNikgfCAoZGF0YVtpcCsrXSA8PCAyNClcclxuICAgICkgPj4+IDA7XHJcbiAgICBlbmRMb29wID0gIChcclxuICAgICAgKGRhdGFbaXArK10gPDwgMCkgfCAoZGF0YVtpcCsrXSA8PCA4KSB8IChkYXRhW2lwKytdIDw8IDE2KSB8IChkYXRhW2lwKytdIDw8IDI0KVxyXG4gICAgKSA+Pj4gMDtcclxuICAgIHNhbXBsZVJhdGUgPSAoXHJcbiAgICAgIChkYXRhW2lwKytdIDw8IDApIHwgKGRhdGFbaXArK10gPDwgOCkgfCAoZGF0YVtpcCsrXSA8PCAxNikgfCAoZGF0YVtpcCsrXSA8PCAyNClcclxuICAgICkgPj4+IDA7XHJcbiAgICBvcmlnaW5hbFBpdGNoID0gZGF0YVtpcCsrXTtcclxuICAgIHBpdGNoQ29ycmVjdGlvbiA9IChkYXRhW2lwKytdIDw8IDI0KSA+PiAyNDtcclxuICAgIHNhbXBsZUxpbmsgPSBkYXRhW2lwKytdIHwgKGRhdGFbaXArK10gPDwgOCk7XHJcbiAgICBzYW1wbGVUeXBlID0gZGF0YVtpcCsrXSB8IChkYXRhW2lwKytdIDw8IDgpO1xyXG5cclxuICAgIC8vKlxyXG4gICAgdmFyIHNhbXBsZSA9IG5ldyBJbnQxNkFycmF5KG5ldyBVaW50OEFycmF5KGRhdGEuc3ViYXJyYXkoXHJcbiAgICAgIHRoaXMuc2FtcGxpbmdEYXRhLm9mZnNldCArIHN0YXJ0ICogMixcclxuICAgICAgdGhpcy5zYW1wbGluZ0RhdGEub2Zmc2V0ICsgZW5kICAgKiAyXHJcbiAgICApKS5idWZmZXIpO1xyXG5cclxuICAgIHN0YXJ0TG9vcCAtPSBzdGFydDtcclxuICAgIGVuZExvb3AgLT0gc3RhcnQ7XHJcblxyXG4gICAgaWYgKHNhbXBsZVJhdGUgPiAwKSB7XHJcbiAgICAgIHZhciBhZGp1c3QgPSB0aGlzLmFkanVzdFNhbXBsZURhdGEoc2FtcGxlLCBzYW1wbGVSYXRlKTtcclxuICAgICAgc2FtcGxlID0gYWRqdXN0LnNhbXBsZTtcclxuICAgICAgc2FtcGxlUmF0ZSAqPSBhZGp1c3QubXVsdGlwbHk7XHJcbiAgICAgIHN0YXJ0TG9vcCAqPSBhZGp1c3QubXVsdGlwbHk7XHJcbiAgICAgIGVuZExvb3AgKj0gYWRqdXN0Lm11bHRpcGx5O1xyXG4gICAgfVxyXG5cclxuICAgIHNhbXBsZXMucHVzaChzYW1wbGUpO1xyXG4gICAgLy8qL1xyXG5cclxuICAgIHNhbXBsZUhlYWRlci5wdXNoKHtcclxuICAgICAgc2FtcGxlTmFtZTogc2FtcGxlTmFtZSxcclxuICAgICAgLypcclxuICAgICAgc3RhcnQ6IHN0YXJ0LFxyXG4gICAgICBlbmQ6IGVuZCxcclxuICAgICAgKi9cclxuICAgICAgc3RhcnRMb29wOiBzdGFydExvb3AsXHJcbiAgICAgIGVuZExvb3A6IGVuZExvb3AsXHJcbiAgICAgIHNhbXBsZVJhdGU6IHNhbXBsZVJhdGUsXHJcbiAgICAgIG9yaWdpbmFsUGl0Y2g6IG9yaWdpbmFsUGl0Y2gsXHJcbiAgICAgIHBpdGNoQ29ycmVjdGlvbjogcGl0Y2hDb3JyZWN0aW9uLFxyXG4gICAgICBzYW1wbGVMaW5rOiBzYW1wbGVMaW5rLFxyXG4gICAgICBzYW1wbGVUeXBlOiBzYW1wbGVUeXBlXHJcbiAgICB9KTtcclxuICB9XHJcbn07XHJcblxyXG5QYXJzZXIucHJvdG90eXBlLmFkanVzdFNhbXBsZURhdGEgPSBmdW5jdGlvbihzYW1wbGUsIHNhbXBsZVJhdGUpIHtcclxuICAvKiogQHR5cGUge0ludDE2QXJyYXl9ICovXHJcbiAgdmFyIG5ld1NhbXBsZTtcclxuICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICB2YXIgaTtcclxuICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICB2YXIgaWw7XHJcbiAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgdmFyIGo7XHJcbiAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgdmFyIG11bHRpcGx5ID0gMTtcclxuXHJcbiAgLy8gYnVmZmVyXHJcbiAgd2hpbGUgKHNhbXBsZVJhdGUgPCAyMjA1MCkge1xyXG4gICAgbmV3U2FtcGxlID0gbmV3IEludDE2QXJyYXkoc2FtcGxlLmxlbmd0aCAqIDIpO1xyXG4gICAgZm9yIChpID0gaiA9IDAsIGlsID0gc2FtcGxlLmxlbmd0aDsgaSA8IGlsOyArK2kpIHtcclxuICAgICAgbmV3U2FtcGxlW2orK10gPSBzYW1wbGVbaV07XHJcbiAgICAgIG5ld1NhbXBsZVtqKytdID0gc2FtcGxlW2ldO1xyXG4gICAgfVxyXG4gICAgc2FtcGxlID0gbmV3U2FtcGxlO1xyXG4gICAgbXVsdGlwbHkgKj0gMjtcclxuICAgIHNhbXBsZVJhdGUgKj0gMjtcclxuICB9XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBzYW1wbGU6IHNhbXBsZSxcclxuICAgIG11bHRpcGx5OiBtdWx0aXBseVxyXG4gIH07XHJcbn07XHJcblxyXG4vKipcclxuICogQHBhcmFtIHtSaWZmLkNodW5rfSBjaHVua1xyXG4gKiBAcmV0dXJuIHtBcnJheS48T2JqZWN0Pn1cclxuICovXHJcblBhcnNlci5wcm90b3R5cGUucGFyc2VNb2R1bGF0b3IgPSBmdW5jdGlvbihjaHVuaykge1xyXG4gIC8qKiBAdHlwZSB7Qnl0ZUFycmF5fSAqL1xyXG4gIHZhciBkYXRhID0gdGhpcy5pbnB1dDtcclxuICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICB2YXIgaXAgPSBjaHVuay5vZmZzZXQ7XHJcbiAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgdmFyIHNpemUgPSBjaHVuay5vZmZzZXQgKyBjaHVuay5zaXplO1xyXG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gIHZhciBjb2RlO1xyXG4gIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xyXG4gIHZhciBrZXk7XHJcbiAgLyoqIEB0eXBlIHtBcnJheS48T2JqZWN0Pn0gKi9cclxuICB2YXIgb3V0cHV0ID0gW107XHJcblxyXG4gIHdoaWxlIChpcCA8IHNpemUpIHtcclxuICAgIC8vIFNyYyAgT3BlclxyXG4gICAgLy8gVE9ET1xyXG4gICAgaXAgKz0gMjtcclxuXHJcbiAgICAvLyBEZXN0IE9wZXJcclxuICAgIGNvZGUgPSBkYXRhW2lwKytdIHwgKGRhdGFbaXArK10gPDwgOCk7XHJcbiAgICBrZXkgPSBQYXJzZXIuR2VuZXJhdG9yRW51bWVyYXRvclRhYmxlW2NvZGVdO1xyXG4gICAgaWYgKGtleSA9PT0gdm9pZCAwKSB7XHJcbiAgICAgIC8vIEFtb3VudFxyXG4gICAgICBvdXRwdXQucHVzaCh7XHJcbiAgICAgICAgdHlwZToga2V5LFxyXG4gICAgICAgIHZhbHVlOiB7XHJcbiAgICAgICAgICBjb2RlOiBjb2RlLFxyXG4gICAgICAgICAgYW1vdW50OiBkYXRhW2lwXSB8IChkYXRhW2lwKzFdIDw8IDgpIDw8IDE2ID4+IDE2LFxyXG4gICAgICAgICAgbG86IGRhdGFbaXArK10sXHJcbiAgICAgICAgICBoaTogZGF0YVtpcCsrXVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBBbW91bnRcclxuICAgICAgc3dpdGNoIChrZXkpIHtcclxuICAgICAgICBjYXNlICdrZXlSYW5nZSc6IC8qIEZBTExUSFJPVUdIICovXHJcbiAgICAgICAgY2FzZSAndmVsUmFuZ2UnOiAvKiBGQUxMVEhST1VHSCAqL1xyXG4gICAgICAgIGNhc2UgJ2tleW51bSc6IC8qIEZBTExUSFJPVUdIICovXHJcbiAgICAgICAgY2FzZSAndmVsb2NpdHknOlxyXG4gICAgICAgICAgb3V0cHV0LnB1c2goe1xyXG4gICAgICAgICAgICB0eXBlOiBrZXksXHJcbiAgICAgICAgICAgIHZhbHVlOiB7XHJcbiAgICAgICAgICAgICAgbG86IGRhdGFbaXArK10sXHJcbiAgICAgICAgICAgICAgaGk6IGRhdGFbaXArK11cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgb3V0cHV0LnB1c2goe1xyXG4gICAgICAgICAgICB0eXBlOiBrZXksXHJcbiAgICAgICAgICAgIHZhbHVlOiB7XHJcbiAgICAgICAgICAgICAgYW1vdW50OiBkYXRhW2lwKytdIHwgKGRhdGFbaXArK10gPDwgOCkgPDwgMTYgPj4gMTZcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIEFtdFNyY09wZXJcclxuICAgIC8vIFRPRE9cclxuICAgIGlwICs9IDI7XHJcblxyXG4gICAgLy8gVHJhbnMgT3BlclxyXG4gICAgLy8gVE9ET1xyXG4gICAgaXAgKz0gMjtcclxuICB9XHJcblxyXG4gIHJldHVybiBvdXRwdXQ7XHJcbn07XHJcblxyXG4vKipcclxuICogQHBhcmFtIHtSaWZmLkNodW5rfSBjaHVua1xyXG4gKiBAcmV0dXJuIHtBcnJheS48T2JqZWN0Pn1cclxuICovXHJcblBhcnNlci5wcm90b3R5cGUucGFyc2VHZW5lcmF0b3IgPSBmdW5jdGlvbihjaHVuaykge1xyXG4gIC8qKiBAdHlwZSB7Qnl0ZUFycmF5fSAqL1xyXG4gIHZhciBkYXRhID0gdGhpcy5pbnB1dDtcclxuICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICB2YXIgaXAgPSBjaHVuay5vZmZzZXQ7XHJcbiAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgdmFyIHNpemUgPSBjaHVuay5vZmZzZXQgKyBjaHVuay5zaXplO1xyXG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gIHZhciBjb2RlO1xyXG4gIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xyXG4gIHZhciBrZXk7XHJcbiAgLyoqIEB0eXBlIHtBcnJheS48T2JqZWN0Pn0gKi9cclxuICB2YXIgb3V0cHV0ID0gW107XHJcblxyXG4gIHdoaWxlIChpcCA8IHNpemUpIHtcclxuICAgIGNvZGUgPSBkYXRhW2lwKytdIHwgKGRhdGFbaXArK10gPDwgOCk7XHJcbiAgICBrZXkgPSBQYXJzZXIuR2VuZXJhdG9yRW51bWVyYXRvclRhYmxlW2NvZGVdO1xyXG4gICAgaWYgKGtleSA9PT0gdm9pZCAwKSB7XHJcbiAgICAgIG91dHB1dC5wdXNoKHtcclxuICAgICAgICB0eXBlOiBrZXksXHJcbiAgICAgICAgdmFsdWU6IHtcclxuICAgICAgICAgIGNvZGU6IGNvZGUsXHJcbiAgICAgICAgICBhbW91bnQ6IGRhdGFbaXBdIHwgKGRhdGFbaXArMV0gPDwgOCkgPDwgMTYgPj4gMTYsXHJcbiAgICAgICAgICBsbzogZGF0YVtpcCsrXSxcclxuICAgICAgICAgIGhpOiBkYXRhW2lwKytdXHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgY29udGludWU7XHJcbiAgICB9XHJcblxyXG4gICAgc3dpdGNoIChrZXkpIHtcclxuICAgICAgY2FzZSAna2V5bnVtJzogLyogRkFMTFRIUk9VR0ggKi9cclxuICAgICAgY2FzZSAna2V5UmFuZ2UnOiAvKiBGQUxMVEhST1VHSCAqL1xyXG4gICAgICBjYXNlICd2ZWxSYW5nZSc6IC8qIEZBTExUSFJPVUdIICovXHJcbiAgICAgIGNhc2UgJ3ZlbG9jaXR5JzpcclxuICAgICAgICBvdXRwdXQucHVzaCh7XHJcbiAgICAgICAgICB0eXBlOiBrZXksXHJcbiAgICAgICAgICB2YWx1ZToge1xyXG4gICAgICAgICAgICBsbzogZGF0YVtpcCsrXSxcclxuICAgICAgICAgICAgaGk6IGRhdGFbaXArK11cclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBvdXRwdXQucHVzaCh7XHJcbiAgICAgICAgICB0eXBlOiBrZXksXHJcbiAgICAgICAgICB2YWx1ZToge1xyXG4gICAgICAgICAgICBhbW91bnQ6IGRhdGFbaXArK10gfCAoZGF0YVtpcCsrXSA8PCA4KSA8PCAxNiA+PiAxNlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIG91dHB1dDtcclxufTtcclxuXHJcblBhcnNlci5wcm90b3R5cGUuY3JlYXRlSW5zdHJ1bWVudCA9IGZ1bmN0aW9uKCkge1xyXG4gIC8qKiBAdHlwZSB7QXJyYXkuPE9iamVjdD59ICovXHJcbiAgdmFyIGluc3RydW1lbnQgPSB0aGlzLmluc3RydW1lbnQ7XHJcbiAgLyoqIEB0eXBlIHtBcnJheS48T2JqZWN0Pn0gKi9cclxuICB2YXIgem9uZSA9IHRoaXMuaW5zdHJ1bWVudFpvbmU7XHJcbiAgLyoqIEB0eXBlIHtBcnJheS48T2JqZWN0Pn0gKi9cclxuICB2YXIgb3V0cHV0ID0gW107XHJcbiAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgdmFyIGJhZ0luZGV4O1xyXG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gIHZhciBiYWdJbmRleEVuZDtcclxuICAvKiogQHR5cGUge0FycmF5LjxPYmplY3Q+fSAqL1xyXG4gIHZhciB6b25lSW5mbztcclxuICAvKiogQHR5cGUge3tnZW5lcmF0b3I6IE9iamVjdCwgZ2VuZXJhdG9ySW5mbzogQXJyYXkuPE9iamVjdD59fSAqL1xyXG4gIHZhciBpbnN0cnVtZW50R2VuZXJhdG9yO1xyXG4gIC8qKiBAdHlwZSB7e21vZHVsYXRvcjogT2JqZWN0LCBtb2R1bGF0b3JJbmZvOiBBcnJheS48T2JqZWN0Pn19ICovXHJcbiAgdmFyIGluc3RydW1lbnRNb2R1bGF0b3I7XHJcbiAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgdmFyIGk7XHJcbiAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgdmFyIGlsO1xyXG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gIHZhciBqO1xyXG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gIHZhciBqbDtcclxuXHJcbiAgLy8gaW5zdHJ1bWVudCAtPiBpbnN0cnVtZW50IGJhZyAtPiBnZW5lcmF0b3IgLyBtb2R1bGF0b3JcclxuICBmb3IgKGkgPSAwLCBpbCA9IGluc3RydW1lbnQubGVuZ3RoOyBpIDwgaWw7ICsraSkge1xyXG4gICAgYmFnSW5kZXggICAgPSBpbnN0cnVtZW50W2ldLmluc3RydW1lbnRCYWdJbmRleDtcclxuICAgIGJhZ0luZGV4RW5kID0gaW5zdHJ1bWVudFtpKzFdID8gaW5zdHJ1bWVudFtpKzFdLmluc3RydW1lbnRCYWdJbmRleCA6IHpvbmUubGVuZ3RoO1xyXG4gICAgem9uZUluZm8gPSBbXTtcclxuXHJcbiAgICAvLyBpbnN0cnVtZW50IGJhZ1xyXG4gICAgZm9yIChqID0gYmFnSW5kZXgsIGpsID0gYmFnSW5kZXhFbmQ7IGogPCBqbDsgKytqKSB7XHJcbiAgICAgIGluc3RydW1lbnRHZW5lcmF0b3IgPSB0aGlzLmNyZWF0ZUluc3RydW1lbnRHZW5lcmF0b3JfKHpvbmUsIGopO1xyXG4gICAgICBpbnN0cnVtZW50TW9kdWxhdG9yID0gdGhpcy5jcmVhdGVJbnN0cnVtZW50TW9kdWxhdG9yXyh6b25lLCBqKTtcclxuXHJcbiAgICAgIHpvbmVJbmZvLnB1c2goe1xyXG4gICAgICAgIGdlbmVyYXRvcjogaW5zdHJ1bWVudEdlbmVyYXRvci5nZW5lcmF0b3IsXHJcbiAgICAgICAgZ2VuZXJhdG9yU2VxdWVuY2U6IGluc3RydW1lbnRHZW5lcmF0b3IuZ2VuZXJhdG9ySW5mbyxcclxuICAgICAgICBtb2R1bGF0b3I6IGluc3RydW1lbnRNb2R1bGF0b3IubW9kdWxhdG9yLFxyXG4gICAgICAgIG1vZHVsYXRvclNlcXVlbmNlOiBpbnN0cnVtZW50TW9kdWxhdG9yLm1vZHVsYXRvckluZm9cclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgb3V0cHV0LnB1c2goe1xyXG4gICAgICBuYW1lOiBpbnN0cnVtZW50W2ldLmluc3RydW1lbnROYW1lLFxyXG4gICAgICBpbmZvOiB6b25lSW5mb1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gb3V0cHV0O1xyXG59O1xyXG5cclxuUGFyc2VyLnByb3RvdHlwZS5jcmVhdGVQcmVzZXQgPSBmdW5jdGlvbigpIHtcclxuICAvKiogQHR5cGUge0FycmF5LjxPYmplY3Q+fSAqL1xyXG4gIHZhciBwcmVzZXQgICA9IHRoaXMucHJlc2V0SGVhZGVyO1xyXG4gIC8qKiBAdHlwZSB7QXJyYXkuPE9iamVjdD59ICovXHJcbiAgdmFyIHpvbmUgPSB0aGlzLnByZXNldFpvbmU7XHJcbiAgLyoqIEB0eXBlIHtBcnJheS48T2JqZWN0Pn0gKi9cclxuICB2YXIgb3V0cHV0ID0gW107XHJcbiAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgdmFyIGJhZ0luZGV4O1xyXG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gIHZhciBiYWdJbmRleEVuZDtcclxuICAvKiogQHR5cGUge0FycmF5LjxPYmplY3Q+fSAqL1xyXG4gIHZhciB6b25lSW5mbztcclxuICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICB2YXIgaW5zdHJ1bWVudDtcclxuICAvKiogQHR5cGUge3tnZW5lcmF0b3I6IE9iamVjdCwgZ2VuZXJhdG9ySW5mbzogQXJyYXkuPE9iamVjdD59fSAqL1xyXG4gIHZhciBwcmVzZXRHZW5lcmF0b3I7XHJcbiAgLyoqIEB0eXBlIHt7bW9kdWxhdG9yOiBPYmplY3QsIG1vZHVsYXRvckluZm86IEFycmF5LjxPYmplY3Q+fX0gKi9cclxuICB2YXIgcHJlc2V0TW9kdWxhdG9yO1xyXG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gIHZhciBpO1xyXG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gIHZhciBpbDtcclxuICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICB2YXIgajtcclxuICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICB2YXIgamw7XHJcblxyXG4gIC8vIHByZXNldCAtPiBwcmVzZXQgYmFnIC0+IGdlbmVyYXRvciAvIG1vZHVsYXRvclxyXG4gIGZvciAoaSA9IDAsIGlsID0gcHJlc2V0Lmxlbmd0aDsgaSA8IGlsOyArK2kpIHtcclxuICAgIGJhZ0luZGV4ICAgID0gcHJlc2V0W2ldLnByZXNldEJhZ0luZGV4O1xyXG4gICAgYmFnSW5kZXhFbmQgPSBwcmVzZXRbaSsxXSA/IHByZXNldFtpKzFdLnByZXNldEJhZ0luZGV4IDogem9uZS5sZW5ndGg7XHJcbiAgICB6b25lSW5mbyA9IFtdO1xyXG5cclxuICAgIC8vIHByZXNldCBiYWdcclxuICAgIGZvciAoaiA9IGJhZ0luZGV4LCBqbCA9IGJhZ0luZGV4RW5kOyBqIDwgamw7ICsraikge1xyXG4gICAgICBwcmVzZXRHZW5lcmF0b3IgPSB0aGlzLmNyZWF0ZVByZXNldEdlbmVyYXRvcl8oem9uZSwgaik7XHJcbiAgICAgIHByZXNldE1vZHVsYXRvciA9IHRoaXMuY3JlYXRlUHJlc2V0TW9kdWxhdG9yXyh6b25lLCBqKTtcclxuXHJcbiAgICAgIHpvbmVJbmZvLnB1c2goe1xyXG4gICAgICAgIGdlbmVyYXRvcjogcHJlc2V0R2VuZXJhdG9yLmdlbmVyYXRvcixcclxuICAgICAgICBnZW5lcmF0b3JTZXF1ZW5jZTogcHJlc2V0R2VuZXJhdG9yLmdlbmVyYXRvckluZm8sXHJcbiAgICAgICAgbW9kdWxhdG9yOiBwcmVzZXRNb2R1bGF0b3IubW9kdWxhdG9yLFxyXG4gICAgICAgIG1vZHVsYXRvclNlcXVlbmNlOiBwcmVzZXRNb2R1bGF0b3IubW9kdWxhdG9ySW5mb1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGluc3RydW1lbnQgPVxyXG4gICAgICAgIHByZXNldEdlbmVyYXRvci5nZW5lcmF0b3JbJ2luc3RydW1lbnQnXSAhPT0gdm9pZCAwID9cclxuICAgICAgICAgIHByZXNldEdlbmVyYXRvci5nZW5lcmF0b3JbJ2luc3RydW1lbnQnXS5hbW91bnQgOlxyXG4gICAgICAgIHByZXNldE1vZHVsYXRvci5tb2R1bGF0b3JbJ2luc3RydW1lbnQnXSAhPT0gdm9pZCAwID9cclxuICAgICAgICAgIHByZXNldE1vZHVsYXRvci5tb2R1bGF0b3JbJ2luc3RydW1lbnQnXS5hbW91bnQgOlxyXG4gICAgICAgIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgb3V0cHV0LnB1c2goe1xyXG4gICAgICBuYW1lOiBwcmVzZXRbaV0ucHJlc2V0TmFtZSxcclxuICAgICAgaW5mbzogem9uZUluZm8sXHJcbiAgICAgIGhlYWRlcjogcHJlc2V0W2ldLFxyXG4gICAgICBpbnN0cnVtZW50OiBpbnN0cnVtZW50XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHJldHVybiBvdXRwdXQ7XHJcbn07XHJcblxyXG4vKipcclxuICogQHBhcmFtIHtBcnJheS48T2JqZWN0Pn0gem9uZVxyXG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXhcclxuICogQHJldHVybnMge3tnZW5lcmF0b3I6IE9iamVjdCwgZ2VuZXJhdG9ySW5mbzogQXJyYXkuPE9iamVjdD59fVxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cclxuUGFyc2VyLnByb3RvdHlwZS5jcmVhdGVJbnN0cnVtZW50R2VuZXJhdG9yXyA9IGZ1bmN0aW9uKHpvbmUsIGluZGV4KSB7XHJcbiAgdmFyIG1vZGdlbiA9IHRoaXMuY3JlYXRlQmFnTW9kR2VuXyhcclxuICAgIHpvbmUsXHJcbiAgICB6b25lW2luZGV4XS5pbnN0cnVtZW50R2VuZXJhdG9ySW5kZXgsXHJcbiAgICB6b25lW2luZGV4KzFdID8gem9uZVtpbmRleCsxXS5pbnN0cnVtZW50R2VuZXJhdG9ySW5kZXg6IHRoaXMuaW5zdHJ1bWVudFpvbmVHZW5lcmF0b3IubGVuZ3RoLFxyXG4gICAgdGhpcy5pbnN0cnVtZW50Wm9uZUdlbmVyYXRvclxyXG4gICk7XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBnZW5lcmF0b3I6IG1vZGdlbi5tb2RnZW4sXHJcbiAgICBnZW5lcmF0b3JJbmZvOiBtb2RnZW4ubW9kZ2VuSW5mb1xyXG4gIH07XHJcbn07XHJcblxyXG4vKipcclxuICogQHBhcmFtIHtBcnJheS48T2JqZWN0Pn0gem9uZVxyXG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXhcclxuICogQHJldHVybnMge3ttb2R1bGF0b3I6IE9iamVjdCwgbW9kdWxhdG9ySW5mbzogQXJyYXkuPE9iamVjdD59fVxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cclxuUGFyc2VyLnByb3RvdHlwZS5jcmVhdGVJbnN0cnVtZW50TW9kdWxhdG9yXyA9IGZ1bmN0aW9uKHpvbmUsIGluZGV4KSB7XHJcbiAgdmFyIG1vZGdlbiA9IHRoaXMuY3JlYXRlQmFnTW9kR2VuXyhcclxuICAgIHpvbmUsXHJcbiAgICB6b25lW2luZGV4XS5wcmVzZXRNb2R1bGF0b3JJbmRleCxcclxuICAgIHpvbmVbaW5kZXgrMV0gPyB6b25lW2luZGV4KzFdLmluc3RydW1lbnRNb2R1bGF0b3JJbmRleDogdGhpcy5pbnN0cnVtZW50Wm9uZU1vZHVsYXRvci5sZW5ndGgsXHJcbiAgICB0aGlzLmluc3RydW1lbnRab25lTW9kdWxhdG9yXHJcbiAgKTtcclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIG1vZHVsYXRvcjogbW9kZ2VuLm1vZGdlbixcclxuICAgIG1vZHVsYXRvckluZm86IG1vZGdlbi5tb2RnZW5JbmZvXHJcbiAgfTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBAcGFyYW0ge0FycmF5LjxPYmplY3Q+fSB6b25lXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleFxyXG4gKiBAcmV0dXJucyB7e2dlbmVyYXRvcjogT2JqZWN0LCBnZW5lcmF0b3JJbmZvOiBBcnJheS48T2JqZWN0Pn19XHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5QYXJzZXIucHJvdG90eXBlLmNyZWF0ZVByZXNldEdlbmVyYXRvcl8gPSBmdW5jdGlvbih6b25lLCBpbmRleCkge1xyXG4gIHZhciBtb2RnZW4gPSB0aGlzLmNyZWF0ZUJhZ01vZEdlbl8oXHJcbiAgICB6b25lLFxyXG4gICAgem9uZVtpbmRleF0ucHJlc2V0R2VuZXJhdG9ySW5kZXgsXHJcbiAgICB6b25lW2luZGV4KzFdID8gem9uZVtpbmRleCsxXS5wcmVzZXRHZW5lcmF0b3JJbmRleCA6IHRoaXMucHJlc2V0Wm9uZUdlbmVyYXRvci5sZW5ndGgsXHJcbiAgICB0aGlzLnByZXNldFpvbmVHZW5lcmF0b3JcclxuICApO1xyXG5cclxuICByZXR1cm4ge1xyXG4gICAgZ2VuZXJhdG9yOiBtb2RnZW4ubW9kZ2VuLFxyXG4gICAgZ2VuZXJhdG9ySW5mbzogbW9kZ2VuLm1vZGdlbkluZm9cclxuICB9O1xyXG59O1xyXG5cclxuICAvKipcclxuICAgKiBAcGFyYW0ge0FycmF5LjxPYmplY3Q+fSB6b25lXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XHJcbiAgICogQHJldHVybnMge3ttb2R1bGF0b3I6IE9iamVjdCwgbW9kdWxhdG9ySW5mbzogQXJyYXkuPE9iamVjdD59fVxyXG4gICAqIEBwcml2YXRlXHJcbiAgICovXHJcblBhcnNlci5wcm90b3R5cGUuY3JlYXRlUHJlc2V0TW9kdWxhdG9yXyA9IGZ1bmN0aW9uKHpvbmUsIGluZGV4KSB7XHJcbiAgLyoqIEB0eXBlIHt7bW9kZ2VuOiBPYmplY3QsIG1vZGdlbkluZm86IEFycmF5LjxPYmplY3Q+fX0gKi9cclxuICB2YXIgbW9kZ2VuID0gdGhpcy5jcmVhdGVCYWdNb2RHZW5fKFxyXG4gICAgem9uZSxcclxuICAgIHpvbmVbaW5kZXhdLnByZXNldE1vZHVsYXRvckluZGV4LFxyXG4gICAgem9uZVtpbmRleCsxXSA/IHpvbmVbaW5kZXgrMV0ucHJlc2V0TW9kdWxhdG9ySW5kZXggOiB0aGlzLnByZXNldFpvbmVNb2R1bGF0b3IubGVuZ3RoLFxyXG4gICAgdGhpcy5wcmVzZXRab25lTW9kdWxhdG9yXHJcbiAgKTtcclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIG1vZHVsYXRvcjogbW9kZ2VuLm1vZGdlbixcclxuICAgIG1vZHVsYXRvckluZm86IG1vZGdlbi5tb2RnZW5JbmZvXHJcbiAgfTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBAcGFyYW0ge0FycmF5LjxPYmplY3Q+fSB6b25lXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleFN0YXJ0XHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleEVuZFxyXG4gKiBAcGFyYW0gem9uZU1vZEdlblxyXG4gKiBAcmV0dXJucyB7e21vZGdlbjogT2JqZWN0LCBtb2RnZW5JbmZvOiBBcnJheS48T2JqZWN0Pn19XHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5QYXJzZXIucHJvdG90eXBlLmNyZWF0ZUJhZ01vZEdlbl8gPSBmdW5jdGlvbih6b25lLCBpbmRleFN0YXJ0LCBpbmRleEVuZCwgem9uZU1vZEdlbikge1xyXG4gIC8qKiBAdHlwZSB7QXJyYXkuPE9iamVjdD59ICovXHJcbiAgdmFyIG1vZGdlbkluZm8gPSBbXTtcclxuICAvKiogQHR5cGUge09iamVjdH0gKi9cclxuICB2YXIgbW9kZ2VuID0ge1xyXG4gICAgdW5rbm93bjogW10sXHJcbiAgICAna2V5UmFuZ2UnOiB7XHJcbiAgICAgIGhpOiAxMjcsXHJcbiAgICAgIGxvOiAwXHJcbiAgICB9XHJcbiAgfTsgLy8gVE9ET1xyXG4gIC8qKiBAdHlwZSB7T2JqZWN0fSAqL1xyXG4gIHZhciBpbmZvO1xyXG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gIHZhciBpO1xyXG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gIHZhciBpbDtcclxuXHJcbiAgZm9yIChpID0gaW5kZXhTdGFydCwgaWwgPSBpbmRleEVuZDsgaSA8IGlsOyArK2kpIHtcclxuICAgIGluZm8gPSB6b25lTW9kR2VuW2ldO1xyXG4gICAgbW9kZ2VuSW5mby5wdXNoKGluZm8pO1xyXG5cclxuICAgIGlmIChpbmZvLnR5cGUgPT09ICd1bmtub3duJykge1xyXG4gICAgICBtb2RnZW4udW5rbm93bi5wdXNoKGluZm8udmFsdWUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbW9kZ2VuW2luZm8udHlwZV0gPSBpbmZvLnZhbHVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIG1vZGdlbjogbW9kZ2VuLFxyXG4gICAgbW9kZ2VuSW5mbzogbW9kZ2VuSW5mb1xyXG4gIH07XHJcbn07XHJcblxyXG5cclxuLyoqXHJcbiAqIEB0eXBlIHtBcnJheS48c3RyaW5nPn1cclxuICogQGNvbnN0XHJcbiAqL1xyXG5QYXJzZXIuR2VuZXJhdG9yRW51bWVyYXRvclRhYmxlID0gW1xyXG4gICdzdGFydEFkZHJzT2Zmc2V0JyxcclxuICAnZW5kQWRkcnNPZmZzZXQnLFxyXG4gICdzdGFydGxvb3BBZGRyc09mZnNldCcsXHJcbiAgJ2VuZGxvb3BBZGRyc09mZnNldCcsXHJcbiAgJ3N0YXJ0QWRkcnNDb2Fyc2VPZmZzZXQnLFxyXG4gICdtb2RMZm9Ub1BpdGNoJyxcclxuICAndmliTGZvVG9QaXRjaCcsXHJcbiAgJ21vZEVudlRvUGl0Y2gnLFxyXG4gICdpbml0aWFsRmlsdGVyRmMnLFxyXG4gICdpbml0aWFsRmlsdGVyUScsXHJcbiAgJ21vZExmb1RvRmlsdGVyRmMnLFxyXG4gICdtb2RFbnZUb0ZpbHRlckZjJyxcclxuICAnZW5kQWRkcnNDb2Fyc2VPZmZzZXQnLFxyXG4gICdtb2RMZm9Ub1ZvbHVtZScsXHJcbiAgLCAvLyAxNFxyXG4gICdjaG9ydXNFZmZlY3RzU2VuZCcsXHJcbiAgJ3JldmVyYkVmZmVjdHNTZW5kJyxcclxuICAncGFuJyxcclxuICAsLCwgLy8gMTgsMTksMjBcclxuICAnZGVsYXlNb2RMRk8nLFxyXG4gICdmcmVxTW9kTEZPJyxcclxuICAnZGVsYXlWaWJMRk8nLFxyXG4gICdmcmVxVmliTEZPJyxcclxuICAnZGVsYXlNb2RFbnYnLFxyXG4gICdhdHRhY2tNb2RFbnYnLFxyXG4gICdob2xkTW9kRW52JyxcclxuICAnZGVjYXlNb2RFbnYnLFxyXG4gICdzdXN0YWluTW9kRW52JyxcclxuICAncmVsZWFzZU1vZEVudicsXHJcbiAgJ2tleW51bVRvTW9kRW52SG9sZCcsXHJcbiAgJ2tleW51bVRvTW9kRW52RGVjYXknLFxyXG4gICdkZWxheVZvbEVudicsXHJcbiAgJ2F0dGFja1ZvbEVudicsXHJcbiAgJ2hvbGRWb2xFbnYnLFxyXG4gICdkZWNheVZvbEVudicsXHJcbiAgJ3N1c3RhaW5Wb2xFbnYnLFxyXG4gICdyZWxlYXNlVm9sRW52JyxcclxuICAna2V5bnVtVG9Wb2xFbnZIb2xkJyxcclxuICAna2V5bnVtVG9Wb2xFbnZEZWNheScsXHJcbiAgJ2luc3RydW1lbnQnLFxyXG4gICwgLy8gNDJcclxuICAna2V5UmFuZ2UnLFxyXG4gICd2ZWxSYW5nZScsXHJcbiAgJ3N0YXJ0bG9vcEFkZHJzQ29hcnNlT2Zmc2V0JyxcclxuICAna2V5bnVtJyxcclxuICAndmVsb2NpdHknLFxyXG4gICdpbml0aWFsQXR0ZW51YXRpb24nLFxyXG4gICwgLy8gNDlcclxuICAnZW5kbG9vcEFkZHJzQ29hcnNlT2Zmc2V0JyxcclxuICAnY29hcnNlVHVuZScsXHJcbiAgJ2ZpbmVUdW5lJyxcclxuICAnc2FtcGxlSUQnLFxyXG4gICdzYW1wbGVNb2RlcycsXHJcbiAgLCAvLyA1NVxyXG4gICdzY2FsZVR1bmluZycsXHJcbiAgJ2V4Y2x1c2l2ZUNsYXNzJyxcclxuICAnb3ZlcnJpZGluZ1Jvb3RLZXknXHJcbl07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBQYXJzZXJcclxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvc2YyLmpzXG4gKiovIiwiY29uc3QgUmlmZiA9IHt9O1xyXG5cclxuLyoqXHJcbiAqIEBwYXJhbSB7Qnl0ZUFycmF5fSBpbnB1dCBpbnB1dCBidWZmZXIuXHJcbiAqIEBwYXJhbSB7T2JqZWN0PX0gb3B0X3BhcmFtcyBvcHRpb24gcGFyYW1ldGVycy5cclxuICogQGNvbnN0cnVjdG9yXHJcbiAqL1xyXG5SaWZmLlBhcnNlciA9IGZ1bmN0aW9uKGlucHV0LCBvcHRfcGFyYW1zKSB7XHJcbiAgb3B0X3BhcmFtcyA9IG9wdF9wYXJhbXMgfHwge307XHJcbiAgLyoqIEB0eXBlIHtCeXRlQXJyYXl9ICovXHJcbiAgdGhpcy5pbnB1dCA9IGlucHV0O1xyXG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gIHRoaXMuaXAgPSBvcHRfcGFyYW1zWydpbmRleCddIHx8IDA7XHJcbiAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgdGhpcy5sZW5ndGggPSBvcHRfcGFyYW1zWydsZW5ndGgnXSB8fCBpbnB1dC5sZW5ndGggLSB0aGlzLmlwO1xyXG4gIC8qKiBAdHlwZSB7QXJyYXkuPFJpZmYuQ2h1bms+fSAqL1xyXG4gIHRoaXMuY2h1bmtMaXN0O1xyXG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gIHRoaXMub2Zmc2V0ID0gdGhpcy5pcDtcclxuICAvKiogQHR5cGUge2Jvb2xlYW59ICovXHJcbiAgdGhpcy5wYWRkaW5nID1cclxuICAgIG9wdF9wYXJhbXNbJ3BhZGRpbmcnXSAhPT0gdm9pZCAwID8gb3B0X3BhcmFtc1sncGFkZGluZyddIDogdHJ1ZTtcclxuICAvKiogQHR5cGUge2Jvb2xlYW59ICovXHJcbiAgdGhpcy5iaWdFbmRpYW4gPVxyXG4gICAgb3B0X3BhcmFtc1snYmlnRW5kaWFuJ10gIT09IHZvaWQgMCA/IG9wdF9wYXJhbXNbJ2JpZ0VuZGlhbiddIDogZmFsc2U7XHJcbn07XHJcblxyXG4vKipcclxuICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcclxuICogQHBhcmFtIHtudW1iZXJ9IHNpemVcclxuICogQHBhcmFtIHtudW1iZXJ9IG9mZnNldFxyXG4gKiBAY29uc3RydWN0b3JcclxuICovXHJcblJpZmYuQ2h1bmsgPSBmdW5jdGlvbih0eXBlLCBzaXplLCBvZmZzZXQpIHtcclxuICAvKiogQHR5cGUge3N0cmluZ30gKi9cclxuICB0aGlzLnR5cGUgPSB0eXBlO1xyXG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gIHRoaXMuc2l6ZSA9IHNpemU7XHJcbiAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgdGhpcy5vZmZzZXQgPSBvZmZzZXQ7XHJcbn07XHJcblxyXG5SaWZmLlBhcnNlci5wcm90b3R5cGUucGFyc2UgPSBmdW5jdGlvbigpIHtcclxuICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICB2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGggKyB0aGlzLm9mZnNldDtcclxuXHJcbiAgdGhpcy5jaHVua0xpc3QgPSBbXTtcclxuXHJcbiAgd2hpbGUgKHRoaXMuaXAgPCBsZW5ndGgpIHtcclxuICAgIHRoaXMucGFyc2VDaHVuaygpO1xyXG4gIH1cclxufTtcclxuXHJcblJpZmYuUGFyc2VyLnByb3RvdHlwZS5wYXJzZUNodW5rID0gZnVuY3Rpb24oKSB7XHJcbiAgLyoqIEB0eXBlIHtCeXRlQXJyYXl9ICovXHJcbiAgdmFyIGlucHV0ID0gdGhpcy5pbnB1dDtcclxuICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICB2YXIgaXAgPSB0aGlzLmlwO1xyXG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gIHZhciBzaXplO1xyXG5cclxuICB0aGlzLmNodW5rTGlzdC5wdXNoKG5ldyBSaWZmLkNodW5rKFxyXG4gICAgU3RyaW5nLmZyb21DaGFyQ29kZShpbnB1dFtpcCsrXSwgaW5wdXRbaXArK10sIGlucHV0W2lwKytdLCBpbnB1dFtpcCsrXSksXHJcbiAgICAoc2l6ZSA9IHRoaXMuYmlnRW5kaWFuID9cclxuICAgICAgICgoaW5wdXRbaXArK10gPDwgMjQpIHwgKGlucHV0W2lwKytdIDw8IDE2KSB8XHJcbiAgICAgICAgKGlucHV0W2lwKytdIDw8ICA4KSB8IChpbnB1dFtpcCsrXSAgICAgICkpID4+PiAwIDpcclxuICAgICAgICgoaW5wdXRbaXArK10gICAgICApIHwgKGlucHV0W2lwKytdIDw8ICA4KSB8XHJcbiAgICAgICAgKGlucHV0W2lwKytdIDw8IDE2KSB8IChpbnB1dFtpcCsrXSA8PCAyNCkpID4+PiAwXHJcbiAgICApLFxyXG4gICAgaXBcclxuICApKTtcclxuXHJcbiAgaXAgKz0gc2l6ZTtcclxuXHJcbiAgLy8gcGFkZGluZ1xyXG4gIGlmICh0aGlzLnBhZGRpbmcgJiYgKChpcCAtIHRoaXMub2Zmc2V0KSAmIDEpID09PSAxKSB7XHJcbiAgICBpcCsrO1xyXG4gIH1cclxuXHJcbiAgdGhpcy5pcCA9IGlwO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBjaHVuayBpbmRleC5cclxuICogQHJldHVybiB7P1JpZmYuQ2h1bmt9XHJcbiAqL1xyXG5SaWZmLlBhcnNlci5wcm90b3R5cGUuZ2V0Q2h1bmsgPSBmdW5jdGlvbihpbmRleCkge1xyXG4gIC8qKiBAdHlwZSB7UmlmZi5DaHVua30gKi9cclxuICB2YXIgY2h1bmsgPSB0aGlzLmNodW5rTGlzdFtpbmRleF07XHJcblxyXG4gIGlmIChjaHVuayA9PT0gdm9pZCAwKSB7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIHJldHVybiBjaHVuaztcclxufTtcclxuXHJcbi8qKlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9XHJcbiAqL1xyXG5SaWZmLlBhcnNlci5wcm90b3R5cGUuZ2V0TnVtYmVyT2ZDaHVua3MgPSBmdW5jdGlvbigpIHtcclxuICByZXR1cm4gdGhpcy5jaHVua0xpc3QubGVuZ3RoO1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBSaWZmXHJcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL3JpZmYuanNcbiAqKi8iXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCBlMjk4YjliNTJjYWJlODJhNzhjYSIsIndlYnBhY2s6Ly8vLi9zcmMvY29uc3RhbnRzLnRzIiwid2VicGFjazovLy8uL3NyYy9zZjIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3JpZmYudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3NmMl9kYXRhLnRzIiwid2VicGFjazovLy8uL3NyYy9oZWxwZXIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3N0cmVhbS50cyIsIndlYnBhY2s6Ly8vLi9leHBvcnQvcGFyc2VyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxPO0FDVkE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1DQUEyQiwwQkFBMEIsRUFBRTtBQUN2RCx5Q0FBaUMsZUFBZTtBQUNoRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4REFBc0QsK0RBQStEOztBQUVySDtBQUNBOztBQUVBO0FBQ0E7Ozs7Ozs7Ozs7QUM3RGEsZ0NBQXdCLEdBQUc7SUFDdEMsa0JBQWtCO0lBQ2xCLGdCQUFnQjtJQUNoQixzQkFBc0I7SUFDdEIsb0JBQW9CO0lBQ3BCLHdCQUF3QjtJQUN4QixlQUFlO0lBQ2YsZUFBZTtJQUNmLGVBQWU7SUFDZixpQkFBaUI7SUFDakIsZ0JBQWdCO0lBQ2hCLGtCQUFrQjtJQUNsQixrQkFBa0I7SUFDbEIsc0JBQXNCO0lBQ3RCLGdCQUFnQjtJQUNoQixTQUFTO0lBQ1QsbUJBQW1CO0lBQ25CLG1CQUFtQjtJQUNuQixLQUFLO0lBQ0wsU0FBUyxFQUFDLFNBQVMsRUFBQyxTQUFTO0lBQzdCLGFBQWE7SUFDYixZQUFZO0lBQ1osYUFBYTtJQUNiLFlBQVk7SUFDWixhQUFhO0lBQ2IsY0FBYztJQUNkLFlBQVk7SUFDWixhQUFhO0lBQ2IsZUFBZTtJQUNmLGVBQWU7SUFDZixvQkFBb0I7SUFDcEIscUJBQXFCO0lBQ3JCLGFBQWE7SUFDYixjQUFjO0lBQ2QsWUFBWTtJQUNaLGFBQWE7SUFDYixlQUFlO0lBQ2YsZUFBZTtJQUNmLG9CQUFvQjtJQUNwQixxQkFBcUI7SUFDckIsWUFBWTtJQUNaLFNBQVM7SUFDVCxVQUFVO0lBQ1YsVUFBVTtJQUNWLDRCQUE0QjtJQUM1QixRQUFRO0lBQ1IsVUFBVTtJQUNWLG9CQUFvQjtJQUNwQixTQUFTO0lBQ1QsMEJBQTBCO0lBQzFCLFlBQVk7SUFDWixVQUFVO0lBQ1YsVUFBVTtJQUNWLGFBQWE7SUFDYixTQUFTO0lBQ1QsYUFBYTtJQUNiLGdCQUFnQjtJQUNoQixtQkFBbUI7Q0FDcEI7QUFFWSxxQkFBYSxHQUFHO0lBQzNCLElBQUksRUFBRSxTQUFTO0lBQ2YsSUFBSSxFQUFFLFdBQVc7SUFDakIsSUFBSSxFQUFFLGVBQWU7SUFDckIsSUFBSSxFQUFFLFVBQVU7SUFDaEIsSUFBSSxFQUFFLE1BQU07SUFDWixJQUFJLEVBQUUsU0FBUztJQUNmLElBQUksRUFBRSxVQUFVO0lBQ2hCLElBQUksRUFBRSxTQUFTO0lBQ2YsSUFBSSxFQUFFLGNBQWM7SUFDcEIsSUFBSSxFQUFFLFVBQVU7SUFDaEIsSUFBSSxFQUFFLGFBQWE7Q0FDcEI7Ozs7Ozs7Ozs7QUN4RUQsdUNBQXlDO0FBQ3pDLDJDQUF3SDtBQUN4SCx5Q0FBd0M7QUFDeEMseUNBQWdDO0FBQ2hDLDRDQUE4QztBQWlCOUM7SUFnQkUsbUJBQVksS0FBaUIsRUFBRSxVQUFzQztRQUF0Qyw0Q0FBc0M7UUFDbkUsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLO1FBQ2xCLElBQUksQ0FBQyxZQUFZLEdBQUcsVUFBVSxDQUFDLFlBQVk7SUFDN0MsQ0FBQztJQUVELHlCQUFLLEdBQUw7UUFDRSxJQUFNLE1BQU0sR0FBRyxJQUFJLGdCQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDO1FBRXhELG1CQUFtQjtRQUNuQixNQUFNLENBQUMsS0FBSyxFQUFFO1FBQ2QsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsQyxNQUFNLElBQUksS0FBSyxDQUFDLG9CQUFvQixDQUFDO1FBQ3ZDLENBQUM7UUFFRCxJQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUNoQyxFQUFFLENBQUMsQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNuQixNQUFNLElBQUksS0FBSyxDQUFDLGlCQUFpQixDQUFDO1FBQ3BDLENBQUM7UUFFRCxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSTtJQUNuQixDQUFDO0lBRUQsa0NBQWMsR0FBZCxVQUFlLEtBQVksRUFBRSxJQUFnQjtRQUMzQyxJQUFNLFNBQVMsR0FBRyxZQUFZLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDO1FBRTNELEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzQixNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixDQUFDO1FBQzNDLENBQUM7UUFFRCxZQUFZO1FBQ1osSUFBSSxDQUFDLElBQUksR0FBRyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQztRQUU3QyxZQUFZO1FBQ1osSUFBSSxDQUFDLFlBQVksR0FBRyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQztRQUVyRCxZQUFZO1FBQ1osSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDO0lBQ3hDLENBQUM7SUFFRCxpQ0FBYSxHQUFiLFVBQWMsS0FBWSxFQUFFLElBQWdCO1FBQzFDLElBQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUM7UUFFM0QseUJBQXlCO1FBQ3pCLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzQixNQUFNLElBQUksS0FBSyxDQUFDLG9CQUFvQixDQUFDO1FBQ3ZDLENBQUM7UUFFRCxJQUFJLENBQUMsWUFBWSxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDO1FBQ2pELElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUM7UUFDL0MsSUFBSSxDQUFDLG1CQUFtQixHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDO1FBQ3hELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQztRQUN4RCxJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFRO1FBQ3RELElBQUksQ0FBQyxjQUFjLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQXFCO1FBQ3ZFLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQztRQUM1RCxJQUFJLENBQUMsdUJBQXVCLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUM7UUFDNUQsSUFBSSxDQUFDLFlBQVksR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBbUI7UUFDbkUsSUFBSSxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUM7SUFDN0UsQ0FBQztJQUNILGdCQUFDO0FBQUQsQ0FBQzs7QUFFRCxzQkFBc0IsS0FBSyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsaUJBQWlCO0lBQ2hFLHFCQUFxQjtJQUNyQixFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFDaEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO0lBQ3JELENBQUM7SUFFRCxJQUFNLE1BQU0sR0FBRyxJQUFJLHNCQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFFN0Msa0JBQWtCO0lBQ2xCLElBQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBQ3RDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsS0FBSyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7UUFDcEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQkFBb0IsR0FBRyxTQUFTLENBQUM7SUFDbkQsQ0FBQztJQUVELGlCQUFpQjtJQUNqQixJQUFNLE1BQU0sR0FBRyxJQUFJLGdCQUFNLENBQUMsSUFBSSxFQUFFLEVBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFDLENBQUM7SUFDL0UsTUFBTSxDQUFDLEtBQUssRUFBRTtJQUVkLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUztBQUN6QixDQUFDO0FBRUQsdUJBQXVCLEtBQVksRUFBRSxJQUFnQjtJQUNuRCxJQUFNLElBQUksR0FBRyxFQUFFO0lBQ2YsSUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQztJQUUzRCxHQUFHLENBQUMsQ0FBVSxVQUFTLEVBQVQsdUJBQVMsRUFBVCx1QkFBUyxFQUFULElBQVM7UUFBbEIsSUFBSSxDQUFDO1FBQ0EscUJBQU0sRUFBRSxhQUFJLEVBQUUsYUFBSSxDQUFNO1FBQ2hDLElBQU0sTUFBSSxHQUFHLDRCQUFhLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSTtRQUN4QyxJQUFJLENBQUMsTUFBSSxDQUFDLEdBQUcsc0JBQVUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sR0FBRyxJQUFJLENBQUM7S0FDckQ7SUFFRCxNQUFNLENBQUMsSUFBSTtBQUNiLENBQUM7QUFFRCx1QkFBdUIsS0FBWSxFQUFFLElBQWdCO0lBQ25ELElBQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUM7SUFFM0QsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNCLE1BQU0sSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztBQUNyQixDQUFDO0FBRUQsb0JBQW9CLEtBQVksRUFBRSxJQUFnQixFQUFFLElBQVksRUFBRSxPQUFPO0lBQ3ZFLElBQU0sTUFBTSxHQUFHLEVBQUU7SUFFakIsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3hCLE1BQU0sSUFBSSxLQUFLLENBQUMscUJBQXFCLEdBQUksS0FBSyxDQUFDLElBQUksQ0FBQztJQUN0RCxDQUFDO0lBRUQsSUFBTSxNQUFNLEdBQUcsSUFBSSxzQkFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDO0lBQzdDLElBQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLElBQUk7SUFFdEMsT0FBTyxNQUFNLENBQUMsRUFBRSxHQUFHLElBQUksRUFBRSxDQUFDO1FBQ3hCLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCxNQUFNLENBQUMsTUFBTTtBQUNmLENBQUM7QUFFRCxJQUFNLFNBQVMsR0FBRyxVQUFDLEtBQUssRUFBRSxJQUFJLElBQUssaUJBQVUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxnQkFBTSxJQUFJLGlDQUFZLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUExQixDQUEwQixDQUFDLEVBQXJFLENBQXFFO0FBQ3hHLElBQU0sU0FBUyxHQUFHLFVBQUMsS0FBSyxFQUFFLElBQUksSUFBSyxpQkFBVSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLGdCQUFNLElBQUksOEJBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQXZCLENBQXVCLENBQUMsRUFBbEUsQ0FBa0U7QUFDckcsSUFBTSxTQUFTLEdBQUcsVUFBQyxLQUFLLEVBQUUsSUFBSSxJQUFLLGlCQUFVLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsZ0JBQU0sSUFBSSwrQkFBVSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBeEIsQ0FBd0IsQ0FBQyxFQUFuRSxDQUFtRTtBQUN0RyxJQUFNLFNBQVMsR0FBRyxVQUFDLEtBQUssRUFBRSxJQUFJLElBQUssaUJBQVUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxnQkFBTSxJQUFJLGtDQUFhLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUEzQixDQUEyQixDQUFDLEVBQXRFLENBQXNFO0FBQ3pHLElBQU0sU0FBUyxHQUFHLFVBQUMsS0FBSyxFQUFFLElBQUksSUFBSyxpQkFBVSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLGdCQUFNLElBQUksa0NBQWEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQTNCLENBQTJCLENBQUMsRUFBdEUsQ0FBc0U7QUFDekcsSUFBTSxTQUFTLEdBQUcsVUFBQyxLQUFLLEVBQUUsSUFBSSxJQUFLLGlCQUFVLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsZ0JBQU0sSUFBSSxrQ0FBYSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBM0IsQ0FBMkIsQ0FBQyxFQUF0RSxDQUFzRTtBQUN6RyxJQUFNLFNBQVMsR0FBRyxVQUFDLEtBQUssRUFBRSxJQUFJLElBQUssaUJBQVUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxnQkFBTSxJQUFJLGtDQUFhLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUEzQixDQUEyQixDQUFDLEVBQXRFLENBQXNFO0FBQ3pHLElBQU0sU0FBUyxHQUFHLFVBQUMsS0FBSyxFQUFFLElBQUksSUFBSyxpQkFBVSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLGdCQUFNLElBQUksa0NBQWEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQTNCLENBQTJCLENBQUMsRUFBdEUsQ0FBc0U7QUFDekcsSUFBTSxTQUFTLEdBQUcsVUFBQyxLQUFLLEVBQUUsSUFBSSxJQUFLLGlCQUFVLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsZ0JBQU0sSUFBSSwyQkFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBcEIsQ0FBb0IsQ0FBQyxFQUEvRCxDQUErRDtBQUVsRywwQkFBMEIsTUFBTSxFQUFFLFVBQVU7SUFDMUMsSUFBSSxRQUFRLEdBQUcsQ0FBQztJQUVoQixTQUFTO0lBQ1QsT0FBTyxVQUFVLEdBQUcsS0FBSyxFQUFFLENBQUM7UUFDMUIsSUFBTSxTQUFTLEdBQUcsSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDbkQsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ3ZELFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDMUIsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUM1QixDQUFDO1FBQ0QsTUFBTSxHQUFHLFNBQVM7UUFDbEIsUUFBUSxJQUFJLENBQUM7UUFDYixVQUFVLElBQUksQ0FBQztJQUNqQixDQUFDO0lBRUQsTUFBTSxDQUFDO1FBQ0wsTUFBTTtRQUNOLFFBQVE7S0FDVDtBQUNILENBQUM7QUFFRCxvQkFBb0IsWUFBWSxFQUFFLGtCQUFrQixFQUFFLElBQUk7SUFDeEQsSUFBTSxPQUFPLEdBQUcsRUFBRTtJQUNsQixHQUFHLENBQUMsQ0FBZSxVQUFZLEVBQVosNkJBQVksRUFBWiwwQkFBWSxFQUFaLElBQVk7UUFBMUIsSUFBSSxNQUFNO1FBQ2IsSUFBSSxNQUFNLEdBQUcsSUFBSSxVQUFVLENBQUMsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FDdEQsa0JBQWtCLEdBQUcsTUFBTSxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQ3JDLGtCQUFrQixHQUFHLE1BQU0sQ0FBQyxHQUFHLEdBQUssQ0FBQyxDQUN0QyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQ1YsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFCLElBQU0sTUFBTSxHQUFHLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsVUFBVSxDQUFDO1lBQzFELE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTTtZQUN0QixNQUFNLENBQUMsVUFBVSxJQUFJLE1BQU0sQ0FBQyxRQUFRO1lBQ3BDLE1BQU0sQ0FBQyxTQUFTLElBQUksTUFBTSxDQUFDLFFBQVE7WUFDbkMsTUFBTSxDQUFDLE9BQU8sSUFBSSxNQUFNLENBQUMsUUFBUTtRQUNuQyxDQUFDO1FBQ0QsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7S0FDckI7SUFDRCxNQUFNLENBQUMsT0FBTztBQUNoQixDQUFDOzs7Ozs7Ozs7O0FDL01EO0lBVUUsZ0JBQVksS0FBaUIsRUFBRSxVQUFtQjtRQUFuQiw0Q0FBbUI7UUFUbEQsY0FBUyxHQUFZLEVBQUU7UUFVckIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLO1FBQ2xCLElBQUksQ0FBQyxFQUFFLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFDbEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsRUFBRTtRQUM1RCxJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUU7UUFDbkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsRUFBRTtRQUNyQixJQUFJLENBQUMsT0FBTztZQUNWLFVBQVUsQ0FBQyxTQUFTLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJO1FBQ2pFLElBQUksQ0FBQyxTQUFTO1lBQ1osVUFBVSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUs7SUFDeEUsQ0FBQztJQUVELHNCQUFLLEdBQUw7UUFDRSxJQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNO1FBRXhDLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRTtRQUVuQixPQUFPLElBQUksQ0FBQyxFQUFFLEdBQUcsTUFBTSxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLFVBQVUsRUFBRTtRQUNuQixDQUFDO0lBQ0gsQ0FBQztJQUVELDJCQUFVLEdBQVY7UUFDRSxJQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSztRQUN4QixJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRTtRQUNoQixJQUFJLElBQUk7UUFFUixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FDM0IsTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUN2RSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDdEIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUN4QyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ3BELENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUssQ0FBQyxDQUFDO2dCQUN4QyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQ25ELEVBQ0QsRUFBRSxDQUNILENBQUM7UUFFRixFQUFFLElBQUksSUFBSTtRQUVWLFVBQVU7UUFDVixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxFQUFFLEdBQUcsSUFBSSxD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QUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTtJQUN4QixDQUFDO0lBRUQsMEJBQVMsR0FBVDtRQUNFLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFO0lBQ3RDLENBQUM7SUFFRCwyQkFBVSxHQUFWO1FBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUU7SUFDekIsQ0FBQztJQUNILGFBQUM7QUFBRCxDQUFDOzs7Ozs7Ozs7Ozs7QUM1REQ7QUFDQSwrREFBZSxtREFBZixFIiwiZmlsZSI6InNmMi5wYXJzZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJwYXJzZXJcIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wicGFyc2VyXCJdID0gZmFjdG9yeSgpO1xufSkodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnID8gc2VsZiA6IHRoaXMsIGZ1bmN0aW9uKCkge1xucmV0dXJuIFxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbiBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbiBcdFx0XHR9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSA2KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL2Jvb3RzdHJhcCBlMjk4YjliNTJjYWJlODJhNzhjYSIsImV4cG9ydCBjb25zdCBHZW5lcmF0b3JFbnVtZXJhdG9yVGFibGUgPSBbXHJcbiAgJ3N0YXJ0QWRkcnNPZmZzZXQnLFxyXG4gICdlbmRBZGRyc09mZnNldCcsXHJcbiAgJ3N0YXJ0bG9vcEFkZHJzT2Zmc2V0JyxcclxuICAnZW5kbG9vcEFkZHJzT2Zmc2V0JyxcclxuICAnc3RhcnRBZGRyc0NvYXJzZU9mZnNldCcsXHJcbiAgJ21vZExmb1RvUGl0Y2gnLFxyXG4gICd2aWJMZm9Ub1BpdGNoJyxcclxuICAnbW9kRW52VG9QaXRjaCcsXHJcbiAgJ2luaXRpYWxGaWx0ZXJGYycsXHJcbiAgJ2luaXRpYWxGaWx0ZXJRJyxcclxuICAnbW9kTGZvVG9GaWx0ZXJGYycsXHJcbiAgJ21vZEVudlRvRmlsdGVyRmMnLFxyXG4gICdlbmRBZGRyc0NvYXJzZU9mZnNldCcsXHJcbiAgJ21vZExmb1RvVm9sdW1lJyxcclxuICB1bmRlZmluZWQsIC8vIDE0XHJcbiAgJ2Nob3J1c0VmZmVjdHNTZW5kJyxcclxuICAncmV2ZXJiRWZmZWN0c1NlbmQnLFxyXG4gICdwYW4nLFxyXG4gIHVuZGVmaW5lZCx1bmRlZmluZWQsdW5kZWZpbmVkLCAvLyAxOCwxOSwyMFxyXG4gICdkZWxheU1vZExGTycsXHJcbiAgJ2ZyZXFNb2RMRk8nLFxyXG4gICdkZWxheVZpYkxGTycsXHJcbiAgJ2ZyZXFWaWJMRk8nLFxyXG4gICdkZWxheU1vZEVudicsXHJcbiAgJ2F0dGFja01vZEVudicsXHJcbiAgJ2hvbGRNb2RFbnYnLFxyXG4gICdkZWNheU1vZEVudicsXHJcbiAgJ3N1c3RhaW5Nb2RFbnYnLFxyXG4gICdyZWxlYXNlTW9kRW52JyxcclxuICAna2V5bnVtVG9Nb2RFbnZIb2xkJyxcclxuICAna2V5bnVtVG9Nb2RFbnZEZWNheScsXHJcbiAgJ2RlbGF5Vm9sRW52JyxcclxuICAnYXR0YWNrVm9sRW52JyxcclxuICAnaG9sZFZvbEVudicsXHJcbiAgJ2RlY2F5Vm9sRW52JyxcclxuICAnc3VzdGFpblZvbEVudicsXHJcbiAgJ3JlbGVhc2VWb2xFbnYnLFxyXG4gICdrZXludW1Ub1ZvbEVudkhvbGQnLFxyXG4gICdrZXludW1Ub1ZvbEVudkRlY2F5JyxcclxuICAnaW5zdHJ1bWVudCcsXHJcbiAgdW5kZWZpbmVkLCAvLyA0MlxyXG4gICdrZXlSYW5nZScsXHJcbiAgJ3ZlbFJhbmdlJyxcclxuICAnc3RhcnRsb29wQWRkcnNDb2Fyc2VPZmZzZXQnLFxyXG4gICdrZXludW0nLFxyXG4gICd2ZWxvY2l0eScsXHJcbiAgJ2luaXRpYWxBdHRlbnVhdGlvbicsXHJcbiAgdW5kZWZpbmVkLCAvLyA0OVxyXG4gICdlbmRsb29wQWRkcnNDb2Fyc2VPZmZzZXQnLFxyXG4gICdjb2Fyc2VUdW5lJyxcclxuICAnZmluZVR1bmUnLFxyXG4gICdzYW1wbGVJRCcsXHJcbiAgJ3NhbXBsZU1vZGVzJyxcclxuICB1bmRlZmluZWQsIC8vIDU1XHJcbiAgJ3NjYWxlVHVuaW5nJyxcclxuICAnZXhjbHVzaXZlQ2xhc3MnLFxyXG4gICdvdmVycmlkaW5nUm9vdEtleSdcclxuXVxyXG5cclxuZXhwb3J0IGNvbnN0IEluZm9OYW1lVGFibGUgPSB7XHJcbiAgSUNNVDogXCJjb21tZW50XCIsXHJcbiAgSUNPUDogXCJjb3B5cmlnaHRcIixcclxuICBJQ1JEOiBcImNyZWF0aW9uX2RhdGVcIixcclxuICBJRU5HOiBcImVuZ2luZWVyXCIsXHJcbiAgSU5BTTogXCJuYW1lXCIsXHJcbiAgSVBSRDogXCJwcm9kdWN0XCIsXHJcbiAgSVNGVDogXCJzb2Z0d2FyZVwiLFxyXG4gIGlmaWw6IFwidmVyc2lvblwiLFxyXG4gIGlzbmc6IFwic291bmRfZW5naW5lXCIsXHJcbiAgaXJvbTogXCJyb21fbmFtZVwiLFxyXG4gIGl2ZXI6IFwicm9tX3ZlcnNpb25cIlxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9jb25zdGFudHMudHMiLCJpbXBvcnQgeyBQYXJzZXIsIENodW5rIH0gZnJvbSBcIi4vcmlmZi50c1wiXHJcbmltcG9ydCB7IFByZXNldEhlYWRlciwgU2FtcGxlLCBQcmVzZXRCYWcsIEluc3RydW1lbnQsIEluc3RydW1lbnRCYWcsIE1vZHVsYXRvckxpc3QsIEdlbmVyYXRvckxpc3QgfSBmcm9tIFwiLi9zZjJfZGF0YS50c1wiXHJcbmltcG9ydCB7IHJlYWRTdHJpbmcgfSBmcm9tIFwiLi9oZWxwZXIudHNcIlxyXG5pbXBvcnQgU3RyZWFtIGZyb20gXCIuL3N0cmVhbS50c1wiXHJcbmltcG9ydCB7IEluZm9OYW1lVGFibGUgfSBmcm9tIFwiLi9jb25zdGFudHMudHNcIlxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTYW1wbGVIZWFkZXIge1xyXG4gIHNhbXBsZVJhdGU6IG51bWJlclxyXG4gIHNhbXBsZU5hbWU6IG51bWJlclxyXG4gIHBpdGNoQ29ycmVjdGlvbjogbnVtYmVyXHJcbiAgc3RhcnRMb29wOiBudW1iZXJcclxuICBlbmRMb29wOiBudW1iZXJcclxuICBvcmlnaW5hbFBpdGNoOiBudW1iZXJcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJbnN0cnVtZW50Wm9uZSB7XHJcbiAgaW5zdHJ1bWVudEdlbmVyYXRvckluZGV4OiBudW1iZXJcclxuICBpbnN0cnVtZW50TW9kdWxhdG9ySW5kZXg6IG51bWJlclxyXG4gIHByZXNldE1vZHVsYXRvckluZGV4OiBudW1iZXJcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3Mge1xyXG4gIGlucHV0OiBVaW50OEFycmF5XHJcbiAgcGFyc2VyT3B0aW9uOiB7fSB8IHVuZGVmaW5lZFxyXG4gIHByZXNldEhlYWRlcjoge31bXVxyXG4gIHByZXNldFpvbmU6IHt9W11cclxuICBwcmVzZXRab25lTW9kdWxhdG9yOiB7fVtdXHJcbiAgcHJlc2V0Wm9uZUdlbmVyYXRvcjoge31bXVxyXG4gIGluc3RydW1lbnQ6IHsgaW5zdHJ1bWVudE5hbWU6IHN0cmluZywgaW5zdHJ1bWVudEJhZ0luZGV4OiBudW1iZXIgfVtdXHJcbiAgaW5zdHJ1bWVudFpvbmU6IEluc3RydW1lbnRab25lW11cclxuICBpbnN0cnVtZW50Wm9uZU1vZHVsYXRvcjoge31bXVxyXG4gIGluc3RydW1lbnRab25lR2VuZXJhdG9yOiB7fVtdXHJcbiAgc2FtcGxlSGVhZGVyOiBTYW1wbGVIZWFkZXJbXVxyXG4gIHNhbXBsZTogSW50MTZBcnJheVtdXHJcbiAgc2FtcGxpbmdEYXRhOiBDaHVua1xyXG4gIGluZm86IHt9XHJcblxyXG4gIGNvbnN0cnVjdG9yKGlucHV0OiBVaW50OEFycmF5LCBvcHRfcGFyYW1zOiB7IHBhcnNlck9wdGlvbj86IHt9IH0gPSB7fSkge1xyXG4gICAgdGhpcy5pbnB1dCA9IGlucHV0XHJcbiAgICB0aGlzLnBhcnNlck9wdGlvbiA9IG9wdF9wYXJhbXMucGFyc2VyT3B0aW9uXHJcbiAgfVxyXG5cclxuICBwYXJzZSgpIHtcclxuICAgIGNvbnN0IHBhcnNlciA9IG5ldyBQYXJzZXIodGhpcy5pbnB1dCwgdGhpcy5wYXJzZXJPcHRpb24pXHJcblxyXG4gICAgLy8gcGFyc2UgUklGRiBjaHVua1xyXG4gICAgcGFyc2VyLnBhcnNlKClcclxuICAgIGlmIChwYXJzZXIuY2h1bmtMaXN0Lmxlbmd0aCAhPT0gMSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3dyb25nIGNodW5rIGxlbmd0aCcpXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY2h1bmsgPSBwYXJzZXIuZ2V0Q2h1bmsoMClcclxuICAgIGlmIChjaHVuayA9PT0gbnVsbCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NodW5rIG5vdCBmb3VuZCcpXHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5wYXJzZVJpZmZDaHVuayhjaHVuaywgdGhpcy5pbnB1dClcclxuICAgIHRoaXMuaW5wdXQgPSBudWxsXHJcbiAgfVxyXG5cclxuICBwYXJzZVJpZmZDaHVuayhjaHVuazogQ2h1bmssIGRhdGE6IFVpbnQ4QXJyYXkpIHtcclxuICAgIGNvbnN0IGNodW5rTGlzdCA9IGdldENodW5rTGlzdChjaHVuaywgZGF0YSwgXCJSSUZGXCIsIFwic2Zia1wiKVxyXG5cclxuICAgIGlmIChjaHVua0xpc3QubGVuZ3RoICE9PSAzKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzZmJrIHN0cnVjdHVyZScpXHJcbiAgICB9XHJcblxyXG4gICAgLy8gSU5GTy1saXN0XHJcbiAgICB0aGlzLmluZm8gPSBwYXJzZUluZm9MaXN0KGNodW5rTGlzdFswXSwgZGF0YSlcclxuXHJcbiAgICAvLyBzZHRhLWxpc3RcclxuICAgIHRoaXMuc2FtcGxpbmdEYXRhID0gcGFyc2VTZHRhTGlzdChjaHVua0xpc3RbMV0sIGRhdGEpXHJcblxyXG4gICAgLy8gcGR0YS1saXN0XHJcbiAgICB0aGlzLnBhcnNlUGR0YUxpc3QoY2h1bmtMaXN0WzJdLCBkYXRhKVxyXG4gIH1cclxuXHJcbiAgcGFyc2VQZHRhTGlzdChjaHVuazogQ2h1bmssIGRhdGE6IFVpbnQ4QXJyYXkpIHtcclxuICAgIGNvbnN0IGNodW5rTGlzdCA9IGdldENodW5rTGlzdChjaHVuaywgZGF0YSwgXCJMSVNUXCIsIFwicGR0YVwiKVxyXG5cclxuICAgIC8vIGNoZWNrIG51bWJlciBvZiBjaHVua3NcclxuICAgIGlmIChjaHVua0xpc3QubGVuZ3RoICE9PSA5KSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwZHRhIGNodW5rJylcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnByZXNldEhlYWRlciA9IHBhcnNlUGhkcihjaHVua0xpc3RbMF0sIGRhdGEpXHJcbiAgICB0aGlzLnByZXNldFpvbmUgPSBwYXJzZVBiYWcoY2h1bmtMaXN0WzFdLCBkYXRhKVxyXG4gICAgdGhpcy5wcmVzZXRab25lTW9kdWxhdG9yID0gcGFyc2VQbW9kKGNodW5rTGlzdFsyXSwgZGF0YSlcclxuICAgIHRoaXMucHJlc2V0Wm9uZUdlbmVyYXRvciA9IHBhcnNlUGdlbihjaHVua0xpc3RbM10sIGRhdGEpXHJcbiAgICB0aGlzLmluc3RydW1lbnQgPSBwYXJzZUluc3QoY2h1bmtMaXN0WzRdLCBkYXRhKSBhcyBhbnlcclxuICAgIHRoaXMuaW5zdHJ1bWVudFpvbmUgPSBwYXJzZUliYWcoY2h1bmtMaXN0WzVdLCBkYXRhKSBhcyBJbnN0cnVtZW50Wm9uZVtdXHJcbiAgICB0aGlzLmluc3RydW1lbnRab25lTW9kdWxhdG9yID0gcGFyc2VJbW9kKGNodW5rTGlzdFs2XSwgZGF0YSlcclxuICAgIHRoaXMuaW5zdHJ1bWVudFpvbmVHZW5lcmF0b3IgPSBwYXJzZUlnZW4oY2h1bmtMaXN0WzddLCBkYXRhKVxyXG4gICAgdGhpcy5zYW1wbGVIZWFkZXIgPSBwYXJzZVNoZHIoY2h1bmtMaXN0WzhdLCBkYXRhKSBhcyBTYW1wbGVIZWFkZXJbXVxyXG4gICAgdGhpcy5zYW1wbGUgPSBsb2FkU2FtcGxlKHRoaXMuc2FtcGxlSGVhZGVyLCB0aGlzLnNhbXBsaW5nRGF0YS5vZmZzZXQsIGRhdGEpXHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRDaHVua0xpc3QoY2h1bmssIGRhdGEsIGV4cGVjdGVkVHlwZSwgZXhwZWN0ZWRTaWduYXR1cmUpIHtcclxuICAvLyBjaGVjayBwYXJzZSB0YXJnZXRcclxuICBpZiAoY2h1bmsudHlwZSAhPT0gZXhwZWN0ZWRUeXBlKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgY2h1bmsgdHlwZTonICsgY2h1bmsudHlwZSlcclxuICB9XHJcblxyXG4gIGNvbnN0IHN0cmVhbSA9IG5ldyBTdHJlYW0oZGF0YSwgY2h1bmsub2Zmc2V0KVxyXG5cclxuICAvLyBjaGVjayBzaWduYXR1cmVcclxuICBjb25zdCBzaWduYXR1cmUgPSBzdHJlYW0ucmVhZFN0cmluZyg0KVxyXG4gIGlmIChzaWduYXR1cmUgIT09IGV4cGVjdGVkU2lnbmF0dXJlKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgc2lnbmF0dXJlOicgKyBzaWduYXR1cmUpXHJcbiAgfVxyXG5cclxuICAvLyByZWFkIHN0cnVjdHVyZVxyXG4gIGNvbnN0IHBhcnNlciA9IG5ldyBQYXJzZXIoZGF0YSwgeydpbmRleCc6IHN0cmVhbS5pcCwgJ2xlbmd0aCc6IGNodW5rLnNpemUgLSA0fSlcclxuICBwYXJzZXIucGFyc2UoKVxyXG5cclxuICByZXR1cm4gcGFyc2VyLmNodW5rTGlzdFxyXG59XHJcblxyXG5mdW5jdGlvbiBwYXJzZUluZm9MaXN0KGNodW5rOiBDaHVuaywgZGF0YTogVWludDhBcnJheSk6IHt9IHtcclxuICBjb25zdCBpbmZvID0ge31cclxuICBjb25zdCBjaHVua0xpc3QgPSBnZXRDaHVua0xpc3QoY2h1bmssIGRhdGEsIFwiTElTVFwiLCBcIklORk9cIilcclxuXHJcbiAgZm9yIChsZXQgcCBvZiBjaHVua0xpc3QpIHtcclxuICAgIGNvbnN0IHsgb2Zmc2V0LCBzaXplLCB0eXBlIH0gPSBwXHJcbiAgICBjb25zdCBuYW1lID0gSW5mb05hbWVUYWJsZVt0eXBlXSB8fCB0eXBlXHJcbiAgICBpbmZvW25hbWVdID0gcmVhZFN0cmluZyhkYXRhLCBvZmZzZXQsIG9mZnNldCArIHNpemUpXHJcbiAgfVxyXG5cclxuICByZXR1cm4gaW5mb1xyXG59XHJcblxyXG5mdW5jdGlvbiBwYXJzZVNkdGFMaXN0KGNodW5rOiBDaHVuaywgZGF0YTogVWludDhBcnJheSk6IENodW5rIHtcclxuICBjb25zdCBjaHVua0xpc3QgPSBnZXRDaHVua0xpc3QoY2h1bmssIGRhdGEsIFwiTElTVFwiLCBcInNkdGFcIilcclxuXHJcbiAgaWYgKGNodW5rTGlzdC5sZW5ndGggIT09IDEpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcignVE9ETycpXHJcbiAgfVxyXG5cclxuICByZXR1cm4gY2h1bmtMaXN0WzBdXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHBhcnNlQ2h1bmsoY2h1bms6IENodW5rLCBkYXRhOiBVaW50OEFycmF5LCB0eXBlOiBzdHJpbmcsIGZhY3RvcnkpOiB7fVtdIHtcclxuICBjb25zdCByZXN1bHQgPSBbXVxyXG5cclxuICBpZiAoY2h1bmsudHlwZSAhPT0gdHlwZSkge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGNodW5rIHR5cGU6JyAgKyBjaHVuay50eXBlKVxyXG4gIH1cclxuICBcclxuICBjb25zdCBzdHJlYW0gPSBuZXcgU3RyZWFtKGRhdGEsIGNodW5rLm9mZnNldClcclxuICBjb25zdCBzaXplID0gY2h1bmsub2Zmc2V0ICsgY2h1bmsuc2l6ZVxyXG4gIFxyXG4gIHdoaWxlIChzdHJlYW0uaXAgPCBzaXplKSB7XHJcbiAgICByZXN1bHQucHVzaChmYWN0b3J5KHN0cmVhbSkpXHJcbiAgfVxyXG5cclxuICByZXR1cm4gcmVzdWx0XHJcbn1cclxuXHJcbmNvbnN0IHBhcnNlUGhkciA9IChjaHVuaywgZGF0YSkgPT4gcGFyc2VDaHVuayhjaHVuaywgZGF0YSwgXCJwaGRyXCIsIHN0cmVhbSA9PiBQcmVzZXRIZWFkZXIucGFyc2Uoc3RyZWFtKSlcclxuY29uc3QgcGFyc2VQYmFnID0gKGNodW5rLCBkYXRhKSA9PiBwYXJzZUNodW5rKGNodW5rLCBkYXRhLCBcInBiYWdcIiwgc3RyZWFtID0+IFByZXNldEJhZy5wYXJzZShzdHJlYW0pKVxyXG5jb25zdCBwYXJzZUluc3QgPSAoY2h1bmssIGRhdGEpID0+IHBhcnNlQ2h1bmsoY2h1bmssIGRhdGEsIFwiaW5zdFwiLCBzdHJlYW0gPT4gSW5zdHJ1bWVudC5wYXJzZShzdHJlYW0pKVxyXG5jb25zdCBwYXJzZUliYWcgPSAoY2h1bmssIGRhdGEpID0+IHBhcnNlQ2h1bmsoY2h1bmssIGRhdGEsIFwiaWJhZ1wiLCBzdHJlYW0gPT4gSW5zdHJ1bWVudEJhZy5wYXJzZShzdHJlYW0pKVxyXG5jb25zdCBwYXJzZVBtb2QgPSAoY2h1bmssIGRhdGEpID0+IHBhcnNlQ2h1bmsoY2h1bmssIGRhdGEsIFwicG1vZFwiLCBzdHJlYW0gPT4gTW9kdWxhdG9yTGlzdC5wYXJzZShzdHJlYW0pKVxyXG5jb25zdCBwYXJzZUltb2QgPSAoY2h1bmssIGRhdGEpID0+IHBhcnNlQ2h1bmsoY2h1bmssIGRhdGEsIFwiaW1vZFwiLCBzdHJlYW0gPT4gTW9kdWxhdG9yTGlzdC5wYXJzZShzdHJlYW0pKVxyXG5jb25zdCBwYXJzZVBnZW4gPSAoY2h1bmssIGRhdGEpID0+IHBhcnNlQ2h1bmsoY2h1bmssIGRhdGEsIFwicGdlblwiLCBzdHJlYW0gPT4gR2VuZXJhdG9yTGlzdC5wYXJzZShzdHJlYW0pKVxyXG5jb25zdCBwYXJzZUlnZW4gPSAoY2h1bmssIGRhdGEpID0+IHBhcnNlQ2h1bmsoY2h1bmssIGRhdGEsIFwiaWdlblwiLCBzdHJlYW0gPT4gR2VuZXJhdG9yTGlzdC5wYXJzZShzdHJlYW0pKVxyXG5jb25zdCBwYXJzZVNoZHIgPSAoY2h1bmssIGRhdGEpID0+IHBhcnNlQ2h1bmsoY2h1bmssIGRhdGEsIFwic2hkclwiLCBzdHJlYW0gPT4gU2FtcGxlLnBhcnNlKHN0cmVhbSkpXHJcblxyXG5mdW5jdGlvbiBhZGp1c3RTYW1wbGVEYXRhKHNhbXBsZSwgc2FtcGxlUmF0ZSkge1xyXG4gIGxldCBtdWx0aXBseSA9IDFcclxuXHJcbiAgLy8gYnVmZmVyXHJcbiAgd2hpbGUgKHNhbXBsZVJhdGUgPCAyMjA1MCkge1xyXG4gICAgY29uc3QgbmV3U2FtcGxlID0gbmV3IEludDE2QXJyYXkoc2FtcGxlLmxlbmd0aCAqIDIpXHJcbiAgICBmb3IgKGxldCBpID0gMCwgaiA9IDAsIGlsID0gc2FtcGxlLmxlbmd0aDsgaSA8IGlsOyArK2kpIHtcclxuICAgICAgbmV3U2FtcGxlW2orK10gPSBzYW1wbGVbaV1cclxuICAgICAgbmV3U2FtcGxlW2orK10gPSBzYW1wbGVbaV1cclxuICAgIH1cclxuICAgIHNhbXBsZSA9IG5ld1NhbXBsZVxyXG4gICAgbXVsdGlwbHkgKj0gMlxyXG4gICAgc2FtcGxlUmF0ZSAqPSAyXHJcbiAgfVxyXG5cclxuICByZXR1cm4ge1xyXG4gICAgc2FtcGxlLFxyXG4gICAgbXVsdGlwbHlcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGxvYWRTYW1wbGUoc2FtcGxlSGVhZGVyLCBzYW1wbGluZ0RhdGFPZmZzZXQsIGRhdGEpOiBJbnQxNkFycmF5W10ge1xyXG4gIGNvbnN0IHNhbXBsZXMgPSBbXVxyXG4gIGZvciAobGV0IGhlYWRlciBvZiBzYW1wbGVIZWFkZXIpIHtcclxuICAgIGxldCBzYW1wbGUgPSBuZXcgSW50MTZBcnJheShuZXcgVWludDhBcnJheShkYXRhLnN1YmFycmF5KFxyXG4gICAgICBzYW1wbGluZ0RhdGFPZmZzZXQgKyBoZWFkZXIuc3RhcnQgKiAyLFxyXG4gICAgICBzYW1wbGluZ0RhdGFPZmZzZXQgKyBoZWFkZXIuZW5kICAgKiAyXHJcbiAgICApKS5idWZmZXIpXHJcbiAgICBpZiAoaGVhZGVyLnNhbXBsZVJhdGUgPiAwKSB7XHJcbiAgICAgIGNvbnN0IGFkanVzdCA9IGFkanVzdFNhbXBsZURhdGEoc2FtcGxlLCBoZWFkZXIuc2FtcGxlUmF0ZSlcclxuICAgICAgc2FtcGxlID0gYWRqdXN0LnNhbXBsZVxyXG4gICAgICBoZWFkZXIuc2FtcGxlUmF0ZSAqPSBhZGp1c3QubXVsdGlwbHlcclxuICAgICAgaGVhZGVyLnN0YXJ0TG9vcCAqPSBhZGp1c3QubXVsdGlwbHlcclxuICAgICAgaGVhZGVyLmVuZExvb3AgKj0gYWRqdXN0Lm11bHRpcGx5XHJcbiAgICB9XHJcbiAgICBzYW1wbGVzLnB1c2goc2FtcGxlKVxyXG4gIH1cclxuICByZXR1cm4gc2FtcGxlc1xyXG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3NmMi50cyIsImV4cG9ydCBjbGFzcyBQYXJzZXIge1xyXG4gIGNodW5rTGlzdDogQ2h1bmtbXSA9IFtdXHJcbiAgXHJcbiAgcHJpdmF0ZSBpbnB1dDogVWludDhBcnJheVxyXG4gIHByaXZhdGUgaXA6IG51bWJlclxyXG4gIHByaXZhdGUgbGVuZ3RoOiBudW1iZXJcclxuICBwcml2YXRlIG9mZnNldDogbnVtYmVyXHJcbiAgcHJpdmF0ZSBwYWRkaW5nOiBib29sZWFuXHJcbiAgcHJpdmF0ZSBiaWdFbmRpYW46IGJvb2xlYW5cclxuXHJcbiAgY29uc3RydWN0b3IoaW5wdXQ6IFVpbnQ4QXJyYXksIG9wdF9wYXJhbXM6IHt9ID0ge30pIHtcclxuICAgIHRoaXMuaW5wdXQgPSBpbnB1dFxyXG4gICAgdGhpcy5pcCA9IG9wdF9wYXJhbXNbJ2luZGV4J10gfHwgMFxyXG4gICAgdGhpcy5sZW5ndGggPSBvcHRfcGFyYW1zWydsZW5ndGgnXSB8fCBpbnB1dC5sZW5ndGggLSB0aGlzLmlwXHJcbiAgICB0aGlzLmNodW5rTGlzdCA9IFtdXHJcbiAgICB0aGlzLm9mZnNldCA9IHRoaXMuaXBcclxuICAgIHRoaXMucGFkZGluZyA9XHJcbiAgICAgIG9wdF9wYXJhbXNbJ3BhZGRpbmcnXSAhPT0gdm9pZCAwID8gb3B0X3BhcmFtc1sncGFkZGluZyddIDogdHJ1ZVxyXG4gICAgdGhpcy5iaWdFbmRpYW4gPVxyXG4gICAgICBvcHRfcGFyYW1zWydiaWdFbmRpYW4nXSAhPT0gdm9pZCAwID8gb3B0X3BhcmFtc1snYmlnRW5kaWFuJ10gOiBmYWxzZVxyXG4gIH1cclxuICBcclxuICBwYXJzZSgpIHtcclxuICAgIGNvbnN0IGxlbmd0aCA9IHRoaXMubGVuZ3RoICsgdGhpcy5vZmZzZXRcclxuXHJcbiAgICB0aGlzLmNodW5rTGlzdCA9IFtdXHJcblxyXG4gICAgd2hpbGUgKHRoaXMuaXAgPCBsZW5ndGgpIHtcclxuICAgICAgdGhpcy5wYXJzZUNodW5rKClcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHBhcnNlQ2h1bmsoKSB7XHJcbiAgICBjb25zdCBpbnB1dCA9IHRoaXMuaW5wdXRcclxuICAgIGxldCBpcCA9IHRoaXMuaXBcclxuICAgIGxldCBzaXplXHJcblxyXG4gICAgdGhpcy5jaHVua0xpc3QucHVzaChuZXcgQ2h1bmsoXHJcbiAgICAgIFN0cmluZy5mcm9tQ2hhckNvZGUoaW5wdXRbaXArK10sIGlucHV0W2lwKytdLCBpbnB1dFtpcCsrXSwgaW5wdXRbaXArK10pLFxyXG4gICAgICAoc2l6ZSA9IHRoaXMuYmlnRW5kaWFuID9cclxuICAgICAgICAoKGlucHV0W2lwKytdIDw8IDI0KSB8IChpbnB1dFtpcCsrXSA8PCAxNikgfFxyXG4gICAgICAgICAgKGlucHV0W2lwKytdIDw8ICA4KSB8IChpbnB1dFtpcCsrXSAgICAgICkpID4+PiAwIDpcclxuICAgICAgICAoKGlucHV0W2lwKytdICAgICAgKSB8IChpbnB1dFtpcCsrXSA8PCAgOCkgfFxyXG4gICAgICAgICAgKGlucHV0W2lwKytdIDw8IDE2KSB8IChpbnB1dFtpcCsrXSA8PCAyNCkpID4+PiAwXHJcbiAgICAgICksXHJcbiAgICAgIGlwXHJcbiAgICApKVxyXG5cclxuICAgIGlwICs9IHNpemVcclxuXHJcbiAgICAvLyBwYWRkaW5nXHJcbiAgICBpZiAodGhpcy5wYWRkaW5nICYmICgoaXAgLSB0aGlzLm9mZnNldCkgJiAxKSA9PT0gMSkge1xyXG4gICAgICBpcCsrXHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pcCA9IGlwXHJcbiAgfVxyXG5cclxuICBnZXRDaHVuayhpbmRleDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBjaHVuayA9IHRoaXMuY2h1bmtMaXN0W2luZGV4XVxyXG5cclxuICAgIGlmIChjaHVuayA9PT0gdm9pZCAwKSB7XHJcbiAgICAgIHJldHVybiBudWxsXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGNodW5rXHJcbiAgfVxyXG5cclxuICBnZXROdW1iZXJPZkNodW5rcygpIHtcclxuICAgIHJldHVybiB0aGlzLmNodW5rTGlzdC5sZW5ndGhcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBDaHVuayB7XHJcbiAgdHlwZTogc3RyaW5nXHJcbiAgc2l6ZTogbnVtYmVyXHJcbiAgb2Zmc2V0OiBudW1iZXJcclxuXHJcbiAgY29uc3RydWN0b3IodHlwZTogc3RyaW5nLCBzaXplOiBudW1iZXIsIG9mZnNldDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLnR5cGUgPSB0eXBlXHJcbiAgICB0aGlzLnNpemUgPSBzaXplXHJcbiAgICB0aGlzLm9mZnNldCA9IG9mZnNldFxyXG4gIH1cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcmlmZi50cyIsImltcG9ydCB7IEdlbmVyYXRvckVudW1lcmF0b3JUYWJsZSB9IGZyb20gXCIuL2NvbnN0YW50cy50c1wiXHJcblxyXG5leHBvcnQgY2xhc3MgVmVyc2lvblRhZyB7XHJcbiAgbWFqb3I6IG51bWJlclxyXG4gIG1pbm9yOiBudW1iZXJcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFByZXNldEhlYWRlciB7XHJcbiAgcHJlc2V0TmFtZTogc3RyaW5nXHJcbiAgcHJlc2V0OiBudW1iZXJcclxuICBiYW5rOiBudW1iZXJcclxuICBwcmVzZXRCYWdJbmRleDogbnVtYmVyXHJcbiAgbGlicmFyeTogbnVtYmVyXHJcbiAgZ2VucmU6IG51bWJlclxyXG4gIG1vcnBob2xvZ3k6IG51bWJlclxyXG5cclxuICBzdGF0aWMgcGFyc2Uoc3RyZWFtKSB7XHJcbiAgICBjb25zdCBwID0gbmV3IFByZXNldEhlYWRlcigpXHJcbiAgICBwLnByZXNldE5hbWUgPSBzdHJlYW0ucmVhZFN0cmluZygyMClcclxuICAgIHAucHJlc2V0ID0gc3RyZWFtLnJlYWRXT1JEKClcclxuICAgIHAuYmFuayA9IHN0cmVhbS5yZWFkV09SRCgpXHJcbiAgICBwLnByZXNldEJhZ0luZGV4ID0gc3RyZWFtLnJlYWRXT1JEKClcclxuICAgIHAubGlicmFyeSA9IHN0cmVhbS5yZWFkRFdPUkQoKVxyXG4gICAgcC5nZW5yZSA9IHN0cmVhbS5yZWFkRFdPUkQoKVxyXG4gICAgcC5tb3JwaG9sb2d5ID0gc3RyZWFtLnJlYWREV09SRCgpXHJcbiAgICByZXR1cm4gcFxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFByZXNldEJhZyB7XHJcbiAgcHJlc2V0R2VuZXJhdG9ySW5kZXg6IG51bWJlclxyXG4gIHByZXNldE1vZHVsYXRvckluZGV4OiBudW1iZXJcclxuXHJcbiAgc3RhdGljIHBhcnNlKHN0cmVhbSkge1xyXG4gICAgY29uc3QgcCA9IG5ldyBQcmVzZXRCYWcoKVxyXG4gICAgcC5wcmVzZXRHZW5lcmF0b3JJbmRleCA9IHN0cmVhbS5yZWFkV09SRCgpXHJcbiAgICBwLnByZXNldE1vZHVsYXRvckluZGV4ID0gc3RyZWFtLnJlYWRXT1JEKClcclxuICAgIHJldHVybiBwXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgTW9kdWxhdG9yTGlzdCB7XHJcbiAgc291cmNlT3BlcjogbnVtYmVyXHJcbiAgZGVzdGluYXRpb25PcGVyOiBHZW5lcmF0b3JcclxuICB2YWx1ZTogT2JqZWN0XHJcbiAgYW1vdW50U291cmNlT3BlcjogbnVtYmVyXHJcbiAgdHJhbnNPcGVyOiBHZW5lcmF0b3JcclxuICB0eXBlOiBzdHJpbmdcclxuXHJcbiAgc3RhdGljIHBhcnNlKHN0cmVhbSkge1xyXG4gICAgY29uc3QgdCA9IG5ldyBNb2R1bGF0b3JMaXN0KClcclxuXHJcbiAgICB0LnNvdXJjZU9wZXIgPSBzdHJlYW0ucmVhZFdPUkQoKVxyXG4gICAgY29uc3QgY29kZSA9IHN0cmVhbS5yZWFkV09SRCgpXHJcbiAgICB0LmRlc3RpbmF0aW9uT3BlciA9IGNvZGVcclxuICAgIFxyXG4gICAgY29uc3Qga2V5ID0gR2VuZXJhdG9yRW51bWVyYXRvclRhYmxlW2NvZGVdXHJcbiAgICB0LnR5cGUgPSBrZXlcclxuXHJcbiAgICBpZiAoa2V5ID09PSB2b2lkIDApIHtcclxuICAgICAgLy8gQW1vdW50XHJcbiAgICAgIHQudmFsdWUgPSB7XHJcbiAgICAgICAgY29kZTogY29kZSxcclxuICAgICAgICBhbW91bnQ6IHN0cmVhbS5yZWFkSW50MTYoKVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBBbW91bnRcclxuICAgICAgc3dpdGNoIChrZXkpIHtcclxuICAgICAgICBjYXNlICdrZXlSYW5nZSc6IC8qIEZBTExUSFJPVUdIICovXHJcbiAgICAgICAgY2FzZSAndmVsUmFuZ2UnOiAvKiBGQUxMVEhST1VHSCAqL1xyXG4gICAgICAgIGNhc2UgJ2tleW51bSc6IC8qIEZBTExUSFJPVUdIICovXHJcbiAgICAgICAgY2FzZSAndmVsb2NpdHknOlxyXG4gICAgICAgICAgdC52YWx1ZSA9IHtcclxuICAgICAgICAgICAgbG86IHN0cmVhbS5yZWFkQnl0ZSgpLFxyXG4gICAgICAgICAgICBoaTogc3RyZWFtLnJlYWRCeXRlKClcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIHQudmFsdWUgPSB7XHJcbiAgICAgICAgICAgIGFtb3VudDogc3RyZWFtLnJlYWRJbnQxNigpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVha1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHQuYW1vdW50U291cmNlT3BlciA9IHN0cmVhbS5yZWFkV09SRCgpXHJcbiAgICB0LnRyYW5zT3BlciA9IHN0cmVhbS5yZWFkV09SRCgpXHJcblxyXG4gICAgcmV0dXJuIHRcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBHZW5lcmF0b3JMaXN0IHtcclxuICB0eXBlOiBzdHJpbmdcclxuICB2YWx1ZTogT2JqZWN0XHJcblxyXG4gIHN0YXRpYyBwYXJzZShzdHJlYW0pIHtcclxuICAgIGNvbnN0IHQgPSBuZXcgTW9kdWxhdG9yTGlzdCgpXHJcbiAgICBcclxuICAgIGNvbnN0IGNvZGUgPSBzdHJlYW0ucmVhZFdPUkQoKVxyXG4gICAgY29uc3Qga2V5ID0gR2VuZXJhdG9yRW51bWVyYXRvclRhYmxlW2NvZGVdXHJcbiAgICB0LnR5cGUgPSBrZXlcclxuXHJcbiAgICBpZiAoa2V5ID09PSB2b2lkIDApIHtcclxuICAgICAgdC52YWx1ZSA9IHtcclxuICAgICAgICBjb2RlLFxyXG4gICAgICAgIGFtb3VudDogc3RyZWFtLnJlYWRJbnQxNigpXHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHN3aXRjaCAoa2V5KSB7XHJcbiAgICAgICAgY2FzZSAna2V5bnVtJzogLyogRkFMTFRIUk9VR0ggKi9cclxuICAgICAgICBjYXNlICdrZXlSYW5nZSc6IC8qIEZBTExUSFJPVUdIICovXHJcbiAgICAgICAgY2FzZSAndmVsUmFuZ2UnOiAvKiBGQUxMVEhST1VHSCAqL1xyXG4gICAgICAgIGNhc2UgJ3ZlbG9jaXR5JzpcclxuICAgICAgICAgIHQudmFsdWUgPSB7XHJcbiAgICAgICAgICAgIGxvOiBzdHJlYW0ucmVhZEJ5dGUoKSxcclxuICAgICAgICAgICAgaGk6IHN0cmVhbS5yZWFkQnl0ZSgpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVha1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICB0LnZhbHVlID0ge1xyXG4gICAgICAgICAgICBhbW91bnQ6IHN0cmVhbS5yZWFkSW50MTYoKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgSW5zdHJ1bWVudCB7XHJcbiAgaW5zdHJ1bWVudE5hbWU6IHN0cmluZ1xyXG4gIGluc3RydW1lbnRCYWdJbmRleDogbnVtYmVyXHJcbiAgXHJcbiAgc3RhdGljIHBhcnNlKHN0cmVhbSkge1xyXG4gICAgY29uc3QgdCA9IG5ldyBJbnN0cnVtZW50KClcclxuICAgIHQuaW5zdHJ1bWVudE5hbWUgPSBzdHJlYW0ucmVhZFN0cmluZygyMClcclxuICAgIHQuaW5zdHJ1bWVudEJhZ0luZGV4ID0gc3RyZWFtLnJlYWRXT1JEKClcclxuICAgIHJldHVybiB0XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgSW5zdHJ1bWVudEJhZyB7XHJcbiAgaW5zdHJ1bWVudEdlbmVyYXRvckluZGV4OiBudW1iZXJcclxuICBpbnN0cnVtZW50TW9kdWxhdG9ySW5kZXg6IG51bWJlclxyXG4gIFxyXG4gIHN0YXRpYyBwYXJzZShzdHJlYW0pIHtcclxuICAgIGNvbnN0IHQgPSBuZXcgSW5zdHJ1bWVudEJhZygpXHJcbiAgICB0Lmluc3RydW1lbnRHZW5lcmF0b3JJbmRleCA9IHN0cmVhbS5yZWFkV09SRCgpXHJcbiAgICB0Lmluc3RydW1lbnRNb2R1bGF0b3JJbmRleCA9IHN0cmVhbS5yZWFkV09SRCgpXHJcbiAgICByZXR1cm4gdFxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFNhbXBsZSB7XHJcbiAgc2FtcGxlTmFtZTogc3RyaW5nXHJcbiAgc3RhcnQ6IG51bWJlclxyXG4gIGVuZDogbnVtYmVyXHJcbiAgc3RhcnRMb29wOiBudW1iZXJcclxuICBlbmRMb29wOiBudW1iZXJcclxuICBzYW1wbGVSYXRlOiBudW1iZXJcclxuICBvcmlnaW5hbFBpdGNoOiBudW1iZXJcclxuICBwaXRjaENvcnJlY3Rpb246IG51bWJlclxyXG4gIHNhbXBsZUxpbms6IG51bWJlclxyXG4gIHNhbXBsZVR5cGU6IG51bWJlclxyXG5cclxuICBzdGF0aWMgcGFyc2Uoc3RyZWFtKSB7XHJcbiAgICBjb25zdCBzID0gbmV3IFNhbXBsZSgpXHJcblxyXG4gICAgcy5zYW1wbGVOYW1lID0gc3RyZWFtLnJlYWRTdHJpbmcoMjApXHJcbiAgICBzLnN0YXJ0ID0gc3RyZWFtLnJlYWREV09SRCgpXHJcbiAgICBzLmVuZCA9IHN0cmVhbS5yZWFkRFdPUkQoKVxyXG4gICAgcy5zdGFydExvb3AgPSBzdHJlYW0ucmVhZERXT1JEKClcclxuICAgIHMuZW5kTG9vcCA9IHN0cmVhbS5yZWFkRFdPUkQoKVxyXG4gICAgcy5zYW1wbGVSYXRlID0gc3RyZWFtLnJlYWREV09SRCgpXHJcbiAgICBzLm9yaWdpbmFsUGl0Y2ggPSBzdHJlYW0ucmVhZEJ5dGUoKVxyXG4gICAgcy5waXRjaENvcnJlY3Rpb24gPSBzdHJlYW0ucmVhZEludDgoKVxyXG4gICAgcy5zYW1wbGVMaW5rID0gc3RyZWFtLnJlYWRXT1JEKClcclxuICAgIHMuc2FtcGxlVHlwZSA9IHN0cmVhbS5yZWFkV09SRCgpXHJcblxyXG4gICAgcy5zdGFydExvb3AgLT0gcy5zdGFydFxyXG4gICAgcy5lbmRMb29wIC09IHMuc3RhcnRcclxuXHJcbiAgICByZXR1cm4gc1xyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEBlbnVtIHtudW1iZXJ9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgU2FtcGxlTGluayA9IHtcclxuICBtb25vU2FtcGxlOiAxLFxyXG4gIHJpZ2h0U2FtcGxlOiAyLFxyXG4gIGxlZnRTYW1wbGU6IDQsXHJcbiAgbGlua2VkU2FtcGxlOiA4LFxyXG4gIFJvbU1vbm9TYW1wbGU6IDB4ODAwMSxcclxuICBSb21SaWdodFNhbXBsZTogMHg4MDAyLFxyXG4gIFJvbUxlZnRTYW1wbGU6IDB4ODAwNCxcclxuICBSb21MaW5rZWRTYW1wbGU6IDB4ODAwOFxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9zZjJfZGF0YS50cyIsImV4cG9ydCBmdW5jdGlvbiByZWFkU3RyaW5nKGRhdGE6IFVpbnQ4QXJyYXksIHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyKTogc3RyaW5nIHtcclxuICBjb25zdCBzdHIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGRhdGEuc3ViYXJyYXkoc3RhcnQsIGVuZCkpXHJcbiAgY29uc3QgbnVsbExvY2F0aW9uID0gc3RyLmluZGV4T2YoXCJcXHUwMDAwXCIpXHJcbiAgaWYgKG51bGxMb2NhdGlvbiA+IDApIHtcclxuICAgIHJldHVybiBzdHIuc3Vic3RyKDAsIG51bGxMb2NhdGlvbilcclxuICB9XHJcbiAgcmV0dXJuIHN0clxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9oZWxwZXIudHMiLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBTdHJlYW0ge1xyXG4gIHByaXZhdGUgZGF0YTogVWludDhBcnJheVxyXG4gIGlwOiBudW1iZXJcclxuXHJcbiAgY29uc3RydWN0b3IoZGF0YSwgb2Zmc2V0KSB7XHJcbiAgICB0aGlzLmRhdGEgPSBkYXRhXHJcbiAgICB0aGlzLmlwID0gb2Zmc2V0XHJcbiAgfVxyXG5cclxuICByZWFkU3RyaW5nKHNpemU6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICBjb25zdCBzdHIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIHRoaXMuZGF0YS5zdWJhcnJheSh0aGlzLmlwLCB0aGlzLmlwICs9IHNpemUpKVxyXG4gICAgY29uc3QgbnVsbExvY2F0aW9uID0gc3RyLmluZGV4T2YoXCJcXHUwMDAwXCIpXHJcbiAgICBpZiAobnVsbExvY2F0aW9uID4gMCkge1xyXG4gICAgICByZXR1cm4gc3RyLnN1YnN0cigwLCBudWxsTG9jYXRpb24pXHJcbiAgICB9XHJcbiAgICByZXR1cm4gc3RyXHJcbiAgfVxyXG5cclxuICByZWFkV09SRCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuZGF0YVt0aGlzLmlwKytdIHwgKHRoaXMuZGF0YVt0aGlzLmlwKytdIDw8IDgpXHJcbiAgfVxyXG5cclxuICByZWFkRFdPUkQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIHRoaXMuZGF0YVt0aGlzLmlwKytdIHwgXHJcbiAgICAgICh0aGlzLmRhdGFbdGhpcy5pcCsrXSA8PCA4KSB8IFxyXG4gICAgICAodGhpcy5kYXRhW3RoaXMuaXArK10gPDwgMTYpIHwgXHJcbiAgICAgICh0aGlzLmRhdGFbdGhpcy5pcCsrXSA8PCAyNClcclxuICAgICkgPj4+IDBcclxuICB9XHJcblxyXG4gIHJlYWRCeXRlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZGF0YVt0aGlzLmlwKytdXHJcbiAgfVxyXG5cclxuICByZWFkQXQob2Zmc2V0OiBudW1iZXIpIHtcclxuICAgIHJldHVybiB0aGlzLmRhdGFbdGhpcy5pcCArIG9mZnNldF1cclxuICB9XHJcblxyXG4gIC8qIGhlbHBlciAqL1xyXG5cclxuICByZWFkVUludDgoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5yZWFkQnl0ZSgpXHJcbiAgfVxyXG4gIFxyXG4gIHJlYWRJbnQ4KCkge1xyXG4gICAgcmV0dXJuICh0aGlzLnJlYWRCeXRlKCkgPDwgMjQpID4+IDI0XHJcbiAgfVxyXG4gIFxyXG4gIHJlYWRVSW50MTYoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5yZWFkV09SRCgpXHJcbiAgfVxyXG5cclxuICByZWFkSW50MTYoKSB7XHJcbiAgICByZXR1cm4gKHRoaXMucmVhZFdPUkQoKSA8PCAxNikgPj4gMTZcclxuICB9XHJcblxyXG4gIHJlYWRVSW50MzIoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5yZWFkRFdPUkQoKVxyXG4gIH1cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvc3RyZWFtLnRzIiwiaW1wb3J0IFBhcnNlciBmcm9tIFwiLi4vc3JjL3NmMi50c1wiXHJcbmV4cG9ydCBkZWZhdWx0IFBhcnNlclxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9leHBvcnQvcGFyc2VyLmpzIl0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file diff --git a/bin/sf2.synth.js b/bin/sf2.synth.js index a965870..6c9f80d 100644 --- a/bin/sf2.synth.js +++ b/bin/sf2.synth.js @@ -1,4 +1,14 @@ -/******/ (function(modules) { // webpackBootstrap +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(); + else if(typeof define === 'function' && define.amd) + define([], factory); + else if(typeof exports === 'object') + exports["synth"] = factory(); + else + root["synth"] = factory(); +})(typeof self !== 'undefined' ? self : this, function() { +return /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ @@ -6,21 +16,21 @@ /******/ function __webpack_require__(moduleId) { /******/ /******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) +/******/ 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 +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ /******/ // Flag the module as loaded -/******/ module.loaded = true; +/******/ module.l = true; /******/ /******/ // Return the exports of the module /******/ return module.exports; @@ -33,2150 +43,1730 @@ /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { +/******/ configurable: false, +/******/ enumerable: true, +/******/ get: getter +/******/ }); +/******/ } +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ /******/ // __webpack_public_path__ -/******/ __webpack_require__.p = "static"; +/******/ __webpack_require__.p = ""; /******/ /******/ // Load entry module and return exports -/******/ return __webpack_require__(0); +/******/ return __webpack_require__(__webpack_require__.s = 7); /******/ }) /************************************************************************/ /******/ ([ /* 0 */ -/***/ function(module, exports, __webpack_require__) { +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +exports.__esModule = true; +exports.GeneratorEnumeratorTable = [ + 'startAddrsOffset', + 'endAddrsOffset', + 'startloopAddrsOffset', + 'endloopAddrsOffset', + 'startAddrsCoarseOffset', + 'modLfoToPitch', + 'vibLfoToPitch', + 'modEnvToPitch', + 'initialFilterFc', + 'initialFilterQ', + 'modLfoToFilterFc', + 'modEnvToFilterFc', + 'endAddrsCoarseOffset', + 'modLfoToVolume', + undefined, + 'chorusEffectsSend', + 'reverbEffectsSend', + 'pan', + undefined, undefined, undefined, + 'delayModLFO', + 'freqModLFO', + 'delayVibLFO', + 'freqVibLFO', + 'delayModEnv', + 'attackModEnv', + 'holdModEnv', + 'decayModEnv', + 'sustainModEnv', + 'releaseModEnv', + 'keynumToModEnvHold', + 'keynumToModEnvDecay', + 'delayVolEnv', + 'attackVolEnv', + 'holdVolEnv', + 'decayVolEnv', + 'sustainVolEnv', + 'releaseVolEnv', + 'keynumToVolEnvHold', + 'keynumToVolEnvDecay', + 'instrument', + undefined, + 'keyRange', + 'velRange', + 'startloopAddrsCoarseOffset', + 'keynum', + 'velocity', + 'initialAttenuation', + undefined, + 'endloopAddrsCoarseOffset', + 'coarseTune', + 'fineTune', + 'sampleID', + 'sampleModes', + undefined, + 'scaleTuning', + 'exclusiveClass', + 'overridingRootKey' +]; +exports.InfoNameTable = { + ICMT: "comment", + ICOP: "copyright", + ICRD: "creation_date", + IENG: "engineer", + INAM: "name", + IPRD: "product", + ISFT: "software", + ifil: "version", + isng: "sound_engine", + irom: "rom_name", + iver: "rom_version" +}; - "use strict"; - - Object.defineProperty(exports, "__esModule", { - value: true - }); - - var _wml = __webpack_require__(3); - - Object.keys(_wml).forEach(function (key) { - if (key === "default" || key === "__esModule") return; - Object.defineProperty(exports, key, { - enumerable: true, - get: function get() { - return _wml[key]; - } - }); - }); -/***/ }, +/***/ }), /* 1 */ -/***/ function(module, exports, __webpack_require__) { +/***/ (function(module, exports, __webpack_require__) { - 'use strict'; - - Object.defineProperty(exports, "__esModule", { - value: true - }); - - var _riff = __webpack_require__(2); - - var _riff2 = _interopRequireDefault(_riff); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - /** - * @param {ByteArray} input - * @param {Object=} opt_params - * @constructor - */ - var Parser = function Parser(input, opt_params) { - opt_params = opt_params || {}; - /** @type {ByteArray} */ - this.input = input; - /** @type {(Object|undefined)} */ - this.parserOption = opt_params['parserOption']; - - /** @type {Array.} */ - this.presetHeader; - /** @type {Array.} */ - this.presetZone; - /** @type {Array.} */ - this.presetZoneModulator; - /** @type {Array.} */ - this.presetZoneGenerator; - /** @type {Array.} */ - this.instrument; - /** @type {Array.} */ - this.instrumentZone; - /** @type {Array.} */ - this.instrumentZoneModulator; - /** @type {Array.} */ - this.instrumentZoneGenerator; - /** @type {Array.} */ - this.sampleHeader; - }; - - Parser.prototype.parse = function () { - /** @type {Riff.Parser} */ - var parser = new _riff2.default.Parser(this.input, this.parserOption); - /** @type {?Riff.Chunk} */ - var chunk; - - // parse RIFF chunk - parser.parse(); - if (parser.chunkList.length !== 1) { - throw new Error('wrong chunk length'); - } - - chunk = parser.getChunk(0); - if (chunk === null) { - throw new Error('chunk not found'); - } - - this.parseRiffChunk(chunk); - //console.log(this.sampleHeader); - this.input = null; - }; - - /** - * @param {Riff.Chunk} chunk - */ - Parser.prototype.parseRiffChunk = function (chunk) { - /** @type {Riff.Parser} */ - var parser; - /** @type {ByteArray} */ - var data = this.input; - /** @type {number} */ - var ip = chunk.offset; - /** @type {string} */ - var signature; - - // check parse target - if (chunk.type !== 'RIFF') { - throw new Error('invalid chunk type:' + chunk.type); - } - - // check signature - signature = String.fromCharCode(data[ip++], data[ip++], data[ip++], data[ip++]); - if (signature !== 'sfbk') { - throw new Error('invalid signature:' + signature); - } - - // read structure - parser = new _riff2.default.Parser(data, { 'index': ip, 'length': chunk.size - 4 }); - parser.parse(); - if (parser.getNumberOfChunks() !== 3) { - throw new Error('invalid sfbk structure'); - } - - // INFO-list - this.parseInfoList( /** @type {!Riff.Chunk} */parser.getChunk(0)); - - // sdta-list - this.parseSdtaList( /** @type {!Riff.Chunk} */parser.getChunk(1)); - - // pdta-list - this.parsePdtaList( /** @type {!Riff.Chunk} */parser.getChunk(2)); - }; - - /** - * @param {Riff.Chunk} chunk - */ - Parser.prototype.parseInfoList = function (chunk) { - /** @type {Riff.Parser} */ - var parser; - /** @type {ByteArray} */ - var data = this.input; - /** @type {number} */ - var ip = chunk.offset; - /** @type {string} */ - var signature; - - // check parse target - if (chunk.type !== 'LIST') { - throw new Error('invalid chunk type:' + chunk.type); - } - - // check signature - signature = String.fromCharCode(data[ip++], data[ip++], data[ip++], data[ip++]); - if (signature !== 'INFO') { - throw new Error('invalid signature:' + signature); - } - - // read structure - parser = new _riff2.default.Parser(data, { 'index': ip, 'length': chunk.size - 4 }); - parser.parse(); - }; - - /** - * @param {Riff.Chunk} chunk - */ - Parser.prototype.parseSdtaList = function (chunk) { - /** @type {Riff.Parser} */ - var parser; - /** @type {ByteArray} */ - var data = this.input; - /** @type {number} */ - var ip = chunk.offset; - /** @type {string} */ - var signature; - - // check parse target - if (chunk.type !== 'LIST') { - throw new Error('invalid chunk type:' + chunk.type); - } - - // check signature - signature = String.fromCharCode(data[ip++], data[ip++], data[ip++], data[ip++]); - if (signature !== 'sdta') { - throw new Error('invalid signature:' + signature); - } - - // read structure - parser = new _riff2.default.Parser(data, { 'index': ip, 'length': chunk.size - 4 }); - parser.parse(); - if (parser.chunkList.length !== 1) { - throw new Error('TODO'); - } - this.samplingData = - /** @type {{type: string, size: number, offset: number}} */ - parser.getChunk(0); - }; - - /** - * @param {Riff.Chunk} chunk - */ - Parser.prototype.parsePdtaList = function (chunk) { - /** @type {Riff.Parser} */ - var parser; - /** @type {ByteArray} */ - var data = this.input; - /** @type {number} */ - var ip = chunk.offset; - /** @type {string} */ - var signature; - - // check parse target - if (chunk.type !== 'LIST') { - throw new Error('invalid chunk type:' + chunk.type); - } - - // check signature - signature = String.fromCharCode(data[ip++], data[ip++], data[ip++], data[ip++]); - if (signature !== 'pdta') { - throw new Error('invalid signature:' + signature); - } - - // read structure - parser = new _riff2.default.Parser(data, { 'index': ip, 'length': chunk.size - 4 }); - parser.parse(); - - // check number of chunks - if (parser.getNumberOfChunks() !== 9) { - throw new Error('invalid pdta chunk'); - } - - this.parsePhdr( /** @type {Riff.Chunk} */parser.getChunk(0)); - this.parsePbag( /** @type {Riff.Chunk} */parser.getChunk(1)); - this.parsePmod( /** @type {Riff.Chunk} */parser.getChunk(2)); - this.parsePgen( /** @type {Riff.Chunk} */parser.getChunk(3)); - this.parseInst( /** @type {Riff.Chunk} */parser.getChunk(4)); - this.parseIbag( /** @type {Riff.Chunk} */parser.getChunk(5)); - this.parseImod( /** @type {Riff.Chunk} */parser.getChunk(6)); - this.parseIgen( /** @type {Riff.Chunk} */parser.getChunk(7)); - this.parseShdr( /** @type {Riff.Chunk} */parser.getChunk(8)); - }; - - /** - * @param {Riff.Chunk} chunk - */ - Parser.prototype.parsePhdr = function (chunk) { - /** @type {ByteArray} */ - var data = this.input; - /** @type {number} */ - var ip = chunk.offset; - /** @type {Array.} */ - var presetHeader = this.presetHeader = []; - /** @type {number} */ - var size = chunk.offset + chunk.size; - - // check parse target - if (chunk.type !== 'phdr') { - throw new Error('invalid chunk type:' + chunk.type); - } - - while (ip < size) { - presetHeader.push({ - presetName: String.fromCharCode.apply(null, data.subarray(ip, ip += 20)), - preset: data[ip++] | data[ip++] << 8, - bank: data[ip++] | data[ip++] << 8, - presetBagIndex: data[ip++] | data[ip++] << 8, - library: (data[ip++] | data[ip++] << 8 | data[ip++] << 16 | data[ip++] << 24) >>> 0, - genre: (data[ip++] | data[ip++] << 8 | data[ip++] << 16 | data[ip++] << 24) >>> 0, - morphology: (data[ip++] | data[ip++] << 8 | data[ip++] << 16 | data[ip++] << 24) >>> 0 - }); - } - }; - - /** - * @param {Riff.Chunk} chunk - */ - Parser.prototype.parsePbag = function (chunk) { - /** @type {ByteArray} */ - var data = this.input; - /** @type {number} */ - var ip = chunk.offset; - /** @type {Array.} */ - var presetZone = this.presetZone = []; - /** @type {number} */ - var size = chunk.offset + chunk.size; - - // check parse target - if (chunk.type !== 'pbag') { - throw new Error('invalid chunk type:' + chunk.type); - } - - while (ip < size) { - presetZone.push({ - presetGeneratorIndex: data[ip++] | data[ip++] << 8, - presetModulatorIndex: data[ip++] | data[ip++] << 8 - }); - } - }; - - /** - * @param {Riff.Chunk} chunk - */ - Parser.prototype.parsePmod = function (chunk) { - // check parse target - if (chunk.type !== 'pmod') { - throw new Error('invalid chunk type:' + chunk.type); - } - - this.presetZoneModulator = this.parseModulator(chunk); - }; - - /** - * @param {Riff.Chunk} chunk - */ - Parser.prototype.parsePgen = function (chunk) { - // check parse target - if (chunk.type !== 'pgen') { - throw new Error('invalid chunk type:' + chunk.type); - } - this.presetZoneGenerator = this.parseGenerator(chunk); - }; - - /** - * @param {Riff.Chunk} chunk - */ - Parser.prototype.parseInst = function (chunk) { - /** @type {ByteArray} */ - var data = this.input; - /** @type {number} */ - var ip = chunk.offset; - /** @type {Array.} */ - var instrument = this.instrument = []; - /** @type {number} */ - var size = chunk.offset + chunk.size; - - // check parse target - if (chunk.type !== 'inst') { - throw new Error('invalid chunk type:' + chunk.type); - } - - while (ip < size) { - instrument.push({ - instrumentName: String.fromCharCode.apply(null, data.subarray(ip, ip += 20)), - instrumentBagIndex: data[ip++] | data[ip++] << 8 - }); - } - }; - - /** - * @param {Riff.Chunk} chunk - */ - Parser.prototype.parseIbag = function (chunk) { - /** @type {ByteArray} */ - var data = this.input; - /** @type {number} */ - var ip = chunk.offset; - /** @type {Array.} */ - var instrumentZone = this.instrumentZone = []; - /** @type {number} */ - var size = chunk.offset + chunk.size; - - // check parse target - if (chunk.type !== 'ibag') { - throw new Error('invalid chunk type:' + chunk.type); - } - - while (ip < size) { - instrumentZone.push({ - instrumentGeneratorIndex: data[ip++] | data[ip++] << 8, - instrumentModulatorIndex: data[ip++] | data[ip++] << 8 - }); - } - }; - - /** - * @param {Riff.Chunk} chunk - */ - Parser.prototype.parseImod = function (chunk) { - // check parse target - if (chunk.type !== 'imod') { - throw new Error('invalid chunk type:' + chunk.type); - } - - this.instrumentZoneModulator = this.parseModulator(chunk); - }; - - /** - * @param {Riff.Chunk} chunk - */ - Parser.prototype.parseIgen = function (chunk) { - // check parse target - if (chunk.type !== 'igen') { - throw new Error('invalid chunk type:' + chunk.type); - } - - this.instrumentZoneGenerator = this.parseGenerator(chunk); - }; - - /** - * @param {Riff.Chunk} chunk - */ - Parser.prototype.parseShdr = function (chunk) { - /** @type {ByteArray} */ - var data = this.input; - /** @type {number} */ - var ip = chunk.offset; - /** @type {Array.} */ - var samples = this.sample = []; - /** @type {Array.} */ - var sampleHeader = this.sampleHeader = []; - /** @type {number} */ - var size = chunk.offset + chunk.size; - /** @type {string} */ - var sampleName; - /** @type {number} */ - var start; - /** @type {number} */ - var end; - /** @type {number} */ - var startLoop; - /** @type {number} */ - var endLoop; - /** @type {number} */ - var sampleRate; - /** @type {number} */ - var originalPitch; - /** @type {number} */ - var pitchCorrection; - /** @type {number} */ - var sampleLink; - /** @type {number} */ - var sampleType; - - // check parse target - if (chunk.type !== 'shdr') { - throw new Error('invalid chunk type:' + chunk.type); - } - - while (ip < size) { - sampleName = String.fromCharCode.apply(null, data.subarray(ip, ip += 20)); - start = (data[ip++] << 0 | data[ip++] << 8 | data[ip++] << 16 | data[ip++] << 24) >>> 0; - end = (data[ip++] << 0 | data[ip++] << 8 | data[ip++] << 16 | data[ip++] << 24) >>> 0; - startLoop = (data[ip++] << 0 | data[ip++] << 8 | data[ip++] << 16 | data[ip++] << 24) >>> 0; - endLoop = (data[ip++] << 0 | data[ip++] << 8 | data[ip++] << 16 | data[ip++] << 24) >>> 0; - sampleRate = (data[ip++] << 0 | data[ip++] << 8 | data[ip++] << 16 | data[ip++] << 24) >>> 0; - originalPitch = data[ip++]; - pitchCorrection = data[ip++] << 24 >> 24; - sampleLink = data[ip++] | data[ip++] << 8; - sampleType = data[ip++] | data[ip++] << 8; - - //* - var sample = new Int16Array(new Uint8Array(data.subarray(this.samplingData.offset + start * 2, this.samplingData.offset + end * 2)).buffer); - - startLoop -= start; - endLoop -= start; - - if (sampleRate > 0) { - var adjust = this.adjustSampleData(sample, sampleRate); - sample = adjust.sample; - sampleRate *= adjust.multiply; - startLoop *= adjust.multiply; - endLoop *= adjust.multiply; - } - - samples.push(sample); - //*/ - - sampleHeader.push({ - sampleName: sampleName, - /* - start: start, - end: end, - */ - startLoop: startLoop, - endLoop: endLoop, - sampleRate: sampleRate, - originalPitch: originalPitch, - pitchCorrection: pitchCorrection, - sampleLink: sampleLink, - sampleType: sampleType - }); - } - }; - - Parser.prototype.adjustSampleData = function (sample, sampleRate) { - /** @type {Int16Array} */ - var newSample; - /** @type {number} */ - var i; - /** @type {number} */ - var il; - /** @type {number} */ - var j; - /** @type {number} */ - var multiply = 1; - - // buffer - while (sampleRate < 22050) { - newSample = new Int16Array(sample.length * 2); - for (i = j = 0, il = sample.length; i < il; ++i) { - newSample[j++] = sample[i]; - newSample[j++] = sample[i]; - } - sample = newSample; - multiply *= 2; - sampleRate *= 2; - } - - return { - sample: sample, - multiply: multiply - }; - }; - - /** - * @param {Riff.Chunk} chunk - * @return {Array.} - */ - Parser.prototype.parseModulator = function (chunk) { - /** @type {ByteArray} */ - var data = this.input; - /** @type {number} */ - var ip = chunk.offset; - /** @type {number} */ - var size = chunk.offset + chunk.size; - /** @type {number} */ - var code; - /** @type {string} */ - var key; - /** @type {Array.} */ - var output = []; - - while (ip < size) { - // Src Oper - // TODO - ip += 2; - - // Dest Oper - code = data[ip++] | data[ip++] << 8; - key = Parser.GeneratorEnumeratorTable[code]; - if (key === void 0) { - // Amount - output.push({ - type: key, - value: { - code: code, - amount: data[ip] | data[ip + 1] << 8 << 16 >> 16, - lo: data[ip++], - hi: data[ip++] - } - }); - } else { - // Amount - switch (key) { - case 'keyRange': /* FALLTHROUGH */ - case 'velRange': /* FALLTHROUGH */ - case 'keynum': /* FALLTHROUGH */ - case 'velocity': - output.push({ - type: key, - value: { - lo: data[ip++], - hi: data[ip++] - } - }); - break; - default: - output.push({ - type: key, - value: { - amount: data[ip++] | data[ip++] << 8 << 16 >> 16 - } - }); - break; - } - } - - // AmtSrcOper - // TODO - ip += 2; - - // Trans Oper - // TODO - ip += 2; - } - - return output; - }; - - /** - * @param {Riff.Chunk} chunk - * @return {Array.} - */ - Parser.prototype.parseGenerator = function (chunk) { - /** @type {ByteArray} */ - var data = this.input; - /** @type {number} */ - var ip = chunk.offset; - /** @type {number} */ - var size = chunk.offset + chunk.size; - /** @type {number} */ - var code; - /** @type {string} */ - var key; - /** @type {Array.} */ - var output = []; - - while (ip < size) { - code = data[ip++] | data[ip++] << 8; - key = Parser.GeneratorEnumeratorTable[code]; - if (key === void 0) { - output.push({ - type: key, - value: { - code: code, - amount: data[ip] | data[ip + 1] << 8 << 16 >> 16, - lo: data[ip++], - hi: data[ip++] - } - }); - continue; - } - - switch (key) { - case 'keynum': /* FALLTHROUGH */ - case 'keyRange': /* FALLTHROUGH */ - case 'velRange': /* FALLTHROUGH */ - case 'velocity': - output.push({ - type: key, - value: { - lo: data[ip++], - hi: data[ip++] - } - }); - break; - default: - output.push({ - type: key, - value: { - amount: data[ip++] | data[ip++] << 8 << 16 >> 16 - } - }); - break; - } - } - - return output; - }; - - Parser.prototype.createInstrument = function () { - /** @type {Array.} */ - var instrument = this.instrument; - /** @type {Array.} */ - var zone = this.instrumentZone; - /** @type {Array.} */ - var output = []; - /** @type {number} */ - var bagIndex; - /** @type {number} */ - var bagIndexEnd; - /** @type {Array.} */ - var zoneInfo; - /** @type {{generator: Object, generatorInfo: Array.}} */ - var instrumentGenerator; - /** @type {{modulator: Object, modulatorInfo: Array.}} */ - var instrumentModulator; - /** @type {number} */ - var i; - /** @type {number} */ - var il; - /** @type {number} */ - var j; - /** @type {number} */ - var jl; - - // instrument -> instrument bag -> generator / modulator - for (i = 0, il = instrument.length; i < il; ++i) { - bagIndex = instrument[i].instrumentBagIndex; - bagIndexEnd = instrument[i + 1] ? instrument[i + 1].instrumentBagIndex : zone.length; - zoneInfo = []; - - // instrument bag - for (j = bagIndex, jl = bagIndexEnd; j < jl; ++j) { - instrumentGenerator = this.createInstrumentGenerator_(zone, j); - instrumentModulator = this.createInstrumentModulator_(zone, j); - - zoneInfo.push({ - generator: instrumentGenerator.generator, - generatorSequence: instrumentGenerator.generatorInfo, - modulator: instrumentModulator.modulator, - modulatorSequence: instrumentModulator.modulatorInfo - }); - } - - output.push({ - name: instrument[i].instrumentName, - info: zoneInfo - }); - } - - return output; - }; - - Parser.prototype.createPreset = function () { - /** @type {Array.} */ - var preset = this.presetHeader; - /** @type {Array.} */ - var zone = this.presetZone; - /** @type {Array.} */ - var output = []; - /** @type {number} */ - var bagIndex; - /** @type {number} */ - var bagIndexEnd; - /** @type {Array.} */ - var zoneInfo; - /** @type {number} */ - var instrument; - /** @type {{generator: Object, generatorInfo: Array.}} */ - var presetGenerator; - /** @type {{modulator: Object, modulatorInfo: Array.}} */ - var presetModulator; - /** @type {number} */ - var i; - /** @type {number} */ - var il; - /** @type {number} */ - var j; - /** @type {number} */ - var jl; - - // preset -> preset bag -> generator / modulator - for (i = 0, il = preset.length; i < il; ++i) { - bagIndex = preset[i].presetBagIndex; - bagIndexEnd = preset[i + 1] ? preset[i + 1].presetBagIndex : zone.length; - zoneInfo = []; - - // preset bag - for (j = bagIndex, jl = bagIndexEnd; j < jl; ++j) { - presetGenerator = this.createPresetGenerator_(zone, j); - presetModulator = this.createPresetModulator_(zone, j); - - zoneInfo.push({ - generator: presetGenerator.generator, - generatorSequence: presetGenerator.generatorInfo, - modulator: presetModulator.modulator, - modulatorSequence: presetModulator.modulatorInfo - }); - - instrument = presetGenerator.generator['instrument'] !== void 0 ? presetGenerator.generator['instrument'].amount : presetModulator.modulator['instrument'] !== void 0 ? presetModulator.modulator['instrument'].amount : null; - } - - output.push({ - name: preset[i].presetName, - info: zoneInfo, - header: preset[i], - instrument: instrument - }); - } - - return output; - }; - - /** - * @param {Array.} zone - * @param {number} index - * @returns {{generator: Object, generatorInfo: Array.}} - * @private - */ - Parser.prototype.createInstrumentGenerator_ = function (zone, index) { - var modgen = this.createBagModGen_(zone, zone[index].instrumentGeneratorIndex, zone[index + 1] ? zone[index + 1].instrumentGeneratorIndex : this.instrumentZoneGenerator.length, this.instrumentZoneGenerator); - - return { - generator: modgen.modgen, - generatorInfo: modgen.modgenInfo - }; - }; - - /** - * @param {Array.} zone - * @param {number} index - * @returns {{modulator: Object, modulatorInfo: Array.}} - * @private - */ - Parser.prototype.createInstrumentModulator_ = function (zone, index) { - var modgen = this.createBagModGen_(zone, zone[index].presetModulatorIndex, zone[index + 1] ? zone[index + 1].instrumentModulatorIndex : this.instrumentZoneModulator.length, this.instrumentZoneModulator); - - return { - modulator: modgen.modgen, - modulatorInfo: modgen.modgenInfo - }; - }; - - /** - * @param {Array.} zone - * @param {number} index - * @returns {{generator: Object, generatorInfo: Array.}} - * @private - */ - Parser.prototype.createPresetGenerator_ = function (zone, index) { - var modgen = this.createBagModGen_(zone, zone[index].presetGeneratorIndex, zone[index + 1] ? zone[index + 1].presetGeneratorIndex : this.presetZoneGenerator.length, this.presetZoneGenerator); - - return { - generator: modgen.modgen, - generatorInfo: modgen.modgenInfo - }; - }; - - /** - * @param {Array.} zone - * @param {number} index - * @returns {{modulator: Object, modulatorInfo: Array.}} - * @private - */ - Parser.prototype.createPresetModulator_ = function (zone, index) { - /** @type {{modgen: Object, modgenInfo: Array.}} */ - var modgen = this.createBagModGen_(zone, zone[index].presetModulatorIndex, zone[index + 1] ? zone[index + 1].presetModulatorIndex : this.presetZoneModulator.length, this.presetZoneModulator); - - return { - modulator: modgen.modgen, - modulatorInfo: modgen.modgenInfo - }; - }; - - /** - * @param {Array.} zone - * @param {number} indexStart - * @param {number} indexEnd - * @param zoneModGen - * @returns {{modgen: Object, modgenInfo: Array.}} - * @private - */ - Parser.prototype.createBagModGen_ = function (zone, indexStart, indexEnd, zoneModGen) { - /** @type {Array.} */ - var modgenInfo = []; - /** @type {Object} */ - var modgen = { - unknown: [], - 'keyRange': { - hi: 127, - lo: 0 - } - }; // TODO - /** @type {Object} */ - var info; - /** @type {number} */ - var i; - /** @type {number} */ - var il; - - for (i = indexStart, il = indexEnd; i < il; ++i) { - info = zoneModGen[i]; - modgenInfo.push(info); - - if (info.type === 'unknown') { - modgen.unknown.push(info.value); - } else { - modgen[info.type] = info.value; - } - } - - return { - modgen: modgen, - modgenInfo: modgenInfo - }; - }; - - /** - * @type {Array.} - * @const - */ - Parser.GeneratorEnumeratorTable = ['startAddrsOffset', 'endAddrsOffset', 'startloopAddrsOffset', 'endloopAddrsOffset', 'startAddrsCoarseOffset', 'modLfoToPitch', 'vibLfoToPitch', 'modEnvToPitch', 'initialFilterFc', 'initialFilterQ', 'modLfoToFilterFc', 'modEnvToFilterFc', 'endAddrsCoarseOffset', 'modLfoToVolume',, // 14 - 'chorusEffectsSend', 'reverbEffectsSend', 'pan',,,, // 18,19,20 - 'delayModLFO', 'freqModLFO', 'delayVibLFO', 'freqVibLFO', 'delayModEnv', 'attackModEnv', 'holdModEnv', 'decayModEnv', 'sustainModEnv', 'releaseModEnv', 'keynumToModEnvHold', 'keynumToModEnvDecay', 'delayVolEnv', 'attackVolEnv', 'holdVolEnv', 'decayVolEnv', 'sustainVolEnv', 'releaseVolEnv', 'keynumToVolEnvHold', 'keynumToVolEnvDecay', 'instrument',, // 42 - 'keyRange', 'velRange', 'startloopAddrsCoarseOffset', 'keynum', 'velocity', 'initialAttenuation',, // 49 - 'endloopAddrsCoarseOffset', 'coarseTune', 'fineTune', 'sampleID', 'sampleModes',, // 55 - 'scaleTuning', 'exclusiveClass', 'overridingRootKey']; - - exports.default = Parser; +"use strict"; -/***/ }, +exports.__esModule = true; +var riff_ts_1 = __webpack_require__(2); +var sf2_data_ts_1 = __webpack_require__(3); +var helper_ts_1 = __webpack_require__(4); +var stream_ts_1 = __webpack_require__(5); +var constants_ts_1 = __webpack_require__(0); +var default_1 = /** @class */ (function () { + function default_1(input, opt_params) { + if (opt_params === void 0) { opt_params = {}; } + this.input = input; + this.parserOption = opt_params.parserOption; + } + default_1.prototype.parse = function () { + var parser = new riff_ts_1.Parser(this.input, this.parserOption); + // parse RIFF chunk + parser.parse(); + if (parser.chunkList.length !== 1) { + throw new Error('wrong chunk length'); + } + var chunk = parser.getChunk(0); + if (chunk === null) { + throw new Error('chunk not found'); + } + this.parseRiffChunk(chunk, this.input); + this.input = null; + }; + default_1.prototype.parseRiffChunk = function (chunk, data) { + var chunkList = getChunkList(chunk, data, "RIFF", "sfbk"); + if (chunkList.length !== 3) { + throw new Error('invalid sfbk structure'); + } + // INFO-list + this.info = parseInfoList(chunkList[0], data); + // sdta-list + this.samplingData = parseSdtaList(chunkList[1], data); + // pdta-list + this.parsePdtaList(chunkList[2], data); + }; + default_1.prototype.parsePdtaList = function (chunk, data) { + var chunkList = getChunkList(chunk, data, "LIST", "pdta"); + // check number of chunks + if (chunkList.length !== 9) { + throw new Error('invalid pdta chunk'); + } + this.presetHeader = parsePhdr(chunkList[0], data); + this.presetZone = parsePbag(chunkList[1], data); + this.presetZoneModulator = parsePmod(chunkList[2], data); + this.presetZoneGenerator = parsePgen(chunkList[3], data); + this.instrument = parseInst(chunkList[4], data); + this.instrumentZone = parseIbag(chunkList[5], data); + this.instrumentZoneModulator = parseImod(chunkList[6], data); + this.instrumentZoneGenerator = parseIgen(chunkList[7], data); + this.sampleHeader = parseShdr(chunkList[8], data); + this.sample = loadSample(this.sampleHeader, this.samplingData.offset, data); + }; + return default_1; +}()); +exports["default"] = default_1; +function getChunkList(chunk, data, expectedType, expectedSignature) { + // check parse target + if (chunk.type !== expectedType) { + throw new Error('invalid chunk type:' + chunk.type); + } + var stream = new stream_ts_1["default"](data, chunk.offset); + // check signature + var signature = stream.readString(4); + if (signature !== expectedSignature) { + throw new Error('invalid signature:' + signature); + } + // read structure + var parser = new riff_ts_1.Parser(data, { 'index': stream.ip, 'length': chunk.size - 4 }); + parser.parse(); + return parser.chunkList; +} +function parseInfoList(chunk, data) { + var info = {}; + var chunkList = getChunkList(chunk, data, "LIST", "INFO"); + for (var _i = 0, chunkList_1 = chunkList; _i < chunkList_1.length; _i++) { + var p = chunkList_1[_i]; + var offset = p.offset, size = p.size, type = p.type; + var name_1 = constants_ts_1.InfoNameTable[type] || type; + info[name_1] = helper_ts_1.readString(data, offset, offset + size); + } + return info; +} +function parseSdtaList(chunk, data) { + var chunkList = getChunkList(chunk, data, "LIST", "sdta"); + if (chunkList.length !== 1) { + throw new Error('TODO'); + } + return chunkList[0]; +} +function parseChunk(chunk, data, type, factory) { + var result = []; + if (chunk.type !== type) { + throw new Error('invalid chunk type:' + chunk.type); + } + var stream = new stream_ts_1["default"](data, chunk.offset); + var size = chunk.offset + chunk.size; + while (stream.ip < size) { + result.push(factory(stream)); + } + return result; +} +var parsePhdr = function (chunk, data) { return parseChunk(chunk, data, "phdr", function (stream) { return sf2_data_ts_1.PresetHeader.parse(stream); }); }; +var parsePbag = function (chunk, data) { return parseChunk(chunk, data, "pbag", function (stream) { return sf2_data_ts_1.PresetBag.parse(stream); }); }; +var parseInst = function (chunk, data) { return parseChunk(chunk, data, "inst", function (stream) { return sf2_data_ts_1.Instrument.parse(stream); }); }; +var parseIbag = function (chunk, data) { return parseChunk(chunk, data, "ibag", function (stream) { return sf2_data_ts_1.InstrumentBag.parse(stream); }); }; +var parsePmod = function (chunk, data) { return parseChunk(chunk, data, "pmod", function (stream) { return sf2_data_ts_1.ModulatorList.parse(stream); }); }; +var parseImod = function (chunk, data) { return parseChunk(chunk, data, "imod", function (stream) { return sf2_data_ts_1.ModulatorList.parse(stream); }); }; +var parsePgen = function (chunk, data) { return parseChunk(chunk, data, "pgen", function (stream) { return sf2_data_ts_1.GeneratorList.parse(stream); }); }; +var parseIgen = function (chunk, data) { return parseChunk(chunk, data, "igen", function (stream) { return sf2_data_ts_1.GeneratorList.parse(stream); }); }; +var parseShdr = function (chunk, data) { return parseChunk(chunk, data, "shdr", function (stream) { return sf2_data_ts_1.Sample.parse(stream); }); }; +function adjustSampleData(sample, sampleRate) { + var multiply = 1; + // buffer + while (sampleRate < 22050) { + var newSample = new Int16Array(sample.length * 2); + for (var i = 0, j = 0, il = sample.length; i < il; ++i) { + newSample[j++] = sample[i]; + newSample[j++] = sample[i]; + } + sample = newSample; + multiply *= 2; + sampleRate *= 2; + } + return { + sample: sample, + multiply: multiply + }; +} +function loadSample(sampleHeader, samplingDataOffset, data) { + var samples = []; + for (var _i = 0, sampleHeader_1 = sampleHeader; _i < sampleHeader_1.length; _i++) { + var header = sampleHeader_1[_i]; + var sample = new Int16Array(new Uint8Array(data.subarray(samplingDataOffset + header.start * 2, samplingDataOffset + header.end * 2)).buffer); + if (header.sampleRate > 0) { + var adjust = adjustSampleData(sample, header.sampleRate); + sample = adjust.sample; + header.sampleRate *= adjust.multiply; + header.startLoop *= adjust.multiply; + header.endLoop *= adjust.multiply; + } + samples.push(sample); + } + return samples; +} + + +/***/ }), /* 2 */ -/***/ function(module, exports) { +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; - 'use strict'; - - Object.defineProperty(exports, "__esModule", { - value: true - }); - var Riff = {}; - - /** - * @param {ByteArray} input input buffer. - * @param {Object=} opt_params option parameters. - * @constructor - */ - Riff.Parser = function (input, opt_params) { - opt_params = opt_params || {}; - /** @type {ByteArray} */ - this.input = input; - /** @type {number} */ - this.ip = opt_params['index'] || 0; - /** @type {number} */ - this.length = opt_params['length'] || input.length - this.ip; - /** @type {Array.} */ - this.chunkList; - /** @type {number} */ - this.offset = this.ip; - /** @type {boolean} */ - this.padding = opt_params['padding'] !== void 0 ? opt_params['padding'] : true; - /** @type {boolean} */ - this.bigEndian = opt_params['bigEndian'] !== void 0 ? opt_params['bigEndian'] : false; - }; - - /** - * @param {string} type - * @param {number} size - * @param {number} offset - * @constructor - */ - Riff.Chunk = function (type, size, offset) { - /** @type {string} */ - this.type = type; - /** @type {number} */ - this.size = size; - /** @type {number} */ - this.offset = offset; - }; - - Riff.Parser.prototype.parse = function () { - /** @type {number} */ - var length = this.length + this.offset; - - this.chunkList = []; - - while (this.ip < length) { - this.parseChunk(); - } - }; - - Riff.Parser.prototype.parseChunk = function () { - /** @type {ByteArray} */ - var input = this.input; - /** @type {number} */ - var ip = this.ip; - /** @type {number} */ - var size; - - this.chunkList.push(new Riff.Chunk(String.fromCharCode(input[ip++], input[ip++], input[ip++], input[ip++]), size = this.bigEndian ? (input[ip++] << 24 | input[ip++] << 16 | input[ip++] << 8 | input[ip++]) >>> 0 : (input[ip++] | input[ip++] << 8 | input[ip++] << 16 | input[ip++] << 24) >>> 0, ip)); - - ip += size; - - // padding - if (this.padding && (ip - this.offset & 1) === 1) { - ip++; - } - - this.ip = ip; - }; - - /** - * @param {number} index chunk index. - * @return {?Riff.Chunk} - */ - Riff.Parser.prototype.getChunk = function (index) { - /** @type {Riff.Chunk} */ - var chunk = this.chunkList[index]; - - if (chunk === void 0) { - return null; - } - - return chunk; - }; - - /** - * @return {number} - */ - Riff.Parser.prototype.getNumberOfChunks = function () { - return this.chunkList.length; - }; - - exports.default = Riff; +exports.__esModule = true; +var Parser = /** @class */ (function () { + function Parser(input, opt_params) { + if (opt_params === void 0) { opt_params = {}; } + this.chunkList = []; + this.input = input; + this.ip = opt_params['index'] || 0; + this.length = opt_params['length'] || input.length - this.ip; + this.chunkList = []; + this.offset = this.ip; + this.padding = + opt_params['padding'] !== void 0 ? opt_params['padding'] : true; + this.bigEndian = + opt_params['bigEndian'] !== void 0 ? opt_params['bigEndian'] : false; + } + Parser.prototype.parse = function () { + var length = this.length + this.offset; + this.chunkList = []; + while (this.ip < length) { + this.parseChunk(); + } + }; + Parser.prototype.parseChunk = function () { + var input = this.input; + var ip = this.ip; + var size; + this.chunkList.push(new Chunk(String.fromCharCode(input[ip++], input[ip++], input[ip++], input[ip++]), (size = this.bigEndian ? + ((input[ip++] << 24) | (input[ip++] << 16) | + (input[ip++] << 8) | (input[ip++])) >>> 0 : + ((input[ip++]) | (input[ip++] << 8) | + (input[ip++] << 16) | (input[ip++] << 24)) >>> 0), ip)); + ip += size; + // padding + if (this.padding && ((ip - this.offset) & 1) === 1) { + ip++; + } + this.ip = ip; + }; + Parser.prototype.getChunk = function (index) { + var chunk = this.chunkList[index]; + if (chunk === void 0) { + return null; + } + return chunk; + }; + Parser.prototype.getNumberOfChunks = function () { + return this.chunkList.length; + }; + return Parser; +}()); +exports.Parser = Parser; +var Chunk = /** @class */ (function () { + function Chunk(type, size, offset) { + this.type = type; + this.size = size; + this.offset = offset; + } + return Chunk; +}()); +exports.Chunk = Chunk; -/***/ }, + +/***/ }), /* 3 */ -/***/ function(module, exports, __webpack_require__) { +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +exports.__esModule = true; +var constants_ts_1 = __webpack_require__(0); +var VersionTag = /** @class */ (function () { + function VersionTag() { + } + return VersionTag; +}()); +exports.VersionTag = VersionTag; +var PresetHeader = /** @class */ (function () { + function PresetHeader() { + } + PresetHeader.parse = function (stream) { + var p = new PresetHeader(); + p.presetName = stream.readString(20); + p.preset = stream.readWORD(); + p.bank = stream.readWORD(); + p.presetBagIndex = stream.readWORD(); + p.library = stream.readDWORD(); + p.genre = stream.readDWORD(); + p.morphology = stream.readDWORD(); + return p; + }; + return PresetHeader; +}()); +exports.PresetHeader = PresetHeader; +var PresetBag = /** @class */ (function () { + function PresetBag() { + } + PresetBag.parse = function (stream) { + var p = new PresetBag(); + p.presetGeneratorIndex = stream.readWORD(); + p.presetModulatorIndex = stream.readWORD(); + return p; + }; + return PresetBag; +}()); +exports.PresetBag = PresetBag; +var ModulatorList = /** @class */ (function () { + function ModulatorList() { + } + ModulatorList.parse = function (stream) { + var t = new ModulatorList(); + t.sourceOper = stream.readWORD(); + var code = stream.readWORD(); + t.destinationOper = code; + var key = constants_ts_1.GeneratorEnumeratorTable[code]; + t.type = key; + if (key === void 0) { + // Amount + t.value = { + code: code, + amount: stream.readInt16() + }; + } + else { + // Amount + switch (key) { + case 'keyRange': /* FALLTHROUGH */ + case 'velRange': /* FALLTHROUGH */ + case 'keynum': /* FALLTHROUGH */ + case 'velocity': + t.value = { + lo: stream.readByte(), + hi: stream.readByte() + }; + break; + default: + t.value = { + amount: stream.readInt16() + }; + break; + } + } + t.amountSourceOper = stream.readWORD(); + t.transOper = stream.readWORD(); + return t; + }; + return ModulatorList; +}()); +exports.ModulatorList = ModulatorList; +var GeneratorList = /** @class */ (function () { + function GeneratorList() { + } + GeneratorList.parse = function (stream) { + var t = new ModulatorList(); + var code = stream.readWORD(); + var key = constants_ts_1.GeneratorEnumeratorTable[code]; + t.type = key; + if (key === void 0) { + t.value = { + code: code, + amount: stream.readInt16() + }; + } + else { + switch (key) { + case 'keynum': /* FALLTHROUGH */ + case 'keyRange': /* FALLTHROUGH */ + case 'velRange': /* FALLTHROUGH */ + case 'velocity': + t.value = { + lo: stream.readByte(), + hi: stream.readByte() + }; + break; + default: + t.value = { + amount: stream.readInt16() + }; + break; + } + } + return t; + }; + return GeneratorList; +}()); +exports.GeneratorList = GeneratorList; +var Instrument = /** @class */ (function () { + function Instrument() { + } + Instrument.parse = function (stream) { + var t = new Instrument(); + t.instrumentName = stream.readString(20); + t.instrumentBagIndex = stream.readWORD(); + return t; + }; + return Instrument; +}()); +exports.Instrument = Instrument; +var InstrumentBag = /** @class */ (function () { + function InstrumentBag() { + } + InstrumentBag.parse = function (stream) { + var t = new InstrumentBag(); + t.instrumentGeneratorIndex = stream.readWORD(); + t.instrumentModulatorIndex = stream.readWORD(); + return t; + }; + return InstrumentBag; +}()); +exports.InstrumentBag = InstrumentBag; +var Sample = /** @class */ (function () { + function Sample() { + } + Sample.parse = function (stream) { + var s = new Sample(); + s.sampleName = stream.readString(20); + s.start = stream.readDWORD(); + s.end = stream.readDWORD(); + s.startLoop = stream.readDWORD(); + s.endLoop = stream.readDWORD(); + s.sampleRate = stream.readDWORD(); + s.originalPitch = stream.readByte(); + s.pitchCorrection = stream.readInt8(); + s.sampleLink = stream.readWORD(); + s.sampleType = stream.readWORD(); + s.startLoop -= s.start; + s.endLoop -= s.start; + return s; + }; + return Sample; +}()); +exports.Sample = Sample; +/** + * @enum {number} + */ +exports.SampleLink = { + monoSample: 1, + rightSample: 2, + leftSample: 4, + linkedSample: 8, + RomMonoSample: 0x8001, + RomRightSample: 0x8002, + RomLeftSample: 0x8004, + RomLinkedSample: 0x8008 +}; - 'use strict'; - - Object.defineProperty(exports, "__esModule", { - value: true - }); - - var _sound_font_synth = __webpack_require__(4); - - var _sound_font_synth2 = _interopRequireDefault(_sound_font_synth); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - /** - * @constructor - */ - var WebMidiLink = function WebMidiLink() { - /** @type {Array.} */ - this.RpnMsb = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; - /** @type {Array.} */ - this.RpnLsb = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; - /** @type {boolean} */ - this.ready; - /** @type {Synthesizer} */ - this.synth; - /** @type {function(ArrayBuffer)} */ - this.loadCallback; - /** @type {Function} */ - this.messageHandler = this.onmessage.bind(this); - - window.addEventListener('DOMContentLoaded', function () { - this.ready = true; - }.bind(this), false); - }; - - WebMidiLink.prototype.setup = function (url) { - if (!this.ready) { - window.addEventListener('DOMContentLoaded', function onload() { - window.removeEventListener('DOMContentLoaded', onload, false); - this.load(url); - }.bind(this), false); - } else { - this.load(url); - } - }; - - WebMidiLink.prototype.load = function (url) { - /** @type {XMLHttpRequest} */ - var xhr = new XMLHttpRequest(); - - xhr.open('GET', url, true); - xhr.responseType = 'arraybuffer'; - - xhr.addEventListener('load', function (ev) { - /** @type {XMLHttpRequest} */ - var xhr = ev.target; - - this.onload(xhr.response); - if (typeof this.loadCallback === 'function') { - this.loadCallback(xhr.response); - } - }.bind(this), false); - - xhr.send(); - }; - - /** - * @param {ArrayBuffer} response - */ - WebMidiLink.prototype.onload = function (response) { - /** @type {Uint8Array} */ - var input = new Uint8Array(response); - - this.loadSoundFont(input); - }; - - /** - * @param {Uint8Array} input - */ - WebMidiLink.prototype.loadSoundFont = function (input) { - /** @type {Synthesizer} */ - var synth; - - if (!this.synth) { - synth = this.synth = new _sound_font_synth2.default(input); - document.body.appendChild(synth.drawSynth()); - synth.init(); - synth.start(); - window.addEventListener('message', this.messageHandler, false); - } else { - synth = this.synth; - synth.refreshInstruments(input); - } - - // link ready - if (window.opener) { - window.opener.postMessage("link,ready", '*'); - } else if (window.parent !== window) { - window.parent.postMessage("link,ready", '*'); - } - }; - - /** - * @param {Event} ev - */ - WebMidiLink.prototype.onmessage = function (ev) { - var msg = ev.data.split(','); - var type = msg.shift(); - var command; - - switch (type) { - case 'midi': - this.processMidiMessage(msg.map(function (hex) { - return parseInt(hex, 16); - })); - break; - case 'link': - command = msg.shift(); - switch (command) { - case 'reqpatch': - // TODO: dummy data - if (window.opener) { - window.opener.postMessage("link,patch", '*'); - } else if (window.parent !== window) { - window.parent.postMessage("link,patch", '*'); - } - break; - case 'setpatch': - // TODO: NOP - break; - default: - console.error('unknown link message:', command); - break; - } - break; - default: - console.error('unknown message type'); - } - }; - - /** - * @param {function(ArrayBuffer)} callback - */ - WebMidiLink.prototype.setLoadCallback = function (callback) { - this.loadCallback = callback; - }; - - /** - * @param {Array.} message - */ - WebMidiLink.prototype.processMidiMessage = function (message) { - /** @type {number} */ - var channel = message[0] & 0x0f; - /** @type {Synthesizer} */ - var synth = this.synth; - - switch (message[0] & 0xf0) { - case 0x80: - // NoteOff: 8n kk vv - synth.noteOff(channel, message[1], message[2]); - break; - case 0x90: - // NoteOn: 9n kk vv - if (message[2] > 0) { - synth.noteOn(channel, message[1], message[2]); - } else { - synth.noteOff(channel, message[1], 0); - } - break; - case 0xB0: - // Control Change: Bn cc dd - switch (message[1]) { - case 0x06: - // Data Entry: Bn 06 dd - switch (this.RpnMsb[channel]) { - case 0: - switch (this.RpnLsb[channel]) { - case 0: - // Pitch Bend Sensitivity - synth.pitchBendSensitivity(channel, message[2]); - break; - } - break; - } - break; - case 0x07: - // Volume Change: Bn 07 dd - synth.volumeChange(channel, message[2]); - break; - case 0x0A: - // Panpot Change: Bn 0A dd - synth.panpotChange(channel, message[2]); - break; - case 0x78: - // All Sound Off: Bn 78 00 - synth.allSoundOff(channel); - break; - case 0x79: - // Reset All Control: Bn 79 00 - synth.resetAllControl(channel); - break; - case 0x20: - // BankSelect - //console.log("bankselect:", channel, message[2]); - break; - case 0x64: - // RPN MSB - this.RpnMsb[channel] = message[2]; - break; - case 0x65: - // RPN LSB - this.RpnLsb[channel] = message[2]; - break; - default: - // not supported - } - break; - case 0xC0: - // Program Change: Cn pp - synth.programChange(channel, message[1]); - break; - case 0xE0: - // Pitch Bend - synth.pitchBend(channel, message[1], message[2]); - break; - case 0xf0: - // System Exclusive Message - // ID number - switch (message[1]) { - case 0x7e: - // non-realtime - // TODO - break; - case 0x7f: - // realtime - var device = message[2]; - // sub ID 1 - switch (message[3]) { - case 0x04: - // device control - // sub ID 2 - switch (message[4]) { - case 0x01: - // master volume - synth.setMasterVolume(message[5] + (message[6] << 7)); - break; - } - break; - } - break; - } - break; - default: - // not supported - break; - } - }; - - exports.default = WebMidiLink; -/***/ }, +/***/ }), /* 4 */ -/***/ function(module, exports, __webpack_require__) { +/***/ (function(module, exports, __webpack_require__) { - "use strict"; - - Object.defineProperty(exports, "__esModule", { - value: true - }); - - var _sound_font_synth_note = __webpack_require__(5); - - var _sound_font_synth_note2 = _interopRequireDefault(_sound_font_synth_note); - - var _sf = __webpack_require__(1); - - var _sf2 = _interopRequireDefault(_sf); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - /** - * @constructor - */ - var Synthesizer = function Synthesizer(input) { - /** @type {Uint8Array} */ - this.input = input; - /** @type {Parser} */ - this.parser; - /** @type {number} */ - this.bank = 0; - /** @type {Array.>} */ - this.bankSet; - /** @type {number} */ - this.bufferSize = 1024; - /** @type {AudioContext} */ - this.ctx = this.getAudioContext(); - /** @type {AudioGainNode} */ - this.gainMaster = this.ctx.createGainNode(); - /** @type {DynamicsCompressorNode} */ - this.compressor = this.ctx.createDynamicsCompressor(); - /** @type {AudioBufferSourceNode} */ - this.bufSrc = this.ctx.createBufferSource(); - /** @type {Array.} */ - this.channelInstrument = [0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 10, 11, 12, 13, 14, 15]; - /** @type {Array.} */ - this.channelVolume = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; - /** @type {Array.} */ - this.channelPanpot = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; - /** @type {Array.} */ - this.channelPitchBend = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; - this.channelPitchBendSensitivity = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; - /** @type {Array.>} */ - this.currentNoteOn = [[], [], [], [], [], [], [], [], [], [], [], [], [], [], [], []]; - /** @type {number} */ - this.baseVolume = 1 / 0x8000; - /** @type {number} */ - this.masterVolume = 16384; - - /** @type {HTMLTableElement} */ - this.table; - }; - /** - * @returns {AudioContext} - */ - Synthesizer.prototype.getAudioContext = function () { - /** @type {AudioContext} */ - var ctx; - - if (AudioContext !== void 0) { - ctx = new AudioContext(); - } else if (webkitAudioContext !== void 0) { - ctx = new webkitAudioContext(); - } else if (mozAudioContext !== void 0) { - ctx = new mozAudioContext(); - } else { - throw new Error('Web Audio not supported'); - } - - if (ctx.createGainNode === void 0) { - ctx.createGainNode = ctx.createGain; - } - - return ctx; - }; - - /** - * @type {Array.} - * @const - */ - Synthesizer.ProgramNames = ["Acoustic Piano", "Bright Piano", "Electric Grand Piano", "Honky-tonk Piano", "Electric Piano", "Electric Piano 2", "Harpsichord", "Clavi", "Celesta", "Glockenspiel", "Musical box", "Vibraphone", "Marimba", "Xylophone", "Tubular Bell", "Dulcimer", "Drawbar Organ", "Percussive Organ", "Rock Organ", "Church organ", "Reed organ", "Accordion", "Harmonica", "Tango Accordion", "Acoustic Guitar (nylon)", "Acoustic Guitar (steel)", "Electric Guitar (jazz)", "Electric Guitar (clean)", "Electric Guitar (muted)", "Overdriven Guitar", "Distortion Guitar", "Guitar harmonics", "Acoustic Bass", "Electric Bass (finger)", "Electric Bass (pick)", "Fretless Bass", "Slap Bass 1", "Slap Bass 2", "Synth Bass 1", "Synth Bass 2", "Violin", "Viola", "Cello", "Double bass", "Tremolo Strings", "Pizzicato Strings", "Orchestral Harp", "Timpani", "String Ensemble 1", "String Ensemble 2", "Synth Strings 1", "Synth Strings 2", "Voice Aahs", "Voice Oohs", "Synth Voice", "Orchestra Hit", "Trumpet", "Trombone", "Tuba", "Muted Trumpet", "French horn", "Brass Section", "Synth Brass 1", "Synth Brass 2", "Soprano Sax", "Alto Sax", "Tenor Sax", "Baritone Sax", "Oboe", "English Horn", "Bassoon", "Clarinet", "Piccolo", "Flute", "Recorder", "Pan Flute", "Blown Bottle", "Shakuhachi", "Whistle", "Ocarina", "Lead 1 (square)", "Lead 2 (sawtooth)", "Lead 3 (calliope)", "Lead 4 (chiff)", "Lead 5 (charang)", "Lead 6 (voice)", "Lead 7 (fifths)", "Lead 8 (bass + lead)", "Pad 1 (Fantasia)", "Pad 2 (warm)", "Pad 3 (polysynth)", "Pad 4 (choir)", "Pad 5 (bowed)", "Pad 6 (metallic)", "Pad 7 (halo)", "Pad 8 (sweep)", "FX 1 (rain)", "FX 2 (soundtrack)", "FX 3 (crystal)", "FX 4 (atmosphere)", "FX 5 (brightness)", "FX 6 (goblins)", "FX 7 (echoes)", "FX 8 (sci-fi)", "Sitar", "Banjo", "Shamisen", "Koto", "Kalimba", "Bagpipe", "Fiddle", "Shanai", "Tinkle Bell", "Agogo", "Steel Drums", "Woodblock", "Taiko Drum", "Melodic Tom", "Synth Drum", "Reverse Cymbal", "Guitar Fret Noise", "Breath Noise", "Seashore", "Bird Tweet", "Telephone Ring", "Helicopter", "Applause", "Gunshot"]; - - Synthesizer.prototype.init = function () { - /** @type {number} */ - var i; - - this.parser = new _sf2.default(this.input); - this.bankSet = this.createAllInstruments(); - - for (i = 0; i < 16; ++i) { - this.programChange(i, i); - this.volumeChange(i, 0x64); - this.panpotChange(i, 0x40); - this.pitchBend(i, 0x00, 0x40); // 8192 - this.pitchBendSensitivity(i, 2); - } - }; - - /** - * @param {Uint8Array} input - */ - Synthesizer.prototype.refreshInstruments = function (input) { - this.input = input; - this.parser = new _sf2.default(input); - this.bankSet = this.createAllInstruments(); - }; - - Synthesizer.prototype.createAllInstruments = function () { - /** @type {Parser} */ - var parser = this.parser; - parser.parse(); - /** @type {Array} TODO */ - var presets = parser.createPreset(); - /** @type {Array} TODO */ - var instruments = parser.createInstrument(); - /** @type {Object} */ - var banks = []; - /** @type {Array.>} */ - var bank; - /** @type {Object} TODO */ - var preset; - /** @type {Object} */ - var instrument; - /** @type {number} */ - var presetNumber; - /** @type {number} */ - var i; - /** @type {number} */ - var il; - /** @type {number} */ - var j; - /** @type {number} */ - var jl; - - for (i = 0, il = presets.length; i < il; ++i) { - preset = presets[i]; - presetNumber = preset.header.preset; - - if (typeof preset.instrument !== 'number') { - continue; - } - - instrument = instruments[preset.instrument]; - if (instrument.name.replace(/\0*$/, '') === 'EOI') { - continue; - } - - // select bank - if (banks[preset.header.bank] === void 0) { - banks[preset.header.bank] = []; - } - bank = banks[preset.header.bank]; - bank[presetNumber] = []; - bank[presetNumber].name = preset.name; - - for (j = 0, jl = instrument.info.length; j < jl; ++j) { - this.createNoteInfo(parser, instrument.info[j], bank[presetNumber]); - } - } - - return banks; - }; - - Synthesizer.prototype.createNoteInfo = function (parser, info, preset) { - var generator = info.generator; - /** @type {number} */ - var sampleId; - /** @type {Object} */ - var sampleHeader; - /** @type {number} */ - var volAttack; - /** @type {number} */ - var volDecay; - /** @type {number} */ - var volSustain; - /** @type {number} */ - var volRelease; - /** @type {number} */ - var modAttack; - /** @type {number} */ - var modDecay; - /** @type {number} */ - var modSustain; - /** @type {number} */ - var modRelease; - /** @type {number} */ - var tune; - /** @type {number} */ - var scale; - /** @type {number} */ - var freqVibLFO; - /** @type {number} */ - var i; - /** @type {number} */ - var il; - - if (generator['keyRange'] === void 0 || generator['sampleID'] === void 0) { - return; - } - - volAttack = this.getModGenAmount(generator, 'attackVolEnv', -12000); - volDecay = this.getModGenAmount(generator, 'decayVolEnv', -12000); - volSustain = this.getModGenAmount(generator, 'sustainVolEnv'); - volRelease = this.getModGenAmount(generator, 'releaseVolEnv', -12000); - modAttack = this.getModGenAmount(generator, 'attackModEnv', -12000); - modDecay = this.getModGenAmount(generator, 'decayModEnv', -12000); - modSustain = this.getModGenAmount(generator, 'sustainModEnv'); - modRelease = this.getModGenAmount(generator, 'releaseModEnv', -12000); - - tune = this.getModGenAmount(generator, 'coarseTune') + this.getModGenAmount(generator, 'fineTune') / 100; - scale = this.getModGenAmount(generator, 'scaleTuning', 100) / 100; - freqVibLFO = this.getModGenAmount(generator, 'freqVibLFO'); - - for (i = generator['keyRange'].lo, il = generator['keyRange'].hi; i <= il; ++i) { - if (preset[i]) { - continue; - } - - sampleId = this.getModGenAmount(generator, 'sampleID'); - sampleHeader = parser.sampleHeader[sampleId]; - preset[i] = { - 'sample': parser.sample[sampleId], - 'sampleRate': sampleHeader.sampleRate, - 'basePlaybackRate': Math.pow(Math.pow(2, 1 / 12), (i - this.getModGenAmount(generator, 'overridingRootKey', sampleHeader.originalPitch) + tune + sampleHeader.pitchCorrection / 100) * scale), - 'modEnvToPitch': this.getModGenAmount(generator, 'modEnvToPitch') / 100, - 'scaleTuning': scale, - 'start': this.getModGenAmount(generator, 'startAddrsCoarseOffset') * 32768 + this.getModGenAmount(generator, 'startAddrsOffset'), - 'end': this.getModGenAmount(generator, 'endAddrsCoarseOffset') * 32768 + this.getModGenAmount(generator, 'endAddrsOffset'), - 'loopStart': - //(sampleHeader.startLoop - sampleHeader.start) + - sampleHeader.startLoop + this.getModGenAmount(generator, 'startloopAddrsCoarseOffset') * 32768 + this.getModGenAmount(generator, 'startloopAddrsOffset'), - 'loopEnd': - //(sampleHeader.endLoop - sampleHeader.start) + - sampleHeader.endLoop + this.getModGenAmount(generator, 'endloopAddrsCoarseOffset') * 32768 + this.getModGenAmount(generator, 'endloopAddrsOffset'), - 'volAttack': Math.pow(2, volAttack / 1200), - 'volDecay': Math.pow(2, volDecay / 1200), - 'volSustain': volSustain / 1000, - 'volRelease': Math.pow(2, volRelease / 1200), - 'modAttack': Math.pow(2, modAttack / 1200), - 'modDecay': Math.pow(2, modDecay / 1200), - 'modSustain': modSustain / 1000, - 'modRelease': Math.pow(2, modRelease / 1200), - 'initialFilterFc': this.getModGenAmount(generator, 'initialFilterFc', 13500), - 'modEnvToFilterFc': this.getModGenAmount(generator, 'modEnvToFilterFc'), - 'initialFilterQ': this.getModGenAmount(generator, 'initialFilterQ'), - 'freqVibLFO': freqVibLFO ? Math.pow(2, freqVibLFO / 1200) * 8.176 : void 0 - }; - } - }; - - /** - * @param {Object} generator - * @param {string} enumeratorType - * @param {number=} opt_default - * @returns {number} - */ - Synthesizer.prototype.getModGenAmount = function (generator, enumeratorType, opt_default) { - if (opt_default === void 0) { - opt_default = 0; - } - - return generator[enumeratorType] ? generator[enumeratorType].amount : opt_default; - }; - - Synthesizer.prototype.start = function () { - this.bufSrc.connect(this.gainMaster); - this.gainMaster.connect(this.ctx.destination); - this.bufSrc.start(0); - - this.setMasterVolume(16383); - }; - - Synthesizer.prototype.setMasterVolume = function (volume) { - this.masterVolume = volume; - this.gainMaster.gain.value = this.baseVolume * (volume / 16384); - }; - - Synthesizer.prototype.stop = function () { - this.bufSrc.disconnect(0); - this.gainMaster.disconnect(0); - this.compressor.disconnect(0); - }; - - /** - * @type {!Array.} - * @const - */ - Synthesizer.TableHeader = ['Instrument', 'Vol', 'Pan', 'Bend', 'Range']; - - Synthesizer.prototype.drawSynth = function () { - /** @type {HTMLTableElement} */ - var table = this.table = - /** @type {HTMLTableElement} */document.createElement('table'); - /** @type {HTMLTableSectionElement} */ - var head = - /** @type {HTMLTableSectionElement} */document.createElement('thead'); - /** @type {HTMLTableSectionElement} */ - var body = - /** @type {HTMLTableSectionElement} */ - document.createElement('tbody'); - /** @type {HTMLTableRowElement} */ - var tableLine; - /** @type {NodeList} */ - var notes; - /** @type {number} */ - var i; - /** @type {number} */ - var j; - - head.appendChild(this.createTableLine(Synthesizer.TableHeader, true)); - - for (i = 0; i < 16; ++i) { - tableLine = this.createTableLine(Synthesizer.TableHeader.length + 128, false); - body.appendChild(tableLine); - - if (i !== 9) { - var select = document.createElement('select'); - var option; - for (j = 0; j < 128; ++j) { - option = document.createElement('option'); - option.textContent = Synthesizer.ProgramNames[j]; - select.appendChild(option); - } - tableLine.querySelector('td:nth-child(1)').appendChild(select); - select.addEventListener('change', function (synth, channel) { - return function (event) { - synth.programChange(channel, event.target.selectedIndex); - }; - }(this, i), false); - select.selectedIndex = this.channelInstrument[i]; - } else { - tableLine.querySelector('td:first-child').textContent = '[ RHYTHM TRACK ]'; - } - - notes = tableLine.querySelectorAll('td:nth-last-child(-n+128)'); - for (j = 0; j < 128; ++j) { - notes[j].addEventListener('mousedown', function (synth, channel, key) { - return function (event) { - event.preventDefault(); - synth.drag = true; - synth.noteOn(channel, key, 127); - }; - }(this, i, j)); - notes[j].addEventListener('mouseover', function (synth, channel, key) { - return function (event) { - event.preventDefault(); - if (synth.drag) { - synth.noteOn(channel, key, 127); - } - }; - }(this, i, j)); - notes[j].addEventListener('mouseout', function (synth, channel, key) { - return function (event) { - event.preventDefault(); - synth.noteOff(channel, key, 0); - }; - }(this, i, j)); - notes[j].addEventListener('mouseup', function (synth, channel, key) { - return function (event) { - event.preventDefault(); - synth.drag = false; - synth.noteOff(channel, key, 0); - }; - }(this, i, j)); - } - } - - table.appendChild(head); - table.appendChild(body); - - return table; - }; - - Synthesizer.prototype.removeSynth = function () { - var table = this.table; - - if (table) { - table.parentNode.removeChild(table); - this.table = null; - } - }; - - /** - * @param {!(Array.|number)} array - * @param {boolean} isTitleLine - * @returns {HTMLTableRowElement} - */ - Synthesizer.prototype.createTableLine = function (array, isTitleLine) { - /** @type {HTMLTableRowElement} */ - var tr = /** @type {HTMLTableRowElement} */document.createElement('tr'); - /** @type {HTMLTableCellElement} */ - var cell; - /** @type {boolean} */ - var isArray = array instanceof Array; - /** @type {number} */ - var i; - /** @type {number} */ - var il = isArray ? array.length : /** @type {number} */array; - - for (i = 0; i < il; ++i) { - cell = - /** @type {HTMLTableCellElement} */ - document.createElement(isTitleLine ? 'th' : 'td'); - cell.textContent = isArray && array[i] !== void 0 ? array[i] : ''; - tr.appendChild(cell); - } - - return tr; - }; - - /** - * @param {number} channel NoteOn するチャンネル. - * @param {number} key NoteOn するキー. - * @param {number} velocity 強さ. - */ - Synthesizer.prototype.noteOn = function (channel, key, velocity) { - /** @type {Object} */ - var bank = this.bankSet[channel === 9 ? 128 : this.bank]; - /** @type {Object} */ - var instrument = bank[this.channelInstrument[channel]]; - /** @type {Object} */ - var instrumentKey; - /** @type {SynthesizerNote} */ - var note; - - if (this.table) { - this.table.querySelector('tbody > ' + 'tr:nth-child(' + (channel + 1) + ') > ' + 'td:nth-child(' + (Synthesizer.TableHeader.length + key + 1) + ')').classList.add('note-on'); - } - - if (!instrument) { - // TODO - console.warn("instrument not found: bank=%s instrument=%s channel=%s", channel === 9 ? 128 : this.bank, this.channelInstrument[channel], channel); - return; - } - - instrumentKey = instrument[key]; - - if (!instrumentKey) { - // TODO - console.warn("instrument not found: bank=%s instrument=%s channel=%s key=%s", channel === 9 ? 128 : this.bank, this.channelInstrument[channel], channel, key); - return; - } - - var panpot = this.channelPanpot[channel] - 64; - panpot /= panpot < 0 ? 64 : 63; - - // create note information - instrumentKey['channel'] = channel; - instrumentKey['key'] = key; - instrumentKey['velocity'] = velocity; - instrumentKey['panpot'] = panpot; - instrumentKey['volume'] = this.channelVolume[channel] / 127; - instrumentKey['pitchBend'] = this.channelPitchBend[channel] - 8192; - instrumentKey['pitchBendSensitivity'] = this.channelPitchBendSensitivity[channel]; - - // note on - note = new _sound_font_synth_note2.default(this.ctx, this.gainMaster, instrumentKey); - note.noteOn(); - this.currentNoteOn[channel].push(note); - }; - - /** - * @param {number} channel NoteOff するチャンネル. - * @param {number} key NoteOff するキー. - * @param {number} velocity 強さ. - */ - Synthesizer.prototype.noteOff = function (channel, key, velocity) { - /** @type {Object} */ - var bank = this.bankSet[channel === 9 ? 128 : this.bank]; - /** @type {Object} */ - var instrument = bank[this.channelInstrument[channel]]; - /** @type {number} */ - var i; - /** @type {number} */ - var il; - /** @type {Array.} */ - var currentNoteOn = this.currentNoteOn[channel]; - /** @type {SynthesizerNote} */ - var note; - - if (this.table) { - this.table.querySelector('tbody > ' + 'tr:nth-child(' + (channel + 1) + ') > ' + 'td:nth-child(' + (key + Synthesizer.TableHeader.length + 1) + ')').classList.remove('note-on'); - } - - if (!instrument) { - return; - } - - for (i = 0, il = currentNoteOn.length; i < il; ++i) { - note = currentNoteOn[i]; - if (note.key === key) { - note.noteOff(); - currentNoteOn.splice(i, 1); - --i; - --il; - } - } - }; - - /** - * @param {number} channel 音色を変更するチャンネル. - * @param {number} instrument 音色番号. - */ - Synthesizer.prototype.programChange = function (channel, instrument) { - if (this.table) { - if (channel !== 9) { - this.table.querySelector('tbody > tr:nth-child(' + (channel + 1) + ') > td:first-child > select').selectedIndex = instrument; - } - } - // リズムトラックは無視する - if (channel === 9) { - return; - } - - this.channelInstrument[channel] = instrument; - }; - - /** - * @param {number} channel 音量を変更するチャンネル. - * @param {number} volume 音量(0-127). - */ - Synthesizer.prototype.volumeChange = function (channel, volume) { - if (this.table) { - this.table.querySelector('tbody > tr:nth-child(' + (channel + 1) + ') > td:nth-child(2)').textContent = volume; - } - - this.channelVolume[channel] = volume; - }; - - /** - * @param {number} channel panpot を変更するチャンネル. - * @param {number} panpot panpot(0-127). - */ - Synthesizer.prototype.panpotChange = function (channel, panpot) { - if (this.table) { - this.table.querySelector('tbody > tr:nth-child(' + (channel + 1) + ') > td:nth-child(3)').textContent = panpot; - } - - this.channelPanpot[channel] = panpot; - }; - - /** - * @param {number} channel panpot を変更するチャンネル. - * @param {number} lowerByte - * @param {number} higherByte - */ - Synthesizer.prototype.pitchBend = function (channel, lowerByte, higherByte) { - /** @type {number} */ - var bend = lowerByte & 0x7f | (higherByte & 0x7f) << 7; - /** @type {number} */ - var i; - /** @type {number} */ - var il; - /** @type {Array.} */ - var currentNoteOn = this.currentNoteOn[channel]; - /** @type {number} */ - var calculated = bend - 8192; - - if (this.table) { - this.table.querySelector('tbody > tr:nth-child(' + (channel + 1) + ') > td:nth-child(4)').textContent = calculated; - } - - for (i = 0, il = currentNoteOn.length; i < il; ++i) { - currentNoteOn[i].updatePitchBend(calculated); - } - - this.channelPitchBend[channel] = bend; - }; - - /** - * @param {number} channel pitch bend sensitivity を変更するチャンネル. - * @param {number} sensitivity - */ - Synthesizer.prototype.pitchBendSensitivity = function (channel, sensitivity) { - if (this.table) { - this.table.querySelector('tbody > tr:nth-child(' + (channel + 1) + ') > td:nth-child(5)').textContent = sensitivity; - } - - this.channelPitchBendSensitivity[channel] = sensitivity; - }; - - /** - * @param {number} channel 音を消すチャンネル. - */ - Synthesizer.prototype.allSoundOff = function (channel) { - /** @type {Array.} */ - var currentNoteOn = this.currentNoteOn[channel]; - - while (currentNoteOn.length > 0) { - this.noteOff(channel, currentNoteOn[0].key, 0); - } - }; - - /** - * @param {number} channel リセットするチャンネル - */ - Synthesizer.prototype.resetAllControl = function (channel) { - this.pitchBend(channel, 0x00, 0x40); // 8192 - }; - - exports.default = Synthesizer; +"use strict"; -/***/ }, +exports.__esModule = true; +function readString(data, start, end) { + var str = String.fromCharCode.apply(null, data.subarray(start, end)); + var nullLocation = str.indexOf("\u0000"); + if (nullLocation > 0) { + return str.substr(0, nullLocation); + } + return str; +} +exports.readString = readString; + + +/***/ }), /* 5 */ -/***/ function(module, exports) { +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +exports.__esModule = true; +var Stream = /** @class */ (function () { + function Stream(data, offset) { + this.data = data; + this.ip = offset; + } + Stream.prototype.readString = function (size) { + var str = String.fromCharCode.apply(null, this.data.subarray(this.ip, this.ip += size)); + var nullLocation = str.indexOf("\u0000"); + if (nullLocation > 0) { + return str.substr(0, nullLocation); + } + return str; + }; + Stream.prototype.readWORD = function () { + return this.data[this.ip++] | (this.data[this.ip++] << 8); + }; + Stream.prototype.readDWORD = function () { + return (this.data[this.ip++] | + (this.data[this.ip++] << 8) | + (this.data[this.ip++] << 16) | + (this.data[this.ip++] << 24)) >>> 0; + }; + Stream.prototype.readByte = function () { + return this.data[this.ip++]; + }; + Stream.prototype.readAt = function (offset) { + return this.data[this.ip + offset]; + }; + /* helper */ + Stream.prototype.readUInt8 = function () { + return this.readByte(); + }; + Stream.prototype.readInt8 = function () { + return (this.readByte() << 24) >> 24; + }; + Stream.prototype.readUInt16 = function () { + return this.readWORD(); + }; + Stream.prototype.readInt16 = function () { + return (this.readWORD() << 16) >> 16; + }; + Stream.prototype.readUInt32 = function () { + return this.readDWORD(); + }; + return Stream; +}()); +exports["default"] = Stream; + + +/***/ }), +/* 6 */, +/* 7 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__src_wml_ts__ = __webpack_require__(8); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__src_wml_ts___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0__src_wml_ts__); + +/* harmony default export */ __webpack_exports__["default"] = (__WEBPACK_IMPORTED_MODULE_0__src_wml_ts___default.a); + +/***/ }), +/* 8 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +exports.__esModule = true; +var sound_font_synth_ts_1 = __webpack_require__(9); +var synth_view_ts_1 = __webpack_require__(12); +var midi_message_handler_ts_1 = __webpack_require__(14); +/** + * @constructor + */ +var WebMidiLink = function () { + /** @type {function(ArrayBuffer)} */ + this.loadCallback; + /** @type {Function} */ + this.messageHandler = this.onmessage.bind(this); + this.midiMessageHandler = new midi_message_handler_ts_1["default"](); + window.addEventListener('DOMContentLoaded', function () { + this.ready = true; + }.bind(this), false); +}; +WebMidiLink.prototype.setup = function (url) { + if (!this.ready) { + window.addEventListener('DOMContentLoaded', function onload() { + window.removeEventListener('DOMContentLoaded', onload, false); + this.load(url); + }.bind(this), false); + } + else { + this.load(url); + } +}; +WebMidiLink.prototype.load = function (url) { + /** @type {XMLHttpRequest} */ + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, true); + xhr.responseType = 'arraybuffer'; + xhr.addEventListener('load', function (ev) { + /** @type {XMLHttpRequest} */ + var xhr = ev.target; + this.onload(xhr.response); + if (typeof this.loadCallback === 'function') { + this.loadCallback(xhr.response); + } + }.bind(this), false); + xhr.send(); +}; +/** + * @param {ArrayBuffer} response + */ +WebMidiLink.prototype.onload = function (response) { + /** @type {Uint8Array} */ + var input = new Uint8Array(response); + this.loadSoundFont(input); +}; +/** + * @param {Uint8Array} input + */ +WebMidiLink.prototype.loadSoundFont = function (input) { + /** @type {Synthesizer} */ + var synth; + if (!this.synth) { + synth = this.synth = new sound_font_synth_ts_1["default"](input); + var view = this.view = new synth_view_ts_1["default"](); + document.body.appendChild(view.draw(synth)); + this.midiMessageHandler.synth = synth; + synth.init(); + synth.start(); + window.addEventListener('message', this.messageHandler, false); + } + else { + synth = this.synth; + synth.refreshInstruments(input); + } + // link ready + if (window.opener) { + window.opener.postMessage("link,ready", '*'); + } + else if (window.parent !== window) { + window.parent.postMessage("link,ready", '*'); + } +}; +/** + * @param {Event} ev + */ +WebMidiLink.prototype.onmessage = function (ev) { + var msg = ev.data.split(','); + var type = msg.shift(); + var command; + switch (type) { + case 'midi': + this.midiMessageHandler.processMidiMessage(msg.map(function (hex) { + return parseInt(hex, 16); + })); + break; + case 'link': + command = msg.shift(); + switch (command) { + case 'reqpatch': + // TODO: dummy data + if (window.opener) { + window.opener.postMessage("link,patch", '*'); + } + else if (window.parent !== window) { + window.parent.postMessage("link,patch", '*'); + } + break; + case 'setpatch': + // TODO: NOP + break; + default: + console.error('unknown link message:', command); + break; + } + break; + default: + console.error('unknown message type'); + } +}; +/** + * @param {function(ArrayBuffer)} callback + */ +WebMidiLink.prototype.setLoadCallback = function (callback) { + this.loadCallback = callback; +}; +exports["default"] = WebMidiLink; + + +/***/ }), +/* 9 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +exports.__esModule = true; +var sound_font_synth_note_ts_1 = __webpack_require__(10); +var sf2_ts_1 = __webpack_require__(1); +var sound_font_ts_1 = __webpack_require__(11); +var BASE_VOLUME = 0.4; +var Channel = /** @class */ (function () { + function Channel() { + this.instrument = 0; + this.volume = 0; + this.pitchBend = 0; + this.pitchBendSensitivity = 0; + this.panpot = 0; + this.currentNoteOn = []; + } + return Channel; +}()); +var DummyView = /** @class */ (function () { + function DummyView() { + } + DummyView.prototype.draw = function () { }; + DummyView.prototype.remove = function () { }; + DummyView.prototype.getInstrumentElement = function () { }; + DummyView.prototype.getKeyElement = function () { }; + DummyView.prototype.noteOn = function () { }; + DummyView.prototype.noteOff = function () { }; + DummyView.prototype.programChange = function () { }; + DummyView.prototype.volumeChange = function () { }; + DummyView.prototype.panpotChange = function () { }; + DummyView.prototype.pitchBend = function () { }; + DummyView.prototype.pitchBendSensitivity = function () { }; + return DummyView; +}()); +var Synthesizer = /** @class */ (function () { + function Synthesizer(ctx) { + this.input = null; + this.bank = 0; + this.bufferSize = 1024; + this.channels = []; + this.masterVolume = 1.0; + this.view = new DummyView(); + this.ctx = ctx; + this.gainMaster = this.ctx.createGain(); + this.setMasterVolume(this.masterVolume); + this.init(); + } + Synthesizer.prototype.init = function () { + for (var i = 0; i < 16; ++i) { + this.channels.push(new Channel()); + this.programChange(i, i !== 9 ? i : 0); + this.volumeChange(i, 0x64); + this.panpotChange(i, 0x40); + this.pitchBend(i, 0x00, 0x40); // 8192 + this.pitchBendSensitivity(i, 2); + } + }; + Synthesizer.prototype.refreshInstruments = function (input) { + this.input = input; + var parser = new sf2_ts_1["default"](input); + parser.parse(); + this.soundFont = new sound_font_ts_1["default"](parser); + }; + Synthesizer.prototype.connect = function (destination) { + this.gainMaster.connect(destination); + }; + Synthesizer.prototype.setMasterVolume = function (volume) { + this.masterVolume = volume; + this.gainMaster.gain.value = BASE_VOLUME * volume / 0x8000; + }; + Synthesizer.prototype.noteOn = function (channelNumber, key, velocity) { + if (!this.soundFont) { + return; + } + var bankNumber = channelNumber === 9 ? 128 : this.bank; + var channel = this.channels[channelNumber]; + var instrumentKey = this.soundFont.getInstrumentKey(bankNumber, channel.instrument, key, velocity); + if (!instrumentKey) { + return; + } + var panpot = channel.panpot - 64; + panpot /= panpot < 0 ? 64 : 63; + // create note information + instrumentKey['channel'] = channelNumber; + instrumentKey['key'] = key; + instrumentKey['velocity'] = velocity; + instrumentKey['panpot'] = panpot; + instrumentKey['volume'] = channel.volume / 127; + instrumentKey['pitchBend'] = channel.pitchBend - 0x2000; + instrumentKey['pitchBendSensitivity'] = channel.pitchBendSensitivity; + // note on + var note = new sound_font_synth_note_ts_1["default"](this.ctx, this.gainMaster, instrumentKey); + note.noteOn(); + channel.currentNoteOn.push(note); + this.view.noteOn(channelNumber, key); + }; + Synthesizer.prototype.noteOff = function (channelNumber, key, velocity) { + if (!this.soundFont) { + return; + } + var bankNumber = channelNumber === 9 ? 128 : this.bank; + var channel = this.channels[channelNumber]; + var instrumentKey = this.soundFont.getInstrumentKey(bankNumber, channel.instrument, key); + if (!instrumentKey) { + return; + } + var currentNoteOn = channel.currentNoteOn; + for (var i = 0, il = currentNoteOn.length; i < il; ++i) { + var note = currentNoteOn[i]; + if (note.key === key) { + note.noteOff(); + currentNoteOn.splice(i, 1); + --i; + --il; + } + } + this.view.noteOff(channelNumber, key); + }; + Synthesizer.prototype.programChange = function (channelNumber, instrument) { + this.view.programChange(channelNumber, instrument); + this.channels[channelNumber].instrument = instrument; + }; + Synthesizer.prototype.volumeChange = function (channelNumber, volume) { + this.view.volumeChange(channelNumber, volume); + this.channels[channelNumber].volume = volume; + }; + Synthesizer.prototype.panpotChange = function (channelNumber, panpot) { + this.view.panpotChange(channelNumber, panpot); + this.channels[channelNumber].panpot = panpot; + }; + Synthesizer.prototype.pitchBend = function (channelNumber, lowerByte, higherByte) { + var bend = (lowerByte & 0x7f) | ((higherByte & 0x7f) << 7); + var channel = this.channels[channelNumber]; + var currentNoteOn = channel.currentNoteOn; + var calculated = bend - 0x2000; + this.view.pitchBend(channelNumber, calculated); + for (var i = 0, il = currentNoteOn.length; i < il; ++i) { + currentNoteOn[i].updatePitchBend(calculated); + } + channel.pitchBend = bend; + }; + Synthesizer.prototype.pitchBendSensitivity = function (channelNumber, sensitivity) { + this.view.pitchBendSensitivity(channelNumber, sensitivity); + this.channels[channelNumber].pitchBendSensitivity = sensitivity; + }; + Synthesizer.prototype.allSoundOff = function (channelNumber) { + var currentNoteOn = this.channels[channelNumber].currentNoteOn; + while (currentNoteOn.length > 0) { + this.noteOff(channelNumber, currentNoteOn[0].key, 0); + } + }; + Synthesizer.prototype.resetAllControl = function (channelNumber) { + this.pitchBend(channelNumber, 0x00, 0x40); // 8192 + }; + return Synthesizer; +}()); +exports["default"] = Synthesizer; + + +/***/ }), +/* 10 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +exports.__esModule = true; +var SynthesizerNote = /** @class */ (function () { + function SynthesizerNote(ctx, destination, instrument) { + this.ctx = ctx; + this.destination = destination; + this.instrument = instrument; + this.channel = instrument.channel; + this.key = instrument.key; + this.velocity = instrument.velocity; + this.buffer = instrument.sample; + this.playbackRate = instrument.playbackRate(instrument.key); + this.sampleRate = instrument.sampleRate; + this.volume = instrument.volume; + this.panpot = instrument.panpot; + this.pitchBend = instrument.pitchBend; + this.pitchBendSensitivity = instrument.pitchBendSensitivity; + this.modEnvToPitch = instrument.modEnvToPitch; + this.startTime = ctx.currentTime; + this.computedPlaybackRate = this.playbackRate; + } + SynthesizerNote.prototype.noteOn = function () { + var _this = this; + var _a = this, ctx = _a.ctx, instrument = _a.instrument, buffer = _a.buffer; + var sample = buffer.subarray(0, buffer.length + instrument.end); + this.audioBuffer = ctx.createBuffer(1, sample.length, this.sampleRate); + var channelData = this.audioBuffer.getChannelData(0); + channelData.set(sample); + // buffer source + var bufferSource = ctx.createBufferSource(); + bufferSource.buffer = this.audioBuffer; + bufferSource.loop = (this.channel !== 9); + bufferSource.loopStart = instrument.loopStart / this.sampleRate; + bufferSource.loopEnd = instrument.loopEnd / this.sampleRate; + bufferSource.onended = function () { return _this.disconnect(); }; + this.bufferSource = bufferSource; + this.updatePitchBend(this.pitchBend); + // audio node + var panner = this.panner = ctx.createPanner(); + var output = this.gainOutput = ctx.createGain(); + var outputGain = output.gain; + // filter + var filter = ctx.createBiquadFilter(); + filter.type = "lowpass"; + this.filter = filter; + // panpot + panner.panningModel = "equalpower"; + panner.setPosition(Math.sin(this.panpot * Math.PI / 2), 0, Math.cos(this.panpot * Math.PI / 2)); + //--------------------------------------------------------------------------- + // Attack, Decay, Sustain + //--------------------------------------------------------------------------- + var now = this.ctx.currentTime; + var volAttackTime = now + instrument.volAttack; + var modAttackTime = now + instrument.modAttack; + var volDecay = volAttackTime + instrument.volDecay; + var modDecay = modAttackTime + instrument.modDecay; + var startTime = instrument.start / this.sampleRate; + var attackVolume = this.volume * (this.velocity / 127); + outputGain.setValueAtTime(0, now); + outputGain.linearRampToValueAtTime(attackVolume, volAttackTime); + outputGain.linearRampToValueAtTime(attackVolume * (1 - instrument.volSustain), volDecay); + filter.Q.setValueAtTime(instrument.initialFilterQ / 10, now); + var baseFreq = amountToFreq(instrument.initialFilterFc); + var peekFreq = amountToFreq(instrument.initialFilterFc + instrument.modEnvToFilterFc); + var sustainFreq = baseFreq + (peekFreq - baseFreq) * (1 - instrument.modSustain); + filter.frequency.setValueAtTime(baseFreq, now); + filter.frequency.linearRampToValueAtTime(peekFreq, modAttackTime); + filter.frequency.linearRampToValueAtTime(sustainFreq, modDecay); + function amountToFreq(val) { + return Math.pow(2, (val - 6900) / 1200) * 440; + } + // connect + bufferSource.connect(filter); + filter.connect(panner); + panner.connect(output); + output.connect(this.destination); + // fire + bufferSource.start(0, startTime); + }; + SynthesizerNote.prototype.noteOff = function () { + var _a = this, instrument = _a.instrument, bufferSource = _a.bufferSource; + var output = this.gainOutput; + var now = this.ctx.currentTime; + var volEndTime = now + instrument.volRelease; + var modEndTime = now + instrument.modRelease; + if (!this.audioBuffer) { + return; + } + // ignore note off for rhythm track + if (this.channel === 9) { + return; + } + //--------------------------------------------------------------------------- + // Release + //--------------------------------------------------------------------------- + output.gain.cancelScheduledValues(0); + output.gain.linearRampToValueAtTime(0, volEndTime); + bufferSource.playbackRate.cancelScheduledValues(0); + bufferSource.playbackRate.linearRampToValueAtTime(this.computedPlaybackRate, modEndTime); + bufferSource.loop = false; + bufferSource.stop(volEndTime); + }; + SynthesizerNote.prototype.disconnect = function () { + this.bufferSource.disconnect(0); + this.panner.disconnect(0); + this.gainOutput.disconnect(0); + }; + SynthesizerNote.prototype.schedulePlaybackRate = function () { + var playbackRate = this.bufferSource.playbackRate; + var computed = this.computedPlaybackRate; + var start = this.startTime; + var instrument = this.instrument; + var modAttack = start + instrument.modAttack; + var modDecay = modAttack + instrument.modDecay; + var peekPitch = computed * Math.pow(Math.pow(2, 1 / 12), this.modEnvToPitch * this.instrument.scaleTuning); + playbackRate.cancelScheduledValues(0); + playbackRate.setValueAtTime(computed, start); + playbackRate.linearRampToValueAtTime(peekPitch, modAttack); + playbackRate.linearRampToValueAtTime(computed + (peekPitch - computed) * (1 - instrument.modSustain), modDecay); + }; + SynthesizerNote.prototype.updatePitchBend = function (pitchBend) { + this.computedPlaybackRate = this.playbackRate * Math.pow(Math.pow(2, 1 / 12), (this.pitchBendSensitivity * (pitchBend / (pitchBend < 0 ? 8192 : 8191))) * this.instrument.scaleTuning); + this.schedulePlaybackRate(); + }; + return SynthesizerNote; +}()); +exports["default"] = SynthesizerNote; + + +/***/ }), +/* 11 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __assign = (this && this.__assign) || Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; +}; +exports.__esModule = true; +/** + * Parser で読み込んだサウンドフォントのデータを + * Synthesizer から利用しやすい形にするクラス + */ +var SoundFont = /** @class */ (function () { + function SoundFont(parser) { + this.bankSet = createAllInstruments(parser); + } + SoundFont.prototype.getInstrumentKey = function (bankNumber, instrumentNumber, key, velocity) { + if (velocity === void 0) { velocity = 100; } + var bank = this.bankSet[bankNumber]; + if (!bank) { + console.warn("bank not found: bank=%s instrument=%s", bankNumber, instrumentNumber); + return null; + } + var instrument = bank[instrumentNumber]; + if (!instrument) { + // TODO + console.warn("instrument not found: bank=%s instrument=%s", bankNumber, instrumentNumber); + return null; + } + var instrumentKey = instrument.notes.filter(function (i) { + var isInKeyRange = false; + if (i.keyRange) { + isInKeyRange = key >= i.keyRange.lo && key <= i.keyRange.hi; + } + var isInVelRange = true; + if (i.velRange) { + isInVelRange = velocity >= i.velRange.lo && velocity <= i.velRange.hi; + } + return isInKeyRange && isInVelRange; + })[0]; + if (!instrumentKey) { + // TODO + console.warn("instrument not found: bank=%s instrument=%s key=%s", bankNumber, instrumentNumber, key); + return null; + } + return instrumentKey; + }; + return SoundFont; +}()); +exports["default"] = SoundFont; +function createInstrument(_a) { + var instrument = _a.instrument, instrumentZone = _a.instrumentZone, instrumentZoneGenerator = _a.instrumentZoneGenerator, instrumentZoneModulator = _a.instrumentZoneModulator; + var zone = instrumentZone; + var output = []; + // instrument -> instrument bag -> generator / modulator + for (var i = 0; i < instrument.length; ++i) { + var bagIndex = instrument[i].instrumentBagIndex; + var bagIndexEnd = instrument[i + 1] ? instrument[i + 1].instrumentBagIndex : zone.length; + var zoneInfo = []; + // instrument bag + for (var j = bagIndex; j < bagIndexEnd; ++j) { + var instrumentGenerator = createInstrumentGenerator(zone, j, instrumentZoneGenerator); + var instrumentModulator = createInstrumentModulator(zone, j, instrumentZoneModulator); + zoneInfo.push({ + generator: instrumentGenerator.generator, + generatorSequence: instrumentGenerator.generatorInfo, + modulator: instrumentModulator.modulator, + modulatorSequence: instrumentModulator.modulatorInfo + }); + } + output.push({ + name: instrument[i].instrumentName, + info: zoneInfo + }); + } + return output; +} +function createPreset(_a) { + var presetHeader = _a.presetHeader, presetZone = _a.presetZone, presetZoneGenerator = _a.presetZoneGenerator, presetZoneModulator = _a.presetZoneModulator; + // preset -> preset bag -> generator / modulator + return presetHeader.map(function (preset, i) { + var nextPreset = presetHeader[i + 1]; + var bagIndex = preset.presetBagIndex; + var bagIndexEnd = nextPreset ? nextPreset.presetBagIndex : presetZone.length; + var zoneInfo = []; + // preset bag + for (var j = bagIndex, jl = bagIndexEnd; j < jl; ++j) { + zoneInfo.push({ + presetGenerator: createPresetGenerator(presetZone, j, presetZoneGenerator), + presetModulator: createPresetModulator(presetZone, j, presetZoneModulator) + }); + } + return { + info: zoneInfo, + header: preset + }; + }); +} +function createAllInstruments(parser) { + var presets = createPreset(parser); + var instruments = createInstrument(parser); + var banks = []; + for (var _i = 0, presets_1 = presets; _i < presets_1.length; _i++) { + var preset = presets_1[_i]; + var bankNumber = preset.header.bank; + var presetNumber = preset.header.preset; + var notes = preset.info + .map(function (info) { return info.presetGenerator.generator; }) + .map(function (generator) { + if (generator.instrument === undefined) { + return null; + } + var instrumentNumber = generator.instrument.amount; + var instrument = instruments[instrumentNumber]; + // use the first generator in the zone as the default value + var baseGenerator; + if (instrument.info[0].generator) { + var generator_1 = instrument.info[0].generator; + if (generator_1.sampleID === undefined && generator_1.keyRange.lo === 0 && generator_1.keyRange.hi === 127) { + baseGenerator = generator_1; + } + } + return instrument.info + .map(function (info) { return createNoteInfo(parser, info.generator, baseGenerator); }) + .filter(function (x) { return x; }); // remove null + }) + .filter(function (x) { return x; }) // remove null + .reduce(function (a, b) { return a.concat(b); }, []); // flatten + // select bank + if (banks[bankNumber] === undefined) { + banks[bankNumber] = []; + } + var bank = banks[bankNumber]; + bank[presetNumber] = { + notes: notes, + name: preset.header.presetName + }; + } + return banks; +} +function createNoteInfo(parser, targetGenerator, baseGenerator) { + var generator = __assign({}, baseGenerator, targetGenerator); + var _a = generator, keyRange = _a.keyRange, sampleID = _a.sampleID, velRange = _a.velRange; + if (keyRange === undefined || sampleID === undefined) { + return null; + } + var volAttack = getModGenAmount(generator, 'attackVolEnv', -12000); + var volDecay = getModGenAmount(generator, 'decayVolEnv', -12000); + var volSustain = getModGenAmount(generator, 'sustainVolEnv'); + var volRelease = getModGenAmount(generator, 'releaseVolEnv', -12000); + var modAttack = getModGenAmount(generator, 'attackModEnv', -12000); + var modDecay = getModGenAmount(generator, 'decayModEnv', -12000); + var modSustain = getModGenAmount(generator, 'sustainModEnv'); + var modRelease = getModGenAmount(generator, 'releaseModEnv', -12000); + var tune = (getModGenAmount(generator, 'coarseTune') + + getModGenAmount(generator, 'fineTune') / 100); + var scale = getModGenAmount(generator, 'scaleTuning', 100) / 100; + var freqVibLFO = getModGenAmount(generator, 'freqVibLFO'); + var sampleId = getModGenAmount(generator, 'sampleID'); + var sampleHeader = parser.sampleHeader[sampleId]; + var basePitch = tune + (sampleHeader.pitchCorrection / 100) - getModGenAmount(generator, 'overridingRootKey', sampleHeader.originalPitch); + return { + sample: parser.sample[sampleId], + sampleRate: sampleHeader.sampleRate, + sampleName: sampleHeader.sampleName, + modEnvToPitch: getModGenAmount(generator, 'modEnvToPitch') / 100, + scaleTuning: scale, + start: getModGenAmount(generator, 'startAddrsCoarseOffset') * 32768 + + getModGenAmount(generator, 'startAddrsOffset'), + end: getModGenAmount(generator, 'endAddrsCoarseOffset') * 32768 + + getModGenAmount(generator, 'endAddrsOffset'), + loopStart: ( + //(sampleHeader.startLoop - sampleHeader.start) + + (sampleHeader.startLoop) + + getModGenAmount(generator, 'startloopAddrsCoarseOffset') * 32768 + + getModGenAmount(generator, 'startloopAddrsOffset')), + loopEnd: ( + //(sampleHeader.endLoop - sampleHeader.start) + + (sampleHeader.endLoop) + + getModGenAmount(generator, 'endloopAddrsCoarseOffset') * 32768 + + getModGenAmount(generator, 'endloopAddrsOffset')), + volAttack: Math.pow(2, volAttack / 1200), + volDecay: Math.pow(2, volDecay / 1200), + volSustain: volSustain / 1000, + volRelease: Math.pow(2, volRelease / 1200), + modAttack: Math.pow(2, modAttack / 1200), + modDecay: Math.pow(2, modDecay / 1200), + modSustain: modSustain / 1000, + modRelease: Math.pow(2, modRelease / 1200), + initialFilterFc: getModGenAmount(generator, 'initialFilterFc', 13500), + modEnvToFilterFc: getModGenAmount(generator, 'modEnvToFilterFc'), + initialFilterQ: getModGenAmount(generator, 'initialFilterQ', 1), + freqVibLFO: freqVibLFO ? Math.pow(2, freqVibLFO / 1200) * 8.176 : undefined, + playbackRate: function (key) { return Math.pow(Math.pow(2, 1 / 12), (key + basePitch) * scale); }, + keyRange: keyRange, + velRange: velRange + }; +} +function getModGenAmount(generator, enumeratorType, opt_default) { + if (opt_default === void 0) { opt_default = 0; } + return generator[enumeratorType] ? generator[enumeratorType].amount : opt_default; +} +function createBagModGen(zone, indexStart, indexEnd, zoneModGen) { + var modgenInfo = []; + var modgen = { + unknown: [], + 'keyRange': { + hi: 127, + lo: 0 + } + }; // TODO + for (var i = indexStart; i < indexEnd; ++i) { + var info = zoneModGen[i]; + modgenInfo.push(info); + if (info.type === 'unknown') { + modgen.unknown.push(info.value); + } + else { + modgen[info.type] = info.value; + } + } + return { modgen: modgen, modgenInfo: modgenInfo }; +} +function createInstrumentGenerator(zone, index, instrumentZoneGenerator) { + var modgen = createBagModGen(zone, zone[index].instrumentGeneratorIndex, zone[index + 1] ? zone[index + 1].instrumentGeneratorIndex : instrumentZoneGenerator.length, instrumentZoneGenerator); + return { + generator: modgen.modgen, + generatorInfo: modgen.modgenInfo + }; +} +function createInstrumentModulator(zone, index, instrumentZoneModulator) { + var modgen = createBagModGen(zone, zone[index].presetModulatorIndex, zone[index + 1] ? zone[index + 1].instrumentModulatorIndex : instrumentZoneModulator.length, instrumentZoneModulator); + return { + modulator: modgen.modgen, + modulatorInfo: modgen.modgenInfo + }; +} +function createPresetGenerator(zone, index, presetZoneGenerator) { + var modgen = createBagModGen(zone, zone[index].presetGeneratorIndex, zone[index + 1] ? zone[index + 1].presetGeneratorIndex : presetZoneGenerator.length, presetZoneGenerator); + return { + generator: modgen.modgen, + generatorInfo: modgen.modgenInfo + }; +} +function createPresetModulator(zone, index, presetZoneModulator) { + var modgen = createBagModGen(zone, zone[index].presetModulatorIndex, zone[index + 1] ? zone[index + 1].presetModulatorIndex : presetZoneModulator.length, presetZoneModulator); + return { + modulator: modgen.modgen, + modulatorInfo: modgen.modgenInfo + }; +} + + +/***/ }), +/* 12 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +exports.__esModule = true; +var program_names_ts_1 = __webpack_require__(13); +function render(str) { + var wrapper = document.createElement("div"); + wrapper.innerHTML = str.replace(/^\s+/, ""); + return wrapper.firstElementChild; +} +function renderKeys() { + var html = ""; + for (var i = 0; i < 128; i++) { + var n = i % 12; + var isBlack = [1, 3, 6, 8, 10].includes(n); + html += "
"; + } + return html; +} +function renderProgramOptions(programNames, bank) { + var html = ""; + var names = programNames[bank]; + for (var i in names) { + var name_1 = names[i]; + html += ""; + } + return ""; +} +function renderInstrument(program) { + return render("\n
\n
" + program + "
\n
\n
\n
\n
\n
" + renderKeys() + "
\n
\n "); +} +function programNamesFromBankSet(bankSet) { + return bankSet.map(function (bank) { return bank.map(function (s) { return s.name; }); }); +} +function mergeProgramNames(left, right) { + function mergedKeys(a, b) { + return new Set(Object.keys(a).concat(Object.keys(b))); + } + var banks = mergedKeys(left, right); + var result = {}; + banks.forEach(function (bank) { + var l = left[bank] || []; + var r = right[bank] || []; + var list = {}; + var programs = mergedKeys(l, r); + programs.forEach(function (p) { + list[p] = (l[p] || "None") + " (" + (r[p] || "None") + ")"; + }); + result[bank] = list; + }); + return result; +} +var View = /** @class */ (function () { + function View() { + this.drag = false; + } + View.prototype.draw = function (synth) { + var _this = this; + var element = this.element = render("
"); + var programNames = mergeProgramNames(programNamesFromBankSet(synth.soundFont.bankSet), program_names_ts_1["default"]); + var _loop_1 = function (i) { + var bank = i !== 9 ? 0 : 128; + var program = renderProgramOptions(programNames, bank); + var item = renderInstrument(program); + var channel = i; + var select = item.querySelector('select'); + if (select) { + select.addEventListener('change', function (event) { + var target = event.target; + synth.programChange(channel, parseInt(target.value, 10)); + }, false); + select.selectedIndex = synth.channels[i].instrument; + } + var notes = item.querySelectorAll(".key"); + var _loop_2 = function (j) { + var key = j; + notes[j].addEventListener('mousedown', function (event) { + event.preventDefault(); + _this.drag = true; + synth.noteOn(channel, key, 127); + }); + notes[j].addEventListener('mouseover', function (event) { + event.preventDefault(); + if (_this.drag) { + synth.noteOn(channel, key, 127); + } + }); + notes[j].addEventListener('mouseout', function (event) { + event.preventDefault(); + synth.noteOff(channel, key, 0); + }); + notes[j].addEventListener('mouseup', function (event) { + event.preventDefault(); + _this.drag = false; + synth.noteOff(channel, key, 0); + }); + }; + for (var j = 0; j < 128; ++j) { + _loop_2(j); + } + element.appendChild(item); + }; + for (var i = 0; i < 16; ++i) { + _loop_1(i); + } + return element; + }; + View.prototype.remove = function () { + if (!this.element) { + return; + } + this.element.parentNode.removeChild(this.element); + this.element = null; + }; + View.prototype.getInstrumentElement = function (channel) { + return this.element.querySelectorAll(".instrument")[channel]; + }; + View.prototype.getKeyElement = function (channel, key) { + return this.getInstrumentElement(channel).querySelectorAll(".key")[key]; + }; + View.prototype.noteOn = function (channel, key) { + if (!this.element) { + return; + } + this.getKeyElement(channel, key).classList.add('note-on'); + }; + View.prototype.noteOff = function (channel, key) { + if (!this.element) { + return; + } + this.getKeyElement(channel, key).classList.remove('note-on'); + }; + View.prototype.programChange = function (channel, instrument) { + if (!this.element) { + return; + } + var select = this.getInstrumentElement(channel).querySelector(".program select"); + if (select) { + select.value = instrument; + } + }; + View.prototype.volumeChange = function (channel, volume) { + if (!this.element) { + return; + } + this.getInstrumentElement(channel).querySelector(".volume").textContent = volume; + }; + View.prototype.panpotChange = function (channel, panpot) { + if (!this.element) { + return; + } + this.getInstrumentElement(channel).querySelector(".panpot").textContent = panpot; + }; + View.prototype.pitchBend = function (channel, calculatedPitch) { + if (!this.element) { + return; + } + this.getInstrumentElement(channel).querySelector(".pitchBend").textContent = calculatedPitch; + }; + View.prototype.pitchBendSensitivity = function (channel, sensitivity) { + if (!this.element) { + return; + } + this.getInstrumentElement(channel).querySelector(".pitchBendSensitivity").textContent = sensitivity; + }; + return View; +}()); +exports["default"] = View; + + +/***/ }), +/* 13 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +exports.__esModule = true; +var ProgramNames = { + 0: [ + "Acoustic Piano", + "Bright Piano", + "Electric Grand Piano", + "Honky-tonk Piano", + "Electric Piano", + "Electric Piano 2", + "Harpsichord", + "Clavi", + "Celesta", + "Glockenspiel", + "Musical box", + "Vibraphone", + "Marimba", + "Xylophone", + "Tubular Bell", + "Dulcimer", + "Drawbar Organ", + "Percussive Organ", + "Rock Organ", + "Church organ", + "Reed organ", + "Accordion", + "Harmonica", + "Tango Accordion", + "Acoustic Guitar (nylon)", + "Acoustic Guitar (steel)", + "Electric Guitar (jazz)", + "Electric Guitar (clean)", + "Electric Guitar (muted)", + "Overdriven Guitar", + "Distortion Guitar", + "Guitar harmonics", + "Acoustic Bass", + "Electric Bass (finger)", + "Electric Bass (pick)", + "Fretless Bass", + "Slap Bass 1", + "Slap Bass 2", + "Synth Bass 1", + "Synth Bass 2", + "Violin", + "Viola", + "Cello", + "Double bass", + "Tremolo Strings", + "Pizzicato Strings", + "Orchestral Harp", + "Timpani", + "String Ensemble 1", + "String Ensemble 2", + "Synth Strings 1", + "Synth Strings 2", + "Voice Aahs", + "Voice Oohs", + "Synth Voice", + "Orchestra Hit", + "Trumpet", + "Trombone", + "Tuba", + "Muted Trumpet", + "French horn", + "Brass Section", + "Synth Brass 1", + "Synth Brass 2", + "Soprano Sax", + "Alto Sax", + "Tenor Sax", + "Baritone Sax", + "Oboe", + "English Horn", + "Bassoon", + "Clarinet", + "Piccolo", + "Flute", + "Recorder", + "Pan Flute", + "Blown Bottle", + "Shakuhachi", + "Whistle", + "Ocarina", + "Lead 1 (square)", + "Lead 2 (sawtooth)", + "Lead 3 (calliope)", + "Lead 4 (chiff)", + "Lead 5 (charang)", + "Lead 6 (voice)", + "Lead 7 (fifths)", + "Lead 8 (bass + lead)", + "Pad 1 (Fantasia)", + "Pad 2 (warm)", + "Pad 3 (polysynth)", + "Pad 4 (choir)", + "Pad 5 (bowed)", + "Pad 6 (metallic)", + "Pad 7 (halo)", + "Pad 8 (sweep)", + "FX 1 (rain)", + "FX 2 (soundtrack)", + "FX 3 (crystal)", + "FX 4 (atmosphere)", + "FX 5 (brightness)", + "FX 6 (goblins)", + "FX 7 (echoes)", + "FX 8 (sci-fi)", + "Sitar", + "Banjo", + "Shamisen", + "Koto", + "Kalimba", + "Bagpipe", + "Fiddle", + "Shanai", + "Tinkle Bell", + "Agogo", + "Steel Drums", + "Woodblock", + "Taiko Drum", + "Melodic Tom", + "Synth Drum", + "Reverse Cymbal", + "Guitar Fret Noise", + "Breath Noise", + "Seashore", + "Bird Tweet", + "Telephone Ring", + "Helicopter", + "Applause", + "Gunshot" + ], 128: ["Rhythm Track"] +}; +exports["default"] = ProgramNames; + + +/***/ }), +/* 14 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +exports.__esModule = true; +var MidiMessageHandler = /** @class */ (function () { + function MidiMessageHandler() { + this.RpnMsb = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; + this.RpnLsb = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; + } + MidiMessageHandler.prototype.processMidiMessage = function (message) { + var channel = message[0] & 0x0f; + var synth = this.synth; + if (!synth) { + return; + } + switch (message[0] & 0xf0) { + case 0x80:// NoteOff: 8n kk vv + synth.noteOff(channel, message[1], message[2]); + break; + case 0x90:// NoteOn: 9n kk vv + if (message[2] > 0) { + synth.noteOn(channel, message[1], message[2]); + } + else { + synth.noteOff(channel, message[1], 0); + } + break; + case 0xB0:// Control Change: Bn cc dd + switch (message[1]) { + case 0x06:// Data Entry: Bn 06 dd + switch (this.RpnMsb[channel]) { + case 0: + switch (this.RpnLsb[channel]) { + case 0:// Pitch Bend Sensitivity + synth.pitchBendSensitivity(channel, message[2]); + break; + default: + break; + } + break; + default: + break; + } + break; + case 0x07:// Volume Change: Bn 07 dd + synth.volumeChange(channel, message[2]); + break; + case 0x0A:// Panpot Change: Bn 0A dd + synth.panpotChange(channel, message[2]); + break; + case 0x78:// All Sound Off: Bn 78 00 + synth.allSoundOff(channel); + break; + case 0x79:// Reset All Control: Bn 79 00 + synth.resetAllControl(channel); + break; + case 0x20:// BankSelect + //console.log("bankselect:", channel, message[2]) + break; + case 0x64:// RPN MSB + this.RpnMsb[channel] = message[2]; + break; + case 0x65:// RPN LSB + this.RpnLsb[channel] = message[2]; + break; + default: + } + break; + case 0xC0:// Program Change: Cn pp + synth.programChange(channel, message[1]); + break; + case 0xE0:// Pitch Bend + synth.pitchBend(channel, message[1], message[2]); + break; + case 0xf0:// System Exclusive Message + // ID number + switch (message[1]) { + case 0x7e:// non-realtime + // TODO + break; + case 0x7f:// realtime + // const device = message[2] + // sub ID 1 + switch (message[3]) { + case 0x04:// device control + // sub ID 2 + switch (message[4]) { + case 0x01: { + var volume = message[5] + (message[6] << 7); + var MAX_VOLUME = 0x4000 - 1; + synth.setMasterVolume(volume / MAX_VOLUME); + break; + } + default: + break; + } + break; + default: + break; + } + break; + default: + break; + } + break; + default:// not supported + break; + } + }; + return MidiMessageHandler; +}()); +exports["default"] = MidiMessageHandler; - 'use strict'; - - Object.defineProperty(exports, "__esModule", { - value: true - }); - /** - * @param {AudioContext} ctx - * @param {AudioNode} destination - * @param {{ - * channel: number, - * key: number, - * sample: Uint8Array, - * basePlaybackRate: number, - * loopStart: number, - * loopEnd: number, - * volume: number, - * panpot: number - * }} instrument - * @constructor - */ - var SynthesizerNote = function SynthesizerNote(ctx, destination, instrument) { - /** @type {AudioContext} */ - this.ctx = ctx; - /** @type {AudioNode} */ - this.destination = destination; - /** @type {{ - * channel: number, - * key: number, - * sample: Uint8Array, - * basePlaybackRate: number, - * loopStart: number, - * loopEnd: number, - * volume: number, - * panpot: number - * }} - */ - this.instrument = instrument; - /** @type {number} */ - this.channel = instrument['channel']; - /** @type {number} */ - this.key = instrument['key']; - /** @type {number} */ - this.velocity = instrument['velocity']; - /** @type {Int16Array} */ - this.buffer = instrument['sample']; - /** @type {number} */ - this.playbackRate = instrument['basePlaybackRate']; - /** @type {number} */ - this.sampleRate = instrument['sampleRate']; - /** @type {number} */ - this.volume = instrument['volume']; - /** @type {number} */ - this.panpot = instrument['panpot']; - /** @type {number} */ - this.pitchBend = instrument['pitchBend']; - /** @type {number} */ - this.pitchBendSensitivity = instrument['pitchBendSensitivity']; - /** @type {number} */ - this.modEnvToPitch = instrument['modEnvToPitch']; - - // state - /** @type {number} */ - this.startTime = ctx.currentTime; - /** @type {number} */ - this.computedPlaybackRate = this.playbackRate; - - //--------------------------------------------------------------------------- - // audio node - //--------------------------------------------------------------------------- - - /** @type {AudioBuffer} */ - this.audioBuffer; - /** @type {AudioBufferSourceNode} */ - this.bufferSource; - /** @type {AudioPannerNode} */ - this.panner; - /** @type {AudioGainNode} */ - this.gainOutput; - - //console.log(instrument['modAttack'], instrument['modDecay'], instrument['modSustain'], instrument['modRelease']); - }; - - SynthesizerNote.prototype.noteOn = function () { - /** @type {AudioContext} */ - var ctx = this.ctx; - /** @type {{ - * channel: number, - * key: number, - * sample: Uint8Array, - * basePlaybackRate: number, - * loopStart: number, - * loopEnd: number, - * volume: number, - * panpot: number - * }} */ - var instrument = this.instrument; - /** @type {Int16Array} */ - var sample = this.buffer; - /** @type {AudioBuffer} */ - var buffer; - /** @type {Float32Array} */ - var channelData; - /** @type {AudioBufferSourceNode} */ - var bufferSource; - /** @type {BiquadFilterNode} */ - var filter; - /** @type {AudioPannerNode} */ - var panner; - /** @type {AudioGainNode} */ - var output; - /** @type {AudioGain} */ - var outputGain; - /** @type {number} */ - var now = this.ctx.currentTime; - /** @type {number} */ - var volAttack = now + instrument['volAttack']; - /** @type {number} */ - var modAttack = now + instrument['modAttack']; - /** @type {number} */ - var volDecay = volAttack + instrument['volDecay']; - /** @type {number} */ - var modDecay = modAttack + instrument['modDecay']; - /** @type {number} */ - var loopStart = instrument['loopStart'] / this.sampleRate; - /** @type {number} */ - var loopEnd = instrument['loopEnd'] / this.sampleRate; - /** @type {number} */ - var startTime = instrument['start'] / this.sampleRate; - /** @type {number} */ - var baseFreq; - /** @type {number} */ - var peekFreq; - /** @type {number} */ - var sustainFreq; - - sample = sample.subarray(0, sample.length + instrument['end']); - buffer = this.audioBuffer = ctx.createBuffer(1, sample.length, this.sampleRate); - channelData = buffer.getChannelData(0); - channelData.set(sample); - - // buffer source - bufferSource = this.bufferSource = ctx.createBufferSource(); - bufferSource.buffer = buffer; - bufferSource.loop = this.channel !== 9; - bufferSource.loopStart = loopStart; - bufferSource.loopEnd = loopEnd; - this.updatePitchBend(this.pitchBend); - - // audio node - panner = this.panner = ctx.createPanner(); - output = this.gainOutput = ctx.createGainNode(); - outputGain = output.gain; - - // filter - filter = this.filter = ctx.createBiquadFilter(); - filter.type = filter.LOWPASS; - - // panpot - panner.panningModel = 0; - panner.setPosition(Math.sin(this.panpot * Math.PI / 2), 0, Math.cos(this.panpot * Math.PI / 2)); - - //--------------------------------------------------------------------------- - // Attack, Decay, Sustain - //--------------------------------------------------------------------------- - outputGain.setValueAtTime(0, now); - outputGain.linearRampToValueAtTime(this.volume * (this.velocity / 127), volAttack); - outputGain.linearRampToValueAtTime(this.volume * (1 - instrument['volSustain']), volDecay); - - filter.Q.setValueAtTime(instrument['initialFilterQ'] * Math.pow(10, 200), now); - baseFreq = amountToFreq(instrument['initialFilterFc']); - peekFreq = amountToFreq(instrument['initialFilterFc'] + instrument['modEnvToFilterFc']); - sustainFreq = baseFreq + (peekFreq - baseFreq) * (1 - instrument['modSustain']); - filter.frequency.setValueAtTime(baseFreq, now); - filter.frequency.linearRampToValueAtTime(peekFreq, modAttack); - filter.frequency.linearRampToValueAtTime(sustainFreq, modDecay); - - /** - * @param {number} val - * @returns {number} - */ - function amountToFreq(val) { - return Math.pow(2, (val - 6900) / 1200) * 440; - } - - // connect - bufferSource.connect(filter); - filter.connect(panner); - panner.connect(output); - output.connect(this.destination); - - // fire - bufferSource.start(0, startTime); - }; - - SynthesizerNote.prototype.noteOff = function () { - /** @type {{ - * channel: number, - * key: number, - * sample: Uint8Array, - * basePlaybackRate: number, - * loopStart: number, - * loopEnd: number, - * volume: number, - * panpot: number - * }} */ - var instrument = this.instrument; - /** @type {AudioBufferSourceNode} */ - var bufferSource = this.bufferSource; - /** @type {AudioGainNode} */ - var output = this.gainOutput; - /** @type {number} */ - var now = this.ctx.currentTime; - /** @type {number} */ - var volEndTime = now + instrument['volRelease']; - /** @type {number} */ - var modEndTime = now + instrument['modRelease']; - - if (!this.audioBuffer) { - return; - } - - //--------------------------------------------------------------------------- - // Release - //--------------------------------------------------------------------------- - output.gain.cancelScheduledValues(0); - output.gain.linearRampToValueAtTime(0, volEndTime); - bufferSource.playbackRate.cancelScheduledValues(0); - bufferSource.playbackRate.linearRampToValueAtTime(this.computedPlaybackRate, modEndTime); - - bufferSource.loop = false; - bufferSource.stop(volEndTime); - - // disconnect - //* - setTimeout(function (note) { - return function () { - note.bufferSource.disconnect(0); - note.panner.disconnect(0); - note.gainOutput.disconnect(0); - }; - }(this), instrument['volRelease'] * 1000); - //*/ - }; - - SynthesizerNote.prototype.schedulePlaybackRate = function () { - var playbackRate = this.bufferSource.playbackRate; - /** @type {number} */ - var computed = this.computedPlaybackRate; - /** @type {number} */ - var start = this.startTime; - /** @type {Object} */ - var instrument = this.instrument; - /** @type {number} */ - var modAttack = start + instrument['modAttack']; - /** @type {number} */ - var modDecay = modAttack + instrument['modDecay']; - /** @type {number} */ - var peekPitch = computed * Math.pow(Math.pow(2, 1 / 12), this.modEnvToPitch * this.instrument['scaleTuning']); - - playbackRate.cancelScheduledValues(0); - playbackRate.setValueAtTime(computed, start); - playbackRate.linearRampToValueAtTime(peekPitch, modAttack); - playbackRate.linearRampToValueAtTime(computed + (peekPitch - computed) * (1 - instrument['modSustain']), modDecay); - }; - - /** - * @param {number} pitchBend - */ - SynthesizerNote.prototype.updatePitchBend = function (pitchBend) { - this.computedPlaybackRate = this.playbackRate * Math.pow(Math.pow(2, 1 / 12), this.pitchBendSensitivity * (pitchBend / (pitchBend < 0 ? 8192 : 8191)) * this.instrument['scaleTuning']); - this.schedulePlaybackRate(); - }; - - exports.default = SynthesizerNote; -/***/ } +/***/ }) /******/ ]); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAgM2E3YTZiZGVkYmY2M2VlNWI1ZWQ/YTM4ZiIsIndlYnBhY2s6Ly8vLi9leHBvcnQvc3ludGguanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3NmMi5qcz80M2ZhIiwid2VicGFjazovLy8uL3NyYy9yaWZmLmpzPzQyZDIiLCJ3ZWJwYWNrOi8vLy4vc3JjL3dtbC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvc291bmRfZm9udF9zeW50aC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvc291bmRfZm9udF9zeW50aF9ub3RlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx1QkFBZTtBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7QUN0Q0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEk7Ozs7Ozs7Ozs7OztBQ0FBOzs7Ozs7QUFFQTs7Ozs7QUFLQSxLQUFNLFNBQVMsU0FBVCxNQUFTLENBQVMsS0FBVCxFQUFnQixVQUFoQixFQUE0QjtBQUN6QyxnQkFBYSxjQUFjLEVBQTNCO0FBQ0E7QUFDQSxRQUFLLEtBQUwsR0FBYSxLQUFiO0FBQ0E7QUFDQSxRQUFLLFlBQUwsR0FBb0IsV0FBVyxjQUFYLENBQXBCOztBQUVBO0FBQ0EsUUFBSyxZQUFMO0FBQ0E7QUFDQSxRQUFLLFVBQUw7QUFDQTtBQUNBLFFBQUssbUJBQUw7QUFDQTtBQUNBLFFBQUssbUJBQUw7QUFDQTtBQUNBLFFBQUssVUFBTDtBQUNBO0FBQ0EsUUFBSyxjQUFMO0FBQ0E7QUFDQSxRQUFLLHVCQUFMO0FBQ0E7QUFDQSxRQUFLLHVCQUFMO0FBQ0E7QUFDQSxRQUFLLFlBQUw7QUFDRCxFQXpC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QUNBO0FBQ0EsT0FBSSxXQUFXLFlBQVksV0FBVyxVQUFYLENBQTNCO0FBQ0E7QUFDQSxPQUFJLFlBQVksV0FBVyxLQUFLLEdBQUwsQ0FDekIsS0FBSyxHQUFMLENBQVMsQ0FBVCxFQUFZLElBQUUsRUFBZCxDQUR5QixFQUV6QixLQUFLLGFBQUwsR0FBcUIsS0FBSyxVQUFMLENBQWdCLGFBQWhCLENBRkksQ0FBM0I7O0FBS0EsZ0JBQWEscUJBQWIsQ0FBbUMsQ0FBbkM7QUFDQSxnQkFBYSxjQUFiLENBQTRCLFFBQTVCLEVBQXNDLEtBQXRDO0FBQ0EsZ0JBQWEsdUJBQWIsQ0FBcUMsU0FBckMsRUFBZ0QsU0FBaEQ7QUFDQSxnQkFBYSx1QkFBYixDQUFxQyxXQUFXLENBQUMsWUFBWSxRQUFiLEtBQTBCLElBQUksV0FBVyxZQUFYLENBQTlCLENBQWhELEVBQXlHLFFBQXpHO0FBQ0QsRUF0QkQ7O0FBd0JBOzs7QUFHQSxpQkFBZ0IsU0FBaEIsQ0FBMEIsZUFBMUIsR0FBNEMsVUFBUyxTQUFULEVBQW9CO0FBQzlELFFBQUssb0JBQUwsR0FBNEIsS0FBSyxZQUFMLEdBQW9CLEtBQUssR0FBTCxDQUM5QyxLQUFLLEdBQUwsQ0FBUyxDQUFULEVBQVksSUFBRSxFQUFkLENBRDhDLEVBRzVDLEtBQUssb0JBQUwsSUFDRSxhQUFhLFlBQVksQ0FBWixHQUFnQixJQUFoQixHQUF1QixJQUFwQyxDQURGLENBREYsR0FJSSxLQUFLLFVBQUwsQ0FBZ0IsYUFBaEIsQ0FOMEMsQ0FBaEQ7QUFRQSxRQUFLLG9CQUFMO0FBQ0QsRUFWRDs7bUJBWWUsZSIsImZpbGUiOiJzZjIuc3ludGguanMiLCJzb3VyY2VzQ29udGVudCI6WyIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcblxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0ZXhwb3J0czoge30sXG4gXHRcdFx0aWQ6IG1vZHVsZUlkLFxuIFx0XHRcdGxvYWRlZDogZmFsc2VcbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubG9hZGVkID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJzdGF0aWNcIjtcblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIHdlYnBhY2svYm9vdHN0cmFwIDNhN2E2YmRlZGJmNjNlZTViNWVkXG4gKiovIiwiZXhwb3J0ICogZnJvbSBcIi4uL3NyYy93bWxcIlxyXG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL2V4cG9ydC9zeW50aC5qc1xuICoqLyIsImltcG9ydCBSaWZmIGZyb20gXCIuL3JpZmZcIlxyXG5cclxuLyoqXHJcbiAqIEBwYXJhbSB7Qnl0ZUFycmF5fSBpbnB1dFxyXG4gKiBAcGFyYW0ge09iamVjdD19IG9wdF9wYXJhbXNcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqL1xyXG5jb25zdCBQYXJzZXIgPSBmdW5jdGlvbihpbnB1dCwgb3B0X3BhcmFtcykge1xyXG4gIG9wdF9wYXJhbXMgPSBvcHRfcGFyYW1zIHx8IHt9O1xyXG4gIC8qKiBAdHlwZSB7Qnl0ZUFycmF5fSAqL1xyXG4gIHRoaXMuaW5wdXQgPSBpbnB1dDtcclxuICAvKiogQHR5cGUgeyhPYmplY3R8dW5kZWZpbmVkKX0gKi9cclxuICB0aGlzLnBhcnNlck9wdGlvbiA9IG9wdF9wYXJhbXNbJ3BhcnNlck9wdGlvbiddO1xyXG5cclxuICAvKiogQHR5cGUge0FycmF5LjxPYmplY3Q+fSAqL1xyXG4gIHRoaXMucHJlc2V0SGVhZGVyO1xyXG4gIC8qKiBAdHlwZSB7QXJyYXkuPE9iamVjdD59ICovXHJcbiAgdGhpcy5wcmVzZXRab25lO1xyXG4gIC8qKiBAdHlwZSB7QXJyYXkuPE9iamVjdD59ICovXHJcbiAgdGhpcy5wcmVzZXRab25lTW9kdWxhdG9yO1xyXG4gIC8qKiBAdHlwZSB7QXJyYXkuPE9iamVjdD59ICovXHJcbiAgdGhpcy5wcmVzZXRab25lR2VuZXJhdG9yO1xyXG4gIC8qKiBAdHlwZSB7QXJyYXkuPE9iamVjdD59ICovXHJcbiAgdGhpcy5pbnN0cnVtZW50O1xyXG4gIC8qKiBAdHlwZSB7QXJyYXkuPE9iamVjdD59ICovXHJcbiAgdGhpcy5pbnN0cnVtZW50Wm9uZTtcclxuICAvKiogQHR5cGUge0FycmF5LjxPYmplY3Q+fSAqL1xyXG4gIHRoaXMuaW5zdHJ1bWVudFpvbmVNb2R1bGF0b3I7XHJcbiAgLyoqIEB0eXBlIHtBcnJheS48T2JqZWN0Pn0gKi9cclxuICB0aGlzLmluc3RydW1lbnRab25lR2VuZXJhdG9yO1xyXG4gIC8qKiBAdHlwZSB7QXJyYXkuPE9iamVjdD59ICovXHJcbiAgdGhpcy5zYW1wbGVIZWFkZXI7XHJcbn07XHJcblxyXG5QYXJzZXIucHJvdG90eXBlLnBhcnNlID0gZnVuY3Rpb24oKSB7XHJcbiAgLyoqIEB0eXBlIHtSaWZmLlBhcnNlcn0gKi9cclxuICB2YXIgcGFyc2VyID0gbmV3IFJpZmYuUGFyc2VyKHRoaXMuaW5wdXQsIHRoaXMucGFyc2VyT3B0aW9uKTtcclxuICAvKiogQHR5cGUgez9SaWZmLkNodW5rfSAqL1xyXG4gIHZhciBjaHVuaztcclxuXHJcbiAgLy8gcGFyc2UgUklGRiBjaHVua1xyXG4gIHBhcnNlci5wYXJzZSgpO1xyXG4gIGlmIChwYXJzZXIuY2h1bmtMaXN0Lmxlbmd0aCAhPT0gMSkge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCd3cm9uZyBjaHVuayBsZW5ndGgnKTtcclxuICB9XHJcblxyXG4gIGNodW5rID0gcGFyc2VyLmdldENodW5rKDApO1xyXG4gIGlmIChjaHVuayA9PT0gbnVsbCkge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdjaHVuayBub3QgZm91bmQnKTtcclxuICB9XHJcblxyXG4gIHRoaXMucGFyc2VSaWZmQ2h1bmsoY2h1bmspO1xyXG4vL2NvbnNvbGUubG9nKHRoaXMuc2FtcGxlSGVhZGVyKTtcclxuICB0aGlzLmlucHV0ID0gbnVsbDtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBAcGFyYW0ge1JpZmYuQ2h1bmt9IGNodW5rXHJcbiAqL1xyXG5QYXJzZXIucHJvdG90eXBlLnBhcnNlUmlmZkNodW5rID0gZnVuY3Rpb24oY2h1bmspIHtcclxuICAvKiogQHR5cGUge1JpZmYuUGFyc2VyfSAqL1xyXG4gIHZhciBwYXJzZXI7XHJcbiAgLyoqIEB0eXBlIHtCeXRlQXJyYXl9ICovXHJcbiAgdmFyIGRhdGEgPSB0aGlzLmlucHV0O1xyXG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gIHZhciBpcCA9IGNodW5rLm9mZnNldDtcclxuICAvKiogQHR5cGUge3N0cmluZ30gKi9cclxuICB2YXIgc2lnbmF0dXJlO1xyXG5cclxuICAvLyBjaGVjayBwYXJzZSB0YXJnZXRcclxuICBpZiAoY2h1bmsudHlwZSAhPT0gJ1JJRkYnKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgY2h1bmsgdHlwZTonICsgY2h1bmsudHlwZSk7XHJcbiAgfVxyXG5cclxuICAvLyBjaGVjayBzaWduYXR1cmVcclxuICBzaWduYXR1cmUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGRhdGFbaXArK10sIGRhdGFbaXArK10sIGRhdGFbaXArK10sIGRhdGFbaXArK10pO1xyXG4gIGlmIChzaWduYXR1cmUgIT09ICdzZmJrJykge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHNpZ25hdHVyZTonICsgc2lnbmF0dXJlKTtcclxuICB9XHJcblxyXG4gIC8vIHJlYWQgc3RydWN0dXJlXHJcbiAgcGFyc2VyID0gbmV3IFJpZmYuUGFyc2VyKGRhdGEsIHsnaW5kZXgnOiBpcCwgJ2xlbmd0aCc6IGNodW5rLnNpemUgLSA0fSk7XHJcbiAgcGFyc2VyLnBhcnNlKCk7XHJcbiAgaWYgKHBhcnNlci5nZXROdW1iZXJPZkNodW5rcygpICE9PSAzKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgc2ZiayBzdHJ1Y3R1cmUnKTtcclxuICB9XHJcblxyXG4gIC8vIElORk8tbGlzdFxyXG4gIHRoaXMucGFyc2VJbmZvTGlzdCgvKiogQHR5cGUgeyFSaWZmLkNodW5rfSAqLyhwYXJzZXIuZ2V0Q2h1bmsoMCkpKTtcclxuXHJcbiAgLy8gc2R0YS1saXN0XHJcbiAgdGhpcy5wYXJzZVNkdGFMaXN0KC8qKiBAdHlwZSB7IVJpZmYuQ2h1bmt9ICovKHBhcnNlci5nZXRDaHVuaygxKSkpO1xyXG5cclxuICAvLyBwZHRhLWxpc3RcclxuICB0aGlzLnBhcnNlUGR0YUxpc3QoLyoqIEB0eXBlIHshUmlmZi5DaHVua30gKi8ocGFyc2VyLmdldENodW5rKDIpKSk7XHJcbn07XHJcblxyXG4vKipcclxuICogQHBhcmFtIHtSaWZmLkNodW5rfSBjaHVua1xyXG4gKi9cclxuUGFyc2VyLnByb3RvdHlwZS5wYXJzZUluZm9MaXN0ID0gZnVuY3Rpb24oY2h1bmspIHtcclxuICAvKiogQHR5cGUge1JpZmYuUGFyc2VyfSAqL1xyXG4gIHZhciBwYXJzZXI7XHJcbiAgLyoqIEB0eXBlIHtCeXRlQXJyYXl9ICovXHJcbiAgdmFyIGRhdGEgPSB0aGlzLmlucHV0O1xyXG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gIHZhciBpcCA9IGNodW5rLm9mZnNldDtcclxuICAvKiogQHR5cGUge3N0cmluZ30gKi9cclxuICB2YXIgc2lnbmF0dXJlO1xyXG5cclxuICAvLyBjaGVjayBwYXJzZSB0YXJnZXRcclxuICBpZiAoY2h1bmsudHlwZSAhPT0gJ0xJU1QnKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgY2h1bmsgdHlwZTonICsgY2h1bmsudHlwZSk7XHJcbiAgfVxyXG5cclxuICAvLyBjaGVjayBzaWduYXR1cmVcclxuICBzaWduYXR1cmUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGRhdGFbaXArK10sIGRhdGFbaXArK10sIGRhdGFbaXArK10sIGRhdGFbaXArK10pO1xyXG4gIGlmIChzaWduYXR1cmUgIT09ICdJTkZPJykge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHNpZ25hdHVyZTonICsgc2lnbmF0dXJlKTtcclxuICB9XHJcblxyXG4gIC8vIHJlYWQgc3RydWN0dXJlXHJcbiAgcGFyc2VyID0gbmV3IFJpZmYuUGFyc2VyKGRhdGEsIHsnaW5kZXgnOiBpcCwgJ2xlbmd0aCc6IGNodW5rLnNpemUgLSA0fSk7XHJcbiAgcGFyc2VyLnBhcnNlKCk7XHJcbn07XHJcblxyXG4vKipcclxuICogQHBhcmFtIHtSaWZmLkNodW5rfSBjaHVua1xyXG4gKi9cclxuUGFyc2VyLnByb3RvdHlwZS5wYXJzZVNkdGFMaXN0ID0gZnVuY3Rpb24oY2h1bmspIHtcclxuICAvKiogQHR5cGUge1JpZmYuUGFyc2VyfSAqL1xyXG4gIHZhciBwYXJzZXI7XHJcbiAgLyoqIEB0eXBlIHtCeXRlQXJyYXl9ICovXHJcbiAgdmFyIGRhdGEgPSB0aGlzLmlucHV0O1xyXG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gIHZhciBpcCA9IGNodW5rLm9mZnNldDtcclxuICAvKiogQHR5cGUge3N0cmluZ30gKi9cclxuICB2YXIgc2lnbmF0dXJlO1xyXG5cclxuICAvLyBjaGVjayBwYXJzZSB0YXJnZXRcclxuICBpZiAoY2h1bmsudHlwZSAhPT0gJ0xJU1QnKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgY2h1bmsgdHlwZTonICsgY2h1bmsudHlwZSk7XHJcbiAgfVxyXG5cclxuICAvLyBjaGVjayBzaWduYXR1cmVcclxuICBzaWduYXR1cmUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGRhdGFbaXArK10sIGRhdGFbaXArK10sIGRhdGFbaXArK10sIGRhdGFbaXArK10pO1xyXG4gIGlmIChzaWduYXR1cmUgIT09ICdzZHRhJykge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHNpZ25hdHVyZTonICsgc2lnbmF0dXJlKTtcclxuICB9XHJcblxyXG4gIC8vIHJlYWQgc3RydWN0dXJlXHJcbiAgcGFyc2VyID0gbmV3IFJpZmYuUGFyc2VyKGRhdGEsIHsnaW5kZXgnOiBpcCwgJ2xlbmd0aCc6IGNodW5rLnNpemUgLSA0fSk7XHJcbiAgcGFyc2VyLnBhcnNlKCk7XHJcbiAgaWYgKHBhcnNlci5jaHVua0xpc3QubGVuZ3RoICE9PSAxKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RPRE8nKTtcclxuICB9XHJcbiAgdGhpcy5zYW1wbGluZ0RhdGEgPVxyXG4gICAgLyoqIEB0eXBlIHt7dHlwZTogc3RyaW5nLCBzaXplOiBudW1iZXIsIG9mZnNldDogbnVtYmVyfX0gKi9cclxuICAgIChwYXJzZXIuZ2V0Q2h1bmsoMCkpO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIEBwYXJhbSB7UmlmZi5DaHVua30gY2h1bmtcclxuICovXHJcblBhcnNlci5wcm90b3R5cGUucGFyc2VQZHRhTGlzdCA9IGZ1bmN0aW9uKGNodW5rKSB7XHJcbiAgLyoqIEB0eXBlIHtSaWZmLlBhcnNlcn0gKi9cclxuICB2YXIgcGFyc2VyO1xyXG4gIC8qKiBAdHlwZSB7Qnl0ZUFycmF5fSAqL1xyXG4gIHZhciBkYXRhID0gdGhpcy5pbnB1dDtcclxuICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICB2YXIgaXAgPSBjaHVuay5vZmZzZXQ7XHJcbiAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXHJcbiAgdmFyIHNpZ25hdHVyZTtcclxuXHJcbiAgLy8gY2hlY2sgcGFyc2UgdGFyZ2V0XHJcbiAgaWYgKGNodW5rLnR5cGUgIT09ICdMSVNUJykge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGNodW5rIHR5cGU6JyArIGNodW5rLnR5cGUpO1xyXG4gIH1cclxuXHJcbiAgLy8gY2hlY2sgc2lnbmF0dXJlXHJcbiAgc2lnbmF0dXJlID0gU3RyaW5nLmZyb21DaGFyQ29kZShkYXRhW2lwKytdLCBkYXRhW2lwKytdLCBkYXRhW2lwKytdLCBkYXRhW2lwKytdKTtcclxuICBpZiAoc2lnbmF0dXJlICE9PSAncGR0YScpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzaWduYXR1cmU6JyArIHNpZ25hdHVyZSk7XHJcbiAgfVxyXG5cclxuICAvLyByZWFkIHN0cnVjdHVyZVxyXG4gIHBhcnNlciA9IG5ldyBSaWZmLlBhcnNlcihkYXRhLCB7J2luZGV4JzogaXAsICdsZW5ndGgnOiBjaHVuay5zaXplIC0gNH0pO1xyXG4gIHBhcnNlci5wYXJzZSgpO1xyXG5cclxuICAvLyBjaGVjayBudW1iZXIgb2YgY2h1bmtzXHJcbiAgaWYgKHBhcnNlci5nZXROdW1iZXJPZkNodW5rcygpICE9PSA5KSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcGR0YSBjaHVuaycpO1xyXG4gIH1cclxuXHJcbiAgdGhpcy5wYXJzZVBoZHIoLyoqIEB0eXBlIHtSaWZmLkNodW5rfSAqLyhwYXJzZXIuZ2V0Q2h1bmsoMCkpKTtcclxuICB0aGlzLnBhcnNlUGJhZygvKiogQHR5cGUge1JpZmYuQ2h1bmt9ICovKHBhcnNlci5nZXRDaHVuaygxKSkpO1xyXG4gIHRoaXMucGFyc2VQbW9kKC8qKiBAdHlwZSB7UmlmZi5DaHVua30gKi8ocGFyc2VyLmdldENodW5rKDIpKSk7XHJcbiAgdGhpcy5wYXJzZVBnZW4oLyoqIEB0eXBlIHtSaWZmLkNodW5rfSAqLyhwYXJzZXIuZ2V0Q2h1bmsoMykpKTtcclxuICB0aGlzLnBhcnNlSW5zdCgvKiogQHR5cGUge1JpZmYuQ2h1bmt9ICovKHBhcnNlci5nZXRDaHVuayg0KSkpO1xyXG4gIHRoaXMucGFyc2VJYmFnKC8qKiBAdHlwZSB7UmlmZi5DaHVua30gKi8ocGFyc2VyLmdldENodW5rKDUpKSk7XHJcbiAgdGhpcy5wYXJzZUltb2QoLyoqIEB0eXBlIHtSaWZmLkNodW5rfSAqLyhwYXJzZXIuZ2V0Q2h1bmsoNikpKTtcclxuICB0aGlzLnBhcnNlSWdlbigvKiogQHR5cGUge1JpZmYuQ2h1bmt9ICovKHBhcnNlci5nZXRDaHVuayg3KSkpO1xyXG4gIHRoaXMucGFyc2VTaGRyKC8qKiBAdHlwZSB7UmlmZi5DaHVua30gKi8ocGFyc2VyLmdldENodW5rKDgpKSk7XHJcbn07XHJcblxyXG4vKipcclxuICogQHBhcmFtIHtSaWZmLkNodW5rfSBjaHVua1xyXG4gKi9cclxuUGFyc2VyLnByb3RvdHlwZS5wYXJzZVBoZHIgPSBmdW5jdGlvbihjaHVuaykge1xyXG4gIC8qKiBAdHlwZSB7Qnl0ZUFycmF5fSAqL1xyXG4gIHZhciBkYXRhID0gdGhpcy5pbnB1dDtcclxuICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICB2YXIgaXAgPSBjaHVuay5vZmZzZXQ7XHJcbiAgLyoqIEB0eXBlIHtBcnJheS48T2JqZWN0Pn0gKi9cclxuICB2YXIgcHJlc2V0SGVhZGVyID0gdGhpcy5wcmVzZXRIZWFkZXIgPSBbXTtcclxuICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICB2YXIgc2l6ZSA9IGNodW5rLm9mZnNldCArIGNodW5rLnNpemU7XHJcblxyXG4gIC8vIGNoZWNrIHBhcnNlIHRhcmdldFxyXG4gIGlmIChjaHVuay50eXBlICE9PSAncGhkcicpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBjaHVuayB0eXBlOicgKyBjaHVuay50eXBlKTtcclxuICB9XHJcblxyXG4gIHdoaWxlIChpcCA8IHNpemUpIHtcclxuICAgIHByZXNldEhlYWRlci5wdXNoKHtcclxuICAgICAgcHJlc2V0TmFtZTogU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBkYXRhLnN1YmFycmF5KGlwLCBpcCArPSAyMCkpLFxyXG4gICAgICBwcmVzZXQ6IGRhdGFbaXArK10gfCAoZGF0YVtpcCsrXSA8PCA4KSxcclxuICAgICAgYmFuazogZGF0YVtpcCsrXSB8IChkYXRhW2lwKytdIDw8IDgpLFxyXG4gICAgICBwcmVzZXRCYWdJbmRleDogZGF0YVtpcCsrXSB8IChkYXRhW2lwKytdIDw8IDgpLFxyXG4gICAgICBsaWJyYXJ5OiAoZGF0YVtpcCsrXSB8IChkYXRhW2lwKytdIDw8IDgpIHwgKGRhdGFbaXArK10gPDwgMTYpIHwgKGRhdGFbaXArK10gPDwgMjQpKSA+Pj4gMCxcclxuICAgICAgZ2VucmU6IChkYXRhW2lwKytdIHwgKGRhdGFbaXArK10gPDwgOCkgfCAoZGF0YVtpcCsrXSA8PCAxNikgfCAoZGF0YVtpcCsrXSA8PCAyNCkpID4+PiAwLFxyXG4gICAgICBtb3JwaG9sb2d5OiAoZGF0YVtpcCsrXSB8IChkYXRhW2lwKytdIDw8IDgpIHwgKGRhdGFbaXArK10gPDwgMTYpIHwgKGRhdGFbaXArK10gPDwgMjQpKSA+Pj4gMFxyXG4gICAgfSk7XHJcbiAgfVxyXG59O1xyXG5cclxuLyoqXHJcbiAqIEBwYXJhbSB7UmlmZi5DaHVua30gY2h1bmtcclxuICovXHJcblBhcnNlci5wcm90b3R5cGUucGFyc2VQYmFnID0gZnVuY3Rpb24oY2h1bmspIHtcclxuICAvKiogQHR5cGUge0J5dGVBcnJheX0gKi9cclxuICB2YXIgZGF0YSA9IHRoaXMuaW5wdXQ7XHJcbiAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgdmFyIGlwID0gY2h1bmsub2Zmc2V0O1xyXG4gIC8qKiBAdHlwZSB7QXJyYXkuPE9iamVjdD59ICovXHJcbiAgdmFyIHByZXNldFpvbmUgPSB0aGlzLnByZXNldFpvbmUgPSBbXTtcclxuICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICB2YXIgc2l6ZSA9IGNodW5rLm9mZnNldCArIGNodW5rLnNpemU7XHJcblxyXG4gIC8vIGNoZWNrIHBhcnNlIHRhcmdldFxyXG4gIGlmIChjaHVuay50eXBlICE9PSAncGJhZycpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBjaHVuayB0eXBlOicgICsgY2h1bmsudHlwZSk7XHJcbiAgfVxyXG5cclxuICB3aGlsZSAoaXAgPCBzaXplKSB7XHJcbiAgICBwcmVzZXRab25lLnB1c2goe1xyXG4gICAgICBwcmVzZXRHZW5lcmF0b3JJbmRleDogZGF0YVtpcCsrXSB8IChkYXRhW2lwKytdIDw8IDgpLFxyXG4gICAgICBwcmVzZXRNb2R1bGF0b3JJbmRleDogZGF0YVtpcCsrXSB8IChkYXRhW2lwKytdIDw8IDgpXHJcbiAgICB9KTtcclxuICB9XHJcbn07XHJcblxyXG4vKipcclxuICogQHBhcmFtIHtSaWZmLkNodW5rfSBjaHVua1xyXG4gKi9cclxuUGFyc2VyLnByb3RvdHlwZS5wYXJzZVBtb2QgPSBmdW5jdGlvbihjaHVuaykge1xyXG4gIC8vIGNoZWNrIHBhcnNlIHRhcmdldFxyXG4gIGlmIChjaHVuay50eXBlICE9PSAncG1vZCcpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBjaHVuayB0eXBlOicgKyBjaHVuay50eXBlKTtcclxuICB9XHJcblxyXG4gIHRoaXMucHJlc2V0Wm9uZU1vZHVsYXRvciA9IHRoaXMucGFyc2VNb2R1bGF0b3IoY2h1bmspO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIEBwYXJhbSB7UmlmZi5DaHVua30gY2h1bmtcclxuICovXHJcblBhcnNlci5wcm90b3R5cGUucGFyc2VQZ2VuID0gZnVuY3Rpb24oY2h1bmspIHtcclxuICAvLyBjaGVjayBwYXJzZSB0YXJnZXRcclxuICBpZiAoY2h1bmsudHlwZSAhPT0gJ3BnZW4nKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgY2h1bmsgdHlwZTonICsgY2h1bmsudHlwZSk7XHJcbiAgfVxyXG4gIHRoaXMucHJlc2V0Wm9uZUdlbmVyYXRvciA9IHRoaXMucGFyc2VHZW5lcmF0b3IoY2h1bmspO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIEBwYXJhbSB7UmlmZi5DaHVua30gY2h1bmtcclxuICovXHJcblBhcnNlci5wcm90b3R5cGUucGFyc2VJbnN0ID0gZnVuY3Rpb24oY2h1bmspIHtcclxuICAvKiogQHR5cGUge0J5dGVBcnJheX0gKi9cclxuICB2YXIgZGF0YSA9IHRoaXMuaW5wdXQ7XHJcbiAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgdmFyIGlwID0gY2h1bmsub2Zmc2V0O1xyXG4gIC8qKiBAdHlwZSB7QXJyYXkuPE9iamVjdD59ICovXHJcbiAgdmFyIGluc3RydW1lbnQgPSB0aGlzLmluc3RydW1lbnQgPSBbXTtcclxuICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICB2YXIgc2l6ZSA9IGNodW5rLm9mZnNldCArIGNodW5rLnNpemU7XHJcblxyXG4gIC8vIGNoZWNrIHBhcnNlIHRhcmdldFxyXG4gIGlmIChjaHVuay50eXBlICE9PSAnaW5zdCcpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBjaHVuayB0eXBlOicgKyBjaHVuay50eXBlKTtcclxuICB9XHJcblxyXG4gIHdoaWxlIChpcCA8IHNpemUpIHtcclxuICAgIGluc3RydW1lbnQucHVzaCh7XHJcbiAgICAgIGluc3RydW1lbnROYW1lOiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGRhdGEuc3ViYXJyYXkoaXAsIGlwICs9IDIwKSksXHJcbiAgICAgIGluc3RydW1lbnRCYWdJbmRleDogZGF0YVtpcCsrXSB8IChkYXRhW2lwKytdIDw8IDgpXHJcbiAgICB9KTtcclxuICB9XHJcbn07XHJcblxyXG4vKipcclxuICogQHBhcmFtIHtSaWZmLkNodW5rfSBjaHVua1xyXG4gKi9cclxuUGFyc2VyLnByb3RvdHlwZS5wYXJzZUliYWcgPSBmdW5jdGlvbihjaHVuaykge1xyXG4gIC8qKiBAdHlwZSB7Qnl0ZUFycmF5fSAqL1xyXG4gIHZhciBkYXRhID0gdGhpcy5pbnB1dDtcclxuICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICB2YXIgaXAgPSBjaHVuay5vZmZzZXQ7XHJcbiAgLyoqIEB0eXBlIHtBcnJheS48T2JqZWN0Pn0gKi9cclxuICB2YXIgaW5zdHJ1bWVudFpvbmUgPSB0aGlzLmluc3RydW1lbnRab25lID0gW107XHJcbiAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgdmFyIHNpemUgPSBjaHVuay5vZmZzZXQgKyBjaHVuay5zaXplO1xyXG5cclxuICAvLyBjaGVjayBwYXJzZSB0YXJnZXRcclxuICBpZiAoY2h1bmsudHlwZSAhPT0gJ2liYWcnKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgY2h1bmsgdHlwZTonICsgY2h1bmsudHlwZSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgd2hpbGUgKGlwIDwgc2l6ZSkge1xyXG4gICAgaW5zdHJ1bWVudFpvbmUucHVzaCh7XHJcbiAgICAgIGluc3RydW1lbnRHZW5lcmF0b3JJbmRleDogZGF0YVtpcCsrXSB8IChkYXRhW2lwKytdIDw8IDgpLFxyXG4gICAgICBpbnN0cnVtZW50TW9kdWxhdG9ySW5kZXg6IGRhdGFbaXArK10gfCAoZGF0YVtpcCsrXSA8PCA4KVxyXG4gICAgfSk7XHJcbiAgfVxyXG59O1xyXG5cclxuLyoqXHJcbiAqIEBwYXJhbSB7UmlmZi5DaHVua30gY2h1bmtcclxuICovXHJcblBhcnNlci5wcm90b3R5cGUucGFyc2VJbW9kID0gZnVuY3Rpb24oY2h1bmspIHtcclxuICAvLyBjaGVjayBwYXJzZSB0YXJnZXRcclxuICBpZiAoY2h1bmsudHlwZSAhPT0gJ2ltb2QnKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgY2h1bmsgdHlwZTonICsgY2h1bmsudHlwZSk7XHJcbiAgfVxyXG5cclxuICB0aGlzLmluc3RydW1lbnRab25lTW9kdWxhdG9yID0gdGhpcy5wYXJzZU1vZHVsYXRvcihjaHVuayk7XHJcbn07XHJcblxyXG5cclxuLyoqXHJcbiAqIEBwYXJhbSB7UmlmZi5DaHVua30gY2h1bmtcclxuICovXHJcblBhcnNlci5wcm90b3R5cGUucGFyc2VJZ2VuID0gZnVuY3Rpb24oY2h1bmspIHtcclxuICAvLyBjaGVjayBwYXJzZSB0YXJnZXRcclxuICBpZiAoY2h1bmsudHlwZSAhPT0gJ2lnZW4nKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgY2h1bmsgdHlwZTonICsgY2h1bmsudHlwZSk7XHJcbiAgfVxyXG5cclxuICB0aGlzLmluc3RydW1lbnRab25lR2VuZXJhdG9yID0gdGhpcy5wYXJzZUdlbmVyYXRvcihjaHVuayk7XHJcbn07XHJcblxyXG4vKipcclxuICogQHBhcmFtIHtSaWZmLkNodW5rfSBjaHVua1xyXG4gKi9cclxuUGFyc2VyLnByb3RvdHlwZS5wYXJzZVNoZHIgPSBmdW5jdGlvbihjaHVuaykge1xyXG4gIC8qKiBAdHlwZSB7Qnl0ZUFycmF5fSAqL1xyXG4gIHZhciBkYXRhID0gdGhpcy5pbnB1dDtcclxuICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICB2YXIgaXAgPSBjaHVuay5vZmZzZXQ7XHJcbiAgLyoqIEB0eXBlIHtBcnJheS48T2JqZWN0Pn0gKi9cclxuICB2YXIgc2FtcGxlcyA9IHRoaXMuc2FtcGxlID0gW107XHJcbiAgLyoqIEB0eXBlIHtBcnJheS48T2JqZWN0Pn0gKi9cclxuICB2YXIgc2FtcGxlSGVhZGVyID0gdGhpcy5zYW1wbGVIZWFkZXIgPSBbXTtcclxuICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICB2YXIgc2l6ZSA9IGNodW5rLm9mZnNldCArIGNodW5rLnNpemU7XHJcbiAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXHJcbiAgdmFyIHNhbXBsZU5hbWU7XHJcbiAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgdmFyIHN0YXJ0O1xyXG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gIHZhciBlbmQ7XHJcbiAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgdmFyIHN0YXJ0TG9vcDtcclxuICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICB2YXIgZW5kTG9vcDtcclxuICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICB2YXIgc2FtcGxlUmF0ZTtcclxuICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICB2YXIgb3JpZ2luYWxQaXRjaDtcclxuICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICB2YXIgcGl0Y2hDb3JyZWN0aW9uO1xyXG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gIHZhciBzYW1wbGVMaW5rO1xyXG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gIHZhciBzYW1wbGVUeXBlO1xyXG5cclxuICAvLyBjaGVjayBwYXJzZSB0YXJnZXRcclxuICBpZiAoY2h1bmsudHlwZSAhPT0gJ3NoZHInKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgY2h1bmsgdHlwZTonICsgY2h1bmsudHlwZSk7XHJcbiAgfVxyXG5cclxuICB3aGlsZSAoaXAgPCBzaXplKSB7XHJcbiAgICBzYW1wbGVOYW1lID0gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBkYXRhLnN1YmFycmF5KGlwLCBpcCArPSAyMCkpO1xyXG4gICAgc3RhcnQgPSAoXHJcbiAgICAgIChkYXRhW2lwKytdIDw8IDApIHwgKGRhdGFbaXArK10gPDwgOCkgfCAoZGF0YVtpcCsrXSA8PCAxNikgfCAoZGF0YVtpcCsrXSA8PCAyNClcclxuICAgICkgPj4+IDA7XHJcbiAgICBlbmQgPSAoXHJcbiAgICAgIChkYXRhW2lwKytdIDw8IDApIHwgKGRhdGFbaXArK10gPDwgOCkgfCAoZGF0YVtpcCsrXSA8PCAxNikgfCAoZGF0YVtpcCsrXSA8PCAyNClcclxuICAgICkgPj4+IDA7XHJcbiAgICBzdGFydExvb3AgPSAoXHJcbiAgICAgIChkYXRhW2lwKytdIDw8IDApIHwgKGRhdGFbaXArK10gPDwgOCkgfCAoZGF0YVtpcCsrXSA8PCAxNikgfCAoZGF0YVtpcCsrXSA8PCAyNClcclxuICAgICkgPj4+IDA7XHJcbiAgICBlbmRMb29wID0gIChcclxuICAgICAgKGRhdGFbaXArK10gPDwgMCkgfCAoZGF0YVtpcCsrXSA8PCA4KSB8IChkYXRhW2lwKytdIDw8IDE2KSB8IChkYXRhW2lwKytdIDw8IDI0KVxyXG4gICAgKSA+Pj4gMDtcclxuICAgIHNhbXBsZVJhdGUgPSAoXHJcbiAgICAgIChkYXRhW2lwKytdIDw8IDApIHwgKGRhdGFbaXArK10gPDwgOCkgfCAoZGF0YVtpcCsrXSA8PCAxNikgfCAoZGF0YVtpcCsrXSA8PCAyNClcclxuICAgICkgPj4+IDA7XHJcbiAgICBvcmlnaW5hbFBpdGNoID0gZGF0YVtpcCsrXTtcclxuICAgIHBpdGNoQ29ycmVjdGlvbiA9IChkYXRhW2lwKytdIDw8IDI0KSA+PiAyNDtcclxuICAgIHNhbXBsZUxpbmsgPSBkYXRhW2lwKytdIHwgKGRhdGFbaXArK10gPDwgOCk7XHJcbiAgICBzYW1wbGVUeXBlID0gZGF0YVtpcCsrXSB8IChkYXRhW2lwKytdIDw8IDgpO1xyXG5cclxuICAgIC8vKlxyXG4gICAgdmFyIHNhbXBsZSA9IG5ldyBJbnQxNkFycmF5KG5ldyBVaW50OEFycmF5KGRhdGEuc3ViYXJyYXkoXHJcbiAgICAgIHRoaXMuc2FtcGxpbmdEYXRhLm9mZnNldCArIHN0YXJ0ICogMixcclxuICAgICAgdGhpcy5zYW1wbGluZ0RhdGEub2Zmc2V0ICsgZW5kICAgKiAyXHJcbiAgICApKS5idWZmZXIpO1xyXG5cclxuICAgIHN0YXJ0TG9vcCAtPSBzdGFydDtcclxuICAgIGVuZExvb3AgLT0gc3RhcnQ7XHJcblxyXG4gICAgaWYgKHNhbXBsZVJhdGUgPiAwKSB7XHJcbiAgICAgIHZhciBhZGp1c3QgPSB0aGlzLmFkanVzdFNhbXBsZURhdGEoc2FtcGxlLCBzYW1wbGVSYXRlKTtcclxuICAgICAgc2FtcGxlID0gYWRqdXN0LnNhbXBsZTtcclxuICAgICAgc2FtcGxlUmF0ZSAqPSBhZGp1c3QubXVsdGlwbHk7XHJcbiAgICAgIHN0YXJ0TG9vcCAqPSBhZGp1c3QubXVsdGlwbHk7XHJcbiAgICAgIGVuZExvb3AgKj0gYWRqdXN0Lm11bHRpcGx5O1xyXG4gICAgfVxyXG5cclxuICAgIHNhbXBsZXMucHVzaChzYW1wbGUpO1xyXG4gICAgLy8qL1xyXG5cclxuICAgIHNhbXBsZUhlYWRlci5wdXNoKHtcclxuICAgICAgc2FtcGxlTmFtZTogc2FtcGxlTmFtZSxcclxuICAgICAgLypcclxuICAgICAgc3RhcnQ6IHN0YXJ0LFxyXG4gICAgICBlbmQ6IGVuZCxcclxuICAgICAgKi9cclxuICAgICAgc3RhcnRMb29wOiBzdGFydExvb3AsXHJcbiAgICAgIGVuZExvb3A6IGVuZExvb3AsXHJcbiAgICAgIHNhbXBsZVJhdGU6IHNhbXBsZVJhdGUsXHJcbiAgICAgIG9yaWdpbmFsUGl0Y2g6IG9yaWdpbmFsUGl0Y2gsXHJcbiAgICAgIHBpdGNoQ29ycmVjdGlvbjogcGl0Y2hDb3JyZWN0aW9uLFxyXG4gICAgICBzYW1wbGVMaW5rOiBzYW1wbGVMaW5rLFxyXG4gICAgICBzYW1wbGVUeXBlOiBzYW1wbGVUeXBlXHJcbiAgICB9KTtcclxuICB9XHJcbn07XHJcblxyXG5QYXJzZXIucHJvdG90eXBlLmFkanVzdFNhbXBsZURhdGEgPSBmdW5jdGlvbihzYW1wbGUsIHNhbXBsZVJhdGUpIHtcclxuICAvKiogQHR5cGUge0ludDE2QXJyYXl9ICovXHJcbiAgdmFyIG5ld1NhbXBsZTtcclxuICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICB2YXIgaTtcclxuICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICB2YXIgaWw7XHJcbiAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgdmFyIGo7XHJcbiAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgdmFyIG11bHRpcGx5ID0gMTtcclxuXHJcbiAgLy8gYnVmZmVyXHJcbiAgd2hpbGUgKHNhbXBsZVJhdGUgPCAyMjA1MCkge1xyXG4gICAgbmV3U2FtcGxlID0gbmV3IEludDE2QXJyYXkoc2FtcGxlLmxlbmd0aCAqIDIpO1xyXG4gICAgZm9yIChpID0gaiA9IDAsIGlsID0gc2FtcGxlLmxlbmd0aDsgaSA8IGlsOyArK2kpIHtcclxuICAgICAgbmV3U2FtcGxlW2orK10gPSBzYW1wbGVbaV07XHJcbiAgICAgIG5ld1NhbXBsZVtqKytdID0gc2FtcGxlW2ldO1xyXG4gICAgfVxyXG4gICAgc2FtcGxlID0gbmV3U2FtcGxlO1xyXG4gICAgbXVsdGlwbHkgKj0gMjtcclxuICAgIHNhbXBsZVJhdGUgKj0gMjtcclxuICB9XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBzYW1wbGU6IHNhbXBsZSxcclxuICAgIG11bHRpcGx5OiBtdWx0aXBseVxyXG4gIH07XHJcbn07XHJcblxyXG4vKipcclxuICogQHBhcmFtIHtSaWZmLkNodW5rfSBjaHVua1xyXG4gKiBAcmV0dXJuIHtBcnJheS48T2JqZWN0Pn1cclxuICovXHJcblBhcnNlci5wcm90b3R5cGUucGFyc2VNb2R1bGF0b3IgPSBmdW5jdGlvbihjaHVuaykge1xyXG4gIC8qKiBAdHlwZSB7Qnl0ZUFycmF5fSAqL1xyXG4gIHZhciBkYXRhID0gdGhpcy5pbnB1dDtcclxuICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICB2YXIgaXAgPSBjaHVuay5vZmZzZXQ7XHJcbiAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgdmFyIHNpemUgPSBjaHVuay5vZmZzZXQgKyBjaHVuay5zaXplO1xyXG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gIHZhciBjb2RlO1xyXG4gIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xyXG4gIHZhciBrZXk7XHJcbiAgLyoqIEB0eXBlIHtBcnJheS48T2JqZWN0Pn0gKi9cclxuICB2YXIgb3V0cHV0ID0gW107XHJcblxyXG4gIHdoaWxlIChpcCA8IHNpemUpIHtcclxuICAgIC8vIFNyYyAgT3BlclxyXG4gICAgLy8gVE9ET1xyXG4gICAgaXAgKz0gMjtcclxuXHJcbiAgICAvLyBEZXN0IE9wZXJcclxuICAgIGNvZGUgPSBkYXRhW2lwKytdIHwgKGRhdGFbaXArK10gPDwgOCk7XHJcbiAgICBrZXkgPSBQYXJzZXIuR2VuZXJhdG9yRW51bWVyYXRvclRhYmxlW2NvZGVdO1xyXG4gICAgaWYgKGtleSA9PT0gdm9pZCAwKSB7XHJcbiAgICAgIC8vIEFtb3VudFxyXG4gICAgICBvdXRwdXQucHVzaCh7XHJcbiAgICAgICAgdHlwZToga2V5LFxyXG4gICAgICAgIHZhbHVlOiB7XHJcbiAgICAgICAgICBjb2RlOiBjb2RlLFxyXG4gICAgICAgICAgYW1vdW50OiBkYXRhW2lwXSB8IChkYXRhW2lwKzFdIDw8IDgpIDw8IDE2ID4+IDE2LFxyXG4gICAgICAgICAgbG86IGRhdGFbaXArK10sXHJcbiAgICAgICAgICBoaTogZGF0YVtpcCsrXVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBBbW91bnRcclxuICAgICAgc3dpdGNoIChrZXkpIHtcclxuICAgICAgICBjYXNlICdrZXlSYW5nZSc6IC8qIEZBTExUSFJPVUdIICovXHJcbiAgICAgICAgY2FzZSAndmVsUmFuZ2UnOiAvKiBGQUxMVEhST1VHSCAqL1xyXG4gICAgICAgIGNhc2UgJ2tleW51bSc6IC8qIEZBTExUSFJPVUdIICovXHJcbiAgICAgICAgY2FzZSAndmVsb2NpdHknOlxyXG4gICAgICAgICAgb3V0cHV0LnB1c2goe1xyXG4gICAgICAgICAgICB0eXBlOiBrZXksXHJcbiAgICAgICAgICAgIHZhbHVlOiB7XHJcbiAgICAgICAgICAgICAgbG86IGRhdGFbaXArK10sXHJcbiAgICAgICAgICAgICAgaGk6IGRhdGFbaXArK11cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgb3V0cHV0LnB1c2goe1xyXG4gICAgICAgICAgICB0eXBlOiBrZXksXHJcbiAgICAgICAgICAgIHZhbHVlOiB7XHJcbiAgICAgICAgICAgICAgYW1vdW50OiBkYXRhW2lwKytdIHwgKGRhdGFbaXArK10gPDwgOCkgPDwgMTYgPj4gMTZcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIEFtdFNyY09wZXJcclxuICAgIC8vIFRPRE9cclxuICAgIGlwICs9IDI7XHJcblxyXG4gICAgLy8gVHJhbnMgT3BlclxyXG4gICAgLy8gVE9ET1xyXG4gICAgaXAgKz0gMjtcclxuICB9XHJcblxyXG4gIHJldHVybiBvdXRwdXQ7XHJcbn07XHJcblxyXG4vKipcclxuICogQHBhcmFtIHtSaWZmLkNodW5rfSBjaHVua1xyXG4gKiBAcmV0dXJuIHtBcnJheS48T2JqZWN0Pn1cclxuICovXHJcblBhcnNlci5wcm90b3R5cGUucGFyc2VHZW5lcmF0b3IgPSBmdW5jdGlvbihjaHVuaykge1xyXG4gIC8qKiBAdHlwZSB7Qnl0ZUFycmF5fSAqL1xyXG4gIHZhciBkYXRhID0gdGhpcy5pbnB1dDtcclxuICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICB2YXIgaXAgPSBjaHVuay5vZmZzZXQ7XHJcbiAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgdmFyIHNpemUgPSBjaHVuay5vZmZzZXQgKyBjaHVuay5zaXplO1xyXG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gIHZhciBjb2RlO1xyXG4gIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xyXG4gIHZhciBrZXk7XHJcbiAgLyoqIEB0eXBlIHtBcnJheS48T2JqZWN0Pn0gKi9cclxuICB2YXIgb3V0cHV0ID0gW107XHJcblxyXG4gIHdoaWxlIChpcCA8IHNpemUpIHtcclxuICAgIGNvZGUgPSBkYXRhW2lwKytdIHwgKGRhdGFbaXArK10gPDwgOCk7XHJcbiAgICBrZXkgPSBQYXJzZXIuR2VuZXJhdG9yRW51bWVyYXRvclRhYmxlW2NvZGVdO1xyXG4gICAgaWYgKGtleSA9PT0gdm9pZCAwKSB7XHJcbiAgICAgIG91dHB1dC5wdXNoKHtcclxuICAgICAgICB0eXBlOiBrZXksXHJcbiAgICAgICAgdmFsdWU6IHtcclxuICAgICAgICAgIGNvZGU6IGNvZGUsXHJcbiAgICAgICAgICBhbW91bnQ6IGRhdGFbaXBdIHwgKGRhdGFbaXArMV0gPDwgOCkgPDwgMTYgPj4gMTYsXHJcbiAgICAgICAgICBsbzogZGF0YVtpcCsrXSxcclxuICAgICAgICAgIGhpOiBkYXRhW2lwKytdXHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgY29udGludWU7XHJcbiAgICB9XHJcblxyXG4gICAgc3dpdGNoIChrZXkpIHtcclxuICAgICAgY2FzZSAna2V5bnVtJzogLyogRkFMTFRIUk9VR0ggKi9cclxuICAgICAgY2FzZSAna2V5UmFuZ2UnOiAvKiBGQUxMVEhST1VHSCAqL1xyXG4gICAgICBjYXNlICd2ZWxSYW5nZSc6IC8qIEZBTExUSFJPVUdIICovXHJcbiAgICAgIGNhc2UgJ3ZlbG9jaXR5JzpcclxuICAgICAgICBvdXRwdXQucHVzaCh7XHJcbiAgICAgICAgICB0eXBlOiBrZXksXHJcbiAgICAgICAgICB2YWx1ZToge1xyXG4gICAgICAgICAgICBsbzogZGF0YVtpcCsrXSxcclxuICAgICAgICAgICAgaGk6IGRhdGFbaXArK11cclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBvdXRwdXQucHVzaCh7XHJcbiAgICAgICAgICB0eXBlOiBrZXksXHJcbiAgICAgICAgICB2YWx1ZToge1xyXG4gICAgICAgICAgICBhbW91bnQ6IGRhdGFbaXArK10gfCAoZGF0YVtpcCsrXSA8PCA4KSA8PCAxNiA+PiAxNlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIG91dHB1dDtcclxufTtcclxuXHJcblBhcnNlci5wcm90b3R5cGUuY3JlYXRlSW5zdHJ1bWVudCA9IGZ1bmN0aW9uKCkge1xyXG4gIC8qKiBAdHlwZSB7QXJyYXkuPE9iamVjdD59ICovXHJcbiAgdmFyIGluc3RydW1lbnQgPSB0aGlzLmluc3RydW1lbnQ7XHJcbiAgLyoqIEB0eXBlIHtBcnJheS48T2JqZWN0Pn0gKi9cclxuICB2YXIgem9uZSA9IHRoaXMuaW5zdHJ1bWVudFpvbmU7XHJcbiAgLyoqIEB0eXBlIHtBcnJheS48T2JqZWN0Pn0gKi9cclxuICB2YXIgb3V0cHV0ID0gW107XHJcbiAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgdmFyIGJhZ0luZGV4O1xyXG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gIHZhciBiYWdJbmRleEVuZDtcclxuICAvKiogQHR5cGUge0FycmF5LjxPYmplY3Q+fSAqL1xyXG4gIHZhciB6b25lSW5mbztcclxuICAvKiogQHR5cGUge3tnZW5lcmF0b3I6IE9iamVjdCwgZ2VuZXJhdG9ySW5mbzogQXJyYXkuPE9iamVjdD59fSAqL1xyXG4gIHZhciBpbnN0cnVtZW50R2VuZXJhdG9yO1xyXG4gIC8qKiBAdHlwZSB7e21vZHVsYXRvcjogT2JqZWN0LCBtb2R1bGF0b3JJbmZvOiBBcnJheS48T2JqZWN0Pn19ICovXHJcbiAgdmFyIGluc3RydW1lbnRNb2R1bGF0b3I7XHJcbiAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgdmFyIGk7XHJcbiAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgdmFyIGlsO1xyXG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gIHZhciBqO1xyXG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gIHZhciBqbDtcclxuXHJcbiAgLy8gaW5zdHJ1bWVudCAtPiBpbnN0cnVtZW50IGJhZyAtPiBnZW5lcmF0b3IgLyBtb2R1bGF0b3JcclxuICBmb3IgKGkgPSAwLCBpbCA9IGluc3RydW1lbnQubGVuZ3RoOyBpIDwgaWw7ICsraSkge1xyXG4gICAgYmFnSW5kZXggICAgPSBpbnN0cnVtZW50W2ldLmluc3RydW1lbnRCYWdJbmRleDtcclxuICAgIGJhZ0luZGV4RW5kID0gaW5zdHJ1bWVudFtpKzFdID8gaW5zdHJ1bWVudFtpKzFdLmluc3RydW1lbnRCYWdJbmRleCA6IHpvbmUubGVuZ3RoO1xyXG4gICAgem9uZUluZm8gPSBbXTtcclxuXHJcbiAgICAvLyBpbnN0cnVtZW50IGJhZ1xyXG4gICAgZm9yIChqID0gYmFnSW5kZXgsIGpsID0gYmFnSW5kZXhFbmQ7IGogPCBqbDsgKytqKSB7XHJcbiAgICAgIGluc3RydW1lbnRHZW5lcmF0b3IgPSB0aGlzLmNyZWF0ZUluc3RydW1lbnRHZW5lcmF0b3JfKHpvbmUsIGopO1xyXG4gICAgICBpbnN0cnVtZW50TW9kdWxhdG9yID0gdGhpcy5jcmVhdGVJbnN0cnVtZW50TW9kdWxhdG9yXyh6b25lLCBqKTtcclxuXHJcbiAgICAgIHpvbmVJbmZvLnB1c2goe1xyXG4gICAgICAgIGdlbmVyYXRvcjogaW5zdHJ1bWVudEdlbmVyYXRvci5nZW5lcmF0b3IsXHJcbiAgICAgICAgZ2VuZXJhdG9yU2VxdWVuY2U6IGluc3RydW1lbnRHZW5lcmF0b3IuZ2VuZXJhdG9ySW5mbyxcclxuICAgICAgICBtb2R1bGF0b3I6IGluc3RydW1lbnRNb2R1bGF0b3IubW9kdWxhdG9yLFxyXG4gICAgICAgIG1vZHVsYXRvclNlcXVlbmNlOiBpbnN0cnVtZW50TW9kdWxhdG9yLm1vZHVsYXRvckluZm9cclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgb3V0cHV0LnB1c2goe1xyXG4gICAgICBuYW1lOiBpbnN0cnVtZW50W2ldLmluc3RydW1lbnROYW1lLFxyXG4gICAgICBpbmZvOiB6b25lSW5mb1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gb3V0cHV0O1xyXG59O1xyXG5cclxuUGFyc2VyLnByb3RvdHlwZS5jcmVhdGVQcmVzZXQgPSBmdW5jdGlvbigpIHtcclxuICAvKiogQHR5cGUge0FycmF5LjxPYmplY3Q+fSAqL1xyXG4gIHZhciBwcmVzZXQgICA9IHRoaXMucHJlc2V0SGVhZGVyO1xyXG4gIC8qKiBAdHlwZSB7QXJyYXkuPE9iamVjdD59ICovXHJcbiAgdmFyIHpvbmUgPSB0aGlzLnByZXNldFpvbmU7XHJcbiAgLyoqIEB0eXBlIHtBcnJheS48T2JqZWN0Pn0gKi9cclxuICB2YXIgb3V0cHV0ID0gW107XHJcbiAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgdmFyIGJhZ0luZGV4O1xyXG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gIHZhciBiYWdJbmRleEVuZDtcclxuICAvKiogQHR5cGUge0FycmF5LjxPYmplY3Q+fSAqL1xyXG4gIHZhciB6b25lSW5mbztcclxuICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICB2YXIgaW5zdHJ1bWVudDtcclxuICAvKiogQHR5cGUge3tnZW5lcmF0b3I6IE9iamVjdCwgZ2VuZXJhdG9ySW5mbzogQXJyYXkuPE9iamVjdD59fSAqL1xyXG4gIHZhciBwcmVzZXRHZW5lcmF0b3I7XHJcbiAgLyoqIEB0eXBlIHt7bW9kdWxhdG9yOiBPYmplY3QsIG1vZHVsYXRvckluZm86IEFycmF5LjxPYmplY3Q+fX0gKi9cclxuICB2YXIgcHJlc2V0TW9kdWxhdG9yO1xyXG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gIHZhciBpO1xyXG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gIHZhciBpbDtcclxuICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICB2YXIgajtcclxuICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICB2YXIgamw7XHJcblxyXG4gIC8vIHByZXNldCAtPiBwcmVzZXQgYmFnIC0+IGdlbmVyYXRvciAvIG1vZHVsYXRvclxyXG4gIGZvciAoaSA9IDAsIGlsID0gcHJlc2V0Lmxlbmd0aDsgaSA8IGlsOyArK2kpIHtcclxuICAgIGJhZ0luZGV4ICAgID0gcHJlc2V0W2ldLnByZXNldEJhZ0luZGV4O1xyXG4gICAgYmFnSW5kZXhFbmQgPSBwcmVzZXRbaSsxXSA/IHByZXNldFtpKzFdLnByZXNldEJhZ0luZGV4IDogem9uZS5sZW5ndGg7XHJcbiAgICB6b25lSW5mbyA9IFtdO1xyXG5cclxuICAgIC8vIHByZXNldCBiYWdcclxuICAgIGZvciAoaiA9IGJhZ0luZGV4LCBqbCA9IGJhZ0luZGV4RW5kOyBqIDwgamw7ICsraikge1xyXG4gICAgICBwcmVzZXRHZW5lcmF0b3IgPSB0aGlzLmNyZWF0ZVByZXNldEdlbmVyYXRvcl8oem9uZSwgaik7XHJcbiAgICAgIHByZXNldE1vZHVsYXRvciA9IHRoaXMuY3JlYXRlUHJlc2V0TW9kdWxhdG9yXyh6b25lLCBqKTtcclxuXHJcbiAgICAgIHpvbmVJbmZvLnB1c2goe1xyXG4gICAgICAgIGdlbmVyYXRvcjogcHJlc2V0R2VuZXJhdG9yLmdlbmVyYXRvcixcclxuICAgICAgICBnZW5lcmF0b3JTZXF1ZW5jZTogcHJlc2V0R2VuZXJhdG9yLmdlbmVyYXRvckluZm8sXHJcbiAgICAgICAgbW9kdWxhdG9yOiBwcmVzZXRNb2R1bGF0b3IubW9kdWxhdG9yLFxyXG4gICAgICAgIG1vZHVsYXRvclNlcXVlbmNlOiBwcmVzZXRNb2R1bGF0b3IubW9kdWxhdG9ySW5mb1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGluc3RydW1lbnQgPVxyXG4gICAgICAgIHByZXNldEdlbmVyYXRvci5nZW5lcmF0b3JbJ2luc3RydW1lbnQnXSAhPT0gdm9pZCAwID9cclxuICAgICAgICAgIHByZXNldEdlbmVyYXRvci5nZW5lcmF0b3JbJ2luc3RydW1lbnQnXS5hbW91bnQgOlxyXG4gICAgICAgIHByZXNldE1vZHVsYXRvci5tb2R1bGF0b3JbJ2luc3RydW1lbnQnXSAhPT0gdm9pZCAwID9cclxuICAgICAgICAgIHByZXNldE1vZHVsYXRvci5tb2R1bGF0b3JbJ2luc3RydW1lbnQnXS5hbW91bnQgOlxyXG4gICAgICAgIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgb3V0cHV0LnB1c2goe1xyXG4gICAgICBuYW1lOiBwcmVzZXRbaV0ucHJlc2V0TmFtZSxcclxuICAgICAgaW5mbzogem9uZUluZm8sXHJcbiAgICAgIGhlYWRlcjogcHJlc2V0W2ldLFxyXG4gICAgICBpbnN0cnVtZW50OiBpbnN0cnVtZW50XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHJldHVybiBvdXRwdXQ7XHJcbn07XHJcblxyXG4vKipcclxuICogQHBhcmFtIHtBcnJheS48T2JqZWN0Pn0gem9uZVxyXG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXhcclxuICogQHJldHVybnMge3tnZW5lcmF0b3I6IE9iamVjdCwgZ2VuZXJhdG9ySW5mbzogQXJyYXkuPE9iamVjdD59fVxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cclxuUGFyc2VyLnByb3RvdHlwZS5jcmVhdGVJbnN0cnVtZW50R2VuZXJhdG9yXyA9IGZ1bmN0aW9uKHpvbmUsIGluZGV4KSB7XHJcbiAgdmFyIG1vZGdlbiA9IHRoaXMuY3JlYXRlQmFnTW9kR2VuXyhcclxuICAgIHpvbmUsXHJcbiAgICB6b25lW2luZGV4XS5pbnN0cnVtZW50R2VuZXJhdG9ySW5kZXgsXHJcbiAgICB6b25lW2luZGV4KzFdID8gem9uZVtpbmRleCsxXS5pbnN0cnVtZW50R2VuZXJhdG9ySW5kZXg6IHRoaXMuaW5zdHJ1bWVudFpvbmVHZW5lcmF0b3IubGVuZ3RoLFxyXG4gICAgdGhpcy5pbnN0cnVtZW50Wm9uZUdlbmVyYXRvclxyXG4gICk7XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBnZW5lcmF0b3I6IG1vZGdlbi5tb2RnZW4sXHJcbiAgICBnZW5lcmF0b3JJbmZvOiBtb2RnZW4ubW9kZ2VuSW5mb1xyXG4gIH07XHJcbn07XHJcblxyXG4vKipcclxuICogQHBhcmFtIHtBcnJheS48T2JqZWN0Pn0gem9uZVxyXG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXhcclxuICogQHJldHVybnMge3ttb2R1bGF0b3I6IE9iamVjdCwgbW9kdWxhdG9ySW5mbzogQXJyYXkuPE9iamVjdD59fVxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cclxuUGFyc2VyLnByb3RvdHlwZS5jcmVhdGVJbnN0cnVtZW50TW9kdWxhdG9yXyA9IGZ1bmN0aW9uKHpvbmUsIGluZGV4KSB7XHJcbiAgdmFyIG1vZGdlbiA9IHRoaXMuY3JlYXRlQmFnTW9kR2VuXyhcclxuICAgIHpvbmUsXHJcbiAgICB6b25lW2luZGV4XS5wcmVzZXRNb2R1bGF0b3JJbmRleCxcclxuICAgIHpvbmVbaW5kZXgrMV0gPyB6b25lW2luZGV4KzFdLmluc3RydW1lbnRNb2R1bGF0b3JJbmRleDogdGhpcy5pbnN0cnVtZW50Wm9uZU1vZHVsYXRvci5sZW5ndGgsXHJcbiAgICB0aGlzLmluc3RydW1lbnRab25lTW9kdWxhdG9yXHJcbiAgKTtcclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIG1vZHVsYXRvcjogbW9kZ2VuLm1vZGdlbixcclxuICAgIG1vZHVsYXRvckluZm86IG1vZGdlbi5tb2RnZW5JbmZvXHJcbiAgfTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBAcGFyYW0ge0FycmF5LjxPYmplY3Q+fSB6b25lXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleFxyXG4gKiBAcmV0dXJucyB7e2dlbmVyYXRvcjogT2JqZWN0LCBnZW5lcmF0b3JJbmZvOiBBcnJheS48T2JqZWN0Pn19XHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5QYXJzZXIucHJvdG90eXBlLmNyZWF0ZVByZXNldEdlbmVyYXRvcl8gPSBmdW5jdGlvbih6b25lLCBpbmRleCkge1xyXG4gIHZhciBtb2RnZW4gPSB0aGlzLmNyZWF0ZUJhZ01vZEdlbl8oXHJcbiAgICB6b25lLFxyXG4gICAgem9uZVtpbmRleF0ucHJlc2V0R2VuZXJhdG9ySW5kZXgsXHJcbiAgICB6b25lW2luZGV4KzFdID8gem9uZVtpbmRleCsxXS5wcmVzZXRHZW5lcmF0b3JJbmRleCA6IHRoaXMucHJlc2V0Wm9uZUdlbmVyYXRvci5sZW5ndGgsXHJcbiAgICB0aGlzLnByZXNldFpvbmVHZW5lcmF0b3JcclxuICApO1xyXG5cclxuICByZXR1cm4ge1xyXG4gICAgZ2VuZXJhdG9yOiBtb2RnZW4ubW9kZ2VuLFxyXG4gICAgZ2VuZXJhdG9ySW5mbzogbW9kZ2VuLm1vZGdlbkluZm9cclxuICB9O1xyXG59O1xyXG5cclxuICAvKipcclxuICAgKiBAcGFyYW0ge0FycmF5LjxPYmplY3Q+fSB6b25lXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XHJcbiAgICogQHJldHVybnMge3ttb2R1bGF0b3I6IE9iamVjdCwgbW9kdWxhdG9ySW5mbzogQXJyYXkuPE9iamVjdD59fVxyXG4gICAqIEBwcml2YXRlXHJcbiAgICovXHJcblBhcnNlci5wcm90b3R5cGUuY3JlYXRlUHJlc2V0TW9kdWxhdG9yXyA9IGZ1bmN0aW9uKHpvbmUsIGluZGV4KSB7XHJcbiAgLyoqIEB0eXBlIHt7bW9kZ2VuOiBPYmplY3QsIG1vZGdlbkluZm86IEFycmF5LjxPYmplY3Q+fX0gKi9cclxuICB2YXIgbW9kZ2VuID0gdGhpcy5jcmVhdGVCYWdNb2RHZW5fKFxyXG4gICAgem9uZSxcclxuICAgIHpvbmVbaW5kZXhdLnByZXNldE1vZHVsYXRvckluZGV4LFxyXG4gICAgem9uZVtpbmRleCsxXSA/IHpvbmVbaW5kZXgrMV0ucHJlc2V0TW9kdWxhdG9ySW5kZXggOiB0aGlzLnByZXNldFpvbmVNb2R1bGF0b3IubGVuZ3RoLFxyXG4gICAgdGhpcy5wcmVzZXRab25lTW9kdWxhdG9yXHJcbiAgKTtcclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIG1vZHVsYXRvcjogbW9kZ2VuLm1vZGdlbixcclxuICAgIG1vZHVsYXRvckluZm86IG1vZGdlbi5tb2RnZW5JbmZvXHJcbiAgfTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBAcGFyYW0ge0FycmF5LjxPYmplY3Q+fSB6b25lXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleFN0YXJ0XHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleEVuZFxyXG4gKiBAcGFyYW0gem9uZU1vZEdlblxyXG4gKiBAcmV0dXJucyB7e21vZGdlbjogT2JqZWN0LCBtb2RnZW5JbmZvOiBBcnJheS48T2JqZWN0Pn19XHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5QYXJzZXIucHJvdG90eXBlLmNyZWF0ZUJhZ01vZEdlbl8gPSBmdW5jdGlvbih6b25lLCBpbmRleFN0YXJ0LCBpbmRleEVuZCwgem9uZU1vZEdlbikge1xyXG4gIC8qKiBAdHlwZSB7QXJyYXkuPE9iamVjdD59ICovXHJcbiAgdmFyIG1vZGdlbkluZm8gPSBbXTtcclxuICAvKiogQHR5cGUge09iamVjdH0gKi9cclxuICB2YXIgbW9kZ2VuID0ge1xyXG4gICAgdW5rbm93bjogW10sXHJcbiAgICAna2V5UmFuZ2UnOiB7XHJcbiAgICAgIGhpOiAxMjcsXHJcbiAgICAgIGxvOiAwXHJcbiAgICB9XHJcbiAgfTsgLy8gVE9ET1xyXG4gIC8qKiBAdHlwZSB7T2JqZWN0fSAqL1xyXG4gIHZhciBpbmZvO1xyXG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gIHZhciBpO1xyXG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gIHZhciBpbDtcclxuXHJcbiAgZm9yIChpID0gaW5kZXhTdGFydCwgaWwgPSBpbmRleEVuZDsgaSA8IGlsOyArK2kpIHtcclxuICAgIGluZm8gPSB6b25lTW9kR2VuW2ldO1xyXG4gICAgbW9kZ2VuSW5mby5wdXNoKGluZm8pO1xyXG5cclxuICAgIGlmIChpbmZvLnR5cGUgPT09ICd1bmtub3duJykge1xyXG4gICAgICBtb2RnZW4udW5rbm93bi5wdXNoKGluZm8udmFsdWUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbW9kZ2VuW2luZm8udHlwZV0gPSBpbmZvLnZhbHVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIG1vZGdlbjogbW9kZ2VuLFxyXG4gICAgbW9kZ2VuSW5mbzogbW9kZ2VuSW5mb1xyXG4gIH07XHJcbn07XHJcblxyXG5cclxuLyoqXHJcbiAqIEB0eXBlIHtBcnJheS48c3RyaW5nPn1cclxuICogQGNvbnN0XHJcbiAqL1xyXG5QYXJzZXIuR2VuZXJhdG9yRW51bWVyYXRvclRhYmxlID0gW1xyXG4gICdzdGFydEFkZHJzT2Zmc2V0JyxcclxuICAnZW5kQWRkcnNPZmZzZXQnLFxyXG4gICdzdGFydGxvb3BBZGRyc09mZnNldCcsXHJcbiAgJ2VuZGxvb3BBZGRyc09mZnNldCcsXHJcbiAgJ3N0YXJ0QWRkcnNDb2Fyc2VPZmZzZXQnLFxyXG4gICdtb2RMZm9Ub1BpdGNoJyxcclxuICAndmliTGZvVG9QaXRjaCcsXHJcbiAgJ21vZEVudlRvUGl0Y2gnLFxyXG4gICdpbml0aWFsRmlsdGVyRmMnLFxyXG4gICdpbml0aWFsRmlsdGVyUScsXHJcbiAgJ21vZExmb1RvRmlsdGVyRmMnLFxyXG4gICdtb2RFbnZUb0ZpbHRlckZjJyxcclxuICAnZW5kQWRkcnNDb2Fyc2VPZmZzZXQnLFxyXG4gICdtb2RMZm9Ub1ZvbHVtZScsXHJcbiAgLCAvLyAxNFxyXG4gICdjaG9ydXNFZmZlY3RzU2VuZCcsXHJcbiAgJ3JldmVyYkVmZmVjdHNTZW5kJyxcclxuICAncGFuJyxcclxuICAsLCwgLy8gMTgsMTksMjBcclxuICAnZGVsYXlNb2RMRk8nLFxyXG4gICdmcmVxTW9kTEZPJyxcclxuICAnZGVsYXlWaWJMRk8nLFxyXG4gICdmcmVxVmliTEZPJyxcclxuICAnZGVsYXlNb2RFbnYnLFxyXG4gICdhdHRhY2tNb2RFbnYnLFxyXG4gICdob2xkTW9kRW52JyxcclxuICAnZGVjYXlNb2RFbnYnLFxyXG4gICdzdXN0YWluTW9kRW52JyxcclxuICAncmVsZWFzZU1vZEVudicsXHJcbiAgJ2tleW51bVRvTW9kRW52SG9sZCcsXHJcbiAgJ2tleW51bVRvTW9kRW52RGVjYXknLFxyXG4gICdkZWxheVZvbEVudicsXHJcbiAgJ2F0dGFja1ZvbEVudicsXHJcbiAgJ2hvbGRWb2xFbnYnLFxyXG4gICdkZWNheVZvbEVudicsXHJcbiAgJ3N1c3RhaW5Wb2xFbnYnLFxyXG4gICdyZWxlYXNlVm9sRW52JyxcclxuICAna2V5bnVtVG9Wb2xFbnZIb2xkJyxcclxuICAna2V5bnVtVG9Wb2xFbnZEZWNheScsXHJcbiAgJ2luc3RydW1lbnQnLFxyXG4gICwgLy8gNDJcclxuICAna2V5UmFuZ2UnLFxyXG4gICd2ZWxSYW5nZScsXHJcbiAgJ3N0YXJ0bG9vcEFkZHJzQ29hcnNlT2Zmc2V0JyxcclxuICAna2V5bnVtJyxcclxuICAndmVsb2NpdHknLFxyXG4gICdpbml0aWFsQXR0ZW51YXRpb24nLFxyXG4gICwgLy8gNDlcclxuICAnZW5kbG9vcEFkZHJzQ29hcnNlT2Zmc2V0JyxcclxuICAnY29hcnNlVHVuZScsXHJcbiAgJ2ZpbmVUdW5lJyxcclxuICAnc2FtcGxlSUQnLFxyXG4gICdzYW1wbGVNb2RlcycsXHJcbiAgLCAvLyA1NVxyXG4gICdzY2FsZVR1bmluZycsXHJcbiAgJ2V4Y2x1c2l2ZUNsYXNzJyxcclxuICAnb3ZlcnJpZGluZ1Jvb3RLZXknXHJcbl07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBQYXJzZXJcclxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvc2YyLmpzXG4gKiovIiwiY29uc3QgUmlmZiA9IHt9O1xyXG5cclxuLyoqXHJcbiAqIEBwYXJhbSB7Qnl0ZUFycmF5fSBpbnB1dCBpbnB1dCBidWZmZXIuXHJcbiAqIEBwYXJhbSB7T2JqZWN0PX0gb3B0X3BhcmFtcyBvcHRpb24gcGFyYW1ldGVycy5cclxuICogQGNvbnN0cnVjdG9yXHJcbiAqL1xyXG5SaWZmLlBhcnNlciA9IGZ1bmN0aW9uKGlucHV0LCBvcHRfcGFyYW1zKSB7XHJcbiAgb3B0X3BhcmFtcyA9IG9wdF9wYXJhbXMgfHwge307XHJcbiAgLyoqIEB0eXBlIHtCeXRlQXJyYXl9ICovXHJcbiAgdGhpcy5pbnB1dCA9IGlucHV0O1xyXG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gIHRoaXMuaXAgPSBvcHRfcGFyYW1zWydpbmRleCddIHx8IDA7XHJcbiAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgdGhpcy5sZW5ndGggPSBvcHRfcGFyYW1zWydsZW5ndGgnXSB8fCBpbnB1dC5sZW5ndGggLSB0aGlzLmlwO1xyXG4gIC8qKiBAdHlwZSB7QXJyYXkuPFJpZmYuQ2h1bms+fSAqL1xyXG4gIHRoaXMuY2h1bmtMaXN0O1xyXG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gIHRoaXMub2Zmc2V0ID0gdGhpcy5pcDtcclxuICAvKiogQHR5cGUge2Jvb2xlYW59ICovXHJcbiAgdGhpcy5wYWRkaW5nID1cclxuICAgIG9wdF9wYXJhbXNbJ3BhZGRpbmcnXSAhPT0gdm9pZCAwID8gb3B0X3BhcmFtc1sncGFkZGluZyddIDogdHJ1ZTtcclxuICAvKiogQHR5cGUge2Jvb2xlYW59ICovXHJcbiAgdGhpcy5iaWdFbmRpYW4gPVxyXG4gICAgb3B0X3BhcmFtc1snYmlnRW5kaWFuJ10gIT09IHZvaWQgMCA/IG9wdF9wYXJhbXNbJ2JpZ0VuZGlhbiddIDogZmFsc2U7XHJcbn07XHJcblxyXG4vKipcclxuICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcclxuICogQHBhcmFtIHtudW1iZXJ9IHNpemVcclxuICogQHBhcmFtIHtudW1iZXJ9IG9mZnNldFxyXG4gKiBAY29uc3RydWN0b3JcclxuICovXHJcblJpZmYuQ2h1bmsgPSBmdW5jdGlvbih0eXBlLCBzaXplLCBvZmZzZXQpIHtcclxuICAvKiogQHR5cGUge3N0cmluZ30gKi9cclxuICB0aGlzLnR5cGUgPSB0eXBlO1xyXG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gIHRoaXMuc2l6ZSA9IHNpemU7XHJcbiAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgdGhpcy5vZmZzZXQgPSBvZmZzZXQ7XHJcbn07XHJcblxyXG5SaWZmLlBhcnNlci5wcm90b3R5cGUucGFyc2UgPSBmdW5jdGlvbigpIHtcclxuICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICB2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGggKyB0aGlzLm9mZnNldDtcclxuXHJcbiAgdGhpcy5jaHVua0xpc3QgPSBbXTtcclxuXHJcbiAgd2hpbGUgKHRoaXMuaXAgPCBsZW5ndGgpIHtcclxuICAgIHRoaXMucGFyc2VDaHVuaygpO1xyXG4gIH1cclxufTtcclxuXHJcblJpZmYuUGFyc2VyLnByb3RvdHlwZS5wYXJzZUNodW5rID0gZnVuY3Rpb24oKSB7XHJcbiAgLyoqIEB0eXBlIHtCeXRlQXJyYXl9ICovXHJcbiAgdmFyIGlucHV0ID0gdGhpcy5pbnB1dDtcclxuICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICB2YXIgaXAgPSB0aGlzLmlwO1xyXG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gIHZhciBzaXplO1xyXG5cclxuICB0aGlzLmNodW5rTGlzdC5wdXNoKG5ldyBSaWZmLkNodW5rKFxyXG4gICAgU3RyaW5nLmZyb21DaGFyQ29kZShpbnB1dFtpcCsrXSwgaW5wdXRbaXArK10sIGlucHV0W2lwKytdLCBpbnB1dFtpcCsrXSksXHJcbiAgICAoc2l6ZSA9IHRoaXMuYmlnRW5kaWFuID9cclxuICAgICAgICgoaW5wdXRbaXArK10gPDwgMjQpIHwgKGlucHV0W2lwKytdIDw8IDE2KSB8XHJcbiAgICAgICAgKGlucHV0W2lwKytdIDw8ICA4KSB8IChpbnB1dFtpcCsrXSAgICAgICkpID4+PiAwIDpcclxuICAgICAgICgoaW5wdXRbaXArK10gICAgICApIHwgKGlucHV0W2lwKytdIDw8ICA4KSB8XHJcbiAgICAgICAgKGlucHV0W2lwKytdIDw8IDE2KSB8IChpbnB1dFtpcCsrXSA8PCAyNCkpID4+PiAwXHJcbiAgICApLFxyXG4gICAgaXBcclxuICApKTtcclxuXHJcbiAgaXAgKz0gc2l6ZTtcclxuXHJcbiAgLy8gcGFkZGluZ1xyXG4gIGlmICh0aGlzLnBhZGRpbmcgJiYgKChpcCAtIHRoaXMub2Zmc2V0KSAmIDEpID09PSAxKSB7XHJcbiAgICBpcCsrO1xyXG4gIH1cclxuXHJcbiAgdGhpcy5pcCA9IGlwO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBjaHVuayBpbmRleC5cclxuICogQHJldHVybiB7P1JpZmYuQ2h1bmt9XHJcbiAqL1xyXG5SaWZmLlBhcnNlci5wcm90b3R5cGUuZ2V0Q2h1bmsgPSBmdW5jdGlvbihpbmRleCkge1xyXG4gIC8qKiBAdHlwZSB7UmlmZi5DaHVua30gKi9cclxuICB2YXIgY2h1bmsgPSB0aGlzLmNodW5rTGlzdFtpbmRleF07XHJcblxyXG4gIGlmIChjaHVuayA9PT0gdm9pZCAwKSB7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIHJldHVybiBjaHVuaztcclxufTtcclxuXHJcbi8qKlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9XHJcbiAqL1xyXG5SaWZmLlBhcnNlci5wcm90b3R5cGUuZ2V0TnVtYmVyT2ZDaHVua3MgPSBmdW5jdGlvbigpIHtcclxuICByZXR1cm4gdGhpcy5jaHVua0xpc3QubGVuZ3RoO1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBSaWZmXHJcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL3JpZmYuanNcbiAqKi8iLCJpbXBvcnQgU3ludGhlc2l6ZXIgZnJvbSBcIi4vc291bmRfZm9udF9zeW50aFwiXHJcblxyXG4vKipcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqL1xyXG5jb25zdCBXZWJNaWRpTGluayA9IGZ1bmN0aW9uKCkge1xyXG4gIC8qKiBAdHlwZSB7QXJyYXkuPG51bWJlcj59ICovXHJcbiAgdGhpcy5ScG5Nc2IgPSBbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMF07XHJcbiAgLyoqIEB0eXBlIHtBcnJheS48bnVtYmVyPn0gKi9cclxuICB0aGlzLlJwbkxzYiA9IFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwXTtcclxuICAvKiogQHR5cGUge2Jvb2xlYW59ICovXHJcbiAgdGhpcy5yZWFkeTtcclxuICAvKiogQHR5cGUge1N5bnRoZXNpemVyfSAqL1xyXG4gIHRoaXMuc3ludGg7XHJcbiAgLyoqIEB0eXBlIHtmdW5jdGlvbihBcnJheUJ1ZmZlcil9ICovXHJcbiAgdGhpcy5sb2FkQ2FsbGJhY2s7XHJcbiAgLyoqIEB0eXBlIHtGdW5jdGlvbn0gKi9cclxuICB0aGlzLm1lc3NhZ2VIYW5kbGVyID0gdGhpcy5vbm1lc3NhZ2UuYmluZCh0aGlzKTtcclxuXHJcbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmdW5jdGlvbigpIHtcclxuICAgIHRoaXMucmVhZHkgPSB0cnVlO1xyXG4gIH0uYmluZCh0aGlzKSwgZmFsc2UpO1xyXG59O1xyXG5cclxuV2ViTWlkaUxpbmsucHJvdG90eXBlLnNldHVwID0gZnVuY3Rpb24odXJsKSB7XHJcbiAgaWYgKCF0aGlzLnJlYWR5KSB7XHJcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGZ1bmN0aW9uIG9ubG9hZCgpIHtcclxuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBvbmxvYWQsIGZhbHNlKTtcclxuICAgICAgdGhpcy5sb2FkKHVybCk7XHJcbiAgICB9LmJpbmQodGhpcyksIGZhbHNlKTtcclxuICB9IGVsc2Uge1xyXG4gICAgdGhpcy5sb2FkKHVybCk7XHJcbiAgfVxyXG59O1xyXG5cclxuV2ViTWlkaUxpbmsucHJvdG90eXBlLmxvYWQgPSBmdW5jdGlvbih1cmwpIHtcclxuICAvKiogQHR5cGUge1hNTEh0dHBSZXF1ZXN0fSAqL1xyXG4gIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcclxuXHJcbiAgeGhyLm9wZW4oJ0dFVCcsIHVybCwgdHJ1ZSk7XHJcbiAgeGhyLnJlc3BvbnNlVHlwZSA9ICdhcnJheWJ1ZmZlcic7XHJcblxyXG4gIHhoci5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgZnVuY3Rpb24oZXYpIHtcclxuICAgIC8qKiBAdHlwZSB7WE1MSHR0cFJlcXVlc3R9ICovXHJcbiAgICB2YXIgeGhyID0gZXYudGFyZ2V0O1xyXG5cclxuICAgIHRoaXMub25sb2FkKHhoci5yZXNwb25zZSk7XHJcbiAgICBpZiAodHlwZW9mIHRoaXMubG9hZENhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIHRoaXMubG9hZENhbGxiYWNrKHhoci5yZXNwb25zZSk7XHJcbiAgICB9XHJcbiAgfS5iaW5kKHRoaXMpLCBmYWxzZSk7XHJcblxyXG4gIHhoci5zZW5kKCk7XHJcbn07XHJcblxyXG4vKipcclxuICogQHBhcmFtIHtBcnJheUJ1ZmZlcn0gcmVzcG9uc2VcclxuICovXHJcbldlYk1pZGlMaW5rLnByb3RvdHlwZS5vbmxvYWQgPSBmdW5jdGlvbihyZXNwb25zZSkge1xyXG4gIC8qKiBAdHlwZSB7VWludDhBcnJheX0gKi9cclxuICB2YXIgaW5wdXQgPSBuZXcgVWludDhBcnJheShyZXNwb25zZSk7XHJcblxyXG4gIHRoaXMubG9hZFNvdW5kRm9udChpbnB1dCk7XHJcbn07XHJcblxyXG4vKipcclxuICogQHBhcmFtIHtVaW50OEFycmF5fSBpbnB1dFxyXG4gKi9cclxuV2ViTWlkaUxpbmsucHJvdG90eXBlLmxvYWRTb3VuZEZvbnQgPSBmdW5jdGlvbihpbnB1dCkge1xyXG4gIC8qKiBAdHlwZSB7U3ludGhlc2l6ZXJ9ICovXHJcbiAgdmFyIHN5bnRoO1xyXG5cclxuICBpZiAoIXRoaXMuc3ludGgpIHtcclxuICAgIHN5bnRoID0gdGhpcy5zeW50aCA9IG5ldyBTeW50aGVzaXplcihpbnB1dCk7XHJcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHN5bnRoLmRyYXdTeW50aCgpKTtcclxuICAgIHN5bnRoLmluaXQoKTtcclxuICAgIHN5bnRoLnN0YXJ0KCk7XHJcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHRoaXMubWVzc2FnZUhhbmRsZXIsIGZhbHNlKTtcclxuICB9IGVsc2Uge1xyXG4gICAgc3ludGggPSB0aGlzLnN5bnRoO1xyXG4gICAgc3ludGgucmVmcmVzaEluc3RydW1lbnRzKGlucHV0KTtcclxuICB9XHJcblxyXG4gIC8vIGxpbmsgcmVhZHlcclxuICBpZiAod2luZG93Lm9wZW5lcikge1xyXG4gICAgd2luZG93Lm9wZW5lci5wb3N0TWVzc2FnZShcImxpbmsscmVhZHlcIiwgJyonKTtcclxuICB9IGVsc2UgaWYgKHdpbmRvdy5wYXJlbnQgIT09IHdpbmRvdykge1xyXG4gICAgd2luZG93LnBhcmVudC5wb3N0TWVzc2FnZShcImxpbmsscmVhZHlcIiwgJyonKTtcclxuICB9XHJcbn07XHJcblxyXG4vKipcclxuICogQHBhcmFtIHtFdmVudH0gZXZcclxuICovXHJcbldlYk1pZGlMaW5rLnByb3RvdHlwZS5vbm1lc3NhZ2UgPSBmdW5jdGlvbihldikge1xyXG4gIHZhciBtc2cgPSBldi5kYXRhLnNwbGl0KCcsJyk7XHJcbiAgdmFyIHR5cGUgPSBtc2cuc2hpZnQoKTtcclxuICB2YXIgY29tbWFuZDtcclxuXHJcbiAgc3dpdGNoICh0eXBlKSB7XHJcbiAgICBjYXNlICdtaWRpJzpcclxuICAgICAgdGhpcy5wcm9jZXNzTWlkaU1lc3NhZ2UoXHJcbiAgICAgICAgbXNnLm1hcChmdW5jdGlvbihoZXgpIHtcclxuICAgICAgICAgIHJldHVybiBwYXJzZUludChoZXgsIDE2KTtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgICBicmVhaztcclxuICAgIGNhc2UgJ2xpbmsnOlxyXG4gICAgICBjb21tYW5kID0gbXNnLnNoaWZ0KCk7XHJcbiAgICAgIHN3aXRjaCAoY29tbWFuZCkge1xyXG4gICAgICAgIGNhc2UgJ3JlcXBhdGNoJzpcclxuICAgICAgICAgIC8vIFRPRE86IGR1bW15IGRhdGFcclxuICAgICAgICAgIGlmICh3aW5kb3cub3BlbmVyKSB7XHJcbiAgICAgICAgICAgIHdpbmRvdy5vcGVuZXIucG9zdE1lc3NhZ2UoXCJsaW5rLHBhdGNoXCIsICcqJyk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKHdpbmRvdy5wYXJlbnQgIT09IHdpbmRvdykge1xyXG4gICAgICAgICAgICB3aW5kb3cucGFyZW50LnBvc3RNZXNzYWdlKFwibGluayxwYXRjaFwiLCAnKicpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAnc2V0cGF0Y2gnOlxyXG4gICAgICAgICAgLy8gVE9ETzogTk9QXHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgY29uc29sZS5lcnJvcigndW5rbm93biBsaW5rIG1lc3NhZ2U6JywgY29tbWFuZCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBicmVhaztcclxuICAgIGRlZmF1bHQ6XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ3Vua25vd24gbWVzc2FnZSB0eXBlJyk7XHJcbiAgfVxyXG59O1xyXG5cclxuLyoqXHJcbiAqIEBwYXJhbSB7ZnVuY3Rpb24oQXJyYXlCdWZmZXIpfSBjYWxsYmFja1xyXG4gKi9cclxuV2ViTWlkaUxpbmsucHJvdG90eXBlLnNldExvYWRDYWxsYmFjayA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XHJcbiAgdGhpcy5sb2FkQ2FsbGJhY2sgPSBjYWxsYmFjaztcclxufTtcclxuXHJcbi8qKlxyXG4gKiBAcGFyYW0ge0FycmF5LjxudW1iZXI+fSBtZXNzYWdlXHJcbiAqL1xyXG5XZWJNaWRpTGluay5wcm90b3R5cGUucHJvY2Vzc01pZGlNZXNzYWdlID0gZnVuY3Rpb24obWVzc2FnZSkge1xyXG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gIHZhciBjaGFubmVsID0gbWVzc2FnZVswXSAmIDB4MGY7XHJcbiAgLyoqIEB0eXBlIHtTeW50aGVzaXplcn0gKi9cclxuICB2YXIgc3ludGggPSB0aGlzLnN5bnRoO1xyXG5cclxuICBzd2l0Y2ggKG1lc3NhZ2VbMF0gJiAweGYwKSB7XHJcbiAgICBjYXNlIDB4ODA6IC8vIE5vdGVPZmY6IDhuIGtrIHZ2XHJcbiAgICAgIHN5bnRoLm5vdGVPZmYoY2hhbm5lbCwgbWVzc2FnZVsxXSwgbWVzc2FnZVsyXSk7XHJcbiAgICAgIGJyZWFrO1xyXG4gICAgY2FzZSAweDkwOiAvLyBOb3RlT246IDluIGtrIHZ2XHJcbiAgICAgIGlmIChtZXNzYWdlWzJdID4gMCkge1xyXG4gICAgICAgIHN5bnRoLm5vdGVPbihjaGFubmVsLCBtZXNzYWdlWzFdLCBtZXNzYWdlWzJdKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBzeW50aC5ub3RlT2ZmKGNoYW5uZWwsIG1lc3NhZ2VbMV0sIDApO1xyXG4gICAgICB9XHJcbiAgICAgIGJyZWFrO1xyXG4gICAgY2FzZSAweEIwOiAvLyBDb250cm9sIENoYW5nZTogQm4gY2MgZGRcclxuICAgICAgc3dpdGNoIChtZXNzYWdlWzFdKSB7XHJcbiAgICAgICAgY2FzZSAweDA2OiAvLyBEYXRhIEVudHJ5OiBCbiAwNiBkZFxyXG4gICAgICAgICAgc3dpdGNoICh0aGlzLlJwbk1zYltjaGFubmVsXSkge1xyXG4gICAgICAgICAgICBjYXNlIDA6XHJcbiAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLlJwbkxzYltjaGFubmVsXSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAwOiAvLyBQaXRjaCBCZW5kIFNlbnNpdGl2aXR5XHJcbiAgICAgICAgICAgICAgICAgIHN5bnRoLnBpdGNoQmVuZFNlbnNpdGl2aXR5KGNoYW5uZWwsIG1lc3NhZ2VbMl0pO1xyXG4gICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIDB4MDc6IC8vIFZvbHVtZSBDaGFuZ2U6IEJuIDA3IGRkXHJcbiAgICAgICAgICBzeW50aC52b2x1bWVDaGFuZ2UoY2hhbm5lbCwgbWVzc2FnZVsyXSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIDB4MEE6IC8vIFBhbnBvdCBDaGFuZ2U6IEJuIDBBIGRkXHJcbiAgICAgICAgICBzeW50aC5wYW5wb3RDaGFuZ2UoY2hhbm5lbCwgbWVzc2FnZVsyXSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIDB4Nzg6IC8vIEFsbCBTb3VuZCBPZmY6IEJuIDc4IDAwXHJcbiAgICAgICAgICBzeW50aC5hbGxTb3VuZE9mZihjaGFubmVsKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgMHg3OTogLy8gUmVzZXQgQWxsIENvbnRyb2w6IEJuIDc5IDAwXHJcbiAgICAgICAgICBzeW50aC5yZXNldEFsbENvbnRyb2woY2hhbm5lbCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIDB4MjA6IC8vIEJhbmtTZWxlY3RcclxuICAgICAgICAgIC8vY29uc29sZS5sb2coXCJiYW5rc2VsZWN0OlwiLCBjaGFubmVsLCBtZXNzYWdlWzJdKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgMHg2NDogLy8gUlBOIE1TQlxyXG4gICAgICAgICAgdGhpcy5ScG5Nc2JbY2hhbm5lbF0gPSBtZXNzYWdlWzJdO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAweDY1OiAvLyBSUE4gTFNCXHJcbiAgICAgICAgICB0aGlzLlJwbkxzYltjaGFubmVsXSA9IG1lc3NhZ2VbMl07XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgIC8vIG5vdCBzdXBwb3J0ZWRcclxuICAgICAgfVxyXG4gICAgICBicmVhaztcclxuICAgIGNhc2UgMHhDMDogLy8gUHJvZ3JhbSBDaGFuZ2U6IENuIHBwXHJcbiAgICAgIHN5bnRoLnByb2dyYW1DaGFuZ2UoY2hhbm5lbCwgbWVzc2FnZVsxXSk7XHJcbiAgICAgIGJyZWFrO1xyXG4gICAgY2FzZSAweEUwOiAvLyBQaXRjaCBCZW5kXHJcbiAgICAgIHN5bnRoLnBpdGNoQmVuZChjaGFubmVsLCBtZXNzYWdlWzFdLCBtZXNzYWdlWzJdKTtcclxuICAgICAgYnJlYWs7XHJcbiAgICBjYXNlIDB4ZjA6IC8vIFN5c3RlbSBFeGNsdXNpdmUgTWVzc2FnZVxyXG4gICAgICAvLyBJRCBudW1iZXJcclxuICAgICAgc3dpdGNoIChtZXNzYWdlWzFdKSB7XHJcbiAgICAgICAgY2FzZSAweDdlOiAvLyBub24tcmVhbHRpbWVcclxuICAgICAgICAgIC8vIFRPRE9cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgMHg3ZjogLy8gcmVhbHRpbWVcclxuICAgICAgICAgIHZhciBkZXZpY2UgPSBtZXNzYWdlWzJdO1xyXG4gICAgICAgICAgLy8gc3ViIElEIDFcclxuICAgICAgICAgIHN3aXRjaCAobWVzc2FnZVszXSkge1xyXG4gICAgICAgICAgICBjYXNlIDB4MDQ6IC8vIGRldmljZSBjb250cm9sXHJcbiAgICAgICAgICAgICAgLy8gc3ViIElEIDJcclxuICAgICAgICAgICAgICBzd2l0Y2ggKG1lc3NhZ2VbNF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMHgwMTogLy8gbWFzdGVyIHZvbHVtZVxyXG4gICAgICAgICAgICAgICAgICBzeW50aC5zZXRNYXN0ZXJWb2x1bWUobWVzc2FnZVs1XSArIChtZXNzYWdlWzZdIDw8IDcpKTtcclxuICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgYnJlYWs7XHJcbiAgICBkZWZhdWx0OiAvLyBub3Qgc3VwcG9ydGVkXHJcbiAgICAgIGJyZWFrO1xyXG4gIH1cclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IFdlYk1pZGlMaW5rXHJcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL3dtbC5qc1xuICoqLyIsImltcG9ydCBTeW50aGVzaXplck5vdGUgZnJvbSBcIi4vc291bmRfZm9udF9zeW50aF9ub3RlXCJcclxuaW1wb3J0IFBhcnNlciBmcm9tIFwiLi9zZjJcIlxyXG5cclxuLyoqXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKi9cclxuY29uc3QgU3ludGhlc2l6ZXIgPSBmdW5jdGlvbihpbnB1dCkge1xyXG4gIC8qKiBAdHlwZSB7VWludDhBcnJheX0gKi9cclxuICB0aGlzLmlucHV0ID0gaW5wdXQ7XHJcbiAgLyoqIEB0eXBlIHtQYXJzZXJ9ICovXHJcbiAgdGhpcy5wYXJzZXI7XHJcbiAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgdGhpcy5iYW5rID0gMDtcclxuICAvKiogQHR5cGUge0FycmF5LjxBcnJheS48T2JqZWN0Pj59ICovXHJcbiAgdGhpcy5iYW5rU2V0O1xyXG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gIHRoaXMuYnVmZmVyU2l6ZSA9IDEwMjQ7XHJcbiAgLyoqIEB0eXBlIHtBdWRpb0NvbnRleHR9ICovXHJcbiAgdGhpcy5jdHggPSB0aGlzLmdldEF1ZGlvQ29udGV4dCgpO1xyXG4gIC8qKiBAdHlwZSB7QXVkaW9HYWluTm9kZX0gKi9cclxuICB0aGlzLmdhaW5NYXN0ZXIgPSB0aGlzLmN0eC5jcmVhdGVHYWluTm9kZSgpO1xyXG4gIC8qKiBAdHlwZSB7RHluYW1pY3NDb21wcmVzc29yTm9kZX0gKi9cclxuICB0aGlzLmNvbXByZXNzb3IgPSB0aGlzLmN0eC5jcmVhdGVEeW5hbWljc0NvbXByZXNzb3IoKTtcclxuICAvKiogQHR5cGUge0F1ZGlvQnVmZmVyU291cmNlTm9kZX0gKi9cclxuICB0aGlzLmJ1ZlNyYyA9IHRoaXMuY3R4LmNyZWF0ZUJ1ZmZlclNvdXJjZSgpO1xyXG4gIC8qKiBAdHlwZSB7QXJyYXkuPG51bWJlcj59ICovXHJcbiAgdGhpcy5jaGFubmVsSW5zdHJ1bWVudCA9XHJcbiAgICBbMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgMCwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNV07XHJcbiAgLyoqIEB0eXBlIHtBcnJheS48bnVtYmVyPn0gKi9cclxuICB0aGlzLmNoYW5uZWxWb2x1bWUgPVxyXG4gICAgWzEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDFdO1xyXG4gIC8qKiBAdHlwZSB7QXJyYXkuPG51bWJlcj59ICovXHJcbiAgdGhpcy5jaGFubmVsUGFucG90ID1cclxuICAgIFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwXTtcclxuICAvKiogQHR5cGUge0FycmF5LjxudW1iZXI+fSAqL1xyXG4gIHRoaXMuY2hhbm5lbFBpdGNoQmVuZCA9XHJcbiAgICBbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMF07XHJcbiAgdGhpcy5jaGFubmVsUGl0Y2hCZW5kU2Vuc2l0aXZpdHkgPVxyXG4gICAgWzAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDBdO1xyXG4gIC8qKiBAdHlwZSB7QXJyYXkuPEFycmF5LjxTeW50aGVzaXplck5vdGU+Pn0gKi9cclxuICB0aGlzLmN1cnJlbnROb3RlT24gPSBbXHJcbiAgICBbXSwgW10sIFtdLCBbXSwgW10sIFtdLCBbXSwgW10sXHJcbiAgICBbXSwgW10sIFtdLCBbXSwgW10sIFtdLCBbXSwgW11cclxuICBdO1xyXG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gIHRoaXMuYmFzZVZvbHVtZSA9IDEgLyAweDgwMDA7XHJcbiAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgdGhpcy5tYXN0ZXJWb2x1bWUgPSAxNjM4NDtcclxuXHJcbiAgLyoqIEB0eXBlIHtIVE1MVGFibGVFbGVtZW50fSAqL1xyXG4gIHRoaXMudGFibGU7XHJcbn07XHJcbi8qKlxyXG4gKiBAcmV0dXJucyB7QXVkaW9Db250ZXh0fVxyXG4gKi9cclxuU3ludGhlc2l6ZXIucHJvdG90eXBlLmdldEF1ZGlvQ29udGV4dCA9IGZ1bmN0aW9uKCkge1xyXG4gIC8qKiBAdHlwZSB7QXVkaW9Db250ZXh0fSAqL1xyXG4gIHZhciBjdHg7XHJcblxyXG4gIGlmIChBdWRpb0NvbnRleHQgIT09IHZvaWQgMCkge1xyXG4gICAgY3R4ID0gbmV3IEF1ZGlvQ29udGV4dCgpO1xyXG4gIH0gZWxzZSBpZiAod2Via2l0QXVkaW9Db250ZXh0ICE9PSB2b2lkIDApIHtcclxuICAgIGN0eCA9IG5ldyB3ZWJraXRBdWRpb0NvbnRleHQoKTtcclxuICB9IGVsc2UgaWYgKG1vekF1ZGlvQ29udGV4dCAhPT0gdm9pZCAwKSB7XHJcbiAgICBjdHggPSBuZXcgbW96QXVkaW9Db250ZXh0KCk7XHJcbiAgfSBlbHNlIHtcclxuICAgIHRocm93IG5ldyBFcnJvcignV2ViIEF1ZGlvIG5vdCBzdXBwb3J0ZWQnKTtcclxuICB9XHJcblxyXG4gIGlmIChjdHguY3JlYXRlR2Fpbk5vZGUgPT09IHZvaWQgMCkge1xyXG4gICAgY3R4LmNyZWF0ZUdhaW5Ob2RlID0gY3R4LmNyZWF0ZUdhaW47XHJcbiAgfVxyXG5cclxuICByZXR1cm4gY3R4O1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIEB0eXBlIHtBcnJheS48c3RyaW5nPn1cclxuICogQGNvbnN0XHJcbiAqL1xyXG5TeW50aGVzaXplci5Qcm9ncmFtTmFtZXMgPSBbXHJcbiAgXCJBY291c3RpYyBQaWFub1wiLFxyXG4gIFwiQnJpZ2h0IFBpYW5vXCIsXHJcbiAgXCJFbGVjdHJpYyBHcmFuZCBQaWFub1wiLFxyXG4gIFwiSG9ua3ktdG9uayBQaWFub1wiLFxyXG4gIFwiRWxlY3RyaWMgUGlhbm9cIixcclxuICBcIkVsZWN0cmljIFBpYW5vIDJcIixcclxuICBcIkhhcnBzaWNob3JkXCIsXHJcbiAgXCJDbGF2aVwiLFxyXG4gIFwiQ2VsZXN0YVwiLFxyXG4gIFwiR2xvY2tlbnNwaWVsXCIsXHJcbiAgXCJNdXNpY2FsIGJveFwiLFxyXG4gIFwiVmlicmFwaG9uZVwiLFxyXG4gIFwiTWFyaW1iYVwiLFxyXG4gIFwiWHlsb3Bob25lXCIsXHJcbiAgXCJUdWJ1bGFyIEJlbGxcIixcclxuICBcIkR1bGNpbWVyXCIsXHJcbiAgXCJEcmF3YmFyIE9yZ2FuXCIsXHJcbiAgXCJQZXJjdXNzaXZlIE9yZ2FuXCIsXHJcbiAgXCJSb2NrIE9yZ2FuXCIsXHJcbiAgXCJDaHVyY2ggb3JnYW5cIixcclxuICBcIlJlZWQgb3JnYW5cIixcclxuICBcIkFjY29yZGlvblwiLFxyXG4gIFwiSGFybW9uaWNhXCIsXHJcbiAgXCJUYW5nbyBBY2NvcmRpb25cIixcclxuICBcIkFjb3VzdGljIEd1aXRhciAobnlsb24pXCIsXHJcbiAgXCJBY291c3RpYyBHdWl0YXIgKHN0ZWVsKVwiLFxyXG4gIFwiRWxlY3RyaWMgR3VpdGFyIChqYXp6KVwiLFxyXG4gIFwiRWxlY3RyaWMgR3VpdGFyIChjbGVhbilcIixcclxuICBcIkVsZWN0cmljIEd1aXRhciAobXV0ZWQpXCIsXHJcbiAgXCJPdmVyZHJpdmVuIEd1aXRhclwiLFxyXG4gIFwiRGlzdG9ydGlvbiBHdWl0YXJcIixcclxuICBcIkd1aXRhciBoYXJtb25pY3NcIixcclxuICBcIkFjb3VzdGljIEJhc3NcIixcclxuICBcIkVsZWN0cmljIEJhc3MgKGZpbmdlcilcIixcclxuICBcIkVsZWN0cmljIEJhc3MgKHBpY2spXCIsXHJcbiAgXCJGcmV0bGVzcyBCYXNzXCIsXHJcbiAgXCJTbGFwIEJhc3MgMVwiLFxyXG4gIFwiU2xhcCBCYXNzIDJcIixcclxuICBcIlN5bnRoIEJhc3MgMVwiLFxyXG4gIFwiU3ludGggQmFzcyAyXCIsXHJcbiAgXCJWaW9saW5cIixcclxuICBcIlZpb2xhXCIsXHJcbiAgXCJDZWxsb1wiLFxyXG4gIFwiRG91YmxlIGJhc3NcIixcclxuICBcIlRyZW1vbG8gU3RyaW5nc1wiLFxyXG4gIFwiUGl6emljYXRvIFN0cmluZ3NcIixcclxuICBcIk9yY2hlc3RyYWwgSGFycFwiLFxyXG4gIFwiVGltcGFuaVwiLFxyXG4gIFwiU3RyaW5nIEVuc2VtYmxlIDFcIixcclxuICBcIlN0cmluZyBFbnNlbWJsZSAyXCIsXHJcbiAgXCJTeW50aCBTdHJpbmdzIDFcIixcclxuICBcIlN5bnRoIFN0cmluZ3MgMlwiLFxyXG4gIFwiVm9pY2UgQWFoc1wiLFxyXG4gIFwiVm9pY2UgT29oc1wiLFxyXG4gIFwiU3ludGggVm9pY2VcIixcclxuICBcIk9yY2hlc3RyYSBIaXRcIixcclxuICBcIlRydW1wZXRcIixcclxuICBcIlRyb21ib25lXCIsXHJcbiAgXCJUdWJhXCIsXHJcbiAgXCJNdXRlZCBUcnVtcGV0XCIsXHJcbiAgXCJGcmVuY2ggaG9yblwiLFxyXG4gIFwiQnJhc3MgU2VjdGlvblwiLFxyXG4gIFwiU3ludGggQnJhc3MgMVwiLFxyXG4gIFwiU3ludGggQnJhc3MgMlwiLFxyXG4gIFwiU29wcmFubyBTYXhcIixcclxuICBcIkFsdG8gU2F4XCIsXHJcbiAgXCJUZW5vciBTYXhcIixcclxuICBcIkJhcml0b25lIFNheFwiLFxyXG4gIFwiT2JvZVwiLFxyXG4gIFwiRW5nbGlzaCBIb3JuXCIsXHJcbiAgXCJCYXNzb29uXCIsXHJcbiAgXCJDbGFyaW5ldFwiLFxyXG4gIFwiUGljY29sb1wiLFxyXG4gIFwiRmx1dGVcIixcclxuICBcIlJlY29yZGVyXCIsXHJcbiAgXCJQYW4gRmx1dGVcIixcclxuICBcIkJsb3duIEJvdHRsZVwiLFxyXG4gIFwiU2hha3VoYWNoaVwiLFxyXG4gIFwiV2hpc3RsZVwiLFxyXG4gIFwiT2NhcmluYVwiLFxyXG4gIFwiTGVhZCAxIChzcXVhcmUpXCIsXHJcbiAgXCJMZWFkIDIgKHNhd3Rvb3RoKVwiLFxyXG4gIFwiTGVhZCAzIChjYWxsaW9wZSlcIixcclxuICBcIkxlYWQgNCAoY2hpZmYpXCIsXHJcbiAgXCJMZWFkIDUgKGNoYXJhbmcpXCIsXHJcbiAgXCJMZWFkIDYgKHZvaWNlKVwiLFxyXG4gIFwiTGVhZCA3IChmaWZ0aHMpXCIsXHJcbiAgXCJMZWFkIDggKGJhc3MgKyBsZWFkKVwiLFxyXG4gIFwiUGFkIDEgKEZhbnRhc2lhKVwiLFxyXG4gIFwiUGFkIDIgKHdhcm0pXCIsXHJcbiAgXCJQYWQgMyAocG9seXN5bnRoKVwiLFxyXG4gIFwiUGFkIDQgKGNob2lyKVwiLFxyXG4gIFwiUGFkIDUgKGJvd2VkKVwiLFxyXG4gIFwiUGFkIDYgKG1ldGFsbGljKVwiLFxyXG4gIFwiUGFkIDcgKGhhbG8pXCIsXHJcbiAgXCJQYWQgOCAoc3dlZXApXCIsXHJcbiAgXCJGWCAxIChyYWluKVwiLFxyXG4gIFwiRlggMiAoc291bmR0cmFjaylcIixcclxuICBcIkZYIDMgKGNyeXN0YWwpXCIsXHJcbiAgXCJGWCA0IChhdG1vc3BoZXJlKVwiLFxyXG4gIFwiRlggNSAoYnJpZ2h0bmVzcylcIixcclxuICBcIkZYIDYgKGdvYmxpbnMpXCIsXHJcbiAgXCJGWCA3IChlY2hvZXMpXCIsXHJcbiAgXCJGWCA4IChzY2ktZmkpXCIsXHJcbiAgXCJTaXRhclwiLFxyXG4gIFwiQmFuam9cIixcclxuICBcIlNoYW1pc2VuXCIsXHJcbiAgXCJLb3RvXCIsXHJcbiAgXCJLYWxpbWJhXCIsXHJcbiAgXCJCYWdwaXBlXCIsXHJcbiAgXCJGaWRkbGVcIixcclxuICBcIlNoYW5haVwiLFxyXG4gIFwiVGlua2xlIEJlbGxcIixcclxuICBcIkFnb2dvXCIsXHJcbiAgXCJTdGVlbCBEcnVtc1wiLFxyXG4gIFwiV29vZGJsb2NrXCIsXHJcbiAgXCJUYWlrbyBEcnVtXCIsXHJcbiAgXCJNZWxvZGljIFRvbVwiLFxyXG4gIFwiU3ludGggRHJ1bVwiLFxyXG4gIFwiUmV2ZXJzZSBDeW1iYWxcIixcclxuICBcIkd1aXRhciBGcmV0IE5vaXNlXCIsXHJcbiAgXCJCcmVhdGggTm9pc2VcIixcclxuICBcIlNlYXNob3JlXCIsXHJcbiAgXCJCaXJkIFR3ZWV0XCIsXHJcbiAgXCJUZWxlcGhvbmUgUmluZ1wiLFxyXG4gIFwiSGVsaWNvcHRlclwiLFxyXG4gIFwiQXBwbGF1c2VcIixcclxuICBcIkd1bnNob3RcIlxyXG5dO1xyXG5cclxuU3ludGhlc2l6ZXIucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbigpIHtcclxuICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICB2YXIgaTtcclxuXHJcbiAgdGhpcy5wYXJzZXIgPSBuZXcgUGFyc2VyKHRoaXMuaW5wdXQpO1xyXG4gIHRoaXMuYmFua1NldCA9IHRoaXMuY3JlYXRlQWxsSW5zdHJ1bWVudHMoKTtcclxuXHJcbiAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpIHtcclxuICAgIHRoaXMucHJvZ3JhbUNoYW5nZShpLCBpKTtcclxuICAgIHRoaXMudm9sdW1lQ2hhbmdlKGksIDB4NjQpO1xyXG4gICAgdGhpcy5wYW5wb3RDaGFuZ2UoaSwgMHg0MCk7XHJcbiAgICB0aGlzLnBpdGNoQmVuZChpLCAweDAwLCAweDQwKTsgLy8gODE5MlxyXG4gICAgdGhpcy5waXRjaEJlbmRTZW5zaXRpdml0eShpLCAyKTtcclxuICB9XHJcbn07XHJcblxyXG4vKipcclxuICogQHBhcmFtIHtVaW50OEFycmF5fSBpbnB1dFxyXG4gKi9cclxuU3ludGhlc2l6ZXIucHJvdG90eXBlLnJlZnJlc2hJbnN0cnVtZW50cyA9IGZ1bmN0aW9uKGlucHV0KSB7XHJcbiAgdGhpcy5pbnB1dCA9IGlucHV0O1xyXG4gIHRoaXMucGFyc2VyID0gbmV3IFBhcnNlcihpbnB1dCk7XHJcbiAgdGhpcy5iYW5rU2V0ID0gdGhpcy5jcmVhdGVBbGxJbnN0cnVtZW50cygpO1xyXG59O1xyXG5cclxuU3ludGhlc2l6ZXIucHJvdG90eXBlLmNyZWF0ZUFsbEluc3RydW1lbnRzID0gZnVuY3Rpb24oKSB7XHJcbiAgLyoqIEB0eXBlIHtQYXJzZXJ9ICovXHJcbiAgdmFyIHBhcnNlciA9IHRoaXMucGFyc2VyO1xyXG4gIHBhcnNlci5wYXJzZSgpO1xyXG4gIC8qKiBAdHlwZSB7QXJyYXl9IFRPRE8gKi9cclxuICB2YXIgcHJlc2V0cyA9IHBhcnNlci5jcmVhdGVQcmVzZXQoKTtcclxuICAvKiogQHR5cGUge0FycmF5fSBUT0RPICovXHJcbiAgdmFyIGluc3RydW1lbnRzID0gcGFyc2VyLmNyZWF0ZUluc3RydW1lbnQoKTtcclxuICAvKiogQHR5cGUge09iamVjdH0gKi9cclxuICB2YXIgYmFua3MgPSBbXTtcclxuICAvKiogQHR5cGUge0FycmF5LjxBcnJheS48T2JqZWN0Pj59ICovXHJcbiAgdmFyIGJhbms7XHJcbiAgLyoqIEB0eXBlIHtPYmplY3R9IFRPRE8gKi9cclxuICB2YXIgcHJlc2V0O1xyXG4gIC8qKiBAdHlwZSB7T2JqZWN0fSAqL1xyXG4gIHZhciBpbnN0cnVtZW50O1xyXG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gIHZhciBwcmVzZXROdW1iZXI7XHJcbiAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgdmFyIGk7XHJcbiAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgdmFyIGlsO1xyXG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gIHZhciBqO1xyXG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gIHZhciBqbDtcclxuXHJcbiAgZm9yIChpID0gMCwgaWwgPSBwcmVzZXRzLmxlbmd0aDsgaSA8IGlsOyArK2kpIHtcclxuICAgIHByZXNldCA9IHByZXNldHNbaV07XHJcbiAgICBwcmVzZXROdW1iZXIgPSBwcmVzZXQuaGVhZGVyLnByZXNldDtcclxuXHJcbiAgICBpZiAodHlwZW9mIHByZXNldC5pbnN0cnVtZW50ICE9PSAnbnVtYmVyJykge1xyXG4gICAgICBjb250aW51ZTtcclxuICAgIH1cclxuXHJcbiAgICBpbnN0cnVtZW50ID0gaW5zdHJ1bWVudHNbcHJlc2V0Lmluc3RydW1lbnRdO1xyXG4gICAgaWYgKGluc3RydW1lbnQubmFtZS5yZXBsYWNlKC9cXDAqJC8sICcnKSA9PT0gJ0VPSScpIHtcclxuICAgICAgY29udGludWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gc2VsZWN0IGJhbmtcclxuICAgIGlmIChiYW5rc1twcmVzZXQuaGVhZGVyLmJhbmtdID09PSB2b2lkIDApIHtcclxuICAgICAgYmFua3NbcHJlc2V0LmhlYWRlci5iYW5rXSA9IFtdO1xyXG4gICAgfVxyXG4gICAgYmFuayA9IGJhbmtzW3ByZXNldC5oZWFkZXIuYmFua107XHJcbiAgICBiYW5rW3ByZXNldE51bWJlcl0gPSBbXTtcclxuICAgIGJhbmtbcHJlc2V0TnVtYmVyXS5uYW1lID0gcHJlc2V0Lm5hbWU7XHJcblxyXG4gICAgZm9yIChqID0gMCwgamwgPSBpbnN0cnVtZW50LmluZm8ubGVuZ3RoOyBqIDwgamw7ICsraikge1xyXG4gICAgICB0aGlzLmNyZWF0ZU5vdGVJbmZvKHBhcnNlciwgaW5zdHJ1bWVudC5pbmZvW2pdLCBiYW5rW3ByZXNldE51bWJlcl0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGJhbmtzO1xyXG59O1xyXG5cclxuU3ludGhlc2l6ZXIucHJvdG90eXBlLmNyZWF0ZU5vdGVJbmZvID0gZnVuY3Rpb24ocGFyc2VyLCBpbmZvLCBwcmVzZXQpIHtcclxuICB2YXIgZ2VuZXJhdG9yID0gaW5mby5nZW5lcmF0b3I7XHJcbiAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgdmFyIHNhbXBsZUlkO1xyXG4gIC8qKiBAdHlwZSB7T2JqZWN0fSAqL1xyXG4gIHZhciBzYW1wbGVIZWFkZXI7XHJcbiAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgdmFyIHZvbEF0dGFjaztcclxuICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICB2YXIgdm9sRGVjYXk7XHJcbiAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgdmFyIHZvbFN1c3RhaW47XHJcbiAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgdmFyIHZvbFJlbGVhc2U7XHJcbiAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgdmFyIG1vZEF0dGFjaztcclxuICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICB2YXIgbW9kRGVjYXk7XHJcbiAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgdmFyIG1vZFN1c3RhaW47XHJcbiAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgdmFyIG1vZFJlbGVhc2U7XHJcbiAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgdmFyIHR1bmU7XHJcbiAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgdmFyIHNjYWxlO1xyXG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gIHZhciBmcmVxVmliTEZPO1xyXG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gIHZhciBpO1xyXG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gIHZhciBpbDtcclxuXHJcbiAgaWYgKGdlbmVyYXRvclsna2V5UmFuZ2UnXSA9PT0gdm9pZCAwIHx8IGdlbmVyYXRvclsnc2FtcGxlSUQnXSA9PT0gdm9pZCAwKSB7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICB2b2xBdHRhY2sgID0gdGhpcy5nZXRNb2RHZW5BbW91bnQoZ2VuZXJhdG9yLCAnYXR0YWNrVm9sRW52JywgIC0xMjAwMCk7XHJcbiAgdm9sRGVjYXkgICA9IHRoaXMuZ2V0TW9kR2VuQW1vdW50KGdlbmVyYXRvciwgJ2RlY2F5Vm9sRW52JywgICAtMTIwMDApO1xyXG4gIHZvbFN1c3RhaW4gPSB0aGlzLmdldE1vZEdlbkFtb3VudChnZW5lcmF0b3IsICdzdXN0YWluVm9sRW52Jyk7XHJcbiAgdm9sUmVsZWFzZSA9IHRoaXMuZ2V0TW9kR2VuQW1vdW50KGdlbmVyYXRvciwgJ3JlbGVhc2VWb2xFbnYnLCAtMTIwMDApO1xyXG4gIG1vZEF0dGFjayAgPSB0aGlzLmdldE1vZEdlbkFtb3VudChnZW5lcmF0b3IsICdhdHRhY2tNb2RFbnYnLCAgLTEyMDAwKTtcclxuICBtb2REZWNheSAgID0gdGhpcy5nZXRNb2RHZW5BbW91bnQoZ2VuZXJhdG9yLCAnZGVjYXlNb2RFbnYnLCAgIC0xMjAwMCk7XHJcbiAgbW9kU3VzdGFpbiA9IHRoaXMuZ2V0TW9kR2VuQW1vdW50KGdlbmVyYXRvciwgJ3N1c3RhaW5Nb2RFbnYnKTtcclxuICBtb2RSZWxlYXNlID0gdGhpcy5nZXRNb2RHZW5BbW91bnQoZ2VuZXJhdG9yLCAncmVsZWFzZU1vZEVudicsIC0xMjAwMCk7XHJcblxyXG4gIHR1bmUgPSAoXHJcbiAgICB0aGlzLmdldE1vZEdlbkFtb3VudChnZW5lcmF0b3IsICdjb2Fyc2VUdW5lJykgK1xyXG4gICAgdGhpcy5nZXRNb2RHZW5BbW91bnQoZ2VuZXJhdG9yLCAnZmluZVR1bmUnKSAvIDEwMFxyXG4gICk7XHJcbiAgc2NhbGUgPSB0aGlzLmdldE1vZEdlbkFtb3VudChnZW5lcmF0b3IsICdzY2FsZVR1bmluZycsIDEwMCkgLyAxMDA7XHJcbiAgZnJlcVZpYkxGTyA9IHRoaXMuZ2V0TW9kR2VuQW1vdW50KGdlbmVyYXRvciwgJ2ZyZXFWaWJMRk8nKTtcclxuXHJcbiAgZm9yIChpID0gZ2VuZXJhdG9yWydrZXlSYW5nZSddLmxvLCBpbCA9IGdlbmVyYXRvclsna2V5UmFuZ2UnXS5oaTsgaSA8PSBpbDsgKytpKSAge1xyXG4gICAgaWYgKHByZXNldFtpXSkge1xyXG4gICAgICBjb250aW51ZTtcclxuICAgIH1cclxuXHJcbiAgICBzYW1wbGVJZCA9IHRoaXMuZ2V0TW9kR2VuQW1vdW50KGdlbmVyYXRvciwgJ3NhbXBsZUlEJyk7XHJcbiAgICBzYW1wbGVIZWFkZXIgPSBwYXJzZXIuc2FtcGxlSGVhZGVyW3NhbXBsZUlkXTtcclxuICAgIHByZXNldFtpXSA9IHtcclxuICAgICAgJ3NhbXBsZSc6IHBhcnNlci5zYW1wbGVbc2FtcGxlSWRdLFxyXG4gICAgICAnc2FtcGxlUmF0ZSc6IHNhbXBsZUhlYWRlci5zYW1wbGVSYXRlLFxyXG4gICAgICAnYmFzZVBsYXliYWNrUmF0ZSc6IE1hdGgucG93KFxyXG4gICAgICAgIE1hdGgucG93KDIsIDEvMTIpLFxyXG4gICAgICAgIChcclxuICAgICAgICAgIGkgLVxyXG4gICAgICAgICAgdGhpcy5nZXRNb2RHZW5BbW91bnQoZ2VuZXJhdG9yLCAnb3ZlcnJpZGluZ1Jvb3RLZXknLCBzYW1wbGVIZWFkZXIub3JpZ2luYWxQaXRjaCkgK1xyXG4gICAgICAgICAgdHVuZSArIChzYW1wbGVIZWFkZXIucGl0Y2hDb3JyZWN0aW9uIC8gMTAwKVxyXG4gICAgICAgICkgKiBzY2FsZVxyXG4gICAgICApLFxyXG4gICAgICAnbW9kRW52VG9QaXRjaCc6IHRoaXMuZ2V0TW9kR2VuQW1vdW50KGdlbmVyYXRvciwgJ21vZEVudlRvUGl0Y2gnKSAvIDEwMCxcclxuICAgICAgJ3NjYWxlVHVuaW5nJzogc2NhbGUsXHJcbiAgICAgICdzdGFydCc6XHJcbiAgICAgICAgdGhpcy5nZXRNb2RHZW5BbW91bnQoZ2VuZXJhdG9yLCAnc3RhcnRBZGRyc0NvYXJzZU9mZnNldCcpICogMzI3NjggK1xyXG4gICAgICAgICAgdGhpcy5nZXRNb2RHZW5BbW91bnQoZ2VuZXJhdG9yLCAnc3RhcnRBZGRyc09mZnNldCcpLFxyXG4gICAgICAnZW5kJzpcclxuICAgICAgICB0aGlzLmdldE1vZEdlbkFtb3VudChnZW5lcmF0b3IsICdlbmRBZGRyc0NvYXJzZU9mZnNldCcpICogMzI3NjggK1xyXG4gICAgICAgICAgdGhpcy5nZXRNb2RHZW5BbW91bnQoZ2VuZXJhdG9yLCAnZW5kQWRkcnNPZmZzZXQnKSxcclxuICAgICAgJ2xvb3BTdGFydCc6IChcclxuICAgICAgICAvLyhzYW1wbGVIZWFkZXIuc3RhcnRMb29wIC0gc2FtcGxlSGVhZGVyLnN0YXJ0KSArXHJcbiAgICAgICAgKHNhbXBsZUhlYWRlci5zdGFydExvb3ApICtcclxuICAgICAgICAgIHRoaXMuZ2V0TW9kR2VuQW1vdW50KGdlbmVyYXRvciwgJ3N0YXJ0bG9vcEFkZHJzQ29hcnNlT2Zmc2V0JykgKiAzMjc2OCArXHJcbiAgICAgICAgICB0aGlzLmdldE1vZEdlbkFtb3VudChnZW5lcmF0b3IsICdzdGFydGxvb3BBZGRyc09mZnNldCcpXHJcbiAgICAgICAgKSxcclxuICAgICAgJ2xvb3BFbmQnOiAoXHJcbiAgICAgICAgLy8oc2FtcGxlSGVhZGVyLmVuZExvb3AgLSBzYW1wbGVIZWFkZXIuc3RhcnQpICtcclxuICAgICAgICAoc2FtcGxlSGVhZGVyLmVuZExvb3ApICtcclxuICAgICAgICAgIHRoaXMuZ2V0TW9kR2VuQW1vdW50KGdlbmVyYXRvciwgJ2VuZGxvb3BBZGRyc0NvYXJzZU9mZnNldCcpICogMzI3NjggK1xyXG4gICAgICAgICAgdGhpcy5nZXRNb2RHZW5BbW91bnQoZ2VuZXJhdG9yLCAnZW5kbG9vcEFkZHJzT2Zmc2V0JylcclxuICAgICAgICApLFxyXG4gICAgICAndm9sQXR0YWNrJzogIE1hdGgucG93KDIsIHZvbEF0dGFjayAvIDEyMDApLFxyXG4gICAgICAndm9sRGVjYXknOiAgIE1hdGgucG93KDIsIHZvbERlY2F5IC8gMTIwMCksXHJcbiAgICAgICd2b2xTdXN0YWluJzogdm9sU3VzdGFpbiAvIDEwMDAsXHJcbiAgICAgICd2b2xSZWxlYXNlJzogTWF0aC5wb3coMiwgdm9sUmVsZWFzZSAvIDEyMDApLFxyXG4gICAgICAnbW9kQXR0YWNrJzogIE1hdGgucG93KDIsIG1vZEF0dGFjayAvIDEyMDApLFxyXG4gICAgICAnbW9kRGVjYXknOiAgIE1hdGgucG93KDIsIG1vZERlY2F5IC8gMTIwMCksXHJcbiAgICAgICdtb2RTdXN0YWluJzogbW9kU3VzdGFpbiAvIDEwMDAsXHJcbiAgICAgICdtb2RSZWxlYXNlJzogTWF0aC5wb3coMiwgbW9kUmVsZWFzZSAvIDEyMDApLFxyXG4gICAgICAnaW5pdGlhbEZpbHRlckZjJzogdGhpcy5nZXRNb2RHZW5BbW91bnQoZ2VuZXJhdG9yLCAnaW5pdGlhbEZpbHRlckZjJywgMTM1MDApLFxyXG4gICAgICAnbW9kRW52VG9GaWx0ZXJGYyc6IHRoaXMuZ2V0TW9kR2VuQW1vdW50KGdlbmVyYXRvciwgJ21vZEVudlRvRmlsdGVyRmMnKSxcclxuICAgICAgJ2luaXRpYWxGaWx0ZXJRJzogdGhpcy5nZXRNb2RHZW5BbW91bnQoZ2VuZXJhdG9yLCAnaW5pdGlhbEZpbHRlclEnKSxcclxuICAgICAgJ2ZyZXFWaWJMRk8nOiBmcmVxVmliTEZPID8gTWF0aC5wb3coMiwgZnJlcVZpYkxGTyAvIDEyMDApICogOC4xNzYgOiB2b2lkIDBcclxuICAgIH07XHJcbiAgfVxyXG59O1xyXG5cclxuLyoqXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBnZW5lcmF0b3JcclxuICogQHBhcmFtIHtzdHJpbmd9IGVudW1lcmF0b3JUeXBlXHJcbiAqIEBwYXJhbSB7bnVtYmVyPX0gb3B0X2RlZmF1bHRcclxuICogQHJldHVybnMge251bWJlcn1cclxuICovXHJcblN5bnRoZXNpemVyLnByb3RvdHlwZS5nZXRNb2RHZW5BbW91bnQgPSBmdW5jdGlvbihnZW5lcmF0b3IsIGVudW1lcmF0b3JUeXBlLCBvcHRfZGVmYXVsdCkge1xyXG4gIGlmIChvcHRfZGVmYXVsdCA9PT0gdm9pZCAwKSB7XHJcbiAgICBvcHRfZGVmYXVsdCA9IDA7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gZ2VuZXJhdG9yW2VudW1lcmF0b3JUeXBlXSA/IGdlbmVyYXRvcltlbnVtZXJhdG9yVHlwZV0uYW1vdW50IDogb3B0X2RlZmF1bHQ7XHJcbn07XHJcblxyXG5TeW50aGVzaXplci5wcm90b3R5cGUuc3RhcnQgPSBmdW5jdGlvbigpIHtcclxuICB0aGlzLmJ1ZlNyYy5jb25uZWN0KHRoaXMuZ2Fpbk1hc3Rlcik7XHJcbiAgdGhpcy5nYWluTWFzdGVyLmNvbm5lY3QodGhpcy5jdHguZGVzdGluYXRpb24pO1xyXG4gIHRoaXMuYnVmU3JjLnN0YXJ0KDApO1xyXG5cclxuICB0aGlzLnNldE1hc3RlclZvbHVtZSgxNjM4Myk7XHJcbn07XHJcblxyXG5TeW50aGVzaXplci5wcm90b3R5cGUuc2V0TWFzdGVyVm9sdW1lID0gZnVuY3Rpb24odm9sdW1lKSB7XHJcbiAgdGhpcy5tYXN0ZXJWb2x1bWUgPSB2b2x1bWU7XHJcbiAgdGhpcy5nYWluTWFzdGVyLmdhaW4udmFsdWUgPSB0aGlzLmJhc2VWb2x1bWUgKiAodm9sdW1lIC8gMTYzODQpO1xyXG59O1xyXG5cclxuU3ludGhlc2l6ZXIucHJvdG90eXBlLnN0b3AgPSBmdW5jdGlvbigpIHtcclxuICB0aGlzLmJ1ZlNyYy5kaXNjb25uZWN0KDApO1xyXG4gIHRoaXMuZ2Fpbk1hc3Rlci5kaXNjb25uZWN0KDApO1xyXG4gIHRoaXMuY29tcHJlc3Nvci5kaXNjb25uZWN0KDApO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIEB0eXBlIHshQXJyYXkuPHN0cmluZz59XHJcbiAqIEBjb25zdFxyXG4gKi9cclxuU3ludGhlc2l6ZXIuVGFibGVIZWFkZXIgPSBbJ0luc3RydW1lbnQnLCAnVm9sJywgJ1BhbicsICdCZW5kJywgJ1JhbmdlJ107XHJcblxyXG5TeW50aGVzaXplci5wcm90b3R5cGUuZHJhd1N5bnRoID0gZnVuY3Rpb24oKSB7XHJcbiAgLyoqIEB0eXBlIHtIVE1MVGFibGVFbGVtZW50fSAqL1xyXG4gIHZhciB0YWJsZSA9IHRoaXMudGFibGUgPVxyXG4gICAgLyoqIEB0eXBlIHtIVE1MVGFibGVFbGVtZW50fSAqLyhkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0YWJsZScpKTtcclxuICAvKiogQHR5cGUge0hUTUxUYWJsZVNlY3Rpb25FbGVtZW50fSAqL1xyXG4gIHZhciBoZWFkID1cclxuICAgIC8qKiBAdHlwZSB7SFRNTFRhYmxlU2VjdGlvbkVsZW1lbnR9ICovKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RoZWFkJykpO1xyXG4gIC8qKiBAdHlwZSB7SFRNTFRhYmxlU2VjdGlvbkVsZW1lbnR9ICovXHJcbiAgdmFyIGJvZHkgPVxyXG4gICAgLyoqIEB0eXBlIHtIVE1MVGFibGVTZWN0aW9uRWxlbWVudH0gKi9cclxuICAgIChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0Ym9keScpKTtcclxuICAvKiogQHR5cGUge0hUTUxUYWJsZVJvd0VsZW1lbnR9ICovXHJcbiAgdmFyIHRhYmxlTGluZTtcclxuICAvKiogQHR5cGUge05vZGVMaXN0fSAqL1xyXG4gIHZhciBub3RlcztcclxuICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICB2YXIgaTtcclxuICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICB2YXIgajtcclxuXHJcbiAgaGVhZC5hcHBlbmRDaGlsZCh0aGlzLmNyZWF0ZVRhYmxlTGluZShTeW50aGVzaXplci5UYWJsZUhlYWRlciwgdHJ1ZSkpO1xyXG5cclxuICBmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSkge1xyXG4gICAgdGFibGVMaW5lID0gdGhpcy5jcmVhdGVUYWJsZUxpbmUoU3ludGhlc2l6ZXIuVGFibGVIZWFkZXIubGVuZ3RoICsgMTI4LCBmYWxzZSk7XHJcbiAgICBib2R5LmFwcGVuZENoaWxkKHRhYmxlTGluZSk7XHJcblxyXG4gICAgaWYgKGkgIT09IDkpIHtcclxuICAgICAgdmFyIHNlbGVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NlbGVjdCcpO1xyXG4gICAgICB2YXIgb3B0aW9uO1xyXG4gICAgICBmb3IgKGogPSAwOyBqIDwgMTI4OyArK2opIHtcclxuICAgICAgICBvcHRpb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRpb24nKTtcclxuICAgICAgICBvcHRpb24udGV4dENvbnRlbnQgPSBTeW50aGVzaXplci5Qcm9ncmFtTmFtZXNbal07XHJcbiAgICAgICAgc2VsZWN0LmFwcGVuZENoaWxkKG9wdGlvbik7XHJcbiAgICAgIH1cclxuICAgICAgdGFibGVMaW5lLnF1ZXJ5U2VsZWN0b3IoJ3RkOm50aC1jaGlsZCgxKScpLmFwcGVuZENoaWxkKHNlbGVjdCk7XHJcbiAgICAgIHNlbGVjdC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoZnVuY3Rpb24oc3ludGgsIGNoYW5uZWwpIHtcclxuICAgICAgICByZXR1cm4gZnVuY3Rpb24oZXZlbnQpIHtcclxuICAgICAgICAgIHN5bnRoLnByb2dyYW1DaGFuZ2UoY2hhbm5lbCwgZXZlbnQudGFyZ2V0LnNlbGVjdGVkSW5kZXgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSkodGhpcywgaSksIGZhbHNlKTtcclxuICAgICAgc2VsZWN0LnNlbGVjdGVkSW5kZXggPSB0aGlzLmNoYW5uZWxJbnN0cnVtZW50W2ldO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGFibGVMaW5lLnF1ZXJ5U2VsZWN0b3IoJ3RkOmZpcnN0LWNoaWxkJykudGV4dENvbnRlbnQgPSAnWyBSSFlUSE0gVFJBQ0sgXSc7XHJcbiAgICB9XHJcblxyXG4gICAgbm90ZXMgPSB0YWJsZUxpbmUucXVlcnlTZWxlY3RvckFsbCgndGQ6bnRoLWxhc3QtY2hpbGQoLW4rMTI4KScpO1xyXG4gICAgZm9yIChqID0gMDsgaiA8IDEyODsgKytqKSB7XHJcbiAgICAgIG5vdGVzW2pdLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIChmdW5jdGlvbihzeW50aCwgY2hhbm5lbCwga2V5KSB7XHJcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGV2ZW50KSB7XHJcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgc3ludGguZHJhZyA9IHRydWU7XHJcbiAgICAgICAgICBzeW50aC5ub3RlT24oY2hhbm5lbCwga2V5LCAxMjcpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSkodGhpcywgaSwgaikpO1xyXG4gICAgICBub3Rlc1tqXS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLCAoZnVuY3Rpb24oc3ludGgsIGNoYW5uZWwsIGtleSkge1xyXG4gICAgICAgIHJldHVybiBmdW5jdGlvbihldmVudCkge1xyXG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgIGlmIChzeW50aC5kcmFnKSB7XHJcbiAgICAgICAgICAgIHN5bnRoLm5vdGVPbihjaGFubmVsLCBrZXksIDEyNyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KSh0aGlzLCBpLCBqKSk7XHJcbiAgICAgIG5vdGVzW2pdLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3V0JywgKGZ1bmN0aW9uKHN5bnRoLCBjaGFubmVsLCBrZXkpIHtcclxuICAgICAgICByZXR1cm4gZnVuY3Rpb24oZXZlbnQpIHtcclxuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICBzeW50aC5ub3RlT2ZmKGNoYW5uZWwsIGtleSwgMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KSh0aGlzLCBpLCBqKSk7XHJcbiAgICAgIG5vdGVzW2pdLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCAoZnVuY3Rpb24oc3ludGgsIGNoYW5uZWwsIGtleSkge1xyXG4gICAgICAgIHJldHVybiBmdW5jdGlvbihldmVudCkge1xyXG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgIHN5bnRoLmRyYWcgPSBmYWxzZTtcclxuICAgICAgICAgIHN5bnRoLm5vdGVPZmYoY2hhbm5lbCwga2V5LCAwKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pKHRoaXMsIGksIGopKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHRhYmxlLmFwcGVuZENoaWxkKGhlYWQpO1xyXG4gIHRhYmxlLmFwcGVuZENoaWxkKGJvZHkpO1xyXG5cclxuICByZXR1cm4gdGFibGU7XHJcbn07XHJcblxyXG5TeW50aGVzaXplci5wcm90b3R5cGUucmVtb3ZlU3ludGggPSBmdW5jdGlvbigpIHtcclxuICB2YXIgdGFibGUgPSB0aGlzLnRhYmxlO1xyXG5cclxuICBpZiAodGFibGUpIHtcclxuICAgIHRhYmxlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGFibGUpO1xyXG4gICAgdGhpcy50YWJsZSA9IG51bGw7XHJcbiAgfVxyXG59O1xyXG5cclxuLyoqXHJcbiAqIEBwYXJhbSB7IShBcnJheS48c3RyaW5nPnxudW1iZXIpfSBhcnJheVxyXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlzVGl0bGVMaW5lXHJcbiAqIEByZXR1cm5zIHtIVE1MVGFibGVSb3dFbGVtZW50fVxyXG4gKi9cclxuU3ludGhlc2l6ZXIucHJvdG90eXBlLmNyZWF0ZVRhYmxlTGluZSA9IGZ1bmN0aW9uKGFycmF5LCBpc1RpdGxlTGluZSkge1xyXG4gIC8qKiBAdHlwZSB7SFRNTFRhYmxlUm93RWxlbWVudH0gKi9cclxuICB2YXIgdHIgPSAvKiogQHR5cGUge0hUTUxUYWJsZVJvd0VsZW1lbnR9ICovKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJykpO1xyXG4gIC8qKiBAdHlwZSB7SFRNTFRhYmxlQ2VsbEVsZW1lbnR9ICovXHJcbiAgdmFyIGNlbGw7XHJcbiAgLyoqIEB0eXBlIHtib29sZWFufSAqL1xyXG4gIHZhciBpc0FycmF5ID0gYXJyYXkgaW5zdGFuY2VvZiBBcnJheTtcclxuICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICB2YXIgaTtcclxuICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICB2YXIgaWwgPSBpc0FycmF5ID8gYXJyYXkubGVuZ3RoIDogLyoqIEB0eXBlIHtudW1iZXJ9ICovKGFycmF5KTtcclxuXHJcbiAgZm9yIChpID0gMDsgaSA8IGlsOyArK2kpIHtcclxuICAgIGNlbGwgPVxyXG4gICAgICAvKiogQHR5cGUge0hUTUxUYWJsZUNlbGxFbGVtZW50fSAqL1xyXG4gICAgICAoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChpc1RpdGxlTGluZSA/ICd0aCcgOiAndGQnKSk7XHJcbiAgICBjZWxsLnRleHRDb250ZW50ID0gKGlzQXJyYXkgJiYgYXJyYXlbaV0gIT09IHZvaWQgMCkgPyBhcnJheVtpXSA6ICcnO1xyXG4gICAgdHIuYXBwZW5kQ2hpbGQoY2VsbCk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gdHI7XHJcbn07XHJcblxyXG5cclxuLyoqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBjaGFubmVsIE5vdGVPbiDjgZnjgovjg4Hjg6Pjg7Pjg43jg6suXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBrZXkgTm90ZU9uIOOBmeOCi+OCreODvC5cclxuICogQHBhcmFtIHtudW1iZXJ9IHZlbG9jaXR5IOW8t+OBlS5cclxuICovXHJcblN5bnRoZXNpemVyLnByb3RvdHlwZS5ub3RlT24gPSBmdW5jdGlvbihjaGFubmVsLCBrZXksIHZlbG9jaXR5KSB7XHJcbiAgLyoqIEB0eXBlIHtPYmplY3R9ICovXHJcbiAgdmFyIGJhbmsgPSB0aGlzLmJhbmtTZXRbY2hhbm5lbCA9PT0gOSA/IDEyOCA6IHRoaXMuYmFua107XHJcbiAgLyoqIEB0eXBlIHtPYmplY3R9ICovXHJcbiAgdmFyIGluc3RydW1lbnQgPSBiYW5rW3RoaXMuY2hhbm5lbEluc3RydW1lbnRbY2hhbm5lbF1dO1xyXG4gIC8qKiBAdHlwZSB7T2JqZWN0fSAqL1xyXG4gIHZhciBpbnN0cnVtZW50S2V5O1xyXG4gIC8qKiBAdHlwZSB7U3ludGhlc2l6ZXJOb3RlfSAqL1xyXG4gIHZhciBub3RlO1xyXG5cclxuICBpZiAodGhpcy50YWJsZSkge1xyXG4gICAgdGhpcy50YWJsZS5xdWVyeVNlbGVjdG9yKFxyXG4gICAgICAndGJvZHkgPiAnICtcclxuICAgICAgICAndHI6bnRoLWNoaWxkKCcgKyAoY2hhbm5lbCsxKSArICcpID4gJyArXHJcbiAgICAgICAgJ3RkOm50aC1jaGlsZCgnICsgKFN5bnRoZXNpemVyLlRhYmxlSGVhZGVyLmxlbmd0aCtrZXkrMSkgKyAnKSdcclxuICAgICkuY2xhc3NMaXN0LmFkZCgnbm90ZS1vbicpO1xyXG4gIH1cclxuXHJcbiAgaWYgKCFpbnN0cnVtZW50KSB7XHJcbiAgICAvLyBUT0RPXHJcbiAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgIFwiaW5zdHJ1bWVudCBub3QgZm91bmQ6IGJhbms9JXMgaW5zdHJ1bWVudD0lcyBjaGFubmVsPSVzXCIsXHJcbiAgICAgIGNoYW5uZWwgPT09IDkgPyAxMjggOiB0aGlzLmJhbmssXHJcbiAgICAgIHRoaXMuY2hhbm5lbEluc3RydW1lbnRbY2hhbm5lbF0sXHJcbiAgICAgIGNoYW5uZWxcclxuICAgICk7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICBpbnN0cnVtZW50S2V5ID0gaW5zdHJ1bWVudFtrZXldO1xyXG5cclxuICBpZiAoIShpbnN0cnVtZW50S2V5KSkge1xyXG4gICAgLy8gVE9ET1xyXG4gICAgY29uc29sZS53YXJuKFxyXG4gICAgICBcImluc3RydW1lbnQgbm90IGZvdW5kOiBiYW5rPSVzIGluc3RydW1lbnQ9JXMgY2hhbm5lbD0lcyBrZXk9JXNcIixcclxuICAgICAgY2hhbm5lbCA9PT0gOSA/IDEyOCA6IHRoaXMuYmFuayxcclxuICAgICAgdGhpcy5jaGFubmVsSW5zdHJ1bWVudFtjaGFubmVsXSxcclxuICAgICAgY2hhbm5lbCxcclxuICAgICAga2V5XHJcbiAgICApO1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgdmFyIHBhbnBvdCA9IHRoaXMuY2hhbm5lbFBhbnBvdFtjaGFubmVsXSAtIDY0O1xyXG4gIHBhbnBvdCAvPSBwYW5wb3QgPCAwID8gNjQgOiA2MztcclxuXHJcbiAgLy8gY3JlYXRlIG5vdGUgaW5mb3JtYXRpb25cclxuICBpbnN0cnVtZW50S2V5WydjaGFubmVsJ10gPSBjaGFubmVsO1xyXG4gIGluc3RydW1lbnRLZXlbJ2tleSddID0ga2V5O1xyXG4gIGluc3RydW1lbnRLZXlbJ3ZlbG9jaXR5J10gPSB2ZWxvY2l0eTtcclxuICBpbnN0cnVtZW50S2V5WydwYW5wb3QnXSA9IHBhbnBvdDtcclxuICBpbnN0cnVtZW50S2V5Wyd2b2x1bWUnXSA9IHRoaXMuY2hhbm5lbFZvbHVtZVtjaGFubmVsXSAvIDEyNztcclxuICBpbnN0cnVtZW50S2V5WydwaXRjaEJlbmQnXSA9IHRoaXMuY2hhbm5lbFBpdGNoQmVuZFtjaGFubmVsXSAtIDgxOTI7XHJcbiAgaW5zdHJ1bWVudEtleVsncGl0Y2hCZW5kU2Vuc2l0aXZpdHknXSA9IHRoaXMuY2hhbm5lbFBpdGNoQmVuZFNlbnNpdGl2aXR5W2NoYW5uZWxdO1xyXG5cclxuICAvLyBub3RlIG9uXHJcbiAgbm90ZSA9IG5ldyBTeW50aGVzaXplck5vdGUodGhpcy5jdHgsIHRoaXMuZ2Fpbk1hc3RlciwgaW5zdHJ1bWVudEtleSk7XHJcbiAgbm90ZS5ub3RlT24oKTtcclxuICB0aGlzLmN1cnJlbnROb3RlT25bY2hhbm5lbF0ucHVzaChub3RlKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gY2hhbm5lbCBOb3RlT2ZmIOOBmeOCi+ODgeODo+ODs+ODjeODqy5cclxuICogQHBhcmFtIHtudW1iZXJ9IGtleSBOb3RlT2ZmIOOBmeOCi+OCreODvC5cclxuICogQHBhcmFtIHtudW1iZXJ9IHZlbG9jaXR5IOW8t+OBlS5cclxuICovXHJcblN5bnRoZXNpemVyLnByb3RvdHlwZS5ub3RlT2ZmID0gZnVuY3Rpb24oY2hhbm5lbCwga2V5LCB2ZWxvY2l0eSkge1xyXG4gIC8qKiBAdHlwZSB7T2JqZWN0fSAqL1xyXG4gIHZhciBiYW5rID0gdGhpcy5iYW5rU2V0W2NoYW5uZWwgPT09IDkgPyAxMjggOiB0aGlzLmJhbmtdO1xyXG4gIC8qKiBAdHlwZSB7T2JqZWN0fSAqL1xyXG4gIHZhciBpbnN0cnVtZW50ID0gYmFua1t0aGlzLmNoYW5uZWxJbnN0cnVtZW50W2NoYW5uZWxdXTtcclxuICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICB2YXIgaTtcclxuICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICB2YXIgaWw7XHJcbiAgLyoqIEB0eXBlIHtBcnJheS48U3ludGhlc2l6ZXJOb3RlPn0gKi9cclxuICB2YXIgY3VycmVudE5vdGVPbiA9IHRoaXMuY3VycmVudE5vdGVPbltjaGFubmVsXTtcclxuICAvKiogQHR5cGUge1N5bnRoZXNpemVyTm90ZX0gKi9cclxuICB2YXIgbm90ZTtcclxuXHJcbiAgaWYgKHRoaXMudGFibGUpIHtcclxuICAgIHRoaXMudGFibGUucXVlcnlTZWxlY3RvcihcclxuICAgICAgJ3Rib2R5ID4gJyArXHJcbiAgICAgICd0cjpudGgtY2hpbGQoJyArIChjaGFubmVsKzEpICsgJykgPiAnICtcclxuICAgICAgJ3RkOm50aC1jaGlsZCgnICsgKGtleStTeW50aGVzaXplci5UYWJsZUhlYWRlci5sZW5ndGgrMSkgKyAnKSdcclxuICAgICkuY2xhc3NMaXN0LnJlbW92ZSgnbm90ZS1vbicpO1xyXG4gIH1cclxuXHJcbiAgaWYgKCFpbnN0cnVtZW50KSB7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICBmb3IgKGkgPSAwLCBpbCA9IGN1cnJlbnROb3RlT24ubGVuZ3RoOyBpIDwgaWw7ICsraSkge1xyXG4gICAgbm90ZSA9IGN1cnJlbnROb3RlT25baV07XHJcbiAgICBpZiAobm90ZS5rZXkgPT09IGtleSkge1xyXG4gICAgICBub3RlLm5vdGVPZmYoKTtcclxuICAgICAgY3VycmVudE5vdGVPbi5zcGxpY2UoaSwgMSk7XHJcbiAgICAgIC0taTtcclxuICAgICAgLS1pbDtcclxuICAgIH1cclxuICB9XHJcbn07XHJcblxyXG4vKipcclxuICogQHBhcmFtIHtudW1iZXJ9IGNoYW5uZWwg6Z+z6Imy44KS5aSJ5pu044GZ44KL44OB44Oj44Oz44ON44OrLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gaW5zdHJ1bWVudCDpn7PoibLnlarlj7cuXHJcbiAqL1xyXG5TeW50aGVzaXplci5wcm90b3R5cGUucHJvZ3JhbUNoYW5nZSA9IGZ1bmN0aW9uKGNoYW5uZWwsIGluc3RydW1lbnQpIHtcclxuICBpZiAodGhpcy50YWJsZSkge1xyXG4gICAgaWYgKGNoYW5uZWwgIT09IDkpIHtcclxuICAgICAgdGhpcy50YWJsZS5xdWVyeVNlbGVjdG9yKCd0Ym9keSA+IHRyOm50aC1jaGlsZCgnICsgKGNoYW5uZWwrMSkgKyAnKSA+IHRkOmZpcnN0LWNoaWxkID4gc2VsZWN0Jykuc2VsZWN0ZWRJbmRleCA9IGluc3RydW1lbnQ7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vIOODquOCuuODoOODiOODqeODg+OCr+OBr+eEoeimluOBmeOCi1xyXG4gIGlmIChjaGFubmVsID09PSA5KSB7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICB0aGlzLmNoYW5uZWxJbnN0cnVtZW50W2NoYW5uZWxdID0gaW5zdHJ1bWVudDtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gY2hhbm5lbCDpn7Pph4/jgpLlpInmm7TjgZnjgovjg4Hjg6Pjg7Pjg43jg6suXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB2b2x1bWUg6Z+z6YePKDAtMTI3KS5cclxuICovXHJcblN5bnRoZXNpemVyLnByb3RvdHlwZS52b2x1bWVDaGFuZ2UgPSBmdW5jdGlvbihjaGFubmVsLCB2b2x1bWUpIHtcclxuICBpZiAodGhpcy50YWJsZSkge1xyXG4gICAgdGhpcy50YWJsZS5xdWVyeVNlbGVjdG9yKCd0Ym9keSA+IHRyOm50aC1jaGlsZCgnICsgKGNoYW5uZWwrMSkgKyAnKSA+IHRkOm50aC1jaGlsZCgyKScpLnRleHRDb250ZW50ID0gdm9sdW1lO1xyXG4gIH1cclxuXHJcbiAgdGhpcy5jaGFubmVsVm9sdW1lW2NoYW5uZWxdID0gdm9sdW1lO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBjaGFubmVsIHBhbnBvdCDjgpLlpInmm7TjgZnjgovjg4Hjg6Pjg7Pjg43jg6suXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBwYW5wb3QgcGFucG90KDAtMTI3KS5cclxuICovXHJcblN5bnRoZXNpemVyLnByb3RvdHlwZS5wYW5wb3RDaGFuZ2UgPSBmdW5jdGlvbihjaGFubmVsLCBwYW5wb3QpIHtcclxuICBpZiAodGhpcy50YWJsZSkge1xyXG4gICAgdGhpcy50YWJsZS5xdWVyeVNlbGVjdG9yKCd0Ym9keSA+IHRyOm50aC1jaGlsZCgnICsgKGNoYW5uZWwrMSkgKyAnKSA+IHRkOm50aC1jaGlsZCgzKScpLnRleHRDb250ZW50ID0gcGFucG90O1xyXG4gIH1cclxuXHJcbiAgdGhpcy5jaGFubmVsUGFucG90W2NoYW5uZWxdID0gcGFucG90O1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBjaGFubmVsIHBhbnBvdCDjgpLlpInmm7TjgZnjgovjg4Hjg6Pjg7Pjg43jg6suXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBsb3dlckJ5dGVcclxuICogQHBhcmFtIHtudW1iZXJ9IGhpZ2hlckJ5dGVcclxuICovXHJcblN5bnRoZXNpemVyLnByb3RvdHlwZS5waXRjaEJlbmQgPSBmdW5jdGlvbihjaGFubmVsLCBsb3dlckJ5dGUsIGhpZ2hlckJ5dGUpIHtcclxuICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICB2YXIgYmVuZCA9IChsb3dlckJ5dGUgJiAweDdmKSB8ICgoaGlnaGVyQnl0ZSAmIDB4N2YpIDw8IDcpO1xyXG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gIHZhciBpO1xyXG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gIHZhciBpbDtcclxuICAvKiogQHR5cGUge0FycmF5LjxTeW50aGVzaXplck5vdGU+fSAqL1xyXG4gIHZhciBjdXJyZW50Tm90ZU9uID0gdGhpcy5jdXJyZW50Tm90ZU9uW2NoYW5uZWxdO1xyXG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gIHZhciBjYWxjdWxhdGVkID0gYmVuZCAtIDgxOTI7XHJcblxyXG4gIGlmICh0aGlzLnRhYmxlKSB7XHJcbiAgICB0aGlzLnRhYmxlLnF1ZXJ5U2VsZWN0b3IoJ3Rib2R5ID4gdHI6bnRoLWNoaWxkKCcgKyAoY2hhbm5lbCsxKSArICcpID4gdGQ6bnRoLWNoaWxkKDQpJykudGV4dENvbnRlbnQgPSBjYWxjdWxhdGVkO1xyXG4gIH1cclxuXHJcbiAgZm9yIChpID0gMCwgaWwgPSBjdXJyZW50Tm90ZU9uLmxlbmd0aDsgaSA8IGlsOyArK2kpIHtcclxuICAgIGN1cnJlbnROb3RlT25baV0udXBkYXRlUGl0Y2hCZW5kKGNhbGN1bGF0ZWQpO1xyXG4gIH1cclxuXHJcbiAgdGhpcy5jaGFubmVsUGl0Y2hCZW5kW2NoYW5uZWxdID0gYmVuZDtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gY2hhbm5lbCBwaXRjaCBiZW5kIHNlbnNpdGl2aXR5IOOCkuWkieabtOOBmeOCi+ODgeODo+ODs+ODjeODqy5cclxuICogQHBhcmFtIHtudW1iZXJ9IHNlbnNpdGl2aXR5XHJcbiAqL1xyXG5TeW50aGVzaXplci5wcm90b3R5cGUucGl0Y2hCZW5kU2Vuc2l0aXZpdHkgPSBmdW5jdGlvbihjaGFubmVsLCBzZW5zaXRpdml0eSkge1xyXG4gIGlmICh0aGlzLnRhYmxlKSB7XHJcbiAgICB0aGlzLnRhYmxlLnF1ZXJ5U2VsZWN0b3IoJ3Rib2R5ID4gdHI6bnRoLWNoaWxkKCcgKyAoY2hhbm5lbCsxKSArICcpID4gdGQ6bnRoLWNoaWxkKDUpJykudGV4dENvbnRlbnQgPSBzZW5zaXRpdml0eTtcclxuICB9XHJcblxyXG4gIHRoaXMuY2hhbm5lbFBpdGNoQmVuZFNlbnNpdGl2aXR5W2NoYW5uZWxdID0gc2Vuc2l0aXZpdHk7XHJcbn07XHJcblxyXG4vKipcclxuICogQHBhcmFtIHtudW1iZXJ9IGNoYW5uZWwg6Z+z44KS5raI44GZ44OB44Oj44Oz44ON44OrLlxyXG4gKi9cclxuU3ludGhlc2l6ZXIucHJvdG90eXBlLmFsbFNvdW5kT2ZmID0gZnVuY3Rpb24oY2hhbm5lbCkge1xyXG4gIC8qKiBAdHlwZSB7QXJyYXkuPFN5bnRoZXNpemVyTm90ZT59ICovXHJcbiAgdmFyIGN1cnJlbnROb3RlT24gPSB0aGlzLmN1cnJlbnROb3RlT25bY2hhbm5lbF07XHJcblxyXG4gIHdoaWxlIChjdXJyZW50Tm90ZU9uLmxlbmd0aCA+IDApIHtcclxuICAgIHRoaXMubm90ZU9mZihjaGFubmVsLCBjdXJyZW50Tm90ZU9uWzBdLmtleSwgMCk7XHJcbiAgfVxyXG59O1xyXG5cclxuLyoqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBjaGFubmVsIOODquOCu+ODg+ODiOOBmeOCi+ODgeODo+ODs+ODjeODq1xyXG4gKi9cclxuU3ludGhlc2l6ZXIucHJvdG90eXBlLnJlc2V0QWxsQ29udHJvbCA9IGZ1bmN0aW9uKGNoYW5uZWwpIHtcclxuICB0aGlzLnBpdGNoQmVuZChjaGFubmVsLCAweDAwLCAweDQwKTsgLy8gODE5MlxyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgU3ludGhlc2l6ZXJcclxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvc291bmRfZm9udF9zeW50aC5qc1xuICoqLyIsIi8qKlxyXG4gKiBAcGFyYW0ge0F1ZGlvQ29udGV4dH0gY3R4XHJcbiAqIEBwYXJhbSB7QXVkaW9Ob2RlfSBkZXN0aW5hdGlvblxyXG4gKiBAcGFyYW0ge3tcclxuICogICBjaGFubmVsOiBudW1iZXIsXHJcbiAqICAga2V5OiBudW1iZXIsXHJcbiAqICAgc2FtcGxlOiBVaW50OEFycmF5LFxyXG4gKiAgIGJhc2VQbGF5YmFja1JhdGU6IG51bWJlcixcclxuICogICBsb29wU3RhcnQ6IG51bWJlcixcclxuICogICBsb29wRW5kOiBudW1iZXIsXHJcbiAqICAgdm9sdW1lOiBudW1iZXIsXHJcbiAqICAgcGFucG90OiBudW1iZXJcclxuICogfX0gaW5zdHJ1bWVudFxyXG4gKiBAY29uc3RydWN0b3JcclxuICovXHJcbmNvbnN0IFN5bnRoZXNpemVyTm90ZSA9IGZ1bmN0aW9uKGN0eCwgZGVzdGluYXRpb24sIGluc3RydW1lbnQpIHtcclxuICAvKiogQHR5cGUge0F1ZGlvQ29udGV4dH0gKi9cclxuICB0aGlzLmN0eCA9IGN0eDtcclxuICAvKiogQHR5cGUge0F1ZGlvTm9kZX0gKi9cclxuICB0aGlzLmRlc3RpbmF0aW9uID0gZGVzdGluYXRpb247XHJcbiAgLyoqIEB0eXBlIHt7XHJcbiAgICogICBjaGFubmVsOiBudW1iZXIsXHJcbiAgICogICBrZXk6IG51bWJlcixcclxuICAgKiAgIHNhbXBsZTogVWludDhBcnJheSxcclxuICAgKiAgIGJhc2VQbGF5YmFja1JhdGU6IG51bWJlcixcclxuICAgKiAgIGxvb3BTdGFydDogbnVtYmVyLFxyXG4gICAqICAgbG9vcEVuZDogbnVtYmVyLFxyXG4gICAqICAgdm9sdW1lOiBudW1iZXIsXHJcbiAgICogICBwYW5wb3Q6IG51bWJlclxyXG4gICAqIH19XHJcbiAgICovXHJcbiAgdGhpcy5pbnN0cnVtZW50ID0gaW5zdHJ1bWVudDtcclxuICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICB0aGlzLmNoYW5uZWwgPSBpbnN0cnVtZW50WydjaGFubmVsJ107XHJcbiAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgdGhpcy5rZXkgPSBpbnN0cnVtZW50WydrZXknXTtcclxuICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICB0aGlzLnZlbG9jaXR5ID0gaW5zdHJ1bWVudFsndmVsb2NpdHknXTtcclxuICAvKiogQHR5cGUge0ludDE2QXJyYXl9ICovXHJcbiAgdGhpcy5idWZmZXIgPSBpbnN0cnVtZW50WydzYW1wbGUnXTtcclxuICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICB0aGlzLnBsYXliYWNrUmF0ZSA9IGluc3RydW1lbnRbJ2Jhc2VQbGF5YmFja1JhdGUnXTtcclxuICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICB0aGlzLnNhbXBsZVJhdGUgPSBpbnN0cnVtZW50WydzYW1wbGVSYXRlJ107XHJcbiAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgdGhpcy52b2x1bWUgPSBpbnN0cnVtZW50Wyd2b2x1bWUnXTtcclxuICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICB0aGlzLnBhbnBvdCA9IGluc3RydW1lbnRbJ3BhbnBvdCddO1xyXG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gIHRoaXMucGl0Y2hCZW5kID0gaW5zdHJ1bWVudFsncGl0Y2hCZW5kJ107XHJcbiAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgdGhpcy5waXRjaEJlbmRTZW5zaXRpdml0eSA9IGluc3RydW1lbnRbJ3BpdGNoQmVuZFNlbnNpdGl2aXR5J107XHJcbiAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgdGhpcy5tb2RFbnZUb1BpdGNoID0gaW5zdHJ1bWVudFsnbW9kRW52VG9QaXRjaCddO1xyXG5cclxuICAvLyBzdGF0ZVxyXG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gIHRoaXMuc3RhcnRUaW1lID0gY3R4LmN1cnJlbnRUaW1lO1xyXG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gIHRoaXMuY29tcHV0ZWRQbGF5YmFja1JhdGUgPSB0aGlzLnBsYXliYWNrUmF0ZTtcclxuXHJcbiAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAvLyBhdWRpbyBub2RlXHJcbiAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgLyoqIEB0eXBlIHtBdWRpb0J1ZmZlcn0gKi9cclxuICB0aGlzLmF1ZGlvQnVmZmVyO1xyXG4gIC8qKiBAdHlwZSB7QXVkaW9CdWZmZXJTb3VyY2VOb2RlfSAqL1xyXG4gIHRoaXMuYnVmZmVyU291cmNlO1xyXG4gIC8qKiBAdHlwZSB7QXVkaW9QYW5uZXJOb2RlfSAqL1xyXG4gIHRoaXMucGFubmVyO1xyXG4gIC8qKiBAdHlwZSB7QXVkaW9HYWluTm9kZX0gKi9cclxuICB0aGlzLmdhaW5PdXRwdXQ7XHJcblxyXG4gIC8vY29uc29sZS5sb2coaW5zdHJ1bWVudFsnbW9kQXR0YWNrJ10sIGluc3RydW1lbnRbJ21vZERlY2F5J10sIGluc3RydW1lbnRbJ21vZFN1c3RhaW4nXSwgaW5zdHJ1bWVudFsnbW9kUmVsZWFzZSddKTtcclxufTtcclxuXHJcblN5bnRoZXNpemVyTm90ZS5wcm90b3R5cGUubm90ZU9uID0gZnVuY3Rpb24oKSB7XHJcbiAgLyoqIEB0eXBlIHtBdWRpb0NvbnRleHR9ICovXHJcbiAgdmFyIGN0eCA9IHRoaXMuY3R4O1xyXG4gIC8qKiBAdHlwZSB7e1xyXG4gICAqICAgY2hhbm5lbDogbnVtYmVyLFxyXG4gICAqICAga2V5OiBudW1iZXIsXHJcbiAgICogICBzYW1wbGU6IFVpbnQ4QXJyYXksXHJcbiAgICogICBiYXNlUGxheWJhY2tSYXRlOiBudW1iZXIsXHJcbiAgICogICBsb29wU3RhcnQ6IG51bWJlcixcclxuICAgKiAgIGxvb3BFbmQ6IG51bWJlcixcclxuICAgKiAgIHZvbHVtZTogbnVtYmVyLFxyXG4gICAqICAgcGFucG90OiBudW1iZXJcclxuICAgKiB9fSAqL1xyXG4gIHZhciBpbnN0cnVtZW50ID0gdGhpcy5pbnN0cnVtZW50O1xyXG4gIC8qKiBAdHlwZSB7SW50MTZBcnJheX0gKi9cclxuICB2YXIgc2FtcGxlID0gdGhpcy5idWZmZXI7XHJcbiAgLyoqIEB0eXBlIHtBdWRpb0J1ZmZlcn0gKi9cclxuICB2YXIgYnVmZmVyO1xyXG4gIC8qKiBAdHlwZSB7RmxvYXQzMkFycmF5fSAqL1xyXG4gIHZhciBjaGFubmVsRGF0YTtcclxuICAvKiogQHR5cGUge0F1ZGlvQnVmZmVyU291cmNlTm9kZX0gKi9cclxuICB2YXIgYnVmZmVyU291cmNlO1xyXG4gIC8qKiBAdHlwZSB7QmlxdWFkRmlsdGVyTm9kZX0gKi9cclxuICB2YXIgZmlsdGVyO1xyXG4gIC8qKiBAdHlwZSB7QXVkaW9QYW5uZXJOb2RlfSAqL1xyXG4gIHZhciBwYW5uZXI7XHJcbiAgLyoqIEB0eXBlIHtBdWRpb0dhaW5Ob2RlfSAqL1xyXG4gIHZhciBvdXRwdXQ7XHJcbiAgLyoqIEB0eXBlIHtBdWRpb0dhaW59ICovXHJcbiAgdmFyIG91dHB1dEdhaW47XHJcbiAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgdmFyIG5vdyA9IHRoaXMuY3R4LmN1cnJlbnRUaW1lO1xyXG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gIHZhciB2b2xBdHRhY2sgPSBub3cgKyBpbnN0cnVtZW50Wyd2b2xBdHRhY2snXTtcclxuICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICB2YXIgbW9kQXR0YWNrID0gbm93ICsgaW5zdHJ1bWVudFsnbW9kQXR0YWNrJ107XHJcbiAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgdmFyIHZvbERlY2F5ID0gdm9sQXR0YWNrICsgaW5zdHJ1bWVudFsndm9sRGVjYXknXTtcclxuICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICB2YXIgbW9kRGVjYXkgPSBtb2RBdHRhY2sgKyBpbnN0cnVtZW50Wydtb2REZWNheSddO1xyXG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gIHZhciBsb29wU3RhcnQgPSBpbnN0cnVtZW50Wydsb29wU3RhcnQnXSAvIHRoaXMuc2FtcGxlUmF0ZTtcclxuICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICB2YXIgbG9vcEVuZCA9IGluc3RydW1lbnRbJ2xvb3BFbmQnXSAvIHRoaXMuc2FtcGxlUmF0ZTtcclxuICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICB2YXIgc3RhcnRUaW1lID0gaW5zdHJ1bWVudFsnc3RhcnQnXSAvIHRoaXMuc2FtcGxlUmF0ZTtcclxuICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICB2YXIgYmFzZUZyZXE7XHJcbiAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgdmFyIHBlZWtGcmVxO1xyXG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gIHZhciBzdXN0YWluRnJlcTtcclxuXHJcbiAgc2FtcGxlID0gc2FtcGxlLnN1YmFycmF5KDAsIHNhbXBsZS5sZW5ndGggKyBpbnN0cnVtZW50WydlbmQnXSk7XHJcbiAgYnVmZmVyID0gdGhpcy5hdWRpb0J1ZmZlciA9IGN0eC5jcmVhdGVCdWZmZXIoMSwgc2FtcGxlLmxlbmd0aCwgdGhpcy5zYW1wbGVSYXRlKTtcclxuICBjaGFubmVsRGF0YSA9IGJ1ZmZlci5nZXRDaGFubmVsRGF0YSgwKTtcclxuICBjaGFubmVsRGF0YS5zZXQoc2FtcGxlKTtcclxuXHJcbiAgLy8gYnVmZmVyIHNvdXJjZVxyXG4gIGJ1ZmZlclNvdXJjZSA9IHRoaXMuYnVmZmVyU291cmNlID0gY3R4LmNyZWF0ZUJ1ZmZlclNvdXJjZSgpO1xyXG4gIGJ1ZmZlclNvdXJjZS5idWZmZXIgPSBidWZmZXI7XHJcbiAgYnVmZmVyU291cmNlLmxvb3AgPSAodGhpcy5jaGFubmVsICE9PSA5KTtcclxuICBidWZmZXJTb3VyY2UubG9vcFN0YXJ0ID0gbG9vcFN0YXJ0O1xyXG4gIGJ1ZmZlclNvdXJjZS5sb29wRW5kICAgPSBsb29wRW5kO1xyXG4gIHRoaXMudXBkYXRlUGl0Y2hCZW5kKHRoaXMucGl0Y2hCZW5kKTtcclxuXHJcbiAgLy8gYXVkaW8gbm9kZVxyXG4gIHBhbm5lciA9IHRoaXMucGFubmVyID0gY3R4LmNyZWF0ZVBhbm5lcigpO1xyXG4gIG91dHB1dCA9IHRoaXMuZ2Fpbk91dHB1dCA9IGN0eC5jcmVhdGVHYWluTm9kZSgpO1xyXG4gIG91dHB1dEdhaW4gPSBvdXRwdXQuZ2FpbjtcclxuXHJcbiAgLy8gZmlsdGVyXHJcbiAgZmlsdGVyID0gdGhpcy5maWx0ZXIgPSBjdHguY3JlYXRlQmlxdWFkRmlsdGVyKCk7XHJcbiAgZmlsdGVyLnR5cGUgPSBmaWx0ZXIuTE9XUEFTUztcclxuXHJcbiAgLy8gcGFucG90XHJcbiAgcGFubmVyLnBhbm5pbmdNb2RlbCA9IDA7XHJcbiAgcGFubmVyLnNldFBvc2l0aW9uKFxyXG4gICAgTWF0aC5zaW4odGhpcy5wYW5wb3QgKiBNYXRoLlBJIC8gMiksXHJcbiAgICAwLFxyXG4gICAgTWF0aC5jb3ModGhpcy5wYW5wb3QgKiBNYXRoLlBJIC8gMilcclxuICApO1xyXG5cclxuICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gIC8vIEF0dGFjaywgRGVjYXksIFN1c3RhaW5cclxuICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gIG91dHB1dEdhaW4uc2V0VmFsdWVBdFRpbWUoMCwgbm93KTtcclxuICBvdXRwdXRHYWluLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKHRoaXMudm9sdW1lICogKHRoaXMudmVsb2NpdHkgLyAxMjcpLCB2b2xBdHRhY2spO1xyXG4gIG91dHB1dEdhaW4ubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUodGhpcy52b2x1bWUgKiAoMSAtIGluc3RydW1lbnRbJ3ZvbFN1c3RhaW4nXSksIHZvbERlY2F5KTtcclxuXHJcbiAgZmlsdGVyLlEuc2V0VmFsdWVBdFRpbWUoaW5zdHJ1bWVudFsnaW5pdGlhbEZpbHRlclEnXSAqIE1hdGgucG93KDEwLCAyMDApLCBub3cpO1xyXG4gIGJhc2VGcmVxID0gYW1vdW50VG9GcmVxKGluc3RydW1lbnRbJ2luaXRpYWxGaWx0ZXJGYyddKTtcclxuICBwZWVrRnJlcSA9IGFtb3VudFRvRnJlcShpbnN0cnVtZW50Wydpbml0aWFsRmlsdGVyRmMnXSArIGluc3RydW1lbnRbJ21vZEVudlRvRmlsdGVyRmMnXSk7XHJcbiAgc3VzdGFpbkZyZXEgPSBiYXNlRnJlcSArIChwZWVrRnJlcSAtIGJhc2VGcmVxKSAqICgxIC0gaW5zdHJ1bWVudFsnbW9kU3VzdGFpbiddKTtcclxuICBmaWx0ZXIuZnJlcXVlbmN5LnNldFZhbHVlQXRUaW1lKGJhc2VGcmVxLCBub3cpO1xyXG4gIGZpbHRlci5mcmVxdWVuY3kubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUocGVla0ZyZXEsIG1vZEF0dGFjayk7XHJcbiAgZmlsdGVyLmZyZXF1ZW5jeS5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShzdXN0YWluRnJlcSwgbW9kRGVjYXkpO1xyXG5cclxuICAvKipcclxuICAgKiBAcGFyYW0ge251bWJlcn0gdmFsXHJcbiAgICogQHJldHVybnMge251bWJlcn1cclxuICAgKi9cclxuICBmdW5jdGlvbiBhbW91bnRUb0ZyZXEodmFsKSB7XHJcbiAgICByZXR1cm4gTWF0aC5wb3coMiwgKHZhbCAtIDY5MDApIC8gMTIwMCkgKiA0NDA7XHJcbiAgfVxyXG5cclxuICAvLyBjb25uZWN0XHJcbiAgYnVmZmVyU291cmNlLmNvbm5lY3QoZmlsdGVyKTtcclxuICBmaWx0ZXIuY29ubmVjdChwYW5uZXIpO1xyXG4gIHBhbm5lci5jb25uZWN0KG91dHB1dCk7XHJcbiAgb3V0cHV0LmNvbm5lY3QodGhpcy5kZXN0aW5hdGlvbik7XHJcblxyXG4gIC8vIGZpcmVcclxuICBidWZmZXJTb3VyY2Uuc3RhcnQoMCwgc3RhcnRUaW1lKTtcclxufTtcclxuXHJcblxyXG5cclxuU3ludGhlc2l6ZXJOb3RlLnByb3RvdHlwZS5ub3RlT2ZmID0gZnVuY3Rpb24oKSB7XHJcbiAgLyoqIEB0eXBlIHt7XHJcbiAgICogICBjaGFubmVsOiBudW1iZXIsXHJcbiAgICogICBrZXk6IG51bWJlcixcclxuICAgKiAgIHNhbXBsZTogVWludDhBcnJheSxcclxuICAgKiAgIGJhc2VQbGF5YmFja1JhdGU6IG51bWJlcixcclxuICAgKiAgIGxvb3BTdGFydDogbnVtYmVyLFxyXG4gICAqICAgbG9vcEVuZDogbnVtYmVyLFxyXG4gICAqICAgdm9sdW1lOiBudW1iZXIsXHJcbiAgICogICBwYW5wb3Q6IG51bWJlclxyXG4gICAqIH19ICovXHJcbiAgdmFyIGluc3RydW1lbnQgPSB0aGlzLmluc3RydW1lbnQ7XHJcbiAgLyoqIEB0eXBlIHtBdWRpb0J1ZmZlclNvdXJjZU5vZGV9ICovXHJcbiAgdmFyIGJ1ZmZlclNvdXJjZSA9IHRoaXMuYnVmZmVyU291cmNlO1xyXG4gIC8qKiBAdHlwZSB7QXVkaW9HYWluTm9kZX0gKi9cclxuICB2YXIgb3V0cHV0ID0gdGhpcy5nYWluT3V0cHV0O1xyXG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gIHZhciBub3cgPSB0aGlzLmN0eC5jdXJyZW50VGltZTtcclxuICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICB2YXIgdm9sRW5kVGltZSA9IG5vdyArIGluc3RydW1lbnRbJ3ZvbFJlbGVhc2UnXTtcclxuICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICB2YXIgbW9kRW5kVGltZSA9IG5vdyArIGluc3RydW1lbnRbJ21vZFJlbGVhc2UnXTtcclxuXHJcbiAgaWYgKCF0aGlzLmF1ZGlvQnVmZmVyKSB7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gIC8vIFJlbGVhc2VcclxuICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gIG91dHB1dC5nYWluLmNhbmNlbFNjaGVkdWxlZFZhbHVlcygwKTtcclxuICBvdXRwdXQuZ2Fpbi5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZSgwLCB2b2xFbmRUaW1lKTtcclxuICBidWZmZXJTb3VyY2UucGxheWJhY2tSYXRlLmNhbmNlbFNjaGVkdWxlZFZhbHVlcygwKTtcclxuICBidWZmZXJTb3VyY2UucGxheWJhY2tSYXRlLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKHRoaXMuY29tcHV0ZWRQbGF5YmFja1JhdGUsIG1vZEVuZFRpbWUpO1xyXG5cclxuICBidWZmZXJTb3VyY2UubG9vcCA9IGZhbHNlO1xyXG4gIGJ1ZmZlclNvdXJjZS5zdG9wKHZvbEVuZFRpbWUpO1xyXG5cclxuICAvLyBkaXNjb25uZWN0XHJcbiAgLy8qXHJcbiAgc2V0VGltZW91dChcclxuICAgIChmdW5jdGlvbihub3RlKSB7XHJcbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcclxuICAgICAgICBub3RlLmJ1ZmZlclNvdXJjZS5kaXNjb25uZWN0KDApO1xyXG4gICAgICAgIG5vdGUucGFubmVyLmRpc2Nvbm5lY3QoMCk7XHJcbiAgICAgICAgbm90ZS5nYWluT3V0cHV0LmRpc2Nvbm5lY3QoMCk7XHJcbiAgICAgIH07XHJcbiAgICB9KSh0aGlzKSxcclxuICAgIGluc3RydW1lbnRbJ3ZvbFJlbGVhc2UnXSAqIDEwMDBcclxuICApO1xyXG4gIC8vKi9cclxufTtcclxuXHJcblN5bnRoZXNpemVyTm90ZS5wcm90b3R5cGUuc2NoZWR1bGVQbGF5YmFja1JhdGUgPSBmdW5jdGlvbigpIHtcclxuICB2YXIgcGxheWJhY2tSYXRlID0gdGhpcy5idWZmZXJTb3VyY2UucGxheWJhY2tSYXRlO1xyXG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gIHZhciBjb21wdXRlZCA9IHRoaXMuY29tcHV0ZWRQbGF5YmFja1JhdGU7XHJcbiAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgdmFyIHN0YXJ0ID0gdGhpcy5zdGFydFRpbWU7XHJcbiAgLyoqIEB0eXBlIHtPYmplY3R9ICovXHJcbiAgdmFyIGluc3RydW1lbnQgPSB0aGlzLmluc3RydW1lbnQ7XHJcbiAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgdmFyIG1vZEF0dGFjayA9IHN0YXJ0ICsgaW5zdHJ1bWVudFsnbW9kQXR0YWNrJ107XHJcbiAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgdmFyIG1vZERlY2F5ID0gbW9kQXR0YWNrICsgaW5zdHJ1bWVudFsnbW9kRGVjYXknXTtcclxuICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICB2YXIgcGVla1BpdGNoID0gY29tcHV0ZWQgKiBNYXRoLnBvdyhcclxuICAgIE1hdGgucG93KDIsIDEvMTIpLFxyXG4gICAgdGhpcy5tb2RFbnZUb1BpdGNoICogdGhpcy5pbnN0cnVtZW50WydzY2FsZVR1bmluZyddXHJcbiAgKTtcclxuXHJcbiAgcGxheWJhY2tSYXRlLmNhbmNlbFNjaGVkdWxlZFZhbHVlcygwKTtcclxuICBwbGF5YmFja1JhdGUuc2V0VmFsdWVBdFRpbWUoY29tcHV0ZWQsIHN0YXJ0KTtcclxuICBwbGF5YmFja1JhdGUubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUocGVla1BpdGNoLCBtb2RBdHRhY2spO1xyXG4gIHBsYXliYWNrUmF0ZS5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShjb21wdXRlZCArIChwZWVrUGl0Y2ggLSBjb21wdXRlZCkgKiAoMSAtIGluc3RydW1lbnRbJ21vZFN1c3RhaW4nXSksIG1vZERlY2F5KTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gcGl0Y2hCZW5kXHJcbiAqL1xyXG5TeW50aGVzaXplck5vdGUucHJvdG90eXBlLnVwZGF0ZVBpdGNoQmVuZCA9IGZ1bmN0aW9uKHBpdGNoQmVuZCkge1xyXG4gIHRoaXMuY29tcHV0ZWRQbGF5YmFja1JhdGUgPSB0aGlzLnBsYXliYWNrUmF0ZSAqIE1hdGgucG93KFxyXG4gICAgTWF0aC5wb3coMiwgMS8xMiksXHJcbiAgICAoXHJcbiAgICAgIHRoaXMucGl0Y2hCZW5kU2Vuc2l0aXZpdHkgKiAoXHJcbiAgICAgICAgcGl0Y2hCZW5kIC8gKHBpdGNoQmVuZCA8IDAgPyA4MTkyIDogODE5MSlcclxuICAgICAgKVxyXG4gICAgKSAqIHRoaXMuaW5zdHJ1bWVudFsnc2NhbGVUdW5pbmcnXVxyXG4gICk7XHJcbiAgdGhpcy5zY2hlZHVsZVBsYXliYWNrUmF0ZSgpO1xyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgU3ludGhlc2l6ZXJOb3RlXHJcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL3NvdW5kX2ZvbnRfc3ludGhfbm90ZS5qc1xuICoqLyJdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCBlMjk4YjliNTJjYWJlODJhNzhjYSIsIndlYnBhY2s6Ly8vLi9zcmMvY29uc3RhbnRzLnRzIiwid2VicGFjazovLy8uL3NyYy9zZjIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3JpZmYudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3NmMl9kYXRhLnRzIiwid2VicGFjazovLy8uL3NyYy9oZWxwZXIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3N0cmVhbS50cyIsIndlYnBhY2s6Ly8vLi9leHBvcnQvc3ludGguanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3dtbC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvc291bmRfZm9udF9zeW50aC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvc291bmRfZm9udF9zeW50aF9ub3RlLnRzIiwid2VicGFjazovLy8uL3NyYy9zb3VuZF9mb250LnRzIiwid2VicGFjazovLy8uL3NyYy9zeW50aF92aWV3LnRzIiwid2VicGFjazovLy8uL3NyYy9wcm9ncmFtX25hbWVzLnRzIiwid2VicGFjazovLy8uL3NyYy9taWRpX21lc3NhZ2VfaGFuZGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsTztBQ1ZBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBMkIsMEJBQTBCLEVBQUU7QUFD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QU8sRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNoRCxLQUFLO1lBQ1AsS0FBSyxJQUFJLENBQUUsMkJBQTJCO2dCQUNwQyxZQUFZO2dCQUNaLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ25CLEtBQUssSUFBSSxDQUFFLGVBQWU7d0JBQ3hCLE9BQU87d0JBQ1AsS0FBSztvQkFDUCxLQUFLLElBQUksQ0FBRSxXQUFXO3dCQUNwQiw0QkFBNEI7d0JBQzVCLFdBQVc7d0JBQ1gsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs0QkFDbkIsS0FBSyxJQUFJLENBQUUsaUJBQWlCO2dDQUMxQixXQUFXO2dDQUNYLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0NBQ25CLEtBQUssSUFBSSxFQUFFLENBQUM7d0NBQ1YsSUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQzt3Q0FDN0MsSUFBTSxVQUFVLEdBQUcsTUFBTSxHQUFHLENBQUM7d0NBQzdCLEtBQUssQ0FBQyxlQUFlLENBQUMsTUFBTSxHQUFHLFVBQVUsQ0FBQzt3Q0FDMUMsS0FBSztvQ0FDUCxDQUFDO29DQUNEO3dDQUNFLEtBQUs7Z0NBQ1QsQ0FBQztnQ0FDRCxLQUFLOzRCQUNQO2dDQUNFLEtBQUs7d0JBQ1QsQ0FBQzt3QkFDRCxLQUFLO29CQUNQO3dCQUNFLEtBQUs7Z0JBQ1QsQ0FBQztnQkFDRCxLQUFLO1lBQ1AsUUFBUyxnQkFBZ0I7Z0JBQ3ZCLEtBQUs7UUFDVCxDQUFDO0lBQ0gsQ0FBQztJQUNILHlCQUFDO0FBQUQsQ0FBQyIsImZpbGUiOiJzZjIuc3ludGguanMiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJzeW50aFwiXSA9IGZhY3RvcnkoKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJzeW50aFwiXSA9IGZhY3RvcnkoKTtcbn0pKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyA/IHNlbGYgOiB0aGlzLCBmdW5jdGlvbigpIHtcbnJldHVybiBcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbiBcdFx0XHRcdGdldDogZ2V0dGVyXG4gXHRcdFx0fSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gNyk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjay9ib290c3RyYXAgZTI5OGI5YjUyY2FiZTgyYTc4Y2EiLCJleHBvcnQgY29uc3QgR2VuZXJhdG9yRW51bWVyYXRvclRhYmxlID0gW1xyXG4gICdzdGFydEFkZHJzT2Zmc2V0JyxcclxuICAnZW5kQWRkcnNPZmZzZXQnLFxyXG4gICdzdGFydGxvb3BBZGRyc09mZnNldCcsXHJcbiAgJ2VuZGxvb3BBZGRyc09mZnNldCcsXHJcbiAgJ3N0YXJ0QWRkcnNDb2Fyc2VPZmZzZXQnLFxyXG4gICdtb2RMZm9Ub1BpdGNoJyxcclxuICAndmliTGZvVG9QaXRjaCcsXHJcbiAgJ21vZEVudlRvUGl0Y2gnLFxyXG4gICdpbml0aWFsRmlsdGVyRmMnLFxyXG4gICdpbml0aWFsRmlsdGVyUScsXHJcbiAgJ21vZExmb1RvRmlsdGVyRmMnLFxyXG4gICdtb2RFbnZUb0ZpbHRlckZjJyxcclxuICAnZW5kQWRkcnNDb2Fyc2VPZmZzZXQnLFxyXG4gICdtb2RMZm9Ub1ZvbHVtZScsXHJcbiAgdW5kZWZpbmVkLCAvLyAxNFxyXG4gICdjaG9ydXNFZmZlY3RzU2VuZCcsXHJcbiAgJ3JldmVyYkVmZmVjdHNTZW5kJyxcclxuICAncGFuJyxcclxuICB1bmRlZmluZWQsdW5kZWZpbmVkLHVuZGVmaW5lZCwgLy8gMTgsMTksMjBcclxuICAnZGVsYXlNb2RMRk8nLFxyXG4gICdmcmVxTW9kTEZPJyxcclxuICAnZGVsYXlWaWJMRk8nLFxyXG4gICdmcmVxVmliTEZPJyxcclxuICAnZGVsYXlNb2RFbnYnLFxyXG4gICdhdHRhY2tNb2RFbnYnLFxyXG4gICdob2xkTW9kRW52JyxcclxuICAnZGVjYXlNb2RFbnYnLFxyXG4gICdzdXN0YWluTW9kRW52JyxcclxuICAncmVsZWFzZU1vZEVudicsXHJcbiAgJ2tleW51bVRvTW9kRW52SG9sZCcsXHJcbiAgJ2tleW51bVRvTW9kRW52RGVjYXknLFxyXG4gICdkZWxheVZvbEVudicsXHJcbiAgJ2F0dGFja1ZvbEVudicsXHJcbiAgJ2hvbGRWb2xFbnYnLFxyXG4gICdkZWNheVZvbEVudicsXHJcbiAgJ3N1c3RhaW5Wb2xFbnYnLFxyXG4gICdyZWxlYXNlVm9sRW52JyxcclxuICAna2V5bnVtVG9Wb2xFbnZIb2xkJyxcclxuICAna2V5bnVtVG9Wb2xFbnZEZWNheScsXHJcbiAgJ2luc3RydW1lbnQnLFxyXG4gIHVuZGVmaW5lZCwgLy8gNDJcclxuICAna2V5UmFuZ2UnLFxyXG4gICd2ZWxSYW5nZScsXHJcbiAgJ3N0YXJ0bG9vcEFkZHJzQ29hcnNlT2Zmc2V0JyxcclxuICAna2V5bnVtJyxcclxuICAndmVsb2NpdHknLFxyXG4gICdpbml0aWFsQXR0ZW51YXRpb24nLFxyXG4gIHVuZGVmaW5lZCwgLy8gNDlcclxuICAnZW5kbG9vcEFkZHJzQ29hcnNlT2Zmc2V0JyxcclxuICAnY29hcnNlVHVuZScsXHJcbiAgJ2ZpbmVUdW5lJyxcclxuICAnc2FtcGxlSUQnLFxyXG4gICdzYW1wbGVNb2RlcycsXHJcbiAgdW5kZWZpbmVkLCAvLyA1NVxyXG4gICdzY2FsZVR1bmluZycsXHJcbiAgJ2V4Y2x1c2l2ZUNsYXNzJyxcclxuICAnb3ZlcnJpZGluZ1Jvb3RLZXknXHJcbl1cclxuXHJcbmV4cG9ydCBjb25zdCBJbmZvTmFtZVRhYmxlID0ge1xyXG4gIElDTVQ6IFwiY29tbWVudFwiLFxyXG4gIElDT1A6IFwiY29weXJpZ2h0XCIsXHJcbiAgSUNSRDogXCJjcmVhdGlvbl9kYXRlXCIsXHJcbiAgSUVORzogXCJlbmdpbmVlclwiLFxyXG4gIElOQU06IFwibmFtZVwiLFxyXG4gIElQUkQ6IFwicHJvZHVjdFwiLFxyXG4gIElTRlQ6IFwic29mdHdhcmVcIixcclxuICBpZmlsOiBcInZlcnNpb25cIixcclxuICBpc25nOiBcInNvdW5kX2VuZ2luZVwiLFxyXG4gIGlyb206IFwicm9tX25hbWVcIixcclxuICBpdmVyOiBcInJvbV92ZXJzaW9uXCJcclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvY29uc3RhbnRzLnRzIiwiaW1wb3J0IHsgUGFyc2VyLCBDaHVuayB9IGZyb20gXCIuL3JpZmYudHNcIlxyXG5pbXBvcnQgeyBQcmVzZXRIZWFkZXIsIFNhbXBsZSwgUHJlc2V0QmFnLCBJbnN0cnVtZW50LCBJbnN0cnVtZW50QmFnLCBNb2R1bGF0b3JMaXN0LCBHZW5lcmF0b3JMaXN0IH0gZnJvbSBcIi4vc2YyX2RhdGEudHNcIlxyXG5pbXBvcnQgeyByZWFkU3RyaW5nIH0gZnJvbSBcIi4vaGVscGVyLnRzXCJcclxuaW1wb3J0IFN0cmVhbSBmcm9tIFwiLi9zdHJlYW0udHNcIlxyXG5pbXBvcnQgeyBJbmZvTmFtZVRhYmxlIH0gZnJvbSBcIi4vY29uc3RhbnRzLnRzXCJcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2FtcGxlSGVhZGVyIHtcclxuICBzYW1wbGVSYXRlOiBudW1iZXJcclxuICBzYW1wbGVOYW1lOiBudW1iZXJcclxuICBwaXRjaENvcnJlY3Rpb246IG51bWJlclxyXG4gIHN0YXJ0TG9vcDogbnVtYmVyXHJcbiAgZW5kTG9vcDogbnVtYmVyXHJcbiAgb3JpZ2luYWxQaXRjaDogbnVtYmVyXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSW5zdHJ1bWVudFpvbmUge1xyXG4gIGluc3RydW1lbnRHZW5lcmF0b3JJbmRleDogbnVtYmVyXHJcbiAgaW5zdHJ1bWVudE1vZHVsYXRvckluZGV4OiBudW1iZXJcclxuICBwcmVzZXRNb2R1bGF0b3JJbmRleDogbnVtYmVyXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIHtcclxuICBpbnB1dDogVWludDhBcnJheVxyXG4gIHBhcnNlck9wdGlvbjoge30gfCB1bmRlZmluZWRcclxuICBwcmVzZXRIZWFkZXI6IHt9W11cclxuICBwcmVzZXRab25lOiB7fVtdXHJcbiAgcHJlc2V0Wm9uZU1vZHVsYXRvcjoge31bXVxyXG4gIHByZXNldFpvbmVHZW5lcmF0b3I6IHt9W11cclxuICBpbnN0cnVtZW50OiB7IGluc3RydW1lbnROYW1lOiBzdHJpbmcsIGluc3RydW1lbnRCYWdJbmRleDogbnVtYmVyIH1bXVxyXG4gIGluc3RydW1lbnRab25lOiBJbnN0cnVtZW50Wm9uZVtdXHJcbiAgaW5zdHJ1bWVudFpvbmVNb2R1bGF0b3I6IHt9W11cclxuICBpbnN0cnVtZW50Wm9uZUdlbmVyYXRvcjoge31bXVxyXG4gIHNhbXBsZUhlYWRlcjogU2FtcGxlSGVhZGVyW11cclxuICBzYW1wbGU6IEludDE2QXJyYXlbXVxyXG4gIHNhbXBsaW5nRGF0YTogQ2h1bmtcclxuICBpbmZvOiB7fVxyXG5cclxuICBjb25zdHJ1Y3RvcihpbnB1dDogVWludDhBcnJheSwgb3B0X3BhcmFtczogeyBwYXJzZXJPcHRpb24/OiB7fSB9ID0ge30pIHtcclxuICAgIHRoaXMuaW5wdXQgPSBpbnB1dFxyXG4gICAgdGhpcy5wYXJzZXJPcHRpb24gPSBvcHRfcGFyYW1zLnBhcnNlck9wdGlvblxyXG4gIH1cclxuXHJcbiAgcGFyc2UoKSB7XHJcbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgUGFyc2VyKHRoaXMuaW5wdXQsIHRoaXMucGFyc2VyT3B0aW9uKVxyXG5cclxuICAgIC8vIHBhcnNlIFJJRkYgY2h1bmtcclxuICAgIHBhcnNlci5wYXJzZSgpXHJcbiAgICBpZiAocGFyc2VyLmNodW5rTGlzdC5sZW5ndGggIT09IDEpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCd3cm9uZyBjaHVuayBsZW5ndGgnKVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNodW5rID0gcGFyc2VyLmdldENodW5rKDApXHJcbiAgICBpZiAoY2h1bmsgPT09IG51bGwpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjaHVuayBub3QgZm91bmQnKVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucGFyc2VSaWZmQ2h1bmsoY2h1bmssIHRoaXMuaW5wdXQpXHJcbiAgICB0aGlzLmlucHV0ID0gbnVsbFxyXG4gIH1cclxuXHJcbiAgcGFyc2VSaWZmQ2h1bmsoY2h1bms6IENodW5rLCBkYXRhOiBVaW50OEFycmF5KSB7XHJcbiAgICBjb25zdCBjaHVua0xpc3QgPSBnZXRDaHVua0xpc3QoY2h1bmssIGRhdGEsIFwiUklGRlwiLCBcInNmYmtcIilcclxuXHJcbiAgICBpZiAoY2h1bmtMaXN0Lmxlbmd0aCAhPT0gMykge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgc2ZiayBzdHJ1Y3R1cmUnKVxyXG4gICAgfVxyXG5cclxuICAgIC8vIElORk8tbGlzdFxyXG4gICAgdGhpcy5pbmZvID0gcGFyc2VJbmZvTGlzdChjaHVua0xpc3RbMF0sIGRhdGEpXHJcblxyXG4gICAgLy8gc2R0YS1saXN0XHJcbiAgICB0aGlzLnNhbXBsaW5nRGF0YSA9IHBhcnNlU2R0YUxpc3QoY2h1bmtMaXN0WzFdLCBkYXRhKVxyXG5cclxuICAgIC8vIHBkdGEtbGlzdFxyXG4gICAgdGhpcy5wYXJzZVBkdGFMaXN0KGNodW5rTGlzdFsyXSwgZGF0YSlcclxuICB9XHJcblxyXG4gIHBhcnNlUGR0YUxpc3QoY2h1bms6IENodW5rLCBkYXRhOiBVaW50OEFycmF5KSB7XHJcbiAgICBjb25zdCBjaHVua0xpc3QgPSBnZXRDaHVua0xpc3QoY2h1bmssIGRhdGEsIFwiTElTVFwiLCBcInBkdGFcIilcclxuXHJcbiAgICAvLyBjaGVjayBudW1iZXIgb2YgY2h1bmtzXHJcbiAgICBpZiAoY2h1bmtMaXN0Lmxlbmd0aCAhPT0gOSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcGR0YSBjaHVuaycpXHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5wcmVzZXRIZWFkZXIgPSBwYXJzZVBoZHIoY2h1bmtMaXN0WzBdLCBkYXRhKVxyXG4gICAgdGhpcy5wcmVzZXRab25lID0gcGFyc2VQYmFnKGNodW5rTGlzdFsxXSwgZGF0YSlcclxuICAgIHRoaXMucHJlc2V0Wm9uZU1vZHVsYXRvciA9IHBhcnNlUG1vZChjaHVua0xpc3RbMl0sIGRhdGEpXHJcbiAgICB0aGlzLnByZXNldFpvbmVHZW5lcmF0b3IgPSBwYXJzZVBnZW4oY2h1bmtMaXN0WzNdLCBkYXRhKVxyXG4gICAgdGhpcy5pbnN0cnVtZW50ID0gcGFyc2VJbnN0KGNodW5rTGlzdFs0XSwgZGF0YSkgYXMgYW55XHJcbiAgICB0aGlzLmluc3RydW1lbnRab25lID0gcGFyc2VJYmFnKGNodW5rTGlzdFs1XSwgZGF0YSkgYXMgSW5zdHJ1bWVudFpvbmVbXVxyXG4gICAgdGhpcy5pbnN0cnVtZW50Wm9uZU1vZHVsYXRvciA9IHBhcnNlSW1vZChjaHVua0xpc3RbNl0sIGRhdGEpXHJcbiAgICB0aGlzLmluc3RydW1lbnRab25lR2VuZXJhdG9yID0gcGFyc2VJZ2VuKGNodW5rTGlzdFs3XSwgZGF0YSlcclxuICAgIHRoaXMuc2FtcGxlSGVhZGVyID0gcGFyc2VTaGRyKGNodW5rTGlzdFs4XSwgZGF0YSkgYXMgU2FtcGxlSGVhZGVyW11cclxuICAgIHRoaXMuc2FtcGxlID0gbG9hZFNhbXBsZSh0aGlzLnNhbXBsZUhlYWRlciwgdGhpcy5zYW1wbGluZ0RhdGEub2Zmc2V0LCBkYXRhKVxyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0Q2h1bmtMaXN0KGNodW5rLCBkYXRhLCBleHBlY3RlZFR5cGUsIGV4cGVjdGVkU2lnbmF0dXJlKSB7XHJcbiAgLy8gY2hlY2sgcGFyc2UgdGFyZ2V0XHJcbiAgaWYgKGNodW5rLnR5cGUgIT09IGV4cGVjdGVkVHlwZSkge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGNodW5rIHR5cGU6JyArIGNodW5rLnR5cGUpXHJcbiAgfVxyXG5cclxuICBjb25zdCBzdHJlYW0gPSBuZXcgU3RyZWFtKGRhdGEsIGNodW5rLm9mZnNldClcclxuXHJcbiAgLy8gY2hlY2sgc2lnbmF0dXJlXHJcbiAgY29uc3Qgc2lnbmF0dXJlID0gc3RyZWFtLnJlYWRTdHJpbmcoNClcclxuICBpZiAoc2lnbmF0dXJlICE9PSBleHBlY3RlZFNpZ25hdHVyZSkge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHNpZ25hdHVyZTonICsgc2lnbmF0dXJlKVxyXG4gIH1cclxuXHJcbiAgLy8gcmVhZCBzdHJ1Y3R1cmVcclxuICBjb25zdCBwYXJzZXIgPSBuZXcgUGFyc2VyKGRhdGEsIHsnaW5kZXgnOiBzdHJlYW0uaXAsICdsZW5ndGgnOiBjaHVuay5zaXplIC0gNH0pXHJcbiAgcGFyc2VyLnBhcnNlKClcclxuXHJcbiAgcmV0dXJuIHBhcnNlci5jaHVua0xpc3RcclxufVxyXG5cclxuZnVuY3Rpb24gcGFyc2VJbmZvTGlzdChjaHVuazogQ2h1bmssIGRhdGE6IFVpbnQ4QXJyYXkpOiB7fSB7XHJcbiAgY29uc3QgaW5mbyA9IHt9XHJcbiAgY29uc3QgY2h1bmtMaXN0ID0gZ2V0Q2h1bmtMaXN0KGNodW5rLCBkYXRhLCBcIkxJU1RcIiwgXCJJTkZPXCIpXHJcblxyXG4gIGZvciAobGV0IHAgb2YgY2h1bmtMaXN0KSB7XHJcbiAgICBjb25zdCB7IG9mZnNldCwgc2l6ZSwgdHlwZSB9ID0gcFxyXG4gICAgY29uc3QgbmFtZSA9IEluZm9OYW1lVGFibGVbdHlwZV0gfHwgdHlwZVxyXG4gICAgaW5mb1tuYW1lXSA9IHJlYWRTdHJpbmcoZGF0YSwgb2Zmc2V0LCBvZmZzZXQgKyBzaXplKVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGluZm9cclxufVxyXG5cclxuZnVuY3Rpb24gcGFyc2VTZHRhTGlzdChjaHVuazogQ2h1bmssIGRhdGE6IFVpbnQ4QXJyYXkpOiBDaHVuayB7XHJcbiAgY29uc3QgY2h1bmtMaXN0ID0gZ2V0Q2h1bmtMaXN0KGNodW5rLCBkYXRhLCBcIkxJU1RcIiwgXCJzZHRhXCIpXHJcblxyXG4gIGlmIChjaHVua0xpc3QubGVuZ3RoICE9PSAxKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RPRE8nKVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGNodW5rTGlzdFswXVxyXG59XHJcblxyXG5mdW5jdGlvbiBwYXJzZUNodW5rKGNodW5rOiBDaHVuaywgZGF0YTogVWludDhBcnJheSwgdHlwZTogc3RyaW5nLCBmYWN0b3J5KToge31bXSB7XHJcbiAgY29uc3QgcmVzdWx0ID0gW11cclxuXHJcbiAgaWYgKGNodW5rLnR5cGUgIT09IHR5cGUpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBjaHVuayB0eXBlOicgICsgY2h1bmsudHlwZSlcclxuICB9XHJcbiAgXHJcbiAgY29uc3Qgc3RyZWFtID0gbmV3IFN0cmVhbShkYXRhLCBjaHVuay5vZmZzZXQpXHJcbiAgY29uc3Qgc2l6ZSA9IGNodW5rLm9mZnNldCArIGNodW5rLnNpemVcclxuICBcclxuICB3aGlsZSAoc3RyZWFtLmlwIDwgc2l6ZSkge1xyXG4gICAgcmVzdWx0LnB1c2goZmFjdG9yeShzdHJlYW0pKVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHJlc3VsdFxyXG59XHJcblxyXG5jb25zdCBwYXJzZVBoZHIgPSAoY2h1bmssIGRhdGEpID0+IHBhcnNlQ2h1bmsoY2h1bmssIGRhdGEsIFwicGhkclwiLCBzdHJlYW0gPT4gUHJlc2V0SGVhZGVyLnBhcnNlKHN0cmVhbSkpXHJcbmNvbnN0IHBhcnNlUGJhZyA9IChjaHVuaywgZGF0YSkgPT4gcGFyc2VDaHVuayhjaHVuaywgZGF0YSwgXCJwYmFnXCIsIHN0cmVhbSA9PiBQcmVzZXRCYWcucGFyc2Uoc3RyZWFtKSlcclxuY29uc3QgcGFyc2VJbnN0ID0gKGNodW5rLCBkYXRhKSA9PiBwYXJzZUNodW5rKGNodW5rLCBkYXRhLCBcImluc3RcIiwgc3RyZWFtID0+IEluc3RydW1lbnQucGFyc2Uoc3RyZWFtKSlcclxuY29uc3QgcGFyc2VJYmFnID0gKGNodW5rLCBkYXRhKSA9PiBwYXJzZUNodW5rKGNodW5rLCBkYXRhLCBcImliYWdcIiwgc3RyZWFtID0+IEluc3RydW1lbnRCYWcucGFyc2Uoc3RyZWFtKSlcclxuY29uc3QgcGFyc2VQbW9kID0gKGNodW5rLCBkYXRhKSA9PiBwYXJzZUNodW5rKGNodW5rLCBkYXRhLCBcInBtb2RcIiwgc3RyZWFtID0+IE1vZHVsYXRvckxpc3QucGFyc2Uoc3RyZWFtKSlcclxuY29uc3QgcGFyc2VJbW9kID0gKGNodW5rLCBkYXRhKSA9PiBwYXJzZUNodW5rKGNodW5rLCBkYXRhLCBcImltb2RcIiwgc3RyZWFtID0+IE1vZHVsYXRvckxpc3QucGFyc2Uoc3RyZWFtKSlcclxuY29uc3QgcGFyc2VQZ2VuID0gKGNodW5rLCBkYXRhKSA9PiBwYXJzZUNodW5rKGNodW5rLCBkYXRhLCBcInBnZW5cIiwgc3RyZWFtID0+IEdlbmVyYXRvckxpc3QucGFyc2Uoc3RyZWFtKSlcclxuY29uc3QgcGFyc2VJZ2VuID0gKGNodW5rLCBkYXRhKSA9PiBwYXJzZUNodW5rKGNodW5rLCBkYXRhLCBcImlnZW5cIiwgc3RyZWFtID0+IEdlbmVyYXRvckxpc3QucGFyc2Uoc3RyZWFtKSlcclxuY29uc3QgcGFyc2VTaGRyID0gKGNodW5rLCBkYXRhKSA9PiBwYXJzZUNodW5rKGNodW5rLCBkYXRhLCBcInNoZHJcIiwgc3RyZWFtID0+IFNhbXBsZS5wYXJzZShzdHJlYW0pKVxyXG5cclxuZnVuY3Rpb24gYWRqdXN0U2FtcGxlRGF0YShzYW1wbGUsIHNhbXBsZVJhdGUpIHtcclxuICBsZXQgbXVsdGlwbHkgPSAxXHJcblxyXG4gIC8vIGJ1ZmZlclxyXG4gIHdoaWxlIChzYW1wbGVSYXRlIDwgMjIwNTApIHtcclxuICAgIGNvbnN0IG5ld1NhbXBsZSA9IG5ldyBJbnQxNkFycmF5KHNhbXBsZS5sZW5ndGggKiAyKVxyXG4gICAgZm9yIChsZXQgaSA9IDAsIGogPSAwLCBpbCA9IHNhbXBsZS5sZW5ndGg7IGkgPCBpbDsgKytpKSB7XHJcbiAgICAgIG5ld1NhbXBsZVtqKytdID0gc2FtcGxlW2ldXHJcbiAgICAgIG5ld1NhbXBsZVtqKytdID0gc2FtcGxlW2ldXHJcbiAgICB9XHJcbiAgICBzYW1wbGUgPSBuZXdTYW1wbGVcclxuICAgIG11bHRpcGx5ICo9IDJcclxuICAgIHNhbXBsZVJhdGUgKj0gMlxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIHNhbXBsZSxcclxuICAgIG11bHRpcGx5XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBsb2FkU2FtcGxlKHNhbXBsZUhlYWRlciwgc2FtcGxpbmdEYXRhT2Zmc2V0LCBkYXRhKTogSW50MTZBcnJheVtdIHtcclxuICBjb25zdCBzYW1wbGVzID0gW11cclxuICBmb3IgKGxldCBoZWFkZXIgb2Ygc2FtcGxlSGVhZGVyKSB7XHJcbiAgICBsZXQgc2FtcGxlID0gbmV3IEludDE2QXJyYXkobmV3IFVpbnQ4QXJyYXkoZGF0YS5zdWJhcnJheShcclxuICAgICAgc2FtcGxpbmdEYXRhT2Zmc2V0ICsgaGVhZGVyLnN0YXJ0ICogMixcclxuICAgICAgc2FtcGxpbmdEYXRhT2Zmc2V0ICsgaGVhZGVyLmVuZCAgICogMlxyXG4gICAgKSkuYnVmZmVyKVxyXG4gICAgaWYgKGhlYWRlci5zYW1wbGVSYXRlID4gMCkge1xyXG4gICAgICBjb25zdCBhZGp1c3QgPSBhZGp1c3RTYW1wbGVEYXRhKHNhbXBsZSwgaGVhZGVyLnNhbXBsZVJhdGUpXHJcbiAgICAgIHNhbXBsZSA9IGFkanVzdC5zYW1wbGVcclxuICAgICAgaGVhZGVyLnNhbXBsZVJhdGUgKj0gYWRqdXN0Lm11bHRpcGx5XHJcbiAgICAgIGhlYWRlci5zdGFydExvb3AgKj0gYWRqdXN0Lm11bHRpcGx5XHJcbiAgICAgIGhlYWRlci5lbmRMb29wICo9IGFkanVzdC5tdWx0aXBseVxyXG4gICAgfVxyXG4gICAgc2FtcGxlcy5wdXNoKHNhbXBsZSlcclxuICB9XHJcbiAgcmV0dXJuIHNhbXBsZXNcclxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9zZjIudHMiLCJleHBvcnQgY2xhc3MgUGFyc2VyIHtcclxuICBjaHVua0xpc3Q6IENodW5rW10gPSBbXVxyXG4gIFxyXG4gIHByaXZhdGUgaW5wdXQ6IFVpbnQ4QXJyYXlcclxuICBwcml2YXRlIGlwOiBudW1iZXJcclxuICBwcml2YXRlIGxlbmd0aDogbnVtYmVyXHJcbiAgcHJpdmF0ZSBvZmZzZXQ6IG51bWJlclxyXG4gIHByaXZhdGUgcGFkZGluZzogYm9vbGVhblxyXG4gIHByaXZhdGUgYmlnRW5kaWFuOiBib29sZWFuXHJcblxyXG4gIGNvbnN0cnVjdG9yKGlucHV0OiBVaW50OEFycmF5LCBvcHRfcGFyYW1zOiB7fSA9IHt9KSB7XHJcbiAgICB0aGlzLmlucHV0ID0gaW5wdXRcclxuICAgIHRoaXMuaXAgPSBvcHRfcGFyYW1zWydpbmRleCddIHx8IDBcclxuICAgIHRoaXMubGVuZ3RoID0gb3B0X3BhcmFtc1snbGVuZ3RoJ10gfHwgaW5wdXQubGVuZ3RoIC0gdGhpcy5pcFxyXG4gICAgdGhpcy5jaHVua0xpc3QgPSBbXVxyXG4gICAgdGhpcy5vZmZzZXQgPSB0aGlzLmlwXHJcbiAgICB0aGlzLnBhZGRpbmcgPVxyXG4gICAgICBvcHRfcGFyYW1zWydwYWRkaW5nJ10gIT09IHZvaWQgMCA/IG9wdF9wYXJhbXNbJ3BhZGRpbmcnXSA6IHRydWVcclxuICAgIHRoaXMuYmlnRW5kaWFuID1cclxuICAgICAgb3B0X3BhcmFtc1snYmlnRW5kaWFuJ10gIT09IHZvaWQgMCA/IG9wdF9wYXJhbXNbJ2JpZ0VuZGlhbiddIDogZmFsc2VcclxuICB9XHJcbiAgXHJcbiAgcGFyc2UoKSB7XHJcbiAgICBjb25zdCBsZW5ndGggPSB0aGlzLmxlbmd0aCArIHRoaXMub2Zmc2V0XHJcblxyXG4gICAgdGhpcy5jaHVua0xpc3QgPSBbXVxyXG5cclxuICAgIHdoaWxlICh0aGlzLmlwIDwgbGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMucGFyc2VDaHVuaygpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwYXJzZUNodW5rKCkge1xyXG4gICAgY29uc3QgaW5wdXQgPSB0aGlzLmlucHV0XHJcbiAgICBsZXQgaXAgPSB0aGlzLmlwXHJcbiAgICBsZXQgc2l6ZVxyXG5cclxuICAgIHRoaXMuY2h1bmtMaXN0LnB1c2gobmV3IENodW5rKFxyXG4gICAgICBTdHJpbmcuZnJvbUNoYXJDb2RlKGlucHV0W2lwKytdLCBpbnB1dFtpcCsrXSwgaW5wdXRbaXArK10sIGlucHV0W2lwKytdKSxcclxuICAgICAgKHNpemUgPSB0aGlzLmJpZ0VuZGlhbiA/XHJcbiAgICAgICAgKChpbnB1dFtpcCsrXSA8PCAyNCkgfCAoaW5wdXRbaXArK10gPDwgMTYpIHxcclxuICAgICAgICAgIChpbnB1dFtpcCsrXSA8PCAgOCkgfCAoaW5wdXRbaXArK10gICAgICApKSA+Pj4gMCA6XHJcbiAgICAgICAgKChpbnB1dFtpcCsrXSAgICAgICkgfCAoaW5wdXRbaXArK10gPDwgIDgpIHxcclxuICAgICAgICAgIChpbnB1dFtpcCsrXSA8PCAxNikgfCAoaW5wdXRbaXArK10gPDwgMjQpKSA+Pj4gMFxyXG4gICAgICApLFxyXG4gICAgICBpcFxyXG4gICAgKSlcclxuXHJcbiAgICBpcCArPSBzaXplXHJcblxyXG4gICAgLy8gcGFkZGluZ1xyXG4gICAgaWYgKHRoaXMucGFkZGluZyAmJiAoKGlwIC0gdGhpcy5vZmZzZXQpICYgMSkgPT09IDEpIHtcclxuICAgICAgaXArK1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaXAgPSBpcFxyXG4gIH1cclxuXHJcbiAgZ2V0Q2h1bmsoaW5kZXg6IG51bWJlcikge1xyXG4gICAgY29uc3QgY2h1bmsgPSB0aGlzLmNodW5rTGlzdFtpbmRleF1cclxuXHJcbiAgICBpZiAoY2h1bmsgPT09IHZvaWQgMCkge1xyXG4gICAgICByZXR1cm4gbnVsbFxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBjaHVua1xyXG4gIH1cclxuXHJcbiAgZ2V0TnVtYmVyT2ZDaHVua3MoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5jaHVua0xpc3QubGVuZ3RoXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgQ2h1bmsge1xyXG4gIHR5cGU6IHN0cmluZ1xyXG4gIHNpemU6IG51bWJlclxyXG4gIG9mZnNldDogbnVtYmVyXHJcblxyXG4gIGNvbnN0cnVjdG9yKHR5cGU6IHN0cmluZywgc2l6ZTogbnVtYmVyLCBvZmZzZXQ6IG51bWJlcikge1xyXG4gICAgdGhpcy50eXBlID0gdHlwZVxyXG4gICAgdGhpcy5zaXplID0gc2l6ZVxyXG4gICAgdGhpcy5vZmZzZXQgPSBvZmZzZXRcclxuICB9XHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3JpZmYudHMiLCJpbXBvcnQgeyBHZW5lcmF0b3JFbnVtZXJhdG9yVGFibGUgfSBmcm9tIFwiLi9jb25zdGFudHMudHNcIlxyXG5cclxuZXhwb3J0IGNsYXNzIFZlcnNpb25UYWcge1xyXG4gIG1ham9yOiBudW1iZXJcclxuICBtaW5vcjogbnVtYmVyXHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBQcmVzZXRIZWFkZXIge1xyXG4gIHByZXNldE5hbWU6IHN0cmluZ1xyXG4gIHByZXNldDogbnVtYmVyXHJcbiAgYmFuazogbnVtYmVyXHJcbiAgcHJlc2V0QmFnSW5kZXg6IG51bWJlclxyXG4gIGxpYnJhcnk6IG51bWJlclxyXG4gIGdlbnJlOiBudW1iZXJcclxuICBtb3JwaG9sb2d5OiBudW1iZXJcclxuXHJcbiAgc3RhdGljIHBhcnNlKHN0cmVhbSkge1xyXG4gICAgY29uc3QgcCA9IG5ldyBQcmVzZXRIZWFkZXIoKVxyXG4gICAgcC5wcmVzZXROYW1lID0gc3RyZWFtLnJlYWRTdHJpbmcoMjApXHJcbiAgICBwLnByZXNldCA9IHN0cmVhbS5yZWFkV09SRCgpXHJcbiAgICBwLmJhbmsgPSBzdHJlYW0ucmVhZFdPUkQoKVxyXG4gICAgcC5wcmVzZXRCYWdJbmRleCA9IHN0cmVhbS5yZWFkV09SRCgpXHJcbiAgICBwLmxpYnJhcnkgPSBzdHJlYW0ucmVhZERXT1JEKClcclxuICAgIHAuZ2VucmUgPSBzdHJlYW0ucmVhZERXT1JEKClcclxuICAgIHAubW9ycGhvbG9neSA9IHN0cmVhbS5yZWFkRFdPUkQoKVxyXG4gICAgcmV0dXJuIHBcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBQcmVzZXRCYWcge1xyXG4gIHByZXNldEdlbmVyYXRvckluZGV4OiBudW1iZXJcclxuICBwcmVzZXRNb2R1bGF0b3JJbmRleDogbnVtYmVyXHJcblxyXG4gIHN0YXRpYyBwYXJzZShzdHJlYW0pIHtcclxuICAgIGNvbnN0IHAgPSBuZXcgUHJlc2V0QmFnKClcclxuICAgIHAucHJlc2V0R2VuZXJhdG9ySW5kZXggPSBzdHJlYW0ucmVhZFdPUkQoKVxyXG4gICAgcC5wcmVzZXRNb2R1bGF0b3JJbmRleCA9IHN0cmVhbS5yZWFkV09SRCgpXHJcbiAgICByZXR1cm4gcFxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIE1vZHVsYXRvckxpc3Qge1xyXG4gIHNvdXJjZU9wZXI6IG51bWJlclxyXG4gIGRlc3RpbmF0aW9uT3BlcjogR2VuZXJhdG9yXHJcbiAgdmFsdWU6IE9iamVjdFxyXG4gIGFtb3VudFNvdXJjZU9wZXI6IG51bWJlclxyXG4gIHRyYW5zT3BlcjogR2VuZXJhdG9yXHJcbiAgdHlwZTogc3RyaW5nXHJcblxyXG4gIHN0YXRpYyBwYXJzZShzdHJlYW0pIHtcclxuICAgIGNvbnN0IHQgPSBuZXcgTW9kdWxhdG9yTGlzdCgpXHJcblxyXG4gICAgdC5zb3VyY2VPcGVyID0gc3RyZWFtLnJlYWRXT1JEKClcclxuICAgIGNvbnN0IGNvZGUgPSBzdHJlYW0ucmVhZFdPUkQoKVxyXG4gICAgdC5kZXN0aW5hdGlvbk9wZXIgPSBjb2RlXHJcbiAgICBcclxuICAgIGNvbnN0IGtleSA9IEdlbmVyYXRvckVudW1lcmF0b3JUYWJsZVtjb2RlXVxyXG4gICAgdC50eXBlID0ga2V5XHJcblxyXG4gICAgaWYgKGtleSA9PT0gdm9pZCAwKSB7XHJcbiAgICAgIC8vIEFtb3VudFxyXG4gICAgICB0LnZhbHVlID0ge1xyXG4gICAgICAgIGNvZGU6IGNvZGUsXHJcbiAgICAgICAgYW1vdW50OiBzdHJlYW0ucmVhZEludDE2KClcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gQW1vdW50XHJcbiAgICAgIHN3aXRjaCAoa2V5KSB7XHJcbiAgICAgICAgY2FzZSAna2V5UmFuZ2UnOiAvKiBGQUxMVEhST1VHSCAqL1xyXG4gICAgICAgIGNhc2UgJ3ZlbFJhbmdlJzogLyogRkFMTFRIUk9VR0ggKi9cclxuICAgICAgICBjYXNlICdrZXludW0nOiAvKiBGQUxMVEhST1VHSCAqL1xyXG4gICAgICAgIGNhc2UgJ3ZlbG9jaXR5JzpcclxuICAgICAgICAgIHQudmFsdWUgPSB7XHJcbiAgICAgICAgICAgIGxvOiBzdHJlYW0ucmVhZEJ5dGUoKSxcclxuICAgICAgICAgICAgaGk6IHN0cmVhbS5yZWFkQnl0ZSgpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVha1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICB0LnZhbHVlID0ge1xyXG4gICAgICAgICAgICBhbW91bnQ6IHN0cmVhbS5yZWFkSW50MTYoKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICB0LmFtb3VudFNvdXJjZU9wZXIgPSBzdHJlYW0ucmVhZFdPUkQoKVxyXG4gICAgdC50cmFuc09wZXIgPSBzdHJlYW0ucmVhZFdPUkQoKVxyXG5cclxuICAgIHJldHVybiB0XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgR2VuZXJhdG9yTGlzdCB7XHJcbiAgdHlwZTogc3RyaW5nXHJcbiAgdmFsdWU6IE9iamVjdFxyXG5cclxuICBzdGF0aWMgcGFyc2Uoc3RyZWFtKSB7XHJcbiAgICBjb25zdCB0ID0gbmV3IE1vZHVsYXRvckxpc3QoKVxyXG4gICAgXHJcbiAgICBjb25zdCBjb2RlID0gc3RyZWFtLnJlYWRXT1JEKClcclxuICAgIGNvbnN0IGtleSA9IEdlbmVyYXRvckVudW1lcmF0b3JUYWJsZVtjb2RlXVxyXG4gICAgdC50eXBlID0ga2V5XHJcblxyXG4gICAgaWYgKGtleSA9PT0gdm9pZCAwKSB7XHJcbiAgICAgIHQudmFsdWUgPSB7XHJcbiAgICAgICAgY29kZSxcclxuICAgICAgICBhbW91bnQ6IHN0cmVhbS5yZWFkSW50MTYoKVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBzd2l0Y2ggKGtleSkge1xyXG4gICAgICAgIGNhc2UgJ2tleW51bSc6IC8qIEZBTExUSFJPVUdIICovXHJcbiAgICAgICAgY2FzZSAna2V5UmFuZ2UnOiAvKiBGQUxMVEhST1VHSCAqL1xyXG4gICAgICAgIGNhc2UgJ3ZlbFJhbmdlJzogLyogRkFMTFRIUk9VR0ggKi9cclxuICAgICAgICBjYXNlICd2ZWxvY2l0eSc6XHJcbiAgICAgICAgICB0LnZhbHVlID0ge1xyXG4gICAgICAgICAgICBsbzogc3RyZWFtLnJlYWRCeXRlKCksXHJcbiAgICAgICAgICAgIGhpOiBzdHJlYW0ucmVhZEJ5dGUoKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgdC52YWx1ZSA9IHtcclxuICAgICAgICAgICAgYW1vdW50OiBzdHJlYW0ucmVhZEludDE2KClcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdFxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEluc3RydW1lbnQge1xyXG4gIGluc3RydW1lbnROYW1lOiBzdHJpbmdcclxuICBpbnN0cnVtZW50QmFnSW5kZXg6IG51bWJlclxyXG4gIFxyXG4gIHN0YXRpYyBwYXJzZShzdHJlYW0pIHtcclxuICAgIGNvbnN0IHQgPSBuZXcgSW5zdHJ1bWVudCgpXHJcbiAgICB0Lmluc3RydW1lbnROYW1lID0gc3RyZWFtLnJlYWRTdHJpbmcoMjApXHJcbiAgICB0Lmluc3RydW1lbnRCYWdJbmRleCA9IHN0cmVhbS5yZWFkV09SRCgpXHJcbiAgICByZXR1cm4gdFxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEluc3RydW1lbnRCYWcge1xyXG4gIGluc3RydW1lbnRHZW5lcmF0b3JJbmRleDogbnVtYmVyXHJcbiAgaW5zdHJ1bWVudE1vZHVsYXRvckluZGV4OiBudW1iZXJcclxuICBcclxuICBzdGF0aWMgcGFyc2Uoc3RyZWFtKSB7XHJcbiAgICBjb25zdCB0ID0gbmV3IEluc3RydW1lbnRCYWcoKVxyXG4gICAgdC5pbnN0cnVtZW50R2VuZXJhdG9ySW5kZXggPSBzdHJlYW0ucmVhZFdPUkQoKVxyXG4gICAgdC5pbnN0cnVtZW50TW9kdWxhdG9ySW5kZXggPSBzdHJlYW0ucmVhZFdPUkQoKVxyXG4gICAgcmV0dXJuIHRcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBTYW1wbGUge1xyXG4gIHNhbXBsZU5hbWU6IHN0cmluZ1xyXG4gIHN0YXJ0OiBudW1iZXJcclxuICBlbmQ6IG51bWJlclxyXG4gIHN0YXJ0TG9vcDogbnVtYmVyXHJcbiAgZW5kTG9vcDogbnVtYmVyXHJcbiAgc2FtcGxlUmF0ZTogbnVtYmVyXHJcbiAgb3JpZ2luYWxQaXRjaDogbnVtYmVyXHJcbiAgcGl0Y2hDb3JyZWN0aW9uOiBudW1iZXJcclxuICBzYW1wbGVMaW5rOiBudW1iZXJcclxuICBzYW1wbGVUeXBlOiBudW1iZXJcclxuXHJcbiAgc3RhdGljIHBhcnNlKHN0cmVhbSkge1xyXG4gICAgY29uc3QgcyA9IG5ldyBTYW1wbGUoKVxyXG5cclxuICAgIHMuc2FtcGxlTmFtZSA9IHN0cmVhbS5yZWFkU3RyaW5nKDIwKVxyXG4gICAgcy5zdGFydCA9IHN0cmVhbS5yZWFkRFdPUkQoKVxyXG4gICAgcy5lbmQgPSBzdHJlYW0ucmVhZERXT1JEKClcclxuICAgIHMuc3RhcnRMb29wID0gc3RyZWFtLnJlYWREV09SRCgpXHJcbiAgICBzLmVuZExvb3AgPSBzdHJlYW0ucmVhZERXT1JEKClcclxuICAgIHMuc2FtcGxlUmF0ZSA9IHN0cmVhbS5yZWFkRFdPUkQoKVxyXG4gICAgcy5vcmlnaW5hbFBpdGNoID0gc3RyZWFtLnJlYWRCeXRlKClcclxuICAgIHMucGl0Y2hDb3JyZWN0aW9uID0gc3RyZWFtLnJlYWRJbnQ4KClcclxuICAgIHMuc2FtcGxlTGluayA9IHN0cmVhbS5yZWFkV09SRCgpXHJcbiAgICBzLnNhbXBsZVR5cGUgPSBzdHJlYW0ucmVhZFdPUkQoKVxyXG5cclxuICAgIHMuc3RhcnRMb29wIC09IHMuc3RhcnRcclxuICAgIHMuZW5kTG9vcCAtPSBzLnN0YXJ0XHJcblxyXG4gICAgcmV0dXJuIHNcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAZW51bSB7bnVtYmVyfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFNhbXBsZUxpbmsgPSB7XHJcbiAgbW9ub1NhbXBsZTogMSxcclxuICByaWdodFNhbXBsZTogMixcclxuICBsZWZ0U2FtcGxlOiA0LFxyXG4gIGxpbmtlZFNhbXBsZTogOCxcclxuICBSb21Nb25vU2FtcGxlOiAweDgwMDEsXHJcbiAgUm9tUmlnaHRTYW1wbGU6IDB4ODAwMixcclxuICBSb21MZWZ0U2FtcGxlOiAweDgwMDQsXHJcbiAgUm9tTGlua2VkU2FtcGxlOiAweDgwMDhcclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvc2YyX2RhdGEudHMiLCJleHBvcnQgZnVuY3Rpb24gcmVhZFN0cmluZyhkYXRhOiBVaW50OEFycmF5LCBzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgY29uc3Qgc3RyID0gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBkYXRhLnN1YmFycmF5KHN0YXJ0LCBlbmQpKVxyXG4gIGNvbnN0IG51bGxMb2NhdGlvbiA9IHN0ci5pbmRleE9mKFwiXFx1MDAwMFwiKVxyXG4gIGlmIChudWxsTG9jYXRpb24gPiAwKSB7XHJcbiAgICByZXR1cm4gc3RyLnN1YnN0cigwLCBudWxsTG9jYXRpb24pXHJcbiAgfVxyXG4gIHJldHVybiBzdHJcclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvaGVscGVyLnRzIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3RyZWFtIHtcclxuICBwcml2YXRlIGRhdGE6IFVpbnQ4QXJyYXlcclxuICBpcDogbnVtYmVyXHJcblxyXG4gIGNvbnN0cnVjdG9yKGRhdGEsIG9mZnNldCkge1xyXG4gICAgdGhpcy5kYXRhID0gZGF0YVxyXG4gICAgdGhpcy5pcCA9IG9mZnNldFxyXG4gIH1cclxuXHJcbiAgcmVhZFN0cmluZyhzaXplOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgY29uc3Qgc3RyID0gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCB0aGlzLmRhdGEuc3ViYXJyYXkodGhpcy5pcCwgdGhpcy5pcCArPSBzaXplKSlcclxuICAgIGNvbnN0IG51bGxMb2NhdGlvbiA9IHN0ci5pbmRleE9mKFwiXFx1MDAwMFwiKVxyXG4gICAgaWYgKG51bGxMb2NhdGlvbiA+IDApIHtcclxuICAgICAgcmV0dXJuIHN0ci5zdWJzdHIoMCwgbnVsbExvY2F0aW9uKVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHN0clxyXG4gIH1cclxuXHJcbiAgcmVhZFdPUkQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLmRhdGFbdGhpcy5pcCsrXSB8ICh0aGlzLmRhdGFbdGhpcy5pcCsrXSA8PCA4KVxyXG4gIH1cclxuXHJcbiAgcmVhZERXT1JEKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICB0aGlzLmRhdGFbdGhpcy5pcCsrXSB8IFxyXG4gICAgICAodGhpcy5kYXRhW3RoaXMuaXArK10gPDwgOCkgfCBcclxuICAgICAgKHRoaXMuZGF0YVt0aGlzLmlwKytdIDw8IDE2KSB8IFxyXG4gICAgICAodGhpcy5kYXRhW3RoaXMuaXArK10gPDwgMjQpXHJcbiAgICApID4+PiAwXHJcbiAgfVxyXG5cclxuICByZWFkQnl0ZSgpIHtcclxuICAgIHJldHVybiB0aGlzLmRhdGFbdGhpcy5pcCsrXVxyXG4gIH1cclxuXHJcbiAgcmVhZEF0KG9mZnNldDogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4gdGhpcy5kYXRhW3RoaXMuaXAgKyBvZmZzZXRdXHJcbiAgfVxyXG5cclxuICAvKiBoZWxwZXIgKi9cclxuXHJcbiAgcmVhZFVJbnQ4KCkge1xyXG4gICAgcmV0dXJuIHRoaXMucmVhZEJ5dGUoKVxyXG4gIH1cclxuICBcclxuICByZWFkSW50OCgpIHtcclxuICAgIHJldHVybiAodGhpcy5yZWFkQnl0ZSgpIDw8IDI0KSA+PiAyNFxyXG4gIH1cclxuICBcclxuICByZWFkVUludDE2KCkge1xyXG4gICAgcmV0dXJuIHRoaXMucmVhZFdPUkQoKVxyXG4gIH1cclxuXHJcbiAgcmVhZEludDE2KCkge1xyXG4gICAgcmV0dXJuICh0aGlzLnJlYWRXT1JEKCkgPDwgMTYpID4+IDE2XHJcbiAgfVxyXG5cclxuICByZWFkVUludDMyKCkge1xyXG4gICAgcmV0dXJuIHRoaXMucmVhZERXT1JEKClcclxuICB9XHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3N0cmVhbS50cyIsImltcG9ydCBXZWJNaWRpTGluayBmcm9tIFwiLi4vc3JjL3dtbC50c1wiXHJcbmV4cG9ydCBkZWZhdWx0IFdlYk1pZGlMaW5rXHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2V4cG9ydC9zeW50aC5qcyIsImltcG9ydCBTeW50aGVzaXplciBmcm9tIFwiLi9zb3VuZF9mb250X3N5bnRoLnRzXCJcclxuaW1wb3J0IFZpZXcgZnJvbSBcIi4vc3ludGhfdmlldy50c1wiXHJcbmltcG9ydCBNaWRpTWVzc2FnZUhhbmRsZXIgZnJvbSBcIi4vbWlkaV9tZXNzYWdlX2hhbmRsZXIudHNcIlxyXG5cclxuLyoqXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKi9cclxuY29uc3QgV2ViTWlkaUxpbmsgPSBmdW5jdGlvbigpIHtcclxuICAvKiogQHR5cGUge2Z1bmN0aW9uKEFycmF5QnVmZmVyKX0gKi9cclxuICB0aGlzLmxvYWRDYWxsYmFjaztcclxuICAvKiogQHR5cGUge0Z1bmN0aW9ufSAqL1xyXG4gIHRoaXMubWVzc2FnZUhhbmRsZXIgPSB0aGlzLm9ubWVzc2FnZS5iaW5kKHRoaXMpO1xyXG5cclxuICB0aGlzLm1pZGlNZXNzYWdlSGFuZGxlciA9IG5ldyBNaWRpTWVzc2FnZUhhbmRsZXIoKTtcclxuXHJcbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmdW5jdGlvbigpIHtcclxuICAgIHRoaXMucmVhZHkgPSB0cnVlO1xyXG4gIH0uYmluZCh0aGlzKSwgZmFsc2UpO1xyXG59O1xyXG5cclxuV2ViTWlkaUxpbmsucHJvdG90eXBlLnNldHVwID0gZnVuY3Rpb24odXJsKSB7XHJcbiAgaWYgKCF0aGlzLnJlYWR5KSB7XHJcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGZ1bmN0aW9uIG9ubG9hZCgpIHtcclxuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBvbmxvYWQsIGZhbHNlKTtcclxuICAgICAgdGhpcy5sb2FkKHVybCk7XHJcbiAgICB9LmJpbmQodGhpcyksIGZhbHNlKTtcclxuICB9IGVsc2Uge1xyXG4gICAgdGhpcy5sb2FkKHVybCk7XHJcbiAgfVxyXG59O1xyXG5cclxuV2ViTWlkaUxpbmsucHJvdG90eXBlLmxvYWQgPSBmdW5jdGlvbih1cmwpIHtcclxuICAvKiogQHR5cGUge1hNTEh0dHBSZXF1ZXN0fSAqL1xyXG4gIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcclxuXHJcbiAgeGhyLm9wZW4oJ0dFVCcsIHVybCwgdHJ1ZSk7XHJcbiAgeGhyLnJlc3BvbnNlVHlwZSA9ICdhcnJheWJ1ZmZlcic7XHJcblxyXG4gIHhoci5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgZnVuY3Rpb24oZXYpIHtcclxuICAgIC8qKiBAdHlwZSB7WE1MSHR0cFJlcXVlc3R9ICovXHJcbiAgICB2YXIgeGhyID0gZXYudGFyZ2V0O1xyXG5cclxuICAgIHRoaXMub25sb2FkKHhoci5yZXNwb25zZSk7XHJcbiAgICBpZiAodHlwZW9mIHRoaXMubG9hZENhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIHRoaXMubG9hZENhbGxiYWNrKHhoci5yZXNwb25zZSk7XHJcbiAgICB9XHJcbiAgfS5iaW5kKHRoaXMpLCBmYWxzZSk7XHJcblxyXG4gIHhoci5zZW5kKCk7XHJcbn07XHJcblxyXG4vKipcclxuICogQHBhcmFtIHtBcnJheUJ1ZmZlcn0gcmVzcG9uc2VcclxuICovXHJcbldlYk1pZGlMaW5rLnByb3RvdHlwZS5vbmxvYWQgPSBmdW5jdGlvbihyZXNwb25zZSkge1xyXG4gIC8qKiBAdHlwZSB7VWludDhBcnJheX0gKi9cclxuICB2YXIgaW5wdXQgPSBuZXcgVWludDhBcnJheShyZXNwb25zZSk7XHJcblxyXG4gIHRoaXMubG9hZFNvdW5kRm9udChpbnB1dCk7XHJcbn07XHJcblxyXG4vKipcclxuICogQHBhcmFtIHtVaW50OEFycmF5fSBpbnB1dFxyXG4gKi9cclxuV2ViTWlkaUxpbmsucHJvdG90eXBlLmxvYWRTb3VuZEZvbnQgPSBmdW5jdGlvbihpbnB1dCkge1xyXG4gIC8qKiBAdHlwZSB7U3ludGhlc2l6ZXJ9ICovXHJcbiAgdmFyIHN5bnRoO1xyXG5cclxuICBpZiAoIXRoaXMuc3ludGgpIHtcclxuICAgIHN5bnRoID0gdGhpcy5zeW50aCA9IG5ldyBTeW50aGVzaXplcihpbnB1dCk7XHJcbiAgICB2YXIgdmlldyA9IHRoaXMudmlldyA9IG5ldyBWaWV3KClcclxuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodmlldy5kcmF3KHN5bnRoKSk7XHJcbiAgICB0aGlzLm1pZGlNZXNzYWdlSGFuZGxlci5zeW50aCA9IHN5bnRoO1xyXG4gICAgc3ludGguaW5pdCgpO1xyXG4gICAgc3ludGguc3RhcnQoKTtcclxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgdGhpcy5tZXNzYWdlSGFuZGxlciwgZmFsc2UpO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBzeW50aCA9IHRoaXMuc3ludGg7XHJcbiAgICBzeW50aC5yZWZyZXNoSW5zdHJ1bWVudHMoaW5wdXQpO1xyXG4gIH1cclxuXHJcbiAgLy8gbGluayByZWFkeVxyXG4gIGlmICh3aW5kb3cub3BlbmVyKSB7XHJcbiAgICB3aW5kb3cub3BlbmVyLnBvc3RNZXNzYWdlKFwibGluayxyZWFkeVwiLCAnKicpO1xyXG4gIH0gZWxzZSBpZiAod2luZG93LnBhcmVudCAhPT0gd2luZG93KSB7XHJcbiAgICB3aW5kb3cucGFyZW50LnBvc3RNZXNzYWdlKFwibGluayxyZWFkeVwiLCAnKicpO1xyXG4gIH1cclxufTtcclxuXHJcbi8qKlxyXG4gKiBAcGFyYW0ge0V2ZW50fSBldlxyXG4gKi9cclxuV2ViTWlkaUxpbmsucHJvdG90eXBlLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGV2KSB7XHJcbiAgdmFyIG1zZyA9IGV2LmRhdGEuc3BsaXQoJywnKTtcclxuICB2YXIgdHlwZSA9IG1zZy5zaGlmdCgpO1xyXG4gIHZhciBjb21tYW5kO1xyXG5cclxuICBzd2l0Y2ggKHR5cGUpIHtcclxuICAgIGNhc2UgJ21pZGknOlxyXG4gICAgICB0aGlzLm1pZGlNZXNzYWdlSGFuZGxlci5wcm9jZXNzTWlkaU1lc3NhZ2UoXHJcbiAgICAgICAgbXNnLm1hcChmdW5jdGlvbihoZXgpIHtcclxuICAgICAgICAgIHJldHVybiBwYXJzZUludChoZXgsIDE2KTtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgICBicmVhaztcclxuICAgIGNhc2UgJ2xpbmsnOlxyXG4gICAgICBjb21tYW5kID0gbXNnLnNoaWZ0KCk7XHJcbiAgICAgIHN3aXRjaCAoY29tbWFuZCkge1xyXG4gICAgICAgIGNhc2UgJ3JlcXBhdGNoJzpcclxuICAgICAgICAgIC8vIFRPRE86IGR1bW15IGRhdGFcclxuICAgICAgICAgIGlmICh3aW5kb3cub3BlbmVyKSB7XHJcbiAgICAgICAgICAgIHdpbmRvdy5vcGVuZXIucG9zdE1lc3NhZ2UoXCJsaW5rLHBhdGNoXCIsICcqJyk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKHdpbmRvdy5wYXJlbnQgIT09IHdpbmRvdykge1xyXG4gICAgICAgICAgICB3aW5kb3cucGFyZW50LnBvc3RNZXNzYWdlKFwibGluayxwYXRjaFwiLCAnKicpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAnc2V0cGF0Y2gnOlxyXG4gICAgICAgICAgLy8gVE9ETzogTk9QXHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgY29uc29sZS5lcnJvcigndW5rbm93biBsaW5rIG1lc3NhZ2U6JywgY29tbWFuZCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBicmVhaztcclxuICAgIGRlZmF1bHQ6XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ3Vua25vd24gbWVzc2FnZSB0eXBlJyk7XHJcbiAgfVxyXG59O1xyXG5cclxuLyoqXHJcbiAqIEBwYXJhbSB7ZnVuY3Rpb24oQXJyYXlCdWZmZXIpfSBjYWxsYmFja1xyXG4gKi9cclxuV2ViTWlkaUxpbmsucHJvdG90eXBlLnNldExvYWRDYWxsYmFjayA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XHJcbiAgdGhpcy5sb2FkQ2FsbGJhY2sgPSBjYWxsYmFjaztcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IFdlYk1pZGlMaW5rXHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy93bWwudHMiLCJpbXBvcnQgU3ludGhlc2l6ZXJOb3RlIGZyb20gXCIuL3NvdW5kX2ZvbnRfc3ludGhfbm90ZS50c1wiXHJcbmltcG9ydCBQYXJzZXIgZnJvbSBcIi4vc2YyLnRzXCJcclxuaW1wb3J0IFNvdW5kRm9udCBmcm9tIFwiLi9zb3VuZF9mb250LnRzXCJcclxuXHJcbmNvbnN0IEJBU0VfVk9MVU1FID0gMC40XHJcblxyXG5jbGFzcyBDaGFubmVsIHtcclxuICBpbnN0cnVtZW50ID0gMFxyXG4gIHZvbHVtZSA9IDBcclxuICBwaXRjaEJlbmQgPSAwXHJcbiAgcGl0Y2hCZW5kU2Vuc2l0aXZpdHkgPSAwXHJcbiAgcGFucG90ID0gMFxyXG4gIGN1cnJlbnROb3RlT246IFN5bnRoZXNpemVyTm90ZVtdID0gW11cclxufVxyXG5cclxuaW50ZXJmYWNlIFZpZXcge1xyXG4gIGRyYXcoKVxyXG4gIHJlbW92ZSgpXHJcbiAgZ2V0SW5zdHJ1bWVudEVsZW1lbnQoKVxyXG4gIGdldEtleUVsZW1lbnQoKVxyXG4gIG5vdGVPbihjaGFubmVsTnVtYmVyOiBudW1iZXIsIGtleTogbnVtYmVyKVxyXG4gIG5vdGVPZmYoY2hhbm5lbE51bWJlcjogbnVtYmVyLCBrZXk6IG51bWJlcilcclxuICBwcm9ncmFtQ2hhbmdlKGNoYW5uZWxOdW1iZXI6IG51bWJlciwgaW5zdHJ1bWVudDogbnVtYmVyKVxyXG4gIHZvbHVtZUNoYW5nZShjaGFubmVsTnVtYmVyOiBudW1iZXIsIHZvbHVtZTogbnVtYmVyKVxyXG4gIHBhbnBvdENoYW5nZShjaGFubmVsTnVtYmVyOiBudW1iZXIsIHBhbnBvdDogbnVtYmVyKVxyXG4gIHBpdGNoQmVuZChjaGFubmVsTnVtYmVyOiBudW1iZXIsIHBpdGNoQmVuZDogbnVtYmVyKVxyXG4gIHBpdGNoQmVuZFNlbnNpdGl2aXR5KGNoYW5uZWxOdW1iZXI6IG51bWJlciwgc2Vuc2l0aXZpdHk6IG51bWJlcilcclxufVxyXG5cclxuY2xhc3MgRHVtbXlWaWV3IGltcGxlbWVudHMgVmlldyB7XHJcbiAgZHJhdygpIHsgfVxyXG4gIHJlbW92ZSgpIHsgfVxyXG4gIGdldEluc3RydW1lbnRFbGVtZW50KCkgeyB9XHJcbiAgZ2V0S2V5RWxlbWVudCgpIHsgfVxyXG4gIG5vdGVPbigpIHsgfVxyXG4gIG5vdGVPZmYoKSB7IH1cclxuICBwcm9ncmFtQ2hhbmdlKCkgeyB9XHJcbiAgdm9sdW1lQ2hhbmdlKCkgeyB9XHJcbiAgcGFucG90Q2hhbmdlKCkgeyB9XHJcbiAgcGl0Y2hCZW5kKCkgeyB9XHJcbiAgcGl0Y2hCZW5kU2Vuc2l0aXZpdHkoKSB7IH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3ludGhlc2l6ZXIge1xyXG4gIGlucHV0OiBVaW50OEFycmF5ID0gbnVsbFxyXG4gIGJhbms6IG51bWJlciA9IDBcclxuICBidWZmZXJTaXplOiBudW1iZXIgPSAxMDI0XHJcbiAgY3R4OiBBdWRpb0NvbnRleHRcclxuICBnYWluTWFzdGVyOiBHYWluTm9kZVxyXG4gIGNoYW5uZWxzOiBDaGFubmVsW10gPSBbXVxyXG4gIG1hc3RlclZvbHVtZTogbnVtYmVyID0gMS4wXHJcbiAgdmlldzogVmlldyA9IG5ldyBEdW1teVZpZXcoKVxyXG4gIHNvdW5kRm9udDogU291bmRGb250XHJcblxyXG4gIGNvbnN0cnVjdG9yKGN0eCkge1xyXG4gICAgdGhpcy5jdHggPSBjdHhcclxuICAgIHRoaXMuZ2Fpbk1hc3RlciA9IHRoaXMuY3R4LmNyZWF0ZUdhaW4oKVxyXG4gICAgdGhpcy5zZXRNYXN0ZXJWb2x1bWUodGhpcy5tYXN0ZXJWb2x1bWUpXHJcbiAgICB0aGlzLmluaXQoKVxyXG4gIH1cclxuXHJcbiAgaW5pdCgpIHtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTY7ICsraSkge1xyXG4gICAgICB0aGlzLmNoYW5uZWxzLnB1c2gobmV3IENoYW5uZWwoKSlcclxuICAgICAgdGhpcy5wcm9ncmFtQ2hhbmdlKGksIGkgIT09IDkgPyBpIDogMClcclxuICAgICAgdGhpcy52b2x1bWVDaGFuZ2UoaSwgMHg2NClcclxuICAgICAgdGhpcy5wYW5wb3RDaGFuZ2UoaSwgMHg0MClcclxuICAgICAgdGhpcy5waXRjaEJlbmQoaSwgMHgwMCwgMHg0MCk7IC8vIDgxOTJcclxuICAgICAgdGhpcy5waXRjaEJlbmRTZW5zaXRpdml0eShpLCAyKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVmcmVzaEluc3RydW1lbnRzKGlucHV0OiBVaW50OEFycmF5KSB7XHJcbiAgICB0aGlzLmlucHV0ID0gaW5wdXRcclxuXHJcbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgUGFyc2VyKGlucHV0KVxyXG4gICAgcGFyc2VyLnBhcnNlKClcclxuICAgIHRoaXMuc291bmRGb250ID0gbmV3IFNvdW5kRm9udChwYXJzZXIpXHJcbiAgfVxyXG5cclxuICBjb25uZWN0KGRlc3RpbmF0aW9uKSB7XHJcbiAgICB0aGlzLmdhaW5NYXN0ZXIuY29ubmVjdChkZXN0aW5hdGlvbilcclxuICB9XHJcblxyXG4gIHNldE1hc3RlclZvbHVtZSh2b2x1bWUpIHtcclxuICAgIHRoaXMubWFzdGVyVm9sdW1lID0gdm9sdW1lXHJcbiAgICB0aGlzLmdhaW5NYXN0ZXIuZ2Fpbi52YWx1ZSA9IEJBU0VfVk9MVU1FICogdm9sdW1lIC8gMHg4MDAwXHJcbiAgfVxyXG5cclxuICBub3RlT24oY2hhbm5lbE51bWJlcjogbnVtYmVyLCBrZXk6IG51bWJlciwgdmVsb2NpdHk6IG51bWJlcikge1xyXG4gICAgaWYgKCF0aGlzLnNvdW5kRm9udCkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIGNvbnN0IGJhbmtOdW1iZXIgPSBjaGFubmVsTnVtYmVyID09PSA5ID8gMTI4IDogdGhpcy5iYW5rXHJcbiAgICBjb25zdCBjaGFubmVsID0gdGhpcy5jaGFubmVsc1tjaGFubmVsTnVtYmVyXVxyXG5cclxuICAgIGNvbnN0IGluc3RydW1lbnRLZXkgPSB0aGlzLnNvdW5kRm9udC5nZXRJbnN0cnVtZW50S2V5KGJhbmtOdW1iZXIsIGNoYW5uZWwuaW5zdHJ1bWVudCwga2V5LCB2ZWxvY2l0eSlcclxuXHJcbiAgICBpZiAoIWluc3RydW1lbnRLZXkpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHBhbnBvdCA9IGNoYW5uZWwucGFucG90IC0gNjRcclxuICAgIHBhbnBvdCAvPSBwYW5wb3QgPCAwID8gNjQgOiA2M1xyXG5cclxuICAgIC8vIGNyZWF0ZSBub3RlIGluZm9ybWF0aW9uXHJcbiAgICBpbnN0cnVtZW50S2V5WydjaGFubmVsJ10gPSBjaGFubmVsTnVtYmVyXHJcbiAgICBpbnN0cnVtZW50S2V5WydrZXknXSA9IGtleVxyXG4gICAgaW5zdHJ1bWVudEtleVsndmVsb2NpdHknXSA9IHZlbG9jaXR5XHJcbiAgICBpbnN0cnVtZW50S2V5WydwYW5wb3QnXSA9IHBhbnBvdFxyXG4gICAgaW5zdHJ1bWVudEtleVsndm9sdW1lJ10gPSBjaGFubmVsLnZvbHVtZSAvIDEyN1xyXG4gICAgaW5zdHJ1bWVudEtleVsncGl0Y2hCZW5kJ10gPSBjaGFubmVsLnBpdGNoQmVuZCAtIDB4MjAwMFxyXG4gICAgaW5zdHJ1bWVudEtleVsncGl0Y2hCZW5kU2Vuc2l0aXZpdHknXSA9IGNoYW5uZWwucGl0Y2hCZW5kU2Vuc2l0aXZpdHlcclxuXHJcbiAgICAvLyBub3RlIG9uXHJcbiAgICBjb25zdCBub3RlID0gbmV3IFN5bnRoZXNpemVyTm90ZSh0aGlzLmN0eCwgdGhpcy5nYWluTWFzdGVyLCBpbnN0cnVtZW50S2V5KVxyXG4gICAgbm90ZS5ub3RlT24oKVxyXG4gICAgY2hhbm5lbC5jdXJyZW50Tm90ZU9uLnB1c2gobm90ZSlcclxuXHJcbiAgICB0aGlzLnZpZXcubm90ZU9uKGNoYW5uZWxOdW1iZXIsIGtleSlcclxuICB9XHJcblxyXG4gIG5vdGVPZmYoY2hhbm5lbE51bWJlcjogbnVtYmVyLCBrZXk6IG51bWJlciwgdmVsb2NpdHk6IG51bWJlcikge1xyXG4gICAgaWYgKCF0aGlzLnNvdW5kRm9udCkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIGNvbnN0IGJhbmtOdW1iZXIgPSBjaGFubmVsTnVtYmVyID09PSA5ID8gMTI4IDogdGhpcy5iYW5rXHJcbiAgICBjb25zdCBjaGFubmVsID0gdGhpcy5jaGFubmVsc1tjaGFubmVsTnVtYmVyXVxyXG5cclxuICAgIGNvbnN0IGluc3RydW1lbnRLZXkgPSB0aGlzLnNvdW5kRm9udC5nZXRJbnN0cnVtZW50S2V5KGJhbmtOdW1iZXIsIGNoYW5uZWwuaW5zdHJ1bWVudCwga2V5KVxyXG5cclxuICAgIGlmICghaW5zdHJ1bWVudEtleSkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjdXJyZW50Tm90ZU9uID0gY2hhbm5lbC5jdXJyZW50Tm90ZU9uXHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDAsIGlsID0gY3VycmVudE5vdGVPbi5sZW5ndGg7IGkgPCBpbDsgKytpKSB7XHJcbiAgICAgIGNvbnN0IG5vdGUgPSBjdXJyZW50Tm90ZU9uW2ldXHJcbiAgICAgIGlmIChub3RlLmtleSA9PT0ga2V5KSB7XHJcbiAgICAgICAgbm90ZS5ub3RlT2ZmKClcclxuICAgICAgICBjdXJyZW50Tm90ZU9uLnNwbGljZShpLCAxKVxyXG4gICAgICAgIC0taVxyXG4gICAgICAgIC0taWxcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudmlldy5ub3RlT2ZmKGNoYW5uZWxOdW1iZXIsIGtleSlcclxuICB9XHJcblxyXG4gIHByb2dyYW1DaGFuZ2UoY2hhbm5lbE51bWJlcjogbnVtYmVyLCBpbnN0cnVtZW50OiBudW1iZXIpIHtcclxuICAgIHRoaXMudmlldy5wcm9ncmFtQ2hhbmdlKGNoYW5uZWxOdW1iZXIsIGluc3RydW1lbnQpXHJcbiAgICB0aGlzLmNoYW5uZWxzW2NoYW5uZWxOdW1iZXJdLmluc3RydW1lbnQgPSBpbnN0cnVtZW50XHJcbiAgfVxyXG5cclxuICB2b2x1bWVDaGFuZ2UoY2hhbm5lbE51bWJlcjogbnVtYmVyLCB2b2x1bWU6IG51bWJlcikge1xyXG4gICAgdGhpcy52aWV3LnZvbHVtZUNoYW5nZShjaGFubmVsTnVtYmVyLCB2b2x1bWUpXHJcbiAgICB0aGlzLmNoYW5uZWxzW2NoYW5uZWxOdW1iZXJdLnZvbHVtZSA9IHZvbHVtZVxyXG4gIH1cclxuXHJcbiAgcGFucG90Q2hhbmdlKGNoYW5uZWxOdW1iZXI6IG51bWJlciwgcGFucG90OiBudW1iZXIpIHtcclxuICAgIHRoaXMudmlldy5wYW5wb3RDaGFuZ2UoY2hhbm5lbE51bWJlciwgcGFucG90KVxyXG4gICAgdGhpcy5jaGFubmVsc1tjaGFubmVsTnVtYmVyXS5wYW5wb3QgPSBwYW5wb3RcclxuICB9XHJcblxyXG4gIHBpdGNoQmVuZChjaGFubmVsTnVtYmVyOiBudW1iZXIsIGxvd2VyQnl0ZTogbnVtYmVyLCBoaWdoZXJCeXRlOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IGJlbmQgPSAobG93ZXJCeXRlICYgMHg3ZikgfCAoKGhpZ2hlckJ5dGUgJiAweDdmKSA8PCA3KVxyXG4gICAgY29uc3QgY2hhbm5lbCA9IHRoaXMuY2hhbm5lbHNbY2hhbm5lbE51bWJlcl1cclxuICAgIGNvbnN0IGN1cnJlbnROb3RlT24gPSBjaGFubmVsLmN1cnJlbnROb3RlT25cclxuICAgIGNvbnN0IGNhbGN1bGF0ZWQgPSBiZW5kIC0gMHgyMDAwXHJcblxyXG4gICAgdGhpcy52aWV3LnBpdGNoQmVuZChjaGFubmVsTnVtYmVyLCBjYWxjdWxhdGVkKVxyXG5cclxuICAgIGZvciAobGV0IGkgPSAwLCBpbCA9IGN1cnJlbnROb3RlT24ubGVuZ3RoOyBpIDwgaWw7ICsraSkge1xyXG4gICAgICBjdXJyZW50Tm90ZU9uW2ldLnVwZGF0ZVBpdGNoQmVuZChjYWxjdWxhdGVkKVxyXG4gICAgfVxyXG5cclxuICAgIGNoYW5uZWwucGl0Y2hCZW5kID0gYmVuZFxyXG4gIH1cclxuXHJcbiAgcGl0Y2hCZW5kU2Vuc2l0aXZpdHkoY2hhbm5lbE51bWJlcjogbnVtYmVyLCBzZW5zaXRpdml0eTogbnVtYmVyKSB7XHJcbiAgICB0aGlzLnZpZXcucGl0Y2hCZW5kU2Vuc2l0aXZpdHkoY2hhbm5lbE51bWJlciwgc2Vuc2l0aXZpdHkpXHJcbiAgICB0aGlzLmNoYW5uZWxzW2NoYW5uZWxOdW1iZXJdLnBpdGNoQmVuZFNlbnNpdGl2aXR5ID0gc2Vuc2l0aXZpdHlcclxuICB9XHJcblxyXG4gIGFsbFNvdW5kT2ZmKGNoYW5uZWxOdW1iZXI6IG51bWJlcikge1xyXG4gICAgY29uc3QgY3VycmVudE5vdGVPbiA9IHRoaXMuY2hhbm5lbHNbY2hhbm5lbE51bWJlcl0uY3VycmVudE5vdGVPblxyXG5cclxuICAgIHdoaWxlIChjdXJyZW50Tm90ZU9uLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5ub3RlT2ZmKGNoYW5uZWxOdW1iZXIsIGN1cnJlbnROb3RlT25bMF0ua2V5LCAwKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVzZXRBbGxDb250cm9sKGNoYW5uZWxOdW1iZXI6IG51bWJlcikge1xyXG4gICAgdGhpcy5waXRjaEJlbmQoY2hhbm5lbE51bWJlciwgMHgwMCwgMHg0MCk7IC8vIDgxOTJcclxuICB9XHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3NvdW5kX2ZvbnRfc3ludGgudHMiLCJpbXBvcnQgeyBJbnN0cnVtZW50IH0gZnJvbSBcIi4vc2YyX2RhdGFcIjtcclxuXHJcbmludGVyZmFjZSBJbnN0cnVtZW50U3RhdGUge1xyXG4gIGNoYW5uZWw6IG51bWJlclxyXG4gIGtleTogbnVtYmVyXHJcbiAgc2FtcGxlOiBVaW50OEFycmF5XHJcbiAgc2FtcGxlUmF0ZTogbnVtYmVyXHJcbiAgcGxheWJhY2tSYXRlOiBGdW5jdGlvblxyXG4gIHN0YXJ0OiBudW1iZXJcclxuICBlbmQ6IG51bWJlclxyXG4gIGxvb3BTdGFydDogbnVtYmVyXHJcbiAgbG9vcEVuZDogbnVtYmVyXHJcbiAgdm9sdW1lOiBudW1iZXJcclxuICBwYW5wb3Q6IG51bWJlclxyXG4gIHZvbEF0dGFjazogbnVtYmVyXHJcbiAgbW9kQXR0YWNrOiBudW1iZXJcclxuICB2ZWxvY2l0eTogbnVtYmVyXHJcbiAgcGl0Y2hCZW5kOiBudW1iZXJcclxuICBwaXRjaEJlbmRTZW5zaXRpdml0eTogbnVtYmVyXHJcbiAgbW9kRW52VG9QaXRjaDogbnVtYmVyXHJcbiAgbW9kRW52VG9GaWx0ZXJGYzogbnVtYmVyXHJcbiAgaW5pdGlhbEZpbHRlckZjOiBudW1iZXJcclxuICBpbml0aWFsRmlsdGVyUTogbnVtYmVyXHJcbiAgdm9sRGVjYXk6IG51bWJlclxyXG4gIHZvbFN1c3RhaW46IG51bWJlclxyXG4gIHZvbFJlbGVhc2U6IG51bWJlclxyXG4gIG1vZERlY2F5OiBudW1iZXJcclxuICBtb2RTdXN0YWluOiBudW1iZXJcclxuICBtb2RSZWxlYXNlOiBudW1iZXJcclxuICBzY2FsZVR1bmluZzogbnVtYmVyXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN5bnRoZXNpemVyTm90ZSB7XHJcblxyXG4gIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgLy8gYXVkaW8gbm9kZVxyXG4gIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gIGF1ZGlvQnVmZmVyOiBBdWRpb0J1ZmZlclxyXG4gIGJ1ZmZlclNvdXJjZTogQXVkaW9CdWZmZXJTb3VyY2VOb2RlXHJcbiAgcGFubmVyOiBQYW5uZXJOb2RlXHJcbiAgZ2Fpbk91dHB1dDogR2Fpbk5vZGVcclxuICBjdHg6IEF1ZGlvQ29udGV4dFxyXG4gIGRlc3RpbmF0aW9uOiBBdWRpb05vZGVcclxuICBmaWx0ZXI6IEJpcXVhZEZpbHRlck5vZGVcclxuICBpbnN0cnVtZW50OiBJbnN0cnVtZW50U3RhdGVcclxuICBjaGFubmVsOiBudW1iZXJcclxuICBrZXk6IG51bWJlclxyXG4gIHZlbG9jaXR5OiBudW1iZXJcclxuICBidWZmZXI6IFVpbnQ4QXJyYXlcclxuICBwbGF5YmFja1JhdGU6IG51bWJlclxyXG4gIHNhbXBsZVJhdGU6IG51bWJlclxyXG4gIHZvbHVtZTogbnVtYmVyXHJcbiAgcGFucG90OiBudW1iZXJcclxuICBwaXRjaEJlbmQ6IG51bWJlclxyXG4gIHBpdGNoQmVuZFNlbnNpdGl2aXR5OiBudW1iZXJcclxuICBtb2RFbnZUb1BpdGNoOiBudW1iZXJcclxuXHJcbiAgLy8gc3RhdGVcclxuICBzdGFydFRpbWU6IG51bWJlclxyXG4gIGNvbXB1dGVkUGxheWJhY2tSYXRlOiBudW1iZXJcclxuXHJcbiAgY29uc3RydWN0b3IoY3R4OiBBdWRpb0NvbnRleHQsIGRlc3RpbmF0aW9uOiBBdWRpb05vZGUsIGluc3RydW1lbnQ6IEluc3RydW1lbnRTdGF0ZSkge1xyXG4gICAgdGhpcy5jdHggPSBjdHhcclxuICAgIHRoaXMuZGVzdGluYXRpb24gPSBkZXN0aW5hdGlvblxyXG4gICAgdGhpcy5pbnN0cnVtZW50ID0gaW5zdHJ1bWVudFxyXG4gICAgdGhpcy5jaGFubmVsID0gaW5zdHJ1bWVudC5jaGFubmVsXHJcbiAgICB0aGlzLmtleSA9IGluc3RydW1lbnQua2V5XHJcbiAgICB0aGlzLnZlbG9jaXR5ID0gaW5zdHJ1bWVudC52ZWxvY2l0eVxyXG4gICAgdGhpcy5idWZmZXIgPSBpbnN0cnVtZW50LnNhbXBsZVxyXG4gICAgdGhpcy5wbGF5YmFja1JhdGUgPSBpbnN0cnVtZW50LnBsYXliYWNrUmF0ZShpbnN0cnVtZW50LmtleSlcclxuICAgIHRoaXMuc2FtcGxlUmF0ZSA9IGluc3RydW1lbnQuc2FtcGxlUmF0ZVxyXG4gICAgdGhpcy52b2x1bWUgPSBpbnN0cnVtZW50LnZvbHVtZVxyXG4gICAgdGhpcy5wYW5wb3QgPSBpbnN0cnVtZW50LnBhbnBvdFxyXG4gICAgdGhpcy5waXRjaEJlbmQgPSBpbnN0cnVtZW50LnBpdGNoQmVuZFxyXG4gICAgdGhpcy5waXRjaEJlbmRTZW5zaXRpdml0eSA9IGluc3RydW1lbnQucGl0Y2hCZW5kU2Vuc2l0aXZpdHlcclxuICAgIHRoaXMubW9kRW52VG9QaXRjaCA9IGluc3RydW1lbnQubW9kRW52VG9QaXRjaFxyXG4gICAgdGhpcy5zdGFydFRpbWUgPSBjdHguY3VycmVudFRpbWVcclxuICAgIHRoaXMuY29tcHV0ZWRQbGF5YmFja1JhdGUgPSB0aGlzLnBsYXliYWNrUmF0ZVxyXG4gIH1cclxuXHJcbiAgbm90ZU9uKCkge1xyXG4gICAgY29uc3QgeyBjdHgsIGluc3RydW1lbnQsIGJ1ZmZlciB9ID0gdGhpc1xyXG5cclxuICAgIGNvbnN0IHNhbXBsZSA9IGJ1ZmZlci5zdWJhcnJheSgwLCBidWZmZXIubGVuZ3RoICsgaW5zdHJ1bWVudC5lbmQpXHJcbiAgICB0aGlzLmF1ZGlvQnVmZmVyID0gY3R4LmNyZWF0ZUJ1ZmZlcigxLCBzYW1wbGUubGVuZ3RoLCB0aGlzLnNhbXBsZVJhdGUpXHJcblxyXG4gICAgY29uc3QgY2hhbm5lbERhdGEgPSB0aGlzLmF1ZGlvQnVmZmVyLmdldENoYW5uZWxEYXRhKDApXHJcbiAgICBjaGFubmVsRGF0YS5zZXQoc2FtcGxlKVxyXG5cclxuICAgIC8vIGJ1ZmZlciBzb3VyY2VcclxuICAgIGNvbnN0IGJ1ZmZlclNvdXJjZSA9IGN0eC5jcmVhdGVCdWZmZXJTb3VyY2UoKVxyXG4gICAgYnVmZmVyU291cmNlLmJ1ZmZlciA9IHRoaXMuYXVkaW9CdWZmZXJcclxuICAgIGJ1ZmZlclNvdXJjZS5sb29wID0gKHRoaXMuY2hhbm5lbCAhPT0gOSlcclxuICAgIGJ1ZmZlclNvdXJjZS5sb29wU3RhcnQgPSBpbnN0cnVtZW50Lmxvb3BTdGFydCAvIHRoaXMuc2FtcGxlUmF0ZVxyXG4gICAgYnVmZmVyU291cmNlLmxvb3BFbmQgPSBpbnN0cnVtZW50Lmxvb3BFbmQgLyB0aGlzLnNhbXBsZVJhdGVcclxuICAgIGJ1ZmZlclNvdXJjZS5vbmVuZGVkID0gKCkgPT4gdGhpcy5kaXNjb25uZWN0KClcclxuICAgIHRoaXMuYnVmZmVyU291cmNlID0gYnVmZmVyU291cmNlXHJcbiAgICB0aGlzLnVwZGF0ZVBpdGNoQmVuZCh0aGlzLnBpdGNoQmVuZClcclxuXHJcbiAgICAvLyBhdWRpbyBub2RlXHJcbiAgICBjb25zdCBwYW5uZXIgPSB0aGlzLnBhbm5lciA9IGN0eC5jcmVhdGVQYW5uZXIoKVxyXG4gICAgY29uc3Qgb3V0cHV0ID0gdGhpcy5nYWluT3V0cHV0ID0gY3R4LmNyZWF0ZUdhaW4oKVxyXG4gICAgY29uc3Qgb3V0cHV0R2FpbiA9IG91dHB1dC5nYWluXHJcblxyXG4gICAgLy8gZmlsdGVyXHJcbiAgICBjb25zdCBmaWx0ZXIgPSBjdHguY3JlYXRlQmlxdWFkRmlsdGVyKClcclxuICAgIGZpbHRlci50eXBlID0gXCJsb3dwYXNzXCJcclxuICAgIHRoaXMuZmlsdGVyID0gZmlsdGVyXHJcblxyXG4gICAgLy8gcGFucG90XHJcbiAgICBwYW5uZXIucGFubmluZ01vZGVsID0gXCJlcXVhbHBvd2VyXCJcclxuICAgIHBhbm5lci5zZXRQb3NpdGlvbihcclxuICAgICAgTWF0aC5zaW4odGhpcy5wYW5wb3QgKiBNYXRoLlBJIC8gMiksXHJcbiAgICAgIDAsXHJcbiAgICAgIE1hdGguY29zKHRoaXMucGFucG90ICogTWF0aC5QSSAvIDIpXHJcbiAgICApXHJcblxyXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgIC8vIEF0dGFjaywgRGVjYXksIFN1c3RhaW5cclxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICBjb25zdCBub3cgPSB0aGlzLmN0eC5jdXJyZW50VGltZVxyXG4gICAgY29uc3Qgdm9sQXR0YWNrVGltZSA9IG5vdyArIGluc3RydW1lbnQudm9sQXR0YWNrXHJcbiAgICBjb25zdCBtb2RBdHRhY2tUaW1lID0gbm93ICsgaW5zdHJ1bWVudC5tb2RBdHRhY2tcclxuICAgIGNvbnN0IHZvbERlY2F5ID0gdm9sQXR0YWNrVGltZSArIGluc3RydW1lbnQudm9sRGVjYXlcclxuICAgIGNvbnN0IG1vZERlY2F5ID0gbW9kQXR0YWNrVGltZSArIGluc3RydW1lbnQubW9kRGVjYXlcclxuICAgIGNvbnN0IHN0YXJ0VGltZSA9IGluc3RydW1lbnQuc3RhcnQgLyB0aGlzLnNhbXBsZVJhdGVcclxuXHJcbiAgICBjb25zdCBhdHRhY2tWb2x1bWUgPSB0aGlzLnZvbHVtZSAqICh0aGlzLnZlbG9jaXR5IC8gMTI3KVxyXG4gICAgb3V0cHV0R2Fpbi5zZXRWYWx1ZUF0VGltZSgwLCBub3cpXHJcbiAgICBvdXRwdXRHYWluLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKGF0dGFja1ZvbHVtZSwgdm9sQXR0YWNrVGltZSlcclxuICAgIG91dHB1dEdhaW4ubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoYXR0YWNrVm9sdW1lICogKDEgLSBpbnN0cnVtZW50LnZvbFN1c3RhaW4pLCB2b2xEZWNheSlcclxuXHJcbiAgICBmaWx0ZXIuUS5zZXRWYWx1ZUF0VGltZShpbnN0cnVtZW50LmluaXRpYWxGaWx0ZXJRIC8gMTAsIG5vdylcclxuICAgIGNvbnN0IGJhc2VGcmVxID0gYW1vdW50VG9GcmVxKGluc3RydW1lbnQuaW5pdGlhbEZpbHRlckZjKVxyXG4gICAgY29uc3QgcGVla0ZyZXEgPSBhbW91bnRUb0ZyZXEoaW5zdHJ1bWVudC5pbml0aWFsRmlsdGVyRmMgKyBpbnN0cnVtZW50Lm1vZEVudlRvRmlsdGVyRmMpXHJcbiAgICBjb25zdCBzdXN0YWluRnJlcSA9IGJhc2VGcmVxICsgKHBlZWtGcmVxIC0gYmFzZUZyZXEpICogKDEgLSBpbnN0cnVtZW50Lm1vZFN1c3RhaW4pXHJcbiAgICBmaWx0ZXIuZnJlcXVlbmN5LnNldFZhbHVlQXRUaW1lKGJhc2VGcmVxLCBub3cpXHJcbiAgICBmaWx0ZXIuZnJlcXVlbmN5LmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKHBlZWtGcmVxLCBtb2RBdHRhY2tUaW1lKVxyXG4gICAgZmlsdGVyLmZyZXF1ZW5jeS5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShzdXN0YWluRnJlcSwgbW9kRGVjYXkpXHJcblxyXG4gICAgZnVuY3Rpb24gYW1vdW50VG9GcmVxKHZhbDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIE1hdGgucG93KDIsICh2YWwgLSA2OTAwKSAvIDEyMDApICogNDQwXHJcbiAgICB9XHJcblxyXG4gICAgLy8gY29ubmVjdFxyXG4gICAgYnVmZmVyU291cmNlLmNvbm5lY3QoZmlsdGVyKVxyXG4gICAgZmlsdGVyLmNvbm5lY3QocGFubmVyKVxyXG4gICAgcGFubmVyLmNvbm5lY3Qob3V0cHV0KVxyXG4gICAgb3V0cHV0LmNvbm5lY3QodGhpcy5kZXN0aW5hdGlvbilcclxuXHJcbiAgICAvLyBmaXJlXHJcbiAgICBidWZmZXJTb3VyY2Uuc3RhcnQoMCwgc3RhcnRUaW1lKVxyXG4gIH1cclxuXHJcbiAgbm90ZU9mZigpIHtcclxuICAgIGNvbnN0IHsgaW5zdHJ1bWVudCwgYnVmZmVyU291cmNlIH0gPSB0aGlzXHJcbiAgICBjb25zdCBvdXRwdXQgPSB0aGlzLmdhaW5PdXRwdXRcclxuICAgIGNvbnN0IG5vdyA9IHRoaXMuY3R4LmN1cnJlbnRUaW1lXHJcbiAgICBjb25zdCB2b2xFbmRUaW1lID0gbm93ICsgaW5zdHJ1bWVudC52b2xSZWxlYXNlXHJcbiAgICBjb25zdCBtb2RFbmRUaW1lID0gbm93ICsgaW5zdHJ1bWVudC5tb2RSZWxlYXNlXHJcblxyXG4gICAgaWYgKCF0aGlzLmF1ZGlvQnVmZmVyKSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG5cclxuICAgIC8vIGlnbm9yZSBub3RlIG9mZiBmb3Igcmh5dGhtIHRyYWNrXHJcbiAgICBpZiAodGhpcy5jaGFubmVsID09PSA5KSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG5cclxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICAvLyBSZWxlYXNlXHJcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgb3V0cHV0LmdhaW4uY2FuY2VsU2NoZWR1bGVkVmFsdWVzKDApXHJcbiAgICBvdXRwdXQuZ2Fpbi5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZSgwLCB2b2xFbmRUaW1lKVxyXG4gICAgYnVmZmVyU291cmNlLnBsYXliYWNrUmF0ZS5jYW5jZWxTY2hlZHVsZWRWYWx1ZXMoMClcclxuICAgIGJ1ZmZlclNvdXJjZS5wbGF5YmFja1JhdGUubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUodGhpcy5jb21wdXRlZFBsYXliYWNrUmF0ZSwgbW9kRW5kVGltZSlcclxuXHJcbiAgICBidWZmZXJTb3VyY2UubG9vcCA9IGZhbHNlXHJcbiAgICBidWZmZXJTb3VyY2Uuc3RvcCh2b2xFbmRUaW1lKVxyXG4gIH1cclxuXHJcbiAgZGlzY29ubmVjdCgpIHtcclxuICAgIHRoaXMuYnVmZmVyU291cmNlLmRpc2Nvbm5lY3QoMClcclxuICAgIHRoaXMucGFubmVyLmRpc2Nvbm5lY3QoMClcclxuICAgIHRoaXMuZ2Fpbk91dHB1dC5kaXNjb25uZWN0KDApXHJcbiAgfVxyXG5cclxuICBzY2hlZHVsZVBsYXliYWNrUmF0ZSgpIHtcclxuICAgIGNvbnN0IHBsYXliYWNrUmF0ZSA9IHRoaXMuYnVmZmVyU291cmNlLnBsYXliYWNrUmF0ZVxyXG4gICAgY29uc3QgY29tcHV0ZWQgPSB0aGlzLmNvbXB1dGVkUGxheWJhY2tSYXRlXHJcbiAgICBjb25zdCBzdGFydCA9IHRoaXMuc3RhcnRUaW1lXHJcbiAgICBjb25zdCBpbnN0cnVtZW50ID0gdGhpcy5pbnN0cnVtZW50XHJcbiAgICBjb25zdCBtb2RBdHRhY2sgPSBzdGFydCArIGluc3RydW1lbnQubW9kQXR0YWNrXHJcbiAgICBjb25zdCBtb2REZWNheSA9IG1vZEF0dGFjayArIGluc3RydW1lbnQubW9kRGVjYXlcclxuICAgIGNvbnN0IHBlZWtQaXRjaCA9IGNvbXB1dGVkICogTWF0aC5wb3coXHJcbiAgICAgIE1hdGgucG93KDIsIDEgLyAxMiksXHJcbiAgICAgIHRoaXMubW9kRW52VG9QaXRjaCAqIHRoaXMuaW5zdHJ1bWVudC5zY2FsZVR1bmluZ1xyXG4gICAgKVxyXG5cclxuICAgIHBsYXliYWNrUmF0ZS5jYW5jZWxTY2hlZHVsZWRWYWx1ZXMoMClcclxuICAgIHBsYXliYWNrUmF0ZS5zZXRWYWx1ZUF0VGltZShjb21wdXRlZCwgc3RhcnQpXHJcbiAgICBwbGF5YmFja1JhdGUubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUocGVla1BpdGNoLCBtb2RBdHRhY2spXHJcbiAgICBwbGF5YmFja1JhdGUubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoY29tcHV0ZWQgKyAocGVla1BpdGNoIC0gY29tcHV0ZWQpICogKDEgLSBpbnN0cnVtZW50Lm1vZFN1c3RhaW4pLCBtb2REZWNheSlcclxuICB9XHJcblxyXG4gIHVwZGF0ZVBpdGNoQmVuZChwaXRjaEJlbmQ6IG51bWJlcikge1xyXG4gICAgdGhpcy5jb21wdXRlZFBsYXliYWNrUmF0ZSA9IHRoaXMucGxheWJhY2tSYXRlICogTWF0aC5wb3coXHJcbiAgICAgIE1hdGgucG93KDIsIDEgLyAxMiksXHJcbiAgICAgIChcclxuICAgICAgICB0aGlzLnBpdGNoQmVuZFNlbnNpdGl2aXR5ICogKFxyXG4gICAgICAgICAgcGl0Y2hCZW5kIC8gKHBpdGNoQmVuZCA8IDAgPyA4MTkyIDogODE5MSlcclxuICAgICAgICApXHJcbiAgICAgICkgKiB0aGlzLmluc3RydW1lbnQuc2NhbGVUdW5pbmdcclxuICAgIClcclxuICAgIHRoaXMuc2NoZWR1bGVQbGF5YmFja1JhdGUoKVxyXG4gIH1cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvc291bmRfZm9udF9zeW50aF9ub3RlLnRzIiwiaW1wb3J0IFBhcnNlciwgeyBJbnN0cnVtZW50Wm9uZSB9IGZyb20gXCIuL3NmMlwiXHJcblxyXG4vKipcclxuICogUGFyc2VyIOOBp+iqreOBv+i+vOOCk+OBoOOCteOCpuODs+ODieODleOCqeODs+ODiOOBruODh+ODvOOCv+OCklxyXG4gKiBTeW50aGVzaXplciDjgYvjgonliKnnlKjjgZfjgoTjgZnjgYTlvaLjgavjgZnjgovjgq/jg6njgrlcclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNvdW5kRm9udCB7XHJcbiAgYmFua1NldDogT2JqZWN0W11cclxuXHJcbiAgY29uc3RydWN0b3IocGFyc2VyKSB7XHJcbiAgICB0aGlzLmJhbmtTZXQgPSBjcmVhdGVBbGxJbnN0cnVtZW50cyhwYXJzZXIpXHJcbiAgfVxyXG5cclxuICBnZXRJbnN0cnVtZW50S2V5KGJhbmtOdW1iZXIsIGluc3RydW1lbnROdW1iZXIsIGtleSwgdmVsb2NpdHkgPSAxMDApIHtcclxuICAgIGNvbnN0IGJhbmsgPSB0aGlzLmJhbmtTZXRbYmFua051bWJlcl1cclxuICAgIGlmICghYmFuaykge1xyXG4gICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgXCJiYW5rIG5vdCBmb3VuZDogYmFuaz0lcyBpbnN0cnVtZW50PSVzXCIsXHJcbiAgICAgICAgYmFua051bWJlcixcclxuICAgICAgICBpbnN0cnVtZW50TnVtYmVyXHJcbiAgICAgIClcclxuICAgICAgcmV0dXJuIG51bGxcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBpbnN0cnVtZW50ID0gYmFua1tpbnN0cnVtZW50TnVtYmVyXVxyXG4gICAgaWYgKCFpbnN0cnVtZW50KSB7XHJcbiAgICAgIC8vIFRPRE9cclxuICAgICAgY29uc29sZS53YXJuKFxyXG4gICAgICAgIFwiaW5zdHJ1bWVudCBub3QgZm91bmQ6IGJhbms9JXMgaW5zdHJ1bWVudD0lc1wiLFxyXG4gICAgICAgIGJhbmtOdW1iZXIsXHJcbiAgICAgICAgaW5zdHJ1bWVudE51bWJlclxyXG4gICAgICApXHJcbiAgICAgIHJldHVybiBudWxsXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgaW5zdHJ1bWVudEtleSA9IGluc3RydW1lbnQubm90ZXMuZmlsdGVyKGkgPT4ge1xyXG4gICAgICBsZXQgaXNJbktleVJhbmdlID0gZmFsc2VcclxuICAgICAgaWYgKGkua2V5UmFuZ2UpIHtcclxuICAgICAgICBpc0luS2V5UmFuZ2UgPSBrZXkgPj0gaS5rZXlSYW5nZS5sbyAmJiBrZXkgPD0gaS5rZXlSYW5nZS5oaVxyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgaXNJblZlbFJhbmdlID0gdHJ1ZVxyXG4gICAgICBpZiAoaS52ZWxSYW5nZSkge1xyXG4gICAgICAgIGlzSW5WZWxSYW5nZSA9IHZlbG9jaXR5ID49IGkudmVsUmFuZ2UubG8gJiYgdmVsb2NpdHkgPD0gaS52ZWxSYW5nZS5oaVxyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gaXNJbktleVJhbmdlICYmIGlzSW5WZWxSYW5nZVxyXG4gICAgfSlbMF1cclxuXHJcbiAgICBpZiAoIWluc3RydW1lbnRLZXkpIHtcclxuICAgICAgLy8gVE9ET1xyXG4gICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgXCJpbnN0cnVtZW50IG5vdCBmb3VuZDogYmFuaz0lcyBpbnN0cnVtZW50PSVzIGtleT0lc1wiLFxyXG4gICAgICAgIGJhbmtOdW1iZXIsXHJcbiAgICAgICAgaW5zdHJ1bWVudE51bWJlcixcclxuICAgICAgICBrZXlcclxuICAgICAgKVxyXG4gICAgICByZXR1cm4gbnVsbFxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBpbnN0cnVtZW50S2V5XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBjcmVhdGVJbnN0cnVtZW50KHsgaW5zdHJ1bWVudCwgaW5zdHJ1bWVudFpvbmUsIGluc3RydW1lbnRab25lR2VuZXJhdG9yLCBpbnN0cnVtZW50Wm9uZU1vZHVsYXRvciB9OiBcclxuICB7IGluc3RydW1lbnQ6IHsgaW5zdHJ1bWVudE5hbWU6IHN0cmluZywgaW5zdHJ1bWVudEJhZ0luZGV4OiBudW1iZXIgfVtdLCBcclxuICAgIGluc3RydW1lbnRab25lOiBJbnN0cnVtZW50Wm9uZVtdLCBcclxuICAgIGluc3RydW1lbnRab25lR2VuZXJhdG9yOiB7fVtdLCBcclxuICAgIGluc3RydW1lbnRab25lTW9kdWxhdG9yOiB7fVtdIFxyXG4gIH0pOiBcclxuICB7IG5hbWU6IHN0cmluZywgaW5mbzogeyBnZW5lcmF0b3I6IHsgc2FtcGxlSUQ6IG51bWJlciwga2V5UmFuZ2U6IHsgaGk6IG51bWJlciwgbG86IG51bWJlciB9IH0gfVtdIH1bXSB7XHJcbiAgY29uc3Qgem9uZSA9IGluc3RydW1lbnRab25lXHJcbiAgY29uc3Qgb3V0cHV0ID0gW11cclxuXHJcbiAgLy8gaW5zdHJ1bWVudCAtPiBpbnN0cnVtZW50IGJhZyAtPiBnZW5lcmF0b3IgLyBtb2R1bGF0b3JcclxuICBmb3IgKGxldCBpID0gMDsgaSA8IGluc3RydW1lbnQubGVuZ3RoOyArK2kpIHtcclxuICAgIGNvbnN0IGJhZ0luZGV4ID0gaW5zdHJ1bWVudFtpXS5pbnN0cnVtZW50QmFnSW5kZXhcclxuICAgIGNvbnN0IGJhZ0luZGV4RW5kID0gaW5zdHJ1bWVudFtpICsgMV0gPyBpbnN0cnVtZW50W2kgKyAxXS5pbnN0cnVtZW50QmFnSW5kZXggOiB6b25lLmxlbmd0aFxyXG4gICAgY29uc3Qgem9uZUluZm8gPSBbXVxyXG5cclxuICAgIC8vIGluc3RydW1lbnQgYmFnXHJcbiAgICBmb3IgKGxldCBqID0gYmFnSW5kZXg7IGogPCBiYWdJbmRleEVuZDsgKytqKSB7XHJcbiAgICAgIGNvbnN0IGluc3RydW1lbnRHZW5lcmF0b3IgPSBjcmVhdGVJbnN0cnVtZW50R2VuZXJhdG9yKHpvbmUsIGosIGluc3RydW1lbnRab25lR2VuZXJhdG9yKVxyXG4gICAgICBjb25zdCBpbnN0cnVtZW50TW9kdWxhdG9yID0gY3JlYXRlSW5zdHJ1bWVudE1vZHVsYXRvcih6b25lLCBqLCBpbnN0cnVtZW50Wm9uZU1vZHVsYXRvcilcclxuXHJcbiAgICAgIHpvbmVJbmZvLnB1c2goe1xyXG4gICAgICAgIGdlbmVyYXRvcjogaW5zdHJ1bWVudEdlbmVyYXRvci5nZW5lcmF0b3IsXHJcbiAgICAgICAgZ2VuZXJhdG9yU2VxdWVuY2U6IGluc3RydW1lbnRHZW5lcmF0b3IuZ2VuZXJhdG9ySW5mbyxcclxuICAgICAgICBtb2R1bGF0b3I6IGluc3RydW1lbnRNb2R1bGF0b3IubW9kdWxhdG9yLFxyXG4gICAgICAgIG1vZHVsYXRvclNlcXVlbmNlOiBpbnN0cnVtZW50TW9kdWxhdG9yLm1vZHVsYXRvckluZm9cclxuICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICBvdXRwdXQucHVzaCh7XHJcbiAgICAgIG5hbWU6IGluc3RydW1lbnRbaV0uaW5zdHJ1bWVudE5hbWUsXHJcbiAgICAgIGluZm86IHpvbmVJbmZvXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIG91dHB1dFxyXG59XHJcblxyXG5mdW5jdGlvbiBjcmVhdGVQcmVzZXQoeyBwcmVzZXRIZWFkZXIsIHByZXNldFpvbmUsIHByZXNldFpvbmVHZW5lcmF0b3IsIHByZXNldFpvbmVNb2R1bGF0b3IgfSk6IHtcclxuICBpbmZvOiB7IHByZXNldEdlbmVyYXRvcjogeyBnZW5lcmF0b3I6IHsgaW5zdHJ1bWVudDogeyBhbW91bnQ6IG51bWJlciB9IH0gfSB9W10sIFxyXG4gIGhlYWRlcjogeyBiYW5rOiBudW1iZXIsIHByZXNldDogbnVtYmVyLCBwcmVzZXROYW1lOiBzdHJpbmcgfSBcclxufVtdIHtcclxuICAvLyBwcmVzZXQgLT4gcHJlc2V0IGJhZyAtPiBnZW5lcmF0b3IgLyBtb2R1bGF0b3JcclxuICByZXR1cm4gcHJlc2V0SGVhZGVyLm1hcCgocHJlc2V0LCBpKSA9PiB7XHJcbiAgICBjb25zdCBuZXh0UHJlc2V0ID0gcHJlc2V0SGVhZGVyW2kgKyAxXVxyXG4gICAgY29uc3QgYmFnSW5kZXggPSBwcmVzZXQucHJlc2V0QmFnSW5kZXhcclxuICAgIGNvbnN0IGJhZ0luZGV4RW5kID0gbmV4dFByZXNldCA/IG5leHRQcmVzZXQucHJlc2V0QmFnSW5kZXggOiBwcmVzZXRab25lLmxlbmd0aFxyXG4gICAgY29uc3Qgem9uZUluZm8gPSBbXVxyXG5cclxuICAgIC8vIHByZXNldCBiYWdcclxuICAgIGZvciAobGV0IGogPSBiYWdJbmRleCwgamwgPSBiYWdJbmRleEVuZDsgaiA8IGpsOyArK2opIHtcclxuICAgICAgem9uZUluZm8ucHVzaCh7XHJcbiAgICAgICAgcHJlc2V0R2VuZXJhdG9yOiBjcmVhdGVQcmVzZXRHZW5lcmF0b3IocHJlc2V0Wm9uZSwgaiwgcHJlc2V0Wm9uZUdlbmVyYXRvciksXHJcbiAgICAgICAgcHJlc2V0TW9kdWxhdG9yOiBjcmVhdGVQcmVzZXRNb2R1bGF0b3IocHJlc2V0Wm9uZSwgaiwgcHJlc2V0Wm9uZU1vZHVsYXRvcilcclxuICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBpbmZvOiB6b25lSW5mbyxcclxuICAgICAgaGVhZGVyOiBwcmVzZXRcclxuICAgIH1cclxuICB9KVxyXG59XHJcblxyXG5mdW5jdGlvbiBjcmVhdGVBbGxJbnN0cnVtZW50cyhwYXJzZXI6IFBhcnNlcik6IHt9W10ge1xyXG4gIGNvbnN0IHByZXNldHMgPSBjcmVhdGVQcmVzZXQocGFyc2VyKVxyXG4gIGNvbnN0IGluc3RydW1lbnRzID0gY3JlYXRlSW5zdHJ1bWVudChwYXJzZXIpXHJcbiAgY29uc3QgYmFua3M6IHt9W10gPSBbXVxyXG5cclxuICBmb3IgKGxldCBwcmVzZXQgb2YgcHJlc2V0cykge1xyXG4gICAgY29uc3QgYmFua051bWJlciA9IHByZXNldC5oZWFkZXIuYmFua1xyXG4gICAgY29uc3QgcHJlc2V0TnVtYmVyID0gcHJlc2V0LmhlYWRlci5wcmVzZXRcclxuXHJcbiAgICBjb25zdCBub3RlcyA9IHByZXNldC5pbmZvXHJcbiAgICAgIC5tYXAoaW5mbyA9PiBpbmZvLnByZXNldEdlbmVyYXRvci5nZW5lcmF0b3IpXHJcbiAgICAgIC5tYXAoZ2VuZXJhdG9yID0+IHtcclxuICAgICAgICBpZiAoZ2VuZXJhdG9yLmluc3RydW1lbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgcmV0dXJuIG51bGxcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1bWVudE51bWJlciA9IGdlbmVyYXRvci5pbnN0cnVtZW50LmFtb3VudFxyXG4gICAgICAgIGNvbnN0IGluc3RydW1lbnQgPSBpbnN0cnVtZW50c1tpbnN0cnVtZW50TnVtYmVyXVxyXG5cclxuICAgICAgICAvLyB1c2UgdGhlIGZpcnN0IGdlbmVyYXRvciBpbiB0aGUgem9uZSBhcyB0aGUgZGVmYXVsdCB2YWx1ZVxyXG4gICAgICAgIGxldCBiYXNlR2VuZXJhdG9yXHJcbiAgICAgICAgaWYgKGluc3RydW1lbnQuaW5mb1swXS5nZW5lcmF0b3IpIHtcclxuICAgICAgICAgIGNvbnN0IGdlbmVyYXRvciA9IGluc3RydW1lbnQuaW5mb1swXS5nZW5lcmF0b3JcclxuICAgICAgICAgIGlmIChnZW5lcmF0b3Iuc2FtcGxlSUQgPT09IHVuZGVmaW5lZCAmJiBnZW5lcmF0b3Iua2V5UmFuZ2UubG8gPT09IDAgJiYgZ2VuZXJhdG9yLmtleVJhbmdlLmhpID09PSAxMjcpIHtcclxuICAgICAgICAgICAgYmFzZUdlbmVyYXRvciA9IGdlbmVyYXRvclxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaW5zdHJ1bWVudC5pbmZvXHJcbiAgICAgICAgICAubWFwKGluZm8gPT4gY3JlYXRlTm90ZUluZm8ocGFyc2VyLCBpbmZvLmdlbmVyYXRvciwgYmFzZUdlbmVyYXRvcikpXHJcbiAgICAgICAgICAuZmlsdGVyKHggPT4geCkgLy8gcmVtb3ZlIG51bGxcclxuICAgICAgfSlcclxuICAgICAgLmZpbHRlcih4ID0+IHgpIC8vIHJlbW92ZSBudWxsXHJcbiAgICAgIC5yZWR1Y2UoKGEsIGIpID0+IGEuY29uY2F0KGIpLCBbXSkgLy8gZmxhdHRlblxyXG5cclxuICAgIC8vIHNlbGVjdCBiYW5rXHJcbiAgICBpZiAoYmFua3NbYmFua051bWJlcl0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBiYW5rc1tiYW5rTnVtYmVyXSA9IFtdXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgYmFuayA9IGJhbmtzW2JhbmtOdW1iZXJdXHJcbiAgICBiYW5rW3ByZXNldE51bWJlcl0gPSB7XHJcbiAgICAgIG5vdGVzLFxyXG4gICAgICBuYW1lOiBwcmVzZXQuaGVhZGVyLnByZXNldE5hbWVcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiBiYW5rc1xyXG59XHJcblxyXG5mdW5jdGlvbiBjcmVhdGVOb3RlSW5mbyhwYXJzZXI6IFBhcnNlciwgdGFyZ2V0R2VuZXJhdG9yOiB7fSwgYmFzZUdlbmVyYXRvcjoge30pIHtcclxuICBjb25zdCBnZW5lcmF0b3IgPSB7IC4uLmJhc2VHZW5lcmF0b3IsIC4uLnRhcmdldEdlbmVyYXRvciB9XHJcblxyXG4gIGNvbnN0IHsga2V5UmFuZ2UsIHNhbXBsZUlELCB2ZWxSYW5nZSB9ID0gZ2VuZXJhdG9yIGFzIGFueVxyXG4gIGlmIChrZXlSYW5nZSA9PT0gdW5kZWZpbmVkIHx8IHNhbXBsZUlEID09PSB1bmRlZmluZWQpIHtcclxuICAgIHJldHVybiBudWxsXHJcbiAgfVxyXG5cclxuICBjb25zdCB2b2xBdHRhY2sgPSBnZXRNb2RHZW5BbW91bnQoZ2VuZXJhdG9yLCAnYXR0YWNrVm9sRW52JywgLTEyMDAwKVxyXG4gIGNvbnN0IHZvbERlY2F5ID0gZ2V0TW9kR2VuQW1vdW50KGdlbmVyYXRvciwgJ2RlY2F5Vm9sRW52JywgLTEyMDAwKVxyXG4gIGNvbnN0IHZvbFN1c3RhaW4gPSBnZXRNb2RHZW5BbW91bnQoZ2VuZXJhdG9yLCAnc3VzdGFpblZvbEVudicpXHJcbiAgY29uc3Qgdm9sUmVsZWFzZSA9IGdldE1vZEdlbkFtb3VudChnZW5lcmF0b3IsICdyZWxlYXNlVm9sRW52JywgLTEyMDAwKVxyXG4gIGNvbnN0IG1vZEF0dGFjayA9IGdldE1vZEdlbkFtb3VudChnZW5lcmF0b3IsICdhdHRhY2tNb2RFbnYnLCAtMTIwMDApXHJcbiAgY29uc3QgbW9kRGVjYXkgPSBnZXRNb2RHZW5BbW91bnQoZ2VuZXJhdG9yLCAnZGVjYXlNb2RFbnYnLCAtMTIwMDApXHJcbiAgY29uc3QgbW9kU3VzdGFpbiA9IGdldE1vZEdlbkFtb3VudChnZW5lcmF0b3IsICdzdXN0YWluTW9kRW52JylcclxuICBjb25zdCBtb2RSZWxlYXNlID0gZ2V0TW9kR2VuQW1vdW50KGdlbmVyYXRvciwgJ3JlbGVhc2VNb2RFbnYnLCAtMTIwMDApXHJcblxyXG4gIGNvbnN0IHR1bmUgPSAoXHJcbiAgICBnZXRNb2RHZW5BbW91bnQoZ2VuZXJhdG9yLCAnY29hcnNlVHVuZScpICtcclxuICAgIGdldE1vZEdlbkFtb3VudChnZW5lcmF0b3IsICdmaW5lVHVuZScpIC8gMTAwXHJcbiAgKVxyXG4gIGNvbnN0IHNjYWxlID0gZ2V0TW9kR2VuQW1vdW50KGdlbmVyYXRvciwgJ3NjYWxlVHVuaW5nJywgMTAwKSAvIDEwMFxyXG4gIGNvbnN0IGZyZXFWaWJMRk8gPSBnZXRNb2RHZW5BbW91bnQoZ2VuZXJhdG9yLCAnZnJlcVZpYkxGTycpXHJcbiAgY29uc3Qgc2FtcGxlSWQgPSBnZXRNb2RHZW5BbW91bnQoZ2VuZXJhdG9yLCAnc2FtcGxlSUQnKVxyXG4gIGNvbnN0IHNhbXBsZUhlYWRlciA9IHBhcnNlci5zYW1wbGVIZWFkZXJbc2FtcGxlSWRdXHJcbiAgY29uc3QgYmFzZVBpdGNoID0gdHVuZSArIChzYW1wbGVIZWFkZXIucGl0Y2hDb3JyZWN0aW9uIC8gMTAwKSAtIGdldE1vZEdlbkFtb3VudChnZW5lcmF0b3IsICdvdmVycmlkaW5nUm9vdEtleScsIHNhbXBsZUhlYWRlci5vcmlnaW5hbFBpdGNoKVxyXG5cclxuICByZXR1cm4ge1xyXG4gICAgc2FtcGxlOiBwYXJzZXIuc2FtcGxlW3NhbXBsZUlkXSxcclxuICAgIHNhbXBsZVJhdGU6IHNhbXBsZUhlYWRlci5zYW1wbGVSYXRlLFxyXG4gICAgc2FtcGxlTmFtZTogc2FtcGxlSGVhZGVyLnNhbXBsZU5hbWUsXHJcbiAgICBtb2RFbnZUb1BpdGNoOiBnZXRNb2RHZW5BbW91bnQoZ2VuZXJhdG9yLCAnbW9kRW52VG9QaXRjaCcpIC8gMTAwLFxyXG4gICAgc2NhbGVUdW5pbmc6IHNjYWxlLFxyXG4gICAgc3RhcnQ6XHJcbiAgICAgIGdldE1vZEdlbkFtb3VudChnZW5lcmF0b3IsICdzdGFydEFkZHJzQ29hcnNlT2Zmc2V0JykgKiAzMjc2OCArXHJcbiAgICAgIGdldE1vZEdlbkFtb3VudChnZW5lcmF0b3IsICdzdGFydEFkZHJzT2Zmc2V0JyksXHJcbiAgICBlbmQ6XHJcbiAgICAgIGdldE1vZEdlbkFtb3VudChnZW5lcmF0b3IsICdlbmRBZGRyc0NvYXJzZU9mZnNldCcpICogMzI3NjggK1xyXG4gICAgICBnZXRNb2RHZW5BbW91bnQoZ2VuZXJhdG9yLCAnZW5kQWRkcnNPZmZzZXQnKSxcclxuICAgIGxvb3BTdGFydDogKFxyXG4gICAgICAvLyhzYW1wbGVIZWFkZXIuc3RhcnRMb29wIC0gc2FtcGxlSGVhZGVyLnN0YXJ0KSArXHJcbiAgICAgIChzYW1wbGVIZWFkZXIuc3RhcnRMb29wKSArXHJcbiAgICAgIGdldE1vZEdlbkFtb3VudChnZW5lcmF0b3IsICdzdGFydGxvb3BBZGRyc0NvYXJzZU9mZnNldCcpICogMzI3NjggK1xyXG4gICAgICBnZXRNb2RHZW5BbW91bnQoZ2VuZXJhdG9yLCAnc3RhcnRsb29wQWRkcnNPZmZzZXQnKVxyXG4gICAgKSxcclxuICAgIGxvb3BFbmQ6IChcclxuICAgICAgLy8oc2FtcGxlSGVhZGVyLmVuZExvb3AgLSBzYW1wbGVIZWFkZXIuc3RhcnQpICtcclxuICAgICAgKHNhbXBsZUhlYWRlci5lbmRMb29wKSArXHJcbiAgICAgIGdldE1vZEdlbkFtb3VudChnZW5lcmF0b3IsICdlbmRsb29wQWRkcnNDb2Fyc2VPZmZzZXQnKSAqIDMyNzY4ICtcclxuICAgICAgZ2V0TW9kR2VuQW1vdW50KGdlbmVyYXRvciwgJ2VuZGxvb3BBZGRyc09mZnNldCcpXHJcbiAgICApLFxyXG4gICAgdm9sQXR0YWNrOiBNYXRoLnBvdygyLCB2b2xBdHRhY2sgLyAxMjAwKSxcclxuICAgIHZvbERlY2F5OiBNYXRoLnBvdygyLCB2b2xEZWNheSAvIDEyMDApLFxyXG4gICAgdm9sU3VzdGFpbjogdm9sU3VzdGFpbiAvIDEwMDAsXHJcbiAgICB2b2xSZWxlYXNlOiBNYXRoLnBvdygyLCB2b2xSZWxlYXNlIC8gMTIwMCksXHJcbiAgICBtb2RBdHRhY2s6IE1hdGgucG93KDIsIG1vZEF0dGFjayAvIDEyMDApLFxyXG4gICAgbW9kRGVjYXk6IE1hdGgucG93KDIsIG1vZERlY2F5IC8gMTIwMCksXHJcbiAgICBtb2RTdXN0YWluOiBtb2RTdXN0YWluIC8gMTAwMCxcclxuICAgIG1vZFJlbGVhc2U6IE1hdGgucG93KDIsIG1vZFJlbGVhc2UgLyAxMjAwKSxcclxuICAgIGluaXRpYWxGaWx0ZXJGYzogZ2V0TW9kR2VuQW1vdW50KGdlbmVyYXRvciwgJ2luaXRpYWxGaWx0ZXJGYycsIDEzNTAwKSxcclxuICAgIG1vZEVudlRvRmlsdGVyRmM6IGdldE1vZEdlbkFtb3VudChnZW5lcmF0b3IsICdtb2RFbnZUb0ZpbHRlckZjJyksXHJcbiAgICBpbml0aWFsRmlsdGVyUTogZ2V0TW9kR2VuQW1vdW50KGdlbmVyYXRvciwgJ2luaXRpYWxGaWx0ZXJRJywgMSksXHJcbiAgICBmcmVxVmliTEZPOiBmcmVxVmliTEZPID8gTWF0aC5wb3coMiwgZnJlcVZpYkxGTyAvIDEyMDApICogOC4xNzYgOiB1bmRlZmluZWQsXHJcbiAgICBwbGF5YmFja1JhdGU6IChrZXkpID0+IE1hdGgucG93KE1hdGgucG93KDIsIDEgLyAxMiksIChrZXkgKyBiYXNlUGl0Y2gpICogc2NhbGUpLFxyXG4gICAga2V5UmFuZ2UsXHJcbiAgICB2ZWxSYW5nZVxyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0TW9kR2VuQW1vdW50KGdlbmVyYXRvcjoge30sIGVudW1lcmF0b3JUeXBlOiBzdHJpbmcsIG9wdF9kZWZhdWx0OiBudW1iZXIgPSAwKTogbnVtYmVyIHtcclxuICByZXR1cm4gZ2VuZXJhdG9yW2VudW1lcmF0b3JUeXBlXSA/IGdlbmVyYXRvcltlbnVtZXJhdG9yVHlwZV0uYW1vdW50IDogb3B0X2RlZmF1bHRcclxufVxyXG5cclxuZnVuY3Rpb24gY3JlYXRlQmFnTW9kR2VuKHpvbmU6IHt9W10sIGluZGV4U3RhcnQ6IG51bWJlciwgaW5kZXhFbmQ6IG51bWJlciwgem9uZU1vZEdlbjoge30pOiB7bW9kZ2VuOiB7fSwgbW9kZ2VuSW5mbzoge31bXX0gIHtcclxuICBjb25zdCBtb2RnZW5JbmZvID0gW11cclxuICBjb25zdCBtb2RnZW4gPSB7XHJcbiAgICB1bmtub3duOiBbXSxcclxuICAgICdrZXlSYW5nZSc6IHtcclxuICAgICAgaGk6IDEyNyxcclxuICAgICAgbG86IDBcclxuICAgIH1cclxuICB9OyAvLyBUT0RPXHJcblxyXG4gIGZvciAobGV0IGkgPSBpbmRleFN0YXJ0OyBpIDwgaW5kZXhFbmQ7ICsraSkge1xyXG4gICAgY29uc3QgaW5mbyA9IHpvbmVNb2RHZW5baV1cclxuICAgIG1vZGdlbkluZm8ucHVzaChpbmZvKVxyXG5cclxuICAgIGlmIChpbmZvLnR5cGUgPT09ICd1bmtub3duJykge1xyXG4gICAgICBtb2RnZW4udW5rbm93bi5wdXNoKGluZm8udmFsdWUpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBtb2RnZW5baW5mby50eXBlXSA9IGluZm8udmFsdWVcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiB7IG1vZGdlbiwgbW9kZ2VuSW5mbyB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNyZWF0ZUluc3RydW1lbnRHZW5lcmF0b3Ioem9uZToge2luc3RydW1lbnRHZW5lcmF0b3JJbmRleDogbnVtYmVyfVtdLCBpbmRleDogbnVtYmVyLCBpbnN0cnVtZW50Wm9uZUdlbmVyYXRvcjoge31bXSkge1xyXG4gIGNvbnN0IG1vZGdlbiA9IGNyZWF0ZUJhZ01vZEdlbihcclxuICAgIHpvbmUsXHJcbiAgICB6b25lW2luZGV4XS5pbnN0cnVtZW50R2VuZXJhdG9ySW5kZXgsXHJcbiAgICB6b25lW2luZGV4ICsgMV0gPyB6b25lW2luZGV4ICsgMV0uaW5zdHJ1bWVudEdlbmVyYXRvckluZGV4IDogaW5zdHJ1bWVudFpvbmVHZW5lcmF0b3IubGVuZ3RoLFxyXG4gICAgaW5zdHJ1bWVudFpvbmVHZW5lcmF0b3JcclxuICApXHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBnZW5lcmF0b3I6IG1vZGdlbi5tb2RnZW4sXHJcbiAgICBnZW5lcmF0b3JJbmZvOiBtb2RnZW4ubW9kZ2VuSW5mb1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gY3JlYXRlSW5zdHJ1bWVudE1vZHVsYXRvcih6b25lOiB7aW5zdHJ1bWVudE1vZHVsYXRvckluZGV4OiBudW1iZXIsIHByZXNldE1vZHVsYXRvckluZGV4OiBudW1iZXJ9W10sIGluZGV4OiBudW1iZXIsIGluc3RydW1lbnRab25lTW9kdWxhdG9yOiB7fVtdKSB7XHJcbiAgY29uc3QgbW9kZ2VuID0gY3JlYXRlQmFnTW9kR2VuKFxyXG4gICAgem9uZSxcclxuICAgIHpvbmVbaW5kZXhdLnByZXNldE1vZHVsYXRvckluZGV4LFxyXG4gICAgem9uZVtpbmRleCArIDFdID8gem9uZVtpbmRleCArIDFdLmluc3RydW1lbnRNb2R1bGF0b3JJbmRleCA6IGluc3RydW1lbnRab25lTW9kdWxhdG9yLmxlbmd0aCxcclxuICAgIGluc3RydW1lbnRab25lTW9kdWxhdG9yXHJcbiAgKVxyXG5cclxuICByZXR1cm4ge1xyXG4gICAgbW9kdWxhdG9yOiBtb2RnZW4ubW9kZ2VuLFxyXG4gICAgbW9kdWxhdG9ySW5mbzogbW9kZ2VuLm1vZGdlbkluZm9cclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNyZWF0ZVByZXNldEdlbmVyYXRvcih6b25lOiB7cHJlc2V0R2VuZXJhdG9ySW5kZXg6IG51bWJlcn1bXSwgaW5kZXg6IG51bWJlciwgcHJlc2V0Wm9uZUdlbmVyYXRvcjoge31bXSk6IHtnZW5lcmF0b3I6IE9iamVjdCwgZ2VuZXJhdG9ySW5mbzogT2JqZWN0W119IHtcclxuICBjb25zdCBtb2RnZW4gPSBjcmVhdGVCYWdNb2RHZW4oXHJcbiAgICB6b25lLFxyXG4gICAgem9uZVtpbmRleF0ucHJlc2V0R2VuZXJhdG9ySW5kZXgsXHJcbiAgICB6b25lW2luZGV4ICsgMV0gPyB6b25lW2luZGV4ICsgMV0ucHJlc2V0R2VuZXJhdG9ySW5kZXggOiBwcmVzZXRab25lR2VuZXJhdG9yLmxlbmd0aCxcclxuICAgIHByZXNldFpvbmVHZW5lcmF0b3JcclxuICApXHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBnZW5lcmF0b3I6IG1vZGdlbi5tb2RnZW4sXHJcbiAgICBnZW5lcmF0b3JJbmZvOiBtb2RnZW4ubW9kZ2VuSW5mb1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gY3JlYXRlUHJlc2V0TW9kdWxhdG9yKHpvbmU6IHtwcmVzZXRNb2R1bGF0b3JJbmRleDogbnVtYmVyfVtdLCBpbmRleDogbnVtYmVyLCBwcmVzZXRab25lTW9kdWxhdG9yOiB7fVtdKSB7XHJcbiAgY29uc3QgbW9kZ2VuID0gY3JlYXRlQmFnTW9kR2VuKFxyXG4gICAgem9uZSxcclxuICAgIHpvbmVbaW5kZXhdLnByZXNldE1vZHVsYXRvckluZGV4LFxyXG4gICAgem9uZVtpbmRleCArIDFdID8gem9uZVtpbmRleCArIDFdLnByZXNldE1vZHVsYXRvckluZGV4IDogcHJlc2V0Wm9uZU1vZHVsYXRvci5sZW5ndGgsXHJcbiAgICBwcmVzZXRab25lTW9kdWxhdG9yXHJcbiAgKVxyXG5cclxuICByZXR1cm4ge1xyXG4gICAgbW9kdWxhdG9yOiBtb2RnZW4ubW9kZ2VuLFxyXG4gICAgbW9kdWxhdG9ySW5mbzogbW9kZ2VuLm1vZGdlbkluZm9cclxuICB9XHJcbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvc291bmRfZm9udC50cyIsImltcG9ydCBTeW50aGVzaXplciBmcm9tIFwiLi9zb3VuZF9mb250X3N5bnRoLnRzXCJcclxuaW1wb3J0IFByb2dyYW1OYW1lcyBmcm9tIFwiLi9wcm9ncmFtX25hbWVzLnRzXCJcclxuaW1wb3J0IHsgRE9NRWxlbWVudCB9IGZyb20gXCJyZWFjdFwiO1xyXG5cclxuZnVuY3Rpb24gcmVuZGVyKHN0cikge1xyXG4gIGNvbnN0IHdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gIHdyYXBwZXIuaW5uZXJIVE1MID0gc3RyLnJlcGxhY2UoL15cXHMrLywgXCJcIik7XHJcbiAgcmV0dXJuIHdyYXBwZXIuZmlyc3RFbGVtZW50Q2hpbGQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlbmRlcktleXMoKSB7XHJcbiAgbGV0IGh0bWwgPSBcIlwiO1xyXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgMTI4OyBpKyspIHtcclxuICAgIGNvbnN0IG4gPSBpICUgMTI7XHJcbiAgICBjb25zdCBpc0JsYWNrID0gWzEsIDMsIDYsIDgsIDEwXS5pbmNsdWRlcyhuKTtcclxuICAgIGh0bWwgKz0gYDxkaXYgY2xhc3M9XCJrZXkgJHtpc0JsYWNrID8gXCJibGFja1wiIDogXCJ3aGl0ZVwifVwiPjwvZGl2PmA7XHJcbiAgfVxyXG4gIHJldHVybiBodG1sXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlbmRlclByb2dyYW1PcHRpb25zKHByb2dyYW1OYW1lcywgYmFuaykge1xyXG4gIGxldCBodG1sID0gXCJcIlxyXG4gIGNvbnN0IG5hbWVzID0gcHJvZ3JhbU5hbWVzW2JhbmtdXHJcbiAgZm9yIChsZXQgaSBpbiBuYW1lcykge1xyXG4gICAgY29uc3QgbmFtZSA9IG5hbWVzW2ldXHJcbiAgICBodG1sICs9IGA8b3B0aW9uIHZhbHVlPVwiJHtpfVwiPiR7aX06ICR7bmFtZX08L29wdGlvbj5gXHJcbiAgfVxyXG4gIHJldHVybiBgPHNlbGVjdD4ke2h0bWx9PC9zZWxlY3Q+YDtcclxufVxyXG5cclxuZnVuY3Rpb24gcmVuZGVySW5zdHJ1bWVudChwcm9ncmFtKSB7XHJcbiAgcmV0dXJuIHJlbmRlcihgXHJcbiAgICA8ZGl2IGNsYXNzPVwiaW5zdHJ1bWVudFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicHJvZ3JhbVwiPiR7cHJvZ3JhbX08L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cInZvbHVtZVwiPjwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicGFucG90XCI+PC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJwaXRjaEJlbmRcIj48L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cInBpdGNoQmVuZFNlbnNpdGl2aXR5XCI+PC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJrZXlzXCI+JHtyZW5kZXJLZXlzKCl9PC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICBgKVxyXG59XHJcblxyXG5mdW5jdGlvbiBwcm9ncmFtTmFtZXNGcm9tQmFua1NldChiYW5rU2V0KSB7XHJcbiAgcmV0dXJuIGJhbmtTZXQubWFwKGJhbmsgPT4gYmFuay5tYXAocyA9PiBzLm5hbWUpKVxyXG59XHJcblxyXG5mdW5jdGlvbiBtZXJnZVByb2dyYW1OYW1lcyhsZWZ0OiB7W2luZGV4OiBudW1iZXJdOiBzdHJpbmdbXX0sIHJpZ2h0OiB7W2luZGV4OiBudW1iZXJdOiBzdHJpbmdbXX0pIHtcclxuICBmdW5jdGlvbiBtZXJnZWRLZXlzKGEsIGIpIHtcclxuICAgIHJldHVybiBuZXcgU2V0KFsuLi5PYmplY3Qua2V5cyhhKSwgLi4uT2JqZWN0LmtleXMoYildKVxyXG4gIH1cclxuICBjb25zdCBiYW5rcyA9IG1lcmdlZEtleXMobGVmdCwgcmlnaHQpXHJcbiAgY29uc3QgcmVzdWx0ID0ge31cclxuICBiYW5rcy5mb3JFYWNoKGJhbmsgPT4ge1xyXG4gICAgY29uc3QgbCA9IGxlZnRbYmFua10gfHwgW11cclxuICAgIGNvbnN0IHIgPSByaWdodFtiYW5rXSB8fCBbXVxyXG4gICAgY29uc3QgbGlzdDogeyBbaW5kZXg6IG51bWJlcl06IHN0cmluZ30gPSB7fVxyXG4gICAgY29uc3QgcHJvZ3JhbXMgPSBtZXJnZWRLZXlzKGwsIHIpXHJcbiAgICBwcm9ncmFtcy5mb3JFYWNoKHAgPT4ge1xyXG4gICAgICBsaXN0W3BdID0gYCR7bFtwXSB8fCBcIk5vbmVcIn0gKCR7cltwXSB8fCBcIk5vbmVcIn0pYFxyXG4gICAgfSlcclxuICAgIHJlc3VsdFtiYW5rXSA9IGxpc3RcclxuICB9KVxyXG4gIHJldHVybiByZXN1bHRcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmlldyB7XHJcbiAgcHJpdmF0ZSBlbGVtZW50OiBFbGVtZW50XHJcbiAgcHJpdmF0ZSBkcmFnOiBib29sZWFuID0gZmFsc2VcclxuXHJcbiAgZHJhdyhzeW50aDogU3ludGhlc2l6ZXIpOiBFbGVtZW50IHtcclxuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmVsZW1lbnQgPSByZW5kZXIoYDxkaXYgLz5gKTtcclxuICAgIGNvbnN0IHByb2dyYW1OYW1lcyA9IG1lcmdlUHJvZ3JhbU5hbWVzKHByb2dyYW1OYW1lc0Zyb21CYW5rU2V0KHN5bnRoLnNvdW5kRm9udC5iYW5rU2V0KSwgUHJvZ3JhbU5hbWVzKVxyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTY7ICsraSkge1xyXG4gICAgICBjb25zdCBiYW5rID0gaSAhPT0gOSA/IDAgOiAxMjhcclxuICAgICAgY29uc3QgcHJvZ3JhbSA9IHJlbmRlclByb2dyYW1PcHRpb25zKHByb2dyYW1OYW1lcywgYmFuaylcclxuICAgICAgY29uc3QgaXRlbSA9IHJlbmRlckluc3RydW1lbnQocHJvZ3JhbSlcclxuXHJcbiAgICAgIGNvbnN0IGNoYW5uZWwgPSBpO1xyXG4gICAgICBjb25zdCBzZWxlY3QgPSBpdGVtLnF1ZXJ5U2VsZWN0b3IoJ3NlbGVjdCcpO1xyXG4gICAgICBpZiAoc2VsZWN0KSB7XHJcbiAgICAgICAgc2VsZWN0LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGV2ZW50ID0+IHtcclxuICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MU2VsZWN0RWxlbWVudFxyXG4gICAgICAgICAgc3ludGgucHJvZ3JhbUNoYW5nZShjaGFubmVsLCBwYXJzZUludCh0YXJnZXQudmFsdWUsIDEwKSk7XHJcbiAgICAgICAgfSwgZmFsc2UpO1xyXG4gICAgICAgIHNlbGVjdC5zZWxlY3RlZEluZGV4ID0gc3ludGguY2hhbm5lbHNbaV0uaW5zdHJ1bWVudDtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3Qgbm90ZXMgPSBpdGVtLnF1ZXJ5U2VsZWN0b3JBbGwoXCIua2V5XCIpO1xyXG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDEyODsgKytqKSB7XHJcbiAgICAgICAgY29uc3Qga2V5ID0gajtcclxuXHJcbiAgICAgICAgbm90ZXNbal0uYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgZXZlbnQgPT4ge1xyXG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgIHRoaXMuZHJhZyA9IHRydWU7XHJcbiAgICAgICAgICBzeW50aC5ub3RlT24oY2hhbm5lbCwga2V5LCAxMjcpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIG5vdGVzW2pdLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3ZlcicsIGV2ZW50ID0+IHtcclxuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICBpZiAodGhpcy5kcmFnKSB7XHJcbiAgICAgICAgICAgIHN5bnRoLm5vdGVPbihjaGFubmVsLCBrZXksIDEyNyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgbm90ZXNbal0uYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdXQnLCBldmVudCA9PiB7XHJcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgc3ludGgubm90ZU9mZihjaGFubmVsLCBrZXksIDApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIG5vdGVzW2pdLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBldmVudCA9PiB7XHJcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgdGhpcy5kcmFnID0gZmFsc2U7XHJcbiAgICAgICAgICBzeW50aC5ub3RlT2ZmKGNoYW5uZWwsIGtleSwgMCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoaXRlbSlcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZWxlbWVudDtcclxuICB9XHJcblxyXG4gIHJlbW92ZSgpIHtcclxuICAgIGlmICghdGhpcy5lbGVtZW50KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmVsZW1lbnQpO1xyXG4gICAgdGhpcy5lbGVtZW50ID0gbnVsbDtcclxuICB9XHJcblxyXG4gIGdldEluc3RydW1lbnRFbGVtZW50KGNoYW5uZWwpIHtcclxuICAgIHJldHVybiB0aGlzLmVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChcIi5pbnN0cnVtZW50XCIpW2NoYW5uZWxdXHJcbiAgfVxyXG5cclxuICBnZXRLZXlFbGVtZW50KGNoYW5uZWwsIGtleSkge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0SW5zdHJ1bWVudEVsZW1lbnQoY2hhbm5lbCkucXVlcnlTZWxlY3RvckFsbChcIi5rZXlcIilba2V5XVxyXG4gIH1cclxuXHJcbiAgbm90ZU9uKGNoYW5uZWwsIGtleSkge1xyXG4gICAgaWYgKCF0aGlzLmVsZW1lbnQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZ2V0S2V5RWxlbWVudChjaGFubmVsLCBrZXkpLmNsYXNzTGlzdC5hZGQoJ25vdGUtb24nKTtcclxuICB9XHJcblxyXG4gIG5vdGVPZmYoY2hhbm5lbCwga2V5KSB7XHJcbiAgICBpZiAoIXRoaXMuZWxlbWVudCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5nZXRLZXlFbGVtZW50KGNoYW5uZWwsIGtleSkuY2xhc3NMaXN0LnJlbW92ZSgnbm90ZS1vbicpO1xyXG4gIH1cclxuXHJcbiAgcHJvZ3JhbUNoYW5nZShjaGFubmVsLCBpbnN0cnVtZW50KSB7XHJcbiAgICBpZiAoIXRoaXMuZWxlbWVudCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgc2VsZWN0OiBIVE1MU2VsZWN0RWxlbWVudCA9IHRoaXMuZ2V0SW5zdHJ1bWVudEVsZW1lbnQoY2hhbm5lbCkucXVlcnlTZWxlY3RvcihcIi5wcm9ncmFtIHNlbGVjdFwiKVxyXG5cclxuICAgIGlmIChzZWxlY3QpIHtcclxuICAgICAgc2VsZWN0LnZhbHVlID0gaW5zdHJ1bWVudDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHZvbHVtZUNoYW5nZShjaGFubmVsLCB2b2x1bWUpIHtcclxuICAgIGlmICghdGhpcy5lbGVtZW50KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmdldEluc3RydW1lbnRFbGVtZW50KGNoYW5uZWwpLnF1ZXJ5U2VsZWN0b3IoXCIudm9sdW1lXCIpLnRleHRDb250ZW50ID0gdm9sdW1lO1xyXG4gIH1cclxuXHJcbiAgcGFucG90Q2hhbmdlKGNoYW5uZWwsIHBhbnBvdCkge1xyXG4gICAgaWYgKCF0aGlzLmVsZW1lbnQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZ2V0SW5zdHJ1bWVudEVsZW1lbnQoY2hhbm5lbCkucXVlcnlTZWxlY3RvcihcIi5wYW5wb3RcIikudGV4dENvbnRlbnQgPSBwYW5wb3Q7XHJcbiAgfVxyXG5cclxuICBwaXRjaEJlbmQoY2hhbm5lbCwgY2FsY3VsYXRlZFBpdGNoKSB7XHJcbiAgICBpZiAoIXRoaXMuZWxlbWVudCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5nZXRJbnN0cnVtZW50RWxlbWVudChjaGFubmVsKS5xdWVyeVNlbGVjdG9yKFwiLnBpdGNoQmVuZFwiKS50ZXh0Q29udGVudCA9IGNhbGN1bGF0ZWRQaXRjaDtcclxuICB9XHJcblxyXG4gIHBpdGNoQmVuZFNlbnNpdGl2aXR5KGNoYW5uZWwsIHNlbnNpdGl2aXR5KSB7XHJcbiAgICBpZiAoIXRoaXMuZWxlbWVudCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5nZXRJbnN0cnVtZW50RWxlbWVudChjaGFubmVsKS5xdWVyeVNlbGVjdG9yKFwiLnBpdGNoQmVuZFNlbnNpdGl2aXR5XCIpLnRleHRDb250ZW50ID0gc2Vuc2l0aXZpdHk7XHJcbiAgfVxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9zeW50aF92aWV3LnRzIiwiY29uc3QgUHJvZ3JhbU5hbWVzOiB7IFtpbmRleDogbnVtYmVyXTogc3RyaW5nW10gfSA9IHtcclxuICAwOiBbXHJcbiAgICBcIkFjb3VzdGljIFBpYW5vXCIsXHJcbiAgICBcIkJyaWdodCBQaWFub1wiLFxyXG4gICAgXCJFbGVjdHJpYyBHcmFuZCBQaWFub1wiLFxyXG4gICAgXCJIb25reS10b25rIFBpYW5vXCIsXHJcbiAgICBcIkVsZWN0cmljIFBpYW5vXCIsXHJcbiAgICBcIkVsZWN0cmljIFBpYW5vIDJcIixcclxuICAgIFwiSGFycHNpY2hvcmRcIixcclxuICAgIFwiQ2xhdmlcIixcclxuICAgIFwiQ2VsZXN0YVwiLFxyXG4gICAgXCJHbG9ja2Vuc3BpZWxcIixcclxuICAgIFwiTXVzaWNhbCBib3hcIixcclxuICAgIFwiVmlicmFwaG9uZVwiLFxyXG4gICAgXCJNYXJpbWJhXCIsXHJcbiAgICBcIlh5bG9waG9uZVwiLFxyXG4gICAgXCJUdWJ1bGFyIEJlbGxcIixcclxuICAgIFwiRHVsY2ltZXJcIixcclxuICAgIFwiRHJhd2JhciBPcmdhblwiLFxyXG4gICAgXCJQZXJjdXNzaXZlIE9yZ2FuXCIsXHJcbiAgICBcIlJvY2sgT3JnYW5cIixcclxuICAgIFwiQ2h1cmNoIG9yZ2FuXCIsXHJcbiAgICBcIlJlZWQgb3JnYW5cIixcclxuICAgIFwiQWNjb3JkaW9uXCIsXHJcbiAgICBcIkhhcm1vbmljYVwiLFxyXG4gICAgXCJUYW5nbyBBY2NvcmRpb25cIixcclxuICAgIFwiQWNvdXN0aWMgR3VpdGFyIChueWxvbilcIixcclxuICAgIFwiQWNvdXN0aWMgR3VpdGFyIChzdGVlbClcIixcclxuICAgIFwiRWxlY3RyaWMgR3VpdGFyIChqYXp6KVwiLFxyXG4gICAgXCJFbGVjdHJpYyBHdWl0YXIgKGNsZWFuKVwiLFxyXG4gICAgXCJFbGVjdHJpYyBHdWl0YXIgKG11dGVkKVwiLFxyXG4gICAgXCJPdmVyZHJpdmVuIEd1aXRhclwiLFxyXG4gICAgXCJEaXN0b3J0aW9uIEd1aXRhclwiLFxyXG4gICAgXCJHdWl0YXIgaGFybW9uaWNzXCIsXHJcbiAgICBcIkFjb3VzdGljIEJhc3NcIixcclxuICAgIFwiRWxlY3RyaWMgQmFzcyAoZmluZ2VyKVwiLFxyXG4gICAgXCJFbGVjdHJpYyBCYXNzIChwaWNrKVwiLFxyXG4gICAgXCJGcmV0bGVzcyBCYXNzXCIsXHJcbiAgICBcIlNsYXAgQmFzcyAxXCIsXHJcbiAgICBcIlNsYXAgQmFzcyAyXCIsXHJcbiAgICBcIlN5bnRoIEJhc3MgMVwiLFxyXG4gICAgXCJTeW50aCBCYXNzIDJcIixcclxuICAgIFwiVmlvbGluXCIsXHJcbiAgICBcIlZpb2xhXCIsXHJcbiAgICBcIkNlbGxvXCIsXHJcbiAgICBcIkRvdWJsZSBiYXNzXCIsXHJcbiAgICBcIlRyZW1vbG8gU3RyaW5nc1wiLFxyXG4gICAgXCJQaXp6aWNhdG8gU3RyaW5nc1wiLFxyXG4gICAgXCJPcmNoZXN0cmFsIEhhcnBcIixcclxuICAgIFwiVGltcGFuaVwiLFxyXG4gICAgXCJTdHJpbmcgRW5zZW1ibGUgMVwiLFxyXG4gICAgXCJTdHJpbmcgRW5zZW1ibGUgMlwiLFxyXG4gICAgXCJTeW50aCBTdHJpbmdzIDFcIixcclxuICAgIFwiU3ludGggU3RyaW5ncyAyXCIsXHJcbiAgICBcIlZvaWNlIEFhaHNcIixcclxuICAgIFwiVm9pY2UgT29oc1wiLFxyXG4gICAgXCJTeW50aCBWb2ljZVwiLFxyXG4gICAgXCJPcmNoZXN0cmEgSGl0XCIsXHJcbiAgICBcIlRydW1wZXRcIixcclxuICAgIFwiVHJvbWJvbmVcIixcclxuICAgIFwiVHViYVwiLFxyXG4gICAgXCJNdXRlZCBUcnVtcGV0XCIsXHJcbiAgICBcIkZyZW5jaCBob3JuXCIsXHJcbiAgICBcIkJyYXNzIFNlY3Rpb25cIixcclxuICAgIFwiU3ludGggQnJhc3MgMVwiLFxyXG4gICAgXCJTeW50aCBCcmFzcyAyXCIsXHJcbiAgICBcIlNvcHJhbm8gU2F4XCIsXHJcbiAgICBcIkFsdG8gU2F4XCIsXHJcbiAgICBcIlRlbm9yIFNheFwiLFxyXG4gICAgXCJCYXJpdG9uZSBTYXhcIixcclxuICAgIFwiT2JvZVwiLFxyXG4gICAgXCJFbmdsaXNoIEhvcm5cIixcclxuICAgIFwiQmFzc29vblwiLFxyXG4gICAgXCJDbGFyaW5ldFwiLFxyXG4gICAgXCJQaWNjb2xvXCIsXHJcbiAgICBcIkZsdXRlXCIsXHJcbiAgICBcIlJlY29yZGVyXCIsXHJcbiAgICBcIlBhbiBGbHV0ZVwiLFxyXG4gICAgXCJCbG93biBCb3R0bGVcIixcclxuICAgIFwiU2hha3VoYWNoaVwiLFxyXG4gICAgXCJXaGlzdGxlXCIsXHJcbiAgICBcIk9jYXJpbmFcIixcclxuICAgIFwiTGVhZCAxIChzcXVhcmUpXCIsXHJcbiAgICBcIkxlYWQgMiAoc2F3dG9vdGgpXCIsXHJcbiAgICBcIkxlYWQgMyAoY2FsbGlvcGUpXCIsXHJcbiAgICBcIkxlYWQgNCAoY2hpZmYpXCIsXHJcbiAgICBcIkxlYWQgNSAoY2hhcmFuZylcIixcclxuICAgIFwiTGVhZCA2ICh2b2ljZSlcIixcclxuICAgIFwiTGVhZCA3IChmaWZ0aHMpXCIsXHJcbiAgICBcIkxlYWQgOCAoYmFzcyArIGxlYWQpXCIsXHJcbiAgICBcIlBhZCAxIChGYW50YXNpYSlcIixcclxuICAgIFwiUGFkIDIgKHdhcm0pXCIsXHJcbiAgICBcIlBhZCAzIChwb2x5c3ludGgpXCIsXHJcbiAgICBcIlBhZCA0IChjaG9pcilcIixcclxuICAgIFwiUGFkIDUgKGJvd2VkKVwiLFxyXG4gICAgXCJQYWQgNiAobWV0YWxsaWMpXCIsXHJcbiAgICBcIlBhZCA3IChoYWxvKVwiLFxyXG4gICAgXCJQYWQgOCAoc3dlZXApXCIsXHJcbiAgICBcIkZYIDEgKHJhaW4pXCIsXHJcbiAgICBcIkZYIDIgKHNvdW5kdHJhY2spXCIsXHJcbiAgICBcIkZYIDMgKGNyeXN0YWwpXCIsXHJcbiAgICBcIkZYIDQgKGF0bW9zcGhlcmUpXCIsXHJcbiAgICBcIkZYIDUgKGJyaWdodG5lc3MpXCIsXHJcbiAgICBcIkZYIDYgKGdvYmxpbnMpXCIsXHJcbiAgICBcIkZYIDcgKGVjaG9lcylcIixcclxuICAgIFwiRlggOCAoc2NpLWZpKVwiLFxyXG4gICAgXCJTaXRhclwiLFxyXG4gICAgXCJCYW5qb1wiLFxyXG4gICAgXCJTaGFtaXNlblwiLFxyXG4gICAgXCJLb3RvXCIsXHJcbiAgICBcIkthbGltYmFcIixcclxuICAgIFwiQmFncGlwZVwiLFxyXG4gICAgXCJGaWRkbGVcIixcclxuICAgIFwiU2hhbmFpXCIsXHJcbiAgICBcIlRpbmtsZSBCZWxsXCIsXHJcbiAgICBcIkFnb2dvXCIsXHJcbiAgICBcIlN0ZWVsIERydW1zXCIsXHJcbiAgICBcIldvb2RibG9ja1wiLFxyXG4gICAgXCJUYWlrbyBEcnVtXCIsXHJcbiAgICBcIk1lbG9kaWMgVG9tXCIsXHJcbiAgICBcIlN5bnRoIERydW1cIixcclxuICAgIFwiUmV2ZXJzZSBDeW1iYWxcIixcclxuICAgIFwiR3VpdGFyIEZyZXQgTm9pc2VcIixcclxuICAgIFwiQnJlYXRoIE5vaXNlXCIsXHJcbiAgICBcIlNlYXNob3JlXCIsXHJcbiAgICBcIkJpcmQgVHdlZXRcIixcclxuICAgIFwiVGVsZXBob25lIFJpbmdcIixcclxuICAgIFwiSGVsaWNvcHRlclwiLFxyXG4gICAgXCJBcHBsYXVzZVwiLFxyXG4gICAgXCJHdW5zaG90XCJcclxuICBdLCAxMjg6IFtcIlJoeXRobSBUcmFja1wiXVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBQcm9ncmFtTmFtZXNcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcHJvZ3JhbV9uYW1lcy50cyIsImltcG9ydCBTeW50aGVzaXplciBmcm9tIFwiLi9zb3VuZF9mb250X3N5bnRoXCJcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1pZGlNZXNzYWdlSGFuZGxlciB7XHJcbiAgcHJpdmF0ZSBScG5Nc2IgPSBbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMF1cclxuICBwcml2YXRlIFJwbkxzYiA9IFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwXVxyXG4gIHN5bnRoOiBTeW50aGVzaXplclxyXG5cclxuICBwcm9jZXNzTWlkaU1lc3NhZ2UobWVzc2FnZTogbnVtYmVyW10pIHtcclxuICAgIGNvbnN0IGNoYW5uZWwgPSBtZXNzYWdlWzBdICYgMHgwZlxyXG4gICAgY29uc3QgeyBzeW50aCB9ID0gdGhpc1xyXG5cclxuICAgIGlmICghc3ludGgpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgc3dpdGNoIChtZXNzYWdlWzBdICYgMHhmMCkge1xyXG4gICAgICBjYXNlIDB4ODA6IC8vIE5vdGVPZmY6IDhuIGtrIHZ2XHJcbiAgICAgICAgc3ludGgubm90ZU9mZihjaGFubmVsLCBtZXNzYWdlWzFdLCBtZXNzYWdlWzJdKVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIGNhc2UgMHg5MDogLy8gTm90ZU9uOiA5biBrayB2dlxyXG4gICAgICAgIGlmIChtZXNzYWdlWzJdID4gMCkge1xyXG4gICAgICAgICAgc3ludGgubm90ZU9uKGNoYW5uZWwsIG1lc3NhZ2VbMV0sIG1lc3NhZ2VbMl0pXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHN5bnRoLm5vdGVPZmYoY2hhbm5lbCwgbWVzc2FnZVsxXSwgMClcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgY2FzZSAweEIwOiAvLyBDb250cm9sIENoYW5nZTogQm4gY2MgZGRcclxuICAgICAgICBzd2l0Y2ggKG1lc3NhZ2VbMV0pIHtcclxuICAgICAgICAgIGNhc2UgMHgwNjogLy8gRGF0YSBFbnRyeTogQm4gMDYgZGRcclxuICAgICAgICAgICAgc3dpdGNoICh0aGlzLlJwbk1zYltjaGFubmVsXSkge1xyXG4gICAgICAgICAgICAgIGNhc2UgMDpcclxuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5ScG5Mc2JbY2hhbm5lbF0pIHtcclxuICAgICAgICAgICAgICAgICAgY2FzZSAwOiAvLyBQaXRjaCBCZW5kIFNlbnNpdGl2aXR5XHJcbiAgICAgICAgICAgICAgICAgICAgc3ludGgucGl0Y2hCZW5kU2Vuc2l0aXZpdHkoY2hhbm5lbCwgbWVzc2FnZVsyXSlcclxuICAgICAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICAgICAgICBkZWZhdWx0OiBcclxuICAgICAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgICBkZWZhdWx0OiBcclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgIGNhc2UgMHgwNzogLy8gVm9sdW1lIENoYW5nZTogQm4gMDcgZGRcclxuICAgICAgICAgICAgc3ludGgudm9sdW1lQ2hhbmdlKGNoYW5uZWwsIG1lc3NhZ2VbMl0pXHJcbiAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICBjYXNlIDB4MEE6IC8vIFBhbnBvdCBDaGFuZ2U6IEJuIDBBIGRkXHJcbiAgICAgICAgICAgIHN5bnRoLnBhbnBvdENoYW5nZShjaGFubmVsLCBtZXNzYWdlWzJdKVxyXG4gICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgY2FzZSAweDc4OiAvLyBBbGwgU291bmQgT2ZmOiBCbiA3OCAwMFxyXG4gICAgICAgICAgICBzeW50aC5hbGxTb3VuZE9mZihjaGFubmVsKVxyXG4gICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgY2FzZSAweDc5OiAvLyBSZXNldCBBbGwgQ29udHJvbDogQm4gNzkgMDBcclxuICAgICAgICAgICAgc3ludGgucmVzZXRBbGxDb250cm9sKGNoYW5uZWwpXHJcbiAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICBjYXNlIDB4MjA6IC8vIEJhbmtTZWxlY3RcclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcImJhbmtzZWxlY3Q6XCIsIGNoYW5uZWwsIG1lc3NhZ2VbMl0pXHJcbiAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICBjYXNlIDB4NjQ6IC8vIFJQTiBNU0JcclxuICAgICAgICAgICAgdGhpcy5ScG5Nc2JbY2hhbm5lbF0gPSBtZXNzYWdlWzJdXHJcbiAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICBjYXNlIDB4NjU6IC8vIFJQTiBMU0JcclxuICAgICAgICAgICAgdGhpcy5ScG5Mc2JbY2hhbm5lbF0gPSBtZXNzYWdlWzJdXHJcbiAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgLy8gbm90IHN1cHBvcnRlZFxyXG4gICAgICAgIH1cclxuICAgICAgICBicmVha1xyXG4gICAgICBjYXNlIDB4QzA6IC8vIFByb2dyYW0gQ2hhbmdlOiBDbiBwcFxyXG4gICAgICAgIHN5bnRoLnByb2dyYW1DaGFuZ2UoY2hhbm5lbCwgbWVzc2FnZVsxXSlcclxuICAgICAgICBicmVha1xyXG4gICAgICBjYXNlIDB4RTA6IC8vIFBpdGNoIEJlbmRcclxuICAgICAgICBzeW50aC5waXRjaEJlbmQoY2hhbm5lbCwgbWVzc2FnZVsxXSwgbWVzc2FnZVsyXSlcclxuICAgICAgICBicmVha1xyXG4gICAgICBjYXNlIDB4ZjA6IC8vIFN5c3RlbSBFeGNsdXNpdmUgTWVzc2FnZVxyXG4gICAgICAgIC8vIElEIG51bWJlclxyXG4gICAgICAgIHN3aXRjaCAobWVzc2FnZVsxXSkge1xyXG4gICAgICAgICAgY2FzZSAweDdlOiAvLyBub24tcmVhbHRpbWVcclxuICAgICAgICAgICAgLy8gVE9ET1xyXG4gICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgY2FzZSAweDdmOiAvLyByZWFsdGltZVxyXG4gICAgICAgICAgICAvLyBjb25zdCBkZXZpY2UgPSBtZXNzYWdlWzJdXHJcbiAgICAgICAgICAgIC8vIHN1YiBJRCAxXHJcbiAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZVszXSkge1xyXG4gICAgICAgICAgICAgIGNhc2UgMHgwNDogLy8gZGV2aWNlIGNvbnRyb2xcclxuICAgICAgICAgICAgICAgIC8vIHN1YiBJRCAyXHJcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKG1lc3NhZ2VbNF0pIHtcclxuICAgICAgICAgICAgICAgICAgY2FzZSAweDAxOiB7IC8vIG1hc3RlciB2b2x1bWVcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2x1bWUgPSBtZXNzYWdlWzVdICsgKG1lc3NhZ2VbNl0gPDwgNylcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBNQVhfVk9MVU1FID0gMHg0MDAwIC0gMVxyXG4gICAgICAgICAgICAgICAgICAgIHN5bnRoLnNldE1hc3RlclZvbHVtZSh2b2x1bWUgLyBNQVhfVk9MVU1FKVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgZGVmYXVsdDogXHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgICAgZGVmYXVsdDogXHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICBkZWZhdWx0OiBcclxuICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgZGVmYXVsdDogLy8gbm90IHN1cHBvcnRlZFxyXG4gICAgICAgIGJyZWFrXHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9taWRpX21lc3NhZ2VfaGFuZGxlci50cyJdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file