diff --git a/html/js/owt/owtstream.js b/html/js/owt/owtstream.js index 524b8ca..b9fef77 100644 --- a/html/js/owt/owtstream.js +++ b/html/js/owt/owtstream.js @@ -1,19 +1,22 @@ -const createOWTStream = async () => { - stream = await Owt.Base.MediaStreamFactory.createMediaStream( - avTrackConstraint - ) - console.log(inputvideo) - if ("srcObject" in inputvideo) { - inputvideo.srcObject = stream - } else { - inputvideo.src = URL.createObjectURL(stream) - } +let instanceType = "deeplabtflite"; +let computeTime = 0; +let computeStart = 0; +const outputDimensions = [1, 321, 321, 21]; - inputvideo.autoplay = true - console.log(inputvideo.srcObject) -} +const inputOptions = { + mean: [127.5, 127.5, 127.5], + std: [127.5, 127.5, 127.5], + scaledFlag: false, + inputLayout: 'nhwc', + inputDimensions: [1, 321, 321, 3], // deeplab + inputResolution: [321, 321] +}; + +let outputBuffer; +let continueinputvideo = true; +console.log("not in worker create context: ", navigator.ml); -let continueinputvideo = true +const worker = new Worker('../js/tflite/deeplab/webnn/webnnworker.js'); const pipeline2 = buildWebGL2Pipeline( inputvideo, @@ -21,17 +24,83 @@ const pipeline2 = buildWebGL2Pipeline( "none", [321, 321], outputcanvas, - null + null, ); +function stopCamera() { + stream.getTracks().forEach((track) => { + if (track.readyState === 'live' && track.kind === 'video') { + track.stop(); + } + }); +} + +function renderCamStream() { + const inputBuffer = getInputTensor(inputvideo, inputOptions); + let obj = { + task: 'nncompute', + value: inputBuffer, + } + computeStart = performance.now(); + worker.postMessage(obj); +} + +async function drawOutput(outputBuffer, srcElement) { + if (instanceType.startsWith('deeplab')) { + outputBuffer = tf.tidy(() => { + const a = tf.tensor(outputBuffer, outputDimensions, 'float32'); + let axis = 3; + if (instanceType === 'deeplabnchw') { + axis = 1; + } + const b = tf.argMax(a, axis); + const c = tf.tensor(b.dataSync(), b.shape, 'float32'); + return c.dataSync(); + }); + } + console.log('output: ', outputBuffer); + outputcanvas.width = srcElement.naturalWidth | srcElement.videoWidth; + outputcanvas.height = srcElement.naturalHeight | srcElement.videoHeight; + const pipeline = buildWebGL2Pipeline( + srcElement, + backgroundImageSource, + backgroundType, + inputOptions.inputResolution, + outputcanvas, + outputBuffer, + ); + const postProcessingConfig = { + smoothSegmentationMask: true, + jointBilateralFilter: { sigmaSpace: 1, sigmaColor: 0.1 }, + coverage: [0.5, 0.75], + lightWrapping: 0.3, + blendMode: 'screen', + } + pipeline.updatePostProcessingConfig(postProcessingConfig); + await pipeline.render(); +} + +const createOWTStream = async () => { + stream = await Owt.Base.MediaStreamFactory.createMediaStream( + avTrackConstraint + ); + if ("srcObject" in inputvideo) { + inputvideo.srcObject = stream; + } else { + inputvideo.src = URL.createObjectURL(stream); + } + + inputvideo.autoplay = true; +} + const videoCanvasOnFrame = async () => { - if(continueinputvideo) { + if (continueinputvideo) { window.requestAnimationFrame(videoCanvasOnFrame); // ctx2d.drawImage(inputvideo, 0, 0, cW, cH); - if(stream) { + if (stream) { const postProcessingConfig2 = { smoothSegmentationMask: true, - jointBilateralFilter: {sigmaSpace: 1, sigmaColor: 0.1}, + jointBilateralFilter: { sigmaSpace: 1, sigmaColor: 0.1 }, coverage: [0.5, 0.75], lightWrapping: 0.3, blendMode: 'screen', @@ -44,40 +113,80 @@ const videoCanvasOnFrame = async () => { const oneWebMeetOWT = async () => { - await createOWTStream() - backgroundType = "blur" - continueinputvideo = true + await createOWTStream(); + backgroundType = "blur"; + continueinputvideo = true; await videoCanvasOnFrame(); getProcessedStream(); initConference(); userMarquee(); + // ssLoad(); - if(parsePathnameBackend().toLowerCase() === 'webnn' && parseSearchParams("ds") === "1") { - console.log("^^^^^^^^^^^^^^^^^ WIN ^^^^^^^^^^^^^^^^^^^^") - let worker = new Worker('../js/tflite/deeplab/webnn/webnnworker.js'); - worker.addEventListener('message', (e) => { - const { msg } = e.data; - $("#worker").html(msg); - }); - } else { - ssLoad(); + let obj = { + task: 'nnwarmup', + value: null, } + worker.postMessage(obj); + + + // // if(parsePathnameBackend().toLowerCase() === 'webnn' && parseSearchParams("ds") === "1") { + // if(parsePathnameBackend().toLowerCase() === 'wasm' && parseSearchParams("ds") === "0") { + // console.log("^^^^^^^^^^^^^^^^^ WIN ^^^^^^^^^^^^^^^^^^^^") + // let worker = new Worker('../js/tflite/deeplab/webnn/webnnworker.js'); + // worker.postMessage(['loadtask', 'computetask']); + + // worker.addEventListener('message', (e) => { + // const { msg } = e.data; + // $("#worker").html(msg); + // }); + // } else { + // ssLoad(); + // } }; +worker.addEventListener('message', async (e) => { + const { msg } = e.data; + if (msg === "modelloaded") { + $("#modelloadstatus").html('Model Loaded'); + $("#tbb").prop('disabled', false); + $("#tbr").prop('disabled', false); + $("#tbb").removeClass('disabled'); + $("#tbr").removeClass('disabled'); + } else { + // Start receiving computed outputBuffer + outputBuffer = e.data; + computeTime = (performance.now() - computeStart).toFixed(2); + await drawOutput(outputBuffer, inputvideo); + console.log(` done in ${computeTime} ms.`); + + if (continueAnimating) { + renderCamStream(); + spaninference.html(computeTime); + let ct = parseInt(computeTime); + $("#fps").html((1000 / ct).toFixed(0)); + } + } +}); + const ssConfig = async (isSS, effect) => { - if(isSS && effect) { + if (isSS && effect) { backgroundImageSource.src = '../../assets/img/ssbg/0.jpg' continueinputvideo = false console.log(isSS + ' ' + effect) backgroundType = effect; - continueAnimating = true - await ssCompute() + continueAnimating = true; + + try { + inputvideo.onloadedmediadata = renderCamStream(); + } catch (error) { + console.log(error); + } } else { // gl = outputcanvas.getContext("2d"); backgroundImageSource.src = ''; continueAnimating = false; - continueinputvideo = true - backgroundType = "none" - await videoCanvasOnFrame() + continueinputvideo = true; + backgroundType = "none"; + await videoCanvasOnFrame(); } } \ No newline at end of file diff --git a/html/js/tflite/deeplab/webnn/tflite_model_runner_cc.wasm b/html/js/tflite/deeplab/webnn/tflite_model_runner_cc.wasm new file mode 100644 index 0000000..71d21f5 Binary files /dev/null and b/html/js/tflite/deeplab/webnn/tflite_model_runner_cc.wasm differ diff --git a/html/js/tflite/deeplab/webnn/tflite_model_runner_cc_simd.wasm b/html/js/tflite/deeplab/webnn/tflite_model_runner_cc_simd.wasm new file mode 100644 index 0000000..590b3d1 Binary files /dev/null and b/html/js/tflite/deeplab/webnn/tflite_model_runner_cc_simd.wasm differ diff --git a/html/js/tflite/deeplab/webnn/tflite_model_runner_cc_threaded_simd.wasm b/html/js/tflite/deeplab/webnn/tflite_model_runner_cc_threaded_simd.wasm new file mode 100644 index 0000000..b2755d7 Binary files /dev/null and b/html/js/tflite/deeplab/webnn/tflite_model_runner_cc_threaded_simd.wasm differ diff --git a/html/js/tflite/deeplab/webnn/webnnworker.js b/html/js/tflite/deeplab/webnn/webnnworker.js index f7fe203..48c236c 100644 --- a/html/js/tflite/deeplab/webnn/webnnworker.js +++ b/html/js/tflite/deeplab/webnn/webnnworker.js @@ -1,27 +1,111 @@ -let netInstance; -let inputOptions; + +importScripts('../tflite_model_runner_cc_simd.js'); +importScripts('../../../webnn-polyfill.js'); + let modelRunner; -let inputBuffer; -let outputBuffer; - -let loadtask = async () => { - importScripts("../../utils.js"); - importScripts("./deeplabv3_mnv2_tflite.js"); - netInstance = new DeepLabV3MNV2TFLite(); - inputOptions = netInstance.inputOptions; - self.postMessage({msg: "loading model"}); - modelRunner = await netInstance.load(); - self.postMessage({msg: "model loaded"}); + +function sizeOfShape(shape) { + return shape.reduce((a, b) => { + return a * b; + }); +} + +let warmup = async () => { + const inputDimensions = [1, 321, 321, 3]; + const inputBuffer = new Float32Array(sizeOfShape(inputDimensions)); + modelRunner = await load(); + compute(modelRunner, inputBuffer); +} + +let nncompute = (inputBuffer) => { + let outputBuffer = compute(modelRunner, inputBuffer); + outputBuffer = new Float32Array(outputBuffer); + postMessage(outputBuffer, [outputBuffer.buffer]); +} + +addEventListener('message', async (e) => { + const task = e.data.task; + const value = e.data.value; + if(task === "nnwarmup") { + await warmup(); + postMessage({msg: "modelloaded"}); + } + if(task === "nncompute") { + nncompute(value); + } +}); + +async function load() { + // Create the model runner with the model. + + const MODEL_PATH = '../../../../assets/models/deeplab/deeplab_mobilenetv2_321_no_argmax.tflite'; + + // Load WASM module and model. + const [module, modelArrayBuffer] = await Promise.all([ + tflite_model_runner_ModuleFactory(), + (await fetch(MODEL_PATH)).arrayBuffer(), + ]); + const modelBytes = new Uint8Array(modelArrayBuffer); + const offset = module._malloc(modelBytes.length); + module.HEAPU8.set(modelBytes, offset); + // Create model runner. + const modelRunnerResult = + module.TFLiteWebModelRunner.CreateFromBufferAndOptions( + offset, modelBytes.length, { + numThreads: Math.min( + 4, Math.max(1, (navigator.hardwareConcurrency || 1) / 2)), + enableWebNNDelegate: true, + webNNDevicePreference: 1 // 0 - default, 1 - gpu, 2 - cpu + }); + if (!modelRunnerResult.ok()) { + throw new Error( + 'Failed to create TFLiteWebModelRunner: ' + modelRunnerResult.errorMessage()); + } + const modelRunner = modelRunnerResult.value(); + return modelRunner; +} + +function compute(modelRunner, inputData) { + // Get input and output info. + const inputs = this.callAndDelete( + modelRunner.GetInputs(), results => this.convertCppVectorToArray(results)); + const input = inputs[0]; + const outputs = this.callAndDelete( + modelRunner.GetOutputs(), results => this.convertCppVectorToArray(results)); + const output = outputs[0]; + + // Set input tensor data from the image + const inputBuffer = input.data(); + // const inputData = new Float32Array(inputBuffer.length); + inputBuffer.set(inputData); + + const success = modelRunner.Infer(); + if (!success) return; + return output.data(); } -let computetask = async () => { - inputBuffer = getInputTensor(null, inputOptions); - outputBuffer = netInstance.compute(modelRunner, inputBuffer); - self.postMessage({msg: "prediction completed"}); +/** + * Calls the given function with the given deletable argument, ensuring that + * the argument gets deleted afterwards (even if the function throws an error). +*/ +function callAndDelete(arg, func) { + try { + return func(arg); + } finally { + if (arg != null) arg.delete(); + } } -loadtask(); -computetask(); +/** Converts the given c++ vector to a JS array. */ +function convertCppVectorToArray(vector) { + if (vector == null) return []; + const result = []; + for (let i = 0; i < vector.size(); i++) { + const item = vector.get(i); + result.push(item); + } + return result; +} \ No newline at end of file diff --git a/html/js/tflite/utils.js b/html/js/tflite/utils.js index 653be34..6d34d84 100644 --- a/html/js/tflite/utils.js +++ b/html/js/tflite/utils.js @@ -82,6 +82,7 @@ function getInputTensor(inputElement, inputOptions) { inputElement.width = inputElement.videoWidth || inputElement.naturalWidth; + inputElement.height = inputElement.videoHeight || inputElement.naturalHeight; @@ -135,6 +136,61 @@ function getInputTensor(inputElement, inputOptions) { return tensor; } +function getInputTensorWorker(inputElement, inputOptions) { + const inputDimensions = inputOptions.inputDimensions; + const tensor = new Float32Array( + inputDimensions.slice(1).reduce((a, b) => a * b)); + let [channels, height, width] = inputDimensions.slice(1); + const mean = inputOptions.mean || [0, 0, 0, 0]; + const std = inputOptions.std || [1, 1, 1, 1]; + const normlizationFlag = inputOptions.norm || false; + const scaledFlag = inputOptions.scaledFlag || false; + const inputLayout = inputOptions.inputLayout; + const imageChannels = 4; // RGBA + + if (inputLayout === 'nhwc') { + [height, width, channels] = inputDimensions.slice(1); + } + const canvasElement = document.createElement('canvas'); + canvasElement.width = width; + canvasElement.height = height; + const canvasContext = canvasElement.getContext('2d'); + + if (scaledFlag) { + const resizeRatio = Math.max( + Math.max(1280 / width, 720 / height), 1); + const scaledWidth = Math.floor(1280 / resizeRatio); + const scaledHeight = Math.floor(720 / resizeRatio); + canvasContext.drawImage(inputElement, 0, 0, scaledWidth, scaledHeight); + } else { + canvasContext.drawImage(inputElement, 0, 0, width, height); + } + + let pixels = canvasContext.getImageData(0, 0, width, height).data; + + if (normlizationFlag) { + pixels = new Float32Array(pixels).map((p) => p / 255); + } + + for (let c = 0; c < channels; ++c) { + for (let h = 0; h < height; ++h) { + for (let w = 0; w < width; ++w) { + const value = + pixels[h * width * imageChannels + w * imageChannels + c]; + if (inputLayout === 'nchw') { + tensor[c * width * height + h * width + w] = + (value - mean[c]) / std[c]; + } else { + tensor[h * width * channels + w * channels + c] = + (value - mean[c]) / std[c]; + } + } + } + } + return tensor; +} + + // Get median value from an array of Number function getMedianValue(array) { array = array.sort((a, b) => a - b); diff --git a/html/js/webnn-polyfill.js b/html/js/webnn-polyfill.js new file mode 100644 index 0000000..bcb0bd6 --- /dev/null +++ b/html/js/webnn-polyfill.js @@ -0,0 +1,18182 @@ +!function(e){var t={};function n(s){if(t[s])return t[s].exports;var o=t[s]={i:s,l:!1,exports:{}};return e[s].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=e,n.c=t,n.d=function(e,t,s){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:s})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var s=Object.create(null);if(n.r(s),Object.defineProperty(s,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(s,o,function(t){return e[t]}.bind(null,o));return s},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=0)}({"./.yalc/@tensorflow/tfjs-backend-webgl/dist/addn_gpu.js": +/*!***************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/addn_gpu.js ***! + \***************************************************************/ +/*! exports provided: AddNProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"AddNProgram",(function(){return s})); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class s{constructor(e,t){this.outputShape=[],this.outputShape=e,this.variableNames=t.map(((e,t)=>`T${t}`));const n=[];this.variableNames.forEach((e=>{n.push(`float v${e} = get${e}AtOutCoords();`)}));const s=this.variableNames.map((e=>`v${e}`)).join(" + ");this.userCode=`\n void main() {\n ${n.join("\n ")}\n\n float result = ${s};\n setOutput(result);\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/addn_packed_gpu.js": +/*!**********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/addn_packed_gpu.js ***! + \**********************************************************************/ +/*! exports provided: AddNPackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"AddNPackedProgram",(function(){return s})); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class s{constructor(e,t){this.outputShape=[],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=e,this.variableNames=t.map(((e,t)=>`T${t}`));const n=[];this.variableNames.forEach((e=>{n.push(`vec4 v${e} = get${e}AtOutCoords();`)}));const s=this.variableNames.map((e=>`v${e}`)).join(" + ");this.userCode=`\n void main() {\n ${n.join("\n ")}\n\n vec4 result = ${s};\n setOutput(result);\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/argminmax_gpu.js": +/*!********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/argminmax_gpu.js ***! + \********************************************************************/ +/*! exports provided: ArgMinMaxProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"ArgMinMaxProgram",(function(){return s})); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class s{constructor(e,t,n){this.variableNames=["A"];const{windowSize:s,batchSize:o,outSize:r}=e;n||this.variableNames.push("bestIndicesA"),this.outputShape=[o,r];const i="max"===t?">":"<",a=n?"inOffset + i;":"round(getBestIndicesA(batch, inOffset + i));";this.userCode=`\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int outIdx = coords[1];\n int inOffset = outIdx * ${s};\n\n int bestIndex = inOffset;\n float bestValue = getA(batch, bestIndex);\n\n for (int i = 0; i < ${s}; i++) {\n int inIdx = ${a};\n float candidate = getA(batch, inIdx);\n if (candidate ${i} bestValue) {\n bestValue = candidate;\n bestIndex = inIdx;\n }\n }\n setOutput(float(bestIndex));\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/argminmax_packed_gpu.js": +/*!***************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/argminmax_packed_gpu.js ***! + \***************************************************************************/ +/*! exports provided: ArgMinMaxPackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"ArgMinMaxPackedProgram",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./packing_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/packing_util.js"),r=n(/*! ./shader_compiler */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class i{constructor(e,t,n,i){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,s.util.assert(e.length>2,(()=>`Packed arg${n.charAt(0).toUpperCase()+n.slice(1)} supports only inputs with rank above 2.`));const a=e[e.length-1],u=Math.ceil(a/t);this.outputShape=e.slice(0,-1),u>1&&this.outputShape.push(u),i||this.variableNames.push("bestIndicesA");const d=this.outputShape,l=d.length,c=Object(r.getCoordsDataType)(l),f=Object(o.getChannels)("coords",l);let p,m;if(1===u){m=l+1;const e=Object(r.getCoordsDataType)(m);p=`\n ${e} sourceLocR = ${e}(${f.join()}, 0);\n ++${f[l-1]};\n ${e} sourceLocG = ${e}(${f.join()}, 0);\n ++${f[l-2]};\n ${e} sourceLocA = ${e}(${f.join()}, 0);\n --${f[l-1]};\n ${e} sourceLocB = ${e}(${f.join()}, 0);\n --${f[l-2]};`}else m=l,p=`\n ${c} sourceLocR = coords;\n ++${f[l-1]};\n ${c} sourceLocG = coords;\n ++${f[l-2]};\n ${c} sourceLocA = coords;\n --${f[l-1]};\n ${c} sourceLocB = coords;\n --${f[l-2]};`;const h=["x","y","z","w","u","v"].slice(0,m),b="."+h[m-1],j=h.map((e=>"int "+e)),g=Object(o.getChannels)("sourceLocR",m-1).concat("inIdx.r"),w=Object(o.getChannels)("sourceLocG",m-1).concat("inIdx.g"),_=Object(o.getChannels)("sourceLocB",m-1).concat("inIdx.b"),k=Object(o.getChannels)("sourceLocA",m-1).concat("inIdx.a"),v="max"===n?"greaterThan":"lessThan",x=i?"":`\n inIdx = round(vec4(getBestIndicesAChannel(${g.join()}),\n getBestIndicesAChannel(${w.join()}),\n getBestIndicesAChannel(${_.join()}),\n getBestIndicesAChannel(${k.join()})));`,y=`vec4(\n getAChannel(${g.join()}),\n hasNextCol ? getAChannel(${w.join()}) : 0.,\n hasNextRow ? getAChannel(${_.join()}) : 0.,\n hasNextRow && hasNextCol ? getAChannel(${k.join()}) : 0.)`,O=i?"":`\n float getBestIndicesAChannel(${j.join()}) {\n return getChannel(getBestIndicesA(${h.join()}),\n vec2(${h.slice(-2).join()}));\n }`;this.userCode=`\n float getAChannel(${j.join()}) {\n return getChannel(getA(${h.join()}),\n vec2(${h.slice(-2).join()}));\n }\n ${O}\n void main() {\n ${c} coords = getOutputCoords();\n bool hasNextCol = ${f[l-1]} < ${d[l-1]-1};\n bool hasNextRow = ${f[l-2]} < ${d[l-2]-1};\n ${p}\n ivec4 srcIdx = ivec4(sourceLocR${b}, sourceLocG${b},\n sourceLocB${b}, sourceLocA${b}) * ${t};\n ivec4 inIdx = srcIdx;\n vec4 bestIndex = vec4(inIdx);\n vec4 bestValue = ${y};\n\n for (int i = 0; i < ${t}; i++) {\n inIdx = srcIdx;\n ${x}\n vec4 candidate = ${y};\n bvec4 nan = isnan(candidate);\n bvec4 replace = bvec4(\n vec4(${v}(candidate, bestValue)) * (vec4(1.0) - vec4(nan)));\n\n bestValue = vec4(replace.x ? candidate.x : bestValue.x,\n replace.y ? candidate.y : bestValue.y,\n replace.z ? candidate.z : bestValue.z,\n replace.w ? candidate.w : bestValue.w);\n bestIndex = mix(bestIndex, vec4(inIdx), vec4(replace));\n srcIdx++;\n }\n setOutput(bestIndex);\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/avg_pool_backprop_gpu.js": +/*!****************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/avg_pool_backprop_gpu.js ***! + \****************************************************************************/ +/*! exports provided: AvgPool2DBackpropProgram, AvgPool3DBackpropProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"AvgPool2DBackpropProgram",(function(){return s})),n.d(t,"AvgPool3DBackpropProgram",(function(){return o})); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class s{constructor(e){this.variableNames=["dy"],this.outputShape=e.inShape;const t=e.filterHeight,n=e.filterWidth,s=e.strideHeight,o=e.strideWidth,r=e.dilationHeight,i=e.dilationWidth,a=e.effectiveFilterHeight,u=e.effectiveFilterWidth,d=a-1-e.padInfo.top,l=u-1-e.padInfo.left,c=1/(t*n);this.userCode=`\n const ivec2 pads = ivec2(${d}, ${l});\n const float avgMultiplier = float(${c});\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n\n ivec2 dyRCCorner = coords.yz - pads;\n int dyRCorner = dyRCCorner.x;\n int dyCCorner = dyRCCorner.y;\n\n // Convolve dy(?, ?, d) with pos mask(:, :, d) to get dx(xR, xC, d).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n for (int wR = 0; wR < ${a};\n wR += ${r}) {\n float dyR = float(dyRCorner + wR) / ${s}.0;\n\n if (dyR < 0.0 || dyR >= ${e.outHeight}.0 || fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n for (int wC = 0; wC < ${u};\n wC+= ${i}) {\n float dyC = float(dyCCorner + wC) / ${o}.0;\n\n if (dyC < 0.0 || dyC >= ${e.outWidth}.0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n float dyValue = getDy(b, idyR, idyC, d);\n\n dotProd += dyValue * avgMultiplier;\n }\n }\n setOutput(dotProd);\n }\n `}}class o{constructor(e){this.variableNames=["dy"],this.outputShape=e.inShape;const t=e.filterDepth,n=e.filterHeight,s=e.filterWidth,o=e.strideDepth,r=e.strideHeight,i=e.strideWidth,a=e.dilationDepth,u=e.dilationHeight,d=e.dilationWidth,l=e.effectiveFilterDepth,c=e.effectiveFilterHeight,f=e.effectiveFilterWidth,p=l-1-e.padInfo.front,m=c-1-e.padInfo.top,h=f-1-e.padInfo.left,b=1/(t*n*s);this.userCode=`\n const ivec3 pads = ivec3(${p}, ${m}, ${h});\n const float avgMultiplier = float(${b});\n\n void main() {\n ivec5 coords = getOutputCoords();\n int batch = coords.x;\n int ch = coords.u;\n\n ivec3 dyCorner = ivec3(coords.y, coords.z, coords.w) - pads;\n int dyDCorner = dyCorner.x;\n int dyRCorner = dyCorner.y;\n int dyCCorner = dyCorner.z;\n\n // Convolve dy(?, ?, ?, d) with pos mask(:, :, :, ch) to get\n // dx(xD, xR, xC, ch).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n\n for (int wD = 0; wD < ${l};\n wD += ${a}) {\n float dyD = float(dyDCorner + wD) / ${o}.0;\n\n if (dyD < 0.0 || dyD >= ${e.outDepth}.0 || fract(dyD) > 0.0) {\n continue;\n }\n int idyD = int(dyD);\n\n for (int wR = 0; wR < ${c};\n wR += ${u}) {\n float dyR = float(dyRCorner + wR) / ${r}.0;\n\n if (dyR < 0.0 || dyR >= ${e.outHeight}.0 ||\n fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n for (int wC = 0; wC < ${f};\n wC += ${d}) {\n float dyC = float(dyCCorner + wC) / ${i}.0;\n\n if (dyC < 0.0 || dyC >= ${e.outWidth}.0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n float dyValue = getDy(batch, idyD, idyR, idyC, ch);\n\n dotProd += dyValue * avgMultiplier;\n }\n }\n }\n setOutput(dotProd);\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/backend_webgl.js": +/*!********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/backend_webgl.js ***! + \********************************************************************/ +/*! exports provided: EPSILON_FLOAT32, EPSILON_FLOAT16, getBinaryCache, MathBackendWebGL */function(e,t,n){"use strict";n.r(t),n.d(t,"EPSILON_FLOAT32",(function(){return x})),n.d(t,"EPSILON_FLOAT16",(function(){return y})),n.d(t,"getBinaryCache",(function(){return I})),n.d(t,"MathBackendWebGL",(function(){return S}));n(/*! ./flags_webgl */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/flags_webgl.js");var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./canvas_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/canvas_util.js"),r=n(/*! ./decode_matrix_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/decode_matrix_gpu.js"),i=n(/*! ./decode_matrix_packed_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/decode_matrix_packed_gpu.js"),a=n(/*! ./encode_float_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/encode_float_gpu.js"),u=n(/*! ./encode_float_packed_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/encode_float_packed_gpu.js"),d=n(/*! ./encode_matrix_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/encode_matrix_gpu.js"),l=n(/*! ./encode_matrix_packed_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/encode_matrix_packed_gpu.js"),c=n(/*! ./gpgpu_context */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/gpgpu_context.js"),f=n(/*! ./gpgpu_math */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/gpgpu_math.js"),p=n(/*! ./kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"),m=n(/*! ./pack_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/pack_gpu.js"),h=n(/*! ./reshape_packed_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/reshape_packed_gpu.js"),b=n(/*! ./tex_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/tex_util.js"),j=n(/*! ./texture_manager */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/texture_manager.js"),g=n(/*! ./unaryop_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/unaryop_gpu.js"),w=n(/*! ./unaryop_packed_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/unaryop_packed_gpu.js"),_=n(/*! ./unpack_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/unpack_gpu.js"),k=n(/*! ./webgl_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/webgl_util.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const v=s.kernel_impls.whereImpl,x=1e-7,y=1e-4,O={};function I(e){return e in O||(O[e]={}),O[e]}const C=Object(s.env)().getNumber("CPU_HANDOFF_SIZE_THRESHOLD");class S extends s.KernelBackend{constructor(e){if(super(),this.pendingRead=new WeakMap,this.pendingDisposal=new WeakSet,this.dataRefCount=new WeakMap,this.numBytesInGPU=0,this.uploadWaitMs=0,this.downloadWaitMs=0,this.lastGlFlushTime=0,this.warnedAboutMemory=!1,this.pendingDeletes=0,this.disposed=!1,!Object(s.env)().getBool("HAS_WEBGL"))throw new Error("WebGL is not supported on this device");if(null==e){const e=Object(o.getWebGLContext)(Object(s.env)().getNumber("WEBGL_VERSION"));this.binaryCache=I(Object(s.env)().getNumber("WEBGL_VERSION")),this.gpgpu=new c.GPGPUContext(e),this.canvas=e.canvas,this.gpgpuCreatedLocally=!0}else this.gpgpu=e,this.binaryCache={},this.gpgpuCreatedLocally=!1,this.canvas=e.gl.canvas;this.textureManager=new j.TextureManager(this.gpgpu),this.numMBBeforeWarning=null==Object(s.env)().global.screen?1024:Object(s.env)().global.screen.height*Object(s.env)().global.screen.width*window.devicePixelRatio*600/1024/1024,this.texData=new s.DataStorage(this,Object(s.engine)())}nextDataId(){return S.nextDataId++}numDataIds(){return this.texData.numDataIds()-this.pendingDeletes}write(e,t,n){if((Object(s.env)().getBool("WEBGL_CHECK_NUMERICAL_PROBLEMS")||Object(s.env)().getBool("DEBUG"))&&this.checkNumericalProblems(e),"complex64"===n&&null!=e)throw new Error("Cannot write to a complex64 dtype. Please use tf.complex(real, imag).");const o={id:this.nextDataId()};return this.texData.set(o,{shape:t,dtype:n,values:e,usage:b.TextureUsage.UPLOAD,refCount:1}),o}refCount(e){if(this.texData.has(e)){return this.texData.get(e).refCount}return 0}incRef(e){this.texData.get(e).refCount++}decRef(e){if(this.texData.has(e)){this.texData.get(e).refCount--}}move(e,t,n,o,r){if(Object(s.env)().getBool("DEBUG")&&this.checkNumericalProblems(t),"complex64"===o)throw new Error("Cannot write to a complex64 dtype. Please use tf.complex(real, imag).");this.texData.set(e,{shape:n,dtype:o,values:t,usage:b.TextureUsage.UPLOAD,refCount:r})}disposeIntermediateTensorInfo(e){this.disposeData(e.dataId)}readSync(e){const t=this.texData.get(e),{values:n,dtype:o,complexTensorInfos:r,slice:i,shape:a,isPacked:u}=t;if(null!=i){let t;t=u?new w.UnaryOpPackedProgram(a,g.CLONE):new g.UnaryOpProgram(a,g.CLONE);const n=this.runWebGLProgram(t,[{dataId:e,shape:a,dtype:o}],o),s=this.readSync(n.dataId);return this.disposeIntermediateTensorInfo(n),s}if(null!=n)return this.convertAndCacheOnCPU(e);if("string"===o)return n;const d=null!=this.activeTimers;let l,c;if(d&&(l=s.util.now()),"complex64"===o){const e=this.readSync(r.real.dataId),t=this.readSync(r.imag.dataId);c=s.backend_util.mergeRealAndImagArrays(e,t)}else c=this.getValuesFromTexture(e);return d&&(this.downloadWaitMs+=s.util.now()-l),this.convertAndCacheOnCPU(e,c)}async read(e){if(this.pendingRead.has(e)){const t=this.pendingRead.get(e);return new Promise((e=>t.push(e)))}const t=this.texData.get(e),{values:n,shape:o,slice:r,dtype:i,complexTensorInfos:a,isPacked:u}=t;if(null!=r){let t;t=u?new w.UnaryOpPackedProgram(o,g.CLONE):new g.UnaryOpProgram(o,g.CLONE);const n=this.runWebGLProgram(t,[{dataId:e,shape:o,dtype:i}],i),s=this.read(n.dataId);return this.disposeIntermediateTensorInfo(n),s}if(null!=n)return this.convertAndCacheOnCPU(e);if(!Object(s.env)().getBool("WEBGL_DOWNLOAD_FLOAT_ENABLED")&&2===Object(s.env)().getNumber("WEBGL_VERSION"))throw new Error("tensor.data() with WEBGL_DOWNLOAD_FLOAT_ENABLED=false and WEBGL_VERSION=2 not yet supported.");let d,l,c=null;if("complex64"!==i&&Object(s.env)().get("WEBGL_BUFFER_SUPPORTED")){d=this.decode(e);const t=this.texData.get(d.dataId);c=this.gpgpu.createBufferFromTexture(t.texture,...b.getDenseTexShape(o))}if(this.pendingRead.set(e,[]),"complex64"!==i&&await this.gpgpu.createAndWaitForFence(),"complex64"===i){const e=await Promise.all([this.read(a.real.dataId),this.read(a.imag.dataId)]),t=e[0],n=e[1];l=s.backend_util.mergeRealAndImagArrays(t,n)}else if(null==c)l=this.getValuesFromTexture(e);else{const e=s.util.sizeFromShape(o);l=this.gpgpu.downloadFloat32MatrixFromBuffer(c,e)}if(null!=d&&this.disposeIntermediateTensorInfo(d),null!=c){const e=this.gpgpu.gl;k.callAndCheck(e,(()=>e.deleteBuffer(c)))}const f=this.convertAndCacheOnCPU(e,l),p=this.pendingRead.get(e);return this.pendingRead.delete(e),p.forEach((e=>e(f))),this.pendingDisposal.has(e)&&(this.pendingDisposal.delete(e),this.disposeData(e)&&Object(s.engine)().removeDataId(e,this),this.pendingDeletes--),f}bufferSync(e){const t=this.readSync(e.dataId);let n=t;if("string"===e.dtype)try{n=t.map((e=>s.util.decodeString(e)))}catch(e){throw new Error("Failed to decode encoded string bytes into utf-8")}return Object(s.buffer)(e.shape,e.dtype,n)}checkNumericalProblems(e){if(null!=e)for(let t=0;t0}async time(e){const t=this.activeTimers,n=[];let o=!1;null==this.programTimersStack?(this.programTimersStack=n,o=!0):this.activeTimers.push(n),this.activeTimers=n,e();const r=s.util.flatten(this.activeTimers.map((e=>e.query))).filter((e=>null!=e)),i=s.util.flatten(this.activeTimers.map((e=>e.name))).filter((e=>null!=e));this.activeTimers=t,o&&(this.programTimersStack=null);const a={uploadWaitMs:this.uploadWaitMs,downloadWaitMs:this.downloadWaitMs,kernelMs:null,wallMs:null};if(Object(s.env)().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE")>0){const e=await Promise.all(r);a.kernelMs=s.util.sum(e),a.getExtraProfileInfo=()=>e.map(((e,t)=>({name:i[t],ms:e}))).map((e=>`${e.name}: ${e.ms}`)).join(", ")}else a.kernelMs={error:"WebGL query timers are not supported in this environment."};return this.uploadWaitMs=0,this.downloadWaitMs=0,a}memory(){return{unreliable:!1,numBytesInGPU:this.numBytesInGPU,numBytesInGPUAllocated:this.textureManager.numBytesAllocated,numBytesInGPUFree:this.textureManager.numBytesFree}}startTimer(){return Object(s.env)().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE")>0?this.gpgpu.beginQuery():{startMs:s.util.now(),endMs:null}}endTimer(e){return Object(s.env)().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE")>0?(this.gpgpu.endQuery(),e):(e.endMs=s.util.now(),e)}async getQueryTime(e){if(Object(s.env)().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE")>0)return this.gpgpu.waitForQueryAndGetTime(e);const t=e;return t.endMs-t.startMs}disposeData(e,t=!1){if(this.pendingDisposal.has(e))return!1;if(!this.texData.has(e))return!0;if(t?this.texData.get(e).refCount=0:this.texData.get(e).refCount--,!t&&this.texData.get(e).refCount>0)return!1;if(this.pendingRead.has(e))return this.pendingDisposal.add(e),this.pendingDeletes++,!1;this.releaseGPUData(e);const{complexTensorInfos:n}=this.texData.get(e);return null!=n&&(this.disposeData(n.real.dataId,t),this.disposeData(n.imag.dataId,t)),this.texData.delete(e),!0}releaseGPUData(e){const{texture:t,dtype:n,texShape:s,usage:o,isPacked:r,slice:i}=this.texData.get(e),a=i&&i.origDataId||e,u=this.dataRefCount.get(a);u>1?this.dataRefCount.set(a,u-1):(this.dataRefCount.delete(a),null!=t&&(this.numBytesInGPU-=this.computeBytes(s,n),this.textureManager.releaseTexture(t,s,o,r)));const d=this.texData.get(e);d.texture=null,d.texShape=null,d.isPacked=!1,d.slice=null}getTexture(e){return this.uploadToGPU(e),this.texData.get(e).texture}getDataInfo(e){return this.texData.get(e)}shouldExecuteOnCPU(e,t=C){return Object(s.env)().getBool("WEBGL_CPU_FORWARD")&&e.every((e=>null==this.texData.get(e.dataId).texture&&s.util.sizeFromShape(e.shape)0&&s.util.isString(n[0])){const r=n.map((e=>s.util.encodeString(e)));o=this.write(r,e,t)}else o=this.write(n,e,t);return this.texData.get(o).usage=null,{dataId:o,shape:e,dtype:t}}makeOutput(e,t,n){const{dataId:o}=this.makeTensorInfo(e,t,n);return Object(s.engine)().makeTensorFromDataId(o,e,t,this)}unpackTensor(e){const t=new _.UnpackProgram(e.shape);return this.runWebGLProgram(t,[e],e.dtype)}packTensor(e){const t=new m.PackProgram(e.shape);return this.runWebGLProgram(t,[e],e.dtype,null,!0)}packedReshape(e,t){const n=[k.getBatchDim(e.shape),...k.getRowsCols(e.shape)],s={dtype:e.dtype,shape:n,dataId:e.dataId},o=[k.getBatchDim(t),...k.getRowsCols(t)],r=new h.ReshapePackedProgram(o,n),i=[n],a=this.runWebGLProgram(r,[s],e.dtype,i,!0);return{dataId:a.dataId,shape:t,dtype:a.dtype}}decode(e){const t=this.texData.get(e),{isPacked:n,shape:s,dtype:o}=t,a=k.getShapeAs3D(s);let u;const d=b.getDenseTexShape(a);u=n?new i.DecodeMatrixPackedProgram(a):new r.DecodeMatrixProgram(a);const l=[d];return{dtype:o,shape:s,dataId:this.runWebGLProgram(u,[{shape:a,dtype:o,dataId:e}],o,l,!0).dataId}}runWebGLProgram(e,t,n,o,r=!1){const i=this.makeTensorInfo(e.outputShape,n),a=this.texData.get(i.dataId);if(e.packedOutput&&(a.isPacked=!0),e.outPackingScheme===b.PackingScheme.DENSE){const t=b.getDenseTexShape(e.outputShape);a.texShape=t.map((e=>2*e))}if(null!=e.outTexUsage&&(a.usage=e.outTexUsage),0===s.util.sizeFromShape(i.shape))return a.values=s.util.getTypedArrayFromDType(i.dtype,0),i;const u=[],d=t.map((t=>{if("complex64"===t.dtype)throw new Error("GPGPUProgram does not support complex64 input. For complex64 dtypes, please separate the program into real and imaginary parts.");let n=this.texData.get(t.dataId);if(null==n.texture){if(!e.packedInputs&&s.util.sizeFromShape(t.shape)<=Object(s.env)().getNumber("WEBGL_SIZE_UPLOAD_UNIFORM"))return{shape:t.shape,texData:null,isUniform:!0,uniformValues:n.values};e.packedInputs&&(n.isPacked=!0,n.shape=t.shape)}else if(!!n.isPacked!=!!e.packedInputs)t=n.isPacked?this.unpackTensor(t):this.packTensor(t),u.push(t),n=this.texData.get(t.dataId);else if(n.isPacked&&!k.isReshapeFree(n.shape,t.shape)){const e=t,s=t.shape;t.shape=n.shape,t=this.packedReshape(t,s),u.push(t),n=this.texData.get(t.dataId),e.shape=s}return this.uploadToGPU(t.dataId),{shape:t.shape,texData:n,isUniform:!1}}));this.uploadToGPU(i.dataId);const l={shape:i.shape,texData:a,isUniform:!1},c=f.makeShaderKey(e,d,l),p=this.getAndSaveBinary(c,(()=>f.compileProgram(this.gpgpu,e,d,l))),m=null!=this.activeTimers;let h;m&&(h=this.startTimer()),f.runProgram(this.gpgpu,p,d,l,o),u.forEach((e=>this.disposeIntermediateTensorInfo(e))),m&&(h=this.endTimer(h),this.activeTimers.push({name:e.constructor.name,query:this.getQueryTime(h)}));const j=Object(s.env)().get("WEBGL_FLUSH_THRESHOLD");if(j>0){const e=s.util.now();e-this.lastGlFlushTime>j&&(this.gpgpu.gl.flush(),this.lastGlFlushTime=e)}if(!Object(s.env)().getBool("WEBGL_LAZILY_UNPACK")&&a.isPacked&&!1===r){const e=this.unpackTensor(i);return this.disposeIntermediateTensorInfo(i),e}return i}compileAndRun(e,t,n,s,o=!1){n=n||t[0].dtype;return this.runWebGLProgram(e,t,n,s,o)}getAndSaveBinary(e,t){return e in this.binaryCache||(this.binaryCache[e]=t()),this.binaryCache[e]}getTextureManager(){return this.textureManager}dispose(){if(!this.disposed){if(!Object(s.env)().getBool("IS_TEST")){Object.keys(this.binaryCache).forEach((e=>{this.gpgpu.deleteProgram(this.binaryCache[e].webGLProgram),delete this.binaryCache[e]}))}this.textureManager.dispose(),null!=this.canvas&&"undefined"!=typeof HTMLCanvasElement&&this.canvas instanceof HTMLCanvasElement?this.canvas.remove():this.canvas=null,this.gpgpuCreatedLocally&&(this.gpgpu.program=null,this.gpgpu.dispose()),this.disposed=!0}}floatPrecision(){return null==this.floatPrecisionValue&&(this.floatPrecisionValue=Object(s.tidy)((()=>{if(!Object(s.env)().get("WEBGL_RENDER_FLOAT32_ENABLED")){const e=Object(s.env)().getBool("DEBUG");Object(s.env)().set("DEBUG",!1);const t=this.abs(Object(s.scalar)(1e-8)).dataSync()[0];if(Object(s.env)().set("DEBUG",e),t>0)return 32}return 16}))),this.floatPrecisionValue}epsilon(){return 32===this.floatPrecision()?x:y}uploadToGPU(e){const t=this.texData.get(e),{shape:n,dtype:o,values:r,texture:i,usage:a,isPacked:u}=t;if(null!=i)return;const c=null!=this.activeTimers;let f;c&&(f=s.util.now());let p=t.texShape;if(null==p&&(p=k.getTextureShapeFromLogicalShape(n,u),t.texShape=p),null!=r){const e=k.getShapeAs3D(n);let i,a=p[1],m=p[0];const h=r instanceof Uint8Array;u?([a,m]=b.getPackedMatrixTextureShapeWidthHeight(p[0],p[1]),i=new l.EncodeMatrixPackedProgram(e,h)):i=new d.EncodeMatrixProgram(e,h);const j=this.makeTensorInfo([m,a],o);this.texData.get(j.dataId).usage=h?b.TextureUsage.PIXELS:b.TextureUsage.UPLOAD,this.gpgpu.uploadDenseMatrixToTexture(this.getTexture(j.dataId),a,m,r);const g=[[m,a]],w=!0,_=this.runWebGLProgram(i,[j],o,g,w),v=this.texData.get(_.dataId);t.texture=v.texture,t.texShape=v.texShape,t.isPacked=v.isPacked,t.usage=v.usage,this.disposeIntermediateTensorInfo(j),this.texData.delete(_.dataId),t.values=null,c&&(this.uploadWaitMs+=s.util.now()-f)}else{const e=this.acquireTexture(p,a,o,u);t.texture=e}}convertAndCacheOnCPU(e,t){const n=this.texData.get(e),{dtype:s}=n;return this.releaseGPUData(e),null!=t&&(n.values=function(e,t){if("float32"===t||"complex64"===t)return e;if("int32"===t||"bool"===t){const n="int32"===t?new Int32Array(e.length):new Uint8Array(e.length);for(let t=0;t1024*this.numMBBeforeWarning*1024){const e=(this.numBytesInGPU/1024/1024).toFixed(2);this.warnedAboutMemory=!0,console.warn(`High memory usage in GPU: ${e} MB, most likely due to a memory leak`)}return this.textureManager.acquireTexture(e,t,s)}computeBytes(e,t){return e[0]*e[1]*s.util.bytesPerElement(t)}}S.nextDataId=0},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/base.js": +/*!***********************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/base.js ***! + \***********************************************************/ +/*! exports provided: version_webgl, MathBackendWebGL, setWebGLContext, GPGPUContext, gpgpu_util, webgl_util, forceHalfFloat, webgl */function(e,t,n){"use strict";n.r(t),n.d(t,"webgl",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./backend_webgl */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/backend_webgl.js"),r=n(/*! ./version */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/version.js");n.d(t,"version_webgl",(function(){return r.version}));var i=n(/*! ./webgl */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/webgl.js");n.d(t,"MathBackendWebGL",(function(){return i.MathBackendWebGL})),n.d(t,"setWebGLContext",(function(){return i.setWebGLContext})),n.d(t,"GPGPUContext",(function(){return i.GPGPUContext})),n.d(t,"gpgpu_util",(function(){return i.gpgpu_util})),n.d(t,"webgl_util",(function(){return i.webgl_util})),n.d(t,"forceHalfFloat",(function(){return i.forceHalfFloat})), +/** + * @license + * Copyright 2020 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +s.device_util.isBrowser()&&Object(s.registerBackend)("webgl",(()=>new o.MathBackendWebGL),2);const a={forceHalfFloat:i.forceHalfFloat}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/batchnorm_gpu.js": +/*!********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/batchnorm_gpu.js ***! + \********************************************************************/ +/*! exports provided: BatchNormProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"BatchNormProgram",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */class o{constructor(e,t,n,o,r,i){this.outputShape=[],this.variableNames=["x","mean","variance"],s.backend_util.assertAndGetBroadcastShape(e,t),s.backend_util.assertAndGetBroadcastShape(e,n);let a="0.0";null!=o&&(s.backend_util.assertAndGetBroadcastShape(e,o),this.variableNames.push("offset"),a="getOffsetAtOutCoords()");let u="1.0";null!=r&&(s.backend_util.assertAndGetBroadcastShape(e,r),this.variableNames.push("scale"),u="getScaleAtOutCoords()"),this.outputShape=e,this.userCode=`\n void main() {\n float x = getXAtOutCoords();\n float mean = getMeanAtOutCoords();\n float variance = getVarianceAtOutCoords();\n float offset = ${a};\n float scale = ${u};\n float inv = scale * inversesqrt(variance + float(${i}));\n setOutput(dot(vec3(x, -mean, offset), vec3(inv, inv, 1)));\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/batchnorm_packed_gpu.js": +/*!***************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/batchnorm_packed_gpu.js ***! + \***************************************************************************/ +/*! exports provided: BatchNormPackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"BatchNormPackedProgram",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */class o{constructor(e,t,n,o,r,i){this.packedInputs=!0,this.packedOutput=!0,this.variableNames=["x","mean","variance"],s.backend_util.assertAndGetBroadcastShape(e,t),s.backend_util.assertAndGetBroadcastShape(e,n);let a="vec4(0.0)";null!=o&&(s.backend_util.assertAndGetBroadcastShape(e,o),this.variableNames.push("offset"),a="getOffsetAtOutCoords()");let u="vec4(1.0)";null!=r&&(s.backend_util.assertAndGetBroadcastShape(e,r),this.variableNames.push("scale"),u="getScaleAtOutCoords()"),this.outputShape=e,this.userCode=`\n void main() {\n vec4 offset = ${a};\n vec4 scale = ${u};\n\n vec4 x = getXAtOutCoords();\n vec4 mean = getMeanAtOutCoords();\n vec4 variance = getVarianceAtOutCoords();\n\n vec4 inv = scale * inversesqrt(variance + vec4(${i}));\n\n setOutput((x - mean) * inv + offset);\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/binaryop_complex_gpu.js": +/*!***************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/binaryop_complex_gpu.js ***! + \***************************************************************************/ +/*! exports provided: COMPLEX_MULTIPLY, BinaryOpComplexProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"COMPLEX_MULTIPLY",(function(){return o})),n.d(t,"BinaryOpComplexProgram",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */const o={REAL:"return areal * breal - aimag * bimag;",IMAG:"return areal * bimag + aimag * breal;"};class r{constructor(e,t,n){this.variableNames=["AReal","AImag","BReal","BImag"],this.outputShape=s.backend_util.assertAndGetBroadcastShape(t,n),this.userCode=`\n float binaryOpComplex(\n float areal, float aimag, float breal, float bimag) {\n ${e}\n }\n\n void main() {\n float areal = getARealAtOutCoords();\n float aimag = getAImagAtOutCoords();\n float breal = getBRealAtOutCoords();\n float bimag = getBImagAtOutCoords();\n setOutput(binaryOpComplex(areal, aimag, breal, bimag));\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/binaryop_gpu.js": +/*!*******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/binaryop_gpu.js ***! + \*******************************************************************/ +/*! exports provided: CHECK_NAN_SNIPPET, SQUARED_DIFFERENCE, BinaryOpProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"CHECK_NAN_SNIPPET",(function(){return r})),n.d(t,"SQUARED_DIFFERENCE",(function(){return i})),n.d(t,"BinaryOpProgram",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./gpgpu_math */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/gpgpu_math.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r="\n if (isnan(a)) return a;\n if (isnan(b)) return b;\n",i="return (a - b) * (a - b);";class a{constructor(e,t,n){this.variableNames=["A","B"],this.outputShape=s.backend_util.assertAndGetBroadcastShape(t,n),this.enableShapeUniforms=Object(o.useShapeUniforms)(this.outputShape.length),this.userCode=`\n float binaryOperation(float a, float b) {\n ${e}\n }\n\n void main() {\n float a = getAAtOutCoords();\n float b = getBAtOutCoords();\n setOutput(binaryOperation(a, b));\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/binaryop_packed_gpu.js": +/*!**************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/binaryop_packed_gpu.js ***! + \**************************************************************************/ +/*! exports provided: CHECK_NAN_SNIPPET, ELU_DER, NOT_EQUAL, BinaryOpPackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"CHECK_NAN_SNIPPET",(function(){return a})),n.d(t,"ELU_DER",(function(){return u})),n.d(t,"NOT_EQUAL",(function(){return d})),n.d(t,"BinaryOpPackedProgram",(function(){return l}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./gpgpu_math */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/gpgpu_math.js"),r=n(/*! ./packing_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/packing_util.js"),i=n(/*! ./shader_compiler */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const a="\n result.r = isNaN.r > 0. ? NAN : result.r;\n result.g = isNaN.g > 0. ? NAN : result.g;\n result.b = isNaN.b > 0. ? NAN : result.b;\n result.a = isNaN.a > 0. ? NAN : result.a;\n",u="\n vec4 bGTEZero = vec4(greaterThanEqual(b, vec4(0.)));\n return (bGTEZero * a) + ((vec4(1.0) - bGTEZero) * (a * (b + vec4(1.0))));\n",d="\n return vec4(notEqual(a, b));\n";class l{constructor(e,t,n,a=!1){this.variableNames=["A","B"],this.supportsBroadcasting=!0,this.packedInputs=!0,this.packedOutput=!0,this.outputShape=s.backend_util.assertAndGetBroadcastShape(t,n);const u=this.outputShape.length;this.enableShapeUniforms=Object(o.useShapeUniforms)(u);let d="";if(a)if(0===u||1===s.util.sizeFromShape(this.outputShape))d="\n result.y = 0.;\n result.z = 0.;\n result.w = 0.;\n ";else{if(d=`\n ${Object(i.getCoordsDataType)(u)} coords = getOutputCoords();\n `,1===u)this.enableShapeUniforms?d+="\n result.y = (coords + 1) >= outShape ? 0. : result.y;\n result.z = 0.;\n result.w = 0.;\n ":d+=`\n result.y = (coords + 1) >= ${this.outputShape[0]} ? 0. : result.y;\n result.z = 0.;\n result.w = 0.;\n `;else{const e=Object(r.getChannels)("coords",u);this.enableShapeUniforms?d+=`\n bool nextRowOutOfBounds =\n (${e[u-2]} + 1) >= outShape[${u} - 2];\n bool nextColOutOfBounds =\n (${e[u-1]} + 1) >= outShape[${u} - 1];\n result.y = nextColOutOfBounds ? 0. : result.y;\n result.z = nextRowOutOfBounds ? 0. : result.z;\n result.w = nextColOutOfBounds || nextRowOutOfBounds ? 0. : result.w;\n `:d+=`\n bool nextRowOutOfBounds =\n (${e[u-2]} + 1) >= ${this.outputShape[u-2]};\n bool nextColOutOfBounds =\n (${e[u-1]} + 1) >= ${this.outputShape[u-1]};\n result.y = nextColOutOfBounds ? 0. : result.y;\n result.z = nextRowOutOfBounds ? 0. : result.z;\n result.w = nextColOutOfBounds || nextRowOutOfBounds ? 0. : result.w;\n `}}this.userCode=`\n vec4 binaryOperation(vec4 a, vec4 b) {\n ${e}\n }\n\n void main() {\n vec4 a = getAAtOutCoords();\n vec4 b = getBAtOutCoords();\n\n vec4 result = binaryOperation(a, b);\n ${d}\n\n setOutput(result);\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/canvas_util.js": +/*!******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/canvas_util.js ***! + \******************************************************************/ +/*! exports provided: clearWebGLContext, setWebGLContext, getWebGLContext */function(e,t,n){"use strict";n.r(t),n.d(t,"clearWebGLContext",(function(){return r})),n.d(t,"setWebGLContext",(function(){return i})),n.d(t,"getWebGLContext",(function(){return a})); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const s={},o={alpha:!1,antialias:!1,premultipliedAlpha:!1,preserveDrawingBuffer:!1,depth:!1,stencil:!1,failIfMajorPerformanceCaveat:!0};function r(e){delete s[e]}function i(e,t){s[e]=t}function a(e){if(!(e in s)){const t=function(e){if(1!==e&&2!==e)throw new Error("Cannot get WebGL rendering context, WebGL is disabled.");const t=function(e){if("undefined"!=typeof OffscreenCanvas&&2===e)return new OffscreenCanvas(300,150);if("undefined"!=typeof document)return document.createElement("canvas");throw new Error("Cannot create a canvas in this context")}(e);if(t.addEventListener("webglcontextlost",(t=>{t.preventDefault(),delete s[e]}),!1),1===e)return t.getContext("webgl",o)||t.getContext("experimental-webgl",o);return t.getContext("webgl2",o)}(e);if(null===t)return console.log("Could not get context for WebGL version",e),null;s[e]=t}const t=s[e];return t.isContextLost()?(delete s[e],a(e)):(t.disable(t.DEPTH_TEST),t.disable(t.STENCIL_TEST),t.disable(t.BLEND),t.disable(t.DITHER),t.disable(t.POLYGON_OFFSET_FILL),t.disable(t.SAMPLE_COVERAGE),t.enable(t.SCISSOR_TEST),t.enable(t.CULL_FACE),t.cullFace(t.BACK),s[e])}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/clip_gpu.js": +/*!***************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/clip_gpu.js ***! + \***************************************************************/ +/*! exports provided: ClipProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"ClipProgram",(function(){return s})); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class s{constructor(e){this.variableNames=["A"],this.customUniforms=[{name:"minVal",type:"float"},{name:"maxVal",type:"float"}],this.outputShape=e,this.userCode="\n\n void main() {\n float value = getAAtOutCoords();\n if (isnan(value)) {\n setOutput(value);\n return;\n }\n\n setOutput(clamp(value, minVal, maxVal));\n }\n "}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/clip_packed_gpu.js": +/*!**********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/clip_packed_gpu.js ***! + \**********************************************************************/ +/*! exports provided: ClipPackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"ClipPackedProgram",(function(){return s})); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class s{constructor(e){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,this.customUniforms=[{name:"minVal",type:"float"},{name:"maxVal",type:"float"}],this.outputShape=e,this.userCode="\n void main() {\n vec4 value = getAAtOutCoords();\n\n if (any(isnan(value))) {\n setOutput(value);\n return;\n }\n\n setOutput(clamp(value, vec4(minVal), vec4(maxVal)));\n }\n "}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/complex_abs_gpu.js": +/*!**********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/complex_abs_gpu.js ***! + \**********************************************************************/ +/*! exports provided: ComplexAbsProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"ComplexAbsProgram",(function(){return s})); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class s{constructor(e){this.variableNames=["real","imag"],this.outputShape=e,this.userCode="\n void main() {\n float re = abs(getRealAtOutCoords());\n float im = abs(getImagAtOutCoords());\n float mx = max(re, im);\n\n // sadly the length function in glsl is not underflow-safe\n // (at least not on Intel GPUs). So the safe solution is\n // to ensure underflow-safety in all cases.\n setOutput(\n mx == 0.0 ? 0.0 : mx * length(vec2(1, min(re, im)/mx))\n );\n }\n "}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/concat_gpu.js": +/*!*****************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/concat_gpu.js ***! + \*****************************************************************/ +/*! exports provided: ConcatProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"ConcatProgram",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */class o{constructor(e){this.outputShape=[],this.outputShape=s.backend_util.computeOutShape(e,1),this.variableNames=e.map(((e,t)=>`T${t}`));const t=new Array(e.length-1);t[0]=e[0][1];for(let n=1;n`T${t}`));const c=new Array(e.length-1);c[0]=e[0][t];for(let n=1;n= ${c[e-1]}) {\n return getChannel(\n getT${e}(${a(l,f,t)}),\n vec2(${a(p,f,t)}));\n }`}const b=c.length,j=c[c.length-1];h+=`\n return getChannel(\n getT${b}(${a(l,f,j)}),\n vec2(${a(p,f,j)}));`,this.userCode=`\n float getValue(${l.map((e=>"int "+e))}) {\n ${h}\n }\n\n void main() {\n ${u} coords = getOutputCoords();\n vec4 result = vec4(getValue(${d}), 0., 0., 0.);\n\n ${d[i-1]} = ${d[i-1]} + 1;\n if (${d[i-1]} < ${n[i-1]}) {\n result.g = getValue(${d});\n }\n\n ${d[i-2]} = ${d[i-2]} + 1;\n if (${d[i-2]} < ${n[i-2]}) {\n result.a = getValue(${d});\n }\n\n ${d[i-1]} = ${d[i-1]} - 1;\n if (${d[i-2]} < ${n[i-2]} &&\n ${d[i-1]} < ${n[i-1]}) {\n result.b = getValue(${d});\n }\n setOutput(result);\n }\n `}}function a(e,t,n){const s=e.indexOf(t);return e.map(((e,t)=>t===s?`${e} - ${n}`:e)).join()}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/conv_backprop_gpu.js": +/*!************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/conv_backprop_gpu.js ***! + \************************************************************************/ +/*! exports provided: Conv2DDerFilterProgram, Conv2DDerInputProgram, Conv3DDerFilterProgram, Conv3DDerInputProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"Conv2DDerFilterProgram",(function(){return s})),n.d(t,"Conv2DDerInputProgram",(function(){return o})),n.d(t,"Conv3DDerFilterProgram",(function(){return r})),n.d(t,"Conv3DDerInputProgram",(function(){return i})); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class s{constructor(e){this.variableNames=["x","dy"],this.outputShape=e.filterShape;const t=e.strideHeight,n=e.strideWidth,s=e.padInfo.top,o=e.padInfo.left,r="channelsLast"===e.dataFormat;this.userCode=`\n void main() {\n ivec4 coords = getOutputCoords();\n int wR = coords.x;\n int wC = coords.y;\n int d1 = coords.z;\n int d2 = coords.w;\n\n // Convolve x(?, ?, d1) with dy(:, :, d2) to get dw(wR, wC, d1, d2).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n\n for (int b = 0; b < ${e.batchSize}; b++) {\n for (int yR = 0; yR < ${e.outHeight}; yR++) {\n int xR = wR + yR * ${t} - ${s};\n\n if (xR < 0 || xR >= ${e.inHeight}) {\n continue;\n }\n\n for (int yC = 0; yC < ${e.outWidth}; yC++) {\n int xC = wC + yC * ${n} - ${o};\n\n if (xC < 0 || xC >= ${e.inWidth}) {\n continue;\n }\n\n if (${r}) {\n float dyValue = getDy(b, yR, yC, d2);\n float xValue = getX(b, xR, xC, d1);\n dotProd += (xValue * dyValue);\n } else {\n float dyValue = getDy(b, d2, yR, yC);\n float xValue = getX(b, d1, xR, xC);\n dotProd += (xValue * dyValue);\n }\n\n }\n }\n }\n setOutput(dotProd);\n }\n `}}class o{constructor(e){this.variableNames=["dy","W"],this.outputShape=e.inShape;const t=e.filterHeight,n=e.filterWidth,s=e.strideHeight,o=e.strideWidth,r="channelsLast"===e.dataFormat,i=t-1-e.padInfo.top,a=n-1-e.padInfo.left,u=r?1:2,d=r?2:3,l=r?3:1;this.userCode=`\n const ivec2 pads = ivec2(${i}, ${a});\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d1 = coords[${l}];\n\n ivec2 dyCorner = ivec2(coords[${u}], coords[${d}]) - pads;\n int dyRCorner = dyCorner.x;\n int dyCCorner = dyCorner.y;\n\n // Convolve dy(?, ?, d2) with w(:, :, d1, d2) to compute dx(xR, xC, d1).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n for (int wR = 0; wR < ${t}; wR++) {\n float dyR = float(dyRCorner + wR) / ${s}.0;\n\n if (dyR < 0.0 || dyR >= ${e.outHeight}.0 || fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n int wRPerm = ${t} - 1 - wR;\n\n for (int wC = 0; wC < ${n}; wC++) {\n float dyC = float(dyCCorner + wC) / ${o}.0;\n\n if (dyC < 0.0 || dyC >= ${e.outWidth}.0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n int wCPerm = ${n} - 1 - wC;\n\n for (int d2 = 0; d2 < ${e.outChannels}; d2++) {\n\n if (${r}) {\n float xValue = getDy(batch, idyR, idyC, d2);\n float wValue = getW(wRPerm, wCPerm, d1, d2);\n dotProd += xValue * wValue;\n } else {\n float xValue = getDy(batch, d2, idyR, idyC);\n float wValue = getW(wRPerm, wCPerm, d1, d2);\n dotProd += xValue * wValue;\n }\n\n }\n }\n }\n setOutput(dotProd);\n }\n `}}class r{constructor(e){this.variableNames=["x","dy"],this.outputShape=e.filterShape;const t=e.strideDepth,n=e.strideHeight,s=e.strideWidth,o=e.padInfo.front,r=e.padInfo.top,i=e.padInfo.left;this.userCode=`\n void main() {\n ivec5 coords = getOutputCoords();\n int wF = coords.x;\n int wR = coords.y;\n int wC = coords.z;\n int d1 = coords.w;\n int d2 = coords.u;\n\n float dotProd = 0.0;\n\n for (int b = 0; b < ${e.batchSize}; b++) {\n for (int yF = 0; yF < ${e.outDepth}; yF++) {\n int xF = wF + yF * ${t} - ${o};\n\n if (xF < 0 || xF >= ${e.inDepth}) {\n continue;\n }\n\n for (int yR = 0; yR < ${e.outHeight}; yR++) {\n int xR = wR + yR * ${n} - ${r};\n\n if (xR < 0 || xR >= ${e.inHeight}) {\n continue;\n }\n\n for (int yC = 0; yC < ${e.outWidth}; yC++) {\n int xC = wC + yC * ${s} - ${i};\n\n if (xC < 0 || xC >= ${e.inWidth}) {\n continue;\n }\n\n float dyValue = getDy(b, yF, yR, yC, d2);\n float xValue = getX(b, xF, xR, xC, d1);\n dotProd += (xValue * dyValue);\n }\n }\n }\n }\n setOutput(dotProd);\n }\n `}}class i{constructor(e){this.variableNames=["dy","W"],this.outputShape=e.inShape;const t=e.filterDepth,n=e.filterHeight,s=e.filterWidth,o=e.strideDepth,r=e.strideHeight,i=e.strideWidth,a=t-1-e.padInfo.front,u=n-1-e.padInfo.top,d=s-1-e.padInfo.left;this.userCode=`\n const ivec3 pads = ivec3(${a}, ${u}, ${d});\n\n void main() {\n ivec5 coords = getOutputCoords();\n int batch = coords.x;\n int d1 = coords.u;\n\n\n ivec3 dyCorner = ivec3(coords.y, coords.z, coords.w) - pads;\n int dyFCorner = dyCorner.x;\n int dyRCorner = dyCorner.y;\n int dyCCorner = dyCorner.z;\n\n float dotProd = 0.0;\n for (int wF = 0; wF < ${t}; wF++) {\n float dyF = float(dyFCorner + wF) / ${o}.0;\n\n if (dyF < 0.0 || dyF >= ${e.outDepth}.0 || fract(dyF) > 0.0) {\n continue;\n }\n int idyF = int(dyF);\n\n int wFPerm = ${t} - 1 - wF;\n\n for (int wR = 0; wR < ${n}; wR++) {\n float dyR = float(dyRCorner + wR) / ${r}.0;\n\n if (dyR < 0.0 || dyR >= ${e.outHeight}.0 ||\n fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n int wRPerm = ${n} - 1 - wR;\n\n for (int wC = 0; wC < ${s}; wC++) {\n float dyC = float(dyCCorner + wC) / ${i}.0;\n\n if (dyC < 0.0 || dyC >= ${e.outWidth}.0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n int wCPerm = ${s} - 1 - wC;\n\n for (int d2 = 0; d2 < ${e.outChannels}; d2++) {\n float xValue = getDy(batch, idyF, idyR, idyC, d2);\n float wValue = getW(wFPerm, wRPerm, wCPerm, d1, d2);\n dotProd += xValue * wValue;\n }\n }\n }\n }\n setOutput(dotProd);\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/conv_backprop_gpu_depthwise.js": +/*!**********************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/conv_backprop_gpu_depthwise.js ***! + \**********************************************************************************/ +/*! exports provided: DepthwiseConv2DDerFilterProgram, DepthwiseConv2DDerInputProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"DepthwiseConv2DDerFilterProgram",(function(){return s})),n.d(t,"DepthwiseConv2DDerInputProgram",(function(){return o})); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class s{constructor(e){this.variableNames=["x","dy"],this.outputShape=e.filterShape;const t=e.strideHeight,n=e.strideWidth,s=e.padInfo.top,o=e.padInfo.left,r=e.outChannels/e.inChannels;this.userCode=`\n void main() {\n ivec4 coords = getOutputCoords();\n int wR = coords.x;\n int wC = coords.y;\n int d1 = coords.z;\n int dm = coords.w;\n int d2 = d1 * ${r} + dm;\n\n float dotProd = 0.0;\n\n // TO DO: Vec4 over the batch size\n for (int b = 0; b < ${e.batchSize}; b++) {\n for (int yR = 0; yR < ${e.outHeight}; yR++) {\n int xR = wR + yR * ${t} - ${s};\n\n if (xR < 0 || xR >= ${e.inHeight}) {\n continue;\n }\n\n for (int yC = 0; yC < ${e.outWidth}; yC++) {\n int xC = wC + yC * ${n} - ${o};\n\n if (xC < 0 || xC >= ${e.inWidth}) {\n continue;\n }\n\n float dyValue = getDy(b, yR, yC, d2);\n float xValue = getX(b, xR, xC, d1);\n dotProd += (xValue * dyValue);\n }\n }\n }\n setOutput(dotProd);\n }\n `}}class o{constructor(e){this.variableNames=["dy","W"],this.outputShape=e.inShape;const t=e.filterHeight,n=e.filterWidth,s=e.strideHeight,o=e.strideWidth,r=t-1-e.padInfo.top,i=n-1-e.padInfo.left,a=e.outChannels/e.inChannels;this.userCode=`\n const ivec2 pads = ivec2(${r}, ${i});\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d1 = coords[3];\n ivec2 dyCorner = coords.yz - pads;\n int dyRCorner = dyCorner.x;\n int dyCCorner = dyCorner.y;\n\n float dotProd = 0.0;\n\n for (int wR = 0; wR < ${t}; wR++) {\n float dyR = float(dyRCorner + wR) / ${s}.0;\n\n if (dyR < 0.0 || dyR >= ${e.outHeight}.0 || fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n int wRPerm = ${t} - 1 - wR;\n\n for (int wC = 0; wC < ${n}; wC++) {\n float dyC = float(dyCCorner + wC) / ${o}.0;\n\n if (dyC < 0.0 || dyC >= ${e.outWidth}.0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n int wCPerm = ${n} - 1 - wC;\n\n // TO DO: Vec4 over the channelMul\n for (int dm = 0; dm < ${a}; dm++) {\n int d2 = d1 * ${a} + dm;\n float xValue = getDy(batch, idyR, idyC, d2);\n float wValue = getW(wRPerm, wCPerm, d1, dm);\n dotProd += xValue * wValue;\n }\n }\n }\n setOutput(dotProd);\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/conv_gpu.js": +/*!***************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/conv_gpu.js ***! + \***************************************************************/ +/*! exports provided: Conv2DProgram, Conv3DProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"Conv2DProgram",(function(){return s})),n.d(t,"Conv3DProgram",(function(){return o})); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class s{constructor(e,t=!1,n=null,s=!1,o=!1){this.variableNames=["x","W"],this.outputShape=e.outShape;const r=e.padInfo.top,i=e.padInfo.left,a=e.strideHeight,u=e.strideWidth,d=e.dilationHeight,l=e.dilationWidth,c=e.filterHeight,f=e.filterWidth,p=4*Math.floor(e.inChannels/4),m=e.inChannels%4,h="channelsLast"===e.dataFormat,b=h?1:2,j=h?2:3,g=h?3:1;let w="",_="";n&&(w=s?`float activation(float a) {\n float b = getPreluActivationWeightsAtOutCoords();\n ${n}\n }`:o?`float activation(float a) {\n float b = getLeakyreluAlphaAtOutCoords();\n ${n}\n }`:`\n float activation(float x) {\n ${n}\n }\n `,_="result = activation(result);");const k=t?"result += getBiasAtOutCoords();":"";t&&this.variableNames.push("bias"),s&&this.variableNames.push("preluActivationWeights"),o&&this.variableNames.push("leakyreluAlpha"),this.userCode=`\n ${w}\n\n const ivec2 strides = ivec2(${a}, ${u});\n const ivec2 pads = ivec2(${r}, ${i});\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d2 = coords[${g}];\n\n ivec2 xRCCorner =\n ivec2(coords[${b}], coords[${j}]) * strides - pads;\n int xRCorner = xRCCorner.x;\n int xCCorner = xRCCorner.y;\n\n // Convolve x(?, ?, d1) with w(:, :, d1, d2) to get y(yR, yC, d2).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n for (int wR = 0; wR < ${c}; wR++) {\n int xR = xRCorner + wR * ${d};\n\n if (xR < 0 || xR >= ${e.inHeight}) {\n continue;\n }\n\n for (int wC = 0; wC < ${f}; wC++) {\n int xC = xCCorner + wC * ${l};\n\n if (xC < 0 || xC >= ${e.inWidth}) {\n continue;\n }\n\n for (int d1 = 0; d1 < ${p}; d1 += 4) {\n vec4 wValues = vec4(\n getW(wR, wC, d1, d2),\n getW(wR, wC, d1 + 1, d2),\n getW(wR, wC, d1 + 2, d2),\n getW(wR, wC, d1 + 3, d2)\n );\n\n if (${h}) {\n vec4 xValues = vec4(\n getX(batch, xR, xC, d1),\n getX(batch, xR, xC, d1 + 1),\n getX(batch, xR, xC, d1 + 2),\n getX(batch, xR, xC, d1 + 3)\n );\n dotProd += dot(xValues, wValues);\n } else {\n vec4 xValues = vec4(\n getX(batch, d1, xR, xC),\n getX(batch, d1 + 1, xR, xC),\n getX(batch, d1 + 2, xR, xC),\n getX(batch, d1 + 3, xR, xC)\n );\n dotProd += dot(xValues, wValues);\n }\n }\n\n if (${1===m}) {\n\n if (${h}) {\n dotProd +=\n getX(batch, xR, xC, ${p}) *\n getW(wR, wC, ${p}, d2);\n } else {\n dotProd +=\n getX(batch, ${p}, xR, xC) *\n getW(wR, wC, ${p}, d2);\n }\n\n } else if (${2===m}) {\n vec2 wValues = vec2(\n getW(wR, wC, ${p}, d2),\n getW(wR, wC, ${p} + 1, d2)\n );\n\n if (${h}) {\n vec2 xValues = vec2(\n getX(batch, xR, xC, ${p}),\n getX(batch, xR, xC, ${p} + 1)\n );\n dotProd += dot(xValues, wValues);\n } else {\n vec2 xValues = vec2(\n getX(batch, ${p}, xR, xC),\n getX(batch, ${p} + 1, xR, xC)\n );\n dotProd += dot(xValues, wValues);\n }\n\n } else if (${3===m}) {\n vec3 wValues = vec3(\n getW(wR, wC, ${p}, d2),\n getW(wR, wC, ${p} + 1, d2),\n getW(wR, wC, ${p} + 2, d2)\n );\n\n if (${h}) {\n vec3 xValues = vec3(\n getX(batch, xR, xC, ${p}),\n getX(batch, xR, xC, ${p} + 1),\n getX(batch, xR, xC, ${p} + 2)\n );\n dotProd += dot(xValues, wValues);\n } else {\n vec3 xValues = vec3(\n getX(batch, ${p}, xR, xC),\n getX(batch, ${p} + 1, xR, xC),\n getX(batch, ${p} + 2, xR, xC)\n );\n dotProd += dot(xValues, wValues);\n }\n\n }\n }\n }\n\n float result = dotProd;\n ${k}\n ${_}\n setOutput(result);\n }\n `}}class o{constructor(e){this.variableNames=["x","W"],this.outputShape=e.outShape;const t=e.padInfo.front,n=e.padInfo.top,s=e.padInfo.left,o=e.strideDepth,r=e.strideHeight,i=e.strideWidth,a=e.dilationDepth,u=e.dilationHeight,d=e.dilationWidth,l=e.filterDepth,c=e.filterHeight,f=e.filterWidth,p=4*Math.floor(e.inChannels/4),m=e.inChannels%4;this.userCode=`\n const ivec3 strides = ivec3(${o}, ${r}, ${i});\n const ivec3 pads = ivec3(${t}, ${n}, ${s});\n\n void main() {\n ivec5 coords = getOutputCoords();\n int batch = coords.x;\n int d2 = coords.u;\n\n ivec3 xFRCCorner = ivec3(coords.y, coords.z, coords.w) * strides - pads;\n int xFCorner = xFRCCorner.x;\n int xRCorner = xFRCCorner.y;\n int xCCorner = xFRCCorner.z;\n\n // Convolve x(?, ?, ?, d1) with w(:, :, :, d1, d2) to get\n // y(yF, yR, yC, d2). ? = to be determined. : = across all\n // values in that axis.\n float dotProd = 0.0;\n for (int wF = 0; wF < ${l}; wF++) {\n int xF = xFCorner + wF * ${a};\n\n if (xF < 0 || xF >= ${e.inDepth}) {\n continue;\n }\n\n for (int wR = 0; wR < ${c}; wR++) {\n int xR = xRCorner + wR * ${u};\n\n if (xR < 0 || xR >= ${e.inHeight}) {\n continue;\n }\n\n for (int wC = 0; wC < ${f}; wC++) {\n int xC = xCCorner + wC * ${d};\n\n if (xC < 0 || xC >= ${e.inWidth}) {\n continue;\n }\n\n for (int d1 = 0; d1 < ${p}; d1 += 4) {\n vec4 xValues = vec4(\n getX(batch, xF, xR, xC, d1),\n getX(batch, xF, xR, xC, d1 + 1),\n getX(batch, xF, xR, xC, d1 + 2),\n getX(batch, xF, xR, xC, d1 + 3)\n );\n vec4 wValues = vec4(\n getW(wF, wR, wC, d1, d2),\n getW(wF, wR, wC, d1 + 1, d2),\n getW(wF, wR, wC, d1 + 2, d2),\n getW(wF, wR, wC, d1 + 3, d2)\n );\n\n dotProd += dot(xValues, wValues);\n }\n\n if (${1===m}) {\n dotProd +=\n getX(batch, xF, xR, xC, ${p}) *\n getW(wF, wR, wC, ${p}, d2);\n } else if (${2===m}) {\n vec2 xValues = vec2(\n getX(batch, xF, xR, xC, ${p}),\n getX(batch, xF, xR, xC, ${p} + 1)\n );\n vec2 wValues = vec2(\n getW(wF, wR, wC, ${p}, d2),\n getW(wF, wR, wC, ${p} + 1, d2)\n );\n dotProd += dot(xValues, wValues);\n } else if (${3===m}) {\n vec3 xValues = vec3(\n getX(batch, xF, xR, xC, ${p}),\n getX(batch, xF, xR, xC, ${p} + 1),\n getX(batch, xF, xR, xC, ${p} + 2)\n );\n vec3 wValues = vec3(\n getW(wF, wR, wC, ${p}, d2),\n getW(wF, wR, wC, ${p} + 1, d2),\n getW(wF, wR, wC, ${p} + 2, d2)\n );\n dotProd += dot(xValues, wValues);\n }\n }\n }\n }\n setOutput(dotProd);\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/conv_gpu_depthwise.js": +/*!*************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/conv_gpu_depthwise.js ***! + \*************************************************************************/ +/*! exports provided: DepthwiseConv2DProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"DepthwiseConv2DProgram",(function(){return o}));var s=n(/*! ./gpgpu_math */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/gpgpu_math.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */class o{constructor(e,t=!1,n=null,o=!1,r=!1){this.variableNames=["x","W"],this.customUniforms=[{name:"pads",type:"ivec2"},{name:"strides",type:"ivec2"},{name:"dilations",type:"ivec2"},{name:"inDims",type:"ivec2"}],this.outputShape=e.outShape,this.enableShapeUniforms=Object(s.useShapeUniforms)(this.outputShape.length);const i=e.filterHeight,a=e.filterWidth,u=e.outChannels/e.inChannels;let d="",l="";n&&(d=o?`float activation(float a) {\n float b = getPreluActivationWeightsAtOutCoords();\n ${n}\n }`:r?`float activation(float a) {\n float b = getLeakyreluAlphaAtOutCoords();\n ${n}\n }`:`\n float activation(float x) {\n ${n}\n }\n `,l="result = activation(result);");const c=t?"result += getBiasAtOutCoords();":"";t&&this.variableNames.push("bias"),o&&this.variableNames.push("preluActivationWeights"),r&&this.variableNames.push("leakyreluAlpha"),this.userCode=`\n ${d}\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords.x;\n ivec2 xRCCorner = coords.yz * strides - pads;\n int d2 = coords.w;\n int d1 = d2 / ${u};\n int q = d2 - d1 * ${u};\n\n int xRCorner = xRCCorner.x;\n int xCCorner = xRCCorner.y;\n\n // Convolve x(?, ?, d1) with w(:, :, d1, q) to get y(yR, yC, d2).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n // TO DO(dsmilkov): Flatten the two for loops and vec4 the operations.\n for (int wR = 0; wR < ${i}; wR++) {\n int xR = xRCorner + wR * dilations[0];\n\n if (xR < 0 || xR >= inDims[0]) {\n continue;\n }\n\n for (int wC = 0; wC < ${a}; wC++) {\n int xC = xCCorner + wC * dilations[1];\n\n if (xC < 0 || xC >= inDims[1]) {\n continue;\n }\n\n float xVal = getX(batch, xR, xC, d1);\n float wVal = getW(wR, wC, d1, q);\n dotProd += xVal * wVal;\n }\n }\n\n float result = dotProd;\n ${c}\n ${l}\n setOutput(result);\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/conv_packed_gpu_depthwise.js": +/*!********************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/conv_packed_gpu_depthwise.js ***! + \********************************************************************************/ +/*! exports provided: DepthwiseConvPacked2DProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"DepthwiseConvPacked2DProgram",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./gpgpu_math */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/gpgpu_math.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class r{constructor(e,t=!1,n=null,r=!1,i=!1){this.variableNames=["x","W"],this.packedInputs=!0,this.packedOutput=!0,this.customUniforms=[{name:"pads",type:"ivec2"},{name:"strides",type:"ivec2"},{name:"dilations",type:"ivec2"},{name:"inDims",type:"ivec2"}],this.outputShape=e.outShape,this.enableShapeUniforms=Object(o.useShapeUniforms)(this.outputShape.length);const a=e.outChannels/e.inChannels,u=e.padInfo.left,d=e.strideWidth,l=e.dilationWidth,c=e.filterHeight,f=e.filterWidth,p=f;let m="\n int xR; int xC; int xCOffset;\n vec4 wTexel; vec4 previous; vec4 final;";for(let e=0;e=0 && xR < inDims[0]) {\n `;for(let t=0;t<(p+1)/2;t++){const n=2*t;if(m+=`\n xC = xCCorner + ${n*l};\n `,1===d){if(n= 0 && xCOffset < inDims[1] && xTexelC${n}Ready == 0) {\n xTexelC${n} = getX(batch, xR, xCOffset, d1);\n\n // Need to manually clear unused channels in case\n // we're reading from recycled texture.\n if (xCOffset + 1 >= inDims[1]) {\n xTexelC${n}.zw = vec2(0.0);\n }\n xTexelC${n}Ready = 1;\n }\n `,m+=1===l&&n>0?`\n xC${n} = vec4(xTexelC${n-2}.zw, xTexelC${n}.xy);\n `:`\n xCOffset = xC + 1 - 2;\n\n if (xCOffset >= 0 && xCOffset < inDims[1]) {\n previous = getX(batch, xR, xCOffset, d1);\n\n // Need to manually clear unused channels in case\n // we're reading from recycled texture.\n if (xCOffset + 1 >= inDims[1]) {\n previous.zw = vec2(0.0);\n }\n\n xC${n} = vec4(previous.zw, xTexelC${n}.xy);\n } else {\n xC${n} = vec4(0.0, 0.0, xTexelC${n}.xy);\n }\n `):m+=`\n if (xC >= 0 && xC < inDims[1] && xTexelC${n}Ready == 0) {\n xTexelC${n} = getX(batch, xR, xC, d1);\n if (xC + 1 >= inDims[1]) {\n xTexelC${n}.zw = vec2(0.0);\n }\n xTexelC${n}Ready = 1;\n }\n\n xC${n} = xTexelC${n};\n `,n+1= 0 && xCOffset < inDims[1] && xTexelC${n+1}Ready == 0) {\n xTexelC${n+1} = getX(batch, xR, xCOffset, d1);\n\n // Need to manually clear unused channels in case\n // we're reading from recycled texture.\n if (xCOffset + 1 >= inDims[1]) {\n xTexelC${n+1}.zw = vec2(0.0);\n }\n xTexelC${n+1}Ready = 1;\n }\n `,l>1&&(m+=`\n xCOffset -= 2;\n if (xCOffset >= 0 && xCOffset < inDims[1] && xTexelC${n}Ready == 0) {\n xTexelC${n} = getX(batch, xR, xCOffset, d1);\n xTexelC${n}Ready = 1;\n }\n `),m+=`\n xC${n+1} = vec4(xTexelC${n}.zw, xTexelC${n+1}.xy);\n `):m+=1===e?`\n xC${n+1} = xTexelC${n};\n `:`\n xCOffset = xC + ${e};\n\n if (xCOffset >= 0 && xCOffset < inDims[1] && xTexelC${n+1}Ready == 0) {\n xTexelC${n+1} = getX(batch, xR, xCOffset, d1);\n if (xCOffset + 1 >= inDims[1]) {\n xTexelC${n+1}.zw = vec2(0.0);\n }\n xTexelC${n+1}Ready = 1;\n }\n\n xC${n+1} = xTexelC${n+1};\n `}}else n= 0 && xCOffset < inDims[1] && xTexelC${n}Ready == 0) {\n xTexelC${n} = getX(batch, xR, xCOffset, d1);\n // Need to manually clear unused channels in case\n // we're reading from recycled texture.\n if (xCOffset + 1 >= inDims[1]) {\n xTexelC${n}.zw = vec2(0.0);\n }\n xTexelC${n}Ready = 1;\n }\n\n if(xC + 1 >= 0 && xC + 1 < inDims[1] && xTexelC${n+1}Ready == 0) {\n xTexelC${n+1} = getX(batch, xR, xC + 1, d1);\n // Need to manually clear unused channels in case\n // we're reading from recycled texture.\n if (xC + 2 >= inDims[1]) {\n xTexelC${n+1}.zw = vec2(0.0);\n }\n xTexelC${n+1}Ready = 1;\n }\n\n xC${n} = vec4(xTexelC${n}.zw, xTexelC${n+1}.zw);\n `,n+1= 0 && xCOffset < inDims[1]) {\n final = getX(batch, xR, xCOffset, d1);\n }\n xC${n+1} = vec4(xTexelC${n+1}.xy, final.xy);\n `)):(m+=`\n if(xC >= 0 && xC < inDims[1] && xTexelC${n}Ready == 0) {\n xTexelC${n} = getX(batch, xR, xC, d1);\n if (xC + 1 >= inDims[1]) {\n xTexelC${n}.zw = vec2(0.0);\n }\n xTexelC${n}Ready = 1;\n }\n\n xCOffset = xC + strides[1];\n if(xCOffset >= 0 && xCOffset < inDims[1] && xTexelC${n+1}Ready == 0) {\n xTexelC${n+1} = getX(batch, xR, xCOffset, d1);\n if (xCOffset + 1 >= inDims[1]) {\n xTexelC${n+1}.zw = vec2(0.);\n }\n xTexelC${n+1}Ready = 1;\n }\n\n xC${n} = vec4(\n xTexelC${n}.xy, xTexelC${n+1}.xy);\n `,n+11?[""+(i-1)/(l-1),"(y2-y1) * height_ratio",`y1*${p} + float(y)*(height_scale)`]:["0.0","0.0",`0.5 * (y1+y2) * ${p}`],[g,w,_]=c>1?[""+(a-1)/(c-1),"(x2-x1) * width_ratio",`x1*${m} + float(x)*(width_scale)`]:["0.0","0.0",`0.5 * (x1+x2) * ${m}`];this.userCode=`\n const float height_ratio = float(${h});\n const float width_ratio = float(${g});\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int y = coords[1];\n int x = coords[2];\n int d = coords[3];\n\n // get box vals\n float y1 = getBoxes(b,0);\n float x1 = getBoxes(b,1);\n float y2 = getBoxes(b,2);\n float x2 = getBoxes(b,3);\n\n // get image in batch index\n int bInd = round(getBoxInd(b));\n if(bInd < 0 || bInd >= ${r}) {\n return;\n }\n\n float height_scale = ${b};\n float width_scale = ${w};\n\n float in_y = ${j};\n if( in_y < 0.0 || in_y > ${p} ) {\n setOutput(float(${o}));\n return;\n }\n float in_x = ${_};\n if( in_x < 0.0 || in_x > ${m} ) {\n setOutput(float(${o}));\n return;\n }\n\n vec2 sourceFracIndexCR = vec2(in_x,in_y);\n if(${f} == 1) {\n // Compute the four integer indices.\n ivec2 sourceFloorCR = ivec2(sourceFracIndexCR);\n ivec2 sourceCeilCR = ivec2(ceil(sourceFracIndexCR));\n\n float topLeft = getImage(b, sourceFloorCR.y, sourceFloorCR.x, d);\n float bottomLeft = getImage(b, sourceCeilCR.y, sourceFloorCR.x, d);\n float topRight = getImage(b, sourceFloorCR.y, sourceCeilCR.x, d);\n float bottomRight = getImage(b, sourceCeilCR.y, sourceCeilCR.x, d);\n\n vec2 fracCR = sourceFracIndexCR - vec2(sourceFloorCR);\n\n float top = topLeft + (topRight - topLeft) * fracCR.x;\n float bottom = bottomLeft + (bottomRight - bottomLeft) * fracCR.x;\n float newValue = top + (bottom - top) * fracCR.y;\n setOutput(newValue);\n } else {\n // Compute the coordinators of nearest neighbor point.\n ivec2 sourceNearestCR = ivec2(floor(\n sourceFracIndexCR + vec2(0.5,0.5)));\n float newValue = getImage(b, sourceNearestCR.y, sourceNearestCR.x, d);\n setOutput(newValue);\n }\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/cumsum_gpu.js": +/*!*****************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/cumsum_gpu.js ***! + \*****************************************************************/ +/*! exports provided: CumSumProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"CumSumProgram",(function(){return o}));var s=n(/*! ./shader_compiler */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js");class o{constructor(e,t,n){this.variableNames=["x"],this.customUniforms=[{name:"index",type:"float"}],this.outputShape=e;const o=e.length,a=t?"0.0":`getX(${r(o,"coords")})`,u=e[e.length-1];let d="",l="";t?(d=n?"end != "+(u-1):"end != 0",l=n?"end + 1":"end - 1"):(d=n?`end + pow2 < ${u}`:"end >= pow2",l=n?"end + pow2":"end - pow2"),this.userCode=`\n void main() {\n ${Object(s.getCoordsDataType)(o)} coords = getOutputCoords();\n int end = ${i(o,"coords")};\n float val = ${a};\n int pow2 = int(pow(2.0, index));\n if (${d}) {\n int idx = ${l};\n ${i(o,"coords")} = idx;\n val += getX(${r(o,"coords")});\n }\n setOutput(val);\n }\n `}}function r(e,t){if(1===e)return`${t}`;if(2===e)return`${t}.x, ${t}.y`;if(3===e)return`${t}.x, ${t}.y, ${t}.z`;if(4===e)return`${t}.x, ${t}.y, ${t}.z, ${t}.w`;throw Error(`Cumulative sum for rank ${e} is not yet supported`)}function i(e,t){if(1===e)return`${t}`;if(2===e)return`${t}.y`;if(3===e)return`${t}.z`;if(4===e)return`${t}.w`;throw Error(`Cumulative sum for rank ${e} is not yet supported`)}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/decode_matrix_gpu.js": +/*!************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/decode_matrix_gpu.js ***! + \************************************************************************/ +/*! exports provided: DecodeMatrixProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"DecodeMatrixProgram",(function(){return a}));var s=n(/*! ./glsl_version */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/glsl_version.js"),o=n(/*! ./gpgpu_math */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/gpgpu_math.js"),r=n(/*! ./shader_compiler_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/shader_compiler_util.js"),i=n(/*! ./tex_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/tex_util.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class a{constructor(e){this.variableNames=["A"],this.packedInputs=!1,this.packedOutput=!0,this.outPackingScheme=i.PackingScheme.DENSE,this.customUniforms=[{name:"texShape",type:"ivec2"}];const t=Object(s.getGlslDifferences)();this.outputShape=e,this.enableShapeUniforms=Object(o.useShapeUniforms)(this.outputShape.length),this.userCode=`\n ivec3 outCoordsFromFlatIndex(int index) {\n ${this.enableShapeUniforms?r.getOutputLogicalCoordinatesFromFlatIndexByUniform(["r","c","d"],e):r.getLogicalCoordinatesFromFlatIndex(["r","c","d"],e)}\n return ivec3(r, c, d);\n }\n\n void main() {\n ivec2 resTexRC = ivec2(resultUV.yx * vec2(texShape[0], texShape[1]));\n int index = 4 * (resTexRC.x * texShape[1] + resTexRC.y);\n\n vec4 result = vec4(0.);\n\n for (int i=0; i<4; i++) {\n int flatIndex = index + i;\n ivec3 rc = outCoordsFromFlatIndex(flatIndex);\n result[i] = getA(rc.x, rc.y, rc.z);\n }\n\n ${t.output} = result;\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/decode_matrix_packed_gpu.js": +/*!*******************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/decode_matrix_packed_gpu.js ***! + \*******************************************************************************/ +/*! exports provided: DecodeMatrixPackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"DecodeMatrixPackedProgram",(function(){return a}));var s=n(/*! ./glsl_version */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/glsl_version.js"),o=n(/*! ./gpgpu_math */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/gpgpu_math.js"),r=n(/*! ./shader_compiler_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/shader_compiler_util.js"),i=n(/*! ./tex_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/tex_util.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class a{constructor(e){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,this.outPackingScheme=i.PackingScheme.DENSE,this.customUniforms=[{name:"texShape",type:"ivec2"}];const t=Object(s.getGlslDifferences)();this.outputShape=e,this.enableShapeUniforms=Object(o.useShapeUniforms)(this.outputShape.length),this.userCode=`\n ivec3 outCoordsFromFlatIndex(int index) {\n ${this.enableShapeUniforms?r.getOutputLogicalCoordinatesFromFlatIndexByUniform(["r","c","d"],e):r.getLogicalCoordinatesFromFlatIndex(["r","c","d"],e)}\n return ivec3(r, c, d);\n }\n\n void main() {\n ivec2 resTexRC = ivec2(resultUV.yx * vec2(texShape[0], texShape[1]));\n int index = 4 * (resTexRC.x * texShape[1] + resTexRC.y);\n\n vec4 result = vec4(0.);\n\n for (int i=0; i<4; i++) {\n int flatIndex = index + i;\n ivec3 rc = outCoordsFromFlatIndex(flatIndex);\n result[i] = getChannel(getA(rc.x, rc.y, rc.z), vec2(rc.y, rc.z));\n }\n\n ${t.output} = result;\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/depth_to_space_gpu.js": +/*!*************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/depth_to_space_gpu.js ***! + \*************************************************************************/ +/*! exports provided: DepthToSpaceProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"DepthToSpaceProgram",(function(){return s})); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class s{constructor(e,t,n){this.variableNames=["x"],this.outputShape=[],this.outputShape=e,this.blockSize=t,this.dataFormat=n,this.userCode=`\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int h = ${this.getHeightCoordString()};\n int w = ${this.getWidthCoordString()};\n int d = ${this.getDepthCoordString()};\n\n int in_h = h / ${t};\n int offset_h = imod(h, ${t});\n int in_w = w / ${t};\n int offset_w = imod(w, ${t});\n int offset_d = (offset_h * ${t} + offset_w) *\n ${this.getOutputDepthSize()};\n int in_d = d + offset_d;\n\n float result = ${this.getInputSamplingString()};\n setOutput(result);\n }\n `}getHeightCoordString(){return"NHWC"===this.dataFormat?"coords[1]":"coords[2]"}getWidthCoordString(){return"NHWC"===this.dataFormat?"coords[2]":"coords[3]"}getDepthCoordString(){return"NHWC"===this.dataFormat?"coords[3]":"coords[1]"}getOutputDepthSize(){return"NHWC"===this.dataFormat?this.outputShape[3]:this.outputShape[1]}getInputSamplingString(){return"NHWC"===this.dataFormat?"getX(b, in_h, in_w, in_d)":"getX(b, in_d, in_h, in_w)"}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/diag_gpu.js": +/*!***************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/diag_gpu.js ***! + \***************************************************************/ +/*! exports provided: DiagProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"DiagProgram",(function(){return s})); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class s{constructor(e){this.variableNames=["X"],this.outputShape=[e,e],this.userCode="\n void main() {\n ivec2 coords = getOutputCoords();\n float val = coords[0] == coords[1] ? getX(coords[0]) : 0.0;\n setOutput(val);\n }\n "}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/dilation_gpu.js": +/*!*******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/dilation_gpu.js ***! + \*******************************************************************/ +/*! exports provided: Dilation2DProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"Dilation2DProgram",(function(){return s})); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class s{constructor(e){this.variableNames=["x","W"],this.outputShape=e.outShape;const{inHeight:t,inWidth:n,padInfo:s,strideHeight:o,strideWidth:r,filterHeight:i,filterWidth:a,dilationHeight:u,dilationWidth:d}=e,{top:l,left:c}=s;this.userCode=`\n const ivec2 strides = ivec2(${o}, ${r});\n const ivec2 pads = ivec2(${l}, ${c});\n const float neg_infinity = -3.4e38;\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords.x;\n int d1 = coords.w;\n ivec2 outTopLeftCorner =\n coords.yz * strides - pads;\n int hBeg = outTopLeftCorner.x;\n int wBeg = outTopLeftCorner.y;\n\n float curVal = neg_infinity;\n for (int h = 0; h < ${i}; h++) {\n int hIn = hBeg + h * ${u};\n\n if (hIn >= 0 && hIn < ${t}) {\n for (int w = 0; w < ${a}; w++) {\n int wIn = wBeg + w * ${d};\n\n if (wIn >= 0 && wIn < ${n}) {\n float xVal = getX(batch, hIn, wIn, d1);\n float wVal = getW(h, w, d1);\n\n float val = xVal + wVal;\n if (val > curVal) {\n curVal = val;\n }\n }\n }\n }\n }\n\n float result = curVal;\n setOutput(result);\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/encode_float_gpu.js": +/*!***********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/encode_float_gpu.js ***! + \***********************************************************************/ +/*! exports provided: EncodeFloatProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"EncodeFloatProgram",(function(){return i}));var s=n(/*! ./glsl_version */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/glsl_version.js"),o=n(/*! ./shader_compiler_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/shader_compiler_util.js"),r=n(/*! ./tex_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/tex_util.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class i{constructor(e){this.variableNames=["A"],this.outTexUsage=r.TextureUsage.DOWNLOAD;const t=Object(s.getGlslDifferences)();this.outputShape=e,this.userCode=`\n ${o.ENCODE_FLOAT_SNIPPET}\n\n void main() {\n float x = getAAtOutCoords();\n ${t.output} = encode_float(x);\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/encode_float_packed_gpu.js": +/*!******************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/encode_float_packed_gpu.js ***! + \******************************************************************************/ +/*! exports provided: EncodeFloatPackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"EncodeFloatPackedProgram",(function(){return i}));var s=n(/*! ./glsl_version */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/glsl_version.js"),o=n(/*! ./shader_compiler_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/shader_compiler_util.js"),r=n(/*! ./tex_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/tex_util.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class i{constructor(e){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!1,this.outTexUsage=r.TextureUsage.DOWNLOAD;const t=Object(s.getGlslDifferences)();this.outputShape=e,this.userCode=`\n ${o.ENCODE_FLOAT_SNIPPET}\n\n void main() {\n ivec3 coords = getOutputCoords();\n float x = getChannel(getAAtOutCoords(), vec2(coords.y, coords.z));\n ${t.output} = encode_float(x);\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/encode_matrix_gpu.js": +/*!************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/encode_matrix_gpu.js ***! + \************************************************************************/ +/*! exports provided: EncodeMatrixProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"EncodeMatrixProgram",(function(){return i}));var s=n(/*! ./glsl_version */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/glsl_version.js"),o=n(/*! ./gpgpu_math */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/gpgpu_math.js"),r=n(/*! ./shader_compiler_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/shader_compiler_util.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class i{constructor(e,t=!1){this.variableNames=["A"],this.customUniforms=[{name:"texShape",type:"ivec2"}];const n=Object(s.getGlslDifferences)();this.outputShape=e,this.enableShapeUniforms=Object(o.useShapeUniforms)(this.outputShape.length);let i="result";t&&(i="floor(result * 255. + 0.5)"),this.userCode=`\n ${this.enableShapeUniforms?r.getFlatIndexFrom3DOutput():r.getFlatIndexFrom3D(e)}\n\n void main() {\n ivec3 coords = getOutputCoords();\n\n int flatIndex = getFlatIndex(coords);\n int offset = imod(flatIndex, 4);\n\n flatIndex = idiv(flatIndex, 4, 1.);\n\n int r = flatIndex / texShape[1];\n int c = imod(flatIndex, texShape[1]);\n vec2 uv = (vec2(c, r) + halfCR) / vec2(texShape[1], texShape[0]);\n vec4 values = ${n.texture2D}(A, uv);\n\n float result;\n\n if(offset == 0) {\n result = values[0];\n } else if(offset == 1) {\n result = values[1];\n } else if(offset == 2) {\n result = values[2];\n } else {\n result = values[3];\n }\n\n ${n.output} = vec4(${i}, 0., 0., 0.);\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/encode_matrix_packed_gpu.js": +/*!*******************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/encode_matrix_packed_gpu.js ***! + \*******************************************************************************/ +/*! exports provided: EncodeMatrixPackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"EncodeMatrixPackedProgram",(function(){return i}));var s=n(/*! ./glsl_version */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/glsl_version.js"),o=n(/*! ./gpgpu_math */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/gpgpu_math.js"),r=n(/*! ./shader_compiler_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/shader_compiler_util.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class i{constructor(e,t=!1){this.variableNames=["A"],this.packedInputs=!1,this.packedOutput=!0,this.customUniforms=[{name:"texShape",type:"ivec2"}];const n=Object(s.getGlslDifferences)();this.outputShape=e,this.enableShapeUniforms=Object(o.useShapeUniforms)(this.outputShape.length);let i="",a="result";t&&(a="floor(result * 255. + 0.5)");for(let t=0;t<=1;t++)for(let s=0;s<=1;s++){const o=2*t+s;i+=`\n localCoords = coords;\n if(localCoords[2] + ${s} < ${this.enableShapeUniforms?"outShape[2]":`${e[2]}`}) {\n localCoords[2] += ${s};\n if (localCoords[1] + ${t} < ${this.enableShapeUniforms?"outShape[1]":`${e[1]}`}) {\n localCoords[1] += ${t};\n\n flatIndex = getFlatIndex(localCoords);\n offset = imod(flatIndex, 4);\n\n flatIndex = idiv(flatIndex, 4, 1.);\n\n int r = flatIndex / texShape[1];\n int c = imod(flatIndex, texShape[1]);\n vec2 uv = (vec2(c, r) + halfCR) / vec2(texShape[1], texShape[0]);\n values = ${n.texture2D}(A, uv);\n\n if (offset == 0) {\n result[${o}] = values[0];\n } else if (offset == 1) {\n result[${o}] = values[1];\n } else if (offset == 2) {\n result[${o}] = values[2];\n } else {\n result[${o}] = values[3];\n }\n }\n }\n `}this.userCode=`\n ${this.enableShapeUniforms?r.getFlatIndexFrom3DOutput():r.getFlatIndexFrom3D(e)}\n\n void main() {\n ivec3 coords = getOutputCoords();\n\n vec4 result = vec4(0.);\n int flatIndex, r, c, offset;\n ivec3 localCoords;\n vec2 uv;\n vec4 values;\n\n ${i}\n\n ${n.output} = ${a};\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/fft_gpu.js": +/*!**************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/fft_gpu.js ***! + \**************************************************************/ +/*! exports provided: FFTProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"FFTProgram",(function(){return s})); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class s{constructor(e,t,n){this.variableNames=["real","imag"];const s=t[1];this.outputShape=t;const o=n?`2.0 * ${Math.PI}`:`-2.0 * ${Math.PI}`,r=n?`${s}.0`:"1.0";let i;if("real"===e)i="return real * expR - imag * expI;";else{if("imag"!==e)throw new Error(`FFT component must be either "real" or "imag", got ${e}.`);i="return real * expI + imag * expR;"}this.userCode=`\n const float exponentMultiplier = ${o};\n\n float unaryOpComplex(float real, float expR, float imag, float expI) {\n ${i}\n }\n\n float mulMatDFT(int batch, int index) {\n float indexRatio = float(index) / float(${s});\n float exponentMultiplierTimesIndexRatio =\n exponentMultiplier * indexRatio;\n\n float result = 0.0;\n\n for (int i = 0; i < ${s}; i++) {\n // x = (-2|2 * PI / N) * index * i;\n float x = exponentMultiplierTimesIndexRatio * float(i);\n float expR = cos(x);\n float expI = sin(x);\n float real = getReal(batch, i);\n float imag = getImag(batch, i);\n\n result +=\n unaryOpComplex(real, expR, imag, expI) / ${r};\n }\n\n return result;\n }\n\n void main() {\n ivec2 coords = getOutputCoords();\n setOutput(mulMatDFT(coords[0], coords[1]));\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/fill_gpu.js": +/*!***************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/fill_gpu.js ***! + \***************************************************************/ +/*! exports provided: FillProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"FillProgram",(function(){return s})); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class s{constructor(e,t){this.outputShape=[],this.customUniforms=[{name:"value",type:"float"}],this.variableNames=["x"],this.outputShape=e,this.userCode="\n void main() {\n // Input can be obtained from uniform value.\n setOutput(value);\n }\n "}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/flags_webgl.js": +/*!******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/flags_webgl.js ***! + \******************************************************************/ +/*! no exports provided */function(e,t,n){"use strict";n.r(t);var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./webgl_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/webgl_util.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(s.env)();r.registerFlag("HAS_WEBGL",(()=>r.getNumber("WEBGL_VERSION")>0)),r.registerFlag("WEBGL_VERSION",(()=>Object(o.isWebGLVersionEnabled)(2)?2:Object(o.isWebGLVersionEnabled)(1)?1:0)),r.registerFlag("WEBGL_CHECK_NUMERICAL_PROBLEMS",(()=>!1)),r.registerFlag("WEBGL_BUFFER_SUPPORTED",(()=>2===r.get("WEBGL_VERSION"))),r.registerFlag("WEBGL_CPU_FORWARD",(()=>!0)),r.registerFlag("WEBGL_FORCE_F16_TEXTURES",(()=>!1)),r.registerFlag("WEBGL_PACK",(()=>r.getBool("HAS_WEBGL"))),r.registerFlag("WEBGL_PACK_NORMALIZATION",(()=>r.getBool("WEBGL_PACK"))),r.registerFlag("WEBGL_PACK_CLIP",(()=>r.getBool("WEBGL_PACK"))),r.registerFlag("WEBGL_PACK_DEPTHWISECONV",(()=>r.getBool("WEBGL_PACK"))),r.registerFlag("WEBGL_PACK_BINARY_OPERATIONS",(()=>r.getBool("WEBGL_PACK"))),r.registerFlag("WEBGL_PACK_UNARY_OPERATIONS",(()=>r.getBool("WEBGL_PACK"))),r.registerFlag("WEBGL_PACK_ARRAY_OPERATIONS",(()=>r.getBool("WEBGL_PACK"))),r.registerFlag("WEBGL_PACK_IMAGE_OPERATIONS",(()=>r.getBool("WEBGL_PACK"))),r.registerFlag("WEBGL_PACK_REDUCE",(()=>r.getBool("WEBGL_PACK"))),r.registerFlag("WEBGL_LAZILY_UNPACK",(()=>r.getBool("WEBGL_PACK"))),r.registerFlag("WEBGL_CONV_IM2COL",(()=>r.getBool("WEBGL_PACK"))),r.registerFlag("WEBGL_MAX_TEXTURE_SIZE",(()=>Object(o.getWebGLMaxTextureSize)(r.getNumber("WEBGL_VERSION")))),r.registerFlag("WEBGL_MAX_TEXTURES_IN_SHADER",(()=>Object(o.getMaxTexturesInShader)(r.getNumber("WEBGL_VERSION")))),r.registerFlag("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION",(()=>{const e=r.getNumber("WEBGL_VERSION");return 0===e?0:Object(o.getWebGLDisjointQueryTimerVersion)(e)})),r.registerFlag("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE",(()=>r.getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")>0&&!s.device_util.isMobile())),r.registerFlag("WEBGL_RENDER_FLOAT32_CAPABLE",(()=>Object(o.isCapableOfRenderingToFloatTexture)(r.getNumber("WEBGL_VERSION")))),r.registerFlag("WEBGL_RENDER_FLOAT32_ENABLED",(()=>!r.getBool("WEBGL_FORCE_F16_TEXTURES")&&r.getBool("WEBGL_RENDER_FLOAT32_CAPABLE"))),r.registerFlag("WEBGL_DOWNLOAD_FLOAT_ENABLED",(()=>Object(o.isDownloadFloatTextureEnabled)(r.getNumber("WEBGL_VERSION")))),r.registerFlag("WEBGL_FENCE_API_ENABLED",(()=>Object(o.isWebGLFenceEnabled)(r.getNumber("WEBGL_VERSION")))),r.registerFlag("WEBGL_SIZE_UPLOAD_UNIFORM",(()=>r.getBool("WEBGL_RENDER_FLOAT32_ENABLED")?4:0)),r.registerFlag("WEBGL_DELETE_TEXTURE_THRESHOLD",(()=>-1),(e=>{if(e<0&&-1!==e)throw new Error(`WEBGL_DELETE_TEXTURE_THRESHOLD must be -1 (indicating never delete) or at least 0, but got ${e}.`)})),r.registerFlag("WEBGL_FLUSH_THRESHOLD",(()=>s.device_util.isMobile()&&r.getBool("IS_CHROME")?1:-1),(e=>{if(e<0&&-1!==e)throw new Error(`WEBGL_FLUSH_THRESHOLD must be -1 (indicating never manual flush) or at least 0, but got ${e}.`)})),r.registerFlag("CPU_HANDOFF_SIZE_THRESHOLD",(()=>128)),r.registerFlag("WEBGL_USE_SHAPES_UNIFORMS",(()=>!1)),r.registerFlag("TOPK_LAST_DIM_CPU_HANDOFF_SIZE_THRESHOLD",(()=>1e5)),r.registerFlag("TOPK_K_CPU_HANDOFF_THRESHOLD",(()=>128))},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/flip_left_right_gpu.js": +/*!**************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/flip_left_right_gpu.js ***! + \**************************************************************************/ +/*! exports provided: FlipLeftRightProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"FlipLeftRightProgram",(function(){return s})); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class s{constructor(e){this.variableNames=["Image"],this.outputShape=[];const t=e[2];this.outputShape=e,this.userCode=`\n void main() {\n ivec4 coords = getOutputCoords();\n int x = coords[2];\n\n int coordX = ${t} - x - 1;\n float outputValue;\n if(coordX >= 0 && coordX < ${t}) {\n outputValue = getImage(coords[0], coords[1], coordX, coords[3]);\n } else {\n outputValue = getImage(coords[0], coords[1], coords[2], coords[3]);\n }\n setOutput(outputValue);\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/gather_gpu.js": +/*!*****************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/gather_gpu.js ***! + \*****************************************************************/ +/*! exports provided: GatherProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"GatherProgram",(function(){return o}));var s=n(/*! ./shader_compiler */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */class o{constructor(e,t){this.variableNames=["A","indices"],this.outputShape=t,this.rank=t.length;const n=Object(s.getCoordsDataType)(this.rank),o=function(e,t){const n=["resRC.x","resRC.y","resRC.z","resRC.w"],s=[];for(let t=0;t1?"strides[j]":"strides";this.userCode=`\n ${o} strides = ${o}(${this.strides});\n void main() {\n ${r} coords = getOutputCoords();\n int flattenIndex = 0;\n for (int j = 0; j < ${this.sliceDim}; j++) {\n int index = round(getIndices(coords[0], j));\n flattenIndex += index * ${i};\n }\n setOutput(getX(flattenIndex, coords[1]));\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/glsl_version.js": +/*!*******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/glsl_version.js ***! + \*******************************************************************/ +/*! exports provided: getGlslDifferences */function(e,t,n){"use strict";n.r(t),n.d(t,"getGlslDifferences",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */function o(){let e,t,n,o,r,i,a,u,d,l;return 2===Object(s.env)().getNumber("WEBGL_VERSION")?(e="#version 300 es",t="in",n="out",o="in",r="texture",i="outputColor",a="out vec4 outputColor;",u="\n bool isnan_custom(float val) {\n return (val > 0.0 || val < 0.0) ? false : val != 0.0;\n }\n\n bvec4 isnan_custom(vec4 val) {\n return bvec4(isnan_custom(val.x),\n isnan_custom(val.y), isnan_custom(val.z), isnan_custom(val.w));\n }\n\n #define isnan(value) isnan_custom(value)\n ",d="",l="\n #define round(value) newRound(value)\n int newRound(float value) {\n return int(floor(value + 0.5));\n }\n\n ivec4 newRound(vec4 value) {\n return ivec4(floor(value + vec4(0.5)));\n }\n "):(e="",t="attribute",n="varying",o="varying",r="texture2D",i="gl_FragColor",a="",u="\n #define isnan(value) isnan_custom(value)\n bool isnan_custom(float val) {\n return (val > 0. || val < 1. || val == 0.) ? false : true;\n }\n bvec4 isnan_custom(vec4 val) {\n return bvec4(isnan(val.x), isnan(val.y), isnan(val.z), isnan(val.w));\n }\n ",d="\n uniform float INFINITY;\n\n bool isinf(float val) {\n return abs(val) == INFINITY;\n }\n bvec4 isinf(vec4 val) {\n return equal(abs(val), vec4(INFINITY));\n }\n ",l="\n int round(float value) {\n return int(floor(value + 0.5));\n }\n\n ivec4 round(vec4 value) {\n return ivec4(floor(value + vec4(0.5)));\n }\n "),{version:e,attribute:t,varyingVs:n,varyingFs:o,texture2D:r,output:i,defineOutput:a,defineSpecialNaN:u,defineSpecialInf:d,defineRound:l}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/gpgpu_context.js": +/*!********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/gpgpu_context.js ***! + \********************************************************************/ +/*! exports provided: GPGPUContext, linearSearchLastTrue */function(e,t,n){"use strict";n.r(t),n.d(t,"GPGPUContext",(function(){return u})),n.d(t,"linearSearchLastTrue",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./canvas_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/canvas_util.js"),r=n(/*! ./gpgpu_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/gpgpu_util.js"),i=n(/*! ./tex_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/tex_util.js"),a=n(/*! ./webgl_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/webgl_util.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class u{constructor(e){this.outputTexture=null,this.program=null,this.disposed=!1,this.vertexAttrsAreBound=!1,this.itemsToPoll=[];const t=Object(s.env)().getNumber("WEBGL_VERSION");null!=e?(this.gl=e,Object(o.setWebGLContext)(t,e)):this.gl=Object(o.getWebGLContext)(t);let n="WEBGL_color_buffer_float";const u="EXT_color_buffer_half_float";if(1===Object(s.env)().getNumber("WEBGL_VERSION")){const e="OES_texture_float",t="OES_texture_half_float";if(this.textureFloatExtension=a.getExtensionOrThrow(this.gl,e),a.hasExtension(this.gl,t))this.textureHalfFloatExtension=a.getExtensionOrThrow(this.gl,t);else if(Object(s.env)().get("WEBGL_FORCE_F16_TEXTURES"))throw new Error("GL context does not support half float textures, yet the environment flag WEBGL_FORCE_F16_TEXTURES is set to true.");if(this.colorBufferFloatExtension=this.gl.getExtension(n),a.hasExtension(this.gl,u))this.colorBufferHalfFloatExtension=a.getExtensionOrThrow(this.gl,u);else if(Object(s.env)().get("WEBGL_FORCE_F16_TEXTURES"))throw new Error("GL context does not support color renderable half floats, yet the environment flag WEBGL_FORCE_F16_TEXTURES is set to true.")}else if(n="EXT_color_buffer_float",a.hasExtension(this.gl,n))this.colorBufferFloatExtension=this.gl.getExtension(n);else{if(!a.hasExtension(this.gl,u))throw new Error("GL context does not support color renderable floats");this.colorBufferHalfFloatExtension=this.gl.getExtension(u)}this.vertexBuffer=r.createVertexBuffer(this.gl),this.indexBuffer=r.createIndexBuffer(this.gl),this.framebuffer=a.createFramebuffer(this.gl),this.textureConfig=i.getTextureConfig(this.gl,this.textureHalfFloatExtension)}get debug(){return Object(s.env)().getBool("DEBUG")}dispose(){if(this.disposed)return;null!=this.program&&console.warn("Disposing a GPGPUContext that still has a bound WebGLProgram. This is probably a resource leak, delete the program with GPGPUContext.deleteProgram before disposing."),null!=this.outputTexture&&console.warn("Disposing a GPGPUContext that still has a bound output matrix texture. This is probably a resource leak, delete the output matrix texture with GPGPUContext.deleteMatrixTexture before disposing.");const e=this.gl;a.callAndCheck(e,(()=>e.finish())),a.callAndCheck(e,(()=>e.bindFramebuffer(e.FRAMEBUFFER,null))),a.callAndCheck(e,(()=>e.deleteFramebuffer(this.framebuffer))),a.callAndCheck(e,(()=>e.bindBuffer(e.ARRAY_BUFFER,null))),a.callAndCheck(e,(()=>e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,null))),a.callAndCheck(e,(()=>e.deleteBuffer(this.indexBuffer))),this.disposed=!0}createFloat32MatrixTexture(e,t){return this.throwIfDisposed(),r.createFloat32MatrixTexture(this.gl,e,t,this.textureConfig)}createFloat16MatrixTexture(e,t){return this.throwIfDisposed(),r.createFloat16MatrixTexture(this.gl,e,t,this.textureConfig)}createUnsignedBytesMatrixTexture(e,t){return this.throwIfDisposed(),r.createUnsignedBytesMatrixTexture(this.gl,e,t,this.textureConfig)}uploadPixelDataToTexture(e,t){this.throwIfDisposed(),r.uploadPixelDataToTexture(this.gl,e,t)}uploadDenseMatrixToTexture(e,t,n,s){this.throwIfDisposed(),r.uploadDenseMatrixToTexture(this.gl,e,t,n,s,this.textureConfig)}createFloat16PackedMatrixTexture(e,t){return this.throwIfDisposed(),r.createFloat16PackedMatrixTexture(this.gl,e,t,this.textureConfig)}createPackedMatrixTexture(e,t){return this.throwIfDisposed(),r.createPackedMatrixTexture(this.gl,e,t,this.textureConfig)}deleteMatrixTexture(e){this.throwIfDisposed(),this.outputTexture===e&&(a.unbindColorTextureFromFramebuffer(this.gl,this.framebuffer),this.outputTexture=null),a.callAndCheck(this.gl,(()=>this.gl.deleteTexture(e)))}downloadByteEncodedFloatMatrixFromOutputTexture(e,t,n){return this.downloadMatrixDriver(e,(()=>r.downloadByteEncodedFloatMatrixFromOutputTexture(this.gl,t,n,this.textureConfig)))}downloadPackedMatrixFromBuffer(e,t,n,s,o,i){return r.downloadPackedMatrixFromBuffer(this.gl,e,t,n,s,o,i,this.textureConfig)}downloadFloat32MatrixFromBuffer(e,t){return r.downloadFloat32MatrixFromBuffer(this.gl,e,t)}createBufferFromTexture(e,t,n){this.bindTextureToFrameBuffer(e);const s=r.createBufferFromOutputTexture(this.gl,t,n,this.textureConfig);return this.unbindTextureToFrameBuffer(),s}createAndWaitForFence(){const e=this.createFence(this.gl);return this.pollFence(e)}createFence(e){let t,n;if(Object(s.env)().getBool("WEBGL_FENCE_API_ENABLED")){const s=e,o=s.fenceSync(s.SYNC_GPU_COMMANDS_COMPLETE,0);e.flush(),n=()=>{const e=s.clientWaitSync(o,0,0);return e===s.ALREADY_SIGNALED||e===s.CONDITION_SATISFIED},t=o}else Object(s.env)().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")>0?(t=this.beginQuery(),this.endQuery(),n=()=>this.isQueryAvailable(t,Object(s.env)().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION"))):n=()=>!0;return{query:t,isFencePassed:n}}downloadMatrixFromPackedTexture(e,t,n){return this.downloadMatrixDriver(e,(()=>r.downloadMatrixFromPackedOutputTexture(this.gl,t,n)))}createProgram(e){this.throwIfDisposed();const t=this.gl,n=a.createFragmentShader(t,e);null==this.vertexShader&&(this.vertexShader=r.createVertexShader(t));const s=a.createProgram(t);return a.callAndCheck(t,(()=>t.attachShader(s,this.vertexShader))),a.callAndCheck(t,(()=>t.attachShader(s,n))),a.linkProgram(t,s),this.debug&&a.validateProgram(t,s),this.vertexAttrsAreBound||(this.setProgram(s),this.vertexAttrsAreBound=r.bindVertexProgramAttributeStreams(t,this.program,this.vertexBuffer)),s}deleteProgram(e){this.throwIfDisposed(),e===this.program&&(this.program=null),null!=e&&a.callAndCheck(this.gl,(()=>this.gl.deleteProgram(e)))}setProgram(e){this.throwIfDisposed(),this.program=e,null!=this.program&&this.debug&&a.validateProgram(this.gl,this.program),a.callAndCheck(this.gl,(()=>this.gl.useProgram(e)))}getUniformLocation(e,t,n=!0){return this.throwIfDisposed(),n?a.getProgramUniformLocationOrThrow(this.gl,e,t):a.getProgramUniformLocation(this.gl,e,t)}getAttributeLocation(e,t){return this.throwIfDisposed(),a.callAndCheck(this.gl,(()=>this.gl.getAttribLocation(e,t)))}getUniformLocationNoThrow(e,t){return this.throwIfDisposed(),this.gl.getUniformLocation(e,t)}setInputMatrixTexture(e,t,n){this.throwIfDisposed(),this.throwIfNoProgram(),a.bindTextureToProgramUniformSampler(this.gl,e,t,n)}setOutputMatrixTexture(e,t,n){this.setOutputMatrixTextureDriver(e,n,t)}setOutputPackedMatrixTexture(e,t,n){this.throwIfDisposed();const[s,o]=i.getPackedMatrixTextureShapeWidthHeight(t,n);this.setOutputMatrixTextureDriver(e,s,o)}setOutputMatrixWriteRegion(e,t,n,s){this.setOutputMatrixWriteRegionDriver(n,e,s,t)}setOutputPackedMatrixWriteRegion(e,t,n,s){throw new Error("setOutputPackedMatrixWriteRegion not implemented.")}debugValidate(){null!=this.program&&a.validateProgram(this.gl,this.program),a.validateFramebuffer(this.gl)}executeProgram(){this.throwIfDisposed(),this.throwIfNoProgram();const e=this.gl;this.debug&&this.debugValidate(),a.callAndCheck(e,(()=>e.drawElements(e.TRIANGLES,6,e.UNSIGNED_SHORT,0)))}blockUntilAllProgramsCompleted(){this.throwIfDisposed(),a.callAndCheck(this.gl,(()=>this.gl.finish()))}getQueryTimerExtension(){return null==this.disjointQueryTimerExtension&&(this.disjointQueryTimerExtension=a.getExtensionOrThrow(this.gl,2===Object(s.env)().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")?"EXT_disjoint_timer_query_webgl2":"EXT_disjoint_timer_query")),this.disjointQueryTimerExtension}getQueryTimerExtensionWebGL2(){return this.getQueryTimerExtension()}getQueryTimerExtensionWebGL1(){return this.getQueryTimerExtension()}beginQuery(){if(2===Object(s.env)().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")){const e=this.gl,t=this.getQueryTimerExtensionWebGL2(),n=e.createQuery();return e.beginQuery(t.TIME_ELAPSED_EXT,n),n}const e=this.getQueryTimerExtensionWebGL1(),t=e.createQueryEXT();return e.beginQueryEXT(e.TIME_ELAPSED_EXT,t),t}endQuery(){if(2===Object(s.env)().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")){const e=this.gl,t=this.getQueryTimerExtensionWebGL2();return void e.endQuery(t.TIME_ELAPSED_EXT)}const e=this.getQueryTimerExtensionWebGL1();e.endQueryEXT(e.TIME_ELAPSED_EXT)}async waitForQueryAndGetTime(e){return await s.util.repeatedTry((()=>this.disposed||this.isQueryAvailable(e,Object(s.env)().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")))),this.getQueryTime(e,Object(s.env)().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION"))}getQueryTime(e,t){if(0===t)return null;if(2===t){const t=this.gl;return t.getQueryParameter(e,t.QUERY_RESULT)/1e6}{const t=this.getQueryTimerExtensionWebGL1();return t.getQueryObjectEXT(e,t.QUERY_RESULT_EXT)/1e6}}isQueryAvailable(e,t){if(0===t)return!0;if(2===t){const t=this.gl,n=this.getQueryTimerExtensionWebGL2(),s=t.getQueryParameter(e,t.QUERY_RESULT_AVAILABLE);return null==this.disjoint&&(this.disjoint=this.gl.getParameter(n.GPU_DISJOINT_EXT)),s&&!this.disjoint}{const t=this.getQueryTimerExtensionWebGL1(),n=t.getQueryObjectEXT(e,t.QUERY_RESULT_AVAILABLE_EXT);return null==this.disjoint&&(this.disjoint=this.gl.getParameter(t.GPU_DISJOINT_EXT)),n&&!this.disjoint}}pollFence(e){return new Promise((t=>{this.addItemToPoll((()=>e.isFencePassed()),(()=>t()))}))}pollItems(){const e=d(this.itemsToPoll.map((e=>e.isDoneFn)));for(let t=0;t<=e;++t){const{resolveFn:e}=this.itemsToPoll[t];e()}this.itemsToPoll=this.itemsToPoll.slice(e+1)}addItemToPoll(e,t){this.itemsToPoll.push({isDoneFn:e,resolveFn:t}),this.itemsToPoll.length>1||s.util.repeatedTry((()=>(this.pollItems(),0===this.itemsToPoll.length)))}bindTextureToFrameBuffer(e){this.throwIfDisposed(),a.bindColorTextureToFramebuffer(this.gl,e,this.framebuffer),this.debug&&a.validateFramebuffer(this.gl)}unbindTextureToFrameBuffer(){null!=this.outputTexture?(a.bindColorTextureToFramebuffer(this.gl,this.outputTexture,this.framebuffer),this.debug&&a.validateFramebuffer(this.gl)):a.unbindColorTextureFromFramebuffer(this.gl,this.framebuffer)}downloadMatrixDriver(e,t){this.bindTextureToFrameBuffer(e);const n=t();return this.unbindTextureToFrameBuffer(),n}setOutputMatrixTextureDriver(e,t,n){this.throwIfDisposed();const s=this.gl;a.bindColorTextureToFramebuffer(s,e,this.framebuffer),this.debug&&a.validateFramebuffer(s),this.outputTexture=e,a.callAndCheck(s,(()=>s.viewport(0,0,t,n))),a.callAndCheck(s,(()=>s.scissor(0,0,t,n)))}setOutputMatrixWriteRegionDriver(e,t,n,s){this.throwIfDisposed(),a.callAndCheck(this.gl,(()=>this.gl.scissor(e,t,n,s)))}throwIfDisposed(){if(this.disposed)throw new Error("Attempted to use disposed GPGPUContext.")}throwIfNoProgram(){if(null==this.program)throw new Error("No GPU program is currently set.")}}function d(e){let t=0;for(;t{const s={logicalShape:e.shape,texShape:e.isUniform?null:e.texData.texShape,isUniform:e.isUniform,isPacked:!e.isUniform&&e.texData.isPacked,flatOffset:null};return null!=e.texData&&null!=e.texData.slice&&e.texData.slice.flatOffset>0&&(s.flatOffset=e.texData.slice.flatOffset),{name:t.variableNames[n],shapeInfo:s}})),a=i.map((e=>e.shapeInfo)),u={logicalShape:r.shape,texShape:r.texData.texShape,isUniform:!1,isPacked:r.texData.isPacked,flatOffset:null},d=o.makeShader(i,u,t),l=e.createProgram(d);let c=null;const f=e.getUniformLocation(l,"NAN",!1);1===Object(s.env)().getNumber("WEBGL_VERSION")&&(c=e.getUniformLocation(l,"INFINITY",!1));const p=!1,m={},h={},b={};for(let n=0;n{_[n]=e.getUniformLocation(l,t.name,p)})),{program:t,source:d,webGLProgram:l,uniformLocations:m,customUniformLocations:_,inShapeInfos:a,outShapeInfo:u,infLoc:c,nanLoc:f,inShapesLocations:h,inTexShapesLocations:b,outShapeLocation:j,outShapeStridesLocation:w,outTexShapeLocation:g}}function i(e,t){if(e.length!==t.length)throw Error(`Binary was compiled with ${e.length} inputs, but was executed with ${t.length} inputs`);e.forEach(((e,n)=>{const o=e.logicalShape,r=t[n],i=r.shape;if(!s.util.arraysEqual(o,i))throw Error(`Binary was compiled with different shapes than the current args. Shapes ${o} and ${i} must match`);if(e.isUniform&&r.isUniform)return;const a=e.texShape,u=r.isUniform?null:r.texData.texShape;if(!s.util.arraysEqual(a,u))throw Error(`Binary was compiled with different texture shapes than the current args. Shape ${a} and ${u} must match`)}))}function a(e,t,n,r,a){t.program.enableShapeUniforms||(i(t.inShapeInfos,n),i([t.outShapeInfo],[r]));const u=r.texData.texture,d=r.texData.texShape;r.texData.isPacked?e.setOutputPackedMatrixTexture(u,d[0],d[1]):e.setOutputMatrixTexture(u,d[0],d[1]),e.setProgram(t.webGLProgram),1===Object(s.env)().getNumber("WEBGL_VERSION")&&null!==t.infLoc&&e.gl.uniform1f(t.infLoc,1/0),null!==t.nanLoc&&e.gl.uniform1f(t.nanLoc,NaN),n.forEach(((n,r)=>{const i=t.program.variableNames[r],a=t.uniformLocations[i],u=t.uniformLocations[`offset${i}`],d=t.inShapesLocations[`${i}Shape`],l=t.inTexShapesLocations[`${i}TexShape`];if(d){const{uniformShape:s}=o.getUniformInfoFromShape(t.program.packedInputs,n.shape,n.texData.texShape);switch(s.length){case 1:e.gl.uniform1iv(d,new Int32Array(s));break;case 2:e.gl.uniform2iv(d,new Int32Array(s));break;case 3:e.gl.uniform3iv(d,new Int32Array(s));break;case 4:e.gl.uniform4iv(d,new Int32Array(s))}}if(l&&e.gl.uniform2i(l,n.texData.texShape[0],n.texData.texShape[1]),null!=a)if(n.isUniform)if(s.util.sizeFromShape(n.shape)<2)e.gl.uniform1f(a,n.uniformValues[0]);else{let t=n.uniformValues;t instanceof Float32Array||(t=new Float32Array(t)),e.gl.uniform1fv(a,t)}else null!=n.texData.slice&&null!=u&&e.gl.uniform1i(u,n.texData.slice.flatOffset),e.setInputMatrixTexture(n.texData.texture,a,r)}));const l=t.outShapeLocation;if(l)switch(r.shape.length){case 1:e.gl.uniform1iv(l,new Int32Array(r.shape));break;case 2:e.gl.uniform2iv(l,new Int32Array(r.shape));break;case 3:e.gl.uniform3iv(l,new Int32Array(r.shape));break;case 4:e.gl.uniform4iv(l,new Int32Array(r.shape))}if(t.outShapeStridesLocation){const n=s.util.computeStrides(r.shape);switch(r.shape.length){case 2:e.gl.uniform1iv(t.outShapeStridesLocation,new Int32Array(n));break;case 3:e.gl.uniform2iv(t.outShapeStridesLocation,new Int32Array(n));break;case 4:e.gl.uniform3iv(t.outShapeStridesLocation,new Int32Array(n))}}t.outTexShapeLocation&&e.gl.uniform2i(t.outTexShapeLocation,r.texData.texShape[0],r.texData.texShape[1]),t.program.customUniforms&&a&&t.program.customUniforms.forEach(((n,s)=>{const o=t.customUniformLocations[s],r=a[s];if("float"===n.type)e.gl.uniform1fv(o,r);else if("vec2"===n.type)e.gl.uniform2fv(o,r);else if("vec3"===n.type)e.gl.uniform3fv(o,r);else if("vec4"===n.type)e.gl.uniform4fv(o,r);else if("int"===n.type)e.gl.uniform1iv(o,r);else if("ivec2"===n.type)e.gl.uniform2iv(o,r);else if("ivec3"===n.type)e.gl.uniform3iv(o,r);else{if("ivec4"!==n.type)throw Error(`uniform type ${n.type} is not supported yet.`);e.gl.uniform4iv(o,r)}})),e.executeProgram()}function u(e,t,n){let r="";t.concat(n).forEach((t=>{const i=null!=t.texData&&null!=t.texData.slice&&t.texData.slice.flatOffset>0;if(e.enableShapeUniforms&&!t.isUniform){const a=t.texData.texShape,{useSqueezeShape:u,uniformShape:d,keptDims:l}=o.getUniformInfoFromShape(e.packedInputs,t.shape,a);let c="",f="",p="";if(1===d.length&&e.packedInputs){const e=[Math.ceil(a[0]/2),Math.ceil(a[1]/2)];c=`${e[0]>1}_${e[1]>1}`}else if(2!==d.length||e.packedInputs){if(d.length>2&&!e.packedInputs){const e=s.util.computeStrides(d);p=`${e[0]===a[1]}_${e[e.length-1]===a[1]}`}}else f=`${d[0]>1}_${d[1]>1}`;const m=t.shape.length,h=2===d.length&&s.util.arraysEqual(t.shape,a),b=1===s.util.sizeFromShape(t.shape),j=s.backend_util.getBroadcastDims(t.shape,n.shape),g=!e.packedInputs&&m===n.shape.length&&s.util.arraysEqual(a,n.texData.texShape),w=e.packedInputs||d.length>2?"":`${a[0]>1}_${a[1]>1}`;r+=`${m}_${g}_${u?l:""}_${d.length}_${b}_${j}_${h}_${c}_${f}_${p}_${w}_${i}`}else{const e=t.isUniform?"uniform":t.texData.texShape;r+=`${t.shape}_${e}_${i}`}}));const i=e.userCode;let a=e.constructor.name;return a+="_"+r+"_"+i+`${Object(s.env)().getNumber("WEBGL_VERSION")}`,a}function d(e){return Object(s.env)().getBool("WEBGL_USE_SHAPES_UNIFORMS")&&e<=4}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/gpgpu_util.js": +/*!*****************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/gpgpu_util.js ***! + \*****************************************************************/ +/*! exports provided: createVertexShader, createVertexBuffer, createIndexBuffer, getInternalFormatForFloat32MatrixTexture, createFloat32MatrixTexture, getInternalFormatForFloat16MatrixTexture, createFloat16MatrixTexture, getInternalFormatForUnsignedBytesMatrixTexture, createUnsignedBytesMatrixTexture, getInternalFormatForPackedMatrixTexture, createPackedMatrixTexture, getInternalFormatForFloat16PackedMatrixTexture, createFloat16PackedMatrixTexture, bindVertexProgramAttributeStreams, uploadDenseMatrixToTexture, uploadPixelDataToTexture, createBufferFromOutputTexture, downloadFloat32MatrixFromBuffer, downloadByteEncodedFloatMatrixFromOutputTexture, downloadPackedMatrixFromBuffer, downloadMatrixFromPackedOutputTexture */function(e,t,n){"use strict";n.r(t),n.d(t,"createVertexShader",(function(){return i})),n.d(t,"createVertexBuffer",(function(){return a})),n.d(t,"createIndexBuffer",(function(){return u})),n.d(t,"getInternalFormatForFloat32MatrixTexture",(function(){return l})),n.d(t,"createFloat32MatrixTexture",(function(){return c})),n.d(t,"getInternalFormatForFloat16MatrixTexture",(function(){return f})),n.d(t,"createFloat16MatrixTexture",(function(){return p})),n.d(t,"getInternalFormatForUnsignedBytesMatrixTexture",(function(){return m})),n.d(t,"createUnsignedBytesMatrixTexture",(function(){return h})),n.d(t,"getInternalFormatForPackedMatrixTexture",(function(){return b})),n.d(t,"createPackedMatrixTexture",(function(){return j})),n.d(t,"getInternalFormatForFloat16PackedMatrixTexture",(function(){return g})),n.d(t,"createFloat16PackedMatrixTexture",(function(){return w})),n.d(t,"bindVertexProgramAttributeStreams",(function(){return _})),n.d(t,"uploadDenseMatrixToTexture",(function(){return k})),n.d(t,"uploadPixelDataToTexture",(function(){return v})),n.d(t,"createBufferFromOutputTexture",(function(){return x})),n.d(t,"downloadFloat32MatrixFromBuffer",(function(){return y})),n.d(t,"downloadByteEncodedFloatMatrixFromOutputTexture",(function(){return O})),n.d(t,"downloadPackedMatrixFromBuffer",(function(){return I})),n.d(t,"downloadMatrixFromPackedOutputTexture",(function(){return C}));var s=n(/*! ./glsl_version */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/glsl_version.js"),o=n(/*! ./tex_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/tex_util.js"),r=n(/*! ./webgl_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/webgl_util.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e){const t=Object(s.getGlslDifferences)(),n=`${t.version}\n precision highp float;\n ${t.attribute} vec3 clipSpacePos;\n ${t.attribute} vec2 uv;\n ${t.varyingVs} vec2 resultUV;\n\n void main() {\n gl_Position = vec4(clipSpacePos, 1);\n resultUV = uv;\n }`;return r.createVertexShader(e,n)}function a(e){const t=new Float32Array([-1,1,0,0,1,-1,-1,0,0,0,1,1,0,1,1,1,-1,0,1,0]);return r.createStaticVertexBuffer(e,t)}function u(e){const t=new Uint16Array([0,1,2,2,1,3]);return r.createStaticIndexBuffer(e,t)}function d(e,t,n,s,o,i){r.validateTextureSize(t,n);const a=r.createTexture(e),u=e.TEXTURE_2D;return r.callAndCheck(e,(()=>e.bindTexture(u,a))),r.callAndCheck(e,(()=>e.texParameteri(u,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE))),r.callAndCheck(e,(()=>e.texParameteri(u,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE))),r.callAndCheck(e,(()=>e.texParameteri(u,e.TEXTURE_MIN_FILTER,e.NEAREST))),r.callAndCheck(e,(()=>e.texParameteri(u,e.TEXTURE_MAG_FILTER,e.NEAREST))),r.callAndCheck(e,(()=>e.texImage2D(u,0,s,t,n,0,o,i,null))),r.callAndCheck(e,(()=>e.bindTexture(e.TEXTURE_2D,null))),a}function l(e){return e.internalFormatFloat}function c(e,t,n,s){const[r,i]=o.getUnpackedMatrixTextureShapeWidthHeight(t,n);return d(e,r,i,l(s),s.textureFormatFloat,e.FLOAT)}function f(e){return e.internalFormatHalfFloat}function p(e,t,n,s){const[r,i]=o.getUnpackedMatrixTextureShapeWidthHeight(t,n);return d(e,r,i,f(s),s.textureFormatFloat,s.textureTypeHalfFloat)}function m(e){return e.downloadTextureFormat}function h(e,t,n,s){const[r,i]=o.getUnpackedMatrixTextureShapeWidthHeight(t,n);return d(e,r,i,m(s),e.RGBA,e.UNSIGNED_BYTE)}function b(e){return e.internalFormatPackedFloat}function j(e,t,n,s){const[r,i]=o.getPackedMatrixTextureShapeWidthHeight(t,n);return d(e,r,i,b(s),e.RGBA,e.FLOAT)}function g(e){return e.internalFormatPackedHalfFloat}function w(e,t,n,s){const[r,i]=o.getPackedMatrixTextureShapeWidthHeight(t,n);return d(e,r,i,g(s),e.RGBA,s.textureTypeHalfFloat)}function _(e,t,n){r.callAndCheck(e,(()=>e.bindBuffer(e.ARRAY_BUFFER,n)));return r.bindVertexBufferToProgramAttribute(e,t,"clipSpacePos",n,3,20,0)&&r.bindVertexBufferToProgramAttribute(e,t,"uv",n,2,20,12)}function k(e,t,n,s,o,i){let a,u,d;r.callAndCheck(e,(()=>e.bindTexture(e.TEXTURE_2D,t))),o instanceof Uint8Array?(a=new Uint8Array(n*s*4),u=e.UNSIGNED_BYTE,d=e.RGBA):(a=new Float32Array(n*s*4),u=e.FLOAT,d=i.internalFormatPackedFloat),a.set(o),r.callAndCheck(e,(()=>e.texImage2D(e.TEXTURE_2D,0,d,n,s,0,e.RGBA,u,a))),r.callAndCheck(e,(()=>e.bindTexture(e.TEXTURE_2D,null)))}function v(e,t,n){r.callAndCheck(e,(()=>e.bindTexture(e.TEXTURE_2D,t))),n.data instanceof Uint8Array?r.callAndCheck(e,(()=>e.texImage2D(e.TEXTURE_2D,0,e.RGBA,n.width,n.height,0,e.RGBA,e.UNSIGNED_BYTE,n.data))):r.callAndCheck(e,(()=>e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,n))),r.callAndCheck(e,(()=>e.bindTexture(e.TEXTURE_2D,null)))}function x(e,t,n,s){const o=e.createBuffer();r.callAndCheck(e,(()=>e.bindBuffer(e.PIXEL_PACK_BUFFER,o)));const i=16*t*n;return r.callAndCheck(e,(()=>e.bufferData(e.PIXEL_PACK_BUFFER,i,e.STREAM_READ))),r.callAndCheck(e,(()=>e.readPixels(0,0,n,t,e.RGBA,e.FLOAT,0))),r.callAndCheck(e,(()=>e.bindBuffer(e.PIXEL_PACK_BUFFER,null))),o}function y(e,t,n){const s=e,o=new Float32Array(n);return s.bindBuffer(s.PIXEL_PACK_BUFFER,t),s.getBufferSubData(s.PIXEL_PACK_BUFFER,0,o),s.bindBuffer(s.PIXEL_PACK_BUFFER,null),o}function O(e,t,n,s){const[i,a]=o.getUnpackedMatrixTextureShapeWidthHeight(t,n),u=new Uint8Array(o.getUnpackedArraySizeFromMatrixSize(t*n,4));return r.callAndCheck(e,(()=>e.readPixels(0,0,i,a,s.downloadTextureFormat,e.UNSIGNED_BYTE,u))),new Float32Array(u.buffer)}function I(e,t,n,s,r,i,a,u){const d=e,l=new Float32Array(o.getPackedRGBAArraySizeFromMatrixShape(i,a));return d.bindBuffer(d.PIXEL_PACK_BUFFER,t),d.getBufferSubData(d.PIXEL_PACK_BUFFER,0,l),d.bindBuffer(d.PIXEL_PACK_BUFFER,null),l}function C(e,t,n){const s=new Float32Array(t*n*4);return r.callAndCheck(e,(()=>e.readPixels(0,0,n,t,e.RGBA,e.FLOAT,s))),s}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/im2col_packed_gpu.js": +/*!************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/im2col_packed_gpu.js ***! + \************************************************************************/ +/*! exports provided: Im2ColPackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"Im2ColPackedProgram",(function(){return r}));var s=n(/*! ./glsl_version */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/glsl_version.js"),o=n(/*! ./gpgpu_math */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/gpgpu_math.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class r{constructor(e,t){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,this.customUniforms=[{name:"inputShape",type:"ivec3"},{name:"pad",type:"ivec2"},{name:"stride",type:"ivec2"},{name:"dilation",type:"ivec2"},{name:"inChannels",type:"int"},{name:"itemsPerBlockRow",type:"int"},{name:"outWidth",type:"int"}],this.outputShape=e,this.enableShapeUniforms=Object(o.useShapeUniforms)(this.outputShape.length);const{dataFormat:n}=t,r=Object(s.getGlslDifferences)(),i="channelsLast"===n,a=i?0:1,u=i?1:2,d=this.enableShapeUniforms?"if(blockIndex < outShape[1] && pos < outShape[0]) {":`if(blockIndex < ${e[1]} && pos < ${e[0]}) {`;let l="";for(let e=0;e<=1;e++)for(let t=0;t<=1;t++)l+=`\n blockIndex = rc.y + ${t};\n pos = rc.x + ${e};\n\n ${d}\n offsetY = int(blockIndex / outWidth) * stride[0] - pad[0];\n d0 = offsetY + dilation[0] * (pos / itemsPerBlockRow);\n\n if(d0 < inputShape[${a}] && d0 >= 0) {\n // Use custom imod instead mod. On Intel GPU, mod may generate\n // unexpected value.\n // https://github.com/tensorflow/tfjs/issues/5447\n offsetX = imod(blockIndex, outWidth) * stride[1] - pad[1];\n d1 = offsetX + dilation[1] * (imod(pos, itemsPerBlockRow) /\n inChannels);\n\n if(d1 < inputShape[${u}] && d1 >= 0) {\n\n ch = imod(pos, inChannels);\n\n if (${i}) {\n innerDims = vec2(d1, ch);\n result[${2*e+t}] = getChannel(\n getA(d0, int(innerDims.x),\n int(innerDims.y)), innerDims);\n } else {\n innerDims = vec2(d0, d1);\n result[${2*e+t}] = getChannel(\n getA(ch, int(innerDims.x),\n int(innerDims.y)), innerDims);\n }\n }\n }\n }\n `;this.userCode=`\n void main() {\n ivec2 rc = getOutputCoords();\n\n vec4 result = vec4(0);\n\n int blockIndex, pos, offsetY, d0, offsetX, d1, ch;\n vec2 innerDims;\n\n ${l}\n\n ${r.output} = result;\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/index.js": +/*!************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/index.js ***! + \************************************************************/ +/*! exports provided: version_webgl, MathBackendWebGL, setWebGLContext, GPGPUContext, gpgpu_util, webgl_util, forceHalfFloat, webgl */function(e,t,n){"use strict";n.r(t);var s=n(/*! ./base */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/base.js");n.d(t,"version_webgl",(function(){return s.version_webgl})),n.d(t,"MathBackendWebGL",(function(){return s.MathBackendWebGL})),n.d(t,"setWebGLContext",(function(){return s.setWebGLContext})),n.d(t,"GPGPUContext",(function(){return s.GPGPUContext})),n.d(t,"gpgpu_util",(function(){return s.gpgpu_util})),n.d(t,"webgl_util",(function(){return s.webgl_util})),n.d(t,"forceHalfFloat",(function(){return s.forceHalfFloat})),n.d(t,"webgl",(function(){return s.webgl}));n(/*! ./register_all_kernels */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/register_all_kernels.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/arg_min_max.js": +/*!*******************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/arg_min_max.js ***! + \*******************************************************************************/ +/*! exports provided: argMinMaxReduce */function(e,t,n){"use strict";n.r(t),n.d(t,"argMinMaxReduce",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../argminmax_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/argminmax_gpu.js"),r=n(/*! ../argminmax_packed_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/argminmax_packed_gpu.js"),i=n(/*! ../kernels/Reshape */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function a(e,t,n,r=null){let i=t.shape[0],u=t.shape[1];null!=r&&(i=r.shape[0],u=r.shape[1]);const d=s.backend_util.computeOptimalWindowSize(u),l={windowSize:d,inSize:u,batchSize:i,outSize:Math.ceil(u/d)},c=new o.ArgMinMaxProgram(l,n,null==r),f=[t];null!=r&&f.push(r);const p=e.runWebGLProgram(c,f,"int32");if(1===p.shape[1])return p;const m=a(e,t,n,p);return e.disposeIntermediateTensorInfo(p),m}function u(e,t,n,o=null){const i=null!=o?o.shape:t.shape,a=i[i.length-1],d=s.backend_util.computeOptimalWindowSize(a),l=new r.ArgMinMaxPackedProgram(i,d,n,null==o),c=null==o?[t]:[t,o],f=e.runWebGLProgram(l,c,"int32");if(f.shape.length===t.shape.length){const s=u(e,t,n,f);return e.disposeIntermediateTensorInfo(f),s}return f}function d(e,t,n,o){const r=[n];if(s.backend_util.assertAxesAreInnerMostDims("arg"+o.charAt(0).toUpperCase()+o.slice(1),r,t.shape.length),!Object(s.env)().getBool("WEBGL_PACK_REDUCE")||t.shape.length<=2){const n=[],u=e.texData.get(t.dataId);let d=t;null!==u&&u.isPacked&&(d=e.unpackTensor(t),n.push(d));const[l,c]=s.backend_util.computeOutAndReduceShapes(d.shape,r),f=s.util.sizeFromShape(c),p=Object(i.reshape)({inputs:{x:d},backend:e,attrs:{shape:[-1,f]}});n.push(p);const m=a(e,p,o);n.push(m);const h=Object(i.reshape)({inputs:{x:m},backend:e,attrs:{shape:l}});return n.forEach((t=>e.disposeIntermediateTensorInfo(t))),h}return u(e,t,o)}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/int.js": +/*!***********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/int.js ***! + \***********************************************************************/ +/*! exports provided: int */function(e,t,n){"use strict";n.r(t),n.d(t,"int",(function(){return o}));var s=n(/*! ../unaryop_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/unaryop_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */function o(e,t){const n=new s.UnaryOpProgram(e.shape,"return float(int(x));"),o=t.runWebGLProgram(n,[e],"int32");return{dataId:o.dataId,shape:o.shape,dtype:o.dtype}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js": +/*!**************************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js ***! + \**************************************************************************************/ +/*! exports provided: CHECK_NAN_SNIPPET_UNARY, CHECK_NAN_SNIPPET_BINARY, CHECK_NAN_SNIPPET_BINARY_PACKED, unaryKernelFunc, binaryKernelFunc, mapActivationToShaderProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"CHECK_NAN_SNIPPET_UNARY",(function(){return c})),n.d(t,"CHECK_NAN_SNIPPET_BINARY",(function(){return f})),n.d(t,"CHECK_NAN_SNIPPET_BINARY_PACKED",(function(){return p})),n.d(t,"unaryKernelFunc",(function(){return m})),n.d(t,"binaryKernelFunc",(function(){return h})),n.d(t,"mapActivationToShaderProgram",(function(){return b}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../binaryop_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/binaryop_gpu.js"),r=n(/*! ../binaryop_packed_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/binaryop_packed_gpu.js"),i=n(/*! ../kernels/Complex */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Complex.js"),a=n(/*! ../kernels/LeakyRelu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/LeakyRelu.js"),u=n(/*! ../kernels/Prelu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Prelu.js"),d=n(/*! ../unaryop_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/unaryop_gpu.js"),l=n(/*! ../unaryop_packed_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/unaryop_packed_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const c="if (isnan(x)) return x;",f="\n if (isnan(a)) return a;\n if (isnan(b)) return b;\n",p="\n result.r = isNaN.r > 0. ? NAN : result.r;\n result.g = isNaN.g > 0. ? NAN : result.g;\n result.b = isNaN.b > 0. ? NAN : result.b;\n result.a = isNaN.a > 0. ? NAN : result.a;\n";function m({opSnippet:e,packedOpSnippet:t,cpuKernelImpl:n,dtype:o}){return({inputs:r,backend:i})=>{const{x:a}=r,u=i,c=o||a.dtype;if(u.shouldExecuteOnCPU([a])&&null!=n){const e=u.texData.get(a.dataId),t=n(e.values,c);return u.makeTensorInfo(a.shape,c,t)}let f;return f=Object(s.env)().getBool("WEBGL_PACK_UNARY_OPERATIONS")&&null!=t?new l.UnaryOpPackedProgram(a.shape,t):new d.UnaryOpProgram(a.shape,e),u.runWebGLProgram(f,[a],c)}}function h({opSnippet:e,packedOpSnippet:t,checkOutOfBounds:n=!1,supportsComplex:a=!1,cpuKernelImpl:u,dtype:d}){return({inputs:l,backend:c})=>{const{a:f,b:p}=l,m=c;if(a&&"complex64"===f.dtype){const t=m.texData.get(f.dataId),n=m.texData.get(p.dataId),[r,a]=[[t.complexTensorInfos.real,n.complexTensorInfos.real],[t.complexTensorInfos.imag,n.complexTensorInfos.imag]].map((t=>{const[n,r]=t,i={dataId:n.dataId,dtype:n.dtype,shape:f.shape},a={dataId:r.dataId,dtype:r.dtype,shape:p.shape},u=new o.BinaryOpProgram(e,f.shape,p.shape);return m.runWebGLProgram(u,[i,a],Object(s.upcastType)(n.dtype,r.dtype))})),u=Object(i.complex)({inputs:{real:r,imag:a},backend:m});return m.disposeIntermediateTensorInfo(r),m.disposeIntermediateTensorInfo(a),u}const h=d||Object(s.upcastType)(f.dtype,p.dtype);if(("string"===f.dtype||"string"===p.dtype||m.shouldExecuteOnCPU([f,p]))&&null!=u){const e=m.texData.get(f.dataId).values,t=m.texData.get(p.dataId).values,n="string"===f.dtype?s.backend_util.fromUint8ToStringArray(e):e,o="string"===f.dtype?s.backend_util.fromUint8ToStringArray(t):t,[r,i]=u(f.shape,p.shape,n,o,h),a=m.makeTensorInfo(i,h);return m.texData.get(a.dataId).values=r,a}let b;return b=Object(s.env)().getBool("WEBGL_PACK_BINARY_OPERATIONS")&&null!=t?new r.BinaryOpPackedProgram(t,f.shape,p.shape,n):new o.BinaryOpProgram(e,f.shape,p.shape),m.runWebGLProgram(b,[f,p],h)}}function b(e,t=!1){if("linear"===e)return t?l.LINEAR:d.LINEAR;if("relu"===e)return t?l.RELU:d.RELU;if("elu"===e)return t?l.ELU:d.ELU;if("relu6"===e)return t?l.RELU6:d.RELU6;if("prelu"===e)return t?u.PRELU_PACKED:u.PRELU;if("leakyrelu"===e)return t?a.LEAKYRELU_PACKED:a.LEAKYRELU;if("sigmoid"===e)return t?l.SIGMOID:d.SIGMOID;throw new Error(`Activation ${e} has not been implemented for the WebGL backend.`)}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/reduce.js": +/*!**************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/reduce.js ***! + \**************************************************************************/ +/*! exports provided: reduce */function(e,t,n){"use strict";n.r(t),n.d(t,"reduce",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../mean_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/mean_gpu.js"),r=n(/*! ../reduce_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/reduce_gpu.js");function i(e,t,n,i){const a= +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){const t=[];for(;0===t.length||1!==t[t.length-1].outSize;){const n=t.length?t[t.length-1].outSize:e[1],o=s.backend_util.computeOptimalWindowSize(n);t.push({inSize:n,windowSize:o,outSize:Math.ceil(n/o)})}return t}(e.shape);let u=e;for(let s=0;s 1.) {\n return NAN;\n }\n return acos(x);\n",i=Object(o.unaryKernelFunc)({opSnippet:r}),a={kernelName:s.Acos,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Acosh.js": +/*!********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Acosh.js ***! + \********************************************************************/ +/*! exports provided: acosh, acoshConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"acosh",(function(){return i})),n.d(t,"acoshConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=n(/*! ../unaryop_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/unaryop_gpu.js").CHECK_NAN_SNIPPET+"\n if (x < 1.0) return NAN;\nreturn log(x + sqrt(x * x - 1.0));",i=Object(o.unaryKernelFunc)({opSnippet:r}),a={kernelName:s.Acosh,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Add.js": +/*!******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Add.js ***! + \******************************************************************/ +/*! exports provided: addKernelFunc, addConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"addKernelFunc",(function(){return a})),n.d(t,"addConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),r=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i="return a + b;",a=Object(o.binaryKernelFunc)({opSnippet:i,packedOpSnippet:i,supportsComplex:!0,cpuKernelImpl:r.addImplCPU}),u={kernelName:s.Add,backendName:"webgl",kernelFunc:a}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/AddN.js": +/*!*******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/AddN.js ***! + \*******************************************************************/ +/*! exports provided: addN, addNConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"addN",(function(){return a})),n.d(t,"addNConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../addn_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/addn_gpu.js"),r=n(/*! ../addn_packed_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/addn_packed_gpu.js"),i=n(/*! ./Identity */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Identity.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function a(e){const{inputs:t,backend:n}=e,u=t;if(1===u.length)return Object(i.identity)({inputs:{x:u[0]},backend:n});if(u.length>Object(s.env)().get("WEBGL_MAX_TEXTURES_IN_SHADER")){const e=Math.floor(u.length/2),t=a({inputs:u.slice(0,e),backend:n}),s=a({inputs:u.slice(e),backend:n});return a({inputs:[t,s],backend:n})}const d=u.map((e=>e.dtype)).reduce(((e,t)=>Object(s.upcastType)(e,t))),l=u.map((e=>e.shape)),c=Object(s.env)().getBool("WEBGL_PACK")?new r.AddNPackedProgram(u[0].shape,l):new o.AddNProgram(u[0].shape,l);return n.runWebGLProgram(c,u,d)}const u={kernelName:s.AddN,backendName:"webgl",kernelFunc:a}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/All.js": +/*!******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/All.js ***! + \******************************************************************/ +/*! exports provided: all, allConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"all",(function(){return a})),n.d(t,"allConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/reduce */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/reduce.js"),r=n(/*! ./Reshape */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"),i=n(/*! ./Transpose */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:u}=t,{axis:d,keepDims:l}=a,c=u.shape.length,f=s.util.parseAxisParam(d,u.shape);let p=f;const m=s.backend_util.getAxesPermutation(p,c);let h=u;null!=m&&(h=Object(i.transpose)({inputs:{x:u},backend:n,attrs:{perm:m}}),p=s.backend_util.getInnerMostAxes(p.length,c)),s.backend_util.assertAxesAreInnerMostDims("all",p,c);const[b,j]=s.backend_util.computeOutAndReduceShapes(h.shape,p),g=s.util.sizeFromShape(j),w=Object(r.reshape)({inputs:{x:h},backend:n,attrs:{shape:[-1,g]}}),_=Object(o.reduce)(w,w.dtype,"all",n);let k;if(l){const e=s.backend_util.expandShapeToKeepDim(b,f);k=Object(r.reshape)({inputs:{x:_},backend:n,attrs:{shape:e}})}else k=Object(r.reshape)({inputs:{x:_},backend:n,attrs:{shape:b}});return n.disposeIntermediateTensorInfo(w),n.disposeIntermediateTensorInfo(_),null!=m&&n.disposeIntermediateTensorInfo(h),k}const u={kernelName:s.All,backendName:"webgl",kernelFunc:a}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Any.js": +/*!******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Any.js ***! + \******************************************************************/ +/*! exports provided: any, anyConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"any",(function(){return a})),n.d(t,"anyConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/reduce */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/reduce.js"),r=n(/*! ./Reshape */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"),i=n(/*! ./Transpose */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:u}=t,{axis:d,keepDims:l}=a,c=u.shape.length,f=s.util.parseAxisParam(d,u.shape);let p=f;const m=s.backend_util.getAxesPermutation(p,c);let h=u;null!=m&&(h=Object(i.transpose)({inputs:{x:u},backend:n,attrs:{perm:m}}),p=s.backend_util.getInnerMostAxes(p.length,c)),s.backend_util.assertAxesAreInnerMostDims("any",p,c);const[b,j]=s.backend_util.computeOutAndReduceShapes(h.shape,p),g=s.util.sizeFromShape(j),w=Object(r.reshape)({inputs:{x:h},backend:n,attrs:{shape:[-1,g]}}),_=Object(o.reduce)(w,w.dtype,"any",n);let k;if(l){const e=s.backend_util.expandShapeToKeepDim(b,f);k=Object(r.reshape)({inputs:{x:_},backend:n,attrs:{shape:e}})}else k=Object(r.reshape)({inputs:{x:_},backend:n,attrs:{shape:b}});return n.disposeIntermediateTensorInfo(w),n.disposeIntermediateTensorInfo(_),null!=m&&n.disposeIntermediateTensorInfo(h),k}const u={kernelName:s.Any,backendName:"webgl",kernelFunc:a}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/ArgMax.js": +/*!*********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/ArgMax.js ***! + \*********************************************************************/ +/*! exports provided: argMax, argMaxConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"argMax",(function(){return i})),n.d(t,"argMaxConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/arg_min_max */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/arg_min_max.js"),r=n(/*! ./Transpose */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e){const{inputs:t,backend:n,attrs:i}=e,{x:a}=t,{axis:u}=i;let d=s.util.parseAxisParam(u,a.shape);const l=s.backend_util.getAxesPermutation(d,a.shape.length);let c=a;const f=[];null!=l&&(c=Object(r.transpose)({inputs:{x:a},backend:n,attrs:{perm:l}}),f.push(c),d=s.backend_util.getInnerMostAxes(d.length,c.shape.length)),s.backend_util.assertAxesAreInnerMostDims("argMax",[d[0]],c.shape.length);const p=Object(o.argMinMaxReduce)(n,c,d[0],"max");return f.forEach((e=>n.disposeIntermediateTensorInfo(e))),p}const a={kernelName:s.ArgMax,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/ArgMin.js": +/*!*********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/ArgMin.js ***! + \*********************************************************************/ +/*! exports provided: argMin, argMinConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"argMin",(function(){return i})),n.d(t,"argMinConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/arg_min_max */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/arg_min_max.js"),r=n(/*! ./Transpose */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e){const{inputs:t,backend:n,attrs:i}=e,{x:a}=t,{axis:u}=i;let d=s.util.parseAxisParam(u,a.shape);const l=s.backend_util.getAxesPermutation(d,a.shape.length);let c=a;const f=[];null!=l&&(c=Object(r.transpose)({inputs:{x:a},backend:n,attrs:{perm:l}}),f.push(c),d=s.backend_util.getInnerMostAxes(d.length,c.shape.length)),s.backend_util.assertAxesAreInnerMostDims("argMin",[d[0]],c.shape.length);const p=Object(o.argMinMaxReduce)(n,c,d[0],"min");return f.forEach((e=>n.disposeIntermediateTensorInfo(e))),p}const a={kernelName:s.ArgMin,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Asin.js": +/*!*******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Asin.js ***! + \*******************************************************************/ +/*! exports provided: asin, asinConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"asin",(function(){return i})),n.d(t,"asinConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=n(/*! ../unaryop_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/unaryop_gpu.js").CHECK_NAN_SNIPPET+"\n if (abs(x) > 1.) {\n return NAN;\n }\n return asin(x);\n",i=Object(o.unaryKernelFunc)({opSnippet:r}),a={kernelName:s.Asin,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Asinh.js": +/*!********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Asinh.js ***! + \********************************************************************/ +/*! exports provided: asinh, asinhConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"asinh",(function(){return i})),n.d(t,"asinhConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=n(/*! ../unaryop_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/unaryop_gpu.js").CHECK_NAN_SNIPPET+"return log(x + sqrt(x * x + 1.0));",i=Object(o.unaryKernelFunc)({opSnippet:r}),a={kernelName:s.Asinh,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Atan.js": +/*!*******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Atan.js ***! + \*******************************************************************/ +/*! exports provided: atan, atanConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"atan",(function(){return i})),n.d(t,"atanConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=n(/*! ../unaryop_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/unaryop_gpu.js").CHECK_NAN_SNIPPET+"\n return atan(x);\n",i=Object(o.unaryKernelFunc)({opSnippet:r}),a={kernelName:s.Atan,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Atan2.js": +/*!********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Atan2.js ***! + \********************************************************************/ +/*! exports provided: atan2, atan2Config */function(e,t,n){"use strict";n.r(t),n.d(t,"atan2",(function(){return a})),n.d(t,"atan2Config",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=o.CHECK_NAN_SNIPPET_BINARY+"\n return atan(a, b);\n",i="\n vec4 result = atan(a, b);\n vec4 isNaN = min(vec4(isnan(a)) + vec4(isnan(b)), vec4(1.0));\n "+o.CHECK_NAN_SNIPPET_BINARY_PACKED+"\n return result;\n",a=Object(o.binaryKernelFunc)({opSnippet:r,packedOpSnippet:i}),u={kernelName:s.Atan2,backendName:"webgl",kernelFunc:a}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Atanh.js": +/*!********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Atanh.js ***! + \********************************************************************/ +/*! exports provided: atanh, atanhConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"atanh",(function(){return i})),n.d(t,"atanhConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=n(/*! ../unaryop_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/unaryop_gpu.js").CHECK_NAN_SNIPPET+"\n if ((x < -1.0) || (x > 1.0)) return NAN;\nreturn (log(1.0 + x) - log(1.0 - x)) / 2.0;",i=Object(o.unaryKernelFunc)({opSnippet:r}),a={kernelName:s.Atanh,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/AvgPool.js": +/*!**********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/AvgPool.js ***! + \**********************************************************************/ +/*! exports provided: avgPool, avgPoolConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"avgPool",(function(){return a})),n.d(t,"avgPoolConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../pool_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/pool_gpu.js"),r=n(/*! ../webgl_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/webgl_util.js"),i=n(/*! ./Identity */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Identity.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:u}=t;Object(r.assertNotComplex)(u,"avgPool");const{filterSize:d,strides:l,pad:c,dimRoundingMode:f}=a;s.util.assert(s.backend_util.eitherStridesOrDilationsAreOne(l,1),(()=>`Error in avgPool: Either strides or dilations must be 1. Got strides ${l} and dilations '1'`));const p=s.backend_util.computePool2DInfo(u.shape,d,l,1,c,f);if(1===p.filterWidth&&1===p.filterHeight&&s.util.arraysEqual(p.inShape,p.outShape))return Object(i.identity)({inputs:{x:u},backend:n});const m=new o.Pool2DProgram(p,"avg",!1);return n.runWebGLProgram(m,[u],"float32")}const u={kernelName:s.AvgPool,backendName:"webgl",kernelFunc:a}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/AvgPool3D.js": +/*!************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/AvgPool3D.js ***! + \************************************************************************/ +/*! exports provided: avgPool3D, avgPool3DConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"avgPool3D",(function(){return r})),n.d(t,"avgPool3DConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../pool_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/pool_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:r}=e,{x:i}=t,{filterSize:a,strides:u,pad:d,dimRoundingMode:l,dataFormat:c}=r,f=s.backend_util.computePool3DInfo(i.shape,a,u,[1,1,1],d,l,c),p=new o.Pool3DProgram(f,"avg",!1);return n.runWebGLProgram(p,[i],"float32")}const i={kernelName:s.AvgPool3D,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/AvgPool3DGrad.js": +/*!****************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/AvgPool3DGrad.js ***! + \****************************************************************************/ +/*! exports provided: avgPool3DGrad, avgPoolGrad3DConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"avgPool3DGrad",(function(){return r})),n.d(t,"avgPoolGrad3DConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../avg_pool_backprop_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/avg_pool_backprop_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:r}=e,{dy:i,input:a}=t,u=a,{filterSize:d,strides:l,pad:c,dimRoundingMode:f}=r,p=s.backend_util.computePool3DInfo(u.shape,d,l,[1,1,1],c,f),m=new o.AvgPool3DBackpropProgram(p);return n.runWebGLProgram(m,[i],u.dtype)}const i={kernelName:s.AvgPool3DGrad,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/AvgPoolGrad.js": +/*!**************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/AvgPoolGrad.js ***! + \**************************************************************************/ +/*! exports provided: avgPoolGrad, avgPoolGradConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"avgPoolGrad",(function(){return i})),n.d(t,"avgPoolGradConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../avg_pool_backprop_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/avg_pool_backprop_gpu.js"),r=n(/*! ../webgl_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/webgl_util.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e){const{inputs:t,backend:n,attrs:i}=e,{dy:a,input:u}=t,d=u;Object(r.assertNotComplex)([a,u],"avgPoolGrad");const{filterSize:l,strides:c,pad:f}=i,p=s.backend_util.computePool2DInfo(d.shape,l,c,1,f),m=new o.AvgPool2DBackpropProgram(p);return n.runWebGLProgram(m,[a],d.dtype)}const a={kernelName:s.AvgPoolGrad,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/BatchMatMul.js": +/*!**************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/BatchMatMul.js ***! + \**************************************************************************/ +/*! exports provided: batchMatMul, batchMatMulConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"batchMatMul",(function(){return r})),n.d(t,"batchMatMulConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./BatchMatMul_impl */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/BatchMatMul_impl.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:s}=e,{a:r,b:i}=t,{transposeA:a,transposeB:u}=s;return Object(o.batchMatMulImpl)({a:r,b:i,transposeA:a,transposeB:u,backend:n})}const i={kernelName:s.BatchMatMul,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/BatchMatMul_impl.js": +/*!*******************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/BatchMatMul_impl.js ***! + \*******************************************************************************/ +/*! exports provided: MATMUL_SHARED_DIM_THRESHOLD, batchMatMulImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"MATMUL_SHARED_DIM_THRESHOLD",(function(){return l})),n.d(t,"batchMatMulImpl",(function(){return c}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),r=n(/*! ../mulmat_packed_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/mulmat_packed_gpu.js"),i=n(/*! ./Multiply */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Multiply.js"),a=n(/*! ./Reshape */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"),u=n(/*! ./Sum */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Sum.js"),d=n(/*! ./Transpose */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const l=1e3;function c({a:e,b:t,transposeA:n,transposeB:c,backend:f,bias:p=null,preluActivationWeights:m=null,leakyreluAlpha:h=0,activation:b=null}){const j=e.shape.length,g=t.shape.length,w=n?e.shape[j-2]:e.shape[j-1],_=c?t.shape[g-1]:t.shape[g-2],k=n?e.shape[j-1]:e.shape[j-2],v=c?t.shape[g-2]:t.shape[g-1],x=e.shape.slice(0,-2),y=t.shape.slice(0,-2),O=s.util.sizeFromShape(x),I=s.util.sizeFromShape(y),C=O===I||1===O||1===I;s.util.assert(j>=2&&g>=2&&C,(()=>`Error in matMul: the input batch dimensions must either be the same or at least one input batch dimension must be 1. Got input batch dimensions of (${x}) and (${y}).`));const S=(O>I?e.shape.slice(0,-2):t.shape.slice(0,-2)).concat([k,v]);s.util.assert(w===_,(()=>`Error in matMul: inner shapes (${w}) and (${_}) of Tensors with shapes ${e.shape} and ${t.shape} and transposeA=${n} and transposeB=${c} must match.`));const T=n?[O,w,k]:[O,k,w],N=c?[I,v,_]:[I,_,v],E=Object(a.reshape)({inputs:{x:e},backend:f,attrs:{shape:T}}),A=Object(a.reshape)({inputs:{x:t},backend:f,attrs:{shape:N}}),R=[E,A],F=Math.max(O,I),M=n?E.shape[1]:E.shape[2],$=null!=p,D=null!=m,P="leakyrelu"===b,B=null!=b?Object(o.mapActivationToShaderProgram)(b,!0):null;let L;if((1===k||1===v)&&M>l&&!1===($||D||P||null!=B)){let e=E,t=A;n&&(e=Object(d.transpose)({inputs:{x:E},backend:f,attrs:{perm:[0,2,1]}}),R.push(e)),c&&(t=Object(d.transpose)({inputs:{x:A},backend:f,attrs:{perm:[0,2,1]}}),R.push(t));const s=1===v;let o=e;1!==v&&(o=Object(a.reshape)({inputs:{x:e},backend:f,attrs:{shape:[F,M,1]}}),R.push(o));const r=1===v?2:1;let l=t;s&&(l=Object(a.reshape)({inputs:{x:t},backend:f,attrs:{shape:[F,1,M]}}),R.push(l));const p=Object(i.multiply)({inputs:{a:o,b:l},backend:f});L=Object(u.sum)({inputs:{x:p},backend:f,attrs:{axis:r,keepDims:!0}}),R.push(p)}else{const o=Object(s.upcastType)(e.dtype,t.dtype),i=new r.MatMulPackedProgram(T,N,[F,k,v],n,c,$,B,D,P),a=[E,A];if(null!=p&&a.push(p),D&&a.push(m),P){const e=f.makeTensorInfo([],"float32",s.util.createScalarValue(h,"float32"));a.push(e),R.push(e)}L=f.runWebGLProgram(i,a,o)}const z=Object(a.reshape)({inputs:{x:L},backend:f,attrs:{shape:S}});R.push(L);for(const e of R)f.disposeIntermediateTensorInfo(e);return z}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/BatchNorm.js": +/*!************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/BatchNorm.js ***! + \************************************************************************/ +/*! exports provided: batchNorm, batchNormConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"batchNorm",(function(){return i})),n.d(t,"batchNormConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../batchnorm_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/batchnorm_gpu.js"),r=n(/*! ../batchnorm_packed_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/batchnorm_packed_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i=({inputs:e,backend:t,attrs:n})=>{const{x:i,mean:a,variance:u,offset:d,scale:l}=e;s.util.assert(a.shape.length===u.shape.length,(()=>"Batch normalization gradient requires mean and variance to have equal ranks.")),s.util.assert(null==d||a.shape.length===d.shape.length,(()=>"Batch normalization gradient requires mean and offset to have equal ranks.")),s.util.assert(null==l||a.shape.length===l.shape.length,(()=>"Batch normalization gradient requires mean and scale to have equal ranks."));let{varianceEpsilon:c}=n;null==c&&(c=.001);const f=[i,a,u];let p=null;null!=d&&(p=d.shape,f.push(d));let m=null;null!=l&&(m=l.shape,f.push(l));const h=Object(s.env)().getBool("WEBGL_PACK_NORMALIZATION")?new r.BatchNormPackedProgram(i.shape,a.shape,u.shape,p,m,c):new o.BatchNormProgram(i.shape,a.shape,u.shape,p,m,c);return t.runWebGLProgram(h,f,f[0].dtype)},a={kernelName:s.FusedBatchNorm,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/BatchToSpaceND.js": +/*!*****************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/BatchToSpaceND.js ***! + \*****************************************************************************/ +/*! exports provided: batchToSpaceND, batchToSpaceNDConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"batchToSpaceND",(function(){return a})),n.d(t,"batchToSpaceNDConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Reshape */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"),r=n(/*! ./Slice */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Slice.js"),i=n(/*! ./Transpose */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const a=e=>{const{inputs:t,backend:n,attrs:a}=e,{x:u}=t,{blockShape:d,crops:l}=a;s.util.assert(u.shape.length<=4,(()=>"batchToSpaceND for rank > 4 with a WebGL backend not implemented yet"));const c=d.reduce(((e,t)=>e*t)),f=s.backend_util.getReshaped(u.shape,d,c),p=s.backend_util.getPermuted(f.length,d.length),m=s.backend_util.getReshapedPermuted(u.shape,d,c),h=s.backend_util.getSliceBeginCoords(l,d.length),b=s.backend_util.getSliceSize(m,l,d.length),j=[],g=Object(o.reshape)({inputs:{x:u},backend:n,attrs:{shape:f}}),w=Object(i.transpose)({inputs:{x:g},backend:n,attrs:{perm:p}}),_=Object(o.reshape)({inputs:{x:w},backend:n,attrs:{shape:m}}),k=Object(r.slice)({inputs:{x:_},backend:n,attrs:{begin:h,size:b}});return j.push(g),j.push(w),j.push(_),j.forEach((e=>n.disposeIntermediateTensorInfo(e))),k},u={kernelName:s.BatchToSpaceND,backendName:"webgl",kernelFunc:a}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Bincount.js": +/*!***********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Bincount.js ***! + \***********************************************************************/ +/*! exports provided: bincount, bincountConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"bincount",(function(){return r})),n.d(t,"bincountConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:s}=e,{x:r,weights:i}=t,{size:a}=s,u=n.readSync(r.dataId),d=n.readSync(i.dataId),l=Object(o.bincountImplCPU)(u,d,i.dtype,i.shape,a);return n.makeTensorInfo([a],i.dtype,l)}const i={kernelName:s.Bincount,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Cast.js": +/*!*******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Cast.js ***! + \*******************************************************************/ +/*! exports provided: cast, castConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"cast",(function(){return d})),n.d(t,"castConfig",(function(){return l}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Complex */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Complex.js"),r=n(/*! ./Identity */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Identity.js"),i=n(/*! ./NotEqual */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/NotEqual.js"),a=n(/*! ./Real */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Real.js"),u=n(/*! ../kernel_utils/int */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/int.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function d(e){const{inputs:t,backend:n,attrs:l}=e,{x:c}=t,{dtype:f}=l;if("complex64"===f){if("complex64"===c.dtype)return Object(r.identity)({inputs:{x:c},backend:n});const e=s.zeros(c.shape),t=d({inputs:{x:c},backend:n,attrs:{dtype:"float32"}}),i=Object(o.complex)({inputs:{real:t,imag:e},backend:n});return e.dispose(),n.disposeIntermediateTensorInfo(t),i}if("complex64"===c.dtype){const e=Object(a.real)({inputs:{input:c},backend:n}),t=d({inputs:{x:e},backend:n,attrs:{dtype:f}});return n.disposeIntermediateTensorInfo(e),t}if(!s.util.hasEncodingLoss(c.dtype,f)){const e=Object(r.identity)({inputs:{x:c},backend:n});return{dataId:e.dataId,shape:e.shape,dtype:f}}if("int32"===f)return Object(u.int)(c,n);if("bool"===f){const e=n.makeTensorInfo([],"bool",s.util.getTypedArrayFromDType("bool",1)),t={a:c,b:e},o=Object(i.notEqual)({inputs:t,backend:n});return n.disposeIntermediateTensorInfo(e),o}throw new Error(`Error in Cast: failed to cast ${c.dtype} to ${f}`)}const l={kernelName:s.Cast,backendName:"webgl",kernelFunc:d}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Ceil.js": +/*!*******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Ceil.js ***! + \*******************************************************************/ +/*! exports provided: ceil, ceilConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"ceil",(function(){return a})),n.d(t,"ceilConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),r=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i="return ceil(x);",a=Object(o.unaryKernelFunc)({opSnippet:i,packedOpSnippet:i,cpuKernelImpl:r.ceilImplCPU}),u={kernelName:s.Ceil,backendName:"webgl",kernelFunc:a}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/ClipByValue.js": +/*!**************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/ClipByValue.js ***! + \**************************************************************************/ +/*! exports provided: clipByValue, clipByValueConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"clipByValue",(function(){return i})),n.d(t,"clipByValueConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../clip_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/clip_gpu.js"),r=n(/*! ../clip_packed_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/clip_packed_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e){const{inputs:t,backend:n,attrs:i}=e,{x:a}=t,{clipValueMin:u,clipValueMax:d}=i;let l;l=Object(s.env)().getBool("WEBGL_PACK_CLIP")?new r.ClipPackedProgram(a.shape):new o.ClipProgram(a.shape);const c=[[u],[d]];return n.runWebGLProgram(l,[a],a.dtype,c)}const a={kernelName:s.ClipByValue,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Complex.js": +/*!**********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Complex.js ***! + \**********************************************************************/ +/*! exports provided: complex, complexConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"complex",(function(){return r})),n.d(t,"complexConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Identity */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Identity.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n}=e,{real:s,imag:r}=t,i=n.makeTensorInfo(s.shape,"complex64"),a=n.texData.get(i.dataId),u=Object(o.identity)({inputs:{x:s},backend:n}),d=Object(o.identity)({inputs:{x:r},backend:n});return a.complexTensorInfos={real:u,imag:d},i}const i={kernelName:s.Complex,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/ComplexAbs.js": +/*!*************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/ComplexAbs.js ***! + \*************************************************************************/ +/*! exports provided: complexAbs, complexAbsConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"complexAbs",(function(){return i})),n.d(t,"complexAbsConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../complex_abs_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/complex_abs_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e,t){return{dataId:t.dataId,dtype:t.dtype,shape:e.shape}}function i(e){const{inputs:t,backend:n}=e,{x:s}=t,i=n.texData.get(s.dataId),a=new o.ComplexAbsProgram(s.shape),u=[r(s,i.complexTensorInfos.real),r(s,i.complexTensorInfos.imag)];return n.runWebGLProgram(a,u,u[0].dtype)}const a={kernelName:s.ComplexAbs,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Concat.js": +/*!*********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Concat.js ***! + \*********************************************************************/ +/*! exports provided: concat, concatConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"concat",(function(){return i})),n.d(t,"concatConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Concat_impl */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Concat_impl.js"),r=n(/*! ./Identity */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Identity.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e){const{inputs:t,backend:n,attrs:i}=e,{axis:a}=i,u=s.util.parseAxisParam(a,t[0].shape)[0],d=s.backend_util.computeOutShape(t.map((e=>e.shape)),u);if(0===s.util.sizeFromShape(d))return n.makeTensorInfo(d,t[0].dtype,[]);const l=t.filter((e=>s.util.sizeFromShape(e.shape)>0));if(1===l.length)return Object(r.identity)({inputs:{x:l[0]},backend:n});const c=l.map((e=>e.shape));return s.backend_util.assertParamsConsistent(c,u),Object(o.concatImpl)(l,u,n)}const a={kernelName:s.Concat,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Concat_impl.js": +/*!**************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Concat_impl.js ***! + \**************************************************************************/ +/*! exports provided: concatImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"concatImpl",(function(){return c}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../concat_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/concat_gpu.js"),r=n(/*! ../concat_packed_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/concat_packed_gpu.js"),i=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"),a=n(/*! ./Complex */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Complex.js"),u=n(/*! ./Imag */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Imag.js"),d=n(/*! ./Real */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Real.js"),l=n(/*! ./Reshape */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function c(e,t,n){const f=e[0].dtype;if("complex64"===f){const s=e.map((e=>Object(d.real)({inputs:{input:e},backend:n}))),o=e.map((e=>Object(u.imag)({inputs:{input:e},backend:n}))),r=c(s,t,n),i=c(o,t,n),l=Object(a.complex)({inputs:{real:r,imag:i},backend:n});return s.forEach((e=>n.disposeIntermediateTensorInfo(e))),o.forEach((e=>n.disposeIntermediateTensorInfo(e))),n.disposeIntermediateTensorInfo(r),n.disposeIntermediateTensorInfo(i),l}let p=n.shouldExecuteOnCPU(e);if("string"===f&&(p=!0),p){const o=e.map((e=>{const o=[-1,s.util.sizeFromShape(e.shape.slice(t))];return Object(l.reshape)({inputs:{x:e},backend:n,attrs:{shape:o}})})),r=o.map((e=>({vals:n.readSync(e.dataId),shape:e.shape}))),a=s.backend_util.computeOutShape(o.map((e=>e.shape)),1),u=1===o[0].shape[0],d=Object(i.concatImplCPU)(r,a,f,u),c=s.backend_util.computeOutShape(e.map((e=>e.shape)),t),p=n.makeTensorInfo(c,f,d);return o.forEach((e=>n.disposeIntermediateTensorInfo(e))),p}if(e.length>Object(s.env)().getNumber("WEBGL_MAX_TEXTURES_IN_SHADER")){const s=Math.floor(e.length/2),o=c(e.slice(0,s),t,n),r=c(e.slice(s),t,n),i=c([o,r],t,n);return n.disposeIntermediateTensorInfo(o),n.disposeIntermediateTensorInfo(r),i}if(Object(s.env)().getBool("WEBGL_PACK_ARRAY_OPERATIONS")&&e[0].shape.length>1){const s=new r.ConcatPackedProgram(e.map((e=>e.shape)),t);return n.runWebGLProgram(s,e,f)}const{tensors2D:m,outShape:h}=function(e,t,n){const o=s.backend_util.computeOutShape(e.map((e=>e.shape)),t);return{tensors2D:e.map((e=>Object(l.reshape)({inputs:{x:e},attrs:{shape:[-1,s.util.sizeFromShape(e.shape.slice(t))]},backend:n}))),outShape:o}}(e,t,n),b=new o.ConcatProgram(m.map((e=>e.shape))),j=n.runWebGLProgram(b,m,f);m.forEach((e=>n.disposeIntermediateTensorInfo(e)));const g=Object(l.reshape)({inputs:{x:j},attrs:{shape:h},backend:n});return n.disposeIntermediateTensorInfo(j),g}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv2D.js": +/*!*********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv2D.js ***! + \*********************************************************************/ +/*! exports provided: conv2d, conv2DConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"conv2d",(function(){return a})),n.d(t,"conv2DConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../conv_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/conv_gpu.js"),r=n(/*! ./Conv2D_impl */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv2D_impl.js"),i=n(/*! ./Reshape */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:u,filter:d}=t,{strides:l,pad:c,dataFormat:f,dilations:p,dimRoundingMode:m}=a,h=s.backend_util.convertConv2DDataFormat(f),b=s.backend_util.computeConv2DInfo(u.shape,d.shape,l,p,c,m,!1,h);let j;if(1!==b.filterHeight||1!==b.filterWidth||1!==b.dilationHeight||1!==b.dilationWidth||1!==b.strideHeight||1!==b.strideWidth||"SAME"!==b.padInfo.type&&"VALID"!==b.padInfo.type)if(Object(s.env)().getBool("WEBGL_CONV_IM2COL")&&1===u.shape[0])j=Object(r.conv2dWithIm2Row)({x:u,filter:d,convInfo:b,backend:n});else{const e=new o.Conv2DProgram(b);j=n.runWebGLProgram(e,[u,d],"float32")}else j=Object(r.conv2dByMatMul)({x:u,filter:d,convInfo:b,backend:n});const g=Object(i.reshape)({inputs:{x:j},backend:n,attrs:{shape:b.outShape}});return n.disposeIntermediateTensorInfo(j),g}const u={kernelName:s.Conv2D,backendName:"webgl",kernelFunc:a}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv2DBackpropFilter.js": +/*!***********************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv2DBackpropFilter.js ***! + \***********************************************************************************/ +/*! exports provided: conv2DBackpropFilter, conv2DBackpropFilterConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"conv2DBackpropFilter",(function(){return r})),n.d(t,"conv2DBackpropFilterConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../conv_backprop_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/conv_backprop_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:r}=e,{x:i,dy:a}=t,{strides:u,pad:d,dataFormat:l,dimRoundingMode:c,filterShape:f}=r,p=s.backend_util.convertConv2DDataFormat(l),m=s.backend_util.computeConv2DInfo(i.shape,f,u,1,d,c,!1,p),h=new o.Conv2DDerFilterProgram(m);return n.runWebGLProgram(h,[i,a],"float32")}const i={kernelName:s.Conv2DBackpropFilter,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv2DBackpropInput.js": +/*!**********************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv2DBackpropInput.js ***! + \**********************************************************************************/ +/*! exports provided: conv2DBackpropInput, conv2DBackpropInputConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"conv2DBackpropInput",(function(){return r})),n.d(t,"conv2DBackpropInputConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../conv_backprop_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/conv_backprop_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:r}=e,{dy:i,filter:a}=t,{inputShape:u,strides:d,pad:l,dataFormat:c,dimRoundingMode:f}=r,p=s.backend_util.convertConv2DDataFormat(c),m=s.backend_util.computeConv2DInfo(u,a.shape,d,1,l,f,!1,p),h=new o.Conv2DDerInputProgram(m);return n.runWebGLProgram(h,[i,a],"float32")}const i={kernelName:s.Conv2DBackpropInput,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv2D_impl.js": +/*!**************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv2D_impl.js ***! + \**************************************************************************/ +/*! exports provided: conv2dByMatMul, conv2dWithIm2Row */function(e,t,n){"use strict";n.r(t),n.d(t,"conv2dByMatMul",(function(){return c})),n.d(t,"conv2dWithIm2Row",(function(){return f}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../im2col_packed_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/im2col_packed_gpu.js"),r=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),i=n(/*! ../mulmat_packed_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/mulmat_packed_gpu.js"),a=n(/*! ../webgl_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/webgl_util.js"),u=n(/*! ./BatchMatMul_impl */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/BatchMatMul_impl.js"),d=n(/*! ./Identity */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Identity.js"),l=n(/*! ./Reshape */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function c({x:e,filter:t,convInfo:n,backend:o,bias:r=null,preluActivationWeights:i=null,leakyreluAlpha:c=0,activation:f=null}){const p=e.shape,m=o.texData.get(e.dataId),h=n.inChannels,b=p[0]*p[1]*p[2],j=n.outChannels,g="channelsLast"===n.dataFormat;let w;const _=[];if(!((1===b||1===j)&&h>u.MATMUL_SHARED_DIM_THRESHOLD)&&m.isPacked&&g&&null!=m.texture&&p[2]%2!=0&&s.util.arraysEqual(m.shape.slice(-3),p.slice(-3))){const h=p[0]*p[1]*(p[2]+1),b={dataId:e.dataId,shape:[1,h,n.inChannels],dtype:e.dtype},j=m.shape;m.shape=m.shape.slice(),m.shape[m.shape.length-2]++,s.util.assert(a.isReshapeFree(m.shape,b.shape),(()=>`packed reshape ${m.shape} to ${b.shape} isn't free`));const g=Object(l.reshape)({inputs:{x:t},backend:o,attrs:{shape:[1,n.inChannels,n.outChannels]}});_.push(g);const k=Object(u.batchMatMulImpl)({a:b,b:g,backend:o,transposeA:false,transposeB:false,bias:r,activation:f,preluActivationWeights:i,leakyreluAlpha:c}),v=o.texData.get(k.dataId);s.util.assert(v.isPacked,(()=>"batchMatMul result is expected to be packed")),m.shape=j,v.shape=n.outShape,w=Object(d.identity)({inputs:{x:k},backend:o}),w.shape=n.outShape,_.push(k)}else{const s=g?p[0]*p[1]*p[2]:p[0]*p[2]*p[3],a=Object(l.reshape)({inputs:{x:e},backend:o,attrs:{shape:[1,s,n.inChannels]}}),d=Object(l.reshape)({inputs:{x:t},backend:o,attrs:{shape:[1,n.inChannels,n.outChannels]}}),m=Object(u.batchMatMulImpl)({a:a,b:d,transposeA:false,transposeB:false,backend:o,bias:r,activation:f,preluActivationWeights:i,leakyreluAlpha:c});w=Object(l.reshape)({inputs:{x:m},backend:o,attrs:{shape:n.outShape}}),_.push(a),_.push(d),_.push(m)}for(const e of _)o.disposeIntermediateTensorInfo(e);return w}function f({x:e,filter:t,convInfo:n,backend:a,bias:u=null,preluActivationWeights:d=null,leakyreluAlpha:c=0,activation:f=null}){const{filterWidth:p,filterHeight:m,inChannels:h,outWidth:b,outHeight:j,dataFormat:g}=n,w="channelsLast"===g,_=p*m*h,k=j*b,v=[_,k],x=[],y=Object(l.reshape)({inputs:{x:e},backend:a,attrs:{shape:e.shape.slice(1)}}),O=Object(l.reshape)({inputs:{x:t},backend:a,attrs:{shape:[1,_,s.util.sizeFromShape(t.shape)/_]}});x.push(y),x.push(O);const I=new o.Im2ColPackedProgram(v,n),C=[y.shape,[n.padInfo.top,n.padInfo.left],[n.strideHeight,n.strideWidth],[n.dilationHeight,n.dilationWidth],[n.inChannels],[n.filterWidth*n.inChannels],[n.outWidth]],S=a.runWebGLProgram(I,[y],"float32",C),T=Object(l.reshape)({inputs:{x:S},backend:a,attrs:{shape:[1,v[0],v[1]]}});x.push(S),x.push(T);const N=null!=u,E=null!=d,A="leakyrelu"===f,R=f?Object(r.mapActivationToShaderProgram)(f,!0):null,F=new i.MatMulPackedProgram(T.shape,O.shape,[1,k,n.outChannels],!0,!1,N,R,E,A),M=[T,O];if(u&&M.push(u),E&&M.push(d),A){const e=a.makeTensorInfo([],"float32",s.util.createScalarValue(c,"float32"));M.push(e),x.push(e)}const $=a.runWebGLProgram(F,M,"float32"),D=w?[1,j,b,n.outChannels]:[1,n.outChannels,j,b],P=Object(l.reshape)({inputs:{x:$},backend:a,attrs:{shape:D}});x.push($);for(const e of x)a.disposeIntermediateTensorInfo(e);return P}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv3D.js": +/*!*********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv3D.js ***! + \*********************************************************************/ +/*! exports provided: conv3D, conv3DConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"conv3D",(function(){return r})),n.d(t,"conv3DConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../conv_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/conv_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:r}=e,{x:i,filter:a}=t,{strides:u,pad:d,dilations:l}=r,c=s.backend_util.computeConv3DInfo(i.shape,a.shape,u,l,d),f=new o.Conv3DProgram(c);return n.runWebGLProgram(f,[i,a],"float32")}const i={kernelName:s.Conv3D,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv3DBackpropFilterV2.js": +/*!*************************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv3DBackpropFilterV2.js ***! + \*************************************************************************************/ +/*! exports provided: conv3DBackpropFilterV2, conv3DBackpropFilterV2Config */function(e,t,n){"use strict";n.r(t),n.d(t,"conv3DBackpropFilterV2",(function(){return r})),n.d(t,"conv3DBackpropFilterV2Config",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../conv_backprop_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/conv_backprop_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:r}=e,{x:i,dy:a}=t,{strides:u,pad:d,filterShape:l}=r,c=s.backend_util.computeConv3DInfo(i.shape,l,u,1,d),f=new o.Conv3DDerFilterProgram(c);return n.runWebGLProgram(f,[i,a],"float32")}const i={kernelName:s.Conv3DBackpropFilterV2,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv3DBackpropInputV2.js": +/*!************************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv3DBackpropInputV2.js ***! + \************************************************************************************/ +/*! exports provided: conv3DBackpropInput, conv3DBackpropInputConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"conv3DBackpropInput",(function(){return r})),n.d(t,"conv3DBackpropInputConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../conv_backprop_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/conv_backprop_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:r}=e,{dy:i,filter:a}=t,{pad:u,strides:d,inputShape:l}=r,c=s.backend_util.computeConv3DInfo(l,a.shape,d,1,u),f=new o.Conv3DDerInputProgram(c);return n.runWebGLProgram(f,[i,a],"float32")}const i={kernelName:s.Conv3DBackpropInputV2,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Cos.js": +/*!******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Cos.js ***! + \******************************************************************/ +/*! exports provided: cos, cosConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"cos",(function(){return i})),n.d(t,"cosConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=o.CHECK_NAN_SNIPPET_UNARY+"\n return cos(x);\n",i=Object(o.unaryKernelFunc)({opSnippet:r}),a={kernelName:s.Cos,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Cosh.js": +/*!*******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Cosh.js ***! + \*******************************************************************/ +/*! exports provided: cosh, coshConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"cosh",(function(){return r})),n.d(t,"coshConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)({opSnippet:"\n float e2x = exp(-x);\n return (e2x + 1.0 / e2x) / 2.0;\n"}),i={kernelName:s.Cosh,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/CropAndResize.js": +/*!****************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/CropAndResize.js ***! + \****************************************************************************/ +/*! exports provided: cropAndResize, cropAndResizeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"cropAndResize",(function(){return r})),n.d(t,"cropAndResizeConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../crop_and_resize_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/crop_and_resize_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=e=>{const{inputs:t,backend:n,attrs:s}=e,{image:r,boxes:i,boxInd:a}=t,{cropSize:u,method:d,extrapolationValue:l}=s,c=new o.CropAndResizeProgram(r.shape,i.shape,u,d,l);return n.runWebGLProgram(c,[r,i,a],"float32")},i={kernelName:s.CropAndResize,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Cumsum.js": +/*!*********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Cumsum.js ***! + \*********************************************************************/ +/*! exports provided: cumsum, cumsumConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"cumsum",(function(){return a})),n.d(t,"cumsumConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cumsum_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/cumsum_gpu.js"),r=n(/*! ./Identity */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Identity.js"),i=n(/*! ./Transpose */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:u}=t,{axis:d,exclusive:l,reverse:c}=a,f=u.shape.length,p=s.backend_util.getAxesPermutation([d],f);let m=u;null!=p&&(m=Object(i.transpose)({inputs:{x:u},backend:n,attrs:{perm:p}}));const h=s.backend_util.getInnerMostAxes(1,f)[0];if(h!==f-1)throw new Error(`WebGL cumsum shader expects an inner-most axis=${u.shape.length-1} but got axis=${d}`);const b=m.shape[h];let j=Object(r.identity)({inputs:{x:m},backend:n});for(let e=0;e<=Math.ceil(Math.log2(b))-1;e++){const t=new o.CumSumProgram(m.shape,!1,c),s=[[e]],r=j;j=n.runWebGLProgram(t,[j],j.dtype,s),n.disposeIntermediateTensorInfo(r)}if(l){const e=new o.CumSumProgram(m.shape,l,c),t=j;j=n.runWebGLProgram(e,[j],j.dtype),n.disposeIntermediateTensorInfo(t)}if(null!=p){const e=s.backend_util.getUndoAxesPermutation(p),t=Object(i.transpose)({inputs:{x:j},backend:n,attrs:{perm:e}});return n.disposeIntermediateTensorInfo(j),n.disposeIntermediateTensorInfo(m),t}return j}const u={kernelName:s.Cumsum,backendName:"webgl",kernelFunc:a}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/DenseBincount.js": +/*!****************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/DenseBincount.js ***! + \****************************************************************************/ +/*! exports provided: denseBincount, denseBincountConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"denseBincount",(function(){return r})),n.d(t,"denseBincountConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:s}=e,{x:r,weights:i}=t,{size:a,binaryOutput:u}=s;if(1===r.shape.length){const e=n.readSync(r.dataId),t=n.readSync(i.dataId),s=Object(o.bincountImplCPU)(e,t,i.dtype,i.shape,a);return n.makeTensorInfo([a],i.dtype,s)}if(2===r.shape.length){const e=n.bufferSync(r),t=n.bufferSync(i),s=Object(o.bincountReduceImplCPU)(e,t,a,u);return n.makeTensorInfo(s.shape,i.dtype,s.values)}throw new Error(`Error in denseBincount: input must be at most rank 2, but got rank${r.shape.length}.`)}const i={kernelName:s.DenseBincount,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/DepthToSpace.js": +/*!***************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/DepthToSpace.js ***! + \***************************************************************************/ +/*! exports provided: depthToSpace, depthToSpaceConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"depthToSpace",(function(){return r})),n.d(t,"depthToSpaceConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../depth_to_space_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/depth_to_space_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:r}=e,{x:i}=t,{blockSize:a,dataFormat:u}=r;s.util.assert(a>1,(()=>`blockSize should be > 1 for depthToSpace, but was: ${a}`));const d=i.shape[0],l="NHWC"===u?i.shape[1]:i.shape[2],c="NHWC"===u?i.shape[2]:i.shape[3],f="NHWC"===u?i.shape[3]:i.shape[1],p=l*a,m=c*a,h=f/(a*a),b="NHWC"===u?[d,p,m,h]:[d,h,p,m],j=new o.DepthToSpaceProgram(b,a,u);return n.runWebGLProgram(j,[i],i.dtype)}const i={kernelName:s.DepthToSpace,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/DepthwiseConv2dNative.js": +/*!************************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/DepthwiseConv2dNative.js ***! + \************************************************************************************/ +/*! exports provided: depthwiseConv2dNative, depthwiseConv2dNativeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"depthwiseConv2dNative",(function(){return i})),n.d(t,"depthwiseConv2dNativeConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../conv_gpu_depthwise */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/conv_gpu_depthwise.js"),r=n(/*! ../conv_packed_gpu_depthwise */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/conv_packed_gpu_depthwise.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e){const{inputs:t,backend:n,attrs:i}=e,{x:a,filter:u}=t,{strides:d,pad:l,dilations:c,dimRoundingMode:f}=i;let p=c;null==p&&(p=[1,1]),s.util.assert(s.backend_util.eitherStridesOrDilationsAreOne(d,p),(()=>`Error in depthwiseConv2d: Either strides or dilations must be 1. Got strides ${d} and dilations '${p}'`));const m=s.backend_util.computeConv2DInfo(a.shape,u.shape,d,p,l,f,!0);let h;h=Object(s.env)().getBool("WEBGL_PACK_DEPTHWISECONV")&&m.strideWidth<=2&&m.outChannels/m.inChannels==1?new r.DepthwiseConvPacked2DProgram(m):new o.DepthwiseConv2DProgram(m);const b=[[m.padInfo.top,m.padInfo.left],[m.strideHeight,m.strideWidth],[m.dilationHeight,m.dilationWidth],[m.inHeight,m.inWidth]];return n.runWebGLProgram(h,[a,u],"float32",b)}const a={kernelName:s.DepthwiseConv2dNative,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/DepthwiseConv2dNativeBackpropFilter.js": +/*!**************************************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/DepthwiseConv2dNativeBackpropFilter.js ***! + \**************************************************************************************************/ +/*! exports provided: depthwiseConv2dNativeBackpropFilter, depthwiseConv2dNativeBackpropFilterConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"depthwiseConv2dNativeBackpropFilter",(function(){return r})),n.d(t,"depthwiseConv2dNativeBackpropFilterConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../conv_backprop_gpu_depthwise */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/conv_backprop_gpu_depthwise.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:r}=e,{x:i,dy:a}=t,{strides:u,dilations:d,pad:l,dimRoundingMode:c,filterShape:f}=r,p=s.backend_util.computeConv2DInfo(i.shape,f,u,d,l,c,!0),m=new o.DepthwiseConv2DDerFilterProgram(p);return n.runWebGLProgram(m,[i,a],"float32")}const i={kernelName:s.DepthwiseConv2dNativeBackpropFilter,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/DepthwiseConv2dNativeBackpropInput.js": +/*!*************************************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/DepthwiseConv2dNativeBackpropInput.js ***! + \*************************************************************************************************/ +/*! exports provided: depthwiseConv2dNativeBackpropInput, depthwiseConv2dNativeBackpropInputConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"depthwiseConv2dNativeBackpropInput",(function(){return r})),n.d(t,"depthwiseConv2dNativeBackpropInputConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../conv_backprop_gpu_depthwise */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/conv_backprop_gpu_depthwise.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:r}=e,{dy:i,filter:a}=t,{strides:u,dilations:d,pad:l,dimRoundingMode:c,inputShape:f}=r,p=s.backend_util.computeConv2DInfo(f,a.shape,u,d,l,c,!0),m=new o.DepthwiseConv2DDerInputProgram(p);return n.runWebGLProgram(m,[i,a],"float32")}const i={kernelName:s.DepthwiseConv2dNativeBackpropInput,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Diag.js": +/*!*******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Diag.js ***! + \*******************************************************************/ +/*! exports provided: diag, diagConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"diag",(function(){return i})),n.d(t,"diagConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../diag_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/diag_gpu.js"),r=n(/*! ./Reshape */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e){const{inputs:t,backend:n}=e,{x:i}=t,a=[...i.shape,...i.shape],u=s.util.sizeFromShape(i.shape),d=Object(r.reshape)({inputs:{x:i},backend:n,attrs:{shape:[u]}}),l=new o.DiagProgram(u),c=n.runWebGLProgram(l,[d],d.dtype),f=Object(r.reshape)({inputs:{x:c},backend:n,attrs:{shape:a}});return n.disposeIntermediateTensorInfo(d),n.disposeIntermediateTensorInfo(c),f}const a={kernelName:s.Diag,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Dilation2D.js": +/*!*************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Dilation2D.js ***! + \*************************************************************************/ +/*! exports provided: dilation2D, dilation2DConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"dilation2D",(function(){return i})),n.d(t,"dilation2DConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../dilation_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/dilation_gpu.js"),r=n(/*! ./Reshape */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e){const{inputs:t,backend:n,attrs:i}=e,{x:a,filter:u}=t,{strides:d,pad:l,dilations:c}=i,f=s.backend_util.computeDilation2DInfo(a.shape,u.shape,d,l,"NHWC",c);let p;const m=new o.Dilation2DProgram(f);p=n.runWebGLProgram(m,[a,u],"float32");const h=Object(r.reshape)({inputs:{x:p},backend:n,attrs:{shape:f.outShape}});return n.disposeIntermediateTensorInfo(p),h}const a={kernelName:s.Dilation2D,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Einsum.js": +/*!*********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Einsum.js ***! + \*********************************************************************/ +/*! exports provided: einsum, einsumConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"einsum",(function(){return u})),n.d(t,"einsumConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Multiply */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Multiply.js"),r=n(/*! ./Reshape */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"),i=n(/*! ./Sum */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Sum.js"),a=n(/*! ./Transpose */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose.js"); +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function u(e){const{inputs:t,backend:n,attrs:u}=e,{equation:d}=u,l=t,{allDims:c,summedDims:f,idDims:p}=s.backend_util.decodeEinsumEquation(d,l.length);s.backend_util.checkEinsumDimSizes(c.length,p,l);const{path:m,steps:h}=s.backend_util.getEinsumComputePath(f,p),b=h.length;let j=null,g=c.length;const w=[];for(let e=0;e=0&&(j=Object(i.sum)({inputs:{x:j},backend:n,attrs:{axis:m[e]-(c.length-g),keepDims:!1}}),w.push(j)),g--)}for(const e of w)e!==j&&n.disposeIntermediateTensorInfo(e);return j}const d={kernelName:s.Einsum,backendName:"webgl",kernelFunc:u}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Elu.js": +/*!******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Elu.js ***! + \******************************************************************/ +/*! exports provided: eluConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"eluConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)({opSnippet:"return (x >= 0.0) ? x : (exp(x) - 1.0);",packedOpSnippet:"\n vec4 result;\n\n result.r = (x.r >= 0.0) ? x.r : (exp(x.r) - 1.0);\n result.g = (x.g >= 0.0) ? x.g : (exp(x.g) - 1.0);\n result.b = (x.b >= 0.0) ? x.b : (exp(x.b) - 1.0);\n result.a = (x.a >= 0.0) ? x.a : (exp(x.a) - 1.0);\n\n return result;\n"}),i={kernelName:s.Elu,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/EluGrad.js": +/*!**********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/EluGrad.js ***! + \**********************************************************************/ +/*! exports provided: eluGrad, eluGradConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"eluGrad",(function(){return i})),n.d(t,"eluGradConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../binaryop_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/binaryop_gpu.js"),r=n(/*! ../binaryop_packed_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/binaryop_packed_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i=e=>{const{inputs:t,backend:n}=e,{dy:i,y:a}=t,u=Object(s.env)().getBool("WEBGL_PACK_BINARY_OPERATIONS")?new r.BinaryOpPackedProgram("\n vec4 bGTEZero = vec4(greaterThanEqual(b, vec4(0.)));\n return (bGTEZero * a) + ((vec4(1.0) - bGTEZero) * (a * (b + vec4(1.0))));\n",i.shape,a.shape):new o.BinaryOpProgram("return (b >= 1.0) ? a : a * (b + 1.0);",i.shape,a.shape);return n.runWebGLProgram(u,[i,a],i.dtype)},a={kernelName:s.EluGrad,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Equal.js": +/*!********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Equal.js ***! + \********************************************************************/ +/*! exports provided: equal, equalConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"equal",(function(){return i})),n.d(t,"equalConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),r=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i=Object(o.binaryKernelFunc)({opSnippet:"return float(a == b);",packedOpSnippet:"\n return vec4(equal(a, b));\n",dtype:"bool",cpuKernelImpl:r.equalImplCPU}),a={kernelName:s.Equal,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Erf.js": +/*!******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Erf.js ***! + \******************************************************************/ +/*! exports provided: erf, erfConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"erf",(function(){return i})),n.d(t,"erfConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=`\n // Error function is calculated approximately with elementary function.\n // See "Handbook of Mathematical Functions with Formulas,\n // Graphs, and Mathematical Tables", Abramowitz and Stegun.\n float p = ${s.backend_util.ERF_P};\n float a1 = ${s.backend_util.ERF_A1};\n float a2 = ${s.backend_util.ERF_A2};\n float a3 = ${s.backend_util.ERF_A3};\n float a4 = ${s.backend_util.ERF_A4};\n float a5 = ${s.backend_util.ERF_A5};\n\n float sign = sign(x);\n x = abs(x);\n float t = 1.0 / (1.0 + p * x);\n return sign * (1.0 - (((((a5*t + a4)*t) + a3)*t + a2)*t + a1)*t*exp(-x*x));\n`,i=Object(o.unaryKernelFunc)({opSnippet:r}),a={kernelName:s.Erf,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Exp.js": +/*!******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Exp.js ***! + \******************************************************************/ +/*! exports provided: EXP, exp, expConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"EXP",(function(){return i})),n.d(t,"exp",(function(){return a})),n.d(t,"expConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),r=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i="return exp(x);",a=Object(o.unaryKernelFunc)({opSnippet:i,packedOpSnippet:i,cpuKernelImpl:r.expImplCPU}),u={kernelName:s.Exp,backendName:"webgl",kernelFunc:a}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/ExpandDims.js": +/*!*************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/ExpandDims.js ***! + \*************************************************************************/ +/*! exports provided: expandDims, expandDimsConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"expandDims",(function(){return r})),n.d(t,"expandDimsConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Reshape */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,attrs:n,backend:r}=e,{dim:i}=n,{input:a}=t,u=a.shape.length,d=a.shape.slice();let l=i;return i<0&&(s.util.assert(-(u+1)<=i,(()=>`Axis must be in the interval [${-(u+1)}, ${u}]`)),l=u+i+1),d.splice(l,0,1),Object(o.reshape)({inputs:{x:a},backend:r,attrs:{shape:d}})}const i={kernelName:s.ExpandDims,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Expm1.js": +/*!********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Expm1.js ***! + \********************************************************************/ +/*! exports provided: expm1, expm1Config */function(e,t,n){"use strict";n.r(t),n.d(t,"expm1",(function(){return a})),n.d(t,"expm1Config",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),r=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i="return exp(x) - 1.0;",a=Object(o.unaryKernelFunc)({opSnippet:i,packedOpSnippet:i,cpuKernelImpl:r.expm1ImplCPU}),u={kernelName:s.Expm1,backendName:"webgl",kernelFunc:a}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/FFT.js": +/*!******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/FFT.js ***! + \******************************************************************/ +/*! exports provided: fft, fftConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"fft",(function(){return r})),n.d(t,"fftConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./FFT_impl */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/FFT_impl.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n}=e,{input:s}=t;return Object(o.fftImpl)(s,!1,n)}const i={kernelName:s.FFT,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/FFT_impl.js": +/*!***********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/FFT_impl.js ***! + \***********************************************************************/ +/*! exports provided: fftImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"fftImpl",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../fft_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/fft_gpu.js"),r=n(/*! ./Complex */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Complex.js"),i=n(/*! ./Reshape */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function a(e,t,n){const a=n.texData.get(e.dataId),u=s.util.sizeFromShape(e.shape),d=e.shape[e.shape.length-1],l=u/d,c=Object(i.reshape)({inputs:{x:e},backend:n,attrs:{shape:[l,d]}}),f=c.shape,p=new o.FFTProgram("real",f,t),m=new o.FFTProgram("imag",f,t),h=[{dataId:a.complexTensorInfos.real.dataId,dtype:a.complexTensorInfos.real.dtype,shape:f},{dataId:a.complexTensorInfos.imag.dataId,dtype:a.complexTensorInfos.imag.dtype,shape:f}],b=n.runWebGLProgram(p,h,"float32"),j=n.runWebGLProgram(m,h,"float32"),g=Object(r.complex)({inputs:{real:b,imag:j},backend:n});n.disposeIntermediateTensorInfo(b),n.disposeIntermediateTensorInfo(j);const w=Object(i.reshape)({inputs:{x:g},backend:n,attrs:{shape:e.shape}});return n.disposeIntermediateTensorInfo(c),n.disposeIntermediateTensorInfo(g),w}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Fill.js": +/*!*******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Fill.js ***! + \*******************************************************************/ +/*! exports provided: fill, fillConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"fill",(function(){return r})),n.d(t,"fillConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../fill_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/fill_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{backend:t,attrs:n}=e,{shape:r,value:i}=n;let{dtype:a}=n;if(a=a||s.util.inferDtype(i),"string"===a){const e=s.util.getArrayFromDType(a,s.util.sizeFromShape(r));return e.fill(i),t.makeTensorInfo(r,a,e)}{const e=new o.FillProgram(r,i),n=[[i]];return t.runWebGLProgram(e,[],a,n)}}const i={kernelName:s.Fill,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/FlipLeftRight.js": +/*!****************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/FlipLeftRight.js ***! + \****************************************************************************/ +/*! exports provided: flipLeftRightConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"flipLeftRightConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../flip_left_right_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/flip_left_right_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r={kernelName:s.FlipLeftRight,backendName:"webgl",kernelFunc:({inputs:e,backend:t})=>{const{image:n}=e,s=t,r=new o.FlipLeftRightProgram(n.shape);return s.runWebGLProgram(r,[n],n.dtype)}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Floor.js": +/*!********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Floor.js ***! + \********************************************************************/ +/*! exports provided: floor, floorConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"floor",(function(){return a})),n.d(t,"floorConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),r=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i="return floor(x);",a=Object(o.unaryKernelFunc)({opSnippet:i,packedOpSnippet:i,cpuKernelImpl:r.floorImplCPU}),u={kernelName:s.Floor,backendName:"webgl",kernelFunc:a}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/FloorDiv.js": +/*!***********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/FloorDiv.js ***! + \***********************************************************************/ +/*! exports provided: floorDiv, floorDivConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"floorDiv",(function(){return r})),n.d(t,"floorDivConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.binaryKernelFunc)({opSnippet:"\n float s = sign(a) * sign(b);\n int ia = round(a);\n int ib = round(b);\n if (ib != 0) {\n // Windows (D3D) wants guaranteed non-zero int division at compile-time.\n return float(idiv(ia, ib, s));\n } else {\n return NAN;\n }\n",packedOpSnippet:"\n ivec4 ia = round(a);\n ivec4 ib = round(b);\n bvec4 cond = notEqual(ib, ivec4(0));\n ivec4 result = ivec4(0);\n vec4 s = sign(a) * sign(b);\n\n // Windows (D3D) wants guaranteed non-zero int division at compile-time.\n if (cond[0]) {\n result[0] = idiv(ia[0], ib[0], s[0]);\n }\n if (cond[1]) {\n result[1] = idiv(ia[1], ib[1], s[1]);\n }\n if (cond[2]) {\n result[2] = idiv(ia[2], ib[2], s[2]);\n }\n if (cond[3]) {\n result[3] = idiv(ia[3], ib[3], s[3]);\n }\n return vec4(result);\n",dtype:"int32"}),i={kernelName:s.FloorDiv,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/FromPixels.js": +/*!*************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/FromPixels.js ***! + \*************************************************************************/ +/*! exports provided: fromPixelsConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"fromPixelsConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../tex_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/tex_util.js"),r=n(/*! ./FromPixels_utils/from_pixels_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/FromPixels_utils/from_pixels_gpu.js"),i=n(/*! ./FromPixels_utils/from_pixels_packed_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/FromPixels_utils/from_pixels_packed_gpu.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const a={kernelName:s.FromPixels,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e;let{pixels:d}=t;const{numChannels:l}=a,c="undefined"!=typeof HTMLVideoElement&&d instanceof HTMLVideoElement,f="undefined"!=typeof HTMLImageElement&&d instanceof HTMLImageElement,[p,m]=c?[d.videoWidth,d.videoHeight]:[d.width,d.height],h=[m,p],b=[m,p,l];(f||c)&&(null==u&&(u=document.createElement("canvas").getContext("2d")),u.canvas.width=p,u.canvas.height=m,u.drawImage(d,0,0,p,m),d=u.canvas);const j=n.makeTensorInfo(h,"int32");n.texData.get(j.dataId).usage=o.TextureUsage.PIXELS,n.gpgpu.uploadPixelDataToTexture(n.getTexture(j.dataId),d);const g=Object(s.env)().getBool("WEBGL_PACK")?new i.FromPixelsPackedProgram(b):new r.FromPixelsProgram(b),w=n.runWebGLProgram(g,[j],"int32");return n.disposeData(j.dataId),w}};let u},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/FromPixels_utils/from_pixels_gpu.js": +/*!***********************************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/FromPixels_utils/from_pixels_gpu.js ***! + \***********************************************************************************************/ +/*! exports provided: FromPixelsProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"FromPixelsProgram",(function(){return o}));var s=n(/*! ../../glsl_version */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/glsl_version.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */class o{constructor(e){this.variableNames=["A"];const t=Object(s.getGlslDifferences)(),[n,o]=e;this.outputShape=e,this.userCode=`\n void main() {\n ivec3 coords = getOutputCoords();\n int texR = coords[0];\n int texC = coords[1];\n int depth = coords[2];\n vec2 uv = (vec2(texC, texR) + halfCR) / vec2(${o}.0, ${n}.0);\n\n vec4 values = ${t.texture2D}(A, uv);\n float value;\n if (depth == 0) {\n value = values.r;\n } else if (depth == 1) {\n value = values.g;\n } else if (depth == 2) {\n value = values.b;\n } else if (depth == 3) {\n value = values.a;\n }\n\n setOutput(floor(value * 255.0 + 0.5));\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/FromPixels_utils/from_pixels_packed_gpu.js": +/*!******************************************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/FromPixels_utils/from_pixels_packed_gpu.js ***! + \******************************************************************************************************/ +/*! exports provided: FromPixelsPackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"FromPixelsPackedProgram",(function(){return o}));var s=n(/*! ../../glsl_version */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/glsl_version.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */class o{constructor(e){this.variableNames=["A"],this.packedInputs=!1,this.packedOutput=!0;const t=Object(s.getGlslDifferences)(),[n,o]=e;this.outputShape=e,this.userCode=`\n void main() {\n ivec3 coords = getOutputCoords();\n int texR = coords[0];\n int texC = coords[1];\n int depth = coords[2];\n\n vec4 result = vec4(0.);\n\n for(int row=0; row<=1; row++) {\n for(int col=0; col<=1; col++) {\n texC = coords[1] + row;\n depth = coords[2] + col;\n\n vec2 uv = (vec2(texC, texR) + halfCR) /\n vec2(${o}.0, ${n}.0);\n vec4 values = ${t.texture2D}(A, uv);\n float value;\n if (depth == 0) {\n value = values.r;\n } else if (depth == 1) {\n value = values.g;\n } else if (depth == 2) {\n value = values.b;\n } else if (depth == 3) {\n value = values.a;\n }\n\n result[row * 2 + col] = floor(value * 255.0 + 0.5);\n }\n }\n\n ${t.output} = result;\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/FusedConv2D.js": +/*!**************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/FusedConv2D.js ***! + \**************************************************************************/ +/*! exports provided: fusedConv2d, fusedConv2DConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"fusedConv2d",(function(){return u})),n.d(t,"fusedConv2DConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../conv_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/conv_gpu.js"),r=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),i=n(/*! ./Conv2D_impl */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv2D_impl.js"),a=n(/*! ./Reshape */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function u(e){const{inputs:t,backend:n,attrs:u}=e,{x:d,filter:l,bias:c,preluActivationWeights:f}=t,{strides:p,pad:m,dataFormat:h,dilations:b,dimRoundingMode:j,activation:g,leakyreluAlpha:w}=u,_=s.backend_util.convertConv2DDataFormat(h),k=s.backend_util.computeConv2DInfo(d.shape,l.shape,p,b,m,j,!1,_);let v;const x=[];if(1!==k.filterHeight||1!==k.filterWidth||1!==k.dilationHeight||1!==k.dilationWidth||1!==k.strideHeight||1!==k.strideWidth||"SAME"!==k.padInfo.type&&"VALID"!==k.padInfo.type)if(Object(s.env)().getBool("WEBGL_CONV_IM2COL")&&1===d.shape[0])v=Object(i.conv2dWithIm2Row)({x:d,filter:l,convInfo:k,backend:n,bias:c,activation:g,preluActivationWeights:f,leakyreluAlpha:w});else{const e=null!=c,t=null!=f,i="leakyrelu"===g,a=g?Object(r.mapActivationToShaderProgram)(g,!1):null,u=new o.Conv2DProgram(k,e,a,t,i),p=[d,l];if(c&&p.push(c),f&&p.push(f),i){const e=n.makeTensorInfo([],"float32",s.util.createScalarValue(w,"float32"));p.push(e),x.push(e)}v=n.runWebGLProgram(u,p,"float32")}else v=Object(i.conv2dByMatMul)({x:d,filter:l,convInfo:k,backend:n,bias:c,activation:g,preluActivationWeights:f,leakyreluAlpha:w});const y=Object(a.reshape)({inputs:{x:v},backend:n,attrs:{shape:k.outShape}});return x.push(v),x.forEach((e=>n.disposeIntermediateTensorInfo(e))),y}const d={kernelName:s.FusedConv2D,backendName:"webgl",kernelFunc:u}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/FusedDepthwiseConv2D.js": +/*!***********************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/FusedDepthwiseConv2D.js ***! + \***********************************************************************************/ +/*! exports provided: fusedDepthwiseConv2D, fusedDepthwiseConv2DConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"fusedDepthwiseConv2D",(function(){return a})),n.d(t,"fusedDepthwiseConv2DConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../conv_gpu_depthwise */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/conv_gpu_depthwise.js"),r=n(/*! ../conv_packed_gpu_depthwise */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/conv_packed_gpu_depthwise.js"),i=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:u,filter:d,bias:l,preluActivationWeights:c}=t,{strides:f,pad:p,dilations:m,dimRoundingMode:h,activation:b,leakyreluAlpha:j}=a,g=[];let w=m;null==w&&(w=[1,1]),s.util.assert(s.backend_util.eitherStridesOrDilationsAreOne(f,w),(()=>`Error in depthwiseConv2d: Either strides or dilations must be 1. Got strides ${f} and dilations '${w}'`));const _=s.backend_util.computeConv2DInfo(u.shape,d.shape,f,w,p,h,!0),k=Object(s.env)().getBool("WEBGL_PACK_DEPTHWISECONV")&&_.strideWidth<=2&&_.outChannels/_.inChannels==1,v=b?Object(i.mapActivationToShaderProgram)(b,k):null,x=[u,d],y=null!=l,O=null!=c,I="leakyrelu"===b;if(y&&x.push(l),O&&x.push(c),I){const e=n.makeTensorInfo([],"float32",s.util.createScalarValue(j,"float32"));x.push(e),g.push(e)}let C;C=k?new r.DepthwiseConvPacked2DProgram(_,y,v,O,I):new o.DepthwiseConv2DProgram(_,y,v,O,I);const S=[[_.padInfo.top,_.padInfo.left],[_.strideHeight,_.strideWidth],[_.dilationHeight,_.dilationWidth],[_.inHeight,_.inWidth]],T=n.runWebGLProgram(C,x,"float32",S);return g.forEach((e=>n.disposeIntermediateTensorInfo(e))),T}const u={kernelName:s.FusedDepthwiseConv2D,backendName:"webgl",kernelFunc:a}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/GatherNd.js": +/*!***********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/GatherNd.js ***! + \***********************************************************************/ +/*! exports provided: gatherNd, gatherNdConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"gatherNd",(function(){return a})),n.d(t,"gatherNdConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../gather_nd_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/gather_nd_gpu.js"),r=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"),i=n(/*! ./Reshape */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function a(e){const{inputs:t,backend:n}=e,{params:a,indices:u}=t,d=u.shape,l=d[d.length-1],c=s.util.sizeFromShape(a.shape),[f,p,m,h]=s.backend_util.prepareAndValidate(a,u),b=Object(i.reshape)({inputs:{x:u},backend:n,attrs:{shape:[p,l]}}),j=Object(i.reshape)({inputs:{x:a},backend:n,attrs:{shape:[s.util.sizeFromShape(a.shape)/m,m]}});if(n.shouldExecuteOnCPU([a,u])||"string"===a.dtype){const e=n.readSync(u.dataId),t=n.bufferSync(a),s=Object(r.gatherNdImplCPU)(e,t,a.dtype,p,l,m,h,a.shape,c);return n.makeTensorInfo(f,a.dtype,s.values)}const g=new o.GatherNDProgram(l,h,[p,m]),w=n.runWebGLProgram(g,[j,b],j.dtype),_=Object(i.reshape)({inputs:{x:w},backend:n,attrs:{shape:f}});return n.disposeIntermediateTensorInfo(b),n.disposeIntermediateTensorInfo(j),n.disposeIntermediateTensorInfo(w),_}const u={kernelName:s.GatherNd,backendName:"webgl",kernelFunc:a}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/GatherV2.js": +/*!***********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/GatherV2.js ***! + \***********************************************************************/ +/*! exports provided: gatherV2, gatherV2Config */function(e,t,n){"use strict";n.r(t),n.d(t,"gatherV2",(function(){return a})),n.d(t,"gatherV2Config",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../gather_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/gather_gpu.js"),r=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"),i=n(/*! ./Reshape */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:u,indices:d}=t,{axis:l,batchDims:c}=a,f=s.util.parseAxisParam(l,u.shape)[0],p=s.backend_util.segment_util.collectGatherOpShapeInfo(u,d,f,c),m=s.util.sizeFromShape(d.shape),h=[],b=Object(i.reshape)({inputs:{x:u},backend:n,attrs:{shape:[p.batchSize,p.outerSize,p.dimSize,p.sliceSize]}}),j=Object(i.reshape)({inputs:{x:d},backend:n,attrs:{shape:[p.batchSize,m/p.batchSize]}});h.push(b),h.push(j);const g=[p.batchSize,p.outerSize,m/p.batchSize,p.sliceSize];if(n.shouldExecuteOnCPU([u,d])||"string"===u.dtype){const e=n.bufferSync(j),t=n.bufferSync(b),s=Object(r.gatherV2ImplCPU)(t,e,g);return h.forEach((e=>n.disposeIntermediateTensorInfo(e))),n.makeTensorInfo(p.outputShape,s.dtype,s.values)}const w=new o.GatherProgram(b.shape,g),_=n.runWebGLProgram(w,[b,j],b.dtype);h.push(_);const k=Object(i.reshape)({inputs:{x:_},backend:n,attrs:{shape:p.outputShape}});return h.forEach((e=>n.disposeIntermediateTensorInfo(e))),k}const u={kernelName:s.GatherV2,backendName:"webgl",kernelFunc:a}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Greater.js": +/*!**********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Greater.js ***! + \**********************************************************************/ +/*! exports provided: greater, greaterConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"greater",(function(){return i})),n.d(t,"greaterConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),r=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i=Object(o.binaryKernelFunc)({opSnippet:"return float(a > b);",packedOpSnippet:"\n return vec4(greaterThan(a, b));\n",cpuKernelImpl:r.greaterImplCPU,dtype:"bool"}),a={kernelName:s.Greater,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/GreaterEqual.js": +/*!***************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/GreaterEqual.js ***! + \***************************************************************************/ +/*! exports provided: greaterEqual, greaterEqualConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"greaterEqual",(function(){return i})),n.d(t,"greaterEqualConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),r=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i=Object(o.binaryKernelFunc)({opSnippet:"return float(a >= b);",packedOpSnippet:"\n return vec4(greaterThanEqual(a, b));\n",dtype:"bool",cpuKernelImpl:r.greaterEqualImplCPU}),a={kernelName:s.GreaterEqual,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/IFFT.js": +/*!*******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/IFFT.js ***! + \*******************************************************************/ +/*! exports provided: ifft, ifftConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"ifft",(function(){return r})),n.d(t,"ifftConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./FFT_impl */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/FFT_impl.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n}=e,{input:s}=t;return Object(o.fftImpl)(s,!0,n)}const i={kernelName:s.IFFT,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Identity.js": +/*!***********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Identity.js ***! + \***********************************************************************/ +/*! exports provided: identity, identityConfig */function(e,t,n){"use strict"; +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function s(e){const{inputs:t,backend:n}=e,{x:s}=t;return n.incRef(s.dataId),{dataId:s.dataId,shape:s.shape,dtype:s.dtype}}n.r(t),n.d(t,"identity",(function(){return s})),n.d(t,"identityConfig",(function(){return o}));const o={kernelName:n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js").Identity,backendName:"webgl",kernelFunc:s}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Imag.js": +/*!*******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Imag.js ***! + \*******************************************************************/ +/*! exports provided: imag, imagConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"imag",(function(){return r})),n.d(t,"imagConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Identity */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Identity.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n}=e,{input:s}=t,r=n.texData.get(s.dataId);return Object(o.identity)({inputs:{x:r.complexTensorInfos.imag},backend:n})}const i={kernelName:s.Imag,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/IsFinite.js": +/*!***********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/IsFinite.js ***! + \***********************************************************************/ +/*! exports provided: isFinite, isFiniteConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"isFinite",(function(){return r})),n.d(t,"isFiniteConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)({opSnippet:"return float(!isnan(x) && !isinf(x));",dtype:"bool"}),i={kernelName:s.IsFinite,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/IsInf.js": +/*!********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/IsInf.js ***! + \********************************************************************/ +/*! exports provided: isInf, isInfConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"isInf",(function(){return r})),n.d(t,"isInfConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)({opSnippet:"return float(isinf(x));",dtype:"bool"}),i={kernelName:s.IsInf,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/IsNaN.js": +/*!********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/IsNaN.js ***! + \********************************************************************/ +/*! exports provided: isNaN, isNaNConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"isNaN",(function(){return r})),n.d(t,"isNaNConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)({opSnippet:"return float(isnan(x));",dtype:"bool"}),i={kernelName:s.IsNan,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/LRN.js": +/*!******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/LRN.js ***! + \******************************************************************/ +/*! exports provided: lrn, LRNConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"lrn",(function(){return i})),n.d(t,"LRNConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../lrn_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/lrn_gpu.js"),r=n(/*! ../lrn_packed_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/lrn_packed_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i=e=>{const{inputs:t,backend:n,attrs:i}=e,{x:a}=t,{depthRadius:u,bias:d,alpha:l,beta:c}=i,f=Object(s.env)().getBool("WEBGL_PACK_NORMALIZATION")?new r.LRNPackedProgram(a.shape,u,d,l,c):new o.LRNProgram(a.shape,u,d,l,c);return n.runWebGLProgram(f,[a],a.dtype)},a={kernelName:s.LRN,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/LRNGrad.js": +/*!**********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/LRNGrad.js ***! + \**********************************************************************/ +/*! exports provided: lrnGrad, LRNGradConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"lrnGrad",(function(){return r})),n.d(t,"LRNGradConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../lrn_grad_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/lrn_grad_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=e=>{const{inputs:t,backend:n,attrs:s}=e,{x:r,y:i,dy:a}=t,{depthRadius:u,bias:d,alpha:l,beta:c}=s,f=new o.LRNGradProgram(r.shape,u,d,l,c);return n.runWebGLProgram(f,[r,i,a],r.dtype)},i={kernelName:s.LRNGrad,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/LeakyRelu.js": +/*!************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/LeakyRelu.js ***! + \************************************************************************/ +/*! exports provided: LEAKYRELU, LEAKYRELU_PACKED, leakyRelu, leakyReluConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"LEAKYRELU",(function(){return i})),n.d(t,"LEAKYRELU_PACKED",(function(){return a})),n.d(t,"leakyRelu",(function(){return u})),n.d(t,"leakyReluConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../binaryop_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/binaryop_gpu.js"),r=n(/*! ../binaryop_packed_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/binaryop_packed_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i="return (a < 0.) ? b * a : a;",a="\n vec4 aLessThanZero = vec4(lessThan(a, vec4(0.)));\n return (aLessThanZero * (b * a)) + ((vec4(1.0) - aLessThanZero) * a);\n";function u(e){const{inputs:t,backend:n,attrs:u}=e,{x:d}=t,{alpha:l}=u,c=n.makeTensorInfo([],"float32",s.util.createScalarValue(l,"float32")),f=Object(s.env)().getBool("WEBGL_PACK_BINARY_OPERATIONS")?new r.BinaryOpPackedProgram(a,d.shape,c.shape):new o.BinaryOpProgram(i,d.shape,c.shape),p=n.runWebGLProgram(f,[d,c],d.dtype);return n.disposeIntermediateTensorInfo(c),p}const d={kernelName:s.LeakyRelu,backendName:"webgl",kernelFunc:u}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Less.js": +/*!*******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Less.js ***! + \*******************************************************************/ +/*! exports provided: less, lessConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"less",(function(){return i})),n.d(t,"lessConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),r=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i=Object(o.binaryKernelFunc)({opSnippet:"return float(a < b);",packedOpSnippet:"\n return vec4(lessThan(a, b));\n",cpuKernelImpl:r.lessImplCPU,dtype:"bool"}),a={kernelName:s.Less,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/LessEqual.js": +/*!************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/LessEqual.js ***! + \************************************************************************/ +/*! exports provided: LESS_EQUAL, LESS_EQUAL_PACKED, lessEqual, lessEqualConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"LESS_EQUAL",(function(){return i})),n.d(t,"LESS_EQUAL_PACKED",(function(){return a})),n.d(t,"lessEqual",(function(){return u})),n.d(t,"lessEqualConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),r=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i="return float(a <= b);",a="\n return vec4(lessThanEqual(a, b));\n",u=Object(o.binaryKernelFunc)({opSnippet:i,packedOpSnippet:a,cpuKernelImpl:r.lessEqualImplCPU,dtype:"bool"}),d={kernelName:s.LessEqual,backendName:"webgl",kernelFunc:u}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/LinSpace.js": +/*!***********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/LinSpace.js ***! + \***********************************************************************/ +/*! exports provided: linSpace, linSpaceConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"linSpace",(function(){return r})),n.d(t,"linSpaceConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{backend:t,attrs:n}=e,{start:s,stop:r,num:i}=n,a=Object(o.linSpaceImplCPU)(s,r,i);return t.makeTensorInfo([a.length],"float32",a)}const i={kernelName:s.LinSpace,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Log.js": +/*!******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Log.js ***! + \******************************************************************/ +/*! exports provided: log, logConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"log",(function(){return i})),n.d(t,"logConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),r=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i=Object(o.unaryKernelFunc)({opSnippet:"if (x < 0.0) return NAN;\n return log(x);",packedOpSnippet:"\n vec4 result = log(x);\n vec4 isNaN = vec4(lessThan(x, vec4(0.0)));\n result.r = isNaN.r == 1.0 ? NAN : result.r;\n result.g = isNaN.g == 1.0 ? NAN : result.g;\n result.b = isNaN.b == 1.0 ? NAN : result.b;\n result.a = isNaN.a == 1.0 ? NAN : result.a;\n\n return result;\n",cpuKernelImpl:r.logImplCPU}),a={kernelName:s.Log,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Log1p.js": +/*!********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Log1p.js ***! + \********************************************************************/ +/*! exports provided: log1p, log1pConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"log1p",(function(){return r})),n.d(t,"log1pConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)({opSnippet:"return log(1.0 + x);"}),i={kernelName:s.Log1p,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/LogicalAnd.js": +/*!*************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/LogicalAnd.js ***! + \*************************************************************************/ +/*! exports provided: logicalAnd, logicalAndConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"logicalAnd",(function(){return r})),n.d(t,"logicalAndConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.binaryKernelFunc)({opSnippet:"return float(a >= 1.0 && b >= 1.0);",packedOpSnippet:"\n return vec4(\n vec4(greaterThanEqual(a, vec4(1.0))) *\n vec4(greaterThanEqual(b, vec4(1.0))));\n",dtype:"bool"}),i={kernelName:s.LogicalAnd,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/LogicalNot.js": +/*!*************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/LogicalNot.js ***! + \*************************************************************************/ +/*! exports provided: logicalNot, logicalNotConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"logicalNot",(function(){return r})),n.d(t,"logicalNotConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)({opSnippet:"return float(!(x >= 1.0));"}),i={kernelName:s.LogicalNot,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/LogicalOr.js": +/*!************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/LogicalOr.js ***! + \************************************************************************/ +/*! exports provided: logicalOr, logicalOrConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"logicalOr",(function(){return r})),n.d(t,"logicalOrConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.binaryKernelFunc)({opSnippet:"return float(a >= 1.0 || b >= 1.0);",packedOpSnippet:"\n return min(\n vec4(greaterThanEqual(a, vec4(1.0))) +\n vec4(greaterThanEqual(b, vec4(1.0))),\n vec4(1.0));\n",dtype:"bool"}),i={kernelName:s.LogicalOr,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Max.js": +/*!******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Max.js ***! + \******************************************************************/ +/*! exports provided: max, maxConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"max",(function(){return a})),n.d(t,"maxConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"),r=n(/*! ./Max_impl */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Max_impl.js"),i=n(/*! ./Transpose_impl */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose_impl.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:u}=t,{reductionIndices:d,keepDims:l}=a,c=u.shape.length,f=s.util.parseAxisParam(d,u.shape);let p=f;const m=s.backend_util.getAxesPermutation(p,c),h=null!=m,b=n.shouldExecuteOnCPU([u]);let j=u;if(h){if(b){const e=n.texData.get(j.dataId).values,t=new Array(c);for(let e=0;e`Error in maxPool: Either strides or dilations must be 1. Got strides ${l} and dilations '1'`));const p=s.backend_util.computePool2DInfo(u.shape,d,l,1,c,f);if(1===p.filterWidth&&1===p.filterHeight&&s.util.arraysEqual(p.inShape,p.outShape))return Object(i.identity)({inputs:{x:u},backend:n});const m=new o.Pool2DProgram(p,"max",!1);return n.runWebGLProgram(m,[u],u.dtype)}const u={kernelName:s.MaxPool,backendName:"webgl",kernelFunc:a}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPool3D.js": +/*!************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPool3D.js ***! + \************************************************************************/ +/*! exports provided: maxPool3d, maxPool3DConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"maxPool3d",(function(){return r})),n.d(t,"maxPool3DConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../pool_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/pool_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:r}=e,{x:i}=t,{filterSize:a,strides:u,pad:d,dataFormat:l,dimRoundingMode:c}=r,f=s.backend_util.computePool3DInfo(i.shape,a,u,[1,1,1],d,c,l),p=new o.Pool3DProgram(f,"max",!1);return n.runWebGLProgram(p,[i],i.dtype)}const i={kernelName:s.MaxPool3D,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPool3DGrad.js": +/*!****************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPool3DGrad.js ***! + \****************************************************************************/ +/*! exports provided: maxPool3DGrad, maxPoolGrad3DConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"maxPool3DGrad",(function(){return i})),n.d(t,"maxPoolGrad3DConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../max_pool_backprop_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/max_pool_backprop_gpu.js"),r=n(/*! ../pool_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/pool_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e){const{inputs:t,backend:n,attrs:i}=e,{dy:a,input:u}=t,d=u,{filterSize:l,strides:c,pad:f,dimRoundingMode:p}=i,m=s.backend_util.computePool3DInfo(d.shape,l,c,[1,1,1],f,p),h=new r.Pool3DProgram(m,"max",!0),b=n.runWebGLProgram(h,[d],d.dtype),j=new o.MaxPool3DBackpropProgram(m),g=n.runWebGLProgram(j,[a,b],d.dtype);return n.disposeIntermediateTensorInfo(b),g}const a={kernelName:s.MaxPool3DGrad,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPoolGrad.js": +/*!**************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPoolGrad.js ***! + \**************************************************************************/ +/*! exports provided: maxPoolGrad, maxPoolGradConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"maxPoolGrad",(function(){return a})),n.d(t,"maxPoolGradConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../max_pool_backprop_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/max_pool_backprop_gpu.js"),r=n(/*! ../pool_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/pool_gpu.js"),i=n(/*! ../webgl_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/webgl_util.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function a(e){const{inputs:t,backend:n,attrs:a}=e,{dy:u,input:d,output:l}=t,c=d;Object(i.assertNotComplex)([d,l],"maxPoolGrad");const{filterSize:f,strides:p,pad:m,dimRoundingMode:h}=a,b=s.backend_util.computePool2DInfo(c.shape,f,p,1,m,h),j=new r.Pool2DProgram(b,"max",!0),g=n.runWebGLProgram(j,[c],c.dtype),w=new o.MaxPool2DBackpropProgram(b),_=n.runWebGLProgram(w,[u,g],c.dtype);return n.disposeIntermediateTensorInfo(g),_}const u={kernelName:s.MaxPoolGrad,backendName:"webgl",kernelFunc:a}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPoolWithArgmax.js": +/*!********************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPoolWithArgmax.js ***! + \********************************************************************************/ +/*! exports provided: maxPoolWithArgmaxConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"maxPoolWithArgmaxConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./MaxPoolWithArgmax_impl */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPoolWithArgmax_impl.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r={kernelName:s.MaxPoolWithArgmax,backendName:"webgl",kernelFunc:({inputs:e,attrs:t,backend:n})=>{const{x:r}=e,{filterSize:i,strides:a,pad:u,includeBatchInIndex:d}=t,l=n;s.util.assert(4===r.shape.length,(()=>`Error in maxPool: input must be rank 4 but got rank ${r.shape.length}.`));const c=[1,1];s.util.assert(s.backend_util.eitherStridesOrDilationsAreOne(a,c),(()=>`Error in maxPool: Either strides or dilations must be 1. Got strides ${a} and dilations '${c}'`));const f=s.backend_util.computePool2DInfo(r.shape,i,a,c,u),[p,m]=Object(o.maxPoolWithArgmaxImpl)(r,d,f,l);return[p,m]}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPoolWithArgmax_impl.js": +/*!*************************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPoolWithArgmax_impl.js ***! + \*************************************************************************************/ +/*! exports provided: maxPoolWithArgmaxImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"maxPoolWithArgmaxImpl",(function(){return o}));var s=n(/*! ../pool_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/pool_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */function o(e,t,n,o){let r=new s.Pool2DProgram(n,"max",!1);const i=o.runWebGLProgram(r,[e],"float32");r=new s.Pool2DProgram(n,"max",!0,!0,t);return[i,o.runWebGLProgram(r,[e],"float32")]}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Max_impl.js": +/*!***********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Max_impl.js ***! + \***********************************************************************/ +/*! exports provided: maxImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"maxImpl",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/reduce */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/reduce.js"),r=n(/*! ../kernels/Reshape */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e,t,n,i){const a=s.util.sizeFromShape(t),u=s.util.sizeFromShape(e.shape)/a,d=Object(r.reshape)({inputs:{x:e},attrs:{shape:[u,a]},backend:i}),l=Object(o.reduce)(d,e.dtype,"max",i),c=Object(r.reshape)({inputs:{x:l},attrs:{shape:n},backend:i});return i.disposeIntermediateTensorInfo(d),i.disposeIntermediateTensorInfo(l),c}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Maximum.js": +/*!**********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Maximum.js ***! + \**********************************************************************/ +/*! exports provided: maximum, maximumConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"maximum",(function(){return l})),n.d(t,"maximumConfig",(function(){return c}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../binaryop_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/binaryop_gpu.js"),r=n(/*! ../binaryop_packed_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/binaryop_packed_gpu.js"),i=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),a=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const u=o.CHECK_NAN_SNIPPET+"\n return max(a, b);\n",d="\n vec4 result = vec4(max(a, b));\n vec4 isNaN = min(vec4(isnan(a)) + vec4(isnan(b)), vec4(1.0));\n "+r.CHECK_NAN_SNIPPET+"\n return result;\n",l=Object(i.binaryKernelFunc)({opSnippet:u,packedOpSnippet:d,cpuKernelImpl:a.maximumImplCPU}),c={kernelName:s.Maximum,backendName:"webgl",kernelFunc:l}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Mean.js": +/*!*******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Mean.js ***! + \*******************************************************************/ +/*! exports provided: meanConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"meanConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Mean_impl */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Mean_impl.js"),r=n(/*! ./Transpose_impl */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose_impl.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i={kernelName:s.Mean,backendName:"webgl",kernelFunc:({inputs:e,attrs:t,backend:n})=>{const{x:i}=e,{keepDims:a,axis:u}=t,d=n,l=i.shape.length,c=s.util.parseAxisParam(u,i.shape);let f=c;const p=s.backend_util.getAxesPermutation(f,l),m=null!=p,h=d.shouldExecuteOnCPU([i]),b=[];let j=i;if(m){if(h){const e=d.texData.get(j.dataId).values,t=new Array(l);for(let e=0;e{const{x:i}=e,{paddings:a,mode:u}=n,d=Object(s.env)().getBool("WEBGL_PACK_ARRAY_OPERATIONS")?new r.MirrorPadPackedProgram(i.shape,a,u):new o.MirrorPadProgram(i.shape,a,u);return t.runWebGLProgram(d,[i],i.dtype)},a={kernelName:s.MirrorPad,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Mod.js": +/*!******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Mod.js ***! + \******************************************************************/ +/*! exports provided: mod, modConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"mod",(function(){return a})),n.d(t,"modConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../binaryop_packed_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/binaryop_packed_gpu.js"),r=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i="\n vec4 result = mod(a, b);\n vec4 isNaN = vec4(equal(b, vec4(0.0)));\n "+o.CHECK_NAN_SNIPPET+"\n return result;\n",a=Object(r.binaryKernelFunc)({opSnippet:"if (b == 0.0) return NAN;\n return mod(a, b);",packedOpSnippet:i}),u={kernelName:s.Mod,backendName:"webgl",kernelFunc:a}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Multinomial.js": +/*!**************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Multinomial.js ***! + \**************************************************************************/ +/*! exports provided: multinomial, multinomialConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"multinomial",(function(){return i})),n.d(t,"multinomialConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../multinomial_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/multinomial_gpu.js"),r=n(/*! ./Softmax */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Softmax.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e){const{inputs:t,backend:n,attrs:s}=e,{logits:i}=t,{numSamples:a,seed:u,normalized:d}=s,l=d?i:Object(r.softmax)({inputs:{logits:i},backend:n,attrs:{dim:i.shape.length-1}}),c=l.shape[0],f=l.shape[1],p=new o.MultinomialProgram(c,f,a),m=[[u]],h=n.runWebGLProgram(p,[l],"int32",m);return d||n.disposeIntermediateTensorInfo(l),h}const a={kernelName:s.Multinomial,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Multiply.js": +/*!***********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Multiply.js ***! + \***********************************************************************/ +/*! exports provided: multiply, multiplyConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"multiply",(function(){return l})),n.d(t,"multiplyConfig",(function(){return c}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../binaryop_complex_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/binaryop_complex_gpu.js"),r=n(/*! ../binaryop_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/binaryop_gpu.js"),i=n(/*! ../binaryop_packed_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/binaryop_packed_gpu.js"),a=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"),u=n(/*! ./Complex */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Complex.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const d="return a * b;";function l(e){const{inputs:t,backend:n}=e,{a:l,b:c}=t,f=s.backend_util.upcastType(l.dtype,c.dtype);if("complex64"===l.dtype){const e=n.texData.get(l.dataId),t=n.texData.get(c.dataId),s=new o.BinaryOpComplexProgram(o.COMPLEX_MULTIPLY.REAL,l.shape,c.shape),r=new o.BinaryOpComplexProgram(o.COMPLEX_MULTIPLY.IMAG,l.shape,c.shape),i=[{dataId:e.complexTensorInfos.real.dataId,dtype:e.complexTensorInfos.real.dtype,shape:l.shape},{dataId:e.complexTensorInfos.imag.dataId,dtype:e.complexTensorInfos.imag.dtype,shape:l.shape},{dataId:t.complexTensorInfos.real.dataId,dtype:t.complexTensorInfos.real.dtype,shape:c.shape},{dataId:t.complexTensorInfos.imag.dataId,dtype:t.complexTensorInfos.imag.dtype,shape:c.shape}],a=n.runWebGLProgram(s,i,"float32"),d=n.runWebGLProgram(r,i,"float32"),f=Object(u.complex)({inputs:{real:a,imag:d},backend:n});return n.disposeIntermediateTensorInfo(a),n.disposeIntermediateTensorInfo(d),f}if(n.shouldExecuteOnCPU([l,c])){const e=n.texData.get(l.dataId),t=n.texData.get(c.dataId),[s,o]=Object(a.multiplyImplCPU)(l.shape,c.shape,e.values,t.values,f),r=n.makeTensorInfo(o,f);return n.texData.get(r.dataId).values=s,r}let p;return p=Object(s.env)().getBool("WEBGL_PACK_BINARY_OPERATIONS")?new i.BinaryOpPackedProgram(d,l.shape,c.shape):new r.BinaryOpProgram(d,l.shape,c.shape),n.runWebGLProgram(p,[l,c],f)}const c={kernelName:s.Multiply,backendName:"webgl",kernelFunc:l}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Neg.js": +/*!******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Neg.js ***! + \******************************************************************/ +/*! exports provided: neg, negConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"neg",(function(){return u})),n.d(t,"negConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"),r=n(/*! ../unaryop_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/unaryop_gpu.js"),i=n(/*! ../unaryop_packed_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/unaryop_packed_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const a="return -x;";function u(e){const{inputs:t,backend:n}=e,{x:u}=t;if(n.shouldExecuteOnCPU([u])){const e=n.texData.get(u.dataId),[t,s]=Object(o.negImplCPU)(e.values,u.shape,u.dtype);return n.makeTensorInfo(s,u.dtype,t)}let d;return d=Object(s.env)().getBool("WEBGL_PACK_UNARY_OPERATIONS")?new i.UnaryOpPackedProgram(u.shape,a):new r.UnaryOpProgram(u.shape,a),n.runWebGLProgram(d,[u],u.dtype)}const d={kernelName:s.Neg,backendName:"webgl",kernelFunc:u}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/NonMaxSuppressionV3.js": +/*!**********************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/NonMaxSuppressionV3.js ***! + \**********************************************************************************/ +/*! exports provided: nonMaxSuppressionV3, nonMaxSuppressionV3Config */function(e,t,n){"use strict";n.r(t),n.d(t,"nonMaxSuppressionV3",(function(){return r})),n.d(t,"nonMaxSuppressionV3Config",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */const o=s.kernel_impls.nonMaxSuppressionV3Impl;function r(e){s.backend_util.warn("tf.nonMaxSuppression() in webgl locks the UI thread. Call tf.nonMaxSuppressionAsync() instead");const{inputs:t,backend:n,attrs:r}=e,{boxes:i,scores:a}=t,{maxOutputSize:u,iouThreshold:d,scoreThreshold:l}=r,c=n.readSync(i.dataId),f=n.readSync(a.dataId),{selectedIndices:p}=o(c,f,u,d,l);return n.makeTensorInfo([p.length],"int32",new Int32Array(p))}const i={kernelName:s.NonMaxSuppressionV3,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/NonMaxSuppressionV4.js": +/*!**********************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/NonMaxSuppressionV4.js ***! + \**********************************************************************************/ +/*! exports provided: nonMaxSuppressionV4, nonMaxSuppressionV4Config */function(e,t,n){"use strict";n.r(t),n.d(t,"nonMaxSuppressionV4",(function(){return r})),n.d(t,"nonMaxSuppressionV4Config",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */const o=s.kernel_impls.nonMaxSuppressionV4Impl;function r(e){s.backend_util.warn("tf.nonMaxSuppression() in webgl locks the UI thread. Call tf.nonMaxSuppressionAsync() instead");const{inputs:t,backend:n,attrs:r}=e,{boxes:i,scores:a}=t,{maxOutputSize:u,iouThreshold:d,scoreThreshold:l,padToMaxOutputSize:c}=r,f=n.readSync(i.dataId),p=n.readSync(a.dataId),{selectedIndices:m,validOutputs:h}=o(f,p,u,d,l,c);return[n.makeTensorInfo([m.length],"int32",new Int32Array(m)),n.makeTensorInfo([],"int32",new Int32Array([h]))]}const i={kernelName:s.NonMaxSuppressionV4,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/NonMaxSuppressionV5.js": +/*!**********************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/NonMaxSuppressionV5.js ***! + \**********************************************************************************/ +/*! exports provided: nonMaxSuppressionV5, nonMaxSuppressionV5Config */function(e,t,n){"use strict";n.r(t),n.d(t,"nonMaxSuppressionV5",(function(){return r})),n.d(t,"nonMaxSuppressionV5Config",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */const o=s.kernel_impls.nonMaxSuppressionV5Impl;function r(e){s.backend_util.warn("tf.nonMaxSuppression() in webgl locks the UI thread. Call tf.nonMaxSuppressionAsync() instead");const{inputs:t,backend:n,attrs:r}=e,{boxes:i,scores:a}=t,{maxOutputSize:u,iouThreshold:d,scoreThreshold:l,softNmsSigma:c}=r,f=n.readSync(i.dataId),p=n.readSync(a.dataId),m=u,h=d,b=l,j=c,{selectedIndices:g,selectedScores:w}=o(f,p,m,h,b,j);return[n.makeTensorInfo([g.length],"int32",new Int32Array(g)),n.makeTensorInfo([w.length],"float32",new Float32Array(w))]}const i={kernelName:s.NonMaxSuppressionV5,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/NotEqual.js": +/*!***********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/NotEqual.js ***! + \***********************************************************************/ +/*! exports provided: notEqual, notEqualConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"notEqual",(function(){return i})),n.d(t,"notEqualConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),r=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i=Object(o.binaryKernelFunc)({opSnippet:"return float(a != b);",cpuKernelImpl:r.notEqualImplCPU,dtype:"bool"}),a={kernelName:s.NotEqual,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/OneHot.js": +/*!*********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/OneHot.js ***! + \*********************************************************************/ +/*! exports provided: oneHot, oneHotConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"oneHot",(function(){return i})),n.d(t,"oneHotConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../onehot_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/onehot_gpu.js"),r=n(/*! ./Reshape */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i=e=>{const{inputs:t,backend:n,attrs:i}=e,{indices:a}=t,{depth:u,onValue:d,offValue:l}=i,c=s.util.sizeFromShape(a.shape),f=new o.OneHotProgram(c,u,d,l),p=Object(r.reshape)({inputs:{x:a},backend:n,attrs:{shape:[c]}}),m=n.runWebGLProgram(f,[p],a.dtype);n.disposeIntermediateTensorInfo(p);const h=[...a.shape,u],b=Object(r.reshape)({inputs:{x:m},backend:n,attrs:{shape:h}});return n.disposeIntermediateTensorInfo(m),b},a={kernelName:s.OneHot,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/OnesLike.js": +/*!***********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/OnesLike.js ***! + \***********************************************************************/ +/*! exports provided: onesLike, onesLikeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"onesLike",(function(){return d})),n.d(t,"onesLikeConfig",(function(){return l}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Complex */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Complex.js"),r=n(/*! ./Fill */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Fill.js"),i=n(/*! ./Imag */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Imag.js"),a=n(/*! ./Real */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Real.js"),u=n(/*! ./ZerosLike */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/ZerosLike.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function d(e){const{inputs:t,backend:n}=e,{x:s}=t;if("string"===s.dtype)throw new Error("onesLike is not supported under string dtype");if("complex64"===s.dtype){const e=Object(a.real)({inputs:{input:s},backend:n}),t=d({inputs:{x:e},backend:n}),r=Object(i.imag)({inputs:{input:s},backend:n}),l=Object(u.zerosLike)({inputs:{x:r},backend:n}),c=Object(o.complex)({inputs:{real:t,imag:l},backend:n});return n.disposeIntermediateTensorInfo(e),n.disposeIntermediateTensorInfo(t),n.disposeIntermediateTensorInfo(r),n.disposeIntermediateTensorInfo(l),c}return Object(r.fill)({attrs:{shape:s.shape,dtype:s.dtype,value:1},backend:n})}const l={kernelName:s.OnesLike,backendName:"webgl",kernelFunc:d}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Pack.js": +/*!*******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Pack.js ***! + \*******************************************************************/ +/*! exports provided: pack, packConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"pack",(function(){return i})),n.d(t,"packConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Concat */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Concat.js"),r=n(/*! ./ExpandDims */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/ExpandDims.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e){const{inputs:t,backend:n,attrs:i}=e,{axis:a}=i;if(1===t.length)return Object(r.expandDims)({inputs:{input:t[0]},backend:n,attrs:{dim:a}});const u=t[0].shape,d=t[0].dtype;t.forEach((e=>{s.util.assertShapesMatch(u,e.shape,"All tensors passed to stack must have matching shapes"),s.util.assert(d===e.dtype,(()=>"All tensors passed to stack must have matching dtypes"))}));const l=[],c=t.map((e=>{const t=Object(r.expandDims)({inputs:{input:e},backend:n,attrs:{dim:a}});return l.push(t),t})),f=Object(o.concat)({inputs:c,backend:n,attrs:{axis:a}});return l.forEach((e=>n.disposeIntermediateTensorInfo(e))),f}const a={kernelName:s.Pack,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/PadV2.js": +/*!********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/PadV2.js ***! + \********************************************************************/ +/*! exports provided: padV2, padV2Config */function(e,t,n){"use strict";n.r(t),n.d(t,"padV2",(function(){return a})),n.d(t,"padV2Config",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../pad_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/pad_gpu.js"),r=n(/*! ../pad_packed_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/pad_packed_gpu.js"),i=n(/*! ./Fill */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Fill.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const a=e=>{const{inputs:t,backend:n,attrs:a}=e,{x:u}=t,{paddings:d,constantValue:l}=a;if(0===s.util.sizeFromShape(u.shape)){const e=d.map(((e,t)=>e[0]+u.shape[t]+e[1]));return Object(i.fill)({backend:n,attrs:{shape:e,value:l,dtype:u.dtype}})}const c=Object(s.env)().getBool("WEBGL_PACK_ARRAY_OPERATIONS")?new r.PadPackedProgram(u.shape,d,l):new o.PadProgram(u.shape,d,l),f=[[l]];return n.runWebGLProgram(c,[u],u.dtype,f)},u={kernelName:s.PadV2,backendName:"webgl",kernelFunc:a}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Pow.js": +/*!******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Pow.js ***! + \******************************************************************/ +/*! exports provided: pow, powConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"pow",(function(){return a})),n.d(t,"powConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../binaryop_packed_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/binaryop_packed_gpu.js"),r=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i="\n // isModRound1 has 1 for components with round(mod(b, 2.0)) == 1, 0 otherwise.\n vec4 isModRound1 = vec4(equal(round(mod(b, 2.0)), ivec4(1)));\n vec4 multiplier = sign(a) * isModRound1 + (vec4(1.0) - isModRound1);\n vec4 result = multiplier * pow(abs(a), b);\n\n // Ensure that a^0 = 1, including 0^0 = 1 as this correspond to TF and JS\n bvec4 isExpZero = equal(b, vec4(0.0));\n result.r = isExpZero.r ? 1.0 : result.r;\n result.g = isExpZero.g ? 1.0 : result.g;\n result.b = isExpZero.b ? 1.0 : result.b;\n result.a = isExpZero.a ? 1.0 : result.a;\n\n vec4 isNaN = vec4(lessThan(a, vec4(0.0))) * vec4(lessThan(floor(b), b));\n "+o.CHECK_NAN_SNIPPET+"\n return result;\n",a=Object(r.binaryKernelFunc)({opSnippet:"\n if(a < 0.0 && floor(b) < b){\n return NAN;\n }\n if (b == 0.0) {\n return 1.0;\n }\n return (round(mod(b, 2.0)) != 1) ?\n pow(abs(a), b) : sign(a) * pow(abs(a), b);\n",packedOpSnippet:i}),u={kernelName:s.Pow,backendName:"webgl",kernelFunc:a}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Prelu.js": +/*!********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Prelu.js ***! + \********************************************************************/ +/*! exports provided: PRELU, PRELU_PACKED, prelu, preluConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"PRELU",(function(){return i})),n.d(t,"PRELU_PACKED",(function(){return a})),n.d(t,"prelu",(function(){return u})),n.d(t,"preluConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../binaryop_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/binaryop_gpu.js"),r=n(/*! ../binaryop_packed_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/binaryop_packed_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i="return (a < 0.) ? b * a : a;",a="\n vec4 aLessThanZero = vec4(lessThan(a, vec4(0.)));\n return (aLessThanZero * (b * a)) + ((vec4(1.0) - aLessThanZero) * a);\n";function u(e){const{inputs:t,backend:n}=e,{x:u,alpha:d}=t,l=Object(s.env)().getBool("WEBGL_PACK_BINARY_OPERATIONS")?new r.BinaryOpPackedProgram(a,u.shape,d.shape):new o.BinaryOpProgram(i,u.shape,d.shape);return n.runWebGLProgram(l,[u,d],u.dtype)}const d={kernelName:s.Prelu,backendName:"webgl",kernelFunc:u}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Prod.js": +/*!*******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Prod.js ***! + \*******************************************************************/ +/*! exports provided: prod, prodConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"prod",(function(){return u})),n.d(t,"prodConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/reduce */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/reduce.js"),r=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"),i=n(/*! ./Reshape */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"),a=n(/*! ./Transpose */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function u(e){const{inputs:t,backend:n,attrs:u}=e,{x:d}=t,{axis:l,keepDims:c}=u,f=d.shape.length,p=[],m=s.util.parseAxisParam(l,d.shape);let h=m;const b=s.backend_util.getAxesPermutation(h,f);let j,g=d;if(null!=b&&(g=Object(a.transpose)({inputs:{x:d},backend:n,attrs:{perm:b}}),h=s.backend_util.getInnerMostAxes(h.length,f),p.push(g)),s.backend_util.assertAxesAreInnerMostDims("prod",h,f),n.shouldExecuteOnCPU([g])){const e=n.texData.get(g.dataId).values,{outVals:t,outShape:s,outDtype:o}=Object(r.prodImplCPU)(g.shape,g.dtype,e,h);j=n.makeTensorInfo(s,o,t)}else{const[e,t]=s.backend_util.computeOutAndReduceShapes(g.shape,h),r=s.util.sizeFromShape(t),a=Object(i.reshape)({inputs:{x:g},backend:n,attrs:{shape:[-1,r]}}),u=Object(s.sumOutType)(d.dtype),l=Object(o.reduce)(a,u,"prod",n);j=Object(i.reshape)({inputs:{x:l},backend:n,attrs:{shape:e}}),p.push(a),p.push(l)}if(c){p.push(j);const e=s.backend_util.expandShapeToKeepDim(j.shape,m);j=Object(i.reshape)({inputs:{x:j},backend:n,attrs:{shape:e}})}return p.forEach((e=>n.disposeIntermediateTensorInfo(e))),j}const d={kernelName:s.Prod,backendName:"webgl",kernelFunc:u}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Range.js": +/*!********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Range.js ***! + \********************************************************************/ +/*! exports provided: range, rangeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"range",(function(){return r})),n.d(t,"rangeConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=e=>{const{backend:t,attrs:n}=e,{start:s,stop:r,step:i,dtype:a}=n,u=Object(o.rangeImplCPU)(s,r,i,a);return t.makeTensorInfo([u.length],a,u)},i={kernelName:s.Range,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Real.js": +/*!*******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Real.js ***! + \*******************************************************************/ +/*! exports provided: real, realConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"real",(function(){return r})),n.d(t,"realConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Identity */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Identity.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n}=e,{input:s}=t,r=n.texData.get(s.dataId);return Object(o.identity)({inputs:{x:r.complexTensorInfos.real},backend:n})}const i={kernelName:s.Real,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/RealDiv.js": +/*!**********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/RealDiv.js ***! + \**********************************************************************/ +/*! exports provided: realDiv, realDivConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"realDiv",(function(){return r})),n.d(t,"realDivConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.binaryKernelFunc)({opSnippet:"\nif (a == b) {\n return 1.0;\n};\nreturn a / b;",packedOpSnippet:"\n // vec4 one = vec4(equal(a, b));\n // return one + (vec4(1.0) - one) * a / b;\n vec4 result = a / b;\n if(a.x == b.x) {\n result.x = 1.;\n }\n if(a.y == b.y) {\n result.y = 1.;\n }\n if(a.z == b.z) {\n result.z = 1.;\n }\n if(a.w == b.w) {\n result.w = 1.;\n }\n\n return result;\n",checkOutOfBounds:!0}),i={kernelName:s.RealDiv,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Reciprocal.js": +/*!*************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Reciprocal.js ***! + \*************************************************************************/ +/*! exports provided: reciprocal, reciprocalConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"reciprocal",(function(){return r})),n.d(t,"reciprocalConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)({opSnippet:"return 1.0 / x;"}),i={kernelName:s.Reciprocal,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Relu.js": +/*!*******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Relu.js ***! + \*******************************************************************/ +/*! exports provided: relu, reluConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"relu",(function(){return i})),n.d(t,"reluConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=n(/*! ../unaryop_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/unaryop_gpu.js").CHECK_NAN_SNIPPET+"\n return (x < 0.0) ? 0.0 : x;\n",i=Object(o.unaryKernelFunc)({opSnippet:r,packedOpSnippet:"\n vec4 result = x * vec4(greaterThanEqual(x, vec4(0.0)));\n bvec4 isNaN = isnan(x);\n\n result.r = isNaN.r ? x.r : result.r;\n result.g = isNaN.g ? x.g : result.g;\n result.b = isNaN.b ? x.b : result.b;\n result.a = isNaN.a ? x.a : result.a;\n\n return result;\n"}),a={kernelName:s.Relu,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Relu6.js": +/*!********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Relu6.js ***! + \********************************************************************/ +/*! exports provided: relu6, relu6Config */function(e,t,n){"use strict";n.r(t),n.d(t,"relu6",(function(){return i})),n.d(t,"relu6Config",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=n(/*! ../unaryop_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/unaryop_gpu.js").CHECK_NAN_SNIPPET+"\n return (x < 0.0) ? 0.0 : min(6.0, x);\n",i=Object(o.unaryKernelFunc)({opSnippet:r,packedOpSnippet:"\n vec4 result = min(x, vec4(6.)) * vec4(greaterThanEqual(x, vec4(0.0)));\n bvec4 isNaN = isnan(x);\n\n result.r = isNaN.r ? x.r : result.r;\n result.g = isNaN.g ? x.g : result.g;\n result.b = isNaN.b ? x.b : result.b;\n result.a = isNaN.a ? x.a : result.a;\n\n return result;\n"}),a={kernelName:s.Relu6,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js": +/*!**********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js ***! + \**********************************************************************/ +/*! exports provided: reshape, reshapeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"reshape",(function(){return i})),n.d(t,"reshapeConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/reshape */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/reshape.js"),r=n(/*! ../webgl_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/webgl_util.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e){const{inputs:t,backend:n,attrs:i}=e,{x:a}=t,{shape:u}=i,d=n,l=s.util.sizeFromShape(a.shape),c=s.util.inferFromImplicitShape(u,l),f=s.util.sizeFromShape(c);s.util.assert(l===f,(()=>`The new shape (${c}) has ${f} elements and the old shape (${a.shape}) has ${l} elements. The new shape and old shape must have the same number of elements.`));const p=d.texData.get(a.dataId);return!p.isPacked||Object(r.isReshapeFree)(a.shape,c)||null!==p.texture&&Object(r.isReshapeFree)(p.shape,c)?(d.incRef(a.dataId),{dataId:a.dataId,shape:c,dtype:a.dtype}):Object(o.packedReshape)(a,c,d)}const a={kernelName:s.Reshape,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/ResizeBilinear.js": +/*!*****************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/ResizeBilinear.js ***! + \*****************************************************************************/ +/*! exports provided: resizeBilinear, resizeBilinearConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"resizeBilinear",(function(){return i})),n.d(t,"resizeBilinearConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../resize_bilinear_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/resize_bilinear_gpu.js"),r=n(/*! ../resize_bilinear_packed_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/resize_bilinear_packed_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e){const{inputs:t,backend:n,attrs:i}=e,{images:a}=t,{alignCorners:u,halfPixelCenters:d,size:l}=i,[c,f]=l,p=Object(s.env)().getBool("WEBGL_PACK_IMAGE_OPERATIONS")?new r.ResizeBilinearPackedProgram(a.shape,c,f,u,d):new o.ResizeBilinearProgram(a.shape,c,f,u,d);return n.runWebGLProgram(p,[a],"float32")}const a={kernelName:s.ResizeBilinear,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/ResizeBilinearGrad.js": +/*!*********************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/ResizeBilinearGrad.js ***! + \*********************************************************************************/ +/*! exports provided: resizeBilinearGrad, resizeBilinearGradConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"resizeBilinearGrad",(function(){return r})),n.d(t,"resizeBilinearGradConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../resize_bilinear_backprop_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/resize_bilinear_backprop_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:s}=e,{images:r,dy:i}=t,{alignCorners:a}=s,u=new o.ResizeBilinearBackpropProgram(i.shape,r.shape,a);return n.runWebGLProgram(u,[i],i.dtype)}const i={kernelName:s.ResizeBilinearGrad,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/ResizeNearestNeighbor.js": +/*!************************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/ResizeNearestNeighbor.js ***! + \************************************************************************************/ +/*! exports provided: resizeNearestNeighbor, resizeNearestNeighborConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"resizeNearestNeighbor",(function(){return i})),n.d(t,"resizeNearestNeighborConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../resize_nearest_neighbor_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/resize_nearest_neighbor_gpu.js"),r=n(/*! ../resize_nearest_neighbor_packed_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/resize_nearest_neighbor_packed_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e){const{inputs:t,backend:n,attrs:i}=e,{images:a}=t,{alignCorners:u,halfPixelCenters:d,size:l}=i,[c,f]=l,p=Object(s.env)().getBool("WEBGL_PACK_IMAGE_OPERATIONS")?new r.ResizeNearestNeighborPackedProgram(a.shape,c,f,u,d):new o.ResizeNearestNeighborProgram(a.shape,c,f,u,d);return n.runWebGLProgram(p,[a],a.dtype)}const a={kernelName:s.ResizeNearestNeighbor,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/ResizeNearestNeighborGrad.js": +/*!****************************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/ResizeNearestNeighborGrad.js ***! + \****************************************************************************************/ +/*! exports provided: resizeNearestNeighborGrad, resizeNearestNeighborGradConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"resizeNearestNeighborGrad",(function(){return r})),n.d(t,"resizeNearestNeighborGradConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../resize_nearest_neighbor_backprop_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/resize_nearest_neighbor_backprop_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:s}=e,{images:r,dy:i}=t,{alignCorners:a}=s,u=new o.ResizeNearestNeigborBackpropProgram(i.shape,r.shape,a);return n.runWebGLProgram(u,[i],i.dtype)}const i={kernelName:s.ResizeNearestNeighborGrad,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Reverse.js": +/*!**********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Reverse.js ***! + \**********************************************************************/ +/*! exports provided: reverse, reverseConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"reverse",(function(){return a})),n.d(t,"reverseConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../reverse_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/reverse_gpu.js"),r=n(/*! ../reverse_packed_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/reverse_packed_gpu.js"),i=n(/*! ./Identity */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Identity.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:u}=t,{dims:d}=a,l=u.shape.length,c=s.util.parseAxisParam(d,u.shape);if(0===l)return Object(i.identity)({inputs:{x:u},backend:n});const f=Object(s.env)().getBool("WEBGL_PACK_ARRAY_OPERATIONS")?new r.ReversePackedProgram(u.shape,c):new o.ReverseProgram(u.shape,c);return n.runWebGLProgram(f,[u],u.dtype)}const u={kernelName:s.Reverse,backendName:"webgl",kernelFunc:a}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/RotateWithOffset.js": +/*!*******************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/RotateWithOffset.js ***! + \*******************************************************************************/ +/*! exports provided: rotateWithOffsetConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"rotateWithOffsetConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../rotate_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/rotate_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r={kernelName:s.RotateWithOffset,backendName:"webgl",kernelFunc:({inputs:e,attrs:t,backend:n})=>{const{image:r}=e,{radians:i,fillValue:a,center:u}=t,d=n,l=new o.RotateProgram(r.shape,a),[c,f]=s.backend_util.getImageCenter(u,r.shape[1],r.shape[2]),p=[[c,f,Math.sin(i),Math.cos(i)]];return d.runWebGLProgram(l,[r],r.dtype,p)}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Round.js": +/*!********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Round.js ***! + \********************************************************************/ +/*! exports provided: round, roundConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"round",(function(){return r})),n.d(t,"roundConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)({opSnippet:"\n // OpenGL ES does not support round function.\n // The algorithm is based on banker's rounding.\n float base = floor(x);\n if ((x - base) < 0.5) {\n return floor(x);\n } else if ((x - base) > 0.5) {\n return ceil(x);\n } else {\n if (mod(base, 2.0) == 0.0) {\n return base;\n } else {\n return base + 1.0;\n }\n }\n"}),i={kernelName:s.Round,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Rsqrt.js": +/*!********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Rsqrt.js ***! + \********************************************************************/ +/*! exports provided: rsqrt, rsqrtConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"rsqrt",(function(){return i})),n.d(t,"rsqrtConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),r=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i=Object(o.unaryKernelFunc)({opSnippet:"return inversesqrt(x);",cpuKernelImpl:r.rsqrtImplCPU}),a={kernelName:s.Rsqrt,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/ScatterNd.js": +/*!************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/ScatterNd.js ***! + \************************************************************************/ +/*! exports provided: scatterNd, scatterNdConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"scatterNd",(function(){return i})),n.d(t,"scatterNdConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../scatter_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/scatter_gpu.js"),r=n(/*! ./Reshape */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e){const{inputs:t,backend:n,attrs:i}=e,{indices:a,updates:u}=t,{shape:d}=i,{sliceRank:l,numUpdates:c,sliceSize:f,strides:p,outputSize:m}=s.backend_util.calculateShapes(u,a,d),h=[m/f,f];if(0===m)return n.makeTensorInfo(d,a.dtype);const b=Object(r.reshape)({inputs:{x:a},backend:n,attrs:{shape:[c,l]}}),j=Object(r.reshape)({inputs:{x:u},backend:n,attrs:{shape:[c,f]}}),g=n.makeTensorInfo([],"float32",new Float32Array([0])),w=new o.ScatterProgram(c,l,b.shape.length,j.shape.length,p,h),_=n.runWebGLProgram(w,[j,b,g],j.dtype),k=Object(r.reshape)({inputs:{x:_},backend:n,attrs:{shape:d}});return n.disposeIntermediateTensorInfo(b),n.disposeIntermediateTensorInfo(j),n.disposeIntermediateTensorInfo(_),n.disposeIntermediateTensorInfo(g),k}const a={kernelName:s.ScatterNd,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Select.js": +/*!*********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Select.js ***! + \*********************************************************************/ +/*! exports provided: select, selectConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"select",(function(){return r})),n.d(t,"selectConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../select_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/select_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n}=e,{condition:r,t:i,e:a}=t,u=new o.SelectProgram(r.shape.length,i.shape,i.shape.length);return n.runWebGLProgram(u,[r,i,a],Object(s.upcastType)(i.dtype,a.dtype))}const i={kernelName:s.Select,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Selu.js": +/*!*******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Selu.js ***! + \*******************************************************************/ +/*! exports provided: selu, seluConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"selu",(function(){return i})),n.d(t,"seluConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=`\n // Stable and Attracting Fixed Point (0, 1) for Normalized Weights.\n // see: https://arxiv.org/abs/1706.02515\n float scaleAlpha = ${s.backend_util.SELU_SCALEALPHA};\n float scale = ${s.backend_util.SELU_SCALE};\n return (x >= 0.0) ? scale * x : scaleAlpha * (exp(x) - 1.0);\n`,i=Object(o.unaryKernelFunc)({opSnippet:r}),a={kernelName:s.Selu,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Sigmoid.js": +/*!**********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Sigmoid.js ***! + \**********************************************************************/ +/*! exports provided: sigmoid, sigmoidConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sigmoid",(function(){return a})),n.d(t,"sigmoidConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),r=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i="return 1.0 / (1.0 + exp(-1.0 * x));",a=Object(o.unaryKernelFunc)({opSnippet:i,packedOpSnippet:i,cpuKernelImpl:r.sigmoidImplCPU}),u={kernelName:s.Sigmoid,backendName:"webgl",kernelFunc:a}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Sign.js": +/*!*******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Sign.js ***! + \*******************************************************************/ +/*! exports provided: sign, signConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sign",(function(){return r})),n.d(t,"signConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)({opSnippet:"\n if (isnan(x)) { return 0.0; }\n return sign(x);\n"}),i={kernelName:s.Sign,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Sin.js": +/*!******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Sin.js ***! + \******************************************************************/ +/*! exports provided: sin, sinConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sin",(function(){return i})),n.d(t,"sinConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=o.CHECK_NAN_SNIPPET_UNARY+"\n return sin(x);\n",i=Object(o.unaryKernelFunc)({opSnippet:r}),a={kernelName:s.Sin,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Sinh.js": +/*!*******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Sinh.js ***! + \*******************************************************************/ +/*! exports provided: sinh, sinhConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sinh",(function(){return r})),n.d(t,"sinhConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)({opSnippet:"\n float e2x = exp(x);\n return (e2x - 1.0 / e2x) / 2.0;\n"}),i={kernelName:s.Sinh,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Slice.js": +/*!********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Slice.js ***! + \********************************************************************/ +/*! exports provided: slice, sliceConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"slice",(function(){return a})),n.d(t,"sliceConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"),r=n(/*! ../slice_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/slice_gpu.js"),i=n(/*! ../slice_packed_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/slice_packed_gpu.js");function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:u}=t,{begin:d,size:l}=a,[c,f]=s.slice_util.parseSliceParams(u,d,l);if(s.slice_util.assertParamsValid(u,c,f),0===s.util.sizeFromShape(f))return n.makeTensorInfo(f,u.dtype,[]);if(n.shouldExecuteOnCPU([u])||"string"===u.dtype){const e=n.texData.get(u.dataId),t=Object(o.sliceImplCPU)(e.values,c,f,u.shape,u.dtype);return n.makeTensorInfo(f,u.dtype,t)}const{isPacked:p}=n.texData.get(u.dataId),m=s.slice_util.isSliceContinous(u.shape,c,f);if(p||!m){const e=Object(s.env)().getBool("WEBGL_PACK_ARRAY_OPERATIONS")?new i.SlicePackedProgram(f):new r.SliceProgram(f),t=[c];return n.runWebGLProgram(e,[u],u.dtype,t)}return n.uploadToGPU(u.dataId), +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n,o){const r=o.texData.get(e.dataId),i=o.makeTensorInfo(n,e.dtype),a=o.texData.get(i.dataId);Object.assign(a,r),a.refCount=1,a.shape=n,a.dtype=e.dtype;let u=s.slice_util.computeFlatOffset(t,s.util.computeStrides(e.shape));r.slice&&(u+=r.slice.flatOffset),a.slice={flatOffset:u,origDataId:r.slice&&r.slice.origDataId||e.dataId};const d=o.dataRefCount.get(a.slice.origDataId)||1;return o.dataRefCount.set(a.slice.origDataId,d+1),i}(u,c,f,n)}const u={kernelName:s.Slice,backendName:"webgl",kernelFunc:a}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Softmax.js": +/*!**********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Softmax.js ***! + \**********************************************************************/ +/*! exports provided: softmax, softmaxConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"softmax",(function(){return l})),n.d(t,"softmaxConfig",(function(){return c}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Exp */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Exp.js"),r=n(/*! ./Max */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Max.js"),i=n(/*! ./RealDiv */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/RealDiv.js"),a=n(/*! ./Reshape */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"),u=n(/*! ./Sub */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Sub.js"),d=n(/*! ./Sum */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Sum.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function l(e){const{inputs:t,backend:n,attrs:l}=e,{logits:c}=t,{dim:f}=l,p=s.util.parseAxisParam([f],c.shape),m=Object(r.max)({inputs:{x:c},backend:n,attrs:{reductionIndices:p,keepDims:!1}}),h=s.backend_util.expandShapeToKeepDim(m.shape,p),b=Object(a.reshape)({inputs:{x:m},backend:n,attrs:{shape:h}}),j=Object(u.sub)({inputs:{a:c,b:b},backend:n}),g=Object(o.exp)({inputs:{x:j},backend:n}),w=Object(d.sum)({inputs:{x:g},backend:n,attrs:{axis:p,keepDims:!1}}),_=Object(a.reshape)({inputs:{x:w},backend:n,attrs:{shape:h}}),k=Object(i.realDiv)({inputs:{a:g,b:_},backend:n});return n.disposeIntermediateTensorInfo(m),n.disposeIntermediateTensorInfo(b),n.disposeIntermediateTensorInfo(j),n.disposeIntermediateTensorInfo(g),n.disposeIntermediateTensorInfo(w),n.disposeIntermediateTensorInfo(_),k}const c={kernelName:s.Softmax,backendName:"webgl",kernelFunc:l}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Softplus.js": +/*!***********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Softplus.js ***! + \***********************************************************************/ +/*! exports provided: softplus, softplusConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"softplus",(function(){return r})),n.d(t,"softplusConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)({opSnippet:"\n float epsilon = 1.1920928955078125e-7;\n float threshold = log(epsilon) + 2.0;\n\n bool too_large = x > -threshold;\n bool too_small = x < threshold;\n\n float result;\n float exp_x = exp(x);\n\n if (too_large){\n result = x;\n }\n else if (too_small){\n result = exp_x;\n }\n else{\n result = log(exp_x + 1.0);\n }\n return result;\n"}),i={kernelName:s.Softplus,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/SpaceToBatchND.js": +/*!*****************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/SpaceToBatchND.js ***! + \*****************************************************************************/ +/*! exports provided: spaceToBatchND, spaceToBatchNDConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"spaceToBatchND",(function(){return a})),n.d(t,"spaceToBatchNDConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./PadV2 */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/PadV2.js"),r=n(/*! ./Reshape */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"),i=n(/*! ./Transpose */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const a=e=>{const{inputs:t,backend:n,attrs:a}=e,{x:u}=t,{blockShape:d,paddings:l}=a;s.util.assert(u.shape.length<=4,(()=>"spaceToBatchND for rank > 4 with a WebGL backend not implemented yet"));const c=d.reduce(((e,t)=>e*t)),f=[[0,0]];f.push(...l);for(let e=1+d.length;en.disposeIntermediateTensorInfo(e))),_},u={kernelName:s.SpaceToBatchND,backendName:"webgl",kernelFunc:a}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseFillEmptyRows.js": +/*!**********************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseFillEmptyRows.js ***! + \**********************************************************************************/ +/*! exports provided: sparseFillEmptyRows, sparseFillEmptyRowsConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sparseFillEmptyRows",(function(){return r})),n.d(t,"sparseFillEmptyRowsConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n}=e,{indices:s,values:r,denseShape:i,defaultValue:a}=t;if(1!==i.shape.length)throw new Error(`Dense shape must be a vector, saw:\n ${i.shape}`);if(2!==s.shape.length)throw new Error(`Indices must be a matrix, saw:\n ${s.shape}`);if(1!==r.shape.length)throw new Error(`Values must be a vector, saw:\n ${r.shape}`);if(0!==a.shape.length)throw new Error(`Default value must be a scalar, saw:\n ${a.shape}`);const u=n.readSync(s.dataId),d=n.readSync(r.dataId),l=n.readSync(i.dataId),c=n.readSync(a.dataId)[0],[f,p,m,h,b]=Object(o.sparseFillEmptyRowsImplCPU)(u,s.shape,s.dtype,d,r.dtype,l,c);return[n.makeTensorInfo(p,s.dtype,f),n.makeTensorInfo([p[0]],r.dtype,m),n.makeTensorInfo([h.length],"bool",new Uint8Array(h.map((e=>Number(e))))),n.makeTensorInfo([b.length],s.dtype,new Int32Array(b))]}const i={kernelName:s.SparseFillEmptyRows,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseReshape.js": +/*!****************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseReshape.js ***! + \****************************************************************************/ +/*! exports provided: sparseReshape, sparseReshapeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sparseReshape",(function(){return r})),n.d(t,"sparseReshapeConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n}=e,{inputIndices:s,inputShape:r,newShape:i}=t;if(2!==s.shape.length)throw new Error(`Input indices should be a matrix but received shape ${s.shape}`);if(1!==r.shape.length)throw new Error(`Input shape should be a vector but received shape ${r.shape}`);if(1!==i.shape.length)throw new Error(`Target shape should be a vector but received shape ${i.shape}`);const a=Array.from(n.readSync(r.dataId)),u=n.readSync(s.dataId),d=Array.from(n.readSync(i.dataId)),[l,c,f]=Object(o.sparseReshapeImplCPU)(u,s.shape,s.dtype,a,d);return[n.makeTensorInfo(c,s.dtype,l),n.makeTensorInfo([f.length],i.dtype,new Int32Array(f))]}const i={kernelName:s.SparseReshape,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseSegmentMean.js": +/*!********************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseSegmentMean.js ***! + \********************************************************************************/ +/*! exports provided: sparseSegmentMean, sparseSegmentMeanConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sparseSegmentMean",(function(){return r})),n.d(t,"sparseSegmentMeanConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n}=e,{data:s,indices:r,segmentIds:i}=t;if(s.shape.length<1)throw new Error("Data should be at least 1 dimensional but received scalar");if(1!==r.shape.length)throw new Error(`Indices should be a vector but received shape\n ${r.shape}`);if(1!==i.shape.length)throw new Error(`Segment ids should be a vector but received shape\n ${i.shape}`);const a=n.readSync(s.dataId),u=n.readSync(r.dataId),d=n.readSync(i.dataId),[l,c]=Object(o.sparseSegmentReductionImplCPU)(a,s.shape,s.dtype,u,d,!0);return n.makeTensorInfo(c,s.dtype,l)}const i={kernelName:s.SparseSegmentMean,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseSegmentSum.js": +/*!*******************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseSegmentSum.js ***! + \*******************************************************************************/ +/*! exports provided: sparseSegmentSum, sparseSegmentSumConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sparseSegmentSum",(function(){return r})),n.d(t,"sparseSegmentSumConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n}=e,{data:s,indices:r,segmentIds:i}=t;if(s.shape.length<1)throw new Error("Data should be at least 1 dimensional but received scalar");if(1!==r.shape.length)throw new Error(`Indices should be a vector but received shape\n ${r.shape}`);if(1!==i.shape.length)throw new Error(`Segment ids should be a vector but received shape\n ${i.shape}`);const a=n.readSync(s.dataId),u=n.readSync(r.dataId),d=n.readSync(i.dataId),[l,c]=Object(o.sparseSegmentReductionImplCPU)(a,s.shape,s.dtype,u,d);return n.makeTensorInfo(c,s.dtype,l)}const i={kernelName:s.SparseSegmentSum,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseToDense.js": +/*!****************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseToDense.js ***! + \****************************************************************************/ +/*! exports provided: sparseToDense, sparseToDenseConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sparseToDense",(function(){return i})),n.d(t,"sparseToDenseConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../scatter_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/scatter_gpu.js"),r=n(/*! ./Reshape */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e){const{inputs:t,backend:n,attrs:i}=e,{sparseIndices:a,sparseValues:u,defaultValue:d}=t,{outputShape:l}=i,{sliceRank:c,numUpdates:f,strides:p,outputSize:m}=s.backend_util.calculateShapes(u,a,l),h=new o.ScatterProgram(f,c,a.shape.length,u.shape.length,p,[m,1],!1),b=n.runWebGLProgram(h,[u,a,d],u.dtype),j=Object(r.reshape)({inputs:{x:b},backend:n,attrs:{shape:l}});return n.disposeIntermediateTensorInfo(b),j}const a={kernelName:s.SparseToDense,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/SplitV.js": +/*!*********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/SplitV.js ***! + \*********************************************************************/ +/*! exports provided: splitV, splitVConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"splitV",(function(){return r})),n.d(t,"splitVConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Slice */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Slice.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:r}=e,{x:i}=t,{numOrSizeSplits:a,axis:u}=r,d=s.util.parseAxisParam(u,i.shape)[0],l=s.backend_util.prepareSplitSize(i,a,d),c=i.shape.length,f=new Array(c).fill(0),p=i.shape.slice();return l.map((e=>{const t=[...p];t[d]=e;const s=Object(o.slice)({inputs:{x:i},backend:n,attrs:{begin:f,size:t}});return f[d]+=e,s}))}const i={kernelName:s.SplitV,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Sqrt.js": +/*!*******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Sqrt.js ***! + \*******************************************************************/ +/*! exports provided: sqrt, sqrtConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sqrt",(function(){return a})),n.d(t,"sqrtConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),r=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i="return sqrt(x);",a=Object(o.unaryKernelFunc)({opSnippet:i,packedOpSnippet:i,cpuKernelImpl:r.sqrtImplCPU}),u={kernelName:s.Sqrt,backendName:"webgl",kernelFunc:a}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Square.js": +/*!*********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Square.js ***! + \*********************************************************************/ +/*! exports provided: square, squareConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"square",(function(){return r})),n.d(t,"squareConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)({opSnippet:"return x * x;"}),i={kernelName:s.Square,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/SquaredDifference.js": +/*!********************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/SquaredDifference.js ***! + \********************************************************************************/ +/*! exports provided: squaredDifference, squaredDifferenceConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"squaredDifference",(function(){return i})),n.d(t,"squaredDifferenceConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r="return (a - b) * (a - b);",i=Object(o.binaryKernelFunc)({opSnippet:r,packedOpSnippet:r}),a={kernelName:s.SquaredDifference,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Step.js": +/*!*******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Step.js ***! + \*******************************************************************/ +/*! exports provided: step, stepConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"step",(function(){return r})),n.d(t,"stepConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../unaryop_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/unaryop_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r({inputs:e,attrs:t,backend:n}){const{x:s}=e,r=o.CHECK_NAN_SNIPPET+`\n return x > 0.0 ? 1.0 : float(${t.alpha});\n `,i=new o.UnaryOpProgram(s.shape,r);return n.runWebGLProgram(i,[s],s.dtype)}const i={kernelName:s.Step,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/StridedSlice.js": +/*!***************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/StridedSlice.js ***! + \***************************************************************************/ +/*! exports provided: stridedSlice, stridedSliceConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"stridedSlice",(function(){return u})),n.d(t,"stridedSliceConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"),r=n(/*! ../strided_slice_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/strided_slice_gpu.js"),i=n(/*! ./Reshape */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"),a=n(/*! ./Slice */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Slice.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function u(e){const{inputs:t,backend:n,attrs:u}=e,{x:d}=t,{begin:l,end:c,strides:f,beginMask:p,endMask:m,ellipsisMask:h,newAxisMask:b,shrinkAxisMask:j}=u,{nonStrided:g,$begin:w,$strides:_,size:k,newShape:v,outShape:x}=s.slice_util.sliceInfo(d.shape,l,c,f,p,m,h,b,j),y=Object(i.reshape)({inputs:{x:d},backend:n,attrs:{shape:v}});let O;if(g){const e=Object(a.slice)({inputs:{x:y},backend:n,attrs:{begin:w,size:k}});O=Object(i.reshape)({inputs:{x:e},backend:n,attrs:{shape:x}}),n.disposeIntermediateTensorInfo(e)}else if(x.some((e=>0===e)))O=n.makeTensorInfo(x,d.dtype,[]);else{if(n.shouldExecuteOnCPU([y])){const e=n.texData.get(y.dataId).values,t=Object(s.buffer)(y.shape,y.dtype,e),r=Object(o.stridedSliceImplCPU)(x,t,_,w);O=n.makeTensorInfo(x,y.dtype,r.values)}else{const e=new r.StridedSliceProgram(w,_,x);O=n.runWebGLProgram(e,[y],y.dtype)}}const I=Object(i.reshape)({inputs:{x:O},backend:n,attrs:{shape:x}});return n.disposeIntermediateTensorInfo(y),n.disposeIntermediateTensorInfo(O),I}const d={kernelName:s.StridedSlice,backendName:"webgl",kernelFunc:u}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/StringNGrams.js": +/*!***************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/StringNGrams.js ***! + \***************************************************************************/ +/*! exports provided: stringNGrams, stringNGramsConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"stringNGrams",(function(){return r})),n.d(t,"stringNGramsConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:s}=e,{separator:r,nGramWidths:i,leftPad:a,rightPad:u,padWidth:d,preserveShortSequences:l}=s,{data:c,dataSplits:f}=t,p=n.readSync(c.dataId),m=n.readSync(f.dataId),[h,b]=Object(o.stringNGramsImplCPU)(p,m,r,i,a,u,d,l);return[n.makeTensorInfo([h.length],"string",h),n.makeTensorInfo(f.shape,"int32",b)]}const i={kernelName:s.StringNGrams,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/StringSplit.js": +/*!**************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/StringSplit.js ***! + \**************************************************************************/ +/*! exports provided: stringSplit, stringSplitConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"stringSplit",(function(){return r})),n.d(t,"stringSplitConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:s}=e,{skipEmpty:r}=s,{input:i,delimiter:a}=t;if("string"!==i.dtype)throw new Error("Input must be of datatype string");if(1!==i.shape.length)throw new Error(`Input must be a vector, got shape: ${i.shape}`);if(0!==a.shape.length)throw new Error(`Delimiter must be a scalar, got shape: ${a.shape}`);const u=n.readSync(i.dataId),d=n.readSync(a.dataId)[0],[l,c,f]=Object(o.stringSplitImplCPU)(u,d,r),p=c.length;return[n.makeTensorInfo([p,2],"int32",l),n.makeTensorInfo([p],"string",c),n.makeTensorInfo([2],"int32",new Int32Array(f))]}const i={kernelName:s.StringSplit,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/StringToHashBucketFast.js": +/*!*************************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/StringToHashBucketFast.js ***! + \*************************************************************************************/ +/*! exports provided: stringToHashBucketFast, stringToHashBucketFastConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"stringToHashBucketFast",(function(){return r})),n.d(t,"stringToHashBucketFastConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:s}=e,{numBuckets:r}=s,{input:i}=t;if("string"!==i.dtype)throw new Error("Input must be of datatype string");if(r<=0)throw new Error("Number of buckets must be at least 1");const a=n.readSync(i.dataId),u=Object(o.stringToHashBucketFastImplCPU)(a,r);return n.makeTensorInfo(i.shape,"int32",u)}const i={kernelName:s.StringToHashBucketFast,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Sub.js": +/*!******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Sub.js ***! + \******************************************************************/ +/*! exports provided: sub, subConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sub",(function(){return a})),n.d(t,"subConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"),r=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i="return a - b;",a=Object(o.binaryKernelFunc)({opSnippet:i,packedOpSnippet:i,supportsComplex:!0,cpuKernelImpl:r.subImplCPU}),u={kernelName:s.Sub,backendName:"webgl",kernelFunc:a}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Sum.js": +/*!******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Sum.js ***! + \******************************************************************/ +/*! exports provided: sum, sumConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sum",(function(){return r})),n.d(t,"sumConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Sum_impl */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Sum_impl.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:s}=e,{x:r}=t,{axis:i,keepDims:a}=s;return Object(o.sumImpl)(r,i,a,n)}const i={kernelName:s.Sum,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Sum_impl.js": +/*!***********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Sum_impl.js ***! + \***********************************************************************/ +/*! exports provided: sumImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"sumImpl",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/reduce */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/reduce.js"),r=n(/*! ./Reshape */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"),i=n(/*! ./Transpose_impl */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose_impl.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function a(e,t,n,a){const u=t,d=e.shape.length,l=s.util.parseAxisParam(u,e.shape);let c=l;const f=s.backend_util.getAxesPermutation(c,d),p=null!=f;let m=e;p&&(m=Object(i.transposeImpl)(e,f,a),c=s.backend_util.getInnerMostAxes(c.length,d)),s.backend_util.assertAxesAreInnerMostDims("sum",c,d);const[h,b]=s.backend_util.computeOutAndReduceShapes(m.shape,c);let j=h;n&&(j=s.backend_util.expandShapeToKeepDim(h,l));const g=s.util.sizeFromShape(b),w=s.util.sizeFromShape(e.shape)/g,_=Object(r.reshape)({inputs:{x:m},attrs:{shape:[w,g]},backend:a}),k=Object(s.sumOutType)(e.dtype),v=Object(o.reduce)(_,k,"sum",a),x=Object(r.reshape)({inputs:{x:v},attrs:{shape:j},backend:a});return a.disposeIntermediateTensorInfo(_),a.disposeIntermediateTensorInfo(v),p&&a.disposeIntermediateTensorInfo(m),x}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Tan.js": +/*!******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Tan.js ***! + \******************************************************************/ +/*! exports provided: tan, tanConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"tan",(function(){return r})),n.d(t,"tanConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)({opSnippet:"return tan(x);"}),i={kernelName:s.Tan,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Tanh.js": +/*!*******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Tanh.js ***! + \*******************************************************************/ +/*! exports provided: tanh, tanhConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"tanh",(function(){return r})),n.d(t,"tanhConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/kernel_funcs_utils */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)({opSnippet:"\n float e2x = exp(-2.0 * abs(x));\n return sign(x) * (1.0 - e2x) / (1.0 + e2x);\n"}),i={kernelName:s.Tanh,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Tile.js": +/*!*******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Tile.js ***! + \*******************************************************************/ +/*! exports provided: tile, tileConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"tile",(function(){return i})),n.d(t,"tileConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"),r=n(/*! ../tile_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/tile_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e){const{inputs:t,backend:n,attrs:i}=e,{x:a}=t,{reps:u}=i;if("string"===a.dtype||a.shape.length>5){const e=n.readSync(a.dataId),t="string"===a.dtype?e.map((e=>s.util.decodeString(e))):e,r=Object(s.buffer)(a.shape,a.dtype,t),i=Object(o.tileImplCPU)(r,u);return n.makeTensorInfo(i.shape,i.dtype,i.values)}const d=new r.TileProgram(a.shape,u);return n.runWebGLProgram(d,[a],a.dtype)}const a={kernelName:s.Tile,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/TopK.js": +/*!*******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/TopK.js ***! + \*******************************************************************/ +/*! exports provided: topK, topKConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"topK",(function(){return f})),n.d(t,"topKConfig",(function(){return p}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"),r=n(/*! ../top_k_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/top_k_gpu.js"),i=n(/*! ./Fill */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Fill.js"),a=n(/*! ./GatherV2 */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/GatherV2.js"),u=n(/*! ./Reshape */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"),d=n(/*! ./Slice */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Slice.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function l(e,t){null!==t&&e.disposeIntermediateTensorInfo(t)}function c(e){let t=1;for(;tj){const e=n.readSync(p.dataId),[t,s]=Object(o.topKImplCPU)(e,g,p.dtype,m,h);return[n.makeTensorInfo(t.shape,t.dtype,t.values),n.makeTensorInfo(s.shape,s.dtype,s.values)]}if(0===m)return g[g.length-1]=0,[n.makeTensorInfo(g,p.dtype,[]),n.makeTensorInfo(g,"int32",[])];if(1===w)return[p,Object(i.fill)({attrs:{shape:g,dtype:"int32",value:0},backend:n})];const _=n.texData.get(p.dataId),k=null!==_&&_.isPacked,v=k?n.unpackTensor(p):p,x=s.util.sizeFromShape(g)/w,y=Object(u.reshape)({inputs:{x:v},attrs:{shape:[x,w]},backend:n});k&&l(n,v);const O=c(m),I=c(w);let C=null;const S=()=>null===C?[y,y]:[y,C],T=(e,t,s)=>{const o=S(),i=new r.SwapProgram(s),a=[[w],[null===C?1:0],[Number.NEGATIVE_INFINITY],[e],[t]],u=C;C=n.runWebGLProgram(i,o,"int32",a),l(n,u)};for(let e=1;e=1;n/=2)T(t,n,[x,I])}for(let e=I;e>O;e/=2){const t=S(),s=new r.MergeProgram([x,e/2]),o=[[w],[null===C?1:0],[O]],i=C;C=n.runWebGLProgram(s,t,"int32",o),l(n,i);const a=O/2,u=2*a;for(let e=a;e>=1;e/=2)T(u,e,C.shape)}let N=C;C=Object(d.slice)({inputs:{x:C},backend:n,attrs:{begin:0,size:[x,m]}}),l(n,N);let E=Object(a.gatherV2)({inputs:{x:y,indices:C},backend:n,attrs:{axis:1,batchDims:1}});l(n,y);const A=g.slice(0,-1);A.push(m),N=C,C=Object(u.reshape)({inputs:{x:C},attrs:{shape:A},backend:n}),l(n,N);const R=E;return E=Object(u.reshape)({inputs:{x:E},attrs:{shape:A},backend:n}),l(n,R),[E,C]}const p={kernelName:s.TopK,backendName:"webgl",kernelFunc:f}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Transform.js": +/*!************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Transform.js ***! + \************************************************************************/ +/*! exports provided: transform, transformConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"transform",(function(){return r})),n.d(t,"transformConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../transform_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/transform_gpu.js"); +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:s}=e,{image:r,transforms:i}=t,{interpolation:a,fillMode:u,fillValue:d,outputShape:l}=s,[c,f,p,m]=r.shape,[h,b]=null!=l?l:[f,p],j=[c,h,b,m],g=new o.TransformProgram(f,p,a,u,d,j);return n.runWebGLProgram(g,[r,i],"float32")}const i={kernelName:s.Transform,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose.js": +/*!************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose.js ***! + \************************************************************************/ +/*! exports provided: transpose, transposeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"transpose",(function(){return r})),n.d(t,"transposeConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Transpose_impl */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose_impl.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:s}=e,{x:r}=t,{perm:i}=s,a=n,u=r.shape.length,d=new Array(u);for(let e=0;en.disposeIntermediateTensorInfo(e))),b}const a={kernelName:s.Unpack,backendName:"webgl",kernelFunc:i}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/UnsortedSegmentSum.js": +/*!*********************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/UnsortedSegmentSum.js ***! + \*********************************************************************************/ +/*! exports provided: unsortedSegmentSum, unsortedSegmentSumConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"unsortedSegmentSum",(function(){return d})),n.d(t,"unsortedSegmentSumConfig",(function(){return l}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../segment_gpu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/segment_gpu.js"),r=n(/*! ./Range */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Range.js"),i=n(/*! ./Reshape */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"),a=n(/*! ./Tile */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Tile.js"),u=n(/*! ./Transpose */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function d(e){const{inputs:t,backend:n,attrs:d}=e,{x:l,segmentIds:c}=t,{numSegments:f}=d,p=l.shape.length,m=[];let h=0;const b=s.backend_util.getAxesPermutation([h],p);let j=l;null!=b&&(j=Object(u.transpose)({inputs:{x:l},backend:n,attrs:{perm:b}}),m.push(j),h=s.backend_util.getInnerMostAxes(1,p)[0]);const g=s.backend_util.segment_util.computeOutShape(j.shape,h,f),w=s.util.sizeFromShape([j.shape[h]]),_=Object(i.reshape)({inputs:{x:j},backend:n,attrs:{shape:[-1,w]}});m.push(_);const k=Object(s.sumOutType)(l.dtype),v=(e,t,i,u,d)=>{const l=e.shape[0],c=e.shape[1],f=s.backend_util.segment_util.segOpComputeOptimalWindowSize(c,d),p={windowSize:f,inSize:c,batchSize:l,numSegments:d},h=new o.SegmentOpProgram(p,t),b=n.compileAndRun(h,[e,i],u);if(m.push(b),b.shape[1]===d)return b;const j=Object(r.range)({backend:n,attrs:{start:0,stop:d,step:1,dtype:"float32"}}),g=Object(a.tile)({inputs:{x:j},backend:n,attrs:{reps:[c/f]}});m.push(j),m.push(g);return v(b,t,g,u,d)},x=v(_,"unsortedSegmentSum",c,k,f),y=Object(i.reshape)({inputs:{x:x},backend:n,attrs:{shape:g}});let O=y;if(null!=b){m.push(y);const e=s.backend_util.getUndoAxesPermutation(b);O=Object(u.transpose)({inputs:{x:O},backend:n,attrs:{perm:e}})}return m.forEach((e=>n.disposeIntermediateTensorInfo(e))),O}const l={kernelName:s.UnsortedSegmentSum,backendName:"webgl",kernelFunc:d}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/ZerosLike.js": +/*!************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/ZerosLike.js ***! + \************************************************************************/ +/*! exports provided: zerosLike, zerosLikeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"zerosLike",(function(){return u})),n.d(t,"zerosLikeConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Complex */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Complex.js"),r=n(/*! ./Fill */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Fill.js"),i=n(/*! ./Imag */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Imag.js"),a=n(/*! ./Real */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Real.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function u(e){const{inputs:t,backend:n}=e,{x:s}=t;if("complex64"===s.dtype){const e=Object(a.real)({inputs:{input:s},backend:n}),t=u({inputs:{x:e},backend:n}),r=Object(i.imag)({inputs:{input:s},backend:n}),d=u({inputs:{x:r},backend:n}),l=Object(o.complex)({inputs:{real:t,imag:d},backend:n});return n.disposeIntermediateTensorInfo(e),n.disposeIntermediateTensorInfo(t),n.disposeIntermediateTensorInfo(r),n.disposeIntermediateTensorInfo(d),l}return Object(r.fill)({attrs:{shape:s.shape,dtype:s.dtype,value:"string"===s.dtype?"":0},backend:n})}const d={kernelName:s.ZerosLike,backendName:"webgl",kernelFunc:u}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/_FusedMatMul.js": +/*!***************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/_FusedMatMul.js ***! + \***************************************************************************/ +/*! exports provided: _fusedMatMul, _fusedMatMulConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"_fusedMatMul",(function(){return r})),n.d(t,"_fusedMatMulConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./BatchMatMul_impl */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/BatchMatMul_impl.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:s}=e,{a:r,b:i,bias:a,preluActivationWeights:u}=t,{transposeA:d,transposeB:l,activation:c,leakyreluAlpha:f}=s;return Object(o.batchMatMulImpl)({a:r,b:i,transposeA:d,transposeB:l,backend:n,bias:a,preluActivationWeights:u,leakyreluAlpha:f,activation:c})}const i={kernelName:s._FusedMatMul,backendName:"webgl",kernelFunc:r}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/lrn_gpu.js": +/*!**************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/lrn_gpu.js ***! + \**************************************************************/ +/*! exports provided: LRNProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"LRNProgram",(function(){return s})); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class s{constructor(e,t,n,s,o){this.variableNames=["x"],this.outputShape=[];const r=t,i=e[3]-1;let a;this.outputShape=e;const u=`float(${n}) + float(${s}) * sum`;a=.5===o?`inversesqrt(${u})`:1===o?`1.0/(${u})`:`exp(log(${u}) * float(-${o}));`,this.userCode=`\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int r = coords[1];\n int c = coords[2];\n int d = coords[3];\n float x = getX(b, r, c, d);\n float sum = 0.0;\n for (int j = -${r}; j <= ${r}; j++) {\n int idx = d + j;\n if (idx >= 0 && idx <= ${i}) {\n float z = getX(b, r, c, idx);\n sum += z * z;\n }\n }\n float val = x * ${a};\n setOutput(val);\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/lrn_grad_gpu.js": +/*!*******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/lrn_grad_gpu.js ***! + \*******************************************************************/ +/*! exports provided: LRNGradProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"LRNGradProgram",(function(){return s})); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class s{constructor(e,t,n,s,o){this.variableNames=["inputImage","outputImage","dy"],this.outputShape=[],this.outputShape=e,this.depth=e[3],this.depthRadius=t,this.bias=n,this.alpha=s,this.beta=o,this.userCode=`\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int r = coords[1];\n int c = coords[2];\n\n float result = 0.0;\n for (int d = 0; d < ${this.depth}; ++d) {\n int depthBegin = int(max(0.0, float(d - ${t})));\n int depthEnd = int(min(float(${this.depth}),\n float(d + ${t} + 1)));\n\n const int MIN_DEPTH_BEGIN = 0;\n const int MAX_DEPTH_END = ${this.depth};\n\n float norm = 0.0;\n for (int k = MIN_DEPTH_BEGIN; k < MAX_DEPTH_END; ++k) {\n if (k < depthBegin){\n continue;\n }\n else if (k >= depthBegin && k < depthEnd) {\n norm += getInputImage(b, r, c, k) * getInputImage(b, r, c, k);\n }\n else {\n break;\n }\n }\n\n norm = float(${s}) * norm + float(${n});\n\n for(int k = MIN_DEPTH_BEGIN; k < MAX_DEPTH_END; ++k){\n if (k < depthBegin){\n continue;\n }\n else if (k >= depthBegin && k < depthEnd){\n float dyi = -2.0 * float(${s})\n * float(${o})\n * getInputImage(b ,r ,c, k) * getOutputImage(b, r, c, d)\n / norm;\n if (k == d) {\n dyi += pow(norm, -1.0 * ${o});\n }\n if (k == coords[3]) {\n dyi *= getDy(b, r, c, d);\n result += dyi;\n }\n }\n else {\n break;\n }\n }\n }\n setOutput(result);\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/lrn_packed_gpu.js": +/*!*********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/lrn_packed_gpu.js ***! + \*********************************************************************/ +/*! exports provided: LRNPackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"LRNPackedProgram",(function(){return s})); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class s{constructor(e,t,n,s,o){this.variableNames=["x"],this.outputShape=[],this.packedInputs=!0,this.packedOutput=!0;const r=t,i=e[3]-1;let a;this.outputShape=e;const u=`float(${n}) + float(${s}) * sum`;a=.5===o?`inversesqrt(${u})`:1===o?`1.0/(${u})`:`exp(log(${u}) * float(-${o}));`,this.userCode=`\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords.x;\n int r = coords.y;\n int c = coords.z;\n int d = coords.w;\n\n bool hasNextCol = d < ${this.outputShape[3]};\n bool hasNextRow = c < ${this.outputShape[2]};\n\n vec4 sum = vec4(0.);\n vec4 xFragAtOutputCoords = getX(b, r, c, d);\n\n vec4 xAtOutputCoords = vec4(\n getChannel(xFragAtOutputCoords, vec2(c, d)),\n hasNextCol ?\n getChannel(xFragAtOutputCoords, vec2(c, d + 1)) : 0.0,\n hasNextRow ?\n getChannel(xFragAtOutputCoords , vec2(c + 1, d)) : 0.0,\n (hasNextRow && hasNextCol) ?\n getChannel(xFragAtOutputCoords, vec2(c + 1, d + 1)) : 0.0\n );\n\n int firstChannel = d - ${r};\n vec2 cache = vec2(0.);\n if(firstChannel >= 0){\n vec4 firstChannelFrag = getX(b, r, c, firstChannel);\n cache.x = getChannel(firstChannelFrag, vec2(c, firstChannel));\n if(hasNextRow){\n cache.y = getChannel(firstChannelFrag, vec2(c + 1, firstChannel));\n }\n }\n\n ivec2 depth = ivec2(d, d + 1);\n for (int j = - ${r}; j <= ${r}; j++) {\n ivec2 idx = depth + j;\n bvec2 aboveLowerBound = greaterThanEqual(idx, ivec2(0));\n bvec2 belowUpperBound = lessThanEqual(idx, ivec2(${i}));\n\n bool depthInRange = aboveLowerBound.x && belowUpperBound.x;\n bool depthPlusOneInRange = aboveLowerBound.y && belowUpperBound.y;\n\n if(depthInRange || depthPlusOneInRange){\n vec4 z = vec4(0.);\n vec4 xFragAtCurrentDepth;\n z.xz = cache.xy;\n if(depthPlusOneInRange && hasNextCol){\n xFragAtCurrentDepth = idx.y != d ?\n getX(b, r, c, idx.y) : xFragAtOutputCoords;\n z.y = getChannel(xFragAtCurrentDepth, vec2(c, idx.y));\n if(hasNextRow){\n z.w = getChannel(xFragAtCurrentDepth, vec2(c + 1, idx.y));\n }\n }\n cache.xy = z.yw;\n sum += z * z;\n }\n }\n vec4 result = xAtOutputCoords * ${a};\n setOutput(result);\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/max_pool_backprop_gpu.js": +/*!****************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/max_pool_backprop_gpu.js ***! + \****************************************************************************/ +/*! exports provided: MaxPool2DBackpropProgram, MaxPool3DBackpropProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"MaxPool2DBackpropProgram",(function(){return s})),n.d(t,"MaxPool3DBackpropProgram",(function(){return o})); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class s{constructor(e){this.variableNames=["dy","maxPos"],this.outputShape=e.inShape;const t=e.strideHeight,n=e.strideWidth,s=e.dilationHeight,o=e.effectiveFilterHeight,r=e.effectiveFilterWidth,i=o-1-e.padInfo.top,a=r-1-e.padInfo.left,u=o*r-1;this.userCode=`\n const ivec2 pads = ivec2(${i}, ${a});\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n\n ivec2 dyRCCorner = coords.yz - pads;\n int dyRCorner = dyRCCorner.x;\n int dyCCorner = dyRCCorner.y;\n\n // Convolve dy(?, ?, d) with pos mask(:, :, d) to get dx(xR, xC, d).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n for (int wR = 0; wR < ${o};\n wR += ${s}) {\n float dyR = float(dyRCorner + wR) / ${t}.0;\n\n if (dyR < 0.0 || dyR >= ${e.outHeight}.0 || fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n for (int wC = 0; wC < ${r}; wC++) {\n float dyC = float(dyCCorner + wC) / ${n}.0;\n\n if (dyC < 0.0 || dyC >= ${e.outWidth}.0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n float dyValue = getDy(b, idyR, idyC, d);\n int maxPosValue = ${u} - int(getMaxPos(b, idyR, idyC, d));\n\n // Get the current value, check it against the value from the\n // position matrix.\n int curPosValue = wR * ${r} + wC;\n float mask = float(maxPosValue == curPosValue ? 1.0 : 0.0);\n\n dotProd += dyValue * mask;\n }\n }\n setOutput(dotProd);\n }\n `}}class o{constructor(e){this.variableNames=["dy","maxPos"],this.outputShape=e.inShape;const t=e.strideDepth,n=e.strideHeight,s=e.strideWidth,o=e.dilationDepth,r=e.dilationHeight,i=e.dilationWidth,a=e.effectiveFilterDepth,u=e.effectiveFilterHeight,d=e.effectiveFilterWidth,l=a-1-e.padInfo.front,c=u-1-e.padInfo.top,f=d-1-e.padInfo.left,p=a*u*d-1;this.userCode=`\n const ivec3 pads = ivec3(${l}, ${c}, ${f});\n\n void main() {\n ivec5 coords = getOutputCoords();\n int batch = coords.x;\n int ch = coords.u;\n\n ivec3 dyCorner = ivec3(coords.y, coords.z, coords.w) - pads;\n int dyDCorner = dyCorner.x;\n int dyRCorner = dyCorner.y;\n int dyCCorner = dyCorner.z;\n\n // Convolve dy(?, ?, ?, ch) with pos mask(:, :, :, d) to get\n // dx(xD, xR, xC, ch).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n\n for (int wD = 0; wD < ${a};\n wD += ${o}) {\n float dyD = float(dyDCorner + wD) / ${t}.0;\n\n if (dyD < 0.0 || dyD >= ${e.outDepth}.0 || fract(dyD) > 0.0) {\n continue;\n }\n int idyD = int(dyD);\n\n for (int wR = 0; wR < ${u};\n wR += ${r}) {\n float dyR = float(dyRCorner + wR) / ${n}.0;\n\n if (dyR < 0.0 || dyR >= ${e.outHeight}.0 ||\n fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n for (int wC = 0; wC < ${d};\n wC += ${i}) {\n float dyC = float(dyCCorner + wC) / ${s}.0;\n\n if (dyC < 0.0 || dyC >= ${e.outWidth}.0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n float dyValue = getDy(batch, idyD, idyR, idyC, ch);\n int maxPosValue = ${p} -\n int(getMaxPos(batch, idyD, idyR, idyC, ch));\n\n // Get the current value, check it against the value from the\n // position matrix.\n int curPosValue =\n wD * ${u} * ${d} +\n wR * ${d} + wC;\n float mask = float(maxPosValue == curPosValue ? 1.0 : 0.0);\n\n dotProd += dyValue * mask;\n }\n }\n }\n setOutput(dotProd);\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/mean_gpu.js": +/*!***************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/mean_gpu.js ***! + \***************************************************************/ +/*! exports provided: MeanProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"MeanProgram",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */class o{constructor(e,t){this.variableNames=["x"];const{windowSize:n,batchSize:o,inSize:r,outSize:i}=e;this.outputShape=[o,i];const a=4*Math.floor(n/4),u=n%4;let d="sumValue += dot(values, ones);";if(null!=t){const e=1/t;d=`sumValue += dot(values * ${s.util.isInt(e)?e.toPrecision(2):e}, ones);`}let l="";r%n>0&&(l=`\n if (inIdx < 0 || inIdx >= ${r}) {\n return 0.0;\n }\n `),this.userCode=`\n const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0);\n\n float getValue(int batch, int inIdx) {\n ${l}\n return getX(batch, inIdx);\n }\n\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int outIdx = coords[1];\n int inOffset = outIdx * ${n};\n\n float sumValue = 0.0;\n\n for (int i = 0; i < ${a}; i += 4) {\n int inIdx = inOffset + i;\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2),\n getValue(batch, inIdx + 3)\n );\n\n ${d}\n }\n\n int inIdx = inOffset + ${a};\n if (${1===u}) {\n vec4 values = vec4(getValue(batch, inIdx), 0.0, 0.0, 0.0);\n\n ${d}\n } else if (${2===u}) {\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1), 0.0, 0.0);\n\n ${d}\n } else if (${3===u}) {\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2), 0.0);\n\n ${d}\n }\n setOutput(sumValue);\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/mirror_pad_gpu.js": +/*!*********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/mirror_pad_gpu.js ***! + \*********************************************************************/ +/*! exports provided: MirrorPadProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"MirrorPadProgram",(function(){return o}));var s=n(/*! ./shader_compiler */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */class o{constructor(e,t,n){this.variableNames=["x"],this.outputShape=t.map(((t,n)=>t[0]+e[n]+t[1]));const o=e.length,r=Object(s.getCoordsDataType)(o),i=t.map((e=>e[0])).join(","),a=t.map(((t,n)=>t[0]+e[n])).join(","),u=["coords[0]","coords[1]","coords[2]","coords[3]"].slice(0,o),d="reflect"===n?0:1;this.userCode=1!==o?`\n ${r} start = ${r}(${i});\n ${r} end = ${r}(${a});\n\n void main() {\n ${r} outC = getOutputCoords();\n for (int i = 0; i < ${o}; i++) {\n if (outC[i] < start[i]) {\n outC[i] = start[i] * 2 - outC[i] - ${d};\n } else if(outC[i] >= end[i]) {\n outC[i] = (end[i] - 1) * 2 - outC[i] + ${d};\n }\n }\n ${r} coords = outC - start;\n setOutput(getX(${u}));\n }\n `:`\n int start = ${i};\n int end = ${a};\n\n void main() {\n int outC = getOutputCoords();\n if (outC < start) {\n outC = start * 2 - outC - ${d};\n } else if(outC >= end) {\n outC = (end - 1) * 2 - outC + ${d};\n }\n setOutput(getX(outC - start));\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/mirror_pad_packed_gpu.js": +/*!****************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/mirror_pad_packed_gpu.js ***! + \****************************************************************************/ +/*! exports provided: MirrorPadPackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"MirrorPadPackedProgram",(function(){return r}));var s=n(/*! ./packing_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/packing_util.js"),o=n(/*! ./shader_compiler */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class r{constructor(e,t,n){this.variableNames=["x"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=t.map(((t,n)=>t[0]+e[n]+t[1]));const r=e.length,i=Object(o.getCoordsDataType)(r),a=t.map((e=>e[0])).join(","),u=t.map(((t,n)=>t[0]+e[n])).join(","),d=Object(s.getChannels)("rc",r),l=Object(s.getChannels)("source",r),c=`${d[r-1]} < ${this.outputShape[r-1]}`,f=1===r?"source":`vec2(${l.slice(-2).join()})`,p="reflect"===n?0:1;let m="";if(1===r){const e=`\n ${i} source = rc;\n if (source < start) {\n source = start * 2 - source - ${p};\n } else if (source >= end) {\n source = (end - 1) * 2 - source + ${p};\n }\n source -= start;\n `;m=`\n ${i} rc = outputLoc;\n ${e}\n result[0] = getChannel(getX(${l.join()}), ${f});\n ${d[r-1]} += 1;\n if(${c}) {\n ${e}\n result[1] = getChannel(getX(${l.join()}), ${f});\n }\n `}else{const e=`\n ${i} source = rc;\n ${i} lt = ${i}(lessThan(source, start));\n ${i} gte = ${i}(greaterThanEqual(source, end));\n ${i} orig = 1 - (lt + gte);\n source = orig * source +\n lt * (start * 2 - source - ${p}) +\n gte * ((end - 1) * 2 - source + ${p});\n source -= start;\n `;m=`\n ${i} rc = outputLoc;\n ${e}\n result[0] = getChannel(getX(${l.join()}), ${f});\n ${d[r-1]} += 1;\n if(${c}) {\n ${e}\n result[1] = getChannel(getX(${l.join()}), ${f});\n }\n rc = outputLoc;\n ${d[r-2]} += 1;\n if(${d[r-2]} < ${this.outputShape[r-2]}) {\n ${e}\n result[2] = getChannel(getX(${l.join()}), ${f});\n ${d[r-1]} += 1;\n if(${c}) {\n ${e}\n result[3] = getChannel(getX(${l.join()}), ${f});\n }\n }\n `}this.userCode=`\n const ${i} start = ${i}(${a});\n const ${i} end = ${i}(${u});\n\n void main() {\n ${i} outputLoc = getOutputCoords();\n vec4 result = vec4(0.);\n ${m}\n setOutput(result);\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/mulmat_packed_gpu.js": +/*!************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/mulmat_packed_gpu.js ***! + \************************************************************************/ +/*! exports provided: MatMulPackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"MatMulPackedProgram",(function(){return o}));var s=n(/*! ./gpgpu_math */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/gpgpu_math.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */class o{constructor(e,t,n,o=!1,r=!1,i=!1,a=null,u=!1,d=!1){this.variableNames=["matrixA","matrixB"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=n,this.enableShapeUniforms=Object(s.useShapeUniforms)(this.outputShape.length);const l=o?e[1]:e[2],c=Math.ceil(l/2),f=o?"i * 2, rc.y":"rc.y, i * 2",p=r?"rc.z, i * 2":"i * 2, rc.z",m=o?["a.xxyy","a.zzww"]:["a.xxzz","a.yyww"],h=r?["b.xzxz","b.ywyw"]:["b.xyxy","b.zwzw"];let b="",j="";a&&(b=u?`vec4 activation(vec4 a) {\n vec4 b = getPreluActivationWeightsAtOutCoords();\n ${a}\n }`:d?`vec4 activation(vec4 a) {\n vec4 b = getLeakyreluAlphaAtOutCoords();\n ${a}\n }`:`vec4 activation(vec4 x) {\n ${a}\n }`,j="result = activation(result);");const g=i?"result += getBiasAtOutCoords();":"";i&&this.variableNames.push("bias"),u&&this.variableNames.push("preluActivationWeights"),d&&this.variableNames.push("leakyreluAlpha");let w="rc.x",_="rc.x";e[0] ${t[0]}`;let s="";for(let o=e-2;o= ${t[o]}`,o= ${t};\n bool rEdge = rp1 >= ${n};\n `}(t,e[e.length-1],e[e.length-2],n),u=function(e,t){const n=e.length,s=function(e,t){const n=[];for(let s=0;s<=1;s++)for(let o=0;o<=1;o++){let r=`${0===s?"r":"rp1"}, ${0===o?"c":"cp1"}`;for(let n=2;n= ${e[0]} ? 0. : getA(rc + 1),\n 0, 0`;return`getA(${s[0]}),\n cEdge ? 0. : getA(${s[1]}),\n rEdge ? 0. : getA(${s[2]}),\n rEdge || cEdge ? 0. : getA(${s[3]})`}(e,n);this.userCode=`\n void main() {\n ${r} rc = getOutputCoords();\n\n if(${i}) {\n setOutput(vec4(0));\n } else {\n ${a}\n\n setOutput(vec4(${u}));\n }\n }\n `}}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/packing_util.js": +/*!*******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/packing_util.js ***! + \*******************************************************************/ +/*! exports provided: getVecChannels, getChannels, getSourceCoords */function(e,t,n){"use strict"; +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function s(e,t){return["x","y","z","w","u","v"].slice(0,t).map((t=>`${e}.${t}`))}function o(e,t){return 1===t?[e]:s(e,t)}function r(e,t){if(1===e)return"rc";let n="";for(let s=0;st[0]+e[n]+t[1]));const o=e.length,r=Object(s.getCoordsDataType)(o),i=t.map((e=>e[0])).join(","),a=t.map(((t,n)=>t[0]+e[n])).join(","),u=["coords[0]","coords[1]","coords[2]","coords[3]"].slice(0,o);this.userCode=1!==o?`\n ${r} start = ${r}(${i});\n ${r} end = ${r}(${a});\n\n void main() {\n ${r} outC = getOutputCoords();\n if (any(lessThan(outC, start)) || any(greaterThanEqual(outC, end))) {\n setOutput(value);\n } else {\n ${r} coords = outC - start;\n setOutput(getX(${u}));\n }\n }\n `:`\n int start = ${i};\n int end = ${a};\n\n void main() {\n int outC = getOutputCoords();\n if (outC < start || outC >= end) {\n setOutput(value);\n } else {\n setOutput(getX(outC - start));\n }\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/pad_packed_gpu.js": +/*!*********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/pad_packed_gpu.js ***! + \*********************************************************************/ +/*! exports provided: PadPackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"PadPackedProgram",(function(){return r}));var s=n(/*! ./packing_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/packing_util.js"),o=n(/*! ./shader_compiler */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class r{constructor(e,t,n){this.variableNames=["x"],this.packedInputs=!0,this.packedOutput=!0,this.customUniforms=[{name:"value",type:"float"}],this.outputShape=t.map(((t,n)=>t[0]+e[n]+t[1]));const r=e.length,i=Object(o.getCoordsDataType)(r),a=t.map((e=>e[0])).join(","),u=t.map(((t,n)=>t[0]+e[n])).join(","),d=Object(s.getChannels)("rc",r),l=Object(s.getChannels)("source",r),c=`${d[r-1]} < ${this.outputShape[r-1]}`,f=1===r?"source":`vec2(${l.slice(-2).join()})`,p=[`${i} rc = outputLoc;`,`${d[r-1]} += 1;\n if(${c}) {\n `,1===r?"":`}\n rc = outputLoc;\n ${d[r-2]} += 1;\n if(${d[r-2]} < ${this.outputShape[r-2]}) {`,1===r?"":` ${d[r-1]} += 1;\n if(${c}) {`],m=1===r?"rc < start || rc >= end":"any(lessThan(rc, start)) || any(greaterThanEqual(rc, end))";let h="";for(let e=0,t=1===r?2:4;e= ${e.inHeight}) {\n continue;\n }\n\n for (int wC = 0; wC < ${c};\n wC += ${d}) {\n int xC = xCCorner + wC;\n\n if (xC < 0 || xC >= ${e.inWidth}) {\n continue;\n }\n\n float value = getX(batch, xR, xC, d);\n\n // If a min / max value has already been found, use it. If not,\n // use the current value.\n float currMinMaxValue = mix(\n value, minMaxValue, minMaxValueFound);\n if (value ${t} currMinMaxValue) {\n minMaxValue = value;\n minMaxValueFound = 1.0;\n minMaxPosition = ${s?o?h:b:`wR * ${c} + wC`};\n }\n }\n }\n setOutput(float(minMaxPosition));\n }\n `)}let g=`${t}(${t}(${t}(minMaxValue[0], minMaxValue[1]), minMaxValue[2]), minMaxValue[3])`;"avg"===t&&(g="avgValue / count");const w=4*Math.floor(r/4),_=r%4,k=`\n if (${m}) {\n avgValue += dot(values, ones);\n } else {\n minMaxValue = max(values, minMaxValue);\n }\n `;this.userCode=`\n const ivec2 strides = ivec2(${i}, ${a});\n const ivec2 pads = ivec2(${f}, ${p});\n const float initializationValue = ${j};\n const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0);\n\n float count = 0.0;\n\n float getValue(int batch, int xR, int xC, int d) {\n if (xC < 0 || xC >= ${e.inWidth}) {\n return initializationValue;\n }\n count += 1.0;\n return getX(batch, xR, xC, d);\n }\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d = coords[3];\n\n ivec2 xRCCorner = coords.yz * strides - pads;\n int xRCorner = xRCCorner.x;\n int xCCorner = xRCCorner.y;\n\n // max/min x(?, ?, d) to get y(yR, yC, d).\n // ? = to be determined\n vec4 minMaxValue = vec4(${j});\n float avgValue = 0.0;\n count = 0.0;\n\n for (int wR = 0; wR < ${l};\n wR += ${u}) {\n int xR = xRCorner + wR;\n\n if (xR < 0 || xR >= ${e.inHeight}) {\n continue;\n }\n\n for (int wC = 0; wC < ${w}; wC += 4) {\n int xC = xCCorner + wC * ${d};\n\n vec4 values = vec4(\n getValue(batch, xR, xC, d),\n getValue(batch, xR, xC + ${d}, d),\n getValue(batch, xR, xC + 2 * ${d}, d),\n getValue(batch, xR, xC + 3 * ${d}, d)\n );\n\n ${k}\n }\n\n int xC = xCCorner + ${w};\n if (${1===_}) {\n vec4 values = vec4(\n getValue(batch, xR, xC, d),\n initializationValue,\n initializationValue,\n initializationValue\n );\n\n ${k}\n } else if (${2===_}) {\n vec4 values = vec4(\n getValue(batch, xR, xC, d),\n getValue(batch, xR, xC + ${d}, d),\n initializationValue,\n initializationValue\n );\n\n ${k}\n } else if (${3===_}) {\n vec4 values = vec4(\n getValue(batch, xR, xC, d),\n getValue(batch, xR, xC + ${d}, d),\n getValue(batch, xR, xC + 2 * ${d}, d),\n initializationValue\n );\n\n ${k}\n }\n }\n setOutput(${g});\n }\n `}}class o{constructor(e,t,n,s=!1,o=!1){if(this.variableNames=["x"],"avg"===t&&n)throw new Error("Cannot compute positions for average pool.");const r=e.filterWidth,i=e.strideDepth,a=e.strideHeight,u=e.strideWidth,d=e.dilationDepth,l=e.dilationHeight,c=e.dilationWidth,f=e.effectiveFilterDepth,p=e.effectiveFilterHeight,m=e.effectiveFilterWidth,h=e.padInfo.front,b=e.padInfo.top,j=e.padInfo.left;this.outputShape=e.outShape;const g="avg"===t;let w="0.0";if(g||(w="-1.0 / 1e-20"),n){const t=">=";return void(this.userCode=`\n const ivec3 strides =\n ivec3(${i}, ${a}, ${u});\n const ivec3 pads = ivec3(${h}, ${b}, ${j});\n\n void main() {\n ivec5 coords = getOutputCoords();\n int batch = coords.x;\n int ch = coords.u;\n\n ivec3 xCorner = ivec3(coords.y, coords.z, coords.w) * strides - pads;\n int xDCorner = xCorner.x;\n int xRCorner = xCorner.y;\n int xCCorner = xCorner.z;\n\n // max/min x(?, ?, ?, ch) to get y(yD, yR, yC, ch).\n // ? = to be determined\n float minMaxValue = 0.0;\n float minMaxValueFound = 0.0;\n int minMaxPosition = 0;\n\n for (int wD = 0; wD < ${f};\n wD += ${d}) {\n int xD = xDCorner + wD;\n\n if (xD < 0 || xD >= ${e.inDepth}) {\n continue;\n }\n\n for (int wR = 0; wR < ${p};\n wR += ${l}) {\n int xR = xRCorner + wR;\n\n if (xR < 0 || xR >= ${e.inHeight}) {\n continue;\n }\n\n for (int wC = 0; wC < ${m};\n wC += ${c}) {\n int xC = xCCorner + wC;\n\n if (xC < 0 || xC >= ${e.inWidth}) {\n continue;\n }\n\n float value = getX(batch, xD, xR, xC, ch);\n\n // If a min / max value has already been found, use it. If not,\n // use the current value.\n float currMinMaxValue = mix(\n value, minMaxValue, minMaxValueFound);\n if (value ${t} currMinMaxValue) {\n minMaxValue = value;\n minMaxValueFound = 1.0;\n minMaxPosition = ${s?o?`(((batch * ${e.inDepth} + xD) * ${e.inHeight} + xR) * ${e.inWidth} + xC) * ${e.inChannels} + ch`:`((xD * ${e.inHeight} + xR) * ${e.inWidth} + xC) * ${e.inChannels} + ch`:`wD * ${p} * ${m} +\n wR * ${m} + wC`};\n }\n }\n }\n }\n setOutput(float(minMaxPosition));\n }\n `)}let _=`${t}(${t}(${t}(minMaxValue[0], minMaxValue[1]), minMaxValue[2]), minMaxValue[3])`;"avg"===t&&(_="avgValue / count");const k=4*Math.floor(r/4),v=r%4,x=`\n if (${g}) {\n avgValue += dot(values, ones);\n } else {\n minMaxValue = max(values, minMaxValue);\n }\n `;this.userCode=`\n const ivec3 strides =\n ivec3(${i}, ${a}, ${u});\n const ivec3 pads = ivec3(${h}, ${b}, ${j});\n const float initializationValue = ${w};\n const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0);\n\n float count = 0.0;\n\n float getValue(int batch, int xD, int xR, int xC, int ch) {\n if (xC < 0 || xC >= ${e.inWidth}) {\n return initializationValue;\n }\n count += 1.0;\n return getX(batch, xD, xR, xC, ch);\n }\n\n void main() {\n ivec5 coords = getOutputCoords();\n int batch = coords.x;\n int ch = coords.u;\n\n ivec3 xCorner = ivec3(coords.y, coords.z, coords.w) * strides - pads;\n int xDCorner = xCorner.x;\n int xRCorner = xCorner.y;\n int xCCorner = xCorner.z;\n\n // max/min x(?, ?, ?, d) to get y(yD, yR, yC, ch).\n // ? = to be determined\n vec4 minMaxValue = vec4(${w});\n float avgValue = 0.0;\n count = 0.0;\n\n for (int wD = 0; wD < ${f};\n wD += ${d}) {\n int xD = xDCorner + wD;\n\n if (xD < 0 || xD >= ${e.inDepth}) {\n continue;\n }\n\n for (int wR = 0; wR < ${p};\n wR += ${l}) {\n int xR = xRCorner + wR;\n\n if (xR < 0 || xR >= ${e.inHeight}) {\n continue;\n }\n\n for (int wC = 0; wC < ${k}; wC += 4) {\n int xC = xCCorner + wC * ${c};\n\n vec4 values = vec4(\n getValue(batch, xD, xR, xC, ch),\n getValue(batch, xD, xR, xC + ${c}, ch),\n getValue(batch, xD, xR, xC + 2 * ${c}, ch),\n getValue(batch, xD, xR, xC + 3 * ${c}, ch)\n );\n\n ${x}\n }\n\n int xC = xCCorner + ${k};\n if (${1===v}) {\n vec4 values = vec4(\n getValue(batch, xD, xR, xC, ch),\n initializationValue,\n initializationValue,\n initializationValue\n );\n\n ${x}\n } else if (${2===v}) {\n vec4 values = vec4(\n getValue(batch, xD, xR, xC, ch),\n getValue(batch, xD, xR, xC + ${c}, ch),\n initializationValue,\n initializationValue\n );\n\n ${x}\n } else if (${3===v}) {\n vec4 values = vec4(\n getValue(batch, xD, xR, xC, ch),\n getValue(batch, xD, xR, xC + ${c}, ch),\n getValue(batch, xD, xR, xC + 2 * ${c}, ch),\n initializationValue\n );\n\n ${x}\n }\n }\n setOutput(${_});\n }\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/reduce_gpu.js": +/*!*****************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/reduce_gpu.js ***! + \*****************************************************************/ +/*! exports provided: ReduceProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"ReduceProgram",(function(){return s})); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class s{constructor(e,t){this.variableNames=["x"];const{windowSize:n,batchSize:s,inSize:o,outSize:r}=e;this.outputShape=[s,r];let i="0.0",a="";"prod"===t?i="1.0":"min"===t?(i="1.0 / 1e-20",a="min"):"max"===t&&(i="-1.0 / 1e-20",a="max");let u=`${t}(${t}(${t}(minMaxValue[0], minMaxValue[1]), minMaxValue[2]), minMaxValue[3])`;"sum"===t?u="sumValue":"prod"===t?u="prodValue":"all"===t?u="allValue":"any"===t&&(u="anyValue");const d=4*Math.floor(n/4),l=n%4;let c=`\n if (${"sum"===t}) {\n sumValue += dot(values, ones);\n } else if (${"prod"===t}) {\n vec2 tmp = vec2(values[0], values[1]) * vec2(values[2], values[3]);\n prodValue *= tmp[0] * tmp[1];\n } else {\n minMaxValue = ${a}(values, minMaxValue);\n if (${"min"===t} || ${"max"===t}) {\n minMaxValue = ${a}(values, minMaxValue);\n bvec4 isNaN = isnan(values);\n if (isNaN.r || isNaN.g || isNaN.b || isNaN.a) {\n minMaxValue = vec4(NAN);\n }\n }\n }\n `,f="vec4";"all"===t?(i="1.0",c="\n bool reducedAllValue = all(values);\n float floatedReducedAllValue = float(reducedAllValue);\n allValue = float(allValue >= 1.0 && floatedReducedAllValue >= 1.0);\n ",f="bvec4"):"any"===t&&(i="0.0",c="\n bool reducedAnyValue = any(values);\n float floatedReducedAnyValue = float(reducedAnyValue);\n anyValue = float(anyValue >= 1.0 || floatedReducedAnyValue >= 1.0);\n ",f="bvec4");let p="";o%n>0&&(p=`\n if (inIdx < 0 || inIdx >= ${o}) {\n return initializationValue;\n }\n `),this.userCode=`\n const float initializationValue = ${i};\n const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0);\n\n float getValue(int batch, int inIdx) {\n ${p}\n return getX(batch, inIdx);\n }\n\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int outIdx = coords[1];\n int inOffset = outIdx * ${n};\n\n vec4 minMaxValue = vec4(${i});\n float prodValue = 1.0;\n float sumValue = 0.0;\n float allValue = 1.0;\n float anyValue = 0.0;\n\n for (int i = 0; i < ${d}; i += 4) {\n int inIdx = inOffset + i;\n ${f} values = ${f}(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2),\n getValue(batch, inIdx + 3)\n );\n\n ${c}\n }\n\n int inIdx = inOffset + ${d};\n if (${1===l}) {\n ${f} values = ${f}(\n getValue(batch, inIdx),\n initializationValue,\n initializationValue,\n initializationValue\n );\n\n ${c}\n } else if (${2===l}) {\n ${f} values = ${f}(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n initializationValue,\n initializationValue\n );\n\n ${c}\n } else if (${3===l}) {\n ${f} values = ${f}(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2),\n initializationValue\n );\n\n ${c}\n }\n setOutput(${u});\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/register_all_kernels.js": +/*!***************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/register_all_kernels.js ***! + \***************************************************************************/ +/*! no exports provided */function(e,t,n){"use strict";n.r(t);var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./kernels/_FusedMatMul */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/_FusedMatMul.js"),r=n(/*! ./kernels/Abs */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Abs.js"),i=n(/*! ./kernels/Acos */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Acos.js"),a=n(/*! ./kernels/Acosh */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Acosh.js"),u=n(/*! ./kernels/Add */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Add.js"),d=n(/*! ./kernels/AddN */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/AddN.js"),l=n(/*! ./kernels/All */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/All.js"),c=n(/*! ./kernels/Any */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Any.js"),f=n(/*! ./kernels/ArgMax */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/ArgMax.js"),p=n(/*! ./kernels/ArgMin */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/ArgMin.js"),m=n(/*! ./kernels/Asin */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Asin.js"),h=n(/*! ./kernels/Asinh */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Asinh.js"),b=n(/*! ./kernels/Atan */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Atan.js"),j=n(/*! ./kernels/Atan2 */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Atan2.js"),g=n(/*! ./kernels/Atanh */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Atanh.js"),w=n(/*! ./kernels/AvgPool */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/AvgPool.js"),_=n(/*! ./kernels/AvgPool3D */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/AvgPool3D.js"),k=n(/*! ./kernels/AvgPool3DGrad */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/AvgPool3DGrad.js"),v=n(/*! ./kernels/AvgPoolGrad */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/AvgPoolGrad.js"),x=n(/*! ./kernels/BatchMatMul */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/BatchMatMul.js"),y=n(/*! ./kernels/BatchNorm */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/BatchNorm.js"),O=n(/*! ./kernels/BatchToSpaceND */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/BatchToSpaceND.js"),I=n(/*! ./kernels/Bincount */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Bincount.js"),C=n(/*! ./kernels/Cast */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Cast.js"),S=n(/*! ./kernels/Ceil */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Ceil.js"),T=n(/*! ./kernels/ClipByValue */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/ClipByValue.js"),N=n(/*! ./kernels/Complex */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Complex.js"),E=n(/*! ./kernels/ComplexAbs */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/ComplexAbs.js"),A=n(/*! ./kernels/Concat */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Concat.js"),R=n(/*! ./kernels/Conv2D */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv2D.js"),F=n(/*! ./kernels/Conv2DBackpropFilter */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv2DBackpropFilter.js"),M=n(/*! ./kernels/Conv2DBackpropInput */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv2DBackpropInput.js"),$=n(/*! ./kernels/Conv3D */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv3D.js"),D=n(/*! ./kernels/Conv3DBackpropFilterV2 */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv3DBackpropFilterV2.js"),P=n(/*! ./kernels/Conv3DBackpropInputV2 */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv3DBackpropInputV2.js"),B=n(/*! ./kernels/Cos */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Cos.js"),L=n(/*! ./kernels/Cosh */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Cosh.js"),z=n(/*! ./kernels/CropAndResize */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/CropAndResize.js"),G=n(/*! ./kernels/Cumsum */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Cumsum.js"),U=n(/*! ./kernels/DenseBincount */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/DenseBincount.js"),W=n(/*! ./kernels/DepthToSpace */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/DepthToSpace.js"),V=n(/*! ./kernels/DepthwiseConv2dNative */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/DepthwiseConv2dNative.js"),q=n(/*! ./kernels/DepthwiseConv2dNativeBackpropFilter */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/DepthwiseConv2dNativeBackpropFilter.js"),H=n(/*! ./kernels/DepthwiseConv2dNativeBackpropInput */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/DepthwiseConv2dNativeBackpropInput.js"),K=n(/*! ./kernels/Diag */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Diag.js"),X=n(/*! ./kernels/Dilation2D */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Dilation2D.js"),Y=n(/*! ./kernels/Einsum */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Einsum.js"),Z=n(/*! ./kernels/Elu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Elu.js"),Q=n(/*! ./kernels/EluGrad */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/EluGrad.js"),J=n(/*! ./kernels/Equal */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Equal.js"),ee=n(/*! ./kernels/Erf */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Erf.js"),te=n(/*! ./kernels/Exp */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Exp.js"),ne=n(/*! ./kernels/ExpandDims */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/ExpandDims.js"),se=n(/*! ./kernels/Expm1 */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Expm1.js"),oe=n(/*! ./kernels/FFT */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/FFT.js"),re=n(/*! ./kernels/Fill */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Fill.js"),ie=n(/*! ./kernels/FlipLeftRight */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/FlipLeftRight.js"),ae=n(/*! ./kernels/Floor */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Floor.js"),ue=n(/*! ./kernels/FloorDiv */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/FloorDiv.js"),de=n(/*! ./kernels/FromPixels */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/FromPixels.js"),le=n(/*! ./kernels/FusedConv2D */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/FusedConv2D.js"),ce=n(/*! ./kernels/FusedDepthwiseConv2D */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/FusedDepthwiseConv2D.js"),fe=n(/*! ./kernels/GatherNd */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/GatherNd.js"),pe=n(/*! ./kernels/GatherV2 */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/GatherV2.js"),me=n(/*! ./kernels/Greater */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Greater.js"),he=n(/*! ./kernels/GreaterEqual */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/GreaterEqual.js"),be=n(/*! ./kernels/Identity */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Identity.js"),je=n(/*! ./kernels/IFFT */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/IFFT.js"),ge=n(/*! ./kernels/Imag */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Imag.js"),we=n(/*! ./kernels/IsFinite */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/IsFinite.js"),_e=n(/*! ./kernels/IsInf */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/IsInf.js"),ke=n(/*! ./kernels/IsNaN */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/IsNaN.js"),ve=n(/*! ./kernels/LeakyRelu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/LeakyRelu.js"),xe=n(/*! ./kernels/Less */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Less.js"),ye=n(/*! ./kernels/LessEqual */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/LessEqual.js"),Oe=n(/*! ./kernels/LinSpace */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/LinSpace.js"),Ie=n(/*! ./kernels/Log */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Log.js"),Ce=n(/*! ./kernels/Log1p */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Log1p.js"),Se=n(/*! ./kernels/LogicalAnd */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/LogicalAnd.js"),Te=n(/*! ./kernels/LogicalNot */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/LogicalNot.js"),Ne=n(/*! ./kernels/LogicalOr */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/LogicalOr.js"),Ee=n(/*! ./kernels/LRN */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/LRN.js"),Ae=n(/*! ./kernels/LRNGrad */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/LRNGrad.js"),Re=n(/*! ./kernels/Max */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Max.js"),Fe=n(/*! ./kernels/Maximum */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Maximum.js"),Me=n(/*! ./kernels/MaxPool */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPool.js"),$e=n(/*! ./kernels/MaxPool3D */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPool3D.js"),De=n(/*! ./kernels/MaxPool3DGrad */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPool3DGrad.js"),Pe=n(/*! ./kernels/MaxPoolGrad */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPoolGrad.js"),Be=n(/*! ./kernels/MaxPoolWithArgmax */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPoolWithArgmax.js"),Le=n(/*! ./kernels/Mean */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Mean.js"),ze=n(/*! ./kernels/Min */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Min.js"),Ge=n(/*! ./kernels/Minimum */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Minimum.js"),Ue=n(/*! ./kernels/MirrorPad */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/MirrorPad.js"),We=n(/*! ./kernels/Mod */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Mod.js"),Ve=n(/*! ./kernels/Multinomial */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Multinomial.js"),qe=n(/*! ./kernels/Multiply */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Multiply.js"),He=n(/*! ./kernels/Neg */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Neg.js"),Ke=n(/*! ./kernels/NonMaxSuppressionV3 */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/NonMaxSuppressionV3.js"),Xe=n(/*! ./kernels/NonMaxSuppressionV4 */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/NonMaxSuppressionV4.js"),Ye=n(/*! ./kernels/NonMaxSuppressionV5 */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/NonMaxSuppressionV5.js"),Ze=n(/*! ./kernels/NotEqual */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/NotEqual.js"),Qe=n(/*! ./kernels/OneHot */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/OneHot.js"),Je=n(/*! ./kernels/OnesLike */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/OnesLike.js"),et=n(/*! ./kernels/Pack */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Pack.js"),tt=n(/*! ./kernels/PadV2 */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/PadV2.js"),nt=n(/*! ./kernels/Pow */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Pow.js"),st=n(/*! ./kernels/Prelu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Prelu.js"),ot=n(/*! ./kernels/Prod */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Prod.js"),rt=n(/*! ./kernels/Range */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Range.js"),it=n(/*! ./kernels/Real */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Real.js"),at=n(/*! ./kernels/RealDiv */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/RealDiv.js"),ut=n(/*! ./kernels/Reciprocal */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Reciprocal.js"),dt=n(/*! ./kernels/Relu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Relu.js"),lt=n(/*! ./kernels/Relu6 */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Relu6.js"),ct=n(/*! ./kernels/Reshape */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"),ft=n(/*! ./kernels/ResizeBilinear */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/ResizeBilinear.js"),pt=n(/*! ./kernels/ResizeBilinearGrad */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/ResizeBilinearGrad.js"),mt=n(/*! ./kernels/ResizeNearestNeighbor */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/ResizeNearestNeighbor.js"),ht=n(/*! ./kernels/ResizeNearestNeighborGrad */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/ResizeNearestNeighborGrad.js"),bt=n(/*! ./kernels/Reverse */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Reverse.js"),jt=n(/*! ./kernels/RotateWithOffset */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/RotateWithOffset.js"),gt=n(/*! ./kernels/Round */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Round.js"),wt=n(/*! ./kernels/Rsqrt */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Rsqrt.js"),_t=n(/*! ./kernels/ScatterNd */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/ScatterNd.js"),kt=n(/*! ./kernels/Select */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Select.js"),vt=n(/*! ./kernels/Selu */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Selu.js"),xt=n(/*! ./kernels/Sigmoid */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Sigmoid.js"),yt=n(/*! ./kernels/Sign */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Sign.js"),Ot=n(/*! ./kernels/Sin */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Sin.js"),It=n(/*! ./kernels/Sinh */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Sinh.js"),Ct=n(/*! ./kernels/Slice */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Slice.js"),St=n(/*! ./kernels/Softmax */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Softmax.js"),Tt=n(/*! ./kernels/Softplus */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Softplus.js"),Nt=n(/*! ./kernels/SpaceToBatchND */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/SpaceToBatchND.js"),Et=n(/*! ./kernels/SparseFillEmptyRows */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseFillEmptyRows.js"),At=n(/*! ./kernels/SparseReshape */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseReshape.js"),Rt=n(/*! ./kernels/SparseSegmentMean */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseSegmentMean.js"),Ft=n(/*! ./kernels/SparseSegmentSum */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseSegmentSum.js"),Mt=n(/*! ./kernels/SparseToDense */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseToDense.js"),$t=n(/*! ./kernels/SplitV */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/SplitV.js"),Dt=n(/*! ./kernels/Sqrt */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Sqrt.js"),Pt=n(/*! ./kernels/Square */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Square.js"),Bt=n(/*! ./kernels/SquaredDifference */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/SquaredDifference.js"),Lt=n(/*! ./kernels/Step */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Step.js"),zt=n(/*! ./kernels/StridedSlice */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/StridedSlice.js"),Gt=n(/*! ./kernels/StringNGrams */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/StringNGrams.js"),Ut=n(/*! ./kernels/StringSplit */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/StringSplit.js"),Wt=n(/*! ./kernels/StringToHashBucketFast */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/StringToHashBucketFast.js"),Vt=n(/*! ./kernels/Sub */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Sub.js"),qt=n(/*! ./kernels/Sum */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Sum.js"),Ht=n(/*! ./kernels/Tan */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Tan.js"),Kt=n(/*! ./kernels/Tanh */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Tanh.js"),Xt=n(/*! ./kernels/Tile */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Tile.js"),Yt=n(/*! ./kernels/TopK */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/TopK.js"),Zt=n(/*! ./kernels/Transform */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Transform.js"),Qt=n(/*! ./kernels/Transpose */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose.js"),Jt=n(/*! ./kernels/Unique */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Unique.js"),en=n(/*! ./kernels/Unpack */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/Unpack.js"),tn=n(/*! ./kernels/UnsortedSegmentSum */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/UnsortedSegmentSum.js"),nn=n(/*! ./kernels/ZerosLike */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/kernels/ZerosLike.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const sn=[Ee.LRNConfig,Ae.LRNGradConfig,o._fusedMatMulConfig,r.absConfig,i.acosConfig,a.acoshConfig,u.addConfig,d.addNConfig,l.allConfig,c.anyConfig,f.argMaxConfig,p.argMinConfig,m.asinConfig,h.asinhConfig,j.atan2Config,b.atanConfig,g.atanhConfig,_.avgPool3DConfig,w.avgPoolConfig,k.avgPoolGrad3DConfig,v.avgPoolGradConfig,x.batchMatMulConfig,y.batchNormConfig,O.batchToSpaceNDConfig,I.bincountConfig,C.castConfig,S.ceilConfig,T.clipByValueConfig,E.complexAbsConfig,N.complexConfig,A.concatConfig,F.conv2DBackpropFilterConfig,M.conv2DBackpropInputConfig,R.conv2DConfig,D.conv3DBackpropFilterV2Config,P.conv3DBackpropInputConfig,$.conv3DConfig,B.cosConfig,L.coshConfig,z.cropAndResizeConfig,G.cumsumConfig,U.denseBincountConfig,W.depthToSpaceConfig,q.depthwiseConv2dNativeBackpropFilterConfig,H.depthwiseConv2dNativeBackpropInputConfig,V.depthwiseConv2dNativeConfig,K.diagConfig,X.dilation2DConfig,Y.einsumConfig,Z.eluConfig,Q.eluGradConfig,J.equalConfig,ee.erfConfig,te.expConfig,ne.expandDimsConfig,se.expm1Config,oe.fftConfig,re.fillConfig,ie.flipLeftRightConfig,ae.floorConfig,ue.floorDivConfig,de.fromPixelsConfig,le.fusedConv2DConfig,ce.fusedDepthwiseConv2DConfig,fe.gatherNdConfig,pe.gatherV2Config,me.greaterConfig,he.greaterEqualConfig,be.identityConfig,je.ifftConfig,ge.imagConfig,we.isFiniteConfig,_e.isInfConfig,ke.isNaNConfig,ve.leakyReluConfig,xe.lessConfig,ye.lessEqualConfig,Oe.linSpaceConfig,Ce.log1pConfig,Ie.logConfig,Se.logicalAndConfig,Te.logicalNotConfig,Ne.logicalOrConfig,Re.maxConfig,$e.maxPool3DConfig,Me.maxPoolConfig,De.maxPoolGrad3DConfig,Pe.maxPoolGradConfig,Be.maxPoolWithArgmaxConfig,Fe.maximumConfig,Le.meanConfig,ze.minConfig,Ge.minimumConfig,Ue.mirrorPadConfig,We.modConfig,Ve.multinomialConfig,qe.multiplyConfig,He.negConfig,Ke.nonMaxSuppressionV3Config,Xe.nonMaxSuppressionV4Config,Ye.nonMaxSuppressionV5Config,Ze.notEqualConfig,Qe.oneHotConfig,Je.onesLikeConfig,et.packConfig,tt.padV2Config,nt.powConfig,st.preluConfig,ot.prodConfig,rt.rangeConfig,it.realConfig,at.realDivConfig,ut.reciprocalConfig,lt.relu6Config,dt.reluConfig,ct.reshapeConfig,ft.resizeBilinearConfig,pt.resizeBilinearGradConfig,mt.resizeNearestNeighborConfig,ht.resizeNearestNeighborGradConfig,bt.reverseConfig,jt.rotateWithOffsetConfig,gt.roundConfig,wt.rsqrtConfig,_t.scatterNdConfig,kt.selectConfig,vt.seluConfig,xt.sigmoidConfig,yt.signConfig,Ot.sinConfig,It.sinhConfig,Ct.sliceConfig,St.softmaxConfig,Tt.softplusConfig,Nt.spaceToBatchNDConfig,Et.sparseFillEmptyRowsConfig,At.sparseReshapeConfig,Rt.sparseSegmentMeanConfig,Ft.sparseSegmentSumConfig,Mt.sparseToDenseConfig,$t.splitVConfig,Dt.sqrtConfig,Pt.squareConfig,Bt.squaredDifferenceConfig,Lt.stepConfig,zt.stridedSliceConfig,Gt.stringNGramsConfig,Ut.stringSplitConfig,Wt.stringToHashBucketFastConfig,Vt.subConfig,qt.sumConfig,Ht.tanConfig,Kt.tanhConfig,Xt.tileConfig,Yt.topKConfig,Zt.transformConfig,Qt.transposeConfig,Jt.uniqueConfig,en.unpackConfig,tn.unsortedSegmentSumConfig,nn.zerosLikeConfig];for(const e of sn)Object(s.registerKernel)(e)},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/reshape_packed_gpu.js": +/*!*************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/reshape_packed_gpu.js ***! + \*************************************************************************/ +/*! exports provided: ReshapePackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"ReshapePackedProgram",(function(){return r}));var s=n(/*! ./gpgpu_math */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/gpgpu_math.js"),o=n(/*! ./shader_compiler_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/shader_compiler_util.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class r{constructor(e,t){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,this.customUniforms=[{name:"inputShape",type:"ivec3"}],this.outputShape=e,this.enableShapeUniforms=Object(s.useShapeUniforms)(this.outputShape.length);let n="";for(let e=0;e<4;e++){let t="thisRC = rc;";e%2==1&&(t+="thisRC.z += 1;"),e>1&&(t+="thisRC.y += 1;"),n+=`\n ${t}\n ${e>0?"if(thisRC.y < rows && thisRC.z < cols){":""}\n int flatIndex = getFlatIndex(thisRC);\n\n ivec3 inputRC = inputCoordsFromReshapedOutCoords(flatIndex);\n vec2 inputRCInnerDims = vec2(float(inputRC.y),float(inputRC.z));\n\n result[${e}] =\n getChannel(getA(inputRC.x, inputRC.y, inputRC.z), inputRCInnerDims);\n ${e>0?"}":""}\n `}var r,i;this.userCode=`\n ${r=t,i=this.enableShapeUniforms,`\n ivec3 inputCoordsFromReshapedOutCoords(int index) {\n ${i?o.getLogicalCoordinatesFromFlatIndexByUniform(["r","c","d"],"inputShape"):o.getLogicalCoordinatesFromFlatIndex(["r","c","d"],r)}\n return ivec3(r, c, d);\n }\n `}\n ${this.enableShapeUniforms?o.getFlatIndexFrom3DOutput():o.getFlatIndexFrom3D(e)}\n\n void main() {\n ivec3 rc = getOutputCoords();\n\n vec4 result = vec4(0.);\n\n ivec3 thisRC;\n int rows = ${this.enableShapeUniforms?"outShape[1]":e[1]};\n int cols = ${this.enableShapeUniforms?"outShape[2]":e[2]};\n\n ${n}\n\n setOutput(result);\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/resize_bilinear_backprop_gpu.js": +/*!***********************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/resize_bilinear_backprop_gpu.js ***! + \***********************************************************************************/ +/*! exports provided: ResizeBilinearBackpropProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"ResizeBilinearBackpropProgram",(function(){return s})); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class s{constructor(e,t,n){this.variableNames=["dy"],this.outputShape=[],this.outputShape=t;const[,s,o]=t,[,r,i]=e,a=[n&&r>1?s-1:s,n&&i>1?o-1:o],u=[n&&r>1?r-1:r,n&&i>1?i-1:i],d=a[0]/u[0],l=a[1]/u[1],c=1/d,f=1/l,p=2*Math.ceil(c)+2,m=2*Math.ceil(f)+2;this.userCode=`\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n int r = coords[1];\n int c = coords[2];\n\n float accumulator = 0.0;\n\n const float heightScale = float(${d});\n const float widthScale = float(${l});\n\n const float invHeightScale = float(${c});\n const float invWidthScale = float(${f});\n\n const int winHeight = int(${p});\n const int winWidth = int(${m});\n\n // Compute bounds for where in dy we will look\n float startRLerp = floor(float(r) * invHeightScale);\n int startDyR = int(startRLerp - float(winHeight / 2));\n\n float startCLerp = floor(float(c) * invWidthScale);\n int startDyC = int(startCLerp - float(winWidth / 2));\n\n // Loop over dy\n for (int dyROffset = 0; dyROffset < winHeight; dyROffset++) {\n int dyR = dyROffset + startDyR;\n\n // Guard against the window exceeding the bounds of dy\n if (dyR < 0 || dyR >= ${r}) {\n continue;\n }\n\n for (int dyCOffset = 0; dyCOffset < winWidth; dyCOffset++) {\n int dyC = dyCOffset + startDyC;\n\n // Guard against the window exceeding the bounds of dy\n if (dyC < 0 || dyC >= ${i}) {\n continue;\n }\n\n float dxR = float(dyR) * heightScale;\n int topDxRIndex = int(floor(dxR));\n int bottomDxRIndex = int(min(ceil(dxR), ${s-1}.0));\n float dxRLerp = dxR - float(topDxRIndex);\n float inverseDxRLerp = 1.0 - dxRLerp;\n\n float dxC = float(dyC) * widthScale;\n int leftDxCIndex = int(floor(dxC));\n int rightDxCIndex = int(min(ceil(dxC), ${o-1}.0));\n float dxCLerp = dxC - float(leftDxCIndex);\n float inverseDxCLerp = 1.0 - dxCLerp;\n\n if (r == topDxRIndex && c == leftDxCIndex) {\n // topLeft\n accumulator +=\n getDy(b, dyR, dyC, d) * inverseDxRLerp * inverseDxCLerp;\n }\n\n if (r == topDxRIndex && c == rightDxCIndex) {\n // topRight\n accumulator += getDy(b, dyR, dyC, d) * inverseDxRLerp * dxCLerp;\n }\n\n if (r == bottomDxRIndex && c == leftDxCIndex) {\n // bottomLeft\n accumulator += getDy(b, dyR, dyC, d) * dxRLerp * inverseDxCLerp;\n }\n\n if (r == bottomDxRIndex && c == rightDxCIndex) {\n // bottomRight\n accumulator += getDy(b, dyR, dyC, d) * dxRLerp * dxCLerp;\n }\n }\n }\n // End loop over dy\n\n setOutput(accumulator);\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/resize_bilinear_gpu.js": +/*!**************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/resize_bilinear_gpu.js ***! + \**************************************************************************/ +/*! exports provided: ResizeBilinearProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"ResizeBilinearProgram",(function(){return s})); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class s{constructor(e,t,n,s,o){this.variableNames=["A"],this.outputShape=[];const[r,i,a,u]=e;this.outputShape=[r,t,n,u];const d=[s&&t>1?i-1:i,s&&n>1?a-1:a],l=[s&&t>1?t-1:t,s&&n>1?n-1:n];let c;c=o?"(vec2(yRC) + vec2(0.5)) * effectiveInputOverOutputRatioRC - vec2(0.5)":"vec2(yRC) * effectiveInputOverOutputRatioRC",this.userCode=`\n const vec2 effectiveInputOverOutputRatioRC = vec2(\n ${d[0]/l[0]},\n ${d[1]/l[1]});\n const vec2 inputShapeRC = vec2(${i}.0, ${a}.0);\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n ivec2 yRC = coords.yz;\n\n // Fractional source index.\n vec2 sourceFracIndexRC = ${c};\n\n // Compute the four integer indices.\n ivec2 sourceFloorRC = ivec2(max(sourceFracIndexRC, vec2(0.0)));\n ivec2 sourceCeilRC = ivec2(\n min(inputShapeRC - 1.0, ceil(sourceFracIndexRC)));\n\n float topLeft = getA(b, sourceFloorRC.x, sourceFloorRC.y, d);\n float bottomLeft = getA(b, sourceCeilRC.x, sourceFloorRC.y, d);\n float topRight = getA(b, sourceFloorRC.x, sourceCeilRC.y, d);\n float bottomRight = getA(b, sourceCeilRC.x, sourceCeilRC.y, d);\n\n vec2 fracRC = sourceFracIndexRC - vec2(sourceFloorRC);\n\n float top = topLeft + (topRight - topLeft) * fracRC.y;\n float bottom = bottomLeft + (bottomRight - bottomLeft) * fracRC.y;\n float newValue = top + (bottom - top) * fracRC.x;\n\n setOutput(newValue);\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/resize_bilinear_packed_gpu.js": +/*!*********************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/resize_bilinear_packed_gpu.js ***! + \*********************************************************************************/ +/*! exports provided: ResizeBilinearPackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"ResizeBilinearPackedProgram",(function(){return s})); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class s{constructor(e,t,n,s,o){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=[];const[r,i,a,u]=e;this.outputShape=[r,t,n,u];const d=[s&&t>1?i-1:i,s&&n>1?a-1:a],l=[s&&t>1?t-1:t,s&&n>1?n-1:n];let c;c=o?"(vec3(yRC) + vec3(0.5)) * effectiveInputOverOutputRatioRC - vec3(0.5)":"vec3(yRC) * effectiveInputOverOutputRatioRC",this.userCode=`\n const vec3 effectiveInputOverOutputRatioRC = vec3(\n ${d[0]/l[0]},\n ${d[1]/l[1]},\n ${d[1]/l[1]});\n const vec3 inputShapeRC = vec3(${i}.0, ${a}.0,\n ${a}.0);\n\n float getAValue(int b, int r, int c, int d) {\n return getChannel(getA(b, r, c, d), vec2(c, d));\n }\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n // Calculate values for next column in yRC.z.\n ivec3 yRC = coords.yzz + ivec3(0, 0, 1);\n\n // Fractional source index.\n vec3 sourceFracIndexRC = ${c};\n\n // Compute the four integer indices.\n ivec3 sourceFloorRC = ivec3(max(sourceFracIndexRC, vec3(0.0)));\n ivec3 sourceCeilRC = ivec3(\n min(inputShapeRC - 1.0, ceil(sourceFracIndexRC)));\n\n // Should we calculate next column and row elements in 2x2 packed cell.\n bool hasNextCol = d < ${u-1};\n bool hasNextRow = coords.z < ${n-1};\n\n // In parallel, construct four corners for all four components in\n // packed 2x2 cell.\n vec4 topLeft = vec4(\n getAValue(b, sourceFloorRC.x, sourceFloorRC.y, d),\n hasNextCol ? getAValue(b, sourceFloorRC.x, sourceFloorRC.y, d + 1)\n : 0.0,\n hasNextRow ? getAValue(b, sourceFloorRC.x, sourceFloorRC.z, d)\n : 0.0,\n (hasNextRow && hasNextCol) ?\n getAValue(b, sourceFloorRC.x, sourceFloorRC.z, d + 1) : 0.0);\n\n vec4 bottomLeft = vec4(\n getAValue(b, sourceCeilRC.x, sourceFloorRC.y, d),\n hasNextCol ? getAValue(b, sourceCeilRC.x, sourceFloorRC.y, d + 1)\n : 0.0,\n hasNextRow ? getAValue(b, sourceCeilRC.x, sourceFloorRC.z, d)\n : 0.0,\n (hasNextRow && hasNextCol) ?\n getAValue(b, sourceCeilRC.x, sourceFloorRC.z, d + 1) : 0.0);\n\n vec4 topRight = vec4(\n getAValue(b, sourceFloorRC.x, sourceCeilRC.y, d),\n hasNextCol ? getAValue(b, sourceFloorRC.x, sourceCeilRC.y, d + 1)\n : 0.0,\n hasNextRow ? getAValue(b, sourceFloorRC.x, sourceCeilRC.z, d)\n : 0.0,\n (hasNextRow && hasNextCol) ?\n getAValue(b, sourceFloorRC.x, sourceCeilRC.z, d + 1) : 0.0);\n\n vec4 bottomRight = vec4(\n getAValue(b, sourceCeilRC.x, sourceCeilRC.y, d),\n hasNextCol ? getAValue(b, sourceCeilRC.x, sourceCeilRC.y, d + 1)\n : 0.0,\n hasNextRow ? getAValue(b, sourceCeilRC.x, sourceCeilRC.z, d)\n : 0.0,\n (hasNextRow && hasNextCol) ?\n getAValue(b, sourceCeilRC.x, sourceCeilRC.z, d + 1) : 0.0);\n\n vec3 fracRC = sourceFracIndexRC - vec3(sourceFloorRC);\n\n vec4 top = mix(topLeft, topRight, fracRC.yyzz);\n vec4 bottom = mix(bottomLeft, bottomRight, fracRC.yyzz);\n vec4 newValue = mix(top, bottom, fracRC.x);\n\n setOutput(newValue);\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/resize_nearest_neighbor_backprop_gpu.js": +/*!*******************************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/resize_nearest_neighbor_backprop_gpu.js ***! + \*******************************************************************************************/ +/*! exports provided: ResizeNearestNeigborBackpropProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"ResizeNearestNeigborBackpropProgram",(function(){return s})); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class s{constructor(e,t,n){this.variableNames=["dy"],this.outputShape=[],this.outputShape=t;const[,s,o]=t,[,r,i]=e,a=[n&&r>1?s-1:s,n&&i>1?o-1:o],u=[n&&r>1?r-1:r,n&&i>1?i-1:i],d=a[0]/u[0],l=a[1]/u[1],c=1/d,f=1/l,p=2*Math.ceil(c)+2,m=2*Math.ceil(f)+2;this.userCode=`\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n int r = coords[1];\n int c = coords[2];\n\n float accumulator = 0.0;\n\n const float heightScale = float(${d});\n const float widthScale = float(${l});\n\n const float invHeightScale = float(${c});\n const float invWidthScale = float(${f});\n\n const int winHeight = int(${p});\n const int winWidth = int(${m});\n\n // Compute bounds for where in dy we will look\n float startRLerp = floor(float(r) * invHeightScale);\n int startDyR = int(floor(startRLerp - float(winHeight / 2)));\n\n float startCLerp = floor(float(c) * invWidthScale);\n int startDyC = int(floor(startCLerp - float(winWidth / 2)));\n\n // Loop over dy\n for (int dyROffset = 0; dyROffset < winHeight; dyROffset++) {\n int dyR = dyROffset + startDyR;\n\n // Guard against the window exceeding the bounds of dy\n if (dyR < 0 || dyR >= ${r}) {\n continue;\n }\n\n for (int dyCOffset = 0; dyCOffset < winWidth; dyCOffset++) {\n int dyC = dyCOffset + startDyC;\n\n // Guard against the window exceeding the bounds of dy\n if (dyC < 0 || dyC >= ${i}) {\n continue;\n }\n\n float sourceFracRow =\n float(${a[0]}) *\n (float(dyR) / float(${u[0]}));\n\n float sourceFracCol =\n float(${a[1]}) *\n (float(dyC) / float(${u[1]}));\n\n int sourceNearestRow = int(min(\n float(int(${s}) - 1),\n ${n} ? float(round(sourceFracRow)) :\n float(floor(sourceFracRow))));\n\n int sourceNearestCol = int(min(\n float(int(${o}) - 1),\n ${n} ? float(round(sourceFracCol)) :\n float(floor(sourceFracCol))));\n\n if (r == sourceNearestRow && c == sourceNearestCol) {\n accumulator += getDy(b, dyR, dyC, d);\n }\n }\n }\n // End loop over dy\n\n setOutput(accumulator);\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/resize_nearest_neighbor_gpu.js": +/*!**********************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/resize_nearest_neighbor_gpu.js ***! + \**********************************************************************************/ +/*! exports provided: ResizeNearestNeighborProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"ResizeNearestNeighborProgram",(function(){return s})); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class s{constructor(e,t,n,s,o){this.variableNames=["A"],this.outputShape=[];const[r,i,a,u]=e;this.outputShape=[r,t,n,u];const d=[s&&t>1?i-1:i,s&&n>1?a-1:a],l=[s&&t>1?t-1:t,s&&n>1?n-1:n],c=s?"0.5":"0.0";let f;f=o?"max((vec2(yRC) + vec2(0.5)) * effectiveInputOverOutputRatioRC, vec2(0.0))":"vec2(yRC) * effectiveInputOverOutputRatioRC",this.userCode=`\n const vec2 effectiveInputOverOutputRatioRC = vec2(\n ${d[0]/l[0]},\n ${d[1]/l[1]});\n const vec2 inputShapeRC = vec2(${i}.0, ${a}.0);\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n ivec2 yRC = coords.yz;\n\n // Fractional source index.\n vec2 sourceFracIndexRC = ${f};\n\n // Compute the coordinators of nearest neighbor point.\n ivec2 sourceNearestRC = ivec2(\n min(inputShapeRC - 1.0, floor(sourceFracIndexRC + ${c})));\n float newValue = getA(b, sourceNearestRC.x, sourceNearestRC.y, d);\n\n setOutput(newValue);\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/resize_nearest_neighbor_packed_gpu.js": +/*!*****************************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/resize_nearest_neighbor_packed_gpu.js ***! + \*****************************************************************************************/ +/*! exports provided: ResizeNearestNeighborPackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"ResizeNearestNeighborPackedProgram",(function(){return s})); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class s{constructor(e,t,n,s,o){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=[];const[r,i,a,u]=e;this.outputShape=[r,t,n,u];const d=[s&&t>1?i-1:i,s&&n>1?a-1:a],l=[s&&t>1?t-1:t,s&&n>1?n-1:n],c=s?"0.5":"0.0";let f;f=o?"max((vec3(yRC) + vec3(0.5)) * effectiveInputOverOutputRatioRC, vec3(0.0))":"vec3(yRC) * effectiveInputOverOutputRatioRC",this.userCode=`\n const vec3 effectiveInputOverOutputRatioRC = vec3(\n ${d[0]/l[0]},\n ${d[1]/l[1]},\n ${d[1]/l[1]});\n const vec3 inputShapeRC = vec3(${i}.0, ${a}.0,\n ${a}.0);\n\n float getAValue(int b, int r, int c, int d) {\n return getChannel(getA(b, r, c, d), vec2(c, d));\n }\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n // Calculate values for next column in yRC.z.\n ivec3 yRC = coords.yzz + ivec3(0, 0, 1);\n\n // Fractional source index.\n vec3 sourceFracIndexRC = ${f};\n\n // Compute the coordinators of nearest neighbor point.\n ivec3 sourceNearestRC = ivec3(\n min(inputShapeRC - 1.0, floor(sourceFracIndexRC + ${c})));\n\n // Should we calculate next column and row elements in 2x2 packed cell.\n bool hasNextCol = d < ${u-1};\n bool hasNextRow = coords.z < ${n-1};\n\n vec4 newValue = vec4(\n getAValue(b, sourceNearestRC.x, sourceNearestRC.y, d),\n hasNextCol ? getAValue(b, sourceNearestRC.x, sourceNearestRC.y, d + 1)\n : 0.0,\n hasNextRow ? getAValue(b, sourceNearestRC.x, sourceNearestRC.z, d)\n : 0.0,\n (hasNextRow && hasNextCol) ?\n getAValue(b, sourceNearestRC.x, sourceNearestRC.z, d + 1) : 0.0);\n\n setOutput(newValue);\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/reverse_gpu.js": +/*!******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/reverse_gpu.js ***! + \******************************************************************/ +/*! exports provided: ReverseProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"ReverseProgram",(function(){return o}));var s=n(/*! ./shader_compiler */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */class o{constructor(e,t){this.variableNames=["x"];const n=e.length;if(n>4)throw new Error(`WebGL backend: Reverse of rank-${n} tensor is not yet supported`);if(this.outputShape=e,1===n)return void(this.userCode=`\n void main() {\n int coord = getOutputCoords();\n setOutput(getX(${e[0]} - coord - 1));\n }\n `);const o=e.map(((n,s)=>(n=>-1!==t.indexOf(n)&&1!==e[n]?`${e[n]} - coords[${n}] - 1`:`coords[${n}]`)(s))).join(","),r=Object(s.getCoordsDataType)(n);this.userCode=`\n void main() {\n ${r} coords = getOutputCoords();\n setOutput(getX(${o}));\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/reverse_packed_gpu.js": +/*!*************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/reverse_packed_gpu.js ***! + \*************************************************************************/ +/*! exports provided: ReversePackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"ReversePackedProgram",(function(){return r}));var s=n(/*! ./packing_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/packing_util.js"),o=n(/*! ./shader_compiler */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class r{constructor(e,t){this.variableNames=["x"],this.packedInputs=!0,this.packedOutput=!0;const n=e.length;if(n>4)throw new Error(`WebGL backend: Reverse of rank-${n} tensor is not yet supported`);this.outputShape=e;const r=Object(s.getChannels)("rc",n),i=`${r[n-1]} + 1 < ${this.outputShape[n-1]}`,a=`${r[n-2]} + 1 < ${this.outputShape[n-2]}`,u=Object(o.getCoordsDataType)(n);function d(n){const s=e.map(((s,o)=>function(n,s){return-1!==t.indexOf(n)&&1!==e[n]?`${e[n]} - ${s[n]} - 1`:`${s[n]}`}(o,n)));return`getChannel(getX(${s.join(",")}), vec2(${s.slice(-2).join(",")}))`}this.userCode=1===n?`\n void main(){\n int rc = getOutputCoords();\n vec4 result = vec4(0.);\n result.r = getChannel(getX(${e[0]} - rc - 1),\n ${e[0]} - rc - 1);\n if(${i}){\n result.g = getChannel(getX(${e[0]} - (rc + 1) - 1),\n ${e[0]} - (rc + 1) - 1);\n }\n setOutput(result);\n }\n `:`\n void main() {\n ${u} rc = getOutputCoords();\n vec4 result = vec4(0.);\n result.r = ${function(e){return d(e)}(r.slice())};\n if(${i}){\n result.g = ${function(e){return e[n-1]="("+e[n-1]+" + 1)",d(e)}(r.slice())};\n }\n if(${a}) {\n result.b = ${function(e){return e[n-2]="("+e[n-2]+" + 1)",d(e)}(r.slice())};\n if(${i}) {\n result.a = ${function(e){return e[n-1]="("+e[n-1]+" + 1)",e[n-2]="("+e[n-2]+" + 1)",d(e)}(r.slice())};\n }\n }\n setOutput(result);\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/rotate_gpu.js": +/*!*****************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/rotate_gpu.js ***! + \*****************************************************************/ +/*! exports provided: RotateProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"RotateProgram",(function(){return s})); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class s{constructor(e,t){this.variableNames=["Image"],this.outputShape=[],this.customUniforms=[{name:"params",type:"vec4"}];const n=e[1],s=e[2];this.outputShape=e;let o="";o="number"==typeof t?`float outputValue = ${t.toFixed(2)};`:`\n vec3 fill = vec3(${t.join(",")});\n float outputValue = fill[coords[3]];`,this.userCode=`\n void main() {\n ivec4 coords = getOutputCoords();\n int x = coords[2];\n int y = coords[1];\n float coordXFloat = (float(x) - params[0]) * params[3] -\n (float(y) - params[1]) * params[2];\n float coordYFloat = (float(x) - params[0]) * params[2] +\n (float(y) - params[1]) * params[3];\n int coordX = int(round(coordXFloat + params[0]));\n int coordY = int(round(coordYFloat + params[1]));\n ${o}\n if(coordX >= 0 && coordX < ${s} && coordY >= 0 && coordY < ${n}) {\n outputValue = getImage(coords[0], coordY, coordX, coords[3]);\n }\n setOutput(outputValue);\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/scatter_gpu.js": +/*!******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/scatter_gpu.js ***! + \******************************************************************/ +/*! exports provided: ScatterProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"ScatterProgram",(function(){return o}));var s=n(/*! ./shader_compiler */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */class o{constructor(e,t,n,o,r,i,a=!0){this.variableNames=["updates","indices","defaultValue"],this.outputShape=i;const u=Object(s.getCoordsDataType)(r.length),d=Object(s.getCoordsDataType)(i.length);let l="";1===n?l="i":2===n&&(l="i, j");const c=`getIndices(${l})`;let f="";1===o?f="i":2===o&&(f="i, coords[1]");const p=`getUpdates(${f})`,m=t>1?"strides[j]":"strides";this.userCode=`\n ${u} strides = ${u}(${r});\n\n void main() {\n ${d} coords = getOutputCoords();\n float sum = 0.0;\n bool found = false;\n for (int i = 0; i < ${e}; i++) {\n int flattenedIndex = 0;\n for (int j = 0; j < ${t}; j++) {\n int index = round(${c});\n flattenedIndex += index * ${m};\n }\n if (flattenedIndex == coords[0]) {\n sum += ${p};\n found = true;\n }\n }\n setOutput(mix(getDefaultValue(), sum, float(found)));\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/segment_gpu.js": +/*!******************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/segment_gpu.js ***! + \******************************************************************/ +/*! exports provided: SegmentOpProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"SegmentOpProgram",(function(){return s})); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class s{constructor(e,t){this.variableNames=["x","segmentIds"];const n=e.windowSize,s=e.batchSize,o=e.inSize,r=e.numSegments,i=r*Math.ceil(o/n);this.outputShape=[s,i];const a=4*Math.floor(n/4),u=n%4,d="\n sumValue += dot(values, segFilter);\n ";let l="";o%n>0&&(l=`\n if (inIdx < 0 || inIdx >= ${o}) {\n return initializationValue;\n }\n `);let c="";o%n>0&&(c=`\n if (inIdx < 0 || inIdx >= ${o}) {\n return -1.0;\n }\n `),this.userCode=`\n const float initializationValue = 0.0;\n\n float getValue(int batch, int inIdx) {\n ${l}\n return getX(batch, inIdx);\n }\n\n float getSegmentIdAtIndex(int inIdx) {\n ${c}\n return getSegmentIds(inIdx);\n }\n\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int outIdx = coords[1];\n int inOffset = int(floor(float(outIdx) / float(\n ${r})) * float(${n}));\n int currentSeg = int(mod(float(outIdx), float(${r})));\n\n float sumValue = 0.0;\n\n for (int i = 0; i < ${a}; i += 4) {\n int inIdx = inOffset + i;\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2),\n getValue(batch, inIdx + 3)\n );\n\n vec4 segFilter = vec4(\n int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 1)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 2)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 3)) == currentSeg ? 1 : 0\n );\n\n ${d}\n }\n\n int inIdx = inOffset + ${a};\n if (${1===u}) {\n vec4 values = vec4(\n getValue(batch, inIdx),\n initializationValue,\n initializationValue,\n initializationValue\n );\n\n int inIdxSeg = int(getSegmentIdAtIndex(inIdx));\n\n vec4 segFilter = vec4(\n int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0,\n 0,\n 0,\n 0\n );\n\n ${d}\n } else if (${2===u}) {\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n initializationValue,\n initializationValue\n );\n\n vec4 segFilter = vec4(\n int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 1)) == currentSeg ? 1 : 0,\n 0,\n 0\n );\n\n ${d}\n } else if (${3===u}) {\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2),\n initializationValue\n );\n\n vec4 segFilter = vec4(\n int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 1)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 2)) == currentSeg ? 1 : 0,\n 0\n );\n\n ${d}\n }\n setOutput(sumValue);\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/select_gpu.js": +/*!*****************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/select_gpu.js ***! + \*****************************************************************/ +/*! exports provided: SelectProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"SelectProgram",(function(){return o}));var s=n(/*! ./shader_compiler */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */class o{constructor(e,t,n){let o,r;if(this.variableNames=["c","a","b"],this.outputShape=t,n>4)throw Error(`Where for rank ${n} is not yet supported`);if(1===n)r="resRC",o="resRC";else{const n=["resRC.x","resRC.y","resRC.z","resRC.w"],s=[],i=[];for(let o=0;o= 1.0) {\n setOutput(getA(${r}));\n } else {\n setOutput(getB(${r}));\n }\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js": +/*!**********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js ***! + \**********************************************************************/ +/*! exports provided: makeShader, getCoordsDataType, getUniformInfoFromShape, squeezeInputInfo */function(e,t,n){"use strict";n.r(t),n.d(t,"makeShader",(function(){return a})),n.d(t,"getCoordsDataType",(function(){return j})),n.d(t,"getUniformInfoFromShape",(function(){return g})),n.d(t,"squeezeInputInfo",(function(){return w}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./glsl_version */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/glsl_version.js"),r=n(/*! ./shader_compiler_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/shader_compiler_util.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const{getBroadcastDims:i}=s.backend_util;function a(e,t,n){const a=[];if(e.forEach((e=>{const t=s.util.sizeFromShape(e.shapeInfo.logicalShape);if(e.shapeInfo.isUniform?a.push(`uniform float ${e.name}${t>1?`[${t}]`:""};`):(a.push(`uniform sampler2D ${e.name};`),a.push(`uniform int offset${e.name};`)),n.enableShapeUniforms){const{uniformShape:t}=g(n.packedInputs,e.shapeInfo.logicalShape,e.shapeInfo.texShape);switch(t.length){case 1:a.push(`uniform int ${e.name}Shape;`);break;case 2:a.push(`uniform ivec2 ${e.name}Shape;`);break;case 3:a.push(`uniform ivec3 ${e.name}Shape;`);break;case 4:a.push(`uniform ivec4 ${e.name}Shape;`)}a.push(`uniform ivec2 ${e.name}TexShape;`)}})),n.enableShapeUniforms){switch(t.logicalShape.length){case 1:a.push("uniform int outShape;");break;case 2:a.push("uniform ivec2 outShape;"),a.push("uniform int outShapeStrides;");break;case 3:a.push("uniform ivec3 outShape;"),a.push("uniform ivec2 outShapeStrides;");break;case 4:a.push("uniform ivec4 outShape;"),a.push("uniform ivec3 outShapeStrides;")}a.push("uniform ivec2 outTexShape;")}n.customUniforms&&n.customUniforms.forEach((e=>{a.push(`uniform ${e.type} ${e.name}${e.arrayIndex?`[${e.arrayIndex}]`:""};`)}));const h=a.join("\n"),b=e.map((e=>function(e,t,n=!1,o){let r="";r+=n?d(e,o):u(e,o);const a=e.shapeInfo.logicalShape,l=t.logicalShape;a.length<=l.length&&(r+=n?function(e,t){const n=e.name,o=n.charAt(0).toUpperCase()+n.slice(1),r="get"+o+"AtOutCoords",a=e.shapeInfo.logicalShape.length,u=t.logicalShape.length,d=i(e.shapeInfo.logicalShape,t.logicalShape),l=j(u),c=u-a;let f;const p=["x","y","z","w","u","v"];f=0===a?"":u<2&&d.length>=1?"coords = 0;":d.map((e=>`coords.${p[e+c]} = 0;`)).join("\n");let m="";m=u<2&&a>0?"coords":e.shapeInfo.logicalShape.map(((e,t)=>`coords.${p[t+c]}`)).join(", ");let h="return outputValue;";const b=1===s.util.sizeFromShape(e.shapeInfo.logicalShape),g=1===s.util.sizeFromShape(t.logicalShape);if(1!==a||b||g){if(b&&!g)h=1===u?"\n return vec4(outputValue.x, outputValue.x, 0., 0.);\n ":"\n return vec4(outputValue.x);\n ";else if(d.length){const e=a-2,t=a-1;d.indexOf(e)>-1&&d.indexOf(t)>-1?h="return vec4(outputValue.x);":d.indexOf(e)>-1?h="return vec4(outputValue.x, outputValue.y, outputValue.x, outputValue.y);":d.indexOf(t)>-1&&(h="return vec4(outputValue.xx, outputValue.zz);")}}else h="\n return vec4(outputValue.xy, outputValue.xy);\n ";return`\n vec4 ${r}() {\n ${l} coords = getOutputCoords();\n ${f}\n vec4 outputValue = get${o}(${m});\n ${h}\n }\n `}(e,t):function(e,t){const n=e.name,o=n.charAt(0).toUpperCase()+n.slice(1),r="get"+o+"AtOutCoords",a=t.texShape,u=e.shapeInfo.texShape,d=e.shapeInfo.logicalShape.length,l=t.logicalShape.length;if(!e.shapeInfo.isUniform&&d===l&&null==e.shapeInfo.flatOffset&&s.util.arraysEqual(u,a))return`\n float ${r}() {\n return sampleTexture(${n}, resultUV);\n }\n `;const c=j(l),f=i(e.shapeInfo.logicalShape,t.logicalShape),p=l-d;let m;const h=["x","y","z","w","u","v"];m=0===d?"":l<2&&f.length>=1?"coords = 0;":f.map((e=>`coords.${h[e+p]} = 0;`)).join("\n");let b="";b=l<2&&d>0?"coords":e.shapeInfo.logicalShape.map(((e,t)=>`coords.${h[t+p]}`)).join(", ");return`\n float ${r}() {\n ${c} coords = getOutputCoords();\n ${m}\n return get${o}(${b});\n }\n `}(e,t));return r}(e,t,n.packedInputs,n.enableShapeUniforms))).join("\n"),w=t.texShape,_=Object(o.getGlslDifferences)(),k=function(e){return`\n float sampleTexture(sampler2D textureSampler, vec2 uv) {\n return ${e.texture2D}(textureSampler, uv).r;\n }\n `}(_);let v,x,y=function(e){return`${e.version}\n precision highp float;\n precision highp int;\n precision highp sampler2D;\n ${e.varyingFs} vec2 resultUV;\n ${e.defineOutput}\n const vec2 halfCR = vec2(0.5, 0.5);\n\n struct ivec5\n {\n int x;\n int y;\n int z;\n int w;\n int u;\n };\n\n struct ivec6\n {\n int x;\n int y;\n int z;\n int w;\n int u;\n int v;\n };\n\n uniform float NAN;\n ${e.defineSpecialNaN}\n ${e.defineSpecialInf}\n ${e.defineRound}\n\n int imod(int x, int y) {\n return x - y * (x / y);\n }\n\n int idiv(int a, int b, float sign) {\n int res = a / b;\n int mod = imod(a, b);\n if (sign < 0. && mod != 0) {\n res -= 1;\n }\n return res;\n }\n\n //Based on the work of Dave Hoskins\n //https://www.shadertoy.com/view/4djSRW\n #define HASHSCALE1 443.8975\n float random(float seed){\n vec2 p = resultUV * seed;\n vec3 p3 = fract(vec3(p.xyx) * HASHSCALE1);\n p3 += dot(p3, p3.yzx + 19.19);\n return fract((p3.x + p3.y) * p3.z);\n }\n\n ${l}\n ${c}\n ${f}\n `}(_);t.isPacked?(v=function(e,t,n){switch(e.length){case 0:return m();case 1:return function(e,t,n){const s=[Math.ceil(t[0]/2),Math.ceil(t[1]/2)];if(1===s[0])return n?"\n int getOutputCoords() {\n return 2 * int(resultUV.x * ceil(float(outTexShape[1]) / 2.0));\n }\n ":`\n int getOutputCoords() {\n return 2 * int(resultUV.x * ${s[1]}.0);\n }\n `;if(1===s[1])return n?"\n int getOutputCoords() {\n return 2 * int(resultUV.y * ceil(float(outTexShape[0]) / 2.0));\n }\n ":`\n int getOutputCoords() {\n return 2 * int(resultUV.y * ${s[0]}.0);\n }\n `;if(n)return"\n int getOutputCoords() {\n ivec2 packedTexShape = ivec2(ceil(float(outTexShape[0]) / 2.0), ceil(float(outTexShape[1]) / 2.0));\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(packedTexShape[0], packedTexShape[1]));\n return 2 * (resTexRC.x * packedTexShape[1] + resTexRC.y);\n }\n ";return`\n int getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(${s[0]}, ${s[1]}));\n return 2 * (resTexRC.x * ${s[1]} + resTexRC.y);\n }\n `}(0,t,n);case 2:return function(e,t,n){const o=[Math.ceil(t[0]/2),Math.ceil(t[1]/2)];if(s.util.arraysEqual(e,t))return n?"\n ivec2 getOutputCoords() {\n ivec2 packedTexShape = ivec2(ceil(float(outTexShape[0]) / 2.0), ceil(float(outTexShape[1]) / 2.0));\n return 2 * ivec2(resultUV.yx * vec2(packedTexShape[0], packedTexShape[1]));\n }\n ":`\n ivec2 getOutputCoords() {\n return 2 * ivec2(resultUV.yx * vec2(${o[0]}, ${o[1]}));\n }\n `;const r=Math.ceil(e[1]/2);if(n)return"\n ivec2 getOutputCoords() {\n ivec2 packedTexShape = ivec2(ceil(float(outTexShape[0]) / 2.0), ceil(float(outTexShape[1]) / 2.0));\n int texelsInLogicalRow = int(ceil(float(outShape[1]) / 2.0));\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(packedTexShape[0], packedTexShape[1]));\n\n int index = resTexRC.x * packedTexShape[1] + resTexRC.y;\n int r = 2 * (index / texelsInLogicalRow);\n int c = imod(index, texelsInLogicalRow) * 2;\n\n return ivec2(r, c);\n }\n ";return`\n ivec2 getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(${o[0]}, ${o[1]}));\n\n int index = resTexRC.x * ${o[1]} + resTexRC.y;\n int r = 2 * (index / ${r});\n int c = imod(index, ${r}) * 2;\n\n return ivec2(r, c);\n }\n `}(e,t,n);case 3:return function(e,t,n){if(n)return"\n ivec3 getOutputCoords() {\n ivec2 packedTexShape = ivec2(ceil(float(outTexShape[0]) / 2.0), ceil(float(outTexShape[1]) / 2.0));\n int texelsInLogicalRow = int(ceil(float(outShape[2]) / 2.0));\n int texelsInBatch = texelsInLogicalRow * int(ceil(float(outShape[1]) / 2.0));\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(packedTexShape[0], packedTexShape[1]));\n int index = resTexRC.x * packedTexShape[1] + resTexRC.y;\n\n int b = index / texelsInBatch;\n index -= b * texelsInBatch;\n\n int r = 2 * (index / texelsInLogicalRow);\n int c = imod(index, texelsInLogicalRow) * 2;\n\n return ivec3(b, r, c);\n }\n ";const s=[Math.ceil(t[0]/2),Math.ceil(t[1]/2)],o=Math.ceil(e[2]/2),r=o*Math.ceil(e[1]/2);return`\n ivec3 getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(${s[0]}, ${s[1]}));\n int index = resTexRC.x * ${s[1]} + resTexRC.y;\n\n int b = index / ${r};\n index -= b * ${r};\n\n int r = 2 * (index / ${o});\n int c = imod(index, ${o}) * 2;\n\n return ivec3(b, r, c);\n }\n `}(e,t,n);default:return function(e,t,n){if(n)return"\n ivec4 getOutputCoords() {\n ivec2 packedTexShape = ivec2(ceil(float(outTexShape[0]) / 2.0), ceil(float(outTexShape[1]) / 2.0));\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(packedTexShape[0], packedTexShape[1]));\n int index = resTexRC.x * packedTexShape[1] + resTexRC.y;\n\n int texelsInLogicalRow = int(ceil(float(outShape[3]) / 2.0));\n int texelsInBatch = texelsInLogicalRow * int(ceil(float(outShape[2]) / 2.0));\n int texelsInBatchN = texelsInBatch * outShape[1];\n\n int b2 = index / texelsInBatchN;\n index -= b2 * texelsInBatchN;\n\n int b = index / texelsInBatch;\n index -= b * texelsInBatch;\n\n int r = 2 * (index / texelsInLogicalRow);\n int c = imod(index, texelsInLogicalRow) * 2;\n\n return ivec4(b2, b, r, c);\n }\n ";const s=[Math.ceil(t[0]/2),Math.ceil(t[1]/2)],o=Math.ceil(e[e.length-1]/2),r=o*Math.ceil(e[e.length-2]/2);let i=r,a="",u="b, r, c";for(let t=2;t1&&!s.util.arraysEqual(t,n)&&o.lengthe[t])).join(", ")}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/shader_compiler_util.js": +/*!***************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/shader_compiler_util.js ***! + \***************************************************************************/ +/*! exports provided: getLogicalCoordinatesFromFlatIndex, getOutputLogicalCoordinatesFromFlatIndexByUniform, getLogicalCoordinatesFromFlatIndexByUniform, dotify, getFlatIndexFrom3D, getFlatIndexFrom3DOutput, ENCODE_FLOAT_SNIPPET */function(e,t,n){"use strict";n.r(t),n.d(t,"getLogicalCoordinatesFromFlatIndex",(function(){return o})),n.d(t,"getOutputLogicalCoordinatesFromFlatIndexByUniform",(function(){return r})),n.d(t,"getLogicalCoordinatesFromFlatIndexByUniform",(function(){return i})),n.d(t,"dotify",(function(){return u})),n.d(t,"getFlatIndexFrom3D",(function(){return d})),n.d(t,"getFlatIndexFrom3DOutput",(function(){return l})),n.d(t,"ENCODE_FLOAT_SNIPPET",(function(){return c}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */function o(e,t,n="index"){const o=s.util.computeStrides(t);return o.map(((t,s)=>`${`int ${e[s]} = ${n} / ${t}`}; ${s===o.length-1?`int ${e[s+1]} = ${n} - ${e[s]} * ${t}`:`index -= ${e[s]} * ${t}`};`)).join("")}function r(e,t,n="index"){const o=s.util.computeStrides(t);return o.map(((t,s)=>`${`int ${e[s]} = ${n} / outShapeStrides[${s}]`}; ${s===o.length-1?`int ${e[s+1]} = ${n} - ${e[s]} * outShapeStrides[${s}]`:`index -= ${e[s]} * outShapeStrides[${s}]`};`)).join("")}function i(e,t,n="index"){const s=function(e,t){const n=e.length,s=e.map((e=>`${t}[${e}]`)),o=new Array(n-1);o[n-2]=s[n-1];for(let e=n-3;e>=0;--e)o[e]=`(${o[e+1]} * ${s[e+1]})`;return o}(e.map(((e,t)=>t)),t);return s.map(((t,o)=>`${`int ${e[o]} = ${n} / ${s[o]}`}; ${o===s.length-1?`int ${e[o+1]} = ${n} - ${e[o]} * ${s[o]}`:`index -= ${e[o]} * ${s[o]}`};`)).join("")}function a(e){return 1===e.length?`${e[0]}`:`vec${e.length}(${e.join(",")})`}function u(e,t){if(e.length!==t.length)throw new Error(`Vectors to be dotted must be of the same length -got ${e.length} and ${t.length}`);const n=[],s=Math.floor(e.length/4),o=e.length%4;for(let o=0;o`float(${e})`)),r=r.map((e=>`float(${e})`))),n.push(`${a(o)}, ${a(r)}`)}return n.map(((e,t)=>`dot(${e})`)).join("+")}function d(e){const t=s.util.computeStrides(e).map((e=>e.toString()));return`\n int getFlatIndex(ivec3 coords) {\n return coords.x * ${t[0]} + coords.y * ${t[1]} + coords.z;\n }\n`}function l(){return"\n int getFlatIndex(ivec3 coords) {\n return coords.x * outShapeStrides[0] + coords.y * outShapeStrides[1] + coords.z;\n }\n"}const c="\n const float FLOAT_MAX = 1.70141184e38;\n const float FLOAT_MIN = 1.17549435e-38;\n\n lowp vec4 encode_float(highp float v) {\n if (isnan(v)) {\n return vec4(255, 255, 255, 255);\n }\n\n highp float av = abs(v);\n\n if(av < FLOAT_MIN) {\n return vec4(0.0, 0.0, 0.0, 0.0);\n } else if(v > FLOAT_MAX) {\n return vec4(0.0, 0.0, 128.0, 127.0) / 255.0;\n } else if(v < -FLOAT_MAX) {\n return vec4(0.0, 0.0, 128.0, 255.0) / 255.0;\n }\n\n highp vec4 c = vec4(0,0,0,0);\n\n highp float e = floor(log2(av));\n highp float m = exp2(fract(log2(av))) - 1.0;\n\n c[2] = floor(128.0 * m);\n m -= c[2] / 128.0;\n c[1] = floor(32768.0 * m);\n m -= c[1] / 32768.0;\n c[0] = floor(8388608.0 * m);\n\n highp float ebias = e + 127.0;\n c[3] = floor(ebias / 2.0);\n ebias -= c[3] * 2.0;\n c[2] += floor(ebias) * 128.0;\n\n c[3] += 128.0 * step(0.0, -v);\n\n return c / 255.0;\n }\n"},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/slice_gpu.js": +/*!****************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/slice_gpu.js ***! + \****************************************************************/ +/*! exports provided: SliceProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"SliceProgram",(function(){return o}));var s=n(/*! ./shader_compiler */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */class o{constructor(e){this.variableNames=["source"],this.outputShape=e,this.rank=e.length;const t=Object(s.getCoordsDataType)(this.rank);this.customUniforms=[{name:"start",arrayIndex:this.rank,type:"int"}];const n=function(e){if(1===e)return"sourceLoc";if(e<=6)return r.slice(0,e).map((e=>"sourceLoc."+e)).join(",");throw Error(`Slicing for rank ${e} is not yet supported`)}(this.rank);let o;o=`\n ${t} sourceLoc;\n ${t} coords = getOutputCoords();\n ${e.map(((e,t)=>`sourceLoc.${r[t]} = start[${t}] + coords.${r[t]};`)).join("\n")}\n `,this.userCode=`\n void main() {\n ${o}\n setOutput(getSource(${n}));\n }\n `}}const r=["x","y","z","w","u","v"]},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/slice_packed_gpu.js": +/*!***********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/slice_packed_gpu.js ***! + \***********************************************************************/ +/*! exports provided: SlicePackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"SlicePackedProgram",(function(){return r}));var s=n(/*! ./packing_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/packing_util.js"),o=n(/*! ./shader_compiler */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class r{constructor(e){this.variableNames=["source"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=e,this.rank=e.length,this.customUniforms=[{name:"start",arrayIndex:this.rank,type:"int"}];const t=Object(o.getCoordsDataType)(this.rank),n=Object(s.getChannels)("coords",this.rank),r=Object(s.getChannels)("sourceLoc",this.rank),i=1===this.rank?"sourceLoc":`vec2(${r.slice(-2).join()})`,a=`getChannel(getSource(${r.join()}), ${i})`,u=`\n result.x = ${a};\n if (++${n[this.rank-1]} < ${e[this.rank-1]}) {\n ++${r[this.rank-1]};\n result.y = ${a};\n --${r[this.rank-1]};\n }\n `,d=1===this.rank?"":`\n --${n[this.rank-1]};\n if (++${n[this.rank-2]} < ${e[this.rank-2]}) {\n ++${r[this.rank-2]};\n result.z = ${a};\n if (++${n[this.rank-1]} < ${e[this.rank-1]}) {\n ++${r[this.rank-1]};\n result.w = ${a};\n }\n }\n `,l=this.rank<=4?`sourceLoc = coords +\n ${t}(${e.map(((e,t)=>`start[${t}]`)).join()});`:e.map(((e,t)=>`${r[t]} = ${n[t]} + start[${t}];`)).join("\n");this.userCode=`\n void main() {\n ${t} coords = getOutputCoords();\n ${t} sourceLoc;\n ${l}\n vec4 result = vec4(0.);\n ${u}\n ${d}\n setOutput(result);\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/strided_slice_gpu.js": +/*!************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/strided_slice_gpu.js ***! + \************************************************************************/ +/*! exports provided: StridedSliceProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"StridedSliceProgram",(function(){return o}));var s=n(/*! ./shader_compiler */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */class o{constructor(e,t,n){this.variableNames=["x"],this.outputShape=n;const o=n.length,r=Object(s.getCoordsDataType)(n.length),i=Object(s.getCoordsDataType)(n.length);let a="";if(1===o)a="coords * strides + begin";else{let e=0;a=n.map(((t,s)=>(e++,1===n.length?`coords * strides[${s}] + begin[${s}]`:`coords[${e-1}] * strides[${s}] + begin[${s}]`))).join(",")}this.userCode=`\n ${r} begin = ${r}(${e});\n ${r} strides = ${r}(${t});\n\n void main() {\n ${i} coords = getOutputCoords();\n setOutput(getX(${a}));\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/tex_util.js": +/*!***************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/tex_util.js ***! + \***************************************************************/ +/*! exports provided: PackingScheme, TextureUsage, PhysicalTextureType, getUnpackedMatrixTextureShapeWidthHeight, getUnpackedArraySizeFromMatrixSize, getColorMatrixTextureShapeWidthHeight, getDenseTexShape, getMatrixSizeFromUnpackedArraySize, decodeMatrixFromUnpackedColorRGBAArray, getPackedMatrixTextureShapeWidthHeight, getPackedRGBAArraySizeFromMatrixShape, getTextureConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"PackingScheme",(function(){return s})),n.d(t,"TextureUsage",(function(){return o})),n.d(t,"PhysicalTextureType",(function(){return r})),n.d(t,"getUnpackedMatrixTextureShapeWidthHeight",(function(){return a})),n.d(t,"getUnpackedArraySizeFromMatrixSize",(function(){return u})),n.d(t,"getColorMatrixTextureShapeWidthHeight",(function(){return d})),n.d(t,"getDenseTexShape",(function(){return l})),n.d(t,"getMatrixSizeFromUnpackedArraySize",(function(){return c})),n.d(t,"decodeMatrixFromUnpackedColorRGBAArray",(function(){return f})),n.d(t,"getPackedMatrixTextureShapeWidthHeight",(function(){return p})),n.d(t,"getPackedRGBAArraySizeFromMatrixShape",(function(){return m})),n.d(t,"getTextureConfig",(function(){return h}));var s,o,r,i=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */function a(e,t){return[t,e]}function u(e,t){return e*t}function d(e,t){return[4*t,e]}function l(e){const t=i.util.sizeFromShape(e),n=Math.ceil(t/4);return i.util.sizeToSquarishShape(n)}function c(e,t){if(e%t!=0)throw new Error(`unpackedSize (${e}) must be a multiple of ${t}`);return e/t}function f(e,t,n){const s=e.length*n/4;if(t.length= ${s}`);let o=0;for(let s=0;s0){this.numFreeTextures--,this.numUsedTextures++,this._numBytesFree-=i,this.log();const e=this.freeTextures[o].shift();return this.usedTextures[o].push(e),e}let l;return s===r.PhysicalTextureType.PACKED_2X2_FLOAT32?l=this.gpgpu.createPackedMatrixTexture(e[0],e[1]):s===r.PhysicalTextureType.PACKED_2X2_FLOAT16?l=this.gpgpu.createFloat16PackedMatrixTexture(e[0],e[1]):s===r.PhysicalTextureType.UNPACKED_FLOAT32?l=this.gpgpu.createFloat32MatrixTexture(e[0],e[1]):s===r.PhysicalTextureType.UNPACKED_FLOAT16?l=this.gpgpu.createFloat16MatrixTexture(e[0],e[1]):s===r.PhysicalTextureType.PACKED_4X1_UNSIGNED_BYTE&&(l=this.gpgpu.createUnsignedBytesMatrixTexture(e[0],e[1])),this.usedTextures[o].push(l),this.numUsedTextures++,this._numBytesAllocated+=i,this.log(),l}releaseTexture(e,t,n,o){if(null==this.freeTextures)return;const r=u(n,o),i=d(t,r,o);i in this.freeTextures||(this.freeTextures[i]=[]);const l=a(t,r,this.gpgpu.gl,this.gpgpu.textureConfig,o),c=Object(s.env)().get("WEBGL_DELETE_TEXTURE_THRESHOLD");-1!==c&&this._numBytesAllocated>c?(this.gpgpu.deleteMatrixTexture(e),this._numBytesAllocated-=l):(this.freeTextures[i].push(e),this.numFreeTextures++,this._numBytesFree+=l),this.numUsedTextures--;const f=this.usedTextures[i],p=f.indexOf(e);if(p<0)throw new Error("Cannot release a texture that was never provided by this texture manager");f.splice(p,1),this.log()}log(){if(!this.logEnabled)return;const e=this.numFreeTextures+this.numUsedTextures;console.log("Free/Used",`${this.numFreeTextures} / ${this.numUsedTextures}`,`(${e})`);const t=this._numBytesFree/this._numBytesAllocated;console.log(`Bytes allocated: ${this._numBytesAllocated}`),console.log(`Bytes unused: ${this._numBytesFree} (${Math.round(100*t)}%)`)}get numBytesAllocated(){return this._numBytesAllocated}get numBytesFree(){return this._numBytesFree}getNumUsedTextures(){return this.numUsedTextures}getNumFreeTextures(){return this.numFreeTextures}dispose(){if(null!=this.freeTextures){for(const e in this.freeTextures)this.freeTextures[e].forEach((e=>{this.gpgpu.deleteMatrixTexture(e)}));for(const e in this.usedTextures)this.usedTextures[e].forEach((e=>{this.gpgpu.deleteMatrixTexture(e)}));this.freeTextures=null,this.usedTextures=null,this.numUsedTextures=0,this.numFreeTextures=0,this._numBytesAllocated=0,this._numBytesFree=0}}}function a(e,t,n,s,i){const a=function(e,t){switch(e){case r.PhysicalTextureType.PACKED_2X2_FLOAT32:return Object(o.getInternalFormatForPackedMatrixTexture)(t);case r.PhysicalTextureType.PACKED_2X2_FLOAT16:return Object(o.getInternalFormatForFloat16PackedMatrixTexture)(t);case r.PhysicalTextureType.UNPACKED_FLOAT32:return Object(o.getInternalFormatForFloat32MatrixTexture)(t);case r.PhysicalTextureType.UNPACKED_FLOAT16:return Object(o.getInternalFormatForFloat16MatrixTexture)(t);case r.PhysicalTextureType.PACKED_4X1_UNSIGNED_BYTE:return Object(o.getInternalFormatForUnsignedBytesMatrixTexture)(t);default:throw new Error(`Unknown physical texture type ${e}`)}}(t,s);let u;if(i){const[t,n]=Object(r.getPackedMatrixTextureShapeWidthHeight)(e[0],e[1]);u=t*n}else{const[t,n]=Object(r.getUnpackedMatrixTextureShapeWidthHeight)(e[0],e[1]);u=t*n}return u*function(e,t){const n=e;if(t===n.R32F)return 4;if(t===n.R16F)return 2;if(t===n.RGBA32F)return 16;if(t===e.RGBA)return 16;if(t===n.RGBA16F)return 8;throw new Error(`Unknown internal format ${t}`)}(n,a)}function u(e,t){if(e===r.TextureUsage.UPLOAD)return r.PhysicalTextureType.PACKED_2X2_FLOAT32;if(e===r.TextureUsage.RENDER||null==e)return function(e){return Object(s.env)().getBool("WEBGL_RENDER_FLOAT32_ENABLED")?e?r.PhysicalTextureType.PACKED_2X2_FLOAT32:r.PhysicalTextureType.UNPACKED_FLOAT32:e?r.PhysicalTextureType.PACKED_2X2_FLOAT16:r.PhysicalTextureType.UNPACKED_FLOAT16}(t);if(e===r.TextureUsage.DOWNLOAD||e===r.TextureUsage.PIXELS)return r.PhysicalTextureType.PACKED_4X1_UNSIGNED_BYTE;throw new Error(`Unknown logical texture type ${e}`)}function d(e,t,n){return`${e[0]}_${e[1]}_${t}_${n}`}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/tile_gpu.js": +/*!***************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/tile_gpu.js ***! + \***************************************************************/ +/*! exports provided: TileProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"TileProgram",(function(){return o}));var s=n(/*! ./shader_compiler */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */class o{constructor(e,t){this.variableNames=["A"];const n=new Array(e.length);for(let s=0;s5)throw Error(`Tile for rank ${t} is not yet supported`);if(1===t)return`imod(resRC, ${e[0]})`;const n=["resRC.x","resRC.y","resRC.z","resRC.w","resRC.u"],s=[];for(let t=0;t= dir;\n bool isGreater = x0 > x1 || (x0 == x1 && i1 > i0);\n if (reverse == isGreater) { // Elements in opposite order of direction\n int iTemp = i0;\n i0 = i1;\n i1 = iTemp;\n }\n if (isFirstInPair) {\n setOutput(float(i0));\n } else {\n setOutput(float(i1));\n }\n }\n "}}class o{constructor(e){this.variableNames=["x","indices"],this.customUniforms=[{name:"n",type:"int"},{name:"firstPass",type:"int"},{name:"k",type:"int"}],this.outputShape=e,this.userCode="\n void main() {\n // Takes max of indices (0, k), (1, k + 1), (2, k + 2) ...\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int elemIdx = coords[1];\n\n // The output size is half of the previous size.\n // If the previous sequence is | | | | _ _ _ _ | | | | _ _ _ _ (k=4),\n // we only need to output the indices at positions |, the indices at\n // positions _ can be thrown away, see Figure5(b) After Phase 2\n // (Merge phase) in the Bitonic Top K paper referenced above.\n // For example, the paper shows we only need to output the orange bars.\n // The output sequence should look like this | | | | | | | |.\n // Because the sequence is halved, to map the output index back\n // to the previous sequence to find the corresponding value,\n // we need to double the index. When we double the index,\n // we basically interpolate a position, so 2i looks like\n // | _ | _ | _ | _ | _ | _ | _. We move the | to the first k position\n // of each 2k positions by - elemIdx % k. E.g. for output at\n // index 4,5,6,7, we want to get the corresponding element at\n // original index 8,9,10,11, for output at index 8,9,10,11,\n // we want to get the corresponding element at original index\n // 16,17,18,19, so on and so forth.\n\n int i = elemIdx < k ? elemIdx : (elemIdx * 2 - imod(elemIdx, k));\n int i0 = firstPass == 1 ? i : int(getIndices(batch, i));\n int i1 = firstPass == 1 ? i + k : int(getIndices(batch, i + k));\n\n float x0 = getX(batch, i0);\n float x1 = i1 < n ? getX(batch, i1) : x0;\n\n setOutput(x0 >= x1 ? float(i0) : float(i1));\n }\n "}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/transform_gpu.js": +/*!********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/transform_gpu.js ***! + \********************************************************************/ +/*! exports provided: TransformProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"TransformProgram",(function(){return s})); +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class s{constructor(e,t,n,s,o,r){this.variableNames=["Image","Transforms"],this.outputShape=r;const i="nearest"===n?1:2;let a;switch(s){case"constant":a=1;break;case"reflect":a=2;break;case"wrap":a=3;break;case"nearest":a=4;break;default:a=1}this.userCode=`\n float mapCoord(float outCoord, float len) {\n float inCoord = outCoord;\n if(${a} == 2) {\n if (inCoord < 0.0) {\n if (len <= 1.0) {\n inCoord = 0.0;\n } else {\n float sz2 = 2.0 * len;\n if (inCoord < sz2) {\n inCoord = sz2 * float(int(float(-inCoord / sz2))) +\n inCoord;\n }\n inCoord = inCoord < -len ? inCoord + sz2 : -inCoord - 1.0;\n }\n } else if (inCoord > len - 1.0) {\n if (len <= 1.0) {\n inCoord = 0.0;\n } else {\n float sz2 = 2.0 * len;\n inCoord -= sz2 * float(int(float(inCoord / sz2)));\n if (inCoord >= len) {\n inCoord = sz2 - inCoord - 1.0;\n }\n }\n }\n return clamp(inCoord, 0.0, len - 1.0);\n } else if (${a} == 3) {\n if (inCoord < 0.0) {\n if (len <= 1.0) {\n inCoord = 0.0;\n } else {\n float sz = len - 1.0;\n inCoord += len * (float(int(float(-inCoord / sz))) + 1.0);\n }\n } else if (inCoord > len - 1.0) {\n if (len <= 1.0) {\n inCoord = 0.0;\n } else {\n float sz = len - 1.0;\n inCoord -= len * float(int(float(inCoord / sz)));\n }\n }\n return clamp(inCoord, 0.0, len - 1.0);\n } else if (${a} == 4) {\n return clamp(outCoord, 0.0, len - 1.0);\n } else {\n return outCoord;\n }\n }\n\n float readWithFillValue(int batch, int coordY, int coordX,\n int channel) {\n float outputValue;\n if (0 <= coordY && coordY < ${e} && 0 <= coordX && coordX < ${t}) {\n outputValue = getImage(batch, coordY, coordX, channel);\n } else {\n outputValue = float(${o});\n }\n return outputValue;\n }\n\n void main() {\n ivec4 coords = getOutputCoords();\n float outputValue;\n int batch = coords[0];\n int x = coords[2];\n int y = coords[1];\n int channel = coords[3];\n float xf = float(x);\n float yf = float(y);\n float a1 = getTransforms(batch, 0);\n float a2 = getTransforms(batch, 1);\n float a3 = getTransforms(batch, 2);\n float b1 = getTransforms(batch, 3);\n float b2 = getTransforms(batch, 4);\n float b3 = getTransforms(batch, 5);\n float c1 = getTransforms(batch, 6);\n float c2 = getTransforms(batch, 7);\n float projection = c1 * xf + c2 * yf + 1.0;\n if (projection == 0.0) {\n outputValue = float(${o});\n } else {\n float inX = (a1 * xf + a2 * yf + a3) / projection;\n float inY = (b1 * xf + b2 * yf + b3) / projection;\n float mapX = mapCoord(inX, float(${t}));\n float mapY = mapCoord(inY, float(${e}));\n\n if (${i} == 1) {\n int coordY = int(round(mapY));\n int coordX = int(round(mapX));\n outputValue = readWithFillValue(batch, coordY, coordX,\n channel);\n } else {\n float yFloor = floor(mapY);\n float xFloor = floor(mapX);\n float yCeil = yFloor + 1.0;\n float xCeil = xFloor + 1.0;\n float valueYFloor = (xCeil - mapX) *\n readWithFillValue(batch, int(yFloor), int(xFloor), channel) +\n (mapX - xFloor) *\n readWithFillValue(batch, int(yFloor), int(xCeil), channel);\n float valueYCeil = (xCeil - mapX) *\n readWithFillValue(batch, int(yCeil), int(xFloor), channel) +\n (mapX - xFloor) *\n readWithFillValue(batch, int(yCeil), int(xCeil), channel);\n outputValue = (yCeil - mapY) * valueYFloor +\n (mapY - yFloor) * valueYCeil;\n }\n }\n setOutput(outputValue);\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/transpose_gpu.js": +/*!********************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/transpose_gpu.js ***! + \********************************************************************/ +/*! exports provided: TransposeProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"TransposeProgram",(function(){return o}));var s=n(/*! ./shader_compiler */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */class o{constructor(e,t){this.variableNames=["A"];const n=new Array(e.length);for(let s=0;s6)throw Error(`Transpose for rank ${t} is not yet supported`);const n=["resRC.x","resRC.y","resRC.z","resRC.w","resRC.u","resRC.v"],s=new Array(t);for(let t=0;t6)throw Error(`Packed transpose for rank ${this.rank} is not yet supported.`);const r=Object(o.getCoordsDataType)(this.rank),i=Object(s.getVecChannels)("rc",this.rank),a=new Array(this.rank);for(let e=0;e 0.0 ? 1.0 : float(${e});\n `}const d="return (x >= 0.0) ? x : (exp(x) - 1.0);",l=r+"\n return (x < 0.0) ? 0.0 : x;\n",c=r+"\n return (x < 0.0) ? 0.0 : min(6.0, x);\n",f="return x;",p="return 1.0 / (1.0 + exp(-1.0 * x));"},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/unaryop_packed_gpu.js": +/*!*************************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/unaryop_packed_gpu.js ***! + \*************************************************************************/ +/*! exports provided: LINEAR, ELU, RELU, RELU6, SIGMOID, UnaryOpPackedProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"LINEAR",(function(){return o})),n.d(t,"ELU",(function(){return r})),n.d(t,"RELU",(function(){return i})),n.d(t,"RELU6",(function(){return a})),n.d(t,"SIGMOID",(function(){return u})),n.d(t,"UnaryOpPackedProgram",(function(){return d}));var s=n(/*! ./gpgpu_math */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/gpgpu_math.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */const o="return x;",r="\n vec4 result;\n\n result.r = (x.r >= 0.0) ? x.r : (exp(x.r) - 1.0);\n result.g = (x.g >= 0.0) ? x.g : (exp(x.g) - 1.0);\n result.b = (x.b >= 0.0) ? x.b : (exp(x.b) - 1.0);\n result.a = (x.a >= 0.0) ? x.a : (exp(x.a) - 1.0);\n\n return result;\n",i="\n vec4 result = x * vec4(greaterThanEqual(x, vec4(0.0)));\n bvec4 isNaN = isnan(x);\n\n result.r = isNaN.r ? x.r : result.r;\n result.g = isNaN.g ? x.g : result.g;\n result.b = isNaN.b ? x.b : result.b;\n result.a = isNaN.a ? x.a : result.a;\n\n return result;\n",a="\n vec4 result = min(x, vec4(6.)) * vec4(greaterThanEqual(x, vec4(0.0)));\n bvec4 isNaN = isnan(x);\n\n result.r = isNaN.r ? x.r : result.r;\n result.g = isNaN.g ? x.g : result.g;\n result.b = isNaN.b ? x.b : result.b;\n result.a = isNaN.a ? x.a : result.a;\n\n return result;\n",u="return 1.0 / (1.0 + exp(-1.0 * x));";class d{constructor(e,t){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=e,this.enableShapeUniforms=Object(s.useShapeUniforms)(this.outputShape.length),this.userCode=`\n vec4 unaryOperation(vec4 x) {\n ${t}\n }\n\n void main() {\n vec4 x = getAAtOutCoords();\n vec4 y = unaryOperation(x);\n\n setOutput(y);\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/unpack_gpu.js": +/*!*****************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/unpack_gpu.js ***! + \*****************************************************************/ +/*! exports provided: UnpackProgram */function(e,t,n){"use strict";n.r(t),n.d(t,"UnpackProgram",(function(){return r}));var s=n(/*! ./packing_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/packing_util.js"),o=n(/*! ./shader_compiler */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class r{constructor(e){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!1,this.outputShape=e;const t=e.length,n=Object(s.getChannels)("rc",t),r=Object(o.getCoordsDataType)(t),i=Object(s.getSourceCoords)(t,n),a=n.slice(-2),u=t<=1?"rc":`vec2(${a.join(",")})`;this.userCode=`\n void main() {\n ${r} rc = getOutputCoords();\n vec4 packedInput = getA(${i});\n\n setOutput(getChannel(packedInput, ${u}));\n }\n `}}},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/version.js": +/*!**************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/version.js ***! + \**************************************************************/ +/*! exports provided: version */function(e,t,n){"use strict";n.r(t),n.d(t,"version",(function(){return s})); +/** @license See the LICENSE file. */ +const s="0.0.0"},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/webgl.js": +/*!************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/webgl.js ***! + \************************************************************/ +/*! exports provided: MathBackendWebGL, setWebGLContext, GPGPUContext, gpgpu_util, webgl_util, forceHalfFloat */function(e,t,n){"use strict";n.r(t),n.d(t,"forceHalfFloat",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./gpgpu_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/gpgpu_util.js");n.d(t,"gpgpu_util",(function(){return o}));var r=n(/*! ./webgl_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/webgl_util.js");n.d(t,"webgl_util",(function(){return r}));var i=n(/*! ./backend_webgl */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/backend_webgl.js");n.d(t,"MathBackendWebGL",(function(){return i.MathBackendWebGL}));var a=n(/*! ./canvas_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/canvas_util.js");n.d(t,"setWebGLContext",(function(){return a.setWebGLContext}));var u=n(/*! ./gpgpu_context */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/gpgpu_context.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function d(){Object(s.env)().set("WEBGL_FORCE_F16_TEXTURES",!0)}n.d(t,"GPGPUContext",(function(){return u.GPGPUContext}))},"./.yalc/@tensorflow/tfjs-backend-webgl/dist/webgl_util.js": +/*!*****************************************************************!*\ + !*** ./.yalc/@tensorflow/tfjs-backend-webgl/dist/webgl_util.js ***! + \*****************************************************************/ +/*! exports provided: callAndCheck, canBeRepresented, getWebGLErrorMessage, getExtensionOrThrow, createVertexShader, createFragmentShader, createProgram, linkProgram, validateProgram, createStaticVertexBuffer, createStaticIndexBuffer, getNumChannels, createTexture, validateTextureSize, createFramebuffer, bindVertexBufferToProgramAttribute, bindTextureUnit, unbindTextureUnit, getProgramUniformLocationOrThrow, getProgramUniformLocation, bindTextureToProgramUniformSampler, bindCanvasToFramebuffer, bindColorTextureToFramebuffer, unbindColorTextureFromFramebuffer, validateFramebuffer, getFramebufferErrorMessage, getBatchDim, getRowsCols, getShapeAs3D, getTextureShapeFromLogicalShape, isReshapeFree, getWebGLMaxTextureSize, resetMaxTextureSize, resetMaxTexturesInShader, getMaxTexturesInShader, getWebGLDisjointQueryTimerVersion, hasExtension, isWebGLVersionEnabled, isCapableOfRenderingToFloatTexture, isDownloadFloatTextureEnabled, isWebGLFenceEnabled, assertNotComplex */function(e,t,n){"use strict";n.r(t),n.d(t,"callAndCheck",(function(){return i})),n.d(t,"canBeRepresented",(function(){return a})),n.d(t,"getWebGLErrorMessage",(function(){return u})),n.d(t,"getExtensionOrThrow",(function(){return d})),n.d(t,"createVertexShader",(function(){return l})),n.d(t,"createFragmentShader",(function(){return c})),n.d(t,"createProgram",(function(){return p})),n.d(t,"linkProgram",(function(){return m})),n.d(t,"validateProgram",(function(){return h})),n.d(t,"createStaticVertexBuffer",(function(){return b})),n.d(t,"createStaticIndexBuffer",(function(){return j})),n.d(t,"getNumChannels",(function(){return g})),n.d(t,"createTexture",(function(){return w})),n.d(t,"validateTextureSize",(function(){return _})),n.d(t,"createFramebuffer",(function(){return k})),n.d(t,"bindVertexBufferToProgramAttribute",(function(){return v})),n.d(t,"bindTextureUnit",(function(){return x})),n.d(t,"unbindTextureUnit",(function(){return y})),n.d(t,"getProgramUniformLocationOrThrow",(function(){return O})),n.d(t,"getProgramUniformLocation",(function(){return I})),n.d(t,"bindTextureToProgramUniformSampler",(function(){return C})),n.d(t,"bindCanvasToFramebuffer",(function(){return S})),n.d(t,"bindColorTextureToFramebuffer",(function(){return T})),n.d(t,"unbindColorTextureFromFramebuffer",(function(){return N})),n.d(t,"validateFramebuffer",(function(){return E})),n.d(t,"getFramebufferErrorMessage",(function(){return A})),n.d(t,"getBatchDim",(function(){return M})),n.d(t,"getRowsCols",(function(){return $})),n.d(t,"getShapeAs3D",(function(){return D})),n.d(t,"getTextureShapeFromLogicalShape",(function(){return P})),n.d(t,"isReshapeFree",(function(){return L})),n.d(t,"getWebGLMaxTextureSize",(function(){return U})),n.d(t,"resetMaxTextureSize",(function(){return W})),n.d(t,"resetMaxTexturesInShader",(function(){return V})),n.d(t,"getMaxTexturesInShader",(function(){return q})),n.d(t,"getWebGLDisjointQueryTimerVersion",(function(){return H})),n.d(t,"hasExtension",(function(){return K})),n.d(t,"isWebGLVersionEnabled",(function(){return X})),n.d(t,"isCapableOfRenderingToFloatTexture",(function(){return Y})),n.d(t,"isDownloadFloatTextureEnabled",(function(){return Z})),n.d(t,"isWebGLFenceEnabled",(function(){return J})),n.d(t,"assertNotComplex",(function(){return ee}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./canvas_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/canvas_util.js"),r=n(/*! ./tex_util */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/tex_util.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e,t){const n=t();return Object(s.env)().getBool("DEBUG")&&function(e){const t=e.getError();if(t!==e.NO_ERROR)throw new Error("WebGL Error: "+u(e,t))}(e),n}function a(e){return!!(Object(s.env)().getBool("WEBGL_RENDER_FLOAT32_ENABLED")||0===e||5.96e-8e.getExtension(t)),'Extension "'+t+'" not supported on this browser.')}function l(e,t){const n=R(e,(()=>e.createShader(e.VERTEX_SHADER)),"Unable to create vertex WebGLShader.");if(i(e,(()=>e.shaderSource(n,t))),i(e,(()=>e.compileShader(n))),!1===e.getShaderParameter(n,e.COMPILE_STATUS))throw console.log(e.getShaderInfoLog(n)),new Error("Failed to compile vertex shader.");return n}function c(e,t){const n=R(e,(()=>e.createShader(e.FRAGMENT_SHADER)),"Unable to create fragment WebGLShader.");if(i(e,(()=>e.shaderSource(n,t))),i(e,(()=>e.compileShader(n))),!1===e.getShaderParameter(n,e.COMPILE_STATUS))throw function(e,t){const n=f.exec(t);if(null==n)return console.log(`Couldn't parse line number in error: ${t}`),void console.log(e);const o=+n[1],r=e.split("\n"),i=r.length.toString().length+2,a=r.map(((e,t)=>s.util.rightPad((t+1).toString(),i)+e));let u=0;for(let e=0;ee.createProgram()),"Unable to create WebGLProgram.")}function m(e,t){if(i(e,(()=>e.linkProgram(t))),!1===e.getProgramParameter(t,e.LINK_STATUS))throw console.log(e.getProgramInfoLog(t)),new Error("Failed to link vertex and fragment shaders.")}function h(e,t){if(i(e,(()=>e.validateProgram(t))),!1===e.getProgramParameter(t,e.VALIDATE_STATUS))throw console.log(e.getProgramInfoLog(t)),new Error("Shader program validation failed.")}function b(e,t){const n=R(e,(()=>e.createBuffer()),"Unable to create WebGLBuffer");return i(e,(()=>e.bindBuffer(e.ARRAY_BUFFER,n))),i(e,(()=>e.bufferData(e.ARRAY_BUFFER,t,e.STATIC_DRAW))),n}function j(e,t){const n=R(e,(()=>e.createBuffer()),"Unable to create WebGLBuffer");return i(e,(()=>e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,n))),i(e,(()=>e.bufferData(e.ELEMENT_ARRAY_BUFFER,t,e.STATIC_DRAW))),n}function g(){return 2===Object(s.env)().getNumber("WEBGL_VERSION")?1:4}function w(e){return R(e,(()=>e.createTexture()),"Unable to create WebGLTexture.")}function _(e,t){const n=Object(s.env)().getNumber("WEBGL_MAX_TEXTURE_SIZE");if(e<=0||t<=0){throw new Error("Requested texture size "+`[${e}x${t}]`+" is invalid.")}if(e>n||t>n){throw new Error("Requested texture size "+`[${e}x${t}]`+" greater than WebGL maximum on this browser / GPU "+`[${n}x${n}]`+".")}}function k(e){return R(e,(()=>e.createFramebuffer()),"Unable to create WebGLFramebuffer.")}function v(e,t,n,s,o,r,a){const u=e.getAttribLocation(t,n);return-1!==u&&(i(e,(()=>e.bindBuffer(e.ARRAY_BUFFER,s))),i(e,(()=>e.vertexAttribPointer(u,o,e.FLOAT,!1,r,a))),i(e,(()=>e.enableVertexAttribArray(u))),!0)}function x(e,t,n){F(e,n),i(e,(()=>e.activeTexture(e.TEXTURE0+n))),i(e,(()=>e.bindTexture(e.TEXTURE_2D,t)))}function y(e,t){F(e,t),i(e,(()=>e.activeTexture(e.TEXTURE0+t))),i(e,(()=>e.bindTexture(e.TEXTURE_2D,null)))}function O(e,t,n){return R(e,(()=>e.getUniformLocation(t,n)),'uniform "'+n+'" not present in program.')}function I(e,t,n){return e.getUniformLocation(t,n)}function C(e,t,n,s){i(e,(()=>x(e,t,s))),i(e,(()=>e.uniform1i(n,s)))}function S(e){i(e,(()=>e.bindFramebuffer(e.FRAMEBUFFER,null))),i(e,(()=>e.viewport(0,0,e.canvas.width,e.canvas.height))),i(e,(()=>e.scissor(0,0,e.canvas.width,e.canvas.height)))}function T(e,t,n){i(e,(()=>e.bindFramebuffer(e.FRAMEBUFFER,n))),i(e,(()=>e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,t,0)))}function N(e,t){i(e,(()=>e.bindFramebuffer(e.FRAMEBUFFER,t))),i(e,(()=>e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,null,0)))}function E(e){const t=e.checkFramebufferStatus(e.FRAMEBUFFER);if(t!==e.FRAMEBUFFER_COMPLETE)throw new Error("Error binding framebuffer: "+A(e,t))}function A(e,t){switch(t){case e.FRAMEBUFFER_INCOMPLETE_ATTACHMENT:return"FRAMEBUFFER_INCOMPLETE_ATTACHMENT";case e.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:return"FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT";case e.FRAMEBUFFER_INCOMPLETE_DIMENSIONS:return"FRAMEBUFFER_INCOMPLETE_DIMENSIONS";case e.FRAMEBUFFER_UNSUPPORTED:return"FRAMEBUFFER_UNSUPPORTED";default:return`unknown error ${t}`}}function R(e,t,n){const s=i(e,(()=>t()));if(null==s)throw new Error(n);return s}function F(e,t){const n=e.MAX_COMBINED_TEXTURE_IMAGE_UNITS-1,s=t+e.TEXTURE0;if(sn){throw new Error(`textureUnit must be in ${`[gl.TEXTURE0, gl.TEXTURE${n}]`}.`)}}function M(e,t=2){return s.util.sizeFromShape(e.slice(0,e.length-t))}function $(e){if(0===e.length)throw Error("Cannot get rows and columns of an empty shape array.");return[e.length>1?e[e.length-2]:1,e[e.length-1]]}function D(e){let t=[1,1,1];return 0===e.length||1===e.length&&1===e[0]||(t=[M(e),...$(e)]),t}function P(e,t=!1){let n=Object(s.env)().getNumber("WEBGL_MAX_TEXTURE_SIZE");if(t&&(n*=2,1===(e=e.map(((t,n)=>n>=e.length-2?s.util.nearestLargerEven(e[n]):e[n]))).length&&(e=[2,e[0]])),2!==e.length){const t=s.util.squeezeShape(e);e=t.newShape}let o=s.util.sizeFromShape(e);if(e.length<=1&&o<=n)return[1,o];if(2===e.length&&e[0]<=n&&e[1]<=n)return e;if(3===e.length&&e[0]*e[1]<=n&&e[2]<=n)return[e[0]*e[1],e[2]];if(3===e.length&&e[0]<=n&&e[1]*e[2]<=n)return[e[0],e[1]*e[2]];if(4===e.length&&e[0]*e[1]*e[2]<=n&&e[3]<=n)return[e[0]*e[1]*e[2],e[3]];if(4===e.length&&e[0]<=n&&e[1]*e[2]*e[3]<=n)return[e[0],e[1]*e[2]*e[3]];if(t){const t=M(e);let n=2,r=2;return e.length&&([n,r]=$(e)),o=t*(n/2)*(r/2),s.util.sizeToSquarishShape(o).map((e=>2*e))}return s.util.sizeToSquarishShape(o)}function B(e){return e%2==0}function L(e,t){if(e=e.slice(-2),t=t.slice(-2),s.util.arraysEqual(e,t))return!0;if(!e.length||!t.length)return!0;if(0===e[0]||0===e[1]||0===t[0]||0===t[1])return!0;if(e.length!==t.length){const n=e.slice(-1)[0],s=t.slice(-1)[0];if(n===s)return!0;if(B(n)&&B(s)&&(1===e[0]||1===t[0]))return!0}return e[1]===t[1]&&B(e[0])&&B(t[0])}let z,G;function U(e){if(null==z){const t=Object(o.getWebGLContext)(e);z=t.getParameter(t.MAX_TEXTURE_SIZE)}return z}function W(){z=null}function V(){G=null}function q(e){if(null==G){const t=Object(o.getWebGLContext)(e);G=t.getParameter(t.MAX_TEXTURE_IMAGE_UNITS)}return Math.min(16,G)}function H(e){if(0===e)return 0;let t;const n=Object(o.getWebGLContext)(e);return t=K(n,"EXT_disjoint_timer_query_webgl2")&&2===e?2:K(n,"EXT_disjoint_timer_query")?1:0,t}function K(e,t){return null!=e.getExtension(t)}function X(e){try{if(null!=Object(o.getWebGLContext)(e))return!0}catch(e){return console.log("Error when getting WebGL context: ",e),!1}return!1}function Y(e){if(0===e)return!1;const t=Object(o.getWebGLContext)(e);if(1===e){if(!K(t,"OES_texture_float"))return!1}else if(!K(t,"EXT_color_buffer_float"))return!1;return Q(t)}function Z(e){if(0===e)return!1;const t=Object(o.getWebGLContext)(e);if(1!==e){if(K(t,"EXT_color_buffer_float"))return Q(t);const e="EXT_color_buffer_half_float";if(K(t,e)){const n=t.getExtension(e);return function(e,t){const n=Object(r.getTextureConfig)(e,t),s=e.createTexture();e.bindTexture(e.TEXTURE_2D,s);const o=1,i=1;e.texImage2D(e.TEXTURE_2D,0,n.internalFormatHalfFloat,o,i,0,n.textureFormatFloat,n.textureTypeHalfFloat,null);const a=e.createFramebuffer();e.bindFramebuffer(e.FRAMEBUFFER,a),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,s,0);const u=e.checkFramebufferStatus(e.FRAMEBUFFER)===e.FRAMEBUFFER_COMPLETE;return e.bindTexture(e.TEXTURE_2D,null),e.bindFramebuffer(e.FRAMEBUFFER,null),e.deleteTexture(s),e.deleteFramebuffer(a),u}(t,n)}return!1}if(!K(t,"OES_texture_float"))return!1;if(!K(t,"WEBGL_color_buffer_float"))return!1;return Q(t)}function Q(e){const t=Object(r.getTextureConfig)(e),n=e.createTexture();e.bindTexture(e.TEXTURE_2D,n);e.texImage2D(e.TEXTURE_2D,0,t.internalFormatFloat,1,1,0,t.textureFormatFloat,t.textureTypeFloat,null);const s=e.createFramebuffer();e.bindFramebuffer(e.FRAMEBUFFER,s),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,n,0);const o=e.checkFramebufferStatus(e.FRAMEBUFFER)===e.FRAMEBUFFER_COMPLETE;return e.bindTexture(e.TEXTURE_2D,null),e.bindFramebuffer(e.FRAMEBUFFER,null),e.deleteTexture(n),e.deleteFramebuffer(s),o}function J(e){if(2!==e)return!1;return null!=Object(o.getWebGLContext)(e).fenceSync}function ee(e,t){Array.isArray(e)||(e=[e]),e.forEach((e=>{null!=e&&s.util.assert("complex64"!==e.dtype,(()=>`${t} does not support complex64 tensors in the WebGL backend.`))}))}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/backend_cpu.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/backend_cpu.js ***! + \***********************************************************************/ +/*! exports provided: MathBackendCPU */function(e,t,n){"use strict";n.r(t),n.d(t,"MathBackendCPU",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=s.kernel_impls.whereImpl;class i extends s.KernelBackend{constructor(){super(),this.blockSize=48,this.firstUse=!0,this.data=new s.DataStorage(this,Object(s.engine)())}nextDataId(){return i.nextDataId++}write(e,t,n){this.firstUse&&(this.firstUse=!1,Object(s.env)().get("IS_NODE")&&s.backend_util.warn("\n============================\nHi there 👋. Looks like you are running TensorFlow.js in Node.js. To speed things up dramatically, install our node backend, which binds to TensorFlow C++, by running npm i @tensorflow/tfjs-node, or npm i @tensorflow/tfjs-node-gpu if you have CUDA. Then call require('@tensorflow/tfjs-node'); (-gpu suffix for CUDA) at the start of your program. Visit https://github.com/tensorflow/tfjs-node for more details.\n============================"));const o={id:this.nextDataId()};return this.data.set(o,{values:e,dtype:n,refCount:1}),o}makeTensorInfo(e,t,n){let o;if("string"===t&&null!=n&&n.length>0&&s.util.isString(n[0])){const r=n.map((e=>s.util.encodeString(e)));o=this.write(r,e,t)}else o=this.write(n,e,t);return{dataId:o,shape:e,dtype:t}}refCount(e){if(this.data.has(e)){return this.data.get(e).refCount}return 0}incRef(e){this.data.get(e).refCount++}decRef(e){if(this.data.has(e)){this.data.get(e).refCount--}}move(e,t,n,s,o){this.data.set(e,{values:t,dtype:s,refCount:o})}numDataIds(){return this.data.numDataIds()}async read(e){return this.readSync(e)}readSync(e){const{dtype:t,complexTensorInfos:n}=this.data.get(e);if("complex64"===t){const e=this.readSync(n.real.dataId),t=this.readSync(n.imag.dataId);return s.backend_util.mergeRealAndImagArrays(e,t)}return this.data.get(e).values}bufferSync(e){const t=this.readSync(e.dataId);let n=t;if("string"===e.dtype)try{n=t.map((e=>s.util.decodeString(e)))}catch(e){throw new Error("Failed to decode encoded string bytes into utf-8")}return Object(s.buffer)(e.shape,e.dtype,n)}makeOutput(e,t,n){const o=this.write(e,t,n);return Object(s.engine)().makeTensorFromDataId(o,t,n,this)}disposeData(e,t=!1){if(this.data.has(e)){if(this.data.get(e).refCount--,!t&&this.data.get(e).refCount>0)return!1;const{complexTensorInfos:n}=this.data.get(e);null!=n&&(this.disposeData(n.real.dataId,!0),this.disposeData(n.imag.dataId,!0)),this.data.delete(e)}return!0}disposeIntermediateTensorInfo(e){this.disposeData(e.dataId)}async time(e){const t=s.util.now();e();return{kernelMs:s.util.now()-t}}memory(){return{unreliable:!0,reasons:["The reported memory is an upper bound. Due to automatic garbage collection, the true allocated memory may be less."]}}where(e){Object(o.assertNotComplex)([e],"where");const t=this.readSync(e.dataId);return r(e.shape,t)}dispose(){}floatPrecision(){return 32}epsilon(){return super.epsilon()}}i.nextDataId=0},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/base.js": +/*!****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/base.js ***! + \****************************************************************/ +/*! exports provided: MathBackendCPU, version_cpu, shared */function(e,t,n){"use strict";n.r(t);var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./backend_cpu */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/backend_cpu.js"),r=n(/*! ./shared */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/shared.js");n.d(t,"shared",(function(){return r})),n.d(t,"MathBackendCPU",(function(){return o.MathBackendCPU}));var i=n(/*! ./version */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/version.js");n.d(t,"version_cpu",(function(){return i.version})), +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +Object(s.registerBackend)("cpu",(()=>new o.MathBackendCPU),1)},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js": +/*!********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js ***! + \********************************************************************/ +/*! exports provided: assertNotComplex */function(e,t,n){"use strict";n.r(t),n.d(t,"assertNotComplex",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */function o(e,t){Array.isArray(e)||(e=[e]),e.forEach((e=>{null!=e&&s.util.assert("complex64"!==e.dtype,(()=>`${t} does not support complex64 tensors in the CPU backend.`))}))}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/index.js": +/*!*****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/index.js ***! + \*****************************************************************/ +/*! exports provided: MathBackendCPU, version_cpu, shared */function(e,t,n){"use strict";n.r(t);var s=n(/*! ./base */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/base.js");n.d(t,"MathBackendCPU",(function(){return s.MathBackendCPU})),n.d(t,"version_cpu",(function(){return s.version_cpu})),n.d(t,"shared",(function(){return s.shared}));n(/*! ./register_all_kernels */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/register_all_kernels.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Abs.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Abs.js ***! + \***********************************************************************/ +/*! exports provided: simpleAbsImpl, abs, absConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"simpleAbsImpl",(function(){return r})),n.d(t,"abs",(function(){return i})),n.d(t,"absConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const t=new Float32Array(e.length);for(let n=0;n{const{x:t}=e.inputs,n=e.backend;Object(o.assertNotComplex)(t,"abs");let i=new Float32Array(s.util.sizeFromShape(t.shape));return i=r(n.data.get(t.dataId).values),n.makeOutput(i,t.shape,"float32")},a={kernelName:s.Abs,backendName:"cpu",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Acos.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Acos.js ***! + \************************************************************************/ +/*! exports provided: acos, acosConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"acos",(function(){return r})),n.d(t,"acosConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)(s.Acos,(e=>Math.acos(e))),i={kernelName:s.Acos,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Acosh.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Acosh.js ***! + \*************************************************************************/ +/*! exports provided: acosh, acoshConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"acosh",(function(){return r})),n.d(t,"acoshConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)(s.Acosh,(e=>Math.acosh(e))),i={kernelName:s.Acosh,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Add.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Add.js ***! + \***********************************************************************/ +/*! exports provided: addImpl, addComplexImpl, add, addConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"addImpl",(function(){return i})),n.d(t,"addComplexImpl",(function(){return a})),n.d(t,"add",(function(){return u})),n.d(t,"addConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/binary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js"),r=n(/*! ../utils/binary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i=Object(o.createSimpleBinaryKernelImpl)(((e,t)=>e+t)),a=Object(r.createComplexBinaryKernelImpl)(((e,t,n,s)=>({real:e+n,imag:t+s}))),u=Object(r.binaryKernelFunc)(s.Add,i,a),d={kernelName:s.Add,backendName:"cpu",kernelFunc:u}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AddN.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AddN.js ***! + \************************************************************************/ +/*! exports provided: addN, addNConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"addN",(function(){return r})),n.d(t,"addNConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n}=e,r=t;Object(o.assertNotComplex)(t,"addN");const i=r.map((e=>n.data.get(e.dataId).values)),a=Object(s.buffer)(r[0].shape,r[0].dtype),u=a.values;for(let e=0;en&&(n=o,s=e)}b[e]=s}return f.forEach((e=>n.disposeIntermediateTensorInfo(e))),n.makeTensorInfo(p,"int32",b)}const a={kernelName:s.ArgMax,backendName:"cpu",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ArgMin.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ArgMin.js ***! + \**************************************************************************/ +/*! exports provided: argMin, argMinConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"argMin",(function(){return i})),n.d(t,"argMinConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ./Transpose */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Transpose.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e){const{inputs:t,backend:n,attrs:i}=e,{x:a}=t,{axis:u}=i;Object(o.assertNotComplex)(a,"argMin");let d=s.util.parseAxisParam(u,a.shape);const l=s.backend_util.getAxesPermutation(d,a.shape.length);let c=a;const f=[];null!=l&&(c=Object(r.transpose)({inputs:{x:a},backend:n,attrs:{perm:l}}),f.push(c),d=s.backend_util.getInnerMostAxes(d.length,c.shape.length)),d=[d[0]],s.backend_util.assertAxesAreInnerMostDims("argMin",d,c.shape.length);const[p,m]=s.backend_util.computeOutAndReduceShapes(c.shape,d),h=s.util.sizeFromShape(p),b=s.util.makeZerosTypedArray(h,"int32"),j=s.util.sizeFromShape(m),g=n.data.get(c.dataId).values;for(let e=0;en.disposeIntermediateTensorInfo(e))),n.makeTensorInfo(p,"int32",b)}const a={kernelName:s.ArgMin,backendName:"cpu",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Asin.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Asin.js ***! + \************************************************************************/ +/*! exports provided: asin, asinConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"asin",(function(){return r})),n.d(t,"asinConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)(s.Asin,(e=>Math.asin(e))),i={kernelName:s.Asin,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Asinh.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Asinh.js ***! + \*************************************************************************/ +/*! exports provided: asinh, asinhConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"asinh",(function(){return r})),n.d(t,"asinhConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)(s.Asinh,(e=>Math.asinh(e))),i={kernelName:s.Asinh,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Atan.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Atan.js ***! + \************************************************************************/ +/*! exports provided: atan, atanConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"atan",(function(){return r})),n.d(t,"atanConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)(s.Atan,(e=>Math.atan(e))),i={kernelName:s.Atan,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Atan2.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Atan2.js ***! + \*************************************************************************/ +/*! exports provided: atan2Impl, atan2, atan2Config */function(e,t,n){"use strict";n.r(t),n.d(t,"atan2Impl",(function(){return i})),n.d(t,"atan2",(function(){return a})),n.d(t,"atan2Config",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/binary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js"),r=n(/*! ../utils/binary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i=Object(o.createSimpleBinaryKernelImpl)(((e,t)=>Math.atan2(e,t))),a=Object(r.binaryKernelFunc)(s.Atan2,i),u={kernelName:s.Atan2,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Atanh.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Atanh.js ***! + \*************************************************************************/ +/*! exports provided: atanh, atanhConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"atanh",(function(){return r})),n.d(t,"atanhConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)(s.Atanh,(e=>Math.atanh(e))),i={kernelName:s.Atanh,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AvgPool.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AvgPool.js ***! + \***************************************************************************/ +/*! exports provided: avgPool, avgPoolConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"avgPool",(function(){return a})),n.d(t,"avgPoolConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ../utils/pool_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/pool_utils.js"),i=n(/*! ./Identity */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Identity.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:u}=t;Object(o.assertNotComplex)(u,"avgPool");const{filterSize:d,strides:l,pad:c,dimRoundingMode:f}=a;s.util.assert(s.backend_util.eitherStridesOrDilationsAreOne(l,1),(()=>`Error in avgPool: Either strides or dilations must be 1. Got strides ${l} and dilations '1'`));const p=s.backend_util.computePool2DInfo(u.shape,d,l,1,c,f);let m;if(1===p.filterWidth&&1===p.filterHeight&&s.util.arraysEqual(p.inShape,p.outShape))m=Object(i.identity)({inputs:{x:u},backend:n});else{const e=n.data.get(u.dataId).values,t=s.util.computeStrides(u.shape),o=Object(r.pool)(e,u.shape,u.dtype,t,p,"avg");m=n.makeTensorInfo(p.outShape,u.dtype,o.values)}return m}const u={kernelName:s.AvgPool,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AvgPool3D.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AvgPool3D.js ***! + \*****************************************************************************/ +/*! exports provided: avgPool3D, avgPool3DConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"avgPool3D",(function(){return i})),n.d(t,"avgPool3DConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ../utils/pool_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/pool_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e){const{inputs:t,backend:n,attrs:i}=e,{x:a}=t,{filterSize:u,strides:d,pad:l,dimRoundingMode:c,dataFormat:f}=i;Object(o.assertNotComplex)(a,"avgPool3d");const p=s.backend_util.computePool3DInfo(a.shape,u,d,1,l,c,f),m=n.data.get(a.dataId).values,h=Object(r.pool3d)(m,a.shape,a.dtype,s.util.computeStrides(a.shape),p,"avg");return n.makeTensorInfo(h.shape,"float32",h.values)}const a={kernelName:s.AvgPool3D,backendName:"cpu",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AvgPool3DGrad.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AvgPool3DGrad.js ***! + \*********************************************************************************/ +/*! exports provided: avgPool3DGrad, avgPool3DGradConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"avgPool3DGrad",(function(){return r})),n.d(t,"avgPool3DGradConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:r}=e,{dy:i,input:a}=t,{filterSize:u,strides:d,pad:l,dimRoundingMode:c}=r;Object(o.assertNotComplex)([i,a],"avgPool3DGrad");const f=s.backend_util.computePool3DInfo(a.shape,u,d,1,l,c),p=f.strideDepth,m=f.strideHeight,h=f.strideWidth,b=f.filterDepth,j=f.filterHeight,g=f.filterWidth,w=f.dilationDepth,_=f.dilationHeight,k=f.dilationWidth,v=f.effectiveFilterDepth,x=f.effectiveFilterHeight,y=f.effectiveFilterWidth,O=v-1-f.padInfo.front,I=y-1-f.padInfo.left,C=x-1-f.padInfo.top,S=Object(s.buffer)(a.shape,"float32"),T=1/(b*j*g),N=n.bufferSync(i);for(let e=0;e=f.outDepth||Math.floor(s)!==s))for(let n=0;n=f.outHeight||Math.floor(o)!==o))for(let n=0;n=f.outWidth||Math.floor(r)!==r)continue;u+=N.get(e,s,o,r,t)}}}S.set(u*T,e,n,s,o,t)}return n.makeTensorInfo(S.shape,S.dtype,S.values)}const i={kernelName:s.AvgPool3DGrad,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AvgPoolGrad.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AvgPoolGrad.js ***! + \*******************************************************************************/ +/*! exports provided: avgPoolGrad, avgPoolGradConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"avgPoolGrad",(function(){return r})),n.d(t,"avgPoolGradConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:r}=e,{dy:i,input:a}=t,u=a;Object(o.assertNotComplex)([i,a],"avgPoolGrad");const{filterSize:d,strides:l,pad:c}=r,f=s.backend_util.computePool2DInfo(u.shape,d,l,1,c),p=f.strideHeight,m=f.strideWidth,h=f.filterHeight,b=f.filterWidth,j=f.dilationHeight,g=f.dilationWidth,w=f.effectiveFilterHeight,_=f.effectiveFilterWidth,k=_-1-f.padInfo.left,v=w-1-f.padInfo.top,x=Object(s.buffer)(u.shape,"float32"),y=1/(h*b),O=n.data.get(i.dataId).values,I=Object(s.buffer)(i.shape,"float32",O);for(let e=0;e=f.outHeight||Math.floor(s)!==s))for(let n=0;n<_;n+=g){const o=(r+n)/m;if(o<0||o>=f.outWidth||Math.floor(o)!==o)continue;i+=I.get(e,s,o,t)}}x.set(i*y,e,n,s,t)}return n.makeTensorInfo(x.shape,x.dtype,x.values)}const i={kernelName:s.AvgPoolGrad,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/BatchMatMul.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/BatchMatMul.js ***! + \*******************************************************************************/ +/*! exports provided: batchMatMul, batchMatMulConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"batchMatMul",(function(){return i})),n.d(t,"batchMatMulConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reshape.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e){const{inputs:t,backend:n,attrs:i}=e,{a:a,b:u}=t,{transposeA:d,transposeB:l}=i;Object(o.assertNotComplex)([a,u],"matMul");const c=a.shape.length,f=u.shape.length,p=d?a.shape[c-2]:a.shape[c-1],m=l?u.shape[f-1]:u.shape[f-2],h=d?a.shape[c-1]:a.shape[c-2],b=l?u.shape[f-2]:u.shape[f-1],j=a.shape.slice(0,-2),g=u.shape.slice(0,-2),w=s.util.sizeFromShape(j),_=s.util.sizeFromShape(g),k=w===_||1===w||1===_;s.util.assert(c>=2&&f>=2&&k,(()=>`Error in matMul: the input batch dimensions must either be the same or at least one input batch dimension must be 1. Got input batch dimensions of (${j}) and (${g}).`));const v=(w>_?a.shape.slice(0,-2):u.shape.slice(0,-2)).concat([h,b]);s.util.assert(p===m,(()=>`Error in matMul: inner shapes (${p}) and (${m}) of Tensors with shapes ${a.shape} and ${u.shape} and transposeA=${d} and transposeB=${l} must match.`));const x=d?[w,p,h]:[w,h,p],y=l?[_,b,m]:[_,m,b],O=Object(r.reshape)({inputs:{x:a},backend:n,attrs:{shape:x}}),I=Object(r.reshape)({inputs:{x:u},backend:n,attrs:{shape:y}}),C=d?O.shape[1]:O.shape[2],S=d?O.shape[2]:O.shape[1],T=l?I.shape[1]:I.shape[2],N=Math.max(w,_),E=n.data.get(O.dataId).values,A=n.data.get(I.dataId).values,R=s.util.computeStrides(O.shape),F=s.util.computeStrides(I.shape),[M,$,D]=d?[R[0],1,R[1]]:[R[0],R[1],1],[P,B,L]=l?[1,F[1],F[0]]:[F[1],1,F[0]],z=S*T,G=Object(s.buffer)([N,S,T],O.dtype),U=G.values,W=n.blockSize;for(let e=0;e"Batch normalization gradient requires mean and variance to have equal ranks.")),s.util.assert(null==u||d.shape.length===u.shape.length,(()=>"Batch normalization gradient requires mean and offset to have equal ranks.")),s.util.assert(null==a||d.shape.length===a.shape.length,(()=>"Batch normalization gradient requires mean and scale to have equal ranks.")),Object(o.assertNotComplex)([i,d,l,a,u],"batchNorm");let{varianceEpsilon:c}=r;null==c&&(c=.001);const f=n.data.get(i.dataId).values,p=n.data.get(d.dataId).values,m=n.data.get(l.dataId).values,h=a?n.data.get(a.dataId).values:new Float32Array([1]),b=u?n.data.get(u.dataId).values:new Float32Array([0]),j=new Float32Array(f.length),g=b.length,w=h.length,_=m.length,k=p.length;let v=0,x=0,y=0,O=0;for(let e=0;e=g&&(v=0),x>=k&&(x=0),y>=w&&(y=0),O>=_&&(O=0);return n.makeTensorInfo(i.shape,i.dtype,j)}const i={kernelName:s.FusedBatchNorm,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/BatchToSpaceND.js": +/*!**********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/BatchToSpaceND.js ***! + \**********************************************************************************/ +/*! exports provided: batchToSpaceND, batchToSpaceNDConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"batchToSpaceND",(function(){return u})),n.d(t,"batchToSpaceNDConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reshape.js"),i=n(/*! ./Slice */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Slice.js"),a=n(/*! ./Transpose */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Transpose.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function u(e){const{inputs:t,backend:n,attrs:u}=e,{x:d}=t,{blockShape:l,crops:c}=u;Object(o.assertNotComplex)([d],"batchToSpaceND");const f=l.reduce(((e,t)=>e*t)),p=s.backend_util.getReshaped(d.shape,l,f),m=s.backend_util.getPermuted(p.length,l.length),h=s.backend_util.getReshapedPermuted(d.shape,l,f),b=s.backend_util.getSliceBeginCoords(c,l.length),j=s.backend_util.getSliceSize(h,c,l.length),g=Object(r.reshape)({inputs:{x:d},backend:n,attrs:{shape:p}}),w=Object(a.transpose)({inputs:{x:g},backend:n,attrs:{perm:m}}),_=Object(r.reshape)({inputs:{x:w},backend:n,attrs:{shape:h}}),k=Object(i.slice)({inputs:{x:_},backend:n,attrs:{begin:b,size:j}});return n.disposeIntermediateTensorInfo(g),n.disposeIntermediateTensorInfo(w),n.disposeIntermediateTensorInfo(_),k}const d={kernelName:s.BatchToSpaceND,backendName:"cpu",kernelFunc:u}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Bincount.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Bincount.js ***! + \****************************************************************************/ +/*! exports provided: bincount, bincountConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"bincount",(function(){return r})),n.d(t,"bincountConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Bincount_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Bincount_impl.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:s}=e,{x:r,weights:i}=t,{size:a}=s,u=n.data.get(r.dataId).values,d=n.data.get(i.dataId).values,l=Object(o.bincountImpl)(u,d,i.dtype,i.shape,a);return n.makeTensorInfo([a],i.dtype,l)}const i={kernelName:s.Bincount,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Bincount_impl.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Bincount_impl.js ***! + \*********************************************************************************/ +/*! exports provided: bincountImpl, bincountReduceImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"bincountImpl",(function(){return o})),n.d(t,"bincountReduceImpl",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */function o(e,t,n,o,r){const i=s.util.sizeFromShape(o),a=s.util.makeZerosTypedArray(r,n);for(let n=0;n=r||(a[s]+=i>0?t[n]:1)}return a}function r(e,t,n,o=!1){const r=e.shape[0],i=e.shape[1],a=Object(s.buffer)([r,n],t.dtype);for(let s=0;s=n||(o?a.set(1,s,i):t.size>0?a.set(a.get(s,i)+t.get(s,r),s,i):a.set(a.get(s,i)+1,s,i))}return a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Cast.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Cast.js ***! + \************************************************************************/ +/*! exports provided: cast, castConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"cast",(function(){return d})),n.d(t,"castConfig",(function(){return l}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/binary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js"),r=n(/*! ../utils/zeros_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/zeros_impl.js"),i=n(/*! ./Complex */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Complex.js"),a=n(/*! ./Identity */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Identity.js"),u=n(/*! ./Real */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Real.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function d(e){const{inputs:t,backend:n,attrs:l}=e,{x:c}=t,{dtype:f}=l;if("complex64"===f){if("complex64"===c.dtype)return Object(a.identity)({inputs:{x:c},backend:n});const e=Object(r.zeros)(n,c.shape,c.dtype),t=d({inputs:{x:c},backend:n,attrs:{dtype:"float32"}}),s=Object(i.complex)({inputs:{real:t,imag:e},backend:n});return n.disposeIntermediateTensorInfo(e),n.disposeIntermediateTensorInfo(t),s}if("complex64"===c.dtype){const e=Object(u.real)({inputs:{input:c},backend:n}),t=d({inputs:{x:e},backend:n,attrs:{dtype:f}});return n.disposeIntermediateTensorInfo(e),t}if(!s.util.hasEncodingLoss(c.dtype,f)){const e=Object(a.identity)({inputs:{x:c},backend:n});return{dataId:e.dataId,shape:e.shape,dtype:f}}if("int32"===f){const e=n.data.get(c.dataId).values,t=Int32Array.from(e);return n.makeTensorInfo(c.shape,"int32",t)}if("bool"===f){const e=n.data.get(c.dataId).values,t=s.util.toTypedArray([0],c.dtype),[r,i]=Object(o.createSimpleBinaryKernelImpl)(((e,t)=>e!==t?1:0))(c.shape,[],e,t,"bool");return n.makeTensorInfo(i,"bool",r)}throw new Error(`Error in Cast: failed to cast ${c.dtype} to ${f}`)}const l={kernelName:s.Cast,backendName:"cpu",kernelFunc:d}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Ceil.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Ceil.js ***! + \************************************************************************/ +/*! exports provided: ceilImpl, ceil, ceilConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"ceilImpl",(function(){return i})),n.d(t,"ceil",(function(){return a})),n.d(t,"ceilConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_impl.js"),r=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i=Object(o.createSimpleUnaryImpl)((e=>Math.ceil(e))),a=Object(r.unaryKernelFuncFromImpl)(s.Ceil,i),u={kernelName:s.Ceil,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Clip.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Clip.js ***! + \************************************************************************/ +/*! exports provided: clip, clipConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"clip",(function(){return r})),n.d(t,"clipConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)(s.ClipByValue,((e,t)=>{const n=t;return e>n.clipValueMax?n.clipValueMax:e{const{x:t}=e.inputs,n=e.backend,o=new Float32Array(s.util.sizeFromShape(t.shape)),r=n.data.get(t.dataId),i=r.complexTensorInfos.real,a=r.complexTensorInfos.imag,u=n.data.get(i.dataId).values,d=n.data.get(a.dataId).values;for(let e=0;ee.shape)),p);if(0===s.util.sizeFromShape(m))return n.makeTensorInfo(m,t[0].dtype,[]);const h=t.filter((e=>s.util.sizeFromShape(e.shape)>0));if(1===h.length)return Object(i.identity)({inputs:{x:h[0]},backend:n});const b=h.map((e=>e.shape));if(s.backend_util.assertParamsConsistent(b,p),"complex64"===h[0].dtype){const e=h.map((e=>Object(u.real)({inputs:{input:e},backend:n}))),t=h.map((e=>Object(a.imag)({inputs:{input:e},backend:n}))),s=l({inputs:e,backend:n,attrs:{axis:p}}),r=l({inputs:t,backend:n,attrs:{axis:p}}),i=Object(o.complex)({inputs:{real:s,imag:r},backend:n});return e.forEach((e=>n.disposeIntermediateTensorInfo(e))),t.forEach((e=>n.disposeIntermediateTensorInfo(e))),n.disposeIntermediateTensorInfo(s),n.disposeIntermediateTensorInfo(r),i}const j=h.map((e=>{const t=[-1,s.util.sizeFromShape(e.shape.slice(p))];return Object(d.reshape)({inputs:{x:e},backend:n,attrs:{shape:t}})})),g=j.map((e=>({vals:n.data.get(e.dataId).values,shape:e.shape})));m=s.backend_util.computeOutShape(j.map((e=>e.shape)),1);const w=1===j[0].shape[0],_=Object(r.concatImpl)(g,m,t[0].dtype,w),k=s.backend_util.computeOutShape(h.map((e=>e.shape)),p),v=n.makeTensorInfo(k,t[0].dtype,_);return j.forEach((e=>n.disposeIntermediateTensorInfo(e))),v}const c={kernelName:s.Concat,backendName:"cpu",kernelFunc:l}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Concat_impl.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Concat_impl.js ***! + \*******************************************************************************/ +/*! exports provided: concatImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"concatImpl",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */function o(e,t,n,o){const r=s.util.getArrayFromDType(n,s.util.sizeFromShape(t));if(o&&"string"!==n){let t=0;e.forEach((e=>{const n=s.util.sizeFromShape(e.shape);r.set(e.vals,t),t+=n}))}else{let o=0;e.forEach((e=>{const i="string"===n?s.backend_util.fromUint8ToStringArray(e.vals):e.vals;let a=0;for(let n=0;n=m.inHeight)continue;const r=e*y[0],i=t+n*I;for(let e=0;e=m.inWidth)continue;const o=i+s*C;let a=r+e*y[1];for(let e=0;e=c.inDepth)continue;const r=e*C[0],i=t+n*I[1];for(let e=0;e=c.inHeight)continue;const o=r+e*C[1],a=i+s*I[2];for(let e=0;e=c.inWidth)continue;const r=o+e*C[2],i=a+t*c.inChannels;let u=r;for(let e=0;eMath.cos(e))),i={kernelName:s.Cos,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Cosh.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Cosh.js ***! + \************************************************************************/ +/*! exports provided: cosh, coshConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"cosh",(function(){return r})),n.d(t,"coshConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)(s.Cosh,(e=>Math.cosh(e))),i={kernelName:s.Cosh,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/CropAndResize.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/CropAndResize.js ***! + \*********************************************************************************/ +/*! exports provided: cropAndResize, cropAndResizeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"cropAndResize",(function(){return o})),n.d(t,"cropAndResizeConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */function o(e){const{inputs:t,backend:n,attrs:o}=e,{image:r,boxes:i,boxInd:a}=t,{cropSize:u,method:d,extrapolationValue:l}=o,[c,f,p,m]=r.shape,h=i.shape[0],[b,j]=u,g=Object(s.buffer)([h,b,j,m],"float32"),w=n.data.get(i.dataId).values,_=n.data.get(a.dataId).values,k=n.data.get(r.dataId).values,v=s.util.computeStrides(r.shape),x=s.util.computeStrides(g.shape);for(let e=0;e=c)continue;const a=b>1?(o-n)*(f-1)/(b-1):0,u=j>1?(r-s)*(p-1)/(j-1):0;for(let t=0;t1?n*(f-1)+t*a:.5*(n+o)*(f-1);if(c<0||c>f-1)for(let n=0;n1?s*(p-1)+d*u:.5*(s+r)*(p-1);if(c<0||c>p-1){for(let n=0;n1?s*(p-1)+n*u:.5*(s+r)*(p-1);if(o<0||o>p-1){for(let s=0;se+j-t-1:(e,t)=>e+t;for(let e=0;e`Only NHWC dataFormat supported on CPU for depthToSpace. Got ${a}`)),s.util.assert(i>1,(()=>`blockSize should be > 1 for depthToSpace, but was: ${i}`));const u=r.shape[0],d=r.shape[1],l=r.shape[2],c=r.shape[3],f=d*i,p=l*i,m=c/(i*i),h=n.data.get(r.dataId).values,b=new Float32Array(u*f*p*m);let j=0;for(let e=0;e`Error in depthwiseConv2d: Either strides or dilations must be 1. Got strides ${u} and dilations '${m}'`));const h=s.backend_util.computeConv2DInfo(i.shape,a.shape,u,m,d,c,!0),{filterHeight:b,filterWidth:j,dilationHeight:g,dilationWidth:w,padInfo:_}=h,k=_.left,v=_.top,x=h.outChannels/h.inChannels,y=new s.TensorBuffer(h.outShape,i.dtype),O=n.data.get(i.dataId).values,I=n.data.get(a.dataId).values,C=y.values;for(let e=0;e=h.inHeight)continue;const r=e*p[0],i=t+n*f[1];for(let e=0;e=h.inWidth)continue;const o=r+e*p[1],a=i+s*h.inChannels;let u=t,d=o;for(let e=0;e{const{x:o,filter:r}=e,{strides:i,pad:a,dilations:u}=n,d=t,l=d.data.get(o.dataId).values,c=o.shape.length,f=d.data.get(r.dataId).values,p=r.shape.length,{batchSize:m,inHeight:h,inWidth:b,inChannels:j,outHeight:g,outWidth:w,padInfo:_,strideHeight:k,strideWidth:v,filterHeight:x,filterWidth:y,dilationHeight:O,dilationWidth:I,outShape:C}=s.backend_util.computeDilation2DInfo(o.shape,r.shape,i,a,"NHWC",u),S=s.util.sizeFromShape(C),T=C.length,N=s.util.getArrayFromDType(o.dtype,S);for(let e=0;e=0&&i=0&&md&&(d=b)}}}N[s.util.locToIndex([e,t,i,u],T,s.util.computeStrides(C))]=d}}}return{dataId:d.write(s.util.toTypedArray(N,o.dtype),C,o.dtype),shape:C,dtype:o.dtype}}}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Dilation2DBackpropFilter.js": +/*!********************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Dilation2DBackpropFilter.js ***! + \********************************************************************************************/ +/*! exports provided: dilation2dBackpropFilterConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"dilation2dBackpropFilterConfig",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */const o={kernelName:s.Dilation2DBackpropFilter,backendName:"cpu",kernelFunc:({inputs:e,backend:t,attrs:n})=>{const{x:o,filter:r,dy:i}=e,{strides:a,pad:u,dilations:d}=n,l=t,c=s.util.toNestedArray(o.shape,l.data.get(o.dataId).values),f=s.util.toNestedArray(r.shape,l.data.get(r.dataId).values),{batchSize:p,inHeight:m,inWidth:h,inChannels:b,outHeight:j,outWidth:g,padInfo:w,strideHeight:_,strideWidth:k,filterHeight:v,filterWidth:x,dilationHeight:y,dilationWidth:O,outShape:I}=s.backend_util.computeDilation2DInfo(o.shape,r.shape,a,u,"NHWC",d);s.util.assert(i.rank===I.length,(()=>`Error in ${s.Dilation2DBackpropFilter}, dy must have the same rank as output ${I.length}, but got ${i.rank}`));const C=s.util.toNestedArray(I,l.data.get(i.dataId).values),S=s.util.makeZerosNestedTypedArray(r.shape,r.dtype);for(let e=0;e=0&&s=0&&di&&(i=o,a=t,u=n)}}}S[a][u][r]+=C[e][t][s][r]}}}return{dataId:l.write(s.util.toTypedArray(S,o.dtype),r.shape,r.dtype),shape:r.shape,dtype:r.dtype}}}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Dilation2DBackpropInput.js": +/*!*******************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Dilation2DBackpropInput.js ***! + \*******************************************************************************************/ +/*! exports provided: dilation2dBackpropInputConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"dilation2dBackpropInputConfig",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */const o={kernelName:s.Dilation2DBackpropInput,backendName:"cpu",kernelFunc:({inputs:e,backend:t,attrs:n})=>{const{x:o,filter:r,dy:i}=e,{strides:a,pad:u,dilations:d}=n,l=t,c=s.util.toNestedArray(o.shape,l.data.get(o.dataId).values),f=s.util.toNestedArray(r.shape,l.data.get(r.dataId).values),{batchSize:p,inHeight:m,inWidth:h,inChannels:b,outHeight:j,outWidth:g,padInfo:w,strideHeight:_,strideWidth:k,filterHeight:v,filterWidth:x,dilationHeight:y,dilationWidth:O,outShape:I}=s.backend_util.computeDilation2DInfo(o.shape,r.shape,a,u,"NHWC",d);s.util.assert(i.rank===I.length,(()=>`Error in ${s.Dilation2DBackpropInput}, dy must have the same rank as output ${I.length}, but got ${i.rank}`));const C=s.util.toNestedArray(I,l.data.get(i.dataId).values),S=s.util.makeZerosNestedTypedArray(o.shape,o.dtype);for(let e=0;e=0&&s=0&&di&&(i=o,a=s,u=d)}}}S[e][a][u][r]+=C[e][t][s][r]}}}return{dataId:l.write(s.util.toTypedArray(S,o.dtype),o.shape,o.dtype),shape:o.shape,dtype:o.dtype}}}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Einsum.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Einsum.js ***! + \**************************************************************************/ +/*! exports provided: einsum, einsumConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"einsum",(function(){return u})),n.d(t,"einsumConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Multiply */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Multiply.js"),r=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reshape.js"),i=n(/*! ./Sum */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sum.js"),a=n(/*! ./Transpose */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Transpose.js"); +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function u(e){const{inputs:t,backend:n,attrs:u}=e,{equation:d}=u,l=t,{allDims:c,summedDims:f,idDims:p}=s.backend_util.decodeEinsumEquation(d,l.length);s.backend_util.checkEinsumDimSizes(c.length,p,l);const{path:m,steps:h}=s.backend_util.getEinsumComputePath(f,p),b=h.length;let j=null,g=c.length;const w=[];for(let e=0;e=0&&(j=Object(i.sum)({inputs:{x:j},backend:n,attrs:{axis:m[e]-(c.length-g),keepDims:!1}}),w.push(j)),g--)}for(const e of w)e!==j&&n.disposeIntermediateTensorInfo(e);return j}const d={kernelName:s.Einsum,backendName:"cpu",kernelFunc:u}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Elu.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Elu.js ***! + \***********************************************************************/ +/*! exports provided: elu, eluConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"elu",(function(){return r})),n.d(t,"eluConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)(s.Elu,(e=>e>=0?e:Math.exp(e)-1)),i={kernelName:s.Elu,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/EluGrad.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/EluGrad.js ***! + \***************************************************************************/ +/*! exports provided: eluGrad, eluGradConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"eluGrad",(function(){return r})),n.d(t,"eluGradConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n}=e,{dy:r,y:i}=t;Object(o.assertNotComplex)([r,i],"eluGrad");const a=new Float32Array(s.util.sizeFromShape(i.shape)),u=n.data.get(i.dataId).values,d=n.data.get(r.dataId).values;for(let e=0;e=1?d[e]:d[e]*(t+1)}return n.makeTensorInfo(i.shape,"float32",a)}const i={kernelName:s.EluGrad,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Equal.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Equal.js ***! + \*************************************************************************/ +/*! exports provided: equalImpl, equal, equalConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"equalImpl",(function(){return i})),n.d(t,"equal",(function(){return a})),n.d(t,"equalConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/binary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js"),r=n(/*! ../utils/binary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i=Object(o.createSimpleBinaryKernelImpl)(((e,t)=>e===t?1:0)),a=Object(r.binaryKernelFunc)(s.Equal,i,null,"bool"),u={kernelName:s.Equal,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Erf.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Erf.js ***! + \***********************************************************************/ +/*! exports provided: erf, erfConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"erf",(function(){return c})),n.d(t,"erfConfig",(function(){return f}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=s.backend_util.ERF_P,i=s.backend_util.ERF_A1,a=s.backend_util.ERF_A2,u=s.backend_util.ERF_A3,d=s.backend_util.ERF_A4,l=s.backend_util.ERF_A5,c=Object(o.unaryKernelFunc)(s.Erf,(e=>{const t=Math.sign(e),n=Math.abs(e),s=1/(1+r*n);return t*(1-((((l*s+d)*s+u)*s+a)*s+i)*s*Math.exp(-n*n))})),f={kernelName:s.Erf,backendName:"cpu",kernelFunc:c}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Exp.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Exp.js ***! + \***********************************************************************/ +/*! exports provided: expImpl, exp, expConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"expImpl",(function(){return i})),n.d(t,"exp",(function(){return a})),n.d(t,"expConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_impl.js"),r=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i=Object(o.createSimpleUnaryImpl)((e=>Math.exp(e))),a=Object(r.unaryKernelFuncFromImpl)(s.Exp,i),u={kernelName:s.Exp,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ExpandDims.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ExpandDims.js ***! + \******************************************************************************/ +/*! exports provided: expandDims, expandDimsConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"expandDims",(function(){return r})),n.d(t,"expandDimsConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reshape.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:r}=e,{input:i}=t,{dim:a}=r,u=i.shape.length,d=i.shape.slice();let l=a;return a<0&&(s.util.assert(-(u+1)<=a,(()=>`Axis must be in the interval [${-(u+1)}, ${u}]`)),l=u+a+1),d.splice(l,0,1),Object(o.reshape)({inputs:{x:i},backend:n,attrs:{shape:d}})}const i={kernelName:s.ExpandDims,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Expm1.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Expm1.js ***! + \*************************************************************************/ +/*! exports provided: expm1Impl, expm1, expm1Config */function(e,t,n){"use strict";n.r(t),n.d(t,"expm1Impl",(function(){return i})),n.d(t,"expm1",(function(){return a})),n.d(t,"expm1Config",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_impl.js"),r=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i=Object(o.createSimpleUnaryImpl)((e=>Math.expm1(e))),a=Object(r.unaryKernelFuncFromImpl)(s.Expm1,i),u={kernelName:s.Expm1,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FFT.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FFT.js ***! + \***********************************************************************/ +/*! exports provided: fft, fftConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"fft",(function(){return i})),n.d(t,"fftConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/fft_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/fft_utils.js"),r=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reshape.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e){const{inputs:t,backend:n}=e,{input:i}=t,a=s.util.sizeFromShape(i.shape),u=i.shape[i.shape.length-1],d=a/u,l=Object(r.reshape)({inputs:{x:i},backend:n,attrs:{shape:[d,u]}}),c=Object(o.fftBatch)(l,!1,n),f=Object(r.reshape)({inputs:{x:c},backend:n,attrs:{shape:i.shape}});return n.disposeIntermediateTensorInfo(l),n.disposeIntermediateTensorInfo(c),f}const a={kernelName:s.FFT,backendName:"cpu",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Fill.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Fill.js ***! + \************************************************************************/ +/*! exports provided: fill, fillConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"fill",(function(){return o})),n.d(t,"fillConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */function o(e){const{backend:t,attrs:n}=e,{shape:o,value:r,dtype:i}=n,a=i||s.util.inferDtype(r),u=s.util.getArrayFromDType(a,s.util.sizeFromShape(o));return function(e,t,n){e.fill(t)}(u,r),t.makeTensorInfo(o,a,u)}const r={kernelName:s.Fill,backendName:"cpu",kernelFunc:o}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FlipLeftRight.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FlipLeftRight.js ***! + \*********************************************************************************/ +/*! exports provided: flipLeftRightConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"flipLeftRightConfig",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */const o={kernelName:s.FlipLeftRight,backendName:"cpu",kernelFunc:({inputs:e,attrs:t,backend:n})=>{const{image:o}=e,r=n,i=s.util.getTypedArrayFromDType(o.dtype,s.util.sizeFromShape(o.shape)),[a,u,d,l]=o.shape,c=r.data.get(o.dataId).values;for(let e=0;e=0&&rMath.floor(e))),a=Object(r.unaryKernelFuncFromImpl)(s.Floor,i),u={kernelName:s.Floor,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FloorDiv.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FloorDiv.js ***! + \****************************************************************************/ +/*! exports provided: floorDivImpl, floorDiv, floorDivConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"floorDivImpl",(function(){return i})),n.d(t,"floorDiv",(function(){return a})),n.d(t,"floorDivConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/binary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js"),r=n(/*! ../utils/binary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i=Object(o.createSimpleBinaryKernelImpl)(((e,t)=>Math.floor(e/t))),a=Object(r.binaryKernelFunc)(s.FloorDiv,i,null,"int32"),u={kernelName:s.FloorDiv,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FusedConv2D.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FusedConv2D.js ***! + \*******************************************************************************/ +/*! exports provided: fusedConv2D, fusedConv2DConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"fusedConv2D",(function(){return a})),n.d(t,"fusedConv2DConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/fused_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/fused_utils.js"),r=n(/*! ./Add */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Add.js"),i=n(/*! ./Conv2D */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Conv2D.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function a(e){const{inputs:t,backend:n,attrs:s}=e,{x:a,filter:u,bias:d,preluActivationWeights:l}=t,{strides:c,pad:f,dataFormat:p,dilations:m,dimRoundingMode:h,activation:b,leakyreluAlpha:j}=s;let g=Object(i.conv2D)({inputs:{x:a,filter:u},backend:n,attrs:{strides:c,pad:f,dataFormat:p,dilations:m,dimRoundingMode:h}});if(d){const e=g;g=Object(r.add)({inputs:{a:g,b:d},backend:n}),n.disposeIntermediateTensorInfo(e)}if(b){const e=g;g=Object(o.applyActivation)(n,g,b,l,j),n.disposeIntermediateTensorInfo(e)}return g}const u={kernelName:s.FusedConv2D,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FusedDepthwiseConv2D.js": +/*!****************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FusedDepthwiseConv2D.js ***! + \****************************************************************************************/ +/*! exports provided: fusedDepthwiseConv2D, fusedDepthwiseConv2DConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"fusedDepthwiseConv2D",(function(){return a})),n.d(t,"fusedDepthwiseConv2DConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/fused_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/fused_utils.js"),r=n(/*! ./Add */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Add.js"),i=n(/*! ./DepthwiseConv2dNative */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/DepthwiseConv2dNative.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function a(e){const{inputs:t,backend:n,attrs:s}=e,{x:a,filter:u,bias:d,preluActivationWeights:l}=t,{strides:c,pad:f,dataFormat:p,dilations:m,dimRoundingMode:h,activation:b,leakyreluAlpha:j}=s;let g=Object(i.depthwiseConv2dNative)({inputs:{x:a,filter:u},backend:n,attrs:{strides:c,pad:f,dataFormat:p,dilations:m,dimRoundingMode:h}});if(d){const e=g;g=Object(r.add)({inputs:{a:g,b:d},backend:n}),n.disposeIntermediateTensorInfo(e)}if(b){const e=g;g=Object(o.applyActivation)(n,g,b,l,j),n.disposeIntermediateTensorInfo(e)}return g}const u={kernelName:s.FusedDepthwiseConv2D,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/GatherNd.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/GatherNd.js ***! + \****************************************************************************/ +/*! exports provided: gatherNd, gatherNdConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"gatherNd",(function(){return r})),n.d(t,"gatherNdConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./GatherNd_Impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/GatherNd_Impl.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n}=e,{params:r,indices:i}=t,a=s.util.sizeFromShape(r.shape),u=i.shape,d=u[u.length-1],[l,c,f,p]=s.backend_util.prepareAndValidate(r,i);if(0===c)return n.makeTensorInfo(l,r.dtype,[]);const m=n.data.get(i.dataId).values,h=n.bufferSync(r),b=Object(o.gatherNdImpl)(m,h,r.dtype,c,d,f,p,r.shape,a);return n.makeTensorInfo(l,r.dtype,b.values)}const i={kernelName:s.GatherNd,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/GatherNd_Impl.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/GatherNd_Impl.js ***! + \*********************************************************************************/ +/*! exports provided: gatherNdImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"gatherNdImpl",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */function o(e,t,n,o,r,i,a,u,d){const l=Object(s.buffer)([o,i],n);for(let n=0;n=d/i)throw new Error(`Invalid indices: ${s} does not index into ${u}`);for(let e=0;ee>t?1:0)),a=Object(r.binaryKernelFunc)(s.Greater,i,null,"bool"),u={kernelName:s.Greater,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/GreaterEqual.js": +/*!********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/GreaterEqual.js ***! + \********************************************************************************/ +/*! exports provided: greaterEqualImpl, greaterEqual, greaterEqualConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"greaterEqualImpl",(function(){return i})),n.d(t,"greaterEqual",(function(){return a})),n.d(t,"greaterEqualConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/binary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js"),r=n(/*! ../utils/binary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i=Object(o.createSimpleBinaryKernelImpl)(((e,t)=>e>=t?1:0)),a=Object(r.binaryKernelFunc)(s.GreaterEqual,i,null,"bool"),u={kernelName:s.GreaterEqual,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/IFFT.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/IFFT.js ***! + \************************************************************************/ +/*! exports provided: ifft, ifftConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"ifft",(function(){return i})),n.d(t,"ifftConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/fft_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/fft_utils.js"),r=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reshape.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e){const{inputs:t,backend:n}=e,{input:i}=t,a=s.util.sizeFromShape(i.shape),u=i.shape[i.shape.length-1],d=a/u,l=Object(r.reshape)({inputs:{x:i},backend:n,attrs:{shape:[d,u]}}),c=Object(o.fftBatch)(l,!0,n),f=Object(r.reshape)({inputs:{x:c},backend:n,attrs:{shape:i.shape}});return n.disposeIntermediateTensorInfo(l),n.disposeIntermediateTensorInfo(c),f}const a={kernelName:s.IFFT,backendName:"cpu",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Identity.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Identity.js ***! + \****************************************************************************/ +/*! exports provided: identity, identityConfig */function(e,t,n){"use strict"; +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function s(e){const{inputs:t,backend:n}=e,{x:s}=t;return n.incRef(s.dataId),{dataId:s.dataId,shape:s.shape,dtype:s.dtype}}n.r(t),n.d(t,"identity",(function(){return s})),n.d(t,"identityConfig",(function(){return o}));const o={kernelName:n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js").Identity,backendName:"cpu",kernelFunc:s}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Imag.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Imag.js ***! + \************************************************************************/ +/*! exports provided: imag, imagConfig */function(e,t,n){"use strict"; +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function s(e){const{inputs:t,backend:n}=e,{input:s}=t,o=n.data.get(s.dataId).complexTensorInfos.imag,r=n.data.get(o.dataId).values;return n.makeTensorInfo(o.shape,o.dtype,r)}n.r(t),n.d(t,"imag",(function(){return s})),n.d(t,"imagConfig",(function(){return o}));const o={kernelName:n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js").Imag,backendName:"cpu",kernelFunc:s}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/IsFinite.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/IsFinite.js ***! + \****************************************************************************/ +/*! exports provided: isFinite, isFiniteConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"isFinite",(function(){return r})),n.d(t,"isFiniteConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)(s.IsFinite,(e=>Number.isFinite(e)?1:0),"bool"),i={kernelName:s.IsFinite,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/IsInf.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/IsInf.js ***! + \*************************************************************************/ +/*! exports provided: isInf, isInfConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"isInf",(function(){return r})),n.d(t,"isInfConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)(s.IsInf,(e=>Math.abs(e)===1/0?1:0),"bool"),i={kernelName:s.IsInf,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/IsNaN.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/IsNaN.js ***! + \*************************************************************************/ +/*! exports provided: isNaN, isNaNConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"isNaN",(function(){return r})),n.d(t,"isNaNConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)(s.IsNan,(e=>Number.isNaN(e)?1:0),"bool"),i={kernelName:s.IsNan,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LRN.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LRN.js ***! + \***********************************************************************/ +/*! exports provided: lRN, lRNConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"lRN",(function(){return r})),n.d(t,"lRNConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:r}=e,{x:i}=t,{depthRadius:a,bias:u,alpha:d,beta:l}=r;Object(o.assertNotComplex)(i,"LRN");const c=i.shape[3],f=c-1,p=n.data.get(i.dataId).values,m=s.util.sizeFromShape(i.shape),h=new Float32Array(m);function b(e){const t=e%c;let n=e-t+Math.max(0,t-a);const s=e-t+Math.min(t+a,f);let o=0;for(;n<=s;n++){const e=p[n];o+=e*e}return o}for(let e=0;eee<=t?1:0)),a=Object(r.binaryKernelFunc)(s.LessEqual,i,null,"bool"),u={kernelName:s.LessEqual,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LinSpace.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LinSpace.js ***! + \****************************************************************************/ +/*! exports provided: linSpace, linSpaceConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"linSpace",(function(){return r})),n.d(t,"linSpaceConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./LinSpace_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LinSpace_impl.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{backend:t,attrs:n}=e,{start:s,stop:r,num:i}=n,a=Object(o.linSpaceImpl)(s,r,i);return t.makeTensorInfo([a.length],"float32",a)}const i={kernelName:s.LinSpace,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LinSpace_impl.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LinSpace_impl.js ***! + \*********************************************************************************/ +/*! exports provided: linSpaceImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"linSpaceImpl",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */function o(e,t,n){const o=(t-e)/(n-1),r=s.util.makeZerosTypedArray(n,"float32");r[0]=e;for(let e=1;eMath.log(e))),a=Object(r.unaryKernelFuncFromImpl)(s.Log,i),u={kernelName:s.Log,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Log1p.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Log1p.js ***! + \*************************************************************************/ +/*! exports provided: log1p, log1pConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"log1p",(function(){return r})),n.d(t,"log1pConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)(s.Log1p,(e=>Math.log1p(e))),i={kernelName:s.Log1p,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LogicalAnd.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LogicalAnd.js ***! + \******************************************************************************/ +/*! exports provided: logicalAndImpl, logicalAnd, logicalAndConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"logicalAndImpl",(function(){return i})),n.d(t,"logicalAnd",(function(){return a})),n.d(t,"logicalAndConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/binary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js"),r=n(/*! ../utils/binary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i=Object(o.createSimpleBinaryKernelImpl)(((e,t)=>e&&t)),a=Object(r.binaryKernelFunc)(s.LogicalAnd,i,null,"bool"),u={kernelName:s.LogicalAnd,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LogicalNot.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LogicalNot.js ***! + \******************************************************************************/ +/*! exports provided: logicalNot, logicalNotConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"logicalNot",(function(){return r})),n.d(t,"logicalNotConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)(s.LogicalNot,(e=>e?0:1),"bool"),i={kernelName:s.LogicalNot,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LogicalOr.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LogicalOr.js ***! + \*****************************************************************************/ +/*! exports provided: logicalOrImpl, logicalOr, logicalOrConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"logicalOrImpl",(function(){return i})),n.d(t,"logicalOr",(function(){return a})),n.d(t,"logicalOrConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/binary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js"),r=n(/*! ../utils/binary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i=Object(o.createSimpleBinaryKernelImpl)(((e,t)=>e||t)),a=Object(r.binaryKernelFunc)(s.LogicalOr,i,null,"bool"),u={kernelName:s.LogicalOr,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Max.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Max.js ***! + \***********************************************************************/ +/*! exports provided: max, maxConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"max",(function(){return a})),n.d(t,"maxConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ./Max_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Max_impl.js"),i=n(/*! ./Transpose_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Transpose_impl.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:u}=t,{reductionIndices:d,keepDims:l}=a,c=n;let f=u.shape;const p=f.length,m=s.util.parseAxisParam(d,f);let h=m;const b=s.backend_util.getAxesPermutation(h,p);let j=c.data.get(u.dataId).values;if(null!=b){const e=new Array(p);for(let t=0;t`Error in maxPool: Either strides or dilations must be 1. Got strides ${l} and dilations '1'`));const p=s.backend_util.computePool2DInfo(u.shape,d,l,1,c,f);let m;if(1===p.filterWidth&&1===p.filterHeight&&s.util.arraysEqual(p.inShape,p.outShape))m=Object(i.identity)({inputs:{x:u},backend:n});else{const e=n.data.get(u.dataId).values,t=s.util.computeStrides(u.shape),o=Object(r.pool)(e,u.shape,u.dtype,t,p,"max");m=n.makeTensorInfo(p.outShape,u.dtype,o.values)}return m}const u={kernelName:s.MaxPool,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPool3D.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPool3D.js ***! + \*****************************************************************************/ +/*! exports provided: maxPool3D, maxPool3DConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"maxPool3D",(function(){return i})),n.d(t,"maxPool3DConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ../utils/pool_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/pool_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e){const{inputs:t,backend:n,attrs:i}=e,{x:a}=t,{filterSize:u,strides:d,pad:l,dimRoundingMode:c,dataFormat:f}=i;Object(o.assertNotComplex)(a,"maxPool3d");const p=s.backend_util.computePool3DInfo(a.shape,u,d,1,l,c,f),m=n.data.get(a.dataId).values,h=Object(r.pool3d)(m,a.shape,a.dtype,s.util.computeStrides(a.shape),p,"max");return n.makeTensorInfo(h.shape,"float32",h.values)}const a={kernelName:s.MaxPool3D,backendName:"cpu",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPool3DGrad.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPool3DGrad.js ***! + \*********************************************************************************/ +/*! exports provided: maxPool3DGrad, maxPool3DGradConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"maxPool3DGrad",(function(){return i})),n.d(t,"maxPool3DGradConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ../utils/pool_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/pool_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e){const{inputs:t,backend:n,attrs:i}=e,{dy:a,input:u}=t,{filterSize:d,strides:l,pad:c,dimRoundingMode:f}=i;Object(o.assertNotComplex)([a,u],"maxPool3DGrad");const p=s.backend_util.computePool3DInfo(u.shape,d,l,1,c,f),m=n.bufferSync(u),h=Object(r.maxPool3dPositions)(m,p),b=p.strideDepth,j=p.strideHeight,g=p.strideWidth,w=p.dilationDepth,_=p.dilationHeight,k=p.dilationWidth,v=p.effectiveFilterDepth,x=p.effectiveFilterHeight,y=p.effectiveFilterWidth,O=v-1-p.padInfo.front,I=y-1-p.padInfo.left,C=x-1-p.padInfo.top,S=Object(s.buffer)(u.shape,"float32"),T=n.bufferSync(a);for(let e=0;e=p.outDepth||Math.floor(s)!==s))for(let o=0;o=p.outHeight||Math.floor(r)!==r))for(let i=0;i=p.outWidth||Math.floor(d)!==d)continue;const l=v*x*y-1-h.get(e,s,r,d,t)===n*x*y+o*y+i?1:0;if(0===l)continue;u+=T.get(e,s,r,d,t)*l}}}S.set(u,e,n,s,o,t)}return n.makeTensorInfo(S.shape,S.dtype,S.values)}const a={kernelName:s.MaxPool3DGrad,backendName:"cpu",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPoolGrad.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPoolGrad.js ***! + \*******************************************************************************/ +/*! exports provided: maxPoolGrad, maxPoolGradConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"maxPoolGrad",(function(){return i})),n.d(t,"maxPoolGradConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ../utils/pool_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/pool_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e){const{inputs:t,backend:n,attrs:i}=e,{dy:a,input:u,output:d}=t,l=u;Object(o.assertNotComplex)([u,d],"maxPoolGrad");const{filterSize:c,strides:f,pad:p,dimRoundingMode:m}=i,h=s.backend_util.computePool2DInfo(l.shape,c,f,1,p,m),b=n.data.get(l.dataId).values,j=Object(s.buffer)(h.outShape,l.dtype,Object(r.maxPoolPositions)(b,l.shape,l.dtype,h).values),g=h.strideHeight,w=h.strideWidth,_=h.dilationHeight,k=h.dilationWidth,v=h.effectiveFilterHeight,x=h.effectiveFilterWidth,y=x-1-h.padInfo.left,O=v-1-h.padInfo.top,I=Object(s.buffer)(l.shape,"float32"),C=n.data.get(a.dataId).values,S=Object(s.buffer)(a.shape,"float32",C);for(let e=0;e=h.outHeight||Math.floor(s)!==s))for(let o=0;o=h.outWidth||Math.floor(a)!==a)continue;const u=v*x-1-j.get(e,s,a,t)===n*x+o?1:0;if(0===u)continue;i+=S.get(e,s,a,t)*u}}I.set(i,e,n,s,t)}return n.makeTensorInfo(I.shape,I.dtype,I.values)}const a={kernelName:s.MaxPoolGrad,backendName:"cpu",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPoolWithArgmax.js": +/*!*************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPoolWithArgmax.js ***! + \*************************************************************************************/ +/*! exports provided: maxPoolWithArgmaxConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"maxPoolWithArgmaxConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ./MaxPoolWithArgmax_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPoolWithArgmax_impl.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i={kernelName:s.MaxPoolWithArgmax,backendName:"cpu",kernelFunc:({inputs:e,attrs:t,backend:n})=>{const{x:i}=e,{filterSize:a,strides:u,pad:d,includeBatchInIndex:l}=t,c=n;Object(o.assertNotComplex)(i,"MaxPoolWithArgmax");const f=c.data.get(i.dataId).values,p=s.backend_util.computePool2DInfo(i.shape,a,u,[1,1],d),[m,h]=Object(r.maxPoolWithArgmaxImpl)(f,i.shape,i.dtype,l,p),b=c.write(m,p.outShape,i.dtype),j=c.write(h,p.outShape,i.dtype);return[{dataId:b,shape:p.outShape,dtype:i.dtype},{dataId:j,shape:p.outShape,dtype:"int32"}]}}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPoolWithArgmax_impl.js": +/*!******************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPoolWithArgmax_impl.js ***! + \******************************************************************************************/ +/*! exports provided: maxPoolWithArgmaxImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"maxPoolWithArgmaxImpl",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/pool_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/pool_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e,t,n,r,i){const a=s.util.computeStrides(t),u=Object(o.pool)(e,t,n,a,i,"max"),d=Object(o.maxPoolPositions)(e,t,n,i,!0,r);return[u.values,d.values]}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Max_impl.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Max_impl.js ***! + \****************************************************************************/ +/*! exports provided: maxImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"maxImpl",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */function o(e,t,n,o){const r=s.util.getTypedArrayFromDType(o,s.util.sizeFromShape(n));for(let n=0;no)&&(o=t)}r[n]=o}return r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Maximum.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Maximum.js ***! + \***************************************************************************/ +/*! exports provided: maximumImpl, maximum, maximumConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"maximumImpl",(function(){return i})),n.d(t,"maximum",(function(){return a})),n.d(t,"maximumConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/binary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js"),r=n(/*! ../utils/binary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i=Object(o.createSimpleBinaryKernelImpl)(((e,t)=>Math.max(e,t))),a=Object(r.binaryKernelFunc)(s.Maximum,i),u={kernelName:s.Maximum,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Mean.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Mean.js ***! + \************************************************************************/ +/*! exports provided: mean, meanConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"mean",(function(){return a})),n.d(t,"meanConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Cast */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Cast.js"),r=n(/*! ./RealDiv */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/RealDiv.js"),i=n(/*! ./Sum */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sum.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:u}=t,{axis:d,keepDims:l}=a,c=s.util.parseAxisParam(d,u.shape),f=s.backend_util.computeOutAndReduceShapes(u.shape,c)[1],p=s.util.sizeFromShape(f),m=[],h=n.makeTensorInfo([],"float32",new Float32Array([p]));m.push(h);const b=Object(o.cast)({inputs:{x:u},backend:n,attrs:{dtype:"float32"}});m.push(b);const j=Object(r.div)({inputs:{a:b,b:h},backend:n});m.push(j);const g=Object(i.sum)({inputs:{x:j},backend:n,attrs:{axis:d,keepDims:l}});return m.forEach((e=>n.disposeIntermediateTensorInfo(e))),g}const u={kernelName:s.Mean,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Min.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Min.js ***! + \***********************************************************************/ +/*! exports provided: min, minConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"min",(function(){return a})),n.d(t,"minConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reshape.js"),i=n(/*! ./Transpose */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Transpose.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:u}=t,{axis:d,keepDims:l}=a;Object(o.assertNotComplex)(u,"min");const c=s.util.parseAxisParam(d,u.shape);let f=c;const p=s.backend_util.getAxesPermutation(f,u.shape.length);let m=u;null!=p&&(m=Object(i.transpose)({inputs:{x:u},backend:n,attrs:{perm:p}}),f=s.backend_util.getInnerMostAxes(f.length,u.shape.length)),s.backend_util.assertAxesAreInnerMostDims("min",f,m.shape.length);const[h,b]=s.backend_util.computeOutAndReduceShapes(m.shape,f),j=s.util.sizeFromShape(b),g=s.util.makeZerosTypedArray(s.util.sizeFromShape(h),m.dtype),w=n.data.get(m.dataId).values;for(let e=0;eMath.min(e,t))),a=Object(r.binaryKernelFunc)(s.Minimum,i),u={kernelName:s.Minimum,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MirrorPad.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MirrorPad.js ***! + \*****************************************************************************/ +/*! exports provided: mirrorPad, mirrorPadConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"mirrorPad",(function(){return r})),n.d(t,"mirrorPadConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:r}=e,{x:i}=t,{paddings:a,mode:u}=r;Object(o.assertNotComplex)(i,"mirrorPad");const d=a.map(((e,t)=>e[0]+i.shape[t]+e[1])),l=a.map((e=>e[0])),c=a.map(((e,t)=>e[0]+i.shape[t])),f="reflect"===u?0:1,p=n.data.get(i.dataId).values,m=i.shape.length,h=s.util.computeStrides(i.shape),b=s.util.sizeFromShape(d),j=d.length,g=s.util.computeStrides(d),w=s.util.getTypedArrayFromDType(i.dtype,b);for(let e=0;e=c[e]&&(t[e]=2*(c[e]-1)-t[e]+f);t=t.map(((e,t)=>e-l[t]));const n=s.util.locToIndex(t,m,h);w[e]=p[n]}return{dataId:n.write(w,d,i.dtype),shape:d,dtype:i.dtype}}const i={kernelName:s.MirrorPad,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Mod.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Mod.js ***! + \***********************************************************************/ +/*! exports provided: modImpl, mod, modConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"modImpl",(function(){return i})),n.d(t,"mod",(function(){return a})),n.d(t,"modConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/binary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js"),r=n(/*! ../utils/binary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i=Object(o.createSimpleBinaryKernelImpl)(((e,t)=>{const n=e%t;return e<0&&t<0||e>=0&&t>=0?n:(n+t)%t})),a=Object(r.binaryKernelFunc)(s.Mod,i),u={kernelName:s.Mod,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Multinomial.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Multinomial.js ***! + \*******************************************************************************/ +/*! exports provided: multinomial, multinomialConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"multinomial",(function(){return a})),n.d(t,"multinomialConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! seedrandom */"./node_modules/seedrandom/index.js"),r=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),i=n(/*! ./Softmax */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Softmax.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function a(e){const{inputs:t,backend:n,attrs:a}=e,{logits:u}=t,{numSamples:d,seed:l,normalized:c}=a;Object(r.assertNotComplex)(u,"multinomial");const f=c?u:Object(i.softmax)({inputs:{logits:u},backend:n,attrs:{dim:-1}}),p=f.shape[0],m=f.shape[1],h=n.data.get(f.dataId).values,b=[p,d],j=s.util.makeZerosTypedArray(s.util.sizeFromShape(b),"int32");for(let e=0;ee*t)),a=Object(r.createComplexBinaryKernelImpl)(((e,t,n,s)=>({real:e*n-t*s,imag:e*s+t*n}))),u=Object(r.binaryKernelFunc)(s.Multiply,i,a),d={kernelName:s.Multiply,backendName:"cpu",kernelFunc:u}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Neg.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Neg.js ***! + \***********************************************************************/ +/*! exports provided: negImpl, neg, negConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"negImpl",(function(){return i})),n.d(t,"neg",(function(){return a})),n.d(t,"negConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ./Multiply */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Multiply.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e,t,n){const o=s.util.createScalarValue(-1,n);return Object(r.multiplyImpl)([],t,o,e,n)}function a(e){const{inputs:t,backend:n}=e,{x:s}=t;Object(o.assertNotComplex)(s,"neg");const r=n.data.get(s.dataId).values,[a,u]=i(r,s.shape,s.dtype);return n.makeTensorInfo(u,s.dtype,a)}const u={kernelName:s.Neg,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NonMaxSuppressionV3.js": +/*!***************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NonMaxSuppressionV3.js ***! + \***************************************************************************************/ +/*! exports provided: nonMaxSuppressionV3, nonMaxSuppressionV3Config */function(e,t,n){"use strict";n.r(t),n.d(t,"nonMaxSuppressionV3",(function(){return i})),n.d(t,"nonMaxSuppressionV3Config",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=s.kernel_impls.nonMaxSuppressionV3Impl;function i(e){const{inputs:t,backend:n,attrs:s}=e,{boxes:i,scores:a}=t,{maxOutputSize:u,iouThreshold:d,scoreThreshold:l}=s;Object(o.assertNotComplex)(i,"NonMaxSuppression");const c=n.data.get(i.dataId).values,f=n.data.get(a.dataId).values,{selectedIndices:p}=r(c,f,u,d,l);return n.makeTensorInfo([p.length],"int32",new Int32Array(p))}const a={kernelName:s.NonMaxSuppressionV3,backendName:"cpu",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NonMaxSuppressionV4.js": +/*!***************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NonMaxSuppressionV4.js ***! + \***************************************************************************************/ +/*! exports provided: nonMaxSuppressionV4, nonMaxSuppressionV4Config */function(e,t,n){"use strict";n.r(t),n.d(t,"nonMaxSuppressionV4",(function(){return i})),n.d(t,"nonMaxSuppressionV4Config",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=s.kernel_impls.nonMaxSuppressionV4Impl;function i(e){const{inputs:t,backend:n,attrs:s}=e,{boxes:i,scores:a}=t,{maxOutputSize:u,iouThreshold:d,scoreThreshold:l,padToMaxOutputSize:c}=s;Object(o.assertNotComplex)(i,"NonMaxSuppressionPadded");const f=n.data.get(i.dataId).values,p=n.data.get(a.dataId).values,{selectedIndices:m,validOutputs:h}=r(f,p,u,d,l,c);return[n.makeTensorInfo([m.length],"int32",new Int32Array(m)),n.makeTensorInfo([],"int32",new Int32Array([h]))]}const a={kernelName:s.NonMaxSuppressionV4,backendName:"cpu",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NonMaxSuppressionV5.js": +/*!***************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NonMaxSuppressionV5.js ***! + \***************************************************************************************/ +/*! exports provided: nonMaxSuppressionV5, nonMaxSuppressionV5Config */function(e,t,n){"use strict";n.r(t),n.d(t,"nonMaxSuppressionV5",(function(){return i})),n.d(t,"nonMaxSuppressionV5Config",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=s.kernel_impls.nonMaxSuppressionV5Impl;function i(e){const{inputs:t,backend:n,attrs:s}=e,{boxes:i,scores:a}=t,{maxOutputSize:u,iouThreshold:d,scoreThreshold:l,softNmsSigma:c}=s;Object(o.assertNotComplex)(i,"NonMaxSuppressionWithScore");const f=n.data.get(i.dataId).values,p=n.data.get(a.dataId).values,m=u,h=d,b=l,j=c,{selectedIndices:g,selectedScores:w}=r(f,p,m,h,b,j);return[n.makeTensorInfo([g.length],"int32",new Int32Array(g)),n.makeTensorInfo([w.length],"float32",new Float32Array(w))]}const a={kernelName:s.NonMaxSuppressionV5,backendName:"cpu",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NotEqual.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NotEqual.js ***! + \****************************************************************************/ +/*! exports provided: notEqualImpl, notEqual, notEqualConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"notEqualImpl",(function(){return i})),n.d(t,"notEqual",(function(){return a})),n.d(t,"notEqualConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/binary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js"),r=n(/*! ../utils/binary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i=Object(o.createSimpleBinaryKernelImpl)(((e,t)=>e!==t?1:0)),a=Object(r.binaryKernelFunc)(s.NotEqual,i,null,"bool"),u={kernelName:s.NotEqual,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/OneHot.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/OneHot.js ***! + \**************************************************************************/ +/*! exports provided: oneHot, oneHotConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"oneHot",(function(){return r})),n.d(t,"oneHotConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:r}=e,{indices:i}=t,{depth:a,onValue:u,offValue:d}=r;Object(o.assertNotComplex)(i,"oneHot");const l=s.util.sizeFromShape(i.shape),c=new Float32Array(l*a);c.fill(d);const f=n.data.get(i.dataId).values;for(let e=0;e=0&&f[e]{s.util.assertShapesMatch(u,e.shape,"All tensors passed to stack must have matching shapes"),s.util.assert(d===e.dtype,(()=>"All tensors passed to stack must have matching dtypes"))}));const l=[],c=t.map((e=>{const t=Object(r.expandDims)({inputs:{input:e},backend:n,attrs:{dim:a}});return l.push(t),t})),f=Object(o.concat)({inputs:c,backend:n,attrs:{axis:a}});return l.forEach((e=>n.disposeIntermediateTensorInfo(e))),f}const a={kernelName:s.Pack,backendName:"cpu",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/PadV2.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/PadV2.js ***! + \*************************************************************************/ +/*! exports provided: padV2, padV2Config */function(e,t,n){"use strict";n.r(t),n.d(t,"padV2",(function(){return r})),n.d(t,"padV2Config",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:r}=e,{x:i}=t,{paddings:a,constantValue:u}=r;Object(o.assertNotComplex)(i,"pad");const d=a.map(((e,t)=>e[0]+i.shape[t]+e[1])),l=a.map((e=>e[0])),c=n.data.get(i.dataId).values,f=s.util.sizeFromShape(i.shape),p=i.shape.length,m=s.util.computeStrides(i.shape),h=s.util.sizeFromShape(d),b=d.length,j=s.util.computeStrides(d),g=s.util.getTypedArrayFromDType(i.dtype,h);0!==u&&g.fill(u);for(let e=0;ee+l[t]));g[s.util.locToIndex(t,b,j)]=c[e]}return{dataId:n.write(g,d,i.dtype),shape:d,dtype:i.dtype}}const i={kernelName:s.PadV2,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Pow.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Pow.js ***! + \***********************************************************************/ +/*! exports provided: powImpl, pow, powConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"powImpl",(function(){return i})),n.d(t,"pow",(function(){return a})),n.d(t,"powConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/binary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js"),r=n(/*! ../utils/binary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i=Object(o.createSimpleBinaryKernelImpl)(((e,t)=>Math.pow(e,t))),a=Object(r.binaryKernelFunc)(s.Pow,i),u={kernelName:s.Pow,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Prelu.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Prelu.js ***! + \*************************************************************************/ +/*! exports provided: prelu, preluConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"prelu",(function(){return a})),n.d(t,"preluConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ../utils/binary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i=Object(r.createSimpleBinaryKernelImpl)(((e,t)=>e<0?t*e:e));function a(e){const{inputs:t,backend:n}=e,{x:s,alpha:r}=t;Object(o.assertNotComplex)([s,r],"prelu");const a=n.data.get(s.dataId).values,u=n.data.get(r.dataId).values,[d,l]=i(s.shape,r.shape,a,u,s.dtype);return n.makeTensorInfo(l,s.dtype,d)}const u={kernelName:s.Prelu,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Prod.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Prod.js ***! + \************************************************************************/ +/*! exports provided: prodImpl, prod, prodConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"prodImpl",(function(){return i})),n.d(t,"prod",(function(){return a})),n.d(t,"prodConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ./Transpose */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Transpose.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e,t,n,o){const[r,i]=s.backend_util.computeOutAndReduceShapes(e,o),a=Object(s.upcastType)(t,"int32"),u=s.util.makeZerosTypedArray(s.util.sizeFromShape(r),a),d=s.util.sizeFromShape(i);for(let e=0;en.disposeIntermediateTensorInfo(e))),n.makeTensorInfo(k,_,g)}const u={kernelName:s.Prod,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Range.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Range.js ***! + \*************************************************************************/ +/*! exports provided: range, rangeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"range",(function(){return r})),n.d(t,"rangeConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Range_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Range_impl.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{backend:t,attrs:n}=e,{start:s,stop:r,dtype:i,step:a}=n,u=Object(o.rangeImpl)(s,r,a,i);return t.makeTensorInfo([u.length],i,u)}const i={kernelName:s.Range,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Range_impl.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Range_impl.js ***! + \******************************************************************************/ +/*! exports provided: rangeImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"rangeImpl",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */function o(e,t,n,o){if(e===t||e1)return s.util.makeZerosTypedArray(0,o);const r=Math.abs(Math.ceil((t-e)/n)),i=s.util.makeZerosTypedArray(r,o);te/t)),a=Object(r.binaryKernelFunc)(s.RealDiv,i),u={kernelName:s.RealDiv,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reciprocal.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reciprocal.js ***! + \******************************************************************************/ +/*! exports provided: reciprocal, reciprocalConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"reciprocal",(function(){return r})),n.d(t,"reciprocalConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)(s.Reciprocal,(e=>1/e)),i={kernelName:s.Reciprocal,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Relu.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Relu.js ***! + \************************************************************************/ +/*! exports provided: relu, reluConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"relu",(function(){return r})),n.d(t,"reluConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)(s.Relu,(e=>Math.max(0,e))),i={kernelName:s.Relu,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Relu6.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Relu6.js ***! + \*************************************************************************/ +/*! exports provided: relu6, relu6Config */function(e,t,n){"use strict";n.r(t),n.d(t,"relu6",(function(){return r})),n.d(t,"relu6Config",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)(s.Relu6,(e=>Math.min(Math.max(0,e),6))),i={kernelName:s.Relu6,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reshape.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reshape.js ***! + \***************************************************************************/ +/*! exports provided: reshape, reshapeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"reshape",(function(){return o})),n.d(t,"reshapeConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */function o(e){const{inputs:t,backend:n,attrs:o}=e,{x:r}=t,{shape:i}=o,a=s.util.sizeFromShape(r.shape),u=s.util.inferFromImplicitShape(i,a),d=s.util.sizeFromShape(u);s.util.assert(a===d,(()=>`The new shape (${u}) has ${d} elements and the old shape (${r.shape}) has ${a} elements. The new shape and old shape must have the same number of elements.`)),n.incRef(r.dataId);const l=n.data.get(r.dataId);if(null!=l.complexTensorInfos){const e=l.complexTensorInfos.real,t=l.complexTensorInfos.imag;e.shape=u,t.shape=u}return{dataId:r.dataId,shape:u,dtype:r.dtype}}const r={kernelName:s.Reshape,backendName:"cpu",kernelFunc:o}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ResizeBilinear.js": +/*!**********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ResizeBilinear.js ***! + \**********************************************************************************/ +/*! exports provided: resizeBilinear, resizeBilinearConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"resizeBilinear",(function(){return r})),n.d(t,"resizeBilinearConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:r}=e,{images:i}=t,{alignCorners:a,halfPixelCenters:u,size:d}=r;Object(o.assertNotComplex)(i,"resizeBilinear");const l=s.util.computeStrides(i.shape),[c,f]=d,[p,m,h,b]=i.shape,j=n.data.get(i.dataId).values,g=new Float32Array(s.util.sizeFromShape([p,c,f,b])),w=[a&&c>1?m-1:m,a&&f>1?h-1:h],_=[a&&c>1?c-1:c,a&&f>1?f-1:f];let k=0;const v=w[0]/_[0],x=w[1]/_[1];for(let e=0;e1?c-1:c,u&&h>1?f-1:f],g=[u&&m>1?m-1:m,u&&h>1?h-1:h],w=j[0]/g[0],_=j[1]/g[1],k=n.data.get(a.dataId).values;let v=0;for(let e=0;e1?m-1:m,a&&f>1?h-1:h],_=[a&&c>1?c-1:c,a&&f>1?f-1:f],k=w[0]/_[0],v=w[1]/_[1];let x=0;for(let e=0;e1?f-1:f,u&&b>1?p-1:p],_=[u&&h>1?h-1:h,u&&b>1?b-1:b],k=w[0]/_[0],v=w[1]/_[1],x=1/k,y=1/v,O=2*Math.ceil(x)+2,I=2*Math.ceil(y)+2;for(let e=0;e=h)continue;const c=t+d*l[1],m=d*k;if(e===Math.min(f-1,u?Math.round(m):Math.floor(m)))for(let e=0;e=b)continue;const o=c+t*l[2],r=t*v;s===Math.min(p-1,u?Math.round(r):Math.floor(r))&&(i+=g[o+n])}}j[r+n]=i}}}}return n.makeTensorInfo(i.shape,i.dtype,j)}const i={kernelName:s.ResizeNearestNeighborGrad,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reverse.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reverse.js ***! + \***************************************************************************/ +/*! exports provided: reverse, reverseConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"reverse",(function(){return i})),n.d(t,"reverseConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ./Identity */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Identity.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e){const{inputs:t,backend:n,attrs:i}=e,{x:a}=t,{dims:u}=i;Object(o.assertNotComplex)(a,"reverse");const d=a.shape.length,l=s.util.parseAxisParam(u,a.shape);if(0===d)return Object(r.identity)({inputs:{x:a},backend:n});const c=new s.TensorBuffer(a.shape,a.dtype),f=n.bufferSync(a);for(let e=0;en[e]=a.shape[e]-1-n[e])),c.set(f.get(...n),...t)}return n.makeTensorInfo(c.shape,c.dtype,c.values)}const a={kernelName:s.Reverse,backendName:"cpu",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/RotateWithOffset.js": +/*!************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/RotateWithOffset.js ***! + \************************************************************************************/ +/*! exports provided: rotateWithOffsetConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"rotateWithOffsetConfig",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */const o={kernelName:s.RotateWithOffset,backendName:"cpu",kernelFunc:({inputs:e,attrs:t,backend:n})=>{const{image:o}=e,{radians:r,fillValue:i,center:a}=t,u=n,d=s.util.getTypedArrayFromDType(o.dtype,s.util.sizeFromShape(o.shape)),[l,c,f,p]=o.shape,[m,h]=s.backend_util.getImageCenter(a,c,f),b=Math.sin(r),j=Math.cos(r),g=u.data.get(o.dataId).values;for(let e=0;e=0&&_=0&&k{const t=Math.floor(e);return e-t<.5?Math.floor(e):e-t>.5?Math.ceil(e):t%2==0?t:t+1})),i={kernelName:s.Round,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Rsqrt.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Rsqrt.js ***! + \*************************************************************************/ +/*! exports provided: rsqrtImpl, rsqrt, rsqrtConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"rsqrtImpl",(function(){return i})),n.d(t,"rsqrt",(function(){return a})),n.d(t,"rsqrtConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_impl.js"),r=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i=Object(o.createSimpleUnaryImpl)((e=>1/Math.sqrt(e))),a=Object(r.unaryKernelFuncFromImpl)(s.Rsqrt,i),u={kernelName:s.Rsqrt,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ScatterNd.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ScatterNd.js ***! + \*****************************************************************************/ +/*! exports provided: scatterNd, scatterNdConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"scatterNd",(function(){return r})),n.d(t,"scatterNdConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Scatter_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Scatter_impl.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:r}=e,{indices:i,updates:a}=t,{shape:u}=r,{sliceRank:d,numUpdates:l,sliceSize:c,strides:f,outputSize:p}=s.backend_util.calculateShapes(a,i,u),m=n.bufferSync(i),h=n.bufferSync(a),b=Object(o.scatterImpl)(m,h,u,p,c,l,d,f,0,!0);return n.makeTensorInfo(u,b.dtype,b.values)}const i={kernelName:s.ScatterNd,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Scatter_impl.js": +/*!********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Scatter_impl.js ***! + \********************************************************************************/ +/*! exports provided: scatterImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"scatterImpl",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */function o(e,t,n,o,r,i,a,u,d,l){const c=[o/r,r],f=e.values,p=t.values;if(0===o)return Object(s.buffer)(n,t.dtype);const m=Object(s.buffer)(c,t.dtype);m.values.fill(d);for(let e=0;e=o/r)throw new Error(`Invalid indices: ${s} does not index into ${n}`);for(let n=0;n1||1===i.shape.length?1:s.util.sizeFromShape(i.shape.slice(1));for(let e=0;ee>=0?i*e:r*(Math.exp(e)-1))),u={kernelName:s.Selu,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sigmoid.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sigmoid.js ***! + \***************************************************************************/ +/*! exports provided: sigmoid, sigmoidConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sigmoid",(function(){return r})),n.d(t,"sigmoidConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)(s.Sigmoid,(e=>1/(1+Math.exp(-e)))),i={kernelName:s.Sigmoid,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sign.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sign.js ***! + \************************************************************************/ +/*! exports provided: sign, signConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sign",(function(){return r})),n.d(t,"signConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)(s.Sign,(e=>e<0?-1:e>0?1:0)),i={kernelName:s.Sign,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sin.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sin.js ***! + \***********************************************************************/ +/*! exports provided: sin, sinConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sin",(function(){return r})),n.d(t,"sinConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)(s.Sin,(e=>Math.sin(e))),i={kernelName:s.Sin,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sinh.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sinh.js ***! + \************************************************************************/ +/*! exports provided: sinh, sinhConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sinh",(function(){return r})),n.d(t,"sinhConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)(s.Sinh,(e=>Math.sinh(e))),i={kernelName:s.Sinh,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Slice.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Slice.js ***! + \*************************************************************************/ +/*! exports provided: sliceImpl, slice, sliceConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sliceImpl",(function(){return r})),n.d(t,"slice",(function(){return i})),n.d(t,"sliceConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e,t,n,o,r){const i=s.slice_util.isSliceContinous(o,t,n),a=s.util.sizeFromShape(n),u=s.util.computeStrides(o);if(i){const n=s.slice_util.computeFlatOffset(t,u);return"string"===r?e.slice(n,n+a):e.subarray(n,n+a)}const d="string"===r?s.backend_util.fromUint8ToStringArray(e):e,l=Object(s.buffer)(o,r,d),c=Object(s.buffer)(n,r);for(let e=0;ee+t[n]));c.set(l.get(...s),...n)}return"string"===r?s.backend_util.fromStringArrayToUint8(c.values):c.values}function i(e){const{inputs:t,backend:n,attrs:i}=e,{x:a}=t,{begin:u,size:d}=i;Object(o.assertNotComplex)(a,"slice");const[l,c]=s.slice_util.parseSliceParams(a,u,d);s.slice_util.assertParamsValid(a,l,c);const f=r(n.data.get(a.dataId).values,l,c,a.shape,a.dtype);return n.makeTensorInfo(c,a.dtype,f)}const a={kernelName:s.Slice,backendName:"cpu",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Softmax.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Softmax.js ***! + \***************************************************************************/ +/*! exports provided: softmax, softmaxConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"softmax",(function(){return l})),n.d(t,"softmaxConfig",(function(){return c}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Exp */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Exp.js"),r=n(/*! ./Max */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Max.js"),i=n(/*! ./RealDiv */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/RealDiv.js"),a=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reshape.js"),u=n(/*! ./Sub */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sub.js"),d=n(/*! ./Sum */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sum.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function l(e){const{inputs:t,backend:n,attrs:l}=e,{logits:c}=t,{dim:f}=l,p=c.shape.length;let m=f;if(-1===m&&(m=p-1),m!==p-1)throw Error(`Softmax along a non-last dimension is not yet supported. Logits was rank ${p} and dim was ${m}`);const h=s.util.parseAxisParam([m],c.shape),b=Object(r.max)({inputs:{x:c},backend:n,attrs:{reductionIndices:h,keepDims:!1}}),j=s.backend_util.expandShapeToKeepDim(b.shape,h),g=Object(a.reshape)({inputs:{x:b},backend:n,attrs:{shape:j}}),w=Object(u.sub)({inputs:{a:c,b:g},backend:n}),_=Object(o.exp)({inputs:{x:w},backend:n}),k=Object(d.sum)({inputs:{x:_},backend:n,attrs:{axis:h,keepDims:!1}}),v=Object(a.reshape)({inputs:{x:k},backend:n,attrs:{shape:j}}),x=Object(i.div)({inputs:{a:_,b:v},backend:n});return n.disposeIntermediateTensorInfo(b),n.disposeIntermediateTensorInfo(g),n.disposeIntermediateTensorInfo(w),n.disposeIntermediateTensorInfo(_),n.disposeIntermediateTensorInfo(k),n.disposeIntermediateTensorInfo(v),x}const c={kernelName:s.Softmax,backendName:"cpu",kernelFunc:l}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Softplus.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Softplus.js ***! + \****************************************************************************/ +/*! exports provided: softplus, softplusConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"softplus",(function(){return i})),n.d(t,"softplusConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Math.log(1.1920928955078125e-7)+2,i=Object(o.unaryKernelFunc)(s.Softplus,(e=>{const t=e>-r,n=eNumber(e))))),n.makeTensorInfo([b.length],s.dtype,new Int32Array(b))]}const i={kernelName:s.SparseFillEmptyRows,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SparseFillEmptyRows_impl.js": +/*!********************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SparseFillEmptyRows_impl.js ***! + \********************************************************************************************/ +/*! exports provided: sparseFillEmptyRowsImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"sparseFillEmptyRowsImpl",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */function o(e,t,n,o,r,i,a){const u=t[0],d=i[0],l=new Array(d),c=new Array(u),f=t[1];if(0===d){if(0!==u)throw new Error(`Received SparseTensor with denseShape[0] = 0 but\n indices.shape[0] = ${u}`);return[s.util.getArrayFromDType(n,0),[0,f],s.util.getArrayFromDType(r,0),l,c]}let p=!0,m=0;const h=new Array(d).fill(0);for(let t=0;t=d)throw new Error(`indices(${t}, 0) is invalid: ${n} >= ${d}`);++h[n],p=p&&n>=m,m=n}let b=!0;for(let e=0;e0&&(h[e]+=h[e-1])}if(b&&p){const t=e,n=o;for(let e=0;e0){m[p-1]=1;for(let e=p-2;e>=0;--e)m[e]=m[e+1]*o[e+1]}const h=[];if(u>0){h[u-1]=1;for(let e=u-2;e>=0;--e)h[e]=h[e+1]*d[e+1]}const b=s.util.getArrayFromDType(n,a*u);for(let t=0;t0?r[u-1]+1:0;if(c<0)throw new Error("segment ids must be >= 0");const f=t.slice();f[0]=c;const p=f.reduce(((e,t)=>e*t),1),m=s.util.getArrayFromDType(n,p);if(0===u)return c>0&&m.fill(a),[m,f];if(c<=0)throw new Error("segment ids must be >= 0");let h=0,b=1,j=0,g=r[h];for(;;){let t=0;if(b=t)throw new Error("segment ids are not increasing")}if(g<0||g>=c)throw new Error(`Segment id ${g} out of range [0, ${c}), possibly because segmentIds input is not sorted.`);g>j&&m.fill(a,j*l,g*l);for(let t=h;t=d[0])throw new Error(`Bad: indices[${t}] == ${o[t]} out of range [0, ${d[0]})`);for(let t=0;tu)break}return j{const t=[...f];t[d]=e;const s=Object(o.slice)({inputs:{x:i},backend:n,attrs:{begin:c,size:t}});return c[d]+=e,s}))}const i={kernelName:s.SplitV,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sqrt.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sqrt.js ***! + \************************************************************************/ +/*! exports provided: sqrt, sqrtConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sqrt",(function(){return r})),n.d(t,"sqrtConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)(s.Sqrt,(e=>Math.sqrt(e))),i={kernelName:s.Sqrt,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Square.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Square.js ***! + \**************************************************************************/ +/*! exports provided: squareConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"squareConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r={kernelName:s.Square,backendName:"cpu",kernelFunc:({inputs:e,backend:t})=>{const{x:n}=e,s=t;Object(o.assertNotComplex)(n,"square");const r=s.data.get(n.dataId).values,i=new Float32Array(r.length);for(let e=0;e{const n=e-t;return n*n})),a=Object(r.binaryKernelFunc)(s.SquaredDifference,i),u={kernelName:s.SquaredDifference,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Step.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Step.js ***! + \************************************************************************/ +/*! exports provided: step, stepConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"step",(function(){return r})),n.d(t,"stepConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)(s.Step,((e,t)=>{const n=t;return isNaN(e)?NaN:e>0?1:n.alpha})),i={kernelName:s.Step,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StridedSlice.js": +/*!********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StridedSlice.js ***! + \********************************************************************************/ +/*! exports provided: stridedSlice, stridedSliceConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"stridedSlice",(function(){return u})),n.d(t,"stridedSliceConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reshape.js"),i=n(/*! ./Slice */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Slice.js"),a=n(/*! ./StridedSlice_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StridedSlice_impl.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function u(e){const{inputs:t,backend:n,attrs:u}=e,{x:d}=t,{begin:l,end:c,strides:f,beginMask:p,endMask:m,ellipsisMask:h,newAxisMask:b,shrinkAxisMask:j}=u;Object(o.assertNotComplex)(d,"stridedSlice");const{nonStrided:g,$begin:w,$strides:_,size:k,newShape:v,outShape:x}=s.slice_util.sliceInfo(d.shape,l,c,f,p,m,h,b,j),y=Object(r.reshape)({inputs:{x:d},backend:n,attrs:{shape:v}});let O;if(g){const e=Object(i.slice)({inputs:{x:y},backend:n,attrs:{begin:w,size:k}});O=Object(r.reshape)({inputs:{x:e},backend:n,attrs:{shape:x}}),n.disposeIntermediateTensorInfo(e)}else if(x.some((e=>0===e)))O=n.makeTensorInfo(x,d.dtype,[]);else{const e=n.bufferSync(y),t=Object(a.stridedSliceImpl)(x,e,_,w);O=n.makeTensorInfo(t.shape,t.dtype,t.values)}const I=Object(r.reshape)({inputs:{x:O},backend:n,attrs:{shape:x}});return n.disposeIntermediateTensorInfo(y),n.disposeIntermediateTensorInfo(O),I}const d={kernelName:s.StridedSlice,backendName:"cpu",kernelFunc:u}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StridedSlice_impl.js": +/*!*************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StridedSlice_impl.js ***! + \*************************************************************************************/ +/*! exports provided: stridedSliceImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"stridedSliceImpl",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */function o(e,t,n,o){const r=Object(s.buffer)(e,t.dtype);for(let e=0;e0?0:i-a);let f=0;f+=u*this.leftPad.length;for(let t=0;te.forEach((e=>p[m++]=e));for(let e=0;e0){h(e[c+l-1]);for(let e=0;e0){let e=t[0];if(0!==e)throw new Error(`First split value must be 0, got ${e}`);for(let s=1;s=e;if(o=o&&t[s]<=n,!o)throw new Error(`Invalid split value ${t[s]}, must be in [${e}, ${n}]`);e=t[s]}if(e!==n)throw new Error(`Last split value must be data size. Expected ${n}, got ${e}`)}const r=o-1,i=s.util.getArrayFromDType("int32",o);if(0===n||0===o){const e=new Array(n);for(let e=0;e<=r;++e)i[e]=0;return[e,i]}i[0]=0;for(let e=1;e<=r;++e){const n=t[e]-t[e-1];let s=0;this.nGramWidths.forEach((e=>{s+=this.getNumNGrams(n,e)})),this.preserveShort&&n>0&&0===s&&(s=1),i[e]=i[e-1]+s}const a=new Array(i[r]);for(let n=0;n{const i=t[n+1]-t[n],u=this.getNumNGrams(i,r);this.createNGrams(e,s,a,o,u,r),o+=u})),this.preserveShort&&o===i[n]){const r=t[n+1]-t[n];if(0===r)continue;const i=r+2*this.padWidth,u=1;this.createNGrams(e,s,a,o,u,i)}}return[a,i]}}function r(e,t,n,s,r,i,a,u){return new o(n,s,r,i,a,u).compute(e,t)}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StringSplit.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StringSplit.js ***! + \*******************************************************************************/ +/*! exports provided: stringSplit, stringSplitConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"stringSplit",(function(){return r})),n.d(t,"stringSplitConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./StringSplit_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StringSplit_impl.js"); +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,backend:n,attrs:s}=e,{skipEmpty:r}=s,{input:i,delimiter:a}=t;if("string"!==i.dtype)throw new Error("Input must be of datatype string");if(1!==i.shape.length)throw new Error(`Input must be a vector, got shape: ${i.shape}`);if(0!==a.shape.length)throw new Error(`Delimiter must be a scalar, got shape: ${a.shape}`);const u=n.data.get(i.dataId).values,d=n.data.get(a.dataId).values[0],[l,c,f]=Object(o.stringSplitImpl)(u,d,r),p=c.length;return[n.makeTensorInfo([p,2],"int32",l),n.makeTensorInfo([p],"string",c),n.makeTensorInfo([2],"int32",new Int32Array(f))]}const i={kernelName:s.StringSplit,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StringSplit_impl.js": +/*!************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StringSplit_impl.js ***! + \************************************************************************************/ +/*! exports provided: stringSplitImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"stringSplitImpl",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */function o(e,t,n){if(!e.length)return[];if(0===t.length){const t=new Array(e.length);for(let n=0;ne-t)),a=Object(r.createComplexBinaryKernelImpl)(((e,t,n,s)=>({real:e-n,imag:t-s}))),u=Object(r.binaryKernelFunc)(s.Sub,i,a),d={kernelName:s.Sub,backendName:"cpu",kernelFunc:u}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sum.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sum.js ***! + \***********************************************************************/ +/*! exports provided: sum, sumConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sum",(function(){return l})),n.d(t,"sumConfig",(function(){return c}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ../utils/zeros_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/zeros_impl.js"),i=n(/*! ./Cast */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Cast.js"),a=n(/*! ./Identity */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Identity.js"),u=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reshape.js"),d=n(/*! ./Transpose */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Transpose.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function l(e){const{inputs:t,backend:n,attrs:l}=e,{x:c}=t,{axis:f,keepDims:p}=l;let m;Object(o.assertNotComplex)(c,"sum"),m="bool"===c.dtype?Object(i.cast)({inputs:{x:c},backend:n,attrs:{dtype:"int32"}}):Object(a.identity)({inputs:{x:c},backend:n});const h=m.shape.length,b=s.util.parseAxisParam(f,m.shape),j=s.backend_util.getAxesPermutation(b,h);let g=b,w=m;null!=j&&(w=Object(d.transpose)({inputs:{x:m},backend:n,attrs:{perm:j}}),g=s.backend_util.getInnerMostAxes(g.length,h)),s.backend_util.assertAxesAreInnerMostDims("sum",g,w.shape.length);const[_,k]=s.backend_util.computeOutAndReduceShapes(w.shape,g),v=s.backend_util.upcastType(w.dtype,"int32");let x=Object(r.zeros)(n,_,v);const y=s.util.sizeFromShape(k),O=n.data.get(x.dataId).values,I=n.data.get(w.dataId).values;for(let e=0;eMath.tan(e))),i={kernelName:s.Tan,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Tanh.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Tanh.js ***! + \************************************************************************/ +/*! exports provided: tanh, tanhConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"tanh",(function(){return r})),n.d(t,"tanhConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/unary_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.unaryKernelFunc)(s.Tanh,(e=>Math.tanh(e))),i={kernelName:s.Tanh,backendName:"cpu",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Tile.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Tile.js ***! + \************************************************************************/ +/*! exports provided: tile, tileConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"tile",(function(){return i})),n.d(t,"tileConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ./Tile_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Tile_impl.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e){const{inputs:t,backend:n,attrs:s}=e,{x:i}=t,{reps:a}=s;Object(o.assertNotComplex)(i,"tile");const u=Object(r.tileImpl)(n.bufferSync(i),a);return n.makeTensorInfo(u.shape,u.dtype,u.values)}const a={kernelName:s.Tile,backendName:"cpu",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Tile_impl.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Tile_impl.js ***! + \*****************************************************************************/ +/*! exports provided: tileImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"tileImpl",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */function o(e,t){const n=new Array(e.rank);for(let s=0;s{const n=t.value-e.value;return 0===n?e.index-t.index:n};function r(e,t,n=0,i=e.length-1){for(;i>n;){if(i-n>600){const s=i-n+1,o=t-n+1,a=Math.log(s),u=.5*Math.exp(2*a/3),d=.5*Math.sqrt(a*u*(s-u)/s)*Math.sign(o-s/2);r(e,t,Math.max(n,Math.floor(t-o*u/s+d)),Math.min(i,Math.floor(t+(s-o)*u/s+d)))}const a=e[t];let u=n,d=i;for(s.util.swap(e,n,t),o(e[i],a)>0&&s.util.swap(e,n,i);u0;)d-=1}0===o(e[n],a)?s.util.swap(e,n,d):(d+=1,s.util.swap(e,d,i)),d<=t&&(n=d+1),t<=d&&(i=d-1)}}function i(e,t,n,i,a){const u=t[t.length-1],[d,l]=[e.length/u,u],c=s.util.getTypedArrayFromDType(n,d*i),f=s.util.getTypedArrayFromDType("int32",d*i);for(let t=0;tu[t]={value:e,index:t})),it-1)if(t<=1)n=0;else{const e=2*t;n-=e*Math.trunc(n/e),n>=t&&(n=e-n-1)}return s.util.clamp(0,n,t-1)}(e,t);case"wrap":return function(e,t){let n=e;if(n<0)if(t<=1)n=0;else{const e=t-1;n+=t*(Math.trunc(-n/e)+1)}else if(n>t-1)if(t<=1)n=0;else{const e=t-1;n-=t*Math.trunc(n/e)}return s.util.clamp(0,n,t-1)}(e,t);case"nearest":return function(e,t){return s.util.clamp(0,e,t-1)}(e,t);case"constant":default:return function(e,t){return e}(e)}}function a(e,t,n,s,o,r,i,a,u,d,l){return 0<=a&&a{for(let n=0;nn.disposeIntermediateTensorInfo(e))),w}const f={kernelName:s.UnsortedSegmentSum,backendName:"cpu",kernelFunc:c}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ZerosLike.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ZerosLike.js ***! + \*****************************************************************************/ +/*! exports provided: zerosLike, zerosLikeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"zerosLike",(function(){return u})),n.d(t,"zerosLikeConfig",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Complex */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Complex.js"),r=n(/*! ./Fill */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Fill.js"),i=n(/*! ./Imag */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Imag.js"),a=n(/*! ./Real */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Real.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function u(e){const{inputs:t,backend:n}=e,{x:s}=t;if("string"===s.dtype)throw new Error("zerosLike is not supported for string tensors");if("complex64"===s.dtype){const e=Object(a.real)({inputs:{input:s},backend:n}),t=u({inputs:{x:e},backend:n}),r=Object(i.imag)({inputs:{input:s},backend:n}),d=u({inputs:{x:r},backend:n}),l=Object(o.complex)({inputs:{real:t,imag:d},backend:n});return n.disposeIntermediateTensorInfo(e),n.disposeIntermediateTensorInfo(t),n.disposeIntermediateTensorInfo(r),n.disposeIntermediateTensorInfo(d),l}return Object(r.fill)({backend:n,attrs:{shape:s.shape,value:0,dtype:s.dtype}})}const d={kernelName:s.ZerosLike,backendName:"cpu",kernelFunc:u}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/_FusedMatMul.js": +/*!********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/_FusedMatMul.js ***! + \********************************************************************************/ +/*! exports provided: _fusedMatMul, _fusedMatMulConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"_fusedMatMul",(function(){return a})),n.d(t,"_fusedMatMulConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils/fused_utils */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/fused_utils.js"),r=n(/*! ./Add */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Add.js"),i=n(/*! ./BatchMatMul */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/BatchMatMul.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function a(e){const{inputs:t,backend:n,attrs:s}=e,{a:a,b:u,bias:d,preluActivationWeights:l}=t,{transposeA:c,transposeB:f,activation:p,leakyreluAlpha:m}=s;let h,b,j;const g=[];h=Object(i.batchMatMul)({inputs:{a:a,b:u},attrs:{transposeA:c,transposeB:f},backend:n}),d&&(b=Object(r.add)({inputs:{a:h,b:d},backend:n}),g.push(h),h=b),p&&(j=Object(o.applyActivation)(n,h,p,l,m),g.push(h),h=j);for(const e of g)n.disposeIntermediateTensorInfo(e);return h}const u={kernelName:s._FusedMatMul,backendName:"cpu",kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/register_all_kernels.js": +/*!********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/register_all_kernels.js ***! + \********************************************************************************/ +/*! no exports provided */function(e,t,n){"use strict";n.r(t);var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./kernels/_FusedMatMul */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/_FusedMatMul.js"),r=n(/*! ./kernels/Abs */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Abs.js"),i=n(/*! ./kernels/Acos */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Acos.js"),a=n(/*! ./kernels/Acosh */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Acosh.js"),u=n(/*! ./kernels/Add */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Add.js"),d=n(/*! ./kernels/AddN */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AddN.js"),l=n(/*! ./kernels/All */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/All.js"),c=n(/*! ./kernels/Any */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Any.js"),f=n(/*! ./kernels/ArgMax */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ArgMax.js"),p=n(/*! ./kernels/ArgMin */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ArgMin.js"),m=n(/*! ./kernels/Asin */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Asin.js"),h=n(/*! ./kernels/Asinh */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Asinh.js"),b=n(/*! ./kernels/Atan */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Atan.js"),j=n(/*! ./kernels/Atan2 */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Atan2.js"),g=n(/*! ./kernels/Atanh */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Atanh.js"),w=n(/*! ./kernels/AvgPool */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AvgPool.js"),_=n(/*! ./kernels/AvgPool3D */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AvgPool3D.js"),k=n(/*! ./kernels/AvgPool3DGrad */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AvgPool3DGrad.js"),v=n(/*! ./kernels/AvgPoolGrad */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AvgPoolGrad.js"),x=n(/*! ./kernels/BatchMatMul */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/BatchMatMul.js"),y=n(/*! ./kernels/BatchNorm */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/BatchNorm.js"),O=n(/*! ./kernels/BatchToSpaceND */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/BatchToSpaceND.js"),I=n(/*! ./kernels/Bincount */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Bincount.js"),C=n(/*! ./kernels/Cast */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Cast.js"),S=n(/*! ./kernels/Ceil */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Ceil.js"),T=n(/*! ./kernels/Clip */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Clip.js"),N=n(/*! ./kernels/Complex */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Complex.js"),E=n(/*! ./kernels/ComplexAbs */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ComplexAbs.js"),A=n(/*! ./kernels/Concat */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Concat.js"),R=n(/*! ./kernels/Conv2D */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Conv2D.js"),F=n(/*! ./kernels/Conv2DBackpropFilter */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Conv2DBackpropFilter.js"),M=n(/*! ./kernels/Conv2DBackpropInput */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Conv2DBackpropInput.js"),$=n(/*! ./kernels/Conv3D */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Conv3D.js"),D=n(/*! ./kernels/Conv3DBackpropFilterV2 */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Conv3DBackpropFilterV2.js"),P=n(/*! ./kernels/Conv3DBackpropInputV2 */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Conv3DBackpropInputV2.js"),B=n(/*! ./kernels/Cos */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Cos.js"),L=n(/*! ./kernels/Cosh */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Cosh.js"),z=n(/*! ./kernels/CropAndResize */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/CropAndResize.js"),G=n(/*! ./kernels/Cumsum */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Cumsum.js"),U=n(/*! ./kernels/DenseBincount */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/DenseBincount.js"),W=n(/*! ./kernels/DepthToSpace */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/DepthToSpace.js"),V=n(/*! ./kernels/DepthwiseConv2dNative */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/DepthwiseConv2dNative.js"),q=n(/*! ./kernels/DepthwiseConv2dNativeBackpropFilter */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/DepthwiseConv2dNativeBackpropFilter.js"),H=n(/*! ./kernels/DepthwiseConv2dNativeBackpropInput */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/DepthwiseConv2dNativeBackpropInput.js"),K=n(/*! ./kernels/Diag */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Diag.js"),X=n(/*! ./kernels/Dilation2D */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Dilation2D.js"),Y=n(/*! ./kernels/Dilation2DBackpropFilter */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Dilation2DBackpropFilter.js"),Z=n(/*! ./kernels/Dilation2DBackpropInput */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Dilation2DBackpropInput.js"),Q=n(/*! ./kernels/Einsum */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Einsum.js"),J=n(/*! ./kernels/Elu */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Elu.js"),ee=n(/*! ./kernels/EluGrad */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/EluGrad.js"),te=n(/*! ./kernels/Equal */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Equal.js"),ne=n(/*! ./kernels/Erf */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Erf.js"),se=n(/*! ./kernels/Exp */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Exp.js"),oe=n(/*! ./kernels/ExpandDims */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ExpandDims.js"),re=n(/*! ./kernels/Expm1 */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Expm1.js"),ie=n(/*! ./kernels/FFT */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FFT.js"),ae=n(/*! ./kernels/Fill */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Fill.js"),ue=n(/*! ./kernels/FlipLeftRight */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FlipLeftRight.js"),de=n(/*! ./kernels/Floor */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Floor.js"),le=n(/*! ./kernels/FloorDiv */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FloorDiv.js"),ce=n(/*! ./kernels/FusedConv2D */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FusedConv2D.js"),fe=n(/*! ./kernels/FusedDepthwiseConv2D */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FusedDepthwiseConv2D.js"),pe=n(/*! ./kernels/GatherNd */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/GatherNd.js"),me=n(/*! ./kernels/GatherV2 */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/GatherV2.js"),he=n(/*! ./kernels/Greater */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Greater.js"),be=n(/*! ./kernels/GreaterEqual */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/GreaterEqual.js"),je=n(/*! ./kernels/Identity */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Identity.js"),ge=n(/*! ./kernels/IFFT */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/IFFT.js"),we=n(/*! ./kernels/Imag */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Imag.js"),_e=n(/*! ./kernels/IsFinite */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/IsFinite.js"),ke=n(/*! ./kernels/IsInf */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/IsInf.js"),ve=n(/*! ./kernels/IsNaN */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/IsNaN.js"),xe=n(/*! ./kernels/LeakyRelu */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LeakyRelu.js"),ye=n(/*! ./kernels/Less */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Less.js"),Oe=n(/*! ./kernels/LessEqual */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LessEqual.js"),Ie=n(/*! ./kernels/LinSpace */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LinSpace.js"),Ce=n(/*! ./kernels/Log */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Log.js"),Se=n(/*! ./kernels/Log1p */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Log1p.js"),Te=n(/*! ./kernels/LogicalAnd */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LogicalAnd.js"),Ne=n(/*! ./kernels/LogicalNot */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LogicalNot.js"),Ee=n(/*! ./kernels/LogicalOr */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LogicalOr.js"),Ae=n(/*! ./kernels/LRN */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LRN.js"),Re=n(/*! ./kernels/LRNGrad */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LRNGrad.js"),Fe=n(/*! ./kernels/Max */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Max.js"),Me=n(/*! ./kernels/Maximum */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Maximum.js"),$e=n(/*! ./kernels/MaxPool */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPool.js"),De=n(/*! ./kernels/MaxPool3D */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPool3D.js"),Pe=n(/*! ./kernels/MaxPool3DGrad */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPool3DGrad.js"),Be=n(/*! ./kernels/MaxPoolGrad */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPoolGrad.js"),Le=n(/*! ./kernels/MaxPoolWithArgmax */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPoolWithArgmax.js"),ze=n(/*! ./kernels/Mean */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Mean.js"),Ge=n(/*! ./kernels/Min */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Min.js"),Ue=n(/*! ./kernels/Minimum */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Minimum.js"),We=n(/*! ./kernels/MirrorPad */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MirrorPad.js"),Ve=n(/*! ./kernels/Mod */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Mod.js"),qe=n(/*! ./kernels/Multinomial */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Multinomial.js"),He=n(/*! ./kernels/Multiply */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Multiply.js"),Ke=n(/*! ./kernels/Neg */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Neg.js"),Xe=n(/*! ./kernels/NonMaxSuppressionV3 */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NonMaxSuppressionV3.js"),Ye=n(/*! ./kernels/NonMaxSuppressionV4 */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NonMaxSuppressionV4.js"),Ze=n(/*! ./kernels/NonMaxSuppressionV5 */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NonMaxSuppressionV5.js"),Qe=n(/*! ./kernels/NotEqual */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NotEqual.js"),Je=n(/*! ./kernels/OneHot */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/OneHot.js"),et=n(/*! ./kernels/OnesLike */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/OnesLike.js"),tt=n(/*! ./kernels/Pack */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Pack.js"),nt=n(/*! ./kernels/PadV2 */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/PadV2.js"),st=n(/*! ./kernels/Pow */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Pow.js"),ot=n(/*! ./kernels/Prelu */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Prelu.js"),rt=n(/*! ./kernels/Prod */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Prod.js"),it=n(/*! ./kernels/Range */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Range.js"),at=n(/*! ./kernels/Real */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Real.js"),ut=n(/*! ./kernels/RealDiv */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/RealDiv.js"),dt=n(/*! ./kernels/Reciprocal */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reciprocal.js"),lt=n(/*! ./kernels/Relu */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Relu.js"),ct=n(/*! ./kernels/Relu6 */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Relu6.js"),ft=n(/*! ./kernels/Reshape */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reshape.js"),pt=n(/*! ./kernels/ResizeBilinear */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ResizeBilinear.js"),mt=n(/*! ./kernels/ResizeBilinearGrad */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ResizeBilinearGrad.js"),ht=n(/*! ./kernels/ResizeNearestNeighbor */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ResizeNearestNeighbor.js"),bt=n(/*! ./kernels/ResizeNearestNeighborGrad */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ResizeNearestNeighborGrad.js"),jt=n(/*! ./kernels/Reverse */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reverse.js"),gt=n(/*! ./kernels/RotateWithOffset */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/RotateWithOffset.js"),wt=n(/*! ./kernels/Round */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Round.js"),_t=n(/*! ./kernels/Rsqrt */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Rsqrt.js"),kt=n(/*! ./kernels/ScatterNd */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ScatterNd.js"),vt=n(/*! ./kernels/Select */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Select.js"),xt=n(/*! ./kernels/Selu */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Selu.js"),yt=n(/*! ./kernels/Sigmoid */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sigmoid.js"),Ot=n(/*! ./kernels/Sign */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sign.js"),It=n(/*! ./kernels/Sin */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sin.js"),Ct=n(/*! ./kernels/Sinh */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sinh.js"),St=n(/*! ./kernels/Slice */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Slice.js"),Tt=n(/*! ./kernels/Softmax */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Softmax.js"),Nt=n(/*! ./kernels/Softplus */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Softplus.js"),Et=n(/*! ./kernels/SpaceToBatchND */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SpaceToBatchND.js"),At=n(/*! ./kernels/SparseFillEmptyRows */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SparseFillEmptyRows.js"),Rt=n(/*! ./kernels/SparseReshape */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SparseReshape.js"),Ft=n(/*! ./kernels/SparseSegmentMean */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SparseSegmentMean.js"),Mt=n(/*! ./kernels/SparseSegmentSum */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SparseSegmentSum.js"),$t=n(/*! ./kernels/SparseToDense */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SparseToDense.js"),Dt=n(/*! ./kernels/SplitV */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SplitV.js"),Pt=n(/*! ./kernels/Sqrt */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sqrt.js"),Bt=n(/*! ./kernels/Square */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Square.js"),Lt=n(/*! ./kernels/SquaredDifference */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SquaredDifference.js"),zt=n(/*! ./kernels/Step */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Step.js"),Gt=n(/*! ./kernels/StridedSlice */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StridedSlice.js"),Ut=n(/*! ./kernels/StringNGrams */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StringNGrams.js"),Wt=n(/*! ./kernels/StringSplit */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StringSplit.js"),Vt=n(/*! ./kernels/StringToHashBucketFast */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StringToHashBucketFast.js"),qt=n(/*! ./kernels/Sub */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sub.js"),Ht=n(/*! ./kernels/Sum */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sum.js"),Kt=n(/*! ./kernels/Tan */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Tan.js"),Xt=n(/*! ./kernels/Tanh */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Tanh.js"),Yt=n(/*! ./kernels/Tile */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Tile.js"),Zt=n(/*! ./kernels/TopK */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/TopK.js"),Qt=n(/*! ./kernels/Transform */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Transform.js"),Jt=n(/*! ./kernels/Transpose */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Transpose.js"),en=n(/*! ./kernels/Unique */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Unique.js"),tn=n(/*! ./kernels/Unpack */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Unpack.js"),nn=n(/*! ./kernels/UnsortedSegmentSum */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/UnsortedSegmentSum.js"),sn=n(/*! ./kernels/ZerosLike */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ZerosLike.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const on=[o._fusedMatMulConfig,r.absConfig,i.acosConfig,a.acoshConfig,u.addConfig,d.addNConfig,l.allConfig,c.anyConfig,f.argMaxConfig,p.argMinConfig,m.asinConfig,h.asinhConfig,b.atanConfig,j.atan2Config,g.atanhConfig,w.avgPoolConfig,_.avgPool3DConfig,k.avgPool3DGradConfig,v.avgPoolGradConfig,x.batchMatMulConfig,y.batchNormConfig,O.batchToSpaceNDConfig,I.bincountConfig,C.castConfig,S.ceilConfig,T.clipConfig,N.complexConfig,E.complexAbsConfig,A.concatConfig,F.conv2DBackpropFilterConfig,M.conv2DBackpropInputConfig,R.conv2DConfig,D.conv3DBackpropFilterV2Config,P.conv3DBackpropInputV2Config,$.conv3DConfig,B.cosConfig,L.coshConfig,z.cropAndResizeConfig,G.cumsumConfig,U.denseBincountConfig,W.depthToSpaceConfig,V.depthwiseConv2dNativeConfig,q.depthwiseConv2dNativeBackpropFilterConfig,H.depthwiseConv2dNativeBackpropInputConfig,K.diagConfig,X.dilation2dConfig,Z.dilation2dBackpropInputConfig,Y.dilation2dBackpropFilterConfig,ut.realDivConfig,Q.einsumConfig,J.eluConfig,ee.eluGradConfig,te.equalConfig,ne.erfConfig,se.expConfig,oe.expandDimsConfig,re.expm1Config,ie.fftConfig,ae.fillConfig,ue.flipLeftRightConfig,de.floorConfig,le.floorDivConfig,ce.fusedConv2DConfig,fe.fusedDepthwiseConv2DConfig,pe.gatherNdConfig,me.gatherV2Config,he.greaterConfig,be.greaterEqualConfig,je.identityConfig,ge.ifftConfig,we.imagConfig,_e.isFiniteConfig,ke.isInfConfig,ve.isNaNConfig,xe.leakyReluConfig,ye.lessConfig,Oe.lessEqualConfig,Ie.linSpaceConfig,Ce.logConfig,Se.log1pConfig,Te.logicalAndConfig,Ne.logicalNotConfig,Ee.logicalOrConfig,Ae.lRNConfig,Re.lRNGradConfig,Me.maximumConfig,$e.maxPoolConfig,De.maxPool3DConfig,Pe.maxPool3DGradConfig,Be.maxPoolGradConfig,Le.maxPoolWithArgmaxConfig,Fe.maxConfig,ze.meanConfig,Ge.minConfig,Ue.minimumConfig,We.mirrorPadConfig,Ve.modConfig,qe.multinomialConfig,He.multiplyConfig,Ke.negConfig,Xe.nonMaxSuppressionV3Config,Ye.nonMaxSuppressionV4Config,Ze.nonMaxSuppressionV5Config,Qe.notEqualConfig,Je.oneHotConfig,et.onesLikeConfig,tt.packConfig,nt.padV2Config,st.powConfig,ot.preluConfig,rt.prodConfig,it.rangeConfig,at.realConfig,dt.reciprocalConfig,lt.reluConfig,ct.relu6Config,ft.reshapeConfig,pt.resizeBilinearConfig,mt.resizeBilinearGradConfig,ht.resizeNearestNeighborConfig,bt.resizeNearestNeighborGradConfig,jt.reverseConfig,gt.rotateWithOffsetConfig,wt.roundConfig,_t.rsqrtConfig,kt.scatterNdConfig,vt.selectConfig,xt.seluConfig,yt.sigmoidConfig,Ot.signConfig,It.sinConfig,Ct.sinhConfig,St.sliceConfig,Tt.softmaxConfig,Nt.softplusConfig,Et.spaceToBatchNDConfig,At.sparseFillEmptyRowsConfig,Rt.sparseReshapeConfig,Ft.sparseSegmentMeanConfig,Mt.sparseSegmentSumConfig,$t.sparseToDenseConfig,Dt.splitVConfig,Pt.sqrtConfig,Bt.squareConfig,Lt.squaredDifferenceConfig,zt.stepConfig,Gt.stridedSliceConfig,Ut.stringNGramsConfig,Wt.stringSplitConfig,Vt.stringToHashBucketFastConfig,qt.subConfig,Ht.sumConfig,Kt.tanConfig,Xt.tanhConfig,Yt.tileConfig,Zt.topKConfig,Jt.transposeConfig,Qt.transformConfig,en.uniqueConfig,tn.unpackConfig,nn.unsortedSegmentSumConfig,sn.zerosLikeConfig];for(const e of on)Object(s.registerKernel)(e)},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/shared.js": +/*!******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/shared.js ***! + \******************************************************************/ +/*! exports provided: simpleAbsImpl, addImpl, bincountImpl, bincountReduceImpl, ceilImpl, concatImpl, equalImpl, expImpl, expm1Impl, floorImpl, gatherNdImpl, gatherV2Impl, greaterImpl, greaterEqualImpl, lessImpl, lessEqualImpl, linSpaceImpl, logImpl, maxImpl, maximumImpl, minimumImpl, multiplyImpl, negImpl, notEqualImpl, prodImpl, rangeImpl, rsqrtImpl, sliceImpl, sparseFillEmptyRowsImpl, sparseReshapeImpl, sparseSegmentReductionImpl, squaredDifferenceImpl, stridedSliceImpl, stringNGramsImpl, stringSplitImpl, stringToHashBucketFastImpl, subImpl, tileImpl, topKImpl, transposeImpl, uniqueImpl */function(e,t,n){"use strict";n.r(t);var s=n(/*! ./kernels/Abs */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Abs.js");n.d(t,"simpleAbsImpl",(function(){return s.simpleAbsImpl}));var o=n(/*! ./kernels/Add */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Add.js");n.d(t,"addImpl",(function(){return o.addImpl}));var r=n(/*! ./kernels/Bincount_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Bincount_impl.js");n.d(t,"bincountImpl",(function(){return r.bincountImpl})),n.d(t,"bincountReduceImpl",(function(){return r.bincountReduceImpl}));var i=n(/*! ./kernels/Ceil */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Ceil.js");n.d(t,"ceilImpl",(function(){return i.ceilImpl}));var a=n(/*! ./kernels/Concat_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Concat_impl.js");n.d(t,"concatImpl",(function(){return a.concatImpl}));var u=n(/*! ./kernels/Equal */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Equal.js");n.d(t,"equalImpl",(function(){return u.equalImpl}));var d=n(/*! ./kernels/Exp */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Exp.js");n.d(t,"expImpl",(function(){return d.expImpl}));var l=n(/*! ./kernels/Expm1 */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Expm1.js");n.d(t,"expm1Impl",(function(){return l.expm1Impl}));var c=n(/*! ./kernels/Floor */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Floor.js");n.d(t,"floorImpl",(function(){return c.floorImpl}));var f=n(/*! ./kernels/GatherNd_Impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/GatherNd_Impl.js");n.d(t,"gatherNdImpl",(function(){return f.gatherNdImpl}));var p=n(/*! ./kernels/GatherV2_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/GatherV2_impl.js");n.d(t,"gatherV2Impl",(function(){return p.gatherV2Impl}));var m=n(/*! ./kernels/Greater */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Greater.js");n.d(t,"greaterImpl",(function(){return m.greaterImpl}));var h=n(/*! ./kernels/GreaterEqual */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/GreaterEqual.js");n.d(t,"greaterEqualImpl",(function(){return h.greaterEqualImpl}));var b=n(/*! ./kernels/Less */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Less.js");n.d(t,"lessImpl",(function(){return b.lessImpl}));var j=n(/*! ./kernels/LessEqual */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LessEqual.js");n.d(t,"lessEqualImpl",(function(){return j.lessEqualImpl}));var g=n(/*! ./kernels/LinSpace_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LinSpace_impl.js");n.d(t,"linSpaceImpl",(function(){return g.linSpaceImpl}));var w=n(/*! ./kernels/Log */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Log.js");n.d(t,"logImpl",(function(){return w.logImpl}));var _=n(/*! ./kernels/Max_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Max_impl.js");n.d(t,"maxImpl",(function(){return _.maxImpl}));var k=n(/*! ./kernels/Maximum */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Maximum.js");n.d(t,"maximumImpl",(function(){return k.maximumImpl}));var v=n(/*! ./kernels/Minimum */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Minimum.js");n.d(t,"minimumImpl",(function(){return v.minimumImpl}));var x=n(/*! ./kernels/Multiply */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Multiply.js");n.d(t,"multiplyImpl",(function(){return x.multiplyImpl}));var y=n(/*! ./kernels/Neg */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Neg.js");n.d(t,"negImpl",(function(){return y.negImpl}));var O=n(/*! ./kernels/NotEqual */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NotEqual.js");n.d(t,"notEqualImpl",(function(){return O.notEqualImpl}));var I=n(/*! ./kernels/Prod */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Prod.js");n.d(t,"prodImpl",(function(){return I.prodImpl}));var C=n(/*! ./kernels/Range_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Range_impl.js");n.d(t,"rangeImpl",(function(){return C.rangeImpl}));var S=n(/*! ./kernels/Rsqrt */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Rsqrt.js");n.d(t,"rsqrtImpl",(function(){return S.rsqrtImpl}));var T=n(/*! ./kernels/Slice */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Slice.js");n.d(t,"sliceImpl",(function(){return T.sliceImpl}));var N=n(/*! ./kernels/SparseFillEmptyRows_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SparseFillEmptyRows_impl.js");n.d(t,"sparseFillEmptyRowsImpl",(function(){return N.sparseFillEmptyRowsImpl}));var E=n(/*! ./kernels/SparseReshape_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SparseReshape_impl.js");n.d(t,"sparseReshapeImpl",(function(){return E.sparseReshapeImpl}));var A=n(/*! ./kernels/SparseSegmentReduction_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SparseSegmentReduction_impl.js");n.d(t,"sparseSegmentReductionImpl",(function(){return A.sparseSegmentReductionImpl}));var R=n(/*! ./kernels/SquaredDifference */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SquaredDifference.js");n.d(t,"squaredDifferenceImpl",(function(){return R.squaredDifferenceImpl}));var F=n(/*! ./kernels/StridedSlice_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StridedSlice_impl.js");n.d(t,"stridedSliceImpl",(function(){return F.stridedSliceImpl}));var M=n(/*! ./kernels/StringNGrams_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StringNGrams_impl.js");n.d(t,"stringNGramsImpl",(function(){return M.stringNGramsImpl}));var $=n(/*! ./kernels/StringSplit_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StringSplit_impl.js");n.d(t,"stringSplitImpl",(function(){return $.stringSplitImpl}));var D=n(/*! ./kernels/StringToHashBucketFast_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StringToHashBucketFast_impl.js");n.d(t,"stringToHashBucketFastImpl",(function(){return D.stringToHashBucketFastImpl}));var P=n(/*! ./kernels/Sub */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sub.js");n.d(t,"subImpl",(function(){return P.subImpl}));var B=n(/*! ./kernels/Tile_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Tile_impl.js");n.d(t,"tileImpl",(function(){return B.tileImpl}));var L=n(/*! ./kernels/TopK_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/TopK_impl.js");n.d(t,"topKImpl",(function(){return L.topKImpl}));var z=n(/*! ./kernels/Transpose_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Transpose_impl.js");n.d(t,"transposeImpl",(function(){return z.transposeImpl}));var G=n(/*! ./kernels/Unique_impl */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Unique_impl.js");n.d(t,"uniqueImpl",(function(){return G.uniqueImpl}))},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js ***! + \*****************************************************************************/ +/*! exports provided: createSimpleBinaryKernelImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"createSimpleBinaryKernelImpl",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */function o(e){return(t,n,o,r,i)=>{const a=s.backend_util.assertAndGetBroadcastShape(t,n),u=a.length,d=s.util.computeStrides(a),l=s.util.sizeFromShape(a),c=s.util.getTypedArrayFromDType(i,l),f=t.length,p=n.length,m=s.util.computeStrides(t),h=s.util.computeStrides(n),b=s.backend_util.getBroadcastDims(t,a),j=s.backend_util.getBroadcastDims(n,a);if(b.length+j.length===0)for(let t=0;ti[e]=0));const a=s.util.locToIndex(i,f,m),l=n.slice(-p);j.forEach((e=>l[e]=0));const g=s.util.locToIndex(l,p,h);c[t]=e(o[a],r[g])}return[c,a]}}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_utils.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_utils.js ***! + \******************************************************************************/ +/*! exports provided: binaryKernelFunc, createComplexBinaryKernelImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"binaryKernelFunc",(function(){return a})),n.d(t,"createComplexBinaryKernelImpl",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../cpu_util */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"),r=n(/*! ../kernels/Cast */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Cast.js"),i=n(/*! ../kernels/Complex */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Complex.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function a(e,t,n,a){return null==n?({inputs:n,backend:r})=>{const{a:i,b:u}=n,d=r;Object(o.assertNotComplex)([i,u],e);const l=d.data.get(i.dataId).values,c=d.data.get(u.dataId).values,f="string"===i.dtype?s.backend_util.fromUint8ToStringArray(l):l,p="string"===i.dtype?s.backend_util.fromUint8ToStringArray(c):c,m=a||i.dtype,[h,b]=t(i.shape,u.shape,f,p,m);return d.makeTensorInfo(b,m,h)}:({inputs:e,backend:s})=>{const{a:o,b:u}=e,d=s;if("complex64"===o.dtype||"complex64"===u.dtype){const e=Object(r.cast)({inputs:{x:o},backend:d,attrs:{dtype:"complex64"}}),t=d.data.get(e.dataId),s=t.complexTensorInfos.real,a=t.complexTensorInfos.imag,l=d.data.get(s.dataId).values,c=d.data.get(a.dataId).values,f=Object(r.cast)({inputs:{x:u},backend:d,attrs:{dtype:"complex64"}}),p=d.data.get(f.dataId),m=p.complexTensorInfos.real,h=p.complexTensorInfos.imag,b=d.data.get(m.dataId).values,j=d.data.get(h.dataId).values,[g,w,_]=n(o.shape,u.shape,l,c,b,j),k=d.makeTensorInfo(_,"float32",g),v=d.makeTensorInfo(_,"float32",w),x=Object(i.complex)({inputs:{real:k,imag:v},backend:d});return d.disposeIntermediateTensorInfo(e),d.disposeIntermediateTensorInfo(f),d.disposeIntermediateTensorInfo(k),d.disposeIntermediateTensorInfo(v),x}{const e=d.data.get(o.dataId).values,n=d.data.get(u.dataId).values,s=a||o.dtype,[r,i]=t(o.shape,u.shape,e,n,s);return d.makeTensorInfo(i,s,r)}}}function u(e){return(t,n,o,r,i,a)=>{const u=s.backend_util.assertAndGetBroadcastShape(t,n),d=s.util.sizeFromShape(u),l=u.length,c=s.util.computeStrides(u),f=s.util.getTypedArrayFromDType("float32",d),p=s.util.getTypedArrayFromDType("float32",d),m=s.backend_util.getBroadcastDims(t,u),h=s.backend_util.getBroadcastDims(n,u),b=s.backend_util.mergeRealAndImagArrays(o,r),j=s.backend_util.mergeRealAndImagArrays(i,a),g=t.length,w=s.util.computeStrides(t),_=n.length,k=s.util.computeStrides(n);if(m.length+h.length===0)for(let t=0;to[e]=0));const r=s.util.locToIndex(o,g,w),i=n.slice(-_);h.forEach((e=>i[e]=0));const a=s.util.locToIndex(i,_,k),u=e(b[2*r],b[2*r+1],j[2*a],j[2*a+1]);f[t]=u.real,p[t]=u.imag}return[f,p,u]}}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/fft_utils.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/fft_utils.js ***! + \***************************************************************************/ +/*! exports provided: fftBatch, fftImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"fftBatch",(function(){return m})),n.d(t,"fftImpl",(function(){return h}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernels/Add */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Add.js"),r=n(/*! ../kernels/Complex */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Complex.js"),i=n(/*! ../kernels/Concat */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Concat.js"),a=n(/*! ../kernels/Identity */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Identity.js"),u=n(/*! ../kernels/Imag */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Imag.js"),d=n(/*! ../kernels/Multiply */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Multiply.js"),l=n(/*! ../kernels/Real */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Real.js"),c=n(/*! ../kernels/RealDiv */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/RealDiv.js"),f=n(/*! ../kernels/Slice */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Slice.js"),p=n(/*! ../kernels/Sub */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sub.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function m(e,t,n){const o=e.shape,i=o[0],a=o[1],u=n.data.get(e.dataId),d=u.complexTensorInfos.real,l=u.complexTensorInfos.imag,c=[i,a],p=s.util.sizeFromShape(c),m=s.util.getTypedArrayFromDType("float32",p),b=s.util.getTypedArrayFromDType("float32",p);for(let e=0;eb?b=s:"avg"===i&&(g+=s,w++)}if(isNaN(b))break}j[x+n*_+t]="avg"===i?g/w:b}}}return b}function r(e,t,n,o,r=!1,i=!1){const a=Object(s.buffer)(o.outShape,"int32"),u=o.strideHeight,d=o.strideWidth,l=o.dilationHeight,c=o.dilationWidth,f=o.effectiveFilterHeight,p=o.effectiveFilterWidth,m=o.padInfo.top,h=o.padInfo.left,b=Object(s.buffer)(t,n,e);for(let e=0;e_&&(_=d,k=r?i?((e*o.inHeight+n)*o.inWidth+s)*o.inChannels+t:(n*o.inWidth+s)*o.inChannels+t:a*p+u)}}a.set(k,e,n,u,t)}}return a}function i(e,t,n,o,r,i){const a=r.strideDepth,u=r.strideHeight,d=r.strideWidth,l=r.dilationDepth,c=r.dilationHeight,f=r.dilationWidth,p=r.effectiveFilterDepth,m=r.effectiveFilterHeight,h=r.effectiveFilterWidth,b=r.padInfo.front,j=r.padInfo.top,g=r.padInfo.left,w="max"===i?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,_=Object(s.buffer)(r.outShape,n),k=_.values,v=r.outShape[1]*r.outShape[2]*r.outShape[3]*r.outShape[4],x=r.outShape[2]*r.outShape[3]*r.outShape[4],y=r.outShape[3]*r.outShape[4],O=r.outShape[4];for(let t=0;tv?v=r:"avg"===i&&(x+=r,y++),isNaN(v))break}if(isNaN(v))break}if(isNaN(v))break}k[j+t]="avg"===i?x/y:v}}}}return _}function a(e,t){const n=Object(s.buffer)(t.outShape,"int32"),o=t.strideDepth,r=t.strideHeight,i=t.strideWidth,a=t.dilationDepth,u=t.dilationHeight,d=t.dilationWidth,l=t.effectiveFilterDepth,c=t.effectiveFilterHeight,f=t.effectiveFilterWidth,p=t.padInfo.front,m=t.padInfo.top,h=t.padInfo.left;for(let s=0;s=y&&(y=u,O=n*c*f+r*c+a)}}}n.set(O,s,j,o,r,b)}}}return n}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_impl.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_impl.js ***! + \****************************************************************************/ +/*! exports provided: createSimpleUnaryImpl */function(e,t,n){"use strict";n.r(t),n.d(t,"createSimpleUnaryImpl",(function(){return o}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */function o(e){return(t,n,o)=>{const r=s.util.getTypedArrayFromDType(n,t.length);for(let n=0;n{const{x:u}=r;if(Object(o.assertNotComplex)(u,e),"string"===u.dtype||"string"===n)throw new Error("unaryKernelFunc does not support string input/output");const d=a,l=d.data.get(u.dataId).values,c=s.util.sizeFromShape(u.shape),f=n||u.dtype,p=s.util.getArrayFromDType(f,c);for(let e=0;e{const{x:a}=s;if(Object(o.assertNotComplex)(a,e),"string"===a.dtype||"string"===n)throw new Error("unaryKernelFunc does not support string input/output");const u=i,d=u.data.get(a.dataId).values,l=n||a.dtype,c=t(d,l,r);return u.makeTensorInfo(a.shape,l,c)}}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/zeros_impl.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/zeros_impl.js ***! + \****************************************************************************/ +/*! exports provided: zeros */function(e,t,n){"use strict";n.r(t),n.d(t,"zeros",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernels/Complex */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Complex.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e,t,n="float32"){if("complex64"===n){const n=r(e,t,"float32"),s=r(e,t,"float32");return Object(o.complex)({inputs:{real:n,imag:s},backend:e})}const i=s.util.makeZerosTypedArray(s.util.sizeFromShape(t),n);return e.makeTensorInfo(t,n,i)}},"./node_modules/@tensorflow/tfjs-backend-cpu/dist/version.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/version.js ***! + \*******************************************************************/ +/*! exports provided: version */function(e,t,n){"use strict";n.r(t),n.d(t,"version",(function(){return s})); +/** @license See the LICENSE file. */ +const s="3.8.0"},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/backend_wasm.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/backend_wasm.js ***! + \*************************************************************************/ +/*! exports provided: BackendWasm, init, setWasmPath, setWasmPaths, resetWasmPath */function(e,t,n){"use strict";n.r(t),n.d(t,"BackendWasm",(function(){return d})),n.d(t,"init",(function(){return c})),n.d(t,"setWasmPath",(function(){return g})),n.d(t,"setWasmPaths",(function(){return w})),n.d(t,"resetWasmPath",(function(){return _}));n(/*! ./flags_wasm */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/flags_wasm.js");var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../wasm-out/tfjs-backend-wasm-threaded-simd.js */"./node_modules/@tensorflow/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm-threaded-simd.js"),r=n.n(o),i=n(/*! ../wasm-out/tfjs-backend-wasm-threaded-simd.worker.js */"./node_modules/@tensorflow/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm-threaded-simd.worker.js"),a=n(/*! ../wasm-out/tfjs-backend-wasm.js */"./node_modules/@tensorflow/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm.js"),u=n.n(a); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class d extends s.KernelBackend{constructor(e){super(),this.wasm=e,this.dataIdNextNumber=1,this.wasm.tfjs.init(),this.dataIdMap=new s.DataStorage(this,Object(s.engine)())}write(e,t,n){const s={id:this.dataIdNextNumber++};return this.move(s,e,t,n,1),s}numDataIds(){return this.dataIdMap.numDataIds()}async time(e){const t=s.util.now();e();return{kernelMs:s.util.now()-t}}move(e,t,n,o,r){const i=this.dataIdNextNumber++;if("string"===o){const s=t;return void this.dataIdMap.set(e,{id:i,stringBytes:s,shape:n,dtype:o,memoryOffset:null,refCount:r})}const a=s.util.sizeFromShape(n),u=a*s.util.bytesPerElement(o),d=this.wasm._malloc(u);this.dataIdMap.set(e,{id:i,memoryOffset:d,shape:n,dtype:o,refCount:r}),this.wasm.tfjs.registerTensor(i,a,d),null!=t&&this.wasm.HEAPU8.set(new Uint8Array(t.buffer,t.byteOffset,u),d)}async read(e){return this.readSync(e)}readSync(e){const{memoryOffset:t,dtype:n,shape:o,stringBytes:r}=this.dataIdMap.get(e);if("string"===n)return r;return function(e,t){switch(t){case"float32":return new Float32Array(e);case"int32":return new Int32Array(e);case"bool":return new Uint8Array(e);default:throw new Error(`Unknown dtype ${t}`)}}(this.wasm.HEAPU8.slice(t,t+s.util.sizeFromShape(o)*s.util.bytesPerElement(n)).buffer,n)}disposeData(e,t=!1){if(this.dataIdMap.has(e)){const n=this.dataIdMap.get(e);if(n.refCount--,!t&&n.refCount>0)return!1;this.wasm._free(n.memoryOffset),this.wasm.tfjs.disposeData(n.id),this.dataIdMap.delete(e)}return!0}refCount(e){if(this.dataIdMap.has(e)){return this.dataIdMap.get(e).refCount}return 0}incRef(e){const t=this.dataIdMap.get(e);null!=t&&t.refCount++}floatPrecision(){return 32}getMemoryOffset(e){return this.dataIdMap.get(e).memoryOffset}dispose(){this.wasm.tfjs.dispose(),"PThread"in this.wasm&&this.wasm.PThread.terminateAllThreads(),this.wasm=null}memory(){return{unreliable:!1}}makeOutput(e,t,n){let o;if(null==n)o=this.write(null,e,t);else{const r=this.dataIdNextNumber++;o={id:r},this.dataIdMap.set(o,{id:r,memoryOffset:n,shape:e,dtype:t,refCount:1});const i=s.util.sizeFromShape(e);this.wasm.tfjs.registerTensor(r,i,n)}return{dataId:o,shape:e,dtype:t}}typedArrayFromHeap({shape:e,dtype:t,dataId:n}){const o=this.wasm.HEAPU8.buffer,{memoryOffset:r}=this.dataIdMap.get(n),i=s.util.sizeFromShape(e);switch(t){case"float32":return new Float32Array(o,r,i);case"int32":return new Int32Array(o,r,i);case"bool":return new Uint8Array(o,r,i);default:throw new Error(`Unknown dtype ${t}`)}}}function l(e,t,n){if(null!=p)return p;let s="tfjs-backend-wasm.wasm";return e&&t?s="tfjs-backend-wasm-threaded-simd.wasm":e&&(s="tfjs-backend-wasm-simd.wasm"),null!=h&&null!=h[s]?h[s]:n+s}async function c(){const[e,t]=await Promise.all([Object(s.env)().getAsync("WASM_HAS_SIMD_SUPPORT"),Object(s.env)().getAsync("WASM_HAS_MULTITHREAD_SUPPORT")]);return new Promise(((n,o)=>{const a={};var d;a.locateFile=(n,s)=>{if(n.endsWith(".worker.js")){const e=i.wasmWorkerContents,t=new Blob([e],{type:"application/javascript"});return URL.createObjectURL(t)}return n.endsWith(".wasm")?l(e,t,null!=m?m:s):s+n},j&&(a.instantiateWasm=(d=l(e,t,null!=m?m:""),(e,t)=>(s.util.fetch(d,{credentials:"same-origin"}).then((n=>{n.ok||e.env.a(`failed to load wasm binary file at '${d}'`),n.arrayBuffer().then((n=>{WebAssembly.instantiate(n,e).then((e=>{t(e.instance,e.module)}))}))})),{})));let c,f=!1;a.onAbort=()=>{if(f)return;if(b)return;b=!0;o({message:"Make sure the server can serve the `.wasm` file relative to the bundled js file. For more details see https://github.com/tensorflow/tfjs/blob/master/tfjs-backend-wasm/README.md#using-bundlers"})},t&&e&&null==p?(a.mainScriptUrlOrBlob=new Blob(["var WasmBackendModuleThreadedSimd = "+r.a.toString()],{type:"text/javascript"}),c=r()(a)):c=u()(a),c.then((e=>{f=!0,b=!1;e.tfjs={init:e.cwrap("init",null,[]),registerTensor:e.cwrap("register_tensor",null,["number","number","number"]),disposeData:e.cwrap("dispose_data",null,["number"]),dispose:e.cwrap("dispose",null,[])},n({wasm:e})}))}))}const f=["tfjs-backend-wasm.wasm","tfjs-backend-wasm-simd.wasm","tfjs-backend-wasm-threaded-simd.wasm"];let p=null,m=null,h={},b=!1,j=!1;function g(e,t=!1){if(Object(s.deprecationWarn)("setWasmPath has been deprecated in favor of setWasmPaths and will be removed in a future release."),b)throw new Error("The WASM backend was already initialized. Make sure you call `setWasmPath()` before you call `tf.setBackend()` or `tf.ready()`");p=e,j=t}function w(e,t=!1){if(b)throw new Error("The WASM backend was already initialized. Make sure you call `setWasmPaths()` before you call `tf.setBackend()` or `tf.ready()`");if("string"==typeof e)m=e;else{h=e;const t=f.filter((e=>null==h[e]));if(t.length>0)throw new Error(`There were no entries found for the following binaries: ${t.join(",")}. Please either call setWasmPaths with a map providing a path for each binary, or with a string indicating the directory where all the binaries can be found.`)}j=t}function _(){p=null,m=null,h={},j=!1,b=!1}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/base.js": +/*!*****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/base.js ***! + \*****************************************************************/ +/*! exports provided: BackendWasm, setWasmPath, setWasmPaths, version_wasm */function(e,t,n){"use strict";n.r(t);n(/*! ./flags_wasm */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/flags_wasm.js");var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./backend_wasm */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/backend_wasm.js");n.d(t,"BackendWasm",(function(){return o.BackendWasm})),n.d(t,"setWasmPath",(function(){return o.setWasmPath})),n.d(t,"setWasmPaths",(function(){return o.setWasmPaths}));var r=n(/*! ./version */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/version.js");n.d(t,"version_wasm",(function(){return r.version}));Object(s.registerBackend)("wasm",(async()=>{const{wasm:e}=await Object(o.init)();return new o.BackendWasm(e)}),2)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/flags_wasm.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/flags_wasm.js ***! + \***********************************************************************/ +/*! no exports provided */function(e,t,n){"use strict";n.r(t);var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */const o=Object(s.env)();o.registerFlag("WASM_HAS_SIMD_SUPPORT",(async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,9,1,7,0,65,0,253,15,26,11])))),o.registerFlag("WASM_HAS_MULTITHREAD_SUPPORT",(async()=>{if(o.get("IS_NODE"))return!1;try{return(new MessageChannel).port1.postMessage(new SharedArrayBuffer(1)),WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,5,4,1,3,1,1,10,11,1,9,0,65,0,254,16,2,0,26,11]))}catch(e){return!1}}))},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/index.js": +/*!******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/index.js ***! + \******************************************************************/ +/*! exports provided: BackendWasm, setWasmPath, setWasmPaths, version_wasm */function(e,t,n){"use strict";n.r(t);n(/*! ./register_all_kernels */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/register_all_kernels.js");var s=n(/*! ./base */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/base.js");n.d(t,"BackendWasm",(function(){return s.BackendWasm})),n.d(t,"setWasmPath",(function(){return s.setWasmPath})),n.d(t,"setWasmPaths",(function(){return s.setWasmPaths})),n.d(t,"version_wasm",(function(){return s.version_wasm}))},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernel_utils/shared.js": +/*!********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernel_utils/shared.js ***! + \********************************************************************************/ +/*! exports provided: concatImplCPU, rangeImplCPU, sliceImplCPU */function(e,t,n){"use strict";n.r(t);var s=n(/*! @tensorflow/tfjs-backend-cpu/dist/shared */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/shared.js");n.d(t,"concatImplCPU",(function(){return s.concatImpl})),n.d(t,"sliceImplCPU",(function(){return s.sliceImpl})),n.d(t,"rangeImplCPU",(function(){return s.rangeImpl}))},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Abs.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Abs.js ***! + \************************************************************************/ +/*! exports provided: absConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"absConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./unary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/unary_kernel.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.createUnaryKernelConfig)(s.Abs)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Add.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Add.js ***! + \************************************************************************/ +/*! exports provided: addConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"addConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./binary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.createBinaryKernelConfig)(s.Add,!0)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/AddN.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/AddN.js ***! + \*************************************************************************/ +/*! exports provided: addNConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"addNConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./types */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/types.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +let r;const i={kernelName:s.AddN,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s.AddN,null,["array","number","number","number"])},kernelFunc:function(e){const{inputs:t,backend:n}=e,i=n.makeOutput(t[0].shape,t[0].dtype);if(0===s.util.sizeFromShape(i.shape))return i;const a=t.map((e=>n.dataIdMap.get(e.dataId).id)),u=new Uint8Array(new Int32Array(a).buffer),d=n.dataIdMap.get(i.dataId).id;return r(u,a.length,o.CppDType[i.dtype],d),i}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/All.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/All.js ***! + \************************************************************************/ +/*! exports provided: allConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"allConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./kernel_utils */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/kernel_utils.js"); +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +let r;const i={kernelName:s.All,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s.All,null,["number, number, number"])},kernelFunc:function(e){const{backend:t,inputs:n,attrs:i}=e,{axis:a,keepDims:u}=i,{x:d}=n;let l=t.dataIdMap.get(d.dataId).id,c=d;const{transposed:f,axes:p,originalAxes:m,inputWasTransposed:h}=Object(o.permuteAxesAndTranspose)(d,a,t);if(h){c=f,l=t.dataIdMap.get(f.dataId).id}const b=c.shape.length;s.backend_util.assertAxesAreInnerMostDims("all",p,b);const[j,g]=s.backend_util.computeOutAndReduceShapes(c.shape,p),w=s.util.sizeFromShape(g),_=t.makeOutput(j,d.dtype);if(0!==s.util.sizeFromShape(c.shape)){const e=t.dataIdMap.get(_.dataId).id;r(l,w,e)}if(h&&t.disposeData(f.dataId),u){const e=s.backend_util.expandShapeToKeepDim(_.shape,m);_.shape=e}return _}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Any.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Any.js ***! + \************************************************************************/ +/*! exports provided: anyConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"anyConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./kernel_utils */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/kernel_utils.js"); +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +let r;const i={kernelName:s.Any,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s.Any,null,["number, number, number"])},kernelFunc:function(e){const{backend:t,inputs:n,attrs:i}=e,{axis:a,keepDims:u}=i,{x:d}=n;let l=t.dataIdMap.get(d.dataId).id,c=d;const{transposed:f,axes:p,originalAxes:m,inputWasTransposed:h}=Object(o.permuteAxesAndTranspose)(d,a,t);if(h){c=f,l=t.dataIdMap.get(f.dataId).id}const b=c.shape.length;s.backend_util.assertAxesAreInnerMostDims("any",p,b);const[j,g]=s.backend_util.computeOutAndReduceShapes(c.shape,p),w=s.util.sizeFromShape(g),_=t.makeOutput(j,d.dtype);if(0!==s.util.sizeFromShape(c.shape)){const e=t.dataIdMap.get(_.dataId).id;r(l,w,e)}if(h&&t.disposeData(f.dataId),u){const e=s.backend_util.expandShapeToKeepDim(_.shape,m);_.shape=e}return _}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/ArgMax.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/ArgMax.js ***! + \***************************************************************************/ +/*! exports provided: argMaxConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"argMaxConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./kernel_utils */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/kernel_utils.js"),r=n(/*! ./types */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/types.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +let i;const a={kernelName:s.ArgMax,backendName:"wasm",kernelFunc:function(e){const{backend:t,inputs:n,attrs:a}=e,{axis:u}=a,{x:d}=n,l=t.dataIdMap.get(d.dataId).id;let c=l,f=d;const{transposed:p,axes:m,inputWasTransposed:h}=Object(o.permuteAxesAndTranspose)(d,u,t);if(h){const e=t.dataIdMap.get(p.dataId).id;e!==l&&(f=p,c=e)}const b=f.shape.slice(0,-1),j=t.makeOutput(b,"int32"),g=t.dataIdMap.get(j.dataId).id,w=s.util.sizeFromShape(j.shape),_=f.shape[m[0]];return i(c,r.CppDType[f.dtype],w,_,g),h&&t.disposeData(p.dataId),j},setupFunc:function(e){i=e.wasm.cwrap(s.ArgMax,null,["number","number","number","number","number"])}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/AvgPool.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/AvgPool.js ***! + \****************************************************************************/ +/*! exports provided: avgPoolConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"avgPoolConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */let o;const r={kernelName:s.AvgPool,backendName:"wasm",setupFunc:function(e){o=e.wasm.cwrap(s.AvgPool,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number"])},kernelFunc:function(e){const{inputs:t,attrs:n,backend:r}=e,i=t.x,a=r.dataIdMap.get(i.dataId).id,{filterSize:u,strides:d,pad:l,dimRoundingMode:c}=n,f=s.backend_util.computePool2DInfo(i.shape,u,d,1,l,c),p=f.filterHeight,m=f.filterWidth,h=f.padInfo.top,b=f.padInfo.right,j=f.padInfo.bottom,g=f.padInfo.left,w=f.strideHeight,_=f.strideWidth,k=f.inChannels;if("channelsLast"!==f.dataFormat)throw new Error(`wasm backend does not support dataFormat:'${f.dataFormat}'. Please use 'channelsLast'.`);if(1!==f.dilationWidth||1!==f.dilationHeight)throw new Error(`was backend only supports average pooling with dilation = [1, 1], got [${f.dilationHeight}, ${f.dilationWidth}].`);const v=r.makeOutput(f.outShape,"float32"),x=r.dataIdMap.get(v.dataId).id;return o(a,i.shape[0],i.shape[1],i.shape[2],p,m,h,b,j,g,w,_,k,x),v}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/BatchMatMul.js": +/*!********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/BatchMatMul.js ***! + \********************************************************************************/ +/*! exports provided: batchMatMulConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"batchMatMulConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Reshape.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +let r;const i={kernelName:s.BatchMatMul,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s.BatchMatMul,null,["number","array","number","number","array","number","number","number","number"])},kernelFunc:function(e){const{inputs:t,backend:n,attrs:i}=e,{a:a,b:u}=t,{transposeA:d,transposeB:l}=i;if("float32"!==a.dtype||"float32"!==u.dtype)throw new Error("BatchMatMul for non non-float32 tensors not yet supported.");const c=a.shape.length,f=u.shape.length,p=d?a.shape[c-2]:a.shape[c-1],m=l?u.shape[f-1]:u.shape[f-2],h=d?a.shape[c-1]:a.shape[c-2],b=l?u.shape[f-2]:u.shape[f-1],j=a.shape.slice(0,-2),g=u.shape.slice(0,-2),w=s.util.sizeFromShape(j),_=s.util.sizeFromShape(g),k=w===_||1===w||1===_;s.util.assert(c>=2&&f>=2&&k,(()=>`Error in matMul: the input batch dimensions must either be the same or at least one input batch dimension must be 1. Got input batch dimensions of (${j}) and (${g}).`));const v=(w>_?a.shape.slice(0,-2):u.shape.slice(0,-2)).concat([h,b]);s.util.assert(p===m,(()=>`Error in matMul: inner shapes (${p}) and (${m}) of Tensors with shapes ${a.shape} and ${u.shape} and transposeA=${d} and transposeB=${l} must match.`));const x=d?[w,p,h]:[w,h,p],y=l?[_,b,m]:[_,m,b],O=Object(o.reshape)({inputs:{x:a},backend:n,attrs:{shape:x}}),I=Object(o.reshape)({inputs:{x:u},backend:n,attrs:{shape:y}}),C=n.dataIdMap.get(O.dataId).id,S=n.dataIdMap.get(I.dataId).id,T=d?O.shape[2]:O.shape[1],N=l?I.shape[1]:I.shape[2],E=Math.max(w,_),A=n.makeOutput([E,T,N],O.dtype),R=n.dataIdMap.get(A.dataId).id,F=new Uint8Array(new Int32Array(O.shape).buffer),M=new Uint8Array(new Int32Array(I.shape).buffer);return r(C,F,O.shape.length,S,M,I.shape.length,d,l,R),n.disposeData(O.dataId),n.disposeData(I.dataId),A.shape=v,A}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/BatchToSpaceND.js": +/*!***********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/BatchToSpaceND.js ***! + \***********************************************************************************/ +/*! exports provided: batchToSpaceNDConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"batchToSpaceNDConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Reshape.js"),r=n(/*! ./Slice */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Slice.js"),i=n(/*! ./Transpose */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Transpose.js");const a={kernelName:s.BatchToSpaceND,backendName:"wasm",kernelFunc: +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){const{inputs:t,backend:n,attrs:a}=e,{x:u}=t,{blockShape:d,crops:l}=a,c=d.reduce(((e,t)=>e*t)),f=s.backend_util.getReshaped(u.shape,d,c),p=s.backend_util.getPermuted(f.length,d.length),m=s.backend_util.getReshapedPermuted(u.shape,d,c),h=s.backend_util.getSliceBeginCoords(l,d.length),b=s.backend_util.getSliceSize(m,l,d.length),j=Object(o.reshape)({inputs:{x:u},backend:n,attrs:{shape:f}}),g=Object(i.transpose)({inputs:{x:j},backend:n,attrs:{perm:p}}),w=Object(o.reshape)({inputs:{x:g},backend:n,attrs:{shape:m}}),_=Object(r.slice)({inputs:{x:w},backend:n,attrs:{begin:h,size:b}});return n.disposeData(j.dataId),n.disposeData(g.dataId),n.disposeData(j.dataId),_}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Cast.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Cast.js ***! + \*************************************************************************/ +/*! exports provided: cast, castConfig */function(e,t,n){"use strict"; +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function s(e){const{inputs:{x:t},attrs:{dtype:n},backend:s}=e,o=s.makeOutput(t.shape,n),r=s.typedArrayFromHeap(t);return s.typedArrayFromHeap(o).set(r),o}n.r(t),n.d(t,"cast",(function(){return s})),n.d(t,"castConfig",(function(){return o}));const o={kernelName:n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js").Cast,backendName:"wasm",kernelFunc:s}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Ceil.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Ceil.js ***! + \*************************************************************************/ +/*! exports provided: ceilConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"ceilConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./unary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/unary_kernel.js"); +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.createUnaryKernelConfig)(s.Ceil)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/ClipByValue.js": +/*!********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/ClipByValue.js ***! + \********************************************************************************/ +/*! exports provided: clipByValueConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"clipByValueConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */let o;const r={kernelName:s.ClipByValue,backendName:"wasm",setupFunc:function(e){o=e.wasm.cwrap(s.ClipByValue,null,["number","number","number","number"])},kernelFunc:function(e){const{inputs:t,backend:n,attrs:s}=e,{x:r}=t,{clipValueMin:i,clipValueMax:a}=s,u=n.dataIdMap.get(r.dataId).id,d=n.makeOutput(r.shape,r.dtype),l=n.dataIdMap.get(d.dataId).id;return o(u,i,a,l),d}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Concat.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Concat.js ***! + \***************************************************************************/ +/*! exports provided: concat, concatConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"concat",(function(){return a})),n.d(t,"concatConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernel_utils/shared.js"),r=n(/*! ./Identity */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Identity.js"),i=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Reshape.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function a(e){const{inputs:t,backend:n}=e,a=s.util.parseAxisParam(e.attrs.axis,t[0].shape)[0];let u=s.backend_util.computeOutShape(t.map((e=>e.shape)),a);const d=t.filter((e=>s.util.sizeFromShape(e.shape)>0));if(1===d.length)return Object(r.identity)({inputs:{x:d[0]},backend:n});const l=n.makeOutput(u,t[0].dtype);if(0===s.util.sizeFromShape(u))return l;const c=d.map((e=>e.shape));if(s.backend_util.assertParamsConsistent(c,a),"string"===d[0].dtype){const e=d.map((e=>{const t=[-1,s.util.sizeFromShape(e.shape.slice(a))];return Object(i.reshape)({inputs:{x:e},backend:n,attrs:{shape:t}})})),r=e.map((e=>({vals:n.readSync(e.dataId),shape:e.shape})));u=s.backend_util.computeOutShape(e.map((e=>e.shape)),1);const c=1===e[0].shape[0],f=Object(o.concatImplCPU)(r,u,t[0].dtype,c),p=s.backend_util.computeOutShape(d.map((e=>e.shape)),a);l.shape=p;return n.dataIdMap.get(l.dataId).stringBytes=s.backend_util.fromStringArrayToUint8(f),e.forEach((e=>n.disposeData(e.dataId))),l}const f=s.util.sizeFromShape(d[0].shape.slice(0,a));let p=0;const m=d.map((e=>{const t=s.util.sizeFromShape(e.shape.slice(a));return p+=t,t})),h=d.map((e=>n.typedArrayFromHeap(e))),b=n.typedArrayFromHeap(l);for(let e=0;e`cumsum does not support ${u.dtype} tensors in the WASM backend`));const p=s.backend_util.getAxesPermutation([d],f);let m=u;null!==p&&(m=Object(r.transpose)({inputs:{x:u},attrs:{perm:p},backend:n}));const h=s.backend_util.getInnerMostAxes(1,f)[0];s.backend_util.assertAxesAreInnerMostDims("cumsum",[h],f);const b=n.makeOutput(m.shape,m.dtype),j=m.shape[h],g=n.dataIdMap.get(m.dataId).id,w=n.dataIdMap.get(b.dataId).id;i(g,l?1:0,c?1:0,j,w,o.CppDType[u.dtype]);let _=b;if(null!==p){const e=s.backend_util.getUndoAxesPermutation(p);_=Object(r.transpose)({inputs:{x:b},attrs:{perm:e},backend:n}),n.disposeData(m.dataId),n.disposeData(b.dataId)}return _}const u={kernelName:s.Cumsum,backendName:"wasm",setupFunc:function(e){i=e.wasm.cwrap(s.Cumsum,null,["number","number","number","number","number","number"])},kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/DepthToSpace.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/DepthToSpace.js ***! + \*********************************************************************************/ +/*! exports provided: depthToSpace, depthToSpaceConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"depthToSpace",(function(){return r})),n.d(t,"depthToSpaceConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */let o;function r(e){const{backend:t,inputs:n,attrs:r}=e,{x:i}=n,{blockSize:a,dataFormat:u}=r;s.util.assert(a>1,(()=>`blockSize should be > 1 for depthToSpace, but was: ${a}`));const d=i.shape[0],l="NHWC"===u?i.shape[1]:i.shape[2],c="NHWC"===u?i.shape[2]:i.shape[3],f="NHWC"===u?i.shape[3]:i.shape[1],p=l*a,m=c*a,h=f/(a*a),b="NHWC"===u?[d,p,m,h]:[d,h,p,m],j=t.makeOutput(b,"float32"),g=t.dataIdMap.get(i.dataId).id,w=new Uint8Array(new Int32Array(s.util.computeStrides(i.shape)).buffer),_=new Uint8Array(new Int32Array(b).buffer),k=new Uint8Array(new Int32Array(s.util.computeStrides(b)).buffer),v=t.dataIdMap.get(j.dataId).id;return o(g,a,"NHWC"===u?1:0,w,i.shape.length-1,_,k,b.length,v),j}const i={kernelName:s.DepthToSpace,backendName:"wasm",setupFunc:function(e){o=e.wasm.cwrap(s.DepthToSpace,null,["number","number","number","array","number","array","array","number","number"])},kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/DepthwiseConv2dNative.js": +/*!******************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/DepthwiseConv2dNative.js ***! + \******************************************************************************************/ +/*! exports provided: depthwiseConv2dNativeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"depthwiseConv2dNativeConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */let o;const r={kernelName:s.DepthwiseConv2dNative,backendName:"wasm",setupFunc:function(e){o=e.wasm.cwrap(s.DepthwiseConv2dNative,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])},kernelFunc:function(e){const{inputs:t,attrs:n,backend:r}=e,{x:i,filter:a}=t,u=r.dataIdMap.get(i.dataId).id,d=r.dataIdMap.get(a.dataId).id,{strides:l,dilations:c,pad:f,dimRoundingMode:p}=n,m=null==c?[1,1]:c,h=s.backend_util.computeConv2DInfo(i.shape,a.shape,l,m,f,p,!0),b=h.filterHeight,j=h.filterWidth,g=h.padInfo.top,w=h.padInfo.right,_=h.padInfo.bottom,k=h.padInfo.left,v=h.dilationHeight,x=h.dilationWidth,y=h.strideHeight,O=h.strideWidth,I=h.inChannels,C=h.outChannels,S="SAME"===h.padInfo.type?1:0;if("channelsLast"!==h.dataFormat)throw new Error(`wasm backend DepthwiseConv2dNative does not support dataFormat:'${h.dataFormat}'. Please use 'channelsLast'.`);const T=r.makeOutput(h.outShape,"float32"),N=r.dataIdMap.get(T.dataId).id;return o(u,i.shape[0],i.shape[1],i.shape[2],d,b,j,g,w,_,k,S,v,x,y,O,I,C,N),T}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Equal.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Equal.js ***! + \**************************************************************************/ +/*! exports provided: equalConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"equalConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./binary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.createBinaryKernelConfig)(s.Equal,!1,"bool")},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Exp.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Exp.js ***! + \************************************************************************/ +/*! exports provided: expConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"expConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./unary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/unary_kernel.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.createUnaryKernelConfig)(s.Exp)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/ExpandDims.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/ExpandDims.js ***! + \*******************************************************************************/ +/*! exports provided: expandDims, expandDimsConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"expandDims",(function(){return r})),n.d(t,"expandDimsConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Reshape.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:t,attrs:n,backend:r}=e,{input:i}=t,{dim:a}=n,u=i.shape.length,d=i.shape.slice();let l=a;return a<0&&(s.util.assert(-(u+1)<=a,(()=>`Axis must be in the interval [${-(u+1)}, ${u}]`)),l=u+a+1),d.splice(l,0,1),Object(o.reshape)({inputs:{x:i},backend:r,attrs:{shape:d}})}const i={kernelName:s.ExpandDims,backendName:"wasm",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Fill.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Fill.js ***! + \*************************************************************************/ +/*! exports provided: fillConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"fillConfig",(function(){return s}));const s={kernelName:n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js").Fill,backendName:"wasm",kernelFunc: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){const{attrs:{shape:t,value:n,dtype:s},backend:o}=e,r=o.makeOutput(t,s);return o.typedArrayFromHeap(r).fill(n),r}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/FlipLeftRight.js": +/*!**********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/FlipLeftRight.js ***! + \**********************************************************************************/ +/*! exports provided: flipLeftRight, flipLeftRightConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"flipLeftRight",(function(){return r})),n.d(t,"flipLeftRightConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */let o;function r(e){const{inputs:t,backend:n}=e,{image:s}=t,r=n.makeOutput(s.shape,s.dtype),i=n.dataIdMap.get(s.dataId).id,a=n.dataIdMap.get(r.dataId).id,[u,d,l,c]=s.shape;return o(i,u,d,l,c,a),r}const i={kernelName:s.FlipLeftRight,backendName:"wasm",kernelFunc:r,setupFunc:function(e){o=e.wasm.cwrap(s.FlipLeftRight,null,["number","number","number","number","number","number"])}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Floor.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Floor.js ***! + \**************************************************************************/ +/*! exports provided: floorConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"floorConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./unary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/unary_kernel.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.createUnaryKernelConfig)(s.Floor)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/FloorDiv.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/FloorDiv.js ***! + \*****************************************************************************/ +/*! exports provided: floorDivConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"floorDivConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./binary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.createBinaryKernelConfig)(s.FloorDiv,!1)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/FusedBatchNorm.js": +/*!***********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/FusedBatchNorm.js ***! + \***********************************************************************************/ +/*! exports provided: fusedBatchNormConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"fusedBatchNormConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */let o;const r={kernelName:s.FusedBatchNorm,backendName:"wasm",setupFunc:function(e){o=e.wasm.cwrap(s.FusedBatchNorm,null,["number","number","number","number","number","number","number"])},kernelFunc:function(e){const{backend:t,inputs:n,attrs:r}=e,{varianceEpsilon:i}=r,{x:a,mean:u,variance:d,offset:l,scale:c}=n,f=t.dataIdMap.get(a.dataId).id,p=t.dataIdMap.get(u.dataId).id,m=t.dataIdMap.get(d.dataId).id,h=null!=l?t.dataIdMap.get(l.dataId).id:0,b=null!=c?t.dataIdMap.get(c.dataId).id:0,j=t.makeOutput(a.shape,a.dtype);if(0===s.util.sizeFromShape(a.shape))return j;const g=t.dataIdMap.get(j.dataId).id;return o(f,p,m,h,b,i,g),j}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/FusedConv2D.js": +/*!********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/FusedConv2D.js ***! + \********************************************************************************/ +/*! exports provided: fusedConv2DConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"fusedConv2DConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./types */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/types.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +let r;const i={kernelName:s.FusedConv2D,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s.FusedConv2D,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])},kernelFunc:function(e){const{inputs:t,attrs:n,backend:i}=e,{x:a,filter:u,bias:d,preluActivationWeights:l}=t,{strides:c,pad:f,dilations:p,dataFormat:m,dimRoundingMode:h,activation:b,leakyreluAlpha:j}=n,g=s.backend_util.computeConv2DInfo(a.shape,u.shape,c,p,f,h),w=o.FusableActivation[b];if(null==w)throw new Error(`${b} activation not yet supported for FusedConv2D in the wasm backend.`);const _=i.dataIdMap.get(a.dataId).id,k=i.dataIdMap.get(u.dataId).id,v=g.outChannels;let x=0;if(null!=d){const e=i.dataIdMap.get(d.dataId);if(1!==e.shape.length)throw new Error(`FusedConv2D only supports rank-1 bias but got rank ${e.shape.length}.`);if(e.shape[0]!==v)throw new Error(`FusedConv2D bias shape (${e.shape}) does not match the number of output channels (${v})`);x=e.id}const y=g.filterHeight,O=g.filterWidth,I=g.padInfo.top,C=g.padInfo.right,S=g.padInfo.bottom,T=g.padInfo.left,N=g.dilationHeight,E=g.dilationWidth,A=g.strideHeight,R=g.strideWidth,F=g.inChannels,M="SAME"===g.padInfo.type?1:0,$=g.batchSize,D=g.inHeight,P=g.inWidth;if("NHWC"!==m)throw new Error(`wasm backend FusedConv2D does not support dataFormat:'${m}'. Please use 'NHWC'.`);const B=i.makeOutput(g.outShape,"float32"),L=i.dataIdMap.get(B.dataId).id,z=null==l?0:i.dataIdMap.get(l.dataId).id;return r(_,$,D,P,k,y,O,x,I,C,S,T,M,N,E,A,R,F,v,w,z,j||0,L),B}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/FusedDepthwiseConv2D.js": +/*!*****************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/FusedDepthwiseConv2D.js ***! + \*****************************************************************************************/ +/*! exports provided: fusedDepthwiseConv2DConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"fusedDepthwiseConv2DConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./types */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/types.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +let r;const i={kernelName:s.FusedDepthwiseConv2D,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s.FusedDepthwiseConv2D,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])},kernelFunc:function(e){const{inputs:t,attrs:n,backend:i}=e,{x:a,filter:u,bias:d,preluActivationWeights:l}=t,{strides:c,pad:f,dilations:p,dataFormat:m,dimRoundingMode:h,activation:b,leakyreluAlpha:j}=n,g=s.backend_util.computeConv2DInfo(a.shape,u.shape,c,p,f,h,!0),w=o.FusableActivation[b];if(null==w)throw new Error(`${b} activation not yet supported for FusedDepthwiseConv2D in the wasm backend.`);const _=i.dataIdMap.get(a.dataId).id,k=i.dataIdMap.get(u.dataId).id,v=g.outChannels;let x=0;if(null!=d){const e=i.dataIdMap.get(d.dataId);if(1!==e.shape.length)throw new Error(`FusedDepthwiseConv2D only supports rank-1 bias but got rank ${e.shape.length}.`);if(e.shape[0]!==v)throw new Error(`FusedDepthwiseConv2D bias shape (${e.shape}) does not match the number of output channels (${v})`);x=e.id}const y=g.filterHeight,O=g.filterWidth,I=g.padInfo.top,C=g.padInfo.right,S=g.padInfo.bottom,T=g.padInfo.left,N=g.dilationHeight,E=g.dilationWidth,A=g.strideHeight,R=g.strideWidth,F=g.inChannels,M="SAME"===g.padInfo.type?1:0,$=g.batchSize,D=g.inHeight,P=g.inWidth;if("NHWC"!==m)throw new Error(`wasm backend FusedDepthwiseConv2D does not support dataFormat:'${m}'. Please use 'NHWC'.`);const B=i.makeOutput(g.outShape,"float32"),L=i.dataIdMap.get(B.dataId).id,z=null==l?0:i.dataIdMap.get(l.dataId).id;return r(_,$,D,P,k,y,O,x,I,C,S,T,M,N,E,A,R,F,v,w,z,j||0,L),B}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/GatherNd.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/GatherNd.js ***! + \*****************************************************************************/ +/*! exports provided: gatherNdConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"gatherNdConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./types */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/types.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +let r;const i={kernelName:s.GatherNd,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s.GatherNd,null,["number","number","number","number","number","number","array","number"])},kernelFunc:function(e){const{backend:t,inputs:n}=e,{params:i,indices:a}=n,[u,d,l,c]=s.gather_util.prepareAndValidate(i,a),f=t.makeOutput(u,i.dtype);if(0===d)return f;const p=a.shape,m=p[p.length-1],h=t.dataIdMap.get(i.dataId).id,b=t.dataIdMap.get(a.dataId).id,j=new Uint8Array(new Int32Array(c).buffer),g=t.dataIdMap.get(f.dataId).id;return r(h,o.CppDType[i.dtype],b,d,m,l,j,g),f}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/GatherV2.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/GatherV2.js ***! + \*****************************************************************************/ +/*! exports provided: gatherV2Config */function(e,t,n){"use strict";n.r(t),n.d(t,"gatherV2Config",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Reshape.js"),r=n(/*! ./types */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/types.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +let i;const a={kernelName:s.GatherV2,backendName:"wasm",setupFunc:function(e){i=e.wasm.cwrap("Gather",null,["number","number","array","number","number","number","array","number"])},kernelFunc:function(e){const{backend:t,inputs:n,attrs:a}=e,{x:u,indices:d}=n,{axis:l,batchDims:c}=a,f=s.util.parseAxisParam(l,u.shape)[0],p=s.backend_util.segment_util.collectGatherOpShapeInfo(u,d,f,c),m=Object(o.reshape)({inputs:{x:u},attrs:{shape:[p.batchSize,p.outerSize,p.dimSize,p.sliceSize]},backend:t}),h=s.util.sizeFromShape(d.shape),b=Object(o.reshape)({inputs:{x:d},attrs:{shape:[p.batchSize,h/p.batchSize]},backend:t}),j=[p.batchSize,p.outerSize,h/p.batchSize,p.sliceSize],g=t.makeOutput(j,u.dtype);if(0===s.util.sizeFromShape(u.shape))return g;const w=m.shape.length-1,_=t.dataIdMap.get(m.dataId).id,k=t.dataIdMap.get(b.dataId).id,v=t.dataIdMap.get(g.dataId).id,x=new Uint8Array(new Int32Array(s.util.computeStrides(m.shape)).buffer),y=new Uint8Array(new Int32Array(s.util.computeStrides(j)).buffer);return i(_,r.CppDType[u.dtype],x,w,k,p.batchSize,y,v),t.disposeData(m.dataId),t.disposeData(b.dataId),g.shape=p.outputShape,g}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Greater.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Greater.js ***! + \****************************************************************************/ +/*! exports provided: greaterConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"greaterConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./binary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.createBinaryKernelConfig)(s.Greater,!1,"bool")},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/GreaterEqual.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/GreaterEqual.js ***! + \*********************************************************************************/ +/*! exports provided: greaterEqualConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"greaterEqualConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./binary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.createBinaryKernelConfig)(s.GreaterEqual,!1,"bool")},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Identity.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Identity.js ***! + \*****************************************************************************/ +/*! exports provided: identity, identityConfig */function(e,t,n){"use strict"; +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function s(e){const{inputs:{x:t},backend:n}=e,s=n.makeOutput(t.shape,t.dtype),o=n.typedArrayFromHeap(t);return n.typedArrayFromHeap(s).set(o),s}n.r(t),n.d(t,"identity",(function(){return s})),n.d(t,"identityConfig",(function(){return o}));const o={kernelName:n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js").Identity,backendName:"wasm",kernelFunc:s}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/LeakyRelu.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/LeakyRelu.js ***! + \******************************************************************************/ +/*! exports provided: leakyRelu, leakyReluConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"leakyRelu",(function(){return r})),n.d(t,"leakyReluConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */let o;function r(e){const{inputs:{x:t},attrs:{alpha:n},backend:r}=e,i=r.dataIdMap.get(t.dataId).id,a=r.makeOutput(t.shape,t.dtype);if(0!==s.util.sizeFromShape(t.shape)){const e=r.dataIdMap.get(a.dataId).id;o(i,n,e)}return a}const i={kernelName:s.LeakyRelu,backendName:"wasm",setupFunc:function(e){o=e.wasm.cwrap(s.LeakyRelu,null,["number","number","number"])},kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Less.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Less.js ***! + \*************************************************************************/ +/*! exports provided: lessConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"lessConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./binary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.createBinaryKernelConfig)(s.Less,!1,"bool")},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/LessEqual.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/LessEqual.js ***! + \******************************************************************************/ +/*! exports provided: lessEqualConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"lessEqualConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./binary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.createBinaryKernelConfig)(s.LessEqual,!1,"bool")},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Log.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Log.js ***! + \************************************************************************/ +/*! exports provided: logConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"logConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./unary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/unary_kernel.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.createUnaryKernelConfig)(s.Log)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/LogicalAnd.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/LogicalAnd.js ***! + \*******************************************************************************/ +/*! exports provided: logicalAndConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"logicalAndConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./binary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.createBinaryKernelConfig)(s.LogicalAnd,!1,"bool")},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Max.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Max.js ***! + \************************************************************************/ +/*! exports provided: maxConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"maxConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./kernel_utils */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/kernel_utils.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +let r;const i={kernelName:s.Max,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s.Max,null,["number, number, number"])},kernelFunc:function(e){const{backend:t,inputs:n,attrs:i}=e,{reductionIndices:a,keepDims:u}=i,{x:d}=n;let l=t.dataIdMap.get(d.dataId).id,c=d;const{transposed:f,axes:p,originalAxes:m,inputWasTransposed:h}=Object(o.permuteAxesAndTranspose)(d,a,t);if(h){c=f,l=t.dataIdMap.get(f.dataId).id}const b=c.shape.length;s.backend_util.assertAxesAreInnerMostDims("max",p,b);const[j,g]=s.backend_util.computeOutAndReduceShapes(c.shape,p),w=s.util.sizeFromShape(g),_=t.makeOutput(j,d.dtype);if(0!==s.util.sizeFromShape(c.shape)){const e=t.dataIdMap.get(_.dataId).id;r(l,w,e)}if(h&&t.disposeData(f.dataId),u){const e=s.backend_util.expandShapeToKeepDim(_.shape,m);_.shape=e}return _}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/MaxPool.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/MaxPool.js ***! + \****************************************************************************/ +/*! exports provided: maxPoolConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"maxPoolConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */let o;const r={kernelName:s.MaxPool,backendName:"wasm",setupFunc:function(e){o=e.wasm.cwrap(s.MaxPool,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])},kernelFunc:function(e){const{inputs:t,attrs:n,backend:r}=e,i=t.x,a=r.dataIdMap.get(i.dataId).id,{filterSize:u,strides:d,pad:l,dimRoundingMode:c}=n,f=s.backend_util.computePool2DInfo(i.shape,u,d,1,l,c),p=f.filterHeight,m=f.filterWidth,h=f.padInfo.top,b=f.padInfo.right,j=f.padInfo.bottom,g=f.padInfo.left,w=f.dilationHeight,_=f.dilationWidth,k=f.strideHeight,v=f.strideWidth,x=f.inChannels,y=f.outChannels;if("channelsLast"!==f.dataFormat)throw new Error(`wasm backend does not support dataFormat:'${f.dataFormat}'. Please use 'channelsLast'.`);const O=r.makeOutput(f.outShape,"float32"),I=r.dataIdMap.get(O.dataId).id;return o(a,i.shape[0],i.shape[1],i.shape[2],p,m,h,b,j,g,w,_,k,v,x,y,I),O}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Maximum.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Maximum.js ***! + \****************************************************************************/ +/*! exports provided: maximumConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"maximumConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./binary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.createBinaryKernelConfig)(s.Maximum,!1)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Mean.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Mean.js ***! + \*************************************************************************/ +/*! exports provided: mean, meanConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"mean",(function(){return a})),n.d(t,"meanConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Cast */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Cast.js"),r=n(/*! ./kernel_utils */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/kernel_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +let i;function a(e){const{backend:t,inputs:n,attrs:a}=e,{axis:u,keepDims:d}=a,{x:l}=n,c=t.dataIdMap.get(l.dataId).id;let f=c,p=l;const{transposed:m,axes:h,originalAxes:b,inputWasTransposed:j}=Object(r.permuteAxesAndTranspose)(l,u,t);let g=h;if(j){const e=t.dataIdMap.get(m.dataId).id;e!==c&&(p=m,f=e,g=s.backend_util.getInnerMostAxes(g.length,p.shape.length))}s.backend_util.assertAxesAreInnerMostDims("mean",g,p.shape.length);const[w,_]=s.backend_util.computeOutAndReduceShapes(p.shape,g),k=s.util.sizeFromShape(_);let v=p;"float32"!==p.dtype&&(v=Object(o.cast)({backend:t,inputs:{x:p},attrs:{dtype:"float32"}}),f=t.dataIdMap.get(v.dataId).id);const x=t.makeOutput(w,"float32");if(0!==s.util.sizeFromShape(p.shape)){const e=t.dataIdMap.get(x.dataId).id;i(f,k,e)}if(j&&t.disposeData(m.dataId),d){const e=s.backend_util.expandShapeToKeepDim(x.shape,b);x.shape=e}return"float32"!==p.dtype&&t.disposeData(v.dataId),x}const u={kernelName:s.Mean,backendName:"wasm",setupFunc:function(e){i=e.wasm.cwrap(s.Mean,null,["number, number, number"])},kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Min.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Min.js ***! + \************************************************************************/ +/*! exports provided: minConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"minConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./kernel_utils */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/kernel_utils.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +let r;const i={kernelName:s.Min,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s.Min,null,["number, number, number"])},kernelFunc:function(e){const{backend:t,inputs:n,attrs:i}=e,{axis:a,keepDims:u}=i,{x:d}=n,l=t.dataIdMap.get(d.dataId).id;let c=l,f=d;const{transposed:p,axes:m,originalAxes:h,inputWasTransposed:b}=Object(o.permuteAxesAndTranspose)(d,a,t);if(b){const e=t.dataIdMap.get(p.dataId).id;e!==l&&(f=p,c=e)}const j=f.shape.length;s.backend_util.assertAxesAreInnerMostDims("min",m,j);const[g,w]=s.backend_util.computeOutAndReduceShapes(f.shape,m),_=s.util.sizeFromShape(w),k=t.makeOutput(g,f.dtype);if(0!==s.util.sizeFromShape(f.shape)){const e=t.dataIdMap.get(k.dataId).id;r(c,_,e)}if(b&&t.disposeData(p.dataId),u){const e=s.backend_util.expandShapeToKeepDim(k.shape,h);k.shape=e}return k}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Minimum.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Minimum.js ***! + \****************************************************************************/ +/*! exports provided: minimumConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"minimumConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./binary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.createBinaryKernelConfig)(s.Minimum,!1)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/MirrorPad.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/MirrorPad.js ***! + \******************************************************************************/ +/*! exports provided: mirrorPadConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"mirrorPadConfig",(function(){return a}));var s,o=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),r=n(/*! ./types */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/types.js");let i;!function(e){e[e.reflect=0]="reflect",e[e.symmetric=1]="symmetric"}(s||(s={}));const a={kernelName:o.MirrorPad,backendName:"wasm",kernelFunc:function(e){const{inputs:{x:t},backend:n,attrs:{paddings:o,mode:a}}=e,u=o.map(((e,n)=>e[0]+t.shape[n]+e[1])),d=n.dataIdMap.get(t.dataId).id,l=n.makeOutput(u,t.dtype),c=n.dataIdMap.get(l.dataId).id,f=new Uint8Array(new Int32Array(t.shape).buffer),p=o.map((e=>e[0])),m=o.map((e=>e[1])),h=new Uint8Array(new Int32Array(p).buffer),b=new Uint8Array(new Int32Array(m).buffer);return i(d,f,t.shape.length,r.CppDType[t.dtype],h,b,s[a],c),l},setupFunc:function(e){i=e.wasm.cwrap(o.MirrorPad,null,["number","array","number","number","array","array","number","number"])}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Multiply.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Multiply.js ***! + \*****************************************************************************/ +/*! exports provided: multiplyConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"multiplyConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./binary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.createBinaryKernelConfig)(s.Multiply,!0)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Neg.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Neg.js ***! + \************************************************************************/ +/*! exports provided: negConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"negConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./unary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/unary_kernel.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.createUnaryKernelConfig)(s.Neg)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/NonMaxSuppressionV3.js": +/*!****************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/NonMaxSuppressionV3.js ***! + \****************************************************************************************/ +/*! exports provided: nonMaxSuppressionV3Config */function(e,t,n){"use strict";n.r(t),n.d(t,"nonMaxSuppressionV3Config",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./NonMaxSuppression_util */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/NonMaxSuppression_util.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +let r;const i={kernelName:s.NonMaxSuppressionV3,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s.NonMaxSuppressionV3,"number",["number","number","number","number","number"])},kernelFunc:function(e){const{backend:t,inputs:n,attrs:s}=e,{iouThreshold:i,maxOutputSize:a,scoreThreshold:u}=s,{boxes:d,scores:l}=n,c=t.dataIdMap.get(d.dataId).id,f=t.dataIdMap.get(l.dataId).id,p=r(c,f,a,i,u),{pSelectedIndices:m,selectedSize:h,pSelectedScores:b,pValidOutputs:j}=Object(o.parseResultStruct)(t,p);return t.wasm._free(b),t.wasm._free(j),t.makeOutput([h],"int32",m)}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/NonMaxSuppressionV4.js": +/*!****************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/NonMaxSuppressionV4.js ***! + \****************************************************************************************/ +/*! exports provided: nonMaxSuppressionV4Config */function(e,t,n){"use strict";n.r(t),n.d(t,"nonMaxSuppressionV4Config",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./NonMaxSuppression_util */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/NonMaxSuppression_util.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +let r;const i={kernelName:s.NonMaxSuppressionV4,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s.NonMaxSuppressionV4,"number",["number","number","number","number","number","bool"])},kernelFunc:function(e){const{backend:t,inputs:n,attrs:s}=e,{iouThreshold:i,maxOutputSize:a,scoreThreshold:u,padToMaxOutputSize:d}=s,{boxes:l,scores:c}=n,f=t.dataIdMap.get(l.dataId).id,p=t.dataIdMap.get(c.dataId).id,m=r(f,p,a,i,u,d),{pSelectedIndices:h,selectedSize:b,pSelectedScores:j,pValidOutputs:g}=Object(o.parseResultStruct)(t,m);return t.wasm._free(j),[t.makeOutput([b],"int32",h),t.makeOutput([],"int32",g)]}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/NonMaxSuppressionV5.js": +/*!****************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/NonMaxSuppressionV5.js ***! + \****************************************************************************************/ +/*! exports provided: nonMaxSuppressionV5Config */function(e,t,n){"use strict";n.r(t),n.d(t,"nonMaxSuppressionV5Config",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./NonMaxSuppression_util */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/NonMaxSuppression_util.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +let r;const i={kernelName:s.NonMaxSuppressionV5,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s.NonMaxSuppressionV5,"number",["number","number","number","number","number","number"])},kernelFunc:function(e){const{backend:t,inputs:n,attrs:s}=e,{iouThreshold:i,maxOutputSize:a,scoreThreshold:u,softNmsSigma:d}=s,{boxes:l,scores:c}=n,f=t.dataIdMap.get(l.dataId).id,p=t.dataIdMap.get(c.dataId).id,m=r(f,p,a,i,u,d),{pSelectedIndices:h,selectedSize:b,pSelectedScores:j,pValidOutputs:g}=Object(o.parseResultStruct)(t,m);return t.wasm._free(g),[t.makeOutput([b],"int32",h),t.makeOutput([b],"float32",j)]}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/NonMaxSuppression_util.js": +/*!*******************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/NonMaxSuppression_util.js ***! + \*******************************************************************************************/ +/*! exports provided: parseResultStruct */function(e,t,n){"use strict"; +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function s(e,t){const n=new Int32Array(e.wasm.HEAPU8.buffer,t,4),s=n[0],o=n[1],r=n[2],i=n[3];return e.wasm._free(t),{pSelectedIndices:s,selectedSize:o,pSelectedScores:r,pValidOutputs:i}}n.r(t),n.d(t,"parseResultStruct",(function(){return s}))},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/NotEqual.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/NotEqual.js ***! + \*****************************************************************************/ +/*! exports provided: notEqualConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"notEqualConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./binary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.createBinaryKernelConfig)(s.NotEqual,!1,"bool")},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/OneHot.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/OneHot.js ***! + \***************************************************************************/ +/*! exports provided: oneHotConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"oneHotConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */let o;const r={kernelName:s.OneHot,backendName:"wasm",setupFunc:function(e){o=e.wasm.cwrap(s.OneHot,null,["number","number","number","number","number"])},kernelFunc:function(e){const{inputs:t,backend:n,attrs:s}=e,{indices:r}=t,{depth:i,onValue:a,offValue:u}=s,d=n.makeOutput([...r.shape,i],"int32"),l=n.dataIdMap.get(d.dataId).id,c=n.dataIdMap.get(r.dataId).id;return o(c,i,a,u,l),d}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/OnesLike.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/OnesLike.js ***! + \*****************************************************************************/ +/*! exports provided: onesLikeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"onesLikeConfig",(function(){return s}));const s={kernelName:n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js").OnesLike,backendName:"wasm",kernelFunc: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){const{inputs:{x:t},backend:n}=e,s=n.makeOutput(t.shape,t.dtype);return n.typedArrayFromHeap(s).fill(1),s}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Pack.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Pack.js ***! + \*************************************************************************/ +/*! exports provided: pack, packConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"pack",(function(){return i})),n.d(t,"packConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Concat */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Concat.js"),r=n(/*! ./ExpandDims */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/ExpandDims.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e){const{inputs:t,backend:n,attrs:i}=e,{axis:a}=i;if(1===t.length)return Object(r.expandDims)({inputs:{input:t[0]},backend:n,attrs:{dim:a}});const u=t[0].shape,d=t[0].dtype;t.forEach((e=>{s.util.assertShapesMatch(u,e.shape,"All tensors passed to stack must have matching shapes"),s.util.assert(d===e.dtype,(()=>"All tensors passed to stack must have matching dtypes"))}));const l=[],c=t.map((e=>{const t=Object(r.expandDims)({inputs:{input:e},backend:n,attrs:{dim:a}});return l.push(t),t})),f=Object(o.concat)({inputs:c,backend:n,attrs:{axis:a}});return l.forEach((e=>n.disposeData(e.dataId))),f}const a={kernelName:s.Pack,backendName:"wasm",kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/PadV2.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/PadV2.js ***! + \**************************************************************************/ +/*! exports provided: padV2Config */function(e,t,n){"use strict";n.r(t),n.d(t,"padV2Config",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./types */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/types.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +let r;const i={kernelName:s.PadV2,backendName:"wasm",kernelFunc:function(e){const{inputs:{x:t},backend:n,attrs:{paddings:s,constantValue:i}}=e,a=s.map(((e,n)=>e[0]+t.shape[n]+e[1])),u=n.dataIdMap.get(t.dataId).id,d=n.makeOutput(a,t.dtype),l=n.dataIdMap.get(d.dataId).id,c=new Uint8Array(new Int32Array(t.shape).buffer),f=s.map((e=>e[0])),p=s.map((e=>e[1])),m=new Uint8Array(new Int32Array(f).buffer),h=new Uint8Array(new Int32Array(p).buffer);return r(u,c,t.shape.length,o.CppDType[t.dtype],m,h,i,l),d},setupFunc:function(e){r=e.wasm.cwrap(s.PadV2,null,["number","array","number","number","array","array","number","number"])}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Pow.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Pow.js ***! + \************************************************************************/ +/*! exports provided: powConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"powConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./binary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.createBinaryKernelConfig)(s.Pow,!1)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Prelu.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Prelu.js ***! + \**************************************************************************/ +/*! exports provided: preluConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"preluConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */let o;const r={kernelName:s.Prelu,backendName:"wasm",setupFunc:function(e){o=e.wasm.cwrap(s.Prelu,null,["number","number","number"])},kernelFunc:function(e){const{inputs:t,backend:n}=e,{x:s,alpha:r}=t,i=n.dataIdMap.get(s.dataId).id,a=n.dataIdMap.get(r.dataId).id,u=n.makeOutput(s.shape,"float32"),d=n.dataIdMap.get(u.dataId).id;return o(i,a,d),u}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Prod.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Prod.js ***! + \*************************************************************************/ +/*! exports provided: prodConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"prodConfig",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./kernel_utils */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/kernel_utils.js"),r=n(/*! ./types */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/types.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +let i;const a={kernelName:s.Prod,backendName:"wasm",setupFunc:function(e){i=e.wasm.cwrap(s.Prod,null,["number","number","number","number"])},kernelFunc:function(e){const{backend:t,inputs:n,attrs:a}=e,{axis:u,keepDims:d}=a,{x:l}=n,c=t.dataIdMap.get(l.dataId).id;let f=c,p=l;const{transposed:m,axes:h,originalAxes:b,inputWasTransposed:j}=Object(o.permuteAxesAndTranspose)(l,u,t);let g=h;if(j){const e=t.dataIdMap.get(m.dataId).id;e!==c&&(p=m,f=e,g=s.backend_util.getInnerMostAxes(g.length,p.shape.length))}s.backend_util.assertAxesAreInnerMostDims("prod",g,p.shape.length);const[w,_]=s.backend_util.computeOutAndReduceShapes(p.shape,g),k=s.util.sizeFromShape(_),v=t.makeOutput(w,p.dtype);if(0!==s.util.sizeFromShape(p.shape)){const e=t.dataIdMap.get(v.dataId).id;i(f,k,r.CppDType[v.dtype],e)}if(j&&t.disposeData(m.dataId),d){const e=s.backend_util.expandShapeToKeepDim(v.shape,b);v.shape=e}return v}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Range.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Range.js ***! + \**************************************************************************/ +/*! exports provided: range, rangeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"range",(function(){return r})),n.d(t,"rangeConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernel_utils/shared.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=e=>{const{backend:t,attrs:n}=e,{start:s,stop:r,step:i,dtype:a}=n,u=Object(o.rangeImplCPU)(s,r,i,a),d=t.makeOutput([u.length],a);return t.typedArrayFromHeap(d).set(u),d},i={kernelName:s.Range,backendName:"wasm",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/RealDiv.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/RealDiv.js ***! + \****************************************************************************/ +/*! exports provided: realDivConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"realDivConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./binary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.createBinaryKernelConfig)(s.RealDiv,!0)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Relu.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Relu.js ***! + \*************************************************************************/ +/*! exports provided: reluConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"reluConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./unary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/unary_kernel.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.createUnaryKernelConfig)(s.Relu)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Relu6.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Relu6.js ***! + \**************************************************************************/ +/*! exports provided: relu6Config */function(e,t,n){"use strict";n.r(t),n.d(t,"relu6Config",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./unary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/unary_kernel.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.createUnaryKernelConfig)(s.Relu6)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Reshape.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Reshape.js ***! + \****************************************************************************/ +/*! exports provided: reshape, reshapeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"reshape",(function(){return o})),n.d(t,"reshapeConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */function o(e){const{inputs:t,attrs:n}=e,{x:o}=t,{shape:r}=n,i=s.util.sizeFromShape(o.shape),a=s.util.inferFromImplicitShape(r,i);return s.util.assert(i===s.util.sizeFromShape(a),(()=>`new shape: ${a}, old shape: ${o.shape}. New shape and old shape must have the same number of elements.`)),e.backend.incRef(o.dataId),{dataId:o.dataId,shape:a,dtype:o.dtype}}const r={kernelName:s.Reshape,backendName:"wasm",kernelFunc:o}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/ResizeBilinear.js": +/*!***********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/ResizeBilinear.js ***! + \***********************************************************************************/ +/*! exports provided: resizeBilinearConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"resizeBilinearConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Cast */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Cast.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +let r;const i={kernelName:s.ResizeBilinear,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s.ResizeBilinear,null,["number","number","number","number","number","number","number","number","number","number"])},kernelFunc:function(e){const{backend:t,inputs:n,attrs:i}=e,{images:a}=n,{alignCorners:u,halfPixelCenters:d,size:l}=i,[c,f]=l,[p,m,h,b]=a.shape,j=[p,c,f,b];let g,w=t.dataIdMap.get(a.dataId);"float32"!==w.dtype&&(g=Object(o.cast)({backend:t,inputs:{x:a},attrs:{dtype:"float32"}}),w=t.dataIdMap.get(g.dataId));const _=w.id,k=t.makeOutput(j,"float32");if(0===s.util.sizeFromShape(a.shape))return k;const v=t.dataIdMap.get(k.dataId).id;return r(_,p,m,h,b,c,f,u?1:0,d?1:0,v),null!=g&&t.disposeData(g.dataId),k}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Reverse.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Reverse.js ***! + \****************************************************************************/ +/*! exports provided: reverse, reverseConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"reverse",(function(){return a})),n.d(t,"reverseConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Identity */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Identity.js"),r=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Reshape.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +let i;function a(e){const{inputs:t,backend:n,attrs:a}=e,{x:u}=t,{dims:d}=a,l=s.util.parseAxisParam(d,u.shape);if(0===u.shape.length)return Object(o.identity)({inputs:{x:u},backend:n});const c=n.makeOutput(u.shape,u.dtype),f=n.dataIdMap.get(u.dataId).id,p=n.dataIdMap.get(c.dataId).id,m=new Uint8Array(new Int32Array(l).buffer),h=new Uint8Array(new Int32Array(u.shape).buffer);i(f,m,l.length,h,u.shape.length,p);const b=Object(r.reshape)({inputs:{x:c},attrs:{shape:u.shape},backend:n});return n.disposeData(c.dataId),b}const u={kernelName:s.Reverse,backendName:"wasm",kernelFunc:a,setupFunc:function(e){i=e.wasm.cwrap(s.Reverse,null,["number","array","number","array","number","number"])}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/RotateWithOffset.js": +/*!*************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/RotateWithOffset.js ***! + \*************************************************************************************/ +/*! exports provided: rotateWithOffset, rotateWithOffsetConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"rotateWithOffset",(function(){return r})),n.d(t,"rotateWithOffsetConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */let o;function r(e){const{inputs:t,backend:n,attrs:r}=e,{image:i}=t,{radians:a,fillValue:u,center:d}=r,l=n.makeOutput(i.shape,i.dtype),c=n.dataIdMap.get(i.dataId).id,f=n.dataIdMap.get(l.dataId).id,[p,m,h,b]=i.shape,[j,g]=s.backend_util.getImageCenter(d,m,h),w="number"==typeof u?[u,u,u,0===u?0:255]:[...u,255],_=new Uint8Array(new Int32Array(w).buffer);return o(c,p,m,h,b,a,j,g,_,w.length,f),l}const i={kernelName:s.RotateWithOffset,backendName:"wasm",kernelFunc:r,setupFunc:function(e){o=e.wasm.cwrap(s.RotateWithOffset,null,["number","number","number","number","number","number","number","number","array","number","number"])}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Round.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Round.js ***! + \**************************************************************************/ +/*! exports provided: roundConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"roundConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./unary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/unary_kernel.js"); +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.createUnaryKernelConfig)(s.Round)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Rsqrt.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Rsqrt.js ***! + \**************************************************************************/ +/*! exports provided: rsqrtConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"rsqrtConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./unary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/unary_kernel.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.createUnaryKernelConfig)(s.Rsqrt)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/ScatterNd.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/ScatterNd.js ***! + \******************************************************************************/ +/*! exports provided: scatterNdConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"scatterNdConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./types */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/types.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +let r;const i={kernelName:s.ScatterNd,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s.ScatterNd,null,["number","number","number","number","number","number","array","number","number"])},kernelFunc:function(e){const{backend:t,inputs:n,attrs:i}=e,{indices:a,updates:u}=n,{shape:d}=i,l=t.makeOutput(d,u.dtype);if(0===s.util.sizeFromShape(d))return l;const{sliceRank:c,numUpdates:f,sliceSize:p,strides:m,outputSize:h}=s.scatter_util.calculateShapes(u,a,d),b=t.dataIdMap.get(a.dataId).id,j=t.dataIdMap.get(u.dataId).id,g=new Uint8Array(new Int32Array(m).buffer),w=t.dataIdMap.get(l.dataId).id;return r(b,j,o.CppDType[u.dtype],c,f,p,g,h,w),l}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Select.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Select.js ***! + \***************************************************************************/ +/*! exports provided: selectConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"selectConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */let o;const r={kernelName:s.Select,backendName:"wasm",kernelFunc:function(e){const{inputs:t,backend:n}=e,{condition:r,t:i,e:a}=t,u=n.dataIdMap.get(r.dataId).id,d=n.dataIdMap.get(i.dataId).id,l=n.dataIdMap.get(a.dataId).id,c=n.makeOutput(i.shape,i.dtype),f=n.dataIdMap.get(c.dataId).id,p=r.shape.length,m=i.shape.length,h=0===p||p>1||1===m?1:s.util.sizeFromShape(i.shape.slice(1));return o(u,d,l,h,f),c},setupFunc:function(e){o=e.wasm.cwrap("SelectV2",null,["number","number","number","number","number"])}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Sigmoid.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Sigmoid.js ***! + \****************************************************************************/ +/*! exports provided: sigmoidConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sigmoidConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */let o;const r={kernelName:"Sigmoid",backendName:"wasm",setupFunc:function(e){o=e.wasm.cwrap(s.Sigmoid,null,["number","number"])},kernelFunc:function(e){const{backend:t,inputs:{x:n}}=e,r=t.dataIdMap.get(n.dataId).id,i=t.makeOutput(n.shape,n.dtype),a=t.dataIdMap.get(i.dataId).id;return 0===s.util.sizeFromShape(i.shape)||o(r,a),i}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Sin.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Sin.js ***! + \************************************************************************/ +/*! exports provided: sinConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sinConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./unary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/unary_kernel.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.createUnaryKernelConfig)(s.Sin)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Slice.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Slice.js ***! + \**************************************************************************/ +/*! exports provided: slice, sliceConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"slice",(function(){return r})),n.d(t,"sliceConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../kernel_utils/shared */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernel_utils/shared.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e){const{inputs:{x:t},attrs:{begin:n,size:r},backend:i}=e,[a,u]=s.slice_util.parseSliceParams(t,n,r),d=s.slice_util.isSliceContinous(t.shape,a,u),l=i.readSync(t.dataId),c=i.makeOutput(u,t.dtype),f=s.util.computeStrides(t.shape),p=i.dataIdMap.get(c.dataId);if(d){const e=s.slice_util.computeFlatOffset(a,f);if("string"===t.dtype)p.stringBytes=l.slice(e,e+s.util.sizeFromShape(u));else{i.typedArrayFromHeap(c).set(l.subarray(e,e+s.util.sizeFromShape(u)))}return c}if("string"===t.dtype){const e=Object(o.sliceImplCPU)(l,a,u,t.shape,t.dtype);return p.stringBytes=e,c}const m=i.typedArrayFromHeap(c),h=t.shape.length;if(2===h)!function(e,t,n,s,o){let r=0;const i=s[0],a=s[1],u=i+o[0];for(let s=i;s{const t=[...f];t[d]=e;const n=Object(o.slice)({inputs:{x:i},attrs:{begin:c,size:t},backend:r});return c[d]+=e,n}))}const i={kernelName:s.SplitV,backendName:"wasm",kernelFunc:r}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Sqrt.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Sqrt.js ***! + \*************************************************************************/ +/*! exports provided: sqrtConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sqrtConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./unary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/unary_kernel.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.createUnaryKernelConfig)(s.Sqrt)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Square.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Square.js ***! + \***************************************************************************/ +/*! exports provided: squareConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"squareConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./unary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/unary_kernel.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.createUnaryKernelConfig)(s.Square)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/SquaredDifference.js": +/*!**************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/SquaredDifference.js ***! + \**************************************************************************************/ +/*! exports provided: squaredDifferenceConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"squaredDifferenceConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./binary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.createBinaryKernelConfig)(s.SquaredDifference,!0)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Step.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Step.js ***! + \*************************************************************************/ +/*! exports provided: stepConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"stepConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */let o;const r={kernelName:s.Step,backendName:"wasm",setupFunc:function(e){o=e.wasm.cwrap(s.Step,null,["number","number","number"])},kernelFunc:function(e){const{backend:t,inputs:n,attrs:s}=e,{alpha:r}=s,{x:i}=n,a=t.dataIdMap.get(i.dataId).id,u=t.makeOutput(i.shape,i.dtype),d=t.dataIdMap.get(u.dataId).id;return o(a,r,d),u}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/StridedSlice.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/StridedSlice.js ***! + \*********************************************************************************/ +/*! exports provided: stridedSlice, stridedSliceConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"stridedSlice",(function(){return a})),n.d(t,"stridedSliceConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Reshape */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Reshape.js"),r=n(/*! ./Slice */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Slice.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +let i;function a(e){const{backend:t,inputs:n,attrs:a}=e,{x:u}=n;let{begin:d,end:l,strides:c}=a;null==c&&(c=new Array(d.length));const{beginMask:f,endMask:p,ellipsisMask:m,newAxisMask:h,shrinkAxisMask:b}=a,j=s.backend_util.slice_util.maskToAxes(m);if(j.length>1)throw new Error("Multiple ellipses in slice is not allowed.");if(0!==m&&0!==h)throw new Error("Using both ellipsisMask and newAxisMask is not yet supported.");if(0!==m&&0!==b)throw new Error("Using both ellipsisMask and shrinkAxisMask is not yet supported.");const g=u.shape.length-d.length,w=s.backend_util.slice_util.maskToAxes(h),_=u.shape.slice();w.forEach((e=>{d[e]=0,l[e]=1,_.splice(e,0,1)}));const k=Object(o.reshape)({inputs:{x:u},attrs:{shape:_},backend:t}),{begin:v,end:x,strides:y}=s.backend_util.slice_util.getNormalizedAxes(k.shape,j,g,d,l,c,f,p,m);d=v,l=x,c=y;const O=s.backend_util.slice_util.maskToAxes(b);O.forEach((e=>{l[e]=d[e]+1,c[e]=1}));const I=s.backend_util.slice_util.computeOutShape(d,l,c),C=I.filter(((e,t)=>-1===O.indexOf(t)));if(c.every((e=>1===e))){const e=Object(r.slice)({inputs:{x:k},attrs:{begin:d,size:I},backend:t});t.disposeData(k.dataId);const n=Object(o.reshape)({inputs:{x:e},attrs:{shape:C},backend:t});return t.disposeData(e.dataId),n}const S=t.makeOutput(C,"float32");if(!C.some((e=>0===e))){const e=t.dataIdMap.get(k.dataId).id,n=new Uint8Array(new Int32Array(s.util.computeStrides(k.shape)).buffer),o=new Uint8Array(new Int32Array(d).buffer),r=new Uint8Array(new Int32Array(l).buffer),a=new Uint8Array(new Int32Array(c).buffer),u=new Uint8Array(new Int32Array(C).buffer),f=new Uint8Array(new Int32Array(s.util.computeStrides(C)).buffer),p=t.dataIdMap.get(S.dataId).id;i(e,n,k.shape.length,o,r,a,u,f,C.length,p)}t.disposeData(k.dataId);const T=Object(o.reshape)({inputs:{x:S},attrs:{shape:C},backend:t});return t.disposeData(S.dataId),T}const u={kernelName:s.StridedSlice,backendName:"wasm",setupFunc:function(e){i=e.wasm.cwrap(s.StridedSlice,null,["number","array","number","array","array","array","array","array","number","number"])},kernelFunc:a}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Sub.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Sub.js ***! + \************************************************************************/ +/*! exports provided: subConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"subConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./binary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.createBinaryKernelConfig)(s.Sub,!0)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Sum.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Sum.js ***! + \************************************************************************/ +/*! exports provided: sumConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"sumConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./kernel_utils */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/kernel_utils.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +let r;const i={kernelName:s.Sum,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s.Sum,null,["number, number, number"])},kernelFunc:function(e){const{backend:t,inputs:n,attrs:i}=e,{axis:a,keepDims:u}=i,{x:d}=n,l=t.dataIdMap.get(d.dataId).id;let c=l,f=d;const{transposed:p,axes:m,originalAxes:h,inputWasTransposed:b}=Object(o.permuteAxesAndTranspose)(d,a,t);let j=m;if(b){const e=t.dataIdMap.get(p.dataId).id;e!==l&&(f=p,c=e,j=s.backend_util.getInnerMostAxes(j.length,f.shape.length))}s.backend_util.assertAxesAreInnerMostDims("sum",j,f.shape.length);const[g,w]=s.backend_util.computeOutAndReduceShapes(f.shape,j),_=s.util.sizeFromShape(w),k=t.makeOutput(g,f.dtype);if(0!==s.util.sizeFromShape(f.shape)){const e=t.dataIdMap.get(k.dataId).id;r(c,_,e)}if(b&&t.disposeData(p.dataId),u){const e=s.backend_util.expandShapeToKeepDim(k.shape,h);k.shape=e}return k}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Tan.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Tan.js ***! + \************************************************************************/ +/*! exports provided: tanConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"tanConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./unary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/unary_kernel.js"); +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.createUnaryKernelConfig)(s.Tan)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Tanh.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Tanh.js ***! + \*************************************************************************/ +/*! exports provided: tanhConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"tanhConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./unary_kernel */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/unary_kernel.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.createUnaryKernelConfig)(s.Tanh)},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Tile.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Tile.js ***! + \*************************************************************************/ +/*! exports provided: tileConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"tileConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./types */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/types.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +let r;const i={kernelName:s.Tile,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s.Tile,null,["number","array","number","array","number","number"])},kernelFunc:function(e){const{inputs:t,backend:n,attrs:s}=e,{x:i}=t,a=n.dataIdMap.get(i.dataId).id,{reps:u}=s,d=new Array(i.shape.length);for(let e=0;e{const{x:s}=e,{k:i,sorted:a}=n,u=t.dataIdMap.get(s.dataId).id,d=new Uint8Array(new Int32Array(s.shape).buffer),l=s.shape.slice();l[l.length-1]=i;const c=t.makeOutput(l,s.dtype),f=t.dataIdMap.get(c.dataId).id,p=t.makeOutput(l,"int32"),m=t.dataIdMap.get(p.dataId).id;return r(u,d,s.shape.length,o.CppDType[s.dtype],i,a,f,m),[c,p]},a={kernelName:s.TopK,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s.TopK,null,["number","array","number","number","number","bool","number","number"])},kernelFunc:i}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Transform.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Transform.js ***! + \******************************************************************************/ +/*! exports provided: transformConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"transformConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */let o;const r={kernelName:s.Transform,backendName:"wasm",setupFunc:function(e){o=e.wasm.cwrap(s.Transform,null,["number","number","bool","number","number","number","number","number","number","array","number","number","number","number","number"])},kernelFunc:function(e){const{backend:t,inputs:n,attrs:r}=e,{image:i,transforms:a}=n,{interpolation:u,fillMode:d,fillValue:l,outputShape:c}=r,[f,p,m,h]=i.shape,[b,j]=null!=c?c:[p,m],g=[f,b,j,h],w=new Uint8Array(new Int32Array(s.util.computeStrides(i.shape)).buffer),_=t.makeOutput(g,i.dtype),k=t.dataIdMap.get(_.dataId).id,v=t.dataIdMap.get(i.dataId).id,x=t.dataIdMap.get(a.dataId).id,y="nearest"===u?1:2;let O;switch(d){case"constant":O=1;break;case"reflect":O=2;break;case"wrap":O=3;break;case"nearest":O=4;break;default:O=1}return o(v,x,a.shape[0]>1,f,b,j,h,m,p,w,i.shape.length-1,y,O,l,k),_}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Transpose.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Transpose.js ***! + \******************************************************************************/ +/*! exports provided: transpose, transposeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"transpose",(function(){return a})),n.d(t,"transposeConfig",(function(){return u}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Identity */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Identity.js"),r=n(/*! ./types */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/types.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +let i;function a(e){const{inputs:t,backend:n,attrs:s}=e,[a,u]=function(e,t){const n=[],s=[];for(let o=0;o=e&&(-1===t||s[t]>s[n])&&(t=n);s[t]=e}return[n,s]}(t.x.shape,s.perm);let d=!0;for(let e=0;e({dataId:e,dtype:t,shape:d})))}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/ZerosLike.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/ZerosLike.js ***! + \******************************************************************************/ +/*! exports provided: zerosLikeConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"zerosLikeConfig",(function(){return s}));const s={kernelName:n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js").ZerosLike,backendName:"wasm",kernelFunc: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){const{inputs:{x:t},backend:n}=e,s=n.makeOutput(t.shape,t.dtype);return n.typedArrayFromHeap(s).fill(0),s}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/_FusedMatMul.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/_FusedMatMul.js ***! + \*********************************************************************************/ +/*! exports provided: fusedMatMulConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"fusedMatMulConfig",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./types */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/types.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +let r;const i={kernelName:s._FusedMatMul,backendName:"wasm",setupFunc:function(e){r=e.wasm.cwrap(s._FusedMatMul,null,["number","array","number","number","array","number","number","number","number","number","number","number","number"])},kernelFunc:function(e){const{inputs:t,backend:n,attrs:s}=e,{a:i,b:a,bias:u,preluActivationWeights:d}=t;if("float32"!==i.dtype||"float32"!==a.dtype)throw new Error("_FusedMatMul for non non-float32 tensors not yet supported.");const{transposeA:l,transposeB:c,activation:f,leakyreluAlpha:p}=s,m=n.dataIdMap.get(i.dataId).id,h=n.dataIdMap.get(a.dataId).id;let b=0;if(null!=u){const e=n.dataIdMap.get(u.dataId);if(1!==e.shape.length)throw new Error(`_FusedMatMul only supports rank-1 bias but got rank ${e.shape.length}.`);b=e.id}const j=null==d?0:n.dataIdMap.get(d.dataId).id,g=o.FusableActivation[f];if(null==g)throw new Error(`${f} activation not yet supported for FusedConv2D in the wasm backend.`);const w=l?i.shape[2]:i.shape[1],_=c?a.shape[1]:a.shape[2],k=i.shape[0],v=n.makeOutput([k,w,_],i.dtype),x=n.dataIdMap.get(v.dataId).id,y=new Uint8Array(new Int32Array(i.shape).buffer),O=new Uint8Array(new Int32Array(a.shape).buffer);return r(m,y,i.shape.length,h,O,a.shape.length,l,c,g,b,j,p||0,x),v}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js": +/*!**********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/binary_kernel.js ***! + \**********************************************************************************/ +/*! exports provided: createBinaryKernelConfig */function(e,t,n){"use strict";n.r(t),n.d(t,"createBinaryKernelConfig",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./types */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/types.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e,t,n){let r;return{kernelName:e,backendName:"wasm",setupFunc:function(t){r=t.wasm.cwrap(e,null,["number","array","number","number","array","number","number","number"])},kernelFunc:function(i){const{backend:a,inputs:u}=i,{a:d,b:l}=u,c=a.dataIdMap.get(d.dataId).id,f=a.dataIdMap.get(l.dataId).id,p=null!=n?n:d.dtype,m=s.backend_util.assertAndGetBroadcastShape(d.shape,l.shape),h=a.makeOutput(m,p);if(0===s.util.sizeFromShape(m))return h;const b=new Uint8Array(new Int32Array(d.shape).buffer),j=new Uint8Array(new Int32Array(l.shape).buffer),g=a.dataIdMap.get(h.dataId).id,w=()=>r(c,b,d.shape.length,f,j,l.shape.length,o.CppDType[d.dtype],g);if(t&&"float32"===d.dtype)return w(),h;const _=s.backend_util.getBroadcastDims(d.shape,m),k=s.backend_util.getBroadcastDims(l.shape,m),v=_.every(((e,t)=>e===t)),x=k.every(((e,t)=>e===t));if(v&&x)return w(),h;throw new Error(`Broadcasting along outer dims is not yet supported for ${d.dtype} ${e}.`)}}}},"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/kernel_utils.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/kernel_utils.js ***! + \*********************************************************************************/ +/*! exports provided: permuteAxesAndTranspose */function(e,t,n){"use strict";n.r(t),n.d(t,"permuteAxesAndTranspose",(function(){return r}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./Transpose */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Transpose.js"); +/** + * @license + * Copyright 2020 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e,t,n){const r=e.shape,i=e.shape.length,a=s.util.parseAxisParam(t,r);let u=a;const d=s.backend_util.getAxesPermutation(u,i);let l=null,c=!1;if(null!=d){const t=new Array(i);for(let e=0;e1&&s.argv[1].replace(/\\/g,"/"),b=s.argv.slice(2),s.on("uncaughtException",(function(e){if(!(e instanceof ln))throw e})),s.on("unhandledRejection",ke),j=function(e){s.exit(e)},p.inspect=function(){return"[Emscripten Module object]"};try{N=n(/*! worker_threads */6)}catch(e){throw console.error('The "worker_threads" module is not supported in this node.js build - perhaps a newer version is needed?'),e}r.Worker=N.Worker}else k?("undefined"!=typeof read&&(x=function(e){return read(e)}),O=function(e){var t;return"function"==typeof readbuffer?new Uint8Array(readbuffer(e)):(W("object"==typeof(t=read(e,"binary"))),t)},"undefined"!=typeof scriptArgs?b=scriptArgs:"undefined"!=typeof arguments&&(b=arguments),"function"==typeof quit&&(j=function(e){quit(e)}),"undefined"!=typeof print&&("undefined"==typeof console&&(console={}),console.log=print,console.warn=console.error="undefined"!=typeof printErr?printErr:print)):(g||w)&&(w?S=self.location.href:"undefined"!=typeof document&&document.currentScript&&(S=document.currentScript.src),"undefined"!=typeof i&&i&&(S=i),S=0!==S.indexOf("blob:")?S.substr(0,S.lastIndexOf("/")+1):"",_?(x=function(e,t){return I||(I=n(/*! fs */5)),C||(C=n(/*! path */4)),e=C.normalize(e),I.readFileSync(e,t?null:"utf8")},O=function(e){var t=x(e,!0);return t.buffer||(t=new Uint8Array(t)),W(t.buffer),t}):(x=function(e){var t=new XMLHttpRequest;return t.open("GET",e,!1),t.send(null),t.responseText},w&&(O=function(e){var t=new XMLHttpRequest;return t.open("GET",e,!1),t.responseType="arraybuffer",t.send(null),new Uint8Array(t.response)}),y=function(e,t,n){var s=new XMLHttpRequest;s.open("GET",e,!0),s.responseType="arraybuffer",s.onload=function(){200==s.status||0==s.status&&s.response?t(s.response):n()},s.onerror=n,s.send(null)}));_&&"undefined"==typeof performance&&(r.performance=n(/*! perf_hooks */7).performance);var E,A=p.print||console.log.bind(console),R=p.printErr||console.warn.bind(console);for(m in h)h.hasOwnProperty(m)&&(p[m]=h[m]);h=null,p.arguments&&(b=p.arguments),p.thisProgram&&p.thisProgram,p.quit&&(j=p.quit),Atomics.load,Atomics.store,Atomics.compareExchange,p.wasmBinary&&(E=p.wasmBinary);var F,M,$=p.noExitRuntime||!0;"object"!=typeof WebAssembly&&ke("no native wasm support detected");var D,P,B,L,z,G,U=!1;function W(e,t){e||ke("Assertion failed: "+t)}function V(e){var t=p["_"+e];return W(t,"Cannot call unknown function "+e+", make sure it is exported"),t}function q(e,t,n,s,o){var r={string:function(e){var t=0;if(null!=e&&0!==e){var n=1+(e.length<<2);Z(e,t=on(n),n)}return t},array:function(e){var t=on(e.length);return J(e,t),t}},i=V(e),a=[],u=0;if(s)for(var d=0;d=s);){var r=e[t++];if(!r)return o;if(128&r){var i=63&e[t++];if(192!=(224&r)){var a=63&e[t++];if((r=224==(240&r)?(15&r)<<12|i<<6|a:(7&r)<<18|i<<12|a<<6|63&e[t++])<65536)o+=String.fromCharCode(r);else{var u=r-65536;o+=String.fromCharCode(55296|u>>10,56320|1023&u)}}else o+=String.fromCharCode((31&r)<<6|i)}else o+=String.fromCharCode(r)}return o}function X(e,t){return e?K(a(),e,t):""}function Y(e,t,n,s){if(!(s>0))return 0;for(var o=n,r=n+s-1,i=0;i=55296&&a<=57343&&(a=65536+((1023&a)<<10)|1023&e.charCodeAt(++i)),a<=127){if(n>=r)break;t[n++]=a}else if(a<=2047){if(n+1>=r)break;t[n++]=192|a>>6,t[n++]=128|63&a}else if(a<=65535){if(n+2>=r)break;t[n++]=224|a>>12,t[n++]=128|a>>6&63,t[n++]=128|63&a}else{if(n+3>=r)break;t[n++]=240|a>>18,t[n++]=128|a>>12&63,t[n++]=128|a>>6&63,t[n++]=128|63&a}}return t[n]=0,n-o}function Z(e,t,n){return Y(e,a(),t,n)}function Q(e){for(var t=0,n=0;n=55296&&s<=57343&&(s=65536+((1023&s)<<10)|1023&e.charCodeAt(++n)),s<=127?++t:t+=s<=2047?2:s<=65535?3:4}return t}function J(e,n){t().set(e,n)}function ee(e,t){return e%t>0&&(e+=t-e%t),e}function te(e){D=e,p.HEAP8=P=new Int8Array(e),p.HEAP16=new Int16Array(e),p.HEAP32=L=new Int32Array(e),p.HEAPU8=B=new Uint8Array(e),p.HEAPU16=new Uint16Array(e),p.HEAPU32=z=new Uint32Array(e),p.HEAPF32=new Float32Array(e),p.HEAPF64=G=new Float64Array(e)}var ne,se=p.INITIAL_MEMORY||16777216;if(v)F=p.wasmMemory,D=p.buffer;else if(p.wasmMemory)F=p.wasmMemory;else if(!((F=new WebAssembly.Memory({initial:se/65536,maximum:32768,shared:!0})).buffer instanceof SharedArrayBuffer))throw R("requested a shared WebAssembly.Memory but the returned buffer is not a SharedArrayBuffer, indicating that while the browser has SharedArrayBuffer it does not have WebAssembly threads support - you may need to set a flag"),_&&console.log("(on node you may need: --experimental-wasm-threads --experimental-wasm-bulk-memory and also use a recent version)"),Error("bad memory");F&&(D=F.buffer),se=D.byteLength,te(D);var oe=[],re=[],ie=[],ae=[],ue=[];function de(){if(!v){if(p.preRun)for("function"==typeof p.preRun&&(p.preRun=[p.preRun]);p.preRun.length;)me(p.preRun.shift());Re(oe)}}function le(){v||Re(re)}function ce(){v||Re(ie)}function fe(){}function pe(){if(!v){if(p.postRun)for("function"==typeof p.postRun&&(p.postRun=[p.postRun]);p.postRun.length;)he(p.postRun.shift());Re(ue)}}function me(e){oe.unshift(e)}function he(e){ue.unshift(e)}v||re.push({func:function(){Gt()}});var be=0,je=null,ge=null;function we(e){W(!v,"addRunDependency cannot be used in a pthread worker"),be++,p.monitorRunDependencies&&p.monitorRunDependencies(be)}function _e(e){if(be--,p.monitorRunDependencies&&p.monitorRunDependencies(be),0==be&&(null!==je&&(clearInterval(je),je=null),ge)){var t=ge;ge=null,t()}}function ke(e){p.onAbort&&p.onAbort(e),v&&console.error("Pthread aborting at "+(new Error).stack),R(e+=""),U=!0,e="abort("+e+"). Build with -s ASSERTIONS=1 for more info.";var t=new WebAssembly.RuntimeError(e);throw f(t),t}function ve(e,t){return String.prototype.startsWith?e.startsWith(t):0===e.indexOf(t)}p.preloadedImages={},p.preloadedAudios={};var xe="data:application/octet-stream;base64,";function ye(e){return ve(e,xe)}var Oe="file://";function Ie(e){return ve(e,Oe)}var Ce="tfjs-backend-wasm-threaded-simd.wasm";function Se(e){try{if(e==Ce&&E)return new Uint8Array(E);if(O)return O(e);throw"both async and sync fetching of the wasm failed"}catch(e){ke(e)}}function Te(){if(!E&&(g||w)){if("function"==typeof fetch&&!Ie(Ce))return fetch(Ce,{credentials:"same-origin"}).then((function(e){if(!e.ok)throw"failed to load wasm binary file at '"+Ce+"'";return e.arrayBuffer()})).catch((function(){return Se(Ce)}));if(y)return new Promise((function(e,t){y(Ce,(function(t){e(new Uint8Array(t))}),t)}))}return Promise.resolve().then((function(){return Se(Ce)}))}function Ne(){var e={a:zt};function t(e,t){var n=e.exports;if(p.asm=n,ne=p.asm.F,M=t,!v){var s=Be.unusedWorkers.length;Be.unusedWorkers.forEach((function(e){Be.loadWasmModuleToWorker(e,(function(){--s||_e()}))}))}}function n(e){t(e.instance,e.module)}function s(t){return Te().then((function(t){return WebAssembly.instantiate(t,e)})).then(t,(function(e){R("failed to asynchronously prepare wasm: "+e),ke(e)}))}if(v||we(),p.instantiateWasm)try{return p.instantiateWasm(e,t)}catch(e){return R("Module.instantiateWasm callback failed with error: "+e),!1}return(E||"function"!=typeof WebAssembly.instantiateStreaming||ye(Ce)||Ie(Ce)||"function"!=typeof fetch?s(n):fetch(Ce,{credentials:"same-origin"}).then((function(t){return WebAssembly.instantiateStreaming(t,e).then(n,(function(e){return R("wasm streaming compile failed: "+e),R("falling back to ArrayBuffer instantiation"),s(n)}))}))).catch(f),{}}ye(Ce)||(Ce=T(Ce));var Ee={9832:function(){throw"Canceled!"},9850:function(e,t){setTimeout((function(){Zt(e,t)}),0)}};function Ae(){Be.initRuntime()}function Re(e){for(;e.length>0;){var t=e.shift();if("function"!=typeof t){var n=t.func;"number"==typeof n?void 0===t.arg?ne.get(n)():ne.get(n)(t.arg):n(void 0===t.arg?null:t.arg)}else t(p)}}function Fe(e,n){if(e<=0||e>t().length||!0&e||n<0)return-28;if(0==n)return 0;n>=2147483647&&(n=1/0);var s=Atomics.load(u(),dn>>2),o=0;if(s==e&&Atomics.compareExchange(u(),dn>>2,s,0)==s&&(o=1,--n<=0))return 1;var r=Atomics.notify(u(),e>>2,n);if(r>=0)return r+o;throw"Atomics.notify returned an unexpected value "+r}function Me(e){if(v)throw"Internal Error! killThread() can only ever be called from main application thread!";if(!e)throw"Internal Error! Null pthread_ptr in killThread!";u()[e+12>>2]=0;var t=Be.pthreads[e];t.worker.terminate(),Be.freeThreadData(t),Be.runningWorkers.splice(Be.runningWorkers.indexOf(t.worker),1),t.worker.pthread=void 0}function $e(e){if(v)throw"Internal Error! cancelThread() can only ever be called from main application thread!";if(!e)throw"Internal Error! Null pthread_ptr in cancelThread!";Be.pthreads[e].worker.postMessage({cmd:"cancel"})}function De(e){if(v)throw"Internal Error! cleanupThread() can only ever be called from main application thread!";if(!e)throw"Internal Error! Null pthread_ptr in cleanupThread!";var t=Be.pthreads[e];if(t){u()[e+12>>2]=0;var n=t.worker;Be.returnWorkerToPool(n)}}p._emscripten_futex_wake=Fe;var Pe,Be={unusedWorkers:[],runningWorkers:[],initMainThreadBlock:function(){for(var e=Math.min(4,Math.max(1,(navigator.hardwareConcurrency||1)/2)),t=0;t>2]=e;var n=e+152;u()[n>>2]=n;var s=Ut(512);for(t=0;t<128;++t)d()[s/4+t]=0;Atomics.store(d(),e+100>>2,s),Atomics.store(d(),e+40>>2,e),tn(e,!w,1),Yt(e)},initWorker:function(){},pthreads:{},threadExitHandlers:[],setThreadStatus:function(){},runExitHandlers:function(){for(;Be.threadExitHandlers.length>0;)Be.threadExitHandlers.pop()();v&&Ht()&&Kt()},runExitHandlersAndDeinitThread:function(e,t){Atomics.store(d(),e+56>>2,1),Atomics.store(d(),e+60>>2,0),Be.runExitHandlers(),Atomics.store(d(),e+4>>2,t),Atomics.store(d(),e+0>>2,1),Fe(e+0,2147483647),tn(0,0,0)},threadExit:function(e){var t=Ht();t&&(Be.runExitHandlersAndDeinitThread(t,e),v&&postMessage({cmd:"exit"}))},threadCancel:function(){Be.runExitHandlersAndDeinitThread(Ht(),-1),postMessage({cmd:"cancelDone"})},terminateAllThreads:function(){for(var e in Be.pthreads)(s=Be.pthreads[e])&&s.worker&&Be.returnWorkerToPool(s.worker);Be.pthreads={};for(var t=0;t>2];u()[e.threadInfoStruct+100>>2]=0,Wt(t),Wt(e.threadInfoStruct)}e.threadInfoStruct=0,e.allocatedOwnStack&&e.stackBase&&Wt(e.stackBase),e.stackBase=0,e.worker&&(e.worker.pthread=null)}},returnWorkerToPool:function(e){Be.runWithoutMainThreadQueuedCalls((function(){delete Be.pthreads[e.pthread.threadInfoStruct],Be.unusedWorkers.push(e),Be.runningWorkers.splice(Be.runningWorkers.indexOf(e),1),Be.freeThreadData(e.pthread),e.pthread=void 0}))},runWithoutMainThreadQueuedCalls:function(e){u()[un>>2]=0;try{e()}finally{u()[un>>2]=1}},receiveObjectTransfer:function(e){},loadWasmModuleToWorker:function(e,t){e.onmessage=function(n){var s=n.data,o=s.cmd;if(e.pthread&&(Be.currentProxiedOperationCallerThread=e.pthread.threadInfoStruct),s.targetThread&&s.targetThread!=Ht()){var r=Be.pthreads[s.targetThread];return r?r.worker.postMessage(n.data,s.transferList):console.error('Internal error! Worker sent a message "'+o+'" to target pthread '+s.targetThread+", but that thread no longer exists!"),void(Be.currentProxiedOperationCallerThread=void 0)}if("processQueuedMainThreadWork"===o)Xt();else if("spawnThread"===o)$t(n.data);else if("cleanupThread"===o)De(s.thread);else if("killThread"===o)Me(s.thread);else if("cancelThread"===o)$e(s.thread);else if("loaded"===o)e.loaded=!0,t&&t(e),e.runPthread&&(e.runPthread(),delete e.runPthread);else if("print"===o)A("Thread "+s.threadId+": "+s.text);else if("printErr"===o)R("Thread "+s.threadId+": "+s.text);else if("alert"===o)alert("Thread "+s.threadId+": "+s.text);else if("exit"===o)e.pthread&&Atomics.load(d(),e.pthread.threadInfoStruct+64>>2)&&Be.returnWorkerToPool(e);else if("exitProcess"===o)try{fn(s.returnCode)}catch(n){if(n instanceof ln)return;throw n}else"cancelDone"===o?Be.returnWorkerToPool(e):"objectTransfer"===o?Be.receiveObjectTransfer(n.data):"setimmediate"===n.data.target?e.postMessage(n.data):R("worker sent an unknown command "+o);Be.currentProxiedOperationCallerThread=void 0},e.onerror=function(e){R("pthread sent an error! "+e.filename+":"+e.lineno+": "+e.message)},_&&(e.on("message",(function(t){e.onmessage({data:t})})),e.on("error",(function(t){e.onerror(t)})),e.on("exit",(function(e){}))),e.postMessage({cmd:"load",urlOrBlob:p.mainScriptUrlOrBlob||i,wasmMemory:F,wasmModule:M})},allocateUnusedWorker:function(){var e=T("tfjs-backend-wasm-threaded-simd.worker.js");Be.unusedWorkers.push(new Worker(e))},getNewWorker:function(){return 0==Be.unusedWorkers.length&&(Be.allocateUnusedWorker(),Be.loadWasmModuleToWorker(Be.unusedWorkers[0])),Be.unusedWorkers.length>0?Be.unusedWorkers.pop():null},busySpinWait:function(e){for(var t=performance.now()+e;performance.now()>2]=e,e}function qe(e,t){if(v)return et(1,1,e,t)}function He(e,t){if(e==t)postMessage({cmd:"processQueuedMainThreadWork"});else if(v)postMessage({targetThread:e,cmd:"processThreadQueue"});else{var n=Be.pthreads[e],s=n&&n.worker;if(!s)return;s.postMessage({cmd:"processThreadQueue"})}return 1}function Ke(){ke()}function Xe(e,t,n){var s=st(t,n);return Ee[e].apply(null,s)}function Ye(e,t){}function Ze(e,n,s){if(e<=0||e>t().length||!0&e)return-28;if(g){if(Atomics.load(u(),e>>2)!=n)return-6;var o=performance.now(),r=o+s;for(Atomics.exchange(u(),dn>>2,e);;){if((o=performance.now())>r)return Atomics.exchange(u(),dn>>2,0),-73;if(0==Atomics.exchange(u(),dn>>2,0))break;if(Xt(),Atomics.load(u(),e>>2)!=n)return-6;Atomics.exchange(u(),dn>>2,e)}return 0}var i=Atomics.wait(u(),e>>2,n,s);if("timed-out"===i)return-73;if("not-equal"===i)return-6;if("ok"===i)return 0;throw"Atomics.wait returned an unexpected value "+i}function Qe(e,t,n){a().copyWithin(e,t,t+n)}function Je(){return _?n(/*! os */8).cpus().length:navigator.hardwareConcurrency}function et(e,t){for(var n=arguments.length-2,s=nn(),o=n,r=on(8*o),i=r>>3,a=0;a>=2;n=a()[e++];){var s=n<105;s&&1&t&&t++,nt.push(s?l()[t++>>1]:u()[t]),++t}return nt}function ot(e,t,n){tt.length=t;for(var s=n>>3,o=0;o>>16),te(F.buffer),1}catch(e){}}function at(e){var t=rt();if(e<=t)return!1;var n=2147483648;if(e>n)return!1;for(var s=1;s<=4;s*=2){var o=t*(1+.2/s);if(o=Math.min(o,e+100663296),it(Math.min(n,ee(Math.max(e,o),65536))))return!0}return!1}var ut={inEventHandler:0,removeAllEventListeners:function(){for(var e=ut.eventHandlers.length-1;e>=0;--e)ut._removeHandler(e);ut.eventHandlers=[],ut.deferredCalls=[]},registerRemoveEventListeners:function(){ut.removeEventListenersRegistered||(ae.push(ut.removeAllEventListeners),ut.removeEventListenersRegistered=!0)},deferredCalls:[],deferCall:function(e,t,n){function s(e,t){if(e.length!=t.length)return!1;for(var n in e)if(e[n]!=t[n])return!1;return!0}for(var o in ut.deferredCalls){var r=ut.deferredCalls[o];if(r.targetFunction==e&&s(r.argsList,n))return}ut.deferredCalls.push({targetFunction:e,precedence:t,argsList:n}),ut.deferredCalls.sort((function(e,t){return e.precedence>2]=n,u()[i+4>>2]=s,u()[i+8>>2]=o,en(0,e,637534208,t,s,i),sn(r)},getTargetThreadForEventCallback:function(e){switch(e){case 1:return 0;case 2:return Be.currentProxiedOperationCallerThread;default:return e}},getNodeNameForTarget:function(e){return e?e==window?"#window":e==screen?"#screen":e&&e.nodeName?e.nodeName:"":""},fullscreenEnabled:function(){return document.fullscreenEnabled||document.webkitFullscreenEnabled}};function dt(e){var t=Q(e)+1,n=Ut(t);return Z(e,n,t),n}function lt(e,t,n,s){var o=nn(),r=on(12),i=0;t&&(i=dt(t)),u()[r>>2]=i,u()[r+4>>2]=n,u()[r+8>>2]=s,en(0,e,657457152,0,i,r),sn(o)}function ct(e,t,n,s){lt(e,t=t?X(t):"",n,s)}function ft(e){return e>2?X(e):e}var pt=[0,"undefined"!=typeof document?document:0,"undefined"!=typeof window?window:0];function mt(e){return e=ft(e),pt[e]||("undefined"!=typeof document?document.querySelector(e):void 0)}function ht(e){return mt(e)}function bt(e,t,n){var s=ht(e);if(!s)return-4;if(s.canvasSharedPtr&&(u()[s.canvasSharedPtr>>2]=t,u()[s.canvasSharedPtr+4>>2]=n),!s.offscreenCanvas&&s.controlTransferredOffscreen)return s.canvasSharedPtr?(ct(u()[s.canvasSharedPtr+8>>2],e,t,n),1):-4;s.offscreenCanvas&&(s=s.offscreenCanvas);var o=!1;if(s.GLctxObject&&s.GLctxObject.GLctx){var r=s.GLctxObject.GLctx.getParameter(2978);o=0===r[0]&&0===r[1]&&r[2]===s.width&&r[3]===s.height}return s.width=t,s.height=n,o&&s.GLctxObject.GLctx.viewport(0,0,t,n),0}function jt(e,t,n){return v?et(2,1,e,t,n):bt(e,t,n)}function gt(e,t,n){return ht(e)?bt(e,t,n):jt(e,t,n)}function wt(e){}function _t(e,t){}function kt(e){var t=e.getExtension("ANGLE_instanced_arrays");if(t)return e.vertexAttribDivisor=function(e,n){t.vertexAttribDivisorANGLE(e,n)},e.drawArraysInstanced=function(e,n,s,o){t.drawArraysInstancedANGLE(e,n,s,o)},e.drawElementsInstanced=function(e,n,s,o,r){t.drawElementsInstancedANGLE(e,n,s,o,r)},1}function vt(e){var t=e.getExtension("OES_vertex_array_object");if(t)return e.createVertexArray=function(){return t.createVertexArrayOES()},e.deleteVertexArray=function(e){t.deleteVertexArrayOES(e)},e.bindVertexArray=function(e){t.bindVertexArrayOES(e)},e.isVertexArray=function(e){return t.isVertexArrayOES(e)},1}function xt(e){var t=e.getExtension("WEBGL_draw_buffers");if(t)return e.drawBuffers=function(e,n){t.drawBuffersWEBGL(e,n)},1}function yt(e){return!!(e.multiDrawWebgl=e.getExtension("WEBGL_multi_draw"))}var Ot={counter:1,buffers:[],programs:[],framebuffers:[],renderbuffers:[],textures:[],uniforms:[],shaders:[],vaos:[],contexts:{},offscreenCanvases:{},timerQueriesEXT:[],programInfos:{},stringCache:{},unpackAlignment:4,recordError:function(e){Ot.lastError||(Ot.lastError=e)},getNewId:function(e){for(var t=Ot.counter++,n=e.length;n>2]:-1;o+=X(u()[n+4*r>>2],i<0?void 0:i)}return o},createContext:function(e,t){var n=e.getContext("webgl",t);return n?Ot.registerContext(n,t):0},registerContext:function(e,t){var n=Ut(8);u()[n+4>>2]=Ht();var s={handle:n,attributes:t,version:t.majorVersion,GLctx:e};return e.canvas&&(e.canvas.GLctxObject=s),Ot.contexts[n]=s,("undefined"==typeof t.enableExtensionsByDefault||t.enableExtensionsByDefault)&&Ot.initExtensions(s),n},makeContextCurrent:function(e){return Ot.currentContext=Ot.contexts[e],p.ctx=Tt=Ot.currentContext&&Ot.currentContext.GLctx,!(e&&!Tt)},getContext:function(e){return Ot.contexts[e]},deleteContext:function(e){Ot.currentContext===Ot.contexts[e]&&(Ot.currentContext=null),"object"==typeof ut&&ut.removeAllHandlersOnTarget(Ot.contexts[e].GLctx.canvas),Ot.contexts[e]&&Ot.contexts[e].GLctx.canvas&&(Ot.contexts[e].GLctx.canvas.GLctxObject=void 0),Wt(Ot.contexts[e].handle),Ot.contexts[e]=null},initExtensions:function(e){if(e||(e=Ot.currentContext),!e.initExtensionsDone){e.initExtensionsDone=!0;var t=e.GLctx;kt(t),vt(t),xt(t),t.disjointTimerQueryExt=t.getExtension("EXT_disjoint_timer_query"),yt(t),(t.getSupportedExtensions()||[]).forEach((function(e){e.indexOf("lose_context")<0&&e.indexOf("debug")<0&&t.getExtension(e)}))}},populateUniformTable:function(e){for(var t=Ot.programs[e],n=Ot.programInfos[e]={uniforms:{},maxUniformLength:0,maxAttributeLength:-1,maxUniformBlockNameLength:-1},s=n.uniforms,o=Tt.getProgramParameter(t,35718),r=0;r>2,s=u()[n+6],o={alpha:!!u()[n+0],depth:!!u()[n+1],stencil:!!u()[n+2],antialias:!!u()[n+3],premultipliedAlpha:!!u()[n+4],preserveDrawingBuffer:!!u()[n+5],powerPreference:It[s],failIfMajorPerformanceCaveat:!!u()[n+7],majorVersion:u()[n+8],minorVersion:u()[n+9],enableExtensionsByDefault:u()[n+10],explicitSwapControl:u()[n+11],proxyContextToMainThread:u()[n+12],renderViaOffscreenBackBuffer:u()[n+13]},r=ht(e);return r?o.explicitSwapControl?0:Ot.createContext(r,o):0}function St(e,t){return Ct(e,t)}var Tt,Nt={mappings:{},buffers:[null,[],[]],printChar:function(e,t){var n=Nt.buffers[e];0===t||10===t?((1===e?A:R)(K(n,0)),n.length=0):n.push(t)},varargs:void 0,get:function(){return Nt.varargs+=4,u()[Nt.varargs-4>>2]},getStr:function(e){return X(e)},get64:function(e,t){return e}};function Et(e){return v?et(3,1,e):0}function At(e,t,n,s,o){if(v)return et(4,1,e,t,n,s,o)}function Rt(e,t,n,s){if(v)return et(5,1,e,t,n,s);for(var o=0,r=0;r>2],d=u()[t+(8*r+4)>>2],l=0;l>2]=o,0}function Ft(e){var t=Be.threadExitHandlers.pop();e&&t()}function Mt(e,t){Be.threadExitHandlers.push((function(){ne.get(e)(t)}))}function $t(e){if(v)throw"Internal Error! spawnThread() can only ever be called from main application thread!";var t=Be.getNewWorker();if(void 0!==t.pthread)throw"Internal error!";if(!e.pthread_ptr)throw"Internal error, no pthread ptr!";Be.runningWorkers.push(t);for(var n=Ut(512),s=0;s<128;++s)u()[n+4*s>>2]=0;var o=e.stackBase+e.stackSize,r=Be.pthreads[e.pthread_ptr]={worker:t,stackBase:e.stackBase,stackSize:e.stackSize,allocatedOwnStack:e.allocatedOwnStack,threadInfoStruct:e.pthread_ptr},i=r.threadInfoStruct>>2;Atomics.store(d(),i+16,e.detached),Atomics.store(d(),i+25,n),Atomics.store(d(),i+10,r.threadInfoStruct),Atomics.store(d(),i+20,e.stackSize),Atomics.store(d(),i+19,o),Atomics.store(d(),i+26,e.stackSize),Atomics.store(d(),i+28,o),Atomics.store(d(),i+29,e.detached);var a=qt()+40;Atomics.store(d(),i+43,a),t.pthread=r;var l={cmd:"run",start_routine:e.startRoutine,arg:e.arg,threadInfoStruct:e.pthread_ptr,stackBase:e.stackBase,stackSize:e.stackSize};t.runPthread=function(){l.time=performance.now(),t.postMessage(l,e.transferList)},t.loaded&&(t.runPthread(),delete t.runPthread)}function Dt(e,t,n,s){if("undefined"==typeof SharedArrayBuffer)return R("Current environment does not support SharedArrayBuffer, pthreads are not available!"),6;if(!e)return R("pthread_create called with a null thread pointer!"),28;var o=[];if(v&&0===o.length)return Qt(687865856,e,t,n,s);var r=0,i=0,a=0;t&&-1!=t?(r=u()[t>>2],r+=81920,i=u()[t+8>>2],a=0!==u()[t+12>>2]):r=2097152;var l=0==i;l?i=an(16,r):W((i-=r)>0);for(var c=Ut(228),f=0;f<57;++f)d()[(c>>2)+f]=0;u()[e>>2]=c,u()[c+12>>2]=c;var p=c+152;u()[p>>2]=p;var m={stackBase:i,stackSize:r,allocatedOwnStack:l,detached:a,startRoutine:n,pthread_ptr:c,arg:s,transferList:o};return v?(m.cmd="spawnThread",postMessage(m,o)):$t(m),0}function Pt(e){if(v)return et(6,1,e);switch(e){case 30:return 16384;case 85:return 131072;case 132:case 133:case 12:case 137:case 138:case 15:case 235:case 16:case 17:case 18:case 19:case 20:case 149:case 13:case 10:case 236:case 153:case 9:case 21:case 22:case 159:case 154:case 14:case 77:case 78:case 139:case 82:case 68:case 67:case 164:case 11:case 29:case 47:case 48:case 95:case 52:case 51:case 46:return 200809;case 27:case 246:case 127:case 128:case 23:case 24:case 160:case 161:case 181:case 182:case 242:case 183:case 184:case 243:case 244:case 245:case 165:case 178:case 179:case 49:case 50:case 168:case 169:case 175:case 170:case 171:case 172:case 97:case 76:case 32:case 173:case 35:case 80:case 81:case 79:return-1;case 176:case 177:case 7:case 155:case 8:case 157:case 125:case 126:case 92:case 93:case 129:case 130:case 131:case 94:case 91:return 1;case 74:case 60:case 69:case 70:case 4:return 1024;case 31:case 42:case 72:return 32;case 87:case 26:case 33:return 2147483647;case 34:case 1:return 47839;case 38:case 36:return 99;case 43:case 37:return 2048;case 0:return 2097152;case 3:return 65536;case 28:return 32768;case 44:return 32767;case 75:return 16384;case 39:return 1e3;case 89:return 700;case 71:return 256;case 40:return 255;case 2:return 100;case 180:return 64;case 25:return 20;case 5:return 16;case 6:return 6;case 73:return 4;case 84:return"object"==typeof navigator&&navigator.hardwareConcurrency||1}return Ve(28),-1}v||Be.initMainThreadBlock();var Bt,Lt=[null,qe,jt,Et,At,Rt,Pt],zt={e:Ue,r:We,x:He,b:Ke,y:Xe,j:Ye,c:Ze,d:Fe,f:Pe,p:Qe,z:Je,u:ot,q:at,v:gt,i:wt,t:_t,w:St,m:Et,n:At,g:Rt,o:Ae,a:F||p.wasmMemory,k:Ft,l:Mt,h:Dt,s:Pt},Gt=(Ne(),p.___wasm_call_ctors=function(){return(Gt=p.___wasm_call_ctors=p.asm.A).apply(null,arguments)}),Ut=(p._init=function(){return(p._init=p.asm.B).apply(null,arguments)},p._register_tensor=function(){return(p._register_tensor=p.asm.C).apply(null,arguments)},p._dispose_data=function(){return(p._dispose_data=p.asm.D).apply(null,arguments)},p._dispose=function(){return(p._dispose=p.asm.E).apply(null,arguments)},p._Abs=function(){return(p._Abs=p.asm.G).apply(null,arguments)},p._Add=function(){return(p._Add=p.asm.H).apply(null,arguments)},p._AddN=function(){return(p._AddN=p.asm.I).apply(null,arguments)},p._All=function(){return(p._All=p.asm.J).apply(null,arguments)},p._Any=function(){return(p._Any=p.asm.K).apply(null,arguments)},p._ArgMax=function(){return(p._ArgMax=p.asm.L).apply(null,arguments)},p._AvgPool=function(){return(p._AvgPool=p.asm.M).apply(null,arguments)},p._BatchMatMul=function(){return(p._BatchMatMul=p.asm.N).apply(null,arguments)},p._Ceil=function(){return(p._Ceil=p.asm.O).apply(null,arguments)},p._ClipByValue=function(){return(p._ClipByValue=p.asm.P).apply(null,arguments)},p._Conv2D=function(){return(p._Conv2D=p.asm.Q).apply(null,arguments)},p._Conv2DBackpropInput=function(){return(p._Conv2DBackpropInput=p.asm.R).apply(null,arguments)},p._Cos=function(){return(p._Cos=p.asm.S).apply(null,arguments)},p._Cosh=function(){return(p._Cosh=p.asm.T).apply(null,arguments)},p._CropAndResize=function(){return(p._CropAndResize=p.asm.U).apply(null,arguments)},p._Cumsum=function(){return(p._Cumsum=p.asm.V).apply(null,arguments)},p._DepthToSpace=function(){return(p._DepthToSpace=p.asm.W).apply(null,arguments)},p._DepthwiseConv2dNative=function(){return(p._DepthwiseConv2dNative=p.asm.X).apply(null,arguments)},p._Equal=function(){return(p._Equal=p.asm.Y).apply(null,arguments)},p._Exp=function(){return(p._Exp=p.asm.Z).apply(null,arguments)},p._FlipLeftRight=function(){return(p._FlipLeftRight=p.asm._).apply(null,arguments)},p._Floor=function(){return(p._Floor=p.asm.$).apply(null,arguments)},p._FloorDiv=function(){return(p._FloorDiv=p.asm.aa).apply(null,arguments)},p._FusedBatchNorm=function(){return(p._FusedBatchNorm=p.asm.ba).apply(null,arguments)},p._FusedConv2D=function(){return(p._FusedConv2D=p.asm.ca).apply(null,arguments)},p._FusedDepthwiseConv2D=function(){return(p._FusedDepthwiseConv2D=p.asm.da).apply(null,arguments)},p._Gather=function(){return(p._Gather=p.asm.ea).apply(null,arguments)},p._GatherNd=function(){return(p._GatherNd=p.asm.fa).apply(null,arguments)},p._Greater=function(){return(p._Greater=p.asm.ga).apply(null,arguments)},p._GreaterEqual=function(){return(p._GreaterEqual=p.asm.ha).apply(null,arguments)},p._LeakyRelu=function(){return(p._LeakyRelu=p.asm.ia).apply(null,arguments)},p._Less=function(){return(p._Less=p.asm.ja).apply(null,arguments)},p._LessEqual=function(){return(p._LessEqual=p.asm.ka).apply(null,arguments)},p._Log=function(){return(p._Log=p.asm.la).apply(null,arguments)},p._LogicalAnd=function(){return(p._LogicalAnd=p.asm.ma).apply(null,arguments)},p._Max=function(){return(p._Max=p.asm.na).apply(null,arguments)},p._MaxPool=function(){return(p._MaxPool=p.asm.oa).apply(null,arguments)},p._Maximum=function(){return(p._Maximum=p.asm.pa).apply(null,arguments)},p._Mean=function(){return(p._Mean=p.asm.qa).apply(null,arguments)},p._Min=function(){return(p._Min=p.asm.ra).apply(null,arguments)},p._Minimum=function(){return(p._Minimum=p.asm.sa).apply(null,arguments)},p._MirrorPad=function(){return(p._MirrorPad=p.asm.ta).apply(null,arguments)},p._Multiply=function(){return(p._Multiply=p.asm.ua).apply(null,arguments)},p._Neg=function(){return(p._Neg=p.asm.va).apply(null,arguments)},p._NonMaxSuppressionV3=function(){return(p._NonMaxSuppressionV3=p.asm.wa).apply(null,arguments)},p._NonMaxSuppressionV4=function(){return(p._NonMaxSuppressionV4=p.asm.xa).apply(null,arguments)},p._NonMaxSuppressionV5=function(){return(p._NonMaxSuppressionV5=p.asm.ya).apply(null,arguments)},p._NotEqual=function(){return(p._NotEqual=p.asm.za).apply(null,arguments)},p._OneHot=function(){return(p._OneHot=p.asm.Aa).apply(null,arguments)},p._PadV2=function(){return(p._PadV2=p.asm.Ba).apply(null,arguments)},p._Pow=function(){return(p._Pow=p.asm.Ca).apply(null,arguments)},p._Prelu=function(){return(p._Prelu=p.asm.Da).apply(null,arguments)},p._Prod=function(){return(p._Prod=p.asm.Ea).apply(null,arguments)},p._RealDiv=function(){return(p._RealDiv=p.asm.Fa).apply(null,arguments)},p._Relu=function(){return(p._Relu=p.asm.Ga).apply(null,arguments)},p._Relu6=function(){return(p._Relu6=p.asm.Ha).apply(null,arguments)},p._ResizeBilinear=function(){return(p._ResizeBilinear=p.asm.Ia).apply(null,arguments)},p._Reverse=function(){return(p._Reverse=p.asm.Ja).apply(null,arguments)},p._RotateWithOffset=function(){return(p._RotateWithOffset=p.asm.Ka).apply(null,arguments)},p._Round=function(){return(p._Round=p.asm.La).apply(null,arguments)},p._Rsqrt=function(){return(p._Rsqrt=p.asm.Ma).apply(null,arguments)},p._ScatterNd=function(){return(p._ScatterNd=p.asm.Na).apply(null,arguments)},p._SelectV2=function(){return(p._SelectV2=p.asm.Oa).apply(null,arguments)},p._Sigmoid=function(){return(p._Sigmoid=p.asm.Pa).apply(null,arguments)},p._Sin=function(){return(p._Sin=p.asm.Qa).apply(null,arguments)},p._Softmax=function(){return(p._Softmax=p.asm.Ra).apply(null,arguments)},p._Sqrt=function(){return(p._Sqrt=p.asm.Sa).apply(null,arguments)},p._Square=function(){return(p._Square=p.asm.Ta).apply(null,arguments)},p._SquaredDifference=function(){return(p._SquaredDifference=p.asm.Ua).apply(null,arguments)},p._Step=function(){return(p._Step=p.asm.Va).apply(null,arguments)},p._StridedSlice=function(){return(p._StridedSlice=p.asm.Wa).apply(null,arguments)},p._Sub=function(){return(p._Sub=p.asm.Xa).apply(null,arguments)},p._Sum=function(){return(p._Sum=p.asm.Ya).apply(null,arguments)},p._Tan=function(){return(p._Tan=p.asm.Za).apply(null,arguments)},p._Tanh=function(){return(p._Tanh=p.asm._a).apply(null,arguments)},p._Tile=function(){return(p._Tile=p.asm.$a).apply(null,arguments)},p._TopK=function(){return(p._TopK=p.asm.ab).apply(null,arguments)},p._Transform=function(){return(p._Transform=p.asm.bb).apply(null,arguments)},p._Transpose=function(){return(p._Transpose=p.asm.cb).apply(null,arguments)},p.__FusedMatMul=function(){return(p.__FusedMatMul=p.asm.db).apply(null,arguments)},p._malloc=function(){return(Ut=p._malloc=p.asm.eb).apply(null,arguments)}),Wt=p._free=function(){return(Wt=p._free=p.asm.fb).apply(null,arguments)},Vt=p.___errno_location=function(){return(Vt=p.___errno_location=p.asm.gb).apply(null,arguments)},qt=p._emscripten_get_global_libc=function(){return(qt=p._emscripten_get_global_libc=p.asm.hb).apply(null,arguments)},Ht=p._pthread_self=function(){return(Ht=p._pthread_self=p.asm.ib).apply(null,arguments)},Kt=p.___pthread_tsd_run_dtors=function(){return(Kt=p.___pthread_tsd_run_dtors=p.asm.jb).apply(null,arguments)},Xt=p._emscripten_main_thread_process_queued_calls=function(){return(Xt=p._emscripten_main_thread_process_queued_calls=p.asm.kb).apply(null,arguments)},Yt=(p._emscripten_current_thread_process_queued_calls=function(){return(p._emscripten_current_thread_process_queued_calls=p.asm.lb).apply(null,arguments)},p._emscripten_register_main_browser_thread_id=function(){return(Yt=p._emscripten_register_main_browser_thread_id=p.asm.mb).apply(null,arguments)}),Zt=p.__emscripten_do_dispatch_to_thread=function(){return(Zt=p.__emscripten_do_dispatch_to_thread=p.asm.nb).apply(null,arguments)},Qt=p._emscripten_sync_run_in_main_thread_4=function(){return(Qt=p._emscripten_sync_run_in_main_thread_4=p.asm.ob).apply(null,arguments)},Jt=p._emscripten_run_in_main_runtime_thread_js=function(){return(Jt=p._emscripten_run_in_main_runtime_thread_js=p.asm.pb).apply(null,arguments)},en=p.__emscripten_call_on_thread=function(){return(en=p.__emscripten_call_on_thread=p.asm.qb).apply(null,arguments)},tn=(p._emscripten_tls_init=function(){return(p._emscripten_tls_init=p.asm.rb).apply(null,arguments)},p.__emscripten_thread_init=function(){return(tn=p.__emscripten_thread_init=p.asm.sb).apply(null,arguments)}),nn=p.stackSave=function(){return(nn=p.stackSave=p.asm.tb).apply(null,arguments)},sn=p.stackRestore=function(){return(sn=p.stackRestore=p.asm.ub).apply(null,arguments)},on=p.stackAlloc=function(){return(on=p.stackAlloc=p.asm.vb).apply(null,arguments)},rn=p._emscripten_stack_set_limits=function(){return(rn=p._emscripten_stack_set_limits=p.asm.wb).apply(null,arguments)},an=p._memalign=function(){return(an=p._memalign=p.asm.xb).apply(null,arguments)},un=p.__emscripten_allow_main_runtime_queued_calls=9824,dn=p.__emscripten_main_thread_futex=11448;function ln(e){this.name="ExitStatus",this.message="Program terminated with exit("+e+")",this.status=e}function cn(e){if(e=e||b,!(be>0)){if(v)return c(p),le(),void postMessage({cmd:"loaded"});de(),be>0||(p.setStatus?(p.setStatus("Running..."),setTimeout((function(){setTimeout((function(){p.setStatus("")}),1),t()}),1)):t())}function t(){Bt||(Bt=!0,p.calledRun=!0,U||(le(),ce(),c(p),p.onRuntimeInitialized&&p.onRuntimeInitialized(),pe()))}}function fn(e,t){if(!t||!$||0!==e){if(!t&&v)throw postMessage({cmd:"exitProcess",returnCode:e}),new ln(e);$||(Be.terminateAllThreads(),fe(),p.onExit&&p.onExit(e),U=!0),j(e,new ln(e))}}if(p.cwrap=H,p.PThread=Be,p.PThread=Be,p.wasmMemory=F,p.ExitStatus=ln,ge=function e(){Bt||cn(),Bt||(ge=e)},p.run=cn,p.preInit)for("function"==typeof p.preInit&&(p.preInit=[p.preInit]);p.preInit.length>0;)p.preInit.pop()();return v&&($=!1,Be.initWorker()),cn(),e.ready});e.exports=a}).call(this,"/index.js",n(/*! ./../../../process/browser.js */"./node_modules/process/browser.js"),"/",n(/*! ./../../../webpack/buildin/global.js */"./node_modules/webpack/buildin/global.js"))},"./node_modules/@tensorflow/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm-threaded-simd.worker.js": +/*!*******************************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm-threaded-simd.worker.js ***! + \*******************************************************************************************************/ +/*! exports provided: wasmWorkerContents */function(e,t,n){"use strict";n.r(t),n.d(t,"wasmWorkerContents",(function(){return s}));const s='var Module={};function threadPrintErr(){var text=Array.prototype.slice.call(arguments).join(" ");console.error(text)}function threadAlert(){var text=Array.prototype.slice.call(arguments).join(" ");postMessage({cmd:"alert",text:text,threadId:Module["_pthread_self"]()})}var err=threadPrintErr;this.alert=threadAlert;Module["instantiateWasm"]=function(info,receiveInstance){var instance=new WebAssembly.Instance(Module["wasmModule"],info);Module["wasmModule"]=null;receiveInstance(instance);return instance.exports};function moduleLoaded(){}this.onmessage=function(e){try{if(e.data.cmd==="load"){Module["wasmModule"]=e.data.wasmModule;Module["wasmMemory"]=e.data.wasmMemory;Module["buffer"]=Module["wasmMemory"].buffer;Module["ENVIRONMENT_IS_PTHREAD"]=true;if(typeof e.data.urlOrBlob==="string"){importScripts(e.data.urlOrBlob)}else{var objectUrl=URL.createObjectURL(e.data.urlOrBlob);importScripts(objectUrl);URL.revokeObjectURL(objectUrl)}WasmBackendModuleThreadedSimd(Module).then(function(instance){Module=instance;moduleLoaded()})}else if(e.data.cmd==="objectTransfer"){Module["PThread"].receiveObjectTransfer(e.data)}else if(e.data.cmd==="run"){Module["__performance_now_clock_drift"]=performance.now()-e.data.time;Module["__emscripten_thread_init"](e.data.threadInfoStruct,0,0);var max=e.data.stackBase;var top=e.data.stackBase+e.data.stackSize;Module["establishStackSpace"](top,max);Module["_emscripten_tls_init"]();Module["PThread"].receiveObjectTransfer(e.data);Module["PThread"].setThreadStatus(Module["_pthread_self"](),1);try{var result=Module["invokeEntryPoint"](e.data.start_routine,e.data.arg);if(!Module["getNoExitRuntime"]())Module["PThread"].threadExit(result)}catch(ex){if(ex==="Canceled!"){Module["PThread"].threadCancel()}else if(ex!="unwind"){if(ex instanceof Module["ExitStatus"]){if(Module["getNoExitRuntime"]()){}else{Module["PThread"].threadExit(ex.status)}}else{Module["PThread"].threadExit(-2);throw ex}}}}else if(e.data.cmd==="cancel"){if(Module["_pthread_self"]()){Module["PThread"].threadCancel()}}else if(e.data.target==="setimmediate"){}else if(e.data.cmd==="processThreadQueue"){if(Module["_pthread_self"]()){Module["_emscripten_current_thread_process_queued_calls"]()}}else{err("worker.js received unknown command "+e.data.cmd);err(e.data)}}catch(ex){err("worker.js onmessage() captured an uncaught exception: "+ex);if(ex&&ex.stack)err(ex.stack);throw ex}};if(typeof process==="object"&&typeof process.versions==="object"&&typeof process.versions.node==="string"){self={location:{href:__filename}};var onmessage=this.onmessage;var nodeWorkerThreads=require("worker_threads");global.Worker=nodeWorkerThreads.Worker;var parentPort=nodeWorkerThreads.parentPort;parentPort.on("message",function(data){onmessage({data:data})});var nodeFS=require("fs");var nodeRead=function(filename){return nodeFS.readFileSync(filename,"utf8")};function globalEval(x){global.require=require;global.Module=Module;eval.call(null,x)}importScripts=function(f){globalEval(nodeRead(f))};postMessage=function(msg){parentPort.postMessage(msg)};if(typeof performance==="undefined"){performance={now:function(){return Date.now()}}}}'},"./node_modules/@tensorflow/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm.js": +/*!**********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm.js ***! + \**********************************************************************************/ +/*! no static exports found */function(e,t,n){(function(t,s,o){var r,i=(r=(r="undefined"!=typeof document&&document.currentScript?document.currentScript.src:void 0)||t,function(e){var t,i,a="undefined"!=typeof(e=e||{})?e:{};a.ready=new Promise((function(e,n){t=e,i=n}));var u,d={};for(u in a)a.hasOwnProperty(u)&&(d[u]=a[u]);var l=[],c=!1,f=!1,p=!1,m=!1;c="object"==typeof window,f="function"==typeof importScripts,p="object"==typeof s&&"object"==typeof s.versions&&"string"==typeof s.versions.node,m=!c&&!p&&!f;var h,b,j,g,w,_="";function k(e){return a.locateFile?a.locateFile(e,_):_+e}p?(_=f?n(/*! path */4).dirname(_)+"/":o+"/",h=function(e,t){return g||(g=n(/*! fs */5)),w||(w=n(/*! path */4)),e=w.normalize(e),g.readFileSync(e,t?null:"utf8")},j=function(e){var t=h(e,!0);return t.buffer||(t=new Uint8Array(t)),C(t.buffer),t},s.argv.length>1&&s.argv[1].replace(/\\/g,"/"),l=s.argv.slice(2),s.on("uncaughtException",(function(e){if(!(e instanceof Me))throw e})),s.on("unhandledRejection",re),a.inspect=function(){return"[Emscripten Module object]"}):m?("undefined"!=typeof read&&(h=function(e){return read(e)}),j=function(e){var t;return"function"==typeof readbuffer?new Uint8Array(readbuffer(e)):(C("object"==typeof(t=read(e,"binary"))),t)},"undefined"!=typeof scriptArgs?l=scriptArgs:"undefined"!=typeof arguments&&(l=arguments),"undefined"!=typeof print&&("undefined"==typeof console&&(console={}),console.log=print,console.warn=console.error="undefined"!=typeof printErr?printErr:print)):(c||f)&&(f?_=self.location.href:"undefined"!=typeof document&&document.currentScript&&(_=document.currentScript.src),r&&(_=r),_=0!==_.indexOf("blob:")?_.substr(0,_.lastIndexOf("/")+1):"",h=function(e){var t=new XMLHttpRequest;return t.open("GET",e,!1),t.send(null),t.responseText},f&&(j=function(e){var t=new XMLHttpRequest;return t.open("GET",e,!1),t.responseType="arraybuffer",t.send(null),new Uint8Array(t.response)}),b=function(e,t,n){var s=new XMLHttpRequest;s.open("GET",e,!0),s.responseType="arraybuffer",s.onload=function(){200==s.status||0==s.status&&s.response?t(s.response):n()},s.onerror=n,s.send(null)});var v,x,y=a.print||console.log.bind(console),O=a.printErr||console.warn.bind(console);for(u in d)d.hasOwnProperty(u)&&(a[u]=d[u]);d=null,a.arguments&&(l=a.arguments),a.thisProgram&&a.thisProgram,a.quit&&a.quit,a.wasmBinary&&(v=a.wasmBinary),a.noExitRuntime,"object"!=typeof WebAssembly&&re("no native wasm support detected");var I=!1;function C(e,t){e||re("Assertion failed: "+t)}function S(e){var t=a["_"+e];return C(t,"Cannot call unknown function "+e+", make sure it is exported"),t}function T(e,t,n,s,o){var r={string:function(e){var t=0;if(null!=e&&0!==e){var n=1+(e.length<<2);B(e,t=Fe(n),n)}return t},array:function(e){var t=Fe(e.length);return L(e,t),t}},i=S(e),a=[],u=0;if(s)for(var d=0;d=s);)++o;if(o-t>16&&e.subarray&&M)return M.decode(e.subarray(t,o));for(var r="";t>10,56320|1023&d)}}else r+=String.fromCharCode((31&i)<<6|a)}else r+=String.fromCharCode(i)}return r}function D(e,t){return e?$(R,e,t):""}function P(e,t,n,s){if(!(s>0))return 0;for(var o=n,r=n+s-1,i=0;i=55296&&a<=57343&&(a=65536+((1023&a)<<10)|1023&e.charCodeAt(++i)),a<=127){if(n>=r)break;t[n++]=a}else if(a<=2047){if(n+1>=r)break;t[n++]=192|a>>6,t[n++]=128|63&a}else if(a<=65535){if(n+2>=r)break;t[n++]=224|a>>12,t[n++]=128|a>>6&63,t[n++]=128|63&a}else{if(n+3>=r)break;t[n++]=240|a>>18,t[n++]=128|a>>12&63,t[n++]=128|a>>6&63,t[n++]=128|63&a}}return t[n]=0,n-o}function B(e,t,n){return P(e,R,t,n)}function L(e,t){A.set(e,t)}function z(e,t){return e%t>0&&(e+=t-e%t),e}function G(e){E=e,a.HEAP8=A=new Int8Array(e),a.HEAP16=new Int16Array(e),a.HEAP32=F=new Int32Array(e),a.HEAPU8=R=new Uint8Array(e),a.HEAPU16=new Uint16Array(e),a.HEAPU32=new Uint32Array(e),a.HEAPF32=new Float32Array(e),a.HEAPF64=new Float64Array(e)}a.INITIAL_MEMORY;var U,W=[],V=[],q=[],H=[];function K(){if(a.preRun)for("function"==typeof a.preRun&&(a.preRun=[a.preRun]);a.preRun.length;)Q(a.preRun.shift());he(W)}function X(){he(V)}function Y(){he(q)}function Z(){if(a.postRun)for("function"==typeof a.postRun&&(a.postRun=[a.postRun]);a.postRun.length;)J(a.postRun.shift());he(H)}function Q(e){W.unshift(e)}function J(e){H.unshift(e)}V.push({func:function(){Ne()}});var ee=0,te=null,ne=null;function se(e){ee++,a.monitorRunDependencies&&a.monitorRunDependencies(ee)}function oe(e){if(ee--,a.monitorRunDependencies&&a.monitorRunDependencies(ee),0==ee&&(null!==te&&(clearInterval(te),te=null),ne)){var t=ne;ne=null,t()}}function re(e){a.onAbort&&a.onAbort(e),O(e+=""),I=!0,e="abort("+e+"). Build with -s ASSERTIONS=1 for more info.";var t=new WebAssembly.RuntimeError(e);throw i(t),t}function ie(e,t){return String.prototype.startsWith?e.startsWith(t):0===e.indexOf(t)}a.preloadedImages={},a.preloadedAudios={};var ae="data:application/octet-stream;base64,";function ue(e){return ie(e,ae)}var de="file://";function le(e){return ie(e,de)}var ce="tfjs-backend-wasm.wasm";function fe(e){try{if(e==ce&&v)return new Uint8Array(v);if(j)return j(e);throw"both async and sync fetching of the wasm failed"}catch(e){re(e)}}function pe(){if(!v&&(c||f)){if("function"==typeof fetch&&!le(ce))return fetch(ce,{credentials:"same-origin"}).then((function(e){if(!e.ok)throw"failed to load wasm binary file at '"+ce+"'";return e.arrayBuffer()})).catch((function(){return fe(ce)}));if(b)return new Promise((function(e,t){b(ce,(function(t){e(new Uint8Array(t))}),t)}))}return Promise.resolve().then((function(){return fe(ce)}))}function me(){var e={a:Te};function t(e,t){var n=e.exports;a.asm=n,G((x=a.asm.i).buffer),U=a.asm.o,oe()}function n(e){t(e.instance)}function s(t){return pe().then((function(t){return WebAssembly.instantiate(t,e)})).then(t,(function(e){O("failed to asynchronously prepare wasm: "+e),re(e)}))}if(se(),a.instantiateWasm)try{return a.instantiateWasm(e,t)}catch(e){return O("Module.instantiateWasm callback failed with error: "+e),!1}return(v||"function"!=typeof WebAssembly.instantiateStreaming||ue(ce)||le(ce)||"function"!=typeof fetch?s(n):fetch(ce,{credentials:"same-origin"}).then((function(t){return WebAssembly.instantiateStreaming(t,e).then(n,(function(e){return O("wasm streaming compile failed: "+e),O("falling back to ArrayBuffer instantiation"),s(n)}))}))).catch(i),{}}function he(e){for(;e.length>0;){var t=e.shift();if("function"!=typeof t){var n=t.func;"number"==typeof n?void 0===t.arg?U.get(n)():U.get(n)(t.arg):n(void 0===t.arg?null:t.arg)}else t(a)}}function be(){re()}function je(e,t,n){R.copyWithin(e,t,t+n)}function ge(){return R.length}function we(e){try{return x.grow(e-E.byteLength+65535>>>16),G(x.buffer),1}catch(e){}}function _e(e){var t=ge(),n=2147483648;if(e>n)return!1;for(var s=1;s<=4;s*=2){var o=t*(1+.2/s);if(o=Math.min(o,e+100663296),we(Math.min(n,z(Math.max(e,o),65536))))return!0}return!1}ue(ce)||(ce=k(ce));var ke={mappings:{},buffers:[null,[],[]],printChar:function(e,t){var n=ke.buffers[e];0===t||10===t?((1===e?y:O)($(n,0)),n.length=0):n.push(t)},varargs:void 0,get:function(){return ke.varargs+=4,F[ke.varargs-4>>2]},getStr:function(e){return D(e)},get64:function(e,t){return e}};function ve(e){return 0}function xe(e,t,n,s,o){}function ye(e,t,n,s){for(var o=0,r=0;r>2],a=F[t+(8*r+4)>>2],u=0;u>2]=o,0}function Oe(){return 6}function Ie(e){return F[Ee()>>2]=e,e}function Ce(e){switch(e){case 30:return 16384;case 85:return 131072;case 132:case 133:case 12:case 137:case 138:case 15:case 235:case 16:case 17:case 18:case 19:case 20:case 149:case 13:case 10:case 236:case 153:case 9:case 21:case 22:case 159:case 154:case 14:case 77:case 78:case 139:case 82:case 68:case 67:case 164:case 11:case 29:case 47:case 48:case 95:case 52:case 51:case 46:return 200809;case 27:case 246:case 127:case 128:case 23:case 24:case 160:case 161:case 181:case 182:case 242:case 183:case 184:case 243:case 244:case 245:case 165:case 178:case 179:case 49:case 50:case 168:case 169:case 175:case 170:case 171:case 172:case 97:case 76:case 32:case 173:case 35:case 80:case 81:case 79:return-1;case 176:case 177:case 7:case 155:case 8:case 157:case 125:case 126:case 92:case 93:case 129:case 130:case 131:case 94:case 91:return 1;case 74:case 60:case 69:case 70:case 4:return 1024;case 31:case 42:case 72:return 32;case 87:case 26:case 33:return 2147483647;case 34:case 1:return 47839;case 38:case 36:return 99;case 43:case 37:return 2048;case 0:return 2097152;case 3:return 65536;case 28:return 32768;case 44:return 32767;case 75:return 16384;case 39:return 1e3;case 89:return 700;case 71:return 256;case 40:return 255;case 2:return 100;case 180:return 64;case 25:return 20;case 5:return 16;case 6:return 6;case 73:return 4;case 84:return"object"==typeof navigator&&navigator.hardwareConcurrency||1}return Ie(28),-1}var Se,Te={a:be,d:je,e:_e,f:ve,c:xe,b:ye,g:Oe,h:Ce},Ne=(me(),a.___wasm_call_ctors=function(){return(Ne=a.___wasm_call_ctors=a.asm.j).apply(null,arguments)}),Ee=(a._init=function(){return(a._init=a.asm.k).apply(null,arguments)},a._register_tensor=function(){return(a._register_tensor=a.asm.l).apply(null,arguments)},a._dispose_data=function(){return(a._dispose_data=a.asm.m).apply(null,arguments)},a._dispose=function(){return(a._dispose=a.asm.n).apply(null,arguments)},a._Abs=function(){return(a._Abs=a.asm.p).apply(null,arguments)},a._Add=function(){return(a._Add=a.asm.q).apply(null,arguments)},a._AddN=function(){return(a._AddN=a.asm.r).apply(null,arguments)},a._All=function(){return(a._All=a.asm.s).apply(null,arguments)},a._Any=function(){return(a._Any=a.asm.t).apply(null,arguments)},a._ArgMax=function(){return(a._ArgMax=a.asm.u).apply(null,arguments)},a._AvgPool=function(){return(a._AvgPool=a.asm.v).apply(null,arguments)},a._BatchMatMul=function(){return(a._BatchMatMul=a.asm.w).apply(null,arguments)},a._Ceil=function(){return(a._Ceil=a.asm.x).apply(null,arguments)},a._ClipByValue=function(){return(a._ClipByValue=a.asm.y).apply(null,arguments)},a._Conv2D=function(){return(a._Conv2D=a.asm.z).apply(null,arguments)},a._Conv2DBackpropInput=function(){return(a._Conv2DBackpropInput=a.asm.A).apply(null,arguments)},a._Cos=function(){return(a._Cos=a.asm.B).apply(null,arguments)},a._Cosh=function(){return(a._Cosh=a.asm.C).apply(null,arguments)},a._CropAndResize=function(){return(a._CropAndResize=a.asm.D).apply(null,arguments)},a._Cumsum=function(){return(a._Cumsum=a.asm.E).apply(null,arguments)},a._DepthToSpace=function(){return(a._DepthToSpace=a.asm.F).apply(null,arguments)},a._DepthwiseConv2dNative=function(){return(a._DepthwiseConv2dNative=a.asm.G).apply(null,arguments)},a._Equal=function(){return(a._Equal=a.asm.H).apply(null,arguments)},a._Exp=function(){return(a._Exp=a.asm.I).apply(null,arguments)},a._FlipLeftRight=function(){return(a._FlipLeftRight=a.asm.J).apply(null,arguments)},a._Floor=function(){return(a._Floor=a.asm.K).apply(null,arguments)},a._FloorDiv=function(){return(a._FloorDiv=a.asm.L).apply(null,arguments)},a._FusedBatchNorm=function(){return(a._FusedBatchNorm=a.asm.M).apply(null,arguments)},a._FusedConv2D=function(){return(a._FusedConv2D=a.asm.N).apply(null,arguments)},a._FusedDepthwiseConv2D=function(){return(a._FusedDepthwiseConv2D=a.asm.O).apply(null,arguments)},a._Gather=function(){return(a._Gather=a.asm.P).apply(null,arguments)},a._GatherNd=function(){return(a._GatherNd=a.asm.Q).apply(null,arguments)},a._Greater=function(){return(a._Greater=a.asm.R).apply(null,arguments)},a._GreaterEqual=function(){return(a._GreaterEqual=a.asm.S).apply(null,arguments)},a._LeakyRelu=function(){return(a._LeakyRelu=a.asm.T).apply(null,arguments)},a._Less=function(){return(a._Less=a.asm.U).apply(null,arguments)},a._LessEqual=function(){return(a._LessEqual=a.asm.V).apply(null,arguments)},a._Log=function(){return(a._Log=a.asm.W).apply(null,arguments)},a._LogicalAnd=function(){return(a._LogicalAnd=a.asm.X).apply(null,arguments)},a._Max=function(){return(a._Max=a.asm.Y).apply(null,arguments)},a._MaxPool=function(){return(a._MaxPool=a.asm.Z).apply(null,arguments)},a._Maximum=function(){return(a._Maximum=a.asm._).apply(null,arguments)},a._Mean=function(){return(a._Mean=a.asm.$).apply(null,arguments)},a._Min=function(){return(a._Min=a.asm.aa).apply(null,arguments)},a._Minimum=function(){return(a._Minimum=a.asm.ba).apply(null,arguments)},a._MirrorPad=function(){return(a._MirrorPad=a.asm.ca).apply(null,arguments)},a._Multiply=function(){return(a._Multiply=a.asm.da).apply(null,arguments)},a._Neg=function(){return(a._Neg=a.asm.ea).apply(null,arguments)},a._NonMaxSuppressionV3=function(){return(a._NonMaxSuppressionV3=a.asm.fa).apply(null,arguments)},a._NonMaxSuppressionV4=function(){return(a._NonMaxSuppressionV4=a.asm.ga).apply(null,arguments)},a._NonMaxSuppressionV5=function(){return(a._NonMaxSuppressionV5=a.asm.ha).apply(null,arguments)},a._NotEqual=function(){return(a._NotEqual=a.asm.ia).apply(null,arguments)},a._OneHot=function(){return(a._OneHot=a.asm.ja).apply(null,arguments)},a._PadV2=function(){return(a._PadV2=a.asm.ka).apply(null,arguments)},a._Pow=function(){return(a._Pow=a.asm.la).apply(null,arguments)},a._Prelu=function(){return(a._Prelu=a.asm.ma).apply(null,arguments)},a._Prod=function(){return(a._Prod=a.asm.na).apply(null,arguments)},a._RealDiv=function(){return(a._RealDiv=a.asm.oa).apply(null,arguments)},a._Relu=function(){return(a._Relu=a.asm.pa).apply(null,arguments)},a._Relu6=function(){return(a._Relu6=a.asm.qa).apply(null,arguments)},a._ResizeBilinear=function(){return(a._ResizeBilinear=a.asm.ra).apply(null,arguments)},a._Reverse=function(){return(a._Reverse=a.asm.sa).apply(null,arguments)},a._RotateWithOffset=function(){return(a._RotateWithOffset=a.asm.ta).apply(null,arguments)},a._Round=function(){return(a._Round=a.asm.ua).apply(null,arguments)},a._Rsqrt=function(){return(a._Rsqrt=a.asm.va).apply(null,arguments)},a._ScatterNd=function(){return(a._ScatterNd=a.asm.wa).apply(null,arguments)},a._SelectV2=function(){return(a._SelectV2=a.asm.xa).apply(null,arguments)},a._Sigmoid=function(){return(a._Sigmoid=a.asm.ya).apply(null,arguments)},a._Sin=function(){return(a._Sin=a.asm.za).apply(null,arguments)},a._Softmax=function(){return(a._Softmax=a.asm.Aa).apply(null,arguments)},a._Sqrt=function(){return(a._Sqrt=a.asm.Ba).apply(null,arguments)},a._Square=function(){return(a._Square=a.asm.Ca).apply(null,arguments)},a._SquaredDifference=function(){return(a._SquaredDifference=a.asm.Da).apply(null,arguments)},a._Step=function(){return(a._Step=a.asm.Ea).apply(null,arguments)},a._StridedSlice=function(){return(a._StridedSlice=a.asm.Fa).apply(null,arguments)},a._Sub=function(){return(a._Sub=a.asm.Ga).apply(null,arguments)},a._Sum=function(){return(a._Sum=a.asm.Ha).apply(null,arguments)},a._Tan=function(){return(a._Tan=a.asm.Ia).apply(null,arguments)},a._Tanh=function(){return(a._Tanh=a.asm.Ja).apply(null,arguments)},a._Tile=function(){return(a._Tile=a.asm.Ka).apply(null,arguments)},a._TopK=function(){return(a._TopK=a.asm.La).apply(null,arguments)},a._Transform=function(){return(a._Transform=a.asm.Ma).apply(null,arguments)},a._Transpose=function(){return(a._Transpose=a.asm.Na).apply(null,arguments)},a.__FusedMatMul=function(){return(a.__FusedMatMul=a.asm.Oa).apply(null,arguments)},a._malloc=function(){return(a._malloc=a.asm.Pa).apply(null,arguments)},a._free=function(){return(a._free=a.asm.Qa).apply(null,arguments)},a.___errno_location=function(){return(Ee=a.___errno_location=a.asm.Ra).apply(null,arguments)}),Ae=a.stackSave=function(){return(Ae=a.stackSave=a.asm.Sa).apply(null,arguments)},Re=a.stackRestore=function(){return(Re=a.stackRestore=a.asm.Ta).apply(null,arguments)},Fe=a.stackAlloc=function(){return(Fe=a.stackAlloc=a.asm.Ua).apply(null,arguments)};function Me(e){this.name="ExitStatus",this.message="Program terminated with exit("+e+")",this.status=e}function $e(e){function n(){Se||(Se=!0,a.calledRun=!0,I||(X(),Y(),t(a),a.onRuntimeInitialized&&a.onRuntimeInitialized(),Z()))}e=e||l,ee>0||(K(),ee>0||(a.setStatus?(a.setStatus("Running..."),setTimeout((function(){setTimeout((function(){a.setStatus("")}),1),n()}),1)):n()))}if(a.cwrap=N,ne=function e(){Se||$e(),Se||(ne=e)},a.run=$e,a.preInit)for("function"==typeof a.preInit&&(a.preInit=[a.preInit]);a.preInit.length>0;)a.preInit.pop()();return $e(),e.ready});e.exports=i}).call(this,"/index.js",n(/*! ./../../../process/browser.js */"./node_modules/process/browser.js"),"/")},"./node_modules/@tensorflow/tfjs-core/dist/backends/backend.js": +/*!*********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/backends/backend.js ***! + \*********************************************************************/ +/*! exports provided: EPSILON_FLOAT32, EPSILON_FLOAT16, DataStorage, KernelBackend */function(e,t,n){"use strict";n.r(t),n.d(t,"EPSILON_FLOAT32",(function(){return s})),n.d(t,"EPSILON_FLOAT16",(function(){return o})),n.d(t,"DataStorage",(function(){return r})),n.d(t,"KernelBackend",(function(){return i})); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const s=1e-7,o=1e-4;class r{constructor(e,t){this.backend=e,this.dataMover=t,this.data=new WeakMap,this.dataIdsCount=0}get(e){return this.data.has(e)||this.dataMover.moveData(this.backend,e),this.data.get(e)}set(e,t){this.dataIdsCount++,this.data.set(e,t)}has(e){return this.data.has(e)}delete(e){return this.dataIdsCount--,this.data.delete(e)}numDataIds(){return this.dataIdsCount}}class i{refCount(e){return a("refCount")}incRef(e){return a("incRef")}timerAvailable(){return!0}time(e){return a("time")}read(e){return a("read")}readSync(e){return a("readSync")}numDataIds(){return a("numDataIds")}disposeData(e,t){return a("disposeData")}write(e,t,n){return a("write")}move(e,t,n,s,o){return a("move")}memory(){return a("memory")}floatPrecision(){return a("floatPrecision")}epsilon(){return 32===this.floatPrecision()?s:o}dispose(){return a("dispose")}}function a(e){throw new Error(`'${e}' not yet implemented or not found in the registry. This kernel may not be supported by the tfjs backend you have chosen`)}},"./node_modules/@tensorflow/tfjs-core/dist/backends/backend_util.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/backends/backend_util.js ***! + \**************************************************************************/ +/*! exports provided: axesAreInnerMostDims, combineLocations, computeOutAndReduceShapes, expandShapeToKeepDim, assertAxesAreInnerMostDims, getAxesPermutation, getUndoAxesPermutation, getInnerMostAxes, getBroadcastDims, getReductionAxes, assertAndGetBroadcastShape, assertParamsConsistent, computeOutShape, computeDilation2DInfo, computePool2DInfo, computePool3DInfo, computeConv2DInfo, computeConv3DInfo, computeDefaultPad, tupleValuesAreOne, eitherStridesOrDilationsAreOne, convertConv2DDataFormat, getFusedDyActivation, getFusedBiasGradient, applyActivation, shouldFuse, PARALLELIZE_THRESHOLD, computeOptimalWindowSize, slice_util, upcastType, getImageCenter, getReshaped, getPermuted, getReshapedPermuted, getSliceBeginCoords, getSliceSize, prepareAndValidate, validateUpdateShape, validateInput, calculateShapes, SELU_SCALEALPHA, SELU_SCALE, ERF_P, ERF_A1, ERF_A2, ERF_A3, ERF_A4, ERF_A5, warn, log, mergeRealAndImagArrays, splitRealAndImagArrays, complexWithEvenIndex, complexWithOddIndex, getComplexWithIndex, assignToTypedArray, exponents, exponent, decodeEinsumEquation, getEinsumPermutation, checkEinsumDimSizes, getEinsumComputePath, isIdentityPermutation, prepareSplitSize, segment_util, fromUint8ToStringArray, fromStringArrayToUint8 */function(e,t,n){"use strict";n.r(t),n.d(t,"fromUint8ToStringArray",(function(){return x})),n.d(t,"fromStringArrayToUint8",(function(){return y}));var s=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),o=n(/*! ../ops/axis_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/axis_util.js");n.d(t,"axesAreInnerMostDims",(function(){return o.axesAreInnerMostDims})),n.d(t,"combineLocations",(function(){return o.combineLocations})),n.d(t,"computeOutAndReduceShapes",(function(){return o.computeOutAndReduceShapes})),n.d(t,"expandShapeToKeepDim",(function(){return o.expandShapeToKeepDim})),n.d(t,"assertAxesAreInnerMostDims",(function(){return o.assertAxesAreInnerMostDims})),n.d(t,"getAxesPermutation",(function(){return o.getAxesPermutation})),n.d(t,"getUndoAxesPermutation",(function(){return o.getUndoAxesPermutation})),n.d(t,"getInnerMostAxes",(function(){return o.getInnerMostAxes}));var r=n(/*! ../ops/broadcast_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js");n.d(t,"getBroadcastDims",(function(){return r.getBroadcastDims})),n.d(t,"getReductionAxes",(function(){return r.getReductionAxes})),n.d(t,"assertAndGetBroadcastShape",(function(){return r.assertAndGetBroadcastShape}));var i=n(/*! ../ops/concat_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/concat_util.js");n.d(t,"assertParamsConsistent",(function(){return i.assertParamsConsistent})),n.d(t,"computeOutShape",(function(){return i.computeOutShape}));var a=n(/*! ../ops/conv_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/conv_util.js");n.d(t,"computeDilation2DInfo",(function(){return a.computeDilation2DInfo})),n.d(t,"computePool2DInfo",(function(){return a.computePool2DInfo})),n.d(t,"computePool3DInfo",(function(){return a.computePool3DInfo})),n.d(t,"computeConv2DInfo",(function(){return a.computeConv2DInfo})),n.d(t,"computeConv3DInfo",(function(){return a.computeConv3DInfo})),n.d(t,"computeDefaultPad",(function(){return a.computeDefaultPad})),n.d(t,"tupleValuesAreOne",(function(){return a.tupleValuesAreOne})),n.d(t,"eitherStridesOrDilationsAreOne",(function(){return a.eitherStridesOrDilationsAreOne})),n.d(t,"convertConv2DDataFormat",(function(){return a.convertConv2DDataFormat}));var u=n(/*! ../ops/fused_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/fused_util.js");n.d(t,"getFusedDyActivation",(function(){return u.getFusedDyActivation})),n.d(t,"getFusedBiasGradient",(function(){return u.getFusedBiasGradient})),n.d(t,"applyActivation",(function(){return u.applyActivation})),n.d(t,"shouldFuse",(function(){return u.shouldFuse}));var d=n(/*! ../ops/reduce_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/reduce_util.js");n.d(t,"PARALLELIZE_THRESHOLD",(function(){return d.PARALLELIZE_THRESHOLD})),n.d(t,"computeOptimalWindowSize",(function(){return d.computeOptimalWindowSize}));var l=n(/*! ../ops/slice_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/slice_util.js");n.d(t,"slice_util",(function(){return l}));var c=n(/*! ../types */"./node_modules/@tensorflow/tfjs-core/dist/types.js");n.d(t,"upcastType",(function(){return c.upcastType}));var f=n(/*! ../ops/rotate_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/rotate_util.js");n.d(t,"getImageCenter",(function(){return f.getImageCenter}));var p=n(/*! ../ops/array_ops_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/array_ops_util.js");n.d(t,"getReshaped",(function(){return p.getReshaped})),n.d(t,"getPermuted",(function(){return p.getPermuted})),n.d(t,"getReshapedPermuted",(function(){return p.getReshapedPermuted})),n.d(t,"getSliceBeginCoords",(function(){return p.getSliceBeginCoords})),n.d(t,"getSliceSize",(function(){return p.getSliceSize}));var m=n(/*! ../ops/gather_nd_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/gather_nd_util.js");n.d(t,"prepareAndValidate",(function(){return m.prepareAndValidate}));var h=n(/*! ../ops/scatter_nd_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/scatter_nd_util.js");n.d(t,"validateUpdateShape",(function(){return h.validateUpdateShape})),n.d(t,"validateInput",(function(){return h.validateInput})),n.d(t,"calculateShapes",(function(){return h.calculateShapes}));var b=n(/*! ../ops/selu_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/selu_util.js");n.d(t,"SELU_SCALEALPHA",(function(){return b.SELU_SCALEALPHA})),n.d(t,"SELU_SCALE",(function(){return b.SELU_SCALE}));var j=n(/*! ../ops/erf_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/erf_util.js");n.d(t,"ERF_P",(function(){return j.ERF_P})),n.d(t,"ERF_A1",(function(){return j.ERF_A1})),n.d(t,"ERF_A2",(function(){return j.ERF_A2})),n.d(t,"ERF_A3",(function(){return j.ERF_A3})),n.d(t,"ERF_A4",(function(){return j.ERF_A4})),n.d(t,"ERF_A5",(function(){return j.ERF_A5}));var g=n(/*! ../log */"./node_modules/@tensorflow/tfjs-core/dist/log.js");n.d(t,"warn",(function(){return g.warn})),n.d(t,"log",(function(){return g.log}));var w=n(/*! ../backends/complex_util */"./node_modules/@tensorflow/tfjs-core/dist/backends/complex_util.js");n.d(t,"mergeRealAndImagArrays",(function(){return w.mergeRealAndImagArrays})),n.d(t,"splitRealAndImagArrays",(function(){return w.splitRealAndImagArrays})),n.d(t,"complexWithEvenIndex",(function(){return w.complexWithEvenIndex})),n.d(t,"complexWithOddIndex",(function(){return w.complexWithOddIndex})),n.d(t,"getComplexWithIndex",(function(){return w.getComplexWithIndex})),n.d(t,"assignToTypedArray",(function(){return w.assignToTypedArray})),n.d(t,"exponents",(function(){return w.exponents})),n.d(t,"exponent",(function(){return w.exponent}));var _=n(/*! ../backends/einsum_util */"./node_modules/@tensorflow/tfjs-core/dist/backends/einsum_util.js");n.d(t,"decodeEinsumEquation",(function(){return _.decodeEinsumEquation})),n.d(t,"getEinsumPermutation",(function(){return _.getEinsumPermutation})),n.d(t,"checkEinsumDimSizes",(function(){return _.checkEinsumDimSizes})),n.d(t,"getEinsumComputePath",(function(){return _.getEinsumComputePath})),n.d(t,"isIdentityPermutation",(function(){return _.isIdentityPermutation}));var k=n(/*! ../ops/split_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/split_util.js");n.d(t,"prepareSplitSize",(function(){return k.prepareSplitSize}));var v=n(/*! ../ops/segment_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/segment_util.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function x(e){try{return e.map((e=>Object(s.decodeString)(e)))}catch(e){throw new Error(`Failed to decode encoded string bytes into utf-8, error: ${e}`)}}function y(e){return e.map((e=>Object(s.encodeString)(e)))}n.d(t,"segment_util",(function(){return v}))},"./node_modules/@tensorflow/tfjs-core/dist/backends/complex_util.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/backends/complex_util.js ***! + \**************************************************************************/ +/*! exports provided: mergeRealAndImagArrays, splitRealAndImagArrays, complexWithEvenIndex, complexWithOddIndex, getComplexWithIndex, assignToTypedArray, exponents, exponent */function(e,t,n){"use strict"; +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function s(e,t){if(e.length!==t.length)throw new Error(`Cannot merge real and imag arrays of different lengths. real:${e.length}, imag: ${t.length}.`);const n=new Float32Array(2*e.length);for(let s=0;s/g;function i(e,t){const n=((e=e.replace(/\s/g,"")).length-e.replace(r,"").length)/o.length;if(n<1)throw new Error("Equations without an arrow are not supported.");if(n>1)throw new Error('Equation must contain exactly one arrow ("->").');const[i,a]=e.split(o);Object(s.assert)(-1===i.indexOf("..."),(()=>'The ellipsis notation ("...") is not supported yet.'));const u=i.split(","),d=u.length;if(t!==d)throw new Error(`Expected ${d} input tensors, received ${t}`);if(d>2)throw new Error("Support for more than 2 input tensors is not implemented yet.");const l=[];for(let e=0;e-1!==e.indexOf(t))))throw new Error(`Output subscripts contain the label ${t} not present in the input subscripts.`);-1===l.indexOf(t)&&l.push(t)}for(let e=0;e-1!==e)),{permutationIndices:n,expandDims:s}}function u(e,t,n){const o=new Array(e);for(let e=0;e`Expected dimension ${o[t[e][n]]} at axis ${n} of input shaped ${JSON.stringify(r)}, but got dimension ${r[n]}`))}}function d(e,t){const n=e,s=[];let o=0;0===e.length&&n.push(-1),o=e.length+1;for(let e=0;ee===t))}function c(e,t){const n=[];for(let s=0;sr&&p.push({score:t[e],boxIndex:e,suppressBeginIndex:0});p.sort(l);const m=i>0?-.5/i:0,h=[],b=[];for(;h.length0;){const t=p.pop(),{score:n,boxIndex:i,suppressBeginIndex:a}=t;if(n=a;--n){const s=u(e,i,h[n]);if(s>=o){c=!0;break}if(t.score=t.score*d(o,m,s),t.score<=r)break}t.suppressBeginIndex=h.length,c||(t.score===n?(h.push(i),b.push(t.score)):t.score>r&&Object(s.binaryInsert)(p,t,l))}const j=h.length,g=n-j;c&&g>0&&(h.push(...new Array(g).fill(0)),b.push(...new Array(g).fill(0)));const w={selectedIndices:h};return a&&(w.selectedScores=b),f&&(w.validOutputs=j),w}function u(e,t,n){const s=e.subarray(4*t,4*t+4),o=e.subarray(4*n,4*n+4),r=Math.min(s[0],s[2]),i=Math.min(s[1],s[3]),a=Math.max(s[0],s[2]),u=Math.max(s[1],s[3]),d=Math.min(o[0],o[2]),l=Math.min(o[1],o[3]),c=Math.max(o[0],o[2]),f=Math.max(o[1],o[3]),p=(a-r)*(u-i),m=(c-d)*(f-l);if(p<=0||m<=0)return 0;const h=Math.max(r,d),b=Math.max(i,l),j=Math.min(a,c),g=Math.min(u,f),w=Math.max(j-h,0)*Math.max(g-b,0);return w/(p+m-w)}function d(e,t,n){const s=Math.exp(t*n*n);return n<=e?s:0}function l(e,t){return e.score-t.score||e.score===t.score&&t.boxIndex-e.boxIndex}},"./node_modules/@tensorflow/tfjs-core/dist/backends/non_max_suppression_util.js": +/*!**************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/backends/non_max_suppression_util.js ***! + \**************************************************************************************/ +/*! exports provided: binaryInsert, binarySearch */function(e,t,n){"use strict"; +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function s(e,t,n){const s=o(e,t,n),r=s<0?-(s+1):s;e.splice(r,0,t)}function o(e,t,n){return function(e,t,n){let s=0,o=e.length,r=0,i=!1;for(;s>>1);const a=n(t,e[r]);a>0?s=r+1:(o=r,i=!a)}return i?s:-s-1}(e,t,n||r)}function r(e,t){return e>t?1:ee();function o(){return new Promise((e=>s((()=>e()))))}}.call(this,n(/*! ./../../../timers-browserify/main.js */"./node_modules/timers-browserify/main.js").setImmediate)},"./node_modules/@tensorflow/tfjs-core/dist/device_util.js": +/*!****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/device_util.js ***! + \****************************************************************/ +/*! exports provided: isMobile, isBrowser */function(e,t,n){"use strict";function s(e){if(e||"undefined"!=typeof navigator&&null!=navigator){if(e||(e=navigator),"ReactNative"===e.product)return!0;const t=e.userAgent||e.vendor||window.opera;return/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(t)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(t.substr(0,4))}return!1}function o(){return"undefined"!=typeof window&&null!=window.document||"undefined"!=typeof WorkerGlobalScope}n.r(t),n.d(t,"isMobile",(function(){return s})),n.d(t,"isBrowser",(function(){return o}))},"./node_modules/@tensorflow/tfjs-core/dist/engine.js": +/*!***********************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/engine.js ***! + \***********************************************************/ +/*! exports provided: Engine, getOrMakeEngine, ENGINE, add */function(e,t,n){"use strict";n.r(t),n.d(t,"Engine",(function(){return h})),n.d(t,"getOrMakeEngine",(function(){return b})),n.d(t,"ENGINE",(function(){return j})),n.d(t,"add",(function(){return g}));var s=n(/*! ./backends/backend */"./node_modules/@tensorflow/tfjs-core/dist/backends/backend.js"),o=n(/*! ./environment */"./node_modules/@tensorflow/tfjs-core/dist/environment.js"),r=n(/*! ./global_util */"./node_modules/@tensorflow/tfjs-core/dist/global_util.js"),i=n(/*! ./kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),a=n(/*! ./kernel_registry */"./node_modules/@tensorflow/tfjs-core/dist/kernel_registry.js"),u=n(/*! ./profiler */"./node_modules/@tensorflow/tfjs-core/dist/profiler.js"),d=n(/*! ./tape */"./node_modules/@tensorflow/tfjs-core/dist/tape.js"),l=n(/*! ./tensor */"./node_modules/@tensorflow/tfjs-core/dist/tensor.js"),c=n(/*! ./tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),f=n(/*! ./util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function p(e){return null!=e.kernelName}class m{constructor(){this.registeredVariables={},this.nextTapeNodeId=0,this.numBytes=0,this.numTensors=0,this.numStringTensors=0,this.numDataBuffers=0,this.gradientDepth=0,this.kernelDepth=0,this.scopeStack=[],this.numDataMovesStack=[],this.nextScopeId=0,this.tensorInfo=new WeakMap,this.profiling=!1,this.activeProfile={newBytes:0,newTensors:0,peakBytes:0,kernels:[],result:null,get kernelNames(){return Array.from(new Set(this.kernels.map((e=>e.name))))}}}dispose(){for(const e in this.registeredVariables)this.registeredVariables[e].dispose()}}class h{constructor(e){this.ENV=e,this.registry={},this.registryFactory={},this.pendingBackendInitId=0,this.state=new m}async ready(){if(null!=this.pendingBackendInit)return this.pendingBackendInit.then((()=>{}));if(null!=this.backendInstance)return;const e=this.getSortedBackends();for(let t=0;t{null!=e.setupFunc&&e.setupFunc(this.backendInstance)}))}disposeRegisteredKernels(e){Object(a.getKernelsForBackend)(e).forEach((t=>{null!=t.disposeFunc&&t.disposeFunc(this.registry[e])}))}initializeBackend(e){const t=this.registryFactory[e];if(null==t)throw new Error(`Cannot initialize backend ${e}, no registration found.`);try{const n=t.factory();if(!n||n instanceof s.KernelBackend||"function"!=typeof n.then)return this.registry[e]=n,{success:!0,asyncInit:!1};{const t=++this.pendingBackendInitId,s=n.then((n=>!(t(tthis.registryFactory[t].priority-this.registryFactory[e].priority))}initializeBackendsAndReturnBest(){const e=this.getSortedBackends();for(let t=0;tthis.startScope(s)),(()=>this.endScope(n)),(()=>(n=t(),n instanceof Promise&&console.error("Cannot return a Promise inside of tidy."),n)))}scopedRun(e,t,n){e();try{const e=n();return t(),e}catch(e){throw t(),e}}nextTensorId(){return h.nextTensorId++}nextVariableId(){return h.nextVariableId++}clone(e){const t=j.runKernel(i.Identity,{x:e}),n={x:e};return this.addTapeNode(this.state.activeScope.name,n,[t],(e=>({x:()=>{const t={x:e},n={dtype:"float32"};return j.runKernel(i.Cast,t,n)}})),[],{}),t}runKernel(e,t,n){null==this.backendName&&this.backend;if(!(null!=Object(a.getKernel)(e,this.backendName)))throw new Error(`Kernel '${e}' not registered for backend '${this.backendName}'`);return this.runKernelFunc({kernelName:e,inputs:t,attrs:n})}shouldCheckForMemLeaks(){return this.ENV.getBool("IS_TEST")}checkKernelForMemLeak(e,t,n){const s=this.backend.numDataIds();let o=0;n.forEach((e=>{o+="complex64"===e.dtype?3:1}));const r=this.state.numDataMovesStack[this.state.numDataMovesStack.length-1],i=s-t-o-r;if(i>0)throw new Error(`Backend '${this.backendName}' has an internal memory leak (${i} data ids) after running '${e}'`)}runKernelFunc(e){let t,n=[];const s=this.isTapeOn(),o=this.state.numBytes,r=this.state.numTensors;let i,u;this.shouldCheckForMemLeaks()&&this.state.numDataMovesStack.push(0),null==this.backendName&&this.backend;const d=p(e)?e.kernelName:null!=this.state.activeScope?this.state.activeScope.name:"";if(p(e)){const{kernelName:t,inputs:o,attrs:r}=e;null==this.backendName&&this.backend;const d=Object(a.getKernel)(t,this.backendName);f.assert(null!=d,(()=>`Cannot find registered kernel '${t}' for backend '${this.backendName}'`)),i=()=>{const e=this.backend.numDataIds();u=d.kernelFunc({inputs:o,attrs:r,backend:this.backend});const i=Array.isArray(u)?u:[u];this.shouldCheckForMemLeaks()&&this.checkKernelForMemLeak(t,e,i);const a=i.map((e=>{if(null!=e.rank)return e;const{dataId:t,shape:n,dtype:s}=e;return this.makeTensorFromDataId(t,n,s)}));if(s){const e=this.getTensorsForGradient(t,o,a);n=this.saveTensorsForBackwardMode(e)}return a}}else{const{forwardFunc:t}=e,o=e=>{s&&(n=e.map((e=>this.keep(this.clone(e)))))};i=()=>{const e=this.backend.numDataIds();u=this.tidy((()=>t(this.backend,o)));const n=Array.isArray(u)?u:[u];return this.shouldCheckForMemLeaks()&&this.checkKernelForMemLeak(d,e,n),n}}const{inputs:l,attrs:c}=e,m=p(e)?null:e.backwardsFunc;let h;return this.scopedRun((()=>this.state.kernelDepth++),(()=>this.state.kernelDepth--),(()=>{this.ENV.getBool("DEBUG")||this.state.profiling?(h=this.profiler.profileKernel(d,l,(()=>i())),this.ENV.getBool("DEBUG")&&this.profiler.logKernelProfile(h),t=h.outputs):t=i()})),s&&this.addTapeNode(d,l,t,m,n,c),this.state.profiling&&this.state.activeProfile.kernels.push({name:d,bytesAdded:this.state.numBytes-o,totalBytesSnapshot:this.state.numBytes,tensorsAdded:this.state.numTensors-r,totalTensorsSnapshot:this.state.numTensors,inputShapes:Object.keys(l).map((e=>null!=l[e]?l[e].shape:null)),outputShapes:t.map((e=>e.shape)),kernelTimeMs:h.timeMs,extraInfo:h.extraInfo}),Array.isArray(u)?t:t[0]}saveTensorsForBackwardMode(e){return e.map((e=>this.keep(this.clone(e))))}getTensorsForGradient(e,t,n){const s=Object(a.getGradient)(e);if(null!=s){const e=s.inputsToSave||[],o=s.outputsToSave||[];let r;s.saveAllInputs?(f.assert(Array.isArray(t),(()=>"saveAllInputs is true, expected inputs to be an array.")),r=Object.keys(t).map((e=>t[e]))):r=e.map((e=>t[e]));const i=n.filter(((e,t)=>o[t]));return r.concat(i)}return[]}makeTensor(e,t,n,s){if(null==e)throw new Error("Values passed to engine.makeTensor() are null");n=n||"float32",s=s||this.backend;let o=e;"string"===n&&f.isString(e[0])&&(o=e.map((e=>f.encodeString(e))));const r=s.write(o,t,n),i=new l.Tensor(t,n,r,this.nextTensorId());if(this.trackTensor(i,s),"string"===n){const e=this.state.tensorInfo.get(r),t=Object(f.bytesFromStringArray)(o);this.state.numBytes+=t-e.bytes,e.bytes=t}return i}makeTensorFromDataId(e,t,n,s){n=n||"float32";const o=new l.Tensor(t,n,e,this.nextTensorId());return this.trackTensor(o,s),o}makeVariable(e,t=!0,n,s){n=n||this.nextVariableId().toString(),null!=s&&s!==e.dtype&&(e=e.cast(s));const o=new l.Variable(e,t,n,this.nextTensorId());if(null!=this.state.registeredVariables[o.name])throw new Error(`Variable with name ${o.name} was already registered`);return this.state.registeredVariables[o.name]=o,this.incRef(o,this.backend),o}trackTensor(e,t){this.state.numTensors++,"string"===e.dtype&&this.state.numStringTensors++;let n=0;"complex64"!==e.dtype&&"string"!==e.dtype&&(n=e.size*f.bytesPerElement(e.dtype)),this.state.numBytes+=n,this.state.tensorInfo.has(e.dataId)||(this.state.numDataBuffers++,this.state.tensorInfo.set(e.dataId,{backend:t||this.backend,dtype:e.dtype,shape:e.shape,bytes:n})),e instanceof l.Variable||this.track(e)}incRef(e,t){this.trackTensor(e,t),this.backend.incRef(e.dataId)}removeDataId(e,t){this.state.tensorInfo.has(e)&&this.state.tensorInfo.get(e).backend===t&&(this.state.tensorInfo.delete(e),this.state.numDataBuffers--)}disposeTensor(e){if(!this.state.tensorInfo.has(e.dataId))return;const t=this.state.tensorInfo.get(e.dataId);if(this.state.numTensors--,"string"===e.dtype&&(this.state.numStringTensors--,this.state.numBytes-=t.bytes),"complex64"!==e.dtype&&"string"!==e.dtype){const t=e.size*f.bytesPerElement(e.dtype);this.state.numBytes-=t}t.backend.disposeData(e.dataId)&&this.removeDataId(e.dataId,t.backend)}disposeVariables(){for(const e in this.state.registeredVariables){const t=this.state.registeredVariables[e];this.disposeVariable(t)}}disposeVariable(e){this.disposeTensor(e),null!=this.state.registeredVariables[e.name]&&delete this.state.registeredVariables[e.name]}memory(){const e=this.backend.memory();return e.numTensors=this.state.numTensors,e.numDataBuffers=this.state.numDataBuffers,e.numBytes=this.state.numBytes,this.state.numStringTensors>0&&(e.unreliable=!0,null==e.reasons&&(e.reasons=[]),e.reasons.push("Memory usage by string tensors is approximate (2 bytes per character)")),e}async profile(e){this.state.profiling=!0;const t=this.state.numBytes,n=this.state.numTensors;this.state.activeProfile.kernels=[],this.state.activeProfile.result=await e(),this.state.profiling=!1,this.state.activeProfile.peakBytes=Math.max(...this.state.activeProfile.kernels.map((e=>e.totalBytesSnapshot))),this.state.activeProfile.newBytes=this.state.numBytes-t,this.state.activeProfile.newTensors=this.state.numTensors-n;for(const e of this.state.activeProfile.kernels)e.kernelTimeMs=await e.kernelTimeMs,e.extraInfo=await e.extraInfo;return this.state.activeProfile}isTapeOn(){return this.state.gradientDepth>0&&0===this.state.kernelDepth}addTapeNode(e,t,n,s,o,r){const i={id:this.state.nextTapeNodeId++,kernelName:e,inputs:t,outputs:n,saved:o},u=Object(a.getGradient)(e);null!=u&&(s=u.gradFunc),null!=s&&(i.gradient=e=>(e=e.map(((e,t)=>{if(null==e){const e=n[t],s=f.makeZerosTypedArray(e.size,e.dtype);return this.makeTensor(s,e.shape,e.dtype)}return e})),s(e.length>1?e:e[0],o,r))),this.state.activeTape.push(i)}keep(e){return e.kept=!0,e}startTape(){0===this.state.gradientDepth&&(this.state.activeTape=[]),this.state.gradientDepth++}endTape(){this.state.gradientDepth--}startScope(e){const t={track:[],name:"unnamed scope",id:this.state.nextScopeId++};e&&(t.name=e),this.state.scopeStack.push(t),this.state.activeScope=t}endScope(e){const t=Object(c.getTensorsInContainer)(e),n=new Set(t.map((e=>e.id)));for(let e=0;e{e.kept||e.scopeId!==s.id||this.track(e)}))}gradients(e,t,n,s=!1){if(f.assert(t.length>0,(()=>"gradients() received an empty list of xs.")),null!=n&&"float32"!==n.dtype)throw new Error(`dy must have 'float32' dtype, but has '${n.dtype}'`);const o=this.scopedRun((()=>this.startTape()),(()=>this.endTape()),(()=>this.tidy("forward",e)));f.assert(o instanceof l.Tensor,(()=>"The result y returned by f() must be a tensor."));const r=Object(d.getFilteredNodesXToY)(this.state.activeTape,t,o);if(!s&&0===r.length&&t.length>0)throw new Error("Cannot compute gradient of y=f(x) with respect to x. Make sure that the f you passed encloses all operations that lead from x to y.");return this.tidy("backward",(()=>{const e={};e[o.id]=null==n?function(e){const t=Object(f.makeOnesTypedArray)(Object(f.sizeFromShape)(e),"float32");return j.makeTensor(t,e,"float32")}(o.shape):n,Object(d.backpropagateGradients)(e,r,(e=>this.tidy(e)),g);const s=t.map((t=>e[t.id]));return 0===this.state.gradientDepth&&(this.state.activeTape.forEach((e=>{for(const t of e.saved)t.dispose()})),this.state.activeTape=null),{value:o,grads:s}}))}customGrad(e){return f.assert(f.isFunction(e),(()=>"The f passed in customGrad(f) must be a function.")),(...t)=>{let n;f.assert(t.every((e=>e instanceof l.Tensor)),(()=>"The args passed in customGrad(f)(x1, x2,...) must all be tensors"));const s={};t.forEach(((e,t)=>{s[t]=e}));return this.runKernelFunc({forwardFunc:(s,o)=>(n=e(...t,o),f.assert(n.value instanceof l.Tensor,(()=>"The function f passed in customGrad(f) must return an object where `obj.value` is a tensor")),f.assert(f.isFunction(n.gradFunc),(()=>"The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function.")),n.value),backwardsFunc:(e,s)=>{const o=n.gradFunc(e,s),r=Array.isArray(o)?o:[o];f.assert(r.length===t.length,(()=>"The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function that returns the same number of tensors as inputs passed to f(...).")),f.assert(r.every((e=>e instanceof l.Tensor)),(()=>"The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function that returns a list of only tensors."));const i={};return r.forEach(((e,t)=>{i[t]=()=>e})),i},inputs:s})}}readSync(e){return this.state.tensorInfo.get(e).backend.readSync(e)}read(e){return this.state.tensorInfo.get(e).backend.read(e)}async time(e){const t=Object(f.now)(),n=await this.backend.time(e);return n.wallMs=Object(f.now)()-t,n}track(e){return null!=this.state.activeScope&&(e.scopeId=this.state.activeScope.id,this.state.activeScope.track.push(e)),e}get registeredVariables(){return this.state.registeredVariables}reset(){this.pendingBackendInitId++,this.state.dispose(),this.ENV.reset(),this.state=new m;for(const e in this.registry)this.disposeRegisteredKernels(e),this.registry[e].dispose(),delete this.registry[e];this.backendName=null,this.backendInstance=null,this.pendingBackendInit=null}}function b(){const e=Object(r.getGlobalNamespace)();if(null==e._tfengine){const t=new o.Environment(e);e._tfengine=new h(t)}return Object(o.setEnvironmentGlobal)(e._tfengine.ENV),Object(l.setTensorTracker)((()=>e._tfengine)),e._tfengine}h.nextTensorId=0,h.nextVariableId=0;const j=b();function g(e,t){const n={a:e,b:t};return j.runKernel(i.Add,n)}},"./node_modules/@tensorflow/tfjs-core/dist/environment.js": +/*!****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/environment.js ***! + \****************************************************************/ +/*! exports provided: Environment, getQueryParams, env, ENV, setEnvironmentGlobal */function(e,t,n){"use strict";n.r(t),n.d(t,"Environment",(function(){return r})),n.d(t,"getQueryParams",(function(){return i})),n.d(t,"env",(function(){return a})),n.d(t,"ENV",(function(){return u})),n.d(t,"setEnvironmentGlobal",(function(){return d}));var s=n(/*! ./util_base */"./node_modules/@tensorflow/tfjs-core/dist/util_base.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */const o="tfjsflags";class r{constructor(e){this.global=e,this.flags={},this.flagRegistry={},this.urlFlags={},this.getQueryParams=i,this.populateURLFlags()}setPlatform(e,t){null!=this.platform&&console.warn(`Platform ${this.platformName} has already been set. Overwriting the platform with ${t}.`),this.platformName=e,this.platform=t}registerFlag(e,t,n){if(this.flagRegistry[e]={evaluationFn:t,setHook:n},null!=this.urlFlags[e]){const t=this.urlFlags[e];console.warn(`Setting feature override from URL ${e}: ${t}.`),this.set(e,t)}}async getAsync(e){return e in this.flags||(this.flags[e]=await this.evaluateFlag(e)),this.flags[e]}get(e){if(e in this.flags)return this.flags[e];const t=this.evaluateFlag(e);if(Object(s.isPromise)(t))throw new Error(`Flag ${e} cannot be synchronously evaluated. Please use getAsync() instead.`);return this.flags[e]=t,this.flags[e]}getNumber(e){return this.get(e)}getBool(e){return this.get(e)}getFlags(){return this.flags}get features(){return this.flags}set(e,t){if(null==this.flagRegistry[e])throw new Error(`Cannot set flag ${e} as it has not been registered.`);this.flags[e]=t,null!=this.flagRegistry[e].setHook&&this.flagRegistry[e].setHook(t)}evaluateFlag(e){if(null==this.flagRegistry[e])throw new Error(`Cannot evaluate flag '${e}': no evaluation function found.`);return this.flagRegistry[e].evaluationFn()}setFlags(e){this.flags=Object.assign({},e)}reset(){this.flags={},this.urlFlags={},this.populateURLFlags()}populateURLFlags(){if("undefined"==typeof this.global||"undefined"==typeof this.global.location||"undefined"==typeof this.global.location.search)return;const e=this.getQueryParams(this.global.location.search);if(o in e){e.tfjsflags.split(",").forEach((e=>{const[t,n]=e.split(":");this.urlFlags[t]=function(e,t){if("true"===(t=t.toLowerCase())||"false"===t)return"true"===t;if(""+ +t===t)return+t;throw new Error(`Could not parse value flag value ${t} for flag ${e}.`)}(t,n)}))}}}function i(e){const t={};return e.replace(/[?&]([^=?&]+)(?:=([^&]*))?/g,((e,...n)=>(function(e,t,n){e[decodeURIComponent(t)]=decodeURIComponent(n||"")}(t,n[0],n[1]),n.join("=")))),t}function a(){return u}let u=null;function d(e){u=e}},"./node_modules/@tensorflow/tfjs-core/dist/flags.js": +/*!**********************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/flags.js ***! + \**********************************************************/ +/*! no exports provided */function(e,t,n){"use strict";n.r(t),function(e){n(/*! ./engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js");var t=n(/*! ./device_util */"./node_modules/@tensorflow/tfjs-core/dist/device_util.js"),s=n(/*! ./environment */"./node_modules/@tensorflow/tfjs-core/dist/environment.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const o=Object(s.env)();o.registerFlag("DEBUG",(()=>!1),(e=>{e&&console.warn("Debugging mode is ON. The output of every math call will be downloaded to CPU and checked for NaNs. This significantly impacts performance.")})),o.registerFlag("IS_BROWSER",(()=>t.isBrowser())),o.registerFlag("IS_NODE",(()=>"undefined"!=typeof e&&"undefined"!=typeof e.versions&&"undefined"!=typeof e.versions.node)),o.registerFlag("IS_CHROME",(()=>"undefined"!=typeof navigator&&null!=navigator&&null!=navigator.userAgent&&/Chrome/.test(navigator.userAgent)&&/Google Inc/.test(navigator.vendor))),o.registerFlag("PROD",(()=>!1)),o.registerFlag("TENSORLIKE_CHECK_SHAPE_CONSISTENCY",(()=>o.getBool("DEBUG"))),o.registerFlag("DEPRECATION_WARNINGS_ENABLED",(()=>!0)),o.registerFlag("IS_TEST",(()=>!1)),o.registerFlag("CHECK_COMPUTATION_FOR_ERRORS",(()=>!0)),o.registerFlag("WRAP_TO_IMAGEBITMAP",(()=>!1))}.call(this,n(/*! ./../../../process/browser.js */"./node_modules/process/browser.js"))},"./node_modules/@tensorflow/tfjs-core/dist/global_util.js": +/*!****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/global_util.js ***! + \****************************************************************/ +/*! exports provided: getGlobalNamespace, getGlobal */function(e,t,n){"use strict";n.r(t),function(e,s){ +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +let o;function r(){if(null==o){let t;if("undefined"!=typeof window)t=window;else if("undefined"!=typeof e)t=e;else if("undefined"!=typeof s)t=s;else{if("undefined"==typeof self)throw new Error("Could not find a global object");t=self}o=t}return o}function i(e,t){const n=function(){const e=r();return null==e._tfGlobals&&(e._tfGlobals=new Map),e._tfGlobals}();if(n.has(e))return n.get(e);{const s=t();return n.set(e,s),n.get(e)}}n.d(t,"getGlobalNamespace",(function(){return r})),n.d(t,"getGlobal",(function(){return i}))}.call(this,n(/*! ./../../../webpack/buildin/global.js */"./node_modules/webpack/buildin/global.js"),n(/*! ./../../../process/browser.js */"./node_modules/process/browser.js"))},"./node_modules/@tensorflow/tfjs-core/dist/globals.js": +/*!************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/globals.js ***! + \************************************************************/ +/*! exports provided: enableProdMode, enableDebugMode, disableDeprecationWarnings, deprecationWarn, disposeVariables, engine, memory, profile, tidy, dispose, keep, time, setBackend, ready, getBackend, removeBackend, findBackend, findBackendFactory, registerBackend, backend, setPlatform */function(e,t,n){"use strict";n.r(t),n.d(t,"enableProdMode",(function(){return a})),n.d(t,"enableDebugMode",(function(){return u})),n.d(t,"disableDeprecationWarnings",(function(){return d})),n.d(t,"deprecationWarn",(function(){return l})),n.d(t,"disposeVariables",(function(){return c})),n.d(t,"engine",(function(){return f})),n.d(t,"memory",(function(){return p})),n.d(t,"profile",(function(){return m})),n.d(t,"tidy",(function(){return h})),n.d(t,"dispose",(function(){return b})),n.d(t,"keep",(function(){return j})),n.d(t,"time",(function(){return g})),n.d(t,"setBackend",(function(){return w})),n.d(t,"ready",(function(){return _})),n.d(t,"getBackend",(function(){return k})),n.d(t,"removeBackend",(function(){return v})),n.d(t,"findBackend",(function(){return x})),n.d(t,"findBackendFactory",(function(){return y})),n.d(t,"registerBackend",(function(){return O})),n.d(t,"backend",(function(){return I})),n.d(t,"setPlatform",(function(){return C}));var s=n(/*! ./engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ./environment */"./node_modules/@tensorflow/tfjs-core/dist/environment.js"),r=n(/*! ./tensor */"./node_modules/@tensorflow/tfjs-core/dist/tensor.js"),i=n(/*! ./tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function a(){Object(o.env)().set("PROD",!0)}function u(){Object(o.env)().set("DEBUG",!0)}function d(){Object(o.env)().set("DEPRECATION_WARNINGS_ENABLED",!1),console.warn("TensorFlow.js deprecation warnings have been disabled.")}function l(e){Object(o.env)().getBool("DEPRECATION_WARNINGS_ENABLED")&&console.warn(e+" You can disable deprecation warnings with tf.disableDeprecationWarnings().")}function c(){s.ENGINE.disposeVariables()}function f(){return s.ENGINE}function p(){return s.ENGINE.memory()}function m(e){return s.ENGINE.profile(e)}function h(e,t){return s.ENGINE.tidy(e,t)}function b(e){Object(i.getTensorsInContainer)(e).forEach((e=>e.dispose()))}function j(e){return s.ENGINE.keep(e)}function g(e){return s.ENGINE.time(e)}function w(e){return s.ENGINE.setBackend(e)}function _(){return s.ENGINE.ready()}function k(){return s.ENGINE.backendName}function v(e){s.ENGINE.removeBackend(e)}function x(e){return s.ENGINE.findBackend(e)}function y(e){return s.ENGINE.findBackendFactory(e)}function O(e,t,n=1){return s.ENGINE.registerBackend(e,t,n)}function I(){return s.ENGINE.backend}function C(e,t){Object(o.env)().setPlatform(e,t)}Object(r.setDeprecationWarningFn)(l)},"./node_modules/@tensorflow/tfjs-core/dist/gradients.js": +/*!**************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients.js ***! + \**************************************************************/ +/*! exports provided: customGrad, variableGrads, valueAndGrad, valueAndGrads, grad, grads */function(e,t,n){"use strict";n.r(t),n.d(t,"customGrad",(function(){return f})),n.d(t,"variableGrads",(function(){return c})),n.d(t,"valueAndGrad",(function(){return d})),n.d(t,"valueAndGrads",(function(){return l})),n.d(t,"grad",(function(){return a})),n.d(t,"grads",(function(){return u}));var s=n(/*! ./engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ./tensor */"./node_modules/@tensorflow/tfjs-core/dist/tensor.js"),r=n(/*! ./tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function a(e){return i.assert(i.isFunction(e),(()=>"The f passed in grad(f) must be a function")),(t,n)=>{const o=Object(r.convertToTensor)(t,"x","tf.grad","string_or_numeric"),a=null!=n?Object(r.convertToTensor)(n,"dy","tf.grad"):null;return s.ENGINE.tidy((()=>{const{value:t,grads:n}=s.ENGINE.gradients((()=>e(o)),[o],a);return null!=a&&i.assertShapesMatch(t.shape,a.shape,"The shape of dy passed in grad(f)(x, dy) must match the shape returned by f(x)"),p(n),n[0]}))}}function u(e){return i.assert(i.isFunction(e),(()=>"The f passed in grads(f) must be a function")),(t,n)=>{i.assert(Array.isArray(t),(()=>"The args passed in grads(f)(args) must be an array of `Tensor`s or `TensorLike`s"));const o=Object(r.convertToTensorArray)(t,"args","tf.grads","string_or_numeric"),a=null!=n?Object(r.convertToTensor)(n,"dy","tf.grads"):null;return s.ENGINE.tidy((()=>{const{value:t,grads:n}=s.ENGINE.gradients((()=>e(...o)),o,a);return null!=a&&i.assertShapesMatch(t.shape,a.shape,"The shape of dy passed in grads(f)([x1,...], dy) must match the shape returned by f([x1,...])"),p(n),n}))}}function d(e){return i.assert(i.isFunction(e),(()=>"The f passed in valueAndGrad(f) must be a function")),(t,n)=>{i.assert(t instanceof o.Tensor,(()=>"The x passed in valueAndGrad(f)(x) must be a tensor")),i.assert(null==n||n instanceof o.Tensor,(()=>"The dy passed in valueAndGrad(f)(x, dy) must be a tensor"));const{grads:r,value:a}=s.ENGINE.gradients((()=>e(t)),[t],n);return p(r),{grad:r[0],value:a}}}function l(e){return i.assert(i.isFunction(e),(()=>"The f passed in valueAndGrads(f) must be a function")),(t,n)=>{i.assert(Array.isArray(t)&&t.every((e=>e instanceof o.Tensor)),(()=>"The args passed in valueAndGrads(f)(args) must be array of tensors")),i.assert(null==n||n instanceof o.Tensor,(()=>"The dy passed in valueAndGrads(f)(args, dy) must be a tensor"));const r=s.ENGINE.gradients((()=>e(...t)),t,n);return null!=n&&i.assertShapesMatch(r.value.shape,n.shape,"The shape of dy passed in valueAndGrads(f)([x1,...], dy) must match the shape returned by f([x1,...])"),p(r.grads),r}}function c(e,t){i.assert(i.isFunction(e),(()=>"The f passed in variableGrads(f) must be a function")),i.assert(null==t||Array.isArray(t)&&t.every((e=>e instanceof o.Variable)),(()=>"The varList passed in variableGrads(f, varList) must be an array of variables"));const n=null!=t;if(!n){t=[];for(const e in s.ENGINE.registeredVariables)t.push(s.ENGINE.registeredVariables[e])}const r=n?t.filter((e=>!e.trainable)):null,a=t.length;t=t.filter((e=>e.trainable)),i.assert(t.length>0,(()=>`variableGrads() expects at least one of the input variables to be trainable, but none of the ${a} variables is trainable.`));const{value:u,grads:d}=s.ENGINE.gradients(e,t,null,!0);i.assert(d.some((e=>null!=e)),(()=>"Cannot find a connection between any variable and the result of the loss function y=f(x). Please make sure the operations that use variables are inside the function f passed to minimize().")),i.assert(0===u.rank,(()=>`The f passed in variableGrads(f) must return a scalar, but it returned a rank-${u.rank} tensor`));const l={};return t.forEach(((e,t)=>{null!=d[t]&&(l[e.name]=d[t])})),null!=r&&r.forEach((e=>l[e.name]=null)),{value:u,grads:l}}function f(e){return s.ENGINE.customGrad(e)}function p(e){if(e.filter((e=>null==e)).length>0)throw new Error("Cannot compute gradient of y=f(x) with respect to x. Make sure that\n the f you passed encloses all operations that lead from x to y.")}},"./node_modules/@tensorflow/tfjs-core/dist/hash_util.js": +/*!**************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/hash_util.js ***! + \**************************************************************/ +/*! exports provided: hexToLong, fingerPrint64 */function(e,t,n){"use strict";n.r(t),n.d(t,"hexToLong",(function(){return r})),n.d(t,"fingerPrint64",(function(){return b}));var s=n(/*! long */"./node_modules/long/src/long.js"); +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const o=n.n(s).a||s;function r(e){return o.fromString(e,!0,16)}const i=r("c3a5c85c97cb3127"),a=r("b492b66fbe98f273"),u=r("9ae16a3b2f90404f");function d(e){return e.xor(e.shru(47))}function l(e,t,n){const s=e.slice(t,t+n);return o.fromBytes(Array.from(s),!0,!0)}function c(e,t){return l(e,t,8)}function f(e,t){return l(e,t,4)}function p(e,t){return 0===t?e:e.shru(t).or(e.shl(64-t))}function m(e,t,n=r("9ddfea08eb382d69")){let s=e.xor(t).mul(n);s=s.xor(s.shru(47));let o=t.xor(s).mul(n);return o=o.xor(o.shru(47)),o=o.mul(n),o}function h(e,t,n,s){return function(e,t,n,s,o,r){o=o.add(e),r=p(r.add(o).add(s),21);const i=o;return o=(o=o.add(t)).add(n),r=r.add(p(o,44)),[o.add(s),r.add(i)]}(c(e,t),c(e,t+8),c(e,t+16),c(e,t+24),n,s)}function b(e,t=e.length){const n=o.fromNumber(81,!0);if(t<=32)return t<=16?function(e,t=e.length){if(t>=8){const n=u.add(2*t),s=c(e,0).add(u),o=c(e,t-8);return m(p(o,37).mul(n).add(s),p(s,25).add(o).mul(n),n)}if(t>=4){const n=u.add(2*t);return m(f(e,0).shl(3).add(t),f(e,t-4),n)}if(t>0){const n=e[0]+(e[t>>1]<<8),s=t+(e[t-1]<<2);return d(u.mul(n).xor(i.mul(s))).mul(u)}return u}(e,t):function(e,t=e.length){const n=u.add(2*t),s=c(e,0).mul(a),o=c(e,8),r=c(e,t-8).mul(n),i=c(e,t-16).mul(u);return m(p(s.add(o),43).add(p(r,30)).add(i),s.add(p(o.add(u),18)).add(r),n)}(e,t);if(t<=64)return function(e,t=e.length){const n=u.add(2*t),s=c(e,0).mul(u),o=c(e,8),r=c(e,t-8).mul(n),i=c(e,t-16).mul(u),a=p(s.add(o),43).add(p(r,30)).add(i),d=m(a,s.add(p(o.add(u),18)).add(r),n),l=c(e,16).mul(n),f=c(e,24),h=a.add(c(e,t-32)).mul(n),b=d.add(c(e,t-24)).mul(n);return m(p(l.add(f),43).add(p(h,30)).add(b),l.add(p(f.add(s),18)).add(h),n)}(e,t);let s=n,r=n.mul(a).add(113),l=d(r.mul(u).add(113)).mul(u),b=[o.UZERO,o.UZERO],j=[o.UZERO,o.UZERO];s=s.mul(u).add(c(e,0));let g=0;const w=64*(t-1>>6),_=w+(t-1&63)-63;do{s=p(s.add(r).add(b[0]).add(c(e,g+8)),37).mul(a),r=p(r.add(b[1]).add(c(e,g+48)),42).mul(a),s=s.xor(j[1]),r=r.add(b[0]).add(c(e,g+40)),l=p(l.add(j[0]),33).mul(a),b=h(e,g,b[1].mul(a),s.add(j[0])),j=h(e,g+32,l.add(j[1]),r.add(c(e,g+16))),[l,s]=[s,l],g+=64}while(g!==w);const k=a.add(l.and(255).shl(1));return g=_,j[0]=j[0].add(t-1&63),b[0]=b[0].add(j[0]),j[0]=j[0].add(b[0]),s=p(s.add(r).add(b[0]).add(c(e,g+8)),37).mul(k),r=p(r.add(b[1]).add(c(e,g+48)),42).mul(k),s=s.xor(j[1].mul(9)),r=r.add(b[0].mul(9).add(c(e,g+40))),l=p(l.add(j[0]),33).mul(k),b=h(e,g,b[1].mul(k),s.add(j[0])),j=h(e,g+32,l.add(j[1]),r.add(c(e,g+16))),[l,s]=[s,l],m(m(b[0],j[0],k).add(d(r).mul(i)).add(l),m(b[1],j[1],k).add(s),k)}},"./node_modules/@tensorflow/tfjs-core/dist/index.js": +/*!**********************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/index.js ***! + \**********************************************************/ +/*! exports provided: AdadeltaOptimizer, AdagradOptimizer, AdamOptimizer, AdamaxOptimizer, MomentumOptimizer, Optimizer, RMSPropOptimizer, SGDOptimizer, Tensor, TensorBuffer, Variable, Rank, sumOutType, upcastType, abs, acos, acosh, add, addN, all, any, argMax, argMin, asin, asinh, atan, atan2, atanh, avgPool, avgPool3d, basicLSTMCell, batchToSpaceND, batchNorm, batchNorm2d, batchNorm3d, batchNorm4d, bincount, broadcastTo, buffer, cast, ceil, clipByValue, clone, complex, concat, concat1d, concat2d, concat3d, concat4d, conv1d, conv2d, conv2dTranspose, conv3d, conv3dTranspose, cos, cosh, cumsum, denseBincount, depthToSpace, depthwiseConv2d, diag, dilation2d, div, divNoNan, dot, einsum, elu, equal, erf, exp, expandDims, expm1, eye, fill, floor, floorDiv, gather, greater, greaterEqual, imag, isFinite, isInf, isNaN, leakyRelu, less, lessEqual, linspace, localResponseNormalization, log, log1p, logSigmoid, logSoftmax, logSumExp, logicalAnd, logicalNot, logicalOr, logicalXor, matMul, max, maxPool, maxPool3d, maxPoolWithArgmax, maximum, mean, meshgrid, min, minimum, mirrorPad, mod, moments, mul, multiRNNCell, multinomial, neg, notEqual, oneHot, ones, onesLike, outerProduct, pad, pad1d, pad2d, pad3d, pad4d, pool, pow, prelu, print, prod, rand, randomGamma, randomNormal, randomUniform, range, real, reciprocal, relu, relu6, reshape, reverse, reverse1d, reverse2d, reverse3d, reverse4d, round, rsqrt, scalar, selu, separableConv2d, setdiff1dAsync, sigmoid, sign, sin, sinh, slice, slice1d, slice2d, slice3d, slice4d, softmax, softplus, spaceToBatchND, fft, ifft, irfft, rfft, split, sqrt, square, squaredDifference, squeeze, stack, step, stridedSlice, sub, sum, tan, tanh, tensor, tensor1d, tensor2d, tensor3d, tensor4d, tensor5d, tensor6d, tile, topk, truncatedNormal, unique, unsortedSegmentSum, unstack, variable, where, whereAsync, zeros, zerosLike, booleanMaskAsync, transpose, norm, movingAverage, scatterND, sparseToDense, gatherND, dropout, enclosingPowerOfTwo, cosineWindow, inTopKAsync, op, OP_SCOPE_SUFFIX, image, linalg, losses, spectral, fused, signal, sparse, string, Reduction, train, enableProdMode, enableDebugMode, disableDeprecationWarnings, deprecationWarn, disposeVariables, engine, memory, profile, tidy, dispose, keep, time, setBackend, ready, getBackend, removeBackend, findBackend, findBackendFactory, registerBackend, backend, setPlatform, getKernel, getGradient, getKernelsForBackend, registerKernel, registerGradient, unregisterKernel, unregisterGradient, copyRegisteredKernels, customGrad, grad, grads, valueAndGrad, valueAndGrads, variableGrads, Environment, env, ENV, version_core, nextFrame, browser, io, math, serialization, test_util, util, backend_util, tensor_util, slice_util, gather_util, scatter_util, device_util, kernel_impls, KernelBackend, DataStorage, Abs, Acos, Acosh, Add, AddN, All, Any, ArgMax, ArgMin, Asin, Asinh, Atan, Atanh, Atan2, AvgPool, AvgPoolGrad, AvgPool3D, AvgPool3DGrad, BatchMatMul, BatchToSpaceND, Bincount, BroadcastTo, Cast, Ceil, ClipByValue, Complex, ComplexAbs, Concat, Conv2D, Conv2DBackpropFilter, Conv2DBackpropInput, Conv3D, Conv3DBackpropFilterV2, Conv3DBackpropInputV2, Cos, Cosh, Cumsum, CropAndResize, DenseBincount, DepthToSpace, DepthwiseConv2dNative, DepthwiseConv2dNativeBackpropFilter, DepthwiseConv2dNativeBackpropInput, Diag, Dilation2D, Dilation2DBackpropInput, Dilation2DBackpropFilter, RealDiv, Einsum, Elu, EluGrad, Erf, Equal, Exp, ExpandDims, Expm1, FFT, Fill, FlipLeftRight, Floor, FloorDiv, FusedBatchNorm, GatherV2, GatherNd, Greater, GreaterEqual, Identity, IFFT, Imag, IsFinite, IsInf, IsNan, LeakyRelu, Less, LessEqual, LinSpace, Log, Log1p, LogicalAnd, LogicalNot, LogicalOr, LogSoftmax, LRN, LRNGrad, Max, Maximum, MaxPool, MaxPoolGrad, MaxPool3D, MaxPool3DGrad, MaxPoolWithArgmax, Mean, Min, Minimum, MirrorPad, Mod, Multinomial, Multiply, Neg, NotEqual, NonMaxSuppressionV3, NonMaxSuppressionV4, NonMaxSuppressionV5, OnesLike, OneHot, Pack, PadV2, Pool, Pow, Prelu, Prod, Range, Real, Reciprocal, Relu, Reshape, ResizeNearestNeighbor, ResizeNearestNeighborGrad, ResizeBilinear, ResizeBilinearGrad, Relu6, Reverse, Round, Rsqrt, ScatterNd, Select, Selu, Slice, Sin, Sinh, Sign, Sigmoid, Softplus, Sqrt, Sum, SpaceToBatchND, SplitV, Softmax, SparseFillEmptyRows, SparseReshape, SparseSegmentMean, SparseSegmentSum, SparseToDense, SquaredDifference, Square, StridedSlice, StringNGrams, StringSplit, StringToHashBucketFast, Sub, Tan, Tanh, Tile, TopK, Transform, Transpose, Unique, Unpack, UnsortedSegmentSum, ZerosLike, Step, FromPixels, RotateWithOffset, _FusedMatMul, FusedConv2D, FusedDepthwiseConv2D */function(e,t,n){"use strict";n.r(t);n(/*! ./base_side_effects */"./node_modules/@tensorflow/tfjs-core/dist/base_side_effects.js");var s=n(/*! ./base */"./node_modules/@tensorflow/tfjs-core/dist/base.js");n.d(t,"AdadeltaOptimizer",(function(){return s.AdadeltaOptimizer})),n.d(t,"AdagradOptimizer",(function(){return s.AdagradOptimizer})),n.d(t,"AdamOptimizer",(function(){return s.AdamOptimizer})),n.d(t,"AdamaxOptimizer",(function(){return s.AdamaxOptimizer})),n.d(t,"MomentumOptimizer",(function(){return s.MomentumOptimizer})),n.d(t,"Optimizer",(function(){return s.Optimizer})),n.d(t,"RMSPropOptimizer",(function(){return s.RMSPropOptimizer})),n.d(t,"SGDOptimizer",(function(){return s.SGDOptimizer})),n.d(t,"Tensor",(function(){return s.Tensor})),n.d(t,"TensorBuffer",(function(){return s.TensorBuffer})),n.d(t,"Variable",(function(){return s.Variable})),n.d(t,"Rank",(function(){return s.Rank})),n.d(t,"sumOutType",(function(){return s.sumOutType})),n.d(t,"upcastType",(function(){return s.upcastType})),n.d(t,"abs",(function(){return s.abs})),n.d(t,"acos",(function(){return s.acos})),n.d(t,"acosh",(function(){return s.acosh})),n.d(t,"add",(function(){return s.add})),n.d(t,"addN",(function(){return s.addN})),n.d(t,"all",(function(){return s.all})),n.d(t,"any",(function(){return s.any})),n.d(t,"argMax",(function(){return s.argMax})),n.d(t,"argMin",(function(){return s.argMin})),n.d(t,"asin",(function(){return s.asin})),n.d(t,"asinh",(function(){return s.asinh})),n.d(t,"atan",(function(){return s.atan})),n.d(t,"atan2",(function(){return s.atan2})),n.d(t,"atanh",(function(){return s.atanh})),n.d(t,"avgPool",(function(){return s.avgPool})),n.d(t,"avgPool3d",(function(){return s.avgPool3d})),n.d(t,"basicLSTMCell",(function(){return s.basicLSTMCell})),n.d(t,"batchToSpaceND",(function(){return s.batchToSpaceND})),n.d(t,"batchNorm",(function(){return s.batchNorm})),n.d(t,"batchNorm2d",(function(){return s.batchNorm2d})),n.d(t,"batchNorm3d",(function(){return s.batchNorm3d})),n.d(t,"batchNorm4d",(function(){return s.batchNorm4d})),n.d(t,"bincount",(function(){return s.bincount})),n.d(t,"broadcastTo",(function(){return s.broadcastTo})),n.d(t,"buffer",(function(){return s.buffer})),n.d(t,"cast",(function(){return s.cast})),n.d(t,"ceil",(function(){return s.ceil})),n.d(t,"clipByValue",(function(){return s.clipByValue})),n.d(t,"clone",(function(){return s.clone})),n.d(t,"complex",(function(){return s.complex})),n.d(t,"concat",(function(){return s.concat})),n.d(t,"concat1d",(function(){return s.concat1d})),n.d(t,"concat2d",(function(){return s.concat2d})),n.d(t,"concat3d",(function(){return s.concat3d})),n.d(t,"concat4d",(function(){return s.concat4d})),n.d(t,"conv1d",(function(){return s.conv1d})),n.d(t,"conv2d",(function(){return s.conv2d})),n.d(t,"conv2dTranspose",(function(){return s.conv2dTranspose})),n.d(t,"conv3d",(function(){return s.conv3d})),n.d(t,"conv3dTranspose",(function(){return s.conv3dTranspose})),n.d(t,"cos",(function(){return s.cos})),n.d(t,"cosh",(function(){return s.cosh})),n.d(t,"cumsum",(function(){return s.cumsum})),n.d(t,"denseBincount",(function(){return s.denseBincount})),n.d(t,"depthToSpace",(function(){return s.depthToSpace})),n.d(t,"depthwiseConv2d",(function(){return s.depthwiseConv2d})),n.d(t,"diag",(function(){return s.diag})),n.d(t,"dilation2d",(function(){return s.dilation2d})),n.d(t,"div",(function(){return s.div})),n.d(t,"divNoNan",(function(){return s.divNoNan})),n.d(t,"dot",(function(){return s.dot})),n.d(t,"einsum",(function(){return s.einsum})),n.d(t,"elu",(function(){return s.elu})),n.d(t,"equal",(function(){return s.equal})),n.d(t,"erf",(function(){return s.erf})),n.d(t,"exp",(function(){return s.exp})),n.d(t,"expandDims",(function(){return s.expandDims})),n.d(t,"expm1",(function(){return s.expm1})),n.d(t,"eye",(function(){return s.eye})),n.d(t,"fill",(function(){return s.fill})),n.d(t,"floor",(function(){return s.floor})),n.d(t,"floorDiv",(function(){return s.floorDiv})),n.d(t,"gather",(function(){return s.gather})),n.d(t,"greater",(function(){return s.greater})),n.d(t,"greaterEqual",(function(){return s.greaterEqual})),n.d(t,"imag",(function(){return s.imag})),n.d(t,"isFinite",(function(){return s.isFinite})),n.d(t,"isInf",(function(){return s.isInf})),n.d(t,"isNaN",(function(){return s.isNaN})),n.d(t,"leakyRelu",(function(){return s.leakyRelu})),n.d(t,"less",(function(){return s.less})),n.d(t,"lessEqual",(function(){return s.lessEqual})),n.d(t,"linspace",(function(){return s.linspace})),n.d(t,"localResponseNormalization",(function(){return s.localResponseNormalization})),n.d(t,"log",(function(){return s.log})),n.d(t,"log1p",(function(){return s.log1p})),n.d(t,"logSigmoid",(function(){return s.logSigmoid})),n.d(t,"logSoftmax",(function(){return s.logSoftmax})),n.d(t,"logSumExp",(function(){return s.logSumExp})),n.d(t,"logicalAnd",(function(){return s.logicalAnd})),n.d(t,"logicalNot",(function(){return s.logicalNot})),n.d(t,"logicalOr",(function(){return s.logicalOr})),n.d(t,"logicalXor",(function(){return s.logicalXor})),n.d(t,"matMul",(function(){return s.matMul})),n.d(t,"max",(function(){return s.max})),n.d(t,"maxPool",(function(){return s.maxPool})),n.d(t,"maxPool3d",(function(){return s.maxPool3d})),n.d(t,"maxPoolWithArgmax",(function(){return s.maxPoolWithArgmax})),n.d(t,"maximum",(function(){return s.maximum})),n.d(t,"mean",(function(){return s.mean})),n.d(t,"meshgrid",(function(){return s.meshgrid})),n.d(t,"min",(function(){return s.min})),n.d(t,"minimum",(function(){return s.minimum})),n.d(t,"mirrorPad",(function(){return s.mirrorPad})),n.d(t,"mod",(function(){return s.mod})),n.d(t,"moments",(function(){return s.moments})),n.d(t,"mul",(function(){return s.mul})),n.d(t,"multiRNNCell",(function(){return s.multiRNNCell})),n.d(t,"multinomial",(function(){return s.multinomial})),n.d(t,"neg",(function(){return s.neg})),n.d(t,"notEqual",(function(){return s.notEqual})),n.d(t,"oneHot",(function(){return s.oneHot})),n.d(t,"ones",(function(){return s.ones})),n.d(t,"onesLike",(function(){return s.onesLike})),n.d(t,"outerProduct",(function(){return s.outerProduct})),n.d(t,"pad",(function(){return s.pad})),n.d(t,"pad1d",(function(){return s.pad1d})),n.d(t,"pad2d",(function(){return s.pad2d})),n.d(t,"pad3d",(function(){return s.pad3d})),n.d(t,"pad4d",(function(){return s.pad4d})),n.d(t,"pool",(function(){return s.pool})),n.d(t,"pow",(function(){return s.pow})),n.d(t,"prelu",(function(){return s.prelu})),n.d(t,"print",(function(){return s.print})),n.d(t,"prod",(function(){return s.prod})),n.d(t,"rand",(function(){return s.rand})),n.d(t,"randomGamma",(function(){return s.randomGamma})),n.d(t,"randomNormal",(function(){return s.randomNormal})),n.d(t,"randomUniform",(function(){return s.randomUniform})),n.d(t,"range",(function(){return s.range})),n.d(t,"real",(function(){return s.real})),n.d(t,"reciprocal",(function(){return s.reciprocal})),n.d(t,"relu",(function(){return s.relu})),n.d(t,"relu6",(function(){return s.relu6})),n.d(t,"reshape",(function(){return s.reshape})),n.d(t,"reverse",(function(){return s.reverse})),n.d(t,"reverse1d",(function(){return s.reverse1d})),n.d(t,"reverse2d",(function(){return s.reverse2d})),n.d(t,"reverse3d",(function(){return s.reverse3d})),n.d(t,"reverse4d",(function(){return s.reverse4d})),n.d(t,"round",(function(){return s.round})),n.d(t,"rsqrt",(function(){return s.rsqrt})),n.d(t,"scalar",(function(){return s.scalar})),n.d(t,"selu",(function(){return s.selu})),n.d(t,"separableConv2d",(function(){return s.separableConv2d})),n.d(t,"setdiff1dAsync",(function(){return s.setdiff1dAsync})),n.d(t,"sigmoid",(function(){return s.sigmoid})),n.d(t,"sign",(function(){return s.sign})),n.d(t,"sin",(function(){return s.sin})),n.d(t,"sinh",(function(){return s.sinh})),n.d(t,"slice",(function(){return s.slice})),n.d(t,"slice1d",(function(){return s.slice1d})),n.d(t,"slice2d",(function(){return s.slice2d})),n.d(t,"slice3d",(function(){return s.slice3d})),n.d(t,"slice4d",(function(){return s.slice4d})),n.d(t,"softmax",(function(){return s.softmax})),n.d(t,"softplus",(function(){return s.softplus})),n.d(t,"spaceToBatchND",(function(){return s.spaceToBatchND})),n.d(t,"fft",(function(){return s.fft})),n.d(t,"ifft",(function(){return s.ifft})),n.d(t,"irfft",(function(){return s.irfft})),n.d(t,"rfft",(function(){return s.rfft})),n.d(t,"split",(function(){return s.split})),n.d(t,"sqrt",(function(){return s.sqrt})),n.d(t,"square",(function(){return s.square})),n.d(t,"squaredDifference",(function(){return s.squaredDifference})),n.d(t,"squeeze",(function(){return s.squeeze})),n.d(t,"stack",(function(){return s.stack})),n.d(t,"step",(function(){return s.step})),n.d(t,"stridedSlice",(function(){return s.stridedSlice})),n.d(t,"sub",(function(){return s.sub})),n.d(t,"sum",(function(){return s.sum})),n.d(t,"tan",(function(){return s.tan})),n.d(t,"tanh",(function(){return s.tanh})),n.d(t,"tensor",(function(){return s.tensor})),n.d(t,"tensor1d",(function(){return s.tensor1d})),n.d(t,"tensor2d",(function(){return s.tensor2d})),n.d(t,"tensor3d",(function(){return s.tensor3d})),n.d(t,"tensor4d",(function(){return s.tensor4d})),n.d(t,"tensor5d",(function(){return s.tensor5d})),n.d(t,"tensor6d",(function(){return s.tensor6d})),n.d(t,"tile",(function(){return s.tile})),n.d(t,"topk",(function(){return s.topk})),n.d(t,"truncatedNormal",(function(){return s.truncatedNormal})),n.d(t,"unique",(function(){return s.unique})),n.d(t,"unsortedSegmentSum",(function(){return s.unsortedSegmentSum})),n.d(t,"unstack",(function(){return s.unstack})),n.d(t,"variable",(function(){return s.variable})),n.d(t,"where",(function(){return s.where})),n.d(t,"whereAsync",(function(){return s.whereAsync})),n.d(t,"zeros",(function(){return s.zeros})),n.d(t,"zerosLike",(function(){return s.zerosLike})),n.d(t,"booleanMaskAsync",(function(){return s.booleanMaskAsync})),n.d(t,"transpose",(function(){return s.transpose})),n.d(t,"norm",(function(){return s.norm})),n.d(t,"movingAverage",(function(){return s.movingAverage})),n.d(t,"scatterND",(function(){return s.scatterND})),n.d(t,"sparseToDense",(function(){return s.sparseToDense})),n.d(t,"gatherND",(function(){return s.gatherND})),n.d(t,"dropout",(function(){return s.dropout})),n.d(t,"enclosingPowerOfTwo",(function(){return s.enclosingPowerOfTwo})),n.d(t,"cosineWindow",(function(){return s.cosineWindow})),n.d(t,"inTopKAsync",(function(){return s.inTopKAsync})),n.d(t,"op",(function(){return s.op})),n.d(t,"OP_SCOPE_SUFFIX",(function(){return s.OP_SCOPE_SUFFIX})),n.d(t,"image",(function(){return s.image})),n.d(t,"linalg",(function(){return s.linalg})),n.d(t,"losses",(function(){return s.losses})),n.d(t,"spectral",(function(){return s.spectral})),n.d(t,"fused",(function(){return s.fused})),n.d(t,"signal",(function(){return s.signal})),n.d(t,"sparse",(function(){return s.sparse})),n.d(t,"string",(function(){return s.string})),n.d(t,"Reduction",(function(){return s.Reduction})),n.d(t,"train",(function(){return s.train})),n.d(t,"enableProdMode",(function(){return s.enableProdMode})),n.d(t,"enableDebugMode",(function(){return s.enableDebugMode})),n.d(t,"disableDeprecationWarnings",(function(){return s.disableDeprecationWarnings})),n.d(t,"deprecationWarn",(function(){return s.deprecationWarn})),n.d(t,"disposeVariables",(function(){return s.disposeVariables})),n.d(t,"engine",(function(){return s.engine})),n.d(t,"memory",(function(){return s.memory})),n.d(t,"profile",(function(){return s.profile})),n.d(t,"tidy",(function(){return s.tidy})),n.d(t,"dispose",(function(){return s.dispose})),n.d(t,"keep",(function(){return s.keep})),n.d(t,"time",(function(){return s.time})),n.d(t,"setBackend",(function(){return s.setBackend})),n.d(t,"ready",(function(){return s.ready})),n.d(t,"getBackend",(function(){return s.getBackend})),n.d(t,"removeBackend",(function(){return s.removeBackend})),n.d(t,"findBackend",(function(){return s.findBackend})),n.d(t,"findBackendFactory",(function(){return s.findBackendFactory})),n.d(t,"registerBackend",(function(){return s.registerBackend})),n.d(t,"backend",(function(){return s.backend})),n.d(t,"setPlatform",(function(){return s.setPlatform})),n.d(t,"getKernel",(function(){return s.getKernel})),n.d(t,"getGradient",(function(){return s.getGradient})),n.d(t,"getKernelsForBackend",(function(){return s.getKernelsForBackend})),n.d(t,"registerKernel",(function(){return s.registerKernel})),n.d(t,"registerGradient",(function(){return s.registerGradient})),n.d(t,"unregisterKernel",(function(){return s.unregisterKernel})),n.d(t,"unregisterGradient",(function(){return s.unregisterGradient})),n.d(t,"copyRegisteredKernels",(function(){return s.copyRegisteredKernels})),n.d(t,"customGrad",(function(){return s.customGrad})),n.d(t,"grad",(function(){return s.grad})),n.d(t,"grads",(function(){return s.grads})),n.d(t,"valueAndGrad",(function(){return s.valueAndGrad})),n.d(t,"valueAndGrads",(function(){return s.valueAndGrads})),n.d(t,"variableGrads",(function(){return s.variableGrads})),n.d(t,"Environment",(function(){return s.Environment})),n.d(t,"env",(function(){return s.env})),n.d(t,"ENV",(function(){return s.ENV})),n.d(t,"version_core",(function(){return s.version_core})),n.d(t,"nextFrame",(function(){return s.nextFrame})),n.d(t,"browser",(function(){return s.browser})),n.d(t,"io",(function(){return s.io})),n.d(t,"math",(function(){return s.math})),n.d(t,"serialization",(function(){return s.serialization})),n.d(t,"test_util",(function(){return s.test_util})),n.d(t,"util",(function(){return s.util})),n.d(t,"backend_util",(function(){return s.backend_util})),n.d(t,"tensor_util",(function(){return s.tensor_util})),n.d(t,"slice_util",(function(){return s.slice_util})),n.d(t,"gather_util",(function(){return s.gather_util})),n.d(t,"scatter_util",(function(){return s.scatter_util})),n.d(t,"device_util",(function(){return s.device_util})),n.d(t,"kernel_impls",(function(){return s.kernel_impls})),n.d(t,"KernelBackend",(function(){return s.KernelBackend})),n.d(t,"DataStorage",(function(){return s.DataStorage})),n.d(t,"Abs",(function(){return s.Abs})),n.d(t,"Acos",(function(){return s.Acos})),n.d(t,"Acosh",(function(){return s.Acosh})),n.d(t,"Add",(function(){return s.Add})),n.d(t,"AddN",(function(){return s.AddN})),n.d(t,"All",(function(){return s.All})),n.d(t,"Any",(function(){return s.Any})),n.d(t,"ArgMax",(function(){return s.ArgMax})),n.d(t,"ArgMin",(function(){return s.ArgMin})),n.d(t,"Asin",(function(){return s.Asin})),n.d(t,"Asinh",(function(){return s.Asinh})),n.d(t,"Atan",(function(){return s.Atan})),n.d(t,"Atanh",(function(){return s.Atanh})),n.d(t,"Atan2",(function(){return s.Atan2})),n.d(t,"AvgPool",(function(){return s.AvgPool})),n.d(t,"AvgPoolGrad",(function(){return s.AvgPoolGrad})),n.d(t,"AvgPool3D",(function(){return s.AvgPool3D})),n.d(t,"AvgPool3DGrad",(function(){return s.AvgPool3DGrad})),n.d(t,"BatchMatMul",(function(){return s.BatchMatMul})),n.d(t,"BatchToSpaceND",(function(){return s.BatchToSpaceND})),n.d(t,"Bincount",(function(){return s.Bincount})),n.d(t,"BroadcastTo",(function(){return s.BroadcastTo})),n.d(t,"Cast",(function(){return s.Cast})),n.d(t,"Ceil",(function(){return s.Ceil})),n.d(t,"ClipByValue",(function(){return s.ClipByValue})),n.d(t,"Complex",(function(){return s.Complex})),n.d(t,"ComplexAbs",(function(){return s.ComplexAbs})),n.d(t,"Concat",(function(){return s.Concat})),n.d(t,"Conv2D",(function(){return s.Conv2D})),n.d(t,"Conv2DBackpropFilter",(function(){return s.Conv2DBackpropFilter})),n.d(t,"Conv2DBackpropInput",(function(){return s.Conv2DBackpropInput})),n.d(t,"Conv3D",(function(){return s.Conv3D})),n.d(t,"Conv3DBackpropFilterV2",(function(){return s.Conv3DBackpropFilterV2})),n.d(t,"Conv3DBackpropInputV2",(function(){return s.Conv3DBackpropInputV2})),n.d(t,"Cos",(function(){return s.Cos})),n.d(t,"Cosh",(function(){return s.Cosh})),n.d(t,"Cumsum",(function(){return s.Cumsum})),n.d(t,"CropAndResize",(function(){return s.CropAndResize})),n.d(t,"DenseBincount",(function(){return s.DenseBincount})),n.d(t,"DepthToSpace",(function(){return s.DepthToSpace})),n.d(t,"DepthwiseConv2dNative",(function(){return s.DepthwiseConv2dNative})),n.d(t,"DepthwiseConv2dNativeBackpropFilter",(function(){return s.DepthwiseConv2dNativeBackpropFilter})),n.d(t,"DepthwiseConv2dNativeBackpropInput",(function(){return s.DepthwiseConv2dNativeBackpropInput})),n.d(t,"Diag",(function(){return s.Diag})),n.d(t,"Dilation2D",(function(){return s.Dilation2D})),n.d(t,"Dilation2DBackpropInput",(function(){return s.Dilation2DBackpropInput})),n.d(t,"Dilation2DBackpropFilter",(function(){return s.Dilation2DBackpropFilter})),n.d(t,"RealDiv",(function(){return s.RealDiv})),n.d(t,"Einsum",(function(){return s.Einsum})),n.d(t,"Elu",(function(){return s.Elu})),n.d(t,"EluGrad",(function(){return s.EluGrad})),n.d(t,"Erf",(function(){return s.Erf})),n.d(t,"Equal",(function(){return s.Equal})),n.d(t,"Exp",(function(){return s.Exp})),n.d(t,"ExpandDims",(function(){return s.ExpandDims})),n.d(t,"Expm1",(function(){return s.Expm1})),n.d(t,"FFT",(function(){return s.FFT})),n.d(t,"Fill",(function(){return s.Fill})),n.d(t,"FlipLeftRight",(function(){return s.FlipLeftRight})),n.d(t,"Floor",(function(){return s.Floor})),n.d(t,"FloorDiv",(function(){return s.FloorDiv})),n.d(t,"FusedBatchNorm",(function(){return s.FusedBatchNorm})),n.d(t,"GatherV2",(function(){return s.GatherV2})),n.d(t,"GatherNd",(function(){return s.GatherNd})),n.d(t,"Greater",(function(){return s.Greater})),n.d(t,"GreaterEqual",(function(){return s.GreaterEqual})),n.d(t,"Identity",(function(){return s.Identity})),n.d(t,"IFFT",(function(){return s.IFFT})),n.d(t,"Imag",(function(){return s.Imag})),n.d(t,"IsFinite",(function(){return s.IsFinite})),n.d(t,"IsInf",(function(){return s.IsInf})),n.d(t,"IsNan",(function(){return s.IsNan})),n.d(t,"LeakyRelu",(function(){return s.LeakyRelu})),n.d(t,"Less",(function(){return s.Less})),n.d(t,"LessEqual",(function(){return s.LessEqual})),n.d(t,"LinSpace",(function(){return s.LinSpace})),n.d(t,"Log",(function(){return s.Log})),n.d(t,"Log1p",(function(){return s.Log1p})),n.d(t,"LogicalAnd",(function(){return s.LogicalAnd})),n.d(t,"LogicalNot",(function(){return s.LogicalNot})),n.d(t,"LogicalOr",(function(){return s.LogicalOr})),n.d(t,"LogSoftmax",(function(){return s.LogSoftmax})),n.d(t,"LRN",(function(){return s.LRN})),n.d(t,"LRNGrad",(function(){return s.LRNGrad})),n.d(t,"Max",(function(){return s.Max})),n.d(t,"Maximum",(function(){return s.Maximum})),n.d(t,"MaxPool",(function(){return s.MaxPool})),n.d(t,"MaxPoolGrad",(function(){return s.MaxPoolGrad})),n.d(t,"MaxPool3D",(function(){return s.MaxPool3D})),n.d(t,"MaxPool3DGrad",(function(){return s.MaxPool3DGrad})),n.d(t,"MaxPoolWithArgmax",(function(){return s.MaxPoolWithArgmax})),n.d(t,"Mean",(function(){return s.Mean})),n.d(t,"Min",(function(){return s.Min})),n.d(t,"Minimum",(function(){return s.Minimum})),n.d(t,"MirrorPad",(function(){return s.MirrorPad})),n.d(t,"Mod",(function(){return s.Mod})),n.d(t,"Multinomial",(function(){return s.Multinomial})),n.d(t,"Multiply",(function(){return s.Multiply})),n.d(t,"Neg",(function(){return s.Neg})),n.d(t,"NotEqual",(function(){return s.NotEqual})),n.d(t,"NonMaxSuppressionV3",(function(){return s.NonMaxSuppressionV3})),n.d(t,"NonMaxSuppressionV4",(function(){return s.NonMaxSuppressionV4})),n.d(t,"NonMaxSuppressionV5",(function(){return s.NonMaxSuppressionV5})),n.d(t,"OnesLike",(function(){return s.OnesLike})),n.d(t,"OneHot",(function(){return s.OneHot})),n.d(t,"Pack",(function(){return s.Pack})),n.d(t,"PadV2",(function(){return s.PadV2})),n.d(t,"Pool",(function(){return s.Pool})),n.d(t,"Pow",(function(){return s.Pow})),n.d(t,"Prelu",(function(){return s.Prelu})),n.d(t,"Prod",(function(){return s.Prod})),n.d(t,"Range",(function(){return s.Range})),n.d(t,"Real",(function(){return s.Real})),n.d(t,"Reciprocal",(function(){return s.Reciprocal})),n.d(t,"Relu",(function(){return s.Relu})),n.d(t,"Reshape",(function(){return s.Reshape})),n.d(t,"ResizeNearestNeighbor",(function(){return s.ResizeNearestNeighbor})),n.d(t,"ResizeNearestNeighborGrad",(function(){return s.ResizeNearestNeighborGrad})),n.d(t,"ResizeBilinear",(function(){return s.ResizeBilinear})),n.d(t,"ResizeBilinearGrad",(function(){return s.ResizeBilinearGrad})),n.d(t,"Relu6",(function(){return s.Relu6})),n.d(t,"Reverse",(function(){return s.Reverse})),n.d(t,"Round",(function(){return s.Round})),n.d(t,"Rsqrt",(function(){return s.Rsqrt})),n.d(t,"ScatterNd",(function(){return s.ScatterNd})),n.d(t,"Select",(function(){return s.Select})),n.d(t,"Selu",(function(){return s.Selu})),n.d(t,"Slice",(function(){return s.Slice})),n.d(t,"Sin",(function(){return s.Sin})),n.d(t,"Sinh",(function(){return s.Sinh})),n.d(t,"Sign",(function(){return s.Sign})),n.d(t,"Sigmoid",(function(){return s.Sigmoid})),n.d(t,"Softplus",(function(){return s.Softplus})),n.d(t,"Sqrt",(function(){return s.Sqrt})),n.d(t,"Sum",(function(){return s.Sum})),n.d(t,"SpaceToBatchND",(function(){return s.SpaceToBatchND})),n.d(t,"SplitV",(function(){return s.SplitV})),n.d(t,"Softmax",(function(){return s.Softmax})),n.d(t,"SparseFillEmptyRows",(function(){return s.SparseFillEmptyRows})),n.d(t,"SparseReshape",(function(){return s.SparseReshape})),n.d(t,"SparseSegmentMean",(function(){return s.SparseSegmentMean})),n.d(t,"SparseSegmentSum",(function(){return s.SparseSegmentSum})),n.d(t,"SparseToDense",(function(){return s.SparseToDense})),n.d(t,"SquaredDifference",(function(){return s.SquaredDifference})),n.d(t,"Square",(function(){return s.Square})),n.d(t,"StridedSlice",(function(){return s.StridedSlice})),n.d(t,"StringNGrams",(function(){return s.StringNGrams})),n.d(t,"StringSplit",(function(){return s.StringSplit})),n.d(t,"StringToHashBucketFast",(function(){return s.StringToHashBucketFast})),n.d(t,"Sub",(function(){return s.Sub})),n.d(t,"Tan",(function(){return s.Tan})),n.d(t,"Tanh",(function(){return s.Tanh})),n.d(t,"Tile",(function(){return s.Tile})),n.d(t,"TopK",(function(){return s.TopK})),n.d(t,"Transform",(function(){return s.Transform})),n.d(t,"Transpose",(function(){return s.Transpose})),n.d(t,"Unique",(function(){return s.Unique})),n.d(t,"Unpack",(function(){return s.Unpack})),n.d(t,"UnsortedSegmentSum",(function(){return s.UnsortedSegmentSum})),n.d(t,"ZerosLike",(function(){return s.ZerosLike})),n.d(t,"Step",(function(){return s.Step})),n.d(t,"FromPixels",(function(){return s.FromPixels})),n.d(t,"RotateWithOffset",(function(){return s.RotateWithOffset})),n.d(t,"_FusedMatMul",(function(){return s._FusedMatMul})),n.d(t,"FusedConv2D",(function(){return s.FusedConv2D})),n.d(t,"FusedDepthwiseConv2D",(function(){return s.FusedDepthwiseConv2D}))},"./node_modules/@tensorflow/tfjs-core/dist/io/browser_files.js": +/*!*********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/io/browser_files.js ***! + \*********************************************************************/ +/*! exports provided: BrowserDownloads, browserDownloadsRouter, browserDownloads, browserFiles */function(e,t,n){"use strict";n.r(t),n.d(t,"BrowserDownloads",(function(){return a})),n.d(t,"browserDownloadsRouter",(function(){return d})),n.d(t,"browserDownloads",(function(){return l})),n.d(t,"browserFiles",(function(){return c}));n(/*! ../flags */"./node_modules/@tensorflow/tfjs-core/dist/flags.js");var s=n(/*! ../environment */"./node_modules/@tensorflow/tfjs-core/dist/environment.js"),o=n(/*! ./io_utils */"./node_modules/@tensorflow/tfjs-core/dist/io/io_utils.js"),r=n(/*! ./router_registry */"./node_modules/@tensorflow/tfjs-core/dist/io/router_registry.js");function i(e){return new Promise((e=>setTimeout(e))).then(e)}class a{constructor(e){if(!Object(s.env)().getBool("IS_BROWSER"))throw new Error("browserDownloads() cannot proceed because the current environment is not a browser.");e.startsWith(a.URL_SCHEME)&&(e=e.slice(a.URL_SCHEME.length)),null!=e&&0!==e.length||(e="model"),this.modelJsonFileName=e+".json",this.weightDataFileName=e+".weights.bin"}async save(e){if("undefined"==typeof document)throw new Error("Browser downloads are not supported in this environment since `document` is not present");const t=window.URL.createObjectURL(new Blob([e.weightData],{type:"application/octet-stream"}));if(e.modelTopology instanceof ArrayBuffer)throw new Error("BrowserDownloads.save() does not support saving model topology in binary formats yet.");{const n=[{paths:["./"+this.weightDataFileName],weights:e.weightSpecs}],s=Object(o.getModelJSONForModelArtifacts)(e,n),r=window.URL.createObjectURL(new Blob([JSON.stringify(s)],{type:"application/json"})),a=null==this.modelJsonAnchor?document.createElement("a"):this.modelJsonAnchor;if(a.download=this.modelJsonFileName,a.href=r,await i((()=>a.dispatchEvent(new MouseEvent("click")))),null!=e.weightData){const e=null==this.weightDataAnchor?document.createElement("a"):this.weightDataAnchor;e.download=this.weightDataFileName,e.href=t,await i((()=>e.dispatchEvent(new MouseEvent("click"))))}return{modelArtifactsInfo:Object(o.getModelArtifactsInfoForJSON)(e)}}}}a.URL_SCHEME="downloads://";class u{constructor(e){if(null==e||e.length<1)throw new Error(`When calling browserFiles, at least 1 file is required, but received ${e}`);this.jsonFile=e[0],this.weightsFiles=e.slice(1)}async load(){return new Promise(((e,t)=>{const n=new FileReader;n.onload=n=>{const s=JSON.parse(n.target.result),r=s.modelTopology;if(null==r)return void t(new Error(`modelTopology field is missing from file ${this.jsonFile.name}`));if(null==s.weightsManifest)return void t(new Error(`weightManifest field is missing from file ${this.jsonFile.name}`));if(0===this.weightsFiles.length)return void e({modelTopology:r});const i=Object(o.getModelArtifactsForJSON)(s,(e=>this.loadWeights(e)));e(i)},n.onerror=e=>t(`Failed to read model topology and weights manifest JSON from file '${this.jsonFile.name}'. BrowserFiles supports loading Keras-style tf.Model artifacts only.`),n.readAsText(this.jsonFile)}))}loadWeights(e){const t=[],n=[];for(const s of e)t.push(...s.weights),n.push(...s.paths);const s=this.checkManifestAndWeightFiles(e),r=n.map((e=>this.loadWeightsFile(e,s[e])));return Promise.all(r).then((e=>[t,Object(o.concatenateArrayBuffers)(e)]))}loadWeightsFile(e,t){return new Promise(((n,s)=>{const o=new FileReader;o.onload=e=>{const t=e.target.result;n(t)},o.onerror=t=>s(`Failed to weights data from file of path '${e}'.`),o.readAsArrayBuffer(t)}))}checkManifestAndWeightFiles(e){const t=[],n=this.weightsFiles.map((e=>Object(o.basename)(e.name))),s={};for(const r of e)r.paths.forEach((e=>{const r=Object(o.basename)(e);if(-1!==t.indexOf(r))throw new Error(`Duplicate file basename found in weights manifest: '${r}'`);if(t.push(r),-1===n.indexOf(r))throw new Error(`Weight file with basename '${r}' is not provided.`);s[e]=this.weightsFiles[n.indexOf(r)]}));if(t.length!==this.weightsFiles.length)throw new Error(`Mismatch in the number of files in weights manifest (${t.length}) and the number of weight files provided (${this.weightsFiles.length}).`);return s}}const d=e=>Object(s.env)().getBool("IS_BROWSER")&&!Array.isArray(e)&&e.startsWith(a.URL_SCHEME)?l(e.slice(a.URL_SCHEME.length)):null;function l(e="model"){return new a(e)}function c(e){return new u(e)}r.IORouterRegistry.registerSaveRouter(d)},"./node_modules/@tensorflow/tfjs-core/dist/io/http.js": +/*!************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/io/http.js ***! + \************************************************************/ +/*! exports provided: HTTPRequest, parseUrl, isHTTPScheme, httpRouter, http, browserHTTPRequest */function(e,t,n){"use strict";n.r(t),n.d(t,"HTTPRequest",(function(){return u})),n.d(t,"parseUrl",(function(){return d})),n.d(t,"isHTTPScheme",(function(){return l})),n.d(t,"httpRouter",(function(){return c})),n.d(t,"http",(function(){return f})),n.d(t,"browserHTTPRequest",(function(){return p}));var s=n(/*! ../environment */"./node_modules/@tensorflow/tfjs-core/dist/environment.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./io_utils */"./node_modules/@tensorflow/tfjs-core/dist/io/io_utils.js"),i=n(/*! ./router_registry */"./node_modules/@tensorflow/tfjs-core/dist/io/router_registry.js"),a=n(/*! ./weights_loader */"./node_modules/@tensorflow/tfjs-core/dist/io/weights_loader.js");class u{constructor(e,t){if(this.DEFAULT_METHOD="POST",null==t&&(t={}),this.weightPathPrefix=t.weightPathPrefix,this.onProgress=t.onProgress,this.weightUrlConverter=t.weightUrlConverter,null!=t.fetchFunc?(Object(o.assert)("function"==typeof t.fetchFunc,(()=>"Must pass a function that matches the signature of `fetch` (see https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API)")),this.fetch=t.fetchFunc):this.fetch=Object(s.env)().platform.fetch,Object(o.assert)(null!=e&&e.length>0,(()=>"URL path for http must not be null, undefined or empty.")),Array.isArray(e)&&Object(o.assert)(2===e.length,(()=>`URL paths for http must have a length of 2, (actual length is ${e.length}).`)),this.path=e,null!=t.requestInit&&null!=t.requestInit.body)throw new Error("requestInit is expected to have no pre-existing body, but has one.");this.requestInit=t.requestInit||{}}async save(e){if(e.modelTopology instanceof ArrayBuffer)throw new Error("BrowserHTTPRequest.save() does not support saving model topology in binary formats yet.");const t=Object.assign({method:this.DEFAULT_METHOD},this.requestInit);t.body=new FormData;const n=[{paths:["./model.weights.bin"],weights:e.weightSpecs}],s=Object(r.getModelJSONForModelArtifacts)(e,n);t.body.append("model.json",new Blob([JSON.stringify(s)],{type:"application/json"}),"model.json"),null!=e.weightData&&t.body.append("model.weights.bin",new Blob([e.weightData],{type:"application/octet-stream"}),"model.weights.bin");const o=await this.fetch(this.path,t);if(o.ok)return{modelArtifactsInfo:Object(r.getModelArtifactsInfoForJSON)(e),responses:[o]};throw new Error(`BrowserHTTPRequest.save() failed due to HTTP response status ${o.status}.`)}async load(){const e=await this.fetch(this.path,this.requestInit);if(!e.ok)throw new Error(`Request to ${this.path} failed with status code ${e.status}. Please verify this URL points to the model JSON of the model to load.`);let t;try{t=await e.json()}catch(e){let t=`Failed to parse model JSON of response from ${this.path}.`;throw this.path.endsWith(".pb")?t+=" Your path contains a .pb file extension. Support for .pb models have been removed in TensorFlow.js 1.0 in favor of .json models. You can re-convert your Python TensorFlow model using the TensorFlow.js 1.0 conversion scripts or you can convert your.pb models with the 'pb2json'NPM script in the tensorflow/tfjs-converter repository.":t+=" Please make sure the server is serving valid JSON for this request.",new Error(t)}const n=t.modelTopology,s=t.weightsManifest;if(null==n&&null==s)throw new Error(`The JSON from HTTP path ${this.path} contains neither model topology or manifest for weights.`);return Object(r.getModelArtifactsForJSON)(t,(e=>this.loadWeights(e)))}async loadWeights(e){const t=Array.isArray(this.path)?this.path[1]:this.path,[n,s]=d(t),o=this.weightPathPrefix||n,i=[];for(const t of e)i.push(...t.weights);const u=[],l=[];for(const t of e)for(const e of t.paths)null!=this.weightUrlConverter?l.push(this.weightUrlConverter(e)):u.push(o+e+s);this.weightUrlConverter&&u.push(...await Promise.all(l));const c=await Object(a.loadWeightsAsArrayBuffer)(u,{requestInit:this.requestInit,fetchFunc:this.fetch,onProgress:this.onProgress});return[i,Object(r.concatenateArrayBuffers)(c)]}}function d(e){const t=e.lastIndexOf("/"),n=e.lastIndexOf("?");return[e.substring(0,t)+"/",n>t?e.substring(n):""]}function l(e){return null!=e.match(u.URL_SCHEME_REGEX)}u.URL_SCHEME_REGEX=/^https?:\/\//;const c=(e,t)=>{if("undefined"==typeof fetch&&(null==t||null==t.fetchFunc))return null;{let n=!0;if(n=Array.isArray(e)?e.every((e=>l(e))):l(e),n)return f(e,t)}return null};function f(e,t){return new u(e,t)}function p(e,t){return f(e,t)}i.IORouterRegistry.registerSaveRouter(c),i.IORouterRegistry.registerLoadRouter(c)},"./node_modules/@tensorflow/tfjs-core/dist/io/indexed_db.js": +/*!******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/io/indexed_db.js ***! + \******************************************************************/ +/*! exports provided: deleteDatabase, BrowserIndexedDB, indexedDBRouter, browserIndexedDB, BrowserIndexedDBManager */function(e,t,n){"use strict";n.r(t),n.d(t,"deleteDatabase",(function(){return d})),n.d(t,"BrowserIndexedDB",(function(){return f})),n.d(t,"indexedDBRouter",(function(){return p})),n.d(t,"browserIndexedDB",(function(){return m})),n.d(t,"BrowserIndexedDBManager",(function(){return h}));n(/*! ../flags */"./node_modules/@tensorflow/tfjs-core/dist/flags.js");var s=n(/*! ../environment */"./node_modules/@tensorflow/tfjs-core/dist/environment.js"),o=n(/*! ./io_utils */"./node_modules/@tensorflow/tfjs-core/dist/io/io_utils.js"),r=n(/*! ./router_registry */"./node_modules/@tensorflow/tfjs-core/dist/io/router_registry.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i="tensorflowjs",a="models_store",u="model_info_store";async function d(){const e=l();return new Promise(((t,n)=>{const s=e.deleteDatabase(i);s.onsuccess=()=>t(),s.onerror=e=>n(e)}))}function l(){if(!Object(s.env)().getBool("IS_BROWSER"))throw new Error("Failed to obtain IndexedDB factory because the current environmentis not a web browser.");const e="undefined"==typeof window?self:window,t=e.indexedDB||e.mozIndexedDB||e.webkitIndexedDB||e.msIndexedDB||e.shimIndexedDB;if(null==t)throw new Error("The current browser does not appear to support IndexedDB.");return t}function c(e){const t=e.result;t.createObjectStore(a,{keyPath:"modelPath"}),t.createObjectStore(u,{keyPath:"modelPath"})}class f{constructor(e){if(this.indexedDB=l(),null==e||!e)throw new Error("For IndexedDB, modelPath must not be null, undefined or empty.");this.modelPath=e}async save(e){if(e.modelTopology instanceof ArrayBuffer)throw new Error("BrowserLocalStorage.save() does not support saving model topology in binary formats yet.");return this.databaseAction(this.modelPath,e)}async load(){return this.databaseAction(this.modelPath)}databaseAction(e,t){return new Promise(((e,n)=>{const s=this.indexedDB.open(i,1);s.onupgradeneeded=()=>c(s),s.onsuccess=()=>{const r=s.result;if(null==t){const t=r.transaction(a,"readonly"),s=t.objectStore(a).get(this.modelPath);s.onsuccess=()=>{if(null==s.result)return r.close(),n(new Error(`Cannot find model with path '${this.modelPath}' in IndexedDB.`));e(s.result.modelArtifacts)},s.onerror=e=>(r.close(),n(s.error)),t.oncomplete=()=>r.close()}else{const s=Object(o.getModelArtifactsInfoForJSON)(t),i=r.transaction(u,"readwrite");let d=i.objectStore(u);const l=d.put({modelPath:this.modelPath,modelArtifactsInfo:s});let c;l.onsuccess=()=>{c=r.transaction(a,"readwrite");const o=c.objectStore(a).put({modelPath:this.modelPath,modelArtifacts:t,modelArtifactsInfo:s});o.onsuccess=()=>e({modelArtifactsInfo:s}),o.onerror=e=>{d=i.objectStore(u);const t=d.delete(this.modelPath);t.onsuccess=()=>(r.close(),n(o.error)),t.onerror=e=>(r.close(),n(o.error))}},l.onerror=e=>(r.close(),n(l.error)),i.oncomplete=()=>{null==c?r.close():c.oncomplete=()=>r.close()}}},s.onerror=e=>n(s.error)}))}}f.URL_SCHEME="indexeddb://";const p=e=>Object(s.env)().getBool("IS_BROWSER")&&!Array.isArray(e)&&e.startsWith(f.URL_SCHEME)?m(e.slice(f.URL_SCHEME.length)):null;function m(e){return new f(e)}r.IORouterRegistry.registerSaveRouter(p),r.IORouterRegistry.registerLoadRouter(p);class h{constructor(){this.indexedDB=l()}async listModels(){return new Promise(((e,t)=>{const n=this.indexedDB.open(i,1);n.onupgradeneeded=()=>c(n),n.onsuccess=()=>{const s=n.result,o=s.transaction(u,"readonly"),r=o.objectStore(u).getAll();r.onsuccess=()=>{const t={};for(const e of r.result)t[e.modelPath]=e.modelArtifactsInfo;e(t)},r.onerror=e=>(s.close(),t(r.error)),o.oncomplete=()=>s.close()},n.onerror=e=>t(n.error)}))}async removeModel(e){var t;return e=(t=e).startsWith(f.URL_SCHEME)?t.slice(f.URL_SCHEME.length):t,new Promise(((t,n)=>{const s=this.indexedDB.open(i,1);s.onupgradeneeded=()=>c(s),s.onsuccess=()=>{const o=s.result,r=o.transaction(u,"readwrite"),i=r.objectStore(u),d=i.get(e);let l;d.onsuccess=()=>{if(null==d.result)return o.close(),n(new Error(`Cannot find model with path '${e}' in IndexedDB.`));{const s=i.delete(e),r=()=>{l=o.transaction(a,"readwrite");const s=l.objectStore(a).delete(e);s.onsuccess=()=>t(d.result.modelArtifactsInfo),s.onerror=e=>n(d.error)};s.onsuccess=r,s.onerror=e=>(r(),o.close(),n(d.error))}},d.onerror=e=>(o.close(),n(d.error)),r.oncomplete=()=>{null==l?o.close():l.oncomplete=()=>o.close()}},s.onerror=e=>n(s.error)}))}}},"./node_modules/@tensorflow/tfjs-core/dist/io/io.js": +/*!**********************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/io/io.js ***! + \**********************************************************/ +/*! exports provided: copyModel, listModels, moveModel, removeModel, browserFiles, browserHTTPRequest, concatenateArrayBuffers, decodeWeights, encodeWeights, fromMemory, getLoadHandlers, getModelArtifactsForJSON, getModelArtifactsInfoForJSON, getSaveHandlers, http, isHTTPScheme, loadWeights, registerLoadRouter, registerSaveRouter, weightsLoaderFactory, withSaveHandler */function(e,t,n){"use strict";n.r(t);n(/*! ./indexed_db */"./node_modules/@tensorflow/tfjs-core/dist/io/indexed_db.js"),n(/*! ./local_storage */"./node_modules/@tensorflow/tfjs-core/dist/io/local_storage.js");var s=n(/*! ./browser_files */"./node_modules/@tensorflow/tfjs-core/dist/io/browser_files.js");n.d(t,"browserFiles",(function(){return s.browserFiles}));var o=n(/*! ./http */"./node_modules/@tensorflow/tfjs-core/dist/io/http.js");n.d(t,"browserHTTPRequest",(function(){return o.browserHTTPRequest})),n.d(t,"http",(function(){return o.http})),n.d(t,"isHTTPScheme",(function(){return o.isHTTPScheme}));var r=n(/*! ./io_utils */"./node_modules/@tensorflow/tfjs-core/dist/io/io_utils.js");n.d(t,"concatenateArrayBuffers",(function(){return r.concatenateArrayBuffers})),n.d(t,"decodeWeights",(function(){return r.decodeWeights})),n.d(t,"encodeWeights",(function(){return r.encodeWeights})),n.d(t,"getModelArtifactsForJSON",(function(){return r.getModelArtifactsForJSON})),n.d(t,"getModelArtifactsInfoForJSON",(function(){return r.getModelArtifactsInfoForJSON}));var i=n(/*! ./passthrough */"./node_modules/@tensorflow/tfjs-core/dist/io/passthrough.js");n.d(t,"fromMemory",(function(){return i.fromMemory})),n.d(t,"withSaveHandler",(function(){return i.withSaveHandler}));var a=n(/*! ./router_registry */"./node_modules/@tensorflow/tfjs-core/dist/io/router_registry.js");n.d(t,"getLoadHandlers",(function(){return a.getLoadHandlers})),n.d(t,"getSaveHandlers",(function(){return a.getSaveHandlers})),n.d(t,"registerLoadRouter",(function(){return a.registerLoadRouter})),n.d(t,"registerSaveRouter",(function(){return a.registerSaveRouter}));var u=n(/*! ./weights_loader */"./node_modules/@tensorflow/tfjs-core/dist/io/weights_loader.js");n.d(t,"loadWeights",(function(){return u.loadWeights})),n.d(t,"weightsLoaderFactory",(function(){return u.weightsLoaderFactory}));var d=n(/*! ./model_management */"./node_modules/@tensorflow/tfjs-core/dist/io/model_management.js");n.d(t,"copyModel",(function(){return d.copyModel})),n.d(t,"listModels",(function(){return d.listModels})),n.d(t,"moveModel",(function(){return d.moveModel})),n.d(t,"removeModel",(function(){return d.removeModel}))},"./node_modules/@tensorflow/tfjs-core/dist/io/io_utils.js": +/*!****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/io/io_utils.js ***! + \****************************************************************/ +/*! exports provided: encodeWeights, decodeWeights, concatenateTypedArrays, stringByteLength, arrayBufferToBase64String, base64StringToArrayBuffer, concatenateArrayBuffers, basename, getModelJSONForModelArtifacts, getModelArtifactsForJSON, getModelArtifactsInfoForJSON, getFloat16Decoder */function(e,t,n){"use strict";n.r(t),function(e){n.d(t,"encodeWeights",(function(){return a})),n.d(t,"decodeWeights",(function(){return u})),n.d(t,"concatenateTypedArrays",(function(){return d})),n.d(t,"stringByteLength",(function(){return c})),n.d(t,"arrayBufferToBase64String",(function(){return f})),n.d(t,"base64StringToArrayBuffer",(function(){return p})),n.d(t,"concatenateArrayBuffers",(function(){return m})),n.d(t,"basename",(function(){return h})),n.d(t,"getModelJSONForModelArtifacts",(function(){return b})),n.d(t,"getModelArtifactsForJSON",(function(){return j})),n.d(t,"getModelArtifactsInfoForJSON",(function(){return g})),n.d(t,"getFloat16Decoder",(function(){return w}));var s=n(/*! ../ops/complex */"./node_modules/@tensorflow/tfjs-core/dist/ops/complex.js"),o=n(/*! ../ops/tensor */"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor.js"),r=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),i=n(/*! ./types */"./node_modules/@tensorflow/tfjs-core/dist/io/types.js");async function a(e,t){const n=[],s=[],o=Array.isArray(e)?e.map((e=>e.name)):Object.keys(e);for(let r=0;r{const t=await a.bytes(),n=t.reduce(((e,t)=>e+t.length),0)+4*t.length,s=new Uint8Array(n);let o=0;for(let e=0;e{if(t+=e.byteLength,n.push(e.byteLength===e.buffer.byteLength?e:new e.constructor(e)),!(e instanceof Float32Array||e instanceof Int32Array||e instanceof Uint8Array))throw new Error(`Unsupported TypedArray subtype: ${e.constructor.name}`)}));const s=new Uint8Array(t);let o=0;return n.forEach((e=>{s.set(new Uint8Array(e.buffer),o),o+=e.byteLength})),s.buffer}const l="undefined"!=typeof e&&("undefined"==typeof Blob||"undefined"==typeof atob||"undefined"==typeof btoa);function c(t){return l?e.byteLength(t):new Blob([t]).size}function f(t){if(l)return e.from(t).toString("base64");const n=new Uint8Array(t);let s="";for(let e=0,t=n.length;e{t+=e.byteLength}));const n=new Uint8Array(t);let s=0;return e.forEach((e=>{n.set(new Uint8Array(e),s),s+=e.byteLength})),n.buffer}function h(e){for(e=e.trim();e.endsWith("/");)e=e.slice(0,e.length-1);const t=e.split("/");return t[t.length-1]}function b(e,t){const n={modelTopology:e.modelTopology,format:e.format,generatedBy:e.generatedBy,convertedBy:e.convertedBy,weightsManifest:t};return null!=e.signature&&(n.signature=e.signature),null!=e.userDefinedMetadata&&(n.userDefinedMetadata=e.userDefinedMetadata),null!=e.modelInitializer&&(n.modelInitializer=e.modelInitializer),null!=e.trainingConfig&&(n.trainingConfig=e.trainingConfig),n}async function j(e,t){const n={modelTopology:e.modelTopology,format:e.format,generatedBy:e.generatedBy,convertedBy:e.convertedBy};if(null!=e.trainingConfig&&(n.trainingConfig=e.trainingConfig),null!=e.weightsManifest){const[s,o]=await t(e.weightsManifest);n.weightSpecs=s,n.weightData=o}return null!=e.signature&&(n.signature=e.signature),null!=e.userDefinedMetadata&&(n.userDefinedMetadata=e.userDefinedMetadata),null!=e.modelInitializer&&(n.modelInitializer=e.modelInitializer),n}function g(e){if(e.modelTopology instanceof ArrayBuffer)throw new Error("Expected JSON model topology, received ArrayBuffer.");return{dateSaved:new Date,modelTopologyType:"JSON",modelTopologyBytes:null==e.modelTopology?0:c(JSON.stringify(e.modelTopology)),weightSpecsBytes:null==e.weightSpecs?0:c(JSON.stringify(e.weightSpecs)),weightDataBytes:null==e.weightData?0:e.weightData.byteLength}}function w(){const e=function(){const e=e=>{let t=e<<13,n=0;for(;0==(8388608&t);)n-=8388608,t<<=1;return t&=-8388609,n+=947912704,t|n},t=new Uint32Array(2048);t[0]=0;for(let n=1;n<1024;n++)t[n]=e(n);for(let e=1024;e<2048;e++)t[e]=939524096+(e-1024<<13);return t}(),t=function(){const e=new Uint32Array(64);e[0]=0,e[31]=1199570944,e[32]=2147483648,e[63]=3347054592;for(let t=1;t<31;t++)e[t]=t<<23;for(let t=33;t<63;t++)e[t]=2147483648+(t-32<<23);return e}(),n=function(){const e=new Uint32Array(64);for(let t=0;t<64;t++)e[t]=1024;return e[0]=e[32]=0,e}();return s=>{const o=new ArrayBuffer(4*s.length),r=new Uint32Array(o);for(let o=0;o>10]+(1023&i)]+t[i>>10];r[o]=a}return new Float32Array(o)}}}.call(this,n(/*! ./../../../../buffer/index.js */"./node_modules/buffer/index.js").Buffer)},"./node_modules/@tensorflow/tfjs-core/dist/io/local_storage.js": +/*!*********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/io/local_storage.js ***! + \*********************************************************************/ +/*! exports provided: purgeLocalStorageArtifacts, BrowserLocalStorage, localStorageRouter, browserLocalStorage, BrowserLocalStorageManager */function(e,t,n){"use strict";n.r(t),n.d(t,"purgeLocalStorageArtifacts",(function(){return m})),n.d(t,"BrowserLocalStorage",(function(){return g})),n.d(t,"localStorageRouter",(function(){return w})),n.d(t,"browserLocalStorage",(function(){return _})),n.d(t,"BrowserLocalStorageManager",(function(){return k}));n(/*! ../flags */"./node_modules/@tensorflow/tfjs-core/dist/flags.js");var s=n(/*! ../environment */"./node_modules/@tensorflow/tfjs-core/dist/environment.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./io_utils */"./node_modules/@tensorflow/tfjs-core/dist/io/io_utils.js"),i=n(/*! ./router_registry */"./node_modules/@tensorflow/tfjs-core/dist/io/router_registry.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const a="/",u="tensorflowjs_models",d="info",l="model_topology",c="weight_specs",f="weight_data",p="model_metadata";function m(){if(!Object(s.env)().getBool("IS_BROWSER")||"undefined"==typeof window||"undefined"==typeof window.localStorage)throw new Error("purgeLocalStorageModels() cannot proceed because local storage is unavailable in the current environment.");const e=window.localStorage,t=[];for(let n=0;no.length){e.removeItem(s);const n=j(s);-1===t.indexOf(n)&&t.push(n)}}return t}function h(e){return{info:[u,e,d].join(a),topology:[u,e,l].join(a),weightSpecs:[u,e,c].join(a),weightData:[u,e,f].join(a),modelMetadata:[u,e,p].join(a)}}function b(e){for(const t of Object.values(e))window.localStorage.removeItem(t)}function j(e){const t=e.split(a);if(t.length<3)throw new Error(`Invalid key format: ${e}`);return t.slice(1,t.length-1).join(a)}class g{constructor(e){if(!Object(s.env)().getBool("IS_BROWSER")||"undefined"==typeof window||"undefined"==typeof window.localStorage)throw new Error("The current environment does not support local storage.");if(this.LS=window.localStorage,null==e||!e)throw new Error("For local storage, modelPath must not be null, undefined or empty.");this.modelPath=e,this.keys=h(this.modelPath)}async save(e){if(e.modelTopology instanceof ArrayBuffer)throw new Error("BrowserLocalStorage.save() does not support saving model topology in binary formats yet.");{const t=JSON.stringify(e.modelTopology),n=JSON.stringify(e.weightSpecs),s=Object(r.getModelArtifactsInfoForJSON)(e);try{this.LS.setItem(this.keys.info,JSON.stringify(s)),this.LS.setItem(this.keys.topology,t),this.LS.setItem(this.keys.weightSpecs,n),this.LS.setItem(this.keys.weightData,Object(r.arrayBufferToBase64String)(e.weightData));const o={format:e.format,generatedBy:e.generatedBy,convertedBy:e.convertedBy,signature:null!=e.signature?e.signature:void 0,userDefinedMetadata:null!=e.userDefinedMetadata?e.userDefinedMetadata:void 0,modelInitializer:null!=e.modelInitializer?e.modelInitializer:void 0,trainingConfig:null!=e.trainingConfig?e.trainingConfig:void 0};return this.LS.setItem(this.keys.modelMetadata,JSON.stringify(o)),{modelArtifactsInfo:s}}catch(e){throw b(this.keys),new Error(`Failed to save model '${this.modelPath}' to local storage: size quota being exceeded is a possible cause of this failure: modelTopologyBytes=${s.modelTopologyBytes}, weightSpecsBytes=${s.weightSpecsBytes}, weightDataBytes=${s.weightDataBytes}.`)}}}async load(){const e=JSON.parse(this.LS.getItem(this.keys.info));if(null==e)throw new Error(`In local storage, there is no model with name '${this.modelPath}'`);if("JSON"!==e.modelTopologyType)throw new Error("BrowserLocalStorage does not support loading non-JSON model topology yet.");const t={},n=JSON.parse(this.LS.getItem(this.keys.topology));if(null==n)throw new Error(`In local storage, the topology of model '${this.modelPath}' is missing.`);t.modelTopology=n;const s=JSON.parse(this.LS.getItem(this.keys.weightSpecs));if(null==s)throw new Error(`In local storage, the weight specs of model '${this.modelPath}' are missing.`);t.weightSpecs=s;const o=this.LS.getItem(this.keys.modelMetadata);if(null!=o){const e=JSON.parse(o);t.format=e.format,t.generatedBy=e.generatedBy,t.convertedBy=e.convertedBy,null!=e.signature&&(t.signature=e.signature),null!=e.userDefinedMetadata&&(t.userDefinedMetadata=e.userDefinedMetadata),null!=e.modelInitializer&&(t.modelInitializer=e.modelInitializer),null!=e.trainingConfig&&(t.trainingConfig=e.trainingConfig)}const i=this.LS.getItem(this.keys.weightData);if(null==i)throw new Error(`In local storage, the binary weight values of model '${this.modelPath}' are missing.`);return t.weightData=Object(r.base64StringToArrayBuffer)(i),t}}g.URL_SCHEME="localstorage://";const w=e=>Object(s.env)().getBool("IS_BROWSER")&&!Array.isArray(e)&&e.startsWith(g.URL_SCHEME)?_(e.slice(g.URL_SCHEME.length)):null;function _(e){return new g(e)}i.IORouterRegistry.registerSaveRouter(w),i.IORouterRegistry.registerLoadRouter(w);class k{constructor(){Object(o.assert)(Object(s.env)().getBool("IS_BROWSER"),(()=>"Current environment is not a web browser")),Object(o.assert)("undefined"==typeof window||"undefined"!=typeof window.localStorage,(()=>"Current browser does not appear to support localStorage")),this.LS=window.localStorage}async listModels(){const e={},t=u+a,n=a+d;for(let s=0;s"scheme must not be undefined or null.")),e.endsWith(r)&&(e=e.slice(0,e.indexOf(r))),Object(s.assert)(e.length>0,(()=>"scheme must not be an empty string."));const n=i.getInstance();Object(s.assert)(null==n.managers[e],(()=>`A model store manager is already registered for scheme '${e}'.`)),n.managers[e]=t}static getManager(e){const t=this.getInstance().managers[e];if(null==t)throw new Error(`Cannot find model manager for scheme '${e}'`);return t}static getSchemes(){return Object.keys(this.getInstance().managers)}}function a(e){if(-1===e.indexOf(r))throw new Error(`The url string provided does not contain a scheme. Supported schemes are: ${i.getSchemes().join(",")}`);return{scheme:e.split(r)[0],path:e.split(r)[1]}}async function u(e,t,n=!1){Object(s.assert)(e!==t,(()=>`Old path and new path are the same: '${e}'`));const r=o.IORouterRegistry.getLoadHandlers(e);Object(s.assert)(r.length>0,(()=>`Copying failed because no load handler is found for source URL ${e}.`)),Object(s.assert)(r.length<2,(()=>`Copying failed because more than one (${r.length}) load handlers for source URL ${e}.`));const u=r[0],d=o.IORouterRegistry.getSaveHandlers(t);Object(s.assert)(d.length>0,(()=>`Copying failed because no save handler is found for destination URL ${t}.`)),Object(s.assert)(d.length<2,(()=>`Copying failed because more than one (${r.length}) save handlers for destination URL ${t}.`));const l=d[0],c=a(e).scheme,f=a(e).path,p=c===a(e).scheme,m=await u.load();n&&p&&await i.getManager(c).removeModel(f);const h=await l.save(m);return n&&!p&&await i.getManager(c).removeModel(f),h.modelArtifactsInfo}async function d(){const e=i.getSchemes(),t={};for(const n of e){const e=await i.getManager(n).listModels();for(const s in e){t[n+r+s]=e[s]}}return t}async function l(e){const t=a(e);return i.getManager(t.scheme).removeModel(t.path)}async function c(e,t){return u(e,t,!1)}async function f(e,t){return u(e,t,!0)}},"./node_modules/@tensorflow/tfjs-core/dist/io/passthrough.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/io/passthrough.js ***! + \*******************************************************************/ +/*! exports provided: fromMemory, withSaveHandler */function(e,t,n){"use strict";n.r(t),n.d(t,"fromMemory",(function(){return r})),n.d(t,"withSaveHandler",(function(){return i})); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class s{constructor(e){this.modelArtifacts=e}async load(){return this.modelArtifacts}}class o{constructor(e){this.saveHandler=e}async save(e){return this.saveHandler(e)}}function r(e,t,n,o){if(1===arguments.length){return null!=e.modelTopology||null!=e.weightSpecs?new s(e):(console.warn("Please call tf.io.fromMemory() with only one argument. The argument should be of type ModelArtifacts. The multi-argument signature of tf.io.fromMemory() has been deprecated and will be removed in a future release."),new s({modelTopology:e}))}return console.warn("Please call tf.io.fromMemory() with only one argument. The argument should be of type ModelArtifacts. The multi-argument signature of tf.io.fromMemory() has been deprecated and will be removed in a future release."),new s({modelTopology:e,weightSpecs:t,weightData:n,trainingConfig:o})}function i(e){return new o(e)}},"./node_modules/@tensorflow/tfjs-core/dist/io/progress.js": +/*!****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/io/progress.js ***! + \****************************************************************/ +/*! exports provided: monitorPromisesProgress */function(e,t,n){"use strict";n.r(t),n.d(t,"monitorPromisesProgress",(function(){return o}));var s=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */function o(e,t,n,o){!function(e){Object(s.assert)(null!=e&&Array.isArray(e)&&e.length>0,(()=>"promises must be a none empty array"))}(e),function(e,t){Object(s.assert)(e>=0&&e<=1,(()=>`Progress fraction must be in range [0, 1], but got startFraction ${e}`)),Object(s.assert)(t>=0&&t<=1,(()=>`Progress fraction must be in range [0, 1], but got endFraction ${t}`)),Object(s.assert)(t>=e,(()=>`startFraction must be no more than endFraction, but got startFraction ${e} and endFraction ${t}`))}(n=null==n?0:n,o=null==o?1:o);let r=0;return Promise.all(e.map((s=>(s.then((s=>{const i=n+ ++r/e.length*(o-n);return t(i),s})),s))))}},"./node_modules/@tensorflow/tfjs-core/dist/io/router_registry.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/io/router_registry.js ***! + \***********************************************************************/ +/*! exports provided: IORouterRegistry, registerSaveRouter, registerLoadRouter, getSaveHandlers, getLoadHandlers */function(e,t,n){"use strict";n.r(t),n.d(t,"IORouterRegistry",(function(){return s})),n.d(t,"registerSaveRouter",(function(){return o})),n.d(t,"registerLoadRouter",(function(){return r})),n.d(t,"getSaveHandlers",(function(){return i})),n.d(t,"getLoadHandlers",(function(){return a})); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class s{constructor(){this.saveRouters=[],this.loadRouters=[]}static getInstance(){return null==s.instance&&(s.instance=new s),s.instance}static registerSaveRouter(e){s.getInstance().saveRouters.push(e)}static registerLoadRouter(e){s.getInstance().loadRouters.push(e)}static getSaveHandlers(e){return s.getHandlers(e,"save")}static getLoadHandlers(e,t){return s.getHandlers(e,"load",t)}static getHandlers(e,t,n){const o=[];return("load"===t?s.getInstance().loadRouters:s.getInstance().saveRouters).forEach((t=>{const s=t(e,n);null!==s&&o.push(s)})),o}}const o=e=>s.registerSaveRouter(e),r=e=>s.registerLoadRouter(e),i=e=>s.getSaveHandlers(e),a=(e,t)=>s.getLoadHandlers(e,t)},"./node_modules/@tensorflow/tfjs-core/dist/io/types.js": +/*!*************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/io/types.js ***! + \*************************************************************/ +/*! exports provided: DTYPE_VALUE_SIZE_MAP */function(e,t,n){"use strict";n.r(t),n.d(t,"DTYPE_VALUE_SIZE_MAP",(function(){return s})); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const s={float32:4,float16:2,int32:4,uint16:2,uint8:1,bool:1,complex64:8}},"./node_modules/@tensorflow/tfjs-core/dist/io/weights_loader.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/io/weights_loader.js ***! + \**********************************************************************/ +/*! exports provided: loadWeightsAsArrayBuffer, loadWeights, weightsLoaderFactory */function(e,t,n){"use strict";n.r(t),n.d(t,"loadWeightsAsArrayBuffer",(function(){return u})),n.d(t,"loadWeights",(function(){return d})),n.d(t,"weightsLoaderFactory",(function(){return l}));var s=n(/*! ../environment */"./node_modules/@tensorflow/tfjs-core/dist/environment.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./io_utils */"./node_modules/@tensorflow/tfjs-core/dist/io/io_utils.js"),i=n(/*! ./progress */"./node_modules/@tensorflow/tfjs-core/dist/io/progress.js"),a=n(/*! ./types */"./node_modules/@tensorflow/tfjs-core/dist/io/types.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +async function u(e,t){null==t&&(t={});const n=null==t.fetchFunc?Object(s.env)().platform.fetch:t.fetchFunc,o=e.map((e=>n(e,t.requestInit,{isBinary:!0}))),r=(null==t.onProgress?await Promise.all(o):await Object(i.monitorPromisesProgress)(o,t.onProgress,0,.5)).map((e=>e.arrayBuffer()));return null==t.onProgress?await Promise.all(r):await Object(i.monitorPromisesProgress)(r,t.onProgress,.5,1)}async function d(e,t="",n,s){return l((e=>u(e,{requestInit:s})))(e,t,n)}function l(e){return async(t,n="",s)=>{const i=t.map((()=>!1)),u={},d=null!=s?s.map((()=>!1)):[],l=[];if(t.forEach(((e,t)=>{let n=0;e.weights.forEach((e=>{const r="quantization"in e?e.quantization.dtype:e.dtype,c=a.DTYPE_VALUE_SIZE_MAP[r]*o.sizeFromShape(e.shape),f=()=>{i[t]=!0,null==u[t]&&(u[t]=[]),u[t].push({manifestEntry:e,groupOffset:n,sizeBytes:c})};null!=s?s.forEach(((t,n)=>{t===e.name&&(f(),d[n]=!0)})):f(),l.push(e.name),n+=c}))})),!d.every((e=>e))){const e=s.filter(((e,t)=>!d[t]));throw new Error(`Could not find weights in manifest with names: ${e.join(", ")}. \nManifest JSON has weights with names: ${l.join(", ")}.`)}const c=i.reduce(((e,t,n)=>(t&&e.push(n),e)),[]),f=[];c.forEach((e=>{t[e].paths.forEach((e=>{const t=n+(n.endsWith("/")?"":"/")+e;f.push(t)}))}));const p=await e(f),m={};let h=0;return c.forEach((e=>{const n=t[e].paths.length;let s=0;for(let e=0;e{const t=o.slice(e.groupOffset,e.groupOffset+e.sizeBytes),n=Object(r.decodeWeights)(t,[e.manifestEntry]);for(const e in n)m[e]=n[e]})),h+=n})),m}}},"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js": +/*!*****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js ***! + \*****************************************************************/ +/*! exports provided: Abs, Acos, Acosh, Add, AddN, All, Any, ArgMax, ArgMin, Asin, Asinh, Atan, Atanh, Atan2, AvgPool, AvgPoolGrad, AvgPool3D, AvgPool3DGrad, BatchMatMul, BatchToSpaceND, Bincount, BroadcastTo, Cast, Ceil, ClipByValue, Complex, ComplexAbs, Concat, Conv2D, Conv2DBackpropFilter, Conv2DBackpropInput, Conv3D, Conv3DBackpropFilterV2, Conv3DBackpropInputV2, Cos, Cosh, Cumsum, CropAndResize, DenseBincount, DepthToSpace, DepthwiseConv2dNative, DepthwiseConv2dNativeBackpropFilter, DepthwiseConv2dNativeBackpropInput, Diag, Dilation2D, Dilation2DBackpropInput, Dilation2DBackpropFilter, RealDiv, Einsum, Elu, EluGrad, Erf, Equal, Exp, ExpandDims, Expm1, FFT, Fill, FlipLeftRight, Floor, FloorDiv, FusedBatchNorm, GatherV2, GatherNd, Greater, GreaterEqual, Identity, IFFT, Imag, IsFinite, IsInf, IsNan, LeakyRelu, Less, LessEqual, LinSpace, Log, Log1p, LogicalAnd, LogicalNot, LogicalOr, LogSoftmax, LRN, LRNGrad, Max, Maximum, MaxPool, MaxPoolGrad, MaxPool3D, MaxPool3DGrad, MaxPoolWithArgmax, Mean, Min, Minimum, MirrorPad, Mod, Multinomial, Multiply, Neg, NotEqual, NonMaxSuppressionV3, NonMaxSuppressionV4, NonMaxSuppressionV5, OnesLike, OneHot, Pack, PadV2, Pool, Pow, Prelu, Prod, Range, Real, Reciprocal, Relu, Reshape, ResizeNearestNeighbor, ResizeNearestNeighborGrad, ResizeBilinear, ResizeBilinearGrad, Relu6, Reverse, Round, Rsqrt, ScatterNd, Select, Selu, Slice, Sin, Sinh, Sign, Sigmoid, Softplus, Sqrt, Sum, SpaceToBatchND, SplitV, Softmax, SparseFillEmptyRows, SparseReshape, SparseSegmentMean, SparseSegmentSum, SparseToDense, SquaredDifference, Square, StridedSlice, StringNGrams, StringSplit, StringToHashBucketFast, Sub, Tan, Tanh, Tile, TopK, Transform, Transpose, Unique, Unpack, UnsortedSegmentSum, ZerosLike, Step, FromPixels, RotateWithOffset, _FusedMatMul, FusedConv2D, FusedDepthwiseConv2D */function(e,t,n){"use strict";n.r(t),n.d(t,"Abs",(function(){return s})),n.d(t,"Acos",(function(){return o})),n.d(t,"Acosh",(function(){return r})),n.d(t,"Add",(function(){return i})),n.d(t,"AddN",(function(){return a})),n.d(t,"All",(function(){return u})),n.d(t,"Any",(function(){return d})),n.d(t,"ArgMax",(function(){return l})),n.d(t,"ArgMin",(function(){return c})),n.d(t,"Asin",(function(){return f})),n.d(t,"Asinh",(function(){return p})),n.d(t,"Atan",(function(){return m})),n.d(t,"Atanh",(function(){return h})),n.d(t,"Atan2",(function(){return b})),n.d(t,"AvgPool",(function(){return j})),n.d(t,"AvgPoolGrad",(function(){return g})),n.d(t,"AvgPool3D",(function(){return w})),n.d(t,"AvgPool3DGrad",(function(){return _})),n.d(t,"BatchMatMul",(function(){return k})),n.d(t,"BatchToSpaceND",(function(){return v})),n.d(t,"Bincount",(function(){return x})),n.d(t,"BroadcastTo",(function(){return y})),n.d(t,"Cast",(function(){return O})),n.d(t,"Ceil",(function(){return I})),n.d(t,"ClipByValue",(function(){return C})),n.d(t,"Complex",(function(){return S})),n.d(t,"ComplexAbs",(function(){return T})),n.d(t,"Concat",(function(){return N})),n.d(t,"Conv2D",(function(){return E})),n.d(t,"Conv2DBackpropFilter",(function(){return A})),n.d(t,"Conv2DBackpropInput",(function(){return R})),n.d(t,"Conv3D",(function(){return F})),n.d(t,"Conv3DBackpropFilterV2",(function(){return M})),n.d(t,"Conv3DBackpropInputV2",(function(){return $})),n.d(t,"Cos",(function(){return D})),n.d(t,"Cosh",(function(){return P})),n.d(t,"Cumsum",(function(){return B})),n.d(t,"CropAndResize",(function(){return L})),n.d(t,"DenseBincount",(function(){return z})),n.d(t,"DepthToSpace",(function(){return G})),n.d(t,"DepthwiseConv2dNative",(function(){return U})),n.d(t,"DepthwiseConv2dNativeBackpropFilter",(function(){return W})),n.d(t,"DepthwiseConv2dNativeBackpropInput",(function(){return V})),n.d(t,"Diag",(function(){return q})),n.d(t,"Dilation2D",(function(){return H})),n.d(t,"Dilation2DBackpropInput",(function(){return K})),n.d(t,"Dilation2DBackpropFilter",(function(){return X})),n.d(t,"RealDiv",(function(){return Y})),n.d(t,"Einsum",(function(){return Z})),n.d(t,"Elu",(function(){return Q})),n.d(t,"EluGrad",(function(){return J})),n.d(t,"Erf",(function(){return ee})),n.d(t,"Equal",(function(){return te})),n.d(t,"Exp",(function(){return ne})),n.d(t,"ExpandDims",(function(){return se})),n.d(t,"Expm1",(function(){return oe})),n.d(t,"FFT",(function(){return re})),n.d(t,"Fill",(function(){return ie})),n.d(t,"FlipLeftRight",(function(){return ae})),n.d(t,"Floor",(function(){return ue})),n.d(t,"FloorDiv",(function(){return de})),n.d(t,"FusedBatchNorm",(function(){return le})),n.d(t,"GatherV2",(function(){return ce})),n.d(t,"GatherNd",(function(){return fe})),n.d(t,"Greater",(function(){return pe})),n.d(t,"GreaterEqual",(function(){return me})),n.d(t,"Identity",(function(){return he})),n.d(t,"IFFT",(function(){return be})),n.d(t,"Imag",(function(){return je})),n.d(t,"IsFinite",(function(){return ge})),n.d(t,"IsInf",(function(){return we})),n.d(t,"IsNan",(function(){return _e})),n.d(t,"LeakyRelu",(function(){return ke})),n.d(t,"Less",(function(){return ve})),n.d(t,"LessEqual",(function(){return xe})),n.d(t,"LinSpace",(function(){return ye})),n.d(t,"Log",(function(){return Oe})),n.d(t,"Log1p",(function(){return Ie})),n.d(t,"LogicalAnd",(function(){return Ce})),n.d(t,"LogicalNot",(function(){return Se})),n.d(t,"LogicalOr",(function(){return Te})),n.d(t,"LogSoftmax",(function(){return Ne})),n.d(t,"LRN",(function(){return Ee})),n.d(t,"LRNGrad",(function(){return Ae})),n.d(t,"Max",(function(){return Re})),n.d(t,"Maximum",(function(){return Fe})),n.d(t,"MaxPool",(function(){return Me})),n.d(t,"MaxPoolGrad",(function(){return $e})),n.d(t,"MaxPool3D",(function(){return De})),n.d(t,"MaxPool3DGrad",(function(){return Pe})),n.d(t,"MaxPoolWithArgmax",(function(){return Be})),n.d(t,"Mean",(function(){return Le})),n.d(t,"Min",(function(){return ze})),n.d(t,"Minimum",(function(){return Ge})),n.d(t,"MirrorPad",(function(){return Ue})),n.d(t,"Mod",(function(){return We})),n.d(t,"Multinomial",(function(){return Ve})),n.d(t,"Multiply",(function(){return qe})),n.d(t,"Neg",(function(){return He})),n.d(t,"NotEqual",(function(){return Ke})),n.d(t,"NonMaxSuppressionV3",(function(){return Xe})),n.d(t,"NonMaxSuppressionV4",(function(){return Ye})),n.d(t,"NonMaxSuppressionV5",(function(){return Ze})),n.d(t,"OnesLike",(function(){return Qe})),n.d(t,"OneHot",(function(){return Je})),n.d(t,"Pack",(function(){return et})),n.d(t,"PadV2",(function(){return tt})),n.d(t,"Pool",(function(){return nt})),n.d(t,"Pow",(function(){return st})),n.d(t,"Prelu",(function(){return ot})),n.d(t,"Prod",(function(){return rt})),n.d(t,"Range",(function(){return it})),n.d(t,"Real",(function(){return at})),n.d(t,"Reciprocal",(function(){return ut})),n.d(t,"Relu",(function(){return dt})),n.d(t,"Reshape",(function(){return lt})),n.d(t,"ResizeNearestNeighbor",(function(){return ct})),n.d(t,"ResizeNearestNeighborGrad",(function(){return ft})),n.d(t,"ResizeBilinear",(function(){return pt})),n.d(t,"ResizeBilinearGrad",(function(){return mt})),n.d(t,"Relu6",(function(){return ht})),n.d(t,"Reverse",(function(){return bt})),n.d(t,"Round",(function(){return jt})),n.d(t,"Rsqrt",(function(){return gt})),n.d(t,"ScatterNd",(function(){return wt})),n.d(t,"Select",(function(){return _t})),n.d(t,"Selu",(function(){return kt})),n.d(t,"Slice",(function(){return vt})),n.d(t,"Sin",(function(){return xt})),n.d(t,"Sinh",(function(){return yt})),n.d(t,"Sign",(function(){return Ot})),n.d(t,"Sigmoid",(function(){return It})),n.d(t,"Softplus",(function(){return Ct})),n.d(t,"Sqrt",(function(){return St})),n.d(t,"Sum",(function(){return Tt})),n.d(t,"SpaceToBatchND",(function(){return Nt})),n.d(t,"SplitV",(function(){return Et})),n.d(t,"Softmax",(function(){return At})),n.d(t,"SparseFillEmptyRows",(function(){return Rt})),n.d(t,"SparseReshape",(function(){return Ft})),n.d(t,"SparseSegmentMean",(function(){return Mt})),n.d(t,"SparseSegmentSum",(function(){return $t})),n.d(t,"SparseToDense",(function(){return Dt})),n.d(t,"SquaredDifference",(function(){return Pt})),n.d(t,"Square",(function(){return Bt})),n.d(t,"StridedSlice",(function(){return Lt})),n.d(t,"StringNGrams",(function(){return zt})),n.d(t,"StringSplit",(function(){return Gt})),n.d(t,"StringToHashBucketFast",(function(){return Ut})),n.d(t,"Sub",(function(){return Wt})),n.d(t,"Tan",(function(){return Vt})),n.d(t,"Tanh",(function(){return qt})),n.d(t,"Tile",(function(){return Ht})),n.d(t,"TopK",(function(){return Kt})),n.d(t,"Transform",(function(){return Xt})),n.d(t,"Transpose",(function(){return Yt})),n.d(t,"Unique",(function(){return Zt})),n.d(t,"Unpack",(function(){return Qt})),n.d(t,"UnsortedSegmentSum",(function(){return Jt})),n.d(t,"ZerosLike",(function(){return en})),n.d(t,"Step",(function(){return tn})),n.d(t,"FromPixels",(function(){return nn})),n.d(t,"RotateWithOffset",(function(){return sn})),n.d(t,"_FusedMatMul",(function(){return on})),n.d(t,"FusedConv2D",(function(){return rn})),n.d(t,"FusedDepthwiseConv2D",(function(){return an}));const s="Abs",o="Acos",r="Acosh",i="Add",a="AddN",u="All",d="Any",l="ArgMax",c="ArgMin",f="Asin",p="Asinh",m="Atan",h="Atanh",b="Atan2",j="AvgPool",g="AvgPoolGrad",w="AvgPool3D",_="AvgPool3DGrad",k="BatchMatMul",v="BatchToSpaceND",x="Bincount",y="BroadcastTo",O="Cast",I="Ceil",C="ClipByValue",S="Complex",T="ComplexAbs",N="Concat",E="Conv2D",A="Conv2DBackpropFilter",R="Conv2DBackpropInput",F="Conv3D",M="Conv3DBackpropFilterV2",$="Conv3DBackpropInputV2",D="Cos",P="Cosh",B="Cumsum",L="CropAndResize",z="DenseBincount",G="DepthToSpace",U="DepthwiseConv2dNative",W="DepthwiseConv2dNativeBackpropFilter",V="DepthwiseConv2dNativeBackpropInput",q="Diag",H="Dilation2D",K="Dilation2DBackpropInput",X="Dilation2DBackpropFilter",Y="RealDiv",Z="Einsum",Q="Elu",J="EluGrad",ee="Erf",te="Equal",ne="Exp",se="ExpandDims",oe="Expm1",re="FFT",ie="Fill",ae="FlipLeftRight",ue="Floor",de="FloorDiv",le="FusedBatchNorm",ce="GatherV2",fe="GatherNd",pe="Greater",me="GreaterEqual",he="Identity",be="IFFT",je="Imag",ge="IsFinite",we="IsInf",_e="IsNan",ke="LeakyRelu",ve="Less",xe="LessEqual",ye="LinSpace",Oe="Log",Ie="Log1p",Ce="LogicalAnd",Se="LogicalNot",Te="LogicalOr",Ne="LogSoftmax",Ee="LRN",Ae="LRNGrad",Re="Max",Fe="Maximum",Me="MaxPool",$e="MaxPoolGrad",De="MaxPool3D",Pe="MaxPool3DGrad",Be="MaxPoolWithArgmax",Le="Mean",ze="Min",Ge="Minimum",Ue="MirrorPad",We="Mod",Ve="Multinomial",qe="Multiply",He="Neg",Ke="NotEqual",Xe="NonMaxSuppressionV3",Ye="NonMaxSuppressionV4",Ze="NonMaxSuppressionV5",Qe="OnesLike",Je="OneHot",et="Pack",tt="PadV2",nt="Pool",st="Pow",ot="Prelu",rt="Prod",it="Range",at="Real",ut="Reciprocal",dt="Relu",lt="Reshape",ct="ResizeNearestNeighbor",ft="ResizeNearestNeighborGrad",pt="ResizeBilinear",mt="ResizeBilinearGrad",ht="Relu6",bt="Reverse",jt="Round",gt="Rsqrt",wt="ScatterNd",_t="Select",kt="Selu",vt="Slice",xt="Sin",yt="Sinh",Ot="Sign",It="Sigmoid",Ct="Softplus",St="Sqrt",Tt="Sum",Nt="SpaceToBatchND",Et="SplitV",At="Softmax",Rt="SparseFillEmptyRows",Ft="SparseReshape",Mt="SparseSegmentMean",$t="SparseSegmentSum",Dt="SparseToDense",Pt="SquaredDifference",Bt="Square",Lt="StridedSlice",zt="StringNGrams",Gt="StringSplit",Ut="StringToHashBucketFast",Wt="Sub",Vt="Tan",qt="Tanh",Ht="Tile",Kt="TopK",Xt="Transform",Yt="Transpose",Zt="Unique",Qt="Unpack",Jt="UnsortedSegmentSum",en="ZerosLike",tn="Step",nn="FromPixels",sn="RotateWithOffset",on="_FusedMatMul",rn="FusedConv2D",an="FusedDepthwiseConv2D"},"./node_modules/@tensorflow/tfjs-core/dist/kernel_registry.js": +/*!********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/kernel_registry.js ***! + \********************************************************************/ +/*! exports provided: getKernel, getGradient, getKernelsForBackend, registerKernel, registerGradient, unregisterKernel, unregisterGradient, copyRegisteredKernels */function(e,t,n){"use strict";n.r(t),n.d(t,"getKernel",(function(){return a})),n.d(t,"getGradient",(function(){return u})),n.d(t,"getKernelsForBackend",(function(){return d})),n.d(t,"registerKernel",(function(){return l})),n.d(t,"registerGradient",(function(){return c})),n.d(t,"unregisterKernel",(function(){return f})),n.d(t,"unregisterGradient",(function(){return p})),n.d(t,"copyRegisteredKernels",(function(){return m}));var s=n(/*! ./environment */"./node_modules/@tensorflow/tfjs-core/dist/environment.js"),o=n(/*! ./global_util */"./node_modules/@tensorflow/tfjs-core/dist/global_util.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r=Object(o.getGlobal)("kernelRegistry",(()=>new Map)),i=Object(o.getGlobal)("gradRegistry",(()=>new Map));function a(e,t){const n=h(e,t);return r.get(n)}function u(e){return i.get(e)}function d(e){const t=r.entries(),n=[];for(;;){const{done:s,value:o}=t.next();if(s)break;const[r,i]=o,[a]=r.split("_");a===e&&n.push(i)}return n}function l(e){const{kernelName:t,backendName:n}=e,s=h(t,n);r.has(s)&&console.warn(`The kernel '${t}' for backend '${n}' is already registered`),r.set(s,e)}function c(e){const{kernelName:t}=e;i.has(t)&&Object(s.env)().getBool("DEBUG")&&console.warn(`Overriding the gradient for '${t}'`),i.set(t,e)}function f(e,t){const n=h(e,t);if(!r.has(n))throw new Error(`The kernel '${e}' for backend '${t}' is not registered`);r.delete(n)}function p(e){if(!i.has(e))throw new Error(`The gradient '${e}' for backend is not registered`);i.delete(e)}function m(e,t){d(e).forEach((e=>{l(Object.assign({},e,{backendName:t}))}))}function h(e,t){return`${t}_${e}`}},"./node_modules/@tensorflow/tfjs-core/dist/log.js": +/*!********************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/log.js ***! + \********************************************************/ +/*! exports provided: warn, log */function(e,t,n){"use strict";n.r(t),n.d(t,"warn",(function(){return o})),n.d(t,"log",(function(){return r}));var s=n(/*! ./environment */"./node_modules/@tensorflow/tfjs-core/dist/environment.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */function o(...e){Object(s.env)().getBool("IS_TEST")||console.warn(...e)}function r(...e){Object(s.env)().getBool("IS_TEST")||console.log(...e)}},"./node_modules/@tensorflow/tfjs-core/dist/math.js": +/*!*********************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/math.js ***! + \*********************************************************/ +/*! exports provided: confusionMatrix */function(e,t,n){"use strict";n.r(t);var s=n(/*! ./ops/confusion_matrix */"./node_modules/@tensorflow/tfjs-core/dist/ops/confusion_matrix.js");n.d(t,"confusionMatrix",(function(){return s.confusionMatrix}))},"./node_modules/@tensorflow/tfjs-core/dist/ops/abs.js": +/*!************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/abs.js ***! + \************************************************************/ +/*! exports provided: abs */function(e,t,n){"use strict";n.r(t),n.d(t,"abs",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({abs_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){const t=Object(r.convertToTensor)(e,"x","abs");if("complex64"===t.dtype){const e={x:t};return s.ENGINE.runKernel(o.ComplexAbs,e)}{const e={x:t};return s.ENGINE.runKernel(o.Abs,e)}}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/acos.js": +/*!*************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/acos.js ***! + \*************************************************************/ +/*! exports provided: acos */function(e,t,n){"use strict";n.r(t),n.d(t,"acos",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({acos_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){const t={x:Object(r.convertToTensor)(e,"x","acos")};return s.ENGINE.runKernel(o.Acos,t)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/acosh.js": +/*!**************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/acosh.js ***! + \**************************************************************/ +/*! exports provided: acosh */function(e,t,n){"use strict";n.r(t),n.d(t,"acosh",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({acosh_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){const t={x:Object(r.convertToTensor)(e,"x","acosh")};return s.ENGINE.runKernel(o.Acosh,t)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js": +/*!************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/add.js ***! + \************************************************************/ +/*! exports provided: add */function(e,t,n){"use strict";n.r(t),n.d(t,"add",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),i=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(a.op)({add_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t){let n=Object(i.convertToTensor)(e,"a","add"),a=Object(i.convertToTensor)(t,"b","add");[n,a]=Object(r.makeTypesMatch)(n,a);const u={a:n,b:a};return s.ENGINE.runKernel(o.Add,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/add_n.js": +/*!**************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/add_n.js ***! + \**************************************************************/ +/*! exports provided: addN */function(e,t,n){"use strict";n.r(t),n.d(t,"addN",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(a.op)({addN_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){i.assert(Array.isArray(e),(()=>"The argument passed to tf.addN() must be a list of tensors")),i.assert(e.length>=1,(()=>`Must pass at least one tensor to tf.addN(), but got ${e.length}`));const t=e.map(((e,t)=>Object(r.convertToTensor)(e,`tensors${t}`,"addN"))),n=t[0];t.forEach((e=>{if(e.dtype!==n.dtype)throw new Error("All tensors passed to tf.addN() must have the same dtype")})),t.forEach((e=>{if(!i.arraysEqual(e.shape,n.shape))throw new Error("All tensors passed to tf.addN() must have the same shape")}));const a=t;return s.ENGINE.runKernel(o.AddN,a)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/all.js": +/*!************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/all.js ***! + \************************************************************/ +/*! exports provided: all */function(e,t,n){"use strict";n.r(t),n.d(t,"all",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({all_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t=null,n=!1){const i={x:Object(r.convertToTensor)(e,"x","all","bool")},a={axis:t,keepDims:n};return s.ENGINE.runKernel(o.All,i,a)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/any.js": +/*!************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/any.js ***! + \************************************************************/ +/*! exports provided: any */function(e,t,n){"use strict";n.r(t),n.d(t,"any",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({any_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t=null,n=!1){const i={x:Object(r.convertToTensor)(e,"x","any","bool")},a={axis:t,keepDims:n};return s.ENGINE.runKernel(o.Any,i,a)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/arg_max.js": +/*!****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/arg_max.js ***! + \****************************************************************/ +/*! exports provided: argMax */function(e,t,n){"use strict";n.r(t),n.d(t,"argMax",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({argMax_: +/** + * @license + * Copyright 2020 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t=0){const n={x:Object(r.convertToTensor)(e,"x","argMax")},i={axis:t};return s.ENGINE.runKernel(o.ArgMax,n,i)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/arg_min.js": +/*!****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/arg_min.js ***! + \****************************************************************/ +/*! exports provided: argMin */function(e,t,n){"use strict";n.r(t),n.d(t,"argMin",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({argMin_: +/** + * @license + * Copyright 2020 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t=0){const n={x:Object(r.convertToTensor)(e,"x","argMin")},i={axis:t};return s.ENGINE.runKernel(o.ArgMin,n,i)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/array_ops_util.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/array_ops_util.js ***! + \***********************************************************************/ +/*! exports provided: getReshaped, getPermuted, getReshapedPermuted, getSliceBeginCoords, getSliceSize */function(e,t,n){"use strict"; +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function s(e,t,n,s=!0){let o=[];if(s)o=o.concat(t.slice(0)),o.push(e[0]/n),o=o.concat(e.slice(1));else{o=o.concat(e[0]);const n=t.length;for(let s=0;s=2*t+1||s%2==1?o.push(s):n.push(s);s.push(...n),s.push(0),s.push(...o)}return s}function r(e,t,n,s=!0){const o=[];s?o.push(e[0]/n):o.push(e[0]*n);for(let n=1;n`Error in avgPool: Either strides or dilations must be 1. Got strides ${n} and dilations '1'`));let p=f,m=!1;3===f.rank&&(m=!0,p=Object(l.reshape)(f,[1,f.shape[0],f.shape[1],f.shape[2]])),i.assert(4===p.rank,(()=>`Error in avgPool: x must be rank 4 but got rank ${p.rank}.`)),null!=c&&i.assert(i.isInt(d),(()=>`Error in avgPool: pad must be an integer when using, dimRoundingMode ${c} but got pad ${d}.`));const h={x:p},b={filterSize:t,strides:n,pad:d,dimRoundingMode:c};let j=s.ENGINE.runKernel(o.AvgPool,h,b);return j=Object(a.cast)(j,f.dtype),m?Object(l.reshape)(j,[j.shape[1],j.shape[2],j.shape[3]]):j}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/avg_pool_3d.js": +/*!********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/avg_pool_3d.js ***! + \********************************************************************/ +/*! exports provided: avgPool3d */function(e,t,n){"use strict";n.r(t),n.d(t,"avgPool3d",(function(){return l}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./cast */"./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"),u=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),d=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const l=Object(u.op)({avgPool3d_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n,u,l,c="NDHWC"){const f=Object(r.convertToTensor)(e,"x","avgPool3d","float32");let p=f,m=!1;4===f.rank&&(m=!0,p=Object(d.reshape)(f,[1,f.shape[0],f.shape[1],f.shape[2],f.shape[3]])),i.assert(5===p.rank,(()=>`Error in avgPool3d: x must be rank 5 but got rank ${p.rank}.`)),i.assert("NDHWC"===c,(()=>`Error in avgPool3d: Only NDHWC is currently supported, but got dataFormat of ${c}`)),null!=l&&i.assert(i.isInt(u),(()=>`Error in avgPool3d: pad must be an integer when using, dimRoundingMode ${l} but got pad ${u}.`));const h={x:p},b={filterSize:t,strides:n,pad:u,dimRoundingMode:l,dataFormat:c};let j=s.ENGINE.runKernel(o.AvgPool3D,h,b);return j=Object(a.cast)(j,p.dtype),m?Object(d.reshape)(j,[j.shape[1],j.shape[2],j.shape[3],j.shape[4]]):j}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/axis_util.js": +/*!******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/axis_util.js ***! + \******************************************************************/ +/*! exports provided: axesAreInnerMostDims, combineLocations, computeOutAndReduceShapes, expandShapeToKeepDim, assertAxesAreInnerMostDims, getAxesPermutation, getUndoAxesPermutation, getInnerMostAxes */function(e,t,n){"use strict";n.r(t),n.d(t,"axesAreInnerMostDims",(function(){return o})),n.d(t,"combineLocations",(function(){return r})),n.d(t,"computeOutAndReduceShapes",(function(){return i})),n.d(t,"expandShapeToKeepDim",(function(){return a})),n.d(t,"assertAxesAreInnerMostDims",(function(){return u})),n.d(t,"getAxesPermutation",(function(){return d})),n.d(t,"getUndoAxesPermutation",(function(){return l})),n.d(t,"getInnerMostAxes",(function(){return c}));var s=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */function o(e,t){for(let n=0;ne[t]))]}function a(e,t){return r(e,t.map((e=>1)),t)}function u(e,t,n){s.assert(o(t,n),(()=>`${e} supports only inner-most axes for now. Got axes ${t} and rank-${n} input.`))}function d(e,t){if(o(e,t))return null;const n=[];for(let s=0;sn.push(e))),n}function l(e){return e.map(((e,t)=>[t,e])).sort(((e,t)=>e[1]-t[1])).map((e=>e[0]))}function c(e,t){const n=[];for(let s=t-e;se*t));i.assert(a.rank>=1+t.length,(()=>`input rank is ${a.rank} but should be > than blockShape.length ${t.length}`)),i.assert(n.length===t.length,(()=>`crops.length is ${n.length} but should be equal to blockShape.length ${t.length}`)),i.assert(a.shape[0]%u==0,(()=>`input tensor batch is ${a.shape[0]} but is not divisible by the product of the elements of blockShape ${t.join(" * ")} === ${u}`));const d={x:a},l={blockShape:t,crops:n};return s.ENGINE.runKernel(o.BatchToSpaceND,d,l)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm.js": +/*!******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm.js ***! + \******************************************************************/ +/*! exports provided: batchNorm */function(e,t,n){"use strict";n.r(t),n.d(t,"batchNorm",(function(){return l}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./batchnorm_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm_util.js"),u=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),d=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const l=Object(u.op)({batchNorm_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n,u,l,c){null==c&&(c=.001);const f=Object(r.convertToTensor)(e,"x","batchNorm"),p=Object(r.convertToTensor)(t,"mean","batchNorm"),m=Object(r.convertToTensor)(n,"variance","batchNorm");let h,b;null!=l&&(h=Object(r.convertToTensor)(l,"scale","batchNorm")),null!=u&&(b=Object(r.convertToTensor)(u,"offset","batchNorm")),i.assert(p.rank===m.rank,(()=>"Batch normalization gradient requires mean and variance to have equal ranks.")),i.assert(null==b||p.rank===b.rank,(()=>"Batch normalization gradient requires mean and offset to have equal ranks.")),i.assert(null==h||p.rank===h.rank,(()=>"Batch normalization gradient requires mean and scale to have equal ranks."));const j={x:Object(a.xAs4D)(f),scale:h,offset:b,mean:p,variance:m},g={varianceEpsilon:c},w=s.ENGINE.runKernel(o.FusedBatchNorm,j,g);return Object(d.reshape)(w,f.shape)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm2d.js": +/*!********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm2d.js ***! + \********************************************************************/ +/*! exports provided: batchNorm2d */function(e,t,n){"use strict";n.r(t),n.d(t,"batchNorm2d",(function(){return a}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./batchnorm */"./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({batchNorm2d_:function(e,t,n,i,a,u){const d=Object(s.convertToTensor)(e,"x","batchNorm"),l=Object(s.convertToTensor)(t,"mean","batchNorm"),c=Object(s.convertToTensor)(n,"variance","batchNorm");let f,p;return null!=a&&(f=Object(s.convertToTensor)(a,"scale","batchNorm")),null!=i&&(p=Object(s.convertToTensor)(i,"offset","batchNorm")),o.assert(2===d.rank,(()=>`Error in batchNorm2D: x must be rank 2 but got rank ${d.rank}.`)),o.assert(2===l.rank||1===l.rank,(()=>`Error in batchNorm2D: mean must be rank 2 or rank 1 but got rank ${l.rank}.`)),o.assert(2===c.rank||1===c.rank,(()=>`Error in batchNorm2D: variance must be rank 2 or rank 1 but got rank ${c.rank}.`)),null!=f&&o.assert(2===f.rank||1===f.rank,(()=>`Error in batchNorm2D: scale must be rank 2 or rank 1 but got rank ${f.rank}.`)),null!=p&&o.assert(2===p.rank||1===p.rank,(()=>`Error in batchNorm2D: offset must be rank 2 or rank 1 but got rank ${p.rank}.`)),Object(r.batchNorm)(d,l,c,p,f,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm3d.js": +/*!********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm3d.js ***! + \********************************************************************/ +/*! exports provided: batchNorm3d */function(e,t,n){"use strict";n.r(t),n.d(t,"batchNorm3d",(function(){return a}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./batchnorm */"./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({batchNorm3d_:function(e,t,n,i,a,u){const d=Object(s.convertToTensor)(e,"x","batchNorm"),l=Object(s.convertToTensor)(t,"mean","batchNorm"),c=Object(s.convertToTensor)(n,"variance","batchNorm");let f,p;return null!=a&&(f=Object(s.convertToTensor)(a,"scale","batchNorm")),null!=i&&(p=Object(s.convertToTensor)(i,"offset","batchNorm")),o.assert(3===d.rank,(()=>`Error in batchNorm3D: x must be rank 3 but got rank ${d.rank}.`)),o.assert(3===l.rank||1===l.rank,(()=>`Error in batchNorm3D: mean must be rank 3 or rank 1 but got rank ${l.rank}.`)),o.assert(3===c.rank||1===c.rank,(()=>`Error in batchNorm3D: variance must be rank 3 or rank 1 but got rank ${c.rank}.`)),null!=f&&o.assert(3===f.rank||1===f.rank,(()=>`Error in batchNorm3D: scale must be rank 3 or rank 1 but got rank ${f.rank}.`)),null!=p&&o.assert(3===p.rank||1===p.rank,(()=>`Error in batchNorm3D: offset must be rank 3 or rank 1 but got rank ${p.rank}.`)),Object(r.batchNorm)(d,l,c,p,f,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm4d.js": +/*!********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm4d.js ***! + \********************************************************************/ +/*! exports provided: batchNorm4d */function(e,t,n){"use strict";n.r(t),n.d(t,"batchNorm4d",(function(){return a}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./batchnorm */"./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({batchNorm4d_:function(e,t,n,i,a,u){const d=Object(s.convertToTensor)(e,"x","batchNorm"),l=Object(s.convertToTensor)(t,"mean","batchNorm"),c=Object(s.convertToTensor)(n,"variance","batchNorm");let f,p;return null!=a&&(f=Object(s.convertToTensor)(a,"scale","batchNorm")),null!=i&&(p=Object(s.convertToTensor)(i,"offset","batchNorm")),o.assert(4===d.rank,(()=>`Error in batchNorm4D: x must be rank 4 but got rank ${d.rank}.`)),o.assert(4===l.rank||1===l.rank,(()=>`Error in batchNorm4D: mean must be rank 4 or rank 1 but got rank ${l.rank}.`)),o.assert(4===c.rank||1===c.rank,(()=>`Error in batchNorm4D: variance must be rank 4 or rank 1 but got rank ${c.rank}.`)),null!=f&&o.assert(4===f.rank||1===f.rank,(()=>`Error in batchNorm4D: scale must be rank 4 or rank 1 but got rank ${f.rank}.`)),null!=p&&o.assert(4===p.rank||1===p.rank,(()=>`Error in batchNorm4D: offset must be rank 4 or rank 1 but got rank ${p.rank}.`)),Object(r.batchNorm)(d,l,c,p,f,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm_util.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm_util.js ***! + \***********************************************************************/ +/*! exports provided: xAs4D */function(e,t,n){"use strict";n.r(t),n.d(t,"xAs4D",(function(){return o}));var s=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");function o(e){let t;return t=0===e.rank||1===e.rank?Object(s.reshape)(e,[1,1,1,e.size]):2===e.rank?Object(s.reshape)(e,[1,1,e.shape[0],e.shape[1]]):3===e.rank?Object(s.reshape)(e,[1,e.shape[0],e.shape[1],e.shape[2]]):e,t}},"./node_modules/@tensorflow/tfjs-core/dist/ops/bincount.js": +/*!*****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/bincount.js ***! + \*****************************************************************/ +/*! exports provided: bincount */function(e,t,n){"use strict";n.r(t),n.d(t,"bincount",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(a.op)({bincount_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n){const a=Object(r.convertToTensor)(e,"x","bincount"),u=Object(r.convertToTensor)(t,"weights","bincount");i.assert("int32"===a.dtype,(()=>`Error in bincount: input dtype must be int32, but got ${a.dtype}`)),i.assert(n>=0,(()=>`size must be non-negative, but got ${n}.`)),i.assert(u.size===a.size||0===u.size,(()=>`Error in bincount: weights must have the same size as input or0-length, but got input shape: ${a.shape}, weights shape: ${u.shape}.`));const d={x:a,weights:u},l={size:n};return s.ENGINE.runKernel(o.Bincount,d,l)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/boolean_mask.js": +/*!*********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/boolean_mask.js ***! + \*********************************************************************/ +/*! exports provided: booleanMaskAsync */function(e,t,n){"use strict";n.r(t),n.d(t,"booleanMaskAsync",(function(){return d}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./gather */"./node_modules/@tensorflow/tfjs-core/dist/ops/gather.js"),i=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"),a=n(/*! ./squeeze */"./node_modules/@tensorflow/tfjs-core/dist/ops/squeeze.js"),u=n(/*! ./where_async */"./node_modules/@tensorflow/tfjs-core/dist/ops/where_async.js");const d= +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +async function(e,t,n){const d=Object(s.convertToTensor)(e,"tensor","boolMask"),l=Object(s.convertToTensor)(t,"mask","boolMask","bool"),c=null==n?0:n,f=l.rank,p=d.shape;o.assert(f>0,(()=>"mask cannot be scalar")),o.assertShapesMatch(p.slice(c,c+f),l.shape,"mask's shape must match the first K dimensions of tensor's shape,");let m=1;for(let e=c;e!(e>0)||e%1!=0)))throw new Error(`broadcastTo(): Invalid broadcast shape [${t}].`);if(t.lengthn.rank){const e=n.shape.slice();for(;e.length=0;e--)if(d[e]===t[e])l[e]=1;else if(1!==n.shape[e])throw new Error(`broadcastTo(): [${a}] cannot be broadcast to [${t}].`);if(0===l.map(((e,t)=>e>1?t:-1)).filter((e=>e>=0)).length)return Object(i.clone)(n);const c={x:n},f={reps:l};return s.ENGINE.runKernel(o.Tile,c,f)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js ***! + \***********************************************************************/ +/*! exports provided: getBroadcastDims, getReductionAxes, assertAndGetBroadcastShape */function(e,t,n){"use strict"; +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function s(e,t){const n=e.length,s=[];for(let o=0;o1&&1===i&&s.unshift(r)}return s}function o(e,t){const n=[];for(let s=0;s1)&&n.unshift(r)}return n}function r(e,t){const n=[],s=Math.max(e.length,t.length);for(let o=0;o4)throw new Error("Cannot construct Tensor with more than 4 channels from pixels.");if(null==e)throw new Error("pixels passed to tf.browser.fromPixels() can not be null");let n=!1,o=!1,a=!1,u=!1,d=!1,l=!1;if(e.data instanceof Uint8Array)n=!0;else if("undefined"!=typeof ImageData&&e instanceof ImageData)o=!0;else if("undefined"!=typeof HTMLVideoElement&&e instanceof HTMLVideoElement)a=!0;else if("undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement)u=!0;else if(null!=e.getContext)d=!0;else{if(!("undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap))throw new Error(`pixels passed to tf.browser.fromPixels() must be either an HTMLVideoElement, HTMLImageElement, HTMLCanvasElement, ImageData in browser, or OffscreenCanvas, ImageData in webworker or {data: Uint32Array, width: number, height: number}, but was ${e.constructor.name}`);l=!0}if(a){const t=2;if(a&&e.readyState element.")}if(null!=Object(i.getKernel)(r.FromPixels,s.ENGINE.backendName)){const n={pixels:e},o={numChannels:t};return s.ENGINE.runKernel(r.FromPixels,n,o)}const[p,m]=a?[e.videoWidth,e.videoHeight]:[e.width,e.height];let h,b;if(d?h=e.getContext("2d").getImageData(0,0,p,m).data:o||n?h=e.data:(u||a||l)&&(null==f&&(f=document.createElement("canvas").getContext("2d")),f.canvas.width=p,f.canvas.height=m,f.drawImage(e,0,0,p,m),h=f.getImageData(0,0,p,m).data),4===t)b=new Int32Array(h);else{const e=p*m;b=new Int32Array(e*t);for(let n=0;n4||2===r)throw new Error(`toPixels only supports depth of size 1, 3 or 4 but got ${r}`);if("float32"!==n.dtype&&"int32"!==n.dtype)throw new Error(`Unsupported type for toPixels: ${n.dtype}. Please use float32 or int32 tensors.`);const i=await n.data(),l="float32"===n.dtype?255:1,c=new Uint8ClampedArray(o*s*4);for(let e=0;e1)throw new Error(`Tensor values for a float32 Tensor must be in the range [0 - 1] but encountered ${o}.`)}else if("int32"===n.dtype&&(o<0||o>255))throw new Error(`Tensor values for a int32 Tensor must be in the range [0 - 255] but encountered ${o}.`);1===r?(t[0]=o*l,t[1]=o*l,t[2]=o*l):t[s]=o*l}const s=4*e;c[s+0]=Math.round(t[0]),c[s+1]=Math.round(t[1]),c[s+2]=Math.round(t[2]),c[s+3]=Math.round(t[3])}if(null!=t){t.width=o,t.height=s;const e=t.getContext("2d"),n=new ImageData(c,o,s);e.putImageData(n,0,0)}return n!==e&&n.dispose(),c}const j=Object(l.op)({fromPixels_:p})},"./node_modules/@tensorflow/tfjs-core/dist/ops/buffer.js": +/*!***************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/buffer.js ***! + \***************************************************************/ +/*! exports provided: buffer */function(e,t,n){"use strict";n.r(t),n.d(t,"buffer",(function(){return r}));var s=n(/*! ../tensor */"./node_modules/@tensorflow/tfjs-core/dist/tensor.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/** + * @license + * Copyright 2020 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e,t="float32",n){return t=t||"float32",o.assertNonNegativeIntegerDimensions(e),new s.TensorBuffer(e,t,n)}},"./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js": +/*!*************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js ***! + \*************************************************************/ +/*! exports provided: cast */function(e,t,n){"use strict";n.r(t),n.d(t,"cast",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(a.op)({cast_: +/** + * @license + * Copyright 2020 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t){const n=Object(r.convertToTensor)(e,"x","cast");if(!i.isValidDtype(t))throw new Error(`Failed to cast to unknown dtype ${t}`);if("string"===t&&"string"!==n.dtype||"string"!==t&&"string"===n.dtype)throw new Error("Only strings can be casted to strings");const a={x:n},u={dtype:t};return s.ENGINE.runKernel(o.Cast,a,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/ceil.js": +/*!*************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/ceil.js ***! + \*************************************************************/ +/*! exports provided: ceil */function(e,t,n){"use strict";n.r(t),n.d(t,"ceil",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({ceil_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){const t={x:Object(r.convertToTensor)(e,"x","ceil")};return s.ENGINE.runKernel(o.Ceil,t)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/clip_by_value.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/clip_by_value.js ***! + \**********************************************************************/ +/*! exports provided: clipByValue */function(e,t,n){"use strict";n.r(t),n.d(t,"clipByValue",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(a.op)({clipByValue_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n){const a=Object(r.convertToTensor)(e,"x","clipByValue");i.assert(t<=n,(()=>`Error in clip: min (${t}) must be less than or equal to max (${n}).`));const u={x:a},d={clipValueMin:t,clipValueMax:n};return s.ENGINE.runKernel(o.ClipByValue,u,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/clone.js": +/*!**************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/clone.js ***! + \**************************************************************/ +/*! exports provided: clone */function(e,t,n){"use strict";n.r(t),n.d(t,"clone",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({clone_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){const t={x:Object(r.convertToTensor)(e,"x","clone","string_or_numeric")};return s.ENGINE.runKernel(o.Identity,t)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/complex.js": +/*!****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/complex.js ***! + \****************************************************************/ +/*! exports provided: complex */function(e,t,n){"use strict";n.r(t),n.d(t,"complex",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(a.op)({complex_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t){const n=Object(r.convertToTensor)(e,"real","complex"),a=Object(r.convertToTensor)(t,"imag","complex");i.assertShapesMatch(n.shape,a.shape,`real and imag shapes, ${n.shape} and ${a.shape}, must match in call to tf.complex().`);const u={real:n,imag:a};return s.ENGINE.runKernel(o.Complex,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/concat.js": +/*!***************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/concat.js ***! + \***************************************************************/ +/*! exports provided: concat */function(e,t,n){"use strict";n.r(t),n.d(t,"concat",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./clone */"./node_modules/@tensorflow/tfjs-core/dist/ops/clone.js"),u=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(u.op)({concat_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t=0){Object(i.assert)(e.length>=1,(()=>"Pass at least one tensor to concat"));const n=Object(r.convertToTensorArray)(e,"tensors","concat","string_or_numeric");if("complex64"===n[0].dtype&&n.forEach((e=>{if("complex64"!==e.dtype)throw new Error(`Cannot concatenate complex64 tensors with a tensor\n with dtype ${e.dtype}. `)})),1===n.length)return Object(a.clone)(n[0]);const u=n,d={axis:t};return s.ENGINE.runKernel(o.Concat,u,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/concat_1d.js": +/*!******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/concat_1d.js ***! + \******************************************************************/ +/*! exports provided: concat1d */function(e,t,n){"use strict";n.r(t),n.d(t,"concat1d",(function(){return r}));var s=n(/*! ./concat */"./node_modules/@tensorflow/tfjs-core/dist/ops/concat.js"),o=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const r=Object(o.op)({concat1d_:function(e){return Object(s.concat)(e,0)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/concat_2d.js": +/*!******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/concat_2d.js ***! + \******************************************************************/ +/*! exports provided: concat2d */function(e,t,n){"use strict";n.r(t),n.d(t,"concat2d",(function(){return r}));var s=n(/*! ./concat */"./node_modules/@tensorflow/tfjs-core/dist/ops/concat.js"),o=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const r=Object(o.op)({concat2d_:function(e,t){return Object(s.concat)(e,t)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/concat_3d.js": +/*!******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/concat_3d.js ***! + \******************************************************************/ +/*! exports provided: concat3d */function(e,t,n){"use strict";n.r(t),n.d(t,"concat3d",(function(){return r}));var s=n(/*! ./concat */"./node_modules/@tensorflow/tfjs-core/dist/ops/concat.js"),o=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const r=Object(o.op)({concat3d_:function(e,t){return Object(s.concat)(e,t)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/concat_4d.js": +/*!******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/concat_4d.js ***! + \******************************************************************/ +/*! exports provided: concat4d */function(e,t,n){"use strict";n.r(t),n.d(t,"concat4d",(function(){return r}));var s=n(/*! ./concat */"./node_modules/@tensorflow/tfjs-core/dist/ops/concat.js"),o=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const r=Object(o.op)({concat4d_:function(e,t){return Object(s.concat)(e,t)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/concat_util.js": +/*!********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/concat_util.js ***! + \********************************************************************/ +/*! exports provided: assertParamsConsistent, computeOutShape */function(e,t,n){"use strict";n.r(t),n.d(t,"assertParamsConsistent",(function(){return o})),n.d(t,"computeOutShape",(function(){return r}));var s=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */function o(e,t){const n=e[0].length;e.forEach(((e,t)=>{s.assert(e.length===n,(()=>`Error in concat${n}D: rank of tensors[${t}] must be the same as the rank of the rest (${n})`))})),s.assert(t>=0&&t`Error in concat${n}D: axis must be between 0 and ${n-1}.`));const o=e[0];e.forEach(((e,r)=>{for(let i=0;i`Error in concat${n}D: Shape of tensors[${r}] (${e}) does not match the shape of the rest (${o}) along the non-concatenated axis ${r}.`))}))}function r(e,t){const n=e[0].slice();for(let s=1;s0&&Number.isInteger(n),(()=>`If provided, numClasses must be a positive integer, but got ${n}`)),o.assert(1===u.rank,(()=>`Expected the rank of labels to be 1, but got ${u.rank}`)),o.assert(1===l.rank,(()=>`Expected the rank of predictions to be 1, but got ${l.rank}`)),o.assert(u.shape[0]===l.shape[0],(()=>`Mismatch in the number of examples: ${u.shape[0]} vs. ${l.shape[0]}. Labels and predictions should have the same number of elements.`)),o.assert(n>0&&Number.isInteger(n),(()=>`numClasses is required to be a positive integer, but got ${n}`));const c=Object(a.oneHot)(Object(r.cast)(u,"int32"),n),f=Object(a.oneHot)(Object(r.cast)(l,"int32"),n),p=Object(d.transpose)(c),m=Object(i.matMul)(p,f);return Object(r.cast)(m,"int32")}const c=Object(u.op)({confusionMatrix_:l})},"./node_modules/@tensorflow/tfjs-core/dist/ops/conv1d.js": +/*!***************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/conv1d.js ***! + \***************************************************************/ +/*! exports provided: conv1d */function(e,t,n){"use strict";n.r(t),n.d(t,"conv1d",(function(){return d}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./conv2d */"./node_modules/@tensorflow/tfjs-core/dist/ops/conv2d.js"),i=n(/*! ./conv_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/conv_util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),u=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const d=Object(a.op)({conv1d_:function(e,t,n,a,d="NWC",l=1,c){const f=Object(s.convertToTensor)(e,"x","conv1d"),p=Object(s.convertToTensor)(t,"filter","conv1d");let m=f,h=!1;2===f.rank&&(h=!0,m=Object(u.reshape)(f,[1,f.shape[0],f.shape[1]])),o.assert(3===m.rank,(()=>`Error in conv1d: input must be rank 3, but got rank ${m.rank}.`)),o.assert(3===p.rank,(()=>`Error in conv1d: filter must be rank 3, but got rank ${p.rank}.`)),null!=c&&o.assert(o.isInt(a),(()=>`Error in conv1d: pad must be an integer when using, dimRoundingMode ${c} but got pad ${a}.`)),o.assert(m.shape[2]===p.shape[1],(()=>`Error in conv1d: depth of input (${m.shape[2]}) must match input depth for filter ${p.shape[1]}.`)),o.assert(i.eitherStridesOrDilationsAreOne(n,l),(()=>`Error in conv1D: Either stride or dilation must be 1. Got stride ${n} and dilation '${l}'`)),o.assert("NWC"===d,(()=>`Error in conv1d: got dataFormat of ${d} but only NWC is currently supported.`));const b=Object(u.reshape)(p,[1,p.shape[0],p.shape[1],p.shape[2]]),j=Object(u.reshape)(m,[m.shape[0],1,m.shape[1],m.shape[2]]),g=[1,n],w=[1,l],_=Object(r.conv2d)(j,b,g,a,"NHWC",w,c);return h?Object(u.reshape)(_,[_.shape[2],_.shape[3]]):Object(u.reshape)(_,[_.shape[0],_.shape[2],_.shape[3]])}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/conv2d.js": +/*!***************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/conv2d.js ***! + \***************************************************************/ +/*! exports provided: conv2d */function(e,t,n){"use strict";n.r(t),n.d(t,"conv2d",(function(){return l}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./conv_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/conv_util.js"),u=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),d=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const l=Object(u.op)({conv2d_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n,u,l="NHWC",c=[1,1],f){const p=Object(r.convertToTensor)(e,"x","conv2d"),m=Object(r.convertToTensor)(t,"filter","conv2d");let h=p,b=!1;3===p.rank&&(b=!0,h=Object(d.reshape)(p,[1,p.shape[0],p.shape[1],p.shape[2]])),i.assert(4===h.rank,(()=>`Error in conv2d: input must be rank 4, but got rank ${h.rank}.`)),i.assert(4===m.rank,(()=>`Error in conv2d: filter must be rank 4, but got rank ${m.rank}.`)),null!=f&&i.assert(i.isInt(u),(()=>`Error in conv2d: pad must be an integer when using, dimRoundingMode ${f} but got pad ${u}.`));const j="NHWC"===l?h.shape[3]:h.shape[1];i.assert(j===m.shape[2],(()=>`Error in conv2d: depth of input (${j}) must match input depth for filter ${m.shape[2]}.`)),i.assert(a.eitherStridesOrDilationsAreOne(n,c),(()=>`Error in conv2D: Either strides or dilations must be 1. Got strides ${n} and dilations '${c}'`));const g={x:h,filter:m},w={strides:n,pad:u,dataFormat:l,dilations:c,dimRoundingMode:f},_=s.ENGINE.runKernel(o.Conv2D,g,w);return b?Object(d.reshape)(_,[_.shape[1],_.shape[2],_.shape[3]]):_}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/conv2d_backprop_filter.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/conv2d_backprop_filter.js ***! + \*******************************************************************************/ +/*! exports provided: conv2DBackpropFilter */function(e,t,n){"use strict";n.r(t),n.d(t,"conv2DBackpropFilter",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),a=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const u=Object(i.op)({conv2DBackpropFilter_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n,i,u,d="NHWC",l){let c=e;3===e.rank&&(c=Object(a.reshape)(e,[1,e.shape[0],e.shape[1],e.shape[2]]));let f=t;3===f.rank&&(f=Object(a.reshape)(t,[1,t.shape[0],t.shape[1],t.shape[2]])),r.assert(4===c.rank,(()=>`Error in conv2dDerFilter: input must be rank 4, but got shape ${c.shape}.`)),r.assert(4===f.rank,(()=>`Error in conv2dDerFilter: dy must be rank 4, but got shape ${f.shape}.`)),r.assert(4===n.length,(()=>`Error in conv2dDerFilter: filterShape must be length 4, but got ${n}.`));const p="NHWC"===d?c.shape[3]:c.shape[1],m="NHWC"===d?f.shape[3]:f.shape[1];r.assert(p===n[2],(()=>`Error in conv2dDerFilter: depth of input ${p}) must match input depth in filter (${n[2]}.`)),r.assert(m===n[3],(()=>`Error in conv2dDerFilter: depth of dy (${m}) must match output depth for filter (${n[3]}).`)),null!=l&&r.assert(r.isInt(u),(()=>`Error in conv2dDerFilter: pad must be an integer when using, dimRoundingMode ${l} but got pad ${u}.`));const h={x:c,dy:f},b={strides:i,pad:u,dataFormat:d,dimRoundingMode:l,filterShape:n};return s.ENGINE.runKernel(o.Conv2DBackpropFilter,h,b)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/conv2d_backprop_input.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/conv2d_backprop_input.js ***! + \******************************************************************************/ +/*! exports provided: conv2DBackpropInput */function(e,t,n){"use strict";n.r(t),n.d(t,"conv2DBackpropInput",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),a=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const u=Object(i.op)({conv2DBackpropInput_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n,i,u,d="NHWC",l){r.assert(e.length===t.rank,(()=>`Length of inShape (${e.length}) and rank of dy (${t.rank}) must match`));let c=e,f=t,p=!1;3===t.rank&&(p=!0,f=Object(a.reshape)(t,[1,t.shape[0],t.shape[1],t.shape[2]]),c=[1,e[0],e[1],e[2]]),r.assert(4===c.length,(()=>`Error in conv2dDerInput: inShape must be length 4, but got length ${c.length}.`)),r.assert(4===f.rank,(()=>`Error in conv2dDerInput: dy must be rank 4, but got rank ${f.rank}`)),r.assert(4===n.rank,(()=>`Error in conv2dDerInput: filter must be rank 4, but got rank ${n.rank}`));const m="NHWC"===d?c[3]:c[1],h="NHWC"===d?f.shape[3]:f.shape[1];r.assert(m===n.shape[2],(()=>`Error in conv2dDerInput: depth of input (${m}) must match input depth for filter ${n.shape[2]}.`)),r.assert(h===n.shape[3],(()=>`Error in conv2dDerInput: depth of output (${h}) must match output depth for filter ${n.shape[3]}.`)),null!=l&&r.assert(r.isInt(u),(()=>`Error in conv2dDerInput: pad must be an integer when using, dimRoundingMode ${l} but got pad ${u}.`));const b={dy:f,filter:n},j={strides:i,pad:u,dataFormat:d,dimRoundingMode:l,inputShape:c},g=s.ENGINE.runKernel(o.Conv2DBackpropInput,b,j);return p?Object(a.reshape)(g,[g.shape[1],g.shape[2],g.shape[3]]):g}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/conv2d_transpose.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/conv2d_transpose.js ***! + \*************************************************************************/ +/*! exports provided: conv2dTranspose */function(e,t,n){"use strict";n.r(t),n.d(t,"conv2dTranspose",(function(){return i}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ./conv2d_backprop_input */"./node_modules/@tensorflow/tfjs-core/dist/ops/conv2d_backprop_input.js"),r=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const i=Object(r.op)({conv2dTranspose_:function(e,t,n,r,i,a){const u=Object(s.convertToTensor)(e,"x","conv2dTranspose"),d=Object(s.convertToTensor)(t,"filter","conv2dTranspose");return Object(o.conv2DBackpropInput)(n,u,d,r,i,"NHWC",a)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/conv3d.js": +/*!***************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/conv3d.js ***! + \***************************************************************/ +/*! exports provided: conv3d */function(e,t,n){"use strict";n.r(t),n.d(t,"conv3d",(function(){return l}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./conv_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/conv_util.js"),u=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),d=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const l=Object(u.op)({conv3d_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n,u,l="NDHWC",c=[1,1,1]){const f=Object(r.convertToTensor)(e,"x","conv3d"),p=Object(r.convertToTensor)(t,"filter","conv3d");let m=f,h=!1;4===f.rank&&(h=!0,m=Object(d.reshape)(f,[1,f.shape[0],f.shape[1],f.shape[2],f.shape[3]])),i.assert(5===m.rank,(()=>`Error in conv3d: input must be rank 5, but got rank ${m.rank}.`)),i.assert(5===p.rank,(()=>`Error in conv3d: filter must be rank 5, but got rank ${p.rank}.`)),i.assert(m.shape[4]===p.shape[3],(()=>`Error in conv3d: depth of input (${m.shape[4]}) must match input depth for filter ${p.shape[3]}.`)),i.assert(Object(a.eitherStridesOrDilationsAreOne)(n,c),(()=>`Error in conv3D: Either strides or dilations must be 1. Got strides ${n} and dilations '${c}'`)),i.assert("NDHWC"===l,(()=>`Error in conv3d: got dataFormat of ${l} but only NDHWC is currently supported.`));const b={x:m,filter:p},j={strides:n,pad:u,dataFormat:l,dilations:c},g=s.ENGINE.runKernel(o.Conv3D,b,j);return h?Object(d.reshape)(g,[g.shape[1],g.shape[2],g.shape[3],g.shape[4]]):g}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/conv3d_backprop_input.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/conv3d_backprop_input.js ***! + \******************************************************************************/ +/*! exports provided: conv3DBackpropInput */function(e,t,n){"use strict";n.r(t),n.d(t,"conv3DBackpropInput",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),a=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const u=Object(i.op)({conv3DBackpropInput_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n,i,u){r.assert(e.length===t.rank,(()=>`Length of inShape (${e.length}) and rank of dy (${t.rank}) must match`));let d=e,l=t,c=!1;4===t.rank&&(c=!0,l=Object(a.reshape)(t,[1,t.shape[0],t.shape[1],t.shape[2],t.shape[3]]),d=[1,e[0],e[1],e[2],e[3]]);const f=d[4],p=l.shape[4];r.assert(5===d.length,(()=>`Error in conv3dDerInput: inShape must be length 5, but got length ${d.length}.`)),r.assert(5===l.rank,(()=>`Error in conv3dDerInput: dy must be rank 5, but got rank ${l.rank}`)),r.assert(5===n.rank,(()=>`Error in conv3dDerInput: filter must be rank 5, but got rank ${n.rank}`)),r.assert(f===n.shape[3],(()=>`Error in conv3dDerInput: depth of input (${f}) must match input depth for filter ${n.shape[3]}.`)),r.assert(p===n.shape[4],(()=>`Error in conv3dDerInput: depth of output (${p}) must match output depth for filter ${n.shape[4]}.`));const m={dy:l,filter:n},h={pad:u,strides:i,inputShape:d},b=s.ENGINE.runKernel(o.Conv3DBackpropInputV2,m,h);return c?Object(a.reshape)(b,[b.shape[1],b.shape[2],b.shape[3],b.shape[4]]):b}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/conv3d_transpose.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/conv3d_transpose.js ***! + \*************************************************************************/ +/*! exports provided: conv3dTranspose */function(e,t,n){"use strict";n.r(t),n.d(t,"conv3dTranspose",(function(){return i}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ./conv3d_backprop_input */"./node_modules/@tensorflow/tfjs-core/dist/ops/conv3d_backprop_input.js"),r=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const i=Object(r.op)({conv3dTranspose_:function(e,t,n,r,i){const a=Object(s.convertToTensor)(e,"x","conv3dTranspose"),u=Object(s.convertToTensor)(t,"filter","conv3dTranspose");return Object(o.conv3DBackpropInput)(n,a,u,r,i)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/conv_util.js": +/*!******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/conv_util.js ***! + \******************************************************************/ +/*! exports provided: computeDilation2DInfo, computePool2DInfo, computePool3DInfo, computeConv2DInfo, computeConv3DInfo, computeDefaultPad, tupleValuesAreOne, eitherStridesOrDilationsAreOne, convertConv2DDataFormat */function(e,t,n){"use strict"; +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function s(e,t,n,s,o="NHWC",r){return i(e,[...t,e[3]],n,r,s,null,null,h(o))}function o(e,t,n,s,o,r,a="channelsLast"){const[u,l]=d(t);let c;if("channelsLast"===a)c=[u,l,e[3],e[3]];else{if("channelsFirst"!==a)throw new Error(`Unknown dataFormat ${a}`);c=[u,l,e[1],e[1]]}return i(e,c,n,s,o,r,!1,a)}function r(e,t,n,s,o,r,i="NDHWC"){const[u,d,c]=l(t);let f,p;if("NDHWC"===i)p="channelsLast",f=[u,d,c,e[4],e[4]];else{if("NCDHW"!==i)throw new Error(`Unknown dataFormat ${i}`);p="channelsFirst",f=[u,d,c,e[1],e[1]]}return a(e,f,n,s,o,!1,p,r)}function i(e,t,n,s,o,r,i=!1,a="channelsLast"){let[l,p,m,h]=[-1,-1,-1,-1];if("channelsLast"===a)[l,p,m,h]=e;else{if("channelsFirst"!==a)throw new Error(`Unknown dataFormat ${a}`);[l,h,p,m]=e}const[b,j,,g]=t,[w,_]=d(n),[k,v]=d(s),x=c(b,k),y=c(j,v),{padInfo:O,outHeight:I,outWidth:C}=function(e,t,n,s,o,r,i,a,d){let l,c,p;if("number"==typeof e){l={top:e,bottom:e,left:e,right:e,type:0===e?"VALID":"NUMBER"};const o=function(e,t,n,s,o){null==s&&(s=u(e,t,n));const r=e[0],i=e[1],a=f((r-t+2*s)/n+1,o),d=f((i-t+2*s)/n+1,o);return[a,d]}([t,n],r,s,e,a);c=o[0],p=o[1]}else if("same"===e){c=Math.ceil(t/s),p=Math.ceil(n/o);const e=Math.max(0,(c-1)*s+r-t),a=Math.max(0,(p-1)*o+i-n),u=Math.floor(e/2),d=e-u,f=Math.floor(a/2);l={top:u,bottom:d,left:f,right:a-f,type:"SAME"}}else if("valid"===e)l={top:0,bottom:0,left:0,right:0,type:"VALID"},c=Math.ceil((t-r+1)/s),p=Math.ceil((n-i+1)/o);else{if("object"!=typeof e)throw Error(`Unknown padding parameter: ${e}`);{const u="channelsLast"===d?e[1][0]:e[2][0],m="channelsLast"===d?e[1][1]:e[2][1],h="channelsLast"===d?e[2][0]:e[3][0],b="channelsLast"===d?e[2][1]:e[3][1];l={top:u,bottom:m,left:h,right:b,type:0===u&&0===m&&0===h&&0===b?"VALID":"EXPLICIT"},c=f((t-r+u+m)/s+1,a),p=f((n-i+h+b)/o+1,a)}}return{padInfo:l,outHeight:c,outWidth:p}}(o,p,m,w,_,x,y,r,a),S=i?g*h:g;let T;return"channelsFirst"===a?T=[l,S,I,C]:"channelsLast"===a&&(T=[l,I,C,S]),{batchSize:l,dataFormat:a,inHeight:p,inWidth:m,inChannels:h,outHeight:I,outWidth:C,outChannels:S,padInfo:O,strideHeight:w,strideWidth:_,filterHeight:b,filterWidth:j,effectiveFilterHeight:x,effectiveFilterWidth:y,dilationHeight:k,dilationWidth:v,inShape:e,outShape:T,filterShape:t}}function a(e,t,n,s,o,r=!1,i="channelsLast",a){let[d,p,m,h,b]=[-1,-1,-1,-1,-1];if("channelsLast"===i)[d,p,m,h,b]=e;else{if("channelsFirst"!==i)throw new Error(`Unknown dataFormat ${i}`);[d,b,p,m,h]=e}const[j,g,w,,_]=t,[k,v,x]=l(n),[y,O,I]=l(s),C=c(j,y),S=c(g,O),T=c(w,I),{padInfo:N,outDepth:E,outHeight:A,outWidth:R}=function(e,t,n,s,o,r,i,a,d,l,c){let p,m,h,b;if("number"==typeof e){p={top:e,bottom:e,left:e,right:e,front:e,back:e,type:0===e?"VALID":"NUMBER"};const r=function(e,t,n,s,o,r){null==o&&(o=u(e,t,s));const i=e[0],a=e[1],d=e[2],l=f((i-t+2*o)/s+1,r),c=f((a-t+2*o)/s+1,r),p=f((d-t+2*o)/s+1,r);return[l,c,p,n]}([t,n,s,1],a,1,o,e,c);m=r[0],h=r[1],b=r[2]}else if("same"===e){m=Math.ceil(t/o),h=Math.ceil(n/r),b=Math.ceil(s/i);const e=(m-1)*o+a-t,u=(h-1)*r+d-n,c=(b-1)*i+l-s,f=Math.floor(e/2),j=e-f,g=Math.floor(u/2),w=u-g,_=Math.floor(c/2);p={top:g,bottom:w,left:_,right:c-_,front:f,back:j,type:"SAME"}}else{if("valid"!==e)throw Error(`Unknown padding parameter: ${e}`);p={top:0,bottom:0,left:0,right:0,front:0,back:0,type:"VALID"},m=Math.ceil((t-a+1)/o),h=Math.ceil((n-d+1)/r),b=Math.ceil((s-l+1)/i)}return{padInfo:p,outDepth:m,outHeight:h,outWidth:b}}(o,p,m,h,k,v,x,C,S,T,a),F=r?_*b:_;let M;return"channelsFirst"===i?M=[d,F,E,A,R]:"channelsLast"===i&&(M=[d,E,A,R,F]),{batchSize:d,dataFormat:i,inDepth:p,inHeight:m,inWidth:h,inChannels:b,outDepth:E,outHeight:A,outWidth:R,outChannels:F,padInfo:N,strideDepth:k,strideHeight:v,strideWidth:x,filterDepth:j,filterHeight:g,filterWidth:w,effectiveFilterDepth:C,effectiveFilterHeight:S,effectiveFilterWidth:T,dilationDepth:y,dilationHeight:O,dilationWidth:I,inShape:e,outShape:M,filterShape:t}}function u(e,t,n,s=1){const o=c(t,s);return Math.floor((e[0]*(n-1)-n+o)/2)}function d(e){return"number"==typeof e?[e,e,e]:2===e.length?[e[0],e[1],1]:e}function l(e){return"number"==typeof e?[e,e,e]:e}function c(e,t){return t<=1?e:e+(e-1)*(t-1)}function f(e,t){if(!t)return Math.trunc(e);switch(t){case"round":return Math.round(e);case"ceil":return Math.ceil(e);case"floor":return Math.floor(e);default:throw new Error(`Unknown roundingMode ${t}`)}}function p(e){const[t,n,s]=d(e);return 1===t&&1===n&&1===s}function m(e,t){return p(e)||p(t)}function h(e){if("NHWC"===e)return"channelsLast";if("NCHW"===e)return"channelsFirst";throw new Error(`Unknown dataFormat ${e}`)}n.r(t),n.d(t,"computeDilation2DInfo",(function(){return s})),n.d(t,"computePool2DInfo",(function(){return o})),n.d(t,"computePool3DInfo",(function(){return r})),n.d(t,"computeConv2DInfo",(function(){return i})),n.d(t,"computeConv3DInfo",(function(){return a})),n.d(t,"computeDefaultPad",(function(){return u})),n.d(t,"tupleValuesAreOne",(function(){return p})),n.d(t,"eitherStridesOrDilationsAreOne",(function(){return m})),n.d(t,"convertConv2DDataFormat",(function(){return h}))},"./node_modules/@tensorflow/tfjs-core/dist/ops/cos.js": +/*!************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/cos.js ***! + \************************************************************/ +/*! exports provided: cos */function(e,t,n){"use strict";n.r(t),n.d(t,"cos",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({cos_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){const t={x:Object(r.convertToTensor)(e,"x","cos")};return s.ENGINE.runKernel(o.Cos,t)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/cosh.js": +/*!*************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/cosh.js ***! + \*************************************************************/ +/*! exports provided: cosh */function(e,t,n){"use strict";n.r(t),n.d(t,"cosh",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({cosh_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){const t={x:Object(r.convertToTensor)(e,"x","cosh")};return s.ENGINE.runKernel(o.Cosh,t)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/cumsum.js": +/*!***************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/cumsum.js ***! + \***************************************************************/ +/*! exports provided: cumsum */function(e,t,n){"use strict";n.r(t),n.d(t,"cumsum",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({cumsum_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t=0,n=!1,i=!1){const a={x:Object(r.convertToTensor)(e,"x","cumsum")},u={axis:t,exclusive:n,reverse:i};return s.ENGINE.runKernel(o.Cumsum,a,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/dense_bincount.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/dense_bincount.js ***! + \***********************************************************************/ +/*! exports provided: denseBincount */function(e,t,n){"use strict";n.r(t),n.d(t,"denseBincount",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(a.op)({denseBincount_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n,a=!1){const u=Object(r.convertToTensor)(e,"x","denseBincount"),d=Object(r.convertToTensor)(t,"weights","denseBincount");i.assert("int32"===u.dtype,(()=>`Error in denseBincount: input dtype must be int32, but got ${u.dtype}`)),i.assert(u.rank<=2,(()=>`Error in denseBincount: input must be at most rank 2, but got rank ${u.rank}.`)),i.assert(n>=0,(()=>`size must be non-negative, but got ${n}.`)),i.assert(d.size===u.size||0===d.size,(()=>`Error in denseBincount: weights must have the same shape as x or 0-length, but got x shape: ${u.shape}, weights shape: ${d.shape}.`));const l={x:u,weights:d},c={size:n,binaryOutput:a};return s.ENGINE.runKernel(o.DenseBincount,l,c)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/depth_to_space.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/depth_to_space.js ***! + \***********************************************************************/ +/*! exports provided: depthToSpace */function(e,t,n){"use strict";n.r(t),n.d(t,"depthToSpace",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(a.op)({depthToSpace_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n="NHWC"){const a=Object(r.convertToTensor)(e,"x","depthToSpace"),u="NHWC"===n?a.shape[1]:a.shape[2],d="NHWC"===n?a.shape[2]:a.shape[3],l="NHWC"===n?a.shape[3]:a.shape[1];i.assert(u*t>=0,(()=>`Negative dimension size caused by overflow when multiplying\n ${u} and ${t} for depthToSpace with input shape\n ${a.shape}`)),i.assert(d*t>=0,(()=>`Negative dimension size caused by overflow when multiplying\n ${d} and ${t} for depthToSpace with input shape\n ${a.shape}`)),i.assert(l%(t*t)==0,(()=>`Dimension size must be evenly divisible by ${t*t} but is ${l} for depthToSpace with input shape ${a.shape}`));const c={x:a},f={blockSize:t,dataFormat:n};return s.ENGINE.runKernel(o.DepthToSpace,c,f)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/depthwise_conv2d.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/depthwise_conv2d.js ***! + \*************************************************************************/ +/*! exports provided: depthwiseConv2d */function(e,t,n){"use strict";n.r(t),n.d(t,"depthwiseConv2d",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),u=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const d=Object(a.op)({depthwiseConv2d_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n,a,d="NHWC",l=[1,1],c){const f=Object(r.convertToTensor)(e,"x","depthwiseConv2d"),p=Object(r.convertToTensor)(t,"filter","depthwiseConv2d");let m=f,h=!1;3===f.rank&&(h=!0,m=Object(u.reshape)(f,[1,f.shape[0],f.shape[1],f.shape[2]])),i.assert(4===m.rank,(()=>`Error in depthwiseConv2d: input must be rank 4, but got rank ${m.rank}.`)),i.assert(4===p.rank,(()=>`Error in depthwiseConv2d: filter must be rank 4, but got rank ${p.rank}.`)),i.assert(m.shape[3]===p.shape[2],(()=>`Error in depthwiseConv2d: number of input channels (${m.shape[3]}) must match the inChannels dimension in filter ${p.shape[2]}.`)),null!=c&&i.assert(i.isInt(a),(()=>`Error in depthwiseConv2d: pad must be an integer when using, dimRoundingMode ${c} but got pad ${a}.`));const b={x:m,filter:p},j={strides:n,pad:a,dataFormat:d,dilations:l,dimRoundingMode:c},g=s.ENGINE.runKernel(o.DepthwiseConv2dNative,b,j);return h?Object(u.reshape)(g,[g.shape[1],g.shape[2],g.shape[3]]):g}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/depthwise_conv2d_native_backprop_filter.js": +/*!************************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/depthwise_conv2d_native_backprop_filter.js ***! + \************************************************************************************************/ +/*! exports provided: depthwiseConv2dNativeBackpropFilter */function(e,t,n){"use strict";n.r(t),n.d(t,"depthwiseConv2dNativeBackpropFilter",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),i=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const a=Object(r.op)({depthwiseConv2dNativeBackpropFilter_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n,r,a,u=[1,1],d){let l=e;3===e.rank&&(l=Object(i.reshape)(e,[1,e.shape[0],e.shape[1],e.shape[2]]));let c=t;3===c.rank&&(c=Object(i.reshape)(t,[1,t.shape[0],t.shape[1],t.shape[2]]));const f={x:l,dy:c},p={strides:r,pad:a,dimRoundingMode:d,dilations:u,filterShape:n};return s.ENGINE.runKernel(o.DepthwiseConv2dNativeBackpropFilter,f,p)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/depthwise_conv2d_native_backprop_input.js": +/*!***********************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/depthwise_conv2d_native_backprop_input.js ***! + \***********************************************************************************************/ +/*! exports provided: depthwiseConv2dNativeBackpropInput */function(e,t,n){"use strict";n.r(t),n.d(t,"depthwiseConv2dNativeBackpropInput",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),i=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const a=Object(r.op)({depthwiseConv2dNativeBackpropInput_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n,r,a,u=[1,1],d){let l=t,c=!1;3===t.rank&&(c=!0,l=Object(i.reshape)(t,[1,t.shape[0],t.shape[1],t.shape[2]]));const f={dy:l,filter:n},p={strides:r,pad:a,dimRoundingMode:d,dilations:u,inputShape:e},m=s.ENGINE.runKernel(o.DepthwiseConv2dNativeBackpropInput,f,p);return c?Object(i.reshape)(m,[m.shape[1],m.shape[2],m.shape[3]]):m}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/diag.js": +/*!*************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/diag.js ***! + \*************************************************************/ +/*! exports provided: diag */function(e,t,n){"use strict";n.r(t),n.d(t,"diag",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({diag_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){const t={x:Object(r.convertToTensor)(e,"x","diag")};return s.ENGINE.runKernel(o.Diag,t)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/dilation2d.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/dilation2d.js ***! + \*******************************************************************/ +/*! exports provided: dilation2d */function(e,t,n){"use strict";n.r(t),n.d(t,"dilation2d",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),u=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const d=Object(a.op)({dilation2d_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n,a,d=[1,1],l="NHWC"){const c=Object(r.convertToTensor)(e,"x","dilation2d"),f=Object(r.convertToTensor)(t,"filter","dilation2d");i.assert(3===c.rank||4===c.rank,(()=>`Error in dilation2d: input must be rank 3 or 4, but got rank ${c.rank}.`)),i.assert(3===f.rank,(()=>`Error in dilation2d: filter must be rank 3, but got rank ${f.rank}.`)),i.assert("NHWC"===l,(()=>`Error in dilation2d: Only NHWC is currently supported, but got dataFormat of ${l}`));let p=c,m=!1;3===c.rank&&(p=Object(u.reshape)(c,[1,c.shape[0],c.shape[1],c.shape[2]]),m=!0);const h={x:p,filter:f},b={strides:n,pad:a,dilations:d},j=s.ENGINE.runKernel(o.Dilation2D,h,b);return m?Object(u.reshape)(j,[j.shape[1],j.shape[2],j.shape[3]]):j}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/div.js": +/*!************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/div.js ***! + \************************************************************/ +/*! exports provided: div */function(e,t,n){"use strict";n.r(t),n.d(t,"div",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),i=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),a=n(/*! ./floorDiv */"./node_modules/@tensorflow/tfjs-core/dist/ops/floorDiv.js"),u=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(u.op)({div_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t){let n=Object(i.convertToTensor)(e,"a","div"),u=Object(i.convertToTensor)(t,"b","div");if([n,u]=Object(r.makeTypesMatch)(n,u),"int32"===n.dtype&&"int32"===u.dtype)return Object(a.floorDiv)(n,u);const d={a:n,b:u};return s.ENGINE.runKernel(o.RealDiv,d,{})}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/div_no_nan.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/div_no_nan.js ***! + \*******************************************************************/ +/*! exports provided: divNoNan */function(e,t,n){"use strict";n.r(t),n.d(t,"divNoNan",(function(){return l}));var s=n(/*! ../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),o=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),r=n(/*! ./div */"./node_modules/@tensorflow/tfjs-core/dist/ops/div.js"),i=n(/*! ./equal */"./node_modules/@tensorflow/tfjs-core/dist/ops/equal.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),u=n(/*! ./where */"./node_modules/@tensorflow/tfjs-core/dist/ops/where.js"),d=n(/*! ./zeros_like */"./node_modules/@tensorflow/tfjs-core/dist/ops/zeros_like.js");const l=Object(a.op)({divNoNan_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t){let n=Object(o.convertToTensor)(e,"a","div"),a=Object(o.convertToTensor)(t,"b","div");[n,a]=Object(s.makeTypesMatch)(n,a);const l=Object(r.div)(n,a),c=Object(d.zerosLike)(l),f=Object(i.equal)(a,c);return Object(u.where)(f,c,l)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/dot.js": +/*!************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/dot.js ***! + \************************************************************/ +/*! exports provided: dot */function(e,t,n){"use strict";n.r(t),n.d(t,"dot",(function(){return u}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./mat_mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mat_mul.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),a=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const u=Object(i.op)({dot_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t){const n=Object(s.convertToTensor)(e,"t1","dot"),i=Object(s.convertToTensor)(t,"t2","dot");o.assert(!(1!==n.rank&&2!==n.rank||1!==i.rank&&2!==i.rank),(()=>`Error in dot: inputs must all be rank 1 or 2, but got ranks ${n.rank} and ${i.rank}.`));const u=1===n.rank?n.size:n.shape[1],d=1===i.rank?i.size:i.shape[0];if(o.assert(u===d,(()=>`Error in dot: inner dimensions of inputs must match, but got ${u} and ${d}.`)),1===n.rank&&1===i.rank){const e=Object(a.reshape)(n,[1,-1]),t=Object(a.reshape)(i,[-1,1]),s=Object(r.matMul)(e,t);return Object(a.reshape)(s,[])}if(1===n.rank&&2===i.rank){const e=Object(a.reshape)(n,[1,-1]),t=Object(a.reshape)(i,[i.shape[0],i.shape[1]]),s=Object(r.matMul)(e,t);return Object(a.reshape)(s,[s.size])}if(2===n.rank&&1===i.rank){const e=Object(a.reshape)(i,[-1,1]),t=Object(r.matMul)(n,e);return Object(a.reshape)(t,[t.size])}{const e=Object(a.reshape)(i,[i.shape[0],i.shape[1]]);return Object(r.matMul)(n,e)}}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/dropout.js": +/*!****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/dropout.js ***! + \****************************************************************/ +/*! exports provided: dropout */function(e,t,n){"use strict";n.r(t),n.d(t,"dropout",(function(){return p}));var s=n(/*! ../tensor */"./node_modules/@tensorflow/tfjs-core/dist/tensor.js"),o=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),r=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),i=n(/*! ./add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),a=n(/*! ./div */"./node_modules/@tensorflow/tfjs-core/dist/ops/div.js"),u=n(/*! ./dropout_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/dropout_util.js"),d=n(/*! ./floor */"./node_modules/@tensorflow/tfjs-core/dist/ops/floor.js"),l=n(/*! ./mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),c=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),f=n(/*! ./random_uniform */"./node_modules/@tensorflow/tfjs-core/dist/ops/random_uniform.js");const p=Object(c.op)({dropout_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n,c){const p=Object(o.convertToTensor)(e,"x","dropout");if(r.assert("float32"===p.dtype,(()=>`x has to be a floating point tensor since it's going to be scaled, but got a ${p.dtype} tensor instead.`)),r.assert(t>=0&&t<1,(()=>`rate must be a float in the range [0, 1), but got ${t}.`)),0===t)return e instanceof s.Tensor?p.clone():p;const m=Object(u.getNoiseShape)(p,n),h=1-t,b=Object(a.div)(Object(d.floor)(Object(i.add)(Object(f.randomUniform)(m,0,1,"float32",c),h)),h);return Object(l.mul)(p,b)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/dropout_util.js": +/*!*********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/dropout_util.js ***! + \*********************************************************************/ +/*! exports provided: getNoiseShape */function(e,t,n){"use strict";n.r(t),n.d(t,"getNoiseShape",(function(){return o}));var s=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */function o(e,t){if(null==t)return e.shape.slice();if(s.arraysEqual(e.shape,t))return t;if(e.shape.length===t.length){const n=[];for(let s=0;sObject(r.convertToTensor)(e,`tensors${t}`,"einsum"))),i={equation:e};return s.ENGINE.runKernel(o.Einsum,n,i)}const u=Object(i.op)({einsum_:a})},"./node_modules/@tensorflow/tfjs-core/dist/ops/elu.js": +/*!************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/elu.js ***! + \************************************************************/ +/*! exports provided: elu */function(e,t,n){"use strict";n.r(t),n.d(t,"elu",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({elu_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){const t={x:Object(r.convertToTensor)(e,"x","elu")};return s.ENGINE.runKernel(o.Elu,t)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/equal.js": +/*!**************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/equal.js ***! + \**************************************************************/ +/*! exports provided: equal */function(e,t,n){"use strict";n.r(t),n.d(t,"equal",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),i=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),a=n(/*! ./broadcast_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js"),u=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(u.op)({equal_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t){let n=Object(i.convertToTensor)(e,"a","equal","string_or_numeric"),u=Object(i.convertToTensor)(t,"b","equal","string_or_numeric");[n,u]=Object(r.makeTypesMatch)(n,u),Object(a.assertAndGetBroadcastShape)(n.shape,u.shape);const d={a:n,b:u};return s.ENGINE.runKernel(o.Equal,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/erf.js": +/*!************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/erf.js ***! + \************************************************************/ +/*! exports provided: erf */function(e,t,n){"use strict";n.r(t),n.d(t,"erf",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./cast */"./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"),u=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(u.op)({erf_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){let t=Object(r.convertToTensor)(e,"x","erf");i.assert("int32"===t.dtype||"float32"===t.dtype,(()=>"Input dtype must be `int32` or `float32`.")),"int32"===t.dtype&&(t=Object(a.cast)(t,"float32"));const n={x:t};return s.ENGINE.runKernel(o.Erf,n)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/erf_util.js": +/*!*****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/erf_util.js ***! + \*****************************************************************/ +/*! exports provided: ERF_P, ERF_A1, ERF_A2, ERF_A3, ERF_A4, ERF_A5 */function(e,t,n){"use strict";n.r(t),n.d(t,"ERF_P",(function(){return s})),n.d(t,"ERF_A1",(function(){return o})),n.d(t,"ERF_A2",(function(){return r})),n.d(t,"ERF_A3",(function(){return i})),n.d(t,"ERF_A4",(function(){return a})),n.d(t,"ERF_A5",(function(){return u})); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const s=.3275911,o=.254829592,r=-.284496736,i=1.421413741,a=-1.453152027,u=1.061405429},"./node_modules/@tensorflow/tfjs-core/dist/ops/exp.js": +/*!************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/exp.js ***! + \************************************************************/ +/*! exports provided: exp */function(e,t,n){"use strict";n.r(t),n.d(t,"exp",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({exp_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){const t={x:Object(r.convertToTensor)(e,"x","exp")};return s.ENGINE.runKernel(o.Exp,t)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/expand_dims.js": +/*!********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/expand_dims.js ***! + \********************************************************************/ +/*! exports provided: expandDims */function(e,t,n){"use strict";n.r(t),n.d(t,"expandDims",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(a.op)({expandDims_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t=0){const n=Object(r.convertToTensor)(e,"x","expandDims","string_or_numeric");i.assert(t<=n.rank,(()=>"Axis must be <= rank of the tensor"));const a={input:n},u={dim:t};return s.ENGINE.runKernel(o.ExpandDims,a,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/expm1.js": +/*!**************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/expm1.js ***! + \**************************************************************/ +/*! exports provided: expm1 */function(e,t,n){"use strict";n.r(t),n.d(t,"expm1",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({expm1_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){const t={x:Object(r.convertToTensor)(e,"x","expm1")};return s.ENGINE.runKernel(o.Expm1,t)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/eye.js": +/*!************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/eye.js ***! + \************************************************************/ +/*! exports provided: eye */function(e,t,n){"use strict";n.r(t),n.d(t,"eye",(function(){return u}));var s=n(/*! ./buffer */"./node_modules/@tensorflow/tfjs-core/dist/ops/buffer.js"),o=n(/*! ./expand_dims */"./node_modules/@tensorflow/tfjs-core/dist/ops/expand_dims.js"),r=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),i=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"),a=n(/*! ./tile */"./node_modules/@tensorflow/tfjs-core/dist/ops/tile.js");const u=Object(r.op)({eye_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n,r="float32"){null==t&&(t=e);const u=Object(s.buffer)([e,t],r),d=e<=t?e:t;for(let e=0;e`Error in fused conv2d: input must be rank 4, but got rank ${C.rank}.`)),u.assert(4===I.rank,(()=>`Error in fused conv2d: filter must be rank 4, but got rank ${I.rank}.`)),null!=_&&u.assert(u.isInt(b),(()=>`Error in fused conv2d: pad must be an integer when using, dimRoundingMode ${_} but got pad ${b}.`)),u.assert(C.shape[3]===I.shape[2],(()=>`Error in conv2d: depth of input (${C.shape[3]}) must match input depth for filter ${I.shape[2]}.`)),u.assert(m.eitherStridesOrDilationsAreOne(n,w),(()=>`Error in conv2D: Either strides or dilations must be 1. Got strides ${n} and dilations '${w}'`)),u.assert("NHWC"===g,(()=>`Error in conv2d: got dataFormat of ${g} but only NHWC is currently supported.`));const T=m.computeConv2DInfo(C.shape,I.shape,n,w,b,_);let N,E;null!=k&&(N=Object(a.convertToTensor)(k,"bias","fused conv2d"),[N]=Object(i.makeTypesMatch)(N,O),l.assertAndGetBroadcastShape(T.outShape,N.shape)),null!=x&&(E=Object(a.convertToTensor)(x,"prelu weights","fused conv2d"));const A=(e,t)=>{const[s,o,r,i]=t,a=Object(h.getFusedDyActivation)(e,r,v);u.assert(m.tupleValuesAreOne(w),(()=>`Error in gradient of fused conv2D: dilation rates greater than 1 are not yet supported in gradients. Got dilations '${w}'`));const d=[Object(p.conv2DBackpropInput)(o.shape,a,s,n,b),Object(f.conv2DBackpropFilter)(o,a,s.shape,n,b)];if(null!=i){const e=Object(h.getFusedBiasGradient)(i,a);d.push(e)}return d},R={x:C,filter:I,bias:N,preluActivationWeights:E},F={strides:n,pad:b,dataFormat:g,dilations:w,dimRoundingMode:_,activation:v,leakyreluAlpha:y};if(null==k){return Object(o.customGrad)(((e,t,n)=>{let o=s.ENGINE.runKernel(r.FusedConv2D,R,F);return n([t,e,o]),S&&(o=Object(j.reshape)(o,[o.shape[1],o.shape[2],o.shape[3]])),{value:o,gradFunc:A}}))(C,I)}return Object(o.customGrad)(((e,t,n,o)=>{let i=s.ENGINE.runKernel(r.FusedConv2D,R,F);return o([t,e,i,n]),S&&(i=Object(j.reshape)(i,[i.shape[1],i.shape[2],i.shape[3]])),{value:i,gradFunc:A}}))(C,I,N)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/fused/depthwise_conv2d.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/fused/depthwise_conv2d.js ***! + \*******************************************************************************/ +/*! exports provided: depthwiseConv2d */function(e,t,n){"use strict";n.r(t),n.d(t,"depthwiseConv2d",(function(){return g}));var s=n(/*! ../../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../../gradients */"./node_modules/@tensorflow/tfjs-core/dist/gradients.js"),r=n(/*! ../../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),i=n(/*! ../../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),a=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),u=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),d=n(/*! ../add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),l=n(/*! ../broadcast_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js"),c=n(/*! ../conv_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/conv_util.js"),f=n(/*! ../depthwise_conv2d */"./node_modules/@tensorflow/tfjs-core/dist/ops/depthwise_conv2d.js"),p=n(/*! ../depthwise_conv2d_native_backprop_filter */"./node_modules/@tensorflow/tfjs-core/dist/ops/depthwise_conv2d_native_backprop_filter.js"),m=n(/*! ../depthwise_conv2d_native_backprop_input */"./node_modules/@tensorflow/tfjs-core/dist/ops/depthwise_conv2d_native_backprop_input.js"),h=n(/*! ../fused_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/fused_util.js"),b=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),j=n(/*! ../reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const g=Object(b.op)({fusedDepthwiseConv2d_: +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function({x:e,filter:t,strides:n,pad:b,dataFormat:g="NHWC",dilations:w=[1,1],dimRoundingMode:_,bias:k,activation:v="linear",preluActivationWeights:x,leakyreluAlpha:y}){if(!1===Object(h.shouldFuse)(s.ENGINE.state.gradientDepth,v)){let s=Object(f.depthwiseConv2d)(e,t,n,b,g,w,_);return null!=k&&(s=Object(d.add)(s,k)),Object(h.applyActivation)(s,v,x,y)}const O=Object(a.convertToTensor)(e,"x","depthwiseConv2d"),I=Object(a.convertToTensor)(t,"filter","depthwiseConv2d");let C=O,S=!1;3===O.rank&&(S=!0,C=Object(j.reshape)(O,[1,O.shape[0],O.shape[1],O.shape[2]])),u.assert(4===C.rank,(()=>`Error in fused depthwiseConv2d: input must be rank 4, but got rank ${C.rank}.`)),u.assert(4===I.rank,(()=>`Error in fused depthwiseConv2d: filter must be rank 4, but got rank ${I.rank}.`)),u.assert(C.shape[3]===I.shape[2],(()=>`Error in fused depthwiseConv2d: number of input channels (${C.shape[3]}) must match the inChannels dimension in filter ${I.shape[2]}.`)),null==w&&(w=[1,1]),u.assert(c.eitherStridesOrDilationsAreOne(n,w),(()=>`Error in fused depthwiseConv2d: Either strides or dilations must be 1. Got strides ${n} and dilations '${w}'`)),null!=_&&u.assert(u.isInt(b),(()=>`Error in fused depthwiseConv2d: pad must be an integer when using dimRoundingMode ${_} but got pad ${b}.`));const T=c.computeConv2DInfo(C.shape,I.shape,n,w,b,_,!0);let N,E;null!=k&&(N=Object(a.convertToTensor)(k,"bias","fused conv2d"),[N]=Object(i.makeTypesMatch)(N,O),l.assertAndGetBroadcastShape(T.outShape,N.shape)),null!=x&&(E=Object(a.convertToTensor)(x,"prelu weights","fused depthwiseConv2d"));const A=(e,t)=>{u.assert(c.tupleValuesAreOne(w),(()=>`Error in gradient of fused depthwiseConv2d: dilation rates greater than 1 are not yet supported. Got dilations '${w}'`));const[s,o,r,i]=t,a=Object(h.getFusedDyActivation)(e,r,v),d=Object(m.depthwiseConv2dNativeBackpropInput)(o.shape,a,s,n,b,w,_),l=Object(p.depthwiseConv2dNativeBackpropFilter)(o,a,s.shape,n,b,w,_);if(null!=i){return[d,l,Object(h.getFusedBiasGradient)(N,a)]}return[d,l]},R={x:C,filter:I,bias:N,preluActivationWeights:E},F={strides:n,pad:b,dataFormat:g,dilations:w,dimRoundingMode:_,activation:v,leakyreluAlpha:y};if(null==k){return Object(o.customGrad)(((e,t,n)=>{let o=s.ENGINE.runKernel(r.FusedDepthwiseConv2D,R,F);return n([t,e,o]),S&&(o=Object(j.reshape)(o,[o.shape[1],o.shape[2],o.shape[3]])),{value:o,gradFunc:A}}))(C,I)}return Object(o.customGrad)(((e,t,n,o)=>{let i=s.ENGINE.runKernel(r.FusedDepthwiseConv2D,R,F);return o([t,e,i,n]),S&&(i=Object(j.reshape)(i,[i.shape[1],i.shape[2],i.shape[3]])),{value:i,gradFunc:A}}))(C,I,N)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/fused/mat_mul.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/fused/mat_mul.js ***! + \**********************************************************************/ +/*! exports provided: matMul */function(e,t,n){"use strict";n.r(t),n.d(t,"matMul",(function(){return h}));var s=n(/*! ../../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../../gradients */"./node_modules/@tensorflow/tfjs-core/dist/gradients.js"),r=n(/*! ../../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),i=n(/*! ../../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),a=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),u=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),d=n(/*! ../add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),l=n(/*! ../broadcast_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js"),c=n(/*! ../fused_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/fused_util.js"),f=n(/*! ../mat_mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mat_mul.js"),p=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),m=n(/*! ../reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const h=Object(p.op)({fusedMatMul_: +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function({a:e,b:t,transposeA:n=!1,transposeB:p=!1,bias:h,activation:b="linear",preluActivationWeights:j,leakyreluAlpha:g}){if(!1===Object(c.shouldFuse)(s.ENGINE.state.gradientDepth,b)){let s=Object(f.matMul)(e,t,n,p);return null!=h&&(s=Object(d.add)(s,h)),Object(c.applyActivation)(s,b,j,g)}let w=Object(a.convertToTensor)(e,"a","fused matMul"),_=Object(a.convertToTensor)(t,"b","fused matMul");[w,_]=Object(i.makeTypesMatch)(w,_);const k=n?w.shape[w.rank-2]:w.shape[w.rank-1],v=p?_.shape[_.rank-1]:_.shape[_.rank-2],x=n?w.shape[w.rank-1]:w.shape[w.rank-2],y=p?_.shape[_.rank-2]:_.shape[_.rank-1],O=w.shape.slice(0,-2),I=_.shape.slice(0,-2),C=u.sizeFromShape(O),S=u.sizeFromShape(I);u.assert(w.rank>=2&&_.rank>=2&&w.rank===_.rank,(()=>`Error in fused matMul: inputs must have the same rank of at least 2, got ranks ${w.rank} and ${_.rank}.`)),u.assert(u.arraysEqual(O,I),(()=>`Error in fused matMul: outer dimensions (${O}) and (${I}) of Tensors with shapes ${w.shape} and ${_.shape} must match.`)),u.assert(k===v,(()=>`Error in fused matMul: inner shapes (${k}) and (${v}) of Tensors with shapes ${w.shape} and ${_.shape} and transposeA=${n} and transposeB=${p} must match.`));const T=w.shape.slice(0,-2).concat([x,y]),N=n?Object(m.reshape)(w,[C,k,x]):Object(m.reshape)(w,[C,x,k]),E=p?Object(m.reshape)(_,[S,y,v]):Object(m.reshape)(_,[S,v,y]);let A,R;null!=h&&(A=Object(a.convertToTensor)(h,"bias","fused matMul"),[A]=Object(i.makeTypesMatch)(A,w),l.assertAndGetBroadcastShape(T,A.shape)),null!=j&&(R=Object(a.convertToTensor)(j,"prelu weights","fused matMul"));const F=(e,t)=>{const[s,o,r,i]=t,a=Object(c.getFusedDyActivation)(Object(m.reshape)(e,r.shape),r,b);let u,d;if(n||p?!n&&p?(u=Object(f.matMul)(a,o,!1,!1),d=Object(f.matMul)(a,s,!0,!1)):n&&!p?(u=Object(f.matMul)(o,a,!1,!0),d=Object(f.matMul)(s,a,!1,!1)):(u=Object(f.matMul)(o,a,!0,!0),d=Object(f.matMul)(a,s,!0,!0)):(u=Object(f.matMul)(a,o,!1,!0),d=Object(f.matMul)(s,a,!0,!1)),null!=h){return[u,d,Object(c.getFusedBiasGradient)(i,a)]}return[u,d]},M={a:N,b:E,bias:A,preluActivationWeights:R},$={transposeA:n,transposeB:p,activation:b,leakyreluAlpha:g};if(null==h){return Object(o.customGrad)(((e,t,n)=>{const o=s.ENGINE.runKernel(r._FusedMatMul,M,$);return n([e,t,o]),{value:Object(m.reshape)(o,T),gradFunc:F}}))(N,E)}return Object(o.customGrad)(((e,t,n,o)=>{const i=s.ENGINE.runKernel(r._FusedMatMul,M,$);return o([e,t,i,n]),{value:Object(m.reshape)(i,T),gradFunc:F}}))(N,E,A)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/fused_ops.js": +/*!******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/fused_ops.js ***! + \******************************************************************/ +/*! exports provided: conv2d, depthwiseConv2d, matMul */function(e,t,n){"use strict";n.r(t);var s=n(/*! ./fused/conv2d */"./node_modules/@tensorflow/tfjs-core/dist/ops/fused/conv2d.js");n.d(t,"conv2d",(function(){return s.conv2d}));var o=n(/*! ./fused/depthwise_conv2d */"./node_modules/@tensorflow/tfjs-core/dist/ops/fused/depthwise_conv2d.js");n.d(t,"depthwiseConv2d",(function(){return o.depthwiseConv2d}));var r=n(/*! ./fused/mat_mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/fused/mat_mul.js");n.d(t,"matMul",(function(){return r.matMul}))},"./node_modules/@tensorflow/tfjs-core/dist/ops/fused_util.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/fused_util.js ***! + \*******************************************************************/ +/*! exports provided: getFusedDyActivation, getFusedBiasGradient, applyActivation, shouldFuse */function(e,t,n){"use strict";n.r(t),n.d(t,"getFusedDyActivation",(function(){return m})),n.d(t,"getFusedBiasGradient",(function(){return h})),n.d(t,"applyActivation",(function(){return b})),n.d(t,"shouldFuse",(function(){return j}));var s=n(/*! ./broadcast_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js"),o=n(/*! ./elu */"./node_modules/@tensorflow/tfjs-core/dist/ops/elu.js"),r=n(/*! ./leaky_relu */"./node_modules/@tensorflow/tfjs-core/dist/ops/leaky_relu.js"),i=n(/*! ./mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),a=n(/*! ./prelu */"./node_modules/@tensorflow/tfjs-core/dist/ops/prelu.js"),u=n(/*! ./relu */"./node_modules/@tensorflow/tfjs-core/dist/ops/relu.js"),d=n(/*! ./relu6 */"./node_modules/@tensorflow/tfjs-core/dist/ops/relu6.js"),l=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"),c=n(/*! ./sigmoid */"./node_modules/@tensorflow/tfjs-core/dist/ops/sigmoid.js"),f=n(/*! ./step */"./node_modules/@tensorflow/tfjs-core/dist/ops/step.js"),p=n(/*! ./sum */"./node_modules/@tensorflow/tfjs-core/dist/ops/sum.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function m(e,t,n){if(null==n||"linear"===n)return e;if("relu"===n)return Object(i.mul)(e,Object(f.step)(t));throw new Error(`Cannot compute gradient for fused activation ${n}.`)}function h(e,t){let n=t;const o=s.getReductionAxes(e.shape,t.shape);return o.length>0&&(n=Object(p.sum)(n,o)),Object(l.reshape)(n,e.shape)}function b(e,t,n,s){if("linear"===t)return e;if("relu"===t)return Object(u.relu)(e);if("elu"===t)return Object(o.elu)(e);if("relu6"===t)return Object(d.relu6)(e);if("prelu"===t)return Object(a.prelu)(e,n);if("leakyrelu"===t)return Object(r.leakyRelu)(e,s);if("sigmoid"===t)return Object(c.sigmoid)(e);throw new Error(`Unknown fused activation ${t}.`)}const j=(e,t)=>!(e>0)||"linear"===t},"./node_modules/@tensorflow/tfjs-core/dist/ops/gather.js": +/*!***************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/gather.js ***! + \***************************************************************/ +/*! exports provided: gather */function(e,t,n){"use strict";n.r(t),n.d(t,"gather",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({gather_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n=0,i=0){const a={x:Object(r.convertToTensor)(e,"x","gather"),indices:Object(r.convertToTensor)(t,"indices","gather","int32")},u={axis:n,batchDims:i};return s.ENGINE.runKernel(o.GatherV2,a,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/gather_nd.js": +/*!******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/gather_nd.js ***! + \******************************************************************/ +/*! exports provided: gatherND */function(e,t,n){"use strict";n.r(t),n.d(t,"gatherND",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({gatherND_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t){const n=Object(r.convertToTensor)(t,"indices","gatherND","int32"),i={params:Object(r.convertToTensor)(e,"x","gatherND","string_or_numeric"),indices:n};return s.ENGINE.runKernel(o.GatherNd,i)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/gather_nd_util.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/gather_nd_util.js ***! + \***********************************************************************/ +/*! exports provided: prepareAndValidate */function(e,t,n){"use strict";n.r(t),n.d(t,"prepareAndValidate",(function(){return o}));var s=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js");function o(e,t){const n=e.shape.length,o=t.shape.length;if(n<1)throw new Error(`tf.gatherND() expects the input to be rank 1 or higher, but the rank was ${n}.`);if(o<1)throw new Error(`tf.gatherND() expects the indices to be rank 1 or higher, but the rank was ${o}.`);if("int32"!==t.dtype)throw new Error(`tf.gatherND() expects the indices to be int32 type, but the dtype was ${t.dtype}.`);if(t.shape[o-1]>n)throw new Error(`index innermost dimension length must be <= tensor rank; saw: ${t.shape[o-1]} vs. ${n}`);if(0===Object(s.sizeFromShape)(e.shape))throw new Error(`Requested more than 0 entries, but input is empty. Input shape: ${e.shape}.`);const r=t.shape,i=r[r.length-1];let a=1;for(let e=0;ee/l)),1].slice(0,i);return[d,a,l,c]}},"./node_modules/@tensorflow/tfjs-core/dist/ops/greater.js": +/*!****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/greater.js ***! + \****************************************************************/ +/*! exports provided: greater */function(e,t,n){"use strict";n.r(t),n.d(t,"greater",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),i=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),a=n(/*! ./broadcast_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js"),u=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(u.op)({greater_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t){let n=Object(i.convertToTensor)(e,"a","greater","string_or_numeric"),u=Object(i.convertToTensor)(t,"b","greater","string_or_numeric");[n,u]=Object(r.makeTypesMatch)(n,u),Object(a.assertAndGetBroadcastShape)(n.shape,u.shape);const d={a:n,b:u};return s.ENGINE.runKernel(o.Greater,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/greater_equal.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/greater_equal.js ***! + \**********************************************************************/ +/*! exports provided: greaterEqual */function(e,t,n){"use strict";n.r(t),n.d(t,"greaterEqual",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),i=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),a=n(/*! ./broadcast_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js"),u=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(u.op)({greaterEqual_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t){let n=Object(i.convertToTensor)(e,"a","greaterEqual","string_or_numeric"),u=Object(i.convertToTensor)(t,"b","greaterEqual","string_or_numeric");[n,u]=Object(r.makeTypesMatch)(n,u),Object(a.assertAndGetBroadcastShape)(n.shape,u.shape);const d={a:n,b:u};return s.ENGINE.runKernel(o.GreaterEqual,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/imag.js": +/*!*************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/imag.js ***! + \*************************************************************/ +/*! exports provided: imag */function(e,t,n){"use strict";n.r(t),n.d(t,"imag",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({imag_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){const t={input:Object(r.convertToTensor)(e,"input","imag")};return s.ENGINE.runKernel(o.Imag,t)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/image/crop_and_resize.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/image/crop_and_resize.js ***! + \******************************************************************************/ +/*! exports provided: cropAndResize */function(e,t,n){"use strict";n.r(t),n.d(t,"cropAndResize",(function(){return u}));var s=n(/*! ../../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(a.op)({cropAndResize_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n,a,u="bilinear",d=0){const l=Object(r.convertToTensor)(e,"image","cropAndResize"),c=Object(r.convertToTensor)(t,"boxes","cropAndResize","float32"),f=Object(r.convertToTensor)(n,"boxInd","cropAndResize","int32"),p=c.shape[0];i.assert(4===l.rank,(()=>`Error in cropAndResize: image must be rank 4,but got rank ${l.rank}.`)),i.assert(2===c.rank&&4===c.shape[1],(()=>`Error in cropAndResize: boxes must be have size [${p},4] but had shape ${c.shape}.`)),i.assert(1===f.rank&&f.shape[0]===p,(()=>`Error in cropAndResize: boxInd must be have size [${p}] but had shape ${c.shape}.`)),i.assert(2===a.length,(()=>`Error in cropAndResize: cropSize must be of length 2, but got length ${a.length}.`)),i.assert(a[0]>=1&&a[1]>=1,(()=>`cropSize must be atleast [1,1], but was ${a}`)),i.assert("bilinear"===u||"nearest"===u,(()=>`method must be bilinear or nearest, but was ${u}`));const m={image:l,boxes:c,boxInd:f},h={method:u,extrapolationValue:d,cropSize:a};return s.ENGINE.runKernel(o.CropAndResize,m,h)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/image/flip_left_right.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/image/flip_left_right.js ***! + \******************************************************************************/ +/*! exports provided: flipLeftRight */function(e,t,n){"use strict";n.r(t),n.d(t,"flipLeftRight",(function(){return u}));var s=n(/*! ../../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(a.op)({flipLeftRight_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){const t=Object(r.convertToTensor)(e,"image","flipLeftRight","float32");i.assert(4===t.rank,(()=>`Error in flipLeftRight: image must be rank 4,but got rank ${t.rank}.`));const n={image:t};return s.ENGINE.runKernel(o.FlipLeftRight,n,{})}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression.js": +/*!**********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression.js ***! + \**********************************************************************************/ +/*! exports provided: nonMaxSuppression */function(e,t,n){"use strict";n.r(t),n.d(t,"nonMaxSuppression",(function(){return u}));var s=n(/*! ../../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../nonmax_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/nonmax_util.js"),a=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(a.op)({nonMaxSuppression_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n,a=.5,u=Number.NEGATIVE_INFINITY){const d=Object(r.convertToTensor)(e,"boxes","nonMaxSuppression"),l=Object(r.convertToTensor)(t,"scores","nonMaxSuppression"),c=Object(i.nonMaxSuppSanityCheck)(d,l,n,a,u),f={maxOutputSize:n=c.maxOutputSize,iouThreshold:a=c.iouThreshold,scoreThreshold:u=c.scoreThreshold};return s.ENGINE.runKernel(o.NonMaxSuppressionV3,{boxes:d,scores:l},f)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression_async.js": +/*!****************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression_async.js ***! + \****************************************************************************************/ +/*! exports provided: nonMaxSuppressionAsync */function(e,t,n){"use strict";n.r(t),n.d(t,"nonMaxSuppressionAsync",(function(){return a}));var s=n(/*! ../../backends/non_max_suppression_impl */"./node_modules/@tensorflow/tfjs-core/dist/backends/non_max_suppression_impl.js"),o=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),r=n(/*! ../nonmax_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/nonmax_util.js"),i=n(/*! ../tensor1d */"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor1d.js");const a= +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +async function(e,t,n,a=.5,u=Number.NEGATIVE_INFINITY){const d=Object(o.convertToTensor)(e,"boxes","nonMaxSuppressionAsync"),l=Object(o.convertToTensor)(t,"scores","nonMaxSuppressionAsync"),c=Object(r.nonMaxSuppSanityCheck)(d,l,n,a,u);n=c.maxOutputSize,a=c.iouThreshold,u=c.scoreThreshold;const f=await Promise.all([d.data(),l.data()]),p=f[0],m=f[1],{selectedIndices:h}=Object(s.nonMaxSuppressionV3Impl)(p,m,n,a,u);return d!==e&&d.dispose(),l!==t&&l.dispose(),Object(i.tensor1d)(h,"int32")}},"./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression_padded.js": +/*!*****************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression_padded.js ***! + \*****************************************************************************************/ +/*! exports provided: nonMaxSuppressionPadded */function(e,t,n){"use strict";n.r(t),n.d(t,"nonMaxSuppressionPadded",(function(){return u}));var s=n(/*! ../../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../nonmax_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/nonmax_util.js"),a=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(a.op)({nonMaxSuppressionPadded_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n,a=.5,u=Number.NEGATIVE_INFINITY,d=!1){const l=Object(r.convertToTensor)(e,"boxes","nonMaxSuppression"),c=Object(r.convertToTensor)(t,"scores","nonMaxSuppression"),f=Object(i.nonMaxSuppSanityCheck)(l,c,n,a,u,null),p={boxes:l,scores:c},m={maxOutputSize:f.maxOutputSize,iouThreshold:f.iouThreshold,scoreThreshold:f.scoreThreshold,padToMaxOutputSize:d},h=s.ENGINE.runKernel(o.NonMaxSuppressionV4,p,m);return{selectedIndices:h[0],validOutputs:h[1]}}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression_padded_async.js": +/*!***********************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression_padded_async.js ***! + \***********************************************************************************************/ +/*! exports provided: nonMaxSuppressionPaddedAsync */function(e,t,n){"use strict";n.r(t),n.d(t,"nonMaxSuppressionPaddedAsync",(function(){return u}));var s=n(/*! ../../backends/non_max_suppression_impl */"./node_modules/@tensorflow/tfjs-core/dist/backends/non_max_suppression_impl.js"),o=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),r=n(/*! ../nonmax_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/nonmax_util.js"),i=n(/*! ../scalar */"./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"),a=n(/*! ../tensor1d */"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor1d.js");const u= +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +async function(e,t,n,u=.5,d=Number.NEGATIVE_INFINITY,l=!1){const c=Object(o.convertToTensor)(e,"boxes","nonMaxSuppressionAsync"),f=Object(o.convertToTensor)(t,"scores","nonMaxSuppressionAsync"),p=Object(r.nonMaxSuppSanityCheck)(c,f,n,u,d,null),m=p.maxOutputSize,h=p.iouThreshold,b=p.scoreThreshold,[j,g]=await Promise.all([c.data(),f.data()]),{selectedIndices:w,validOutputs:_}=Object(s.nonMaxSuppressionV4Impl)(j,g,m,h,b,l);return c!==e&&c.dispose(),f!==t&&f.dispose(),{selectedIndices:Object(a.tensor1d)(w,"int32"),validOutputs:Object(i.scalar)(_,"int32")}}},"./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression_with_score.js": +/*!*********************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression_with_score.js ***! + \*********************************************************************************************/ +/*! exports provided: nonMaxSuppressionWithScore */function(e,t,n){"use strict";n.r(t),n.d(t,"nonMaxSuppressionWithScore",(function(){return u}));var s=n(/*! ../../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../nonmax_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/nonmax_util.js"),a=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(a.op)({nonMaxSuppressionWithScore_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n,a=.5,u=Number.NEGATIVE_INFINITY,d=0){const l=Object(r.convertToTensor)(e,"boxes","nonMaxSuppression"),c=Object(r.convertToTensor)(t,"scores","nonMaxSuppression"),f=Object(i.nonMaxSuppSanityCheck)(l,c,n,a,u,d),p={boxes:l,scores:c},m={maxOutputSize:n=f.maxOutputSize,iouThreshold:a=f.iouThreshold,scoreThreshold:u=f.scoreThreshold,softNmsSigma:d=f.softNmsSigma},h=s.ENGINE.runKernel(o.NonMaxSuppressionV5,p,m);return{selectedIndices:h[0],selectedScores:h[1]}}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression_with_score_async.js": +/*!***************************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression_with_score_async.js ***! + \***************************************************************************************************/ +/*! exports provided: nonMaxSuppressionWithScoreAsync */function(e,t,n){"use strict";n.r(t),n.d(t,"nonMaxSuppressionWithScoreAsync",(function(){return a}));var s=n(/*! ../../backends/non_max_suppression_impl */"./node_modules/@tensorflow/tfjs-core/dist/backends/non_max_suppression_impl.js"),o=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),r=n(/*! ../nonmax_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/nonmax_util.js"),i=n(/*! ../tensor1d */"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor1d.js");const a= +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +async function(e,t,n,a=.5,u=Number.NEGATIVE_INFINITY,d=0){const l=Object(o.convertToTensor)(e,"boxes","nonMaxSuppressionAsync"),c=Object(o.convertToTensor)(t,"scores","nonMaxSuppressionAsync"),f=Object(r.nonMaxSuppSanityCheck)(l,c,n,a,u,d);n=f.maxOutputSize,a=f.iouThreshold,u=f.scoreThreshold,d=f.softNmsSigma;const p=await Promise.all([l.data(),c.data()]),m=p[0],h=p[1],{selectedIndices:b,selectedScores:j}=Object(s.nonMaxSuppressionV5Impl)(m,h,n,a,u,d);return l!==e&&l.dispose(),c!==t&&c.dispose(),{selectedIndices:Object(i.tensor1d)(b,"int32"),selectedScores:Object(i.tensor1d)(j)}}},"./node_modules/@tensorflow/tfjs-core/dist/ops/image/resize_bilinear.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/image/resize_bilinear.js ***! + \******************************************************************************/ +/*! exports provided: resizeBilinear */function(e,t,n){"use strict";n.r(t),n.d(t,"resizeBilinear",(function(){return d}));var s=n(/*! ../../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),u=n(/*! ../reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const d=Object(a.op)({resizeBilinear_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n=!1,a=!1){const d=Object(r.convertToTensor)(e,"images","resizeBilinear");i.assert(3===d.rank||4===d.rank,(()=>`Error in resizeBilinear: x must be rank 3 or 4, but got rank ${d.rank}.`)),i.assert(2===t.length,(()=>`Error in resizeBilinear: new shape must 2D, but got shape ${t}.`)),i.assert(!1===a||!1===n,(()=>"Error in resizeBilinear: If halfPixelCenters is true, alignCorners must be false."));let l=d,c=!1;3===d.rank&&(c=!0,l=Object(u.reshape)(d,[1,d.shape[0],d.shape[1],d.shape[2]]));const[]=t,f={images:l},p={alignCorners:n,halfPixelCenters:a,size:t},m=s.ENGINE.runKernel(o.ResizeBilinear,f,p);return c?Object(u.reshape)(m,[m.shape[1],m.shape[2],m.shape[3]]):m}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/image/resize_nearest_neighbor.js": +/*!**************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/image/resize_nearest_neighbor.js ***! + \**************************************************************************************/ +/*! exports provided: resizeNearestNeighbor */function(e,t,n){"use strict";n.r(t),n.d(t,"resizeNearestNeighbor",(function(){return d}));var s=n(/*! ../../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),u=n(/*! ../reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const d=Object(a.op)({resizeNearestNeighbor_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n=!1,a=!1){const d=Object(r.convertToTensor)(e,"images","resizeNearestNeighbor");i.assert(3===d.rank||4===d.rank,(()=>`Error in resizeNearestNeighbor: x must be rank 3 or 4, but got rank ${d.rank}.`)),i.assert(2===t.length,(()=>`Error in resizeNearestNeighbor: new shape must 2D, but got shape ${t}.`)),i.assert("float32"===d.dtype||"int32"===d.dtype,(()=>"`images` must have `int32` or `float32` as dtype")),i.assert(!1===a||!1===n,(()=>"Error in resizeNearestNeighbor: If halfPixelCenters is true, alignCorners must be false."));let l=d,c=!1;3===d.rank&&(c=!0,l=Object(u.reshape)(d,[1,d.shape[0],d.shape[1],d.shape[2]]));const[]=t,f={images:l},p={alignCorners:n,halfPixelCenters:a,size:t},m=s.ENGINE.runKernel(o.ResizeNearestNeighbor,f,p);return c?Object(u.reshape)(m,[m.shape[1],m.shape[2],m.shape[3]]):m}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/image/rotate_with_offset.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/image/rotate_with_offset.js ***! + \*********************************************************************************/ +/*! exports provided: rotateWithOffset */function(e,t,n){"use strict";n.r(t),n.d(t,"rotateWithOffset",(function(){return u}));var s=n(/*! ../../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(a.op)({rotateWithOffset_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n=0,a=.5){const u=Object(r.convertToTensor)(e,"image","rotateWithOffset","float32");i.assert(4===u.rank,(()=>`Error in rotateWithOffset: image must be rank 4,but got rank ${u.rank}.`));const d={image:u},l={radians:t,fillValue:n,center:a};return s.ENGINE.runKernel(o.RotateWithOffset,d,l)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/image/threshold.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/image/threshold.js ***! + \************************************************************************/ +/*! exports provided: threshold */function(e,t,n){"use strict";n.r(t),n.d(t,"threshold",(function(){return x}));var s=n(/*! ../tensor1d */"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor1d.js"),o=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),r=n(/*! ../cast */"./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"),i=n(/*! ../split */"./node_modules/@tensorflow/tfjs-core/dist/ops/split.js"),a=n(/*! ../bincount */"./node_modules/@tensorflow/tfjs-core/dist/ops/bincount.js"),u=n(/*! ../less_equal */"./node_modules/@tensorflow/tfjs-core/dist/ops/less_equal.js"),d=n(/*! ../greater */"./node_modules/@tensorflow/tfjs-core/dist/ops/greater.js"),l=n(/*! ../sum */"./node_modules/@tensorflow/tfjs-core/dist/ops/sum.js"),c=n(/*! ../add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),f=n(/*! ../mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),p=n(/*! ../div */"./node_modules/@tensorflow/tfjs-core/dist/ops/div.js"),m=n(/*! ../sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"),h=n(/*! ../round */"./node_modules/@tensorflow/tfjs-core/dist/ops/round.js"),b=n(/*! ../where */"./node_modules/@tensorflow/tfjs-core/dist/ops/where.js"),j=n(/*! ../fill */"./node_modules/@tensorflow/tfjs-core/dist/ops/fill.js"),g=n(/*! ../slice */"./node_modules/@tensorflow/tfjs-core/dist/ops/slice.js"),w=n(/*! ../range */"./node_modules/@tensorflow/tfjs-core/dist/ops/range.js"),_=n(/*! ../tensor */"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor.js"),k=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),v=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js");const x=Object(o.op)({threshold_: +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t="binary",n=!1,o=.5){const x=Object(v.convertToTensor)(e,"image","threshold"),y=x.shape[0]*x.shape[1];let O,I,C,S,T=Object(f.mul)(Object(s.tensor1d)([o]),255);if(k.assert(3===x.rank,(()=>`Error in threshold: image must be rank 3,but got rank ${x.rank}.`)),k.assert(3===x.shape[2]||1===x.shape[2],(()=>`Error in threshold: image color channel must be equal to 3 or 1but got ${x.shape[2]}.`)),k.assert("int32"===x.dtype||"float32"===x.dtype,(()=>`Error in dtype: image dtype must be int32 or float32,but got dtype ${x.dtype}.`)),k.assert("otsu"===t||"binary"===t,(()=>`Method must be binary or otsu, but was ${t}`)),3===x.shape[2]){[O,I,C]=Object(i.split)(x,[1,1,1],-1);const e=Object(f.mul)(O,.2989),t=Object(f.mul)(I,.587),n=Object(f.mul)(C,.114);S=Object(c.add)(Object(c.add)(e,t),n)}else S=e;if("otsu"===t){T=function(e,t){let n,o,r,i,a,u,h=Object(s.tensor1d)([-1]),_=Object(s.tensor1d)([0]),k=Object(s.tensor1d)([0]);for(let v=0;v`Error in transform: image must be rank 4,but got rank ${l.rank}.`)),i.assert(2===c.rank&&(c.shape[0]===l.shape[0]||1===c.shape[0])&&8===c.shape[1],(()=>"Error in transform: Input transform should be batch x 8 or 1 x 8")),i.assert(null==d||2===d.length,(()=>`Error in transform: outputShape must be [height, width] or null, but got ${d}.`));const f={image:l,transforms:c},p={interpolation:n,fillMode:a,fillValue:u,outputShape:d};return s.ENGINE.runKernel(o.Transform,f,p)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/in_top_k.js": +/*!*****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/in_top_k.js ***! + \*****************************************************************/ +/*! exports provided: inTopKAsync */function(e,t,n){"use strict";n.r(t),n.d(t,"inTopKAsync",(function(){return i}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./tensor */"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor.js");const i= +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +async function(e,t,n=1){const i=Object(s.convertToTensor)(e,"predictions","inTopK"),a=Object(s.convertToTensor)(t,"targets","inTopK");Object(o.assert)(i.rank>1,(()=>`inTopK() expects the predictions to be of rank 2 or higher, but got ${i.rank}`)),Object(o.assert)(i.rank-1===a.rank,(()=>`predictions rank should be 1 larger than targets rank, but got predictions rank ${i.rank} and targets rank ${a.rank}`)),Object(o.assertShapesMatch)(i.shape.slice(0,i.shape.length-1),a.shape,"predictions's shape should be align with the targets' shape, except the last dimension.");const u=i.shape[i.shape.length-1];Object(o.assert)(n>0&&n<=u,(()=>`'k' passed to inTopK() must be > 0 && <= the predictions last dimension (${u}), but got ${n}`));const d=await i.data(),l=await a.data(),[c,f]=[d.length/u,u],p=Object(o.getTypedArrayFromDType)("bool",c);for(let e=0;et.value-e.value)),p[e]=0;for(let t=0;t`bandPart(): numLower must be an integer, got ${t}.`)),Object(o.assert)(n%1==0,(()=>`bandPart(): numUpper must be an integer, got ${n}.`));const u=Object(s.convertToTensor)(e,"a","bandPart");Object(o.assert)(u.rank>=2,(()=>`bandPart(): Rank must be at least 2, got ${u.rank}.`));const j=u.shape,[g,w]=u.shape.slice(-2);if(!(t<=g))throw new Error(`bandPart(): numLower (${t}) must not be greater than the number of rows (${g}).`);if(!(n<=w))throw new Error(`bandPart(): numUpper (${n}) must not be greater than the number of columns (${w}).`);t<0&&(t=g),n<0&&(n=w);const _=Object(l.reshape)(Object(d.range)(0,g,1,"int32"),[-1,1]),k=Object(d.range)(0,w,1,"int32"),v=Object(p.sub)(_,k),x=Object(a.logicalAnd)(Object(i.lessEqual)(v,Object(c.scalar)(+t,"int32")),Object(r.greaterEqual)(v,Object(c.scalar)(-n,"int32"))),y=Object(b.zeros)([g,w],u.dtype);return Object(l.reshape)(Object(f.stack)(Object(m.unstack)(Object(l.reshape)(u,[-1,g,w])).map((e=>Object(h.where)(x,e,y)))),j)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/linalg/gram_schmidt.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/linalg/gram_schmidt.js ***! + \****************************************************************************/ +/*! exports provided: gramSchmidt */function(e,t,n){"use strict";n.r(t),n.d(t,"gramSchmidt",(function(){return m}));var s=n(/*! ../../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ../div */"./node_modules/@tensorflow/tfjs-core/dist/ops/div.js"),i=n(/*! ../mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),a=n(/*! ../norm */"./node_modules/@tensorflow/tfjs-core/dist/ops/norm.js"),u=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),d=n(/*! ../split */"./node_modules/@tensorflow/tfjs-core/dist/ops/split.js"),l=n(/*! ../squeeze */"./node_modules/@tensorflow/tfjs-core/dist/ops/squeeze.js"),c=n(/*! ../stack */"./node_modules/@tensorflow/tfjs-core/dist/ops/stack.js"),f=n(/*! ../sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"),p=n(/*! ../sum */"./node_modules/@tensorflow/tfjs-core/dist/ops/sum.js");const m=Object(u.op)({gramSchmidt_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){let t;if(Array.isArray(e)){t=!1,Object(o.assert)(null!=e&&e.length>0,(()=>"Gram-Schmidt process: input must not be null, undefined, or empty"));const n=e[0].shape[0];for(let t=1;t`Gram-Schmidt: Non-unique lengths found in the input vectors: (${e[t].shape[0]} vs. ${n})`))}else t=!0,e=Object(d.split)(e,e.shape[0],0).map((e=>Object(l.squeeze)(e,[0])));Object(o.assert)(e.length<=e[0].shape[0],(()=>`Gram-Schmidt: Number of vectors (${e.length}) exceeds number of dimensions (${e[0].shape[0]}).`));const n=[],u=e;for(let t=0;t{let e=u[t];if(t>0)for(let s=0;s{Object(r.assert)(2===e.shape.length,(()=>`qr2d() requires a 2D Tensor, but got a ${e.shape.length}D Tensor.`));const n=e.shape[0],h=e.shape[1];let b=Object(d.eye)(n),g=Object(i.clone)(e);const v=Object(_.tensor2d)([[1]],[1,1]);let y=Object(i.clone)(v);const O=n>=h?h:n;for(let e=0;e{const t=Object(j.slice)(g,[e,e],[n-e,1]),s=Object(m.norm)(t),o=Object(j.slice)(g,[e,e],[1,1]),r=Object(x.where)(Object(l.greater)(o,0),Object(_.tensor2d)([[-1]]),Object(_.tensor2d)([[1]])),d=Object(w.sub)(o,Object(f.mul)(r,s)),O=Object(u.div)(t,d);y=1===O.shape[0]?Object(i.clone)(v):Object(a.concat)([v,Object(j.slice)(O,[1,0],[O.shape[0]-1,O.shape[1]])],0);const I=Object(p.neg)(Object(u.div)(Object(c.matMul)(r,d),s)),C=Object(j.slice)(g,[e,0],[n-e,h]),S=Object(f.mul)(I,y),T=Object(k.transpose)(y);if(0===e)g=Object(w.sub)(C,Object(c.matMul)(S,Object(c.matMul)(T,C)));else{const t=Object(w.sub)(C,Object(c.matMul)(S,Object(c.matMul)(T,C)));g=Object(a.concat)([Object(j.slice)(g,[0,0],[e,h]),t],0)}const N=Object(k.transpose)(S),E=Object(j.slice)(b,[0,e],[n,b.shape[1]-e]);if(0===e)b=Object(w.sub)(E,Object(c.matMul)(Object(c.matMul)(E,y),N));else{const t=Object(w.sub)(E,Object(c.matMul)(Object(c.matMul)(E,y),N));b=Object(a.concat)([Object(j.slice)(b,[0,0],[n,e]),t],1)}return[y,g,b]})),Object(o.dispose)([t,r,d])}return!t&&n>h&&(b=Object(j.slice)(b,[0,0],[n,h]),g=Object(j.slice)(g,[0,0],[h,h])),[b,g]}))}const O=Object(h.op)({qr_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t=!1){if(Object(r.assert)(e.rank>=2,(()=>`qr() requires input tensor to have a rank >= 2, but got rank ${e.rank}`)),2===e.rank)return y(e,t);{const n=e.shape.slice(0,e.shape.length-2).reduce(((e,t)=>e*t)),s=Object(v.unstack)(Object(b.reshape)(e,[n,e.shape[e.shape.length-2],e.shape[e.shape.length-1]]),0),o=[],r=[];s.forEach((e=>{const[n,s]=y(e,t);o.push(n),r.push(s)}));return[Object(b.reshape)(Object(g.stack)(o,0),e.shape),Object(b.reshape)(Object(g.stack)(r,0),e.shape)]}}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/linspace.js": +/*!*****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/linspace.js ***! + \*****************************************************************/ +/*! exports provided: linspace */function(e,t,n){"use strict";n.r(t),n.d(t,"linspace",(function(){return r}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e,t,n){if(n<=0)throw new Error("The number of values should be positive.");const r={start:e,stop:t,num:n};return s.ENGINE.runKernel(o.LinSpace,{},r)}},"./node_modules/@tensorflow/tfjs-core/dist/ops/local_response_normalization.js": +/*!*************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/local_response_normalization.js ***! + \*************************************************************************************/ +/*! exports provided: localResponseNormalization */function(e,t,n){"use strict";n.r(t),n.d(t,"localResponseNormalization",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),u=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const d=Object(a.op)({localResponseNormalization_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t=5,n=1,a=1,d=.5){const l=Object(r.convertToTensor)(e,"x","localResponseNormalization");i.assert(4===l.rank||3===l.rank,(()=>`Error in localResponseNormalization: x must be rank 3 or 4 but got\n rank ${l.rank}.`)),i.assert(i.isInt(t),(()=>`Error in localResponseNormalization: depthRadius must be an integer but got depthRadius ${t}.`));let c=l,f=!1;3===l.rank&&(f=!0,c=Object(u.reshape)(l,[1,l.shape[0],l.shape[1],l.shape[2]]));const p={x:c},m={depthRadius:t,bias:n,alpha:a,beta:d},h=s.ENGINE.runKernel(o.LRN,p,m);return f?Object(u.reshape)(h,[h.shape[1],h.shape[2],h.shape[3]]):h}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/log.js": +/*!************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/log.js ***! + \************************************************************/ +/*! exports provided: log */function(e,t,n){"use strict";n.r(t),n.d(t,"log",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({log_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){const t={x:Object(r.convertToTensor)(e,"x","log")};return s.ENGINE.runKernel(o.Log,t)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/log1p.js": +/*!**************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/log1p.js ***! + \**************************************************************/ +/*! exports provided: log1p */function(e,t,n){"use strict";n.r(t),n.d(t,"log1p",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({log1p_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){const t={x:Object(r.convertToTensor)(e,"x","log1p")};return s.ENGINE.runKernel(o.Log1p,t)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/log_sigmoid.js": +/*!********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/log_sigmoid.js ***! + \********************************************************************/ +/*! exports provided: logSigmoid */function(e,t,n){"use strict";n.r(t),n.d(t,"logSigmoid",(function(){return l}));var s=n(/*! ../gradients */"./node_modules/@tensorflow/tfjs-core/dist/gradients.js"),o=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),r=n(/*! ./mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),i=n(/*! ./neg */"./node_modules/@tensorflow/tfjs-core/dist/ops/neg.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),u=n(/*! ./sigmoid */"./node_modules/@tensorflow/tfjs-core/dist/ops/sigmoid.js"),d=n(/*! ./softplus */"./node_modules/@tensorflow/tfjs-core/dist/ops/softplus.js");const l=Object(a.op)({logSigmoid_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){const t=Object(o.convertToTensor)(e,"x","logSigmoid");return Object(s.customGrad)((e=>({value:Object(i.neg)(Object(d.softplus)(Object(i.neg)(e))),gradFunc:t=>Object(r.mul)(t,Object(u.sigmoid)(Object(i.neg)(e)))})))(t)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/log_softmax.js": +/*!********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/log_softmax.js ***! + \********************************************************************/ +/*! exports provided: logSoftmax */function(e,t,n){"use strict";n.r(t),n.d(t,"logSoftmax",(function(){return p}));var s=n(/*! ../gradients */"./node_modules/@tensorflow/tfjs-core/dist/gradients.js"),o=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),r=n(/*! ./cast */"./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"),i=n(/*! ./exp */"./node_modules/@tensorflow/tfjs-core/dist/ops/exp.js"),a=n(/*! ./log */"./node_modules/@tensorflow/tfjs-core/dist/ops/log.js"),u=n(/*! ./max */"./node_modules/@tensorflow/tfjs-core/dist/ops/max.js"),d=n(/*! ./mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),l=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),c=n(/*! ./sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"),f=n(/*! ./sum */"./node_modules/@tensorflow/tfjs-core/dist/ops/sum.js");const p=Object(l.op)({logSoftmax_: +/** + * @license + * Copyright 2020 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t=-1){const n=Object(o.convertToTensor)(e,"logits","logSoftmax");if(-1===t&&(t=n.rank-1),t!==n.rank-1)throw Error(`Log Softmax along a non-last dimension is not yet supported. Logits was rank ${n.rank} and axis was ${t}`);return Object(s.customGrad)(((e,n)=>{const s=Object(u.max)(e,t,!0),o=Object(c.sub)(e,s),l=Object(c.sub)(Object(r.cast)(o,"float32"),Object(a.log)(Object(f.sum)(Object(i.exp)(o),t,!0)));n([l]);return{value:l,gradFunc:(e,n)=>{const[s]=n,o=Object(i.exp)(s);return Object(c.sub)(e,Object(d.mul)(Object(f.sum)(e,t,!0),o))}}}))(n)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/log_sum_exp.js": +/*!********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/log_sum_exp.js ***! + \********************************************************************/ +/*! exports provided: logSumExp */function(e,t,n){"use strict";n.r(t),n.d(t,"logSumExp",(function(){return m}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),i=n(/*! ./axis_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/axis_util.js"),a=n(/*! ./exp */"./node_modules/@tensorflow/tfjs-core/dist/ops/exp.js"),u=n(/*! ./log */"./node_modules/@tensorflow/tfjs-core/dist/ops/log.js"),d=n(/*! ./max */"./node_modules/@tensorflow/tfjs-core/dist/ops/max.js"),l=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),c=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"),f=n(/*! ./sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"),p=n(/*! ./sum */"./node_modules/@tensorflow/tfjs-core/dist/ops/sum.js");const m=Object(l.op)({logSumExp_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t=null,n=!1){const l=Object(s.convertToTensor)(e,"x","logSumExp"),m=Object(o.parseAxisParam)(t,l.shape),h=Object(d.max)(l,m,!0),b=Object(f.sub)(l,h),j=Object(a.exp)(b),g=Object(p.sum)(j,m),w=Object(u.log)(g),_=Object(r.add)(Object(c.reshape)(h,w.shape),w);if(n){const e=Object(i.expandShapeToKeepDim)(_.shape,m);return Object(c.reshape)(_,e)}return _}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/logical_and.js": +/*!********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/logical_and.js ***! + \********************************************************************/ +/*! exports provided: logicalAnd */function(e,t,n){"use strict";n.r(t),n.d(t,"logicalAnd",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./broadcast_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(a.op)({logicalAnd_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t){const n=Object(r.convertToTensor)(e,"a","logicalAnd","bool"),a=Object(r.convertToTensor)(t,"b","logicalAnd","bool");Object(i.assertAndGetBroadcastShape)(n.shape,a.shape);const u={a:n,b:a};return s.ENGINE.runKernel(o.LogicalAnd,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/logical_not.js": +/*!********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/logical_not.js ***! + \********************************************************************/ +/*! exports provided: logicalNot */function(e,t,n){"use strict";n.r(t),n.d(t,"logicalNot",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({logicalNot_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){const t={x:Object(r.convertToTensor)(e,"x","logicalNot","bool")};return s.ENGINE.runKernel(o.LogicalNot,t)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/logical_or.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/logical_or.js ***! + \*******************************************************************/ +/*! exports provided: logicalOr */function(e,t,n){"use strict";n.r(t),n.d(t,"logicalOr",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./broadcast_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(a.op)({logicalOr_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t){const n=Object(r.convertToTensor)(e,"a","logicalOr","bool"),a=Object(r.convertToTensor)(t,"b","logicalOr","bool");Object(i.assertAndGetBroadcastShape)(n.shape,a.shape);const u={a:n,b:a};return s.ENGINE.runKernel(o.LogicalOr,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/logical_xor.js": +/*!********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/logical_xor.js ***! + \********************************************************************/ +/*! exports provided: logicalXor */function(e,t,n){"use strict";n.r(t),n.d(t,"logicalXor",(function(){return d}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ./broadcast_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js"),r=n(/*! ./logical_and */"./node_modules/@tensorflow/tfjs-core/dist/ops/logical_and.js"),i=n(/*! ./logical_not */"./node_modules/@tensorflow/tfjs-core/dist/ops/logical_not.js"),a=n(/*! ./logical_or */"./node_modules/@tensorflow/tfjs-core/dist/ops/logical_or.js"),u=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(u.op)({logicalXor_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t){const n=Object(s.convertToTensor)(e,"a","logicalXor","bool"),u=Object(s.convertToTensor)(t,"b","logicalXor","bool");return Object(o.assertAndGetBroadcastShape)(n.shape,u.shape),Object(r.logicalAnd)(Object(a.logicalOr)(e,t),Object(i.logicalNot)(Object(r.logicalAnd)(e,t)))}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/loss_ops_utils.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/loss_ops_utils.js ***! + \***********************************************************************/ +/*! exports provided: Reduction */function(e,t,n){"use strict"; +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var s;n.r(t),n.d(t,"Reduction",(function(){return s})),function(e){e[e.NONE=0]="NONE",e[e.MEAN=1]="MEAN",e[e.SUM=2]="SUM",e[e.SUM_BY_NONZERO_WEIGHTS=3]="SUM_BY_NONZERO_WEIGHTS"}(s||(s={}))},"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/absolute_difference.js": +/*!***********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/losses/absolute_difference.js ***! + \***********************************************************************************/ +/*! exports provided: absoluteDifference */function(e,t,n){"use strict";n.r(t),n.d(t,"absoluteDifference",(function(){return l}));var s=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ../abs */"./node_modules/@tensorflow/tfjs-core/dist/ops/abs.js"),i=n(/*! ../loss_ops_utils */"./node_modules/@tensorflow/tfjs-core/dist/ops/loss_ops_utils.js"),a=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),u=n(/*! ../sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"),d=n(/*! ./compute_weighted_loss */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/compute_weighted_loss.js");const l=Object(a.op)({absoluteDifference_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n,a=i.Reduction.SUM_BY_NONZERO_WEIGHTS){const l=Object(s.convertToTensor)(e,"labels","absoluteDifference"),c=Object(s.convertToTensor)(t,"predictions","absoluteDifference");let f=null;null!=n&&(f=Object(s.convertToTensor)(n,"weights","absoluteDifference")),Object(o.assertShapesMatch)(l.shape,c.shape,"Error in absoluteDifference: ");const p=Object(r.abs)(Object(u.sub)(l,c));return Object(d.computeWeightedLoss)(p,f,a)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/compute_weighted_loss.js": +/*!*************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/losses/compute_weighted_loss.js ***! + \*************************************************************************************/ +/*! exports provided: computeWeightedLoss */function(e,t,n){"use strict";n.r(t),n.d(t,"computeWeightedLoss",(function(){return m}));var s=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../cast */"./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"),r=n(/*! ../div */"./node_modules/@tensorflow/tfjs-core/dist/ops/div.js"),i=n(/*! ../loss_ops_utils */"./node_modules/@tensorflow/tfjs-core/dist/ops/loss_ops_utils.js"),a=n(/*! ../mean */"./node_modules/@tensorflow/tfjs-core/dist/ops/mean.js"),u=n(/*! ../mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),d=n(/*! ../not_equal */"./node_modules/@tensorflow/tfjs-core/dist/ops/not_equal.js"),l=n(/*! ../ones */"./node_modules/@tensorflow/tfjs-core/dist/ops/ones.js"),c=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),f=n(/*! ../scalar */"./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"),p=n(/*! ../sum */"./node_modules/@tensorflow/tfjs-core/dist/ops/sum.js");const m=Object(c.op)({computeWeightedLoss_:function(e,t,n=i.Reduction.SUM_BY_NONZERO_WEIGHTS){const c=Object(s.convertToTensor)(e,"losses","computeWeightedLoss");let m=null;null!=t&&(m=Object(s.convertToTensor)(t,"weights","computeWeightedLoss"));const h=null==m?c:Object(u.mul)(c,m);if(n===i.Reduction.NONE)return h;if(n===i.Reduction.SUM)return Object(p.sum)(h);if(n===i.Reduction.MEAN){if(null==m)return Object(a.mean)(h);{const e=c.size/m.size,t=Object(r.div)(Object(p.sum)(h),Object(p.sum)(m));return e>1?Object(r.div)(t,Object(f.scalar)(e)):t}}if(n===i.Reduction.SUM_BY_NONZERO_WEIGHTS){if(null==m)return Object(r.div)(Object(p.sum)(h),Object(f.scalar)(c.size));{const e=Object(u.mul)(m,Object(l.ones)(c.shape)),t=Object(o.cast)(Object(p.sum)(Object(d.notEqual)(e,Object(f.scalar)(0))),"float32");return Object(r.div)(Object(p.sum)(h),t)}}throw Error(`Unknown reduction: ${n}`)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/cosine_distance.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/losses/cosine_distance.js ***! + \*******************************************************************************/ +/*! exports provided: cosineDistance */function(e,t,n){"use strict";n.r(t),n.d(t,"cosineDistance",(function(){return f}));var s=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ../loss_ops_utils */"./node_modules/@tensorflow/tfjs-core/dist/ops/loss_ops_utils.js"),i=n(/*! ../mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),a=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),u=n(/*! ../scalar */"./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"),d=n(/*! ../sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"),l=n(/*! ../sum */"./node_modules/@tensorflow/tfjs-core/dist/ops/sum.js"),c=n(/*! ./compute_weighted_loss */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/compute_weighted_loss.js");const f=Object(a.op)({cosineDistance_:function(e,t,n,a,f=r.Reduction.SUM_BY_NONZERO_WEIGHTS){const p=Object(s.convertToTensor)(e,"labels","cosineDistance"),m=Object(s.convertToTensor)(t,"predictions","cosineDistance");let h=null;null!=a&&(h=Object(s.convertToTensor)(a,"weights","cosineDistance")),Object(o.assertShapesMatch)(p.shape,m.shape,"Error in cosineDistance: ");const b=Object(u.scalar)(1),j=Object(d.sub)(b,Object(l.sum)(Object(i.mul)(p,m),n,!0));return Object(c.computeWeightedLoss)(j,h,f)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/hinge_loss.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/losses/hinge_loss.js ***! + \**************************************************************************/ +/*! exports provided: hingeLoss */function(e,t,n){"use strict";n.r(t),n.d(t,"hingeLoss",(function(){return f}));var s=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ../loss_ops_utils */"./node_modules/@tensorflow/tfjs-core/dist/ops/loss_ops_utils.js"),i=n(/*! ../mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),a=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),u=n(/*! ../relu */"./node_modules/@tensorflow/tfjs-core/dist/ops/relu.js"),d=n(/*! ../scalar */"./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"),l=n(/*! ../sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"),c=n(/*! ./compute_weighted_loss */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/compute_weighted_loss.js");const f=Object(a.op)({hingeLoss_:function(e,t,n,a=r.Reduction.SUM_BY_NONZERO_WEIGHTS){let f=Object(s.convertToTensor)(e,"labels","hingeLoss");const p=Object(s.convertToTensor)(t,"predictions","hingeLoss");let m=null;null!=n&&(m=Object(s.convertToTensor)(n,"weights","hingeLoss")),Object(o.assertShapesMatch)(f.shape,p.shape,"Error in hingeLoss: ");const h=Object(d.scalar)(1);f=Object(l.sub)(Object(i.mul)(Object(d.scalar)(2),f),h);const b=Object(u.relu)(Object(l.sub)(h,Object(i.mul)(f,p)));return Object(c.computeWeightedLoss)(b,m,a)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/huber_loss.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/losses/huber_loss.js ***! + \**************************************************************************/ +/*! exports provided: huberLoss */function(e,t,n){"use strict";n.r(t),n.d(t,"huberLoss",(function(){return h}));var s=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ../abs */"./node_modules/@tensorflow/tfjs-core/dist/ops/abs.js"),i=n(/*! ../add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),a=n(/*! ../loss_ops_utils */"./node_modules/@tensorflow/tfjs-core/dist/ops/loss_ops_utils.js"),u=n(/*! ../minimum */"./node_modules/@tensorflow/tfjs-core/dist/ops/minimum.js"),d=n(/*! ../mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),l=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),c=n(/*! ../scalar */"./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"),f=n(/*! ../square */"./node_modules/@tensorflow/tfjs-core/dist/ops/square.js"),p=n(/*! ../sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"),m=n(/*! ./compute_weighted_loss */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/compute_weighted_loss.js");const h=Object(l.op)({huberLoss_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n,l=1,h=a.Reduction.SUM_BY_NONZERO_WEIGHTS){const b=Object(s.convertToTensor)(e,"labels","huberLoss"),j=Object(s.convertToTensor)(t,"predictions","huberLoss");let g=null;null!=n&&(g=Object(s.convertToTensor)(n,"weights","huberLoss")),Object(o.assertShapesMatch)(b.shape,j.shape,"Error in huberLoss: ");const w=Object(c.scalar)(l),_=Object(r.abs)(Object(p.sub)(j,b)),k=Object(u.minimum)(_,w),v=Object(p.sub)(_,k),x=Object(i.add)(Object(d.mul)(Object(c.scalar)(.5),Object(f.square)(k)),Object(d.mul)(w,v));return Object(m.computeWeightedLoss)(x,g,h)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/log_loss.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/losses/log_loss.js ***! + \************************************************************************/ +/*! exports provided: logLoss */function(e,t,n){"use strict";n.r(t),n.d(t,"logLoss",(function(){return m}));var s=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ../add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),i=n(/*! ../log */"./node_modules/@tensorflow/tfjs-core/dist/ops/log.js"),a=n(/*! ../loss_ops_utils */"./node_modules/@tensorflow/tfjs-core/dist/ops/loss_ops_utils.js"),u=n(/*! ../mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),d=n(/*! ../neg */"./node_modules/@tensorflow/tfjs-core/dist/ops/neg.js"),l=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),c=n(/*! ../scalar */"./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"),f=n(/*! ../sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"),p=n(/*! ./compute_weighted_loss */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/compute_weighted_loss.js");const m=Object(l.op)({logLoss_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n,l=1e-7,m=a.Reduction.SUM_BY_NONZERO_WEIGHTS){const h=Object(s.convertToTensor)(e,"labels","logLoss"),b=Object(s.convertToTensor)(t,"predictions","logLoss");let j=null;null!=n&&(j=Object(s.convertToTensor)(n,"weights","logLoss")),Object(o.assertShapesMatch)(h.shape,b.shape,"Error in logLoss: ");const g=Object(c.scalar)(1),w=Object(c.scalar)(l),_=Object(d.neg)(Object(u.mul)(h,Object(i.log)(Object(r.add)(b,w)))),k=Object(u.mul)(Object(f.sub)(g,h),Object(i.log)(Object(r.add)(Object(f.sub)(g,b),w))),v=Object(f.sub)(_,k);return Object(p.computeWeightedLoss)(v,j,m)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/mean_squared_error.js": +/*!**********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/losses/mean_squared_error.js ***! + \**********************************************************************************/ +/*! exports provided: meanSquaredError */function(e,t,n){"use strict";n.r(t),n.d(t,"meanSquaredError",(function(){return d}));var s=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ../loss_ops_utils */"./node_modules/@tensorflow/tfjs-core/dist/ops/loss_ops_utils.js"),i=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),a=n(/*! ../squared_difference */"./node_modules/@tensorflow/tfjs-core/dist/ops/squared_difference.js"),u=n(/*! ./compute_weighted_loss */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/compute_weighted_loss.js");const d=Object(i.op)({meanSquaredError_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n,i=r.Reduction.SUM_BY_NONZERO_WEIGHTS){const d=Object(s.convertToTensor)(e,"labels","meanSquaredError"),l=Object(s.convertToTensor)(t,"predictions","meanSquaredError");let c=null;null!=n&&(c=Object(s.convertToTensor)(n,"weights","meanSquaredError")),Object(o.assertShapesMatch)(d.shape,l.shape,"Error in meanSquaredError: ");const f=Object(a.squaredDifference)(d,l);return Object(u.computeWeightedLoss)(f,c,i)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/sigmoid_cross_entropy.js": +/*!*************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/losses/sigmoid_cross_entropy.js ***! + \*************************************************************************************/ +/*! exports provided: sigmoidCrossEntropy */function(e,t,n){"use strict";n.r(t),n.d(t,"sigmoidCrossEntropy",(function(){return j}));var s=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ../abs */"./node_modules/@tensorflow/tfjs-core/dist/ops/abs.js"),i=n(/*! ../add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),a=n(/*! ../exp */"./node_modules/@tensorflow/tfjs-core/dist/ops/exp.js"),u=n(/*! ../log1p */"./node_modules/@tensorflow/tfjs-core/dist/ops/log1p.js"),d=n(/*! ../loss_ops_utils */"./node_modules/@tensorflow/tfjs-core/dist/ops/loss_ops_utils.js"),l=n(/*! ../mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),c=n(/*! ../neg */"./node_modules/@tensorflow/tfjs-core/dist/ops/neg.js"),f=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),p=n(/*! ../relu */"./node_modules/@tensorflow/tfjs-core/dist/ops/relu.js"),m=n(/*! ../scalar */"./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"),h=n(/*! ../sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"),b=n(/*! ./compute_weighted_loss */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/compute_weighted_loss.js");const j=Object(f.op)({sigmoidCrossEntropy_:function(e,t,n,f=0,j=d.Reduction.SUM_BY_NONZERO_WEIGHTS){let g=Object(s.convertToTensor)(e,"multiClassLabels","sigmoidCrossEntropy");const w=Object(s.convertToTensor)(t,"logits","sigmoidCrossEntropy");let _=null;if(null!=n&&(_=Object(s.convertToTensor)(n,"weights","sigmoidCrossEntropy")),Object(o.assertShapesMatch)(g.shape,w.shape,"Error in sigmoidCrossEntropy: "),f>0){const e=Object(m.scalar)(f),t=Object(m.scalar)(1),n=Object(m.scalar)(.5);g=Object(i.add)(Object(l.mul)(g,Object(h.sub)(t,e)),Object(l.mul)(n,e))}const k= +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t){const n=Object(s.convertToTensor)(e,"labels","sigmoidCrossEntropyWithLogits"),d=Object(s.convertToTensor)(t,"logits","sigmoidCrossEntropyWithLogits");Object(o.assertShapesMatch)(n.shape,d.shape,"Error in sigmoidCrossEntropyWithLogits: ");const f=Object(p.relu)(d),m=Object(l.mul)(d,n),b=Object(u.log1p)(Object(a.exp)(Object(c.neg)(Object(r.abs)(d))));return Object(i.add)(Object(h.sub)(f,m),b)}(g,w);return Object(b.computeWeightedLoss)(k,_,j)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/softmax_cross_entropy.js": +/*!*************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/losses/softmax_cross_entropy.js ***! + \*************************************************************************************/ +/*! exports provided: softmaxCrossEntropy */function(e,t,n){"use strict";n.r(t),n.d(t,"softmaxCrossEntropy",(function(){return k}));var s=n(/*! ../../gradients */"./node_modules/@tensorflow/tfjs-core/dist/gradients.js"),o=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),r=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),i=n(/*! ../add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),a=n(/*! ../axis_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/axis_util.js"),u=n(/*! ../cast */"./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"),d=n(/*! ../div */"./node_modules/@tensorflow/tfjs-core/dist/ops/div.js"),l=n(/*! ../exp */"./node_modules/@tensorflow/tfjs-core/dist/ops/exp.js"),c=n(/*! ../log_sum_exp */"./node_modules/@tensorflow/tfjs-core/dist/ops/log_sum_exp.js"),f=n(/*! ../loss_ops_utils */"./node_modules/@tensorflow/tfjs-core/dist/ops/loss_ops_utils.js"),p=n(/*! ../mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),m=n(/*! ../neg */"./node_modules/@tensorflow/tfjs-core/dist/ops/neg.js"),h=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),b=n(/*! ../reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"),j=n(/*! ../scalar */"./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"),g=n(/*! ../sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"),w=n(/*! ../sum */"./node_modules/@tensorflow/tfjs-core/dist/ops/sum.js"),_=n(/*! ./compute_weighted_loss */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/compute_weighted_loss.js");const k=Object(h.op)({softmaxCrossEntropy_:function(e,t,n,h=0,k=f.Reduction.SUM_BY_NONZERO_WEIGHTS){let v=Object(o.convertToTensor)(e,"onehotLabels","softmaxCrossEntropy");const x=Object(o.convertToTensor)(t,"logits","softmaxCrossEntropy");let y=null;if(null!=n&&(y=Object(o.convertToTensor)(n,"weights","softmaxCrossEntropy")),Object(r.assertShapesMatch)(v.shape,x.shape,"Error in softmaxCrossEntropy: "),h>0){const e=Object(j.scalar)(h),t=Object(j.scalar)(1),n=Object(j.scalar)(v.shape[1]);v=Object(i.add)(Object(p.mul)(v,Object(g.sub)(t,e)),Object(d.div)(e,n))}const O= +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n=-1){if(-1===n&&(n=t.rank-1),n!==t.rank-1)throw Error(`Softmax cross entropy along a non-last dimension is not yet supported. Labels / logits was rank ${t.rank} and dim was ${n}`);return Object(s.customGrad)(((e,t,s)=>{const o=Object(c.logSumExp)(t,[n],!0),r=Object(g.sub)(Object(u.cast)(t,"float32"),o);s([e,r]);const i=Object(m.neg)(Object(p.mul)(r,e));return{value:Object(w.sum)(i,[n]),gradFunc:(e,t)=>{const[s,o]=t,r=Object(a.expandShapeToKeepDim)(e.shape,[n]);return[Object(p.mul)(Object(b.reshape)(e,r),Object(g.sub)(Object(u.cast)(s,"float32"),Object(l.exp)(o))),Object(p.mul)(Object(b.reshape)(e,r),Object(g.sub)(Object(l.exp)(o),Object(u.cast)(s,"float32")))]}}}))(e,t)}(v,x);return Object(_.computeWeightedLoss)(O,y,k)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/mat_mul.js": +/*!****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/mat_mul.js ***! + \****************************************************************/ +/*! exports provided: matMul */function(e,t,n){"use strict";n.r(t),n.d(t,"matMul",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),i=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(a.op)({matMul_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n=!1,a=!1){let u=Object(i.convertToTensor)(e,"a","matMul"),d=Object(i.convertToTensor)(t,"b","matMul");[u,d]=Object(r.makeTypesMatch)(u,d);const l={a:u,b:d},c={transposeA:n,transposeB:a};return s.ENGINE.runKernel(o.BatchMatMul,l,c)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/max.js": +/*!************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/max.js ***! + \************************************************************/ +/*! exports provided: max */function(e,t,n){"use strict";n.r(t),n.d(t,"max",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({max_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t=null,n=!1){const i={x:Object(r.convertToTensor)(e,"x","max")},a={reductionIndices:t,keepDims:n};return s.ENGINE.runKernel(o.Max,i,a)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/max_pool.js": +/*!*****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/max_pool.js ***! + \*****************************************************************/ +/*! exports provided: maxPool */function(e,t,n){"use strict";n.r(t),n.d(t,"maxPool",(function(){return l}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./conv_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/conv_util.js"),u=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),d=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const l=Object(u.op)({maxPool_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n,u,l){const c=Object(r.convertToTensor)(e,"x","maxPool");let f=c,p=!1;3===c.rank&&(p=!0,f=Object(d.reshape)(c,[1,c.shape[0],c.shape[1],c.shape[2]])),i.assert(4===f.rank,(()=>`Error in maxPool: input must be rank 4 but got rank ${f.rank}.`)),i.assert(a.eitherStridesOrDilationsAreOne(n,1),(()=>`Error in maxPool: Either strides or dilations must be 1. Got strides ${n} and dilations '1'`)),null!=l&&i.assert(i.isInt(u),(()=>`Error in maxPool: pad must be an integer when using, dimRoundingMode ${l} but got pad ${u}.`));const m={x:f},h={filterSize:t,strides:n,pad:u,dimRoundingMode:l},b=s.ENGINE.runKernel(o.MaxPool,m,h);return p?Object(d.reshape)(b,[b.shape[1],b.shape[2],b.shape[3]]):b}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/max_pool_3d.js": +/*!********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/max_pool_3d.js ***! + \********************************************************************/ +/*! exports provided: maxPool3d */function(e,t,n){"use strict";n.r(t),n.d(t,"maxPool3d",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),u=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const d=Object(a.op)({maxPool3d_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t=[1,1,1],n,a,d,l="NDHWC"){const c=Object(r.convertToTensor)(e,"x","maxPool3d");let f=c,p=!1;4===c.rank&&(p=!0,f=Object(u.reshape)(c,[1,c.shape[0],c.shape[1],c.shape[2],c.shape[3]])),i.assert(5===f.rank,(()=>`Error in maxPool3d: x must be rank 5 but got rank ${f.rank}.`)),i.assert("NDHWC"===l,(()=>`Error in maxPool3d: Only NDHWC is currently supported, but got dataFormat of ${l}`)),null!=d&&i.assert(i.isInt(a),(()=>`Error in maxPool3d: pad must be an integer when using, dimRoundingMode ${d} but got pad ${a}.`));const m={x:f},h={filterSize:t,strides:n,pad:a,dimRoundingMode:d,dataFormat:l},b=s.ENGINE.runKernel(o.MaxPool3D,m,h);return p?Object(u.reshape)(b,[b.shape[1],b.shape[2],b.shape[3],b.shape[4]]):b}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/max_pool_with_argmax.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/max_pool_with_argmax.js ***! + \*****************************************************************************/ +/*! exports provided: maxPoolWithArgmax */function(e,t,n){"use strict";n.r(t),n.d(t,"maxPoolWithArgmax",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({maxPoolWithArgmax_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n,i,a=!1){const u={x:Object(r.convertToTensor)(e,"x","maxPoolWithArgmax")},d={filterSize:t,strides:n,pad:i,includeBatchInIndex:a},l=s.ENGINE.runKernel(o.MaxPoolWithArgmax,u,d);return{result:l[0],indexes:l[1]}}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/maximum.js": +/*!****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/maximum.js ***! + \****************************************************************/ +/*! exports provided: maximum */function(e,t,n){"use strict";n.r(t),n.d(t,"maximum",(function(){return l}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),i=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),a=n(/*! ./broadcast_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js"),u=n(/*! ./cast */"./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"),d=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const l=Object(d.op)({maximum_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t){let n=Object(i.convertToTensor)(e,"a","maximum"),d=Object(i.convertToTensor)(t,"b","maximum");[n,d]=Object(r.makeTypesMatch)(n,d),"bool"===n.dtype&&(n=Object(u.cast)(n,"int32"),d=Object(u.cast)(d,"int32")),Object(a.assertAndGetBroadcastShape)(n.shape,d.shape);const l={a:n,b:d};return s.ENGINE.runKernel(o.Maximum,l)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/mean.js": +/*!*************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/mean.js ***! + \*************************************************************/ +/*! exports provided: mean */function(e,t,n){"use strict";n.r(t),n.d(t,"mean",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({mean_: +/** + * @license + * Copyright 2020 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t=null,n=!1){const i={x:Object(r.convertToTensor)(e,"x","mean")},a={axis:t,keepDims:n};return s.ENGINE.runKernel(o.Mean,i,a)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/meshgrid.js": +/*!*****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/meshgrid.js ***! + \*****************************************************************/ +/*! exports provided: meshgrid */function(e,t,n){"use strict";n.r(t),n.d(t,"meshgrid",(function(){return d}));var s=n(/*! ./mat_mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mat_mul.js"),o=n(/*! ./ones */"./node_modules/@tensorflow/tfjs-core/dist/ops/ones.js"),r=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"),i=n(/*! ../tensor */"./node_modules/@tensorflow/tfjs-core/dist/tensor.js"),a=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),u=n(/*! ../util_base */"./node_modules/@tensorflow/tfjs-core/dist/util_base.js"); +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function d(e,t,{indexing:n="xy"}={}){if("xy"!==n&&"ij"!==n)throw new TypeError(`${n} is not a valid third argument to meshgrid`);if(void 0===e)return[];let d=Object(a.convertToTensor)(e,"x","meshgrid",e instanceof i.Tensor?e.dtype:"float32");if(void 0===t)return[d];let l=Object(a.convertToTensor)(t,"y","meshgrid",t instanceof i.Tensor?t.dtype:"float32");const c=Object(u.sizeFromShape)(d.shape),f=Object(u.sizeFromShape)(l.shape);return"xy"===n?(d=Object(r.reshape)(d,[1,-1]),l=Object(r.reshape)(l,[-1,1]),[Object(s.matMul)(Object(o.ones)([f,1],d.dtype),d),Object(s.matMul)(l,Object(o.ones)([1,c],l.dtype))]):(d=Object(r.reshape)(d,[-1,1]),l=Object(r.reshape)(l,[1,-1]),[Object(s.matMul)(d,Object(o.ones)([1,f],d.dtype)),Object(s.matMul)(Object(o.ones)([c,1],l.dtype),l)])}},"./node_modules/@tensorflow/tfjs-core/dist/ops/min.js": +/*!************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/min.js ***! + \************************************************************/ +/*! exports provided: min */function(e,t,n){"use strict";n.r(t),n.d(t,"min",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({min_: +/** + * @license + * Copyright 2020 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t=null,n=!1){const i={x:Object(r.convertToTensor)(e,"x","min")},a={axis:t,keepDims:n};return s.ENGINE.runKernel(o.Min,i,a)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/minimum.js": +/*!****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/minimum.js ***! + \****************************************************************/ +/*! exports provided: minimum */function(e,t,n){"use strict";n.r(t),n.d(t,"minimum",(function(){return l}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),i=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),a=n(/*! ./broadcast_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js"),u=n(/*! ./cast */"./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"),d=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const l=Object(d.op)({minimum_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t){let n=Object(i.convertToTensor)(e,"a","minimum"),d=Object(i.convertToTensor)(t,"b","minimum");[n,d]=Object(r.makeTypesMatch)(n,d),"bool"===n.dtype&&(n=Object(u.cast)(n,"int32"),d=Object(u.cast)(d,"int32")),Object(a.assertAndGetBroadcastShape)(n.shape,d.shape);const l={a:n,b:d};return s.ENGINE.runKernel(o.Minimum,l)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/mirror_pad.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/mirror_pad.js ***! + \*******************************************************************/ +/*! exports provided: mirrorPad */function(e,t,n){"use strict";n.r(t),n.d(t,"mirrorPad",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(a.op)({mirrorPad_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n){i.assert("reflect"===n||"symmetric"===n,(()=>`Invalid mode. Mode must be either reflect or symmetric. Got ${n}.`));const a=Object(r.convertToTensor)(e,"x","mirrorPad");if(0===a.rank)throw new Error("mirrorPad(scalar) is not defined. Pass non-scalar to mirrorPad");i.assert(t.length===a.rank,(()=>`Padding doesn't match input. Must be ${a.rank}. Got ${t.length}.`));const u="reflect"===n?1:0;for(let e=0;e"Invalid number of paddings. Must be length of 2 each.")),i.assert(t[e][0]>=0&&t[e][0]<=a.shape[e]-u&&t[e][1]>=0&&t[e][1]<=a.shape[e]-u,(()=>`Padding in dimension ${e} cannot be greater than or equal to ${a.shape[e]-u} or less than 0 for input of shape ${a.shape}`));const d={paddings:t,mode:n},l={x:a};return s.ENGINE.runKernel(o.MirrorPad,l,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/mod.js": +/*!************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/mod.js ***! + \************************************************************/ +/*! exports provided: mod */function(e,t,n){"use strict";n.r(t),n.d(t,"mod",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),i=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(a.op)({mod_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t){let n=Object(i.convertToTensor)(e,"a","mod"),a=Object(i.convertToTensor)(t,"b","mod");[n,a]=Object(r.makeTypesMatch)(n,a);const u={a:n,b:a};return s.ENGINE.runKernel(o.Mod,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/moments.js": +/*!****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/moments.js ***! + \****************************************************************/ +/*! exports provided: moments */function(e,t,n){"use strict";n.r(t),n.d(t,"moments",(function(){return f}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./axis_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/axis_util.js"),i=n(/*! ./cast */"./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"),a=n(/*! ./mean */"./node_modules/@tensorflow/tfjs-core/dist/ops/mean.js"),u=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),d=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"),l=n(/*! ./square */"./node_modules/@tensorflow/tfjs-core/dist/ops/square.js"),c=n(/*! ./sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js");const f=Object(u.op)({moments_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t=null,n=!1){e=Object(s.convertToTensor)(e,"x","moments");const u=Object(o.parseAxisParam)(t,e.shape),f=Object(a.mean)(e,u,n);let p=f.shape;n||(p=Object(r.expandShapeToKeepDim)(f.shape,u));const m=Object(l.square)(Object(c.sub)(Object(i.cast)(e,"float32"),Object(d.reshape)(f,p)));return{mean:f,variance:Object(a.mean)(m,u,n)}}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/moving_average.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/moving_average.js ***! + \***********************************************************************/ +/*! exports provided: movingAverage */function(e,t,n){"use strict";n.r(t),n.d(t,"movingAverage",(function(){return p}));var s=n(/*! ../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),o=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),r=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),i=n(/*! ./add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),a=n(/*! ./div */"./node_modules/@tensorflow/tfjs-core/dist/ops/div.js"),u=n(/*! ./mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),d=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),l=n(/*! ./pow */"./node_modules/@tensorflow/tfjs-core/dist/ops/pow.js"),c=n(/*! ./scalar */"./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"),f=n(/*! ./sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js");const p=Object(d.op)({movingAverage_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n,d,p=!0){const m=Object(o.convertToTensor)(e,"v","movingAverage"),h=Object(o.convertToTensor)(t,"x","movingAverage"),b=Object(o.convertToTensor)(n,"decay","movingAverage");Object(s.assertTypesMatch)(m,h),r.assert(r.arraysEqual(m.shape,h.shape),(()=>"Shape mismatch in v and x"));const j=Object(c.scalar)(1),g=Object(f.sub)(j,b);let w=Object(u.mul)(Object(f.sub)(h,m),g);if(p){r.assert(null!=d,(()=>"When using zeroDebias: true, step is required."));const e=Object(o.convertToTensor)(d,"step","movingAverage");w=Object(a.div)(w,Object(f.sub)(j,Object(l.pow)(b,e)))}return Object(i.add)(m,w)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js": +/*!************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js ***! + \************************************************************/ +/*! exports provided: mul */function(e,t,n){"use strict";n.r(t),n.d(t,"mul",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),i=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(a.op)({mul_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t){let n=Object(i.convertToTensor)(e,"a","mul"),a=Object(i.convertToTensor)(t,"b","mul");[n,a]=Object(r.makeTypesMatch)(n,a);const u={a:n,b:a};return s.ENGINE.runKernel(o.Multiply,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/multi_rnn_cell.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/multi_rnn_cell.js ***! + \***********************************************************************/ +/*! exports provided: multiRNNCell */function(e,t,n){"use strict";n.r(t),n.d(t,"multiRNNCell",(function(){return r}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const r=Object(o.op)({multiRNNCell_:function(e,t,n,o){const r=Object(s.convertToTensor)(t,"data","multiRNNCell"),i=Object(s.convertToTensorArray)(n,"c","multiRNNCell"),a=Object(s.convertToTensorArray)(o,"h","multiRNNCell");let u=r;const d=[];for(let t=0;t2)throw new Error(`Rank of probabilities must be 1 or 2, but is ${l}`);n=n||Math.random();const c={logits:1===l?Object(a.reshape)(u,[1,-1]):u},f={numSamples:t,seed:n,normalized:i},p=s.ENGINE.runKernel(o.Multinomial,c,f);return 1===l?Object(a.reshape)(p,[p.size]):p}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/neg.js": +/*!************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/neg.js ***! + \************************************************************/ +/*! exports provided: neg */function(e,t,n){"use strict";n.r(t),n.d(t,"neg",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({neg_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){const t={x:Object(r.convertToTensor)(e,"x","neg")};return s.ENGINE.runKernel(o.Neg,t)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/nonmax_util.js": +/*!********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/nonmax_util.js ***! + \********************************************************************/ +/*! exports provided: nonMaxSuppSanityCheck */function(e,t,n){"use strict";n.r(t),n.d(t,"nonMaxSuppSanityCheck",(function(){return o}));var s=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */function o(e,t,n,o,r,i){null==o&&(o=.5),null==r&&(r=Number.NEGATIVE_INFINITY),null==i&&(i=0);const a=e.shape[0];return n=Math.min(n,a),s.assert(0<=o&&o<=1,(()=>`iouThreshold must be in [0, 1], but was '${o}'`)),s.assert(2===e.rank,(()=>`boxes must be a 2D tensor, but was of rank '${e.rank}'`)),s.assert(4===e.shape[1],(()=>`boxes must have 4 columns, but 2nd dimension was ${e.shape[1]}`)),s.assert(1===t.rank,(()=>"scores must be a 1D tensor")),s.assert(t.shape[0]===a,(()=>`scores has incompatible shape with boxes. Expected ${a}, but was ${t.shape[0]}`)),s.assert(0<=i&&i<=1,(()=>`softNmsSigma must be in [0, 1], but was '${i}'`)),{maxOutputSize:n,iouThreshold:o,scoreThreshold:r,softNmsSigma:i}}},"./node_modules/@tensorflow/tfjs-core/dist/ops/norm.js": +/*!*************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/norm.js ***! + \*************************************************************/ +/*! exports provided: norm */function(e,t,n){"use strict";n.r(t),n.d(t,"norm",(function(){return j}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./abs */"./node_modules/@tensorflow/tfjs-core/dist/ops/abs.js"),i=n(/*! ./axis_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/axis_util.js"),a=n(/*! ./max */"./node_modules/@tensorflow/tfjs-core/dist/ops/max.js"),u=n(/*! ./min */"./node_modules/@tensorflow/tfjs-core/dist/ops/min.js"),d=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),l=n(/*! ./pow */"./node_modules/@tensorflow/tfjs-core/dist/ops/pow.js"),c=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"),f=n(/*! ./scalar */"./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"),p=n(/*! ./sqrt */"./node_modules/@tensorflow/tfjs-core/dist/ops/sqrt.js"),m=n(/*! ./square */"./node_modules/@tensorflow/tfjs-core/dist/ops/square.js"),h=n(/*! ./sum */"./node_modules/@tensorflow/tfjs-core/dist/ops/sum.js");function b(e,t,n=null){if(0===e.rank)return Object(r.abs)(e);if(1!==e.rank&&null===n)return b(Object(c.reshape)(e,[-1]),t,n);if(1===e.rank||"number"==typeof n||Array.isArray(n)&&1===n.length){if(1===t)return Object(h.sum)(Object(r.abs)(e),n);if(t===1/0)return Object(a.max)(Object(r.abs)(e),n);if(t===-1/0)return Object(u.min)(Object(r.abs)(e),n);if("euclidean"===t||2===t)return Object(p.sqrt)(Object(h.sum)(Object(l.pow)(Object(r.abs)(e),Object(f.scalar)(2,"int32")),n));throw new Error(`Error in norm: invalid ord value: ${t}`)}if(Array.isArray(n)&&2===n.length){if(1===t)return Object(a.max)(Object(h.sum)(Object(r.abs)(e),n[0]),n[1]-1);if(t===1/0)return Object(a.max)(Object(h.sum)(Object(r.abs)(e),n[1]),n[0]);if(t===-1/0)return Object(u.min)(Object(h.sum)(Object(r.abs)(e),n[1]),n[0]);if("fro"===t||"euclidean"===t)return Object(p.sqrt)(Object(h.sum)(Object(m.square)(e),n));throw new Error(`Error in norm: invalid ord value: ${t}`)}throw new Error(`Error in norm: invalid axis: ${n}`)}const j=Object(d.op)({norm_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t="euclidean",n=null,r=!1){const a=b(e=Object(s.convertToTensor)(e,"x","norm"),t,n);let u=a.shape;if(r){const t=Object(o.parseAxisParam)(n,e.shape);u=i.expandShapeToKeepDim(a.shape,t)}return Object(c.reshape)(a,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/not_equal.js": +/*!******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/not_equal.js ***! + \******************************************************************/ +/*! exports provided: notEqual */function(e,t,n){"use strict";n.r(t),n.d(t,"notEqual",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),i=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),a=n(/*! ./broadcast_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js"),u=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(u.op)({notEqual_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t){let n=Object(i.convertToTensor)(e,"a","notEqual","string_or_numeric"),u=Object(i.convertToTensor)(t,"b","notEqual","string_or_numeric");[n,u]=Object(r.makeTypesMatch)(n,u),Object(a.assertAndGetBroadcastShape)(n.shape,u.shape);const d={a:n,b:u};return s.ENGINE.runKernel(o.NotEqual,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/one_hot.js": +/*!****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/one_hot.js ***! + \****************************************************************/ +/*! exports provided: oneHot */function(e,t,n){"use strict";n.r(t),n.d(t,"oneHot",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({oneHot_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n=1,i=0){if(t<2)throw new Error(`Error in oneHot: depth must be >=2, but it is ${t}`);const a={indices:Object(r.convertToTensor)(e,"indices","oneHot","int32")},u={depth:t,onValue:n,offValue:i};return s.ENGINE.runKernel(o.OneHot,a,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/ones.js": +/*!*************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/ones.js ***! + \*************************************************************/ +/*! exports provided: ones */function(e,t,n){"use strict";n.r(t),n.d(t,"ones",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./complex */"./node_modules/@tensorflow/tfjs-core/dist/ops/complex.js"),i=n(/*! ./zeros */"./node_modules/@tensorflow/tfjs-core/dist/ops/zeros.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function a(e,t="float32"){if("complex64"===t){const t=a(e,"float32"),n=Object(i.zeros)(e,"float32");return Object(r.complex)(t,n)}const n=Object(o.makeOnesTypedArray)(Object(o.sizeFromShape)(e),t);return s.ENGINE.makeTensor(n,e,t)}},"./node_modules/@tensorflow/tfjs-core/dist/ops/ones_like.js": +/*!******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/ones_like.js ***! + \******************************************************************/ +/*! exports provided: onesLike */function(e,t,n){"use strict";n.r(t),n.d(t,"onesLike",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({onesLike_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){const t={x:Object(r.convertToTensor)(e,"x","onesLike")};return s.ENGINE.runKernel(o.OnesLike,t)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js": +/*!******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js ***! + \******************************************************************/ +/*! exports provided: OP_SCOPE_SUFFIX, op */function(e,t,n){"use strict";n.r(t),n.d(t,"OP_SCOPE_SUFFIX",(function(){return r})),n.d(t,"op",(function(){return i}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const r="__op";function i(e){const t=Object.keys(e);if(1!==t.length)throw new Error(`Please provide an object with a single key (operation name) mapping to a function. Got an object with ${t.length} keys.`);let n=t[0];const i=e[n];n.endsWith("_")&&(n=n.substring(0,n.length-1)),n+=r;const a=(...e)=>{s.ENGINE.startScope(n);try{const t=i(...e);return Object(o.isPromise)(t)&&console.error("Cannot return a Promise inside of tidy."),s.ENGINE.endScope(t),t}catch(e){throw s.ENGINE.endScope(null),e}};return Object.defineProperty(a,"name",{value:n,configurable:!0}),a}},"./node_modules/@tensorflow/tfjs-core/dist/ops/ops.js": +/*!************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/ops.js ***! + \************************************************************/ +/*! exports provided: abs, acos, acosh, add, addN, all, any, argMax, argMin, asin, asinh, atan, atan2, atanh, avgPool, avgPool3d, basicLSTMCell, batchToSpaceND, batchNorm, batchNorm2d, batchNorm3d, batchNorm4d, bincount, broadcastTo, buffer, cast, ceil, clipByValue, clone, complex, concat, concat1d, concat2d, concat3d, concat4d, conv1d, conv2d, conv2dTranspose, conv3d, conv3dTranspose, cos, cosh, cumsum, denseBincount, depthToSpace, depthwiseConv2d, diag, dilation2d, div, divNoNan, dot, einsum, elu, equal, erf, exp, expandDims, expm1, eye, fill, floor, floorDiv, gather, greater, greaterEqual, imag, isFinite, isInf, isNaN, leakyRelu, less, lessEqual, linspace, localResponseNormalization, log, log1p, logSigmoid, logSoftmax, logSumExp, logicalAnd, logicalNot, logicalOr, logicalXor, matMul, max, maxPool, maxPool3d, maxPoolWithArgmax, maximum, mean, meshgrid, min, minimum, mirrorPad, mod, moments, mul, multiRNNCell, multinomial, neg, notEqual, oneHot, ones, onesLike, outerProduct, pad, pad1d, pad2d, pad3d, pad4d, pool, pow, prelu, print, prod, rand, randomGamma, randomNormal, randomUniform, range, real, reciprocal, relu, relu6, reshape, reverse, reverse1d, reverse2d, reverse3d, reverse4d, round, rsqrt, scalar, selu, separableConv2d, setdiff1dAsync, sigmoid, sign, sin, sinh, slice, slice1d, slice2d, slice3d, slice4d, softmax, softplus, spaceToBatchND, fft, ifft, irfft, rfft, split, sqrt, square, squaredDifference, squeeze, stack, step, stridedSlice, sub, sum, tan, tanh, tensor, tensor1d, tensor2d, tensor3d, tensor4d, tensor5d, tensor6d, tile, topk, truncatedNormal, unique, unsortedSegmentSum, unstack, variable, where, whereAsync, zeros, zerosLike, booleanMaskAsync, transpose, norm, movingAverage, scatterND, sparseToDense, gatherND, dropout, enclosingPowerOfTwo, cosineWindow, inTopKAsync, op, OP_SCOPE_SUFFIX, image, linalg, losses, spectral, fused, signal, sparse, string */function(e,t,n){"use strict";n.r(t),n.d(t,"image",(function(){return _s})),n.d(t,"linalg",(function(){return ks})),n.d(t,"losses",(function(){return vs})),n.d(t,"spectral",(function(){return gs})),n.d(t,"signal",(function(){return ws})),n.d(t,"sparse",(function(){return xs})),n.d(t,"string",(function(){return ys}));var s=n(/*! ./abs */"./node_modules/@tensorflow/tfjs-core/dist/ops/abs.js");n.d(t,"abs",(function(){return s.abs}));var o=n(/*! ./acos */"./node_modules/@tensorflow/tfjs-core/dist/ops/acos.js");n.d(t,"acos",(function(){return o.acos}));var r=n(/*! ./acosh */"./node_modules/@tensorflow/tfjs-core/dist/ops/acosh.js");n.d(t,"acosh",(function(){return r.acosh}));var i=n(/*! ./add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js");n.d(t,"add",(function(){return i.add}));var a=n(/*! ./add_n */"./node_modules/@tensorflow/tfjs-core/dist/ops/add_n.js");n.d(t,"addN",(function(){return a.addN}));var u=n(/*! ./all */"./node_modules/@tensorflow/tfjs-core/dist/ops/all.js");n.d(t,"all",(function(){return u.all}));var d=n(/*! ./any */"./node_modules/@tensorflow/tfjs-core/dist/ops/any.js");n.d(t,"any",(function(){return d.any}));var l=n(/*! ./arg_max */"./node_modules/@tensorflow/tfjs-core/dist/ops/arg_max.js");n.d(t,"argMax",(function(){return l.argMax}));var c=n(/*! ./arg_min */"./node_modules/@tensorflow/tfjs-core/dist/ops/arg_min.js");n.d(t,"argMin",(function(){return c.argMin}));var f=n(/*! ./asin */"./node_modules/@tensorflow/tfjs-core/dist/ops/asin.js");n.d(t,"asin",(function(){return f.asin}));var p=n(/*! ./asinh */"./node_modules/@tensorflow/tfjs-core/dist/ops/asinh.js");n.d(t,"asinh",(function(){return p.asinh}));var m=n(/*! ./atan */"./node_modules/@tensorflow/tfjs-core/dist/ops/atan.js");n.d(t,"atan",(function(){return m.atan}));var h=n(/*! ./atan2 */"./node_modules/@tensorflow/tfjs-core/dist/ops/atan2.js");n.d(t,"atan2",(function(){return h.atan2}));var b=n(/*! ./atanh */"./node_modules/@tensorflow/tfjs-core/dist/ops/atanh.js");n.d(t,"atanh",(function(){return b.atanh}));var j=n(/*! ./avg_pool */"./node_modules/@tensorflow/tfjs-core/dist/ops/avg_pool.js");n.d(t,"avgPool",(function(){return j.avgPool}));var g=n(/*! ./avg_pool_3d */"./node_modules/@tensorflow/tfjs-core/dist/ops/avg_pool_3d.js");n.d(t,"avgPool3d",(function(){return g.avgPool3d}));var w=n(/*! ./basic_lstm_cell */"./node_modules/@tensorflow/tfjs-core/dist/ops/basic_lstm_cell.js");n.d(t,"basicLSTMCell",(function(){return w.basicLSTMCell}));var _=n(/*! ./batch_to_space_nd */"./node_modules/@tensorflow/tfjs-core/dist/ops/batch_to_space_nd.js");n.d(t,"batchToSpaceND",(function(){return _.batchToSpaceND}));var k=n(/*! ./batchnorm */"./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm.js");n.d(t,"batchNorm",(function(){return k.batchNorm}));var v=n(/*! ./batchnorm2d */"./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm2d.js");n.d(t,"batchNorm2d",(function(){return v.batchNorm2d}));var x=n(/*! ./batchnorm3d */"./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm3d.js");n.d(t,"batchNorm3d",(function(){return x.batchNorm3d}));var y=n(/*! ./batchnorm4d */"./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm4d.js");n.d(t,"batchNorm4d",(function(){return y.batchNorm4d}));var O=n(/*! ./bincount */"./node_modules/@tensorflow/tfjs-core/dist/ops/bincount.js");n.d(t,"bincount",(function(){return O.bincount}));var I=n(/*! ./broadcast_to */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_to.js");n.d(t,"broadcastTo",(function(){return I.broadcastTo}));var C=n(/*! ./buffer */"./node_modules/@tensorflow/tfjs-core/dist/ops/buffer.js");n.d(t,"buffer",(function(){return C.buffer}));var S=n(/*! ./cast */"./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js");n.d(t,"cast",(function(){return S.cast}));var T=n(/*! ./ceil */"./node_modules/@tensorflow/tfjs-core/dist/ops/ceil.js");n.d(t,"ceil",(function(){return T.ceil}));var N=n(/*! ./clip_by_value */"./node_modules/@tensorflow/tfjs-core/dist/ops/clip_by_value.js");n.d(t,"clipByValue",(function(){return N.clipByValue}));var E=n(/*! ./clone */"./node_modules/@tensorflow/tfjs-core/dist/ops/clone.js");n.d(t,"clone",(function(){return E.clone}));var A=n(/*! ./complex */"./node_modules/@tensorflow/tfjs-core/dist/ops/complex.js");n.d(t,"complex",(function(){return A.complex}));var R=n(/*! ./concat */"./node_modules/@tensorflow/tfjs-core/dist/ops/concat.js");n.d(t,"concat",(function(){return R.concat}));var F=n(/*! ./concat_1d */"./node_modules/@tensorflow/tfjs-core/dist/ops/concat_1d.js");n.d(t,"concat1d",(function(){return F.concat1d}));var M=n(/*! ./concat_2d */"./node_modules/@tensorflow/tfjs-core/dist/ops/concat_2d.js");n.d(t,"concat2d",(function(){return M.concat2d}));var $=n(/*! ./concat_3d */"./node_modules/@tensorflow/tfjs-core/dist/ops/concat_3d.js");n.d(t,"concat3d",(function(){return $.concat3d}));var D=n(/*! ./concat_4d */"./node_modules/@tensorflow/tfjs-core/dist/ops/concat_4d.js");n.d(t,"concat4d",(function(){return D.concat4d}));var P=n(/*! ./conv1d */"./node_modules/@tensorflow/tfjs-core/dist/ops/conv1d.js");n.d(t,"conv1d",(function(){return P.conv1d}));var B=n(/*! ./conv2d */"./node_modules/@tensorflow/tfjs-core/dist/ops/conv2d.js");n.d(t,"conv2d",(function(){return B.conv2d}));var L=n(/*! ./conv2d_transpose */"./node_modules/@tensorflow/tfjs-core/dist/ops/conv2d_transpose.js");n.d(t,"conv2dTranspose",(function(){return L.conv2dTranspose}));var z=n(/*! ./conv3d */"./node_modules/@tensorflow/tfjs-core/dist/ops/conv3d.js");n.d(t,"conv3d",(function(){return z.conv3d}));var G=n(/*! ./conv3d_transpose */"./node_modules/@tensorflow/tfjs-core/dist/ops/conv3d_transpose.js");n.d(t,"conv3dTranspose",(function(){return G.conv3dTranspose}));var U=n(/*! ./cos */"./node_modules/@tensorflow/tfjs-core/dist/ops/cos.js");n.d(t,"cos",(function(){return U.cos}));var W=n(/*! ./cosh */"./node_modules/@tensorflow/tfjs-core/dist/ops/cosh.js");n.d(t,"cosh",(function(){return W.cosh}));var V=n(/*! ./cumsum */"./node_modules/@tensorflow/tfjs-core/dist/ops/cumsum.js");n.d(t,"cumsum",(function(){return V.cumsum}));var q=n(/*! ./dense_bincount */"./node_modules/@tensorflow/tfjs-core/dist/ops/dense_bincount.js");n.d(t,"denseBincount",(function(){return q.denseBincount}));var H=n(/*! ./depth_to_space */"./node_modules/@tensorflow/tfjs-core/dist/ops/depth_to_space.js");n.d(t,"depthToSpace",(function(){return H.depthToSpace}));var K=n(/*! ./depthwise_conv2d */"./node_modules/@tensorflow/tfjs-core/dist/ops/depthwise_conv2d.js");n.d(t,"depthwiseConv2d",(function(){return K.depthwiseConv2d}));var X=n(/*! ./diag */"./node_modules/@tensorflow/tfjs-core/dist/ops/diag.js");n.d(t,"diag",(function(){return X.diag}));var Y=n(/*! ./dilation2d */"./node_modules/@tensorflow/tfjs-core/dist/ops/dilation2d.js");n.d(t,"dilation2d",(function(){return Y.dilation2d}));var Z=n(/*! ./div */"./node_modules/@tensorflow/tfjs-core/dist/ops/div.js");n.d(t,"div",(function(){return Z.div}));var Q=n(/*! ./div_no_nan */"./node_modules/@tensorflow/tfjs-core/dist/ops/div_no_nan.js");n.d(t,"divNoNan",(function(){return Q.divNoNan}));var J=n(/*! ./dot */"./node_modules/@tensorflow/tfjs-core/dist/ops/dot.js");n.d(t,"dot",(function(){return J.dot}));var ee=n(/*! ./einsum */"./node_modules/@tensorflow/tfjs-core/dist/ops/einsum.js");n.d(t,"einsum",(function(){return ee.einsum}));var te=n(/*! ./elu */"./node_modules/@tensorflow/tfjs-core/dist/ops/elu.js");n.d(t,"elu",(function(){return te.elu}));var ne=n(/*! ./equal */"./node_modules/@tensorflow/tfjs-core/dist/ops/equal.js");n.d(t,"equal",(function(){return ne.equal}));var se=n(/*! ./erf */"./node_modules/@tensorflow/tfjs-core/dist/ops/erf.js");n.d(t,"erf",(function(){return se.erf}));var oe=n(/*! ./exp */"./node_modules/@tensorflow/tfjs-core/dist/ops/exp.js");n.d(t,"exp",(function(){return oe.exp}));var re=n(/*! ./expand_dims */"./node_modules/@tensorflow/tfjs-core/dist/ops/expand_dims.js");n.d(t,"expandDims",(function(){return re.expandDims}));var ie=n(/*! ./expm1 */"./node_modules/@tensorflow/tfjs-core/dist/ops/expm1.js");n.d(t,"expm1",(function(){return ie.expm1}));var ae=n(/*! ./eye */"./node_modules/@tensorflow/tfjs-core/dist/ops/eye.js");n.d(t,"eye",(function(){return ae.eye}));var ue=n(/*! ./fill */"./node_modules/@tensorflow/tfjs-core/dist/ops/fill.js");n.d(t,"fill",(function(){return ue.fill}));var de=n(/*! ./floor */"./node_modules/@tensorflow/tfjs-core/dist/ops/floor.js");n.d(t,"floor",(function(){return de.floor}));var le=n(/*! ./floorDiv */"./node_modules/@tensorflow/tfjs-core/dist/ops/floorDiv.js");n.d(t,"floorDiv",(function(){return le.floorDiv}));var ce=n(/*! ./gather */"./node_modules/@tensorflow/tfjs-core/dist/ops/gather.js");n.d(t,"gather",(function(){return ce.gather}));var fe=n(/*! ./greater */"./node_modules/@tensorflow/tfjs-core/dist/ops/greater.js");n.d(t,"greater",(function(){return fe.greater}));var pe=n(/*! ./greater_equal */"./node_modules/@tensorflow/tfjs-core/dist/ops/greater_equal.js");n.d(t,"greaterEqual",(function(){return pe.greaterEqual}));var me=n(/*! ./imag */"./node_modules/@tensorflow/tfjs-core/dist/ops/imag.js");n.d(t,"imag",(function(){return me.imag}));var he=n(/*! ./is_finite */"./node_modules/@tensorflow/tfjs-core/dist/ops/is_finite.js");n.d(t,"isFinite",(function(){return he.isFinite}));var be=n(/*! ./is_inf */"./node_modules/@tensorflow/tfjs-core/dist/ops/is_inf.js");n.d(t,"isInf",(function(){return be.isInf}));var je=n(/*! ./is_nan */"./node_modules/@tensorflow/tfjs-core/dist/ops/is_nan.js");n.d(t,"isNaN",(function(){return je.isNaN}));var ge=n(/*! ./leaky_relu */"./node_modules/@tensorflow/tfjs-core/dist/ops/leaky_relu.js");n.d(t,"leakyRelu",(function(){return ge.leakyRelu}));var we=n(/*! ./less */"./node_modules/@tensorflow/tfjs-core/dist/ops/less.js");n.d(t,"less",(function(){return we.less}));var _e=n(/*! ./less_equal */"./node_modules/@tensorflow/tfjs-core/dist/ops/less_equal.js");n.d(t,"lessEqual",(function(){return _e.lessEqual}));var ke=n(/*! ./linspace */"./node_modules/@tensorflow/tfjs-core/dist/ops/linspace.js");n.d(t,"linspace",(function(){return ke.linspace}));var ve=n(/*! ./local_response_normalization */"./node_modules/@tensorflow/tfjs-core/dist/ops/local_response_normalization.js");n.d(t,"localResponseNormalization",(function(){return ve.localResponseNormalization}));var xe=n(/*! ./log */"./node_modules/@tensorflow/tfjs-core/dist/ops/log.js");n.d(t,"log",(function(){return xe.log}));var ye=n(/*! ./log1p */"./node_modules/@tensorflow/tfjs-core/dist/ops/log1p.js");n.d(t,"log1p",(function(){return ye.log1p}));var Oe=n(/*! ./log_sigmoid */"./node_modules/@tensorflow/tfjs-core/dist/ops/log_sigmoid.js");n.d(t,"logSigmoid",(function(){return Oe.logSigmoid}));var Ie=n(/*! ./log_softmax */"./node_modules/@tensorflow/tfjs-core/dist/ops/log_softmax.js");n.d(t,"logSoftmax",(function(){return Ie.logSoftmax}));var Ce=n(/*! ./log_sum_exp */"./node_modules/@tensorflow/tfjs-core/dist/ops/log_sum_exp.js");n.d(t,"logSumExp",(function(){return Ce.logSumExp}));var Se=n(/*! ./logical_and */"./node_modules/@tensorflow/tfjs-core/dist/ops/logical_and.js");n.d(t,"logicalAnd",(function(){return Se.logicalAnd}));var Te=n(/*! ./logical_not */"./node_modules/@tensorflow/tfjs-core/dist/ops/logical_not.js");n.d(t,"logicalNot",(function(){return Te.logicalNot}));var Ne=n(/*! ./logical_or */"./node_modules/@tensorflow/tfjs-core/dist/ops/logical_or.js");n.d(t,"logicalOr",(function(){return Ne.logicalOr}));var Ee=n(/*! ./logical_xor */"./node_modules/@tensorflow/tfjs-core/dist/ops/logical_xor.js");n.d(t,"logicalXor",(function(){return Ee.logicalXor}));var Ae=n(/*! ./mat_mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mat_mul.js");n.d(t,"matMul",(function(){return Ae.matMul}));var Re=n(/*! ./max */"./node_modules/@tensorflow/tfjs-core/dist/ops/max.js");n.d(t,"max",(function(){return Re.max}));var Fe=n(/*! ./max_pool */"./node_modules/@tensorflow/tfjs-core/dist/ops/max_pool.js");n.d(t,"maxPool",(function(){return Fe.maxPool}));var Me=n(/*! ./max_pool_3d */"./node_modules/@tensorflow/tfjs-core/dist/ops/max_pool_3d.js");n.d(t,"maxPool3d",(function(){return Me.maxPool3d}));var $e=n(/*! ./max_pool_with_argmax */"./node_modules/@tensorflow/tfjs-core/dist/ops/max_pool_with_argmax.js");n.d(t,"maxPoolWithArgmax",(function(){return $e.maxPoolWithArgmax}));var De=n(/*! ./maximum */"./node_modules/@tensorflow/tfjs-core/dist/ops/maximum.js");n.d(t,"maximum",(function(){return De.maximum}));var Pe=n(/*! ./mean */"./node_modules/@tensorflow/tfjs-core/dist/ops/mean.js");n.d(t,"mean",(function(){return Pe.mean}));var Be=n(/*! ./meshgrid */"./node_modules/@tensorflow/tfjs-core/dist/ops/meshgrid.js");n.d(t,"meshgrid",(function(){return Be.meshgrid}));var Le=n(/*! ./min */"./node_modules/@tensorflow/tfjs-core/dist/ops/min.js");n.d(t,"min",(function(){return Le.min}));var ze=n(/*! ./minimum */"./node_modules/@tensorflow/tfjs-core/dist/ops/minimum.js");n.d(t,"minimum",(function(){return ze.minimum}));var Ge=n(/*! ./mirror_pad */"./node_modules/@tensorflow/tfjs-core/dist/ops/mirror_pad.js");n.d(t,"mirrorPad",(function(){return Ge.mirrorPad}));var Ue=n(/*! ./mod */"./node_modules/@tensorflow/tfjs-core/dist/ops/mod.js");n.d(t,"mod",(function(){return Ue.mod}));var We=n(/*! ./moments */"./node_modules/@tensorflow/tfjs-core/dist/ops/moments.js");n.d(t,"moments",(function(){return We.moments}));var Ve=n(/*! ./mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js");n.d(t,"mul",(function(){return Ve.mul}));var qe=n(/*! ./multi_rnn_cell */"./node_modules/@tensorflow/tfjs-core/dist/ops/multi_rnn_cell.js");n.d(t,"multiRNNCell",(function(){return qe.multiRNNCell}));var He=n(/*! ./multinomial */"./node_modules/@tensorflow/tfjs-core/dist/ops/multinomial.js");n.d(t,"multinomial",(function(){return He.multinomial}));var Ke=n(/*! ./neg */"./node_modules/@tensorflow/tfjs-core/dist/ops/neg.js");n.d(t,"neg",(function(){return Ke.neg}));var Xe=n(/*! ./not_equal */"./node_modules/@tensorflow/tfjs-core/dist/ops/not_equal.js");n.d(t,"notEqual",(function(){return Xe.notEqual}));var Ye=n(/*! ./one_hot */"./node_modules/@tensorflow/tfjs-core/dist/ops/one_hot.js");n.d(t,"oneHot",(function(){return Ye.oneHot}));var Ze=n(/*! ./ones */"./node_modules/@tensorflow/tfjs-core/dist/ops/ones.js");n.d(t,"ones",(function(){return Ze.ones}));var Qe=n(/*! ./ones_like */"./node_modules/@tensorflow/tfjs-core/dist/ops/ones_like.js");n.d(t,"onesLike",(function(){return Qe.onesLike}));var Je=n(/*! ./outer_product */"./node_modules/@tensorflow/tfjs-core/dist/ops/outer_product.js");n.d(t,"outerProduct",(function(){return Je.outerProduct}));var et=n(/*! ./pad */"./node_modules/@tensorflow/tfjs-core/dist/ops/pad.js");n.d(t,"pad",(function(){return et.pad}));var tt=n(/*! ./pad1d */"./node_modules/@tensorflow/tfjs-core/dist/ops/pad1d.js");n.d(t,"pad1d",(function(){return tt.pad1d}));var nt=n(/*! ./pad2d */"./node_modules/@tensorflow/tfjs-core/dist/ops/pad2d.js");n.d(t,"pad2d",(function(){return nt.pad2d}));var st=n(/*! ./pad3d */"./node_modules/@tensorflow/tfjs-core/dist/ops/pad3d.js");n.d(t,"pad3d",(function(){return st.pad3d}));var ot=n(/*! ./pad4d */"./node_modules/@tensorflow/tfjs-core/dist/ops/pad4d.js");n.d(t,"pad4d",(function(){return ot.pad4d}));var rt=n(/*! ./pool */"./node_modules/@tensorflow/tfjs-core/dist/ops/pool.js");n.d(t,"pool",(function(){return rt.pool}));var it=n(/*! ./pow */"./node_modules/@tensorflow/tfjs-core/dist/ops/pow.js");n.d(t,"pow",(function(){return it.pow}));var at=n(/*! ./prelu */"./node_modules/@tensorflow/tfjs-core/dist/ops/prelu.js");n.d(t,"prelu",(function(){return at.prelu}));var ut=n(/*! ./print */"./node_modules/@tensorflow/tfjs-core/dist/ops/print.js");n.d(t,"print",(function(){return ut.print}));var dt=n(/*! ./prod */"./node_modules/@tensorflow/tfjs-core/dist/ops/prod.js");n.d(t,"prod",(function(){return dt.prod}));var lt=n(/*! ./rand */"./node_modules/@tensorflow/tfjs-core/dist/ops/rand.js");n.d(t,"rand",(function(){return lt.rand}));var ct=n(/*! ./random_gamma */"./node_modules/@tensorflow/tfjs-core/dist/ops/random_gamma.js");n.d(t,"randomGamma",(function(){return ct.randomGamma}));var ft=n(/*! ./random_normal */"./node_modules/@tensorflow/tfjs-core/dist/ops/random_normal.js");n.d(t,"randomNormal",(function(){return ft.randomNormal}));var pt=n(/*! ./random_uniform */"./node_modules/@tensorflow/tfjs-core/dist/ops/random_uniform.js");n.d(t,"randomUniform",(function(){return pt.randomUniform}));var mt=n(/*! ./range */"./node_modules/@tensorflow/tfjs-core/dist/ops/range.js");n.d(t,"range",(function(){return mt.range}));var ht=n(/*! ./real */"./node_modules/@tensorflow/tfjs-core/dist/ops/real.js");n.d(t,"real",(function(){return ht.real}));var bt=n(/*! ./reciprocal */"./node_modules/@tensorflow/tfjs-core/dist/ops/reciprocal.js");n.d(t,"reciprocal",(function(){return bt.reciprocal}));var jt=n(/*! ./relu */"./node_modules/@tensorflow/tfjs-core/dist/ops/relu.js");n.d(t,"relu",(function(){return jt.relu}));var gt=n(/*! ./relu6 */"./node_modules/@tensorflow/tfjs-core/dist/ops/relu6.js");n.d(t,"relu6",(function(){return gt.relu6}));var wt=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");n.d(t,"reshape",(function(){return wt.reshape}));var _t=n(/*! ./reverse */"./node_modules/@tensorflow/tfjs-core/dist/ops/reverse.js");n.d(t,"reverse",(function(){return _t.reverse}));var kt=n(/*! ./reverse_1d */"./node_modules/@tensorflow/tfjs-core/dist/ops/reverse_1d.js");n.d(t,"reverse1d",(function(){return kt.reverse1d}));var vt=n(/*! ./reverse_2d */"./node_modules/@tensorflow/tfjs-core/dist/ops/reverse_2d.js");n.d(t,"reverse2d",(function(){return vt.reverse2d}));var xt=n(/*! ./reverse_3d */"./node_modules/@tensorflow/tfjs-core/dist/ops/reverse_3d.js");n.d(t,"reverse3d",(function(){return xt.reverse3d}));var yt=n(/*! ./reverse_4d */"./node_modules/@tensorflow/tfjs-core/dist/ops/reverse_4d.js");n.d(t,"reverse4d",(function(){return yt.reverse4d}));var Ot=n(/*! ./round */"./node_modules/@tensorflow/tfjs-core/dist/ops/round.js");n.d(t,"round",(function(){return Ot.round}));var It=n(/*! ./rsqrt */"./node_modules/@tensorflow/tfjs-core/dist/ops/rsqrt.js");n.d(t,"rsqrt",(function(){return It.rsqrt}));var Ct=n(/*! ./scalar */"./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js");n.d(t,"scalar",(function(){return Ct.scalar}));var St=n(/*! ./selu */"./node_modules/@tensorflow/tfjs-core/dist/ops/selu.js");n.d(t,"selu",(function(){return St.selu}));var Tt=n(/*! ./separable_conv2d */"./node_modules/@tensorflow/tfjs-core/dist/ops/separable_conv2d.js");n.d(t,"separableConv2d",(function(){return Tt.separableConv2d}));var Nt=n(/*! ./setdiff1d_async */"./node_modules/@tensorflow/tfjs-core/dist/ops/setdiff1d_async.js");n.d(t,"setdiff1dAsync",(function(){return Nt.setdiff1dAsync}));var Et=n(/*! ./sigmoid */"./node_modules/@tensorflow/tfjs-core/dist/ops/sigmoid.js");n.d(t,"sigmoid",(function(){return Et.sigmoid}));var At=n(/*! ./sign */"./node_modules/@tensorflow/tfjs-core/dist/ops/sign.js");n.d(t,"sign",(function(){return At.sign}));var Rt=n(/*! ./sin */"./node_modules/@tensorflow/tfjs-core/dist/ops/sin.js");n.d(t,"sin",(function(){return Rt.sin}));var Ft=n(/*! ./sinh */"./node_modules/@tensorflow/tfjs-core/dist/ops/sinh.js");n.d(t,"sinh",(function(){return Ft.sinh}));var Mt=n(/*! ./slice */"./node_modules/@tensorflow/tfjs-core/dist/ops/slice.js");n.d(t,"slice",(function(){return Mt.slice}));var $t=n(/*! ./slice1d */"./node_modules/@tensorflow/tfjs-core/dist/ops/slice1d.js");n.d(t,"slice1d",(function(){return $t.slice1d}));var Dt=n(/*! ./slice2d */"./node_modules/@tensorflow/tfjs-core/dist/ops/slice2d.js");n.d(t,"slice2d",(function(){return Dt.slice2d}));var Pt=n(/*! ./slice3d */"./node_modules/@tensorflow/tfjs-core/dist/ops/slice3d.js");n.d(t,"slice3d",(function(){return Pt.slice3d}));var Bt=n(/*! ./slice4d */"./node_modules/@tensorflow/tfjs-core/dist/ops/slice4d.js");n.d(t,"slice4d",(function(){return Bt.slice4d}));var Lt=n(/*! ./softmax */"./node_modules/@tensorflow/tfjs-core/dist/ops/softmax.js");n.d(t,"softmax",(function(){return Lt.softmax}));var zt=n(/*! ./softplus */"./node_modules/@tensorflow/tfjs-core/dist/ops/softplus.js");n.d(t,"softplus",(function(){return zt.softplus}));var Gt=n(/*! ./space_to_batch_nd */"./node_modules/@tensorflow/tfjs-core/dist/ops/space_to_batch_nd.js");n.d(t,"spaceToBatchND",(function(){return Gt.spaceToBatchND}));var Ut=n(/*! ./spectral/fft */"./node_modules/@tensorflow/tfjs-core/dist/ops/spectral/fft.js");n.d(t,"fft",(function(){return Ut.fft}));var Wt=n(/*! ./spectral/ifft */"./node_modules/@tensorflow/tfjs-core/dist/ops/spectral/ifft.js");n.d(t,"ifft",(function(){return Wt.ifft}));var Vt=n(/*! ./spectral/irfft */"./node_modules/@tensorflow/tfjs-core/dist/ops/spectral/irfft.js");n.d(t,"irfft",(function(){return Vt.irfft}));var qt=n(/*! ./spectral/rfft */"./node_modules/@tensorflow/tfjs-core/dist/ops/spectral/rfft.js");n.d(t,"rfft",(function(){return qt.rfft}));var Ht=n(/*! ./split */"./node_modules/@tensorflow/tfjs-core/dist/ops/split.js");n.d(t,"split",(function(){return Ht.split}));var Kt=n(/*! ./sqrt */"./node_modules/@tensorflow/tfjs-core/dist/ops/sqrt.js");n.d(t,"sqrt",(function(){return Kt.sqrt}));var Xt=n(/*! ./square */"./node_modules/@tensorflow/tfjs-core/dist/ops/square.js");n.d(t,"square",(function(){return Xt.square}));var Yt=n(/*! ./squared_difference */"./node_modules/@tensorflow/tfjs-core/dist/ops/squared_difference.js");n.d(t,"squaredDifference",(function(){return Yt.squaredDifference}));var Zt=n(/*! ./squeeze */"./node_modules/@tensorflow/tfjs-core/dist/ops/squeeze.js");n.d(t,"squeeze",(function(){return Zt.squeeze}));var Qt=n(/*! ./stack */"./node_modules/@tensorflow/tfjs-core/dist/ops/stack.js");n.d(t,"stack",(function(){return Qt.stack}));var Jt=n(/*! ./step */"./node_modules/@tensorflow/tfjs-core/dist/ops/step.js");n.d(t,"step",(function(){return Jt.step}));var en=n(/*! ./strided_slice */"./node_modules/@tensorflow/tfjs-core/dist/ops/strided_slice.js");n.d(t,"stridedSlice",(function(){return en.stridedSlice}));var tn=n(/*! ./sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js");n.d(t,"sub",(function(){return tn.sub}));var nn=n(/*! ./sum */"./node_modules/@tensorflow/tfjs-core/dist/ops/sum.js");n.d(t,"sum",(function(){return nn.sum}));var sn=n(/*! ./tan */"./node_modules/@tensorflow/tfjs-core/dist/ops/tan.js");n.d(t,"tan",(function(){return sn.tan}));var on=n(/*! ./tanh */"./node_modules/@tensorflow/tfjs-core/dist/ops/tanh.js");n.d(t,"tanh",(function(){return on.tanh}));var rn=n(/*! ./tensor */"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor.js");n.d(t,"tensor",(function(){return rn.tensor}));var an=n(/*! ./tensor1d */"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor1d.js");n.d(t,"tensor1d",(function(){return an.tensor1d}));var un=n(/*! ./tensor2d */"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor2d.js");n.d(t,"tensor2d",(function(){return un.tensor2d}));var dn=n(/*! ./tensor3d */"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor3d.js");n.d(t,"tensor3d",(function(){return dn.tensor3d}));var ln=n(/*! ./tensor4d */"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor4d.js");n.d(t,"tensor4d",(function(){return ln.tensor4d}));var cn=n(/*! ./tensor5d */"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor5d.js");n.d(t,"tensor5d",(function(){return cn.tensor5d}));var fn=n(/*! ./tensor6d */"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor6d.js");n.d(t,"tensor6d",(function(){return fn.tensor6d}));var pn=n(/*! ./tile */"./node_modules/@tensorflow/tfjs-core/dist/ops/tile.js");n.d(t,"tile",(function(){return pn.tile}));var mn=n(/*! ./topk */"./node_modules/@tensorflow/tfjs-core/dist/ops/topk.js");n.d(t,"topk",(function(){return mn.topk}));var hn=n(/*! ./truncated_normal */"./node_modules/@tensorflow/tfjs-core/dist/ops/truncated_normal.js");n.d(t,"truncatedNormal",(function(){return hn.truncatedNormal}));var bn=n(/*! ./unique */"./node_modules/@tensorflow/tfjs-core/dist/ops/unique.js");n.d(t,"unique",(function(){return bn.unique}));var jn=n(/*! ./unsorted_segment_sum */"./node_modules/@tensorflow/tfjs-core/dist/ops/unsorted_segment_sum.js");n.d(t,"unsortedSegmentSum",(function(){return jn.unsortedSegmentSum}));var gn=n(/*! ./unstack */"./node_modules/@tensorflow/tfjs-core/dist/ops/unstack.js");n.d(t,"unstack",(function(){return gn.unstack}));var wn=n(/*! ./variable */"./node_modules/@tensorflow/tfjs-core/dist/ops/variable.js");n.d(t,"variable",(function(){return wn.variable}));var _n=n(/*! ./where */"./node_modules/@tensorflow/tfjs-core/dist/ops/where.js");n.d(t,"where",(function(){return _n.where}));var kn=n(/*! ./where_async */"./node_modules/@tensorflow/tfjs-core/dist/ops/where_async.js");n.d(t,"whereAsync",(function(){return kn.whereAsync}));var vn=n(/*! ./zeros */"./node_modules/@tensorflow/tfjs-core/dist/ops/zeros.js");n.d(t,"zeros",(function(){return vn.zeros}));var xn=n(/*! ./zeros_like */"./node_modules/@tensorflow/tfjs-core/dist/ops/zeros_like.js");n.d(t,"zerosLike",(function(){return xn.zerosLike}));var yn=n(/*! ./boolean_mask */"./node_modules/@tensorflow/tfjs-core/dist/ops/boolean_mask.js");n.d(t,"booleanMaskAsync",(function(){return yn.booleanMaskAsync}));var On=n(/*! ./transpose */"./node_modules/@tensorflow/tfjs-core/dist/ops/transpose.js");n.d(t,"transpose",(function(){return On.transpose}));var In=n(/*! ./norm */"./node_modules/@tensorflow/tfjs-core/dist/ops/norm.js");n.d(t,"norm",(function(){return In.norm}));var Cn=n(/*! ./moving_average */"./node_modules/@tensorflow/tfjs-core/dist/ops/moving_average.js");n.d(t,"movingAverage",(function(){return Cn.movingAverage}));var Sn=n(/*! ./scatter_nd */"./node_modules/@tensorflow/tfjs-core/dist/ops/scatter_nd.js");n.d(t,"scatterND",(function(){return Sn.scatterND}));var Tn=n(/*! ./sparse_to_dense */"./node_modules/@tensorflow/tfjs-core/dist/ops/sparse_to_dense.js");n.d(t,"sparseToDense",(function(){return Tn.sparseToDense}));var Nn=n(/*! ./gather_nd */"./node_modules/@tensorflow/tfjs-core/dist/ops/gather_nd.js");n.d(t,"gatherND",(function(){return Nn.gatherND}));var En=n(/*! ./dropout */"./node_modules/@tensorflow/tfjs-core/dist/ops/dropout.js");n.d(t,"dropout",(function(){return En.dropout}));var An=n(/*! ./signal_ops_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/signal_ops_util.js");n.d(t,"enclosingPowerOfTwo",(function(){return An.enclosingPowerOfTwo})),n.d(t,"cosineWindow",(function(){return An.cosineWindow}));var Rn=n(/*! ./in_top_k */"./node_modules/@tensorflow/tfjs-core/dist/ops/in_top_k.js");n.d(t,"inTopKAsync",(function(){return Rn.inTopKAsync}));var Fn=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");n.d(t,"op",(function(){return Fn.op})),n.d(t,"OP_SCOPE_SUFFIX",(function(){return Fn.OP_SCOPE_SUFFIX}));var Mn=n(/*! ./fused_ops */"./node_modules/@tensorflow/tfjs-core/dist/ops/fused_ops.js");n.d(t,"fused",(function(){return Mn}));var $n=n(/*! ./signal/hamming_window */"./node_modules/@tensorflow/tfjs-core/dist/ops/signal/hamming_window.js"),Dn=n(/*! ./signal/hann_window */"./node_modules/@tensorflow/tfjs-core/dist/ops/signal/hann_window.js"),Pn=n(/*! ./signal/frame */"./node_modules/@tensorflow/tfjs-core/dist/ops/signal/frame.js"),Bn=n(/*! ./signal/stft */"./node_modules/@tensorflow/tfjs-core/dist/ops/signal/stft.js"),Ln=n(/*! ./image/crop_and_resize */"./node_modules/@tensorflow/tfjs-core/dist/ops/image/crop_and_resize.js"),zn=n(/*! ./image/flip_left_right */"./node_modules/@tensorflow/tfjs-core/dist/ops/image/flip_left_right.js"),Gn=n(/*! ./image/rotate_with_offset */"./node_modules/@tensorflow/tfjs-core/dist/ops/image/rotate_with_offset.js"),Un=n(/*! ./image/non_max_suppression */"./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression.js"),Wn=n(/*! ./image/non_max_suppression_async */"./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression_async.js"),Vn=n(/*! ./image/non_max_suppression_with_score */"./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression_with_score.js"),qn=n(/*! ./image/non_max_suppression_with_score_async */"./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression_with_score_async.js"),Hn=n(/*! ./image/non_max_suppression_padded */"./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression_padded.js"),Kn=n(/*! ./image/non_max_suppression_padded_async */"./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression_padded_async.js"),Xn=n(/*! ./image/resize_bilinear */"./node_modules/@tensorflow/tfjs-core/dist/ops/image/resize_bilinear.js"),Yn=n(/*! ./image/resize_nearest_neighbor */"./node_modules/@tensorflow/tfjs-core/dist/ops/image/resize_nearest_neighbor.js"),Zn=n(/*! ./image/threshold */"./node_modules/@tensorflow/tfjs-core/dist/ops/image/threshold.js"),Qn=n(/*! ./image/transform */"./node_modules/@tensorflow/tfjs-core/dist/ops/image/transform.js"),Jn=n(/*! ./linalg/band_part */"./node_modules/@tensorflow/tfjs-core/dist/ops/linalg/band_part.js"),es=n(/*! ./linalg/gram_schmidt */"./node_modules/@tensorflow/tfjs-core/dist/ops/linalg/gram_schmidt.js"),ts=n(/*! ./linalg/qr */"./node_modules/@tensorflow/tfjs-core/dist/ops/linalg/qr.js"),ns=n(/*! ./losses/absolute_difference */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/absolute_difference.js"),ss=n(/*! ./losses/compute_weighted_loss */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/compute_weighted_loss.js"),os=n(/*! ./losses/cosine_distance */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/cosine_distance.js"),rs=n(/*! ./losses/hinge_loss */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/hinge_loss.js"),is=n(/*! ./losses/huber_loss */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/huber_loss.js"),as=n(/*! ./losses/log_loss */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/log_loss.js"),us=n(/*! ./losses/mean_squared_error */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/mean_squared_error.js"),ds=n(/*! ./losses/sigmoid_cross_entropy */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/sigmoid_cross_entropy.js"),ls=n(/*! ./losses/softmax_cross_entropy */"./node_modules/@tensorflow/tfjs-core/dist/ops/losses/softmax_cross_entropy.js"),cs=n(/*! ./sparse/sparse_fill_empty_rows */"./node_modules/@tensorflow/tfjs-core/dist/ops/sparse/sparse_fill_empty_rows.js"),fs=n(/*! ./sparse/sparse_reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/sparse/sparse_reshape.js"),ps=n(/*! ./sparse/sparse_segment_mean */"./node_modules/@tensorflow/tfjs-core/dist/ops/sparse/sparse_segment_mean.js"),ms=n(/*! ./sparse/sparse_segment_sum */"./node_modules/@tensorflow/tfjs-core/dist/ops/sparse/sparse_segment_sum.js"),hs=n(/*! ./string/string_n_grams */"./node_modules/@tensorflow/tfjs-core/dist/ops/string/string_n_grams.js"),bs=n(/*! ./string/string_split */"./node_modules/@tensorflow/tfjs-core/dist/ops/string/string_split.js"),js=n(/*! ./string/string_to_hash_bucket_fast */"./node_modules/@tensorflow/tfjs-core/dist/ops/string/string_to_hash_bucket_fast.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const gs={fft:Ut.fft,ifft:Wt.ifft,rfft:qt.rfft,irfft:Vt.irfft},ws={hammingWindow:$n.hammingWindow,hannWindow:Dn.hannWindow,frame:Pn.frame,stft:Bn.stft},_s={flipLeftRight:zn.flipLeftRight,resizeNearestNeighbor:Yn.resizeNearestNeighbor,resizeBilinear:Xn.resizeBilinear,rotateWithOffset:Gn.rotateWithOffset,cropAndResize:Ln.cropAndResize,nonMaxSuppression:Un.nonMaxSuppression,nonMaxSuppressionAsync:Wn.nonMaxSuppressionAsync,nonMaxSuppressionWithScore:Vn.nonMaxSuppressionWithScore,nonMaxSuppressionWithScoreAsync:qn.nonMaxSuppressionWithScoreAsync,nonMaxSuppressionPadded:Hn.nonMaxSuppressionPadded,nonMaxSuppressionPaddedAsync:Kn.nonMaxSuppressionPaddedAsync,threshold:Zn.threshold,transform:Qn.transform},ks={bandPart:Jn.bandPart,gramSchmidt:es.gramSchmidt,qr:ts.qr},vs={absoluteDifference:ns.absoluteDifference,computeWeightedLoss:ss.computeWeightedLoss,cosineDistance:os.cosineDistance,hingeLoss:rs.hingeLoss,huberLoss:is.huberLoss,logLoss:as.logLoss,meanSquaredError:us.meanSquaredError,sigmoidCrossEntropy:ds.sigmoidCrossEntropy,softmaxCrossEntropy:ls.softmaxCrossEntropy},xs={sparseFillEmptyRows:cs.sparseFillEmptyRows,sparseReshape:fs.sparseReshape,sparseSegmentMean:ps.sparseSegmentMean,sparseSegmentSum:ms.sparseSegmentSum},ys={stringNGrams:hs.stringNGrams,stringSplit:bs.stringSplit,stringToHashBucketFast:js.stringToHashBucketFast}},"./node_modules/@tensorflow/tfjs-core/dist/ops/outer_product.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/outer_product.js ***! + \**********************************************************************/ +/*! exports provided: outerProduct */function(e,t,n){"use strict";n.r(t),n.d(t,"outerProduct",(function(){return u}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./mat_mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mat_mul.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),a=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const u=Object(i.op)({outerProduct_:function(e,t){const n=Object(s.convertToTensor)(e,"v1","outerProduct"),i=Object(s.convertToTensor)(t,"v2","outerProduct");o.assert(1===n.rank&&1===i.rank,(()=>`Error in outerProduct: inputs must be rank 1, but got ranks ${n.rank} and ${i.rank}.`));const u=Object(a.reshape)(n,[-1,1]),d=Object(a.reshape)(i,[1,-1]);return Object(r.matMul)(u,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/pad.js": +/*!************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/pad.js ***! + \************************************************************/ +/*! exports provided: pad */function(e,t,n){"use strict";n.r(t),n.d(t,"pad",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({pad_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n=0){const i=Object(r.convertToTensor)(e,"x","pad");if(0===i.rank)throw new Error("pad(scalar) is not defined. Pass non-scalar to pad");const a={paddings:t,constantValue:n},u={x:i};return s.ENGINE.runKernel(o.PadV2,u,a)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/pad1d.js": +/*!**************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/pad1d.js ***! + \**************************************************************/ +/*! exports provided: pad1d */function(e,t,n){"use strict";n.r(t),n.d(t,"pad1d",(function(){return i}));var s=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),o=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),r=n(/*! ./pad */"./node_modules/@tensorflow/tfjs-core/dist/ops/pad.js");const i=Object(o.op)({pad1d_:function(e,t,n=0){return Object(s.assert)(2===t.length,(()=>"Invalid number of paddings. Must be length of 2.")),Object(r.pad)(e,[t],n)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/pad2d.js": +/*!**************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/pad2d.js ***! + \**************************************************************/ +/*! exports provided: pad2d */function(e,t,n){"use strict";n.r(t),n.d(t,"pad2d",(function(){return i}));var s=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),o=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),r=n(/*! ./pad */"./node_modules/@tensorflow/tfjs-core/dist/ops/pad.js");const i=Object(o.op)({pad2d_:function(e,t,n=0){return Object(s.assert)(2===t.length&&2===t[0].length&&2===t[1].length,(()=>"Invalid number of paddings. Must be length of 2 each.")),Object(r.pad)(e,t,n)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/pad3d.js": +/*!**************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/pad3d.js ***! + \**************************************************************/ +/*! exports provided: pad3d */function(e,t,n){"use strict";n.r(t),n.d(t,"pad3d",(function(){return i}));var s=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),o=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),r=n(/*! ./pad */"./node_modules/@tensorflow/tfjs-core/dist/ops/pad.js");const i=Object(o.op)({pad3d_:function(e,t,n=0){return Object(s.assert)(3===t.length&&2===t[0].length&&2===t[1].length&&2===t[2].length,(()=>"Invalid number of paddings. Must be length of 2 each.")),Object(r.pad)(e,t,n)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/pad4d.js": +/*!**************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/pad4d.js ***! + \**************************************************************/ +/*! exports provided: pad4d */function(e,t,n){"use strict";n.r(t),n.d(t,"pad4d",(function(){return i}));var s=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),o=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),r=n(/*! ./pad */"./node_modules/@tensorflow/tfjs-core/dist/ops/pad.js");const i=Object(o.op)({pad4d_:function(e,t,n=0){return Object(s.assert)(4===t.length&&2===t[0].length&&2===t[1].length&&2===t[2].length&&2===t[3].length,(()=>"Invalid number of paddings. Must be length of 2 each.")),Object(r.pad)(e,t,n)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/pool.js": +/*!*************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/pool.js ***! + \*************************************************************/ +/*! exports provided: pool */function(e,t,n){"use strict";n.r(t),n.d(t,"pool",(function(){return f}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./avg_pool */"./node_modules/@tensorflow/tfjs-core/dist/ops/avg_pool.js"),i=n(/*! ./batch_to_space_nd */"./node_modules/@tensorflow/tfjs-core/dist/ops/batch_to_space_nd.js"),a=n(/*! ./conv_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/conv_util.js"),u=n(/*! ./max_pool */"./node_modules/@tensorflow/tfjs-core/dist/ops/max_pool.js"),d=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),l=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"),c=n(/*! ./space_to_batch_nd */"./node_modules/@tensorflow/tfjs-core/dist/ops/space_to_batch_nd.js");const f=Object(d.op)({pool_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n,d,f,p){null==f&&(f=[1,1]),null==p&&(p=1),0===d&&(d="valid");const m=Object(s.convertToTensor)(e,"x","maxPool");let h=m,b=!1;3===m.rank&&(b=!0,h=Object(l.reshape)(m,[1,m.shape[0],m.shape[1],m.shape[2]])),o.assert(a.eitherStridesOrDilationsAreOne(p,f),(()=>`Error in pool: Either strides or dilations must be 1. Got strides ${p} and dilations '${f}'`));const j=a.computePool2DInfo(h.shape,t,p,f,d),g=[j.dilationHeight,j.dilationWidth];let w;w="same"===d?function(e,t){const n=e.map(((e,n)=>e+(e-1)*(t[n]-1))).map((e=>e-1)),s=n.map((e=>Math.floor(e/2))),o=n.map(((e,t)=>e-s[t]));return n.map(((e,t)=>[s[t],o[t]]))}([j.filterHeight,j.filterWidth],g):[[0,0],[0,0]];const _=1===g[0]&&1===g[1],[k,v]=function(e,t,n){const s=n.map((e=>e[0])),o=n.map((e=>e[1])),r=e.concat(s,o),i=t.map(((e,t)=>(e-r[t]%e)%e)),a=o.map(((e,t)=>e+i[t])),u=t.map(((e,t)=>[s[t],a[t]])),d=t.map(((e,t)=>[0,i[t]]));return[u,d]}([j.inHeight,j.inWidth],g,w),x=_?d:"valid",y=_?h:Object(c.spaceToBatchND)(h,g,k),O=("avg"===n?()=>Object(r.avgPool)(y,t,p,x):()=>Object(u.maxPool)(y,t,p,x))(),I=_?O:Object(i.batchToSpaceND)(O,g,v);return b?Object(l.reshape)(I,[I.shape[1],I.shape[2],I.shape[3]]):I}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/pow.js": +/*!************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/pow.js ***! + \************************************************************/ +/*! exports provided: pow */function(e,t,n){"use strict";n.r(t),n.d(t,"pow",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),i=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(a.op)({pow_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t){let n=Object(i.convertToTensor)(e,"base","pow"),a=Object(i.convertToTensor)(t,"exp","pow");[n,a]=Object(r.makeTypesMatch)(n,a);const u={a:n,b:a};return s.ENGINE.runKernel(o.Pow,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/prelu.js": +/*!**************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/prelu.js ***! + \**************************************************************/ +/*! exports provided: prelu */function(e,t,n){"use strict";n.r(t),n.d(t,"prelu",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({prelu_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t){const n={x:Object(r.convertToTensor)(e,"x","prelu"),alpha:Object(r.convertToTensor)(t,"alpha","prelu")};return s.ENGINE.runKernel(o.Prelu,n)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/print.js": +/*!**************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/print.js ***! + \**************************************************************/ +/*! exports provided: print */function(e,t,n){"use strict"; +/** + * @license + * Copyright 2020 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function s(e,t=!1){console.log(e.toString(t))}n.r(t),n.d(t,"print",(function(){return s}))},"./node_modules/@tensorflow/tfjs-core/dist/ops/prod.js": +/*!*************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/prod.js ***! + \*************************************************************/ +/*! exports provided: prod */function(e,t,n){"use strict";n.r(t),n.d(t,"prod",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./cast */"./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(a.op)({prod_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t=null,n=!1){let a=Object(r.convertToTensor)(e,"x","prod");"bool"===a.dtype&&(a=Object(i.cast)(a,"int32"));const u={x:a},d={axis:t,keepDims:n};return s.ENGINE.runKernel(o.Prod,u,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/rand.js": +/*!*************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/rand.js ***! + \*************************************************************/ +/*! exports provided: rand */function(e,t,n){"use strict";n.r(t),n.d(t,"rand",(function(){return i}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const i=Object(r.op)({rand_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n){const r=Object(o.sizeFromShape)(e);let i=null;if(null==n||"float32"===n)i=new Float32Array(r);else if("int32"===n)i=new Int32Array(r);else{if("bool"!==n)throw new Error(`Unknown data type ${n}`);i=new Uint8Array(r)}for(let e=0;e=1||0===r);const i=Math.sqrt(-2*Math.log(r)/r);e=this.mean+this.stdDev*s*i,t=this.mean+this.stdDev*o*i,this.truncated&&!this.isValidTruncated(e)||(n=!0)}return this.truncated&&!this.isValidTruncated(t)||(this.nextVal=this.convertValue(t)),this.convertValue(e)}convertValue(e){return null==this.dtype||"float32"===this.dtype?e:Math.round(e)}isValidTruncated(e){return e<=this.upper&&e>=this.lower}}class i{constructor(e,t,n,o){this.alpha=e,this.beta=1/t,this.dtype=n;const i=o||Math.random();this.randu=s.alea(i.toString()),this.randn=new r(0,1,n,!1,this.randu()),this.d=e<1?e+2/3:e-1/3,this.c=1/Math.sqrt(9*this.d)}nextValue(){let e,t,n,s,o,r;for(;;){do{s=this.randn.nextValue(),r=1+this.c*s}while(r<=0);if(r*=r*r,e=s*s,t=1-.331*e*e,n=.5*e+this.d*(1-r+Math.log(r)),o=this.randu(),onull==this.dtype||"float32"===this.dtype,this.min=e,this.range=t-e,this.dtype=n,null==o&&(o=Math.random()),"number"==typeof o&&(o=o.toString()),!this.canReturnFloat()&&this.range<=1)throw new Error(`The difference between ${e} - ${t} <= 1 and dtype is not float`);this.random=s.alea(o)}convertValue(e){return this.canReturnFloat()?e:Math.round(e)}nextValue(){return this.convertValue(this.min+this.range*this.random())}}function u(e){const t=e.length,n=function(e){const t=l(e),n=e.length;let s=0,o=0;for(let r=0;r5.991)throw new Error(`Invalid p-value for JB: ${o}`)}function d(e,t,n,s){null==s&&(s=Object(o.testEpsilon)());const r=l(e);Object(o.expectNumbersClose)(r,t,s),Object(o.expectNumbersClose)(function(e,t){let n=0;for(let s=0;s`Error in reverse1D: x must be rank 1 but got rank ${t.rank}.`)),Object(i.reverse)(t,0)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/reverse_2d.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/reverse_2d.js ***! + \*******************************************************************/ +/*! exports provided: reverse2d */function(e,t,n){"use strict";n.r(t),n.d(t,"reverse2d",(function(){return a}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),i=n(/*! ./reverse */"./node_modules/@tensorflow/tfjs-core/dist/ops/reverse.js");const a=Object(r.op)({reverse2d_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t){const n=Object(s.convertToTensor)(e,"x","reverse");return o.assert(2===n.rank,(()=>`Error in reverse2D: x must be rank 2 but got rank ${n.rank}.`)),Object(i.reverse)(n,t)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/reverse_3d.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/reverse_3d.js ***! + \*******************************************************************/ +/*! exports provided: reverse3d */function(e,t,n){"use strict";n.r(t),n.d(t,"reverse3d",(function(){return a}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),i=n(/*! ./reverse */"./node_modules/@tensorflow/tfjs-core/dist/ops/reverse.js");const a=Object(r.op)({reverse3d_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t){const n=Object(s.convertToTensor)(e,"x","reverse");return o.assert(3===n.rank,(()=>`Error in reverse3D: x must be rank 3 but got rank ${n.rank}.`)),Object(i.reverse)(n,t)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/reverse_4d.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/reverse_4d.js ***! + \*******************************************************************/ +/*! exports provided: reverse4d */function(e,t,n){"use strict";n.r(t),n.d(t,"reverse4d",(function(){return a}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),i=n(/*! ./reverse */"./node_modules/@tensorflow/tfjs-core/dist/ops/reverse.js");const a=Object(r.op)({reverse4d_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t){const n=Object(s.convertToTensor)(e,"x","reverse");return o.assert(4===n.rank,(()=>`Error in reverse4D: x must be rank 4 but got rank ${n.rank}.`)),Object(i.reverse)(n,t)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/rotate_util.js": +/*!********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/rotate_util.js ***! + \********************************************************************/ +/*! exports provided: getImageCenter */function(e,t,n){"use strict"; +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function s(e,t,n){return[n*("number"==typeof e?e:e[0]),t*("number"==typeof e?e:e[1])]}n.r(t),n.d(t,"getImageCenter",(function(){return s}))},"./node_modules/@tensorflow/tfjs-core/dist/ops/round.js": +/*!**************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/round.js ***! + \**************************************************************/ +/*! exports provided: round */function(e,t,n){"use strict";n.r(t),n.d(t,"round",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({round_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){const t={x:Object(r.convertToTensor)(e,"x","round")};return s.ENGINE.runKernel(o.Round,t)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/rsqrt.js": +/*!**************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/rsqrt.js ***! + \**************************************************************/ +/*! exports provided: rsqrt */function(e,t,n){"use strict";n.r(t),n.d(t,"rsqrt",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({rsqrt_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){const t={x:Object(r.convertToTensor)(e,"x","rsqrt")};return s.ENGINE.runKernel(o.Rsqrt,t)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js": +/*!***************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js ***! + \***************************************************************/ +/*! exports provided: scalar */function(e,t,n){"use strict";n.r(t),n.d(t,"scalar",(function(){return r}));var s=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),o=n(/*! ./tensor_ops_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor_ops_util.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e,t){if((Object(s.isTypedArray)(e)&&"string"!==t||Array.isArray(e))&&"complex64"!==t)throw new Error("Error creating a new Scalar: value must be a primitive (number|boolean|string)");if("string"===t&&Object(s.isTypedArray)(e)&&!(e instanceof Uint8Array))throw new Error("When making a scalar from encoded string, the value must be `Uint8Array`.");return Object(o.makeTensor)(e,[],[],t)}},"./node_modules/@tensorflow/tfjs-core/dist/ops/scatter_nd.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/scatter_nd.js ***! + \*******************************************************************/ +/*! exports provided: scatterND */function(e,t,n){"use strict";n.r(t),n.d(t,"scatterND",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),a=n(/*! ./scatter_nd_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/scatter_nd_util.js");const u=Object(i.op)({scatterND_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n){const i=Object(r.convertToTensor)(e,"indices","scatterND","int32"),u=Object(r.convertToTensor)(t,"updates","scatterND");a.validateInput(u,i,n);const d={indices:i,updates:u},l={shape:n};return s.ENGINE.runKernel(o.ScatterNd,d,l)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/scatter_nd_util.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/scatter_nd_util.js ***! + \************************************************************************/ +/*! exports provided: validateUpdateShape, validateInput, calculateShapes */function(e,t,n){"use strict";n.r(t),n.d(t,"validateUpdateShape",(function(){return o})),n.d(t,"validateInput",(function(){return r})),n.d(t,"calculateShapes",(function(){return i}));var s=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js");function o(e,t,n){const s=t.rank>1?t.shape[t.rank-1]:1,o=t.rank>1?t.rank-1:1,r=`Must have updates.shape = indices.shape[:batchDim] + shape[sliceDim:], got updates.shape: ${n.shape}, indices.shape: ${t.shape}, shape: ${e}, sliceDim: ${s}, and batchDim: ${o}.`;if(n.rank1?t.shape[o-1]:1,i=n.length;let a=1;for(let e=r;et||n===e?r=!0:n=Object(s.nearestDivisor)(e,n+1);return n}function i(e,t,n){const s=[],o=e.length;for(let r=0;ro))throw new Error(`Expect batchDims in the range of [-${o}, ${o}], but got ${s}`);if(s<0&&(s+=o),s>r)throw new Error(`batchDims (${s}) must be less than rank(x) (\n ${r}).`);if(n`Error in separableConv2d: input must be rank 4, but got rank ${h.rank}.`)),o.assert(4===p.rank,(()=>`Error in separableConv2d: depthwise filter must be rank 4, but got rank ${p.rank}.`)),o.assert(4===m.rank,(()=>`Error in separableConv2d: pointwise filter must be rank 4, but got rank ${p.rank}.`)),o.assert(1===m.shape[0],(()=>`Error in separableConv2d: the first dimension of pointwise filter must be 1, but got ${m.shape[0]}.`)),o.assert(1===m.shape[1],(()=>`Error in separableConv2d: the second dimension of pointwise filter must be 1, but got ${m.shape[1]}.`));const j=p.shape[2],g=p.shape[3];o.assert(m.shape[2]===j*g,(()=>`Error in separableConv2d: the third dimension of pointwise filter must be ${j*g}, but got ${m.shape[2]}.`));const w=Object(i.depthwiseConv2d)(h,p,a,d,c,l),_=Object(r.conv2d)(w,m,1,"valid",c);return b?Object(u.reshape)(_,[_.shape[1],_.shape[2],_.shape[3]]):_}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/setdiff1d_async.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/setdiff1d_async.js ***! + \************************************************************************/ +/*! exports provided: setdiff1dAsync */function(e,t,n){"use strict";n.r(t),n.d(t,"setdiff1dAsync",(function(){return i}));var s=n(/*! ../tensor */"./node_modules/@tensorflow/tfjs-core/dist/tensor.js"),o=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),r=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js");const i= +/** + * @license + * Copyright 2020 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +async function(e,t){const n=Object(o.convertToTensor)(e,"x","setdiff1d"),i=Object(o.convertToTensor)(t,"y","setdiff1d");r.assert(n.dtype===i.dtype,(()=>`x and y should have the same dtype, but got x (${n.dtype}) and y (${i.dtype}).`)),r.assert(1===n.rank,(()=>`x should be 1D tensor, but got x (${n.shape}).`)),r.assert(1===i.rank,(()=>`y should be 1D tensor, but got y (${i.shape}).`));const a=await n.data(),u=await i.data(),d=new Set(u);let l=0;for(let e=0;e`slice1d expects a rank-1 tensor, but got a rank-${r.rank} tensor`)),Object(i.slice)(r,[t],[n])}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/slice2d.js": +/*!****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/slice2d.js ***! + \****************************************************************/ +/*! exports provided: slice2d */function(e,t,n){"use strict";n.r(t),n.d(t,"slice2d",(function(){return a}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),i=n(/*! ./slice */"./node_modules/@tensorflow/tfjs-core/dist/ops/slice.js");const a=Object(r.op)({slice2d_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n){const r=Object(s.convertToTensor)(e,"x","slice2d");return o.assert(2===r.rank,(()=>`slice2d expects a rank-2 tensor, but got a rank-${r.rank} tensor`)),Object(i.slice)(r,t,n)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/slice3d.js": +/*!****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/slice3d.js ***! + \****************************************************************/ +/*! exports provided: slice3d */function(e,t,n){"use strict";n.r(t),n.d(t,"slice3d",(function(){return a}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),i=n(/*! ./slice */"./node_modules/@tensorflow/tfjs-core/dist/ops/slice.js");const a=Object(r.op)({slice3d_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n){const r=Object(s.convertToTensor)(e,"x","slice3d");return o.assert(3===r.rank,(()=>`slice3d expects a rank-3 tensor, but got a rank-${r.rank} tensor`)),Object(i.slice)(r,t,n)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/slice4d.js": +/*!****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/slice4d.js ***! + \****************************************************************/ +/*! exports provided: slice4d */function(e,t,n){"use strict";n.r(t),n.d(t,"slice4d",(function(){return a}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),i=n(/*! ./slice */"./node_modules/@tensorflow/tfjs-core/dist/ops/slice.js");const a=Object(r.op)({slice4d_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n){const r=Object(s.convertToTensor)(e,"x","slice4d");return o.assert(4===r.rank,(()=>`slice4d expects a rank-4 tensor, but got a rank-${r.rank} tensor`)),Object(i.slice)(r,t,n)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/slice_util.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/slice_util.js ***! + \*******************************************************************/ +/*! exports provided: assertParamsValid, maskToAxes, computeOutShape, stridesWithElidedDims, getNormalizedAxes, startIndicesWithElidedDims, stopIndicesWithElidedDims, stridesForAxis, startForAxis, stopForAxis, isSliceContinous, computeFlatOffset, parseSliceParams, sliceInfo */function(e,t,n){"use strict";n.r(t),n.d(t,"assertParamsValid",(function(){return o})),n.d(t,"maskToAxes",(function(){return r})),n.d(t,"computeOutShape",(function(){return i})),n.d(t,"stridesWithElidedDims",(function(){return a})),n.d(t,"getNormalizedAxes",(function(){return l})),n.d(t,"startIndicesWithElidedDims",(function(){return c})),n.d(t,"stopIndicesWithElidedDims",(function(){return f})),n.d(t,"stridesForAxis",(function(){return p})),n.d(t,"startForAxis",(function(){return m})),n.d(t,"stopForAxis",(function(){return h})),n.d(t,"isSliceContinous",(function(){return b})),n.d(t,"computeFlatOffset",(function(){return j})),n.d(t,"parseSliceParams",(function(){return g})),n.d(t,"sliceInfo",(function(){return w}));var s=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */function o(e,t,n){const o=e.shape.length;s.assert(o===t.length,(()=>`Error in slice${o}D: Length of begin ${t} must match the rank of the array (${o}).`)),s.assert(o===n.length,(()=>`Error in slice${o}D: Length of size ${n} must match the rank of the array (${o}).`));for(let r=0;r`Error in slice${o}D: begin[${r}] + size[${r}] (${t[r]+n[r]}) would overflow input.shape[${r}] (${e.shape[r]})`))}function r(e){const t=[];let n=0;for(;e>0;)1&e&&t.push(n),e/=2,n++;return t}function i(e,t,n){const s=[];for(let o=0;o0){const d=t[0],l=n+1;b=c(i,d,l,s,e),j=f(u,d,l,o,e),g=a(r,d,l,e)}else for(let t=0;t-1)r[o]=0;else{const i=u(t,n,o);let a=s[i];e&1<-1)i[s]=Number.MAX_SAFE_INTEGER;else{const r=u(t,n,s);let a=o[r];e&1<0?Number.MIN_SAFE_INTEGER:Number.MAX_SAFE_INTEGER);const d=o[r];return a<0&&(a+=d),a=s.clamp(0,a,d-1),a}function h(e,t,n,o,r,i){let a=t[r];const u=n[r]||1;(e&1<0?Number.MAX_SAFE_INTEGER:Number.MIN_SAFE_INTEGER);const d=o[r];return a<0&&(a+=d),a=u>0?s.clamp(0,a,d):s.clamp(-1,a,d-1),a}function b(e,t,n){let s=n.length;for(let e=0;e1){s=e;break}for(let o=s+1;o0||n[o]!==e[o])return!1;return!0}function j(e,t){let n=e.length>0?e[e.length-1]:1;for(let s=0;s{s.assert(-1!==e,(()=>"slice() does not support negative begin indexing."))})),i=null==n?new Array(r).fill(-1):"number"==typeof n?[n,...new Array(r-1).fill(-1)]:n.lengtht>=0?t:(s.assert(-1===t,(()=>`Negative size values should be exactly -1 but got ${t} for the slice() size at index ${n}.`)),e.shape[n]-o[n]))),[o,i]}function w(e,t,n,s,o,a,u,d,c){let f=t.slice(),p=n.slice(),m=s;null==s&&(m=new Array(f.length));const h=r(u);if(h.length>1)throw new Error("Multiple ellipses in slice is not allowed.");if(0!==u&&0!==d)throw new Error("Using both ellipsisMask and newAxisMask is not yet supported.");if(0!==u&&0!==c)throw new Error("Using both ellipsisMask and shrinkAxisMask is not yet supported.");const b=e.length-f.length,j=r(d),g=e.slice();j.forEach((e=>{f[e]=0,p[e]=1,g.splice(e,0,1)}));const{begin:w,end:_,strides:k}=l(g,h,b,f,p,m,o,a,u);f=w,p=_,m=k;const v=r(c);v.forEach((e=>{p[e]=f[e]+1,m[e]=1}));const x=i(f,p,m),y=x.filter(((e,t)=>-1===v.indexOf(t)));return{nonStrided:m.every((e=>1===e)),$begin:f,$end:p,$strides:m,size:x,newShape:g,outShape:y}}},"./node_modules/@tensorflow/tfjs-core/dist/ops/softmax.js": +/*!****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/softmax.js ***! + \****************************************************************/ +/*! exports provided: softmax */function(e,t,n){"use strict";n.r(t),n.d(t,"softmax",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({softmax_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t=-1){const n=Object(r.convertToTensor)(e,"logits","softmax","float32");if(-1===t&&(t=n.rank-1),t!==n.rank-1)throw Error(`Softmax along a non-last dimension is not yet supported. Logits was rank ${n.rank} and dim was ${t}`);const i={logits:n},a={dim:t};return s.ENGINE.runKernel(o.Softmax,i,a)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/softplus.js": +/*!*****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/softplus.js ***! + \*****************************************************************/ +/*! exports provided: softplus */function(e,t,n){"use strict";n.r(t),n.d(t,"softplus",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({softplus_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){const t={x:Object(r.convertToTensor)(e,"x","softplus")};return s.ENGINE.runKernel(o.Softplus,t)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/space_to_batch_nd.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/space_to_batch_nd.js ***! + \**************************************************************************/ +/*! exports provided: spaceToBatchND */function(e,t,n){"use strict";n.r(t),n.d(t,"spaceToBatchND",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(a.op)({spaceToBatchND_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n){const a=Object(r.convertToTensor)(e,"x","spaceToBatchND");i.assert(a.rank>=1+t.length,(()=>`input rank ${a.rank} should be > than [blockShape] ${t.length}`)),i.assert(n.length===t.length,(()=>`paddings.shape[0] ${n.length} must be equal to [blockShape] ${t.length}`)),i.assert(a.shape.reduce(((e,s,o)=>o>0&&o<=t.length?e&&(s+n[o-1][0]+n[o-1][1])%t[o-1]==0:e),!0),(()=>`input spatial dimensions ${a.shape.slice(1)} with paddings ${n.toString()} must be divisible by blockShapes ${t.toString()}`));const u={x:a},d={blockShape:t,paddings:n};return s.ENGINE.runKernel(o.SpaceToBatchND,u,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/sparse/sparse_fill_empty_rows.js": +/*!**************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/sparse/sparse_fill_empty_rows.js ***! + \**************************************************************************************/ +/*! exports provided: sparseFillEmptyRows */function(e,t,n){"use strict";n.r(t),n.d(t,"sparseFillEmptyRows",(function(){return a}));var s=n(/*! ../../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({sparseFillEmptyRows_: +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n,i){const a=Object(r.convertToTensor)(e,"indices","sparseFillEmptyRows"),u=Object(r.convertToTensor)(t,"values","sparseFillEmptyRows"),d=Object(r.convertToTensor)(n,"denseShape","sparseFillEmptyRows"),l=Object(r.convertToTensor)(i,"defaultValue","sparseFillEmptyRows",u.dtype);if(2!==a.rank)throw new Error(`Indices should be Tensor2D but received shape\n ${a.shape}`);if(1!==u.rank)throw new Error(`Values should be Tensor1D but received shape ${u.shape}`);if(1!==d.rank)throw new Error(`Dense shape should be Tensor1D but received shape ${d.shape}`);if(0!==l.rank)throw new Error(`Default value should be a scalar but received shape ${l.shape}`);const c={indices:a,values:u,denseShape:d,defaultValue:l},f=s.ENGINE.runKernel(o.SparseFillEmptyRows,c);return{outputIndices:f[0],outputValues:f[1],emptyRowIndicator:f[2],reverseIndexMap:f[3]}}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/sparse/sparse_reshape.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/sparse/sparse_reshape.js ***! + \******************************************************************************/ +/*! exports provided: sparseReshape */function(e,t,n){"use strict";n.r(t),n.d(t,"sparseReshape",(function(){return a}));var s=n(/*! ../../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({sparseReshape_: +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n){const i=Object(r.convertToTensor)(e,"inputIndices","sparseReshape"),a=Object(r.convertToTensor)(t,"inputShape","sparseReshape"),u=Object(r.convertToTensor)(n,"newShape","sparseReshape");if(2!==i.rank)throw new Error(`Input indices should be Tensor2D but received shape\n ${i.shape}`);if(1!==a.rank)throw new Error(`Input shape should be Tensor1D but received shape ${a.shape}`);if(1!==u.rank)throw new Error(`New shape should be Tensor1D but received shape ${u.shape}`);const d={inputIndices:i,inputShape:a,newShape:u},l=s.ENGINE.runKernel(o.SparseReshape,d);return{outputIndices:l[0],outputShape:l[1]}}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/sparse/sparse_segment_mean.js": +/*!***********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/sparse/sparse_segment_mean.js ***! + \***********************************************************************************/ +/*! exports provided: sparseSegmentMean */function(e,t,n){"use strict";n.r(t),n.d(t,"sparseSegmentMean",(function(){return a}));var s=n(/*! ../../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({sparseSegmentMean_: +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n){const i=Object(r.convertToTensor)(e,"data","sparseSegmentMean"),a=Object(r.convertToTensor)(t,"indices","sparseSegmentMean"),u=Object(r.convertToTensor)(n,"segmentIds","sparseSegmentMean");if(i.rank<1)throw new Error("Data should be at least 1 dimensional but received scalar");if(1!==a.rank)throw new Error(`Indices should be Tensor1D but received shape\n ${a.shape}`);if(1!==u.rank)throw new Error(`Segment ids should be Tensor1D but received shape\n ${u.shape}`);const d={data:i,indices:a,segmentIds:u};return s.ENGINE.runKernel(o.SparseSegmentMean,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/sparse/sparse_segment_sum.js": +/*!**********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/sparse/sparse_segment_sum.js ***! + \**********************************************************************************/ +/*! exports provided: sparseSegmentSum */function(e,t,n){"use strict";n.r(t),n.d(t,"sparseSegmentSum",(function(){return a}));var s=n(/*! ../../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({sparseSegmentSum_: +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n){const i=Object(r.convertToTensor)(e,"data","sparseSegmentSum"),a=Object(r.convertToTensor)(t,"indices","sparseSegmentSum"),u=Object(r.convertToTensor)(n,"segmentIds","sparseSegmentSum");if(i.rank<1)throw new Error("Data should be at least 1 dimensional but received scalar");if(1!==a.rank)throw new Error(`Indices should be Tensor1D but received shape\n ${a.shape}`);if(1!==u.rank)throw new Error(`Segment ids should be Tensor1D but received shape\n ${u.shape}`);const d={data:i,indices:a,segmentIds:u};return s.ENGINE.runKernel(o.SparseSegmentSum,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/sparse_to_dense.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/sparse_to_dense.js ***! + \************************************************************************/ +/*! exports provided: sparseToDense */function(e,t,n){"use strict";n.r(t),n.d(t,"sparseToDense",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../ops/sparse_to_dense_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/sparse_to_dense_util.js"),i=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(a.op)({sparseToDense_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n,a=0){const u=Object(i.convertToTensor)(e,"sparseIndices","sparseToDense","int32"),d=Object(i.convertToTensor)(t,"sparseValues","sparseToDense"),l=Object(i.convertToTensor)(a,"defaultValue","sparseToDense",d.dtype);r.validateInput(u,d,n,l);const c={sparseIndices:u,sparseValues:d,defaultValue:l},f={outputShape:n};return s.ENGINE.runKernel(o.SparseToDense,c,f)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/sparse_to_dense_util.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/sparse_to_dense_util.js ***! + \*****************************************************************************/ +/*! exports provided: validateInput */function(e,t,n){"use strict";function s(e,t,n,s){if("int32"!==e.dtype)throw new Error(`tf.sparseToDense() expects the indices to be int32 type, but the dtype was ${e.dtype}.`);if(e.rank>2)throw new Error(`sparseIndices should be a scalar, vector, or matrix, but got shape ${e.shape}.`);const o=e.rank>0?e.shape[0]:1,r=e.rank>1?e.shape[1]:1;if(n.length!==r)throw new Error(`outputShape has incorrect number of elements:, ${n.length}, should be: ${r}.`);const i=t.size;if(0!==t.rank&&(1!==t.rank||i!==o))throw new Error(`sparseValues has incorrect shape ${t.shape}, should be [] or [${o}]`);if(t.dtype!==s.dtype)throw new Error("sparseValues.dtype must match defaultValues.dtype")}n.r(t),n.d(t,"validateInput",(function(){return s}))},"./node_modules/@tensorflow/tfjs-core/dist/ops/spectral/fft.js": +/*!*********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/spectral/fft.js ***! + \*********************************************************************/ +/*! exports provided: fft */function(e,t,n){"use strict";n.r(t),n.d(t,"fft",(function(){return a}));var s=n(/*! ../../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),i=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({fft_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){Object(r.assert)("complex64"===e.dtype,(()=>`The dtype for tf.spectral.fft() must be complex64 but got ${e.dtype}.`));const t={input:e};return s.ENGINE.runKernel(o.FFT,t)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/spectral/ifft.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/spectral/ifft.js ***! + \**********************************************************************/ +/*! exports provided: ifft */function(e,t,n){"use strict";n.r(t),n.d(t,"ifft",(function(){return a}));var s=n(/*! ../../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),i=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({ifft_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){Object(r.assert)("complex64"===e.dtype,(()=>`The dtype for tf.spectral.ifft() must be complex64 but got ${e.dtype}.`));const t={input:e};return s.ENGINE.runKernel(o.IFFT,t)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/spectral/irfft.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/spectral/irfft.js ***! + \***********************************************************************/ +/*! exports provided: irfft */function(e,t,n){"use strict";n.r(t),n.d(t,"irfft",(function(){return m}));var s=n(/*! ../complex */"./node_modules/@tensorflow/tfjs-core/dist/ops/complex.js"),o=n(/*! ../concat */"./node_modules/@tensorflow/tfjs-core/dist/ops/concat.js"),r=n(/*! ../imag */"./node_modules/@tensorflow/tfjs-core/dist/ops/imag.js"),i=n(/*! ../mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),a=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),u=n(/*! ../real */"./node_modules/@tensorflow/tfjs-core/dist/ops/real.js"),d=n(/*! ../reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"),l=n(/*! ../reverse */"./node_modules/@tensorflow/tfjs-core/dist/ops/reverse.js"),c=n(/*! ../scalar */"./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"),f=n(/*! ../slice */"./node_modules/@tensorflow/tfjs-core/dist/ops/slice.js"),p=n(/*! ./ifft */"./node_modules/@tensorflow/tfjs-core/dist/ops/spectral/ifft.js");const m=Object(a.op)({irfft_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){const t=e.shape[e.shape.length-1],n=e.size/t;let a;if(t<=2){const s=Object(d.reshape)(e,[n,t]);a=Object(p.ifft)(s)}else{const m=[n,2*(t-1)],h=Object(d.reshape)(Object(u.real)(e),[n,t]),b=Object(d.reshape)(Object(r.imag)(e),[n,t]),j=Object(l.reverse)(Object(f.slice)(h,[0,1],[n,t-2]),1),g=Object(i.mul)(Object(l.reverse)(Object(f.slice)(b,[0,1],[n,t-2]),1),Object(c.scalar)(-1)),w=Object(o.concat)([h,j],1),_=Object(o.concat)([b,g],1),k=Object(d.reshape)(Object(s.complex)(w,_),[m[0],m[1]]);a=Object(p.ifft)(k)}if(a=Object(u.real)(a),3===e.rank&&0!==e.shape[0]){const t=a,n=e.shape[0];a=Object(d.reshape)(a,[n,a.shape[0]/n,a.shape[1]]),t.dispose()}return a}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/spectral/rfft.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/spectral/rfft.js ***! + \**********************************************************************/ +/*! exports provided: rfft */function(e,t,n){"use strict";n.r(t),n.d(t,"rfft",(function(){return h}));var s=n(/*! ../../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),o=n(/*! ../complex */"./node_modules/@tensorflow/tfjs-core/dist/ops/complex.js"),r=n(/*! ../concat */"./node_modules/@tensorflow/tfjs-core/dist/ops/concat.js"),i=n(/*! ../imag */"./node_modules/@tensorflow/tfjs-core/dist/ops/imag.js"),a=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),u=n(/*! ../real */"./node_modules/@tensorflow/tfjs-core/dist/ops/real.js"),d=n(/*! ../reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"),l=n(/*! ../slice */"./node_modules/@tensorflow/tfjs-core/dist/ops/slice.js"),c=n(/*! ../split */"./node_modules/@tensorflow/tfjs-core/dist/ops/split.js"),f=n(/*! ../zeros */"./node_modules/@tensorflow/tfjs-core/dist/ops/zeros.js"),p=n(/*! ../zeros_like */"./node_modules/@tensorflow/tfjs-core/dist/ops/zeros_like.js"),m=n(/*! ./fft */"./node_modules/@tensorflow/tfjs-core/dist/ops/spectral/fft.js");const h=Object(a.op)({rfft_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t){Object(s.assert)("float32"===e.dtype,(()=>`The dtype for rfft() must be real value but got ${e.dtype}`));let n=e.shape[e.shape.length-1];const a=e.size/n;let h;if(null!=t&&t0)),o=e.shape.map((e=>e));o[e.shape.length-1]=t,h=Object(l.slice)(e,s,o),n=t}else if(null!=t&&t>n){const s=e.shape.map((e=>e));s[e.shape.length-1]=t-n,h=Object(r.concat)([e,Object(f.zeros)(s)],e.shape.length-1),n=t}else h=e;const b=Object(p.zerosLike)(h),j=Object(d.reshape)(Object(o.complex)(h,b),[a,n]),g=Object(m.fft)(j),w=Math.floor(n/2)+1,_=Object(u.real)(g),k=Object(i.imag)(g),v=Object(c.split)(_,[w,n-w],_.shape.length-1),x=Object(c.split)(k,[w,n-w],k.shape.length-1),y=h.shape.slice();return y[h.shape.length-1]=w,Object(d.reshape)(Object(o.complex)(v[0],x[0]),y)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/split.js": +/*!**************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/split.js ***! + \**************************************************************/ +/*! exports provided: split */function(e,t,n){"use strict";n.r(t),n.d(t,"split",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({split_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n=0){const i={x:Object(r.convertToTensor)(e,"x","split")},a={numOrSizeSplits:t,axis:n};return s.ENGINE.runKernel(o.SplitV,i,a)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/split_util.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/split_util.js ***! + \*******************************************************************/ +/*! exports provided: prepareSplitSize */function(e,t,n){"use strict";n.r(t),n.d(t,"prepareSplitSize",(function(){return o}));var s=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js");function o(e,t,n=0){let o=[];if("number"==typeof t)Object(s.assert)(e.shape[n]%t==0,(()=>"Number of splits must evenly divide the axis.")),o=new Array(t).fill(e.shape[n]/t);else{const r=t.reduce(((e,t)=>(-1===t&&(e+=1),e)),0);Object(s.assert)(r<=1,(()=>"There should be only one negative value in split array."));const i=t.indexOf(-1);if(-1!==i){const s=t.reduce(((e,t)=>t>0?e+t:e));t[i]=e.shape[n]-s}Object(s.assert)(e.shape[n]===t.reduce(((e,t)=>e+t)),(()=>"The sum of sizes must match the size of the axis dimension.")),o=t}return o}},"./node_modules/@tensorflow/tfjs-core/dist/ops/sqrt.js": +/*!*************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/sqrt.js ***! + \*************************************************************/ +/*! exports provided: sqrt */function(e,t,n){"use strict";n.r(t),n.d(t,"sqrt",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({sqrt_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){const t={x:Object(r.convertToTensor)(e,"x","sqrt")};return s.ENGINE.runKernel(o.Sqrt,t)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/square.js": +/*!***************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/square.js ***! + \***************************************************************/ +/*! exports provided: square */function(e,t,n){"use strict";n.r(t),n.d(t,"square",(function(){return i}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),r=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const i=Object(r.op)({square_: +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){const t=Object(o.convertToTensor)(e,"x","square");return s.ENGINE.runKernel("Square",{x:t},{})}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/squared_difference.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/squared_difference.js ***! + \***************************************************************************/ +/*! exports provided: squaredDifference */function(e,t,n){"use strict";n.r(t),n.d(t,"squaredDifference",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),i=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),a=n(/*! ./broadcast_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js"),u=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(u.op)({squaredDifference_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t){let n=Object(i.convertToTensor)(e,"a","squaredDifference"),u=Object(i.convertToTensor)(t,"b","squaredDifference");[n,u]=Object(r.makeTypesMatch)(n,u),Object(a.assertAndGetBroadcastShape)(n.shape,u.shape);const d={a:n,b:u};return s.ENGINE.runKernel(o.SquaredDifference,d,{})}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/squeeze.js": +/*!****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/squeeze.js ***! + \****************************************************************/ +/*! exports provided: squeeze */function(e,t,n){"use strict";n.r(t),n.d(t,"squeeze",(function(){return a}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),i=n(/*! ./reshape */"./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js");const a=Object(r.op)({squeeze_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t){const n=Object(s.convertToTensor)(e,"x","squeeze");return Object(i.reshape)(n,Object(o.squeezeShape)(n.shape,t).newShape)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/stack.js": +/*!**************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/stack.js ***! + \**************************************************************/ +/*! exports provided: stack */function(e,t,n){"use strict";n.r(t),n.d(t,"stack",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(a.op)({stack_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t=0){const n=Object(r.convertToTensorArray)(e,"tensors","stack","string_or_numeric");i.assert(n.length>=1,(()=>"Pass at least one tensor to tf.stack")),n.length>0&&i.assert(t<=n[0].rank,(()=>"Axis must be <= rank of the tensor"));const a=n,u={axis:t};return s.ENGINE.runKernel(o.Pack,a,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/step.js": +/*!*************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/step.js ***! + \*************************************************************/ +/*! exports provided: step */function(e,t,n){"use strict";n.r(t),n.d(t,"step",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({step_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t=0){const n={x:Object(r.convertToTensor)(e,"x","step")},i={alpha:t};return s.ENGINE.runKernel(o.Step,n,i)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/strided_slice.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/strided_slice.js ***! + \**********************************************************************/ +/*! exports provided: stridedSlice */function(e,t,n){"use strict";n.r(t),n.d(t,"stridedSlice",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({stridedSlice_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n,i,a=0,u=0,d=0,l=0,c=0){const f={x:Object(r.convertToTensor)(e,"x","stridedSlice","string_or_numeric")},p={begin:t,end:n,strides:i,beginMask:a,endMask:u,ellipsisMask:d,newAxisMask:l,shrinkAxisMask:c};return s.ENGINE.runKernel(o.StridedSlice,f,p)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/string/string_n_grams.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/string/string_n_grams.js ***! + \******************************************************************************/ +/*! exports provided: stringNGrams */function(e,t,n){"use strict";n.r(t),n.d(t,"stringNGrams",(function(){return a}));var s=n(/*! ../../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({stringNGrams_: +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n,i,a,u,d,l){const c=Object(r.convertToTensor)(e,"data","stringNGrams","string");if("string"!==c.dtype)throw new Error("Data must be of datatype string");if(1!==c.shape.length)throw new Error(`Data must be a vector, saw: ${c.shape}`);const f=Object(r.convertToTensor)(t,"dataSplits","stringNGrams");if("int32"!==f.dtype)throw new Error("Data splits must be of datatype int32");const p={separator:n,nGramWidths:i,leftPad:a,rightPad:u,padWidth:d,preserveShortSequences:l},m={data:c,dataSplits:f},h=s.ENGINE.runKernel(o.StringNGrams,m,p);return{nGrams:h[0],nGramsSplits:h[1]}}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/string/string_split.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/string/string_split.js ***! + \****************************************************************************/ +/*! exports provided: stringSplit */function(e,t,n){"use strict";n.r(t),n.d(t,"stringSplit",(function(){return a}));var s=n(/*! ../../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({stringSplit_: +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n=!0){const i=Object(r.convertToTensor)(e,"input","stringSplit","string"),a=Object(r.convertToTensor)(t,"delimiter","stringSplit","string");if(1!==i.rank)throw new Error(`Input should be Tensor1D but received shape ${i.shape}`);if(0!==a.rank)throw new Error(`Delimiter should be a scalar but received shape ${a.shape}`);const u={skipEmpty:n},d={input:i,delimiter:a},l=s.ENGINE.runKernel(o.StringSplit,d,u);return{indices:l[0],values:l[1],shape:l[2]}}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/string/string_to_hash_bucket_fast.js": +/*!******************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/string/string_to_hash_bucket_fast.js ***! + \******************************************************************************************/ +/*! exports provided: stringToHashBucketFast */function(e,t,n){"use strict";n.r(t),n.d(t,"stringToHashBucketFast",(function(){return a}));var s=n(/*! ../../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({stringToHashBucketFast_: +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t){const n=Object(r.convertToTensor)(e,"input","stringToHashBucketFast","string"),i={numBuckets:t};if(t<=0)throw new Error("Number of buckets must be at least 1");const a={input:n};return s.ENGINE.runKernel(o.StringToHashBucketFast,a,i)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js": +/*!************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js ***! + \************************************************************/ +/*! exports provided: sub */function(e,t,n){"use strict";n.r(t),n.d(t,"sub",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"),i=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(a.op)({sub_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t){let n=Object(i.convertToTensor)(e,"a","sub"),a=Object(i.convertToTensor)(t,"b","sub");[n,a]=Object(r.makeTypesMatch)(n,a);const u={a:n,b:a};return s.ENGINE.runKernel(o.Sub,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/sum.js": +/*!************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/sum.js ***! + \************************************************************/ +/*! exports provided: sum */function(e,t,n){"use strict";n.r(t),n.d(t,"sum",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./cast */"./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(a.op)({sum_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t=null,n=!1){let a=Object(r.convertToTensor)(e,"x","sum");"bool"===a.dtype&&(a=Object(i.cast)(a,"int32"));const u={x:a},d={axis:t,keepDims:n};return s.ENGINE.runKernel(o.Sum,u,d)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/tan.js": +/*!************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/tan.js ***! + \************************************************************/ +/*! exports provided: tan */function(e,t,n){"use strict";n.r(t),n.d(t,"tan",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({tan_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){const t={x:Object(r.convertToTensor)(e,"x","tan")};return s.ENGINE.runKernel(o.Tan,t)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/tanh.js": +/*!*************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/tanh.js ***! + \*************************************************************/ +/*! exports provided: tanh */function(e,t,n){"use strict";n.r(t),n.d(t,"tanh",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({tanh_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){const t={x:Object(r.convertToTensor)(e,"x","tanh")};return s.ENGINE.runKernel(o.Tanh,t)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor.js": +/*!***************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/tensor.js ***! + \***************************************************************/ +/*! exports provided: tensor */function(e,t,n){"use strict";n.r(t),n.d(t,"tensor",(function(){return r}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ./tensor_ops_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor_ops_util.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e,t,n){const r=Object(s.inferShape)(e,n);return Object(o.makeTensor)(e,t,r,n)}},"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor1d.js": +/*!*****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/tensor1d.js ***! + \*****************************************************************/ +/*! exports provided: tensor1d */function(e,t,n){"use strict";n.r(t),n.d(t,"tensor1d",(function(){return i}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./tensor_ops_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor_ops_util.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e,t){Object(o.assertNonNull)(e);const n=Object(s.inferShape)(e,t);if(1!==n.length)throw new Error("tensor1d() requires values to be a flat/TypedArray");return Object(r.makeTensor)(e,null,n,t)}},"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor2d.js": +/*!*****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/tensor2d.js ***! + \*****************************************************************/ +/*! exports provided: tensor2d */function(e,t,n){"use strict";n.r(t),n.d(t,"tensor2d",(function(){return i}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./tensor_ops_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor_ops_util.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e,t,n){if(Object(o.assertNonNull)(e),null!=t&&2!==t.length)throw new Error("tensor2d() requires shape to have two numbers");const i=Object(s.inferShape)(e,n);if(2!==i.length&&1!==i.length)throw new Error("tensor2d() requires values to be number[][] or flat/TypedArray");if(1===i.length&&null==t)throw new Error("tensor2d() requires shape to be provided when `values` are a flat/TypedArray");return Object(r.makeTensor)(e,t,i,n)}},"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor3d.js": +/*!*****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/tensor3d.js ***! + \*****************************************************************/ +/*! exports provided: tensor3d */function(e,t,n){"use strict";n.r(t),n.d(t,"tensor3d",(function(){return i}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./tensor_ops_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor_ops_util.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e,t,n){if(Object(o.assertNonNull)(e),null!=t&&3!==t.length)throw new Error("tensor3d() requires shape to have three numbers");const i=Object(s.inferShape)(e,n);if(3!==i.length&&1!==i.length)throw new Error("tensor3d() requires values to be number[][][] or flat/TypedArray");if(1===i.length&&null==t)throw new Error("tensor3d() requires shape to be provided when `values` are a flat array");return Object(r.makeTensor)(e,t,i,n)}},"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor4d.js": +/*!*****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/tensor4d.js ***! + \*****************************************************************/ +/*! exports provided: tensor4d */function(e,t,n){"use strict";n.r(t),n.d(t,"tensor4d",(function(){return i}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./tensor_ops_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor_ops_util.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e,t,n){if(Object(o.assertNonNull)(e),null!=t&&4!==t.length)throw new Error("tensor4d() requires shape to have four numbers");const i=Object(s.inferShape)(e,n);if(4!==i.length&&1!==i.length)throw new Error("tensor4d() requires values to be number[][][][] or flat/TypedArray");if(1===i.length&&null==t)throw new Error("tensor4d() requires shape to be provided when `values` are a flat array");return Object(r.makeTensor)(e,t,i,n)}},"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor5d.js": +/*!*****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/tensor5d.js ***! + \*****************************************************************/ +/*! exports provided: tensor5d */function(e,t,n){"use strict";n.r(t),n.d(t,"tensor5d",(function(){return i}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./tensor_ops_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor_ops_util.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e,t,n){if(Object(o.assertNonNull)(e),null!=t&&5!==t.length)throw new Error("tensor5d() requires shape to have five numbers");const i=Object(s.inferShape)(e,n);if(5!==i.length&&1!==i.length)throw new Error("tensor5d() requires values to be number[][][][][] or flat/TypedArray");if(1===i.length&&null==t)throw new Error("tensor5d() requires shape to be provided when `values` are a flat array");return Object(r.makeTensor)(e,t,i,n)}},"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor6d.js": +/*!*****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/tensor6d.js ***! + \*****************************************************************/ +/*! exports provided: tensor6d */function(e,t,n){"use strict";n.r(t),n.d(t,"tensor6d",(function(){return i}));var s=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./tensor_ops_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor_ops_util.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e,t,n){if(Object(o.assertNonNull)(e),null!=t&&6!==t.length)throw new Error("tensor6d() requires shape to have six numbers");const i=Object(s.inferShape)(e,n);if(6!==i.length&&1!==i.length)throw new Error("tensor6d() requires values to be number[][][][][][] or flat/TypedArray");if(1===i.length&&null==t)throw new Error("tensor6d() requires shape to be provided when `values` are a flat array");return t=t||i,Object(r.makeTensor)(e,t,i,n)}},"./node_modules/@tensorflow/tfjs-core/dist/ops/tensor_ops_util.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/tensor_ops_util.js ***! + \************************************************************************/ +/*! exports provided: makeTensor */function(e,t,n){"use strict";n.r(t),n.d(t,"makeTensor",(function(){return r}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function r(e,t,n,r){if(null==r&&(r=Object(o.inferDtype)(e)),"complex64"===r)throw new Error("Cannot construct a complex64 tensor directly. Please use tf.complex(real, imag).");if(!Object(o.isTypedArray)(e)&&!Array.isArray(e)&&"number"!=typeof e&&"boolean"!=typeof e&&"string"!=typeof e)throw new Error("values passed to tensor(values) must be a number/boolean/string or an array of numbers/booleans/strings, or a TypedArray");if(null!=t){Object(o.assertNonNegativeIntegerDimensions)(t);const e=Object(o.sizeFromShape)(t),s=Object(o.sizeFromShape)(n);Object(o.assert)(e===s,(()=>`Based on the provided shape, [${t}], the tensor should have ${e} values but has ${s}`));for(let e=0;e`Error creating a new Tensor. Inferred shape (${n}) does not match the provided shape (${t}). `))}}return Object(o.isTypedArray)(e)||Array.isArray(e)||(e=[e]),t=t||n,e="string"!==r?Object(o.toTypedArray)(e,r):Object(o.flatten)(e,[],!0),s.ENGINE.makeTensor(e,t,r)}},"./node_modules/@tensorflow/tfjs-core/dist/ops/tile.js": +/*!*************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/tile.js ***! + \*************************************************************/ +/*! exports provided: tile */function(e,t,n){"use strict";n.r(t),n.d(t,"tile",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(a.op)({tile_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t){const n=Object(r.convertToTensor)(e,"x","tile","string_or_numeric");i.assert(n.rank===t.length,(()=>`Error in transpose: rank of input ${n.rank} must match length of reps ${t}.`));const a={x:n},u={reps:t};return s.ENGINE.runKernel(o.Tile,a,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/topk.js": +/*!*************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/topk.js ***! + \*************************************************************/ +/*! exports provided: topk */function(e,t,n){"use strict";n.r(t),n.d(t,"topk",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({topk_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t=1,n=!0){const i=Object(r.convertToTensor)(e,"x","topk");if(0===i.rank)throw new Error("topk() expects the input to be of rank 1 or higher");const a=i.shape[i.shape.length-1];if(t<0)throw new Error(`'k' passed to topk() must be >= 0 but got ${t}`);if(t>a)throw new Error(`'k' passed to topk() must be <= the last dimension (${a}) but got ${t}`);const u={x:i},d={k:t,sorted:n},[l,c]=s.ENGINE.runKernel(o.TopK,u,d);return{values:l,indices:c}}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/transpose.js": +/*!******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/transpose.js ***! + \******************************************************************/ +/*! exports provided: transpose */function(e,t,n){"use strict";n.r(t),n.d(t,"transpose",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(a.op)({transpose_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t){const n=Object(r.convertToTensor)(e,"x","transpose");if(null==t&&(t=n.shape.map(((e,t)=>t)).reverse()),i.assert(n.rank===t.length,(()=>`Error in transpose: rank of input ${n.rank} must match length of perm ${t}.`)),t.forEach((e=>{i.assert(e>=0&&e"All entries in 'perm' must be between 0 and "+(n.rank-1)+` but got ${t}`))})),n.rank<=1)return n.clone();const a={x:n},u={perm:t};return s.ENGINE.runKernel(o.Transpose,a,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/truncated_normal.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/truncated_normal.js ***! + \*************************************************************************/ +/*! exports provided: truncatedNormal */function(e,t,n){"use strict";n.r(t),n.d(t,"truncatedNormal",(function(){return i}));var s=n(/*! ./buffer */"./node_modules/@tensorflow/tfjs-core/dist/ops/buffer.js"),o=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"),r=n(/*! ./rand_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/rand_util.js");const i=Object(o.op)({truncatedNormal_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t=0,n=1,o,i){if(null!=o&&"bool"===o)throw new Error("Unsupported data type $ { dtype }");const a=new r.MPRandGauss(t,n,o,!0,i),u=Object(s.buffer)(e,o);for(let e=0;e0,(()=>"The input tensor must be at least 1D"));const a={x:n},u={axis:t},[d,l]=s.ENGINE.runKernel(o.Unique,a,u);return{values:d,indices:l}}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/unsorted_segment_sum.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/unsorted_segment_sum.js ***! + \*****************************************************************************/ +/*! exports provided: unsortedSegmentSum */function(e,t,n){"use strict";n.r(t),n.d(t,"unsortedSegmentSum",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(a.op)({unsortedSegmentSum_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n){const a=Object(r.convertToTensor)(e,"x","unsortedSegmentSum"),u=Object(r.convertToTensor)(t,"segmentIds","unsortedSegmentSum","int32");Object(i.assert)(Object(i.isInt)(n),(()=>"numSegments must be of dtype int"));const d={x:a,segmentIds:u},l={numSegments:n};return s.ENGINE.runKernel(o.UnsortedSegmentSum,d,l)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/unstack.js": +/*!****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/unstack.js ***! + \****************************************************************/ +/*! exports provided: unstack */function(e,t,n){"use strict";n.r(t),n.d(t,"unstack",(function(){return u}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),a=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const u=Object(a.op)({unstack_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t=0){const n=Object(r.convertToTensor)(e,"x","unstack","string_or_numeric");i.assert(t>=-n.shape.length&&t`Axis = ${t} is not in [-${n.shape.length}, ${n.shape.length})`));const a={value:n},u={axis:t};return s.ENGINE.runKernel(o.Unpack,a,u)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/variable.js": +/*!*****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/variable.js ***! + \*****************************************************************/ +/*! exports provided: variable */function(e,t,n){"use strict";n.r(t),n.d(t,"variable",(function(){return o}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */function o(e,t=!0,n,o){return s.ENGINE.makeVariable(e,t,n,o)}},"./node_modules/@tensorflow/tfjs-core/dist/ops/where.js": +/*!**************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/where.js ***! + \**************************************************************/ +/*! exports provided: where */function(e,t,n){"use strict";n.r(t),n.d(t,"where",(function(){return d}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./broadcast_to */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_to.js"),a=n(/*! ./broadcast_util */"./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js"),u=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const d=Object(u.op)({where_: +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e,t,n){const u=Object(r.convertToTensor)(t,"a","where"),d=Object(r.convertToTensor)(n,"b","where"),l=Object(r.convertToTensor)(e,"condition","where","bool"),c=Object(a.assertAndGetBroadcastShape)(Object(a.assertAndGetBroadcastShape)(l.shape,u.shape),d.shape),f={condition:Object(i.broadcastTo)(l,c),t:Object(i.broadcastTo)(u,c),e:Object(i.broadcastTo)(d,c)};return s.ENGINE.runKernel(o.Select,f)}})},"./node_modules/@tensorflow/tfjs-core/dist/ops/where_async.js": +/*!********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/where_async.js ***! + \********************************************************************/ +/*! exports provided: whereAsync */function(e,t,n){"use strict";n.r(t),n.d(t,"whereAsync",(function(){return r}));var s=n(/*! ../backends/where_impl */"./node_modules/@tensorflow/tfjs-core/dist/backends/where_impl.js"),o=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js");const r= +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +async function(e){const t=Object(o.convertToTensor)(e,"condition","whereAsync","bool"),n=await t.data(),r=Object(s.whereImpl)(t.shape,n);return e!==t&&t.dispose(),r}},"./node_modules/@tensorflow/tfjs-core/dist/ops/zeros.js": +/*!**************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/zeros.js ***! + \**************************************************************/ +/*! exports provided: zeros */function(e,t,n){"use strict";n.r(t),n.d(t,"zeros",(function(){return i}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"),r=n(/*! ./complex */"./node_modules/@tensorflow/tfjs-core/dist/ops/complex.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function i(e,t="float32"){if("complex64"===t){const t=i(e,"float32"),n=i(e,"float32");return Object(r.complex)(t,n)}const n=Object(o.makeZerosTypedArray)(Object(o.sizeFromShape)(e),t);return s.ENGINE.makeTensor(n,e,t)}},"./node_modules/@tensorflow/tfjs-core/dist/ops/zeros_like.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/zeros_like.js ***! + \*******************************************************************/ +/*! exports provided: zerosLike */function(e,t,n){"use strict";n.r(t),n.d(t,"zerosLike",(function(){return a}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../kernel_names */"./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"),r=n(/*! ../tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),i=n(/*! ./operation */"./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js");const a=Object(i.op)({zerosLike_: +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function(e){const t={x:Object(r.convertToTensor)(e,"x","zerosLike")};return s.ENGINE.runKernel(o.ZerosLike,t)}})},"./node_modules/@tensorflow/tfjs-core/dist/optimizers/adadelta_optimizer.js": +/*!**********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/optimizers/adadelta_optimizer.js ***! + \**********************************************************************************/ +/*! exports provided: AdadeltaOptimizer */function(e,t,n){"use strict";n.r(t),n.d(t,"AdadeltaOptimizer",(function(){return p}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../globals */"./node_modules/@tensorflow/tfjs-core/dist/globals.js"),r=n(/*! ../ops/add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),i=n(/*! ../ops/div */"./node_modules/@tensorflow/tfjs-core/dist/ops/div.js"),a=n(/*! ../ops/mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),u=n(/*! ../ops/ops */"./node_modules/@tensorflow/tfjs-core/dist/ops/ops.js"),d=n(/*! ../ops/square */"./node_modules/@tensorflow/tfjs-core/dist/ops/square.js"),l=n(/*! ../ops/zeros_like */"./node_modules/@tensorflow/tfjs-core/dist/ops/zeros_like.js"),c=n(/*! ../serialization */"./node_modules/@tensorflow/tfjs-core/dist/serialization.js"),f=n(/*! ./optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/optimizer.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class p extends f.Optimizer{constructor(e,t,n=null){super(),this.learningRate=e,this.rho=t,this.epsilon=n,this.accumulatedGrads=[],this.accumulatedUpdates=[],null==n&&(this.epsilon=s.ENGINE.backend.epsilon())}applyGradients(e){(Array.isArray(e)?e.map((e=>e.name)):Object.keys(e)).forEach(((t,n)=>{const c=s.ENGINE.registeredVariables[t];null==this.accumulatedGrads[n]&&(this.accumulatedGrads[n]={originalName:`${t}/accum_grad`,variable:Object(o.tidy)((()=>Object(l.zerosLike)(c).variable(false)))}),null==this.accumulatedUpdates[n]&&(this.accumulatedUpdates[n]={originalName:`${t}/accum_var`,variable:Object(o.tidy)((()=>Object(l.zerosLike)(c).variable(false)))});const f=Array.isArray(e)?e[n].tensor:e[t];if(null==f)return;const p=this.accumulatedGrads[n].variable,m=this.accumulatedUpdates[n].variable;Object(o.tidy)((()=>{const e=Object(r.add)(Object(a.mul)(p,this.rho),Object(a.mul)(Object(d.square)(f),1-this.rho)),t=Object(a.mul)(Object(i.div)(Object(u.sqrt)(Object(r.add)(m,this.epsilon)),Object(u.sqrt)(Object(r.add)(p,this.epsilon))),f),n=Object(r.add)(Object(a.mul)(m,this.rho),Object(a.mul)(Object(d.square)(t),1-this.rho));p.assign(e),m.assign(n);const s=Object(r.add)(Object(a.mul)(t,-this.learningRate),c);c.assign(s)}))})),this.incrementIterations()}dispose(){null!=this.accumulatedUpdates&&(Object(o.dispose)(this.accumulatedGrads.map((e=>e.variable))),Object(o.dispose)(this.accumulatedUpdates.map((e=>e.variable))))}async getWeights(){const e=[...this.accumulatedGrads,...this.accumulatedUpdates];return[await this.saveIterations()].concat(e.map((e=>({name:e.originalName,tensor:e.variable}))))}async setWeights(e){const t=(e=await this.extractIterations(e)).length/2;this.accumulatedGrads=e.slice(0,t).map((e=>({originalName:e.name,variable:e.tensor.variable(false)}))),this.accumulatedUpdates=e.slice(t,2*t).map((e=>({originalName:e.name,variable:e.tensor.variable(false)})))}getConfig(){return{learningRate:this.learningRate,rho:this.rho,epsilon:this.epsilon}}static fromConfig(e,t){return new e(t.learningRate,t.rho,t.epsilon)}}p.className="Adadelta",Object(c.registerClass)(p)},"./node_modules/@tensorflow/tfjs-core/dist/optimizers/adagrad_optimizer.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/optimizers/adagrad_optimizer.js ***! + \*********************************************************************************/ +/*! exports provided: AdagradOptimizer */function(e,t,n){"use strict";n.r(t),n.d(t,"AdagradOptimizer",(function(){return p}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../globals */"./node_modules/@tensorflow/tfjs-core/dist/globals.js"),r=n(/*! ../ops/add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),i=n(/*! ../ops/div */"./node_modules/@tensorflow/tfjs-core/dist/ops/div.js"),a=n(/*! ../ops/fill */"./node_modules/@tensorflow/tfjs-core/dist/ops/fill.js"),u=n(/*! ../ops/mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),d=n(/*! ../ops/sqrt */"./node_modules/@tensorflow/tfjs-core/dist/ops/sqrt.js"),l=n(/*! ../ops/square */"./node_modules/@tensorflow/tfjs-core/dist/ops/square.js"),c=n(/*! ../serialization */"./node_modules/@tensorflow/tfjs-core/dist/serialization.js"),f=n(/*! ./optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/optimizer.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class p extends f.Optimizer{constructor(e,t=.1){super(),this.learningRate=e,this.initialAccumulatorValue=t,this.accumulatedGrads=[]}applyGradients(e){(Array.isArray(e)?e.map((e=>e.name)):Object.keys(e)).forEach(((t,n)=>{const c=s.ENGINE.registeredVariables[t];if(null==this.accumulatedGrads[n]){const e=!1;this.accumulatedGrads[n]={originalName:`${t}/accumulator`,variable:Object(o.tidy)((()=>Object(a.fill)(c.shape,this.initialAccumulatorValue).variable(e)))}}const f=Array.isArray(e)?e[n].tensor:e[t];if(null==f)return;const p=this.accumulatedGrads[n].variable;Object(o.tidy)((()=>{const e=Object(r.add)(p,Object(l.square)(f));p.assign(e);const t=Object(r.add)(Object(u.mul)(Object(i.div)(f,Object(d.sqrt)(Object(r.add)(e,s.ENGINE.backend.epsilon()))),-this.learningRate),c);c.assign(t)}))})),this.incrementIterations()}dispose(){null!=this.accumulatedGrads&&Object(o.dispose)(this.accumulatedGrads.map((e=>e.variable)))}async getWeights(){return[await this.saveIterations()].concat(this.accumulatedGrads.map((e=>({name:e.originalName,tensor:e.variable}))))}async setWeights(e){e=await this.extractIterations(e);this.accumulatedGrads=e.map((e=>({originalName:e.name,variable:e.tensor.variable(false)})))}getConfig(){return{learningRate:this.learningRate,initialAccumulatorValue:this.initialAccumulatorValue}}static fromConfig(e,t){return new e(t.learningRate,t.initialAccumulatorValue)}}p.className="Adagrad",Object(c.registerClass)(p)},"./node_modules/@tensorflow/tfjs-core/dist/optimizers/adam_optimizer.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/optimizers/adam_optimizer.js ***! + \******************************************************************************/ +/*! exports provided: AdamOptimizer */function(e,t,n){"use strict";n.r(t),n.d(t,"AdamOptimizer",(function(){return b}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../globals */"./node_modules/@tensorflow/tfjs-core/dist/globals.js"),r=n(/*! ../ops/add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),i=n(/*! ../ops/div */"./node_modules/@tensorflow/tfjs-core/dist/ops/div.js"),a=n(/*! ../ops/mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),u=n(/*! ../ops/pow */"./node_modules/@tensorflow/tfjs-core/dist/ops/pow.js"),d=n(/*! ../ops/scalar */"./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"),l=n(/*! ../ops/sqrt */"./node_modules/@tensorflow/tfjs-core/dist/ops/sqrt.js"),c=n(/*! ../ops/square */"./node_modules/@tensorflow/tfjs-core/dist/ops/square.js"),f=n(/*! ../ops/sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"),p=n(/*! ../ops/zeros_like */"./node_modules/@tensorflow/tfjs-core/dist/ops/zeros_like.js"),m=n(/*! ../serialization */"./node_modules/@tensorflow/tfjs-core/dist/serialization.js"),h=n(/*! ./optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/optimizer.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class b extends h.Optimizer{constructor(e,t,n,r=null){super(),this.learningRate=e,this.beta1=t,this.beta2=n,this.epsilon=r,this.accumulatedFirstMoment=[],this.accumulatedSecondMoment=[],Object(o.tidy)((()=>{this.accBeta1=Object(d.scalar)(t).variable(),this.accBeta2=Object(d.scalar)(n).variable()})),null==r&&(this.epsilon=s.ENGINE.backend.epsilon())}applyGradients(e){const t=Array.isArray(e)?e.map((e=>e.name)):Object.keys(e);Object(o.tidy)((()=>{const n=Object(f.sub)(1,this.accBeta1),u=Object(f.sub)(1,this.accBeta2);t.forEach(((t,d)=>{const f=s.ENGINE.registeredVariables[t];null==this.accumulatedFirstMoment[d]&&(this.accumulatedFirstMoment[d]={originalName:`${t}/m`,variable:Object(o.tidy)((()=>Object(p.zerosLike)(f).variable(false)))}),null==this.accumulatedSecondMoment[d]&&(this.accumulatedSecondMoment[d]={originalName:`${t}/v`,variable:Object(o.tidy)((()=>Object(p.zerosLike)(f).variable(false)))});const m=Array.isArray(e)?e[d].tensor:e[t];if(null==m)return;const h=this.accumulatedFirstMoment[d].variable,b=this.accumulatedSecondMoment[d].variable,j=Object(r.add)(Object(a.mul)(h,this.beta1),Object(a.mul)(m,1-this.beta1)),g=Object(r.add)(Object(a.mul)(b,this.beta2),Object(a.mul)(Object(c.square)(m),1-this.beta2)),w=Object(i.div)(j,n),_=Object(i.div)(g,u);h.assign(j),b.assign(g);const k=Object(r.add)(Object(a.mul)(Object(i.div)(w,Object(r.add)(Object(l.sqrt)(_),this.epsilon)),-this.learningRate),f);f.assign(k)})),this.accBeta1.assign(Object(a.mul)(this.accBeta1,this.beta1)),this.accBeta2.assign(Object(a.mul)(this.accBeta2,this.beta2))})),this.incrementIterations()}dispose(){this.accBeta1.dispose(),this.accBeta2.dispose(),null!=this.accumulatedFirstMoment&&Object(o.dispose)(this.accumulatedFirstMoment.map((e=>e.variable))),null!=this.accumulatedSecondMoment&&Object(o.dispose)(this.accumulatedSecondMoment.map((e=>e.variable)))}async getWeights(){const e=[...this.accumulatedFirstMoment,...this.accumulatedSecondMoment];return[await this.saveIterations()].concat(e.map((e=>({name:e.originalName,tensor:e.variable}))))}async setWeights(e){e=await this.extractIterations(e),Object(o.tidy)((()=>{this.accBeta1.assign(Object(u.pow)(this.beta1,this.iterations_+1)),this.accBeta2.assign(Object(u.pow)(this.beta2,this.iterations_+1))}));const t=e.length/2;this.accumulatedFirstMoment=e.slice(0,t).map((e=>({originalName:e.name,variable:e.tensor.variable(false)}))),this.accumulatedSecondMoment=e.slice(t,2*t).map((e=>({originalName:e.name,variable:e.tensor.variable(false)})))}getConfig(){return{learningRate:this.learningRate,beta1:this.beta1,beta2:this.beta2,epsilon:this.epsilon}}static fromConfig(e,t){return new e(t.learningRate,t.beta1,t.beta2,t.epsilon)}}b.className="Adam",Object(m.registerClass)(b)},"./node_modules/@tensorflow/tfjs-core/dist/optimizers/adamax_optimizer.js": +/*!********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/optimizers/adamax_optimizer.js ***! + \********************************************************************************/ +/*! exports provided: AdamaxOptimizer */function(e,t,n){"use strict";n.r(t),n.d(t,"AdamaxOptimizer",(function(){return h}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../globals */"./node_modules/@tensorflow/tfjs-core/dist/globals.js"),r=n(/*! ../ops/abs */"./node_modules/@tensorflow/tfjs-core/dist/ops/abs.js"),i=n(/*! ../ops/add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),a=n(/*! ../ops/div */"./node_modules/@tensorflow/tfjs-core/dist/ops/div.js"),u=n(/*! ../ops/maximum */"./node_modules/@tensorflow/tfjs-core/dist/ops/maximum.js"),d=n(/*! ../ops/mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),l=n(/*! ../ops/scalar */"./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"),c=n(/*! ../ops/sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"),f=n(/*! ../ops/zeros_like */"./node_modules/@tensorflow/tfjs-core/dist/ops/zeros_like.js"),p=n(/*! ../serialization */"./node_modules/@tensorflow/tfjs-core/dist/serialization.js"),m=n(/*! ./optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/optimizer.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class h extends m.Optimizer{constructor(e,t,n,r=null,i=0){super(),this.learningRate=e,this.beta1=t,this.beta2=n,this.epsilon=r,this.decay=i,this.accumulatedFirstMoment=[],this.accumulatedWeightedInfNorm=[],Object(o.tidy)((()=>{this.iteration=Object(l.scalar)(0).variable(),this.accBeta1=Object(l.scalar)(t).variable()})),null==r&&(this.epsilon=s.ENGINE.backend.epsilon())}applyGradients(e){const t=Array.isArray(e)?e.map((e=>e.name)):Object.keys(e);Object(o.tidy)((()=>{const n=Object(c.sub)(1,this.accBeta1),o=Object(a.div)(-this.learningRate,Object(i.add)(Object(d.mul)(this.iteration,this.decay),1));t.forEach(((t,l)=>{const c=s.ENGINE.registeredVariables[t];null==this.accumulatedFirstMoment[l]&&(this.accumulatedFirstMoment[l]={originalName:`${t}/m`,variable:Object(f.zerosLike)(c).variable(false)}),null==this.accumulatedWeightedInfNorm[l]&&(this.accumulatedWeightedInfNorm[l]={originalName:`${t}/v`,variable:Object(f.zerosLike)(c).variable(false)});const p=Array.isArray(e)?e[l].tensor:e[t];if(null==p)return;const m=this.accumulatedFirstMoment[l].variable,h=this.accumulatedWeightedInfNorm[l].variable,b=Object(i.add)(Object(d.mul)(m,this.beta1),Object(d.mul)(p,1-this.beta1)),j=Object(d.mul)(h,this.beta2),g=Object(r.abs)(p),w=Object(u.maximum)(j,g);m.assign(b),h.assign(w);const _=Object(i.add)(Object(d.mul)(Object(a.div)(o,n),Object(a.div)(b,Object(i.add)(w,this.epsilon))),c);c.assign(_)})),this.iteration.assign(Object(i.add)(this.iteration,1)),this.accBeta1.assign(Object(d.mul)(this.accBeta1,this.beta1))})),this.incrementIterations()}dispose(){this.accBeta1.dispose(),this.iteration.dispose(),null!=this.accumulatedFirstMoment&&Object(o.dispose)(this.accumulatedFirstMoment.map((e=>e.variable))),null!=this.accumulatedWeightedInfNorm&&Object(o.dispose)(this.accumulatedWeightedInfNorm.map((e=>e.variable)))}async getWeights(){throw new Error("getWeights() is not implemented for Adamax yet.")}async setWeights(e){throw new Error("setWeights() is not implemented for Adamax yet.")}getConfig(){return{learningRate:this.learningRate,beta1:this.beta1,beta2:this.beta2,epsilon:this.epsilon,decay:this.decay}}static fromConfig(e,t){return new e(t.learningRate,t.beta1,t.beta2,t.epsilon,t.decay)}}h.className="Adamax",Object(p.registerClass)(h)},"./node_modules/@tensorflow/tfjs-core/dist/optimizers/momentum_optimizer.js": +/*!**********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/optimizers/momentum_optimizer.js ***! + \**********************************************************************************/ +/*! exports provided: MomentumOptimizer */function(e,t,n){"use strict";n.r(t),n.d(t,"MomentumOptimizer",(function(){return c}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../globals */"./node_modules/@tensorflow/tfjs-core/dist/globals.js"),r=n(/*! ../ops/add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),i=n(/*! ../ops/mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),a=n(/*! ../ops/scalar */"./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"),u=n(/*! ../ops/zeros_like */"./node_modules/@tensorflow/tfjs-core/dist/ops/zeros_like.js"),d=n(/*! ../serialization */"./node_modules/@tensorflow/tfjs-core/dist/serialization.js"),l=n(/*! ./sgd_optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/sgd_optimizer.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class c extends l.SGDOptimizer{constructor(e,t,n=!1){super(e),this.learningRate=e,this.momentum=t,this.useNesterov=n,this.accumulations=[],this.m=Object(a.scalar)(this.momentum)}applyGradients(e){(Array.isArray(e)?e.map((e=>e.name)):Object.keys(e)).forEach(((t,n)=>{const a=s.ENGINE.registeredVariables[t];if(null==this.accumulations[n]){const e=!1;this.accumulations[n]={originalName:`${t}/momentum`,variable:Object(o.tidy)((()=>Object(u.zerosLike)(a).variable(e)))}}const d=this.accumulations[n].variable,l=Array.isArray(e)?e[n].tensor:e[t];null!=l&&Object(o.tidy)((()=>{let e;const t=Object(r.add)(Object(i.mul)(this.m,d),l);e=this.useNesterov?Object(r.add)(Object(i.mul)(this.c,Object(r.add)(l,Object(i.mul)(t,this.m))),a):Object(r.add)(Object(i.mul)(this.c,t),a),d.assign(t),a.assign(e)}))})),this.incrementIterations()}dispose(){this.m.dispose(),null!=this.accumulations&&Object(o.dispose)(this.accumulations.map((e=>e.variable)))}setMomentum(e){this.momentum=e}async getWeights(){return[await this.saveIterations()].concat(this.accumulations.map((e=>({name:e.originalName,tensor:e.variable}))))}async setWeights(e){e=await this.extractIterations(e);this.accumulations=e.map((e=>({originalName:e.name,variable:e.tensor.variable(false)})))}getConfig(){return{learningRate:this.learningRate,momentum:this.momentum,useNesterov:this.useNesterov}}static fromConfig(e,t){return new e(t.learningRate,t.momentum,t.useNesterov)}}c.className="Momentum",Object(d.registerClass)(c)},"./node_modules/@tensorflow/tfjs-core/dist/optimizers/optimizer.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/optimizers/optimizer.js ***! + \*************************************************************************/ +/*! exports provided: Optimizer */function(e,t,n){"use strict";n.r(t),n.d(t,"Optimizer",(function(){return a}));var s=n(/*! ../globals */"./node_modules/@tensorflow/tfjs-core/dist/globals.js"),o=n(/*! ../gradients */"./node_modules/@tensorflow/tfjs-core/dist/gradients.js"),r=n(/*! ../ops/ops */"./node_modules/@tensorflow/tfjs-core/dist/ops/ops.js"),i=n(/*! ../serialization */"./node_modules/@tensorflow/tfjs-core/dist/serialization.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class a extends i.Serializable{minimize(e,t=!1,n){const{value:o,grads:r}=this.computeGradients(e,n);if(null!=n){const e=n.map((e=>({name:e.name,tensor:r[e.name]})));this.applyGradients(e)}else this.applyGradients(r);return Object(s.dispose)(r),t?o:(o.dispose(),null)}get iterations(){return null==this.iterations_&&(this.iterations_=0),this.iterations_}incrementIterations(){this.iterations_=this.iterations+1}computeGradients(e,t){return Object(o.variableGrads)(e,t)}dispose(){null!=this.iterations_&&Object(s.dispose)(this.iterations_)}async saveIterations(){return null==this.iterations_&&(this.iterations_=0),{name:"iter",tensor:Object(r.scalar)(this.iterations_,"int32")}}async getWeights(){throw new Error("getWeights() is not implemented for this optimizer yet.")}async setWeights(e){throw new Error(`setWeights() is not implemented for this optimizer class ${this.getClassName()}`)}async extractIterations(e){return this.iterations_=(await e[0].tensor.data())[0],e.slice(1)}}Object.defineProperty(a,Symbol.hasInstance,{value:e=>null!=e.minimize&&null!=e.computeGradients&&null!=e.applyGradients})},"./node_modules/@tensorflow/tfjs-core/dist/optimizers/optimizer_constructors.js": +/*!**************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/optimizers/optimizer_constructors.js ***! + \**************************************************************************************/ +/*! exports provided: OptimizerConstructors */function(e,t,n){"use strict";n.r(t),n.d(t,"OptimizerConstructors",(function(){return l}));var s=n(/*! ./adadelta_optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/adadelta_optimizer.js"),o=n(/*! ./adagrad_optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/adagrad_optimizer.js"),r=n(/*! ./adam_optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/adam_optimizer.js"),i=n(/*! ./adamax_optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/adamax_optimizer.js"),a=n(/*! ./momentum_optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/momentum_optimizer.js"),u=n(/*! ./rmsprop_optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/rmsprop_optimizer.js"),d=n(/*! ./sgd_optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/sgd_optimizer.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class l{static sgd(e){return new d.SGDOptimizer(e)}static momentum(e,t,n=!1){return new a.MomentumOptimizer(e,t,n)}static rmsprop(e,t=.9,n=0,s=null,o=!1){return new u.RMSPropOptimizer(e,t,n,s,o)}static adam(e=.001,t=.9,n=.999,s=null){return new r.AdamOptimizer(e,t,n,s)}static adadelta(e=.001,t=.95,n=null){return new s.AdadeltaOptimizer(e,t,n)}static adamax(e=.002,t=.9,n=.999,s=null,o=0){return new i.AdamaxOptimizer(e,t,n,s,o)}static adagrad(e,t=.1){return new o.AdagradOptimizer(e,t)}}},"./node_modules/@tensorflow/tfjs-core/dist/optimizers/rmsprop_optimizer.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/optimizers/rmsprop_optimizer.js ***! + \*********************************************************************************/ +/*! exports provided: RMSPropOptimizer */function(e,t,n){"use strict";n.r(t),n.d(t,"RMSPropOptimizer",(function(){return m}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../globals */"./node_modules/@tensorflow/tfjs-core/dist/globals.js"),r=n(/*! ../ops/add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),i=n(/*! ../ops/div */"./node_modules/@tensorflow/tfjs-core/dist/ops/div.js"),a=n(/*! ../ops/mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),u=n(/*! ../ops/sqrt */"./node_modules/@tensorflow/tfjs-core/dist/ops/sqrt.js"),d=n(/*! ../ops/square */"./node_modules/@tensorflow/tfjs-core/dist/ops/square.js"),l=n(/*! ../ops/sub */"./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"),c=n(/*! ../ops/zeros_like */"./node_modules/@tensorflow/tfjs-core/dist/ops/zeros_like.js"),f=n(/*! ../serialization */"./node_modules/@tensorflow/tfjs-core/dist/serialization.js"),p=n(/*! ./optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/optimizer.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class m extends p.Optimizer{constructor(e,t=.9,n=0,o=null,r=!1){if(super(),this.learningRate=e,this.decay=t,this.momentum=n,this.epsilon=o,this.accumulatedMeanSquares=[],this.accumulatedMoments=[],this.accumulatedMeanGrads=[],this.centered=r,null==o&&(this.epsilon=s.ENGINE.backend.epsilon()),null==e)throw new Error("learningRate for RMSPropOptimizer must be defined.")}applyGradients(e){(Array.isArray(e)?e.map((e=>e.name)):Object.keys(e)).forEach(((t,n)=>{const f=s.ENGINE.registeredVariables[t],p=!1;null==this.accumulatedMeanSquares[n]&&(this.accumulatedMeanSquares[n]={originalName:`${t}/rms`,variable:Object(o.tidy)((()=>Object(c.zerosLike)(f).variable(p)))}),null==this.accumulatedMoments[n]&&(this.accumulatedMoments[n]={originalName:`${t}/momentum`,variable:Object(o.tidy)((()=>Object(c.zerosLike)(f).variable(p)))}),null==this.accumulatedMeanGrads[n]&&this.centered&&(this.accumulatedMeanGrads[n]={originalName:`${t}/mg`,variable:Object(o.tidy)((()=>Object(c.zerosLike)(f).variable(p)))});const m=Array.isArray(e)?e[n].tensor:e[t];if(null==m)return;const h=this.accumulatedMeanSquares[n].variable,b=this.accumulatedMoments[n].variable;Object(o.tidy)((()=>{const e=Object(r.add)(Object(a.mul)(h,this.decay),Object(a.mul)(Object(d.square)(m),1-this.decay));if(this.centered){const t=this.accumulatedMeanGrads[n].variable,s=Object(r.add)(Object(a.mul)(t,this.decay),Object(a.mul)(m,1-this.decay)),o=Object(i.div)(Object(a.mul)(m,this.learningRate),Object(u.sqrt)(Object(l.sub)(e,Object(r.add)(Object(d.square)(s),this.epsilon)))),c=Object(r.add)(Object(a.mul)(b,this.momentum),o);h.assign(e),t.assign(s),b.assign(c);const p=Object(l.sub)(f,c);f.assign(p)}else{const e=Object(r.add)(Object(a.mul)(h,this.decay),Object(a.mul)(Object(d.square)(m),1-this.decay)),t=Object(r.add)(Object(a.mul)(b,this.momentum),Object(i.div)(Object(a.mul)(m,this.learningRate),Object(u.sqrt)(Object(r.add)(e,this.epsilon))));h.assign(e),b.assign(t);const n=Object(l.sub)(f,t);f.assign(n)}}))})),this.incrementIterations()}dispose(){null!=this.accumulatedMeanSquares&&Object(o.dispose)(this.accumulatedMeanSquares.map((e=>e.variable))),null!=this.accumulatedMeanGrads&&this.centered&&Object(o.dispose)(this.accumulatedMeanGrads.map((e=>e.variable))),null!=this.accumulatedMoments&&Object(o.dispose)(this.accumulatedMoments.map((e=>e.variable)))}async getWeights(){const e=[...this.accumulatedMeanSquares,...this.accumulatedMoments];return this.centered&&e.push(...this.accumulatedMeanGrads),[await this.saveIterations()].concat(e.map((e=>({name:e.originalName,tensor:e.variable}))))}async setWeights(e){e=await this.extractIterations(e);const t=this.centered?e.length/3:e.length/2,n=!1;this.accumulatedMeanSquares=e.slice(0,t).map((e=>({originalName:e.name,variable:e.tensor.variable(n)}))),this.accumulatedMoments=e.slice(t,2*t).map((e=>({originalName:e.name,variable:e.tensor.variable(n)}))),this.centered&&(this.accumulatedMeanGrads=e.slice(2*t,3*t).map((e=>({originalName:e.name,variable:e.tensor.variable(n)}))))}getConfig(){return{learningRate:this.learningRate,decay:this.decay,momentum:this.momentum,epsilon:this.epsilon,centered:this.centered}}static fromConfig(e,t){return new e(t.learningRate,t.decay,t.momentum,t.epsilon,t.centered)}}m.className="RMSProp",Object(f.registerClass)(m)},"./node_modules/@tensorflow/tfjs-core/dist/optimizers/sgd_optimizer.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/optimizers/sgd_optimizer.js ***! + \*****************************************************************************/ +/*! exports provided: SGDOptimizer */function(e,t,n){"use strict";n.r(t),n.d(t,"SGDOptimizer",(function(){return l}));var s=n(/*! ../engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ../globals */"./node_modules/@tensorflow/tfjs-core/dist/globals.js"),r=n(/*! ../ops/add */"./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"),i=n(/*! ../ops/mul */"./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"),a=n(/*! ../ops/scalar */"./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"),u=n(/*! ../serialization */"./node_modules/@tensorflow/tfjs-core/dist/serialization.js"),d=n(/*! ./optimizer */"./node_modules/@tensorflow/tfjs-core/dist/optimizers/optimizer.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class l extends d.Optimizer{constructor(e){super(),this.learningRate=e,this.setLearningRate(e)}applyGradients(e){(Array.isArray(e)?e.map((e=>e.name)):Object.keys(e)).forEach(((t,n)=>{const a=Array.isArray(e)?e[n].tensor:e[t];if(null==a)return;const u=s.ENGINE.registeredVariables[t];Object(o.tidy)((()=>{const e=Object(r.add)(Object(i.mul)(this.c,a),u);u.assign(e)}))})),this.incrementIterations()}setLearningRate(e){this.learningRate=e,null!=this.c&&this.c.dispose(),this.c=Object(o.keep)(Object(a.scalar)(-e))}dispose(){this.c.dispose()}async getWeights(){return[await this.saveIterations()]}async setWeights(e){if(0!==(e=await this.extractIterations(e)).length)throw new Error("SGD optimizer does not have settable weights.")}getConfig(){return{learningRate:this.learningRate}}static fromConfig(e,t){return new e(t.learningRate)}}l.className="SGD",Object(u.registerClass)(l)},"./node_modules/@tensorflow/tfjs-core/dist/platforms/platform_browser.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/platforms/platform_browser.js ***! + \*******************************************************************************/ +/*! exports provided: PlatformBrowser */function(e,t,n){"use strict";n.r(t),n.d(t,"PlatformBrowser",(function(){return a}));n(/*! ../flags */"./node_modules/@tensorflow/tfjs-core/dist/flags.js");var s=n(/*! ../environment */"./node_modules/@tensorflow/tfjs-core/dist/environment.js"),o=n(/*! ../io/indexed_db */"./node_modules/@tensorflow/tfjs-core/dist/io/indexed_db.js"),r=n(/*! ../io/local_storage */"./node_modules/@tensorflow/tfjs-core/dist/io/local_storage.js"),i=n(/*! ../io/model_management */"./node_modules/@tensorflow/tfjs-core/dist/io/model_management.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class a{fetch(e,t){return fetch(e,t)}now(){return performance.now()}encode(e,t){if("utf-8"!==t&&"utf8"!==t)throw new Error(`Browser's encoder only supports utf-8, but got ${t}`);return null==this.textEncoder&&(this.textEncoder=new TextEncoder),this.textEncoder.encode(e)}decode(e,t){return new TextDecoder(t).decode(e)}}if(Object(s.env)().get("IS_BROWSER")){Object(s.env)().setPlatform("browser",new a);try{i.ModelStoreManagerRegistry.registerManager(r.BrowserLocalStorage.URL_SCHEME,new r.BrowserLocalStorageManager)}catch(e){}try{i.ModelStoreManagerRegistry.registerManager(o.BrowserIndexedDB.URL_SCHEME,new o.BrowserIndexedDBManager)}catch(e){}}},"./node_modules/@tensorflow/tfjs-core/dist/platforms/platform_node.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/platforms/platform_node.js ***! + \****************************************************************************/ +/*! exports provided: getNodeFetch, resetSystemFetch, setSystemFetch, getSystemFetch, PlatformNode */function(e,t,n){"use strict";n.r(t),function(e){n.d(t,"getNodeFetch",(function(){return o})),n.d(t,"resetSystemFetch",(function(){return i})),n.d(t,"setSystemFetch",(function(){return a})),n.d(t,"getSystemFetch",(function(){return u})),n.d(t,"PlatformNode",(function(){return d}));var s=n(/*! ../environment */"./node_modules/@tensorflow/tfjs-core/dist/environment.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */const o={importFetch:()=>n(/*! node-fetch */1)};let r;function i(){r=null}function a(e){r=e}function u(){return r}class d{constructor(){this.util=n(/*! util */2),this.textEncoder=new this.util.TextEncoder}fetch(e,t){return null!=Object(s.env)().global.fetch?Object(s.env)().global.fetch(e,t):(null==r&&(r=o.importFetch()),r(e,t))}now(){const t=e.hrtime();return 1e3*t[0]+t[1]/1e6}encode(e,t){if("utf-8"!==t&&"utf8"!==t)throw new Error(`Node built-in encoder only supports utf-8, but got ${t}`);return this.textEncoder.encode(e)}decode(e,t){return 0===e.length?"":new this.util.TextDecoder(t).decode(e)}}Object(s.env)().get("IS_NODE")&&Object(s.env)().setPlatform("node",new d)}.call(this,n(/*! ./../../../../process/browser.js */"./node_modules/process/browser.js"))},"./node_modules/@tensorflow/tfjs-core/dist/profiler.js": +/*!*************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/profiler.js ***! + \*************************************************************/ +/*! exports provided: Profiler, checkComputationForErrors, Logger */function(e,t,n){"use strict";n.r(t),n.d(t,"Profiler",(function(){return r})),n.d(t,"checkComputationForErrors",(function(){return i})),n.d(t,"Logger",(function(){return a}));var s=n(/*! ./environment */"./node_modules/@tensorflow/tfjs-core/dist/environment.js"),o=n(/*! ./util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class r{constructor(e,t){this.backendTimer=e,this.logger=t,null==t&&(this.logger=new a)}profileKernel(e,t,n){let r;const a=()=>{r=n()};let u;const d=o.now();if(this.backendTimer.timerAvailable())u=this.backendTimer.time(a);else{a();for(const e of r)e.dataSync();u=Promise.resolve({kernelMs:o.now()-d})}if(Object(s.env)().getBool("CHECK_COMPUTATION_FOR_ERRORS"))for(let t=0;t{i(t,n.dtype,e)}))}return{kernelName:e,outputs:r,inputs:t,timeMs:u.then((e=>e.kernelMs)),extraInfo:u.then((e=>null!=e.getExtraProfileInfo?e.getExtraProfileInfo():""))}}logKernelProfile(e){const{kernelName:t,outputs:n,timeMs:s,inputs:o,extraInfo:r}=e;n.forEach((e=>{Promise.all([e.data(),s,r]).then((n=>{this.logger.logKernelProfile(t,e,n[0],n[1],o,n[2])}))}))}}function i(e,t,n){if("float32"!==t)return!1;for(let t=0;t0?s:""} `}}console.log(`%c${u}\t%c${a}\t%c${d}D ${c}\t%c${l}\t%c${f}\t%c${i}`,"font-weight:bold","color:red","color:blue","color: orange","color: green","color: steelblue")}}},"./node_modules/@tensorflow/tfjs-core/dist/serialization.js": +/*!******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/serialization.js ***! + \******************************************************************/ +/*! exports provided: Serializable, SerializationMap, registerClass */function(e,t,n){"use strict";n.r(t),n.d(t,"Serializable",(function(){return o})),n.d(t,"SerializationMap",(function(){return r})),n.d(t,"registerClass",(function(){return i}));var s=n(/*! ./util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */class o{getClassName(){return this.constructor.className}static fromConfig(e,t){return new e(t)}}class r{constructor(){this.classNameMap={}}static getMap(){return null==r.instance&&(r.instance=new r),r.instance}static register(e){r.getMap().classNameMap[e.className]=[e,e.fromConfig]}}function i(e){Object(s.assert)(null!=e.className,(()=>"Class being registered does not have the static className property defined.")),Object(s.assert)("string"==typeof e.className,(()=>"className is required to be a string, but got type "+typeof e.className)),Object(s.assert)(e.className.length>0,(()=>"Class being registered has an empty-string as its className, which is disallowed.")),r.register(e)}},"./node_modules/@tensorflow/tfjs-core/dist/tape.js": +/*!*********************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/tape.js ***! + \*********************************************************/ +/*! exports provided: getFilteredNodesXToY, backpropagateGradients */function(e,t,n){"use strict";n.r(t),n.d(t,"getFilteredNodesXToY",(function(){return o})),n.d(t,"backpropagateGradients",(function(){return r}));var s=n(/*! ./util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */function o(e,t,n){const s={},o={};for(let e=0;es[e.id]=!0)),a=!0,o[r.id]=!0;break}if(a)break}}const r={};r[n.id]=!0;const i={};for(let t=e.length-1;t>=0;t--){const n=e[t],s=n.inputs;for(let e=0;e=0;r--){const i=t[r],a=[];if(i.outputs.forEach((t=>{const n=e[t.id];null!=n?a.push(n):a.push(null)})),null==i.gradient)throw new Error(`Cannot compute gradient: gradient function not found for ${i.kernelName}.`);const u=i.gradient(a);for(const t in i.inputs){if(!(t in u))throw new Error(`Cannot backprop through input ${t}. Available gradients found: ${Object.keys(u)}.`);const r=n((()=>u[t]()));if("float32"!==r.dtype)throw new Error(`Error in gradient for op ${i.kernelName}. The gradient of input ${t} must have 'float32' dtype, but has '${r.dtype}'`);const a=i.inputs[t];if(!s.arraysEqual(r.shape,a.shape))throw new Error(`Error in gradient for op ${i.kernelName}. The gradient of input '${t}' has shape '${r.shape}', which does not match the shape of the input '${a.shape}'`);if(null==e[a.id])e[a.id]=r;else{const t=e[a.id];e[a.id]=o(t,r),t.dispose()}}}}},"./node_modules/@tensorflow/tfjs-core/dist/tensor.js": +/*!***********************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/tensor.js ***! + \***********************************************************/ +/*! exports provided: TensorBuffer, setTensorTracker, setOpHandler, setDeprecationWarningFn, Tensor, getGlobalTensorClass, Variable */function(e,t,n){"use strict";n.r(t),n.d(t,"TensorBuffer",(function(){return i})),n.d(t,"setTensorTracker",(function(){return l})),n.d(t,"setOpHandler",(function(){return c})),n.d(t,"setDeprecationWarningFn",(function(){return f})),n.d(t,"Tensor",(function(){return p})),n.d(t,"getGlobalTensorClass",(function(){return m})),n.d(t,"Variable",(function(){return h}));var s=n(/*! ./global_util */"./node_modules/@tensorflow/tfjs-core/dist/global_util.js"),o=n(/*! ./tensor_format */"./node_modules/@tensorflow/tfjs-core/dist/tensor_format.js"),r=n(/*! ./util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class i{constructor(e,t,n){if(this.dtype=t,this.shape=e.slice(),this.size=r.sizeFromShape(e),null!=n){const e=n.length;r.assert(e===this.size,(()=>`Length of values '${e}' does not match the size inferred by the shape '${this.size}'.`))}if("complex64"===t)throw new Error("complex64 dtype TensorBuffers are not supported. Please create a TensorBuffer for the real and imaginary parts separately and call tf.complex(real, imag).");this.values=n||r.getArrayFromDType(t,this.size),this.strides=Object(r.computeStrides)(e)}set(e,...t){0===t.length&&(t=[0]),r.assert(t.length===this.rank,(()=>`The number of provided coordinates (${t.length}) must match the rank (${this.rank})`));const n=this.locToIndex(t);this.values[n]=e}get(...e){0===e.length&&(e=[0]);let t=0;for(const n of e){if(n<0||n>=this.shape[t]){const t=`Requested out of range element at ${e}. Buffer shape=${this.shape}`;throw new Error(t)}t++}let n=e[e.length-1];for(let t=0;tr.decodeString(e)))}catch(e){throw new Error("Failed to decode the string bytes into utf-8. To get the original bytes, call tensor.bytes().")}}return e}dataSync(){this.throwIfDisposed();const e=a().readSync(this.dataId);if("string"===this.dtype)try{return e.map((e=>r.decodeString(e)))}catch(e){throw new Error("Failed to decode the string bytes into utf-8. To get the original bytes, call tensor.bytes().")}return e}async bytes(){this.throwIfDisposed();const e=await a().read(this.dataId);return"string"===this.dtype?e:new Uint8Array(e.buffer)}dispose(){this.isDisposed||(a().disposeTensor(this),this.isDisposedInternal=!0)}get isDisposed(){return this.isDisposedInternal}throwIfDisposed(){if(this.isDisposed)throw new Error("Tensor is disposed.")}print(e=!1){return u.print(this,e)}clone(){return this.throwIfDisposed(),u.clone(this)}toString(e=!1){const t=this.dataSync();return Object(o.tensorToString)(t,this.shape,this.dtype,e)}cast(e){return this.throwIfDisposed(),u.cast(this,e)}variable(e=!0,t,n){return this.throwIfDisposed(),a().makeVariable(this,e,t,n)}}function m(){return Object(s.getGlobal)("Tensor",(()=>p))}Object.defineProperty(p,Symbol.hasInstance,{value:e=>!!e&&null!=e.data&&null!=e.dataSync&&null!=e.throwIfDisposed}),m();class h extends p{constructor(e,t,n,s){super(e.shape,e.dtype,e.dataId,s),this.trainable=t,this.name=n}assign(e){if(e.dtype!==this.dtype)throw new Error(`dtype of the new value (${e.dtype}) and previous value (${this.dtype}) must match`);if(!r.arraysEqual(e.shape,this.shape))throw new Error(`shape of the new value (${e.shape}) and previous value (${this.shape}) must match`);a().disposeTensor(this),this.dataId=e.dataId,a().incRef(this,null)}dispose(){a().disposeVariable(this),this.isDisposedInternal=!0}}Object.defineProperty(h,Symbol.hasInstance,{value:e=>e instanceof p&&null!=e.assign&&e.assign instanceof Function})},"./node_modules/@tensorflow/tfjs-core/dist/tensor_format.js": +/*!******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/tensor_format.js ***! + \******************************************************************/ +/*! exports provided: tensorToString */function(e,t,n){"use strict";n.r(t),n.d(t,"tensorToString",(function(){return o}));var s=n(/*! ./util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */function o(e,t,n,o){const i=Object(s.computeStrides)(t),d=function(e,t,n,o){const i=Object(s.sizeFromShape)(t),a=o[o.length-1],d=new Array(a).fill(0),l=t.length,c="complex64"===n?u(e):e;if(l>1)for(let e=0;e" "+e)).join("\n")),f.join("\n")}function r(e,t,n){let o;return o=Array.isArray(e)?`${parseFloat(e[0].toFixed(7))} + ${parseFloat(e[1].toFixed(7))}j`:Object(s.isString)(e)?`'${e}'`:"bool"===n?i(e):parseFloat(e.toFixed(7)).toString(),Object(s.rightPad)(o,t)}function i(e){return 0===e?"false":"true"}function a(e,t,n,s,o,d=!0){const l="complex64"===n?2:1,c=t[0],f=t.length;if(0===f){if("complex64"===n){return[r(u(e)[0],0,n)]}return"bool"===n?[i(e[0])]:[e[0].toString()]}if(1===f){if(c>20){const t=3*l;let s=Array.from(e.slice(0,t)),i=Array.from(e.slice((c-3)*l,c*l));return"complex64"===n&&(s=u(s),i=u(i)),["["+s.map(((e,t)=>r(e,o[t],n))).join(", ")+", ..., "+i.map(((e,t)=>r(e,o[c-3+t],n))).join(", ")+"]"]}return["["+("complex64"===n?u(e):Array.from(e)).map(((e,t)=>r(e,o[t],n))).join(", ")+"]"]}const p=t.slice(1),m=s.slice(1),h=s[0]*l,b=[];if(c>20){for(let t=0;t<3;t++){const s=t*h,r=s+h;b.push(...a(e.slice(s,r),p,n,m,o,!1))}b.push("...");for(let t=c-3;t`The dtypes of the first(${e.dtype}) and second(${t.dtype}) input must match`))}function u(e,t){return t.some((t=>t.id===e.id))}function d(e){const t=[];return l(e,t,new Set),t}function l(e,t,n){if(null==e)return;if(e instanceof s.Tensor)return void t.push(e);if(o=e,!Array.isArray(o)&&"object"!=typeof o)return;var o;const r=e;for(const e in r){const s=r[e];n.has(s)||(n.add(s),l(s,t,n))}}},"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js": +/*!********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js ***! + \********************************************************************/ +/*! exports provided: inferShape, convertToTensor, convertToTensorArray */function(e,t,n){"use strict";n.r(t),n.d(t,"inferShape",(function(){return a})),n.d(t,"convertToTensor",(function(){return l})),n.d(t,"convertToTensorArray",(function(){return c}));var s=n(/*! ./engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ./environment */"./node_modules/@tensorflow/tfjs-core/dist/environment.js"),r=n(/*! ./tensor */"./node_modules/@tensorflow/tfjs-core/dist/tensor.js"),i=n(/*! ./util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function a(e,t){let n=e;if(Object(i.isTypedArray)(e))return"string"===t?[]:[e.length];if(!Array.isArray(e))return[];const s=[];for(;Array.isArray(n)||Object(i.isTypedArray)(n)&&"string"!==t;)s.push(n.length),n=n[0];return Array.isArray(e)&&Object(o.env)().getBool("TENSORLIKE_CHECK_SHAPE_CONSISTENCY")&&u(e,s,[]),s}function u(e,t,n){if(n=n||[],!Array.isArray(e)&&!Object(i.isTypedArray)(e))return void Object(i.assert)(0===t.length,(()=>`Element arr[${n.join("][")}] is a primitive, but should be an array/TypedArray of ${t[0]} elements`));Object(i.assert)(t.length>0,(()=>`Element arr[${n.join("][")}] should be a primitive, but is an array of ${e.length} elements`)),Object(i.assert)(e.length===t[0],(()=>`Element arr[${n.join("][")}] should have ${t[0]} elements, but has ${e.length} elements`));const s=t.slice(1);for(let t=0;t=0&&(u=o),d(o,u,t,n),null==e||!Object(i.isTypedArray)(e)&&!Array.isArray(e)&&"number"!=typeof e&&"boolean"!=typeof e&&"string"!=typeof e){const s=null==e?"null":e.constructor.name;throw new Error(`Argument '${t}' passed to '${n}' must be a Tensor or TensorLike, but got '${s}'`)}const l=a(e,u);Object(i.isTypedArray)(e)||Array.isArray(e)||(e=[e]);const c="string"!==u?Object(i.toTypedArray)(e,u):Object(i.flatten)(e,[],!0);return s.ENGINE.makeTensor(c,l,u)}function c(e,t,n,s="numeric"){if(!Array.isArray(e))throw new Error(`Argument ${t} passed to ${n} must be a \`Tensor[]\` or \`TensorLike[]\``);return e.map(((e,o)=>l(e,`${t}[${o}]`,n,s)))}},"./node_modules/@tensorflow/tfjs-core/dist/test_util.js": +/*!**************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/test_util.js ***! + \**************************************************************/ +/*! exports provided: TEST_EPSILON_FLOAT16, expectArraysClose, testEpsilon, expectPromiseToFail, expectArraysEqual, expectNumbersClose, expectValuesInRange, expectArrayBuffersEqual, encodeStrings */function(e,t,n){"use strict";n.r(t),n.d(t,"TEST_EPSILON_FLOAT16",(function(){return i})),n.d(t,"expectArraysClose",(function(){return a})),n.d(t,"testEpsilon",(function(){return u})),n.d(t,"expectPromiseToFail",(function(){return l})),n.d(t,"expectArraysEqual",(function(){return c})),n.d(t,"expectNumbersClose",(function(){return f})),n.d(t,"expectValuesInRange",(function(){return m})),n.d(t,"expectArrayBuffersEqual",(function(){return h})),n.d(t,"encodeStrings",(function(){return b}));var s=n(/*! ./engine */"./node_modules/@tensorflow/tfjs-core/dist/engine.js"),o=n(/*! ./tensor_util_env */"./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"),r=n(/*! ./util */"./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const i=.1;function a(e,t,n){return null==n&&(n=u()),d(e,t,((e,t)=>p(e,t,n)))}function u(){return 32===s.ENGINE.backend.floatPrecision()?.001:i}function d(e,t,n){let s=!0;if((Object(r.isTypedArray)(e)||Object(r.isTypedArray)(t))&&(s=!1),Object(r.isTypedArray)(e)&&Object(r.isTypedArray)(t)&&(s=!0),s){const n=e.constructor.name,s=t.constructor.name;if(n!==s)throw new Error(`Arrays are of different type. Actual: ${n}. Expected: ${s}`)}if(Array.isArray(e)&&Array.isArray(t)){const n=Object(o.inferShape)(e),s=Object(o.inferShape)(t);if(!Object(r.arraysEqual)(n,s))throw new Error(`Arrays have different shapes. Actual: [${n}]. Expected: [${s}]`)}const i=Object(r.isTypedArray)(e)?e:Object(r.flatten)(e),a=Object(r.isTypedArray)(t)?t:Object(r.flatten)(t);if(i.length!==a.length)throw new Error(`Arrays have different lengths actual: ${i.length} vs expected: ${a.length}.\nActual: ${i}.\nExpected: ${a}.`);for(let e=0;et.fail()),(()=>t()))}function c(e,t){const n="string"==typeof t||"number"==typeof t||"boolean"==typeof t?[t]:t;return Object(r.isString)(e)||Object(r.isString)(e[0])||Object(r.isString)(t)||Object(r.isString)(t[0])?d(e,n,((e,t)=>e==t)):d(e,t,((e,t)=>p(e,t,0)))}function f(e,t,n){if(null==n&&(n=u()),!p(e,t,n))throw new Error(`Numbers differ: actual === ${e}, expected === ${t}`)}function p(e,t,n){return!isFinite(e)&&!isFinite(t)||!(isNaN(e)||isNaN(t)||Math.abs(e-t)>n)}function m(e,t,n){for(let s=0;sn)throw new Error(`Value out of range:${e[s]} low: ${t}, high: ${n}`)}function h(e,t){expect(new Float32Array(e)).toEqual(new Float32Array(t))}function b(e){for(let t=0;t0;)n=Math.random()*t|0,t--,a(e,t,n)}function o(e,t){if(e.length!==t.length)throw new Error(`Array sizes must match to be shuffled together First array length was ${e.length}Second array length was ${t.length}`);let n=e.length,s=0;for(;n>0;)s=Math.random()*n|0,n--,a(e,n,s),a(t,n,s)}function r(e,t,n){return Math.max(e,Math.min(t,n))}function i(e){return e%2==0?e:e+1}function a(e,t,n){const s=e[t];e[t]=e[n],e[n]=s}function u(e){let t=0;for(let n=0;nn+` Shapes ${e} and ${t} must match`))}function p(e){c(null!=e,(()=>"The input to the tensor constructor must be a non-null value."))}function m(e,t=[],n=!1){if(null==t&&(t=[]),Array.isArray(e)||A(e)&&!n)for(let s=0;s0),n){return new Promise(((s,o)=>{let r=0;const i=()=>{if(e())return void s();r++;const a=t(r);null!=n&&r>=n?o():setTimeout(i,a)};i()}))}function y(e,t){let n=1,s=-1;for(let t=0;t=0)n*=e[t];else if(-1===e[t]){if(-1!==s)throw Error(`Shapes can only have 1 implicit size. Found -1 at dim ${s} and dim ${t}`);s=t}else if(e[t]<0)throw Error(`Shapes can not be < 0. Found ${e[t]} at dim ${t}`);if(-1===s){if(t>0&&t!==n)throw Error(`Size(${t}) must match the product of shape ${e}`);return e}if(0===n)throw Error(`Cannot infer the missing size in [${e}] when there are 0 elements`);if(t%n!=0)throw Error(`The implicit shape can't be a fractional number. Got ${t} / ${n}`);const o=e.slice();return o[s]=t/n,o}function O(e,t){const n=t.length;return c((e=null==e?t.map(((e,t)=>t)):[].concat(e)).every((e=>e>=-n&&e`All values in axis param must be in range [-${n}, ${n}) but got axis ${e}`)),c(e.every((e=>g(e))),(()=>`All values in axis param must be integers but got axis ${e}`)),e.map((e=>e<0?n+e:e))}function I(e,t){const n=[],s=[],o=null!=t&&Array.isArray(t)&&0===t.length,r=null==t||o?null:O(t,e).sort();let i=0;for(let t=0;tt)&&1===e[t]&&(n.push(e[t]),s.push(t)),r[i]<=t&&i++}1!==e[t]&&(n.push(e[t]),s.push(t))}return{newShape:n,keptDims:s}}function C(e,t){let n=null;if(null==e||"float32"===e)n=new Float32Array(t);else if("int32"===e)n=new Int32Array(t);else{if("bool"!==e)throw new Error(`Unknown data type ${e}`);n=new Uint8Array(t)}return n}function S(e,t){let n=null;if(null==e||"float32"===e)n=new Float32Array(t);else if("int32"===e)n=new Int32Array(t);else if("bool"===e)n=new Uint8Array(t);else{if("string"!==e)throw new Error(`Unknown data type ${e}`);n=new Array(t)}return n}function T(e,t){for(let n=0;nt+=e.length)),t}function M(e){return"string"==typeof e||e instanceof String}function $(e){return"boolean"==typeof e}function D(e){return"number"==typeof e}function P(e){return Array.isArray(e)?P(e[0]):e instanceof Float32Array?"float32":e instanceof Int32Array||e instanceof Uint8Array?"int32":D(e)?"float32":M(e)?"string":$(e)?"bool":"float32"}function B(e){return!!(e&&e.constructor&&e.call&&e.apply)}function L(e,t){for(let n=t;n=0;--s)n[s]=n[s+1]*e[s+1];return n}function G(e,t,n,s=!1){const o=new Array;if(1===t.length){const r=t[0]*(s?2:1);for(let t=0;te*t))*(s?2:1);for(let t=0;te*t))*(n?2:1);if(0===s)return[];if(s!==t.length)throw new Error(`[${e}] does not match the input size ${t.length}${n?" for a complex tensor":""}.`);return G(0,e,t,n)}function W(e,t){const n=V(e,t);for(let e=0;ee*t),1);if(null==t||"float32"===t)return U(e,new Float32Array(n));if("int32"===t)return U(e,new Int32Array(n));if("bool"===t)return U(e,new Uint8Array(n));throw new Error(`Unknown data type ${t}`)}function H(e){e.forEach((t=>{c(Number.isInteger(t)&&t>=0,(()=>`Tensor must have a shape comprised of positive integers but got shape [${e}].`))}))}function K(e,t,n){if(0===t)return 0;if(1===t)return e[0];let s=e[e.length-1];for(let t=0;t0?i-4:i;for(n=0;n>16&255,u[l++]=t>>8&255,u[l++]=255&t;2===a&&(t=o[e.charCodeAt(n)]<<2|o[e.charCodeAt(n+1)]>>4,u[l++]=255&t);1===a&&(t=o[e.charCodeAt(n)]<<10|o[e.charCodeAt(n+1)]<<4|o[e.charCodeAt(n+2)]>>2,u[l++]=t>>8&255,u[l++]=255&t);return u},t.fromByteArray=function(e){for(var t,n=e.length,o=n%3,r=[],i=16383,a=0,u=n-o;au?u:a+i));1===o?(t=e[n-1],r.push(s[t>>2]+s[t<<4&63]+"==")):2===o&&(t=(e[n-2]<<8)+e[n-1],r.push(s[t>>10]+s[t>>4&63]+s[t<<2&63]+"="));return r.join("")};for(var s=[],o=[],r="undefined"!=typeof Uint8Array?Uint8Array:Array,i="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",a=0,u=i.length;a0)throw new Error("Invalid string. Length must be a multiple of 4");var n=e.indexOf("=");return-1===n&&(n=t),[n,n===t?0:4-n%4]}function l(e,t,n){for(var o,r,i=[],a=t;a>18&63]+s[r>>12&63]+s[r>>6&63]+s[63&r]);return i.join("")}o["-".charCodeAt(0)]=62,o["_".charCodeAt(0)]=63},"./node_modules/buffer/index.js": +/*!**************************************!*\ + !*** ./node_modules/buffer/index.js ***! + \**************************************/ +/*! no static exports found */function(e,t,n){"use strict";(function(e){ +/*! + * The buffer module from node.js, for the browser. + * + * @author Feross Aboukhadijeh + * @license MIT + */ +var s=n(/*! base64-js */"./node_modules/base64-js/index.js"),o=n(/*! ieee754 */"./node_modules/ieee754/index.js"),r=n(/*! isarray */"./node_modules/isarray/index.js");function i(){return u.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function a(e,t){if(i()=i())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+i().toString(16)+" bytes");return 0|e}function m(e,t){if(u.isBuffer(e))return e.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e.byteLength;"string"!=typeof e&&(e=""+e);var n=e.length;if(0===n)return 0;for(var s=!1;;)switch(t){case"ascii":case"latin1":case"binary":return n;case"utf8":case"utf-8":case void 0:return z(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*n;case"hex":return n>>>1;case"base64":return G(e).length;default:if(s)return z(e).length;t=(""+t).toLowerCase(),s=!0}}function h(e,t,n){var s=!1;if((void 0===t||t<0)&&(t=0),t>this.length)return"";if((void 0===n||n>this.length)&&(n=this.length),n<=0)return"";if((n>>>=0)<=(t>>>=0))return"";for(e||(e="utf8");;)switch(e){case"hex":return N(this,t,n);case"utf8":case"utf-8":return I(this,t,n);case"ascii":return S(this,t,n);case"latin1":case"binary":return T(this,t,n);case"base64":return O(this,t,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return E(this,t,n);default:if(s)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),s=!0}}function b(e,t,n){var s=e[t];e[t]=e[n],e[n]=s}function j(e,t,n,s,o){if(0===e.length)return-1;if("string"==typeof n?(s=n,n=0):n>2147483647?n=2147483647:n<-2147483648&&(n=-2147483648),n=+n,isNaN(n)&&(n=o?0:e.length-1),n<0&&(n=e.length+n),n>=e.length){if(o)return-1;n=e.length-1}else if(n<0){if(!o)return-1;n=0}if("string"==typeof t&&(t=u.from(t,s)),u.isBuffer(t))return 0===t.length?-1:g(e,t,n,s,o);if("number"==typeof t)return t&=255,u.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?o?Uint8Array.prototype.indexOf.call(e,t,n):Uint8Array.prototype.lastIndexOf.call(e,t,n):g(e,[t],n,s,o);throw new TypeError("val must be string, number or Buffer")}function g(e,t,n,s,o){var r,i=1,a=e.length,u=t.length;if(void 0!==s&&("ucs2"===(s=String(s).toLowerCase())||"ucs-2"===s||"utf16le"===s||"utf-16le"===s)){if(e.length<2||t.length<2)return-1;i=2,a/=2,u/=2,n/=2}function d(e,t){return 1===i?e[t]:e.readUInt16BE(t*i)}if(o){var l=-1;for(r=n;ra&&(n=a-u),r=n;r>=0;r--){for(var c=!0,f=0;fo&&(s=o):s=o;var r=t.length;if(r%2!=0)throw new TypeError("Invalid hex string");s>r/2&&(s=r/2);for(var i=0;i>8,o=n%256,r.push(o),r.push(s);return r}(t,e.length-n),e,n,s)}function O(e,t,n){return 0===t&&n===e.length?s.fromByteArray(e):s.fromByteArray(e.slice(t,n))}function I(e,t,n){n=Math.min(e.length,n);for(var s=[],o=t;o239?4:d>223?3:d>191?2:1;if(o+c<=n)switch(c){case 1:d<128&&(l=d);break;case 2:128==(192&(r=e[o+1]))&&(u=(31&d)<<6|63&r)>127&&(l=u);break;case 3:r=e[o+1],i=e[o+2],128==(192&r)&&128==(192&i)&&(u=(15&d)<<12|(63&r)<<6|63&i)>2047&&(u<55296||u>57343)&&(l=u);break;case 4:r=e[o+1],i=e[o+2],a=e[o+3],128==(192&r)&&128==(192&i)&&128==(192&a)&&(u=(15&d)<<18|(63&r)<<12|(63&i)<<6|63&a)>65535&&u<1114112&&(l=u)}null===l?(l=65533,c=1):l>65535&&(l-=65536,s.push(l>>>10&1023|55296),l=56320|1023&l),s.push(l),o+=c}return function(e){var t=e.length;if(t<=C)return String.fromCharCode.apply(String,e);var n="",s=0;for(;s0&&(e=this.toString("hex",0,n).match(/.{2}/g).join(" "),this.length>n&&(e+=" ... ")),""},u.prototype.compare=function(e,t,n,s,o){if(!u.isBuffer(e))throw new TypeError("Argument must be a Buffer");if(void 0===t&&(t=0),void 0===n&&(n=e?e.length:0),void 0===s&&(s=0),void 0===o&&(o=this.length),t<0||n>e.length||s<0||o>this.length)throw new RangeError("out of range index");if(s>=o&&t>=n)return 0;if(s>=o)return-1;if(t>=n)return 1;if(this===e)return 0;for(var r=(o>>>=0)-(s>>>=0),i=(n>>>=0)-(t>>>=0),a=Math.min(r,i),d=this.slice(s,o),l=e.slice(t,n),c=0;co)&&(n=o),e.length>0&&(n<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");s||(s="utf8");for(var r=!1;;)switch(s){case"hex":return w(this,e,t,n);case"utf8":case"utf-8":return _(this,e,t,n);case"ascii":return k(this,e,t,n);case"latin1":case"binary":return v(this,e,t,n);case"base64":return x(this,e,t,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return y(this,e,t,n);default:if(r)throw new TypeError("Unknown encoding: "+s);s=(""+s).toLowerCase(),r=!0}},u.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var C=4096;function S(e,t,n){var s="";n=Math.min(e.length,n);for(var o=t;os)&&(n=s);for(var o="",r=t;rn)throw new RangeError("Trying to access beyond buffer length")}function R(e,t,n,s,o,r){if(!u.isBuffer(e))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>o||te.length)throw new RangeError("Index out of range")}function F(e,t,n,s){t<0&&(t=65535+t+1);for(var o=0,r=Math.min(e.length-n,2);o>>8*(s?o:1-o)}function M(e,t,n,s){t<0&&(t=4294967295+t+1);for(var o=0,r=Math.min(e.length-n,4);o>>8*(s?o:3-o)&255}function $(e,t,n,s,o,r){if(n+s>e.length)throw new RangeError("Index out of range");if(n<0)throw new RangeError("Index out of range")}function D(e,t,n,s,r){return r||$(e,0,n,4),o.write(e,t,n,s,23,4),n+4}function P(e,t,n,s,r){return r||$(e,0,n,8),o.write(e,t,n,s,52,8),n+8}u.prototype.slice=function(e,t){var n,s=this.length;if((e=~~e)<0?(e+=s)<0&&(e=0):e>s&&(e=s),(t=void 0===t?s:~~t)<0?(t+=s)<0&&(t=0):t>s&&(t=s),t0&&(o*=256);)s+=this[e+--t]*o;return s},u.prototype.readUInt8=function(e,t){return t||A(e,1,this.length),this[e]},u.prototype.readUInt16LE=function(e,t){return t||A(e,2,this.length),this[e]|this[e+1]<<8},u.prototype.readUInt16BE=function(e,t){return t||A(e,2,this.length),this[e]<<8|this[e+1]},u.prototype.readUInt32LE=function(e,t){return t||A(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},u.prototype.readUInt32BE=function(e,t){return t||A(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},u.prototype.readIntLE=function(e,t,n){e|=0,t|=0,n||A(e,t,this.length);for(var s=this[e],o=1,r=0;++r=(o*=128)&&(s-=Math.pow(2,8*t)),s},u.prototype.readIntBE=function(e,t,n){e|=0,t|=0,n||A(e,t,this.length);for(var s=t,o=1,r=this[e+--s];s>0&&(o*=256);)r+=this[e+--s]*o;return r>=(o*=128)&&(r-=Math.pow(2,8*t)),r},u.prototype.readInt8=function(e,t){return t||A(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},u.prototype.readInt16LE=function(e,t){t||A(e,2,this.length);var n=this[e]|this[e+1]<<8;return 32768&n?4294901760|n:n},u.prototype.readInt16BE=function(e,t){t||A(e,2,this.length);var n=this[e+1]|this[e]<<8;return 32768&n?4294901760|n:n},u.prototype.readInt32LE=function(e,t){return t||A(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},u.prototype.readInt32BE=function(e,t){return t||A(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},u.prototype.readFloatLE=function(e,t){return t||A(e,4,this.length),o.read(this,e,!0,23,4)},u.prototype.readFloatBE=function(e,t){return t||A(e,4,this.length),o.read(this,e,!1,23,4)},u.prototype.readDoubleLE=function(e,t){return t||A(e,8,this.length),o.read(this,e,!0,52,8)},u.prototype.readDoubleBE=function(e,t){return t||A(e,8,this.length),o.read(this,e,!1,52,8)},u.prototype.writeUIntLE=function(e,t,n,s){(e=+e,t|=0,n|=0,s)||R(this,e,t,n,Math.pow(2,8*n)-1,0);var o=1,r=0;for(this[t]=255&e;++r=0&&(r*=256);)this[t+o]=e/r&255;return t+n},u.prototype.writeUInt8=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,1,255,0),u.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),this[t]=255&e,t+1},u.prototype.writeUInt16LE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,2,65535,0),u.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):F(this,e,t,!0),t+2},u.prototype.writeUInt16BE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,2,65535,0),u.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):F(this,e,t,!1),t+2},u.prototype.writeUInt32LE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,4,4294967295,0),u.TYPED_ARRAY_SUPPORT?(this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e):M(this,e,t,!0),t+4},u.prototype.writeUInt32BE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,4,4294967295,0),u.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):M(this,e,t,!1),t+4},u.prototype.writeIntLE=function(e,t,n,s){if(e=+e,t|=0,!s){var o=Math.pow(2,8*n-1);R(this,e,t,n,o-1,-o)}var r=0,i=1,a=0;for(this[t]=255&e;++r>0)-a&255;return t+n},u.prototype.writeIntBE=function(e,t,n,s){if(e=+e,t|=0,!s){var o=Math.pow(2,8*n-1);R(this,e,t,n,o-1,-o)}var r=n-1,i=1,a=0;for(this[t+r]=255&e;--r>=0&&(i*=256);)e<0&&0===a&&0!==this[t+r+1]&&(a=1),this[t+r]=(e/i>>0)-a&255;return t+n},u.prototype.writeInt8=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,1,127,-128),u.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),e<0&&(e=255+e+1),this[t]=255&e,t+1},u.prototype.writeInt16LE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,2,32767,-32768),u.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):F(this,e,t,!0),t+2},u.prototype.writeInt16BE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,2,32767,-32768),u.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):F(this,e,t,!1),t+2},u.prototype.writeInt32LE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,4,2147483647,-2147483648),u.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24):M(this,e,t,!0),t+4},u.prototype.writeInt32BE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),u.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):M(this,e,t,!1),t+4},u.prototype.writeFloatLE=function(e,t,n){return D(this,e,t,!0,n)},u.prototype.writeFloatBE=function(e,t,n){return D(this,e,t,!1,n)},u.prototype.writeDoubleLE=function(e,t,n){return P(this,e,t,!0,n)},u.prototype.writeDoubleBE=function(e,t,n){return P(this,e,t,!1,n)},u.prototype.copy=function(e,t,n,s){if(n||(n=0),s||0===s||(s=this.length),t>=e.length&&(t=e.length),t||(t=0),s>0&&s=this.length)throw new RangeError("sourceStart out of bounds");if(s<0)throw new RangeError("sourceEnd out of bounds");s>this.length&&(s=this.length),e.length-t=0;--o)e[o+t]=this[o+n];else if(r<1e3||!u.TYPED_ARRAY_SUPPORT)for(o=0;o>>=0,n=void 0===n?this.length:n>>>0,e||(e=0),"number"==typeof e)for(r=t;r55295&&n<57344){if(!o){if(n>56319){(t-=3)>-1&&r.push(239,191,189);continue}if(i+1===s){(t-=3)>-1&&r.push(239,191,189);continue}o=n;continue}if(n<56320){(t-=3)>-1&&r.push(239,191,189),o=n;continue}n=65536+(o-55296<<10|n-56320)}else o&&(t-=3)>-1&&r.push(239,191,189);if(o=null,n<128){if((t-=1)<0)break;r.push(n)}else if(n<2048){if((t-=2)<0)break;r.push(n>>6|192,63&n|128)}else if(n<65536){if((t-=3)<0)break;r.push(n>>12|224,n>>6&63|128,63&n|128)}else{if(!(n<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;r.push(n>>18|240,n>>12&63|128,n>>6&63|128,63&n|128)}}return r}function G(e){return s.toByteArray(function(e){if((e=function(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,"")}(e).replace(B,"")).length<2)return"";for(;e.length%4!=0;)e+="=";return e}(e))}function U(e,t,n,s){for(var o=0;o=t.length||o>=e.length);++o)t[o+n]=e[o];return o}}).call(this,n(/*! ./../webpack/buildin/global.js */"./node_modules/webpack/buildin/global.js"))},"./node_modules/ieee754/index.js": +/*!***************************************!*\ + !*** ./node_modules/ieee754/index.js ***! + \***************************************/ +/*! no static exports found */function(e,t){ +/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh */ +t.read=function(e,t,n,s,o){var r,i,a=8*o-s-1,u=(1<>1,l=-7,c=n?o-1:0,f=n?-1:1,p=e[t+c];for(c+=f,r=p&(1<<-l)-1,p>>=-l,l+=a;l>0;r=256*r+e[t+c],c+=f,l-=8);for(i=r&(1<<-l)-1,r>>=-l,l+=s;l>0;i=256*i+e[t+c],c+=f,l-=8);if(0===r)r=1-d;else{if(r===u)return i?NaN:1/0*(p?-1:1);i+=Math.pow(2,s),r-=d}return(p?-1:1)*i*Math.pow(2,r-s)},t.write=function(e,t,n,s,o,r){var i,a,u,d=8*r-o-1,l=(1<>1,f=23===o?Math.pow(2,-24)-Math.pow(2,-77):0,p=s?0:r-1,m=s?1:-1,h=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(a=isNaN(t)?1:0,i=l):(i=Math.floor(Math.log(t)/Math.LN2),t*(u=Math.pow(2,-i))<1&&(i--,u*=2),(t+=i+c>=1?f/u:f*Math.pow(2,1-c))*u>=2&&(i++,u/=2),i+c>=l?(a=0,i=l):i+c>=1?(a=(t*u-1)*Math.pow(2,o),i+=c):(a=t*Math.pow(2,c-1)*Math.pow(2,o),i=0));o>=8;e[n+p]=255&a,p+=m,a/=256,o-=8);for(i=i<0;e[n+p]=255&i,p+=m,i/=256,d-=8);e[n+p-m]|=128*h}},"./node_modules/isarray/index.js": +/*!***************************************!*\ + !*** ./node_modules/isarray/index.js ***! + \***************************************/ +/*! no static exports found */function(e,t){var n={}.toString;e.exports=Array.isArray||function(e){return"[object Array]"==n.call(e)}},"./node_modules/long/src/long.js": +/*!***************************************!*\ + !*** ./node_modules/long/src/long.js ***! + \***************************************/ +/*! no static exports found */function(e,t){e.exports=s;var n=null;try{n=new WebAssembly.Instance(new WebAssembly.Module(new Uint8Array([0,97,115,109,1,0,0,0,1,13,2,96,0,1,127,96,4,127,127,127,127,1,127,3,7,6,0,1,1,1,1,1,6,6,1,127,1,65,0,11,7,50,6,3,109,117,108,0,1,5,100,105,118,95,115,0,2,5,100,105,118,95,117,0,3,5,114,101,109,95,115,0,4,5,114,101,109,95,117,0,5,8,103,101,116,95,104,105,103,104,0,0,10,191,1,6,4,0,35,0,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,126,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,127,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,128,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,129,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,130,34,4,66,32,135,167,36,0,32,4,167,11])),{}).exports}catch(e){}function s(e,t,n){this.low=0|e,this.high=0|t,this.unsigned=!!n}function o(e){return!0===(e&&e.__isLong__)}s.prototype.__isLong__,Object.defineProperty(s.prototype,"__isLong__",{value:!0}),s.isLong=o;var r={},i={};function a(e,t){var n,s,o;return t?(o=0<=(e>>>=0)&&e<256)&&(s=i[e])?s:(n=d(e,(0|e)<0?-1:0,!0),o&&(i[e]=n),n):(o=-128<=(e|=0)&&e<128)&&(s=r[e])?s:(n=d(e,e<0?-1:0,!1),o&&(r[e]=n),n)}function u(e,t){if(isNaN(e))return t?g:j;if(t){if(e<0)return g;if(e>=m)return x}else{if(e<=-h)return y;if(e+1>=h)return v}return e<0?u(-e,t).neg():d(e%p|0,e/p|0,t)}function d(e,t,n){return new s(e,t,n)}s.fromInt=a,s.fromNumber=u,s.fromBits=d;var l=Math.pow;function c(e,t,n){if(0===e.length)throw Error("empty string");if("NaN"===e||"Infinity"===e||"+Infinity"===e||"-Infinity"===e)return j;if("number"==typeof t?(n=t,t=!1):t=!!t,(n=n||10)<2||360)throw Error("interior hyphen");if(0===s)return c(e.substring(1),t,n).neg();for(var o=u(l(n,8)),r=j,i=0;i>>0:this.low},O.toNumber=function(){return this.unsigned?(this.high>>>0)*p+(this.low>>>0):this.high*p+(this.low>>>0)},O.toString=function(e){if((e=e||10)<2||36>>0).toString(e);if((r=a).isZero())return d+i;for(;d.length<6;)d="0"+d;i=""+d+i}},O.getHighBits=function(){return this.high},O.getHighBitsUnsigned=function(){return this.high>>>0},O.getLowBits=function(){return this.low},O.getLowBitsUnsigned=function(){return this.low>>>0},O.getNumBitsAbs=function(){if(this.isNegative())return this.eq(y)?64:this.neg().getNumBitsAbs();for(var e=0!=this.high?this.high:this.low,t=31;t>0&&0==(e&1<=0},O.isOdd=function(){return 1==(1&this.low)},O.isEven=function(){return 0==(1&this.low)},O.equals=function(e){return o(e)||(e=f(e)),(this.unsigned===e.unsigned||this.high>>>31!=1||e.high>>>31!=1)&&(this.high===e.high&&this.low===e.low)},O.eq=O.equals,O.notEquals=function(e){return!this.eq(e)},O.neq=O.notEquals,O.ne=O.notEquals,O.lessThan=function(e){return this.comp(e)<0},O.lt=O.lessThan,O.lessThanOrEqual=function(e){return this.comp(e)<=0},O.lte=O.lessThanOrEqual,O.le=O.lessThanOrEqual,O.greaterThan=function(e){return this.comp(e)>0},O.gt=O.greaterThan,O.greaterThanOrEqual=function(e){return this.comp(e)>=0},O.gte=O.greaterThanOrEqual,O.ge=O.greaterThanOrEqual,O.compare=function(e){if(o(e)||(e=f(e)),this.eq(e))return 0;var t=this.isNegative(),n=e.isNegative();return t&&!n?-1:!t&&n?1:this.unsigned?e.high>>>0>this.high>>>0||e.high===this.high&&e.low>>>0>this.low>>>0?-1:1:this.sub(e).isNegative()?-1:1},O.comp=O.compare,O.negate=function(){return!this.unsigned&&this.eq(y)?y:this.not().add(w)},O.neg=O.negate,O.add=function(e){o(e)||(e=f(e));var t=this.high>>>16,n=65535&this.high,s=this.low>>>16,r=65535&this.low,i=e.high>>>16,a=65535&e.high,u=e.low>>>16,l=0,c=0,p=0,m=0;return p+=(m+=r+(65535&e.low))>>>16,c+=(p+=s+u)>>>16,l+=(c+=n+a)>>>16,l+=t+i,d((p&=65535)<<16|(m&=65535),(l&=65535)<<16|(c&=65535),this.unsigned)},O.subtract=function(e){return o(e)||(e=f(e)),this.add(e.neg())},O.sub=O.subtract,O.multiply=function(e){if(this.isZero())return j;if(o(e)||(e=f(e)),n)return d(n.mul(this.low,this.high,e.low,e.high),n.get_high(),this.unsigned);if(e.isZero())return j;if(this.eq(y))return e.isOdd()?y:j;if(e.eq(y))return this.isOdd()?y:j;if(this.isNegative())return e.isNegative()?this.neg().mul(e.neg()):this.neg().mul(e).neg();if(e.isNegative())return this.mul(e.neg()).neg();if(this.lt(b)&&e.lt(b))return u(this.toNumber()*e.toNumber(),this.unsigned);var t=this.high>>>16,s=65535&this.high,r=this.low>>>16,i=65535&this.low,a=e.high>>>16,l=65535&e.high,c=e.low>>>16,p=65535&e.low,m=0,h=0,g=0,w=0;return g+=(w+=i*p)>>>16,h+=(g+=r*p)>>>16,g&=65535,h+=(g+=i*c)>>>16,m+=(h+=s*p)>>>16,h&=65535,m+=(h+=r*c)>>>16,h&=65535,m+=(h+=i*l)>>>16,m+=t*p+s*c+r*l+i*a,d((g&=65535)<<16|(w&=65535),(m&=65535)<<16|(h&=65535),this.unsigned)},O.mul=O.multiply,O.divide=function(e){if(o(e)||(e=f(e)),e.isZero())throw Error("division by zero");var t,s,r;if(n)return this.unsigned||-2147483648!==this.high||-1!==e.low||-1!==e.high?d((this.unsigned?n.div_u:n.div_s)(this.low,this.high,e.low,e.high),n.get_high(),this.unsigned):this;if(this.isZero())return this.unsigned?g:j;if(this.unsigned){if(e.unsigned||(e=e.toUnsigned()),e.gt(this))return g;if(e.gt(this.shru(1)))return _;r=g}else{if(this.eq(y))return e.eq(w)||e.eq(k)?y:e.eq(y)?w:(t=this.shr(1).div(e).shl(1)).eq(j)?e.isNegative()?w:k:(s=this.sub(e.mul(t)),r=t.add(s.div(e)));if(e.eq(y))return this.unsigned?g:j;if(this.isNegative())return e.isNegative()?this.neg().div(e.neg()):this.neg().div(e).neg();if(e.isNegative())return this.div(e.neg()).neg();r=j}for(s=this;s.gte(e);){t=Math.max(1,Math.floor(s.toNumber()/e.toNumber()));for(var i=Math.ceil(Math.log(t)/Math.LN2),a=i<=48?1:l(2,i-48),c=u(t),p=c.mul(e);p.isNegative()||p.gt(s);)p=(c=u(t-=a,this.unsigned)).mul(e);c.isZero()&&(c=w),r=r.add(c),s=s.sub(p)}return r},O.div=O.divide,O.modulo=function(e){return o(e)||(e=f(e)),n?d((this.unsigned?n.rem_u:n.rem_s)(this.low,this.high,e.low,e.high),n.get_high(),this.unsigned):this.sub(this.div(e).mul(e))},O.mod=O.modulo,O.rem=O.modulo,O.not=function(){return d(~this.low,~this.high,this.unsigned)},O.and=function(e){return o(e)||(e=f(e)),d(this.low&e.low,this.high&e.high,this.unsigned)},O.or=function(e){return o(e)||(e=f(e)),d(this.low|e.low,this.high|e.high,this.unsigned)},O.xor=function(e){return o(e)||(e=f(e)),d(this.low^e.low,this.high^e.high,this.unsigned)},O.shiftLeft=function(e){return o(e)&&(e=e.toInt()),0==(e&=63)?this:e<32?d(this.low<>>32-e,this.unsigned):d(0,this.low<>>e|this.high<<32-e,this.high>>e,this.unsigned):d(this.high>>e-32,this.high>=0?0:-1,this.unsigned)},O.shr=O.shiftRight,O.shiftRightUnsigned=function(e){if(o(e)&&(e=e.toInt()),0===(e&=63))return this;var t=this.high;return e<32?d(this.low>>>e|t<<32-e,t>>>e,this.unsigned):d(32===e?t:t>>>e-32,0,this.unsigned)},O.shru=O.shiftRightUnsigned,O.shr_u=O.shiftRightUnsigned,O.toSigned=function(){return this.unsigned?d(this.low,this.high,!1):this},O.toUnsigned=function(){return this.unsigned?this:d(this.low,this.high,!0)},O.toBytes=function(e){return e?this.toBytesLE():this.toBytesBE()},O.toBytesLE=function(){var e=this.high,t=this.low;return[255&t,t>>>8&255,t>>>16&255,t>>>24,255&e,e>>>8&255,e>>>16&255,e>>>24]},O.toBytesBE=function(){var e=this.high,t=this.low;return[e>>>24,e>>>16&255,e>>>8&255,255&e,t>>>24,t>>>16&255,t>>>8&255,255&t]},s.fromBytes=function(e,t,n){return n?s.fromBytesLE(e,t):s.fromBytesBE(e,t)},s.fromBytesLE=function(e,t){return new s(e[0]|e[1]<<8|e[2]<<16|e[3]<<24,e[4]|e[5]<<8|e[6]<<16|e[7]<<24,t)},s.fromBytesBE=function(e,t){return new s(e[4]<<24|e[5]<<16|e[6]<<8|e[7],e[0]<<24|e[1]<<16|e[2]<<8|e[3],t)}},"./node_modules/process/browser.js": +/*!*****************************************!*\ + !*** ./node_modules/process/browser.js ***! + \*****************************************/ +/*! no static exports found */function(e,t){var n,s,o=e.exports={};function r(){throw new Error("setTimeout has not been defined")}function i(){throw new Error("clearTimeout has not been defined")}function a(e){if(n===setTimeout)return setTimeout(e,0);if((n===r||!n)&&setTimeout)return n=setTimeout,setTimeout(e,0);try{return n(e,0)}catch(t){try{return n.call(null,e,0)}catch(t){return n.call(this,e,0)}}}!function(){try{n="function"==typeof setTimeout?setTimeout:r}catch(e){n=r}try{s="function"==typeof clearTimeout?clearTimeout:i}catch(e){s=i}}();var u,d=[],l=!1,c=-1;function f(){l&&u&&(l=!1,u.length?d=u.concat(d):c=-1,d.length&&p())}function p(){if(!l){var e=a(f);l=!0;for(var t=d.length;t;){for(u=d,d=[];++c1)for(var n=1;n>>0,t=(s*=t)>>>0,t+=4294967296*(s-=t)}return 2.3283064365386963e-10*(t>>>0)});n.next=function(){var e=2091639*n.s0+2.3283064365386963e-10*n.c;return n.s0=n.s1,n.s1=n.s2,n.s2=e-(n.c=0|e)},n.c=1,n.s0=s(" "),n.s1=s(" "),n.s2=s(" "),n.s0-=s(e),n.s0<0&&(n.s0+=1),n.s1-=s(e),n.s1<0&&(n.s1+=1),n.s2-=s(e),n.s2<0&&(n.s2+=1),s=null}function a(e,t){return t.c=e.c,t.s0=e.s0,t.s1=e.s1,t.s2=e.s2,t}function u(e,t){var n=new i(e),s=t&&t.state,o=n.next;return o.int32=function(){return 4294967296*n.next()|0},o.double=function(){return o()+11102230246251565e-32*(2097152*o()|0)},o.quick=o,s&&("object"==typeof s&&a(s,n),o.state=function(){return a(n,{})}),o}o&&o.exports?o.exports=u:n(/*! !webpack amd define */"./node_modules/webpack/buildin/amd-define.js")&&n(/*! !webpack amd options */"./node_modules/webpack/buildin/amd-options.js")?void 0===(s=function(){return u}.call(t,n,t,o))||(o.exports=s):this.alea=u}(0,e,n(/*! !webpack amd define */"./node_modules/webpack/buildin/amd-define.js"))}).call(this,n(/*! ./../../webpack/buildin/module.js */"./node_modules/webpack/buildin/module.js")(e))},"./node_modules/seedrandom/lib/tychei.js": +/*!***********************************************!*\ + !*** ./node_modules/seedrandom/lib/tychei.js ***! + \***********************************************/ +/*! no static exports found */function(e,t,n){(function(e){var s;!function(e,o,r){function i(e){var t=this,n="";t.next=function(){var e=t.b,n=t.c,s=t.d,o=t.a;return e=e<<25^e>>>7^n,n=n-s|0,s=s<<24^s>>>8^o,o=o-e|0,t.b=e=e<<20^e>>>12^n,t.c=n=n-s|0,t.d=s<<16^n>>>16^o,t.a=o-e|0},t.a=0,t.b=0,t.c=-1640531527,t.d=1367130551,e===Math.floor(e)?(t.a=e/4294967296|0,t.b=0|e):n+=e;for(var s=0;s>>0)/4294967296};return o.double=function(){do{var e=((n.next()>>>11)+(n.next()>>>0)/4294967296)/(1<<21)}while(0===e);return e},o.int32=n.next,o.quick=o,s&&("object"==typeof s&&a(s,n),o.state=function(){return a(n,{})}),o}o&&o.exports?o.exports=u:n(/*! !webpack amd define */"./node_modules/webpack/buildin/amd-define.js")&&n(/*! !webpack amd options */"./node_modules/webpack/buildin/amd-options.js")?void 0===(s=function(){return u}.call(t,n,t,o))||(o.exports=s):this.tychei=u}(0,e,n(/*! !webpack amd define */"./node_modules/webpack/buildin/amd-define.js"))}).call(this,n(/*! ./../../webpack/buildin/module.js */"./node_modules/webpack/buildin/module.js")(e))},"./node_modules/seedrandom/lib/xor128.js": +/*!***********************************************!*\ + !*** ./node_modules/seedrandom/lib/xor128.js ***! + \***********************************************/ +/*! no static exports found */function(e,t,n){(function(e){var s;!function(e,o,r){function i(e){var t=this,n="";t.x=0,t.y=0,t.z=0,t.w=0,t.next=function(){var e=t.x^t.x<<11;return t.x=t.y,t.y=t.z,t.z=t.w,t.w^=t.w>>>19^e^e>>>8},e===(0|e)?t.x=e:n+=e;for(var s=0;s>>0)/4294967296};return o.double=function(){do{var e=((n.next()>>>11)+(n.next()>>>0)/4294967296)/(1<<21)}while(0===e);return e},o.int32=n.next,o.quick=o,s&&("object"==typeof s&&a(s,n),o.state=function(){return a(n,{})}),o}o&&o.exports?o.exports=u:n(/*! !webpack amd define */"./node_modules/webpack/buildin/amd-define.js")&&n(/*! !webpack amd options */"./node_modules/webpack/buildin/amd-options.js")?void 0===(s=function(){return u}.call(t,n,t,o))||(o.exports=s):this.xor128=u}(0,e,n(/*! !webpack amd define */"./node_modules/webpack/buildin/amd-define.js"))}).call(this,n(/*! ./../../webpack/buildin/module.js */"./node_modules/webpack/buildin/module.js")(e))},"./node_modules/seedrandom/lib/xor4096.js": +/*!************************************************!*\ + !*** ./node_modules/seedrandom/lib/xor4096.js ***! + \************************************************/ +/*! no static exports found */function(e,t,n){(function(e){var s;!function(e,o,r){function i(e){var t=this;t.next=function(){var e,n,s=t.w,o=t.X,r=t.i;return t.w=s=s+1640531527|0,n=o[r+34&127],e=o[r=r+1&127],n^=n<<13,e^=e<<17,n^=n>>>15,e^=e>>>12,n=o[r]=n^e,t.i=r,n+(s^s>>>16)|0},function(e,t){var n,s,o,r,i,a=[],u=128;for(t===(0|t)?(s=t,t=null):(t+="\0",s=0,u=Math.max(u,t.length)),o=0,r=-32;r>>15,s^=s<<4,s^=s>>>13,r>=0&&(i=i+1640531527|0,o=0==(n=a[127&r]^=s+i)?o+1:0);for(o>=128&&(a[127&(t&&t.length||0)]=-1),o=127,r=512;r>0;--r)s=a[o+34&127],n=a[o=o+1&127],s^=s<<13,n^=n<<17,s^=s>>>15,n^=n>>>12,a[o]=s^n;e.w=i,e.X=a,e.i=o}(t,e)}function a(e,t){return t.i=e.i,t.w=e.w,t.X=e.X.slice(),t}function u(e,t){null==e&&(e=+new Date);var n=new i(e),s=t&&t.state,o=function(){return(n.next()>>>0)/4294967296};return o.double=function(){do{var e=((n.next()>>>11)+(n.next()>>>0)/4294967296)/(1<<21)}while(0===e);return e},o.int32=n.next,o.quick=o,s&&(s.X&&a(s,n),o.state=function(){return a(n,{})}),o}o&&o.exports?o.exports=u:n(/*! !webpack amd define */"./node_modules/webpack/buildin/amd-define.js")&&n(/*! !webpack amd options */"./node_modules/webpack/buildin/amd-options.js")?void 0===(s=function(){return u}.call(t,n,t,o))||(o.exports=s):this.xor4096=u}(0,e,n(/*! !webpack amd define */"./node_modules/webpack/buildin/amd-define.js"))}).call(this,n(/*! ./../../webpack/buildin/module.js */"./node_modules/webpack/buildin/module.js")(e))},"./node_modules/seedrandom/lib/xorshift7.js": +/*!**************************************************!*\ + !*** ./node_modules/seedrandom/lib/xorshift7.js ***! + \**************************************************/ +/*! no static exports found */function(e,t,n){(function(e){var s;!function(e,o,r){function i(e){var t=this;t.next=function(){var e,n,s=t.x,o=t.i;return e=s[o],n=(e^=e>>>7)^e<<24,n^=(e=s[o+1&7])^e>>>10,n^=(e=s[o+3&7])^e>>>3,n^=(e=s[o+4&7])^e<<7,e=s[o+7&7],n^=(e^=e<<13)^e<<9,s[o]=n,t.i=o+1&7,n},function(e,t){var n,s=[];if(t===(0|t))s[0]=t;else for(t=""+t,n=0;n0;--n)e.next()}(t,e)}function a(e,t){return t.x=e.x.slice(),t.i=e.i,t}function u(e,t){null==e&&(e=+new Date);var n=new i(e),s=t&&t.state,o=function(){return(n.next()>>>0)/4294967296};return o.double=function(){do{var e=((n.next()>>>11)+(n.next()>>>0)/4294967296)/(1<<21)}while(0===e);return e},o.int32=n.next,o.quick=o,s&&(s.x&&a(s,n),o.state=function(){return a(n,{})}),o}o&&o.exports?o.exports=u:n(/*! !webpack amd define */"./node_modules/webpack/buildin/amd-define.js")&&n(/*! !webpack amd options */"./node_modules/webpack/buildin/amd-options.js")?void 0===(s=function(){return u}.call(t,n,t,o))||(o.exports=s):this.xorshift7=u}(0,e,n(/*! !webpack amd define */"./node_modules/webpack/buildin/amd-define.js"))}).call(this,n(/*! ./../../webpack/buildin/module.js */"./node_modules/webpack/buildin/module.js")(e))},"./node_modules/seedrandom/lib/xorwow.js": +/*!***********************************************!*\ + !*** ./node_modules/seedrandom/lib/xorwow.js ***! + \***********************************************/ +/*! no static exports found */function(e,t,n){(function(e){var s;!function(e,o,r){function i(e){var t=this,n="";t.next=function(){var e=t.x^t.x>>>2;return t.x=t.y,t.y=t.z,t.z=t.w,t.w=t.v,(t.d=t.d+362437|0)+(t.v=t.v^t.v<<4^e^e<<1)|0},t.x=0,t.y=0,t.z=0,t.w=0,t.v=0,e===(0|e)?t.x=e:n+=e;for(var s=0;s>>4),t.next()}function a(e,t){return t.x=e.x,t.y=e.y,t.z=e.z,t.w=e.w,t.v=e.v,t.d=e.d,t}function u(e,t){var n=new i(e),s=t&&t.state,o=function(){return(n.next()>>>0)/4294967296};return o.double=function(){do{var e=((n.next()>>>11)+(n.next()>>>0)/4294967296)/(1<<21)}while(0===e);return e},o.int32=n.next,o.quick=o,s&&("object"==typeof s&&a(s,n),o.state=function(){return a(n,{})}),o}o&&o.exports?o.exports=u:n(/*! !webpack amd define */"./node_modules/webpack/buildin/amd-define.js")&&n(/*! !webpack amd options */"./node_modules/webpack/buildin/amd-options.js")?void 0===(s=function(){return u}.call(t,n,t,o))||(o.exports=s):this.xorwow=u}(0,e,n(/*! !webpack amd define */"./node_modules/webpack/buildin/amd-define.js"))}).call(this,n(/*! ./../../webpack/buildin/module.js */"./node_modules/webpack/buildin/module.js")(e))},"./node_modules/seedrandom/seedrandom.js": +/*!***********************************************!*\ + !*** ./node_modules/seedrandom/seedrandom.js ***! + \***********************************************/ +/*! no static exports found */function(e,t,n){var s;!function(o,r){var i,a=this,u=256,d=r.pow(u,6),l=r.pow(2,52),c=2*l,f=255;function p(e,t,n){var s=[],f=j(b((t=1==t?{entropy:!0}:t||{}).entropy?[e,g(o)]:null==e?function(){try{var e;return i&&(e=i.randomBytes)?e=e(u):(e=new Uint8Array(u),(a.crypto||a.msCrypto).getRandomValues(e)),g(e)}catch(e){var t=a.navigator,n=t&&t.plugins;return[+new Date,a,n,a.screen,g(o)]}}():e,3),s),p=new m(s),w=function(){for(var e=p.g(6),t=d,n=0;e=c;)e/=2,t/=2,n>>>=1;return(e+n)/t};return w.int32=function(){return 0|p.g(4)},w.quick=function(){return p.g(4)/4294967296},w.double=w,j(g(p.S),o),(t.pass||n||function(e,t,n,s){return s&&(s.S&&h(s,p),e.state=function(){return h(p,{})}),n?(r.random=e,t):e})(w,f,"global"in t?t.global:this==r,t.state)}function m(e){var t,n=e.length,s=this,o=0,r=s.i=s.j=0,i=s.S=[];for(n||(e=[n++]);o=0&&(e._idleTimeoutId=setTimeout((function(){e._onTimeout&&e._onTimeout()}),t))},n(/*! setimmediate */"./node_modules/setimmediate/setImmediate.js"),t.setImmediate="undefined"!=typeof self&&self.setImmediate||"undefined"!=typeof e&&e.setImmediate||this&&this.setImmediate,t.clearImmediate="undefined"!=typeof self&&self.clearImmediate||"undefined"!=typeof e&&e.clearImmediate||this&&this.clearImmediate}).call(this,n(/*! ./../webpack/buildin/global.js */"./node_modules/webpack/buildin/global.js"))},"./node_modules/webpack/buildin/amd-define.js": +/*!***************************************!*\ + !*** (webpack)/buildin/amd-define.js ***! + \***************************************/ +/*! no static exports found */function(e,t){e.exports=function(){throw new Error("define cannot be used indirect")}},"./node_modules/webpack/buildin/amd-options.js": +/*!****************************************!*\ + !*** (webpack)/buildin/amd-options.js ***! + \****************************************/ +/*! no static exports found */function(e,t){(function(t){e.exports=t}).call(this,{})},"./node_modules/webpack/buildin/global.js": +/*!***********************************!*\ + !*** (webpack)/buildin/global.js ***! + \***********************************/ +/*! no static exports found */function(e,t){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(e){"object"==typeof window&&(n=window)}e.exports=n},"./node_modules/webpack/buildin/module.js": +/*!***********************************!*\ + !*** (webpack)/buildin/module.js ***! + \***********************************/ +/*! no static exports found */function(e,t){e.exports=function(e){return e.webpackPolyfill||(e.deprecate=function(){},e.paths=[],e.children||(e.children=[]),Object.defineProperty(e,"loaded",{enumerable:!0,get:function(){return e.l}}),Object.defineProperty(e,"id",{enumerable:!0,get:function(){return e.i}}),e.webpackPolyfill=1),e}},"./src/main.js": +/*!*********************!*\ + !*** ./src/main.js ***! + \*********************/ +/*! no exports provided */function(e,t,n){"use strict";n.r(t),function(e){var t=n(/*! ./ml */"./src/ml.ts"),s=n(/*! ./nn/context */"./src/nn/context.ts"),o=n(/*! ./nn/graph */"./src/nn/graph.ts"),r=n(/*! ./nn/graph_builder */"./src/nn/graph_builder.ts"),i=n(/*! ./nn/operand */"./src/nn/operand.ts");null==navigator.ml&&(navigator.ml=new t.ML),null==e.ML&&(e.ML=t.ML),null==e.MLContext&&(e.MLContext=s.MLContext),null==e.MLGraphBuilder&&(e.MLGraphBuilder=r.MLGraphBuilder),null==e.MLGraph&&(e.MLGraph=o.MLGraph),null==e.MLOperand&&(e.MLOperand=i.MLOperand)}.call(this,n(/*! ./../node_modules/webpack/buildin/global.js */"./node_modules/webpack/buildin/global.js"))},"./src/ml.ts": +/*!*******************!*\ + !*** ./src/ml.ts ***! + \*******************/ +/*! exports provided: ML */function(e,t,n){"use strict";n.r(t),n.d(t,"ML",(function(){return o}));var s=n(/*! ./nn/context */"./src/nn/context.ts");class o{constructor(){}createContext(e={}){return new s.MLContext(e)}}},"./src/nn/context.ts": +/*!***************************!*\ + !*** ./src/nn/context.ts ***! + \***************************/ +/*! exports provided: MLPowerPreference, MLDevicePreference, MLContext */function(e,t,n){"use strict";n.r(t),n.d(t,"MLPowerPreference",(function(){return s})),n.d(t,"MLDevicePreference",(function(){return o})),n.d(t,"MLContext",(function(){return u}));n(/*! @tensorflow/tfjs-backend-webgl */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/index.js"),n(/*! @tensorflow/tfjs-backend-cpu */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/index.js");var s,o,r=n(/*! @tensorflow/tfjs-backend-wasm */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/index.js"),i=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),a=n(/*! ./utils */"./src/nn/utils.ts");!function(e){e.default="default",e["high-performance"]="high-performance",e["low-power"]="low-power"}(s||(s={})),function(e){e.default="default",e.gpu="gpu",e.cpu="cpu"}(o||(o={}));class u{constructor(e={}){a.assert(e instanceof Object,"Invalid options."),void 0!==e.powerPreference&&a.assert(e.powerPreference in s,"Invalid power preference."),this.options_=e}get options(){return this.options_}get tf(){return r.setWasmPaths(`https://unpkg.com/@tensorflow/tfjs-backend-wasm@${i.version_core}/dist/`),i}}},"./src/nn/graph.ts": +/*!*************************!*\ + !*** ./src/nn/graph.ts ***! + \*************************/ +/*! exports provided: ExecutionContext, MLGraph */function(e,t,n){"use strict";n.r(t),n.d(t,"ExecutionContext",(function(){return i})),n.d(t,"MLGraph",(function(){return a}));n(/*! @tensorflow/tfjs-backend-webgl */"./.yalc/@tensorflow/tfjs-backend-webgl/dist/index.js"),n(/*! @tensorflow/tfjs-backend-cpu */"./node_modules/@tensorflow/tfjs-backend-cpu/dist/index.js"),n(/*! @tensorflow/tfjs-backend-wasm */"./node_modules/@tensorflow/tfjs-backend-wasm/dist/index.js");var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./operand */"./src/nn/operand.ts"),r=n(/*! ./utils */"./src/nn/utils.ts");class i{constructor(e,t,n,s){this.constantTenosrs_=e,this.operandRefs_=s,this.allocateInputTensors(t,n),this.outputTensors_=new Map,this.outputOperands_=new Set}allocateInputTensors(e,t){this.inputTensors_=new Map;for(const n in t){const s=t[n],o=e.get(n);let i,a;void 0!==s.dimensions?(i={type:o.desc.type,dimensions:s.dimensions},a=s.resource):(i=o.desc,a=s),this.inputTensors_.set(o,{ref:this.operandRefs_.get(o),tensor:r.createTensor(i,a)})}}compute(e){for(const t of e.values())this.outputOperands_.add(t);const t={};for(const n of e.keys())t[n]=this.getTensor(e.get(n));return t}setOutputTensor(e,t){r.assert(!this.outputTensors_.has(e),"MLOutput already has tensor."),this.outputTensors_.set(e,{ref:this.operandRefs_.get(e),tensor:t})}releaseTensor(e){let t;if(e instanceof o.InputOperand)t=this.inputTensors_;else{if(!(e instanceof o.OutputOperand))return;if(this.outputOperands_.has(e))return;t=this.outputTensors_}const n=t.get(e);r.assert(void 0!==n,"No tensor found for operand."),n.ref--,0===n.ref&&(s.dispose(n.tensor),t.delete(e))}getTensor(e){if(e instanceof o.ConstantOperand)return this.constantTenosrs_.get(e);if(e instanceof o.InputOperand)return this.inputTensors_.get(e).tensor;if(e instanceof o.OutputOperand)return this.outputTensors_.has(e)||(e.operation.compute(this),r.assert(this.outputTensors_.has(e),"No output is set.")),this.outputTensors_.get(e).tensor;throw new Error("The operand is invalid.")}}class a{constructor(e){this.inputs_=new Map,this.outputs_=new Map,this.constants_=new Set,this.operandRefs_=new Map,this.constantTensors_=new Map,r.assert(void 0!==e,"Invalid argument");for(const t in e)r.assert("string"==typeof t&&e[t]instanceof o.OutputOperand,"The outputs parameter is invalid."),this.outputs_.set(t,e[t]);r.assert(0!==this.outputs_.size,"The outputs is empty")}compute(e,t){this.validateInputs(e),r.assert(0!==Object.keys(t).length,"The outputs is invalid.");const n=new Map;for(const e in t)r.assert("string"==typeof e&&this.outputs_.has(e),"The name of the output is invalid."),r.assert(r.isTypedArray(t[e]),"Only output of ArrayBufferView type is supported."),n.set(e,this.outputs_.get(e));const o=s.tidy((()=>new i(this.constantTensors_,this.inputs_,e,this.operandRefs_).compute(n)));for(const e of Object.keys(o)){const n=o[e],i=r.createOperandDescriptorFromTensor(n),a=t[e];r.validateTypedArray(a,i.type,i.dimensions),a.set(n.dataSync()),s.dispose(n)}}validateInputs(e){for(const t in e){r.assert("string"==typeof t&&this.inputs_.has(t),"The name of the input is invalid.");const n=this.inputs_.get(t);let s,o;if(void 0!==e[t].dimensions){const i=e[t];s=i.resource,o=i.dimensions,r.assert(void 0!==s,"The resource of input is undefined."),r.assert(!0===r.isIntegerArray(o),"The type of the input dimensions is invalid."),r.assert(o.length===n.desc.dimensions.length,"The rank of the input dimensions is invalid."),r.assert(!r.isDyanmicShape(o),"The value of input dimensions is negative.");for(let e=0;e0&&r.assert(t===o[e],"The value of the input dimensions is invalid.")}}else s=e[t],r.assert(!r.isDyanmicShape(n.desc.dimensions),"The input dimensions is not specified."),o=n.desc.dimensions;r.assert(r.isTypedArray(s),"Only resource of ArrayBufferView type is supported."),r.validateTypedArray(s,n.desc.type,o)}}static buildAndCompile(e){const t=new a(e);return t.build(),t.compile(),t}build(){const e=new Set;for(const t of this.outputs_.values())this.buildOperation(t.operation,e)}buildOperation(e,t){if(!t.has(e)){t.add(e);for(const n of e.inputs()){if(this.operandRefs_.has(n)){let e=this.operandRefs_.get(n);e++,this.operandRefs_.set(n,e)}else this.operandRefs_.set(n,1);if(n instanceof o.InputOperand){if(this.inputs_.has(n.name)){if(this.inputs_.get(n.name)!==n)throw new Error("The name of this input is existed.");continue}this.inputs_.set(n.name,n)}else n instanceof o.ConstantOperand?this.constants_.has(n)||this.constants_.add(n):n instanceof o.OutputOperand&&this.buildOperation(n.operation,t)}}}compile(){this.allocateConstants(),this.computeOnce()}allocateConstants(){for(const e of this.constants_)this.constantTensors_.set(e,r.createTensor(e.desc,e.value))}computeOnce(){const e={};for(const t of this.inputs_.keys()){const n=this.inputs_.get(t),s=n.desc.dimensions.map((e=>e<0?1:e)),o=new(r.getTypedArray(n.desc.type))(r.sizeFromDimensions(n.desc.dimensions));e[t]={resource:o,dimensions:s}}const t=s.tidy((()=>new i(this.constantTensors_,this.inputs_,e,this.operandRefs_).compute(this.outputs_)));for(const e of Object.keys(t)){const n=t[e];n.dataSync(),s.dispose(n)}}dispose(){for(const e of this.constantTensors_.values())s.dispose(e);const e=new Set;for(const t of this.outputs_.values())this.disposeOperation(t.operation,e)}disposeOperation(e,t){if(!t.has(e)){e.dispose(),t.add(e);for(const n of e.inputs())n instanceof o.OutputOperand&&this.disposeOperation(n.operation,t)}}}},"./src/nn/graph_builder.ts": +/*!*********************************!*\ + !*** ./src/nn/graph_builder.ts ***! + \*********************************/ +/*! exports provided: MLInputOperandLayout, MLFilterOperandLayout, MLAutoPad, MLRecurrentNetworkWeightLayout, MLRecurrentNetworkDirection, MLPaddingMode, MLInterpolationMode, MLGraphBuilder */function(e,t,n){"use strict";n.r(t),n.d(t,"MLInputOperandLayout",(function(){return s})),n.d(t,"MLFilterOperandLayout",(function(){return o})),n.d(t,"MLAutoPad",(function(){return r})),n.d(t,"MLRecurrentNetworkWeightLayout",(function(){return i})),n.d(t,"MLRecurrentNetworkDirection",(function(){return a})),n.d(t,"MLPaddingMode",(function(){return u})),n.d(t,"MLInterpolationMode",(function(){return d})),n.d(t,"MLGraphBuilder",(function(){return F}));var s,o,r,i,a,u,d,l=n(/*! ./context */"./src/nn/context.ts"),c=n(/*! ./graph */"./src/nn/graph.ts"),f=n(/*! ./operand */"./src/nn/operand.ts"),p=n(/*! ./ops/batch_norm */"./src/nn/ops/batch_norm.ts"),m=n(/*! ./ops/binary */"./src/nn/ops/binary.ts"),h=n(/*! ./ops/clamp */"./src/nn/ops/clamp.ts"),b=n(/*! ./ops/concat */"./src/nn/ops/concat.ts"),j=n(/*! ./ops/conv2d */"./src/nn/ops/conv2d.ts"),g=n(/*! ./ops/gemm */"./src/nn/ops/gemm.ts"),w=n(/*! ./ops/gru */"./src/nn/ops/gru.ts"),_=n(/*! ./ops/instance_norm */"./src/nn/ops/instance_norm.ts"),k=n(/*! ./ops/leaky_relu */"./src/nn/ops/leaky_relu.ts"),v=n(/*! ./ops/pad */"./src/nn/ops/pad.ts"),x=n(/*! ./ops/pool2d */"./src/nn/ops/pool2d.ts"),y=n(/*! ./ops/reduce */"./src/nn/ops/reduce.ts"),O=n(/*! ./ops/resample */"./src/nn/ops/resample.ts"),I=n(/*! ./ops/reshape */"./src/nn/ops/reshape.ts"),C=n(/*! ./ops/slice */"./src/nn/ops/slice.ts"),S=n(/*! ./ops/softmax */"./src/nn/ops/softmax.ts"),T=n(/*! ./ops/split */"./src/nn/ops/split.ts"),N=n(/*! ./ops/squeeze */"./src/nn/ops/squeeze.ts"),E=n(/*! ./ops/transpose */"./src/nn/ops/transpose.ts"),A=n(/*! ./ops/unary */"./src/nn/ops/unary.ts"),R=n(/*! ./utils */"./src/nn/utils.ts");!function(e){e.nchw="nchw",e.nhwc="nhwc"}(s||(s={})),function(e){e.oihw="oihw",e.hwio="hwio",e.ohwi="ohwi",e.ihwo="ihwo"}(o||(o={})),function(e){e.explicit="explicit",e["same-upper"]="same-upper",e["same-lower"]="same-lower"}(r||(r={})),function(e){e.zrn="zrn",e.rzn="rzn"}(i||(i={})),function(e){e.forward="forward",e.backward="backward",e.both="both"}(a||(a={})),function(e){e.constant="constant",e.edge="edge",e.reflection="reflection",e.symmetric="symmetric"}(u||(u={})),function(e){e["nearest-neighbor"]="nearest-neighbor",e.linear="linear"}(d||(d={}));class F{constructor(e){R.assert(e instanceof l.MLContext,"The context paramter is invalid."),this.context_=e}get context(){return this.context_}build(e){return c.MLGraph.buildAndCompile(e)}input(e,t){return new f.InputOperand(e,t,this)}constant(e,t){return"number"==typeof e?(void 0===t&&(t=f.MLOperandType.float32),f.ConstantOperand.createScalar(e,t,this)):f.ConstantOperand.createTensor(e,t,this)}batchNormalization(e,t,n,s={}){return this.validateOperandBuilder([e,t,n,s.scale,s.bias]),new p.BatchNormalization(e,t,n,s).getFusedOutputs()[0]}clamp(e={},t={}){if(e instanceof f.MLOperand){const n=e;return this.validateOperandBuilder([n,t.minValue,t.maxValue]),new h.Clamp(n,t).output}{const t=e;return this.validateOperandBuilder([t.minValue,t.maxValue]),new h.Clamp(void 0,t)}}concat(e,t){return this.validateOperandBuilder(e),new b.Concat(e,t).output}conv2d(e,t,n={}){const s=[e,t];return n.bias&&s.push(n.bias),this.validateOperandBuilder(s),new j.Conv2d(e,t,n).getFusedOutputs()[0]}add(e,t){return this.validateOperandBuilder([e,t]),new m.Add(e,t).output}sub(e,t){return this.validateOperandBuilder([e,t]),new m.Sub(e,t).output}mul(e,t){return this.validateOperandBuilder([e,t]),new m.Mul(e,t).output}div(e,t){return this.validateOperandBuilder([e,t]),new m.Div(e,t).output}max(e,t){return this.validateOperandBuilder([e,t]),new m.Max(e,t).output}min(e,t){return this.validateOperandBuilder([e,t]),new m.Min(e,t).output}pow(e,t){return this.validateOperandBuilder([e,t]),new m.Pow(e,t).output}exp(e){return this.validateOperandBuilder([e]),new A.Exp(e).output}relu(e){return void 0===e?new A.Relu(void 0):(this.validateOperandBuilder([e]),new A.Relu(e).output)}sigmoid(e){return void 0===e?new A.Sigmoid(void 0):(this.validateOperandBuilder([e]),new A.Sigmoid(e).output)}tanh(e){return void 0===e?new A.Tanh(void 0):(this.validateOperandBuilder([e]),new A.Tanh(e).output)}gemm(e,t,n={}){return this.validateOperandBuilder([e,t,n.c]),g.Gemm.build(this,e,t,n)}gru(e,t,n,s,o,r={}){return this.validateOperandBuilder([e,t,n,r.bias,r.recurrentBias,r.initialHiddenState]),new w.Gru(e,t,n,s,o,r).outputs}gruCell(e,t,n,s,o,r={}){return this.validateOperandBuilder([e,t,n,s,r.bias,r.recurrentBias]),new w.GruCell(e,t,n,s,o,r).output}instanceNormalization(e,t={}){return this.validateOperandBuilder([e,t.bias,t.scale]),new _.InstanceNormalization(e,t).output}leakyRelu(e={},t={}){if(e instanceof f.MLOperand){const n=e;return this.validateOperandBuilder([n]),new k.LeakyRelu(n,t.alpha).output}{const t=e;return new k.LeakyRelu(void 0,t.alpha)}}matmul(e,t){return this.validateOperandBuilder([e,t]),new m.MatMul(e,t).output}pad(e,t,n={}){return this.validateOperandBuilder([e,t]),new v.Pad(e,t,n).output}averagePool2d(e,t={}){return this.validateOperandBuilder([e]),new x.AveragePool2d(e,t).output}maxPool2d(e,t={}){return this.validateOperandBuilder([e]),new x.MaxPool2d(e,t).output}reduceLogSumExp(e,t={}){return this.validateOperandBuilder([e]),new y.ReduceLogSumExp(e,t).output}reduceMax(e,t={}){return this.validateOperandBuilder([e]),new y.ReduceMax(e,t).output}reduceMean(e,t={}){return this.validateOperandBuilder([e]),new y.ReduceMean(e,t).output}reduceMin(e,t={}){return this.validateOperandBuilder([e]),new y.ReduceMin(e,t).output}reduceProduct(e,t={}){return this.validateOperandBuilder([e]),new y.ReduceProduct(e,t).output}reduceSum(e,t={}){return this.validateOperandBuilder([e]),new y.ReduceSum(e,t).output}resample(e,t={}){return this.validateOperandBuilder([e]),new O.Resample(e,t).output}reshape(e,t){return this.validateOperandBuilder([e]),new I.Reshape(e,t).output}slice(e,t,n,s={}){return this.validateOperandBuilder([e]),new C.Slice(e,t,n,s.axes).output}softmax(e){return this.validateOperandBuilder([e]),new S.Softmax(e).output}split(e,t,n={}){return this.validateOperandBuilder([e]),new T.Split(e,t,n).outputs}squeeze(e,t={}){return this.validateOperandBuilder([e]),new N.Squeeze(e,t.axes).output}transpose(e,t={}){return this.validateOperandBuilder([e]),new E.Transpose(e,t.permutation).output}validateOperandBuilder(e){R.assert(e.every((e=>!e||e instanceof f.MLOperand&&e.builder===this)),"The operand is not built by this builder.")}}},"./src/nn/operand.ts": +/*!***************************!*\ + !*** ./src/nn/operand.ts ***! + \***************************/ +/*! exports provided: MLOperandType, MLOperand, InputOperand, ConstantOperand, OutputOperand */function(e,t,n){"use strict";n.r(t),n.d(t,"MLOperandType",(function(){return s})),n.d(t,"MLOperand",(function(){return r})),n.d(t,"InputOperand",(function(){return i})),n.d(t,"ConstantOperand",(function(){return a})),n.d(t,"OutputOperand",(function(){return u}));var s,o=n(/*! ./utils */"./src/nn/utils.ts");!function(e){e.float32="float32",e.float16="float16",e.int32="int32",e.uint32="uint32",e.int8="int8",e.uint8="uint8"}(s||(s={}));class r{constructor(e){this.builder_=e}get builder(){return this.builder_}}class i extends r{constructor(e,t,n){super(n),o.assert("string"==typeof e,"The name parameter is invalid"),this.name=e,o.validateOperandDescriptor(t),this.desc=t}}class a extends r{constructor(e,t,n){super(n),this.desc=e,this.value=t}static createScalar(e,t=s.float32,n){return o.assert(t in s,"The operand type is invalid."),o.validateValueType(e,t),new a({type:t},e,n)}static createTensor(e,t,n){o.assert(o.isTypedArray(t),"Only ArrayBufferView value type is supported.");const s=t;return o.validateOperandDescriptor(e),o.validateTypedArray(s,e.type,e.dimensions),new a(e,s,n)}}class u extends r{constructor(e){super(e.builder),this.operation=e}}},"./src/nn/operation.ts": +/*!*****************************!*\ + !*** ./src/nn/operation.ts ***! + \*****************************/ +/*! exports provided: Operation, SingleOutputOperation */function(e,t,n){"use strict";n.r(t),n.d(t,"Operation",(function(){return r})),n.d(t,"SingleOutputOperation",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ./operand */"./src/nn/operand.ts");class r{constructor(e){this.outputs_=[],this.builder_=e}get builder(){return this.builder_}get outputs(){return this.outputs_}compute(e){const t=new Map;for(const n of this.inputs())t.set(n,e.getTensor(n));const n=s.tidy((()=>this.computeImpl(t)));for(let t=0;t=-t.rank,"The axis parameter is invalid.");const n=this.axis_>=0?this.axis_:t.rank+this.axis_,o=e.get(this.mean_);r.assert(1===o.rank,"The mean operand is not 1-D.");const i=e.get(this.variance_);let a,u;r.assert(1===i.rank,"The mean operand is not 1-D."),this.scale_&&(a=e.get(this.scale_),r.assert(1===a.rank,"The scale operand is not 1-D.")),this.bias_&&(u=e.get(this.bias_),r.assert(1===u.rank,"The bias operand is not 1-D."));const d=Array.from(Array(t.rank).keys());return d[n]=t.rank-1,d[t.rank-1]=n,s.transpose(s.batchNorm(s.transpose(t,d),o,i,u,a,this.epsilon_),d)}}},"./src/nn/ops/binary.ts": +/*!******************************!*\ + !*** ./src/nn/ops/binary.ts ***! + \******************************/ +/*! exports provided: Binary, Add, Sub, Mul, Div, Max, Min, Pow, MatMul */function(e,t,n){"use strict";n.r(t),n.d(t,"Binary",(function(){return i})),n.d(t,"Add",(function(){return a})),n.d(t,"Sub",(function(){return u})),n.d(t,"Mul",(function(){return d})),n.d(t,"Div",(function(){return l})),n.d(t,"Max",(function(){return c})),n.d(t,"Min",(function(){return f})),n.d(t,"Pow",(function(){return p})),n.d(t,"MatMul",(function(){return m}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../operation */"./src/nn/operation.ts"),r=n(/*! ../utils */"./src/nn/utils.ts");class i extends o.SingleOutputOperation{constructor(e,t){super(e.builder),r.validateOperand(e),this.a_=e,r.validateOperand(t),this.b_=t}inputs(){return[this.a_,this.b_]}run(e){const t=e.get(this.a_),n=e.get(this.b_);return this.runOp(t,n)}}class a extends i{runOp(e,t){return s.add(e,t)}}class u extends i{runOp(e,t){return s.sub(e,t)}}class d extends i{runOp(e,t){return s.mul(e,t)}}class l extends i{runOp(e,t){return s.div(e,t)}}class c extends i{runOp(e,t){return s.maximum(e,t)}}class f extends i{runOp(e,t){return s.minimum(e,t)}}class p extends i{runOp(e,t){return s.pow(e,t)}}class m extends i{runOp(e,t){if(1===e.rank)return 1===t.rank?s.dot(e,t):s.matMul(s.reshape(e,[1,-1]),t);if(1===t.rank)return s.matMul(e,s.reshape(t,[-1,1]));{const n=e.rank>t.rank?e.rank:t.rank;let o=s.matMul(e,t);return o.rank!==n&&(o=s.reshape(o,[1].concat(o.shape))),o}}}},"./src/nn/ops/clamp.ts": +/*!*****************************!*\ + !*** ./src/nn/ops/clamp.ts ***! + \*****************************/ +/*! exports provided: Clamp */function(e,t,n){"use strict";n.r(t),n.d(t,"Clamp",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../operand */"./src/nn/operand.ts"),r=n(/*! ../operation */"./src/nn/operation.ts"),i=n(/*! ../utils */"./src/nn/utils.ts");class a extends r.SingleOutputOperation{constructor(e,t={}){void 0!==e?(super(e.builder),i.validateOperand(e),this.x_=e):(super(void 0),this.x_=void 0),i.validateOptionalOperand(t.minValue),this.minOperand_=t.minValue,this.minScalarValue_=this.getScalarValue(this.minOperand_,!0),i.validateOptionalOperand(t.maxValue),this.maxOperand_=t.maxValue,this.maxScalarValue_=this.getScalarValue(this.maxOperand_)}get minScalarValue(){return this.minScalarValue_}get maxScalarValue(){return this.maxScalarValue_}getScalarValue(e,t=!1){if(e instanceof o.ConstantOperand){const t=e;if("number"==typeof t.value)return t.value}else if(void 0===e)return t?-1/0:1/0}inputs(){const e=[this.x_];return this.minOperand_&&e.push(this.minOperand_),this.maxOperand_&&e.push(this.maxOperand_),e}run(e){const t=e.get(this.x_);return this.minOperand_?this.maxOperand_?s.minimum(s.maximum(t,e.get(this.minOperand_)),e.get(this.maxOperand_)):s.maximum(t,e.get(this.minOperand_)):this.maxOperand_?s.minimum(t,e.get(this.maxOperand_)):s.clone(t)}apply(e){return this.builder_=e.builder,i.validateOperand(e),this.x_=e,this.createOutput(),this.output}runOp(e){return i.assert(void 0!==this.minScalarValue_&&void 0!==this.maxScalarValue_,"tf.js only supports clipByValue."),s.clipByValue(e,this.minScalarValue_,this.maxScalarValue_)}}},"./src/nn/ops/concat.ts": +/*!******************************!*\ + !*** ./src/nn/ops/concat.ts ***! + \******************************/ +/*! exports provided: Concat */function(e,t,n){"use strict";n.r(t),n.d(t,"Concat",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../operand */"./src/nn/operand.ts"),r=n(/*! ../operation */"./src/nn/operation.ts"),i=n(/*! ../utils */"./src/nn/utils.ts");class a extends r.SingleOutputOperation{constructor(e,t){i.assert(e.every((e=>e instanceof o.MLOperand)),"The parameter is not an operand."),super(e[0].builder),this.inputs_=e,i.assert(i.isInteger(t),"The axis parameter is invalid."),this.axis_=t}inputs(){return this.inputs_}run(e){const t=[];for(const n of this.inputs())t.push(e.get(n));return s.concat(t,this.axis_)}}},"./src/nn/ops/conv2d.ts": +/*!******************************!*\ + !*** ./src/nn/ops/conv2d.ts ***! + \******************************/ +/*! exports provided: Conv2d */function(e,t,n){"use strict";n.r(t),n.d(t,"Conv2d",(function(){return c}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../graph_builder */"./src/nn/graph_builder.ts"),r=n(/*! ../operand */"./src/nn/operand.ts"),i=n(/*! ../operation */"./src/nn/operation.ts"),a=n(/*! ../utils */"./src/nn/utils.ts"),u=n(/*! ./clamp */"./src/nn/ops/clamp.ts"),d=n(/*! ./leaky_relu */"./src/nn/ops/leaky_relu.ts"),l=n(/*! ./unary */"./src/nn/ops/unary.ts");class c extends i.SingleOutputOperation{constructor(e,t,n={}){super(e.builder),a.validateOperand(e),this.input_=e,a.validateOperand(t),this.filter_=t,a.assert(!(n.autoPad===o.MLAutoPad.explicit&&void 0===n.padding),"The padding parameter should be assigned when autoPad is explicit."),this.initOptions(n.padding,n.strides,n.dilations,n.groups,n.inputLayout,n.filterLayout,n.autoPad,n.transpose,n.outputPadding,n.outputSizes,n.bias,n.activation)}initOptions(e=[0,0,0,0],t=[1,1],n=[1,1],s=1,r=o.MLInputOperandLayout.nchw,i=o.MLFilterOperandLayout.oihw,u=o.MLAutoPad.explicit,c=!1,f=[0,0],p,m,h){a.assert(a.isIntegerArray(e)&&4===e.length,"The padding parameter is invalid."),this.padding_=e,a.assert(a.isIntegerArray(t)&&2===t.length,"The strides parameter is invalid."),this.strides_=t,a.assert(a.isIntegerArray(n)&&2===n.length,"The dilations parameter is invalid."),this.dilations_=n,a.assert(a.isInteger(s),"The gourps parameter is invalid."),this.groups_=s,a.assert(r in o.MLInputOperandLayout,"The input layout parameter is invalid."),this.inputLayout_=r,a.assert(i in o.MLFilterOperandLayout,"The filter layout parameter is invalid."),this.filterLayout_=i,a.assert(u in o.MLAutoPad,"The autoPad parameter is invalid."),this.autoPad_=u,this.transpose_=c,this.transpose_?(a.assert(a.isIntegerArray(f)&&2===f.length,"The outputPadding parameter is invalid."),this.outputPadding_=f,a.assert(void 0===p||a.isIntegerArray(p)&&2===p.length,"The outputSizes parameter is invalid."),this.outputSizes_=p):(this.outputPadding_=[0,0],this.outputSizes_=void 0),this.bias_=m,this.bias_&&a.validateOperand(this.bias_),h instanceof l.Relu?(this.fusedActivation_="relu",this.activation_=void 0):this.isRelu6(h)?(this.fusedActivation_="relu6",this.activation_=void 0):h instanceof d.LeakyRelu?(this.fusedActivation_="leakyrelu",this.leakyreluAlpha_=h.alpha,this.activation_=void 0):h instanceof l.Sigmoid?(this.fusedActivation_="sigmoid",this.activation_=void 0):(this.fusedActivation_=void 0,this.activation_=h)}isRelu6(e){if(e instanceof u.Clamp){const t=e;if(Math.abs(t.minScalarValue-0)<1e-5&&Math.abs(t.maxScalarValue-6)<1e-5)return!0}return!1}getFusedOutputs(){return this.activation_?[this.activation_.apply(this.output)]:[this.output]}inputs(){const e=[this.input_,this.filter_];return this.bias_&&e.push(this.bias_),e}run(e){let t,n,i=e.get(this.input_),u=!1;this.bias_&&(n=e.get(this.bias_)),this.inputLayout_===o.MLInputOperandLayout.nchw&&(i=s.transpose(i,[0,2,3,1]));const d=i.shape[3];void 0===this.filterTensor_?(t=e.get(this.filter_),this.filterLayout_===o.MLFilterOperandLayout.oihw?t=s.transpose(t,[2,3,1,0]):this.filterLayout_===o.MLFilterOperandLayout.ohwi?t=s.transpose(t,[1,2,3,0]):this.filterLayout_===o.MLFilterOperandLayout.ihwo&&(t=s.transpose(t,[1,2,0,3])),1!==this.groups_&&(t=s.transpose(t,[0,1,3,2])),this.filter_ instanceof r.ConstantOperand&&(this.filterTensor_=t,s.keep(this.filterTensor_))):t=this.filterTensor_;const l=a.getPaddings(i,t,this.padding_,this.strides_,this.outputPadding_,this.dilations_,this.autoPad_);let c;if(!1===this.transpose_)if(1===this.groups_)c=s.fused.conv2d({x:i,filter:t,strides:this.strides_,pad:l,dataFormat:"NHWC",dilations:this.dilations_,bias:n,activation:this.fusedActivation_,leakyreluAlpha:this.leakyreluAlpha_}),u=!0;else{if(this.groups_!==d||this.groups_!==t.shape[2])throw new Error(`The tf.js convolution doesn't support groups parameter ${this.groups_}`);if("valid"===l||"same"===l||l instanceof Array&&l[1][0]===l[1][1]&&l[1][0]===l[2][0]&&l[1][0]===l[2][1]){let e;e="valid"===l||"same"===l?l:l[1][0],c=s.fused.depthwiseConv2d({x:i,filter:t,strides:this.strides_,pad:e,dataFormat:"NHWC",dilations:this.dilations_,bias:n,activation:this.fusedActivation_,leakyreluAlpha:this.leakyreluAlpha_}),u=!0}else c=s.depthwiseConv2d(i,t,this.strides_,l,"NHWC",this.dilations_)}else{this.autoPad_!==o.MLAutoPad.explicit&&(this.outputSizes_=[i.shape[1]*this.strides_[0],i.shape[2]*this.strides_[1]]);const e=[i.shape[0],0,0,t.shape[2]];if(void 0===this.outputSizes_)for(let n=0;n<2;++n)e[n+1]=this.strides_[n]*(i.shape[n+1]-1)+this.outputPadding_[n]+((t.shape[n]-1)*this.dilations_[n]+1)-this.padding_[2*n]-this.padding_[2*n+1];else e[1]=this.outputSizes_[0],e[2]=this.outputSizes_[1];c=s.conv2dTranspose(i,t,e,this.strides_,l)}return u||(n&&(c=s.add(c,n)),"relu"===this.fusedActivation_?c=s.relu(c):"relu6"===this.fusedActivation_?c=s.clipByValue(c,0,6):"leakyrelu"===this.fusedActivation_?c=s.leakyRelu(c,this.leakyreluAlpha_):"sigmoid"===this.fusedActivation_?c=s.sigmoid(c):void 0!==this.fusedActivation_&&a.assert(!1,`The ${this.fusedActivation_} is un supported.`)),this.inputLayout_===o.MLInputOperandLayout.nchw&&(c=s.transpose(c,[0,3,1,2])),c}dispose(){this.filterTensor_&&s.dispose(this.filterTensor_)}}},"./src/nn/ops/gemm.ts": +/*!****************************!*\ + !*** ./src/nn/ops/gemm.ts ***! + \****************************/ +/*! exports provided: Gemm */function(e,t,n){"use strict";n.r(t),n.d(t,"Gemm",(function(){return r}));var s=n(/*! ../operand */"./src/nn/operand.ts"),o=n(/*! ../utils */"./src/nn/utils.ts");class r{static build(e,t,n,r={}){o.validateOperand(t),o.validateOperand(n),o.assert(void 0===r.c||"number"==typeof r.c||r.c instanceof s.MLOperand,"The options.c is invalid."),o.assert(void 0===r.aTranspose||o.isBoolean(r.aTranspose),"The options.aTranspose is invalid."),o.assert(void 0===r.bTranspose||o.isBoolean(r.bTranspose),"The options.bTranspose is invalid."),o.assert(void 0===r.alpha||"number"==typeof r.alpha,"The options.alpha is invalid."),o.assert(void 0===r.beta||"number"==typeof r.beta,"The options.beta is invalid."),r.aTranspose&&(t=e.transpose(t)),r.bTranspose&&(n=e.transpose(n));const i=e.constant(void 0===r.alpha?1:r.alpha),a=e.constant(void 0===r.beta?1:r.beta),u=e.matmul(e.mul(i,t),n);return r.c?e.add(u,e.mul(a,r.c)):u}}},"./src/nn/ops/gru.ts": +/*!***************************!*\ + !*** ./src/nn/ops/gru.ts ***! + \***************************/ +/*! exports provided: Gru, GruCell */function(e,t,n){"use strict";n.r(t),n.d(t,"Gru",(function(){return d})),n.d(t,"GruCell",(function(){return l}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../graph_builder */"./src/nn/graph_builder.ts"),r=n(/*! ../operand */"./src/nn/operand.ts"),i=n(/*! ../operation */"./src/nn/operation.ts"),a=n(/*! ../utils */"./src/nn/utils.ts"),u=n(/*! ./unary */"./src/nn/ops/unary.ts");class d extends i.Operation{constructor(e,t,n,s,o,i={}){super(e.builder),a.validateOperand(e),this.input_=e,a.validateOperand(t),this.weight_=t,a.validateOperand(n),this.recurrentWeight_=n,a.assert(a.isInteger(s)&&s>0,"The steps parameter is invalid."),this.steps_=s,a.assert(a.isInteger(o)&&o>0,"The hiddenSize parameter is invalid."),this.hiddenSize_=o,this.initOptions(i.bias,i.recurrentBias,i.initialHiddenState,i.resetAfter,i.returnSequence,i.direction,i.layout,i.activations),this.outputs.push(new r.OutputOperand(this)),this.returnSequence_&&this.outputs_.push(new r.OutputOperand(this))}initOptions(e,t,n,s=!0,r=!1,i=o.MLRecurrentNetworkDirection.forward,d=o.MLRecurrentNetworkWeightLayout.zrn,l=[this.builder.sigmoid(),this.builder.tanh()]){a.validateOptionalOperand(e),this.bias_=e,a.validateOptionalOperand(t),this.recurrentBias_=t,a.validateOptionalOperand(n),this.initialHiddenState_=n,a.assert(a.isBoolean(s),"The resetAfter parameter is not a boolean."),this.resetAfter_=s,a.assert(a.isBoolean(r),"The resetAfter parameter is not a boolean."),this.returnSequence_=r,a.assert(i in o.MLRecurrentNetworkDirection,"The direction parameter is invalid."),this.direction_=i,a.assert(d in o.MLRecurrentNetworkWeightLayout,"The layout parameter is invalid."),this.layout_=d,a.assert(l instanceof Array&&2===l.length&&l.every((e=>e instanceof u.UnaryMLOperator)),"The activations parameter is invalid."),this.activations_=l}inputs(){const e=[this.input_,this.weight_,this.recurrentWeight_];return this.bias_&&e.push(this.bias_),this.recurrentBias_&&e.push(this.recurrentBias_),this.initialHiddenState_&&e.push(this.initialHiddenState_),e}computeImpl(e){const t=e.get(this.input_),n=e.get(this.weight_),r=e.get(this.recurrentWeight_),i=this.bias_?e.get(this.bias_):void 0,a=this.recurrentWeight_?e.get(this.recurrentBias_):void 0,u=this.initialHiddenState_?e.get(this.initialHiddenState_):void 0,d=this.steps_,c=this.hiddenSize_,f=this.resetAfter_,p=this.returnSequence_,m=this.layout_,h=this.activations_,b=this.direction_,j=b===o.MLRecurrentNetworkDirection.both?2:1;let g,w=u;void 0===w&&(w=s.zeros([j,1,c]));const _=[],k=[],v=[],x=[];for(let e=0;e0,"The hiddenSize parameter is invalid."),this.hiddenSize_=o,this.initOptions(r.bias,r.recurrentBias,r.resetAfter,r.layout,r.activations)}initOptions(e,t,n=!0,s=o.MLRecurrentNetworkWeightLayout.zrn,r=[this.builder.sigmoid(),this.builder.tanh()]){a.validateOptionalOperand(e),this.bias_=e,a.validateOptionalOperand(t),this.recurrentBias_=t,a.assert(a.isBoolean(n),"The resetAfter parameter is not a boolean."),this.resetAfter_=n,a.assert(s in o.MLRecurrentNetworkWeightLayout,"The layout parameter is invalid."),this.layout_=s,a.assert(r instanceof Array&&2===r.length&&r.every((e=>e instanceof u.UnaryMLOperator)),"The activations parameter is invalid."),this.activations_=r}inputs(){const e=[this.input_,this.weight_,this.recurrentWeight_,this.hiddenState_];return this.bias_&&e.push(this.bias_),this.recurrentBias_&&e.push(this.recurrentBias_),e}static compute(e,t,n,r,i,a,u,d,l=!0,c=o.MLRecurrentNetworkWeightLayout.zrn){const f=s.scalar(1),p=s.scalar(0),m=c===o.MLRecurrentNetworkWeightLayout.zrn?{z:0,r:i,n:2*i}:{r:0,z:i,n:2*i},h=a[0],b=a[1],j=h.runOp(s.add(s.add(u?s.slice(u,[m.z],[i]):p,d?s.slice(d,[m.z],[i]):p),s.add(s.matMul(e,s.transpose(s.slice(t,[m.z,0],[i,-1]))),s.matMul(r,s.transpose(s.slice(n,[m.z,0],[i,-1])))))),g=h.runOp(s.add(s.add(u?s.slice(u,[m.r],[i]):p,d?s.slice(d,[m.r],[i]):p),s.add(s.matMul(e,s.transpose(s.slice(t,[m.r,0],[i,-1]))),s.matMul(r,s.transpose(s.slice(n,[m.r,0],[i,-1]))))));let w;return w=l?b.runOp(s.add(u?s.slice(u,[m.n],[i]):p,s.add(s.matMul(e,s.transpose(s.slice(t,[m.n,0],[i,-1]))),s.mul(g,s.add(d?s.slice(d,[m.n],[i]):p,s.matMul(r,s.transpose(s.slice(n,[m.n,0],[i,-1])))))))):b.runOp(s.add(s.add(u?s.slice(u,[m.n],[i]):p,d?s.slice(d,[m.n],[i]):p),s.add(s.matMul(e,s.transpose(s.slice(t,[m.n,0],[i,-1]))),s.matMul(s.mul(g,r),s.transpose(s.slice(n,[m.n,0],[i,-1])))))),s.add(s.mul(j,r),s.mul(w,s.sub(f,j)))}run(e){return l.compute(e.get(this.input_),e.get(this.weight_),e.get(this.recurrentWeight_),e.get(this.hiddenState_),this.hiddenSize_,this.activations_,this.bias_?e.get(this.bias_):void 0,this.recurrentBias_?e.get(this.recurrentBias_):void 0,this.resetAfter_,this.layout_)}}},"./src/nn/ops/instance_norm.ts": +/*!*************************************!*\ + !*** ./src/nn/ops/instance_norm.ts ***! + \*************************************/ +/*! exports provided: InstanceNormalization */function(e,t,n){"use strict";n.r(t),n.d(t,"InstanceNormalization",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../graph_builder */"./src/nn/graph_builder.ts"),r=n(/*! ../operation */"./src/nn/operation.ts"),i=n(/*! ../utils */"./src/nn/utils.ts");class a extends r.SingleOutputOperation{constructor(e,t={}){if(super(e.builder),i.validateOperand(e),this.input_=e,i.validateOptionalOperand(t.scale),this.scale_=t.scale,i.validateOptionalOperand(t.bias),this.bias_=t.bias,void 0!==t.epsilon){const e=t.epsilon;i.assert("number"==typeof e,"The epsilon parameter is invalid"),this.epsilon_=e}else this.epsilon_=1e-5;void 0!==t.layout?(i.assert(t.layout in o.MLInputOperandLayout,"The layout parameter is invalid."),this.layout_=t.layout):this.layout_=o.MLInputOperandLayout.nchw}inputs(){const e=[this.input_];return this.scale_&&e.push(this.scale_),this.bias_&&e.push(this.bias_),e}run(e){const t=e.get(this.input_);i.assert(4===t.rank,"The input operand is not 4-D.");let n,r,a=[2,3],u=[1,-1,1,1],d=t.shape[1];this.layout_===o.MLInputOperandLayout.nhwc&&(a=[1,2],u=[1,1,1,-1],d=t.shape[3]),this.scale_&&(n=e.get(this.scale_),i.assert(1===n.rank,"The scale operand is not 1-D."),i.assert(n.shape[0]===d,"The length of scale is not equal to the size of the feature dimension of the input.")),this.bias_&&(r=e.get(this.bias_),i.assert(1===r.rank,"The bias operand is not 1-D."),i.assert(r.shape[0]===d,"The length of bias is not equal to the size of the feature dimension of the input."));const l=s.mean(t,a,!0),c=s.mean(s.pow(s.sub(t,l),2),a,!0),f=s.div(s.sub(t,l),s.pow(s.add(c,this.epsilon_),.5)),p=n?s.mul(s.reshape(n,u),f):f;return r?s.add(s.reshape(r,u),p):p}}},"./src/nn/ops/leaky_relu.ts": +/*!**********************************!*\ + !*** ./src/nn/ops/leaky_relu.ts ***! + \**********************************/ +/*! exports provided: LeakyRelu */function(e,t,n){"use strict";n.r(t),n.d(t,"LeakyRelu",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../utils */"./src/nn/utils.ts"),r=n(/*! ./unary */"./src/nn/ops/unary.ts");class i extends r.UnaryMLOperator{constructor(e,t=.01){super(e),o.assert("number"==typeof t,"The alpha parameter is invalid."),this.alpha_=t}get alpha(){return this.alpha_}runOp(e){return s.leakyRelu(e,this.alpha_)}}},"./src/nn/ops/pad.ts": +/*!***************************!*\ + !*** ./src/nn/ops/pad.ts ***! + \***************************/ +/*! exports provided: Pad */function(e,t,n){"use strict";n.r(t),n.d(t,"Pad",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../graph_builder */"./src/nn/graph_builder.ts"),r=n(/*! ../operation */"./src/nn/operation.ts"),i=n(/*! ../utils */"./src/nn/utils.ts");class a extends r.SingleOutputOperation{constructor(e,t,n={}){super(e.builder),this.mode_=o.MLPaddingMode.constant,this.value_=0,i.validateOperand(e),this.input_=e,i.validateOperand(t),this.padding_=t,void 0!==n.mode&&(i.assert(n.mode in o.MLPaddingMode,"The mode parameter is invalid."),this.mode_=n.mode),void 0!==n.value&&(this.value_=n.value)}inputs(){return[this.input_,this.padding_]}run(e){const t=e.get(this.input_),n=e.get(this.padding_);i.assert(2===n.rank&&"int32"===n.dtype&&n.shape[0]===t.rank,"The padding operand is invalid.");const r=n.arraySync();if(this.mode_===o.MLPaddingMode.constant)return s.pad(t,r,this.value_);if(this.mode_===o.MLPaddingMode.edge){const e=new Array(r.length);let n=t;for(;;){for(let t=0;t0?(e[t][n]=1,r[t][n]-=1):e[t][n]=0}if(e.every((e=>0===e[0]&&0===e[1])))break;n=s.mirrorPad(n,e,"symmetric")}return n}{let e;return this.mode_===o.MLPaddingMode.reflection?e="reflect":this.mode_===o.MLPaddingMode.symmetric&&(e="symmetric"),s.mirrorPad(t,r,e)}}}},"./src/nn/ops/pool2d.ts": +/*!******************************!*\ + !*** ./src/nn/ops/pool2d.ts ***! + \******************************/ +/*! exports provided: Pool, AveragePool2d, MaxPool2d */function(e,t,n){"use strict";n.r(t),n.d(t,"Pool",(function(){return a})),n.d(t,"AveragePool2d",(function(){return u})),n.d(t,"MaxPool2d",(function(){return d}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../graph_builder */"./src/nn/graph_builder.ts"),r=n(/*! ../operation */"./src/nn/operation.ts"),i=n(/*! ../utils */"./src/nn/utils.ts");class a extends r.SingleOutputOperation{constructor(e,t={}){super(e.builder),i.validateOperand(e),this.input_=e,this.initOptions(t.windowDimensions,t.padding,t.strides,t.dilations,t.layout,t.autoPad)}initOptions(e=[-1,-1],t=[0,0,0,0],n=[1,1],s=[1,1],r=o.MLInputOperandLayout.nchw,a=o.MLAutoPad.explicit){i.assert(i.isIntegerArray(e)&&2===e.length,"The padding parameter is invalid."),this.windowDimensions_=e,i.assert(i.isIntegerArray(t)&&4===t.length,"The padding parameter is invalid."),this.padding_=t,i.assert(i.isIntegerArray(n)&&2===n.length,"The strides parameter is invalid."),this.strides_=n,i.assert(i.isIntegerArray(s)&&2===s.length,"The dilations parameter is invalid."),this.dilations_=s,i.assert(r in o.MLInputOperandLayout,"The layout parameter is invalid."),this.layout_=r,i.assert(a in o.MLAutoPad,"The autoPad parameter is invalid."),this.autoPad_=a}inputs(){return[this.input_]}run(e){let t=e.get(this.input_);const n=this.getPoolingType();this.layout_===o.MLInputOperandLayout.nchw&&(t=s.transpose(t,[0,2,3,1]));const r=this.windowDimensions_;let i;if(-1===r[0]&&-1===r[1]&&(r[0]=t.shape[1],r[1]=t.shape[2]),this.autoPad_===o.MLAutoPad.explicit)i=this.padding_.every((e=>0===e))?"valid":[[0,0],[this.padding_[0],this.padding_[1]],[this.padding_[2],this.padding_[3]],[0,0]];else if(this.autoPad_===o.MLAutoPad["same-upper"])i="same";else{i=[[0,0],[0,0],[0,0],[0,0]];const e=[0,0];for(let n=0;n<2;++n)e[n]=Math.ceil(t.shape[1+n]/this.strides_[n]);const n=[0,0];for(let s=0;s<2;++s)n[s]=this.strides_[s]*(e[s]-1)+((r[s]-1)*this.dilations_[s]+1)-t.shape[1+s];for(let e=0;e<2;++e)i[e+1][0]=n[e]-Math.floor(n[e]/2),i[e+1][1]=Math.floor(n[e]/2)}let a=s.pool(t,this.windowDimensions_,n,i,this.dilations_,this.strides_);return this.layout_===o.MLInputOperandLayout.nchw&&(a=s.transpose(a,[0,3,1,2])),a}}class u extends a{getPoolingType(){return"avg"}}class d extends a{getPoolingType(){return"max"}}},"./src/nn/ops/reduce.ts": +/*!******************************!*\ + !*** ./src/nn/ops/reduce.ts ***! + \******************************/ +/*! exports provided: ReduceLogSumExp, ReduceMax, ReduceMean, ReduceMin, ReduceProduct, ReduceSum */function(e,t,n){"use strict";n.r(t),n.d(t,"ReduceLogSumExp",(function(){return a})),n.d(t,"ReduceMax",(function(){return u})),n.d(t,"ReduceMean",(function(){return d})),n.d(t,"ReduceMin",(function(){return l})),n.d(t,"ReduceProduct",(function(){return c})),n.d(t,"ReduceSum",(function(){return f}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../operation */"./src/nn/operation.ts"),r=n(/*! ../utils */"./src/nn/utils.ts");class i extends o.SingleOutputOperation{constructor(e,t={}){super(e.builder),r.validateOperand(e),this.input_=e,void 0!==t.axes?(r.assert(r.isIntegerArray(t.axes),"The axes parameter is invalid."),this.axes_=t.axes):this.axes_=void 0,void 0!==t.keepDimensions?(r.assert(r.isBoolean(t.keepDimensions),"The keepDimensions parameter is not a boolean."),this.keepDimensions_=t.keepDimensions):this.keepDimensions_=!1}inputs(){return[this.input_]}run(e){const t=e.get(this.input_);return r.assert(r.validateAxes(this.axes_,t.rank),`The axes must be in range [-${t.rank}, ${t.rank})`),this.runOp(t,this.axes_,this.keepDimensions_)}}class a extends i{runOp(e,t,n){return s.logSumExp(e,t,n)}}class u extends i{runOp(e,t,n){return s.max(e,t,n)}}class d extends i{runOp(e,t,n){return s.mean(e,t,n)}}class l extends i{runOp(e,t,n){return s.min(e,t,n)}}class c extends i{runOp(e,t,n){return s.prod(e,t,n)}}class f extends i{runOp(e,t,n){return s.sum(e,t,n)}}},"./src/nn/ops/resample.ts": +/*!********************************!*\ + !*** ./src/nn/ops/resample.ts ***! + \********************************/ +/*! exports provided: Resample */function(e,t,n){"use strict";n.r(t),n.d(t,"Resample",(function(){return a}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../graph_builder */"./src/nn/graph_builder.ts"),r=n(/*! ../operation */"./src/nn/operation.ts"),i=n(/*! ../utils */"./src/nn/utils.ts");class a extends r.SingleOutputOperation{constructor(e,t={}){if(super(e.builder),this.mode_=o.MLInterpolationMode["nearest-neighbor"],i.validateOperand(e),this.input_=e,void 0!==t.scales){const e=t.scales;i.assert(e instanceof Array&&e.every((e=>"number"==typeof e))&&4===e.length,"The scales parameter is invalid."),this.scales_=t.scales}void 0!==t.sizes&&(i.assert(i.isIntegerArray(t.sizes)&&4===t.sizes.length,"The sizes parameter is invalid."),this.sizes_=t.sizes,this.scales_=void 0),i.assert(void 0!==this.scales_||void 0!==this.sizes_,"The scales or sizes parameter is not provied."),void 0!==t.mode&&(i.assert(t.mode in o.MLInterpolationMode,"The mode parameter is invalid."),this.mode_=t.mode)}inputs(){return[this.input_]}run(e){let t=e.get(this.input_);i.assert(4===t.rank,"The input tensor is not 4-D.");const n=[0,0];let r,a=!1;if(void 0!==this.sizes_)if(this.sizes_[0]===t.shape[0]&&this.sizes_[1]===t.shape[1])n[0]=this.sizes_[2],n[1]=this.sizes_[3],t=s.transpose(t,[0,2,3,1]),a=!0;else{if(this.sizes_[0]!==t.shape[0]||this.sizes_[3]!==t.shape[3])throw new Error("tf.image.resize doesn't support the sizes parameter.");n[0]=this.sizes_[1],n[1]=this.sizes_[2]}else if(void 0!==this.scales_)if(1===this.scales_[0]&&1===this.scales_[1])n[0]=Math.floor(t.shape[2]*this.scales_[2]),n[1]=Math.floor(t.shape[3]*this.scales_[3]),t=s.transpose(t,[0,2,3,1]),a=!0;else{if(1!==this.scales_[0]||1!==this.scales_[3])throw new Error("tf.image.resize doesn't support the scales parameter.");n[0]=Math.floor(t.shape[1]*this.scales_[1]),n[1]=Math.floor(t.shape[2]*this.scales_[2])}return this.mode_===o.MLInterpolationMode["nearest-neighbor"]?r=s.image.resizeNearestNeighbor(t,n,!1,!0):this.mode_===o.MLInterpolationMode.linear&&(r=s.image.resizeBilinear(t,n,!1,!0)),a&&(r=s.transpose(r,[0,3,1,2])),r}}},"./src/nn/ops/reshape.ts": +/*!*******************************!*\ + !*** ./src/nn/ops/reshape.ts ***! + \*******************************/ +/*! exports provided: Reshape */function(e,t,n){"use strict";n.r(t),n.d(t,"Reshape",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../operation */"./src/nn/operation.ts"),r=n(/*! ../utils */"./src/nn/utils.ts");class i extends o.SingleOutputOperation{constructor(e,t){super(e.builder),r.validateOperand(e),this.input_=e,r.assert(r.isIntegerArray(t)&&0!==t.length,"The newShape parameter is invalid."),this.newShape_=t}inputs(){return[this.input_]}run(e){const t=e.get(this.input_);return s.reshape(t,this.newShape_)}}},"./src/nn/ops/slice.ts": +/*!*****************************!*\ + !*** ./src/nn/ops/slice.ts ***! + \*****************************/ +/*! exports provided: Slice */function(e,t,n){"use strict";n.r(t),n.d(t,"Slice",(function(){return i}));var s=n(/*! @tensorflow/tfjs-core */"./node_modules/@tensorflow/tfjs-core/dist/index.js"),o=n(/*! ../operation */"./src/nn/operation.ts"),r=n(/*! ../utils */"./src/nn/utils.ts");class i extends o.SingleOutputOperation{constructor(e,t,n,s){super(e.builder),r.validateOperand(e),this.input_=e,r.assert(r.isIntegerArray(t),"The starts parameter is invalid."),this.starts_=t,r.assert(r.isIntegerArray(n)&&n.every((e=>e>0||-1===e)),"The sizes parameter is invalid."),this.sizes_=n,r.assert(n.length==n.length,"The length of sizes is not equal to the length of sizes.))"),r.assert(void 0===s||r.isIntegerArray(s),"The axes parameter is invalid."),void 0!==s&&r.assert(n.length===s.length,"The length of axes is invalid.))"),this.axes_=s}inputs(){return[this.input_]}run(e){const t=e.get(this.input_),n=t.shape.length;if(void 0===this.axes_){this.axes_=[];for(let e=0;ee=-n)),"The value of axes is invalid."),r.assert(this.starts_.length===this.axes_.length,"The length of starts is invalid."),r.assert(this.sizes_.length===this.axes_.length,"The length of sizes is invalid.");const o=new Array(this.axes_.length).fill(0),i=new Array(this.axes_.length).fill(-1);for(let e=0;eu(e)))}function l(e){return e instanceof Float32Array||e instanceof Int32Array||e instanceof Uint32Array||e instanceof Int16Array||e instanceof Uint16Array||e instanceof Int8Array||e instanceof Uint8Array}function c(e){if("float32"===e)return Float32Array;if("int32"===e)return Int32Array;if("uint32"===e)return Uint32Array;if("float16"===e)return Uint16Array;if("int8"===e)return Int8Array;if("uint8"===e)return Uint8Array;throw new Error("Type is not supported.")}function f(e){let t;if(e instanceof Float32Array)t=new Float32Array(e.length);else if(e instanceof Int32Array)t=new Int32Array(e.length);else if(e instanceof Uint32Array)t=new Uint32Array(e.length);else if(e instanceof Uint16Array)t=new Uint16Array(e.length);else if(e instanceof Int8Array)t=new Int8Array(e.length);else{if(!(e instanceof Uint8Array))throw new Error("Type is not supported.");t=new Uint8Array(e.length)}return t.set(e),t}function p(e){if("float32"===e)return"float32";if("int32"===e)return"int32";throw new Error("The operand type is not supported by TF.js.")}function m(e){let t;return"float32"===e.dtype?t=r.MLOperandType.float32:"int32"===e.dtype&&(t=r.MLOperandType.int32),{type:t,dimensions:e.shape}}function h(e){i(e.type in r.MLOperandType,"The operand type is invalid."),e.dimensions&&i(d(e.dimensions),"The dimensions is invalid.")}function b(e){return!e.every((e=>e>0))}function j(e,t,n){i(l(e),"The value is not a typed array."),i(e instanceof c(t),"The type of value is invalid."),i(e.length===_(n),`the value length ${e.length} is invalid, size of [${n}] ${_(n)} is expected.`)}function g(e,t){t===r.MLOperandType.int32?i(Number.isInteger(e),"the value is not an int32."):t===r.MLOperandType.uint32?i(Number.isInteger(e)&&e>=0,"the value is not an uint32."):t===r.MLOperandType.int8?i(Number.isInteger(e)&&e>=-128&&e<=127,"the value is not an int8."):t===r.MLOperandType.uint8&&i(Number.isInteger(e)&&e>=0&&e<=255,"the value is not an uint8.")}function w(e,t){const n=p(e.type);if(void 0!==e.dimensions){i(l(t),"Only ArrayBufferView value is supported.");const o=t;j(o,e.type,e.dimensions);const r=f(o);return s.tensor(r,e.dimensions,n)}return"number"==typeof t?(g(t,e.type),s.scalar(t,n)):(j(t,e.type,e.dimensions),s.scalar(t[0],n))}function _(e){return void 0===e||d(e)&&0===e.length?1:e.reduce(((e,t)=>t>0?e*t:e),1)}function k(e,t=""){i(e instanceof r.MLOperand,`The parameter ${t} is not an operand.`)}function v(e,t=""){i(void 0===e||e instanceof r.MLOperand,`The parameter ${t} is not an optional operand.`)}function x(e,t){if("undefined"!=typeof e&&e.length>0)for(let n=0;n=t||e[n]<-t)return!1;return!0}function y(e,t,n,s,r,i,a){let u;if(a===o.MLAutoPad.explicit)u=n.every((e=>0===e))?"valid":[[0,0],[n[0],n[1]],[n[2],n[3]],[0,0]];else if(a===o.MLAutoPad["same-upper"])u="same";else{u=[[0,0],[0,0],[0,0],[0,0]];const n=[0,0];for(let t=0;t<2;++t)n[t]=Math.ceil(e.shape[1+t]/s[t]);const o=[0,0];for(let a=0;a<2;++a)o[a]=s[a]*(n[a]-1)+r[a]+((t.shape[a]-1)*i[a]+1)-e.shape[1+a];for(let e=0;e<2;++e)u[e+1][0]=o[e]-Math.floor(o[e]/2),u[e+1][1]=Math.floor(o[e]/2)}return u}},0: +/*!***************************!*\ + !*** multi ./src/main.js ***! + \***************************/ +/*! no static exports found */function(e,t,n){e.exports=n(/*! ./src/main.js */"./src/main.js")},1: +/*!****************************!*\ + !*** node-fetch (ignored) ***! + \****************************/ +/*! no static exports found */function(e,t){},2: +/*!**********************!*\ + !*** util (ignored) ***! + \**********************/ +/*! no static exports found */function(e,t){},3: +/*!************************!*\ + !*** crypto (ignored) ***! + \************************/ +/*! no static exports found */function(e,t){},4: +/*!**********************!*\ + !*** path (ignored) ***! + \**********************/ +/*! no static exports found */function(e,t){},5: +/*!********************!*\ + !*** fs (ignored) ***! + \********************/ +/*! no static exports found */function(e,t){},6: +/*!********************************!*\ + !*** worker_threads (ignored) ***! + \********************************/ +/*! no static exports found */function(e,t){},7: +/*!****************************!*\ + !*** perf_hooks (ignored) ***! + \****************************/ +/*! no static exports found */function(e,t){},8: +/*!********************!*\ + !*** os (ignored) ***! + \********************/ +/*! no static exports found */function(e,t){}}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4uL3NyYy9hZGRuX2dwdS50cyIsIndlYnBhY2s6Ly8vLi4vc3JjL2FkZG5fcGFja2VkX2dwdS50cyIsIndlYnBhY2s6Ly8vLi4vc3JjL2FyZ21pbm1heF9ncHUudHMiLCJ3ZWJwYWNrOi8vLy4uL3NyYy9hcmdtaW5tYXhfcGFja2VkX2dwdS50cyIsIndlYnBhY2s6Ly8vLi4vc3JjL2F2Z19wb29sX2JhY2twcm9wX2dwdS50cyIsIndlYnBhY2s6Ly8vLi4vc3JjL2JhY2tlbmRfd2ViZ2wudHMiLCJ3ZWJwYWNrOi8vLy4uL3NyYy9iYXNlLnRzIiwid2VicGFjazovLy8uLi9zcmMvYmF0Y2hub3JtX2dwdS50cyIsIndlYnBhY2s6Ly8vLi4vc3JjL2JhdGNobm9ybV9wYWNrZWRfZ3B1LnRzIiwid2VicGFjazovLy8uLi9zcmMvYmluYXJ5b3BfY29tcGxleF9ncHUudHMiLCJ3ZWJwYWNrOi8vLy4uL3NyYy9iaW5hcnlvcF9ncHUudHMiLCJ3ZWJwYWNrOi8vLy4uL3NyYy9iaW5hcnlvcF9wYWNrZWRfZ3B1LnRzIiwid2VicGFjazovLy8uLi9zcmMvY2FudmFzX3V0aWwudHMiLCJ3ZWJwYWNrOi8vLy4uL3NyYy9jbGlwX2dwdS50cyIsIndlYnBhY2s6Ly8vLi4vc3JjL2NsaXBfcGFja2VkX2dwdS50cyIsIndlYnBhY2s6Ly8vLi4vc3JjL2NvbXBsZXhfYWJzX2dwdS50cyIsIndlYnBhY2s6Ly8vLi4vc3JjL2NvbmNhdF9ncHUudHMiLCJ3ZWJwYWNrOi8vLy4uL3NyYy9jb25jYXRfcGFja2VkX2dwdS50cyIsIndlYnBhY2s6Ly8vLi4vc3JjL2NvbnZfYmFja3Byb3BfZ3B1LnRzIiwid2VicGFjazovLy8uLi9zcmMvY29udl9iYWNrcHJvcF9ncHVfZGVwdGh3aXNlLnRzIiwid2VicGFjazovLy8uLi9zcmMvY29udl9ncHUudHMiLCJ3ZWJwYWNrOi8vLy4uL3NyYy9jb252X2dwdV9kZXB0aHdpc2UudHMiLCJ3ZWJwYWNrOi8vLy4uL3NyYy9jb252X3BhY2tlZF9ncHVfZGVwdGh3aXNlLnRzIiwid2VicGFjazovLy8uLi9zcmMvY3JvcF9hbmRfcmVzaXplX2dwdS50cyIsIndlYnBhY2s6Ly8vLi4vc3JjL2N1bXN1bV9ncHUudHMiLCJ3ZWJwYWNrOi8vLy4uL3NyYy9kZWNvZGVfbWF0cml4X2dwdS50cyIsIndlYnBhY2s6Ly8vLi4vc3JjL2RlY29kZV9tYXRyaXhfcGFja2VkX2dwdS50cyIsIndlYnBhY2s6Ly8vLi4vc3JjL2RlcHRoX3RvX3NwYWNlX2dwdS50cyIsIndlYnBhY2s6Ly8vLi4vc3JjL2RpYWdfZ3B1LnRzIiwid2VicGFjazovLy8uLi9zcmMvZGlsYXRpb25fZ3B1LnRzIiwid2VicGFjazovLy8uLi9zcmMvZW5jb2RlX2Zsb2F0X2dwdS50cyIsIndlYnBhY2s6Ly8vLi4vc3JjL2VuY29kZV9mbG9hdF9wYWNrZWRfZ3B1LnRzIiwid2VicGFjazovLy8uLi9zcmMvZW5jb2RlX21hdHJpeF9ncHUudHMiLCJ3ZWJwYWNrOi8vLy4uL3NyYy9lbmNvZGVfbWF0cml4X3BhY2tlZF9ncHUudHMiLCJ3ZWJwYWNrOi8vLy4uL3NyYy9mZnRfZ3B1LnRzIiwid2VicGFjazovLy8uLi9zcmMvZmlsbF9ncHUudHMiLCJ3ZWJwYWNrOi8vLy4uL3NyYy9mbGFnc193ZWJnbC50cyIsIndlYnBhY2s6Ly8vLi4vc3JjL2ZsaXBfbGVmdF9yaWdodF9ncHUudHMiLCJ3ZWJwYWNrOi8vLy4uL3NyYy9nYXRoZXJfZ3B1LnRzIiwid2VicGFjazovLy8uLi9zcmMvZ2F0aGVyX25kX2dwdS50cyIsIndlYnBhY2s6Ly8vLi4vc3JjL2dsc2xfdmVyc2lvbi50cyIsIndlYnBhY2s6Ly8vLi4vc3JjL2dwZ3B1X2NvbnRleHQudHMiLCJ3ZWJwYWNrOi8vLy4uL3NyYy9ncGdwdV9tYXRoLnRzIiwid2VicGFjazovLy8uLi9zcmMvZ3BncHVfdXRpbC50cyIsIndlYnBhY2s6Ly8vLi4vc3JjL2ltMmNvbF9wYWNrZWRfZ3B1LnRzIiwid2VicGFjazovLy8uLi9zcmMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxfdXRpbHMvYXJnX21pbl9tYXgudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxfdXRpbHMvaW50LnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscy50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbF91dGlscy9yZWR1Y2UudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxfdXRpbHMvcmVzaGFwZS50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbF91dGlscy9zaGFyZWQudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL0Ficy50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvQWNvcy50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvQWNvc2gudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL0FkZC50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvQWRkTi50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvQWxsLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9BbnkudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL0FyZ01heC50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvQXJnTWluLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9Bc2luLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9Bc2luaC50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvQXRhbi50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvQXRhbjIudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL0F0YW5oLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9BdmdQb29sLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9BdmdQb29sM0QudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL0F2Z1Bvb2wzREdyYWQudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL0F2Z1Bvb2xHcmFkLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9CYXRjaE1hdE11bC50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvQmF0Y2hNYXRNdWxfaW1wbC50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvQmF0Y2hOb3JtLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9CYXRjaFRvU3BhY2VORC50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvQmluY291bnQudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL0Nhc3QudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL0NlaWwudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL0NsaXBCeVZhbHVlLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9Db21wbGV4LnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9Db21wbGV4QWJzLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9Db25jYXQudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL0NvbmNhdF9pbXBsLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9Db252MkQudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL0NvbnYyREJhY2twcm9wRmlsdGVyLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9Db252MkRCYWNrcHJvcElucHV0LnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9Db252MkRfaW1wbC50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvQ29udjNELnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9Db252M0RCYWNrcHJvcEZpbHRlclYyLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9Db252M0RCYWNrcHJvcElucHV0VjIudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL0Nvcy50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvQ29zaC50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvQ3JvcEFuZFJlc2l6ZS50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvQ3Vtc3VtLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9EZW5zZUJpbmNvdW50LnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9EZXB0aFRvU3BhY2UudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL0RlcHRod2lzZUNvbnYyZE5hdGl2ZS50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXIudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL0RlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXQudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL0RpYWcudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL0RpbGF0aW9uMkQudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL0VpbnN1bS50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvRWx1LnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9FbHVHcmFkLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9FcXVhbC50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvRXJmLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9FeHAudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL0V4cGFuZERpbXMudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL0V4cG0xLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9GRlQudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL0ZGVF9pbXBsLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9GaWxsLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9GbGlwTGVmdFJpZ2h0LnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9GbG9vci50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvRmxvb3JEaXYudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL0Zyb21QaXhlbHMudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uLy4uL3NyYy9rZXJuZWxzL0Zyb21QaXhlbHNfdXRpbHMvZnJvbV9waXhlbHNfZ3B1LnRzIiwid2VicGFjazovLy8uLi8uLi8uLi9zcmMva2VybmVscy9Gcm9tUGl4ZWxzX3V0aWxzL2Zyb21fcGl4ZWxzX3BhY2tlZF9ncHUudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL0Z1c2VkQ29udjJELnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9GdXNlZERlcHRod2lzZUNvbnYyRC50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvR2F0aGVyTmQudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL0dhdGhlclYyLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9HcmVhdGVyLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9HcmVhdGVyRXF1YWwudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL0lGRlQudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL0lkZW50aXR5LnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9JbWFnLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9Jc0Zpbml0ZS50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvSXNJbmYudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL0lzTmFOLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9MUk4udHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL0xSTkdyYWQudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL0xlYWt5UmVsdS50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvTGVzcy50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvTGVzc0VxdWFsLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9MaW5TcGFjZS50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvTG9nLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9Mb2cxcC50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvTG9naWNhbEFuZC50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvTG9naWNhbE5vdC50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvTG9naWNhbE9yLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9NYXgudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL01heFBvb2wudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL01heFBvb2wzRC50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvTWF4UG9vbDNER3JhZC50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvTWF4UG9vbEdyYWQudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL01heFBvb2xXaXRoQXJnbWF4LnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9NYXhQb29sV2l0aEFyZ21heF9pbXBsLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9NYXhfaW1wbC50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvTWF4aW11bS50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvTWVhbi50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvTWVhbl9pbXBsLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9NaW4udHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL01pbmltdW0udHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL01pcnJvclBhZC50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvTW9kLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9NdWx0aW5vbWlhbC50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvTXVsdGlwbHkudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL05lZy50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvTm9uTWF4U3VwcHJlc3Npb25WMy50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvTm9uTWF4U3VwcHJlc3Npb25WNC50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvTm9uTWF4U3VwcHJlc3Npb25WNS50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvTm90RXF1YWwudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL09uZUhvdC50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvT25lc0xpa2UudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL1BhY2sudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL1BhZFYyLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9Qb3cudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL1ByZWx1LnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9Qcm9kLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9SYW5nZS50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvUmVhbC50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvUmVhbERpdi50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvUmVjaXByb2NhbC50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvUmVsdS50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvUmVsdTYudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL1Jlc2hhcGUudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL1Jlc2l6ZUJpbGluZWFyLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9SZXNpemVCaWxpbmVhckdyYWQudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL1Jlc2l6ZU5lYXJlc3ROZWlnaGJvci50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvUmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZC50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvUmV2ZXJzZS50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvUm90YXRlV2l0aE9mZnNldC50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvUm91bmQudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL1JzcXJ0LnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9TY2F0dGVyTmQudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL1NlbGVjdC50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvU2VsdS50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvU2lnbW9pZC50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvU2lnbi50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvU2luLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9TaW5oLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9TbGljZS50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvU29mdG1heC50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvU29mdHBsdXMudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL1NwYWNlVG9CYXRjaE5ELnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9TcGFyc2VGaWxsRW1wdHlSb3dzLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9TcGFyc2VSZXNoYXBlLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9TcGFyc2VTZWdtZW50TWVhbi50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvU3BhcnNlU2VnbWVudFN1bS50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvU3BhcnNlVG9EZW5zZS50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvU3BsaXRWLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9TcXJ0LnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9TcXVhcmUudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL1NxdWFyZWREaWZmZXJlbmNlLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9TdGVwLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9TdHJpZGVkU2xpY2UudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL1N0cmluZ05HcmFtcy50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvU3RyaW5nU3BsaXQudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL1N0cmluZ1RvSGFzaEJ1Y2tldEZhc3QudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL1N1Yi50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvU3VtLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9TdW1faW1wbC50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvVGFuLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9UYW5oLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9UaWxlLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9Ub3BLLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9UcmFuc2Zvcm0udHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL1RyYW5zcG9zZS50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvVHJhbnNwb3NlX2ltcGwudHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL1VuaXF1ZS50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvVW5wYWNrLnRzIiwid2VicGFjazovLy8uLi8uLi9zcmMva2VybmVscy9VbnNvcnRlZFNlZ21lbnRTdW0udHMiLCJ3ZWJwYWNrOi8vLy4uLy4uL3NyYy9rZXJuZWxzL1plcm9zTGlrZS50cyIsIndlYnBhY2s6Ly8vLi4vLi4vc3JjL2tlcm5lbHMvX0Z1c2VkTWF0TXVsLnRzIiwid2VicGFjazovLy8uLi9zcmMvbHJuX2dwdS50cyIsIndlYnBhY2s6Ly8vLi4vc3JjL2xybl9ncmFkX2dwdS50cyIsIndlYnBhY2s6Ly8vLi4vc3JjL2xybl9wYWNrZWRfZ3B1LnRzIiwid2VicGFjazovLy8uLi9zcmMvbWF4X3Bvb2xfYmFja3Byb3BfZ3B1LnRzIiwid2VicGFjazovLy8uLi9zcmMvbWVhbl9ncHUudHMiLCJ3ZWJwYWNrOi8vLy4uL3NyYy9taXJyb3JfcGFkX2dwdS50cyIsIndlYnBhY2s6Ly8vLi4vc3JjL21pcnJvcl9wYWRfcGFja2VkX2dwdS50cyIsIndlYnBhY2s6Ly8vLi4vc3JjL211bG1hdF9wYWNrZWRfZ3B1LnRzIiwid2VicGFjazovLy8uLi9zcmMvbXVsdGlub21pYWxfZ3B1LnRzIiwid2VicGFjazovLy8uLi9zcmMvb25laG90X2dwdS50cyIsIndlYnBhY2s6Ly8vLi4vc3JjL3BhY2tfZ3B1LnRzIiwid2VicGFjazovLy8uLi9zcmMvcGFja2luZ191dGlsLnRzIiwid2VicGFjazovLy8uLi9zcmMvcGFkX2dwdS50cyIsIndlYnBhY2s6Ly8vLi4vc3JjL3BhZF9wYWNrZWRfZ3B1LnRzIiwid2VicGFjazovLy8uLi9zcmMvcG9vbF9ncHUudHMiLCJ3ZWJwYWNrOi8vLy4uL3NyYy9yZWR1Y2VfZ3B1LnRzIiwid2VicGFjazovLy8uLi9zcmMvcmVnaXN0ZXJfYWxsX2tlcm5lbHMudHMiLCJ3ZWJwYWNrOi8vLy4uL3NyYy9yZXNoYXBlX3BhY2tlZF9ncHUudHMiLCJ3ZWJwYWNrOi8vLy4uL3NyYy9yZXNpemVfYmlsaW5lYXJfYmFja3Byb3BfZ3B1LnRzIiwid2VicGFjazovLy8uLi9zcmMvcmVzaXplX2JpbGluZWFyX2dwdS50cyIsIndlYnBhY2s6Ly8vLi4vc3JjL3Jlc2l6ZV9iaWxpbmVhcl9wYWNrZWRfZ3B1LnRzIiwid2VicGFjazovLy8uLi9zcmMvcmVzaXplX25lYXJlc3RfbmVpZ2hib3JfYmFja3Byb3BfZ3B1LnRzIiwid2VicGFjazovLy8uLi9zcmMvcmVzaXplX25lYXJlc3RfbmVpZ2hib3JfZ3B1LnRzIiwid2VicGFjazovLy8uLi9zcmMvcmVzaXplX25lYXJlc3RfbmVpZ2hib3JfcGFja2VkX2dwdS50cyIsIndlYnBhY2s6Ly8vLi4vc3JjL3JldmVyc2VfZ3B1LnRzIiwid2VicGFjazovLy8uLi9zcmMvcmV2ZXJzZV9wYWNrZWRfZ3B1LnRzIiwid2VicGFjazovLy8uLi9zcmMvcm90YXRlX2dwdS50cyIsIndlYnBhY2s6Ly8vLi4vc3JjL3NjYXR0ZXJfZ3B1LnRzIiwid2VicGFjazovLy8uLi9zcmMvc2VnbWVudF9ncHUudHMiLCJ3ZWJwYWNrOi8vLy4uL3NyYy9zZWxlY3RfZ3B1LnRzIiwid2VicGFjazovLy8uLi9zcmMvc2hhZGVyX2NvbXBpbGVyLnRzIiwid2VicGFjazovLy8uLi9zcmMvc2hhZGVyX2NvbXBpbGVyX3V0aWwudHMiLCJ3ZWJwYWNrOi8vLy4uL3NyYy9zbGljZV9ncHUudHMiLCJ3ZWJwYWNrOi8vLy4uL3NyYy9zbGljZV9wYWNrZWRfZ3B1LnRzIiwid2VicGFjazovLy8uLi9zcmMvc3RyaWRlZF9zbGljZV9ncHUudHMiLCJ3ZWJwYWNrOi8vLy4uL3NyYy90ZXhfdXRpbC50cyIsIndlYnBhY2s6Ly8vLi4vc3JjL3RleHR1cmVfbWFuYWdlci50cyIsIndlYnBhY2s6Ly8vLi4vc3JjL3RpbGVfZ3B1LnRzIiwid2VicGFjazovLy8uLi9zcmMvdG9wX2tfZ3B1LnRzIiwid2VicGFjazovLy8uLi9zcmMvdHJhbnNmb3JtX2dwdS50cyIsIndlYnBhY2s6Ly8vLi4vc3JjL3RyYW5zcG9zZV9ncHUudHMiLCJ3ZWJwYWNrOi8vLy4uL3NyYy90cmFuc3Bvc2VfcGFja2VkX2dwdS50cyIsIndlYnBhY2s6Ly8vLi4vc3JjL3VuYXJ5b3BfZ3B1LnRzIiwid2VicGFjazovLy8uLi9zcmMvdW5hcnlvcF9wYWNrZWRfZ3B1LnRzIiwid2VicGFjazovLy8uLi9zcmMvdW5wYWNrX2dwdS50cyIsIndlYnBhY2s6Ly8vLi4vc3JjL3ZlcnNpb24udHMiLCJ3ZWJwYWNrOi8vLy4uL3NyYy93ZWJnbC50cyIsIndlYnBhY2s6Ly8vLi4vc3JjL3dlYmdsX3V0aWwudHMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9iYWNrZW5kX2NwdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2Jhc2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9jcHVfdXRpbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9BYnMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0Fjb3MuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0Fjb3NoLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9BZGQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0FkZE4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0FsbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvQW55LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9BcmdNYXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0FyZ01pbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvQXNpbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvQXNpbmguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0F0YW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0F0YW4yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9BdGFuaC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvQXZnUG9vbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvQXZnUG9vbDNELmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9BdmdQb29sM0RHcmFkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9BdmdQb29sR3JhZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvQmF0Y2hNYXRNdWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0JhdGNoTm9ybS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvQmF0Y2hUb1NwYWNlTkQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0JpbmNvdW50LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9CaW5jb3VudF9pbXBsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9DYXN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9DZWlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9DbGlwLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Db21wbGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Db21wbGV4QWJzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Db25jYXQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0NvbmNhdF9pbXBsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Db252MkQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0NvbnYyREJhY2twcm9wRmlsdGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Db252MkRCYWNrcHJvcElucHV0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Db252M0QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0NvbnYzREJhY2twcm9wRmlsdGVyVjIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0NvbnYzREJhY2twcm9wSW5wdXRWMi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvQ29zLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Db3NoLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Dcm9wQW5kUmVzaXplLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9DdW1zdW0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0RlbnNlQmluY291bnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0RlcHRoVG9TcGFjZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvRGVwdGh3aXNlQ29udjJkTmF0aXZlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9EZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvRGlhZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvRGlsYXRpb24yRC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvRGlsYXRpb24yREJhY2twcm9wRmlsdGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9EaWxhdGlvbjJEQmFja3Byb3BJbnB1dC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvRWluc3VtLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9FbHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0VsdUdyYWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0VxdWFsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9FcmYuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0V4cC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvRXhwYW5kRGltcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvRXhwbTEuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0ZGVC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvRmlsbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvRmxpcExlZnRSaWdodC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvRmxvb3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0Zsb29yRGl2LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9GdXNlZENvbnYyRC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvRnVzZWREZXB0aHdpc2VDb252MkQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0dhdGhlck5kLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9HYXRoZXJOZF9JbXBsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9HYXRoZXJWMi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvR2F0aGVyVjJfaW1wbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvR3JlYXRlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvR3JlYXRlckVxdWFsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9JRkZULmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9JZGVudGl0eS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvSW1hZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvSXNGaW5pdGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0lzSW5mLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Jc05hTi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvTFJOLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9MUk5HcmFkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9MZWFreVJlbHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0xlc3MuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0xlc3NFcXVhbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvTGluU3BhY2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0xpblNwYWNlX2ltcGwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0xvZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvTG9nMXAuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0xvZ2ljYWxBbmQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0xvZ2ljYWxOb3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL0xvZ2ljYWxPci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvTWF4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9NYXhQb29sLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9NYXhQb29sM0QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL01heFBvb2wzREdyYWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL01heFBvb2xHcmFkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9NYXhQb29sV2l0aEFyZ21heC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvTWF4UG9vbFdpdGhBcmdtYXhfaW1wbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvTWF4X2ltcGwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL01heGltdW0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL01lYW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL01pbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvTWluaW11bS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvTWlycm9yUGFkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Nb2QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL011bHRpbm9taWFsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9NdWx0aXBseS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvTmVnLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Ob25NYXhTdXBwcmVzc2lvblYzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Ob25NYXhTdXBwcmVzc2lvblY0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Ob25NYXhTdXBwcmVzc2lvblY1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Ob3RFcXVhbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvT25lSG90LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9PbmVzTGlrZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvUGFjay5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvUGFkVjIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1Bvdy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvUHJlbHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1Byb2QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1JhbmdlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9SYW5nZV9pbXBsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9SZWFsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9SZWFsRGl2LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9SZWNpcHJvY2FsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9SZWx1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9SZWx1Ni5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvUmVzaGFwZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvUmVzaXplQmlsaW5lYXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1Jlc2l6ZUJpbGluZWFyR3JhZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvUmVzaXplTmVhcmVzdE5laWdoYm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9SZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9SZXZlcnNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Sb3RhdGVXaXRoT2Zmc2V0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Sb3VuZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvUnNxcnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1NjYXR0ZXJOZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvU2NhdHRlcl9pbXBsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9TZWxlY3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1NlbHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1NpZ21vaWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1NpZ24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1Npbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvU2luaC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvU2xpY2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1NvZnRtYXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1NvZnRwbHVzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9TcGFjZVRvQmF0Y2hORC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvU3BhcnNlRmlsbEVtcHR5Um93cy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvU3BhcnNlRmlsbEVtcHR5Um93c19pbXBsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9TcGFyc2VSZXNoYXBlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9TcGFyc2VSZXNoYXBlX2ltcGwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1NwYXJzZVNlZ21lbnRNZWFuLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9TcGFyc2VTZWdtZW50UmVkdWN0aW9uX2ltcGwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1NwYXJzZVNlZ21lbnRTdW0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1NwYXJzZVRvRGVuc2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1NwbGl0Vi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvU3FydC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvU3F1YXJlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9TcXVhcmVkRGlmZmVyZW5jZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvU3RlcC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvU3RyaWRlZFNsaWNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9TdHJpZGVkU2xpY2VfaW1wbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvU3RyaW5nTkdyYW1zLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9TdHJpbmdOR3JhbXNfaW1wbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvU3RyaW5nU3BsaXQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1N0cmluZ1NwbGl0X2ltcGwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1N0cmluZ1RvSGFzaEJ1Y2tldEZhc3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1N0cmluZ1RvSGFzaEJ1Y2tldEZhc3RfaW1wbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvU3ViLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9TdW0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1Rhbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvVGFuaC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvVGlsZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvVGlsZV9pbXBsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Ub3BLLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9Ub3BLX2ltcGwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1RyYW5zZm9ybS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvVHJhbnNwb3NlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9UcmFuc3Bvc2VfaW1wbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvVW5pcXVlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9VbmlxdWVfaW1wbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvVW5wYWNrLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3Qva2VybmVscy9VbnNvcnRlZFNlZ21lbnRTdW0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9rZXJuZWxzL1plcm9zTGlrZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L2tlcm5lbHMvX0Z1c2VkTWF0TXVsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3QvcmVnaXN0ZXJfYWxsX2tlcm5lbHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9zaGFyZWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC91dGlscy9iaW5hcnlfaW1wbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L3V0aWxzL2JpbmFyeV91dGlscy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L3V0aWxzL2ZmdF91dGlscy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L3V0aWxzL2Z1c2VkX3V0aWxzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtY3B1L2Rpc3QvdXRpbHMvcG9vbF91dGlscy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L3V0aWxzL3VuYXJ5X2ltcGwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC91dGlscy91bmFyeV91dGlscy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L3V0aWxzL3plcm9zX2ltcGwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC92ZXJzaW9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2JhY2tlbmRfd2FzbS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9iYXNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2ZsYWdzX3dhc20uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVsX3V0aWxzL3NoYXJlZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL0Ficy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL0FkZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL0FkZE4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9BbGwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9BbnkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9BcmdNYXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9BdmdQb29sLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvQmF0Y2hNYXRNdWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9CYXRjaFRvU3BhY2VORC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL0Nhc3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9DZWlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvQ2xpcEJ5VmFsdWUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9Db25jYXQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9Db252MkQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9Db252MkRCYWNrcHJvcElucHV0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvQ29zLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvQ29zaC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL0Nyb3BBbmRSZXNpemUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9DdW1zdW0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9EZXB0aFRvU3BhY2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9EZXB0aHdpc2VDb252MmROYXRpdmUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9FcXVhbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL0V4cC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL0V4cGFuZERpbXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9GaWxsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvRmxpcExlZnRSaWdodC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL0Zsb29yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvRmxvb3JEaXYuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9GdXNlZEJhdGNoTm9ybS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL0Z1c2VkQ29udjJELmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvRnVzZWREZXB0aHdpc2VDb252MkQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9HYXRoZXJOZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL0dhdGhlclYyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvR3JlYXRlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL0dyZWF0ZXJFcXVhbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL0lkZW50aXR5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvTGVha3lSZWx1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvTGVzcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL0xlc3NFcXVhbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL0xvZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL0xvZ2ljYWxBbmQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9NYXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9NYXhQb29sLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvTWF4aW11bS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL01lYW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9NaW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9NaW5pbXVtLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvTWlycm9yUGFkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvTXVsdGlwbHkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9OZWcuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9Ob25NYXhTdXBwcmVzc2lvblYzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvTm9uTWF4U3VwcHJlc3Npb25WNC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL05vbk1heFN1cHByZXNzaW9uVjUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9Ob25NYXhTdXBwcmVzc2lvbl91dGlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvTm90RXF1YWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9PbmVIb3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9PbmVzTGlrZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL1BhY2suanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9QYWRWMi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL1Bvdy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL1ByZWx1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvUHJvZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL1JhbmdlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvUmVhbERpdi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL1JlbHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9SZWx1Ni5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL1Jlc2hhcGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9SZXNpemVCaWxpbmVhci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL1JldmVyc2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9Sb3RhdGVXaXRoT2Zmc2V0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvUm91bmQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9Sc3FydC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL1NjYXR0ZXJOZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL1NlbGVjdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL1NpZ21vaWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9TaW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9TbGljZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL1NvZnRtYXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9TcGFjZVRvQmF0Y2hORC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL1NwbGl0Vi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL1NxcnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9TcXVhcmUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9TcXVhcmVkRGlmZmVyZW5jZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL1N0ZXAuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9TdHJpZGVkU2xpY2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9TdWIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9TdW0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9UYW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9UYW5oLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvVGlsZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vZGlzdC9rZXJuZWxzL1RvcEsuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9UcmFuc2Zvcm0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9UcmFuc3Bvc2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9VbnBhY2suanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9aZXJvc0xpa2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9fRnVzZWRNYXRNdWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy9iaW5hcnlfa2VybmVsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMva2VybmVsX3V0aWxzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWJhY2tlbmQtd2FzbS9kaXN0L2tlcm5lbHMvdHlwZXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3Qva2VybmVscy91bmFyeV9rZXJuZWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3QvcmVnaXN0ZXJfYWxsX2tlcm5lbHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL2Rpc3QvdmVyc2lvbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vd2FzbS1vdXQvdGZqcy1iYWNrZW5kLXdhc20tdGhyZWFkZWQtc2ltZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdhc20vd2FzbS1vdXQvdGZqcy1iYWNrZW5kLXdhc20tdGhyZWFkZWQtc2ltZC53b3JrZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtL3dhc20tb3V0L3RmanMtYmFja2VuZC13YXNtLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9iYWNrZW5kcy9iYWNrZW5kLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9iYWNrZW5kcy9iYWNrZW5kX3V0aWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L2JhY2tlbmRzL2NvbXBsZXhfdXRpbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3QvYmFja2VuZHMvZWluc3VtX3V0aWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L2JhY2tlbmRzL2tlcm5lbF9pbXBscy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3QvYmFja2VuZHMvbm9uX21heF9zdXBwcmVzc2lvbl9pbXBsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9iYWNrZW5kcy9ub25fbWF4X3N1cHByZXNzaW9uX3V0aWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L2JhY2tlbmRzL3doZXJlX2ltcGwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L2Jhc2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L2Jhc2Vfc2lkZV9lZmZlY3RzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9icm93c2VyX3V0aWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L2RldmljZV91dGlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9lbmdpbmUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L2Vudmlyb25tZW50LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9mbGFncy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3QvZ2xvYmFsX3V0aWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L2dsb2JhbHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L2dyYWRpZW50cy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3QvaGFzaF91dGlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3QvaW8vYnJvd3Nlcl9maWxlcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3QvaW8vaHR0cC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3QvaW8vaW5kZXhlZF9kYi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3QvaW8vaW8uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L2lvL2lvX3V0aWxzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9pby9sb2NhbF9zdG9yYWdlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9pby9tb2RlbF9tYW5hZ2VtZW50LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9pby9wYXNzdGhyb3VnaC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3QvaW8vcHJvZ3Jlc3MuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L2lvL3JvdXRlcl9yZWdpc3RyeS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3QvaW8vdHlwZXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L2lvL3dlaWdodHNfbG9hZGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9rZXJuZWxfbmFtZXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L2tlcm5lbF9yZWdpc3RyeS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3QvbG9nLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9tYXRoLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvYWJzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvYWNvcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2Fjb3NoLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvYWRkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvYWRkX24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9hbGwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9hbnkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9hcmdfbWF4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvYXJnX21pbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2FycmF5X29wc191dGlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvYXNpbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2FzaW5oLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvYXRhbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2F0YW4yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvYXRhbmguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9hdmdfcG9vbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2F2Z19wb29sXzNkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvYXhpc191dGlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvYmFzaWNfbHN0bV9jZWxsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvYmF0Y2hfdG9fc3BhY2VfbmQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9iYXRjaG5vcm0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9iYXRjaG5vcm0yZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2JhdGNobm9ybTNkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvYmF0Y2hub3JtNGQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9iYXRjaG5vcm1fdXRpbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2JpbmNvdW50LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvYm9vbGVhbl9tYXNrLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvYnJvYWRjYXN0X3RvLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvYnJvYWRjYXN0X3V0aWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9icm93c2VyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvYnVmZmVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvY2FzdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2NlaWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9jbGlwX2J5X3ZhbHVlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvY2xvbmUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9jb21wbGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvY29uY2F0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvY29uY2F0XzFkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvY29uY2F0XzJkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvY29uY2F0XzNkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvY29uY2F0XzRkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvY29uY2F0X3V0aWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9jb25mdXNpb25fbWF0cml4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvY29udjFkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvY29udjJkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvY29udjJkX2JhY2twcm9wX2ZpbHRlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2NvbnYyZF9iYWNrcHJvcF9pbnB1dC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2NvbnYyZF90cmFuc3Bvc2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9jb252M2QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9jb252M2RfYmFja3Byb3BfaW5wdXQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9jb252M2RfdHJhbnNwb3NlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvY29udl91dGlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvY29zLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvY29zaC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2N1bXN1bS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2RlbnNlX2JpbmNvdW50LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvZGVwdGhfdG9fc3BhY2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9kZXB0aHdpc2VfY29udjJkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvZGVwdGh3aXNlX2NvbnYyZF9uYXRpdmVfYmFja3Byb3BfZmlsdGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvZGVwdGh3aXNlX2NvbnYyZF9uYXRpdmVfYmFja3Byb3BfaW5wdXQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9kaWFnLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvZGlsYXRpb24yZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2Rpdi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2Rpdl9ub19uYW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9kb3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9kcm9wb3V0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvZHJvcG91dF91dGlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvZWluc3VtLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvZWx1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvZXF1YWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9lcmYuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9lcmZfdXRpbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2V4cC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2V4cGFuZF9kaW1zLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvZXhwbTEuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9leWUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9maWxsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvZmxvb3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9mbG9vckRpdi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2Z1c2VkL2NvbnYyZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2Z1c2VkL2RlcHRod2lzZV9jb252MmQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9mdXNlZC9tYXRfbXVsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvZnVzZWRfb3BzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvZnVzZWRfdXRpbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2dhdGhlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2dhdGhlcl9uZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2dhdGhlcl9uZF91dGlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvZ3JlYXRlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2dyZWF0ZXJfZXF1YWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9pbWFnLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvaW1hZ2UvY3JvcF9hbmRfcmVzaXplLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvaW1hZ2UvZmxpcF9sZWZ0X3JpZ2h0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvaW1hZ2Uvbm9uX21heF9zdXBwcmVzc2lvbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2ltYWdlL25vbl9tYXhfc3VwcHJlc3Npb25fYXN5bmMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9pbWFnZS9ub25fbWF4X3N1cHByZXNzaW9uX3BhZGRlZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2ltYWdlL25vbl9tYXhfc3VwcHJlc3Npb25fcGFkZGVkX2FzeW5jLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvaW1hZ2Uvbm9uX21heF9zdXBwcmVzc2lvbl93aXRoX3Njb3JlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvaW1hZ2Uvbm9uX21heF9zdXBwcmVzc2lvbl93aXRoX3Njb3JlX2FzeW5jLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvaW1hZ2UvcmVzaXplX2JpbGluZWFyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvaW1hZ2UvcmVzaXplX25lYXJlc3RfbmVpZ2hib3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9pbWFnZS9yb3RhdGVfd2l0aF9vZmZzZXQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9pbWFnZS90aHJlc2hvbGQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9pbWFnZS90cmFuc2Zvcm0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9pbl90b3Bfay5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2lzX2Zpbml0ZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2lzX2luZi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2lzX25hbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2xlYWt5X3JlbHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9sZXNzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbGVzc19lcXVhbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2xpbmFsZy9iYW5kX3BhcnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9saW5hbGcvZ3JhbV9zY2htaWR0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbGluYWxnL3FyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbGluc3BhY2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9sb2NhbF9yZXNwb25zZV9ub3JtYWxpemF0aW9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbG9nLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbG9nMXAuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9sb2dfc2lnbW9pZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2xvZ19zb2Z0bWF4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbG9nX3N1bV9leHAuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9sb2dpY2FsX2FuZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2xvZ2ljYWxfbm90LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbG9naWNhbF9vci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2xvZ2ljYWxfeG9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbG9zc19vcHNfdXRpbHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9sb3NzZXMvYWJzb2x1dGVfZGlmZmVyZW5jZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2xvc3Nlcy9jb21wdXRlX3dlaWdodGVkX2xvc3MuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9sb3NzZXMvY29zaW5lX2Rpc3RhbmNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbG9zc2VzL2hpbmdlX2xvc3MuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9sb3NzZXMvaHViZXJfbG9zcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2xvc3Nlcy9sb2dfbG9zcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL2xvc3Nlcy9tZWFuX3NxdWFyZWRfZXJyb3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9sb3NzZXMvc2lnbW9pZF9jcm9zc19lbnRyb3B5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbG9zc2VzL3NvZnRtYXhfY3Jvc3NfZW50cm9weS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL21hdF9tdWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9tYXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9tYXhfcG9vbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL21heF9wb29sXzNkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbWF4X3Bvb2xfd2l0aF9hcmdtYXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9tYXhpbXVtLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbWVhbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL21lc2hncmlkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbWluLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbWluaW11bS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL21pcnJvcl9wYWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9tb2QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9tb21lbnRzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbW92aW5nX2F2ZXJhZ2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9tdWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9tdWx0aV9ybm5fY2VsbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL211bHRpbm9taWFsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbmVnLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbm9ubWF4X3V0aWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9ub3JtLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvbm90X2VxdWFsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvb25lX2hvdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL29uZXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9vbmVzX2xpa2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9vcGVyYXRpb24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9vcHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9vdXRlcl9wcm9kdWN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvcGFkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvcGFkMWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9wYWQyZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3BhZDNkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvcGFkNGQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9wb29sLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvcG93LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvcHJlbHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9wcmludC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3Byb2QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9yYW5kLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvcmFuZF91dGlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvcmFuZG9tX2dhbW1hLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvcmFuZG9tX25vcm1hbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3JhbmRvbV91bmlmb3JtLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvcmFuZ2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9yZWFsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvcmVjaXByb2NhbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3JlZHVjZV91dGlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvcmVsdS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3JlbHU2LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvcmVzaGFwZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3JldmVyc2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9yZXZlcnNlXzFkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvcmV2ZXJzZV8yZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3JldmVyc2VfM2QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9yZXZlcnNlXzRkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvcm90YXRlX3V0aWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9yb3VuZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3JzcXJ0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvc2NhbGFyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvc2NhdHRlcl9uZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3NjYXR0ZXJfbmRfdXRpbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3NlZ21lbnRfdXRpbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3NlbHUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zZWx1X3V0aWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zZXBhcmFibGVfY29udjJkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvc2V0ZGlmZjFkX2FzeW5jLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvc2lnbW9pZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3NpZ24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zaWduYWwvZnJhbWUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zaWduYWwvaGFtbWluZ193aW5kb3cuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zaWduYWwvaGFubl93aW5kb3cuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zaWduYWwvc3RmdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3NpZ25hbF9vcHNfdXRpbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3Npbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3NpbmguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zbGljZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3NsaWNlMWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zbGljZTJkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvc2xpY2UzZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3NsaWNlNGQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zbGljZV91dGlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvc29mdG1heC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3NvZnRwbHVzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvc3BhY2VfdG9fYmF0Y2hfbmQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zcGFyc2Uvc3BhcnNlX2ZpbGxfZW1wdHlfcm93cy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3NwYXJzZS9zcGFyc2VfcmVzaGFwZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3NwYXJzZS9zcGFyc2Vfc2VnbWVudF9tZWFuLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvc3BhcnNlL3NwYXJzZV9zZWdtZW50X3N1bS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3NwYXJzZV90b19kZW5zZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3NwYXJzZV90b19kZW5zZV91dGlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvc3BlY3RyYWwvZmZ0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvc3BlY3RyYWwvaWZmdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3NwZWN0cmFsL2lyZmZ0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvc3BlY3RyYWwvcmZmdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3NwbGl0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvc3BsaXRfdXRpbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3NxcnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zcXVhcmUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zcXVhcmVkX2RpZmZlcmVuY2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zcXVlZXplLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvc3RhY2suanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zdGVwLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvc3RyaWRlZF9zbGljZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3N0cmluZy9zdHJpbmdfbl9ncmFtcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3N0cmluZy9zdHJpbmdfc3BsaXQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zdHJpbmcvc3RyaW5nX3RvX2hhc2hfYnVja2V0X2Zhc3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zdWIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9zdW0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy90YW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy90YW5oLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvdGVuc29yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvdGVuc29yMWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy90ZW5zb3IyZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3RlbnNvcjNkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvdGVuc29yNGQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy90ZW5zb3I1ZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3RlbnNvcjZkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvdGVuc29yX29wc191dGlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvdGlsZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3RvcGsuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy90cmFuc3Bvc2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy90cnVuY2F0ZWRfbm9ybWFsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvdW5pcXVlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvdW5zb3J0ZWRfc2VnbWVudF9zdW0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy91bnN0YWNrLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvdmFyaWFibGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy93aGVyZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL3doZXJlX2FzeW5jLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvemVyb3MuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy96ZXJvc19saWtlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHRpbWl6ZXJzL2FkYWRlbHRhX29wdGltaXplci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3B0aW1pemVycy9hZGFncmFkX29wdGltaXplci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3B0aW1pemVycy9hZGFtX29wdGltaXplci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3B0aW1pemVycy9hZGFtYXhfb3B0aW1pemVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHRpbWl6ZXJzL21vbWVudHVtX29wdGltaXplci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3B0aW1pemVycy9vcHRpbWl6ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wdGltaXplcnMvb3B0aW1pemVyX2NvbnN0cnVjdG9ycy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3B0aW1pemVycy9ybXNwcm9wX29wdGltaXplci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3B0aW1pemVycy9zZ2Rfb3B0aW1pemVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9wbGF0Zm9ybXMvcGxhdGZvcm1fYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3QvcGxhdGZvcm1zL3BsYXRmb3JtX25vZGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L3Byb2ZpbGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9zZXJpYWxpemF0aW9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC90YXBlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC90ZW5zb3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L3RlbnNvcl9mb3JtYXQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L3RlbnNvcl91dGlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC90ZW5zb3JfdXRpbF9lbnYuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L3Rlc3RfdXRpbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3QvdHJhaW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L3R5cGVzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC91dGlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC91dGlsX2Jhc2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L3ZlcnNpb24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2Jhc2U2NC1qcy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYnVmZmVyL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9pZWVlNzU0L2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9pc2FycmF5L2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb25nL3NyYy9sb25nLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9wcm9jZXNzL2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3NlZWRyYW5kb20vaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3NlZWRyYW5kb20vbGliL2FsZWEuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3NlZWRyYW5kb20vbGliL3R5Y2hlaS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc2VlZHJhbmRvbS9saWIveG9yMTI4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zZWVkcmFuZG9tL2xpYi94b3I0MDk2LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zZWVkcmFuZG9tL2xpYi94b3JzaGlmdDcuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3NlZWRyYW5kb20vbGliL3hvcndvdy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc2VlZHJhbmRvbS9zZWVkcmFuZG9tLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zZXRpbW1lZGlhdGUvc2V0SW1tZWRpYXRlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90aW1lcnMtYnJvd3NlcmlmeS9tYWluLmpzIiwid2VicGFjazovLy8od2VicGFjaykvYnVpbGRpbi9hbWQtZGVmaW5lLmpzIiwid2VicGFjazovLy8od2VicGFjaykvYnVpbGRpbi9hbWQtb3B0aW9ucy5qcyIsIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vZ2xvYmFsLmpzIiwid2VicGFjazovLy8od2VicGFjaykvYnVpbGRpbi9tb2R1bGUuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL21haW4uanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL21sLnRzIiwid2VicGFjazovLy8uL3NyYy9ubi9jb250ZXh0LnRzIiwid2VicGFjazovLy8uL3NyYy9ubi9ncmFwaC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbm4vZ3JhcGhfYnVpbGRlci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbm4vb3BlcmFuZC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbm4vb3BlcmF0aW9uLnRzIiwid2VicGFjazovLy8uL3NyYy9ubi9vcHMvYmF0Y2hfbm9ybS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbm4vb3BzL2JpbmFyeS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbm4vb3BzL2NsYW1wLnRzIiwid2VicGFjazovLy8uL3NyYy9ubi9vcHMvY29uY2F0LnRzIiwid2VicGFjazovLy8uL3NyYy9ubi9vcHMvY29udjJkLnRzIiwid2VicGFjazovLy8uL3NyYy9ubi9vcHMvZ2VtbS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbm4vb3BzL2dydS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbm4vb3BzL2luc3RhbmNlX25vcm0udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL25uL29wcy9sZWFreV9yZWx1LnRzIiwid2VicGFjazovLy8uL3NyYy9ubi9vcHMvcGFkLnRzIiwid2VicGFjazovLy8uL3NyYy9ubi9vcHMvcG9vbDJkLnRzIiwid2VicGFjazovLy8uL3NyYy9ubi9vcHMvcmVkdWNlLnRzIiwid2VicGFjazovLy8uL3NyYy9ubi9vcHMvcmVzYW1wbGUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL25uL29wcy9yZXNoYXBlLnRzIiwid2VicGFjazovLy8uL3NyYy9ubi9vcHMvc2xpY2UudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL25uL29wcy9zb2Z0bWF4LnRzIiwid2VicGFjazovLy8uL3NyYy9ubi9vcHMvc3BsaXQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL25uL29wcy9zcXVlZXplLnRzIiwid2VicGFjazovLy8uL3NyYy9ubi9vcHMvdHJhbnNwb3NlLnRzIiwid2VicGFjazovLy8uL3NyYy9ubi9vcHMvdW5hcnkudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL25uL3V0aWxzLnRzIl0sIm5hbWVzIjpbImluc3RhbGxlZE1vZHVsZXMiLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJleHBvcnRzIiwibW9kdWxlIiwiaSIsImwiLCJtb2R1bGVzIiwiY2FsbCIsIm0iLCJjIiwiZCIsIm5hbWUiLCJnZXR0ZXIiLCJvIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJlbnVtZXJhYmxlIiwiZ2V0IiwiciIsIlN5bWJvbCIsInRvU3RyaW5nVGFnIiwidmFsdWUiLCJ0IiwibW9kZSIsIl9fZXNNb2R1bGUiLCJucyIsImNyZWF0ZSIsImtleSIsImJpbmQiLCJuIiwib2JqZWN0IiwicHJvcGVydHkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsInAiLCJzIiwiQWRkTlByb2dyYW0iLCJjb25zdHJ1Y3RvciIsIm91dHB1dFNoYXBlIiwic2hhcGVzIiwidGhpcyIsInZhcmlhYmxlTmFtZXMiLCJtYXAiLCJfIiwic25pcHBldHMiLCJmb3JFYWNoIiwidmFyaWFibGUiLCJwdXNoIiwib3BlcmF0aW9uIiwiam9pbiIsInVzZXJDb2RlIiwiQWRkTlBhY2tlZFByb2dyYW0iLCJwYWNrZWRJbnB1dHMiLCJwYWNrZWRPdXRwdXQiLCJBcmdNaW5NYXhQcm9ncmFtIiwicmVkdWNlSW5mbyIsIm9wIiwiZmlyc3RQYXNzIiwid2luZG93U2l6ZSIsImJhdGNoU2l6ZSIsIm91dFNpemUiLCJjb21wT3AiLCJpbmRleFNuaXBwZXQiLCJBcmdNaW5NYXhQYWNrZWRQcm9ncmFtIiwic2hhcGUiLCJhc3NlcnQiLCJsZW5ndGgiLCJjaGFyQXQiLCJ0b1VwcGVyQ2FzZSIsInNsaWNlIiwiaW5TaXplIiwiTWF0aCIsImNlaWwiLCJvdXRTaGFwZSIsInJhbmsiLCJkdHlwZSIsImNvb3JkcyIsInNvdXJjZUxvY1NldHVwIiwic291cmNlUmFuayIsInNvdXJjZUxvY0RUeXBlIiwiY2hhbm5lbHMiLCJpbkNoYW5uZWwiLCJpbnRDaGFubmVscyIsIngiLCJzcmNSQ29vcmRzIiwiY29uY2F0Iiwic3JjR0Nvb3JkcyIsInNyY0JDb29yZHMiLCJzcmNBQ29vcmRzIiwiZmV0Y2hDYW5kaWRhdGVJZHgiLCJmZXRjaFZhbHVlIiwiZ2V0QmVzdEluZGljZXNBQ2hhbm5lbFNuaXBwZXQiLCJBdmdQb29sMkRCYWNrcHJvcFByb2dyYW0iLCJjb252SW5mbyIsImluU2hhcGUiLCJmaWx0ZXJIZWlnaHQiLCJmaWx0ZXJXaWR0aCIsInN0cmlkZUhlaWdodCIsInN0cmlkZVdpZHRoIiwiZGlsYXRpb25IZWlnaHQiLCJkaWxhdGlvbldpZHRoIiwiZWZmZWN0aXZlRmlsdGVySGVpZ2h0IiwiZWZmZWN0aXZlRmlsdGVyV2lkdGgiLCJwYWRUb3AiLCJwYWRJbmZvIiwidG9wIiwicGFkTGVmdCIsImxlZnQiLCJhdmdNdWx0aXBsaWVyIiwib3V0SGVpZ2h0Iiwib3V0V2lkdGgiLCJBdmdQb29sM0RCYWNrcHJvcFByb2dyYW0iLCJmaWx0ZXJEZXB0aCIsInN0cmlkZURlcHRoIiwiZGlsYXRpb25EZXB0aCIsImVmZmVjdGl2ZUZpbHRlckRlcHRoIiwicGFkRnJvbnQiLCJmcm9udCIsIm91dERlcHRoIiwid2hlcmVJbXBsIiwiRVBTSUxPTl9GTE9BVDMyIiwiRVBTSUxPTl9GTE9BVDE2IiwiYmluYXJ5Q2FjaGVzIiwiZ2V0QmluYXJ5Q2FjaGUiLCJ3ZWJHTFZlcnNpb24iLCJDUFVfSEFORE9GRl9TSVpFX1RIUkVTSE9MRCIsImdldE51bWJlciIsIk1hdGhCYWNrZW5kV2ViR0wiLCJncGdwdSIsInN1cGVyIiwicGVuZGluZ1JlYWQiLCJXZWFrTWFwIiwicGVuZGluZ0Rpc3Bvc2FsIiwiV2Vha1NldCIsImRhdGFSZWZDb3VudCIsIm51bUJ5dGVzSW5HUFUiLCJ1cGxvYWRXYWl0TXMiLCJkb3dubG9hZFdhaXRNcyIsImxhc3RHbEZsdXNoVGltZSIsIndhcm5lZEFib3V0TWVtb3J5IiwicGVuZGluZ0RlbGV0ZXMiLCJkaXNwb3NlZCIsImdldEJvb2wiLCJFcnJvciIsImdsIiwiYmluYXJ5Q2FjaGUiLCJjYW52YXMiLCJncGdwdUNyZWF0ZWRMb2NhbGx5IiwidGV4dHVyZU1hbmFnZXIiLCJudW1NQkJlZm9yZVdhcm5pbmciLCJnbG9iYWwiLCJzY3JlZW4iLCJoZWlnaHQiLCJ3aWR0aCIsIndpbmRvdyIsImRldmljZVBpeGVsUmF0aW8iLCJ0ZXhEYXRhIiwibmV4dERhdGFJZCIsIm51bURhdGFJZHMiLCJ3cml0ZSIsInZhbHVlcyIsImNoZWNrTnVtZXJpY2FsUHJvYmxlbXMiLCJkYXRhSWQiLCJpZCIsInNldCIsInVzYWdlIiwiVVBMT0FEIiwicmVmQ291bnQiLCJoYXMiLCJpbmNSZWYiLCJkZWNSZWYiLCJtb3ZlIiwiZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8iLCJ0ZW5zb3JJbmZvIiwiZGlzcG9zZURhdGEiLCJyZWFkU3luYyIsImNvbXBsZXhUZW5zb3JJbmZvcyIsImlzUGFja2VkIiwicHJvZ3JhbSIsInJlcyIsInJ1bldlYkdMUHJvZ3JhbSIsImRhdGEiLCJjb252ZXJ0QW5kQ2FjaGVPbkNQVSIsInNob3VsZFRpbWVQcm9ncmFtIiwiYWN0aXZlVGltZXJzIiwic3RhcnQiLCJyZXN1bHQiLCJub3ciLCJyZWFsVmFsdWVzIiwicmVhbCIsImltYWdWYWx1ZXMiLCJpbWFnIiwibWVyZ2VSZWFsQW5kSW1hZ0FycmF5cyIsImdldFZhbHVlc0Zyb21UZXh0dXJlIiwic3Vic2NyaWJlcnMiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlYWQiLCJ0bXBEb3dubG9hZFRhcmdldCIsInZhbHMiLCJidWZmZXIiLCJkZWNvZGUiLCJ0bXBEYXRhIiwiY3JlYXRlQnVmZmVyRnJvbVRleHR1cmUiLCJ0ZXh0dXJlIiwiY3JlYXRlQW5kV2FpdEZvckZlbmNlIiwicHMiLCJhbGwiLCJzaXplIiwic2l6ZUZyb21TaGFwZSIsImRvd25sb2FkRmxvYXQzMk1hdHJpeEZyb21CdWZmZXIiLCJkZWxldGVCdWZmZXIiLCJkVHlwZVZhbHMiLCJkZWxldGUiLCJyZW1vdmVEYXRhSWQiLCJidWZmZXJTeW5jIiwiZGVjb2RlZERhdGEiLCJkZWNvZGVTdHJpbmciLCJudW0iLCJ0bXBUYXJnZXQiLCJkb3dubG9hZE1hdHJpeEZyb21QYWNrZWRUZXh0dXJlIiwic3ViYXJyYXkiLCJzaG91bGRVc2VQYWNrZWRQcm9ncmFtIiwib3V0cHV0IiwiZG93bmxvYWRCeXRlRW5jb2RlZEZsb2F0TWF0cml4RnJvbU91dHB1dFRleHR1cmUiLCJ0ZXhTaGFwZSIsInRpbWVyQXZhaWxhYmxlIiwiZiIsIm9sZEFjdGl2ZVRpbWVycyIsIm5ld0FjdGl2ZVRpbWVycyIsIm91dGVyTW9zdFRpbWUiLCJwcm9ncmFtVGltZXJzU3RhY2siLCJmbGF0dGVuZWRBY3RpdmVUaW1lclF1ZXJpZXMiLCJmbGF0dGVuIiwicXVlcnkiLCJmaWx0ZXIiLCJmbGF0dGVuZWRBY3RpdmVUaW1lck5hbWVzIiwia2VybmVsTXMiLCJ3YWxsTXMiLCJzdW0iLCJtcyIsImVycm9yIiwibWVtb3J5IiwidW5yZWxpYWJsZSIsIm51bUJ5dGVzSW5HUFVBbGxvY2F0ZWQiLCJudW1CeXRlc0FsbG9jYXRlZCIsIm51bUJ5dGVzSW5HUFVGcmVlIiwibnVtQnl0ZXNGcmVlIiwic3RhcnRUaW1lciIsImJlZ2luUXVlcnkiLCJzdGFydE1zIiwiZW5kTXMiLCJlbmRUaW1lciIsImVuZFF1ZXJ5Iiwid2FpdEZvclF1ZXJ5QW5kR2V0VGltZSIsInRpbWVyUXVlcnkiLCJmb3JjZSIsImFkZCIsInJlbGVhc2VHUFVEYXRhIiwib3JpZ0RhdGFJZCIsImNvbXB1dGVCeXRlcyIsInJlbGVhc2VUZXh0dXJlIiwiZ2V0VGV4dHVyZSIsInVwbG9hZFRvR1BVIiwiZ2V0RGF0YUluZm8iLCJzaG91bGRFeGVjdXRlT25DUFUiLCJpbnB1dHMiLCJzaXplVGhyZXNob2xkIiwiZXZlcnkiLCJpbnB1dCIsImdldEdQR1BVQ29udGV4dCIsIndoZXJlIiwiY29uZGl0aW9uIiwid2FybiIsImNvbmRWYWxzIiwiZGF0YVN5bmMiLCJwYWNrZWRVbmFyeU9wIiwib3V0SW5mbyIsImNvbXBpbGVBbmRSdW4iLCJtYWtlVGVuc29yRnJvbURhdGFJZCIsImFicyIsIm91dFZhbHVlcyIsIm1ha2VPdXRwdXQiLCJtYWtlVGVuc29ySW5mbyIsImlzU3RyaW5nIiwiZW5jb2RlZFZhbHVlcyIsImVuY29kZVN0cmluZyIsInVucGFja1RlbnNvciIsInBhY2tUZW5zb3IiLCJwYWNrZWRSZXNoYXBlIiwiYWZ0ZXJTaGFwZSIsImlucHV0M0RTaGFwZSIsImlucHV0M0QiLCJhZnRlclNoYXBlQXMzRCIsImN1c3RvbVZhbHVlcyIsInNoYXBlQXMzRCIsImRlbnNlVGV4U2hhcGUiLCJvdXRwdXREdHlwZSIsImN1c3RvbVVuaWZvcm1WYWx1ZXMiLCJwcmV2ZW50RWFnZXJVbnBhY2tpbmdPZk91dHB1dCIsIm91dERhdGEiLCJvdXRQYWNraW5nU2NoZW1lIiwiREVOU0UiLCJ0ZXhlbFNoYXBlIiwib3V0VGV4VXNhZ2UiLCJnZXRUeXBlZEFycmF5RnJvbURUeXBlIiwiZGF0YVRvRGlzcG9zZSIsImlucHV0c0RhdGEiLCJpc1VuaWZvcm0iLCJ1bmlmb3JtVmFsdWVzIiwic2F2ZWRJbnB1dCIsInRhcmdldFNoYXBlIiwib3V0cHV0RGF0YSIsImJpbmFyeSIsImdldEFuZFNhdmVCaW5hcnkiLCJpbmZvIiwiZ2V0UXVlcnlUaW1lIiwiZ2xGbHVzaFRocmVzaG9sZCIsInRpbWUiLCJmbHVzaCIsInVucGFja2VkIiwiZ2V0QmluYXJ5IiwiZ2V0VGV4dHVyZU1hbmFnZXIiLCJkaXNwb3NlIiwia2V5cyIsImRlbGV0ZVByb2dyYW0iLCJ3ZWJHTFByb2dyYW0iLCJIVE1MQ2FudmFzRWxlbWVudCIsInJlbW92ZSIsImZsb2F0UHJlY2lzaW9uIiwiZmxvYXRQcmVjaXNpb25WYWx1ZSIsImRlYnVnRmxhZyIsInVuZGVyZmxvd0NoZWNrVmFsdWUiLCJlcHNpbG9uIiwiaXNCeXRlQXJyYXkiLCJVaW50OEFycmF5IiwidGVtcERlbnNlSW5wdXRIYW5kbGUiLCJQSVhFTFMiLCJ1cGxvYWREZW5zZU1hdHJpeFRvVGV4dHVyZSIsInByZXZlbnRFYWdlclVucGFja2luZyIsImVuY29kZWRPdXRwdXRUYXJnZXQiLCJvdXRwdXRUZXhEYXRhIiwibmV3VGV4dHVyZSIsImFjcXVpcmVUZXh0dXJlIiwiZmxvYXQzMlZhbHVlcyIsImEiLCJJbnQzMkFycmF5Iiwicm91bmQiLCJmbG9hdDMyVG9UeXBlZEFycmF5IiwidGV4VHlwZSIsIm1iIiwidG9GaXhlZCIsImNvbnNvbGUiLCJieXRlc1BlckVsZW1lbnQiLCJpc0Jyb3dzZXIiLCJ3ZWJnbCIsImZvcmNlSGFsZkZsb2F0IiwiQmF0Y2hOb3JtUHJvZ3JhbSIsInhTaGFwZSIsIm1lYW5TaGFwZSIsInZhcmlhbmNlU2hhcGUiLCJvZmZzZXRTaGFwZSIsInNjYWxlU2hhcGUiLCJ2YXJpYW5jZUVwc2lsb24iLCJhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSIsIm9mZnNldFNuaXBwZXQiLCJzY2FsZVNuaXBwZXQiLCJCYXRjaE5vcm1QYWNrZWRQcm9ncmFtIiwiQ09NUExFWF9NVUxUSVBMWSIsIlJFQUwiLCJJTUFHIiwiQmluYXJ5T3BDb21wbGV4UHJvZ3JhbSIsImFTaGFwZSIsImJTaGFwZSIsIkNIRUNLX05BTl9TTklQUEVUIiwiU1FVQVJFRF9ESUZGRVJFTkNFIiwiQmluYXJ5T3BQcm9ncmFtIiwiZW5hYmxlU2hhcGVVbmlmb3JtcyIsIkVMVV9ERVIiLCJOT1RfRVFVQUwiLCJCaW5hcnlPcFBhY2tlZFByb2dyYW0iLCJjaGVja091dE9mQm91bmRzIiwic3VwcG9ydHNCcm9hZGNhc3RpbmciLCJjaGVja091dE9mQm91bmRzU3RyaW5nIiwiY29udGV4dHMiLCJXRUJHTF9BVFRSSUJVVEVTIiwiYWxwaGEiLCJhbnRpYWxpYXMiLCJwcmVtdWx0aXBsaWVkQWxwaGEiLCJwcmVzZXJ2ZURyYXdpbmdCdWZmZXIiLCJkZXB0aCIsInN0ZW5jaWwiLCJmYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0IiwiY2xlYXJXZWJHTENvbnRleHQiLCJzZXRXZWJHTENvbnRleHQiLCJnZXRXZWJHTENvbnRleHQiLCJuZXdDdHgiLCJPZmZzY3JlZW5DYW52YXMiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJjcmVhdGVDYW52YXMiLCJhZGRFdmVudExpc3RlbmVyIiwiZXYiLCJwcmV2ZW50RGVmYXVsdCIsImdldENvbnRleHQiLCJnZXRXZWJHTFJlbmRlcmluZ0NvbnRleHQiLCJsb2ciLCJpc0NvbnRleHRMb3N0IiwiZGlzYWJsZSIsIkRFUFRIX1RFU1QiLCJTVEVOQ0lMX1RFU1QiLCJCTEVORCIsIkRJVEhFUiIsIlBPTFlHT05fT0ZGU0VUX0ZJTEwiLCJTQU1QTEVfQ09WRVJBR0UiLCJlbmFibGUiLCJTQ0lTU09SX1RFU1QiLCJDVUxMX0ZBQ0UiLCJjdWxsRmFjZSIsIkJBQ0siLCJDbGlwUHJvZ3JhbSIsImN1c3RvbVVuaWZvcm1zIiwidHlwZSIsIkNsaXBQYWNrZWRQcm9ncmFtIiwiQ29tcGxleEFic1Byb2dyYW0iLCJDb25jYXRQcm9ncmFtIiwiY29tcHV0ZU91dFNoYXBlIiwib2Zmc2V0cyIsIkFycmF5Iiwic2hpZnQiLCJsYXN0SW5kZXgiLCJsYXN0U2hpZnQiLCJDb25jYXRQYWNrZWRQcm9ncmFtIiwiYXhpcyIsImNoYW5uZWwiLCJsYXN0Q2hhbm5lbHMiLCJhbGxDaGFubmVscyIsImdldFZhbHVlU25pcHBldCIsInNoaWZ0ZWRDaGFubmVscyIsImNoYW5uZWxJZHgiLCJpbmRleE9mIiwiaWR4IiwiQ29udjJERGVyRmlsdGVyUHJvZ3JhbSIsImZpbHRlclNoYXBlIiwiaXNDaGFubmVsc0xhc3QiLCJkYXRhRm9ybWF0IiwiaW5IZWlnaHQiLCJpbldpZHRoIiwiQ29udjJERGVySW5wdXRQcm9ncmFtIiwicm93RGltIiwiY29sRGltIiwiY2hhbm5lbERpbSIsIm91dENoYW5uZWxzIiwiQ29udjNERGVyRmlsdGVyUHJvZ3JhbSIsImluRGVwdGgiLCJDb252M0REZXJJbnB1dFByb2dyYW0iLCJEZXB0aHdpc2VDb252MkREZXJGaWx0ZXJQcm9ncmFtIiwiY2hhbm5lbE11bCIsImluQ2hhbm5lbHMiLCJEZXB0aHdpc2VDb252MkREZXJJbnB1dFByb2dyYW0iLCJDb252MkRQcm9ncmFtIiwiYWRkQmlhcyIsImFjdGl2YXRpb24iLCJoYXNQcmVsdUFjdGl2YXRpb25XZWlnaHRzIiwiaGFzTGVha3lyZWx1QWxwaGEiLCJpbnB1dERlcHRoTmVhcmVzdFZlYzQiLCJmbG9vciIsImlucHV0RGVwdGhWZWM0UmVtYWluZGVyIiwiYWN0aXZhdGlvblNuaXBwZXQiLCJhcHBseUFjdGl2YXRpb25TbmlwcGV0IiwiYWRkQmlhc1NuaXBwZXQiLCJDb252M0RQcm9ncmFtIiwiRGVwdGh3aXNlQ29udjJEUHJvZ3JhbSIsImhhc1ByZWx1QWN0aXZhdGlvbiIsImhhc0xlYWt5UmVsdUFscGhhIiwiRGVwdGh3aXNlQ29udlBhY2tlZDJEUHJvZ3JhbSIsInRleGVsc0Fjcm9zcyIsIm1haW5Mb29wIiwidGV4ZWxDIiwiY29sSW5kZXgiLCJuZXh0VGV4ZWxPZmZzZXQiLCJuZWFyZXN0TGFyZ2VyRXZlbiIsIkNyb3BBbmRSZXNpemVQcm9ncmFtIiwiaW1hZ2VTaGFwZSIsImJveFNoYXBlIiwiY3JvcFNpemUiLCJtZXRob2QiLCJleHRyYXBvbGF0aW9uVmFsdWUiLCJiYXRjaCIsImltYWdlSGVpZ2h0IiwiaW1hZ2VXaWR0aCIsIm51bUJveGVzIiwiY3JvcEhlaWdodCIsImNyb3BXaWR0aCIsIm1ldGhvZElkIiwiaW5wdXRIZWlnaHRGbG9hdCIsImlucHV0V2lkdGhGbG9hdCIsImhlaWdodFJhdGlvIiwiaGVpZ2h0U2NhbGUiLCJpblkiLCJ3aWR0aFJhdGlvIiwid2lkdGhTY2FsZSIsImluWCIsIkN1bVN1bVByb2dyYW0iLCJleGNsdXNpdmUiLCJyZXZlcnNlIiwidmFsIiwiZ2V0Q29vcmRzIiwiaWR4U3RyaW5nIiwiZ2V0RmluYWxDb29yZCIsIkRlY29kZU1hdHJpeFByb2dyYW0iLCJnbHNsIiwiRGVjb2RlTWF0cml4UGFja2VkUHJvZ3JhbSIsIkRlcHRoVG9TcGFjZVByb2dyYW0iLCJibG9ja1NpemUiLCJnZXRIZWlnaHRDb29yZFN0cmluZyIsImdldFdpZHRoQ29vcmRTdHJpbmciLCJnZXREZXB0aENvb3JkU3RyaW5nIiwiZ2V0T3V0cHV0RGVwdGhTaXplIiwiZ2V0SW5wdXRTYW1wbGluZ1N0cmluZyIsIkRpYWdQcm9ncmFtIiwiRGlsYXRpb24yRFByb2dyYW0iLCJFbmNvZGVGbG9hdFByb2dyYW0iLCJET1dOTE9BRCIsIkVuY29kZUZsb2F0UGFja2VkUHJvZ3JhbSIsIkVuY29kZU1hdHJpeFByb2dyYW0iLCJpbnB1dElzVW5zaWduZWRCeXRlIiwidGV4dHVyZTJEIiwiRW5jb2RlTWF0cml4UGFja2VkUHJvZ3JhbSIsInJvdyIsImNvbCIsIkZGVFByb2dyYW0iLCJjb21wb25lbnQiLCJpbnB1dFNoYXBlIiwiaW52ZXJzZSIsImlubmVyRGltIiwiZXhwb25lbnRNdWx0aXBsaWVyU25pcHBldCIsIlBJIiwicmVzdWx0RGVub21pbmF0b3IiLCJvcFN0cmluZyIsIkZpbGxQcm9ncmFtIiwiRU5WIiwicmVnaXN0ZXJGbGFnIiwiaXNNb2JpbGUiLCJ0aHJlc2hvbGQiLCJGbGlwTGVmdFJpZ2h0UHJvZ3JhbSIsIkdhdGhlclByb2dyYW0iLCJzb3VyY2VDb29yZHMiLCJjdXJyZW50Q29vcmRzIiwiZ2V0U291cmNlQ29vcmRzIiwiR2F0aGVyTkRQcm9ncmFtIiwic2xpY2VEaW0iLCJzdHJpZGVzIiwic3RyaWRlc1R5cGUiLCJzdHJpZGVTdHJpbmciLCJnZXRHbHNsRGlmZmVyZW5jZXMiLCJ2ZXJzaW9uIiwiYXR0cmlidXRlIiwidmFyeWluZ1ZzIiwidmFyeWluZ0ZzIiwiZGVmaW5lT3V0cHV0IiwiZGVmaW5lU3BlY2lhbE5hTiIsImRlZmluZVNwZWNpYWxJbmYiLCJkZWZpbmVSb3VuZCIsIkdQR1BVQ29udGV4dCIsIm91dHB1dFRleHR1cmUiLCJ2ZXJ0ZXhBdHRyc0FyZUJvdW5kIiwiaXRlbXNUb1BvbGwiLCJnbFZlcnNpb24iLCJDT0xPUl9CVUZGRVJfRkxPQVQiLCJDT0xPUl9CVUZGRVJfSEFMRl9GTE9BVCIsIlRFWFRVUkVfRkxPQVQiLCJURVhUVVJFX0hBTEZfRkxPQVQiLCJ0ZXh0dXJlRmxvYXRFeHRlbnNpb24iLCJ0ZXh0dXJlSGFsZkZsb2F0RXh0ZW5zaW9uIiwiY29sb3JCdWZmZXJGbG9hdEV4dGVuc2lvbiIsImdldEV4dGVuc2lvbiIsImNvbG9yQnVmZmVySGFsZkZsb2F0RXh0ZW5zaW9uIiwidmVydGV4QnVmZmVyIiwiaW5kZXhCdWZmZXIiLCJmcmFtZWJ1ZmZlciIsInRleHR1cmVDb25maWciLCJmaW5pc2giLCJiaW5kRnJhbWVidWZmZXIiLCJGUkFNRUJVRkZFUiIsImRlbGV0ZUZyYW1lYnVmZmVyIiwiYmluZEJ1ZmZlciIsIkFSUkFZX0JVRkZFUiIsIkVMRU1FTlRfQVJSQVlfQlVGRkVSIiwiY3JlYXRlRmxvYXQzMk1hdHJpeFRleHR1cmUiLCJyb3dzIiwiY29sdW1ucyIsInRocm93SWZEaXNwb3NlZCIsImNyZWF0ZUZsb2F0MTZNYXRyaXhUZXh0dXJlIiwiY3JlYXRlVW5zaWduZWRCeXRlc01hdHJpeFRleHR1cmUiLCJ1cGxvYWRQaXhlbERhdGFUb1RleHR1cmUiLCJwaXhlbHMiLCJjcmVhdGVGbG9hdDE2UGFja2VkTWF0cml4VGV4dHVyZSIsImNyZWF0ZVBhY2tlZE1hdHJpeFRleHR1cmUiLCJkZWxldGVNYXRyaXhUZXh0dXJlIiwiZGVsZXRlVGV4dHVyZSIsImRvd25sb2FkTWF0cml4RHJpdmVyIiwiZG93bmxvYWRQYWNrZWRNYXRyaXhGcm9tQnVmZmVyIiwicGh5c2ljYWxSb3dzIiwicGh5c2ljYWxDb2xzIiwiYmluZFRleHR1cmVUb0ZyYW1lQnVmZmVyIiwidW5iaW5kVGV4dHVyZVRvRnJhbWVCdWZmZXIiLCJmZW5jZUNvbnRleHQiLCJjcmVhdGVGZW5jZSIsInBvbGxGZW5jZSIsImlzRmVuY2VQYXNzZWQiLCJnbDIiLCJzeW5jIiwiZmVuY2VTeW5jIiwiU1lOQ19HUFVfQ09NTUFORFNfQ09NUExFVEUiLCJzdGF0dXMiLCJjbGllbnRXYWl0U3luYyIsIkFMUkVBRFlfU0lHTkFMRUQiLCJDT05ESVRJT05fU0FUSVNGSUVEIiwiaXNRdWVyeUF2YWlsYWJsZSIsImNyZWF0ZVByb2dyYW0iLCJmcmFnbWVudFNoYWRlclNvdXJjZSIsImZyYWdtZW50U2hhZGVyIiwidmVydGV4U2hhZGVyIiwiYXR0YWNoU2hhZGVyIiwiZGVidWciLCJzZXRQcm9ncmFtIiwidXNlUHJvZ3JhbSIsImdldFVuaWZvcm1Mb2NhdGlvbiIsInVuaWZvcm1OYW1lIiwic2hvdWxkVGhyb3ciLCJnZXRBdHRyaWJ1dGVMb2NhdGlvbiIsImdldEF0dHJpYkxvY2F0aW9uIiwiZ2V0VW5pZm9ybUxvY2F0aW9uTm9UaHJvdyIsInNldElucHV0TWF0cml4VGV4dHVyZSIsImlucHV0TWF0cml4VGV4dHVyZSIsInVuaWZvcm1Mb2NhdGlvbiIsInRleHR1cmVVbml0IiwidGhyb3dJZk5vUHJvZ3JhbSIsInNldE91dHB1dE1hdHJpeFRleHR1cmUiLCJvdXRwdXRNYXRyaXhUZXh0dXJlIiwic2V0T3V0cHV0TWF0cml4VGV4dHVyZURyaXZlciIsInNldE91dHB1dFBhY2tlZE1hdHJpeFRleHR1cmUiLCJvdXRwdXRQYWNrZWRNYXRyaXhUZXh0dXJlIiwic2V0T3V0cHV0TWF0cml4V3JpdGVSZWdpb24iLCJzdGFydFJvdyIsIm51bVJvd3MiLCJzdGFydENvbHVtbiIsIm51bUNvbHVtbnMiLCJzZXRPdXRwdXRNYXRyaXhXcml0ZVJlZ2lvbkRyaXZlciIsInNldE91dHB1dFBhY2tlZE1hdHJpeFdyaXRlUmVnaW9uIiwiZGVidWdWYWxpZGF0ZSIsImV4ZWN1dGVQcm9ncmFtIiwiZHJhd0VsZW1lbnRzIiwiVFJJQU5HTEVTIiwiVU5TSUdORURfU0hPUlQiLCJibG9ja1VudGlsQWxsUHJvZ3JhbXNDb21wbGV0ZWQiLCJnZXRRdWVyeVRpbWVyRXh0ZW5zaW9uIiwiZGlzam9pbnRRdWVyeVRpbWVyRXh0ZW5zaW9uIiwiZ2V0UXVlcnlUaW1lckV4dGVuc2lvbldlYkdMMiIsImdldFF1ZXJ5VGltZXJFeHRlbnNpb25XZWJHTDEiLCJleHQiLCJjcmVhdGVRdWVyeSIsIlRJTUVfRUxBUFNFRF9FWFQiLCJjcmVhdGVRdWVyeUVYVCIsImJlZ2luUXVlcnlFWFQiLCJlbmRRdWVyeUVYVCIsInJlcGVhdGVkVHJ5IiwicXVlcnlUaW1lclZlcnNpb24iLCJnZXRRdWVyeVBhcmFtZXRlciIsIlFVRVJZX1JFU1VMVCIsImdldFF1ZXJ5T2JqZWN0RVhUIiwiUVVFUllfUkVTVUxUX0VYVCIsImF2YWlsYWJsZSIsIlFVRVJZX1JFU1VMVF9BVkFJTEFCTEUiLCJkaXNqb2ludCIsImdldFBhcmFtZXRlciIsIkdQVV9ESVNKT0lOVF9FWFQiLCJRVUVSWV9SRVNVTFRfQVZBSUxBQkxFX0VYVCIsImFkZEl0ZW1Ub1BvbGwiLCJwb2xsSXRlbXMiLCJpbmRleCIsImxpbmVhclNlYXJjaExhc3RUcnVlIiwiaXNEb25lRm4iLCJyZXNvbHZlRm4iLCJkb3dubG9hZEFuZERlY29kZSIsIm91dHB1dE1hdHJpeFRleHR1cmVNYXliZVBhY2tlZCIsInZpZXdwb3J0Iiwic2Npc3NvciIsInkiLCJhcnIiLCJjb21waWxlUHJvZ3JhbSIsImlucHV0SW5mb3MiLCJzaGFwZUluZm8iLCJsb2dpY2FsU2hhcGUiLCJmbGF0T2Zmc2V0IiwiaW5TaGFwZUluZm9zIiwib3V0U2hhcGVJbmZvIiwic291cmNlIiwiaW5mTG9jIiwibmFuTG9jIiwidW5pZm9ybUxvY2F0aW9ucyIsImluU2hhcGVzTG9jYXRpb25zIiwiaW5UZXhTaGFwZXNMb2NhdGlvbnMiLCJ2YXJOYW1lIiwib3V0U2hhcGVMb2NhdGlvbiIsIm91dFRleFNoYXBlTG9jYXRpb24iLCJvdXRTaGFwZVN0cmlkZXNMb2NhdGlvbiIsImN1c3RvbVVuaWZvcm1Mb2NhdGlvbnMiLCJ2YWxpZGF0ZUJpbmFyeUFuZFByb2dyYW0iLCJzaGFwZUluZm9zIiwic2hhcGVBIiwic2hhcGVCIiwiYXJyYXlzRXF1YWwiLCJ0ZXhTaGFwZUEiLCJ0ZXhTaGFwZUIiLCJydW5Qcm9ncmFtIiwib3V0VGV4Iiwib3V0VGV4U2hhcGUiLCJ1bmlmb3JtMWYiLCJJbmZpbml0eSIsIk5hTiIsInZhckxvYyIsInZhck9mZnNldExvYyIsInZhclNoYXBlTG9jIiwidmFyVGV4U2hhcGVMb2MiLCJ1bmlmb3JtU2hhcGUiLCJ1bmlmb3JtMWl2IiwidW5pZm9ybTJpdiIsInVuaWZvcm0zaXYiLCJ1bmlmb3JtNGl2IiwidW5pZm9ybTJpIiwiRmxvYXQzMkFycmF5IiwidW5pZm9ybTFmdiIsInVuaWZvcm0xaSIsIm91dFNoYXBlTG9jIiwiY29tcHV0ZVN0cmlkZXMiLCJjdXN0b21Mb2MiLCJjdXN0b21WYWx1ZSIsInVuaWZvcm0yZnYiLCJ1bmlmb3JtM2Z2IiwidW5pZm9ybTRmdiIsIm1ha2VTaGFkZXJLZXkiLCJrZXlJbnB1dHMiLCJoYXNPZmZzZXQiLCJ4VGV4U2hhcGUiLCJ1c2VTcXVlZXplU2hhcGUiLCJrZXB0RGltcyIsInJhbmsxIiwicmFuazIiLCJyYW5rMzQiLCJwYWNrZWRUZXhTaGFwZSIsInhSYW5rIiwiaXNMb2dpY2FsU2hhcFRleFNoYXBlRXF1YWwiLCJpc1NjYWxhciIsImJyb2FkY2FzdERpbXMiLCJnZXRCcm9hZGNhc3REaW1zIiwiaXNJbk91dFRleFNoYXBlRXF1YWwiLCJpc1RleFNoYXBlR3JlYXRlclRoYW5PbmUiLCJrZXlVc2VyQ29kZSIsInVzZVNoYXBlVW5pZm9ybXMiLCJjcmVhdGVWZXJ0ZXhTaGFkZXIiLCJ2ZXJ0ZXhTaGFkZXJTb3VyY2UiLCJjcmVhdGVWZXJ0ZXhCdWZmZXIiLCJ2ZXJ0ZXhBcnJheSIsImNyZWF0ZUluZGV4QnVmZmVyIiwidHJpYW5nbGVWZXJ0ZXhJbmRpY2VzIiwiVWludDE2QXJyYXkiLCJjcmVhdGVBbmRDb25maWd1cmVUZXh0dXJlIiwiaW50ZXJuYWxGb3JtYXQiLCJ0ZXh0dXJlRm9ybWF0IiwidGV4dHVyZVR5cGUiLCJ0ZXgyZCIsIlRFWFRVUkVfMkQiLCJiaW5kVGV4dHVyZSIsInRleFBhcmFtZXRlcmkiLCJURVhUVVJFX1dSQVBfUyIsIkNMQU1QX1RPX0VER0UiLCJURVhUVVJFX1dSQVBfVCIsIlRFWFRVUkVfTUlOX0ZJTFRFUiIsIk5FQVJFU1QiLCJURVhUVVJFX01BR19GSUxURVIiLCJ0ZXhJbWFnZTJEIiwiZ2V0SW50ZXJuYWxGb3JtYXRGb3JGbG9hdDMyTWF0cml4VGV4dHVyZSIsImludGVybmFsRm9ybWF0RmxvYXQiLCJ0ZXh0dXJlRm9ybWF0RmxvYXQiLCJGTE9BVCIsImdldEludGVybmFsRm9ybWF0Rm9yRmxvYXQxNk1hdHJpeFRleHR1cmUiLCJpbnRlcm5hbEZvcm1hdEhhbGZGbG9hdCIsInRleHR1cmVUeXBlSGFsZkZsb2F0IiwiZ2V0SW50ZXJuYWxGb3JtYXRGb3JVbnNpZ25lZEJ5dGVzTWF0cml4VGV4dHVyZSIsImRvd25sb2FkVGV4dHVyZUZvcm1hdCIsIlJHQkEiLCJVTlNJR05FRF9CWVRFIiwiZ2V0SW50ZXJuYWxGb3JtYXRGb3JQYWNrZWRNYXRyaXhUZXh0dXJlIiwiaW50ZXJuYWxGb3JtYXRQYWNrZWRGbG9hdCIsImdldEludGVybmFsRm9ybWF0Rm9yRmxvYXQxNlBhY2tlZE1hdHJpeFRleHR1cmUiLCJpbnRlcm5hbEZvcm1hdFBhY2tlZEhhbGZGbG9hdCIsImJpbmRWZXJ0ZXhQcm9ncmFtQXR0cmlidXRlU3RyZWFtcyIsImRhdGFGb3JVcGxvYWQiLCJ0ZXhlbERhdGFUeXBlIiwiY3JlYXRlQnVmZmVyRnJvbU91dHB1dFRleHR1cmUiLCJjcmVhdGVCdWZmZXIiLCJQSVhFTF9QQUNLX0JVRkZFUiIsImJ1ZmZlclNpemVCeXRlcyIsImJ5dGVzUGVyRmxvYXQiLCJidWZmZXJEYXRhIiwiU1RSRUFNX1JFQUQiLCJyZWFkUGl4ZWxzIiwiZG93bmxvYWRUYXJnZXQiLCJnZXRCdWZmZXJTdWJEYXRhIiwidyIsImgiLCJjb2xzIiwiZG93bmxvYWRNYXRyaXhGcm9tUGFja2VkT3V0cHV0VGV4dHVyZSIsInBhY2tlZFJHQkEiLCJJbTJDb2xQYWNrZWRQcm9ncmFtIiwiYm91bmRzQ2hlY2tpbmdTbmlwcGV0IiwidW5yb2xsZWQiLCJhcmdSZWR1Y2UiLCJiYWNrZW5kIiwicmVkdWNlVHlwZSIsImJlc3RJbmRpY2VzQSIsImNvbXB1dGVPcHRpbWFsV2luZG93U2l6ZSIsImFyZ1JlZHVjZVBhY2tlZCIsImFyZ01pbk1heFJlZHVjZSIsImF4ZXMiLCJhc3NlcnRBeGVzQXJlSW5uZXJNb3N0RGltcyIsImludGVybWVkaWF0ZVRlbnNvckluZm9zIiwieHRleERhdGEiLCJ4VW5QYWNrZWQiLCJyZWR1Y2VTaGFwZSIsImNvbXB1dGVPdXRBbmRSZWR1Y2VTaGFwZXMiLCJhMkQiLCJhdHRycyIsInJlZHVjZWQiLCJyZXNoYXBlZCIsImludCIsIkNIRUNLX05BTl9TTklQUEVUX1VOQVJZIiwiQ0hFQ0tfTkFOX1NOSVBQRVRfQklOQVJZIiwiQ0hFQ0tfTkFOX1NOSVBQRVRfQklOQVJZX1BBQ0tFRCIsInVuYXJ5S2VybmVsRnVuYyIsIm9wU25pcHBldCIsInBhY2tlZE9wU25pcHBldCIsImNwdUtlcm5lbEltcGwiLCJ3ZWJnbEJhY2tlbmQiLCIkZHR5cGUiLCJ4RGF0YSIsImJpbmFyeUtlcm5lbEZ1bmMiLCJzdXBwb3J0c0NvbXBsZXgiLCJiIiwiYURhdGEiLCJiRGF0YSIsImNvbXBsZXhQYXJ0cyIsImFQYXJ0IiwiYlBhcnQiLCJhSGFuZGxlIiwiYkhhbmRsZSIsImNvbXBsZXhPdXRwdXQiLCJhVmFscyIsImJWYWxzIiwiZGVjb2RlZEFWYWxzIiwiZnJvbVVpbnQ4VG9TdHJpbmdBcnJheSIsImRlY29kZWRCVmFscyIsIm91dCIsIm1hcEFjdGl2YXRpb25Ub1NoYWRlclByb2dyYW0iLCJwYWNrZWQiLCJyZWR1Y2UiLCJyZWR1Y3Rpb25UeXBlIiwicmVkdWN0aW9uU3RhZ2VzIiwic3RhZ2VzIiwiZ2V0UmVkdWN0aW9uU3RhZ2VzIiwicHJldmlvdXNSZXN1bHQiLCJhZGRJbXBsIiwiYWRkSW1wbENQVSIsImJpbmNvdW50SW1wbCIsImJpbmNvdW50SW1wbENQVSIsImJpbmNvdW50UmVkdWNlSW1wbCIsImJpbmNvdW50UmVkdWNlSW1wbENQVSIsImNlaWxJbXBsIiwiY2VpbEltcGxDUFUiLCJjb25jYXRJbXBsIiwiY29uY2F0SW1wbENQVSIsImVxdWFsSW1wbCIsImVxdWFsSW1wbENQVSIsImV4cEltcGwiLCJleHBJbXBsQ1BVIiwiZXhwbTFJbXBsIiwiZXhwbTFJbXBsQ1BVIiwiZmxvb3JJbXBsIiwiZmxvb3JJbXBsQ1BVIiwiZ2F0aGVyTmRJbXBsIiwiZ2F0aGVyTmRJbXBsQ1BVIiwiZ2F0aGVyVjJJbXBsIiwiZ2F0aGVyVjJJbXBsQ1BVIiwiZ3JlYXRlckltcGwiLCJncmVhdGVySW1wbENQVSIsImdyZWF0ZXJFcXVhbEltcGwiLCJncmVhdGVyRXF1YWxJbXBsQ1BVIiwibGVzc0ltcGwiLCJsZXNzSW1wbENQVSIsImxlc3NFcXVhbEltcGwiLCJsZXNzRXF1YWxJbXBsQ1BVIiwibGluU3BhY2VJbXBsIiwibGluU3BhY2VJbXBsQ1BVIiwibG9nSW1wbCIsImxvZ0ltcGxDUFUiLCJtYXhJbXBsIiwibWF4SW1wbENQVSIsIm1heGltdW1JbXBsIiwibWF4aW11bUltcGxDUFUiLCJtaW5pbXVtSW1wbCIsIm1pbmltdW1JbXBsQ1BVIiwibXVsdGlwbHlJbXBsIiwibXVsdGlwbHlJbXBsQ1BVIiwibmVnSW1wbCIsIm5lZ0ltcGxDUFUiLCJub3RFcXVhbEltcGwiLCJub3RFcXVhbEltcGxDUFUiLCJwcm9kSW1wbCIsInByb2RJbXBsQ1BVIiwicmFuZ2VJbXBsIiwicmFuZ2VJbXBsQ1BVIiwicnNxcnRJbXBsIiwicnNxcnRJbXBsQ1BVIiwic2lnbW9pZEltcGwiLCJzaWdtb2lkSW1wbENQVSIsInNpbXBsZUFic0ltcGwiLCJzaW1wbGVBYnNJbXBsQ1BVIiwic2xpY2VJbXBsIiwic2xpY2VJbXBsQ1BVIiwic3BhcnNlRmlsbEVtcHR5Um93c0ltcGwiLCJzcGFyc2VGaWxsRW1wdHlSb3dzSW1wbENQVSIsInNwYXJzZVJlc2hhcGVJbXBsIiwic3BhcnNlUmVzaGFwZUltcGxDUFUiLCJzcGFyc2VTZWdtZW50UmVkdWN0aW9uSW1wbCIsInNwYXJzZVNlZ21lbnRSZWR1Y3Rpb25JbXBsQ1BVIiwic3FydEltcGwiLCJzcXJ0SW1wbENQVSIsInN0cmlkZWRTbGljZUltcGwiLCJzdHJpZGVkU2xpY2VJbXBsQ1BVIiwic3RyaW5nTkdyYW1zSW1wbCIsInN0cmluZ05HcmFtc0ltcGxDUFUiLCJzdHJpbmdTcGxpdEltcGwiLCJzdHJpbmdTcGxpdEltcGxDUFUiLCJzdHJpbmdUb0hhc2hCdWNrZXRGYXN0SW1wbCIsInN0cmluZ1RvSGFzaEJ1Y2tldEZhc3RJbXBsQ1BVIiwic3ViSW1wbCIsInN1YkltcGxDUFUiLCJ0aWxlSW1wbCIsInRpbGVJbXBsQ1BVIiwidG9wS0ltcGwiLCJ0b3BLSW1wbENQVSIsInRyYW5zcG9zZUltcGwiLCJ0cmFuc3Bvc2VJbXBsQ1BVIiwidW5pcXVlSW1wbCIsInVuaXF1ZUltcGxDUFUiLCJBQlMiLCJhcmdzIiwiYWJzQ29uZmlnIiwia2VybmVsTmFtZSIsImJhY2tlbmROYW1lIiwia2VybmVsRnVuYyIsIkFDT1MiLCJhY29zIiwiYWNvc0NvbmZpZyIsIkFDT1NIIiwiYWNvc2giLCJhY29zaENvbmZpZyIsIkFERCIsImFkZEtlcm5lbEZ1bmMiLCJhZGRDb25maWciLCJhZGROIiwidGVuc29ycyIsIm1pZEluZGV4IiwibGVmdFNpZGUiLCJyaWdodFNpZGUiLCJkMSIsImQyIiwiYWRkTkNvbmZpZyIsImtlZXBEaW1zIiwib3JpZ0F4ZXMiLCJwYXJzZUF4aXNQYXJhbSIsInBlcm11dGVkQXhlcyIsImdldEF4ZXNQZXJtdXRhdGlvbiIsInBlcm11dGVkWCIsInBlcm0iLCJnZXRJbm5lck1vc3RBeGVzIiwibmV3U2hhcGUiLCJleHBhbmRTaGFwZVRvS2VlcERpbSIsImFsbENvbmZpZyIsImFueSIsImFueUNvbmZpZyIsImFyZ01heCIsIiR4IiwiYXJnTWF4Q29uZmlnIiwiYXJnTWluIiwiYXJnTWluQ29uZmlnIiwiQVNJTiIsImFzaW4iLCJhc2luQ29uZmlnIiwiQVNJTkgiLCJhc2luaCIsImFzaW5oQ29uZmlnIiwiQVRBTiIsImF0YW4iLCJhdGFuQ29uZmlnIiwiQVRBTjIiLCJBVEFOMl9QQUNLRUQiLCJhdGFuMiIsImF0YW4yQ29uZmlnIiwiQVRBTkgiLCJhdGFuaCIsImF0YW5oQ29uZmlnIiwiYXZnUG9vbCIsImZpbHRlclNpemUiLCJwYWQiLCJkaW1Sb3VuZGluZ01vZGUiLCJlaXRoZXJTdHJpZGVzT3JEaWxhdGlvbnNBcmVPbmUiLCJjb21wdXRlUG9vbDJESW5mbyIsImF2Z1Bvb2xQcm9ncmFtIiwiYXZnUG9vbENvbmZpZyIsImF2Z1Bvb2wzRCIsImNvbXB1dGVQb29sM0RJbmZvIiwiYXZnUG9vbDNEQ29uZmlnIiwiYXZnUG9vbDNER3JhZCIsImR5IiwiYXZnUG9vbEJhY2twcm9wUHJvZ3JhbSIsImF2Z1Bvb2xHcmFkM0RDb25maWciLCJhdmdQb29sR3JhZCIsImF2Z1Bvb2xHcmFkQ29uZmlnIiwiYmF0Y2hNYXRNdWwiLCJ0cmFuc3Bvc2VBIiwidHJhbnNwb3NlQiIsImJhdGNoTWF0TXVsQ29uZmlnIiwiTUFUTVVMX1NIQVJFRF9ESU1fVEhSRVNIT0xEIiwiYmF0Y2hNYXRNdWxJbXBsIiwiYmlhcyIsInByZWx1QWN0aXZhdGlvbldlaWdodHMiLCJsZWFreXJlbHVBbHBoYSIsImFSYW5rIiwiYlJhbmsiLCJpbm5lclNoYXBlQSIsImlubmVyU2hhcGVCIiwib3V0ZXJTaGFwZUEiLCJvdXRlclNoYXBlQiIsIm91dGVyRGltc0EiLCJvdXRlckRpbXNCIiwiYmF0Y2hEaW1BIiwiYmF0Y2hEaW1CIiwiYmF0Y2hEaW1zQ29tcGF0aWJsZSIsImEzZFNoYXBlIiwiYjNkU2hhcGUiLCJhM2QiLCJiM2QiLCJpbnRlcm1lZGlhdGVzIiwiYmF0Y2hEaW0iLCJtYXgiLCJzaGFyZWREaW0iLCJoYXNCaWFzIiwiZnVzZWRBY3RpdmF0aW9uIiwiYVZlYyIsImJWZWMiLCJzaG91bGRSZXNoYXBlQiIsImFWZWMzZCIsImJWZWMzZCIsInByb2R1Y3QiLCIkbGVha3lyZWx1QWxwaGEiLCJjcmVhdGVTY2FsYXJWYWx1ZSIsIm91dFJlc2hhcGVkIiwiYmF0Y2hOb3JtIiwibWVhbiIsInZhcmlhbmNlIiwib2Zmc2V0Iiwic2NhbGUiLCJmaW5hbElucHV0cyIsImJhdGNoTm9ybUNvbmZpZyIsImJhdGNoVG9TcGFjZU5EIiwiYmxvY2tTaGFwZSIsImNyb3BzIiwicHJvZCIsImdldFJlc2hhcGVkIiwicGVybXV0ZWQiLCJnZXRQZXJtdXRlZCIsInJlc2hhcGVkUGVybXV0ZWQiLCJnZXRSZXNoYXBlZFBlcm11dGVkIiwic2xpY2VCZWdpbkNvb3JkcyIsImdldFNsaWNlQmVnaW5Db29yZHMiLCJzbGljZVNpemUiLCJnZXRTbGljZVNpemUiLCJ0b0Rpc3Bvc2UiLCJyZXNoYXBlZEludGVybWVkaWF0ZSIsInRyYW5zcG9zZWRJbnRlcm1lZGlhdGUiLCJyZXNoYXBlZEludGVybWVkaWF0ZTIiLCJzbGljZWQiLCJiZWdpbiIsImJhdGNoVG9TcGFjZU5EQ29uZmlnIiwiYmluY291bnQiLCJ3ZWlnaHRzIiwieFZhbHMiLCJ3ZWlnaHRzVmFscyIsIm91dFZhbHMiLCJiaW5jb3VudENvbmZpZyIsImNhc3QiLCJ6ZXJvc1RlbnNvciIsImZsb2F0WCIsInJlYWxQYXJ0IiwiaGFzRW5jb2RpbmdMb3NzIiwiemVyb3NUZW5zb3JJbmZvIiwiYmluYXJ5SW5wdXRzIiwiY2FzdENvbmZpZyIsIkNFSUwiLCJjZWlsQ29uZmlnIiwiY2xpcEJ5VmFsdWUiLCJjbGlwVmFsdWVNaW4iLCJjbGlwVmFsdWVNYXgiLCJjbGlwQnlWYWx1ZUNvbmZpZyIsImNvbXBsZXgiLCJjb21wbGV4SW5mbyIsInJlYWxUZW5zb3JJbmZvIiwiaW1hZ1RlbnNvckluZm8iLCJjb21wbGV4Q29uZmlnIiwibWFrZUNvbXBsZXhDb21wb25lbnRUZW5zb3JJbmZvIiwiY29tcGxleFRlbnNvciIsImNvbXBsZXhQYXJ0IiwiY29tcGxleEFicyIsInByb2dyYW1JbnB1dHMiLCJjb21wbGV4QWJzQ29uZmlnIiwiJGF4aXMiLCIkaW5wdXRzIiwiYXNzZXJ0UGFyYW1zQ29uc2lzdGVudCIsImNvbmNhdENvbmZpZyIsInJlYWxzIiwiaW1hZ3MiLCJyZWFsQ29uY2F0ZWQiLCJpbWFnQ29uY2F0ZWQiLCJydW5PbkNwdSIsInRlbnNvcnMyRCIsImlucHV0c1ZhbFNoYXBlcyIsInNpbXBseUNvbmNhdCIsImZpbmFsT3V0U2hhcGUiLCJjb21wdXRlVGVuc29yczJEIiwicmVzaGFwZWRSZXN1bHQiLCJjb252MmQiLCJkaWxhdGlvbnMiLCIkZGF0YUZvcm1hdCIsImNvbnZlcnRDb252MkREYXRhRm9ybWF0IiwiY29tcHV0ZUNvbnYyREluZm8iLCJjb252MkRDb25maWciLCJjb252MkRCYWNrcHJvcEZpbHRlciIsImNvbnYyREJhY2twcm9wRmlsdGVyQ29uZmlnIiwiY29udjJEQmFja3Byb3BJbnB1dCIsImNvbnYyREJhY2twcm9wSW5wdXRDb25maWciLCJjb252MmRCeU1hdE11bCIsInhUZXhEYXRhIiwic2hhcmVkTWF0TXVsRGltIiwib3V0ZXJTaGFwZVgiLCJvdXRlclNoYXBlRmlsdGVyIiwieFJlc2hhcGVkIiwib3JpZ2luYWxYVGV4RGF0YVNoYXBlIiwiZmlsdGVyUmVzaGFwZWQiLCJwb2ludHdpc2VDb252IiwicG9pbnR3aXNlQ29udlRleERhdGEiLCJjb252MmRXaXRoSW0yUm93IiwibnVtQ29scyIsIngyQ29sU2hhcGUiLCJ4U3F1ZWV6ZWQiLCJ3MlJvdyIsImltMkNvbFByb2dyYW0iLCJpbTJDb2wiLCJpbTJDb2xSZXNoYXBlZCIsIm1hdG11bFByb2dyYW0iLCJjb252M0QiLCJjb21wdXRlQ29udjNESW5mbyIsImNvbnYzRENvbmZpZyIsImNvbnYzREJhY2twcm9wRmlsdGVyVjIiLCJjb252M0RCYWNrcHJvcEZpbHRlclYyQ29uZmlnIiwiY29udjNEQmFja3Byb3BJbnB1dCIsImNvbnYzREJhY2twcm9wSW5wdXRDb25maWciLCJDT1MiLCJjb3MiLCJjb3NDb25maWciLCJjb3NoIiwiY29zaENvbmZpZyIsImNyb3BBbmRSZXNpemUiLCJpbWFnZSIsImJveGVzIiwiYm94SW5kIiwiY3JvcEFuZFJlc2l6ZUNvbmZpZyIsImN1bXN1bSIsInBlcm11dGF0aW9uIiwicGVybXV0ZWRBeGlzIiwibG9nMiIsInByZXZSZXN1bHQiLCJyZXZlcnNlUGVybXV0YXRpb24iLCJnZXRVbmRvQXhlc1Blcm11dGF0aW9uIiwicmV2ZXJzZVRyYW5zcG9zZWRSZXN1bHQiLCJjdW1zdW1Db25maWciLCJkZW5zZUJpbmNvdW50IiwiYmluYXJ5T3V0cHV0IiwieEJ1ZiIsIndlaWdodHNCdWYiLCJvdXRCdWYiLCJkZW5zZUJpbmNvdW50Q29uZmlnIiwiZGVwdGhUb1NwYWNlIiwiaW5wdXRIZWlnaHQiLCJpbnB1dFdpZHRoIiwiaW5wdXREZXB0aCIsIm91dHB1dEhlaWdodCIsIm91dHB1dFdpZHRoIiwib3V0cHV0RGVwdGgiLCJkZXB0aFRvU3BhY2VDb25maWciLCJkZXB0aHdpc2VDb252MmROYXRpdmUiLCIkZGlsYXRpb25zIiwiZGVwdGh3aXNlQ29udjJkTmF0aXZlQ29uZmlnIiwiZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXIiLCJkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlckNvbmZpZyIsImRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXQiLCJkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0Q29uZmlnIiwiZGlhZyIsInhTaXplIiwiZmxhdCIsImRpYWdDb25maWciLCJkaWxhdGlvbjJEIiwiY29tcHV0ZURpbGF0aW9uMkRJbmZvIiwiZGlsYXRpb24yRENvbmZpZyIsImVpbnN1bSIsImVxdWF0aW9uIiwiYWxsRGltcyIsInN1bW1lZERpbXMiLCJpZERpbXMiLCJkZWNvZGVFaW5zdW1FcXVhdGlvbiIsImNoZWNrRWluc3VtRGltU2l6ZXMiLCJwYXRoIiwic3RlcHMiLCJnZXRFaW5zdW1Db21wdXRlUGF0aCIsIm5TdGVwcyIsIm51bURpbXNSZW1haW5pbmciLCJ0ZW5zb3JzVG9EaXNwb3NlIiwiaWRUZXJtIiwicGVybXV0YXRpb25JbmRpY2VzIiwiZXhwYW5kRGltcyIsImRpbXNUb0V4cGFuZCIsImdldEVpbnN1bVBlcm11dGF0aW9uIiwiaXNJZGVudGl0eVBlcm11dGF0aW9uIiwiayIsInNwbGljZSIsImVpbnN1bUNvbmZpZyIsImVsdSIsImVsdUNvbmZpZyIsImVsdUdyYWQiLCJlbHVHcmFkQ29uZmlnIiwiZXF1YWwiLCJlcXVhbENvbmZpZyIsIkVSRiIsIkVSRl9QIiwiRVJGX0ExIiwiRVJGX0EyIiwiRVJGX0EzIiwiRVJGX0E0IiwiRVJGX0E1IiwiZXJmIiwiZXJmQ29uZmlnIiwiRVhQIiwiZXhwIiwiZXhwQ29uZmlnIiwiZGltIiwiaW5wdXRSYW5rIiwiJGRpbSIsImV4cGFuZERpbXNDb25maWciLCJFWFBNMSIsImV4cG0xIiwiZXhwbTFDb25maWciLCJmZnQiLCJmZnRDb25maWciLCJmZnRJbXBsIiwiaW5wdXRTaXplIiwiaW5uZXJEaW1lbnNpb25TaXplIiwiaW5wdXQyRCIsInJlYWxQcm9ncmFtIiwiaW1hZ1Byb2dyYW0iLCJpbWFnUGFydCIsImNvbXBsZXhPdXRwdXRSZXNoYXBlZCIsImZpbGwiLCJpbmZlckR0eXBlIiwiZ2V0QXJyYXlGcm9tRFR5cGUiLCJmaWxsQ29uZmlnIiwiZmxpcExlZnRSaWdodENvbmZpZyIsIkZMT09SIiwiZmxvb3JDb25maWciLCJmbG9vckRpdiIsImZsb29yRGl2Q29uZmlnIiwiZnJvbVBpeGVsc0NvbmZpZyIsIm51bUNoYW5uZWxzIiwiaXNWaWRlbyIsIkhUTUxWaWRlb0VsZW1lbnQiLCJpc0ltYWdlIiwiSFRNTEltYWdlRWxlbWVudCIsInZpZGVvV2lkdGgiLCJ2aWRlb0hlaWdodCIsImZyb21QaXhlbHMyRENvbnRleHQiLCJkcmF3SW1hZ2UiLCJ0ZW1wUGl4ZWxIYW5kbGUiLCJGcm9tUGl4ZWxzUHJvZ3JhbSIsIkZyb21QaXhlbHNQYWNrZWRQcm9ncmFtIiwiZnVzZWRDb252MmQiLCJmdXNlZENvbnYyRENvbmZpZyIsImZ1c2VkRGVwdGh3aXNlQ29udjJEIiwic2hvdWxkUGFja0RlcHRod2lzZUNvbnYiLCJmdXNlZERlcHRod2lzZUNvbnYyRENvbmZpZyIsImdhdGhlck5kIiwicGFyYW1zIiwiaW5kaWNlcyIsImluZGljZXNTaGFwZSIsInNsaWNlUmFuayIsInBhcmFtc1NpemUiLCJyZXN1bHRTaGFwZSIsIm51bVNsaWNlcyIsInByZXBhcmVBbmRWYWxpZGF0ZSIsImZsYXR0ZW5JbmRpY2VzIiwiZmxhdHRlblgiLCJpbmRpY2VzRGF0YSIsInBhcmFtc0J1ZiIsIm91dFZhbHVlIiwiZ2F0aGVyTmRDb25maWciLCJnYXRoZXJWMiIsImJhdGNoRGltcyIsInBhcnNlZEF4aXMiLCJzZWdtZW50X3V0aWwiLCJjb2xsZWN0R2F0aGVyT3BTaGFwZUluZm8iLCJpbmRpY2VzU2l6ZSIsIm91dGVyU2l6ZSIsImRpbVNpemUiLCJmbGF0dGVuSW5kZXgiLCJmbGF0dGVuT3V0cHV0U2hhcGUiLCJpbmRpY2VzQnVmIiwiZ2F0aGVyVjJDb25maWciLCJncmVhdGVyIiwiZ3JlYXRlckNvbmZpZyIsImdyZWF0ZXJFcXVhbCIsImdyZWF0ZXJFcXVhbENvbmZpZyIsImlmZnQiLCJpZmZ0Q29uZmlnIiwiaWRlbnRpdHkiLCJpZGVudGl0eUNvbmZpZyIsImlucHV0RGF0YSIsImltYWdDb25maWciLCJpc0Zpbml0ZSIsImlzRmluaXRlQ29uZmlnIiwiaXNJbmYiLCJpc0luZkNvbmZpZyIsImlzTmFOIiwiaXNOYU5Db25maWciLCJscm4iLCJkZXB0aFJhZGl1cyIsImJldGEiLCJMUk5Db25maWciLCJscm5HcmFkIiwiTFJOR3JhZENvbmZpZyIsIkxFQUtZUkVMVSIsIkxFQUtZUkVMVV9QQUNLRUQiLCJsZWFreVJlbHUiLCIkYWxwaGEiLCJsZWFreVJlbHVDb25maWciLCJsZXNzIiwibGVzc0NvbmZpZyIsIkxFU1NfRVFVQUwiLCJMRVNTX0VRVUFMX1BBQ0tFRCIsImxlc3NFcXVhbCIsImxlc3NFcXVhbENvbmZpZyIsImxpblNwYWNlIiwic3RvcCIsImxpblNwYWNlQ29uZmlnIiwibG9nQ29uZmlnIiwibG9nMXAiLCJsb2cxcENvbmZpZyIsImxvZ2ljYWxBbmQiLCJsb2dpY2FsQW5kQ29uZmlnIiwibG9naWNhbE5vdCIsImxvZ2ljYWxOb3RDb25maWciLCJsb2dpY2FsT3IiLCJsb2dpY2FsT3JDb25maWciLCJyZWR1Y3Rpb25JbmRpY2VzIiwibWF4SW5wdXRJc1RyYW5zcG9zZWQiLCJtYXhJbnB1dCIsIm1heElucHV0VmFsdWVzIiwibWF4T3V0U2hhcGUiLCJtYXhDb25maWciLCJtYXhQb29sIiwibWF4UG9vbFByb2dyYW0iLCJtYXhQb29sQ29uZmlnIiwibWF4UG9vbDNkIiwibWF4UG9vbDNEQ29uZmlnIiwibWF4UG9vbDNER3JhZCIsIm1heFBvb2wzZFBvc2l0aW9uc1Byb2dyYW0iLCJtYXhQb29sM2RQb3NpdGlvbnMiLCJtYXhQb29sQmFja3Byb3BQcm9ncmFtIiwibWF4UG9vbEdyYWQzRENvbmZpZyIsIm1heFBvb2xHcmFkIiwibWF4UG9vbFBvc2l0aW9uc1Byb2dyYW0iLCJtYXhQb29sUG9zaXRpb25zIiwibWF4UG9vbEJhY2tQcm9wUHJvZ3JhbSIsIm1heFBvb2xHcmFkQ29uZmlnIiwibWF4UG9vbFdpdGhBcmdtYXhDb25maWciLCJpbmNsdWRlQmF0Y2hJbkluZGV4IiwiaW5kZXhlcyIsIm1heFBvb2xXaXRoQXJnbWF4SW1wbCIsInBvb2xPdXRwdXQiLCJyZXNoYXBlZElucHV0IiwicmVzaGFwZWRPdXRwdXQiLCJNQVhJTVVNIiwiTUFYSU1VTV9QQUNLRUQiLCJtYXhpbXVtIiwibWF4aW11bUNvbmZpZyIsIm1lYW5Db25maWciLCJtZWFuSW5wdXRJc1RyYW5zcG9zZWQiLCJtZWFuSW5wdXQiLCJtZWFuSW5wdXRWYWx1ZXMiLCJtZWFuT3V0U2hhcGUiLCJtZWFuSW1wbCIsIm1pbiIsIm1pbkNvbmZpZyIsIk1JTklNVU0iLCJNSU5JTVVNX1BBQ0tFRCIsIm1pbmltdW0iLCJtaW5pbXVtQ29uZmlnIiwibWlycm9yUGFkS2VybmVsRnVuYyIsInBhZGRpbmdzIiwibWlycm9yUGFkQ29uZmlnIiwiTU9EX1BBQ0tFRCIsIm1vZCIsIm1vZENvbmZpZyIsIm11bHRpbm9taWFsIiwibG9naXRzIiwibnVtU2FtcGxlcyIsInNlZWQiLCJub3JtYWxpemVkIiwicHJvYnMiLCJudW1PdXRjb21lcyIsIm11bHRpbm9taWFsQ29uZmlnIiwiTVVMIiwibXVsdGlwbHkiLCJ1cGNhc3RUeXBlIiwibXVsdGlwbHlDb25maWciLCJORUciLCJuZWciLCJuZWdDb25maWciLCJub25NYXhTdXBwcmVzc2lvblYzSW1wbCIsIm5vbk1heFN1cHByZXNzaW9uVjMiLCJzY29yZXMiLCJtYXhPdXRwdXRTaXplIiwiaW91VGhyZXNob2xkIiwic2NvcmVUaHJlc2hvbGQiLCJib3hlc1ZhbHMiLCJzY29yZXNWYWxzIiwic2VsZWN0ZWRJbmRpY2VzIiwibm9uTWF4U3VwcHJlc3Npb25WM0NvbmZpZyIsIm5vbk1heFN1cHByZXNzaW9uVjRJbXBsIiwibm9uTWF4U3VwcHJlc3Npb25WNCIsInBhZFRvTWF4T3V0cHV0U2l6ZSIsInZhbGlkT3V0cHV0cyIsIm5vbk1heFN1cHByZXNzaW9uVjRDb25maWciLCJub25NYXhTdXBwcmVzc2lvblY1SW1wbCIsIm5vbk1heFN1cHByZXNzaW9uVjUiLCJzb2Z0Tm1zU2lnbWEiLCJtYXhPdXRwdXRTaXplVmFsIiwiaW91VGhyZXNob2xkVmFsIiwic2NvcmVUaHJlc2hvbGRWYWwiLCJzb2Z0Tm1zU2lnbWFWYWwiLCJzZWxlY3RlZFNjb3JlcyIsIm5vbk1heFN1cHByZXNzaW9uVjVDb25maWciLCJub3RFcXVhbCIsIm5vdEVxdWFsQ29uZmlnIiwib25lSG90Iiwib25WYWx1ZSIsIm9mZlZhbHVlIiwib25lSG90Q29uZmlnIiwib25lc0xpa2UiLCJvbmVzTGlrZUNvbmZpZyIsInBhY2siLCJhc3NlcnRTaGFwZXNNYXRjaCIsImV4cGFuZGVkVGVuc29ycyIsImV4cGFuZGVkVCIsInBhY2tDb25maWciLCJwYWRWMiIsImNvbnN0YW50VmFsdWUiLCJwYWRWMkNvbmZpZyIsIlBPV19QQUNLRUQiLCJwb3ciLCJwb3dDb25maWciLCJQUkVMVSIsIlBSRUxVX1BBQ0tFRCIsInByZWx1IiwicHJlbHVDb25maWciLCJvdXREdHlwZSIsIm91dHB1dERUeXBlIiwicHJvZENvbmZpZyIsInJhbmdlIiwic3RlcCIsInJhbmdlQ29uZmlnIiwicmVhbENvbmZpZyIsInJlYWxEaXYiLCJyZWFsRGl2Q29uZmlnIiwicmVjaXByb2NhbCIsInJlY2lwcm9jYWxDb25maWciLCJSRUxVIiwicmVsdSIsInJlbHVDb25maWciLCJSRUxVNiIsInJlbHU2IiwicmVsdTZDb25maWciLCJyZXNoYXBlIiwiJHNoYXBlIiwiaW5mZXJGcm9tSW1wbGljaXRTaGFwZSIsIiR4U2l6ZSIsInJlc2hhcGVDb25maWciLCJyZXNpemVCaWxpbmVhciIsImltYWdlcyIsImFsaWduQ29ybmVycyIsImhhbGZQaXhlbENlbnRlcnMiLCJuZXdIZWlnaHQiLCJuZXdXaWR0aCIsInJlc2l6ZUJpbGluZWFyQ29uZmlnIiwicmVzaXplQmlsaW5lYXJHcmFkIiwicmVzaXplQmlsaW5lYXJHcmFkQ29uZmlnIiwicmVzaXplTmVhcmVzdE5laWdoYm9yIiwicmVzaXplTmVhcmVzdE5laWdoYm9yQ29uZmlnIiwicmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZCIsInJlc2l6ZU5lYXJlc3ROZWlnaGJvckdyYWRDb25maWciLCJkaW1zIiwiJGRpbXMiLCJyZXZlcnNlQ29uZmlnIiwicm90YXRlV2l0aE9mZnNldENvbmZpZyIsInJhZGlhbnMiLCJmaWxsVmFsdWUiLCJjZW50ZXIiLCJjZW50ZXJYIiwiY2VudGVyWSIsImdldEltYWdlQ2VudGVyIiwic2luIiwicm91bmRDb25maWciLCJyc3FydCIsInJzcXJ0Q29uZmlnIiwic2NhdHRlck5kIiwidXBkYXRlcyIsIm51bVVwZGF0ZXMiLCJvdXRwdXRTaXplIiwiY2FsY3VsYXRlU2hhcGVzIiwiZmxhdHRlblNoYXBlIiwiZGVmYXVsdFZhbHVlIiwic2NhdHRlck5kQ29uZmlnIiwic2VsZWN0IiwiZSIsInNlbGVjdENvbmZpZyIsIlNFTFUiLCJTRUxVX1NDQUxFQUxQSEEiLCJTRUxVX1NDQUxFIiwic2VsdSIsInNlbHVDb25maWciLCJTSUdNT0lEIiwic2lnbW9pZCIsInNpZ21vaWRDb25maWciLCJzaWduIiwic2lnbkNvbmZpZyIsIlNJTiIsInNpbkNvbmZpZyIsInNpbmgiLCJzaW5oQ29uZmlnIiwiJGJlZ2luIiwiJHNpemUiLCJwYXJzZVNsaWNlUGFyYW1zIiwiYXNzZXJ0UGFyYW1zVmFsaWQiLCJpc0NvbnRpbm91cyIsImlzU2xpY2VDb250aW5vdXMiLCJuZXdUZXhEYXRhIiwiYXNzaWduIiwiY29tcHV0ZUZsYXRPZmZzZXQiLCJzaGFsbG93U2xpY2UiLCJzbGljZUNvbmZpZyIsInNvZnRtYXgiLCJtYXhMb2dpdCIsImV4cGFuZGVkU2hhcGUiLCJtYXhMb2dpdHNSZXNoYXBlZCIsInN1bUV4cCIsInN1bUV4cFJlc2hhcGVkIiwic29mdG1heENvbmZpZyIsInNvZnRwbHVzIiwic29mdHBsdXNDb25maWciLCJzcGFjZVRvQmF0Y2hORCIsImNvbXBsZXRlUGFkZGluZ3MiLCJwYWRkZWRYIiwicmVzaGFwZWRQYWRkZWRTaGFwZSIsInBlcm11dGVkUmVzaGFwZWRQYWRkZWRQZXJtdXRhdGlvbiIsInJlc2hhcGVkUGFkZGVkWCIsInBhZGRlZFhUIiwic3BhY2VUb0JhdGNoTkRDb25maWciLCJzcGFyc2VGaWxsRW1wdHlSb3dzIiwiZGVuc2VTaGFwZSIsIiRpbmRpY2VzIiwiJHZhbHVlcyIsIiRkZW5zZVNoYXBlIiwiJGRlZmF1bHRWYWx1ZSIsIm91dHB1dEluZGljZXMiLCJvdXRwdXRJbmRpY2VzU2hhcGUiLCJvdXRwdXRWYWx1ZXMiLCJlbXB0eVJvd0luZGljYXRvciIsInJldmVyc2VJbmRleE1hcCIsIk51bWJlciIsInNwYXJzZUZpbGxFbXB0eVJvd3NDb25maWciLCJzcGFyc2VSZXNoYXBlIiwiaW5wdXRJbmRpY2VzIiwiJGlucHV0U2hhcGUiLCJmcm9tIiwiJGlucHV0SW5kaWNlcyIsIm5ld0luZGljZXMiLCJzcGFyc2VSZXNoYXBlQ29uZmlnIiwic3BhcnNlU2VnbWVudE1lYW4iLCJzZWdtZW50SWRzIiwiJGRhdGEiLCIkc2VnbWVudElkcyIsIm91dHB1dERhdGFTaGFwZSIsInNwYXJzZVNlZ21lbnRNZWFuQ29uZmlnIiwic3BhcnNlU2VnbWVudFN1bSIsInNwYXJzZVNlZ21lbnRTdW1Db25maWciLCJzcGFyc2VUb0RlbnNlIiwic3BhcnNlSW5kaWNlcyIsInNwYXJzZVZhbHVlcyIsInNwYXJzZVRvRGVuc2VDb25maWciLCJzcGxpdFYiLCJudW1PclNpemVTcGxpdHMiLCJzcGxpdFNpemVzIiwicHJlcGFyZVNwbGl0U2l6ZSIsInNsaWNlVCIsInNwbGl0VkNvbmZpZyIsIlNRUlQiLCJzcXJ0Iiwic3FydENvbmZpZyIsInNxdWFyZSIsInNxdWFyZUNvbmZpZyIsInNxdWFyZWREaWZmZXJlbmNlIiwic3F1YXJlZERpZmZlcmVuY2VDb25maWciLCJzdGVwQ29uZmlnIiwic3RyaWRlZFNsaWNlIiwiZW5kIiwiYmVnaW5NYXNrIiwiZW5kTWFzayIsImVsbGlwc2lzTWFzayIsIm5ld0F4aXNNYXNrIiwic2hyaW5rQXhpc01hc2siLCJub25TdHJpZGVkIiwiJHN0cmlkZXMiLCJzbGljZUluZm8iLCJzb21lIiwicmVzdWx0VmFsdWVzIiwicmVzdWx0UmVzaGFwZWQiLCJzdHJpZGVkU2xpY2VDb25maWciLCJzdHJpbmdOR3JhbXMiLCJzZXBhcmF0b3IiLCJuR3JhbVdpZHRocyIsImxlZnRQYWQiLCJyaWdodFBhZCIsInBhZFdpZHRoIiwicHJlc2VydmVTaG9ydFNlcXVlbmNlcyIsImRhdGFTcGxpdHMiLCIkZGF0YVNwbGl0cyIsIm5HcmFtcyIsIm5HcmFtc1NwbGl0cyIsInN0cmluZ05HcmFtc0NvbmZpZyIsInN0cmluZ1NwbGl0Iiwic2tpcEVtcHR5IiwiZGVsaW1pdGVyIiwiJGlucHV0IiwiJGRlbGltaXRlciIsInN0cmluZ1NwbGl0Q29uZmlnIiwic3RyaW5nVG9IYXNoQnVja2V0RmFzdCIsIm51bUJ1Y2tldHMiLCJzdHJpbmdUb0hhc2hCdWNrZXRGYXN0Q29uZmlnIiwiU1VCIiwic3ViIiwic3ViQ29uZmlnIiwic3VtQ29uZmlnIiwic3VtSW1wbCIsInN1bUlucHV0SXNUcmFuc3Bvc2VkIiwic3VtSW5wdXQiLCJzdW1PdXRTaGFwZSIsIm91dFR5cGUiLCJ0YW4iLCJ0YW5Db25maWciLCJ0YW5oIiwidGFuaENvbmZpZyIsInRpbGUiLCJyZXBzIiwiYnVmIiwidGlsZUNvbmZpZyIsImRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvT3JOdWxsIiwicm91bmRVcFRvUG93MiIsInBvdzIiLCJ0b3BLIiwic29ydGVkIiwiVE9QS19MQVNUX0RJTV9DUFVfSEFORE9GRl9TSVpFX1RIUkVTSE9MRCIsIlRPUEtfS19DUFVfSEFORE9GRl9USFJFU0hPTEQiLCJsYXN0RGltIiwiYWxsVG9wS1ZhbHMiLCJhbGxUb3BLSW5kaWNlcyIsInhJc1BhY2tlZCIsIngyRCIsImtQb3cyIiwibGFzdERpbVBvdzIiLCJnZXRJbnB1dHMiLCJydW5Td2FwIiwiZGlyIiwiaW5jIiwiTkVHQVRJVkVfSU5GSU5JVFkiLCJwcmV2SW5kaWNlcyIsImxlbiIsIm1lcmdlUHJvZ3JhbSIsInByZXZWYWx1ZXMiLCJ0b3BLQ29uZmlnIiwidHJhbnNmb3JtIiwidHJhbnNmb3JtcyIsImludGVycG9sYXRpb24iLCJmaWxsTW9kZSIsInRyYW5zZm9ybUNvbmZpZyIsInRyYW5zcG9zZSIsInRyYW5zcG9zZUNvbmZpZyIsInVuaXF1ZSIsInVuaXF1ZUNvbmZpZyIsInVucGFjayIsIm91dEluZGV4IiwidW5wYWNrQ29uZmlnIiwidW5zb3J0ZWRTZWdtZW50U3VtIiwibnVtU2VnbWVudHMiLCJzZWdPcENvbXB1dGUiLCJzZWdPcFR5cGUiLCJzZWdPcENvbXB1dGVPcHRpbWFsV2luZG93U2l6ZSIsInNlZ09wSW5mbyIsInJhbmdlSW5mbyIsInRpbGVJbmZvIiwic2VnT3BSZXN1bHQiLCJ1bnNvcnRlZFNlZ21lbnRTdW1Db25maWciLCJ6ZXJvc0xpa2UiLCJ6ZXJvc0xpa2VDb25maWciLCJfZnVzZWRNYXRNdWwiLCJfZnVzZWRNYXRNdWxDb25maWciLCJMUk5Qcm9ncmFtIiwicmFkaXVzIiwicmFkIiwibWF4RCIsInBvd09wZXJhdG9yIiwiYmFzaXMiLCJMUk5HcmFkUHJvZ3JhbSIsIkxSTlBhY2tlZFByb2dyYW0iLCJNYXhQb29sMkRCYWNrcHJvcFByb2dyYW0iLCJNYXhQb29sM0RCYWNrcHJvcFByb2dyYW0iLCJNZWFuUHJvZ3JhbSIsImRpdmlzb3IiLCJ3aW5kb3dTaXplTmVhcmVzdFZlYzQiLCJ3aW5kb3dTaXplVmVjNFJlbWFpbmRlciIsInVwZGF0ZVNuaXBwZXQiLCJkZW5vbWluYXRvciIsImlzSW50IiwidG9QcmVjaXNpb24iLCJNaXJyb3JQYWRQcm9ncmFtIiwidW5wYWNrZWRDb29yZHMiLCJNaXJyb3JQYWRQYWNrZWRQcm9ncmFtIiwiY0xpbWl0IiwiaW5uZXJEaW1zIiwicGFkU2V0dXAiLCJNYXRNdWxQYWNrZWRQcm9ncmFtIiwiaGFzTGVha3lyZWx1QWN0aXZhdGlvbiIsInNoYXJlZERpbWVuc2lvblBhY2tlZCIsImFTYW1wbGUiLCJiU2FtcGxlIiwiYVN3aXp6bGUiLCJiU3dpenpsZSIsImJhdGNoQVNuaXBwZXQiLCJiYXRjaEJTbmlwcGV0IiwiTXVsdGlub21pYWxQcm9ncmFtIiwiT25lSG90UHJvZ3JhbSIsIm51bUluZGljZXMiLCJQYWNrUHJvZ3JhbSIsIm91dE9mQm91bmRzQ29uZGl0aW9uIiwiY29uZCIsImdldE91dE9mQm91bmRzQ29uZGl0aW9uIiwic2V0dXAiLCJnZXRTZXR1cCIsImNvb3JkIiwiZ2V0U291cmNlQ29vcmRzQXJyIiwiZ2V0T3V0cHV0IiwiZ2V0VmVjQ2hhbm5lbHMiLCJnZXRDaGFubmVscyIsIlBhZFByb2dyYW0iLCJQYWRQYWNrZWRQcm9ncmFtIiwiY29tcG9uZW50U2V0dXAiLCJwYWRkaW5nQXJlYSIsImoiLCJQb29sMkRQcm9ncmFtIiwicG9vbFR5cGUiLCJjb21wdXRlUG9zaXRpb25zIiwiZmxhdHRlblBvc2l0aW9ucyIsImlzQXZnUG9vbCIsImJhdGNoRmxhdHRlblBvc2l0aW9uU3RyIiwiZmxhdHRlblBvc2l0aW9uU3RyIiwiaW5pdGlhbGl6YXRpb25WYWx1ZSIsImNvbXBhcmVPcCIsInJldHVyblZhbHVlIiwiZmlsdGVyV2lkdGhOZWFyZXN0VmVjNCIsImZpbHRlcldpZHRoVmVjNFJlbWFpbmRlciIsIlBvb2wzRFByb2dyYW0iLCJSZWR1Y2VQcm9ncmFtIiwidmVjVHlwZSIsImtlcm5lbENvbmZpZ3MiLCJrZXJuZWxDb25maWciLCJSZXNoYXBlUGFja2VkUHJvZ3JhbSIsInRoaXNSQyIsIlJlc2l6ZUJpbGluZWFyQmFja3Byb3BQcm9ncmFtIiwiZHlTaGFwZSIsInhIZWlnaHQiLCJ4V2lkdGgiLCJ5SGVpZ2h0IiwieVdpZHRoIiwiZWZmZWN0aXZlWFNpemUiLCJlZmZlY3RpdmVZU2l6ZSIsImludkhlaWdodFNjYWxlIiwiaW52V2lkdGhTY2FsZSIsIndpbkhlaWdodCIsIndpbldpZHRoIiwiUmVzaXplQmlsaW5lYXJQcm9ncmFtIiwib2xkSGVpZ2h0Iiwib2xkV2lkdGgiLCJlZmZlY3RpdmVJblNpemUiLCJlZmZlY3RpdmVPdXRTaXplIiwic291cmNlRnJhY0luZGV4UkMiLCJSZXNpemVCaWxpbmVhclBhY2tlZFByb2dyYW0iLCJSZXNpemVOZWFyZXN0TmVpZ2JvckJhY2twcm9wUHJvZ3JhbSIsIlJlc2l6ZU5lYXJlc3ROZWlnaGJvclByb2dyYW0iLCJyb3VuZEJhc2UiLCJSZXNpemVOZWFyZXN0TmVpZ2hib3JQYWNrZWRQcm9ncmFtIiwiUmV2ZXJzZVByb2dyYW0iLCJpbkNvb3JkcyIsImdldEluQ29vcmQiLCJSZXZlcnNlUGFja2VkUHJvZ3JhbSIsIm5leHRDb2x1bW4iLCJuZXh0Um93IiwiZ2V0Q2hhbm5lbCIsImluQ29vcmRzQXJyYXkiLCJjaGFubmVsczEiLCJnZXRSIiwiZ2V0RyIsImdldEIiLCJnZXRBIiwiUm90YXRlUHJvZ3JhbSIsImZpbGxTbmlwcGV0IiwiU2NhdHRlclByb2dyYW0iLCJ1cGRhdGVTaXplIiwiaW5kaWNlc1JhbmsiLCJ1cGRhdGVzUmFuayIsInN1bW1pbmdEdXBlSW5kZXgiLCJpbmRpY2VzU3RyaW5nIiwiaW5kaWNlc1NuaXBwZXQiLCJ1cGRhdGVzU3RyaW5nIiwidXBkYXRlc1NuaXBwZXQiLCJTZWdtZW50T3BQcm9ncmFtIiwiY2hlY2tWYWx1ZU91dE9mQm91bmRzIiwiY2hlY2tTZWdtZW50SWRPdXRPZkJvdW5kcyIsIlNlbGVjdFByb2dyYW0iLCJjUmFuayIsImNDb29yZHMiLCJhYkNvb3JkcyIsImNDb29yZFZhcnMiLCJhYkNvb3JkVmFycyIsIm1ha2VTaGFkZXIiLCJpbnB1dHNJbmZvIiwicHJlZml4U25pcHBldHMiLCJnZXRVbmlmb3JtSW5mb0Zyb21TaGFwZSIsImFycmF5SW5kZXgiLCJpbnB1dFByZWZpeFNuaXBwZXQiLCJpbnB1dFNhbXBsaW5nU25pcHBldCIsImluSW5mbyIsInVzZXNQYWNrZWRUZXh0dXJlcyIsImdldFBhY2tlZFNhbXBsZXJGcm9tSW5JbmZvIiwiZ2V0U2FtcGxlckZyb21JbkluZm8iLCJpbnB1dEluZm8iLCJ0ZXhOYW1lIiwidGV4RnVuY1NuaXBwZXQiLCJmdW5jTmFtZSIsImluUmFuayIsIm91dFJhbmsiLCJnZXRDb29yZHNEYXRhVHlwZSIsInJhbmtEaWZmIiwiY29vcmRzU25pcHBldCIsImZpZWxkcyIsInVucGFja2VkQ29vcmRzU25pcHBldCIsImlzSW5wdXRTY2FsYXIiLCJpc091dHB1dFNjYWxhciIsImdldFBhY2tlZFNhbXBsZXJBdE91dHB1dENvb3JkcyIsImluVGV4U2hhcGUiLCJnZXRTYW1wbGVyQXRPdXRwdXRDb29yZHMiLCJnZXRJbnB1dFNhbXBsaW5nU25pcHBldCIsImZsb2F0VGV4dHVyZVNhbXBsZVNuaXBwZXQiLCJnZXRGbG9hdFRleHR1cmVTYW1wbGVTbmlwcGV0Iiwib3V0cHV0U2FtcGxpbmdTbmlwcGV0IiwiZmxvYXRUZXh0dXJlU2V0T3V0cHV0U25pcHBldCIsInNoYWRlclByZWZpeCIsIlNBTVBMRV8xRF9TTklQUEVUIiwiU0FNUExFXzJEX1NOSVBQRVQiLCJTQU1QTEVfM0RfU05JUFBFVCIsImdldFNoYWRlclByZWZpeCIsImdldE91dHB1dFNjYWxhckNvb3JkcyIsImdldE91dHB1dFBhY2tlZDFEQ29vcmRzIiwidGV4ZWxzSW5Mb2dpY2FsUm93IiwiZ2V0T3V0cHV0UGFja2VkMkRDb29yZHMiLCJ0ZXhlbHNJbkJhdGNoIiwiZ2V0T3V0cHV0UGFja2VkM0RDb29yZHMiLCJ0ZXhlbHNJbkJhdGNoTiIsImJhdGNoZXMiLCJnZXRPdXRwdXRQYWNrZWRORENvb3JkcyIsImdldFBhY2tlZE91dHB1dFNhbXBsaW5nU25pcHBldCIsImdldEZsb2F0VGV4dHVyZVNldFJHQkFTbmlwcGV0IiwiZ2V0T3V0cHV0MURDb29yZHMiLCJnZXRPdXRwdXQyRENvb3JkcyIsImNvb3Jkc0Zyb21JbmRleFNuaXBwZXQiLCJnZXRPdXRwdXQzRENvb3JkcyIsImdldE91dHB1dDREQ29vcmRzIiwiZ2V0T3V0cHV0NURDb29yZHMiLCJnZXRPdXRwdXQ2RENvb3JkcyIsImdldE91dHB1dFNhbXBsaW5nU25pcHBldCIsImdldEZsb2F0VGV4dHVyZVNldFJTbmlwcGV0IiwiU0hBREVSX1BBQ0tFRF9QUkVGSVgiLCJ0ZXhOdW1SIiwidGV4TnVtQyIsImdldEZsYXRPZmZzZXRVbmlmb3JtTmFtZSIsInROdW1SIiwidE51bUMiLCJnZXRTYW1wbGVyU2NhbGFyIiwiZ2V0VW5pZm9ybVNhbXBsZXIiLCJnZXRTYW1wbGVyMUQiLCJzcXVlZXplU2hhcGUiLCJzcXVlZXplZFNoYXBlIiwic3F1ZWV6ZUlucHV0SW5mbyIsImdldFNxdWVlemVkUGFyYW1zIiwiZ2V0U2FtcGxlcjJEIiwic3RyaWRlMCIsInN0cmlkZTEiLCJnZXRTYW1wbGVyM0QiLCJzdHJpZGUyIiwic3RyaWRlMlN0ciIsInN0cmlkZTFTdHIiLCJzdHJpZGUwU3RyIiwiZ2V0U2FtcGxlcjREIiwic3RyaWRlMyIsImdldFNhbXBsZXI1RCIsInN0cmlkZTQiLCJnZXRTYW1wbGVyNkQiLCJnZXRQYWNrZWRTYW1wbGVyU2NhbGFyIiwiZ2V0UGFja2VkU2FtcGxlcjFEIiwidmFsdWVzUGVyUm93IiwiZ2V0UGFja2VkU2FtcGxlcjJEIiwiZ2V0UGFja2VkU2FtcGxlcjNEIiwiZ2V0UGFja2VkU2FtcGxlck5EIiwidXNlU3F1ZWV6ZVBhY2tlZFNoYXBlIiwibmV3SW5wdXRJbmZvIiwiSlNPTiIsInBhcnNlIiwic3RyaW5naWZ5IiwiZ2V0TG9naWNhbENvb3JkaW5hdGVzRnJvbUZsYXRJbmRleCIsInN0cmlkZSIsImdldE91dHB1dExvZ2ljYWxDb29yZGluYXRlc0Zyb21GbGF0SW5kZXhCeVVuaWZvcm0iLCJnZXRMb2dpY2FsQ29vcmRpbmF0ZXNGcm9tRmxhdEluZGV4QnlVbmlmb3JtIiwidmFyaWFibGVOYW1lIiwiaW5kaWNlc0FyciIsIm51bUNvb3JkcyIsInN5bWJvbGljYWxseUNvbXB1dGVTdHJpZGVzIiwiYnVpbGRWZWMiLCJkb3RpZnkiLCJzbGljZXMiLCJuZWFyZXN0VmVjNCIsIm5lYXJlc3RWZWM0UmVtYWluZGVyIiwieFNsaWNlIiwieVNsaWNlIiwiZ2V0RmxhdEluZGV4RnJvbTNEIiwidG9TdHJpbmciLCJnZXRGbGF0SW5kZXhGcm9tM0RPdXRwdXQiLCJFTkNPREVfRkxPQVRfU05JUFBFVCIsIlNsaWNlUHJvZ3JhbSIsImRlc3RTaXplIiwiYm9keSIsIlNsaWNlUGFja2VkUHJvZ3JhbSIsInNvdXJjZUxvYyIsInVwcGVyUm93IiwibG93ZXJSb3ciLCJTdHJpZGVkU2xpY2VQcm9ncmFtIiwiaW5wdXREdHlwZSIsIm5ld0Nvb3JkcyIsIm91dHB1dEF4aXMiLCJQYWNraW5nU2NoZW1lIiwiVGV4dHVyZVVzYWdlIiwiUGh5c2ljYWxUZXh0dXJlVHlwZSIsImdldFVucGFja2VkTWF0cml4VGV4dHVyZVNoYXBlV2lkdGhIZWlnaHQiLCJnZXRVbnBhY2tlZEFycmF5U2l6ZUZyb21NYXRyaXhTaXplIiwibWF0cml4U2l6ZSIsImNoYW5uZWxzUGVyVGV4dHVyZSIsImdldENvbG9yTWF0cml4VGV4dHVyZVNoYXBlV2lkdGhIZWlnaHQiLCJnZXREZW5zZVRleFNoYXBlIiwidGV4ZWxzTmVlZGVkIiwic2l6ZVRvU3F1YXJpc2hTaGFwZSIsImdldE1hdHJpeFNpemVGcm9tVW5wYWNrZWRBcnJheVNpemUiLCJ1bnBhY2tlZFNpemUiLCJkZWNvZGVNYXRyaXhGcm9tVW5wYWNrZWRDb2xvclJHQkFBcnJheSIsInVucGFja2VkQXJyYXkiLCJtYXRyaXgiLCJyZXF1aXJlZFNpemUiLCJkc3QiLCJzcmMiLCJnZXRQYWNrZWRNYXRyaXhUZXh0dXJlU2hhcGVXaWR0aEhlaWdodCIsImdldFBhY2tlZFJHQkFBcnJheVNpemVGcm9tTWF0cml4U2hhcGUiLCJnZXRUZXh0dXJlQ29uZmlnIiwiZ2xhbnkiLCJkb3dubG9hZFVucGFja051bUNoYW5uZWxzIiwiZGVmYXVsdE51bUNoYW5uZWxzIiwidGV4dHVyZVR5cGVGbG9hdCIsIlIzMkYiLCJSMTZGIiwiUkdCQTE2RiIsIlJHQkEzMkYiLCJSRUQiLCJIQUxGX0ZMT0FUIiwiSEFMRl9GTE9BVF9PRVMiLCJUZXh0dXJlTWFuYWdlciIsIm51bVVzZWRUZXh0dXJlcyIsIm51bUZyZWVUZXh0dXJlcyIsIl9udW1CeXRlc0FsbG9jYXRlZCIsIl9udW1CeXRlc0ZyZWUiLCJmcmVlVGV4dHVyZXMiLCJsb2dFbmFibGVkIiwidXNlZFRleHR1cmVzIiwic2hhcGVSQyIsInBoeXNpY2FsVGV4VHlwZSIsImdldFBoeXNpY2FsRnJvbUxvZ2ljYWxUZXh0dXJlVHlwZSIsInNoYXBlS2V5IiwiZ2V0S2V5RnJvbVRleHR1cmVTaGFwZSIsInRleEJ5dGVzIiwiUEFDS0VEXzJYMl9GTE9BVDMyIiwiUEFDS0VEXzJYMl9GTE9BVDE2IiwiVU5QQUNLRURfRkxPQVQzMiIsIlVOUEFDS0VEX0ZMT0FUMTYiLCJQQUNLRURfNFgxX1VOU0lHTkVEX0JZVEUiLCJsb2dpY2FsVGV4VHlwZSIsImRlbGV0ZVRleFRocmVzaG9sZCIsInRleExpc3QiLCJ0ZXhJbmRleCIsInRvdGFsIiwiZnJlZVJhdGlvIiwiZ2V0TnVtVXNlZFRleHR1cmVzIiwiZ2V0TnVtRnJlZVRleHR1cmVzIiwidGV4IiwiaW50ZXJuYWxGb3JtYXRGb3JQaHlzaWNhbFRleFR5cGUiLCJudW1FbGVtZW50cyIsInBhY2tlZFdpZHRoIiwicGFja2VkSGVpZ2h0IiwibnVtQnl0ZXNGb3JJbnRlcm5hbEZvcm1hdCIsIlJFTkRFUiIsImdldFBoeXNpY2FsVGV4dHVyZUZvclJlbmRlcmluZyIsInNoYXBlUm93c0NvbCIsIlRpbGVQcm9ncmFtIiwiU3dhcFByb2dyYW0iLCJNZXJnZVByb2dyYW0iLCJUcmFuc2Zvcm1Qcm9ncmFtIiwiaW50ZXJwb2xhdGlvbk1vZGVJZCIsImZpbGxNb2RlSWQiLCJUcmFuc3Bvc2VQcm9ncmFtIiwibmV3RGltIiwic3dpdGNoZWQiLCJvcmlnaW5hbE9yZGVyIiwic3dpdGNoZWRDb29yZHMiLCJnZXRTd2l0Y2hlZENvb3JkcyIsIlRyYW5zcG9zZVBhY2tlZFByb2dyYW0iLCJvdXRwdXRPcmRlciIsInN3aXRjaGVkT3JkZXIiLCJnZXRjIiwiVW5hcnlPcFByb2dyYW0iLCJMSU5FQVIiLCJTVEVQIiwiRUxVIiwiQ0xPTkUiLCJVbmFyeU9wUGFja2VkUHJvZ3JhbSIsIlVucGFja1Byb2dyYW0iLCJjYWxsQW5kQ2hlY2siLCJmdW5jIiwiZ2V0RXJyb3IiLCJOT19FUlJPUiIsImdldFdlYkdMRXJyb3JNZXNzYWdlIiwiY2hlY2tXZWJHTEVycm9yIiwiY2FuQmVSZXByZXNlbnRlZCIsIklOVkFMSURfRU5VTSIsIklOVkFMSURfVkFMVUUiLCJJTlZBTElEX09QRVJBVElPTiIsIklOVkFMSURfRlJBTUVCVUZGRVJfT1BFUkFUSU9OIiwiT1VUX09GX01FTU9SWSIsIkNPTlRFWFRfTE9TVF9XRUJHTCIsImdldEV4dGVuc2lvbk9yVGhyb3ciLCJleHRlbnNpb25OYW1lIiwidGhyb3dJZk51bGwiLCJjcmVhdGVTaGFkZXIiLCJWRVJURVhfU0hBREVSIiwic2hhZGVyU291cmNlIiwiY29tcGlsZVNoYWRlciIsImdldFNoYWRlclBhcmFtZXRlciIsIkNPTVBJTEVfU1RBVFVTIiwiZ2V0U2hhZGVySW5mb0xvZyIsImNyZWF0ZUZyYWdtZW50U2hhZGVyIiwiRlJBR01FTlRfU0hBREVSIiwic2hhZGVySW5mb0xvZyIsImxpbmVOdW1iZXJSZWdleFJlc3VsdCIsImxpbmVOdW1iZXJSZWdleCIsImV4ZWMiLCJsaW5lTnVtYmVyIiwic2hhZGVyTGluZXMiLCJzcGxpdCIsImxpbmVzV2l0aExpbmVOdW1iZXJzIiwibGluZSIsIm1heExpbmVMZW5ndGgiLCJiZWZvcmVFcnJvckxpbmVzIiwiZXJyb3JMaW5lIiwiYWZ0ZXJFcnJvckxpbmVzIiwibG9nU2hhZGVyU291cmNlQW5kSW5mb0xvZyIsImxpbmtQcm9ncmFtIiwiZ2V0UHJvZ3JhbVBhcmFtZXRlciIsIkxJTktfU1RBVFVTIiwiZ2V0UHJvZ3JhbUluZm9Mb2ciLCJ2YWxpZGF0ZVByb2dyYW0iLCJWQUxJREFURV9TVEFUVVMiLCJjcmVhdGVTdGF0aWNWZXJ0ZXhCdWZmZXIiLCJTVEFUSUNfRFJBVyIsImNyZWF0ZVN0YXRpY0luZGV4QnVmZmVyIiwiZ2V0TnVtQ2hhbm5lbHMiLCJjcmVhdGVUZXh0dXJlIiwidmFsaWRhdGVUZXh0dXJlU2l6ZSIsIm1heFRleHR1cmVTaXplIiwiY3JlYXRlRnJhbWVidWZmZXIiLCJiaW5kVmVydGV4QnVmZmVyVG9Qcm9ncmFtQXR0cmlidXRlIiwiYXJyYXlFbnRyaWVzUGVySXRlbSIsIml0ZW1TdHJpZGVJbkJ5dGVzIiwiaXRlbU9mZnNldEluQnl0ZXMiLCJsb2MiLCJ2ZXJ0ZXhBdHRyaWJQb2ludGVyIiwiZW5hYmxlVmVydGV4QXR0cmliQXJyYXkiLCJiaW5kVGV4dHVyZVVuaXQiLCJ2YWxpZGF0ZVRleHR1cmVVbml0IiwiYWN0aXZlVGV4dHVyZSIsIlRFWFRVUkUwIiwidW5iaW5kVGV4dHVyZVVuaXQiLCJnZXRQcm9ncmFtVW5pZm9ybUxvY2F0aW9uT3JUaHJvdyIsImdldFByb2dyYW1Vbmlmb3JtTG9jYXRpb24iLCJiaW5kVGV4dHVyZVRvUHJvZ3JhbVVuaWZvcm1TYW1wbGVyIiwidW5pZm9ybVNhbXBsZXJMb2NhdGlvbiIsImJpbmRDYW52YXNUb0ZyYW1lYnVmZmVyIiwiYmluZENvbG9yVGV4dHVyZVRvRnJhbWVidWZmZXIiLCJmcmFtZWJ1ZmZlclRleHR1cmUyRCIsIkNPTE9SX0FUVEFDSE1FTlQwIiwidW5iaW5kQ29sb3JUZXh0dXJlRnJvbUZyYW1lYnVmZmVyIiwidmFsaWRhdGVGcmFtZWJ1ZmZlciIsImNoZWNrRnJhbWVidWZmZXJTdGF0dXMiLCJGUkFNRUJVRkZFUl9DT01QTEVURSIsImdldEZyYW1lYnVmZmVyRXJyb3JNZXNzYWdlIiwiRlJBTUVCVUZGRVJfSU5DT01QTEVURV9BVFRBQ0hNRU5UIiwiRlJBTUVCVUZGRVJfSU5DT01QTEVURV9NSVNTSU5HX0FUVEFDSE1FTlQiLCJGUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0RJTUVOU0lPTlMiLCJGUkFNRUJVRkZFUl9VTlNVUFBPUlRFRCIsInJldHVyblRPck51bGwiLCJmYWlsdXJlTWVzc2FnZSIsInRPck51bGwiLCJtYXhUZXh0dXJlVW5pdCIsIk1BWF9DT01CSU5FRF9URVhUVVJFX0lNQUdFX1VOSVRTIiwiZ2xUZXh0dXJlVW5pdCIsImdldEJhdGNoRGltIiwiZGltc1RvU2tpcCIsImdldFJvd3NDb2xzIiwiZ2V0U2hhcGVBczNEIiwiZ2V0VGV4dHVyZVNoYXBlRnJvbUxvZ2ljYWxTaGFwZSIsImxvZ1NoYXBlIiwibWF4VGV4U2l6ZSIsInNxdWVlemVSZXN1bHQiLCJpc0V2ZW4iLCJpc1Jlc2hhcGVGcmVlIiwic2hhcGUxIiwic2hhcGUyIiwic2hhcGUxQ29scyIsInNoYXBlMkNvbHMiLCJNQVhfVEVYVFVSRV9TSVpFIiwiTUFYX1RFWFRVUkVTX0lOX1NIQURFUiIsImdldFdlYkdMTWF4VGV4dHVyZVNpemUiLCJyZXNldE1heFRleHR1cmVTaXplIiwicmVzZXRNYXhUZXh0dXJlc0luU2hhZGVyIiwiZ2V0TWF4VGV4dHVyZXNJblNoYWRlciIsIk1BWF9URVhUVVJFX0lNQUdFX1VOSVRTIiwiZ2V0V2ViR0xEaXNqb2ludFF1ZXJ5VGltZXJWZXJzaW9uIiwiaGFzRXh0ZW5zaW9uIiwiaXNXZWJHTFZlcnNpb25FbmFibGVkIiwiaXNDYXBhYmxlT2ZSZW5kZXJpbmdUb0Zsb2F0VGV4dHVyZSIsImNyZWF0ZUZsb2F0VGV4dHVyZUFuZEJpbmRUb0ZyYW1lYnVmZmVyIiwiaXNEb3dubG9hZEZsb2F0VGV4dHVyZUVuYWJsZWQiLCJ0ZXhDb25maWciLCJmcmFtZUJ1ZmZlciIsImlzRnJhbWVCdWZmZXJDb21wbGV0ZSIsImNyZWF0ZUhhbGZGbG9hdFRleHR1cmVBbmRCaW5kVG9GcmFtZWJ1ZmZlciIsImlzV2ViR0xGZW5jZUVuYWJsZWQiLCJhc3NlcnROb3RDb21wbGV4IiwidGVuc29yIiwib3BOYW1lIiwiaXNBcnJheSIsIk1hdGhCYWNrZW5kQ1BVIiwiZmlyc3RVc2UiLCJvdXRJZCIsIl9hIiwicmVhc29ucyIsImNwdUJhY2tlbmQiLCJ4aSIsImFkZENvbXBsZXhJbXBsIiwiYVJlYWwiLCJhSW1hZyIsImJSZWFsIiwiYkltYWciLCJjdXJyVmFscyIsInJlZHVjZVNpemUiLCJtYWtlWmVyb3NUeXBlZEFycmF5IiwiYW55VmFsIiwibWF4SW5kZXgiLCJtaW5JbmRleCIsImF0YW4ySW1wbCIsImFWYWx1ZSIsImJWYWx1ZSIsInhWYWx1ZXMiLCJkeCIsImR5QnVmIiwiZHhEZXB0aCIsImR4Um93IiwiZHhDb2wiLCJkeURlcHRoQ29ybmVyIiwiZHlSb3dDb3JuZXIiLCJkeUNvbENvcm5lciIsImRvdFByb2QiLCJ3RGVwdGgiLCJkeURlcHRoIiwid1JvdyIsImR5Um93Iiwid0NvbCIsImR5Q29sIiwiYXZnUG9vbDNER3JhZENvbmZpZyIsImR5RGF0YSIsImR4UiIsImR4QyIsImR5UkNvcm5lciIsImR5Q0Nvcm5lciIsIndSIiwiZHlSIiwid0MiLCJkeUMiLCJsZWZ0RGltIiwicmlnaHREaW0iLCJhM2RWYWx1ZXMiLCJiM2RWYWx1ZXMiLCJhM2RTdHJpZGVzIiwiYjNkU3RyaWRlcyIsImFCYXRjaCIsImFPdXRlclN0ZXAiLCJhSW5uZXJTdGVwIiwiYklubmVyU3RlcCIsImJPdXRlclN0ZXAiLCJiQmF0Y2giLCJyZXNWYWxzIiwiYmkiLCJpMCIsImowIiwiazAiLCJpQmxvY2siLCJqQmxvY2siLCJrQmxvY2siLCJiYXRjaE9mZnNldEEiLCJiYXRjaE9mZnNldEIiLCJtVmFscyIsInZhclZhbHMiLCJzVmFscyIsIm9mZlZhbHMiLCJvZmZWYWxzTGVuZ3RoIiwic1ZhbHNMZW5ndGgiLCJ2YXJWYWxzTGVuZ3RoIiwibVZhbHNMZW5ndGgiLCJvZmZpIiwibWkiLCJzaSIsInZpIiwieFRyYW5zcG9zZWQiLCJ4VHJhbnNwb3NlZFJlc2hhcGVkIiwid2VpZ2h0c0R0eXBlIiwid2VpZ2h0c1NoYXBlIiwid2VpZ2h0c1NpemUiLCJ6ZXJvIiwidG9UeXBlZEFycmF5IiwicmVzdWx0RGF0YSIsImNsaXAiLCJjbGlwQXR0cnMiLCJjbGlwQ29uZmlnIiwicmVhbFZhbHMiLCJpbWFnVmFscyIsImNvbXBsZXhWYWxzIiwiaHlwb3QiLCJpbnB1dHMyRCIsImNvbE9mZnNldCIsInRJZHgiLCJyZXNJZHgiLCJjb252MkQiLCJ4U3RyaWRlcyIsImZpbHRlclN0cmlkZXMiLCJ4QmF0Y2hTdHJpZGUiLCJ4Um93U3RyaWRlIiwieENvbFN0cmlkZSIsInhDaGFubmVsU3RyaWRlIiwieUJhdGNoU3RyaWRlIiwieVJvd1N0cmlkZSIsInlDb2xTdHJpZGUiLCJ5Q2hhbm5lbFN0cmlkZSIsIndWYWxzIiwieVZhbHMiLCJ4T2Zmc2V0MSIsInlPZmZzZXQxIiwieVIiLCJ5T2Zmc2V0MiIsInhSQ29ybmVyIiwieFIiLCJ3T2Zmc2V0MSIsInhPZmZzZXQyIiwieUMiLCJ5T2Zmc2V0MyIsInhDQ29ybmVyIiwieEMiLCJ4T2Zmc2V0MyIsIndPZmZzZXQzIiwieFZhbCIsImRXIiwidG9wUGFkIiwiZHlWYWxzIiwieVJNaW4iLCJ5Uk1heCIsInlDTWluIiwieUNNYXgiLCJkeVN0cmlkZXMiLCJkeFZhbHVlcyIsImR5VmFsdWVzIiwiZmx0VmFsdWVzIiwiZmx0UzAiLCJmbHRTMSIsImZsdFMyIiwieFJNaW4iLCJ4Q01pbiIsImR5T2Zmc2V0IiwiZmx0T2Zmc2V0IiwieUYiLCJ4RkNvcm5lciIsIndGIiwieEYiLCJ3T2Zmc2V0MiIsInlPZmZzZXQ0IiwieE9mZnNldDQiLCJ3T2Zmc2V0NCIsImR3IiwiZHdWYWx1ZXMiLCJkd1MwIiwiZHdTMSIsImR3UzIiLCJkd1MzIiwiZHlTMCIsImR5UzEiLCJkeVMyIiwiZHlTMyIsInhTMCIsInhTMSIsInhTMiIsInhTMyIsImZyb250UGFkIiwieUZNaW4iLCJ5Rk1heCIsImNvbnYzREJhY2twcm9wSW5wdXRWMiIsImR4UzAiLCJkeFMxIiwiZHhTMiIsImR4UzMiLCJmbHRTMyIsInhGTWluIiwiY29udjNEQmFja3Byb3BJbnB1dFYyQ29uZmlnIiwiYm94VmFscyIsImJveEluZFZhbHMiLCJpbWFnZVZhbHMiLCJpblN0cmlkZSIsIm91dFN0cmlkZSIsInN0YXJ0SW5kIiwieTEiLCJ4MSIsInkyIiwieDIiLCJiSW5kIiwieUluZCIsImluZCIsInRvcEluZCIsImJvdHRvbUluZCIsInlMZXJwIiwieEluZCIsImxlZnRJbmQiLCJyaWdodEluZCIsInhMZXJwIiwidG9wTGVmdCIsInRvcFJpZ2h0IiwiYm90dG9tTGVmdCIsImJvdHRvbSIsImNsb3Nlc3RYIiwiY2xvc2VzdFkiLCJpbkluZCIsIm91dEluZCIsInJlc3VsdER0eXBlIiwiZmluYWxEaW0iLCJpbmRleEFkanVzdGVyIiwicHJldklkeCIsIm91dHB1dElkeCIsImluSCIsIm9mZnNldEgiLCJpblciLCJvZmZzZXREIiwiaW5wdXRJZHgiLCJjaE11bCIsInEiLCJ0cnVuYyIsImRtIiwiZGlsYXRpb24yZENvbmZpZyIsImZpbHRlclZhbHMiLCJmaWx0ZXJSYW5rIiwib3V0cHV0VmFscyIsImhPdXQiLCJoQmVnIiwid091dCIsIndCZWciLCJjdXJWYWwiLCJNSU5fU0FGRV9JTlRFR0VSIiwiaEluIiwid0luIiwieEluZGV4IiwibG9jVG9JbmRleCIsImZpbHRlckluZGV4IiwiZGlsYXRpb24yZEJhY2twcm9wRmlsdGVyQ29uZmlnIiwidG9OZXN0ZWRBcnJheSIsIiRmaWx0ZXIiLCIkZHkiLCJncmFkaWVudHMiLCJtYWtlWmVyb3NOZXN0ZWRUeXBlZEFycmF5IiwiaE1heCIsIndNYXgiLCJkaWxhdGlvbjJkQmFja3Byb3BJbnB1dENvbmZpZyIsImhJbk1heCIsIndJbk1heCIsInYiLCJhMSIsImEyIiwiYTMiLCJhNCIsImE1IiwiZmlsbFZhbHVlcyIsImJhdGNoSWR4IiwiYmF0Y2hPZmZzZXQiLCJyb3dPZmZzZXQiLCJjb29yZFgiLCJvdXRJZHgiLCJvdXRwdXRWYWx1ZSIsImZsb29yRGl2SW1wbCIsImZ1c2VkQ29udjJEIiwicmVzdWx0T2xkIiwib2xkUmVzdWx0IiwicGFyYW1zU2hhcGUiLCJpbmRleFRvTG9jIiwiJGJhdGNoRGltcyIsIm9yaWdpbmFsTG9jIiwiaW5kaWNlc0lkeCIsImluZGljZXNJbmRleCIsIm9yaWdpbmFsSW5kZXgiLCJpbWFnVmFsIiwibFJOIiwic3VtQWNyb3NzQ2hhbm5lbHMiLCJjdXJyZW50Q2hhbm5lbCIsImJlZ2luU3VtT2Zmc2V0IiwiZW5kU3VtT2Zmc2V0IiwieiIsImxSTkNvbmZpZyIsImxSTkdyYWQiLCJkeVNpemUiLCJ5VmFsdWVzIiwiZGVwdGhCZWdpbiIsImRlcHRoRW5kIiwibm9ybSIsImR5aSIsImxSTkdyYWRDb25maWciLCJsb2dpY2FsQW5kSW1wbCIsImxvZ2ljYWxPckltcGwiLCJtYXhQb29sM0QiLCJpbnB1dEJ1ZiIsIm1heFBvc0J1ZiIsIm1hc2siLCJtYXhQb29sM0RHcmFkQ29uZmlnIiwicG9vbGVkIiwicG9vbGVkRGF0YUlkIiwiaW5kZXhlc0RhdGFJZCIsIm1heFBvb2xzIiwibWF4UG9zaXRpb25zIiwicmVkdWNlU2l6ZVNjYWxhciIsIm1pcnJvclBhZCIsInJlc3VsdFNpemUiLCJyZXN1bHRSYW5rIiwicmVzdWx0U3RyaWRlcyIsImluSW5kZXgiLCJtb2RJbXBsIiwicmVtIiwicHJvYmFiaWxpdGllcyIsIm51bUV2ZW50cyIsInByb2JWYWxzIiwicmVzU2hhcGUiLCJjZGYiLCJldmVudCIsInJhbmRvbSIsIm91dE9mZnNldCIsInNhbXBsZUlkIiwibXVsdGlwbHlDb21wbGV4SW1wbCIsInhEdHlwZSIsIm1pbnVzT25lIiwiaW5kaWNlc1ZhbCIsIm91dENvb3JkcyIsInBvd0ltcGwiLCJwcmVsdUltcGwiLCJ4VmFsdWUiLCJyZWR1Y3Rpb25BeGVzIiwicmVhbFZhbCIsInJlYWxEaXZJbXBsIiwiZGl2IiwiaW1hZ2VzU3RyaWRlcyIsImVmZmVjdGl2ZUlucHV0U2l6ZSIsImVmZmVjdGl2ZU91dHB1dFNpemUiLCJlZmZlY3RpdmVSb3dTaXplUmF0aW8iLCJlZmZlY3RpdmVDb2xTaXplUmF0aW8iLCJzb3VyY2VGcmFjUm93Iiwic291cmNlUm93Rmxvb3IiLCJyb3dGcmFjIiwic291cmNlUm93Q2VpbCIsInRvcFJvd09mZnNldCIsImJvdFJvd09mZnNldCIsInNvdXJjZUZyYWNDb2wiLCJzb3VyY2VDb2xGbG9vciIsImNvbEZyYWMiLCJzb3VyY2VDb2xDZWlsIiwidG9wTGVmdE9mZmVzdCIsImJvdExlZnRPZmZzZXQiLCJ0b3BSaWdodE9mZnNldCIsImJvdFJpZ2h0T2ZmZXN0IiwibmV3VmFsdWUiLCJiT2Zmc2V0IiwidG9wRHhSSW5kZXgiLCJib3R0b21EeFJJbmRleCIsInRvcER4Uk9mZnNldCIsImJvdHRvbUR4Uk9mZnNldCIsImR4UkxlcnAiLCJpbnZlcnNlRHhSTGVycCIsImxlZnREeENJbmRleCIsInJpZ2h0RHhDSW5kZXgiLCJkeENMZXJwIiwiaW52ZXJzZUR4Q0xlcnAiLCJ0b3BMZWZ0UkNPZmZzZXQiLCJ0b3BSaWdodFJDT2Zmc2V0IiwiYm90dG9tTGVmdFJDT2Zmc2V0IiwiYm90dG9tUmlnaHRSQ09mZnNldCIsImludmVyc2VEeFJMZXJwVGltZXNJbnZlcnNlRHhDTGVycCIsImludmVyc2VEeFJMZXJwVGltZXNEeENMZXJwIiwiZHhSTGVycFRpbWVzSW52ZXJzZUR4Q0xlcnAiLCJkeFJMZXJwVGltZXNEeENMZXJwIiwiZHlWYWwiLCJvdXRwdXRPZmZzZXQiLCJzb3VyY2VOZWFyZXN0Um93Iiwic291cmNlTmVhcmVzdENvbCIsIm5ld1ZhbCIsInN0YXJ0UkxlcnAiLCJzdGFydER5UiIsInN0YXJ0Q0xlcnAiLCJzdGFydER5QyIsImFjY3VtIiwiZHlSSW5kZXgiLCJkeVJPZmZzZXQiLCJkeUNJbmRleCIsImR5Q09mZnNldCIsIm91dExvYyIsImluTG9jIiwic2luRmFjdG9yIiwiY29zRmFjdG9yIiwiY29vcmRZIiwiYmFzZSIsInVwZGF0ZXNCdWYiLCJzY2F0dGVySW1wbCIsInN1bUR1cGVJbmRpY2VzIiwidXBkYXRlc0RhdGEiLCJjb25kaXRpb25SYW5rIiwidFZhbHVlcyIsImVWYWx1ZXMiLCJuZXdWYWx1ZXMiLCJzY2FsZUFscGhhIiwiaW5CdWYiLCJmcm9tU3RyaW5nQXJyYXlUb1VpbnQ4IiwibG9naXRzUmFuayIsIm1heExvZ2l0UmVzaGFwZWQiLCJzdW1SZXNoYXBlZCIsInRvb0xhcmdlIiwidG9vU21hbGwiLCJleHBYIiwicmVzaGFwZUlucHV0cyIsInJlc2hhcGVBdHRycyIsInBhZGRlZFhSZXNoYXBlZCIsInRyYW5zcG9zZUlucHV0cyIsInRyYW5zcG9zZUF0dHJzIiwicmVzdWx0UmVzaGFwZUlucHV0cyIsInJlc3VsdFJlc2hhcGVBdHRycyIsImluZGljZXNEVHlwZSIsInZhbHVlc0RUeXBlIiwiaW5kaWNlc0NvdW50IiwiZGVuc2VSb3dzIiwicm93c0FyZU9yZGVyZWQiLCJsYXN0SW5kaWNlc1JvdyIsImNzck9mZnNldCIsImFsbFJvd3NGdWxsIiwicm93RW1wdHkiLCJmdWxsSW5kaWNlc0NvdW50IiwiZmlsbGVkQ291bnQiLCJvdXRwdXRJIiwic3RhcnRpbmdJbmRleCIsImlucHV0SW5kaWNlc1NoYXBlIiwiaW5wdXREVHlwZSIsImRlbnNlU2l6ZSIsIm5ueiIsIm91dHB1dFJhbmsiLCJ1bmtub3duSW5kZXgiLCJtaXNzaW5nIiwiaW5wdXRTdHJpZGVzIiwib3V0cHV0U3RyaWRlcyIsImlzTWVhbiIsImlucHV0RmxhdCIsIm51bUNvbCIsIm91dHB1dFJvd3MiLCJvdXRwdXRMZW5ndGgiLCJ1bmluaXRpYWxpemVkSW5kZXgiLCJuZXh0SW5kZXgiLCJzcXVhcmVkRGlmZmVyZW5jZUltcGwiLCJkaWZmIiwic3RlcEF0dHJzIiwibmV3TG9jIiwiU3RyaW5nTkdyYW1zT3AiLCJwcmVzZXJ2ZVNob3J0IiwiZ2V0UGFkV2lkdGgiLCJuR3JhbVdpZHRoIiwiZ2V0TnVtTkdyYW1zIiwiY3JlYXRlTkdyYW1zIiwic3BsaXRJbmRleCIsIm91dHB1dFN0YXJ0SW5kZXgiLCJudW1OR3JhbXMiLCJuR3JhbUluZGV4IiwibGVmdFBhZGRpbmciLCJyaWdodFBhZGRpbmciLCJudW1Ub2tlbnMiLCJkYXRhU3RhcnRJbmRleCIsIm5HcmFtU2l6ZSIsIm5HcmFtIiwibmV4dE5HcmFtSW5kZXgiLCJhcHBlbmRUb05HcmFtIiwic3RyIiwiY29tcHV0ZSIsInNwbGl0cyIsImlucHV0RGF0YVNpemUiLCJzcGxpdHNTaXplIiwicHJldlNwbGl0IiwidmFsaWRTcGxpdHMiLCJudW1CYXRjaEl0ZW1zIiwiZW1wdHkiLCJvdXRwdXRTdGFydElkeCIsImRhdGFMZW5ndGgiLCJkZWxpbWl0ZXJzIiwidG9rZW4iLCJ0b2tlblN0YXJ0IiwidG9rZW5zIiwibWF4TnVtRW50cmllcyIsInBhcnRzIiwibkVudHJpZXMiLCJmaW5nZXJQcmludDY0IiwibW9kdWxvIiwiZ2V0TG93Qml0c1Vuc2lnbmVkIiwic3ViQ29tcGxleEltcGwiLCJjb21wYXJlUGFpciIsInZhbHVlRGlmZiIsImFycmF5IiwicmlnaHQiLCJzZCIsInN3YXAiLCJ2YWxBbmRJbmQiLCJzb3J0IiwidG9wS1ZhbHMiLCJ0b3BLSW5kaWNlcyIsImJhdGNoU3RyaWRlIiwicm93U3RyaWRlIiwiY29sU3RyaWRlIiwidHJhbnNmb3JtVmFscyIsIm91dFkiLCJvdXRYIiwicHJvamVjdGlvbiIsIm1hcENvb3JkIiwibmVhcmVzdEludGVycG9sYXRpb24iLCJiaWxpbmVhckludGVycG9sYXRpb24iLCJvdXRDb29yZCIsImluQ29vcmQiLCJzejIiLCJjbGFtcCIsIm1hcENvb3JkUmVmbGVjdCIsInN6IiwibWFwQ29vcmRXcmFwIiwibWFwQ29vcmROZWFyZXN0IiwibWFwQ29vcmRDb25zdGFudCIsInJlYWRXaXRoRmlsbFZhbHVlIiwieUZsb29yIiwieEZsb29yIiwieUNlaWwiLCJ4Q2VpbCIsIm5ld1N0cmlkZXMiLCJ1bmlxdWVFbGVtZW50cyIsImlucHV0QnVmZmVyIiwidW5pcXVlSW5kaWNlcyIsImlzMURUZW5zb3IiLCJlbGVtZW50IiwiYXhpc1ZhbHVlcyIsInVuZGVmaW5lZCIsInVuaXF1ZUluZGV4Iiwib3V0cHV0VG1wU2hhcGUiLCJvdXRwdXRCdWZmZXIiLCJ1bmlxdWVFbGVtZW50SW5kZXgiLCJ2YWx1ZVJhbmsiLCJ0ZW1wUmVzIiwibnVtSXRlcnMiLCJleHBhbmRlZCIsInNjYWxhclZhbHVlIiwic2VnbWVudElkIiwibWFza0Nhc3RlZCIsIm11bCIsInN1bVRlbnNvckluZm8iLCJjdXJyZW50IiwiYWRkUmVzIiwiYWN0aXZhdGlvblJlcyIsImNyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGwiLCJhU3RyaWRlcyIsImJTdHJpZGVzIiwiYUJyb2FkY2FzdERpbXMiLCJiQnJvYWRjYXN0RGltcyIsImFMb2MiLCJhSW5kZXgiLCJiTG9jIiwiYkluZGV4Iiwic2ltcGxlSW1wbCIsImNvbXBsZXhJbXBsIiwiJGFDb21wbGV4IiwiJGFDb21wbGV4VmFscyIsImFSZWFsVmFscyIsImFJbWFnVmFscyIsIiRiQ29tcGxleCIsIiRiQ29tcGxleFZhbHMiLCJiUmVhbFZhbHMiLCJiSW1hZ1ZhbHMiLCJyZXN1bHRSZWFsRGF0YSIsInJlc3VsdEltYWdEYXRhIiwicmVzdWx0UmVhbCIsInJlc3VsdEltYWciLCJjcmVhdGVDb21wbGV4QmluYXJ5S2VybmVsSW1wbCIsInJlc3VsdFJlYWxWYWxzIiwicmVzdWx0SW1hZ1ZhbHMiLCJhSWR4IiwiYklkeCIsIm9wUmVzdWx0IiwiZmZ0QmF0Y2giLCJpbnB1dFZhbHMiLCJyZWFsMkQiLCJpbWFnMkQiLCJnZXRDb21wbGV4V2l0aEluZGV4IiwiJHJlYWxJbmZvIiwiJGltYWdJbmZvIiwiZmZ0UmFkaXgyIiwicmVhbEluZm8iLCJpbWFnSW5mbyIsInNpemVJbmZvIiwic2l6ZUluZm9Db3B5IiwiZGl2UmVhbEluZm8iLCJkaXZJbWFnSW5mbyIsImRpdlJlYWxWYWxzIiwiZGl2SW1hZ1ZhbHMiLCJyYXdPdXRwdXQiLCJyZXQiLCJleHBvbmVudCIsInRlcm0iLCJhc3NpZ25Ub1R5cGVkQXJyYXkiLCJmb3VyaWVyVHJhbnNmb3JtQnlNYXRtdWwiLCJzcGxpdFJlYWxBbmRJbWFnQXJyYXlzIiwiaGFsZiIsImV2ZW5Db21wbGV4IiwiY29tcGxleFdpdGhFdmVuSW5kZXgiLCJldmVuUmVhbFZhbHMiLCJldmVuSW1hZ1ZhbHMiLCJldmVuU2hhcGUiLCJldmVuUmVhbEluZm8iLCJldmVuSW1hZ0luZm8iLCJldmVuVGVuc29ySW5mbyIsIm9kZENvbXBsZXgiLCJjb21wbGV4V2l0aE9kZEluZGV4Iiwib2RkUmVhbFZhbHMiLCJvZGRJbWFnVmFscyIsIm9kZFNoYXBlIiwib2RkUmVhbEluZm8iLCJvZGRJbWFnSW5mbyIsIm9kZFRlbnNvckluZm8iLCIkZXZlbkNvbXBsZXgiLCIkZXZlblJlYWxWYWxzIiwiJGV2ZW5JbWFnVmFscyIsIiRldmVuU2hhcGUiLCIkZXZlblJlYWxJbmZvIiwiJGV2ZW5JbWFnSW5mbyIsIiRldmVuVGVuc29ySW5mbyIsIiRvZGRDb21wbGV4IiwiJG9kZFJlYWxWYWxzIiwiJG9kZEltYWdWYWxzIiwiJG9kZFNoYXBlIiwiJG9kZFJlYWxJbmZvIiwiJG9kZEltYWdJbmZvIiwiJG9kZFRlbnNvckluZm8iLCJleHBvbmVudHMiLCJlU2hhcGUiLCJlUmVhbEluZm8iLCJlSW1hZ0luZm8iLCJleHBvbmVudEluZm8iLCJhZGRQYXJ0Iiwic3ViUGFydCIsImFkZFBhcnRSZWFsIiwic3ViUGFydFJlYWwiLCJhZGRQYXJ0SW1hZyIsInN1YlBhcnRJbWFnIiwiJHJlYWwiLCIkaW1hZyIsIiRyZWFsVmFscyIsIiRpbWFnVmFscyIsImFwcGx5QWN0aXZhdGlvbiIsInBvb2wiLCJpbml0aWFsVmFsdWUiLCJQT1NJVElWRV9JTkZJTklUWSIsIm91dHB1dEJhdGNoU3RyaWRlcyIsIm91dHB1dFJvd1N0cmlkZXMiLCJvdXRwdXRDb2xTdHJpZGVzIiwib3V0cHV0QmF0Y2hPZmZzZXQiLCJpbnB1dEJhdGNoT2Zmc2V0IiwieFJNYXgiLCJvdXRwdXRSb3dPZmZzZXQiLCJ4Q01heCIsIm1pbk1heFZhbHVlIiwiYXZnVmFsdWUiLCJjb3VudCIsInhST2Zmc2V0IiwicGl4ZWwiLCJtYXhWYWx1ZSIsIm1heFBvc2l0aW9uIiwicG9vbDNkIiwib3V0cHV0RGVwdGhTdHJpZGVzIiwieURlcHRoIiwieERlcHRoQ29ybmVyIiwieERlcHRoTWluIiwieERlcHRoTWF4Iiwib3V0cHV0RGVwdGhPZmZzZXQiLCJ5Um93IiwieFJvd0Nvcm5lciIsInhSb3dNaW4iLCJ4Um93TWF4IiwieUNvbCIsInhDb2xDb3JuZXIiLCJ4Q29sTWluIiwieENvbE1heCIsIm91dHB1dENvbE9mZnNldCIsInhEZXB0aCIsInhEZXB0aE9mZnNldCIsInhSb3ciLCJ4Um93T2Zmc2V0IiwieENvbCIsImNyZWF0ZVNpbXBsZVVuYXJ5SW1wbCIsInVuYXJ5S2VybmVsRnVuY0Zyb21JbXBsIiwidW5hcnlJbXBsIiwiemVyb3MiLCJCYWNrZW5kV2FzbSIsIndhc20iLCJkYXRhSWROZXh0TnVtYmVyIiwidGZqcyIsImluaXQiLCJkYXRhSWRNYXAiLCJzdHJpbmdCeXRlcyIsIm1lbW9yeU9mZnNldCIsIm51bUJ5dGVzIiwiX21hbGxvYyIsInJlZ2lzdGVyVGVuc29yIiwiSEVBUFU4IiwiYnl0ZU9mZnNldCIsInR5cGVkQXJyYXlGcm9tQnVmZmVyIiwiX2ZyZWUiLCJnZXRNZW1vcnlPZmZzZXQiLCJQVGhyZWFkIiwidGVybWluYXRlQWxsVGhyZWFkcyIsInR5cGVkQXJyYXlGcm9tSGVhcCIsImdldFBhdGhUb1dhc21CaW5hcnkiLCJzaW1kU3VwcG9ydGVkIiwidGhyZWFkc1N1cHBvcnRlZCIsIndhc21Nb2R1bGVGb2xkZXIiLCJ3YXNtUGF0aCIsIndhc21GaWxlTWFwIiwiYXN5bmMiLCJnZXRBc3luYyIsInJlamVjdCIsImZhY3RvcnlDb25maWciLCJsb2NhdGVGaWxlIiwicHJlZml4IiwiZW5kc1dpdGgiLCJyZXNwb25zZSIsImJsb2IiLCJCbG9iIiwiVVJMIiwiY3JlYXRlT2JqZWN0VVJMIiwid2FzbVBhdGhQcmVmaXgiLCJjdXN0b21GZXRjaCIsImluc3RhbnRpYXRlV2FzbSIsImltcG9ydHMiLCJjYWxsYmFjayIsImZldGNoIiwiY3JlZGVudGlhbHMiLCJ0aGVuIiwiZW52IiwiYXJyYXlCdWZmZXIiLCJXZWJBc3NlbWJseSIsImluc3RhbnRpYXRlIiwiaW5zdGFuY2UiLCJpbml0aWFsaXplZCIsIm9uQWJvcnQiLCJpbml0QWJvcnRlZCIsIm1lc3NhZ2UiLCJtYWluU2NyaXB0VXJsT3JCbG9iIiwiY3dyYXAiLCJ3YXNtQmluYXJ5TmFtZXMiLCJzZXRXYXNtUGF0aCIsInVzZVBsYXRmb3JtRmV0Y2giLCJzZXRXYXNtUGF0aHMiLCJwcmVmaXhPckZpbGVNYXAiLCJtaXNzaW5nUGF0aHMiLCJyZXNldFdhc21QYXRoIiwidmFsaWRhdGUiLCJNZXNzYWdlQ2hhbm5lbCIsInBvcnQxIiwicG9zdE1lc3NhZ2UiLCJTaGFyZWRBcnJheUJ1ZmZlciIsIndhc21GdW5jIiwic2V0dXBGdW5jIiwiaW5wdXRJZHMiLCJpbnB1dElkc0J5dGVzIiwid2FzbUFsbCIsImlucHV0SWQiLCJ0cmFuc3Bvc2VkIiwib3JpZ2luYWxBeGVzIiwiaW5wdXRXYXNUcmFuc3Bvc2VkIiwid2FzbUFueSIsInhJZCIsInRyYW5zcG9zZWRJZCIsImlubmVyU2l6ZSIsIndhc21BdmdQb29sIiwicGFkUmlnaHQiLCJwYWRCb3R0b20iLCJ3YXNtQmF0Y2hNYXRNdWwiLCJhM2RJZCIsImIzZElkIiwiYVNoYXBlQnl0ZXMiLCJiU2hhcGVCeXRlcyIsImluVmFscyIsIndhc21DbGlwIiwic3VtSW5uZXJEaW1zIiwiaW5PZmZzZXQiLCJ3YXNtQ29udjJkIiwiZmlsdGVySWQiLCJpbnB1dENoYW5uZWxzIiwib3V0cHV0Q2hhbm5lbHMiLCJpc1NhbWVQYWQiLCJ3YXNtQ29udjJEQmFja3Byb3BJbnB1dCIsImR4U3RyaWRlcyIsImR5SWQiLCJJbnRlcnBvbGF0aW9uTWV0aG9kIiwid2FzbUNyb3BBbmRSZXNpemUiLCJjYXN0ZWREYXRhIiwiaW1hZ2VzRGF0YSIsImltYWdlc0lkIiwiYm94ZXNJZCIsImJveEluZElkIiwiaW1hZ2VzU2hhcGVCeXRlcyIsIndhc21DdW1zdW0iLCJwZXJtdXRlZE91dCIsInBlcm11dGVkWElkIiwicGVybXV0ZWRPdXRJZCIsInVuZG9QZXJtdXRhdGlvbiIsIndhc21EZXB0aFRvU3BhY2UiLCJ4U3RyaWRlc0J5dGVzIiwib3V0cHV0U2hhcGVCeXRlcyIsIm91dFN0cmlkZXNCeXRlcyIsIndhc21EZXB0aHdpc2VDb252MmQiLCJ3YXNtRmxpcExlZnRSaWdodCIsImZsaXBMZWZ0UmlnaHQiLCJpbWFnZUlkIiwid2FzbUJhdGNoTm9ybSIsImZ1c2VkQmF0Y2hOb3JtQ29uZmlnIiwibWVhbklkIiwidmFyaWFuY2VJZCIsIm9mZnNldElkIiwic2NhbGVJZCIsIndhc21GdXNlZENvbnYyZCIsImJpYXNJZCIsImJpYXNEYXRhIiwicHJlbHVBY3RpdmF0aW9uV2VpZ2h0c0lkIiwid2FzbUZ1c2VkRGVwdGh3aXNlQ29udjJkIiwid2FzbUdhdGhlck5kIiwiaW5kaWNlc0lkIiwic3RyaWRlc0J5dGVzIiwid2FzbUdhdGhlciIsInN0cmlkZXNTaXplIiwid2FzbU1heCIsIndhc21NYXhQb29sIiwid2FzbU1lYW4iLCJjYXN0ZWRJbnB1dCIsIndhc21NaW4iLCJNaXJyb3JQYWRkaW5nTW9kZSIsIndhc21NaXJyb3JQYWQiLCJ4U2hhcGVCeXRlcyIsInByZVBhZGRpbmdzRmxhdCIsInBhZFR1cGxlIiwicG9zdFBhZGRpbmdzRmxhdCIsInByZVBhZGRpbmdzQnl0ZXMiLCJwb3N0UGFkZGluZ3NCeXRlcyIsInNjb3Jlc0lkIiwicmVzT2Zmc2V0IiwicFNlbGVjdGVkSW5kaWNlcyIsInNlbGVjdGVkU2l6ZSIsInBTZWxlY3RlZFNjb3JlcyIsInBWYWxpZE91dHB1dHMiLCJwYXJzZVJlc3VsdFN0cnVjdCIsIndhc21PbmVIb3QiLCJ3YXNtUGFkVjIiLCJ3YXNtUHJlbHUiLCJ3ZWlnaHRzSWQiLCJ3YXNtUHJvZCIsIndhc21SZXNpemVCaWxpbmVhciIsIndhc21SZXZlcnNlIiwiYXhlc0J5dGVzIiwib3V0U2hhcGVCeXRlcyIsIndhc21Sb3RhdGUiLCJyb3RhdGVXaXRoT2Zmc2V0IiwiZmlsbEJ5dGVzIiwid2FzbVNjYXR0ZXJOZCIsInVwZGF0ZXNJZCIsIndhc21TZWxlY3QiLCJjb25kaXRpb25JZCIsInRJZCIsImVJZCIsInRSYW5rIiwiYmVnaW5fIiwic2l6ZV8iLCJ4U3RyaWRlIiwiYmVnaW5JIiwiYmVnaW5KIiwiZW5kSSIsInhPZmZzZXQiLCJzbGljZTJkIiwieFN0cmlkZTEiLCJ4U3RyaWRlMiIsImJlZ2luSyIsImVuZEoiLCJzbGljZTNkIiwieFN0cmlkZTMiLCJlbmRLIiwiYmVnaW5MIiwic2xpY2U0ZCIsInhTbGljZVNpemUiLCJ3YXNtU3RlcCIsIndhc21TdHJpZGVkU2xpY2UiLCJlbGxpcHNpc0F4ZXMiLCJzbGljZV91dGlsIiwibWFza1RvQXhlcyIsIm51bUludGVycG9sYXRlZEF4ZXMiLCJleHBhbmRBeGVzIiwibm9ybWFsaXplZEJlZ2luIiwibm9ybWFsaXplZEVuZCIsIm5vcm1hbGl6ZWRTdHJpZGVzIiwiZ2V0Tm9ybWFsaXplZEF4ZXMiLCJzaHJpbmtBeGVzIiwieFNsaWNlZCIsImJlZ2luQnl0ZXMiLCJlbmRCeXRlcyIsIndhc21TdW0iLCJ3YXNtVGlsZSIsIm5ld1NoYXBlQnl0ZXMiLCJ3YXNtVG9wSyIsInRvcGsiLCJvdXRWYWx1ZXNJZCIsIm91dEluZGljZXMiLCJvdXRJbmRpY2VzSWQiLCJ3YXNtVHJhbnNmb3JtIiwidHJhbnNmb3Jtc0lkIiwid2FzbVRyYW5zcG9zZSIsInJlZHVjZWRTaGFwZSIsIm5ld1Blcm0iLCJtaW5WYWxJZHgiLCJyZW1vdmVPbmVTaXplRGltcyIsInBlcm1Jc05vT3AiLCJjbG9uZWQiLCJwZXJtQnl0ZXMiLCJudW1PdXRwdXRzIiwib3V0cyIsIndhc21GdXNlZE1hdE11bCIsImZ1c2VkTWF0TXVsQ29uZmlnIiwiYUlkIiwiYklkIiwiY3JlYXRlQmluYXJ5S2VybmVsQ29uZmlnIiwic3VwcG9ydHNGdWxsQnJvYWRjYXN0Iiwib3V0cHV0VHlwZSIsImxvb3BzT3ZlckFsbE9mQSIsImxvb3BzT3ZlckFsbE9mQiIsInBlcm11dGVBeGVzQW5kVHJhbnNwb3NlIiwiQ3BwRFR5cGUiLCJGdXNhYmxlQWN0aXZhdGlvbiIsImNyZWF0ZVVuYXJ5S2VybmVsQ29uZmlnIiwiX3NjcmlwdERpciIsIldhc21CYWNrZW5kTW9kdWxlVGhyZWFkZWRTaW1kIiwiY3VycmVudFNjcmlwdCIsIl9fZmlsZW5hbWUiLCJHUk9XQUJMRV9IRUFQX0k4Iiwid2FzbU1lbW9yeSIsInVwZGF0ZUdsb2JhbEJ1ZmZlckFuZFZpZXdzIiwiSEVBUDgiLCJHUk9XQUJMRV9IRUFQX1U4IiwiR1JPV0FCTEVfSEVBUF9JMzIiLCJIRUFQMzIiLCJHUk9XQUJMRV9IRUFQX1UzMiIsIkhFQVBVMzIiLCJHUk9XQUJMRV9IRUFQX0Y2NCIsIkhFQVBGNjQiLCJyZWFkeVByb21pc2VSZXNvbHZlIiwicmVhZHlQcm9taXNlUmVqZWN0IiwiTW9kdWxlIiwibW9kdWxlT3ZlcnJpZGVzIiwiYXJndW1lbnRzXyIsInF1aXRfIiwidG9UaHJvdyIsIkVOVklST05NRU5UX0lTX1dFQiIsIkVOVklST05NRU5UX0lTX1dPUktFUiIsIkVOVklST05NRU5UX0lTX05PREUiLCJFTlZJUk9OTUVOVF9JU19TSEVMTCIsImltcG9ydFNjcmlwdHMiLCJwcm9jZXNzIiwidmVyc2lvbnMiLCJub2RlIiwiRU5WSVJPTk1FTlRfSVNfUFRIUkVBRCIsInJlYWRfIiwicmVhZEFzeW5jIiwicmVhZEJpbmFyeSIsIm5vZGVGUyIsIm5vZGVQYXRoIiwic2NyaXB0RGlyZWN0b3J5Iiwibm9kZVdvcmtlclRocmVhZHMiLCJkaXJuYW1lIiwiX19kaXJuYW1lIiwiZmlsZW5hbWUiLCJyZXBsYWNlIiwiZXgiLCJFeGl0U3RhdHVzIiwiYWJvcnQiLCJXb3JrZXIiLCJyZWFkYnVmZmVyIiwic2NyaXB0QXJncyIsImFyZ3VtZW50cyIsInF1aXQiLCJwcmludCIsInByaW50RXJyIiwic2VsZiIsImxvY2F0aW9uIiwiaHJlZiIsInN1YnN0ciIsImxhc3RJbmRleE9mIiwidXJsIiwieGhyIiwiWE1MSHR0cFJlcXVlc3QiLCJvcGVuIiwic2VuZCIsInJlc3BvbnNlVGV4dCIsInJlc3BvbnNlVHlwZSIsIm9ubG9hZCIsIm9uZXJyb3IiLCJwZXJmb3JtYW5jZSIsIndhc21CaW5hcnkiLCJlcnIiLCJBdG9taWNzIiwibG9hZCIsInN0b3JlIiwiY29tcGFyZUV4Y2hhbmdlIiwid2FzbU1vZHVsZSIsIm5vRXhpdFJ1bnRpbWUiLCJBQk9SVCIsInRleHQiLCJnZXRDRnVuYyIsImlkZW50IiwiY2NhbGwiLCJyZXR1cm5UeXBlIiwiYXJnVHlwZXMiLCJvcHRzIiwidG9DIiwic3RyaW5nVG9VVEY4Iiwic3RhY2tBbGxvYyIsIndyaXRlQXJyYXlUb01lbW9yeSIsImNBcmdzIiwic3RhY2siLCJjb252ZXJ0ZXIiLCJzdGFja1NhdmUiLCJhcHBseSIsIlVURjhUb1N0cmluZyIsIkJvb2xlYW4iLCJjb252ZXJ0UmV0dXJuVmFsdWUiLCJzdGFja1Jlc3RvcmUiLCJudW1lcmljQXJncyIsIlVURjhBcnJheVRvU3RyaW5nIiwiaGVhcCIsIm1heEJ5dGVzVG9SZWFkIiwiZW5kSWR4IiwidTAiLCJ1MSIsInUyIiwiU3RyaW5nIiwiZnJvbUNoYXJDb2RlIiwiY2giLCJwdHIiLCJzdHJpbmdUb1VURjhBcnJheSIsIm1heEJ5dGVzVG9Xcml0ZSIsInN0YXJ0SWR4IiwidSIsImNoYXJDb2RlQXQiLCJvdXRQdHIiLCJsZW5ndGhCeXRlc1VURjgiLCJhbGlnblVwIiwibXVsdGlwbGUiLCJJbnQ4QXJyYXkiLCJJbnQxNkFycmF5IiwiVWludDMyQXJyYXkiLCJGbG9hdDY0QXJyYXkiLCJ3YXNtVGFibGUiLCJJTklUSUFMX01FTU9SWSIsIk1lbW9yeSIsImJ5dGVMZW5ndGgiLCJfX0FUUFJFUlVOX18iLCJfX0FUSU5JVF9fIiwiX19BVE1BSU5fXyIsIl9fQVRFWElUX18iLCJfX0FUUE9TVFJVTl9fIiwicHJlUnVuIiwiYWRkT25QcmVSdW4iLCJjYWxsUnVudGltZUNhbGxiYWNrcyIsImluaXRSdW50aW1lIiwicHJlTWFpbiIsImV4aXRSdW50aW1lIiwicG9zdFJ1biIsImFkZE9uUG9zdFJ1biIsImNiIiwidW5zaGlmdCIsIl9fX3dhc21fY2FsbF9jdG9ycyIsInJ1bkRlcGVuZGVuY2llcyIsInJ1bkRlcGVuZGVuY3lXYXRjaGVyIiwiZGVwZW5kZW5jaWVzRnVsZmlsbGVkIiwiYWRkUnVuRGVwZW5kZW5jeSIsInJlbW92ZVJ1bkRlcGVuZGVuY3kiLCJjbGVhckludGVydmFsIiwid2hhdCIsIlJ1bnRpbWVFcnJvciIsImhhc1ByZWZpeCIsInN0YXJ0c1dpdGgiLCJkYXRhVVJJUHJlZml4IiwiaXNEYXRhVVJJIiwiZmlsZVVSSVByZWZpeCIsImlzRmlsZVVSSSIsIndhc21CaW5hcnlGaWxlIiwiZmlsZSIsImdldEJpbmFyeVByb21pc2UiLCJjYXRjaCIsImNyZWF0ZVdhc20iLCJhc21MaWJyYXJ5QXJnIiwicmVjZWl2ZUluc3RhbmNlIiwibnVtV29ya2Vyc1RvTG9hZCIsInVudXNlZFdvcmtlcnMiLCJsb2FkV2FzbU1vZHVsZVRvV29ya2VyIiwicmVjZWl2ZUluc3RhbnRpYXRlZFNvdXJjZSIsImluc3RhbnRpYXRlQXJyYXlCdWZmZXIiLCJyZWNlaXZlciIsInJlYXNvbiIsImluc3RhbnRpYXRlU3RyZWFtaW5nIiwiQVNNX0NPTlNUUyIsIiQwIiwiJDEiLCJzZXRUaW1lb3V0IiwiX19lbXNjcmlwdGVuX2RvX2Rpc3BhdGNoX3RvX3RocmVhZCIsImluaXRQdGhyZWFkc0pTIiwiY2FsbGJhY2tzIiwiYXJnIiwiX2Vtc2NyaXB0ZW5fZnV0ZXhfd2FrZSIsImFkZHIiLCJtYWluVGhyZWFkV2FpdEFkZHJlc3MiLCJfX2Vtc2NyaXB0ZW5fbWFpbl90aHJlYWRfZnV0ZXgiLCJtYWluVGhyZWFkV29rZW4iLCJub3RpZnkiLCJraWxsVGhyZWFkIiwicHRocmVhZF9wdHIiLCJwdGhyZWFkIiwicHRocmVhZHMiLCJ3b3JrZXIiLCJ0ZXJtaW5hdGUiLCJmcmVlVGhyZWFkRGF0YSIsInJ1bm5pbmdXb3JrZXJzIiwiY2FuY2VsVGhyZWFkIiwiY2xlYW51cFRocmVhZCIsInJldHVybldvcmtlclRvUG9vbCIsIl9lbXNjcmlwdGVuX2dldF9ub3ciLCJpbml0TWFpblRocmVhZEJsb2NrIiwicHRocmVhZFBvb2xTaXplIiwibmF2aWdhdG9yIiwiaGFyZHdhcmVDb25jdXJyZW5jeSIsImFsbG9jYXRlVW51c2VkV29ya2VyIiwidGIiLCJoZWFkUHRyIiwidGxzTWVtb3J5IiwiX19lbXNjcmlwdGVuX3RocmVhZF9pbml0IiwiX2Vtc2NyaXB0ZW5fcmVnaXN0ZXJfbWFpbl9icm93c2VyX3RocmVhZF9pZCIsImluaXRXb3JrZXIiLCJ0aHJlYWRFeGl0SGFuZGxlcnMiLCJzZXRUaHJlYWRTdGF0dXMiLCJydW5FeGl0SGFuZGxlcnMiLCJwb3AiLCJfcHRocmVhZF9zZWxmIiwiX19fcHRocmVhZF90c2RfcnVuX2R0b3JzIiwicnVuRXhpdEhhbmRsZXJzQW5kRGVpbml0VGhyZWFkIiwiZXhpdENvZGUiLCJ0aHJlYWRFeGl0IiwidGhyZWFkQ2FuY2VsIiwidGhyZWFkSW5mb1N0cnVjdCIsImFsbG9jYXRlZE93blN0YWNrIiwic3RhY2tCYXNlIiwicnVuV2l0aG91dE1haW5UaHJlYWRRdWV1ZWRDYWxscyIsIl9fZW1zY3JpcHRlbl9hbGxvd19tYWluX3J1bnRpbWVfcXVldWVkX2NhbGxzIiwicmVjZWl2ZU9iamVjdFRyYW5zZmVyIiwib25GaW5pc2hlZExvYWRpbmciLCJvbm1lc3NhZ2UiLCJjbWQiLCJjdXJyZW50UHJveGllZE9wZXJhdGlvbkNhbGxlclRocmVhZCIsInRocmVhZCIsInRhcmdldFRocmVhZCIsIl9lbXNjcmlwdGVuX21haW5fdGhyZWFkX3Byb2Nlc3NfcXVldWVkX2NhbGxzIiwic3Bhd25UaHJlYWQiLCJsb2FkZWQiLCJydW5QdGhyZWFkIiwiYWxlcnQiLCJleGl0IiwidGFyZ2V0IiwibGluZW5vIiwib24iLCJwdGhyZWFkTWFpbkpzIiwiZ2V0TmV3V29ya2VyIiwiYnVzeVNwaW5XYWl0IiwibXNlY3MiLCJlc3RhYmxpc2hTdGFja1NwYWNlIiwic3RhY2tUb3AiLCJzdGFja01heCIsIl9lbXNjcmlwdGVuX3N0YWNrX3NldF9saW1pdHMiLCJnZXROb0V4aXRSdW50aW1lIiwiaW52b2tlRW50cnlQb2ludCIsIl9fX2Fzc2VydF9mYWlsIiwiX19fY2FsbF9tYWluIiwiYXJnYyIsImFyZ3YiLCJfbWFpbiIsInNldEVyck5vIiwiX19fZXJybm9fbG9jYXRpb24iLCJfYXRleGl0IiwiX2Vtc2NyaXB0ZW5fcHJveHlfdG9fbWFpbl90aHJlYWRfanMiLCJfX2Vtc2NyaXB0ZW5fbm90aWZ5X3RocmVhZF9xdWV1ZSIsInRhcmdldFRocmVhZElkIiwibWFpblRocmVhZElkIiwiX2Fib3J0IiwiX2Vtc2NyaXB0ZW5fYXNtX2NvbnN0X2ludCIsImNvZGUiLCJzaWdQdHIiLCJhcmdidWYiLCJyZWFkQXNtQ29uc3RBcmdzIiwiX2Vtc2NyaXB0ZW5fY29uZGl0aW9uYWxfc2V0X2N1cnJlbnRfdGhyZWFkX3N0YXR1cyIsImV4cGVjdGVkU3RhdHVzIiwibmV3U3RhdHVzIiwiX2Vtc2NyaXB0ZW5fZnV0ZXhfd2FpdCIsInRpbWVvdXQiLCJ0Tm93IiwidEVuZCIsImV4Y2hhbmdlIiwid2FpdCIsIl9lbXNjcmlwdGVuX21lbWNweV9iaWciLCJkZXN0IiwiY29weVdpdGhpbiIsIl9lbXNjcmlwdGVuX251bV9sb2dpY2FsX2NvcmVzIiwiY3B1cyIsIm51bUNhbGxBcmdzIiwic2VyaWFsaXplZE51bUNhbGxBcmdzIiwiX2Vtc2NyaXB0ZW5fcnVuX2luX21haW5fcnVudGltZV90aHJlYWRfanMiLCJkYXRlTm93IiwiX2Vtc2NyaXB0ZW5fcmVjZWl2ZV9vbl9tYWluX3RocmVhZF9qc19jYWxsQXJncyIsInJlYWRBc21Db25zdEFyZ3NBcnJheSIsImRvdWJsZSIsIl9lbXNjcmlwdGVuX3JlY2VpdmVfb25fbWFpbl90aHJlYWRfanMiLCJwcm94aWVkRnVuY3Rpb25UYWJsZSIsIl9lbXNjcmlwdGVuX2dldF9oZWFwX3NpemUiLCJlbXNjcmlwdGVuX3JlYWxsb2NfYnVmZmVyIiwiZ3JvdyIsIl9lbXNjcmlwdGVuX3Jlc2l6ZV9oZWFwIiwicmVxdWVzdGVkU2l6ZSIsIm9sZFNpemUiLCJtYXhIZWFwU2l6ZSIsImN1dERvd24iLCJvdmVyR3Jvd25IZWFwU2l6ZSIsIkpTRXZlbnRzIiwiaW5FdmVudEhhbmRsZXIiLCJyZW1vdmVBbGxFdmVudExpc3RlbmVycyIsImV2ZW50SGFuZGxlcnMiLCJfcmVtb3ZlSGFuZGxlciIsImRlZmVycmVkQ2FsbHMiLCJyZWdpc3RlclJlbW92ZUV2ZW50TGlzdGVuZXJzIiwicmVtb3ZlRXZlbnRMaXN0ZW5lcnNSZWdpc3RlcmVkIiwiZGVmZXJDYWxsIiwidGFyZ2V0RnVuY3Rpb24iLCJwcmVjZWRlbmNlIiwiYXJnc0xpc3QiLCJhcnJheXNIYXZlRXF1YWxDb250ZW50IiwiYXJyQSIsImFyckIiLCJyZW1vdmVEZWZlcnJlZENhbGxzIiwiY2FuUGVyZm9ybUV2ZW50SGFuZGxlclJlcXVlc3RzIiwiY3VycmVudEV2ZW50SGFuZGxlciIsImFsbG93c0RlZmVycmVkQ2FsbHMiLCJydW5EZWZlcnJlZENhbGxzIiwicmVtb3ZlQWxsSGFuZGxlcnNPblRhcmdldCIsImV2ZW50VHlwZVN0cmluZyIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJldmVudExpc3RlbmVyRnVuYyIsInVzZUNhcHR1cmUiLCJyZWdpc3Rlck9yUmVtb3ZlSGFuZGxlciIsImV2ZW50SGFuZGxlciIsImpzRXZlbnRIYW5kbGVyIiwiaGFuZGxlckZ1bmMiLCJjYWxsYmFja2Z1bmMiLCJxdWV1ZUV2ZW50SGFuZGxlck9uVGhyZWFkX2lpaWkiLCJldmVudEhhbmRsZXJGdW5jIiwiZXZlbnRUeXBlSWQiLCJldmVudERhdGEiLCJ1c2VyRGF0YSIsInZhcmFyZ3MiLCJfX2Vtc2NyaXB0ZW5fY2FsbF9vbl90aHJlYWQiLCJnZXRUYXJnZXRUaHJlYWRGb3JFdmVudENhbGxiYWNrIiwiZ2V0Tm9kZU5hbWVGb3JUYXJnZXQiLCJub2RlTmFtZSIsImZ1bGxzY3JlZW5FbmFibGVkIiwid2Via2l0RnVsbHNjcmVlbkVuYWJsZWQiLCJzdHJpbmdUb05ld1VURjgiLCJqc1N0cmluZyIsImNTdHJpbmciLCJfZW1zY3JpcHRlbl9zZXRfb2Zmc2NyZWVuY2FudmFzX3NpemVfb25fdGFyZ2V0X3RocmVhZF9qcyIsInRhcmdldENhbnZhcyIsInRhcmdldENhbnZhc1B0ciIsIl9lbXNjcmlwdGVuX3NldF9vZmZzY3JlZW5jYW52YXNfc2l6ZV9vbl90YXJnZXRfdGhyZWFkIiwibWF5YmVDU3RyaW5nVG9Kc1N0cmluZyIsInNwZWNpYWxIVE1MVGFyZ2V0cyIsImZpbmRFdmVudFRhcmdldCIsInF1ZXJ5U2VsZWN0b3IiLCJmaW5kQ2FudmFzRXZlbnRUYXJnZXQiLCJfZW1zY3JpcHRlbl9zZXRfY2FudmFzX2VsZW1lbnRfc2l6ZV9jYWxsaW5nX3RocmVhZCIsImNhbnZhc1NoYXJlZFB0ciIsIm9mZnNjcmVlbkNhbnZhcyIsImNvbnRyb2xUcmFuc2ZlcnJlZE9mZnNjcmVlbiIsImF1dG9SZXNpemVWaWV3cG9ydCIsIkdMY3R4T2JqZWN0IiwiR0xjdHgiLCJwcmV2Vmlld3BvcnQiLCJfZW1zY3JpcHRlbl9zZXRfY2FudmFzX2VsZW1lbnRfc2l6ZV9tYWluX3RocmVhZCIsIl9lbXNjcmlwdGVuX3NldF9jYW52YXNfZWxlbWVudF9zaXplIiwiX2Vtc2NyaXB0ZW5fc2V0X2N1cnJlbnRfdGhyZWFkX3N0YXR1cyIsIl9lbXNjcmlwdGVuX3NldF90aHJlYWRfbmFtZSIsInRocmVhZElkIiwiX193ZWJnbF9lbmFibGVfQU5HTEVfaW5zdGFuY2VkX2FycmF5cyIsImN0eCIsImZpcnN0IiwicHJpbWNvdW50IiwiX193ZWJnbF9lbmFibGVfT0VTX3ZlcnRleF9hcnJheV9vYmplY3QiLCJ2YW8iLCJfX3dlYmdsX2VuYWJsZV9XRUJHTF9kcmF3X2J1ZmZlcnMiLCJidWZzIiwiX193ZWJnbF9lbmFibGVfV0VCR0xfbXVsdGlfZHJhdyIsIm11bHRpRHJhd1dlYmdsIiwiR0wiLCJjb3VudGVyIiwiYnVmZmVycyIsInByb2dyYW1zIiwiZnJhbWVidWZmZXJzIiwicmVuZGVyYnVmZmVycyIsInRleHR1cmVzIiwidW5pZm9ybXMiLCJzaGFkZXJzIiwidmFvcyIsIm9mZnNjcmVlbkNhbnZhc2VzIiwidGltZXJRdWVyaWVzRVhUIiwicHJvZ3JhbUluZm9zIiwic3RyaW5nQ2FjaGUiLCJ1bnBhY2tBbGlnbm1lbnQiLCJyZWNvcmRFcnJvciIsImVycm9yQ29kZSIsImxhc3RFcnJvciIsImdldE5ld0lkIiwidGFibGUiLCJnZXRTb3VyY2UiLCJzaGFkZXIiLCJzdHJpbmciLCJjcmVhdGVDb250ZXh0Iiwid2ViR0xDb250ZXh0QXR0cmlidXRlcyIsInJlZ2lzdGVyQ29udGV4dCIsImhhbmRsZSIsImNvbnRleHQiLCJhdHRyaWJ1dGVzIiwibWFqb3JWZXJzaW9uIiwiZW5hYmxlRXh0ZW5zaW9uc0J5RGVmYXVsdCIsImluaXRFeHRlbnNpb25zIiwibWFrZUNvbnRleHRDdXJyZW50IiwiY29udGV4dEhhbmRsZSIsImN1cnJlbnRDb250ZXh0IiwiZGVsZXRlQ29udGV4dCIsImluaXRFeHRlbnNpb25zRG9uZSIsImRpc2pvaW50VGltZXJRdWVyeUV4dCIsImdldFN1cHBvcnRlZEV4dGVuc2lvbnMiLCJwb3B1bGF0ZVVuaWZvcm1UYWJsZSIsInB0YWJsZSIsIm1heFVuaWZvcm1MZW5ndGgiLCJtYXhBdHRyaWJ1dGVMZW5ndGgiLCJtYXhVbmlmb3JtQmxvY2tOYW1lTGVuZ3RoIiwidXRhYmxlIiwibnVtVW5pZm9ybXMiLCJnZXRBY3RpdmVVbmlmb3JtIiwiX19lbXNjcmlwdGVuX3dlYmdsX3Bvd2VyX3ByZWZlcmVuY2VzIiwiX2Vtc2NyaXB0ZW5fd2ViZ2xfZG9fY3JlYXRlX2NvbnRleHQiLCJwb3dlclByZWZlcmVuY2UiLCJjb250ZXh0QXR0cmlidXRlcyIsIm1pbm9yVmVyc2lvbiIsImV4cGxpY2l0U3dhcENvbnRyb2wiLCJwcm94eUNvbnRleHRUb01haW5UaHJlYWQiLCJyZW5kZXJWaWFPZmZzY3JlZW5CYWNrQnVmZmVyIiwiX2Vtc2NyaXB0ZW5fd2ViZ2xfY3JlYXRlX2NvbnRleHQiLCJhMCIsIlNZU0NBTExTIiwibWFwcGluZ3MiLCJwcmludENoYXIiLCJzdHJlYW0iLCJjdXJyIiwiZ2V0U3RyIiwiZ2V0NjQiLCJsb3ciLCJoaWdoIiwiX2ZkX2Nsb3NlIiwiZmQiLCJfZmRfc2VlayIsIm9mZnNldF9sb3ciLCJvZmZzZXRfaGlnaCIsIndoZW5jZSIsIm5ld09mZnNldCIsIl9mZF93cml0ZSIsImlvdiIsImlvdmNudCIsInBudW0iLCJfcHRocmVhZF9jbGVhbnVwX3BvcCIsImV4ZWN1dGUiLCJyb3V0aW5lIiwiX3B0aHJlYWRfY2xlYW51cF9wdXNoIiwidGhyZWFkUGFyYW1zIiwic3RhY2tIaWdoIiwic3RhY2tTaXplIiwidGlzIiwiZGV0YWNoZWQiLCJnbG9iYWxfbG9jYWxlIiwiX2Vtc2NyaXB0ZW5fZ2V0X2dsb2JhbF9saWJjIiwibXNnIiwic3RhcnRSb3V0aW5lIiwidHJhbnNmZXJMaXN0IiwiX3B0aHJlYWRfY3JlYXRlIiwiYXR0ciIsInN0YXJ0X3JvdXRpbmUiLCJfZW1zY3JpcHRlbl9zeW5jX3J1bl9pbl9tYWluX3RocmVhZF80IiwiX21lbWFsaWduIiwiX3N5c2NvbmYiLCJjYWxsZWRSdW4iLCJydW4iLCJkb1J1biIsImltcGxpY2l0IiwicnVuQ2FsbGVyIiwicmVhZHkiLCJ3YXNtV29ya2VyQ29udGVudHMiLCJXYXNtQmFja2VuZE1vZHVsZSIsIlVURjhEZWNvZGVyIiwiVGV4dERlY29kZXIiLCJlbmRQdHIiLCJEYXRhU3RvcmFnZSIsImRhdGFNb3ZlciIsImRhdGFJZHNDb3VudCIsIm1vdmVEYXRhIiwiS2VybmVsQmFja2VuZCIsIm5vdFlldEltcGxlbWVudGVkIiwic3RyaW5ncyIsIkFSUk9XIiwiQVJST1dfUkVHRVgiLCJudW1UZW5zb3JzIiwibnVtQXJyb3dzIiwiaW5wdXRTdHJpbmciLCJvdXRwdXRTdHJpbmciLCJpbnB1dFRlcm1zIiwibnVtSW5wdXRzIiwiZGltTmFtZSIsImlucHV0VGVybSIsIlNldCIsIm51bURpbXMiLCJuRGltcyIsImRpbVNpemVzIiwiY29tcHV0ZWRUZXJtSW5kaWNlcyIsInRlcm1JbmRpY2VzIiwiZmluZFRlcm1zV2l0aERpbSIsInRlcm1JbmRleCIsIm5vbk1heFN1cHByZXNzaW9uSW1wbF8iLCJyZXR1cm5TY29yZXNUZW5zb3IiLCJyZXR1cm5WYWxpZE91dHB1dHMiLCJjYW5kaWRhdGVzIiwic2NvcmUiLCJib3hJbmRleCIsInN1cHByZXNzQmVnaW5JbmRleCIsImFzY2VuZGluZ0NvbXBhcmF0b3IiLCJjYW5kaWRhdGUiLCJvcmlnaW5hbFNjb3JlIiwiaWdub3JlQ2FuZGlkYXRlIiwiaW91IiwiaW50ZXJzZWN0aW9uT3ZlclVuaW9uIiwic3VwcHJlc3NXZWlnaHQiLCJlbGVtc1RvUGFkIiwiaUNvb3JkIiwiakNvb3JkIiwieW1pbkkiLCJ4bWluSSIsInltYXhJIiwieG1heEkiLCJ5bWluSiIsInhtaW5KIiwieW1heEoiLCJ4bWF4SiIsImFyZWFJIiwiYXJlYUoiLCJpbnRlcnNlY3Rpb25ZbWluIiwiaW50ZXJzZWN0aW9uWG1pbiIsImludGVyc2VjdGlvblltYXgiLCJpbnRlcnNlY3Rpb25YbWF4IiwiaW50ZXJzZWN0aW9uQXJlYSIsIndlaWdodCIsImMxIiwiYzIiLCJiaW5hcnlJbnNlcnQiLCJjb21wYXJhdG9yIiwiYmluYXJ5U2VhcmNoIiwiaW5zZXJ0aW9uUG9pbnQiLCJtaWRkbGUiLCJmb3VuZCIsImNvbXBhcmVSZXN1bHQiLCJiaW5hcnlTZWFyY2hfIiwiZGVmYXVsdENvbXBhcmF0b3IiLCJjb25kU2hhcGUiLCJpbkJ1ZmZlciIsInRvVGVuc29yIiwib3BIYW5kbGVyIiwiY2xvbmUiLCJkZWxheUNhbGxiYWNrIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwic2V0SW1tZWRpYXRlIiwibmV4dEZyYW1lIiwibmF2IiwidXNlckFnZW50IiwidmVuZG9yIiwib3BlcmEiLCJ0ZXN0IiwiV29ya2VyR2xvYmFsU2NvcGUiLCJpc1JlZ2lzdGVyZWRLZXJuZWxJbnZvY2F0aW9uIiwia2VybmVsSW52b2NhdGlvbiIsIkVuZ2luZVN0YXRlIiwicmVnaXN0ZXJlZFZhcmlhYmxlcyIsIm5leHRUYXBlTm9kZUlkIiwibnVtU3RyaW5nVGVuc29ycyIsIm51bURhdGFCdWZmZXJzIiwiZ3JhZGllbnREZXB0aCIsImtlcm5lbERlcHRoIiwic2NvcGVTdGFjayIsIm51bURhdGFNb3Zlc1N0YWNrIiwibmV4dFNjb3BlSWQiLCJwcm9maWxpbmciLCJhY3RpdmVQcm9maWxlIiwibmV3Qnl0ZXMiLCJuZXdUZW5zb3JzIiwicGVha0J5dGVzIiwia2VybmVscyIsIkVuZ2luZSIsInJlZ2lzdHJ5IiwicmVnaXN0cnlGYWN0b3J5IiwicGVuZGluZ0JhY2tlbmRJbml0SWQiLCJzdGF0ZSIsInBlbmRpbmdCYWNrZW5kSW5pdCIsImJhY2tlbmRJbnN0YW5jZSIsInNvcnRlZEJhY2tlbmRzIiwiZ2V0U29ydGVkQmFja2VuZHMiLCJpbml0aWFsaXplQmFja2VuZCIsInN1Y2Nlc3MiLCJzZXRCYWNrZW5kIiwiYXN5bmNJbml0IiwiaW5pdGlhbGl6ZUJhY2tlbmRzQW5kUmV0dXJuQmVzdCIsImJhY2tlbmROYW1lcyIsImZpbmRCYWNrZW5kIiwiZmluZEJhY2tlbmRGYWN0b3J5IiwiZmFjdG9yeSIsInJlZ2lzdGVyQmFja2VuZCIsInByaW9yaXR5Iiwic2V0dXBSZWdpc3RlcmVkS2VybmVscyIsInByb2ZpbGVyIiwia2VybmVsIiwiZGlzcG9zZVJlZ2lzdGVyZWRLZXJuZWxzIiwiZGlzcG9zZUZ1bmMiLCJyZWdpc3RyeUZhY3RvcnlFbnRyeSIsInByb21pc2VJZCIsInJlbW92ZUJhY2tlbmQiLCJzcmNCYWNrZW5kIiwic2hvdWxkQ2hlY2tGb3JNZW1MZWFrcyIsInRpZHkiLCJuYW1lT3JGbiIsImZuIiwic2NvcGVkUnVuIiwic3RhcnRTY29wZSIsImVuZFNjb3BlIiwibmV4dFRlbnNvcklkIiwibmV4dFZhcmlhYmxlSWQiLCJFTkdJTkUiLCJydW5LZXJuZWwiLCJhZGRUYXBlTm9kZSIsImFjdGl2ZVNjb3BlIiwiZ3JhZElucHV0cyIsInJ1bktlcm5lbEZ1bmMiLCJjaGVja0tlcm5lbEZvck1lbUxlYWsiLCJudW1EYXRhSWRzQmVmb3JlIiwib3V0SW5mb3MiLCJudW1EYXRhSWRzQWZ0ZXIiLCJudW1PdXRwdXREYXRhSWRzIiwibnVtTW92ZXMiLCJkYXRhSWRzTGVha2VkIiwia2VybmVsUGFyYW1zIiwib3V0cHV0cyIsInNhdmVkIiwiaXNUYXBlT24iLCJzdGFydGluZ0J5dGVjb3VudCIsInN0YXJ0aW5nTnVtVGVuc29ycyIsImtlcm5lbE9yU2NvcGVOYW1lIiwib3V0VGVuc29ycyIsInRlbnNvcnNUb1NhdmUiLCJnZXRUZW5zb3JzRm9yR3JhZGllbnQiLCJzYXZlVGVuc29yc0ZvckJhY2t3YXJkTW9kZSIsImZvcndhcmRGdW5jIiwic2F2ZUZ1bmMiLCJrZWVwIiwiYmFja3dhcmRzRnVuYyIsImtlcm5lbFByb2ZpbGUiLCJwcm9maWxlS2VybmVsIiwibG9nS2VybmVsUHJvZmlsZSIsImJ5dGVzQWRkZWQiLCJ0b3RhbEJ5dGVzU25hcHNob3QiLCJ0ZW5zb3JzQWRkZWQiLCJ0b3RhbFRlbnNvcnNTbmFwc2hvdCIsImlucHV0U2hhcGVzIiwib3V0cHV0U2hhcGVzIiwiaXRlbSIsImtlcm5lbFRpbWVNcyIsInRpbWVNcyIsImV4dHJhSW5mbyIsImdyYWRDb25maWciLCJpbnB1dHNUb1NhdmUiLCJvdXRwdXRzVG9TYXZlIiwiaW5wdXRUZW5zb3JzVG9TYXZlIiwic2F2ZUFsbElucHV0cyIsImlucHV0TmFtZSIsIm91dHB1dFRlbnNvcnNUb1NhdmUiLCJtYWtlVGVuc29yIiwiYmFja2VuZFZhbHMiLCJ0cmFja1RlbnNvciIsImJ5dGVzIiwibWFrZVZhcmlhYmxlIiwidHJhaW5hYmxlIiwidHJhY2siLCJkaXNwb3NlVGVuc29yIiwiZGlzcG9zZVZhcmlhYmxlcyIsImRpc3Bvc2VWYXJpYWJsZSIsInN0YXJ0Qnl0ZXMiLCJzdGFydE51bVRlbnNvcnMiLCJncmFkaWVudHNGdW5jIiwidGFwZU5vZGUiLCJncmFkRnVuYyIsImdyYWRpZW50IiwiZHlzIiwiYWN0aXZlVGFwZSIsImtlcHQiLCJzdGFydFRhcGUiLCJlbmRUYXBlIiwic2NvcGVJbmZvIiwidGVuc29yc1RvVHJhY2tJblBhcmVudCIsInRlbnNvcnNUb1RyYWNrSW5QYXJlbnRTZXQiLCJvbGRTY29wZSIsInNjb3BlSWQiLCJ4cyIsImFsbG93Tm9HcmFkaWVudHMiLCJmaWx0ZXJlZFRhcGUiLCJhY2N1bXVsYXRlZEdyYWRpZW50TWFwIiwib25lcyIsImdyYWRzIiwiY3VzdG9tR3JhZCIsImlucHV0TWFwIiwic2F2ZSIsImdyYWRSZXMiLCJncmFkTWFwIiwiZ3JhZCIsInRpbWluZ0luZm8iLCJyZXNldCIsImdldE9yTWFrZUVuZ2luZSIsIl90ZmVuZ2luZSIsImVudmlyb25tZW50IiwiVEVOU09SRkxPV0pTX0ZMQUdTX1BSRUZJWCIsIkVudmlyb25tZW50IiwiZmxhZ3MiLCJmbGFnUmVnaXN0cnkiLCJ1cmxGbGFncyIsImdldFF1ZXJ5UGFyYW1zIiwicG9wdWxhdGVVUkxGbGFncyIsInNldFBsYXRmb3JtIiwicGxhdGZvcm1OYW1lIiwicGxhdGZvcm0iLCJmbGFnTmFtZSIsImV2YWx1YXRpb25GbiIsInNldEhvb2siLCJmbGFnVmFsdWUiLCJldmFsdWF0ZUZsYWciLCJnZXRGbGFncyIsInNldEZsYWdzIiwic2VhcmNoIiwidXJsUGFyYW1zIiwia2V5VmFsdWUiLCJ0b0xvd2VyQ2FzZSIsInBhcnNlVmFsdWUiLCJxdWVyeVN0cmluZyIsImRlY29kZVVSSUNvbXBvbmVudCIsImRlY29kZVBhcmFtIiwic2V0RW52aXJvbm1lbnRHbG9iYWwiLCJkZWJ1Z1ZhbHVlIiwiZ2xvYmFsTmFtZVNwYWNlIiwiZ2V0R2xvYmFsTmFtZXNwYWNlIiwiZ2V0R2xvYmFsIiwiZ2xvYmFsTWFwIiwiX3RmR2xvYmFscyIsIk1hcCIsImdldEdsb2JhbE1hcCIsInNpbmdsZXRvbiIsImVuYWJsZVByb2RNb2RlIiwiZW5hYmxlRGVidWdNb2RlIiwiZGlzYWJsZURlcHJlY2F0aW9uV2FybmluZ3MiLCJkZXByZWNhdGlvbldhcm4iLCJlbmdpbmUiLCJwcm9maWxlIiwiY29udGFpbmVyIiwiZ2V0QmFja2VuZCIsImNoZWNrR3JhZHMiLCIkYXJncyIsInZhbHVlQW5kR3JhZCIsInZhbHVlQW5kR3JhZHMiLCJ2YXJpYWJsZUdyYWRzIiwidmFyTGlzdCIsInNwZWNpZmllZFZhckxpc3QiLCJzcGVjaWZpZWROb25UcmFpbmFibGUiLCJvcmlnaW5hbFZhckNvdW50IiwiZyIsIm5hbWVkR3JhZHMiLCJMb25nIiwiaGV4VG9Mb25nIiwiaGV4IiwiZnJvbVN0cmluZyIsImsxIiwiazIiLCJzaGlmdE1peCIsInhvciIsInNocnUiLCJmcm9tQnl0ZXMiLCJmZXRjaDY0IiwiZmV0Y2gzMiIsInJvdGF0ZTY0Iiwib3IiLCJzaGwiLCJoYXNoTGVuMTYiLCJ3ZWFrSGFzaExlbjMyV2l0aFNlZWRzU3RyIiwid2Vha0hhc2hMZW4zMldpdGhTZWVkcyIsImZyb21OdW1iZXIiLCJoYXNoTGVuMHRvMTYiLCJoYXNoTGVuMTd0bzMyIiwiaGFzaExlbjMzdG82NCIsIlVaRVJPIiwibGFzdDY0IiwiYW5kIiwiZGVmZXIiLCJCcm93c2VyRG93bmxvYWRzIiwiZmlsZU5hbWVQcmVmaXgiLCJVUkxfU0NIRU1FIiwibW9kZWxKc29uRmlsZU5hbWUiLCJ3ZWlnaHREYXRhRmlsZU5hbWUiLCJtb2RlbEFydGlmYWN0cyIsIndlaWdodHNVUkwiLCJ3ZWlnaHREYXRhIiwibW9kZWxUb3BvbG9neSIsIkFycmF5QnVmZmVyIiwid2VpZ2h0c01hbmlmZXN0IiwicGF0aHMiLCJ3ZWlnaHRTcGVjcyIsIm1vZGVsSlNPTiIsIm1vZGVsSnNvblVSTCIsImpzb25BbmNob3IiLCJtb2RlbEpzb25BbmNob3IiLCJkb3dubG9hZCIsImRpc3BhdGNoRXZlbnQiLCJNb3VzZUV2ZW50Iiwid2VpZ2h0RGF0YUFuY2hvciIsIm1vZGVsQXJ0aWZhY3RzSW5mbyIsIkJyb3dzZXJGaWxlcyIsImZpbGVzIiwianNvbkZpbGUiLCJ3ZWlnaHRzRmlsZXMiLCJqc29uUmVhZGVyIiwiRmlsZVJlYWRlciIsIm1vZGVsQXJ0aWZhY3RzUHJvbWlzZSIsImxvYWRXZWlnaHRzIiwicmVhZEFzVGV4dCIsImVudHJ5IiwicGF0aFRvRmlsZSIsImNoZWNrTWFuaWZlc3RBbmRXZWlnaHRGaWxlcyIsInByb21pc2VzIiwibG9hZFdlaWdodHNGaWxlIiwid2VpZ2h0RmlsZVJlYWRlciIsInJlYWRBc0FycmF5QnVmZmVyIiwibWFuaWZlc3QiLCJiYXNlbmFtZXMiLCJmaWxlTmFtZXMiLCJncm91cCIsInBhdGhCYXNlbmFtZSIsImJyb3dzZXJEb3dubG9hZHNSb3V0ZXIiLCJicm93c2VyRG93bmxvYWRzIiwiYnJvd3NlckZpbGVzIiwicmVnaXN0ZXJTYXZlUm91dGVyIiwiSFRUUFJlcXVlc3QiLCJsb2FkT3B0aW9ucyIsIkRFRkFVTFRfTUVUSE9EIiwid2VpZ2h0UGF0aFByZWZpeCIsIm9uUHJvZ3Jlc3MiLCJ3ZWlnaHRVcmxDb252ZXJ0ZXIiLCJmZXRjaEZ1bmMiLCJyZXF1ZXN0SW5pdCIsIkZvcm1EYXRhIiwibW9kZWxUb3BvbG9neUFuZFdlaWdodE1hbmlmZXN0IiwiYXBwZW5kIiwib2siLCJyZXNwb25zZXMiLCJtb2RlbENvbmZpZ1JlcXVlc3QiLCJqc29uIiwid2VpZ2h0UGF0aCIsInN1ZmZpeCIsInBhcnNlVXJsIiwicGF0aFByZWZpeCIsImZldGNoVVJMcyIsInVybFByb21pc2VzIiwid2VpZ2h0c0dyb3VwIiwibGFzdFNsYXNoIiwibGFzdFNlYXJjaFBhcmFtIiwic3Vic3RyaW5nIiwiaXNIVFRQU2NoZW1lIiwibWF0Y2giLCJVUkxfU0NIRU1FX1JFR0VYIiwiaHR0cFJvdXRlciIsImlzSFRUUCIsInVybEl0ZW0iLCJodHRwIiwiYnJvd3NlckhUVFBSZXF1ZXN0IiwicmVnaXN0ZXJMb2FkUm91dGVyIiwiREFUQUJBU0VfTkFNRSIsIk1PREVMX1NUT1JFX05BTUUiLCJJTkZPX1NUT1JFX05BTUUiLCJkZWxldGVEYXRhYmFzZSIsImlkYkZhY3RvcnkiLCJnZXRJbmRleGVkREJGYWN0b3J5IiwiZGVsZXRlUmVxdWVzdCIsIm9uc3VjY2VzcyIsInRoZVdpbmRvdyIsImluZGV4ZWREQiIsIm1vekluZGV4ZWREQiIsIndlYmtpdEluZGV4ZWREQiIsIm1zSW5kZXhlZERCIiwic2hpbUluZGV4ZWREQiIsInNldFVwRGF0YWJhc2UiLCJvcGVuUmVxdWVzdCIsImRiIiwiY3JlYXRlT2JqZWN0U3RvcmUiLCJrZXlQYXRoIiwiQnJvd3NlckluZGV4ZWREQiIsIm1vZGVsUGF0aCIsImRhdGFiYXNlQWN0aW9uIiwib251cGdyYWRlbmVlZGVkIiwibW9kZWxUeCIsInRyYW5zYWN0aW9uIiwiZ2V0UmVxdWVzdCIsIm9iamVjdFN0b3JlIiwiY2xvc2UiLCJvbmNvbXBsZXRlIiwiaW5mb1R4IiwiaW5mb1N0b3JlIiwicHV0SW5mb1JlcXVlc3QiLCJwdXQiLCJwdXRNb2RlbFJlcXVlc3QiLCJkZWxldGVJbmZvUmVxdWVzdCIsImluZGV4ZWREQlJvdXRlciIsImJyb3dzZXJJbmRleGVkREIiLCJCcm93c2VySW5kZXhlZERCTWFuYWdlciIsInR4IiwiZ2V0QWxsSW5mb1JlcXVlc3QiLCJnZXRBbGwiLCJnZXRJbmZvUmVxdWVzdCIsImRlbGV0ZU1vZGVsRGF0YSIsImRlbGV0ZU1vZGVsUmVxdWVzdCIsImVuY29kZVdlaWdodHMiLCJzcGVjcyIsImRhdGFQcm9taXNlcyIsIm5hbWVzIiwic3BlYyIsInV0ZjhieXRlcyIsInRvdGFsTnVtQnl0ZXMiLCJieXRlc09mTGVuZ3RoIiwiY29uY2F0ZW5hdGVUeXBlZEFycmF5cyIsImRlY29kZVdlaWdodHMiLCJmbG9hdDE2RGVjb2RlIiwicXVhbnRpemF0aW9uIiwicXVhbnRpemF0aW9uU2l6ZUZhY3RvciIsImJ5dGVCdWZmZXIiLCJxdWFudGl6ZWRBcnJheSIsImdldEZsb2F0MTZEZWNvZGVyIiwiZHR5cGVGYWN0b3IiLCJyZWFsVGVuc29yIiwiaW1hZ2VUZW5zb3IiLCJ0b3RhbEJ5dGVMZW5ndGgiLCJub3JtYWxpemVkWHMiLCJ1c2VOb2RlQnVmZmVyIiwiQnVmZmVyIiwiYXRvYiIsImJ0b2EiLCJzdHJpbmdCeXRlTGVuZ3RoIiwiYXJyYXlCdWZmZXJUb0Jhc2U2NFN0cmluZyIsImJhc2U2NFN0cmluZ1RvQXJyYXlCdWZmZXIiLCJjb25jYXRlbmF0ZUFycmF5QnVmZmVycyIsInRlbXAiLCJiYXNlbmFtZSIsInRyaW0iLCJpdGVtcyIsImdldE1vZGVsSlNPTkZvck1vZGVsQXJ0aWZhY3RzIiwiYXJ0aWZhY3RzIiwiZm9ybWF0IiwiZ2VuZXJhdGVkQnkiLCJjb252ZXJ0ZWRCeSIsInNpZ25hdHVyZSIsInVzZXJEZWZpbmVkTWV0YWRhdGEiLCJtb2RlbEluaXRpYWxpemVyIiwidHJhaW5pbmdDb25maWciLCJnZXRNb2RlbEFydGlmYWN0c0ZvckpTT04iLCJnZXRNb2RlbEFydGlmYWN0c0luZm9Gb3JKU09OIiwiZGF0ZVNhdmVkIiwiRGF0ZSIsIm1vZGVsVG9wb2xvZ3lUeXBlIiwibW9kZWxUb3BvbG9neUJ5dGVzIiwid2VpZ2h0U3BlY3NCeXRlcyIsIndlaWdodERhdGFCeXRlcyIsIm1hbnRpc2FUYWJsZSIsImNvbnZlcnRNYW50aXNzYSIsImNvbXB1dGVGbG9hdDE2TWFudGlzYVRhYmxlIiwiZXhwb25lbnRUYWJsZSIsImNvbXB1dGVGbG9hdDE2RXhwb25lbnRUYWJsZSIsIm9mZnNldFRhYmxlIiwiY29tcHV0ZUZsb2F0MTZPZmZzZXRUYWJsZSIsImJ1ZmZlclVpbnQzMlZpZXciLCJmbG9hdDE2Qml0cyIsImZsb2F0MzJCaXRzIiwiUEFUSF9TRVBBUkFUT1IiLCJQQVRIX1BSRUZJWCIsIklORk9fU1VGRklYIiwiTU9ERUxfVE9QT0xPR1lfU1VGRklYIiwiV0VJR0hUX1NQRUNTX1NVRkZJWCIsIldFSUdIVF9EQVRBX1NVRkZJWCIsIk1PREVMX01FVEFEQVRBX1NVRkZJWCIsInB1cmdlTG9jYWxTdG9yYWdlQXJ0aWZhY3RzIiwibG9jYWxTdG9yYWdlIiwiTFMiLCJwdXJnZWRNb2RlbFBhdGhzIiwicmVtb3ZlSXRlbSIsIm1vZGVsTmFtZSIsImdldE1vZGVsUGF0aEZyb21LZXkiLCJnZXRNb2RlbEtleXMiLCJ0b3BvbG9neSIsIm1vZGVsTWV0YWRhdGEiLCJyZW1vdmVJdGVtcyIsIkJyb3dzZXJMb2NhbFN0b3JhZ2UiLCJzZXRJdGVtIiwibWV0YWRhdGEiLCJnZXRJdGVtIiwibWV0YWRhdGFTdHJpbmciLCJ3ZWlnaHREYXRhQmFzZTY0IiwibG9jYWxTdG9yYWdlUm91dGVyIiwiYnJvd3NlckxvY2FsU3RvcmFnZSIsIkJyb3dzZXJMb2NhbFN0b3JhZ2VNYW5hZ2VyIiwiVVJMX1NDSEVNRV9TVUZGSVgiLCJNb2RlbFN0b3JlTWFuYWdlclJlZ2lzdHJ5IiwibWFuYWdlcnMiLCJzY2hlbWUiLCJtYW5hZ2VyIiwiZ2V0SW5zdGFuY2UiLCJwYXJzZVVSTCIsImdldFNjaGVtZXMiLCJjbG9uZU1vZGVsSW50ZXJuYWwiLCJzb3VyY2VVUkwiLCJkZXN0VVJMIiwiZGVsZXRlU291cmNlIiwibG9hZEhhbmRsZXJzIiwiZ2V0TG9hZEhhbmRsZXJzIiwibG9hZEhhbmRsZXIiLCJzYXZlSGFuZGxlcnMiLCJnZXRTYXZlSGFuZGxlcnMiLCJzYXZlSGFuZGxlciIsInNvdXJjZVNjaGVtZSIsInNvdXJjZVBhdGgiLCJzYW1lTWVkaXVtIiwiZ2V0TWFuYWdlciIsInJlbW92ZU1vZGVsIiwic2F2ZVJlc3VsdCIsImxpc3RNb2RlbHMiLCJzY2hlbWVzIiwic2NoZW1lT3V0Iiwic2NoZW1lQW5kUGF0aCIsImNvcHlNb2RlbCIsIm1vdmVNb2RlbCIsIlBhc3N0aHJvdWdoTG9hZGVyIiwiUGFzc3Rocm91Z2hTYXZlciIsImZyb21NZW1vcnkiLCJ3aXRoU2F2ZUhhbmRsZXIiLCJtb25pdG9yUHJvbWlzZXNQcm9ncmVzcyIsInN0YXJ0RnJhY3Rpb24iLCJlbmRGcmFjdGlvbiIsImNoZWNrUHJvbWlzZXMiLCJjaGVja0ZyYWN0aW9uIiwicmVzb2x2ZWRQcm9taXNlIiwicHJvbWlzZSIsImZyYWN0aW9uIiwiSU9Sb3V0ZXJSZWdpc3RyeSIsInNhdmVSb3V0ZXJzIiwibG9hZFJvdXRlcnMiLCJzYXZlUm91dGVyIiwibG9hZFJvdXRlciIsImdldEhhbmRsZXJzIiwiaGFuZGxlclR5cGUiLCJ2YWxpZEhhbmRsZXJzIiwicm91dGVyIiwiaGFuZGxlciIsImxvdWRSb3V0ZXIiLCJEVFlQRV9WQUxVRV9TSVpFX01BUCIsImxvYWRXZWlnaHRzQXNBcnJheUJ1ZmZlciIsInJlcXVlc3RzIiwiZmV0Y2hVUkwiLCJpc0JpbmFyeSIsImJ1ZmZlclByb21pc2VzIiwiZmlsZVBhdGhQcmVmaXgiLCJ3ZWlnaHROYW1lcyIsIndlaWdodHNMb2FkZXJGYWN0b3J5IiwiZmV0Y2hVcmxzIiwiZmV0Y2hXZWlnaHRzRnVuY3Rpb24iLCJncm91cEluZGljZXNUb0ZldGNoTWFwIiwiZ3JvdXBXZWlnaHRzVG9GZXRjaCIsIndlaWdodHNGb3VuZCIsImFsbE1hbmlmZXN0V2VpZ2h0TmFtZXMiLCJtYW5pZmVzdEdyb3VwQ29uZmlnIiwiZ3JvdXBJbmRleCIsImdyb3VwT2Zmc2V0Iiwid2VpZ2h0c0VudHJ5IiwicmF3RHR5cGUiLCJ3ZWlnaHRzQnl0ZXMiLCJlbnF1ZXVlV2VpZ2h0c0ZvckZldGNoaW5nRm4iLCJtYW5pZmVzdEVudHJ5Iiwic2l6ZUJ5dGVzIiwid2VpZ2h0TmFtZSIsIndlaWdodEluZGV4Iiwid2VpZ2h0c05vdEZvdW5kIiwiZ3JvdXBJbmRpY2VzVG9GZXRjaCIsImFjY3VtdWxhdG9yIiwic2hvdWxkRmV0Y2giLCJmaWxlcGF0aCIsImZldGNoVXJsIiwid2VpZ2h0c1RlbnNvck1hcCIsImJ1ZmZlckluZGV4T2Zmc2V0IiwibnVtQnVmZmVycyIsImdyb3VwQnl0ZXMiLCJncm91cEJ1ZmZlciIsImdyb3VwQnl0ZUJ1ZmZlciIsImdyb3VwQnVmZmVyT2Zmc2V0IiwibmFtZVRvVGVuc29yTWFwIiwiQWJzIiwiQWNvcyIsIkFjb3NoIiwiQWRkIiwiQWRkTiIsIkFsbCIsIkFueSIsIkFyZ01heCIsIkFyZ01pbiIsIkFzaW4iLCJBc2luaCIsIkF0YW4iLCJBdGFuaCIsIkF0YW4yIiwiQXZnUG9vbCIsIkF2Z1Bvb2xHcmFkIiwiQXZnUG9vbDNEIiwiQXZnUG9vbDNER3JhZCIsIkJhdGNoTWF0TXVsIiwiQmF0Y2hUb1NwYWNlTkQiLCJCaW5jb3VudCIsIkJyb2FkY2FzdFRvIiwiQ2FzdCIsIkNlaWwiLCJDbGlwQnlWYWx1ZSIsIkNvbXBsZXgiLCJDb21wbGV4QWJzIiwiQ29uY2F0IiwiQ29udjJEIiwiQ29udjJEQmFja3Byb3BGaWx0ZXIiLCJDb252MkRCYWNrcHJvcElucHV0IiwiQ29udjNEIiwiQ29udjNEQmFja3Byb3BGaWx0ZXJWMiIsIkNvbnYzREJhY2twcm9wSW5wdXRWMiIsIkNvcyIsIkNvc2giLCJDdW1zdW0iLCJDcm9wQW5kUmVzaXplIiwiRGVuc2VCaW5jb3VudCIsIkRlcHRoVG9TcGFjZSIsIkRlcHRod2lzZUNvbnYyZE5hdGl2ZSIsIkRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyIiwiRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dCIsIkRpYWciLCJEaWxhdGlvbjJEIiwiRGlsYXRpb24yREJhY2twcm9wSW5wdXQiLCJEaWxhdGlvbjJEQmFja3Byb3BGaWx0ZXIiLCJSZWFsRGl2IiwiRWluc3VtIiwiRWx1IiwiRWx1R3JhZCIsIkVyZiIsIkVxdWFsIiwiRXhwIiwiRXhwYW5kRGltcyIsIkV4cG0xIiwiRkZUIiwiRmlsbCIsIkZsaXBMZWZ0UmlnaHQiLCJGbG9vciIsIkZsb29yRGl2IiwiRnVzZWRCYXRjaE5vcm0iLCJHYXRoZXJWMiIsIkdhdGhlck5kIiwiR3JlYXRlciIsIkdyZWF0ZXJFcXVhbCIsIklkZW50aXR5IiwiSUZGVCIsIkltYWciLCJJc0Zpbml0ZSIsIklzSW5mIiwiSXNOYW4iLCJMZWFreVJlbHUiLCJMZXNzIiwiTGVzc0VxdWFsIiwiTGluU3BhY2UiLCJMb2ciLCJMb2cxcCIsIkxvZ2ljYWxBbmQiLCJMb2dpY2FsTm90IiwiTG9naWNhbE9yIiwiTG9nU29mdG1heCIsIkxSTiIsIkxSTkdyYWQiLCJNYXgiLCJNYXhpbXVtIiwiTWF4UG9vbCIsIk1heFBvb2xHcmFkIiwiTWF4UG9vbDNEIiwiTWF4UG9vbDNER3JhZCIsIk1heFBvb2xXaXRoQXJnbWF4IiwiTWVhbiIsIk1pbiIsIk1pbmltdW0iLCJNaXJyb3JQYWQiLCJNb2QiLCJNdWx0aW5vbWlhbCIsIk11bHRpcGx5IiwiTmVnIiwiTm90RXF1YWwiLCJOb25NYXhTdXBwcmVzc2lvblYzIiwiTm9uTWF4U3VwcHJlc3Npb25WNCIsIk5vbk1heFN1cHByZXNzaW9uVjUiLCJPbmVzTGlrZSIsIk9uZUhvdCIsIlBhY2siLCJQYWRWMiIsIlBvb2wiLCJQb3ciLCJQcmVsdSIsIlByb2QiLCJSYW5nZSIsIlJlYWwiLCJSZWNpcHJvY2FsIiwiUmVsdSIsIlJlc2hhcGUiLCJSZXNpemVOZWFyZXN0TmVpZ2hib3IiLCJSZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkIiwiUmVzaXplQmlsaW5lYXIiLCJSZXNpemVCaWxpbmVhckdyYWQiLCJSZWx1NiIsIlJldmVyc2UiLCJSb3VuZCIsIlJzcXJ0IiwiU2NhdHRlck5kIiwiU2VsZWN0IiwiU2VsdSIsIlNsaWNlIiwiU2luIiwiU2luaCIsIlNpZ24iLCJTaWdtb2lkIiwiU29mdHBsdXMiLCJTcXJ0IiwiU3VtIiwiU3BhY2VUb0JhdGNoTkQiLCJTcGxpdFYiLCJTb2Z0bWF4IiwiU3BhcnNlRmlsbEVtcHR5Um93cyIsIlNwYXJzZVJlc2hhcGUiLCJTcGFyc2VTZWdtZW50TWVhbiIsIlNwYXJzZVNlZ21lbnRTdW0iLCJTcGFyc2VUb0RlbnNlIiwiU3F1YXJlZERpZmZlcmVuY2UiLCJTcXVhcmUiLCJTdHJpZGVkU2xpY2UiLCJTdHJpbmdOR3JhbXMiLCJTdHJpbmdTcGxpdCIsIlN0cmluZ1RvSGFzaEJ1Y2tldEZhc3QiLCJTdWIiLCJUYW4iLCJUYW5oIiwiVGlsZSIsIlRvcEsiLCJUcmFuc2Zvcm0iLCJUcmFuc3Bvc2UiLCJVbmlxdWUiLCJVbnBhY2siLCJVbnNvcnRlZFNlZ21lbnRTdW0iLCJaZXJvc0xpa2UiLCJTdGVwIiwiRnJvbVBpeGVscyIsIlJvdGF0ZVdpdGhPZmZzZXQiLCJfRnVzZWRNYXRNdWwiLCJGdXNlZENvbnYyRCIsIkZ1c2VkRGVwdGh3aXNlQ29udjJEIiwia2VybmVsUmVnaXN0cnkiLCJncmFkUmVnaXN0cnkiLCJnZXRLZXJuZWwiLCJtYWtlS2V5IiwiZ2V0R3JhZGllbnQiLCJnZXRLZXJuZWxzRm9yQmFja2VuZCIsIml0IiwiZW50cmllcyIsImRvbmUiLCJuZXh0IiwiY29uZmlnIiwicmVnaXN0ZXJLZXJuZWwiLCJyZWdpc3RlckdyYWRpZW50IiwidW5yZWdpc3Rlcktlcm5lbCIsInVucmVnaXN0ZXJHcmFkaWVudCIsImNvcHlSZWdpc3RlcmVkS2VybmVscyIsInJlZ2lzdGVyZWRCYWNrZW5kTmFtZSIsIm5ld0JhY2tlbmROYW1lIiwiYWJzXyIsImFjb3NfIiwiYWNvc2hfIiwiYWRkXyIsIiRhIiwiJGIiLCJhZGROXyIsIiR0ZW5zb3JzIiwiZmlyc3RUZW5zb3IiLCJhbGxfIiwiYW55XyIsImFyZ01heF8iLCJhcmdNaW5fIiwiYmF0Y2hUb1NwYWNlIiwic3BhdGlhbExlbmd0aCIsInJlc2hhcGVkUmFuayIsImJsb2NrU2hhcGVSYW5rIiwicGVybXV0ZWRCZWZvcmVCYXRjaCIsInBlcm11dGVkQWZ0ZXJCYXRjaCIsInVuY3JvcHBlZFNoYXBlIiwiYXNpbl8iLCJhc2luaF8iLCJhdGFuXyIsImF0YW4yXyIsImF0YW5oXyIsImF2Z1Bvb2xfIiwieDREIiwicmVzaGFwZWRUbzREIiwiYXZnUG9vbDNkIiwiYXZnUG9vbDNkXyIsIng1RCIsInJlc2hhcGVkVG81RCIsImF4ZXNBcmVJbm5lck1vc3REaW1zIiwiY29tYmluZUxvY2F0aW9ucyIsIm91dHB1dExvYyIsInJlZHVjZUxvYyIsInJlZHVjZUlkeCIsIm51bUF4ZXMiLCJiYXNpY0xTVE1DZWxsIiwiYmFzaWNMU1RNQ2VsbF8iLCJmb3JnZXRCaWFzIiwibHN0bUtlcm5lbCIsImxzdG1CaWFzIiwiJGZvcmdldEJpYXMiLCIkbHN0bUtlcm5lbCIsIiRsc3RtQmlhcyIsIiRjIiwiJGgiLCJjb21iaW5lZCIsIndlaWdodGVkIiwic2xpY2VDb2xzIiwibmV3QyIsImJhdGNoVG9TcGFjZU5EXyIsImJhdGNoTm9ybV8iLCIkbWVhbiIsIiR2YXJpYW5jZSIsIiRzY2FsZSIsIiRvZmZzZXQiLCJiYXRjaE5vcm0yZCIsImJhdGNoTm9ybTJkXyIsImJhdGNoTm9ybTNkIiwiYmF0Y2hOb3JtM2RfIiwiYmF0Y2hOb3JtNGQiLCJiYXRjaE5vcm00ZF8iLCJ4QXM0RCIsImJpbmNvdW50XyIsIiR3ZWlnaHRzIiwiYm9vbGVhbk1hc2tBc3luYyIsIiR0ZW5zb3IiLCIkbWFzayIsImF4aXNGcm9tIiwibWFza0RpbSIsInRlbnNvclNoYXBlIiwibGVhZGluZ1NpemUiLCJ0YXJnZXRUZW5zb3JTaGFwZSIsInJlc2hhcGVkVGVuc29yIiwicmVzaGFwZWRNYXNrIiwicG9zaXRpdmVQb3NpdGlvbnMiLCJicm9hZGNhc3RUbyIsImJyb2FkY2FzdFRvXyIsImdldFJlZHVjdGlvbkF4ZXMiLCJpbkRpbSIsIm91dEF4aXMiLCJvdXREaW0iLCJmcm9tUGl4ZWxzXyIsImlzUGl4ZWxEYXRhIiwiaXNJbWFnZURhdGEiLCJpc0NhbnZhc0xpa2UiLCJpc0ltYWdlQml0bWFwIiwiSW1hZ2VEYXRhIiwiSW1hZ2VCaXRtYXAiLCJIQVZFX0NVUlJFTlRfREFUQV9SRUFEWV9TVEFURSIsInJlYWR5U3RhdGUiLCJnZXRJbWFnZURhdGEiLCJudW1QaXhlbHMiLCJjYW5XcmFwUGl4ZWxzVG9JbWFnZUJpdG1hcCIsImlzTm9uRW1wdHlQaXhlbHMiLCJmcm9tUGl4ZWxzQXN5bmMiLCJpbWFnZUJpdG1hcCIsImNyZWF0ZUltYWdlQml0bWFwIiwicHJlbXVsdGlwbHlBbHBoYSIsInRvUGl4ZWxzIiwiaW1nIiwiJGltZyIsIm9yaWdpbmFsSW1nVGVuc29yIiwibXVsdGlwbGllciIsIlVpbnQ4Q2xhbXBlZEFycmF5IiwicmdiYSIsImltYWdlRGF0YSIsInB1dEltYWdlRGF0YSIsImZyb21QaXhlbHMiLCJjYXN0XyIsImNlaWxfIiwiY2xpcEJ5VmFsdWVfIiwiY2xvbmVfIiwiY29tcGxleF8iLCJjb25jYXRfIiwiY29uY2F0MWQiLCJjb25jYXQxZF8iLCJjb25jYXQyZCIsImNvbmNhdDJkXyIsImNvbmNhdDNkIiwiY29uY2F0M2RfIiwiY29uY2F0NGQiLCJjb25jYXQ0ZF8iLCJmaXJzdFNoYXBlIiwiY29uZnVzaW9uTWF0cml4XyIsImxhYmVscyIsInByZWRpY3Rpb25zIiwibnVtQ2xhc3NlcyIsIiRsYWJlbHMiLCIkcHJlZGljdGlvbnMiLCJpc0ludGVnZXIiLCJvbmVIb3RMYWJlbHMiLCJvbmVIb3RQcmVkaWN0aW9ucyIsIm9uZUhvdExhYmVsc1QiLCJjb25mdXNpb25NYXRyaXgiLCJjb252MWQiLCJjb252MWRfIiwiZGlsYXRpb24iLCJ4M0QiLCJyZXNoYXBlZFRvM0QiLCJmaWx0ZXI0RCIsImlucHV0NEQiLCJjb252MmRfIiwiY29udjJEQmFja3Byb3BGaWx0ZXJfIiwiZHk0RCIsImNvbnYyREJhY2twcm9wSW5wdXRfIiwieFNoYXBlNEQiLCJjb252MmRUcmFuc3Bvc2UiLCJjb252MmRUcmFuc3Bvc2VfIiwiY29udjNkIiwiY29udjNkXyIsImNvbnYzREJhY2twcm9wSW5wdXRfIiwieFNoYXBlNUQiLCJkeTVEIiwiY29udjNkVHJhbnNwb3NlIiwiY29udjNkVHJhbnNwb3NlXyIsInJvdW5kaW5nTW9kZSIsInBhcnNlVHVwbGVQYXJhbSIsInBhcnNlM1R1cGxlUGFyYW0iLCJkZXB0aHdpc2UiLCJmaWx0ZXJDaGFubmVscyIsImdldEVmZmVjdGl2ZUZpbHRlclNpemUiLCJmaWVsZFNpemUiLCJ6ZXJvUGFkIiwiY29tcHV0ZURlZmF1bHRQYWQiLCJpbnB1dFJvd3MiLCJpbnB1dENvbHMiLCJvdXRwdXRDb2xzIiwiY29tcHV0ZU91dHB1dFNoYXBlMkQiLCJwYWRBbG9uZ0hlaWdodCIsInBhZEFsb25nV2lkdGgiLCJnZXRQYWRBbmRPdXRJbmZvIiwiYmFjayIsIm91dHB1dERlcHRocyIsImNvbXB1dGVPdXRwdXRTaGFwZTREIiwicGFkQWxvbmdEZXB0aCIsImdldDNEUGFkQW5kT3V0SW5mbyIsImVmZmVjdGl2ZUZpZWxkU2l6ZSIsInBhcmFtIiwidHVwbGVWYWx1ZXNBcmVPbmUiLCJkaW1BIiwiZGltQiIsImRpbUMiLCJjb3NfIiwiY29zaF8iLCJjdW1zdW1fIiwiZGVuc2VCaW5jb3VudF8iLCJkZXB0aFRvU3BhY2VfIiwiZGVwdGh3aXNlQ29udjJkIiwiZGVwdGh3aXNlQ29udjJkXyIsImRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyXyIsImRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXRfIiwiZGlhZ18iLCJkaWxhdGlvbjJkIiwiZGlsYXRpb24yZF8iLCJkaXZfIiwiZGl2Tm9OYW4iLCJkaXZOb05hbl8iLCJkaXZSZXN1bHQiLCJiRXF1YWxzWmVybyIsImRvdCIsImRvdF8iLCJ0MSIsInQyIiwiJHQxIiwiJHQyIiwidDFJbm5lciIsInQySW5uZXIiLCJ0MTJEIiwidDIyRCIsInQxdDIiLCJkcm9wb3V0IiwiZHJvcG91dF8iLCJyYXRlIiwibm9pc2VTaGFwZSIsIiRub2lzZVNoYXBlIiwia2VlcFByb2IiLCJnZXROb2lzZVNoYXBlIiwibmV3RGltZW5zaW9uIiwiZWluc3VtXyIsImVsdV8iLCJlcXVhbF8iLCJlcmZfIiwiZXhwXyIsImV4cGFuZERpbXNfIiwiZXhwbTFfIiwiZXllIiwiZXllXyIsImJhdGNoU2hhcGUiLCJidWZmIiwiZmxvb3JfIiwiZmxvb3JEaXZfIiwiZnVzZWRDb252MmRfIiwiJGJpYXMiLCIkcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyIsImR5QWN0aXZhdGlvbiIsImRlciIsImJpYXNEZXIiLCJjdXN0b21PcCIsImN1c3RvbU9wV2l0aEJpYXMiLCJmdXNlZERlcHRod2lzZUNvbnYyZF8iLCJ4RGVyIiwiZmlsdGVyRGVyIiwibWF0TXVsIiwiZnVzZWRNYXRNdWxfIiwiYTNEIiwiYjNEIiwiYURlciIsImJEZXIiLCJnZXRGdXNlZER5QWN0aXZhdGlvbiIsImdldEZ1c2VkQmlhc0dyYWRpZW50IiwicmVkdWNlQXhlcyIsInNob3VsZEZ1c2UiLCJnYXRoZXIiLCJnYXRoZXJfIiwiZ2F0aGVyTkQiLCJnYXRoZXJORF8iLCJ0ZW5zb3JSYW5rIiwiblJlc3VsdCIsImdyZWF0ZXJfIiwiZ3JlYXRlckVxdWFsXyIsImltYWdfIiwiY3JvcEFuZFJlc2l6ZV8iLCIkaW1hZ2UiLCIkYm94ZXMiLCIkYm94SW5kIiwiZmxpcExlZnRSaWdodF8iLCJub25NYXhTdXBwcmVzc2lvbiIsIm5vbk1heFN1cHByZXNzaW9uXyIsIiRzY29yZXMiLCJub25NYXhTdXBwcmVzc2lvbkFzeW5jIiwiYm94ZXNBbmRTY29yZXMiLCJub25NYXhTdXBwcmVzc2lvblBhZGRlZCIsIm5vbk1heFN1cHByZXNzaW9uUGFkZGVkXyIsIm5vbk1heFN1cHByZXNzaW9uUGFkZGVkQXN5bmMiLCIkbWF4T3V0cHV0U2l6ZSIsIiRpb3VUaHJlc2hvbGQiLCIkc2NvcmVUaHJlc2hvbGQiLCJub25NYXhTdXBwcmVzc2lvbldpdGhTY29yZSIsIm5vbk1heFN1cHByZXNzaW9uV2l0aFNjb3JlXyIsIm5vbk1heFN1cHByZXNzaW9uV2l0aFNjb3JlQXN5bmMiLCJyZXNpemVCaWxpbmVhcl8iLCIkaW1hZ2VzIiwiYmF0Y2hJbWFnZXMiLCJyZXNpemVOZWFyZXN0TmVpZ2hib3JfIiwicm90YXRlV2l0aE9mZnNldF8iLCJ0aHJlc2hvbGRfIiwiaW52ZXJ0ZWQiLCJ0aHJlc2hWYWx1ZSIsInRvdGFsUGl4ZWxzSW5JbWFnZSIsImdyYXlzY2FsZSIsIiR0aHJlc2hvbGQiLCIkciIsIiRnIiwiaGlzdG9ncmFtIiwiY2xhc3NGaXJzdCIsImNsYXNzU2Vjb25kIiwibWVhbkZpcnN0IiwibWVhblNlYyIsIndlaWdodEZvcmVncm91bmQiLCJ3ZWlnaHRCYWNrIiwiYmVzdFRocmVzaCIsImJlc3RJbkJldFZhciIsImNJbkJldFZhciIsIm1lYW5GaXJzdERpdkEiLCJtZWFuU2VjRmlsbCIsIm1lYW5TZWNBZGQiLCJtZWFuU2VjTXVsIiwiY0luQmV0VmFyU3ViQSIsImNJbkJldFZhclN1YkIiLCJjSW5CZXRWYXJNdWwiLCJvdHN1IiwiaW52Q29uZGl0aW9uIiwidHJhbnNmb3JtXyIsIiR0cmFuc2Zvcm1zIiwiaW5Ub3BLQXN5bmMiLCJ0YXJnZXRzIiwiJHRhcmdldHMiLCJwcmVkaWN0aW9uc1ZhbHMiLCJ0YXJnZXRzVmFscyIsInByZWNpc2lvbiIsImlzRmluaXRlXyIsImlzSW5mXyIsImlzTmFOXyIsImxlYWt5UmVsdV8iLCJsZXNzXyIsImxlc3NFcXVhbF8iLCJiYW5kUGFydCIsImJhbmRQYXJ0XyIsIm51bUxvd2VyIiwibnVtVXBwZXIiLCJNIiwiTiIsImlqIiwiaW5CYW5kIiwibWF0IiwiZ3JhbVNjaG1pZHQiLCJncmFtU2NobWlkdF8iLCJpbnB1dElzVGVuc29yMkQiLCJ5cyIsInhzMWQiLCJwcm9qIiwicXIyZCIsImZ1bGxNYXRyaWNlcyIsIm9uZTJEIiwiaXRlcnMiLCJyVGVtcCIsIndUZW1wIiwicVRlbXAiLCJyakVuZDEiLCJub3JtWCIsInJqaiIsIndQcmUiLCJ0YXUiLCJyakVuZEFsbCIsInRhdVRpbWVzVyIsIndUIiwiclRpbWVzVGF1IiwidGF3VGltZXNXVCIsInFBbGxKRW5kIiwicVRpbWVzVGF1IiwicXIiLCJxcl8iLCJvdXRlckRpbXNQcm9kIiwicHJldiIsIngyZHMiLCJxMmRzIiwicjJkcyIsIngyZCIsInEyZCIsInIyZCIsImxpbnNwYWNlIiwibG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb24iLCJsb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbl8iLCJsb2dfIiwibG9nMXBfIiwibG9nU2lnbW9pZCIsImxvZ1NpZ21vaWRfIiwibG9nU29mdG1heCIsImxvZ1NvZnRtYXhfIiwiJGxvZ2l0cyIsInhNYXgiLCJzaGlmdGVkIiwibG9nU3VtRXhwIiwibG9nU3VtRXhwXyIsImxvZ2ljYWxBbmRfIiwibG9naWNhbE5vdF8iLCJsb2dpY2FsT3JfIiwibG9naWNhbFhvciIsImxvZ2ljYWxYb3JfIiwiUmVkdWN0aW9uIiwiYWJzb2x1dGVEaWZmZXJlbmNlIiwiYWJzb2x1dGVEaWZmZXJlbmNlXyIsInJlZHVjdGlvbiIsIlNVTV9CWV9OT05aRVJPX1dFSUdIVFMiLCJsb3NzZXMiLCJjb21wdXRlV2VpZ2h0ZWRMb3NzIiwiY29tcHV0ZVdlaWdodGVkTG9zc18iLCIkbG9zc2VzIiwid2VpZ2h0ZWRMb3NzIiwiTk9ORSIsIlNVTSIsIk1FQU4iLCJicm9hZGNhc3RGYWN0b3IiLCJicm9hZGNhc3RlZFdlaWdodHMiLCJudW1Ob25aZXJvcyIsImNvc2luZURpc3RhbmNlIiwiY29zaW5lRGlzdGFuY2VfIiwib25lIiwiaGluZ2VMb3NzIiwiaGluZ2VMb3NzXyIsImh1YmVyTG9zcyIsImh1YmVyTG9zc18iLCJkZWx0YSIsImRlbHRhU2NhbGFyIiwicXVhZHJhdGljIiwibGluZWFyIiwibG9nTG9zcyIsImxvZ0xvc3NfIiwiZXBzaWxvblNjYWxhciIsImwxIiwibDIiLCJtZWFuU3F1YXJlZEVycm9yIiwibWVhblNxdWFyZWRFcnJvcl8iLCJzaWdtb2lkQ3Jvc3NFbnRyb3B5Iiwic2lnbW9pZENyb3NzRW50cm9weV8iLCJtdWx0aUNsYXNzTGFiZWxzIiwibGFiZWxTbW9vdGhpbmciLCIkbXVsdGlDbGFzc0xhYmVscyIsImxhYmVsU21vb3RoaW5nU2NhbGFyIiwibWF4T3V0cHV0Iiwib3V0cHV0WFRhcmdldCIsInNpZ21vaWRPdXRwdXQiLCJzaWdtb2lkQ3Jvc3NFbnRyb3B5V2l0aExvZ2l0c18iLCJzb2Z0bWF4Q3Jvc3NFbnRyb3B5Iiwic29mdG1heENyb3NzRW50cm9weV8iLCJvbmVob3RMYWJlbHMiLCIkb25laG90TGFiZWxzIiwibHNlIiwibG9nUmVzdWx0IiwiY29zdFZlY3RvciIsInNvZnRtYXhDcm9zc0VudHJvcHlXaXRoTG9naXRzXyIsIm1hdE11bF8iLCJtYXhfIiwibWF4UG9vbF8iLCJtYXhQb29sM2RfIiwibWF4UG9vbFdpdGhBcmdtYXgiLCJtYXhQb29sV2l0aEFyZ21heF8iLCJtYXhpbXVtXyIsIm1lYW5fIiwibWVzaGdyaWQiLCJpbmRleGluZyIsIlR5cGVFcnJvciIsIiR5IiwibWluXyIsIm1pbmltdW1fIiwibWlycm9yUGFkXyIsInNoYXBlT2Zmc2V0IiwibW9kXyIsIm1vbWVudHMiLCJtb21lbnRzXyIsInhNZWFuIiwia2VlcERpbXNTaGFwZSIsImRldlNxdWFyZWQiLCJtb3ZpbmdBdmVyYWdlIiwibW92aW5nQXZlcmFnZV8iLCJkZWNheSIsInplcm9EZWJpYXMiLCIkdiIsIiRkZWNheSIsIm9uZU1pbnVzRGVjYXkiLCJ1cGRhdGUiLCIkc3RlcCIsIm11bF8iLCJtdWx0aVJOTkNlbGwiLCJtdWx0aVJOTkNlbGxfIiwibHN0bUNlbGxzIiwibmV3U3RhdGVzIiwibmV3SCIsIm11bHRpbm9taWFsXyIsIm9yaWdSYW5rIiwibmVnXyIsIm5vbk1heFN1cHBTYW5pdHlDaGVjayIsIm5vcm1JbXBsIiwibm9ybV8iLCJvcmQiLCJub3RFcXVhbF8iLCJvbmVIb3RfIiwib25lc0xpa2VfIiwiT1BfU0NPUEVfU1VGRklYIiwiZjIiLCJjb25maWd1cmFibGUiLCJzcGVjdHJhbCIsInJmZnQiLCJpcmZmdCIsInNpZ25hbCIsImhhbW1pbmdXaW5kb3ciLCJoYW5uV2luZG93IiwiZnJhbWUiLCJzdGZ0IiwibGluYWxnIiwic3BhcnNlIiwib3V0ZXJQcm9kdWN0Iiwib3V0ZXJQcm9kdWN0XyIsInYxIiwidjIiLCIkdjEiLCIkdjIiLCJ2MTJEIiwidjIyRCIsInBhZF8iLCJwYWQxZCIsInBhZDFkXyIsInBhZDJkIiwicGFkMmRfIiwicGFkM2QiLCJwYWQzZF8iLCJwYWQ0ZCIsInBhZDRkXyIsInBvb2xfIiwid2luZG93U2hhcGUiLCJwb29saW5nVHlwZSIsImJhc2VQYWRkaW5nIiwicGFkRXh0cmFTaGFwZSIsInBhZEV4dHJhU3RhcnQiLCJwYWRFeHRyYUVuZCIsIndpdGhTcGFjZVRvQmF0Y2hCYXNlUGFkZGluZ3MiLCJpc0RpbGF0aW9uT25lIiwiYWRqdXN0ZWRQYWRkaW5nIiwiYWRqdXN0ZWRDcm9wcyIsInBhZFN0YXJ0Iiwib3JpZ1BhZEVuZCIsImZ1bGxJbnB1dFNoYXBlIiwicGFkRW5kRXh0cmEiLCJwYWRFbmQiLCJyZXF1aXJlZFNwYWNlVG9CYXRjaFBhZGRpbmdzIiwiY29udmVydGVkUGFkIiwiY29udmVydGVkWCIsInBvd18iLCIkYmFzZSIsIiRleHAiLCJwcmVsdV8iLCJ2ZXJib3NlIiwicHJvZF8iLCJyYW5kIiwicmFuZF8iLCJyYW5kRnVuY3Rpb24iLCJNUFJhbmRHYXVzcyIsInN0ZERldmlhdGlvbiIsInRydW5jYXRlZCIsInN0ZERldiIsIm5leHRWYWwiLCJ1cHBlciIsImxvd2VyIiwic2VlZFZhbHVlIiwibmV4dFZhbHVlIiwicmVzdWx0WCIsInJlc3VsdFkiLCJpc1ZhbGlkIiwiaXNWYWxpZFRydW5jYXRlZCIsImNvbnZlcnRWYWx1ZSIsIlJhbmRHYW1tYSIsInJhbmR1IiwicmFuZG4iLCJ2MCIsIlVuaWZvcm1SYW5kb20iLCJjYW5SZXR1cm5GbG9hdCIsImphcnF1ZUJlcmFOb3JtYWxpdHlUZXN0IiwidmFsdWVzTWVhbiIsInN1bTIiLCJzdW0zIiwic2tld25lc3MiLCJzdW00Iiwia3VydG9zaXMiLCJqYiIsImV4cGVjdEFycmF5SW5NZWFuU3RkUmFuZ2UiLCJhY3R1YWwiLCJleHBlY3RlZE1lYW4iLCJleHBlY3RlZFN0ZERldiIsImFjdHVhbE1lYW4iLCJzcXVhcmVEaWZmU3VtIiwic3RhbmRhcmREZXZpYXRpb24iLCJyYW5kb21HYW1tYSIsInJhbmRvbUdhbW1hXyIsInJnYW1tYSIsInJhbmRvbU5vcm1hbCIsInJhbmRvbU5vcm1hbF8iLCJyYW5kR2F1c3MiLCJyYW5kb21Vbmlmb3JtIiwicmFuZG9tVW5pZm9ybV8iLCJtaW52YWwiLCJtYXh2YWwiLCJyZWFsXyIsInJlY2lwcm9jYWxfIiwiUEFSQUxMRUxJWkVfVEhSRVNIT0xEIiwicmVsdV8iLCJyZWx1Nl8iLCJyZXNoYXBlXyIsInJldmVyc2VfIiwicmV2ZXJzZTFkIiwicmV2ZXJzZTFkXyIsInJldmVyc2UyZCIsInJldmVyc2UyZF8iLCJyZXZlcnNlM2QiLCJyZXZlcnNlM2RfIiwicmV2ZXJzZTRkIiwicmV2ZXJzZTRkXyIsInJvdW5kXyIsInJzcXJ0XyIsInNjYWxhciIsInNjYXR0ZXJORCIsInNjYXR0ZXJORF8iLCIkdXBkYXRlcyIsInZhbGlkYXRlVXBkYXRlU2hhcGUiLCJzaGFwZUVycm9yIiwidmFsaWRhdGVJbnB1dCIsInRvdGFsTmQiLCJzYWZlU2xpY2VEaW0iLCJzZWx1XyIsInNlcGFyYWJsZUNvbnYyZCIsInNlcGFyYWJsZUNvbnYyZF8iLCJkZXB0aHdpc2VGaWx0ZXIiLCJwb2ludHdpc2VGaWx0ZXIiLCIkZGVwdGh3aXNlRmlsdGVyIiwiJHBvaW50d2lzZUZpbHRlciIsImNoYW5uZWxNdWx0aXBsaWVyIiwic2V0ZGlmZjFkQXN5bmMiLCJ5U2V0Iiwic2lnbW9pZF8iLCJzaWduXyIsImZyYW1lXyIsImZyYW1lTGVuZ3RoIiwiZnJhbWVTdGVwIiwicGFkVmFsdWUiLCJwYWRMZW4iLCJoYW1taW5nV2luZG93XyIsIndpbmRvd0xlbmd0aCIsImhhbm5XaW5kb3dfIiwic3RmdF8iLCJmZnRMZW5ndGgiLCJ3aW5kb3dGbiIsImZyYW1lZFNpZ25hbCIsIndpbmRvd2VkU2lnbmFsIiwiZW5jbG9zaW5nUG93ZXJPZlR3byIsImNvc2luZVdpbmRvdyIsImV2ZW4iLCJjb3NBcmciLCJzaW5fIiwic2luaF8iLCJzbGljZV8iLCJzbGljZTFkIiwic2xpY2UxZF8iLCJzbGljZTJkXyIsInNsaWNlM2RfIiwic2xpY2U0ZF8iLCJzdHJpZGVzV2l0aEVsaWRlZERpbXMiLCJlbGxpcHNpc0luc2VydGlvbkluZGV4IiwibnVtRWxpZGVkQXhlcyIsInVubm9ybWFsaXplQXhpcyIsIm5vcm1hbGl6ZWRBeGlzIiwiZ2V0RWxpZGVkQXhlcyIsImVsaWRlZEF4ZXMiLCJmdWxsSW5kZXgiLCJzdGFydEluZGljZXNXaXRoRWxpZGVkRGltcyIsInN0b3BJbmRpY2VzV2l0aEVsaWRlZERpbXMiLCJzdGFydEZvckF4aXMiLCJzdG9wRm9yQXhpcyIsInN0cmlkZXNGb3JBeGlzIiwib3JpZ2luYWxCZWdpbiIsIm9yaWdpbmFsQXhpcyIsIm9yaWdpbmFsVmFsdWUiLCJvcmlnaW5hbEVuZCIsIk1BWF9TQUZFX0lOVEVHRVIiLCJheGlzU2l6ZSIsInN0YXJ0SW5kaWNlcyIsInN0b3BJbmRpY2VzIiwiZmlyc3ROb25PbmVBeGlzIiwiJGVuZCIsInNvZnRtYXhfIiwic29mdHBsdXNfIiwic3BhY2VUb0JhdGNoTkRfIiwic3BhcnNlRmlsbEVtcHR5Um93c18iLCJzcGFyc2VSZXNoYXBlXyIsIiRuZXdTaGFwZSIsInNwYXJzZVNlZ21lbnRNZWFuXyIsInNwYXJzZVNlZ21lbnRTdW1fIiwic3BhcnNlVG9EZW5zZV8iLCIkc3BhcnNlSW5kaWNlcyIsIiRzcGFyc2VWYWx1ZXMiLCJkZWZhdWx0VmFsdWVzIiwibnVtRWxlbXMiLCJudW1WYWx1ZXMiLCJmZnRfIiwiaWZmdF8iLCJpcmZmdF8iLCJjb21wbGV4SW5wdXQiLCJyZWFsSW5wdXQiLCJpbWFnSW5wdXQiLCJyZWFsQ29uanVnYXRlIiwiaW1hZ0Nvbmp1Z2F0ZSIsInJmZnRfIiwiYWRqdXN0ZWRJbnB1dCIsInplcm9zU2hhcGUiLCJ6ZXJvc0lucHV0IiwicmVhbENvbXBsZXhDb25qdWdhdGUiLCJpbWFnQ29tcGxleENvbmp1Z2F0ZSIsInNwbGl0XyIsIm51bU9mTmVncyIsIm5lZ0luZGV4Iiwic3FydF8iLCJzcXVhcmVfIiwic3F1YXJlZERpZmZlcmVuY2VfIiwic3F1ZWV6ZSIsInNxdWVlemVfIiwic3RhY2tfIiwic3RlcF8iLCJzdHJpZGVkU2xpY2VfIiwic3RyaW5nTkdyYW1zXyIsInN0cmluZ1NwbGl0XyIsInN0cmluZ1RvSGFzaEJ1Y2tldEZhc3RfIiwic3ViXyIsInN1bV8iLCJ0YW5fIiwidGFuaF8iLCJpbmZlcnJlZFNoYXBlIiwidGVuc29yMWQiLCJ0ZW5zb3IyZCIsInRlbnNvcjNkIiwidGVuc29yNGQiLCJ0ZW5zb3I1ZCIsInRlbnNvcjZkIiwicHJvdmlkZWRTaXplIiwiaW5mZXJyZWRTaXplIiwiaW5mZXJyZWQiLCJmbGF0RGltc0RvbnRNYXRjaCIsInRpbGVfIiwidG9wa18iLCJ0cmFuc3Bvc2VfIiwidHJ1bmNhdGVkTm9ybWFsIiwidHJ1bmNhdGVkTm9ybWFsXyIsInVuaXF1ZV8iLCJ1bnNvcnRlZFNlZ21lbnRTdW1fIiwidW5zdGFjayIsInVuc3RhY2tfIiwid2hlcmVfIiwiJGNvbmRpdGlvbiIsImJyb2FkY2FzdFNoYXBlIiwid2hlcmVBc3luYyIsInplcm9zTGlrZV8iLCJBZGFkZWx0YU9wdGltaXplciIsImxlYXJuaW5nUmF0ZSIsInJobyIsImFjY3VtdWxhdGVkR3JhZHMiLCJhY2N1bXVsYXRlZFVwZGF0ZXMiLCJhcHBseUdyYWRpZW50cyIsInZhcmlhYmxlR3JhZGllbnRzIiwib3JpZ2luYWxOYW1lIiwiYWNjdW11bGF0ZWRHcmFkIiwiYWNjdW11bGF0ZWRVcGRhdGUiLCJuZXdBY2N1bXVsYXRlZEdyYWQiLCJuZXdBY2N1bXVsYXRlZFVwZGF0ZSIsImluY3JlbWVudEl0ZXJhdGlvbnMiLCJ2YXJpYWJsZXMiLCJzYXZlSXRlcmF0aW9ucyIsIndlaWdodFZhbHVlcyIsInZhcmlhYmxlQ291bnQiLCJleHRyYWN0SXRlcmF0aW9ucyIsImdldENvbmZpZyIsImNscyIsImNsYXNzTmFtZSIsIkFkYWdyYWRPcHRpbWl6ZXIiLCJpbml0aWFsQWNjdW11bGF0b3JWYWx1ZSIsIkFkYW1PcHRpbWl6ZXIiLCJiZXRhMSIsImJldGEyIiwiYWNjdW11bGF0ZWRGaXJzdE1vbWVudCIsImFjY3VtdWxhdGVkU2Vjb25kTW9tZW50IiwiYWNjQmV0YTEiLCJhY2NCZXRhMiIsInZhck5hbWVzIiwib25lTWludXNBY2NCZXRhMSIsIm9uZU1pbnVzQWNjQmV0YTIiLCJmaXJzdE1vbWVudCIsInNlY29uZE1vbWVudCIsIm5ld0ZpcnN0TW9tZW50IiwibmV3U2Vjb25kTW9tZW50IiwiYmlhc0NvcnJlY3RlZEZpcnN0TW9tZW50IiwiYmlhc0NvcnJlY3RlZFNlY29uZE1vbWVudCIsIml0ZXJhdGlvbnNfIiwiQWRhbWF4T3B0aW1pemVyIiwiYWNjdW11bGF0ZWRXZWlnaHRlZEluZk5vcm0iLCJpdGVyYXRpb24iLCJsciIsIndlaWdodGVkSW5mTm9ybSIsInV0MCIsInV0MSIsIm5ld1dlaWdodGVkSW5mTm9ybSIsIk1vbWVudHVtT3B0aW1pemVyIiwibW9tZW50dW0iLCJ1c2VOZXN0ZXJvdiIsImFjY3VtdWxhdGlvbnMiLCJhY2N1bXVsYXRpb24iLCJuZXdBY2N1bXVsYXRpb24iLCJzZXRNb21lbnR1bSIsIk9wdGltaXplciIsIm1pbmltaXplIiwicmV0dXJuQ29zdCIsImNvbXB1dGVHcmFkaWVudHMiLCJncmFkQXJyYXkiLCJpdGVyYXRpb25zIiwiZ2V0Q2xhc3NOYW1lIiwiaGFzSW5zdGFuY2UiLCJPcHRpbWl6ZXJDb25zdHJ1Y3RvcnMiLCJjZW50ZXJlZCIsIlJNU1Byb3BPcHRpbWl6ZXIiLCJhY2N1bXVsYXRlZE1lYW5TcXVhcmVzIiwiYWNjdW11bGF0ZWRNb21lbnRzIiwiYWNjdW11bGF0ZWRNZWFuR3JhZHMiLCJhY2N1bXVsYXRlZE1lYW5TcXVhcmUiLCJuZXdBY2N1bXVsYXRlZE1lYW5TcXVhcmUiLCJhY2N1bXVsYXRlZE1lYW5HcmFkIiwibmV3QWNjdW11bGF0ZWRNZWFuR3JhZCIsImdyYWRDb250cmlidXRpb24iLCJuZXdBY2N1bXVsYXRlZE1vbWVudHMiLCJTR0RPcHRpbWl6ZXIiLCJzZXRMZWFybmluZ1JhdGUiLCJQbGF0Zm9ybUJyb3dzZXIiLCJlbmNvZGUiLCJlbmNvZGluZyIsInRleHRFbmNvZGVyIiwiVGV4dEVuY29kZXIiLCJyZWdpc3Rlck1hbmFnZXIiLCJnZXROb2RlRmV0Y2giLCJpbXBvcnRGZXRjaCIsInN5c3RlbUZldGNoIiwicmVzZXRTeXN0ZW1GZXRjaCIsInNldFN5c3RlbUZldGNoIiwiZmV0Y2hGbiIsImdldFN5c3RlbUZldGNoIiwiUGxhdGZvcm1Ob2RlIiwidXRpbCIsInJlcXVlc3RJbml0cyIsImhydGltZSIsIlByb2ZpbGVyIiwiYmFja2VuZFRpbWVyIiwibG9nZ2VyIiwiTG9nZ2VyIiwiaG9sZFJlc3VsdFdyYXBwZXJGbiIsInRpbWVyIiwidGVuc29yVmFscyIsImNoZWNrQ29tcHV0YXRpb25Gb3JFcnJvcnMiLCJ0aW1pbmciLCJnZXRFeHRyYVByb2ZpbGVJbmZvIiwidmFsdWVDb250YWluZXIiLCJwYWRkZWROYW1lIiwiaW5wdXRTaGFwZXNEZXNjcmlwdGlvbiIsIlNlcmlhbGl6YWJsZSIsIlNlcmlhbGl6YXRpb25NYXAiLCJjbGFzc05hbWVNYXAiLCJnZXRNYXAiLCJmcm9tQ29uZmlnIiwicmVnaXN0ZXJDbGFzcyIsInJlZ2lzdGVyIiwiZ2V0RmlsdGVyZWROb2Rlc1hUb1kiLCJ0YXBlIiwidGVuc29yc0Zyb21YIiwibm9kZXNGcm9tWCIsIm5vZGVJbnB1dHMiLCJhbnlJbnB1dEZyb21YIiwidGVuc29yc0xlYWRUb1kiLCJub2Rlc1RvWSIsInBydW5lZElucHV0cyIsIm5vZGVJbnB1dCIsInBydW5lZE5vZGUiLCJiYWNrcHJvcGFnYXRlR3JhZGllbnRzIiwidGVuc29yQWNjdW11bGF0ZWRHcmFkaWVudE1hcCIsImdyYWRUZW5zb3IiLCJpbnB1dEdyYWRpZW50cyIsImN1ckdyYWRpZW50IiwiVGVuc29yQnVmZmVyIiwibG9jcyIsInRyYWNrZXJGbiIsImRlcHJlY2F0aW9uV2FybmluZ0ZuIiwic2V0VGVuc29yVHJhY2tlciIsInNldE9wSGFuZGxlciIsInNldERlcHJlY2F0aW9uV2FybmluZ0ZuIiwiVGVuc29yIiwiaXNEaXNwb3NlZEludGVybmFsIiwicmFua1R5cGUiLCJhcnJheVN5bmMiLCJpc0Rpc3Bvc2VkIiwiZ2V0R2xvYmFsVGVuc29yQ2xhc3MiLCJWYXJpYWJsZSIsInRlbnNvcklkIiwiRnVuY3Rpb24iLCJ0ZW5zb3JUb1N0cmluZyIsInBhZFBlckNvbCIsInZhbHVlc09yVHVwbGVzIiwiY3JlYXRlQ29tcGxleFR1cGxlcyIsInZhbFRvU3RyaW5nIiwiY29tcHV0ZU1heFNpemVQZXJDb2x1bW4iLCJ2YWxzTGluZXMiLCJzdWJUZW5zb3JUb1N0cmluZyIsImxpbmVzIiwidmFsU3RyIiwicGFyc2VGbG9hdCIsImJvb2xOdW1Ub1N0cmluZyIsImlzTGFzdCIsInN0b3JhZ2VQZXJFbGVtZW50IiwiZmlyc3RWYWxzU2l6ZSIsImZpcnN0VmFscyIsImxhc3RWYWxzIiwic3Vic2hhcGUiLCJzdWJzdHJpZGVzIiwic2VwIiwibmV3TGluZVNlcCIsImNvbXBsZXhUdXBsZXMiLCJtYWtlVHlwZXNNYXRjaCIsImFzc2VydFR5cGVzTWF0Y2giLCJpc1RlbnNvckluTGlzdCIsInRlbnNvckxpc3QiLCJnZXRUZW5zb3JzSW5Db250YWluZXIiLCJsaXN0Iiwid2Fsa1RlbnNvckNvbnRhaW5lciIsInNlZW4iLCJvYmoiLCJpdGVyYWJsZSIsImluZmVyU2hhcGUiLCJmaXJzdEVsZW0iLCJkZWVwQXNzZXJ0U2hhcGVDb25zaXN0ZW5jeSIsInN1YlNoYXBlIiwiYXNzZXJ0RHR5cGUiLCJleHBlY3RlZER0eXBlIiwiYWN0dWFsRFR5cGUiLCJhcmdOYW1lIiwiZnVuY3Rpb25OYW1lIiwiY29udmVydFRvVGVuc29yIiwicGFyc2VBc0R0eXBlIiwiaW5mZXJyZWREdHlwZSIsImNvbnZlcnRUb1RlbnNvckFycmF5IiwiVEVTVF9FUFNJTE9OX0ZMT0FUMTYiLCJleHBlY3RBcnJheXNDbG9zZSIsImV4cGVjdGVkIiwidGVzdEVwc2lsb24iLCJleHBlY3RBcnJheXNQcmVkaWNhdGUiLCJhcmVDbG9zZSIsInByZWRpY2F0ZSIsImNoZWNrQ2xhc3NUeXBlIiwiYVR5cGUiLCJiVHlwZSIsImFjdHVhbFNoYXBlIiwiZXhwZWN0ZWRTaGFwZSIsImFjdHVhbEZsYXQiLCJleHBlY3RlZEZsYXQiLCJleHBlY3RQcm9taXNlVG9GYWlsIiwiZmFpbCIsImV4cGVjdEFycmF5c0VxdWFsIiwiZXhwZWN0TnVtYmVyc0Nsb3NlIiwiZXhwZWN0VmFsdWVzSW5SYW5nZSIsImV4cGVjdEFycmF5QnVmZmVyc0VxdWFsIiwiZXhwZWN0IiwidG9FcXVhbCIsImVuY29kZVN0cmluZ3MiLCJ0cmFpbiIsInNnZCIsImFkYWRlbHRhIiwiYWRhZ3JhZCIsInJtc3Byb3AiLCJhZGFtYXgiLCJhZGFtIiwiUmFuayIsIlVwY2FzdEludDMyQW5kTWFwIiwiVXBjYXN0Qm9vbEFuZE1hcCIsIlVwY2FzdEZsb2F0MzJBbmRNYXAiLCJVcGNhc3RDb21wbGV4NjRBbmRNYXAiLCJ1cGNhc3RUeXBlTWFwIiwidHlwZUEiLCJ0eXBlQiIsInN1bU91dFR5cGUiLCJub0NvbnZlcnNpb25OZWVkZWQiLCJib29sIiwic2h1ZmZsZSIsInNodWZmbGVDb21ibyIsImFycmF5MiIsInJhbmRVbmlmb3JtIiwiZGlzdFNxdWFyZWQiLCJleHByIiwiZXJyb3JNZXNzYWdlUHJlZml4IiwiYXNzZXJ0Tm9uTnVsbCIsInNraXBUeXBlZEFycmF5IiwiaXNUeXBlZEFycmF5IiwiaXNTY2FsYXJTaGFwZSIsIm4xIiwibjIiLCJlMngiLCJjcmVhdGVTaHVmZmxlZEluZGljZXMiLCJzaHVmZmxlZEluZGljZXMiLCJyZXBlYXQiLCJjaGVja0ZuIiwiZGVsYXlGbiIsIm1heENvdW50ZXIiLCJ0cnlDb3VudCIsInRyeUZuIiwibmV4dEJhY2tvZmYiLCJzaGFwZVByb2QiLCJpbXBsaWNpdElkeCIsImF4IiwiaXNFbXB0eUFycmF5IiwiY2hlY2tDb252ZXJzaW9uRm9yRXJyb3JzIiwiaXNWYWxpZER0eXBlIiwib2xkVHlwZSIsIm5ld1R5cGUiLCJieXRlc0Zyb21TdHJpbmdBcnJheSIsImlzQm9vbGVhbiIsImlzTnVtYmVyIiwiaXNGdW5jdGlvbiIsIm5lYXJlc3REaXZpc29yIiwiY3JlYXRlTmVzdGVkQXJyYXkiLCJpc0NvbXBsZXgiLCJyZXN0IiwiYWNjIiwibWFrZU9uZXNUeXBlZEFycmF5IiwiYXNzZXJ0Tm9uTmVnYXRpdmVJbnRlZ2VyRGltZW5zaW9ucyIsImlzUHJvbWlzZSIsImI2NCIsImxlbnMiLCJnZXRMZW5zIiwidmFsaWRMZW4iLCJwbGFjZUhvbGRlcnNMZW4iLCJ0b0J5dGVBcnJheSIsInRtcCIsIkFyciIsIl9ieXRlTGVuZ3RoIiwiY3VyQnl0ZSIsInJldkxvb2t1cCIsImZyb21CeXRlQXJyYXkiLCJ1aW50OCIsImV4dHJhQnl0ZXMiLCJtYXhDaHVua0xlbmd0aCIsImxlbjIiLCJlbmNvZGVDaHVuayIsImxvb2t1cCIsImJhc2U2NCIsImllZWU3NTQiLCJrTWF4TGVuZ3RoIiwiVFlQRURfQVJSQVlfU1VQUE9SVCIsInRoYXQiLCJSYW5nZUVycm9yIiwiX19wcm90b19fIiwiZW5jb2RpbmdPck9mZnNldCIsImFsbG9jVW5zYWZlIiwiZnJvbUFycmF5TGlrZSIsImZyb21BcnJheUJ1ZmZlciIsImlzRW5jb2RpbmciLCJpc0J1ZmZlciIsImNoZWNrZWQiLCJjb3B5IiwiZnJvbU9iamVjdCIsImFzc2VydFNpemUiLCJpc1ZpZXciLCJsb3dlcmVkQ2FzZSIsInV0ZjhUb0J5dGVzIiwiYmFzZTY0VG9CeXRlcyIsInNsb3dUb1N0cmluZyIsImhleFNsaWNlIiwidXRmOFNsaWNlIiwiYXNjaWlTbGljZSIsImxhdGluMVNsaWNlIiwiYmFzZTY0U2xpY2UiLCJ1dGYxNmxlU2xpY2UiLCJiaWRpcmVjdGlvbmFsSW5kZXhPZiIsImFycmF5SW5kZXhPZiIsImluZGV4U2l6ZSIsImFyckxlbmd0aCIsInZhbExlbmd0aCIsInJlYWRVSW50MTZCRSIsImZvdW5kSW5kZXgiLCJoZXhXcml0ZSIsInJlbWFpbmluZyIsInN0ckxlbiIsInBhcnNlZCIsInBhcnNlSW50IiwidXRmOFdyaXRlIiwiYmxpdEJ1ZmZlciIsImFzY2lpV3JpdGUiLCJieXRlQXJyYXkiLCJhc2NpaVRvQnl0ZXMiLCJsYXRpbjFXcml0ZSIsImJhc2U2NFdyaXRlIiwidWNzMldyaXRlIiwidW5pdHMiLCJoaSIsImxvIiwidXRmMTZsZVRvQnl0ZXMiLCJzZWNvbmRCeXRlIiwidGhpcmRCeXRlIiwiZm91cnRoQnl0ZSIsInRlbXBDb2RlUG9pbnQiLCJmaXJzdEJ5dGUiLCJjb2RlUG9pbnQiLCJieXRlc1BlclNlcXVlbmNlIiwiY29kZVBvaW50cyIsIk1BWF9BUkdVTUVOVFNfTEVOR1RIIiwiZGVjb2RlQ29kZVBvaW50c0FycmF5IiwiU2xvd0J1ZmZlciIsImFsbG9jIiwiSU5TUEVDVF9NQVhfQllURVMiLCJmb28iLCJ0eXBlZEFycmF5U3VwcG9ydCIsInBvb2xTaXplIiwiX2F1Z21lbnQiLCJzcGVjaWVzIiwiYWxsb2NVbnNhZmVTbG93IiwiX2lzQnVmZmVyIiwiY29tcGFyZSIsInBvcyIsInN3YXAxNiIsInN3YXAzMiIsInN3YXA2NCIsImVxdWFscyIsImluc3BlY3QiLCJ0aGlzU3RhcnQiLCJ0aGlzRW5kIiwidGhpc0NvcHkiLCJ0YXJnZXRDb3B5IiwiaW5jbHVkZXMiLCJ0b0pTT04iLCJfYXJyIiwidG9IZXgiLCJjaGVja09mZnNldCIsImNoZWNrSW50Iiwib2JqZWN0V3JpdGVVSW50MTYiLCJsaXR0bGVFbmRpYW4iLCJvYmplY3RXcml0ZVVJbnQzMiIsImNoZWNrSUVFRTc1NCIsIndyaXRlRmxvYXQiLCJub0Fzc2VydCIsIndyaXRlRG91YmxlIiwibmV3QnVmIiwic2xpY2VMZW4iLCJyZWFkVUludExFIiwicmVhZFVJbnRCRSIsInJlYWRVSW50OCIsInJlYWRVSW50MTZMRSIsInJlYWRVSW50MzJMRSIsInJlYWRVSW50MzJCRSIsInJlYWRJbnRMRSIsInJlYWRJbnRCRSIsInJlYWRJbnQ4IiwicmVhZEludDE2TEUiLCJyZWFkSW50MTZCRSIsInJlYWRJbnQzMkxFIiwicmVhZEludDMyQkUiLCJyZWFkRmxvYXRMRSIsInJlYWRGbG9hdEJFIiwicmVhZERvdWJsZUxFIiwicmVhZERvdWJsZUJFIiwid3JpdGVVSW50TEUiLCJ3cml0ZVVJbnRCRSIsIndyaXRlVUludDgiLCJ3cml0ZVVJbnQxNkxFIiwid3JpdGVVSW50MTZCRSIsIndyaXRlVUludDMyTEUiLCJ3cml0ZVVJbnQzMkJFIiwid3JpdGVJbnRMRSIsImxpbWl0Iiwid3JpdGVJbnRCRSIsIndyaXRlSW50OCIsIndyaXRlSW50MTZMRSIsIndyaXRlSW50MTZCRSIsIndyaXRlSW50MzJMRSIsIndyaXRlSW50MzJCRSIsIndyaXRlRmxvYXRMRSIsIndyaXRlRmxvYXRCRSIsIndyaXRlRG91YmxlTEUiLCJ3cml0ZURvdWJsZUJFIiwidGFyZ2V0U3RhcnQiLCJJTlZBTElEX0JBU0U2NF9SRSIsImxlYWRTdXJyb2dhdGUiLCJzdHJpbmd0cmltIiwiYmFzZTY0Y2xlYW4iLCJpc0xFIiwibUxlbiIsIm5CeXRlcyIsImVMZW4iLCJlTWF4IiwiZUJpYXMiLCJuQml0cyIsInJ0IiwiTE4yIiwiSW5zdGFuY2UiLCJ1bnNpZ25lZCIsImlzTG9uZyIsIl9faXNMb25nX18iLCJJTlRfQ0FDSEUiLCJVSU5UX0NBQ0hFIiwiZnJvbUludCIsImNhY2hlZE9iaiIsImNhY2hlIiwiZnJvbUJpdHMiLCJaRVJPIiwiVFdPX1BXUl82NF9EQkwiLCJNQVhfVU5TSUdORURfVkFMVUUiLCJUV09fUFdSXzYzX0RCTCIsIk1JTl9WQUxVRSIsIk1BWF9WQUxVRSIsIlRXT19QV1JfMzJfREJMIiwibG93Qml0cyIsImhpZ2hCaXRzIiwicG93X2RibCIsInJhZGl4IiwicmFkaXhUb1Bvd2VyIiwicG93ZXIiLCJmcm9tVmFsdWUiLCJUV09fUFdSXzE2X0RCTCIsIlRXT19QV1JfMjQiLCJPTkUiLCJVT05FIiwiTkVHX09ORSIsIkxvbmdQcm90b3R5cGUiLCJ0b0ludCIsInRvTnVtYmVyIiwiaXNaZXJvIiwiaXNOZWdhdGl2ZSIsImVxIiwicmFkaXhMb25nIiwicmVtMSIsInJlbURpdiIsImRpZ2l0cyIsImdldEhpZ2hCaXRzIiwiZ2V0SGlnaEJpdHNVbnNpZ25lZCIsImdldExvd0JpdHMiLCJnZXROdW1CaXRzQWJzIiwiYml0IiwiZXF6IiwiaXNQb3NpdGl2ZSIsImlzT2RkIiwib3RoZXIiLCJub3RFcXVhbHMiLCJuZXEiLCJuZSIsImxlc3NUaGFuIiwiY29tcCIsImx0IiwibGVzc1RoYW5PckVxdWFsIiwibHRlIiwibGUiLCJncmVhdGVyVGhhbiIsImd0IiwiZ3JlYXRlclRoYW5PckVxdWFsIiwiZ3RlIiwiZ2UiLCJ0aGlzTmVnIiwib3RoZXJOZWciLCJuZWdhdGUiLCJub3QiLCJhZGRlbmQiLCJhNDgiLCJhMzIiLCJhMTYiLCJhMDAiLCJiNDgiLCJiMzIiLCJiMTYiLCJjNDgiLCJjMzIiLCJjMTYiLCJjMDAiLCJzdWJ0cmFjdCIsInN1YnRyYWhlbmQiLCJnZXRfaGlnaCIsImIwMCIsImRpdmlkZSIsImFwcHJveCIsImRpdl91IiwiZGl2X3MiLCJ0b1Vuc2lnbmVkIiwic2hyIiwiYXBwcm94UmVzIiwiYXBwcm94UmVtIiwicmVtX3UiLCJyZW1fcyIsInNoaWZ0TGVmdCIsIm51bUJpdHMiLCJzaGlmdFJpZ2h0Iiwic2hpZnRSaWdodFVuc2lnbmVkIiwic2hyX3UiLCJ0b1NpZ25lZCIsInRvQnl0ZXMiLCJ0b0J5dGVzTEUiLCJ0b0J5dGVzQkUiLCJmcm9tQnl0ZXNMRSIsImZyb21CeXRlc0JFIiwiY2FjaGVkU2V0VGltZW91dCIsImNhY2hlZENsZWFyVGltZW91dCIsImRlZmF1bHRTZXRUaW1vdXQiLCJkZWZhdWx0Q2xlYXJUaW1lb3V0IiwicnVuVGltZW91dCIsImZ1biIsImNsZWFyVGltZW91dCIsImN1cnJlbnRRdWV1ZSIsInF1ZXVlIiwiZHJhaW5pbmciLCJxdWV1ZUluZGV4IiwiY2xlYW5VcE5leHRUaWNrIiwiZHJhaW5RdWV1ZSIsIm1hcmtlciIsInJ1bkNsZWFyVGltZW91dCIsIkl0ZW0iLCJub29wIiwibmV4dFRpY2siLCJ0aXRsZSIsImJyb3dzZXIiLCJhZGRMaXN0ZW5lciIsIm9uY2UiLCJvZmYiLCJyZW1vdmVMaXN0ZW5lciIsInJlbW92ZUFsbExpc3RlbmVycyIsImVtaXQiLCJwcmVwZW5kTGlzdGVuZXIiLCJwcmVwZW5kT25jZUxpc3RlbmVyIiwibGlzdGVuZXJzIiwiYmluZGluZyIsImN3ZCIsImNoZGlyIiwidW1hc2siLCJhbGVhIiwieG9yMTI4IiwieG9yd293IiwieG9yc2hpZnQ3IiwieG9yNDA5NiIsInR5Y2hlaSIsInNyIiwiZGVmaW5lIiwiQWxlYSIsIm1lIiwibWFzaCIsInMwIiwiczEiLCJzMiIsImltcGwiLCJ4ZyIsInBybmciLCJpbnQzMiIsInF1aWNrIiwiWG9yR2VuIiwic3Ryc2VlZCIsIlgiLCJtYXRoIiwibm9kZWNyeXB0byIsInN0YXJ0ZGVub20iLCJzaWduaWZpY2FuY2UiLCJvdmVyZmxvdyIsInNlZWRyYW5kb20iLCJvcHRpb25zIiwic2hvcnRzZWVkIiwibWl4a2V5IiwiZW50cm9weSIsInRvc3RyaW5nIiwicmFuZG9tQnl0ZXMiLCJjcnlwdG8iLCJtc0NyeXB0byIsImdldFJhbmRvbVZhbHVlcyIsInBsdWdpbnMiLCJhdXRvc2VlZCIsImFyYzQiLCJBUkM0IiwiUyIsInBhc3MiLCJpc19tYXRoX2NhbGwiLCJrZXlsZW4iLCJwcm9wIiwidHlwIiwic21lYXIiLCJzdHJpbmdzZWVkIiwicmVnaXN0ZXJJbW1lZGlhdGUiLCJodG1sIiwibWVzc2FnZVByZWZpeCIsIm9uR2xvYmFsTWVzc2FnZSIsIm5leHRIYW5kbGUiLCJ0YXNrc0J5SGFuZGxlIiwiY3VycmVudGx5UnVubmluZ0FUYXNrIiwiZG9jIiwiYXR0YWNoVG8iLCJnZXRQcm90b3R5cGVPZiIsInJ1bklmUHJlc2VudCIsInBvc3RNZXNzYWdlSXNBc3luY2hyb25vdXMiLCJvbGRPbk1lc3NhZ2UiLCJjYW5Vc2VQb3N0TWVzc2FnZSIsInBvcnQyIiwiZG9jdW1lbnRFbGVtZW50Iiwic2NyaXB0Iiwib25yZWFkeXN0YXRlY2hhbmdlIiwicmVtb3ZlQ2hpbGQiLCJhcHBlbmRDaGlsZCIsImF0dGFjaEV2ZW50IiwidGFzayIsImNsZWFySW1tZWRpYXRlIiwiVGltZW91dCIsImNsZWFyRm4iLCJfaWQiLCJfY2xlYXJGbiIsInNjb3BlIiwic2V0SW50ZXJ2YWwiLCJ1bnJlZiIsInJlZiIsImVucm9sbCIsIl9pZGxlVGltZW91dElkIiwiX2lkbGVUaW1lb3V0IiwidW5lbnJvbGwiLCJfdW5yZWZBY3RpdmUiLCJhY3RpdmUiLCJfb25UaW1lb3V0IiwiX193ZWJwYWNrX2FtZF9vcHRpb25zX18iLCJ3ZWJwYWNrUG9seWZpbGwiLCJkZXByZWNhdGUiLCJjaGlsZHJlbiIsIm1sIiwiTUwiLCJNTENvbnRleHQiLCJNTEdyYXBoQnVpbGRlciIsIk1MR3JhcGgiLCJNTE9wZXJhbmQiLCJNTFBvd2VyUHJlZmVyZW5jZSIsIk1MRGV2aWNlUHJlZmVyZW5jZSIsIm9wdGlvbnNfIiwiRXhlY3V0aW9uQ29udGV4dCIsImNvbnN0YW50VGVuc29ycyIsImlucHV0T3BlcmFuZHMiLCJvcGVyYW5kUmVmcyIsImNvbnN0YW50VGVub3Nyc18iLCJvcGVyYW5kUmVmc18iLCJhbGxvY2F0ZUlucHV0VGVuc29ycyIsIm91dHB1dFRlbnNvcnNfIiwib3V0cHV0T3BlcmFuZHNfIiwiaW5wdXRUZW5zb3JzXyIsImlucHV0T3BlcmFuZCIsImRlc2MiLCJyZXNvdXJjZSIsImRpbWVuc2lvbnMiLCJvdXRwdXRUZW5zb3JzIiwib3V0cHV0TmFtZSIsImdldFRlbnNvciIsInNldE91dHB1dFRlbnNvciIsInJlbGVhc2VUZW5zb3IiLCJvcGVyYW5kIiwib3BlcmFuZFRlbnNvck1hcCIsIm9wZXJhbmRUZW5zb3IiLCJpbnB1dHNfIiwib3V0cHV0c18iLCJjb25zdGFudHNfIiwiY29uc3RhbnRUZW5zb3JzXyIsInZhbGlkYXRlSW5wdXRzIiwib3V0cHV0T3BlcmFuZHMiLCJncmFwaCIsImJ1aWxkIiwiY29tcGlsZSIsInZpc2l0ZWRPcHMiLCJidWlsZE9wZXJhdGlvbiIsImFsbG9jYXRlQ29uc3RhbnRzIiwiY29tcHV0ZU9uY2UiLCJjb25zdGFudCIsImRpc3Bvc2VPcGVyYXRpb24iLCJNTElucHV0T3BlcmFuZExheW91dCIsIk1MRmlsdGVyT3BlcmFuZExheW91dCIsIk1MQXV0b1BhZCIsIk1MUmVjdXJyZW50TmV0d29ya1dlaWdodExheW91dCIsIk1MUmVjdXJyZW50TmV0d29ya0RpcmVjdGlvbiIsIk1MUGFkZGluZ01vZGUiLCJNTEludGVycG9sYXRpb25Nb2RlIiwiY29udGV4dF8iLCJidWlsZEFuZENvbXBpbGUiLCJkZXNjT3JWYWx1ZSIsInZhbHVlT3JUeXBlIiwiZmxvYXQzMiIsImNyZWF0ZVNjYWxhciIsImNyZWF0ZVRlbnNvciIsImJhdGNoTm9ybWFsaXphdGlvbiIsInZhbGlkYXRlT3BlcmFuZEJ1aWxkZXIiLCJnZXRGdXNlZE91dHB1dHMiLCJvcGVyYW5kT3JPcHRpb25zIiwibWluVmFsdWUiLCJnZW1tIiwiZ3J1IiwicmVjdXJyZW50V2VpZ2h0IiwiaGlkZGVuU2l6ZSIsInJlY3VycmVudEJpYXMiLCJpbml0aWFsSGlkZGVuU3RhdGUiLCJncnVDZWxsIiwiaGlkZGVuU3RhdGUiLCJpbnN0YW5jZU5vcm1hbGl6YXRpb24iLCJtYXRtdWwiLCJwYWRkaW5nIiwiYXZlcmFnZVBvb2wyZCIsIm1heFBvb2wyZCIsInJlZHVjZUxvZ1N1bUV4cCIsInJlZHVjZU1heCIsInJlZHVjZU1lYW4iLCJyZWR1Y2VNaW4iLCJyZWR1Y2VQcm9kdWN0IiwicmVkdWNlU3VtIiwicmVzYW1wbGUiLCJzdGFydHMiLCJzaXplcyIsIm9wZXJhbmRzIiwiYnVpbGRlciIsIk1MT3BlcmFuZFR5cGUiLCJidWlsZGVyXyIsIklucHV0T3BlcmFuZCIsIkNvbnN0YW50T3BlcmFuZCIsIk91dHB1dE9wZXJhbmQiLCJPcGVyYXRpb24iLCJpbnB1dFRlbnNvcnMiLCJjb21wdXRlSW1wbCIsIlNpbmdsZU91dHB1dE9wZXJhdGlvbiIsImNyZWF0ZU91dHB1dCIsIkJhdGNoTm9ybWFsaXphdGlvbiIsImlucHV0XyIsInZhcmlhbmNlXyIsInNjYWxlXyIsImJpYXNfIiwiYXhpc18iLCJlcHNpbG9uXyIsImFjdGl2YXRpb25fIiwiQmluYXJ5IiwiYV8iLCJiXyIsInJ1bk9wIiwiTXVsIiwiRGl2IiwiTWF0TXVsIiwiQ2xhbXAiLCJ4XyIsIm1pbk9wZXJhbmRfIiwibWluU2NhbGFyVmFsdWVfIiwiZ2V0U2NhbGFyVmFsdWUiLCJtYXhPcGVyYW5kXyIsIm1heFNjYWxhclZhbHVlXyIsIm1pbnVzIiwibWluQ29uc3RhbnQiLCJDb252MmQiLCJmaWx0ZXJfIiwiYXV0b1BhZCIsImV4cGxpY2l0IiwiaW5pdE9wdGlvbnMiLCJncm91cHMiLCJpbnB1dExheW91dCIsImZpbHRlckxheW91dCIsIm91dHB1dFBhZGRpbmciLCJvdXRwdXRTaXplcyIsIm5jaHciLCJvaWh3IiwicGFkZGluZ18iLCJzdHJpZGVzXyIsImRpbGF0aW9uc18iLCJncm91cHNfIiwiaW5wdXRMYXlvdXRfIiwiZmlsdGVyTGF5b3V0XyIsImF1dG9QYWRfIiwib3V0cHV0UGFkZGluZ18iLCJvdXRwdXRTaXplc18iLCJmdXNlZEFjdGl2YXRpb25fIiwiaXNSZWx1NiIsImxlYWt5cmVsdUFscGhhXyIsIm1pblNjYWxhclZhbHVlIiwibWF4U2NhbGFyVmFsdWUiLCJmdXNlZCIsImZpbHRlclRlbnNvcl8iLCJvaHdpIiwiaWh3byIsImZ1c2VkRGVwdGh3aXNlUGFkIiwiR2VtbSIsImFUcmFuc3Bvc2UiLCJiVHJhbnNwb3NlIiwiYWIiLCJHcnUiLCJ3ZWlnaHRfIiwicmVjdXJyZW50V2VpZ2h0XyIsInN0ZXBzXyIsImhpZGRlblNpemVfIiwicmVzZXRBZnRlciIsInJldHVyblNlcXVlbmNlIiwiZGlyZWN0aW9uIiwibGF5b3V0IiwiYWN0aXZhdGlvbnMiLCJyZXR1cm5TZXF1ZW5jZV8iLCJmb3J3YXJkIiwienJuIiwicmVjdXJyZW50Qmlhc18iLCJpbml0aWFsSGlkZGVuU3RhdGVfIiwicmVzZXRBZnRlcl8iLCJkaXJlY3Rpb25fIiwibGF5b3V0XyIsImFjdGl2YXRpb25zXyIsIm51bURpcmVjdGlvbnMiLCJib3RoIiwic2VxdWVuY2UiLCJjZWxsV2VpZ2h0IiwiY2VsbFJlY3VycmVudFdlaWdodCIsImNlbGxCaWFzIiwiY2VsbFJlY3VycmVudEJpYXMiLCJzbG90IiwiY2VsbEhpZGRlbiIsImNlbGxPdXRwdXQiLCJiYWNrd2FyZCIsImNlbGxJbnB1dCIsIkdydUNlbGwiLCJoaWRkZW5TdGF0ZV8iLCJhY3RpdmF0aW9uMCIsImFjdGl2YXRpb24xIiwiSW5zdGFuY2VOb3JtYWxpemF0aW9uIiwibmh3YyIsInNjYWxlZCIsImFscGhhXyIsIlBhZCIsIm1vZGVfIiwidmFsdWVfIiwicGFkZGluZ0FycmF5IiwiZWRnZSIsImVkZ2VQYWRkaW5ncyIsInBhZGRlZCIsInJlZmxlY3Rpb24iLCJzeW1tZXRyaWMiLCJ3aW5kb3dEaW1lbnNpb25zIiwid2luZG93RGltZW5zaW9uc18iLCJnZXRQb29saW5nVHlwZSIsInRvdGFsUGFkZGluZyIsIkF2ZXJhZ2VQb29sMmQiLCJNYXhQb29sMmQiLCJSZWR1Y2UiLCJheGVzXyIsImtlZXBEaW1lbnNpb25zIiwia2VlcERpbWVuc2lvbnNfIiwiUmVkdWNlTG9nU3VtRXhwIiwiUmVkdWNlTWF4IiwiUmVkdWNlTWVhbiIsIlJlZHVjZU1pbiIsIlJlZHVjZVByb2R1Y3QiLCJSZWR1Y2VTdW0iLCJSZXNhbXBsZSIsInNjYWxlcyIsInNjYWxlc18iLCJzaXplc18iLCJuZXdTaGFwZV8iLCJzdGFydHNfIiwiU3BsaXQiLCJzcGxpdHNfIiwiU3F1ZWV6ZSIsInBlcm11dGF0aW9uXyIsIlVuYXJ5IiwiVW5hcnlNTE9wZXJhdG9yIiwiaXNJbnRlZ2VyQXJyYXkiLCJnZXRUeXBlZEFycmF5IiwiY2xvbmVUeXBlZEFycmF5IiwiZ2V0RGF0YVR5cGUiLCJjcmVhdGVPcGVyYW5kRGVzY3JpcHRvckZyb21UZW5zb3IiLCJ2YWxpZGF0ZU9wZXJhbmREZXNjcmlwdG9yIiwiaXNEeWFubWljU2hhcGUiLCJ2YWxpZGF0ZVR5cGVkQXJyYXkiLCJzaXplRnJvbURpbWVuc2lvbnMiLCJ2YWxpZGF0ZVZhbHVlVHlwZSIsInVpbnQzMiIsImludDgiLCJjbG9uZWRBcnJheSIsImN1cnJlbnRWYWx1ZSIsInZhbGlkYXRlT3BlcmFuZCIsInZhbGlkYXRlT3B0aW9uYWxPcGVyYW5kIiwidmFsaWRhdGVBeGVzIiwiZ2V0UGFkZGluZ3MiLCJyZXN1bHRQYWRkaW5nIl0sIm1hcHBpbmdzIjoiYUFDRSxJQUFJQSxFQUFtQixHQUd2QixTQUFTQyxFQUFvQkMsR0FHNUIsR0FBR0YsRUFBaUJFLEdBQ25CLE9BQU9GLEVBQWlCRSxHQUFVQyxRQUduQyxJQUFJQyxFQUFTSixFQUFpQkUsR0FBWSxDQUN6Q0csRUFBR0gsRUFDSEksR0FBRyxFQUNISCxRQUFTLElBVVYsT0FOQUksRUFBUUwsR0FBVU0sS0FBS0osRUFBT0QsUUFBU0MsRUFBUUEsRUFBT0QsUUFBU0YsR0FHL0RHLEVBQU9FLEdBQUksRUFHSkYsRUFBT0QsUUFLZkYsRUFBb0JRLEVBQUlGLEVBR3hCTixFQUFvQlMsRUFBSVYsRUFHeEJDLEVBQW9CVSxFQUFJLFNBQVNSLEVBQVNTLEVBQU1DLEdBQzNDWixFQUFvQmEsRUFBRVgsRUFBU1MsSUFDbENHLE9BQU9DLGVBQWVi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SzNDLFlBQXlCL0IsRUFBaUIsU0FBRSxXQUFXLE9BQWdCQSxFQUFpQixTQUFFQSxFQUFZLElBQU0sSUFBRzBFLE1BQU0sS0FBSzNDLFlBQThCL0IsRUFBc0IsY0FBRSxXQUFXLE9BQXFCQSxFQUFzQixjQUFFQSxFQUFZLElBQU0sSUFBRzBFLE1BQU0sS0FBSzNDLFlBQTJCL0IsRUFBbUIsV0FBRSxXQUFXLE9BQWtCQSxFQUFtQixXQUFFQSxFQUFZLElBQU0sSUFBRzBFLE1BQU0sS0FBSzNDLFlBQXNCL0IsRUFBYyxNQUFFLFdBQVcsT0FBYUEsRUFBYyxNQUFFQSxFQUFZLElBQU0sSUFBRzBFLE1BQU0sS0FBSzNDLFlBQTJCL0IsRUFBbUIsV0FBRSxXQUFXLE9BQWtCQSxFQUFtQixXQUFFQSxFQUFZLElBQU0sSUFBRzBFLE1BQU0sS0FBSzNDLFlBQXFCL0IsRUFBYSxLQUFFLFdBQVcsT0FBWUEsRUFBYSxLQUFFQSxFQUFZLElBQU0sSUFBRzBFLE1BQU0sS0FBSzNDLFlBQTRCL0IsRUFBb0IsWUFBRSxXQUFXLE9BQW1CQSxFQUFvQixZQUFFQSxFQUFZLElBQU0sSUFBRzBFLE1BQU0sS0FBSzNDLFlBQXFCL0IsRUFBYSxLQUFFLFdBQVcsT0FBWUEsRUFBYSxLQUFFQSxFQUFZLElBQU0sSUFBRzBFLE1BQU0sS0FBSzNDLFlBQXlCL0IsRUFBaUIsU0FBRSxXQUFXLE9BQWdCQSxFQUFpQixTQUFFQSxFQUFZLElBQU0sSUFBRzBFLE1BQU0sS0FBSzNDLFlBQXlCL0IsRUFBaUIsU0FBRSxXQUFXLE9BQWdCQSxFQUFpQixTQUFFQSxFQUFZLElBQU0sSUFBRzBFLE1BQU0sS0FBSzNDLFlBQXNCL0IsRUFBYyxNQUFFLFdBQVcsT0FBYUEsRUFBYyxNQUFFQSxFQUFZLElBQU0sSUFBRzBFLE1BQU0sS0FBSzNDLFlBQXFCL0IsRUFBYSxLQUFFLFdBQVcsT0FBWUEsRUFBYSxLQUFFQSxFQUFZLElBQU0sSUFBRzBFLE1BQU0sS0FBSzNDLFlBQXlCL0IsRUFBaUIsU0FBRSxXQUFXLE9BQWdCQSxFQUFpQixTQUFFQSxFQUFZ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QUFHM3lHLEVBQWFBLEVBQU0sU0FBU29nSCxHQUFTOWdILEdBQU0sT0FBT0EsR0FBTSxLQUFLLEdBQUcsT0FBTyxNQUFNLEtBQUssR0FBOEIsT0FBTzgxRyxPQUFrQixLQUFLLElBQUksS0FBSyxJQUFJLEtBQUssR0FBRyxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUssR0FBRyxLQUFLLElBQUksS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLEdBQUcsS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLElBQUksS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUssRUFBRSxLQUFLLEdBQUcsS0FBSyxHQUFHLEtBQUssSUFBSSxLQUFLLElBQUksS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLEdBQUcsS0FBSyxJQUFJLEtBQUssR0FBRyxLQUFLLEdBQUcsS0FBSyxHQUFHLEtBQUssSUFBSSxLQUFLLEdBQUcsS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLEdBQUcsS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLEdBQUcsS0FBSyxHQUFHLE9BQU8sT0FBTyxLQUFLLEdBQUcsS0FBSyxJQUFJLEtBQUssSUFBSSxLQUFLLElBQUksS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUssSUFBSSxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUssSUFBSSxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUssSUFBSSxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUssSUFBSSxLQUFLLElBQUksS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUssSUFBSSxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUssSUFBSSxLQUFLLEdBQUcsS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLElBQUksS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLEdBQUcsS0FBSyxHQUFHLE9BQU8sRUFBRSxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUssRUFBRSxLQUFLLElBQUksS0FBSyxFQUFFLEtBQUss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QUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUFJLEVBQUcsR0FBSSxFQUFHLEVBQUcsSUFBSyxHQUFJLEVBQUcsSUFBSyxJQUFLLElBQUssSUFBSyxFQUFHLElBQUssRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsSUFBSyxFQUFHLEdBQUksRUFBRyxHQUFJLEVBQUcsR0FBSSxFQUFHLEVBQUcsSUFBSyxJQUFLLElBQUssRUFBRyxFQUFHLEVBQUcsSUFBSyxJQUFLLElBQUssR0FBSSxJQUFLLEVBQUcsRUFBRyxFQUFHLElBQUssSUFBSyxJQUFLLEdBQUksSUFBSyxFQUFHLEVBQUcsRUFBRyxJQUFLLElBQUssSUFBSyxHQUFJLElBQUssRUFBRyxFQUFHLEVBQUcsSUFBSyxJQUFLLElBQUssR0FBSSxJQUFLLEVBQUcsRUFBRyxFQUFHLElBQUssSUFBSyxJQUFLLEdBQUksSUFBSyxJQUFLLElBQUssSUFBSyxFQUFHLEVBQUcsR0FBSSxJQUFLLEVBQUcsRUFBRyxFQUFHLEVBQUcsR0FBSSxFQUFHLEdBQUksR0FBSSxFQUFHLEVBQUcsSUFBSyxHQUFJLEVBQUcsSUFBSyxHQUFJLEVBQUcsSUFBSyxHQUFJLEdBQUksSUFBSyxJQUFLLEdBQUksRUFBRyxJQUFLLEdBQUksRUFBRyxJQUFLLEdBQUksR0FBSSxJQUFLLElBQUssSUFBSyxHQUFJLEVBQUcsR0FBSSxHQUFJLElBQUssSUFBSyxHQUFJLEVBQUcsR0FBSSxFQUFHLElBQUssR0FBSSxHQUFJLEVBQUcsRUFBRyxJQUFLLEdBQUksRUFBRyxJQUFLLEdBQUksRUFBRyxJQUFLLEdBQUksR0FBSSxJQUFLLElBQUssR0FBSSxFQUFHLElBQUssR0FBSSxFQUFHLElBQUssR0FBSSxHQUFJLElBQUssSUFBSyxJQUFLLEdBQUksRUFBRyxHQUFJLEdBQUksSUFBSyxJQUFLLEdBQUksRUFBRyxHQUFJLEVBQUcsSUFBSyxHQUFJLEdBQUksRUFBRyxFQUFHLElBQUssR0FBSSxFQUFHLElBQUssR0FBSSxFQUFHLElB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dU8sRUFBTzNLLE1BQU01RCxHQUFLLEdBQUtvbkMsRUFBVXBuQyxHQUFLLEdBQUt5USxFQUFNN00sTUFBTSxFQUFJNUQsR0FFbkUsSUFBSyxJQUFJQSxFQUFJLEVBQUdBLEVBQUksSUFBS0EsRUFDdkJ3OEwsRUFBY3g4TCxFQUFJLEdBQUcsR0FDakI2NUwsRUFBYTc1TCxHQUFLbUUsS0FBSzJZLE1BQU0rOEssRUFBYTc1TCxHQUFLLEdBQ25EdzhMLEVBQWN4OEwsRUFBSSxHQUFHLEdBQUttRSxLQUFLMlksTUFBTSs4SyxFQUFhNzVMLEdBQUssR0FJN0QsT0FBT3c4TCxJIiwiZmlsZSI6IndlYm5uLXBvbHlmaWxsLmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDApO1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcblxuZXhwb3J0IGNsYXNzIEFkZE5Qcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lczogc3RyaW5nW107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXSA9IFtdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKG91dHB1dFNoYXBlOiBudW1iZXJbXSwgc2hhcGVzOiBudW1iZXJbXVtdKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IG91dHB1dFNoYXBlO1xuICAgIHRoaXMudmFyaWFibGVOYW1lcyA9IHNoYXBlcy5tYXAoKF8sIGkpID0+IGBUJHtpfWApO1xuXG4gICAgY29uc3Qgc25pcHBldHM6IHN0cmluZ1tdID0gW107XG4gICAgLy8gR2V0IHRhcmdldCBlbGVtZW50cyBmcm9tIGV2ZXJ5IGlucHV0IHRlbnNvci5cbiAgICB0aGlzLnZhcmlhYmxlTmFtZXMuZm9yRWFjaCh2YXJpYWJsZSA9PiB7XG4gICAgICBzbmlwcGV0cy5wdXNoKGBmbG9hdCB2JHt2YXJpYWJsZX0gPSBnZXQke3ZhcmlhYmxlfUF0T3V0Q29vcmRzKCk7YCk7XG4gICAgfSk7XG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIHN1bSBvZiBhbGwgZWxlbWVudHMuXG4gICAgY29uc3Qgb3BlcmF0aW9uID0gdGhpcy52YXJpYWJsZU5hbWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAodmFyaWFibGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgdiR7dmFyaWFibGV9YDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLmpvaW4oJyArICcpO1xuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgJHtzbmlwcGV0cy5qb2luKCdcXG4gICAgICAgICcpfVxuXG4gICAgICAgIGZsb2F0IHJlc3VsdCA9ICR7b3BlcmF0aW9ufTtcbiAgICAgICAgc2V0T3V0cHV0KHJlc3VsdCk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcblxuZXhwb3J0IGNsYXNzIEFkZE5QYWNrZWRQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lczogc3RyaW5nW107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXSA9IFtdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuICBwYWNrZWRJbnB1dHMgPSB0cnVlO1xuICBwYWNrZWRPdXRwdXQgPSB0cnVlO1xuXG4gIGNvbnN0cnVjdG9yKG91dHB1dFNoYXBlOiBudW1iZXJbXSwgc2hhcGVzOiBudW1iZXJbXVtdKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IG91dHB1dFNoYXBlO1xuICAgIHRoaXMudmFyaWFibGVOYW1lcyA9IHNoYXBlcy5tYXAoKF8sIGkpID0+IGBUJHtpfWApO1xuXG4gICAgY29uc3Qgc25pcHBldHM6IHN0cmluZ1tdID0gW107XG4gICAgLy8gR2V0IHRhcmdldCBlbGVtZW50cyBmcm9tIGV2ZXJ5IGlucHV0IHRlbnNvci5cbiAgICB0aGlzLnZhcmlhYmxlTmFtZXMuZm9yRWFjaCh2YXJpYWJsZSA9PiB7XG4gICAgICBzbmlwcGV0cy5wdXNoKGB2ZWM0IHYke3ZhcmlhYmxlfSA9IGdldCR7dmFyaWFibGV9QXRPdXRDb29yZHMoKTtgKTtcbiAgICB9KTtcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgc3VtIG9mIGFsbCBlbGVtZW50cy5cbiAgICBjb25zdCBvcGVyYXRpb24gPSB0aGlzLnZhcmlhYmxlTmFtZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCh2YXJpYWJsZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGB2JHt2YXJpYWJsZX1gO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAuam9pbignICsgJyk7XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAke3NuaXBwZXRzLmpvaW4oJ1xcbiAgICAgICAgJyl9XG5cbiAgICAgICAgdmVjNCByZXN1bHQgPSAke29wZXJhdGlvbn07XG4gICAgICAgIHNldE91dHB1dChyZXN1bHQpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcblxuZXhwb3J0IGNsYXNzIEFyZ01pbk1heFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWydBJ107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIHJlZHVjZUluZm86IGJhY2tlbmRfdXRpbC5SZWR1Y2VJbmZvLCBvcDogJ21heCd8J21pbicsXG4gICAgICBmaXJzdFBhc3M6IGJvb2xlYW4pIHtcbiAgICBjb25zdCB7d2luZG93U2l6ZSwgYmF0Y2hTaXplLCBvdXRTaXplfSA9IHJlZHVjZUluZm87XG4gICAgaWYgKCFmaXJzdFBhc3MpIHtcbiAgICAgIHRoaXMudmFyaWFibGVOYW1lcy5wdXNoKCdiZXN0SW5kaWNlc0EnKTtcbiAgICB9XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IFtiYXRjaFNpemUsIG91dFNpemVdO1xuICAgIGNvbnN0IGNvbXBPcCA9IChvcCA9PT0gJ21heCcpID8gJz4nIDogJzwnO1xuICAgIGNvbnN0IGluZGV4U25pcHBldCA9IGZpcnN0UGFzcyA/XG4gICAgICAgICdpbk9mZnNldCArIGk7JyA6XG4gICAgICAgICdyb3VuZChnZXRCZXN0SW5kaWNlc0EoYmF0Y2gsIGluT2Zmc2V0ICsgaSkpOyc7XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjMiBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IGJhdGNoID0gY29vcmRzWzBdO1xuICAgICAgICBpbnQgb3V0SWR4ID0gY29vcmRzWzFdO1xuICAgICAgICBpbnQgaW5PZmZzZXQgPSBvdXRJZHggKiAke3dpbmRvd1NpemV9O1xuXG4gICAgICAgIGludCBiZXN0SW5kZXggPSBpbk9mZnNldDtcbiAgICAgICAgZmxvYXQgYmVzdFZhbHVlID0gZ2V0QShiYXRjaCwgYmVzdEluZGV4KTtcblxuICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8ICR7d2luZG93U2l6ZX07IGkrKykge1xuICAgICAgICAgIGludCBpbklkeCA9ICR7aW5kZXhTbmlwcGV0fTtcbiAgICAgICAgICBmbG9hdCBjYW5kaWRhdGUgPSBnZXRBKGJhdGNoLCBpbklkeCk7XG4gICAgICAgICAgaWYgKGNhbmRpZGF0ZSAke2NvbXBPcH0gYmVzdFZhbHVlKSB7XG4gICAgICAgICAgICBiZXN0VmFsdWUgPSBjYW5kaWRhdGU7XG4gICAgICAgICAgICBiZXN0SW5kZXggPSBpbklkeDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc2V0T3V0cHV0KGZsb2F0KGJlc3RJbmRleCkpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHt1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcbmltcG9ydCB7Z2V0Q2hhbm5lbHN9IGZyb20gJy4vcGFja2luZ191dGlsJztcbmltcG9ydCB7Z2V0Q29vcmRzRGF0YVR5cGV9IGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyJztcblxuZXhwb3J0IGNsYXNzIEFyZ01pbk1heFBhY2tlZFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWydBJ107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcbiAgcGFja2VkSW5wdXRzID0gdHJ1ZTtcbiAgcGFja2VkT3V0cHV0ID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIHNoYXBlOiBudW1iZXJbXSwgd2luZG93U2l6ZTogbnVtYmVyLCBvcDogJ21heCd8J21pbicsXG4gICAgICBmaXJzdFBhc3M6IGJvb2xlYW4pIHtcbiAgICB1dGlsLmFzc2VydChcbiAgICAgICAgc2hhcGUubGVuZ3RoID4gMixcbiAgICAgICAgKCkgPT4gYFBhY2tlZCBhcmcke1xuICAgICAgICAgICAgb3AuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgK1xuICAgICAgICAgICAgb3Auc2xpY2UoMSl9IHN1cHBvcnRzIG9ubHkgaW5wdXRzIHdpdGggcmFuayBhYm92ZSAyLmApO1xuICAgIGNvbnN0IGluU2l6ZSA9IHNoYXBlW3NoYXBlLmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IG91dFNpemUgPSBNYXRoLmNlaWwoaW5TaXplIC8gd2luZG93U2l6ZSk7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IHNoYXBlLnNsaWNlKDAsIC0xKTtcbiAgICBpZiAob3V0U2l6ZSA+IDEpIHtcbiAgICAgIHRoaXMub3V0cHV0U2hhcGUucHVzaChvdXRTaXplKTtcbiAgICB9XG4gICAgaWYgKCFmaXJzdFBhc3MpIHtcbiAgICAgIHRoaXMudmFyaWFibGVOYW1lcy5wdXNoKCdiZXN0SW5kaWNlc0EnKTtcbiAgICB9XG4gICAgY29uc3Qgb3V0U2hhcGUgPSB0aGlzLm91dHB1dFNoYXBlO1xuICAgIGNvbnN0IHJhbmsgPSBvdXRTaGFwZS5sZW5ndGg7XG4gICAgY29uc3QgZHR5cGUgPSBnZXRDb29yZHNEYXRhVHlwZShyYW5rKTtcbiAgICBjb25zdCBjb29yZHMgPSBnZXRDaGFubmVscygnY29vcmRzJywgcmFuayk7XG5cbiAgICBsZXQgc291cmNlTG9jU2V0dXA7XG4gICAgbGV0IHNvdXJjZVJhbms7XG4gICAgaWYgKG91dFNpemUgPT09IDEpIHtcbiAgICAgIHNvdXJjZVJhbmsgPSByYW5rICsgMTtcbiAgICAgIGNvbnN0IHNvdXJjZUxvY0RUeXBlID0gZ2V0Q29vcmRzRGF0YVR5cGUoc291cmNlUmFuayk7XG4gICAgICBzb3VyY2VMb2NTZXR1cCA9IGBcbiAgICAgICAgJHtzb3VyY2VMb2NEVHlwZX0gc291cmNlTG9jUiA9ICR7c291cmNlTG9jRFR5cGV9KCR7Y29vcmRzLmpvaW4oKX0sIDApO1xuICAgICAgICArKyR7Y29vcmRzW3JhbmsgLSAxXX07XG4gICAgICAgICR7c291cmNlTG9jRFR5cGV9IHNvdXJjZUxvY0cgPSAke3NvdXJjZUxvY0RUeXBlfSgke2Nvb3Jkcy5qb2luKCl9LCAwKTtcbiAgICAgICAgKyske2Nvb3Jkc1tyYW5rIC0gMl19O1xuICAgICAgICAke3NvdXJjZUxvY0RUeXBlfSBzb3VyY2VMb2NBID0gJHtzb3VyY2VMb2NEVHlwZX0oJHtjb29yZHMuam9pbigpfSwgMCk7XG4gICAgICAgIC0tJHtjb29yZHNbcmFuayAtIDFdfTtcbiAgICAgICAgJHtzb3VyY2VMb2NEVHlwZX0gc291cmNlTG9jQiA9ICR7c291cmNlTG9jRFR5cGV9KCR7Y29vcmRzLmpvaW4oKX0sIDApO1xuICAgICAgICAtLSR7Y29vcmRzW3JhbmsgLSAyXX07YDtcbiAgICB9IGVsc2Uge1xuICAgICAgc291cmNlUmFuayA9IHJhbms7XG4gICAgICBzb3VyY2VMb2NTZXR1cCA9IGBcbiAgICAgICAgJHtkdHlwZX0gc291cmNlTG9jUiA9IGNvb3JkcztcbiAgICAgICAgKyske2Nvb3Jkc1tyYW5rIC0gMV19O1xuICAgICAgICAke2R0eXBlfSBzb3VyY2VMb2NHID0gY29vcmRzO1xuICAgICAgICArKyR7Y29vcmRzW3JhbmsgLSAyXX07XG4gICAgICAgICR7ZHR5cGV9IHNvdXJjZUxvY0EgPSBjb29yZHM7XG4gICAgICAgIC0tJHtjb29yZHNbcmFuayAtIDFdfTtcbiAgICAgICAgJHtkdHlwZX0gc291cmNlTG9jQiA9IGNvb3JkcztcbiAgICAgICAgLS0ke2Nvb3Jkc1tyYW5rIC0gMl19O2A7XG4gICAgfVxuICAgIGNvbnN0IGNoYW5uZWxzID0gWyd4JywgJ3knLCAneicsICd3JywgJ3UnLCAndiddLnNsaWNlKDAsIHNvdXJjZVJhbmspO1xuICAgIGNvbnN0IGluQ2hhbm5lbCA9ICcuJyArIGNoYW5uZWxzW3NvdXJjZVJhbmsgLSAxXTsgIC8vIGUuZy4gXCIuYlwiIGZvciByYW5rIDMuXG4gICAgY29uc3QgaW50Q2hhbm5lbHMgPSBjaGFubmVscy5tYXAoeCA9PiAnaW50ICcgKyB4KTtcbiAgICBjb25zdCBzcmNSQ29vcmRzID1cbiAgICAgICAgZ2V0Q2hhbm5lbHMoJ3NvdXJjZUxvY1InLCBzb3VyY2VSYW5rIC0gMSkuY29uY2F0KCdpbklkeC5yJyk7XG4gICAgY29uc3Qgc3JjR0Nvb3JkcyA9XG4gICAgICAgIGdldENoYW5uZWxzKCdzb3VyY2VMb2NHJywgc291cmNlUmFuayAtIDEpLmNvbmNhdCgnaW5JZHguZycpO1xuICAgIGNvbnN0IHNyY0JDb29yZHMgPVxuICAgICAgICBnZXRDaGFubmVscygnc291cmNlTG9jQicsIHNvdXJjZVJhbmsgLSAxKS5jb25jYXQoJ2luSWR4LmInKTtcbiAgICBjb25zdCBzcmNBQ29vcmRzID1cbiAgICAgICAgZ2V0Q2hhbm5lbHMoJ3NvdXJjZUxvY0EnLCBzb3VyY2VSYW5rIC0gMSkuY29uY2F0KCdpbklkeC5hJyk7XG5cbiAgICBjb25zdCBjb21wT3AgPSAob3AgPT09ICdtYXgnKSA/ICdncmVhdGVyVGhhbicgOiAnbGVzc1RoYW4nO1xuICAgIGNvbnN0IGZldGNoQ2FuZGlkYXRlSWR4ID0gZmlyc3RQYXNzID8gJycgOiBgXG4gICAgICAgICAgaW5JZHggPSByb3VuZCh2ZWM0KGdldEJlc3RJbmRpY2VzQUNoYW5uZWwoJHtzcmNSQ29vcmRzLmpvaW4oKX0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRCZXN0SW5kaWNlc0FDaGFubmVsKCR7c3JjR0Nvb3Jkcy5qb2luKCl9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QmVzdEluZGljZXNBQ2hhbm5lbCgke3NyY0JDb29yZHMuam9pbigpfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEJlc3RJbmRpY2VzQUNoYW5uZWwoJHtzcmNBQ29vcmRzLmpvaW4oKX0pKSk7YDtcblxuICAgIGNvbnN0IGZldGNoVmFsdWUgPSBgdmVjNChcbiAgICAgICAgICAgIGdldEFDaGFubmVsKCR7c3JjUkNvb3Jkcy5qb2luKCl9KSxcbiAgICAgICAgICAgIGhhc05leHRDb2wgPyBnZXRBQ2hhbm5lbCgke3NyY0dDb29yZHMuam9pbigpfSkgOiAwLixcbiAgICAgICAgICAgIGhhc05leHRSb3cgPyBnZXRBQ2hhbm5lbCgke3NyY0JDb29yZHMuam9pbigpfSkgOiAwLixcbiAgICAgICAgICAgIGhhc05leHRSb3cgJiYgaGFzTmV4dENvbCA/IGdldEFDaGFubmVsKCR7c3JjQUNvb3Jkcy5qb2luKCl9KSA6IDAuKWA7XG5cbiAgICBjb25zdCBnZXRCZXN0SW5kaWNlc0FDaGFubmVsU25pcHBldCA9IGZpcnN0UGFzcyA/ICcnIDogYFxuICAgICAgZmxvYXQgZ2V0QmVzdEluZGljZXNBQ2hhbm5lbCgke2ludENoYW5uZWxzLmpvaW4oKX0pIHtcbiAgICAgICAgcmV0dXJuIGdldENoYW5uZWwoZ2V0QmVzdEluZGljZXNBKCR7Y2hhbm5lbHMuam9pbigpfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMyKCR7Y2hhbm5lbHMuc2xpY2UoLTIpLmpvaW4oKX0pKTtcbiAgICAgIH1gO1xuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGZsb2F0IGdldEFDaGFubmVsKCR7aW50Q2hhbm5lbHMuam9pbigpfSkge1xuICAgICAgICByZXR1cm4gZ2V0Q2hhbm5lbChnZXRBKCR7Y2hhbm5lbHMuam9pbigpfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMigke2NoYW5uZWxzLnNsaWNlKC0yKS5qb2luKCl9KSk7XG4gICAgICB9XG4gICAgICAke2dldEJlc3RJbmRpY2VzQUNoYW5uZWxTbmlwcGV0fVxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAke2R0eXBlfSBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgYm9vbCBoYXNOZXh0Q29sID0gJHtjb29yZHNbcmFuayAtIDFdfSA8ICR7b3V0U2hhcGVbcmFuayAtIDFdIC0gMX07XG4gICAgICAgIGJvb2wgaGFzTmV4dFJvdyA9ICR7Y29vcmRzW3JhbmsgLSAyXX0gPCAke291dFNoYXBlW3JhbmsgLSAyXSAtIDF9O1xuICAgICAgICAke3NvdXJjZUxvY1NldHVwfVxuICAgICAgICBpdmVjNCBzcmNJZHggPSBpdmVjNChzb3VyY2VMb2NSJHtpbkNoYW5uZWx9LCBzb3VyY2VMb2NHJHtpbkNoYW5uZWx9LFxuICAgICAgICAgIHNvdXJjZUxvY0Ike2luQ2hhbm5lbH0sIHNvdXJjZUxvY0Eke2luQ2hhbm5lbH0pICogJHt3aW5kb3dTaXplfTtcbiAgICAgICAgaXZlYzQgaW5JZHggPSBzcmNJZHg7XG4gICAgICAgIHZlYzQgYmVzdEluZGV4ID0gdmVjNChpbklkeCk7XG4gICAgICAgIHZlYzQgYmVzdFZhbHVlID0gJHtmZXRjaFZhbHVlfTtcblxuICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8ICR7d2luZG93U2l6ZX07IGkrKykge1xuICAgICAgICAgIGluSWR4ID0gc3JjSWR4O1xuICAgICAgICAgICR7ZmV0Y2hDYW5kaWRhdGVJZHh9XG4gICAgICAgICAgdmVjNCBjYW5kaWRhdGUgPSAke2ZldGNoVmFsdWV9O1xuICAgICAgICAgIGJ2ZWM0IG5hbiA9IGlzbmFuKGNhbmRpZGF0ZSk7XG4gICAgICAgICAgYnZlYzQgcmVwbGFjZSA9IGJ2ZWM0KFxuICAgICAgICAgICAgdmVjNCgke2NvbXBPcH0oY2FuZGlkYXRlLCBiZXN0VmFsdWUpKSAqICh2ZWM0KDEuMCkgLSB2ZWM0KG5hbikpKTtcblxuICAgICAgICAgIGJlc3RWYWx1ZSA9IHZlYzQocmVwbGFjZS54ICA/IGNhbmRpZGF0ZS54IDogYmVzdFZhbHVlLngsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlLnkgID8gY2FuZGlkYXRlLnkgOiBiZXN0VmFsdWUueSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2UueiAgPyBjYW5kaWRhdGUueiA6IGJlc3RWYWx1ZS56LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZS53ICA/IGNhbmRpZGF0ZS53IDogYmVzdFZhbHVlLncpO1xuICAgICAgICAgIGJlc3RJbmRleCA9IG1peChiZXN0SW5kZXgsIHZlYzQoaW5JZHgpLCB2ZWM0KHJlcGxhY2UpKTtcbiAgICAgICAgICBzcmNJZHgrKztcbiAgICAgICAgfVxuICAgICAgICBzZXRPdXRwdXQoYmVzdEluZGV4KTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5cbmV4cG9ydCBjbGFzcyBBdmdQb29sMkRCYWNrcHJvcFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWydkeSddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoY29udkluZm86IGJhY2tlbmRfdXRpbC5Db252MkRJbmZvKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IGNvbnZJbmZvLmluU2hhcGU7XG4gICAgY29uc3QgZmlsdGVySGVpZ2h0ID0gY29udkluZm8uZmlsdGVySGVpZ2h0O1xuICAgIGNvbnN0IGZpbHRlcldpZHRoID0gY29udkluZm8uZmlsdGVyV2lkdGg7XG4gICAgY29uc3Qgc3RyaWRlSGVpZ2h0ID0gY29udkluZm8uc3RyaWRlSGVpZ2h0O1xuICAgIGNvbnN0IHN0cmlkZVdpZHRoID0gY29udkluZm8uc3RyaWRlV2lkdGg7XG4gICAgY29uc3QgZGlsYXRpb25IZWlnaHQgPSBjb252SW5mby5kaWxhdGlvbkhlaWdodDtcbiAgICBjb25zdCBkaWxhdGlvbldpZHRoID0gY29udkluZm8uZGlsYXRpb25XaWR0aDtcbiAgICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgPSBjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJIZWlnaHQ7XG4gICAgY29uc3QgZWZmZWN0aXZlRmlsdGVyV2lkdGggPSBjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJXaWR0aDtcblxuICAgIGNvbnN0IHBhZFRvcCA9IGVmZmVjdGl2ZUZpbHRlckhlaWdodCAtIDEgLSBjb252SW5mby5wYWRJbmZvLnRvcDtcbiAgICBjb25zdCBwYWRMZWZ0ID0gZWZmZWN0aXZlRmlsdGVyV2lkdGggLSAxIC0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuXG4gICAgY29uc3QgYXZnTXVsdGlwbGllciA9IDEgLyAoZmlsdGVySGVpZ2h0ICogZmlsdGVyV2lkdGgpO1xuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGNvbnN0IGl2ZWMyIHBhZHMgPSBpdmVjMigke3BhZFRvcH0sICR7cGFkTGVmdH0pO1xuICAgICAgY29uc3QgZmxvYXQgYXZnTXVsdGlwbGllciA9IGZsb2F0KCR7YXZnTXVsdGlwbGllcn0pO1xuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWM0IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgYiA9IGNvb3Jkc1swXTtcbiAgICAgICAgaW50IGQgPSBjb29yZHNbM107XG5cbiAgICAgICAgaXZlYzIgZHlSQ0Nvcm5lciA9IGNvb3Jkcy55eiAtIHBhZHM7XG4gICAgICAgIGludCBkeVJDb3JuZXIgPSBkeVJDQ29ybmVyLng7XG4gICAgICAgIGludCBkeUNDb3JuZXIgPSBkeVJDQ29ybmVyLnk7XG5cbiAgICAgICAgLy8gQ29udm9sdmUgZHkoPywgPywgZCkgd2l0aCBwb3MgbWFzayg6LCA6LCBkKSB0byBnZXQgZHgoeFIsIHhDLCBkKS5cbiAgICAgICAgLy8gPyA9IHRvIGJlIGRldGVybWluZWQuIDogPSBhY3Jvc3MgYWxsIHZhbHVlcyBpbiB0aGF0IGF4aXMuXG4gICAgICAgIGZsb2F0IGRvdFByb2QgPSAwLjA7XG4gICAgICAgIGZvciAoaW50IHdSID0gMDsgd1IgPCAke2VmZmVjdGl2ZUZpbHRlckhlaWdodH07XG4gICAgICAgICAgICB3UiArPSAke2RpbGF0aW9uSGVpZ2h0fSkge1xuICAgICAgICAgIGZsb2F0IGR5UiA9IGZsb2F0KGR5UkNvcm5lciArIHdSKSAvICR7c3RyaWRlSGVpZ2h0fS4wO1xuXG4gICAgICAgICAgaWYgKGR5UiA8IDAuMCB8fCBkeVIgPj0gJHtjb252SW5mby5vdXRIZWlnaHR9LjAgfHwgZnJhY3QoZHlSKSA+IDAuMCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGludCBpZHlSID0gaW50KGR5Uik7XG5cbiAgICAgICAgICBmb3IgKGludCB3QyA9IDA7IHdDIDwgJHtlZmZlY3RpdmVGaWx0ZXJXaWR0aH07XG4gICAgICAgICAgICB3Qys9ICR7ZGlsYXRpb25XaWR0aH0pIHtcbiAgICAgICAgICAgIGZsb2F0IGR5QyA9IGZsb2F0KGR5Q0Nvcm5lciArIHdDKSAvICR7c3RyaWRlV2lkdGh9LjA7XG5cbiAgICAgICAgICAgIGlmIChkeUMgPCAwLjAgfHwgZHlDID49ICR7Y29udkluZm8ub3V0V2lkdGh9LjAgfHxcbiAgICAgICAgICAgICAgICBmcmFjdChkeUMpID4gMC4wKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW50IGlkeUMgPSBpbnQoZHlDKTtcblxuICAgICAgICAgICAgZmxvYXQgZHlWYWx1ZSA9IGdldER5KGIsIGlkeVIsIGlkeUMsIGQpO1xuXG4gICAgICAgICAgICBkb3RQcm9kICs9IGR5VmFsdWUgKiBhdmdNdWx0aXBsaWVyO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzZXRPdXRwdXQoZG90UHJvZCk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQXZnUG9vbDNEQmFja3Byb3BQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnZHknXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGNvbnZJbmZvOiBiYWNrZW5kX3V0aWwuQ29udjNESW5mbykge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBjb252SW5mby5pblNoYXBlO1xuICAgIGNvbnN0IGZpbHRlckRlcHRoID0gY29udkluZm8uZmlsdGVyRGVwdGg7XG4gICAgY29uc3QgZmlsdGVySGVpZ2h0ID0gY29udkluZm8uZmlsdGVySGVpZ2h0O1xuICAgIGNvbnN0IGZpbHRlcldpZHRoID0gY29udkluZm8uZmlsdGVyV2lkdGg7XG4gICAgY29uc3Qgc3RyaWRlRGVwdGggPSBjb252SW5mby5zdHJpZGVEZXB0aDtcbiAgICBjb25zdCBzdHJpZGVIZWlnaHQgPSBjb252SW5mby5zdHJpZGVIZWlnaHQ7XG4gICAgY29uc3Qgc3RyaWRlV2lkdGggPSBjb252SW5mby5zdHJpZGVXaWR0aDtcbiAgICBjb25zdCBkaWxhdGlvbkRlcHRoID0gY29udkluZm8uZGlsYXRpb25EZXB0aDtcbiAgICBjb25zdCBkaWxhdGlvbkhlaWdodCA9IGNvbnZJbmZvLmRpbGF0aW9uSGVpZ2h0O1xuICAgIGNvbnN0IGRpbGF0aW9uV2lkdGggPSBjb252SW5mby5kaWxhdGlvbldpZHRoO1xuICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlckRlcHRoID0gY29udkluZm8uZWZmZWN0aXZlRmlsdGVyRGVwdGg7XG4gICAgY29uc3QgZWZmZWN0aXZlRmlsdGVySGVpZ2h0ID0gY29udkluZm8uZWZmZWN0aXZlRmlsdGVySGVpZ2h0O1xuICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlcldpZHRoID0gY29udkluZm8uZWZmZWN0aXZlRmlsdGVyV2lkdGg7XG5cbiAgICBjb25zdCBwYWRGcm9udCA9IGVmZmVjdGl2ZUZpbHRlckRlcHRoIC0gMSAtIGNvbnZJbmZvLnBhZEluZm8uZnJvbnQ7XG4gICAgY29uc3QgcGFkVG9wID0gZWZmZWN0aXZlRmlsdGVySGVpZ2h0IC0gMSAtIGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICAgIGNvbnN0IHBhZExlZnQgPSBlZmZlY3RpdmVGaWx0ZXJXaWR0aCAtIDEgLSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG5cbiAgICBjb25zdCBhdmdNdWx0aXBsaWVyID0gMSAvIChmaWx0ZXJEZXB0aCAqIGZpbHRlckhlaWdodCAqIGZpbHRlcldpZHRoKTtcblxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICBjb25zdCBpdmVjMyBwYWRzID0gaXZlYzMoJHtwYWRGcm9udH0sICR7cGFkVG9wfSwgJHtwYWRMZWZ0fSk7XG4gICAgICBjb25zdCBmbG9hdCBhdmdNdWx0aXBsaWVyID0gZmxvYXQoJHthdmdNdWx0aXBsaWVyfSk7XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzUgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBiYXRjaCA9IGNvb3Jkcy54O1xuICAgICAgICBpbnQgY2ggPSBjb29yZHMudTtcblxuICAgICAgICBpdmVjMyBkeUNvcm5lciA9IGl2ZWMzKGNvb3Jkcy55LCBjb29yZHMueiwgY29vcmRzLncpIC0gcGFkcztcbiAgICAgICAgaW50IGR5RENvcm5lciA9IGR5Q29ybmVyLng7XG4gICAgICAgIGludCBkeVJDb3JuZXIgPSBkeUNvcm5lci55O1xuICAgICAgICBpbnQgZHlDQ29ybmVyID0gZHlDb3JuZXIuejtcblxuICAgICAgICAvLyBDb252b2x2ZSBkeSg/LCA/LCA/LCBkKSB3aXRoIHBvcyBtYXNrKDosIDosIDosIGNoKSB0byBnZXRcbiAgICAgICAgLy8gZHgoeEQsIHhSLCB4QywgY2gpLlxuICAgICAgICAvLyA/ID0gdG8gYmUgZGV0ZXJtaW5lZC4gOiA9IGFjcm9zcyBhbGwgdmFsdWVzIGluIHRoYXQgYXhpcy5cbiAgICAgICAgZmxvYXQgZG90UHJvZCA9IDAuMDtcblxuICAgICAgICBmb3IgKGludCB3RCA9IDA7IHdEIDwgJHtlZmZlY3RpdmVGaWx0ZXJEZXB0aH07XG4gICAgICAgICAgICB3RCArPSAke2RpbGF0aW9uRGVwdGh9KSB7XG4gICAgICAgICAgZmxvYXQgZHlEID0gZmxvYXQoZHlEQ29ybmVyICsgd0QpIC8gJHtzdHJpZGVEZXB0aH0uMDtcblxuICAgICAgICAgIGlmIChkeUQgPCAwLjAgfHwgZHlEID49ICR7Y29udkluZm8ub3V0RGVwdGh9LjAgfHwgZnJhY3QoZHlEKSA+IDAuMCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGludCBpZHlEID0gaW50KGR5RCk7XG5cbiAgICAgICAgICBmb3IgKGludCB3UiA9IDA7IHdSIDwgJHtlZmZlY3RpdmVGaWx0ZXJIZWlnaHR9O1xuICAgICAgICAgICAgICB3UiArPSAke2RpbGF0aW9uSGVpZ2h0fSkge1xuICAgICAgICAgICAgZmxvYXQgZHlSID0gZmxvYXQoZHlSQ29ybmVyICsgd1IpIC8gJHtzdHJpZGVIZWlnaHR9LjA7XG5cbiAgICAgICAgICAgIGlmIChkeVIgPCAwLjAgfHwgZHlSID49ICR7Y29udkluZm8ub3V0SGVpZ2h0fS4wIHx8XG4gICAgICAgICAgICAgICAgZnJhY3QoZHlSKSA+IDAuMCkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGludCBpZHlSID0gaW50KGR5Uik7XG5cbiAgICAgICAgICAgIGZvciAoaW50IHdDID0gMDsgd0MgPCAke2VmZmVjdGl2ZUZpbHRlcldpZHRofTtcbiAgICAgICAgICAgICAgICB3QyArPSAke2RpbGF0aW9uV2lkdGh9KSB7XG4gICAgICAgICAgICAgIGZsb2F0IGR5QyA9IGZsb2F0KGR5Q0Nvcm5lciArIHdDKSAvICR7c3RyaWRlV2lkdGh9LjA7XG5cbiAgICAgICAgICAgICAgaWYgKGR5QyA8IDAuMCB8fCBkeUMgPj0gJHtjb252SW5mby5vdXRXaWR0aH0uMCB8fFxuICAgICAgICAgICAgICAgICAgZnJhY3QoZHlDKSA+IDAuMCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGludCBpZHlDID0gaW50KGR5Qyk7XG5cbiAgICAgICAgICAgICAgZmxvYXQgZHlWYWx1ZSA9IGdldER5KGJhdGNoLCBpZHlELCBpZHlSLCBpZHlDLCBjaCk7XG5cbiAgICAgICAgICAgICAgZG90UHJvZCArPSBkeVZhbHVlICogYXZnTXVsdGlwbGllcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc2V0T3V0cHV0KGRvdFByb2QpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLy8gSW1wb3J0IHdlYmdsIGZsYWdzLlxuaW1wb3J0ICcuL2ZsYWdzX3dlYmdsJztcblxuaW1wb3J0ICogYXMgdGYgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7YmFja2VuZF91dGlsLCBCYWNrZW5kVmFsdWVzLCBidWZmZXIsIERhdGFJZCwgRGF0YVN0b3JhZ2UsIERhdGFUeXBlLCBEYXRhVmFsdWVzLCBlbmdpbmUsIGVudiwga2VybmVsX2ltcGxzLCBLZXJuZWxCYWNrZW5kLCBNZW1vcnlJbmZvLCBOdW1lcmljRGF0YVR5cGUsIFJhbmssIFJlY3Vyc2l2ZUFycmF5LCBzY2FsYXIsIFNoYXBlTWFwLCBUZW5zb3IsIFRlbnNvcjJELCBUZW5zb3JCdWZmZXIsIFRlbnNvckluZm8sIHRpZHksIFRpbWluZ0luZm8sIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7Z2V0V2ViR0xDb250ZXh0fSBmcm9tICcuL2NhbnZhc191dGlsJztcbmltcG9ydCB7RGVjb2RlTWF0cml4UHJvZ3JhbX0gZnJvbSAnLi9kZWNvZGVfbWF0cml4X2dwdSc7XG5pbXBvcnQge0RlY29kZU1hdHJpeFBhY2tlZFByb2dyYW19IGZyb20gJy4vZGVjb2RlX21hdHJpeF9wYWNrZWRfZ3B1JztcbmltcG9ydCB7RW5jb2RlRmxvYXRQcm9ncmFtfSBmcm9tICcuL2VuY29kZV9mbG9hdF9ncHUnO1xuaW1wb3J0IHtFbmNvZGVGbG9hdFBhY2tlZFByb2dyYW19IGZyb20gJy4vZW5jb2RlX2Zsb2F0X3BhY2tlZF9ncHUnO1xuaW1wb3J0IHtFbmNvZGVNYXRyaXhQcm9ncmFtfSBmcm9tICcuL2VuY29kZV9tYXRyaXhfZ3B1JztcbmltcG9ydCB7RW5jb2RlTWF0cml4UGFja2VkUHJvZ3JhbX0gZnJvbSAnLi9lbmNvZGVfbWF0cml4X3BhY2tlZF9ncHUnO1xuaW1wb3J0IHtHUEdQVUNvbnRleHR9IGZyb20gJy4vZ3BncHVfY29udGV4dCc7XG5pbXBvcnQgKiBhcyBncGdwdV9tYXRoIGZyb20gJy4vZ3BncHVfbWF0aCc7XG5pbXBvcnQge0dQR1BVQmluYXJ5LCBHUEdQVVByb2dyYW0sIFRlbnNvckRhdGF9IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5pbXBvcnQge3NpbXBsZUFic0ltcGxDUFV9IGZyb20gJy4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5pbXBvcnQge1BhY2tQcm9ncmFtfSBmcm9tICcuL3BhY2tfZ3B1JztcbmltcG9ydCB7UmVzaGFwZVBhY2tlZFByb2dyYW19IGZyb20gJy4vcmVzaGFwZV9wYWNrZWRfZ3B1JztcbmltcG9ydCAqIGFzIHRleF91dGlsIGZyb20gJy4vdGV4X3V0aWwnO1xuaW1wb3J0IHtUZXh0dXJlRGF0YSwgVGV4dHVyZVVzYWdlfSBmcm9tICcuL3RleF91dGlsJztcbmltcG9ydCB7VGV4dHVyZU1hbmFnZXJ9IGZyb20gJy4vdGV4dHVyZV9tYW5hZ2VyJztcbmltcG9ydCAqIGFzIHVuYXJ5X29wIGZyb20gJy4vdW5hcnlvcF9ncHUnO1xuaW1wb3J0IHtVbmFyeU9wUHJvZ3JhbX0gZnJvbSAnLi91bmFyeW9wX2dwdSc7XG5pbXBvcnQge1VuYXJ5T3BQYWNrZWRQcm9ncmFtfSBmcm9tICcuL3VuYXJ5b3BfcGFja2VkX2dwdSc7XG5pbXBvcnQge1VucGFja1Byb2dyYW19IGZyb20gJy4vdW5wYWNrX2dwdSc7XG5pbXBvcnQgKiBhcyB3ZWJnbF91dGlsIGZyb20gJy4vd2ViZ2xfdXRpbCc7XG5cbmNvbnN0IHdoZXJlSW1wbCA9IGtlcm5lbF9pbXBscy53aGVyZUltcGw7XG5cbmV4cG9ydCBjb25zdCBFUFNJTE9OX0ZMT0FUMzIgPSAxZS03O1xuZXhwb3J0IGNvbnN0IEVQU0lMT05fRkxPQVQxNiA9IDFlLTQ7XG5cbnR5cGUgS2VybmVsSW5mbyA9IHtcbiAgbmFtZTogc3RyaW5nOyBxdWVyeTogUHJvbWlzZTxudW1iZXI+O1xufTtcblxuZXhwb3J0IHR5cGUgVGltZXJOb2RlID0gUmVjdXJzaXZlQXJyYXk8S2VybmVsSW5mbz58S2VybmVsSW5mbztcbmV4cG9ydCBpbnRlcmZhY2UgQ1BVVGltZXJRdWVyeSB7XG4gIHN0YXJ0TXM6IG51bWJlcjtcbiAgZW5kTXM/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2ViR0xNZW1vcnlJbmZvIGV4dGVuZHMgTWVtb3J5SW5mbyB7XG4gIG51bUJ5dGVzSW5HUFU6IG51bWJlcjtcbiAgLy8gVHJhY2tzIHRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgYWxsb2NhdGVkIG9uIHRoZSBHUFUsIGFjY291bnRpbmcgZm9yIHRoZVxuICAvLyBwaHlzaWNhbCB0ZXh0dXJlIHR5cGUuXG4gIG51bUJ5dGVzSW5HUFVBbGxvY2F0ZWQ6IG51bWJlcjtcbiAgLy8gVHJhY2tzIGJ5dGUgc2l6ZSBvZiB0ZXh0dXJlcyB0aGF0IHdlcmUgY3JlYXRlZCBhbmQgdGhlbiBtYWRlIGF2YWlsYWJsZSBmb3JcbiAgLy8gcmV1c2UgKGRpc3Bvc2VkKS5cbiAgbnVtQnl0ZXNJbkdQVUZyZWU6IG51bWJlcjtcbiAgdW5yZWxpYWJsZTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXZWJHTFRpbWluZ0luZm8gZXh0ZW5kcyBUaW1pbmdJbmZvIHtcbiAgdXBsb2FkV2FpdE1zOiBudW1iZXI7XG4gIGRvd25sb2FkV2FpdE1zOiBudW1iZXI7XG59XG5cbmNvbnN0IGJpbmFyeUNhY2hlczoge1t3ZWJHTFZlcnNpb246IHN0cmluZ106IHtba2V5OiBzdHJpbmddOiBHUEdQVUJpbmFyeX19ID0ge307XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRCaW5hcnlDYWNoZSh3ZWJHTFZlcnNpb246IG51bWJlcikge1xuICBpZiAod2ViR0xWZXJzaW9uIGluIGJpbmFyeUNhY2hlcykge1xuICAgIHJldHVybiBiaW5hcnlDYWNoZXNbd2ViR0xWZXJzaW9uXTtcbiAgfVxuICBiaW5hcnlDYWNoZXNbd2ViR0xWZXJzaW9uXSA9IHt9O1xuICByZXR1cm4gYmluYXJ5Q2FjaGVzW3dlYkdMVmVyc2lvbl07XG59XG5cbi8vIEVtcGlyaWNhbGx5IGRldGVybWluZWQgY29uc3RhbnQgdXNlZCB0byBkZXRlcm1pbmUgc2l6ZSB0aHJlc2hvbGQgZm9yIGhhbmRpbmdcbi8vIG9mZiBleGVjdXRpb24gdG8gdGhlIENQVS5cbmNvbnN0IENQVV9IQU5ET0ZGX1NJWkVfVEhSRVNIT0xEID1cbiAgICBlbnYoKS5nZXROdW1iZXIoJ0NQVV9IQU5ET0ZGX1NJWkVfVEhSRVNIT0xEJyk7XG5cbi8vIEVtcGlyaWNhbGx5IGRldGVybWluZWQgY29uc3RhbnQgdXNlZCB0byBkZWNpZGUgdGhlIG51bWJlciBvZiBNQiBvbiBHUFVcbi8vIGJlZm9yZSB3ZSB3YXJuIGFib3V0IGhpZ2ggbWVtb3J5IHVzZS4gVGhlIE1CIGFyZSB0aGlzIGNvbnN0YW50ICogc2NyZWVuIGFyZWFcbi8vICogZHBpIC8gMTAyNCAvIDEwMjQuXG5jb25zdCBCRUZPUkVfUEFHSU5HX0NPTlNUQU5UID0gNjAwO1xuZnVuY3Rpb24gbnVtTUJCZWZvcmVXYXJuaW5nKCk6IG51bWJlciB7XG4gIGlmIChlbnYoKS5nbG9iYWwuc2NyZWVuID09IG51bGwpIHtcbiAgICByZXR1cm4gMTAyNDsgIC8vIDEgR0IuXG4gIH1cbiAgcmV0dXJuIChlbnYoKS5nbG9iYWwuc2NyZWVuLmhlaWdodCAqIGVudigpLmdsb2JhbC5zY3JlZW4ud2lkdGggKlxuICAgICAgICAgIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvKSAqXG4gICAgICBCRUZPUkVfUEFHSU5HX0NPTlNUQU5UIC8gMTAyNCAvIDEwMjQ7XG59XG5cbmV4cG9ydCBjbGFzcyBNYXRoQmFja2VuZFdlYkdMIGV4dGVuZHMgS2VybmVsQmFja2VuZCB7XG4gIHRleERhdGE6IERhdGFTdG9yYWdlPFRleHR1cmVEYXRhPjtcbiAgZ3BncHU6IEdQR1BVQ29udGV4dDtcblxuICBwcml2YXRlIHN0YXRpYyBuZXh0RGF0YUlkID0gMDtcbiAgcHJpdmF0ZSBuZXh0RGF0YUlkKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGhCYWNrZW5kV2ViR0wubmV4dERhdGFJZCsrO1xuICB9XG4gIC8vIE1hcHMgZGF0YSBpZHMgdGhhdCBoYXZlIGEgcGVuZGluZyByZWFkIG9wZXJhdGlvbiwgdG8gbGlzdCBvZiBzdWJzY3JpYmVycy5cbiAgcHJpdmF0ZSBwZW5kaW5nUmVhZCA9IG5ldyBXZWFrTWFwPERhdGFJZCwgQXJyYXk8KGFycjogVHlwZWRBcnJheSkgPT4gdm9pZD4+KCk7XG4gIC8vIExpc3Qgb2YgZGF0YSBpZHMgdGhhdCBhcmUgc2NoZWR1bGVkIGZvciBkaXNwb3NhbCwgYnV0IGFyZSB3YWl0aW5nIG9uIGFcbiAgLy8gcGVuZGluZyByZWFkIG9wZXJhdGlvbi5cbiAgcHJpdmF0ZSBwZW5kaW5nRGlzcG9zYWwgPSBuZXcgV2Vha1NldDxEYXRhSWQ+KCk7XG5cbiAgLy8gVXNlZCB0byBjb3VudCB0aGUgbnVtYmVyIG9mICdzaGFsbG93JyBzbGljZWQgdGVuc29ycyB0aGF0IHBvaW50IHRvIHRoZVxuICAvLyBzYW1lIGRhdGEgaWQuXG4gIGRhdGFSZWZDb3VudCA9IG5ldyBXZWFrTWFwPERhdGFJZCwgbnVtYmVyPigpO1xuICBwcml2YXRlIG51bUJ5dGVzSW5HUFUgPSAwO1xuXG4gIHByaXZhdGUgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudHxPZmZzY3JlZW5DYW52YXM7XG5cbiAgcHJpdmF0ZSBwcm9ncmFtVGltZXJzU3RhY2s6IFRpbWVyTm9kZVtdO1xuICBwcml2YXRlIGFjdGl2ZVRpbWVyczogVGltZXJOb2RlW107XG4gIC8vIEFjY3VtdWxhdGVkIHRpbWUgc3BlbnQgKGluY2x1ZGluZyBibG9ja2luZykgaW4gdXBsb2FkaW5nIGRhdGEgdG8gd2ViZ2wuXG4gIHByaXZhdGUgdXBsb2FkV2FpdE1zID0gMDtcbiAgLy8gQWNjdW11bGF0ZWQgdGltZSBzcGVudCAoaW5jbHVkaW5nIGJsb2NraW5nIGluIGRvd25sb2FkaW5nIGRhdGEgZnJvbSB3ZWJnbC5cbiAgcHJpdmF0ZSBkb3dubG9hZFdhaXRNcyA9IDA7XG5cbiAgLy8gcmVjb3JkIHRoZSBsYXN0IG1hbnVhbCBHTCBGbHVzaCB0aW1lLlxuICBwcml2YXRlIGxhc3RHbEZsdXNoVGltZSA9IDA7XG5cbiAgLy8gTnVtYmVyIG9mIGJpdHMgb2YgcHJlY2lzaW9uIG9mIHRoaXMgYmFja2VuZC5cbiAgcHJpdmF0ZSBmbG9hdFByZWNpc2lvblZhbHVlOiAzMnwxNjtcblxuICBwcml2YXRlIHRleHR1cmVNYW5hZ2VyOiBUZXh0dXJlTWFuYWdlcjtcbiAgcHJpdmF0ZSBiaW5hcnlDYWNoZToge1trZXk6IHN0cmluZ106IEdQR1BVQmluYXJ5fTtcbiAgcHJpdmF0ZSBncGdwdUNyZWF0ZWRMb2NhbGx5OiBib29sZWFuO1xuICBwcml2YXRlIG51bU1CQmVmb3JlV2FybmluZzogbnVtYmVyO1xuICBwcml2YXRlIHdhcm5lZEFib3V0TWVtb3J5ID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoZ3BncHU/OiBHUEdQVUNvbnRleHQpIHtcbiAgICBzdXBlcigpO1xuICAgIGlmICghZW52KCkuZ2V0Qm9vbCgnSEFTX1dFQkdMJykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignV2ViR0wgaXMgbm90IHN1cHBvcnRlZCBvbiB0aGlzIGRldmljZScpO1xuICAgIH1cblxuICAgIGlmIChncGdwdSA9PSBudWxsKSB7XG4gICAgICBjb25zdCBnbCA9IGdldFdlYkdMQ29udGV4dChlbnYoKS5nZXROdW1iZXIoJ1dFQkdMX1ZFUlNJT04nKSk7XG4gICAgICB0aGlzLmJpbmFyeUNhY2hlID0gZ2V0QmluYXJ5Q2FjaGUoZW52KCkuZ2V0TnVtYmVyKCdXRUJHTF9WRVJTSU9OJykpO1xuICAgICAgdGhpcy5ncGdwdSA9IG5ldyBHUEdQVUNvbnRleHQoZ2wpO1xuICAgICAgdGhpcy5jYW52YXMgPSBnbC5jYW52YXM7XG4gICAgICB0aGlzLmdwZ3B1Q3JlYXRlZExvY2FsbHkgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmdwZ3B1ID0gZ3BncHU7XG4gICAgICB0aGlzLmJpbmFyeUNhY2hlID0ge307XG4gICAgICB0aGlzLmdwZ3B1Q3JlYXRlZExvY2FsbHkgPSBmYWxzZTtcbiAgICAgIHRoaXMuY2FudmFzID0gZ3BncHUuZ2wuY2FudmFzO1xuICAgIH1cbiAgICB0aGlzLnRleHR1cmVNYW5hZ2VyID0gbmV3IFRleHR1cmVNYW5hZ2VyKHRoaXMuZ3BncHUpO1xuICAgIHRoaXMubnVtTUJCZWZvcmVXYXJuaW5nID0gbnVtTUJCZWZvcmVXYXJuaW5nKCk7XG5cbiAgICB0aGlzLnRleERhdGEgPSBuZXcgRGF0YVN0b3JhZ2UodGhpcywgZW5naW5lKCkpO1xuICB9XG5cbiAgbnVtRGF0YUlkcygpIHtcbiAgICByZXR1cm4gdGhpcy50ZXhEYXRhLm51bURhdGFJZHMoKSAtIHRoaXMucGVuZGluZ0RlbGV0ZXM7XG4gIH1cblxuICB3cml0ZSh2YWx1ZXM6IEJhY2tlbmRWYWx1ZXMsIHNoYXBlOiBudW1iZXJbXSwgZHR5cGU6IERhdGFUeXBlKTogRGF0YUlkIHtcbiAgICBpZiAoZW52KCkuZ2V0Qm9vbCgnV0VCR0xfQ0hFQ0tfTlVNRVJJQ0FMX1BST0JMRU1TJykgfHxcbiAgICAgICAgZW52KCkuZ2V0Qm9vbCgnREVCVUcnKSkge1xuICAgICAgdGhpcy5jaGVja051bWVyaWNhbFByb2JsZW1zKHZhbHVlcyk7XG4gICAgfVxuICAgIGlmIChkdHlwZSA9PT0gJ2NvbXBsZXg2NCcgJiYgdmFsdWVzICE9IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQ2Fubm90IHdyaXRlIHRvIGEgY29tcGxleDY0IGR0eXBlLiBgICtcbiAgICAgICAgICBgUGxlYXNlIHVzZSB0Zi5jb21wbGV4KHJlYWwsIGltYWcpLmApO1xuICAgIH1cbiAgICBjb25zdCBkYXRhSWQgPSB7aWQ6IHRoaXMubmV4dERhdGFJZCgpfTtcbiAgICB0aGlzLnRleERhdGEuc2V0KFxuICAgICAgICBkYXRhSWQsXG4gICAgICAgIHtzaGFwZSwgZHR5cGUsIHZhbHVlcywgdXNhZ2U6IFRleHR1cmVVc2FnZS5VUExPQUQsIHJlZkNvdW50OiAxfSk7XG4gICAgcmV0dXJuIGRhdGFJZDtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gcmVmQ291bnQgb2YgYSBgVGVuc29yRGF0YWAuICovXG4gIHJlZkNvdW50KGRhdGFJZDogRGF0YUlkKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy50ZXhEYXRhLmhhcyhkYXRhSWQpKSB7XG4gICAgICBjb25zdCB0ZW5zb3JEYXRhID0gdGhpcy50ZXhEYXRhLmdldChkYXRhSWQpO1xuICAgICAgcmV0dXJuIHRlbnNvckRhdGEucmVmQ291bnQ7XG4gICAgfVxuICAgIHJldHVybiAwO1xuICB9XG5cbiAgLyoqIEluY3JlYXNlIHJlZkNvdW50IG9mIGEgYFRleHR1cmVEYXRhYC4gKi9cbiAgaW5jUmVmKGRhdGFJZDogRGF0YUlkKTogdm9pZCB7XG4gICAgY29uc3QgdGV4RGF0YSA9IHRoaXMudGV4RGF0YS5nZXQoZGF0YUlkKTtcbiAgICB0ZXhEYXRhLnJlZkNvdW50Kys7XG4gIH1cblxuICAvKiogRGVjcmVhc2UgcmVmQ291bnQgb2YgYSBgVGV4dHVyZURhdGFgLiAqL1xuICBkZWNSZWYoZGF0YUlkOiBEYXRhSWQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50ZXhEYXRhLmhhcyhkYXRhSWQpKSB7XG4gICAgICBjb25zdCB0ZXhEYXRhID0gdGhpcy50ZXhEYXRhLmdldChkYXRhSWQpO1xuICAgICAgdGV4RGF0YS5yZWZDb3VudC0tO1xuICAgIH1cbiAgfVxuXG4gIG1vdmUoXG4gICAgICBkYXRhSWQ6IERhdGFJZCwgdmFsdWVzOiBCYWNrZW5kVmFsdWVzLCBzaGFwZTogbnVtYmVyW10sIGR0eXBlOiBEYXRhVHlwZSxcbiAgICAgIHJlZkNvdW50OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoZW52KCkuZ2V0Qm9vbCgnREVCVUcnKSkge1xuICAgICAgdGhpcy5jaGVja051bWVyaWNhbFByb2JsZW1zKHZhbHVlcyk7XG4gICAgfVxuICAgIGlmIChkdHlwZSA9PT0gJ2NvbXBsZXg2NCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQ2Fubm90IHdyaXRlIHRvIGEgY29tcGxleDY0IGR0eXBlLiBgICtcbiAgICAgICAgICBgUGxlYXNlIHVzZSB0Zi5jb21wbGV4KHJlYWwsIGltYWcpLmApO1xuICAgIH1cbiAgICB0aGlzLnRleERhdGEuc2V0KFxuICAgICAgICBkYXRhSWQsIHtzaGFwZSwgZHR5cGUsIHZhbHVlcywgdXNhZ2U6IFRleHR1cmVVc2FnZS5VUExPQUQsIHJlZkNvdW50fSk7XG4gIH1cblxuICBkaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh0ZW5zb3JJbmZvOiBUZW5zb3JJbmZvKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwb3NlRGF0YSh0ZW5zb3JJbmZvLmRhdGFJZCk7XG4gIH1cblxuICByZWFkU3luYyhkYXRhSWQ6IERhdGFJZCk6IEJhY2tlbmRWYWx1ZXMge1xuICAgIGNvbnN0IHRleERhdGEgPSB0aGlzLnRleERhdGEuZ2V0KGRhdGFJZCk7XG4gICAgY29uc3Qge3ZhbHVlcywgZHR5cGUsIGNvbXBsZXhUZW5zb3JJbmZvcywgc2xpY2UsIHNoYXBlLCBpc1BhY2tlZH0gPSB0ZXhEYXRhO1xuXG4gICAgLy8gVGhlIHByZXNlbmNlIG9mIGBzbGljZWAgaW5kaWNhdGVzIHRoaXMgdGVuc29yIGlzIGEgc2hhbGxvdyBzbGljZSBvZiBhXG4gICAgLy8gZGlmZmVyZW50IHRlbnNvciwgYW5kIGlzIHVzaW5nIHRoYXQgb3JpZ2luYWwgdGVuc29yJ3MgdGV4dHVyZS4gUnVuXG4gICAgLy8gYGNsb25lYCBpbiBvcmRlciB0byBjb3B5IHRoYXQgdGV4dHVyZSBhbmQgcmVhZCBmcm9tIGl0LlxuICAgIGlmIChzbGljZSAhPSBudWxsKSB7XG4gICAgICBsZXQgcHJvZ3JhbTtcbiAgICAgIGlmIChpc1BhY2tlZCkge1xuICAgICAgICBwcm9ncmFtID0gbmV3IFVuYXJ5T3BQYWNrZWRQcm9ncmFtKHNoYXBlLCB1bmFyeV9vcC5DTE9ORSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcm9ncmFtID0gbmV3IFVuYXJ5T3BQcm9ncmFtKHNoYXBlLCB1bmFyeV9vcC5DTE9ORSk7XG4gICAgICB9XG4gICAgICBjb25zdCByZXMgPVxuICAgICAgICAgIHRoaXMucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFt7ZGF0YUlkLCBzaGFwZSwgZHR5cGV9XSwgZHR5cGUpO1xuICAgICAgY29uc3QgZGF0YSA9IHRoaXMucmVhZFN5bmMocmVzLmRhdGFJZCk7XG4gICAgICB0aGlzLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlcyk7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gICAgaWYgKHZhbHVlcyAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0QW5kQ2FjaGVPbkNQVShkYXRhSWQpO1xuICAgIH1cbiAgICBpZiAoZHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gdmFsdWVzO1xuICAgIH1cbiAgICBjb25zdCBzaG91bGRUaW1lUHJvZ3JhbSA9IHRoaXMuYWN0aXZlVGltZXJzICE9IG51bGw7XG4gICAgbGV0IHN0YXJ0OiBudW1iZXI7XG4gICAgaWYgKHNob3VsZFRpbWVQcm9ncmFtKSB7XG4gICAgICBzdGFydCA9IHV0aWwubm93KCk7XG4gICAgfVxuXG4gICAgbGV0IHJlc3VsdDogRmxvYXQzMkFycmF5O1xuICAgIGlmIChkdHlwZSA9PT0gJ2NvbXBsZXg2NCcpIHtcbiAgICAgIGNvbnN0IHJlYWxWYWx1ZXMgPVxuICAgICAgICAgIHRoaXMucmVhZFN5bmMoY29tcGxleFRlbnNvckluZm9zLnJlYWwuZGF0YUlkKSBhcyBGbG9hdDMyQXJyYXk7XG4gICAgICBjb25zdCBpbWFnVmFsdWVzID1cbiAgICAgICAgICB0aGlzLnJlYWRTeW5jKGNvbXBsZXhUZW5zb3JJbmZvcy5pbWFnLmRhdGFJZCkgYXMgRmxvYXQzMkFycmF5O1xuICAgICAgcmVzdWx0ID0gYmFja2VuZF91dGlsLm1lcmdlUmVhbEFuZEltYWdBcnJheXMocmVhbFZhbHVlcywgaW1hZ1ZhbHVlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IHRoaXMuZ2V0VmFsdWVzRnJvbVRleHR1cmUoZGF0YUlkKTtcbiAgICB9XG5cbiAgICBpZiAoc2hvdWxkVGltZVByb2dyYW0pIHtcbiAgICAgIHRoaXMuZG93bmxvYWRXYWl0TXMgKz0gdXRpbC5ub3coKSAtIHN0YXJ0O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb252ZXJ0QW5kQ2FjaGVPbkNQVShkYXRhSWQsIHJlc3VsdCk7XG4gIH1cblxuICBhc3luYyByZWFkKGRhdGFJZDogRGF0YUlkKTogUHJvbWlzZTxCYWNrZW5kVmFsdWVzPiB7XG4gICAgaWYgKHRoaXMucGVuZGluZ1JlYWQuaGFzKGRhdGFJZCkpIHtcbiAgICAgIGNvbnN0IHN1YnNjcmliZXJzID0gdGhpcy5wZW5kaW5nUmVhZC5nZXQoZGF0YUlkKTtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxUeXBlZEFycmF5PihyZXNvbHZlID0+IHN1YnNjcmliZXJzLnB1c2gocmVzb2x2ZSkpO1xuICAgIH1cbiAgICBjb25zdCB0ZXhEYXRhID0gdGhpcy50ZXhEYXRhLmdldChkYXRhSWQpO1xuICAgIGNvbnN0IHt2YWx1ZXMsIHNoYXBlLCBzbGljZSwgZHR5cGUsIGNvbXBsZXhUZW5zb3JJbmZvcywgaXNQYWNrZWR9ID0gdGV4RGF0YTtcblxuICAgIC8vIFRoZSBwcmVzZW5jZSBvZiBgc2xpY2VgIGluZGljYXRlcyB0aGlzIHRlbnNvciBpcyBhIHNoYWxsb3cgc2xpY2Ugb2YgYVxuICAgIC8vIGRpZmZlcmVudCB0ZW5zb3IsIGFuZCBpcyB1c2luZyB0aGF0IG9yaWdpbmFsIHRlbnNvcidzIHRleHR1cmUuIFJ1blxuICAgIC8vIGBjbG9uZWAgaW4gb3JkZXIgdG8gY29weSB0aGF0IHRleHR1cmUgYW5kIHJlYWQgZnJvbSBpdC5cbiAgICBpZiAoc2xpY2UgIT0gbnVsbCkge1xuICAgICAgbGV0IHByb2dyYW07XG4gICAgICBpZiAoaXNQYWNrZWQpIHtcbiAgICAgICAgcHJvZ3JhbSA9IG5ldyBVbmFyeU9wUGFja2VkUHJvZ3JhbShzaGFwZSwgdW5hcnlfb3AuQ0xPTkUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJvZ3JhbSA9IG5ldyBVbmFyeU9wUHJvZ3JhbShzaGFwZSwgdW5hcnlfb3AuQ0xPTkUpO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVzID1cbiAgICAgICAgICB0aGlzLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbe2RhdGFJZCwgc2hhcGUsIGR0eXBlfV0sIGR0eXBlKTtcbiAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLnJlYWQocmVzLmRhdGFJZCk7XG4gICAgICB0aGlzLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlcyk7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWVzICE9IG51bGwpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRBbmRDYWNoZU9uQ1BVKGRhdGFJZCk7XG4gICAgfVxuXG4gICAgaWYgKCFlbnYoKS5nZXRCb29sKCdXRUJHTF9ET1dOTE9BRF9GTE9BVF9FTkFCTEVEJykgJiZcbiAgICAgICAgZW52KCkuZ2V0TnVtYmVyKCdXRUJHTF9WRVJTSU9OJykgPT09IDIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgdGVuc29yLmRhdGEoKSB3aXRoIFdFQkdMX0RPV05MT0FEX0ZMT0FUX0VOQUJMRUQ9ZmFsc2UgYW5kIGAgK1xuICAgICAgICAgIGBXRUJHTF9WRVJTSU9OPTIgbm90IHlldCBzdXBwb3J0ZWQuYCk7XG4gICAgfVxuXG4gICAgbGV0IGJ1ZmZlcjogV2ViR0xCdWZmZXIgPSBudWxsO1xuICAgIGxldCB0bXBEb3dubG9hZFRhcmdldDogVGVuc29ySW5mbztcblxuICAgIGlmIChkdHlwZSAhPT0gJ2NvbXBsZXg2NCcgJiYgZW52KCkuZ2V0KCdXRUJHTF9CVUZGRVJfU1VQUE9SVEVEJykpIHtcbiAgICAgIC8vIFBvc3NpYmx5IGNvcHkgdGhlIHRleHR1cmUgaW50byBhIGJ1ZmZlciBiZWZvcmUgaW5zZXJ0aW5nIGEgZmVuY2UuXG4gICAgICB0bXBEb3dubG9hZFRhcmdldCA9IHRoaXMuZGVjb2RlKGRhdGFJZCk7XG4gICAgICBjb25zdCB0bXBEYXRhID0gdGhpcy50ZXhEYXRhLmdldCh0bXBEb3dubG9hZFRhcmdldC5kYXRhSWQpO1xuXG4gICAgICBidWZmZXIgPSB0aGlzLmdwZ3B1LmNyZWF0ZUJ1ZmZlckZyb21UZXh0dXJlKFxuICAgICAgICAgIHRtcERhdGEudGV4dHVyZSwgLi4udGV4X3V0aWwuZ2V0RGVuc2VUZXhTaGFwZShzaGFwZSkpO1xuICAgIH1cblxuICAgIHRoaXMucGVuZGluZ1JlYWQuc2V0KGRhdGFJZCwgW10pO1xuXG4gICAgaWYgKGR0eXBlICE9PSAnY29tcGxleDY0Jykge1xuICAgICAgLy8gQ3JlYXRlIGEgZmVuY2UgYW5kIHdhaXQgZm9yIGl0IHRvIHJlc29sdmUuXG4gICAgICBhd2FpdCB0aGlzLmdwZ3B1LmNyZWF0ZUFuZFdhaXRGb3JGZW5jZSgpO1xuICAgIH1cblxuICAgIC8vIERvd25sb2FkIHRoZSB2YWx1ZXMgZnJvbSB0aGUgR1BVLlxuICAgIGxldCB2YWxzOiBGbG9hdDMyQXJyYXk7XG4gICAgaWYgKGR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgICAgY29uc3QgcHMgPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIHRoaXMucmVhZChjb21wbGV4VGVuc29ySW5mb3MucmVhbC5kYXRhSWQpLFxuICAgICAgICB0aGlzLnJlYWQoY29tcGxleFRlbnNvckluZm9zLmltYWcuZGF0YUlkKVxuICAgICAgXSk7XG5cbiAgICAgIGNvbnN0IHJlYWxWYWx1ZXMgPSBwc1swXTtcbiAgICAgIGNvbnN0IGltYWdWYWx1ZXMgPSBwc1sxXTtcbiAgICAgIHZhbHMgPSBiYWNrZW5kX3V0aWwubWVyZ2VSZWFsQW5kSW1hZ0FycmF5cyhcbiAgICAgICAgICByZWFsVmFsdWVzIGFzIEZsb2F0MzJBcnJheSwgaW1hZ1ZhbHVlcyBhcyBGbG9hdDMyQXJyYXkpO1xuICAgIH0gZWxzZSBpZiAoYnVmZmVyID09IG51bGwpIHtcbiAgICAgIHZhbHMgPSB0aGlzLmdldFZhbHVlc0Zyb21UZXh0dXJlKGRhdGFJZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoc2hhcGUpO1xuICAgICAgdmFscyA9IHRoaXMuZ3BncHUuZG93bmxvYWRGbG9hdDMyTWF0cml4RnJvbUJ1ZmZlcihidWZmZXIsIHNpemUpO1xuICAgIH1cbiAgICBpZiAodG1wRG93bmxvYWRUYXJnZXQgIT0gbnVsbCkge1xuICAgICAgdGhpcy5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh0bXBEb3dubG9hZFRhcmdldCk7XG4gICAgfVxuICAgIGlmIChidWZmZXIgIT0gbnVsbCkge1xuICAgICAgY29uc3QgZ2wgPSB0aGlzLmdwZ3B1LmdsO1xuICAgICAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmRlbGV0ZUJ1ZmZlcihidWZmZXIpKTtcbiAgICB9XG4gICAgY29uc3QgZFR5cGVWYWxzID0gdGhpcy5jb252ZXJ0QW5kQ2FjaGVPbkNQVShkYXRhSWQsIHZhbHMpO1xuXG4gICAgY29uc3Qgc3Vic2NyaWJlcnMgPSB0aGlzLnBlbmRpbmdSZWFkLmdldChkYXRhSWQpO1xuICAgIHRoaXMucGVuZGluZ1JlYWQuZGVsZXRlKGRhdGFJZCk7XG5cbiAgICAvLyBOb3RpZnkgYWxsIHBlbmRpbmcgcmVhZHMuXG4gICAgc3Vic2NyaWJlcnMuZm9yRWFjaChyZXNvbHZlID0+IHJlc29sdmUoZFR5cGVWYWxzKSk7XG4gICAgaWYgKHRoaXMucGVuZGluZ0Rpc3Bvc2FsLmhhcyhkYXRhSWQpKSB7XG4gICAgICB0aGlzLnBlbmRpbmdEaXNwb3NhbC5kZWxldGUoZGF0YUlkKTtcbiAgICAgIGlmICh0aGlzLmRpc3Bvc2VEYXRhKGRhdGFJZCkpIHtcbiAgICAgICAgZW5naW5lKCkucmVtb3ZlRGF0YUlkKGRhdGFJZCwgdGhpcyk7XG4gICAgICB9XG4gICAgICB0aGlzLnBlbmRpbmdEZWxldGVzLS07XG4gICAgfVxuICAgIHJldHVybiBkVHlwZVZhbHM7XG4gIH1cblxuICBidWZmZXJTeW5jPFIgZXh0ZW5kcyBSYW5rPih0OiBUZW5zb3JJbmZvKTogVGVuc29yQnVmZmVyPFI+IHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5yZWFkU3luYyh0LmRhdGFJZCk7XG4gICAgbGV0IGRlY29kZWREYXRhID0gZGF0YSBhcyBEYXRhVmFsdWVzO1xuICAgIGlmICh0LmR0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gRGVjb2RlIHRoZSBieXRlcyBpbnRvIHN0cmluZy5cbiAgICAgICAgZGVjb2RlZERhdGEgPSAoZGF0YSBhcyBVaW50OEFycmF5W10pLm1hcChkID0+IHV0aWwuZGVjb2RlU3RyaW5nKGQpKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBkZWNvZGUgZW5jb2RlZCBzdHJpbmcgYnl0ZXMgaW50byB1dGYtOCcpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYnVmZmVyKHQuc2hhcGUgYXMgU2hhcGVNYXBbUl0sIHQuZHR5cGUsIGRlY29kZWREYXRhKSBhc1xuICAgICAgICBUZW5zb3JCdWZmZXI8Uj47XG4gIH1cblxuICBwcml2YXRlIGNoZWNrTnVtZXJpY2FsUHJvYmxlbXModmFsdWVzOiBCYWNrZW5kVmFsdWVzKTogdm9pZCB7XG4gICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBudW0gPSB2YWx1ZXNbaV0gYXMgbnVtYmVyO1xuICAgICAgaWYgKCF3ZWJnbF91dGlsLmNhbkJlUmVwcmVzZW50ZWQobnVtKSkge1xuICAgICAgICBpZiAoZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUkVOREVSX0ZMT0FUMzJfQ0FQQUJMRScpKSB7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICAgIGBUaGUgdmFsdWUgJHtudW19IGNhbm5vdCBiZSByZXByZXNlbnRlZCB3aXRoIHlvdXIgYCArXG4gICAgICAgICAgICAgIGBjdXJyZW50IHNldHRpbmdzLiBDb25zaWRlciBlbmFibGluZyBmbG9hdDMyIHJlbmRlcmluZzogYCArXG4gICAgICAgICAgICAgIGAndGYuZW52KCkuc2V0KCdXRUJHTF9SRU5ERVJfRkxPQVQzMl9FTkFCTEVEJywgdHJ1ZSk7J2ApO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IEVycm9yKGBUaGUgdmFsdWUgJHtudW19IGNhbm5vdCBiZSByZXByZXNlbnRlZCBvbiB0aGlzIGRldmljZS5gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldFZhbHVlc0Zyb21UZXh0dXJlKGRhdGFJZDogRGF0YUlkKTogRmxvYXQzMkFycmF5IHtcbiAgICBjb25zdCB7c2hhcGUsIGR0eXBlLCBpc1BhY2tlZH0gPSB0aGlzLnRleERhdGEuZ2V0KGRhdGFJZCk7XG4gICAgY29uc3Qgc2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShzaGFwZSk7XG4gICAgaWYgKGVudigpLmdldEJvb2woJ1dFQkdMX0RPV05MT0FEX0ZMT0FUX0VOQUJMRUQnKSkge1xuICAgICAgY29uc3QgdG1wVGFyZ2V0ID0gdGhpcy5kZWNvZGUoZGF0YUlkKTtcbiAgICAgIGNvbnN0IHRtcERhdGEgPSB0aGlzLnRleERhdGEuZ2V0KHRtcFRhcmdldC5kYXRhSWQpO1xuICAgICAgY29uc3QgdmFscyA9IHRoaXMuZ3BncHVcbiAgICAgICAgICAgICAgICAgICAgICAgLmRvd25sb2FkTWF0cml4RnJvbVBhY2tlZFRleHR1cmUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBEYXRhLnRleHR1cmUsIC4uLnRleF91dGlsLmdldERlbnNlVGV4U2hhcGUoc2hhcGUpKVxuICAgICAgICAgICAgICAgICAgICAgICAuc3ViYXJyYXkoMCwgc2l6ZSk7XG5cbiAgICAgIHRoaXMuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8odG1wVGFyZ2V0KTtcblxuICAgICAgcmV0dXJuIHZhbHM7XG4gICAgfVxuXG4gICAgY29uc3Qgc2hvdWxkVXNlUGFja2VkUHJvZ3JhbSA9XG4gICAgICAgIGVudigpLmdldEJvb2woJ1dFQkdMX1BBQ0snKSAmJiBpc1BhY2tlZCA9PT0gdHJ1ZTtcbiAgICBjb25zdCBvdXRwdXRTaGFwZSA9XG4gICAgICAgIHNob3VsZFVzZVBhY2tlZFByb2dyYW0gPyB3ZWJnbF91dGlsLmdldFNoYXBlQXMzRChzaGFwZSkgOiBzaGFwZTtcbiAgICBjb25zdCBwcm9ncmFtID0gc2hvdWxkVXNlUGFja2VkUHJvZ3JhbSA/XG4gICAgICAgIG5ldyBFbmNvZGVGbG9hdFBhY2tlZFByb2dyYW0ob3V0cHV0U2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXJdKSA6XG4gICAgICAgIG5ldyBFbmNvZGVGbG9hdFByb2dyYW0ob3V0cHV0U2hhcGUpO1xuICAgIGNvbnN0IG91dHB1dCA9IHRoaXMucnVuV2ViR0xQcm9ncmFtKFxuICAgICAgICBwcm9ncmFtLCBbe3NoYXBlOiBvdXRwdXRTaGFwZSwgZHR5cGUsIGRhdGFJZH1dLCAnZmxvYXQzMicpO1xuICAgIGNvbnN0IHRtcERhdGEgPSB0aGlzLnRleERhdGEuZ2V0KG91dHB1dC5kYXRhSWQpO1xuICAgIGNvbnN0IHZhbHMgPVxuICAgICAgICB0aGlzLmdwZ3B1XG4gICAgICAgICAgICAuZG93bmxvYWRCeXRlRW5jb2RlZEZsb2F0TWF0cml4RnJvbU91dHB1dFRleHR1cmUoXG4gICAgICAgICAgICAgICAgdG1wRGF0YS50ZXh0dXJlLCB0bXBEYXRhLnRleFNoYXBlWzBdLCB0bXBEYXRhLnRleFNoYXBlWzFdKVxuICAgICAgICAgICAgLnN1YmFycmF5KDAsIHNpemUpO1xuICAgIHRoaXMuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ob3V0cHV0KTtcblxuICAgIHJldHVybiB2YWxzO1xuICB9XG5cbiAgdGltZXJBdmFpbGFibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGVudigpLmdldE51bWJlcignV0VCR0xfRElTSk9JTlRfUVVFUllfVElNRVJfRVhURU5TSU9OX1JFTElBQkxFJykgPiAwO1xuICB9XG5cbiAgYXN5bmMgdGltZShmOiAoKSA9PiB2b2lkKTogUHJvbWlzZTxXZWJHTFRpbWluZ0luZm8+IHtcbiAgICBjb25zdCBvbGRBY3RpdmVUaW1lcnMgPSB0aGlzLmFjdGl2ZVRpbWVycztcbiAgICBjb25zdCBuZXdBY3RpdmVUaW1lcnM6IFRpbWVyTm9kZVtdID0gW107XG5cbiAgICBsZXQgb3V0ZXJNb3N0VGltZSA9IGZhbHNlO1xuICAgIGlmICh0aGlzLnByb2dyYW1UaW1lcnNTdGFjayA9PSBudWxsKSB7XG4gICAgICB0aGlzLnByb2dyYW1UaW1lcnNTdGFjayA9IG5ld0FjdGl2ZVRpbWVycztcbiAgICAgIG91dGVyTW9zdFRpbWUgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFjdGl2ZVRpbWVycy5wdXNoKG5ld0FjdGl2ZVRpbWVycyk7XG4gICAgfVxuICAgIHRoaXMuYWN0aXZlVGltZXJzID0gbmV3QWN0aXZlVGltZXJzO1xuXG4gICAgZigpO1xuXG4gICAgLy8gbmVlZGluZyB0byBzcGxpdCB0aGVzZSB1cCBiZWNhdXNlIHV0aWwuZmxhdHRlbiBvbmx5IGFjY2VwdHMgY2VydGFpbiB0eXBlc1xuICAgIGNvbnN0IGZsYXR0ZW5lZEFjdGl2ZVRpbWVyUXVlcmllcyA9XG4gICAgICAgIHV0aWwuZmxhdHRlbih0aGlzLmFjdGl2ZVRpbWVycy5tYXAoKGQ6IEtlcm5lbEluZm8pID0+IGQucXVlcnkpKVxuICAgICAgICAgICAgLmZpbHRlcihkID0+IGQgIT0gbnVsbCk7XG4gICAgY29uc3QgZmxhdHRlbmVkQWN0aXZlVGltZXJOYW1lcyA9XG4gICAgICAgIHV0aWwuZmxhdHRlbih0aGlzLmFjdGl2ZVRpbWVycy5tYXAoKGQ6IEtlcm5lbEluZm8pID0+IGQubmFtZSkpXG4gICAgICAgICAgICAuZmlsdGVyKGQgPT4gZCAhPSBudWxsKTtcblxuICAgIHRoaXMuYWN0aXZlVGltZXJzID0gb2xkQWN0aXZlVGltZXJzO1xuXG4gICAgaWYgKG91dGVyTW9zdFRpbWUpIHtcbiAgICAgIHRoaXMucHJvZ3JhbVRpbWVyc1N0YWNrID0gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCByZXM6IFdlYkdMVGltaW5nSW5mbyA9IHtcbiAgICAgIHVwbG9hZFdhaXRNczogdGhpcy51cGxvYWRXYWl0TXMsXG4gICAgICBkb3dubG9hZFdhaXRNczogdGhpcy5kb3dubG9hZFdhaXRNcyxcbiAgICAgIGtlcm5lbE1zOiBudWxsLFxuICAgICAgd2FsbE1zOiBudWxsICAvLyB3aWxsIGJlIGZpbGxlZCBieSB0aGUgZW5naW5lXG4gICAgfTtcblxuICAgIGlmIChlbnYoKS5nZXROdW1iZXIoJ1dFQkdMX0RJU0pPSU5UX1FVRVJZX1RJTUVSX0VYVEVOU0lPTl9SRUxJQUJMRScpID4gMCkge1xuICAgICAgY29uc3Qga2VybmVsTXMgPSBhd2FpdCBQcm9taXNlLmFsbChmbGF0dGVuZWRBY3RpdmVUaW1lclF1ZXJpZXMpO1xuXG4gICAgICByZXNbJ2tlcm5lbE1zJ10gPSB1dGlsLnN1bShrZXJuZWxNcyk7XG4gICAgICByZXNbJ2dldEV4dHJhUHJvZmlsZUluZm8nXSA9ICgpID0+XG4gICAgICAgICAga2VybmVsTXMubWFwKChkLCBpKSA9PiAoe25hbWU6IGZsYXR0ZW5lZEFjdGl2ZVRpbWVyTmFtZXNbaV0sIG1zOiBkfSkpXG4gICAgICAgICAgICAgIC5tYXAoZCA9PiBgJHtkLm5hbWV9OiAke2QubXN9YClcbiAgICAgICAgICAgICAgLmpvaW4oJywgJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc1sna2VybmVsTXMnXSA9IHtcbiAgICAgICAgZXJyb3I6ICdXZWJHTCBxdWVyeSB0aW1lcnMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBlbnZpcm9ubWVudC4nXG4gICAgICB9O1xuICAgIH1cblxuICAgIHRoaXMudXBsb2FkV2FpdE1zID0gMDtcbiAgICB0aGlzLmRvd25sb2FkV2FpdE1zID0gMDtcbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIG1lbW9yeSgpOiBXZWJHTE1lbW9yeUluZm8ge1xuICAgIHJldHVybiB7XG4gICAgICB1bnJlbGlhYmxlOiBmYWxzZSxcbiAgICAgIG51bUJ5dGVzSW5HUFU6IHRoaXMubnVtQnl0ZXNJbkdQVSxcbiAgICAgIG51bUJ5dGVzSW5HUFVBbGxvY2F0ZWQ6IHRoaXMudGV4dHVyZU1hbmFnZXIubnVtQnl0ZXNBbGxvY2F0ZWQsXG4gICAgICBudW1CeXRlc0luR1BVRnJlZTogdGhpcy50ZXh0dXJlTWFuYWdlci5udW1CeXRlc0ZyZWVcbiAgICB9IGFzIFdlYkdMTWVtb3J5SW5mbztcbiAgfVxuXG4gIHByaXZhdGUgc3RhcnRUaW1lcigpOiBXZWJHTFF1ZXJ5fENQVVRpbWVyUXVlcnkge1xuICAgIGlmIChlbnYoKS5nZXROdW1iZXIoJ1dFQkdMX0RJU0pPSU5UX1FVRVJZX1RJTUVSX0VYVEVOU0lPTl9SRUxJQUJMRScpID4gMCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ3BncHUuYmVnaW5RdWVyeSgpO1xuICAgIH1cbiAgICByZXR1cm4ge3N0YXJ0TXM6IHV0aWwubm93KCksIGVuZE1zOiBudWxsfTtcbiAgfVxuXG4gIHByaXZhdGUgZW5kVGltZXIocXVlcnk6IFdlYkdMUXVlcnl8Q1BVVGltZXJRdWVyeSk6IFdlYkdMUXVlcnl8Q1BVVGltZXJRdWVyeSB7XG4gICAgaWYgKGVudigpLmdldE51bWJlcignV0VCR0xfRElTSk9JTlRfUVVFUllfVElNRVJfRVhURU5TSU9OX1JFTElBQkxFJykgPiAwKSB7XG4gICAgICB0aGlzLmdwZ3B1LmVuZFF1ZXJ5KCk7XG4gICAgICByZXR1cm4gcXVlcnk7XG4gICAgfVxuICAgIChxdWVyeSBhcyBDUFVUaW1lclF1ZXJ5KS5lbmRNcyA9IHV0aWwubm93KCk7XG4gICAgcmV0dXJuIHF1ZXJ5O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRRdWVyeVRpbWUocXVlcnk6IFdlYkdMUXVlcnl8Q1BVVGltZXJRdWVyeSk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgaWYgKGVudigpLmdldE51bWJlcignV0VCR0xfRElTSk9JTlRfUVVFUllfVElNRVJfRVhURU5TSU9OX1JFTElBQkxFJykgPiAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5ncGdwdS53YWl0Rm9yUXVlcnlBbmRHZXRUaW1lKHF1ZXJ5IGFzIFdlYkdMUXVlcnkpO1xuICAgIH1cbiAgICBjb25zdCB0aW1lclF1ZXJ5ID0gcXVlcnkgYXMgQ1BVVGltZXJRdWVyeTtcbiAgICByZXR1cm4gdGltZXJRdWVyeS5lbmRNcyAtIHRpbWVyUXVlcnkuc3RhcnRNcztcbiAgfVxuXG4gIHByaXZhdGUgcGVuZGluZ0RlbGV0ZXMgPSAwO1xuXG4gIC8qKlxuICAgKiBEZWNyZWFzZSB0aGUgUmVmQ291bnQgb24gdGhlIGRhdGFJZCBhbmQgZGlzcG9zZSB0aGUgbWVtb3J5IGlmIHRoZSBkYXRhSWRcbiAgICogaGFzIDAgcmVmQ291bnQuIElmIHRoZXJlIGFyZSBwZW5kaW5nIHJlYWQgb24gdGhlIGRhdGEsIHRoZSBkaXNwb3NhbCB3b3VsZFxuICAgKiBhZGRlZCB0byB0aGUgcGVuZGluZyBkZWxldGUgcXVldWUuIFJldHVybiB0cnVlIGlmIHRoZSBkYXRhSWQgaXMgcmVtb3ZlZFxuICAgKiBmcm9tIGJhY2tlbmQgb3IgdGhlIGJhY2tlbmQgZG9lcyBub3QgY29udGFpbiB0aGUgZGF0YUlkLCBmYWxzZSBpZiB0aGVcbiAgICogZGF0YUlkIGlzIG5vdCByZW1vdmVkLiBNZW1vcnkgbWF5IG9yIG1heSBub3QgYmUgcmVsZWFzZWQgZXZlbiB3aGVuIGRhdGFJZFxuICAgKiBpcyByZW1vdmVkLCB3aGljaCBhbHNvIGRlcGVuZHMgb24gZGF0YVJlZkNvdW50LCBzZWUgYHJlbGVhc2VHUFVgLlxuICAgKiBAcGFyYW0gZGF0YUlkXG4gICAqIEBvYXJhbSBmb3JjZSBPcHRpb25hbCwgcmVtb3ZlIHRoZSBkYXRhIHJlZ2FyZGxlc3Mgb2YgcmVmQ291bnRcbiAgICovXG4gIGRpc3Bvc2VEYXRhKGRhdGFJZDogRGF0YUlkLCBmb3JjZSA9IGZhbHNlKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMucGVuZGluZ0Rpc3Bvc2FsLmhhcyhkYXRhSWQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gTm8tb3AgaWYgYWxyZWFkeSBkaXNwb3NlZC5cbiAgICBpZiAoIXRoaXMudGV4RGF0YS5oYXMoZGF0YUlkKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gaWYgZm9yY2UgZmxhZyBpcyBzZXQsIGNoYW5nZSByZWZDb3VudCB0byAwLCB0aGlzIHdvdWxkIGVuc3VyZSBkaXNwb3NhbFxuICAgIC8vIHdoZW4gYWRkZWQgdG8gdGhlIHBlbmRpbmdEaXNwb3NhbCBxdWV1ZS4gTWVtb3J5IG1heSBvciBtYXkgbm90IGJlXG4gICAgLy8gcmVsZWFzZWQsIHdoaWNoIGFsc28gZGVwZW5kcyBvbiBkYXRhUmVmQ291bnQsIHNlZSBgcmVsZWFzZUdQVWAuXG4gICAgaWYgKGZvcmNlKSB7XG4gICAgICB0aGlzLnRleERhdGEuZ2V0KGRhdGFJZCkucmVmQ291bnQgPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRleERhdGEuZ2V0KGRhdGFJZCkucmVmQ291bnQtLTtcbiAgICB9XG5cbiAgICBpZiAoIWZvcmNlICYmIHRoaXMudGV4RGF0YS5nZXQoZGF0YUlkKS5yZWZDb3VudCA+IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wZW5kaW5nUmVhZC5oYXMoZGF0YUlkKSkge1xuICAgICAgdGhpcy5wZW5kaW5nRGlzcG9zYWwuYWRkKGRhdGFJZCk7XG4gICAgICB0aGlzLnBlbmRpbmdEZWxldGVzKys7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdGhpcy5yZWxlYXNlR1BVRGF0YShkYXRhSWQpO1xuICAgIGNvbnN0IHtjb21wbGV4VGVuc29ySW5mb3N9ID0gdGhpcy50ZXhEYXRhLmdldChkYXRhSWQpO1xuICAgIGlmIChjb21wbGV4VGVuc29ySW5mb3MgIT0gbnVsbCkge1xuICAgICAgdGhpcy5kaXNwb3NlRGF0YShjb21wbGV4VGVuc29ySW5mb3MucmVhbC5kYXRhSWQsIGZvcmNlKTtcbiAgICAgIHRoaXMuZGlzcG9zZURhdGEoY29tcGxleFRlbnNvckluZm9zLmltYWcuZGF0YUlkLCBmb3JjZSk7XG4gICAgfVxuXG4gICAgdGhpcy50ZXhEYXRhLmRlbGV0ZShkYXRhSWQpO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIHJlbGVhc2VHUFVEYXRhKGRhdGFJZDogRGF0YUlkKTogdm9pZCB7XG4gICAgY29uc3Qge3RleHR1cmUsIGR0eXBlLCB0ZXhTaGFwZSwgdXNhZ2UsIGlzUGFja2VkLCBzbGljZX0gPVxuICAgICAgICB0aGlzLnRleERhdGEuZ2V0KGRhdGFJZCk7XG4gICAgY29uc3Qga2V5ID0gc2xpY2UgJiYgc2xpY2Uub3JpZ0RhdGFJZCB8fCBkYXRhSWQ7XG4gICAgY29uc3QgcmVmQ291bnQgPSB0aGlzLmRhdGFSZWZDb3VudC5nZXQoa2V5KTtcblxuICAgIGlmIChyZWZDb3VudCA+IDEpIHtcbiAgICAgIHRoaXMuZGF0YVJlZkNvdW50LnNldChrZXksIHJlZkNvdW50IC0gMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGF0YVJlZkNvdW50LmRlbGV0ZShrZXkpO1xuICAgICAgaWYgKHRleHR1cmUgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLm51bUJ5dGVzSW5HUFUgLT0gdGhpcy5jb21wdXRlQnl0ZXModGV4U2hhcGUsIGR0eXBlKTtcbiAgICAgICAgdGhpcy50ZXh0dXJlTWFuYWdlci5yZWxlYXNlVGV4dHVyZSh0ZXh0dXJlLCB0ZXhTaGFwZSwgdXNhZ2UsIGlzUGFja2VkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB0ZXhEYXRhID0gdGhpcy50ZXhEYXRhLmdldChkYXRhSWQpO1xuICAgIHRleERhdGEudGV4dHVyZSA9IG51bGw7XG4gICAgdGV4RGF0YS50ZXhTaGFwZSA9IG51bGw7XG4gICAgdGV4RGF0YS5pc1BhY2tlZCA9IGZhbHNlO1xuICAgIHRleERhdGEuc2xpY2UgPSBudWxsO1xuICB9XG5cbiAgZ2V0VGV4dHVyZShkYXRhSWQ6IERhdGFJZCk6IFdlYkdMVGV4dHVyZSB7XG4gICAgdGhpcy51cGxvYWRUb0dQVShkYXRhSWQpO1xuICAgIHJldHVybiB0aGlzLnRleERhdGEuZ2V0KGRhdGFJZCkudGV4dHVyZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGludGVybmFsIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWMgZGF0YSBidWNrZXQuIFVzZWQgaW4gdW5pdFxuICAgKiB0ZXN0cy5cbiAgICovXG4gIGdldERhdGFJbmZvKGRhdGFJZDogRGF0YUlkKTogVGV4dHVyZURhdGEge1xuICAgIHJldHVybiB0aGlzLnRleERhdGEuZ2V0KGRhdGFJZCk7XG4gIH1cblxuICAvKlxuICBUZXN0cyB3aGV0aGVyIGFsbCB0aGUgaW5wdXRzIHRvIGFuIG9wIGFyZSBzbWFsbCBhbmQgb24gdGhlIENQVS4gVGhpcyBoZXVyaXN0aWNcbiAgZGV0ZXJtaW5lcyB3aGVuIGl0IHdvdWxkIGJlIGZhc3RlciB0byBleGVjdXRlIGEga2VybmVsIG9uIHRoZSBDUFUuIFdlYkdMXG4gIGtlcm5lbHMgb3B0IGludG8gcnVubmluZyB0aGlzIGNoZWNrIGFuZCBmb3J3YXJkaW5nIHdoZW4gYXBwcm9wcmlhdGUuXG4gIFRPRE8oaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGZqcy9pc3N1ZXMvODcyKTogRGV2ZWxvcCBhIG1vcmVcbiAgc3VzdGFpbmFibGUgc3RyYXRlZ3kgZm9yIG9wdGltaXppbmcgYmFja2VuZCBleGVjdXRpb24gb2Ygb3BzLlxuICAgKi9cbiAgc2hvdWxkRXhlY3V0ZU9uQ1BVKFxuICAgICAgaW5wdXRzOiBUZW5zb3JJbmZvW10sXG4gICAgICBzaXplVGhyZXNob2xkID0gQ1BVX0hBTkRPRkZfU0laRV9USFJFU0hPTEQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZW52KCkuZ2V0Qm9vbCgnV0VCR0xfQ1BVX0ZPUldBUkQnKSAmJlxuICAgICAgICBpbnB1dHMuZXZlcnkoXG4gICAgICAgICAgICBpbnB1dCA9PiB0aGlzLnRleERhdGEuZ2V0KGlucHV0LmRhdGFJZCkudGV4dHVyZSA9PSBudWxsICYmXG4gICAgICAgICAgICAgICAgdXRpbC5zaXplRnJvbVNoYXBlKGlucHV0LnNoYXBlKSA8IHNpemVUaHJlc2hvbGQpO1xuICB9XG5cbiAgZ2V0R1BHUFVDb250ZXh0KCk6IEdQR1BVQ29udGV4dCB7XG4gICAgcmV0dXJuIHRoaXMuZ3BncHU7XG4gIH1cblxuICB3aGVyZShjb25kaXRpb246IFRlbnNvcik6IFRlbnNvcjJEIHtcbiAgICBiYWNrZW5kX3V0aWwud2FybihcbiAgICAgICAgJ3RmLndoZXJlKCkgaW4gd2ViZ2wgbG9ja3MgdGhlIFVJIHRocmVhZC4gJyArXG4gICAgICAgICdDYWxsIHRmLndoZXJlQXN5bmMoKSBpbnN0ZWFkJyk7XG4gICAgY29uc3QgY29uZFZhbHMgPSBjb25kaXRpb24uZGF0YVN5bmMoKTtcbiAgICByZXR1cm4gd2hlcmVJbXBsKGNvbmRpdGlvbi5zaGFwZSwgY29uZFZhbHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBwYWNrZWRVbmFyeU9wKHg6IFRlbnNvckluZm8sIG9wOiBzdHJpbmcsIGR0eXBlOiBEYXRhVHlwZSkge1xuICAgIGNvbnN0IHByb2dyYW0gPSBuZXcgVW5hcnlPcFBhY2tlZFByb2dyYW0oeC5zaGFwZSwgb3ApO1xuICAgIGNvbnN0IG91dEluZm8gPSB0aGlzLmNvbXBpbGVBbmRSdW4ocHJvZ3JhbSwgW3hdLCBkdHlwZSk7XG4gICAgcmV0dXJuIGVuZ2luZSgpLm1ha2VUZW5zb3JGcm9tRGF0YUlkKFxuICAgICAgICBvdXRJbmZvLmRhdGFJZCwgb3V0SW5mby5zaGFwZSwgb3V0SW5mby5kdHlwZSk7XG4gIH1cblxuICAvLyBUT0RPKG1zb3VsYW5pbGxlKSByZW1vdmUgdGhpcyBvbmNlIHRoZSBiYWNrZW5kIGhhcyBiZWVuIG1vZHVsYXJpemVkXG4gIC8vIGEgY29weSBpcyBuZWVkZWQgaGVyZSB0byBicmVhayBhIGNpcmN1bGFyIGRlcGVuZGVuY3kuXG4gIC8vIEFsc28gcmVtb3ZlIHRoZSBvcCBmcm9tIHVuYXJ5X29wLlxuICBhYnM8VCBleHRlbmRzIFRlbnNvcj4oeDogVCk6IFQge1xuICAgIC8vIFRPRE86IGhhbmRsZSBjYXNlcyB3aGVuIHggaXMgY29tcGxleC5cbiAgICBpZiAodGhpcy5zaG91bGRFeGVjdXRlT25DUFUoW3hdKSAmJiB4LmR0eXBlICE9PSAnY29tcGxleDY0Jykge1xuICAgICAgY29uc3Qgb3V0VmFsdWVzID1cbiAgICAgICAgICBzaW1wbGVBYnNJbXBsQ1BVKHRoaXMudGV4RGF0YS5nZXQoeC5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5KTtcbiAgICAgIHJldHVybiB0aGlzLm1ha2VPdXRwdXQoeC5zaGFwZSwgeC5kdHlwZSwgb3V0VmFsdWVzKTtcbiAgICB9XG5cbiAgICBpZiAoZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUEFDS19VTkFSWV9PUEVSQVRJT05TJykpIHtcbiAgICAgIHJldHVybiB0aGlzLnBhY2tlZFVuYXJ5T3AoeCwgdW5hcnlfb3AuQUJTLCB4LmR0eXBlKSBhcyBUO1xuICAgIH1cblxuICAgIGNvbnN0IHByb2dyYW0gPSBuZXcgVW5hcnlPcFByb2dyYW0oeC5zaGFwZSwgdW5hcnlfb3AuQUJTKTtcbiAgICBjb25zdCBvdXRJbmZvID0gdGhpcy5jb21waWxlQW5kUnVuKHByb2dyYW0sIFt4XSk7XG4gICAgcmV0dXJuIGVuZ2luZSgpLm1ha2VUZW5zb3JGcm9tRGF0YUlkKFxuICAgICAgICAgICAgICAgb3V0SW5mby5kYXRhSWQsIG91dEluZm8uc2hhcGUsIG91dEluZm8uZHR5cGUpIGFzIFQ7XG4gIH1cblxuICBtYWtlVGVuc29ySW5mbyhcbiAgICAgIHNoYXBlOiBudW1iZXJbXSwgZHR5cGU6IERhdGFUeXBlLFxuICAgICAgdmFsdWVzPzogQmFja2VuZFZhbHVlc3xzdHJpbmdbXSk6IFRlbnNvckluZm8ge1xuICAgIGxldCBkYXRhSWQ7XG4gICAgaWYgKGR0eXBlID09PSAnc3RyaW5nJyAmJiB2YWx1ZXMgIT0gbnVsbCAmJiB2YWx1ZXMubGVuZ3RoID4gMCAmJlxuICAgICAgICB1dGlsLmlzU3RyaW5nKHZhbHVlc1swXSkpIHtcbiAgICAgIGNvbnN0IGVuY29kZWRWYWx1ZXMgPVxuICAgICAgICAgICh2YWx1ZXMgYXMge30gYXMgc3RyaW5nW10pLm1hcChkID0+IHV0aWwuZW5jb2RlU3RyaW5nKGQpKTtcblxuICAgICAgZGF0YUlkID0gdGhpcy53cml0ZShlbmNvZGVkVmFsdWVzLCBzaGFwZSwgZHR5cGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXRhSWQgPSB0aGlzLndyaXRlKHZhbHVlcyBhcyBUeXBlZEFycmF5LCBzaGFwZSwgZHR5cGUpO1xuICAgIH1cblxuICAgIHRoaXMudGV4RGF0YS5nZXQoZGF0YUlkKS51c2FnZSA9IG51bGw7XG4gICAgcmV0dXJuIHtkYXRhSWQsIHNoYXBlLCBkdHlwZX07XG4gIH1cblxuICBwcml2YXRlIG1ha2VPdXRwdXQ8VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgICBzaGFwZTogbnVtYmVyW10sIGR0eXBlOiBEYXRhVHlwZSwgdmFsdWVzPzogQmFja2VuZFZhbHVlcyk6IFQge1xuICAgIGNvbnN0IHtkYXRhSWR9ID0gdGhpcy5tYWtlVGVuc29ySW5mbyhzaGFwZSwgZHR5cGUsIHZhbHVlcyk7XG4gICAgcmV0dXJuIGVuZ2luZSgpLm1ha2VUZW5zb3JGcm9tRGF0YUlkKGRhdGFJZCwgc2hhcGUsIGR0eXBlLCB0aGlzKSBhcyBUO1xuICB9XG5cbiAgdW5wYWNrVGVuc29yKGlucHV0OiBUZW5zb3JJbmZvKTogVGVuc29ySW5mbyB7XG4gICAgY29uc3QgcHJvZ3JhbSA9IG5ldyBVbnBhY2tQcm9ncmFtKGlucHV0LnNoYXBlKTtcbiAgICByZXR1cm4gdGhpcy5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW2lucHV0XSwgaW5wdXQuZHR5cGUpO1xuICB9XG5cbiAgcGFja1RlbnNvcihpbnB1dDogVGVuc29ySW5mbyk6IFRlbnNvckluZm8ge1xuICAgIGNvbnN0IHByb2dyYW0gPSBuZXcgUGFja1Byb2dyYW0oaW5wdXQuc2hhcGUpO1xuICAgIGNvbnN0IHByZXZlbnRFYWdlclVucGFja2luZ091dHB1dCA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXMucnVuV2ViR0xQcm9ncmFtKFxuICAgICAgICBwcm9ncmFtLCBbaW5wdXRdLCBpbnB1dC5kdHlwZSwgbnVsbCAvKiBjdXN0b21Vbmlmb3JtVmFsdWVzICovLFxuICAgICAgICBwcmV2ZW50RWFnZXJVbnBhY2tpbmdPdXRwdXQpO1xuICB9XG5cbiAgcHJpdmF0ZSBwYWNrZWRSZXNoYXBlKGlucHV0OiBUZW5zb3JJbmZvLCBhZnRlclNoYXBlOiBudW1iZXJbXSk6IFRlbnNvckluZm8ge1xuICAgIGNvbnN0IGlucHV0M0RTaGFwZSA9IFtcbiAgICAgIHdlYmdsX3V0aWwuZ2V0QmF0Y2hEaW0oaW5wdXQuc2hhcGUpLFxuICAgICAgLi4ud2ViZ2xfdXRpbC5nZXRSb3dzQ29scyhpbnB1dC5zaGFwZSlcbiAgICBdIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcbiAgICBjb25zdCBpbnB1dDNEOiBUZW5zb3JJbmZvID0ge1xuICAgICAgZHR5cGU6IGlucHV0LmR0eXBlLFxuICAgICAgc2hhcGU6IGlucHV0M0RTaGFwZSxcbiAgICAgIGRhdGFJZDogaW5wdXQuZGF0YUlkXG4gICAgfTtcbiAgICBjb25zdCBhZnRlclNoYXBlQXMzRCA9IFtcbiAgICAgIHdlYmdsX3V0aWwuZ2V0QmF0Y2hEaW0oYWZ0ZXJTaGFwZSksIC4uLndlYmdsX3V0aWwuZ2V0Um93c0NvbHMoYWZ0ZXJTaGFwZSlcbiAgICBdIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcblxuICAgIGNvbnN0IHByb2dyYW0gPSBuZXcgUmVzaGFwZVBhY2tlZFByb2dyYW0oYWZ0ZXJTaGFwZUFzM0QsIGlucHV0M0RTaGFwZSk7XG4gICAgY29uc3QgcHJldmVudEVhZ2VyVW5wYWNraW5nT2ZPdXRwdXQgPSB0cnVlO1xuICAgIGNvbnN0IGN1c3RvbVZhbHVlcyA9IFtpbnB1dDNEU2hhcGVdO1xuICAgIGNvbnN0IG91dHB1dCA9IHRoaXMucnVuV2ViR0xQcm9ncmFtKFxuICAgICAgICBwcm9ncmFtLCBbaW5wdXQzRF0sIGlucHV0LmR0eXBlLCBjdXN0b21WYWx1ZXMsXG4gICAgICAgIHByZXZlbnRFYWdlclVucGFja2luZ09mT3V0cHV0KTtcbiAgICByZXR1cm4ge2RhdGFJZDogb3V0cHV0LmRhdGFJZCwgc2hhcGU6IGFmdGVyU2hhcGUsIGR0eXBlOiBvdXRwdXQuZHR5cGV9O1xuICB9XG5cbiAgcHJpdmF0ZSBkZWNvZGUoZGF0YUlkOiBEYXRhSWQpOiBUZW5zb3JJbmZvIHtcbiAgICBjb25zdCB0ZXhEYXRhID0gdGhpcy50ZXhEYXRhLmdldChkYXRhSWQpO1xuICAgIGNvbnN0IHtpc1BhY2tlZCwgc2hhcGUsIGR0eXBlfSA9IHRleERhdGE7XG4gICAgY29uc3Qgc2hhcGVBczNEID1cbiAgICAgICAgd2ViZ2xfdXRpbC5nZXRTaGFwZUFzM0Qoc2hhcGUpIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcbiAgICBsZXQgcHJvZ3JhbTtcbiAgICBjb25zdCBkZW5zZVRleFNoYXBlID0gdGV4X3V0aWwuZ2V0RGVuc2VUZXhTaGFwZShzaGFwZUFzM0QpO1xuICAgIGlmIChpc1BhY2tlZCkge1xuICAgICAgcHJvZ3JhbSA9IG5ldyBEZWNvZGVNYXRyaXhQYWNrZWRQcm9ncmFtKHNoYXBlQXMzRCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2dyYW0gPSBuZXcgRGVjb2RlTWF0cml4UHJvZ3JhbShzaGFwZUFzM0QpO1xuICAgIH1cbiAgICBjb25zdCBwcmV2ZW50RWFnZXJVbnBhY2tpbmdPZk91dHB1dCA9IHRydWU7XG4gICAgY29uc3QgY3VzdG9tVmFsdWVzID0gW2RlbnNlVGV4U2hhcGVdO1xuICAgIGNvbnN0IG91dCA9IHRoaXMucnVuV2ViR0xQcm9ncmFtKFxuICAgICAgICBwcm9ncmFtLCBbe3NoYXBlOiBzaGFwZUFzM0QsIGR0eXBlLCBkYXRhSWR9XSwgZHR5cGUsIGN1c3RvbVZhbHVlcyxcbiAgICAgICAgcHJldmVudEVhZ2VyVW5wYWNraW5nT2ZPdXRwdXQpO1xuICAgIHJldHVybiB7ZHR5cGUsIHNoYXBlLCBkYXRhSWQ6IG91dC5kYXRhSWR9O1xuICB9XG5cbiAgcnVuV2ViR0xQcm9ncmFtKFxuICAgICAgcHJvZ3JhbTogR1BHUFVQcm9ncmFtLCBpbnB1dHM6IFRlbnNvckluZm9bXSwgb3V0cHV0RHR5cGU6IERhdGFUeXBlLFxuICAgICAgY3VzdG9tVW5pZm9ybVZhbHVlcz86IG51bWJlcltdW10sXG4gICAgICBwcmV2ZW50RWFnZXJVbnBhY2tpbmdPZk91dHB1dCA9IGZhbHNlKTogVGVuc29ySW5mbyB7XG4gICAgY29uc3Qgb3V0cHV0ID0gdGhpcy5tYWtlVGVuc29ySW5mbyhwcm9ncmFtLm91dHB1dFNoYXBlLCBvdXRwdXREdHlwZSk7XG4gICAgY29uc3Qgb3V0RGF0YSA9IHRoaXMudGV4RGF0YS5nZXQob3V0cHV0LmRhdGFJZCk7XG4gICAgaWYgKHByb2dyYW0ucGFja2VkT3V0cHV0KSB7XG4gICAgICBvdXREYXRhLmlzUGFja2VkID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHByb2dyYW0ub3V0UGFja2luZ1NjaGVtZSA9PT0gdGV4X3V0aWwuUGFja2luZ1NjaGVtZS5ERU5TRSkge1xuICAgICAgY29uc3QgdGV4ZWxTaGFwZSA9IHRleF91dGlsLmdldERlbnNlVGV4U2hhcGUocHJvZ3JhbS5vdXRwdXRTaGFwZSk7XG4gICAgICAvLyBGb3IgYSBkZW5zZWx5IHBhY2tlZCBvdXRwdXQsIHdlIGV4cGxpY2l0bHkgc2V0IHRleFNoYXBlXG4gICAgICAvLyBzbyBpdCBkb2Vzbid0IGdldCBhc3NpZ25lZCBsYXRlciBhY2NvcmRpbmcgdG8gb3VyIHR5cGljYWwgcGFja2luZ1xuICAgICAgLy8gc2NoZW1lIHdoZXJlaW4gYSBzaW5nbGUgdGV4ZWwgY2FuIG9ubHkgY29udGFpbiB2YWx1ZXMgZnJvbSBhZGphY2VudFxuICAgICAgLy8gcm93cy9jb2xzLlxuICAgICAgb3V0RGF0YS50ZXhTaGFwZSA9IHRleGVsU2hhcGUubWFwKGQgPT4gZCAqIDIpIGFzIFtudW1iZXIsIG51bWJlcl07XG4gICAgfVxuICAgIGlmIChwcm9ncmFtLm91dFRleFVzYWdlICE9IG51bGwpIHtcbiAgICAgIG91dERhdGEudXNhZ2UgPSBwcm9ncmFtLm91dFRleFVzYWdlO1xuICAgIH1cbiAgICBpZiAodXRpbC5zaXplRnJvbVNoYXBlKG91dHB1dC5zaGFwZSkgPT09IDApIHtcbiAgICAgIC8vIFNob3J0LWNpcmN1aXQgdGhlIGNvbXB1dGF0aW9uIHNpbmNlIHRoZSByZXN1bHQgaXMgZW1wdHkgKGhhcyAwIGluIGl0c1xuICAgICAgLy8gc2hhcGUpLlxuICAgICAgb3V0RGF0YS52YWx1ZXMgPVxuICAgICAgICAgIHV0aWwuZ2V0VHlwZWRBcnJheUZyb21EVHlwZShvdXRwdXQuZHR5cGUgYXMgJ2Zsb2F0MzInLCAwKTtcbiAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YVRvRGlzcG9zZTogVGVuc29ySW5mb1tdID0gW107XG4gICAgY29uc3QgaW5wdXRzRGF0YTogVGVuc29yRGF0YVtdID0gaW5wdXRzLm1hcChpbnB1dCA9PiB7XG4gICAgICBpZiAoaW5wdXQuZHR5cGUgPT09ICdjb21wbGV4NjQnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBHUEdQVVByb2dyYW0gZG9lcyBub3Qgc3VwcG9ydCBjb21wbGV4NjQgaW5wdXQuIEZvciBjb21wbGV4NjQgYCArXG4gICAgICAgICAgICBgZHR5cGVzLCBwbGVhc2Ugc2VwYXJhdGUgdGhlIHByb2dyYW0gaW50byByZWFsIGFuZCBpbWFnaW5hcnkgYCArXG4gICAgICAgICAgICBgcGFydHMuYCk7XG4gICAgICB9XG5cbiAgICAgIGxldCB0ZXhEYXRhID0gdGhpcy50ZXhEYXRhLmdldChpbnB1dC5kYXRhSWQpO1xuXG4gICAgICBpZiAodGV4RGF0YS50ZXh0dXJlID09IG51bGwpIHtcbiAgICAgICAgaWYgKCFwcm9ncmFtLnBhY2tlZElucHV0cyAmJlxuICAgICAgICAgICAgdXRpbC5zaXplRnJvbVNoYXBlKGlucHV0LnNoYXBlKSA8PVxuICAgICAgICAgICAgICAgIGVudigpLmdldE51bWJlcignV0VCR0xfU0laRV9VUExPQURfVU5JRk9STScpKSB7XG4gICAgICAgICAgLy8gVXBsb2FkIHNtYWxsIHRlbnNvcnMgdGhhdCBsaXZlIG9uIHRoZSBDUFUgYXMgdW5pZm9ybXMsIG5vdCBhc1xuICAgICAgICAgIC8vIHRleHR1cmVzLiBEbyB0aGlzIG9ubHkgd2hlbiB0aGUgZW52aXJvbm1lbnQgc3VwcG9ydHMgMzJiaXQgZmxvYXRzXG4gICAgICAgICAgLy8gZHVlIHRvIHByb2JsZW1zIHdoZW4gY29tcGFyaW5nIDE2Yml0IGZsb2F0cyB3aXRoIDMyYml0IGZsb2F0cy5cbiAgICAgICAgICAvLyBUT0RPKGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RmanMvaXNzdWVzLzgyMSk6IE1ha2UgaXRcbiAgICAgICAgICAvLyBwb3NzaWJsZSBmb3IgcGFja2VkIHNoYWRlcnMgdG8gc2FtcGxlIGZyb20gdW5pZm9ybXMuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNoYXBlOiBpbnB1dC5zaGFwZSxcbiAgICAgICAgICAgIHRleERhdGE6IG51bGwsXG4gICAgICAgICAgICBpc1VuaWZvcm06IHRydWUsXG4gICAgICAgICAgICB1bmlmb3JtVmFsdWVzOiB0ZXhEYXRhLnZhbHVlcyBhcyBUeXBlZEFycmF5XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoaXMgZW5zdXJlcyB0aGF0IGlmIGEgcGFja2VkIHByb2dyYW0ncyBpbnB1dHMgaGF2ZSBub3QgeWV0IGJlZW5cbiAgICAgICAgLy8gdXBsb2FkZWQgdG8gdGhlIEdQVSwgdGhleSBnZXQgdXBsb2FkZWQgYXMgcGFja2VkIHJpZ2h0IG9mZiB0aGUgYmF0LlxuICAgICAgICBpZiAocHJvZ3JhbS5wYWNrZWRJbnB1dHMpIHtcbiAgICAgICAgICB0ZXhEYXRhLmlzUGFja2VkID0gdHJ1ZTtcbiAgICAgICAgICB0ZXhEYXRhLnNoYXBlID0gaW5wdXQuc2hhcGU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoISF0ZXhEYXRhLmlzUGFja2VkICE9PSAhIXByb2dyYW0ucGFja2VkSW5wdXRzKSB7XG4gICAgICAgIGlucHV0ID0gdGV4RGF0YS5pc1BhY2tlZCA/IHRoaXMudW5wYWNrVGVuc29yKGlucHV0KSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFja1RlbnNvcihpbnB1dCk7XG4gICAgICAgIGRhdGFUb0Rpc3Bvc2UucHVzaChpbnB1dCk7XG4gICAgICAgIHRleERhdGEgPSB0aGlzLnRleERhdGEuZ2V0KGlucHV0LmRhdGFJZCk7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIHRleERhdGEuaXNQYWNrZWQgJiZcbiAgICAgICAgICAhd2ViZ2xfdXRpbC5pc1Jlc2hhcGVGcmVlKHRleERhdGEuc2hhcGUsIGlucHV0LnNoYXBlKSkge1xuICAgICAgICAvLyBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlIHdoZXJlIGEgdGV4dHVyZSBleGlzdHMgZm9yIGEgdGVuc29yXG4gICAgICAgIC8vIGJ1dCB0aGUgc2hhcGVzIGFyZSBpbmNvbXBhdGlibGUgKGR1ZSB0byBwYWNraW5nIGNvbnN0cmFpbnRzKSBiZWNhdXNlXG4gICAgICAgIC8vIHRoZSB0ZW5zb3IgZGlkIG5vdCBoYXZlIGEgY2hhbmNlIHRvIGdvIHRocm91Z2ggdGhlIHBhY2tlZCByZXNoYXBlXG4gICAgICAgIC8vIHNoYWRlci4gVGhpcyBvbmx5IGhhcHBlbnMgd2hlbiB3ZSByZXNoYXBlIHRoZSAqc2FtZSogdGVuc29yIHRvIGZvcm1cbiAgICAgICAgLy8gKmRpc3RpbmN0KiBpbnB1dHMgdG8gYW4gb3AsIGUuZy4gZG90dGluZyBhIHZlY3RvciB3aXRoIGl0c2VsZi4gVGhpc1xuICAgICAgICAvLyBjYXNlIHdpbGwgZGlzYXBwZWFyIG9uY2UgcGFja2VkIHVwbG9hZGluZyBpcyB0aGUgZGVmYXVsdC5cblxuICAgICAgICBjb25zdCBzYXZlZElucHV0ID0gaW5wdXQ7XG4gICAgICAgIGNvbnN0IHRhcmdldFNoYXBlID0gaW5wdXQuc2hhcGU7XG5cbiAgICAgICAgaW5wdXQuc2hhcGUgPSB0ZXhEYXRhLnNoYXBlO1xuICAgICAgICBpbnB1dCA9IHRoaXMucGFja2VkUmVzaGFwZShpbnB1dCBhcyBUZW5zb3IsIHRhcmdldFNoYXBlKTtcbiAgICAgICAgZGF0YVRvRGlzcG9zZS5wdXNoKGlucHV0KTtcbiAgICAgICAgdGV4RGF0YSA9IHRoaXMudGV4RGF0YS5nZXQoaW5wdXQuZGF0YUlkKTtcblxuICAgICAgICBzYXZlZElucHV0LnNoYXBlID0gdGFyZ2V0U2hhcGU7XG4gICAgICB9XG5cbiAgICAgIHRoaXMudXBsb2FkVG9HUFUoaW5wdXQuZGF0YUlkKTtcbiAgICAgIHJldHVybiB7c2hhcGU6IGlucHV0LnNoYXBlLCB0ZXhEYXRhLCBpc1VuaWZvcm06IGZhbHNlfTtcbiAgICB9KTtcblxuICAgIHRoaXMudXBsb2FkVG9HUFUob3V0cHV0LmRhdGFJZCk7XG4gICAgY29uc3Qgb3V0cHV0RGF0YTpcbiAgICAgICAgVGVuc29yRGF0YSA9IHtzaGFwZTogb3V0cHV0LnNoYXBlLCB0ZXhEYXRhOiBvdXREYXRhLCBpc1VuaWZvcm06IGZhbHNlfTtcbiAgICBjb25zdCBrZXkgPSBncGdwdV9tYXRoLm1ha2VTaGFkZXJLZXkocHJvZ3JhbSwgaW5wdXRzRGF0YSwgb3V0cHV0RGF0YSk7XG4gICAgY29uc3QgYmluYXJ5ID0gdGhpcy5nZXRBbmRTYXZlQmluYXJ5KGtleSwgKCkgPT4ge1xuICAgICAgcmV0dXJuIGdwZ3B1X21hdGguY29tcGlsZVByb2dyYW0oXG4gICAgICAgICAgdGhpcy5ncGdwdSwgcHJvZ3JhbSwgaW5wdXRzRGF0YSwgb3V0cHV0RGF0YSk7XG4gICAgfSk7XG4gICAgY29uc3Qgc2hvdWxkVGltZVByb2dyYW0gPSB0aGlzLmFjdGl2ZVRpbWVycyAhPSBudWxsO1xuICAgIGxldCBxdWVyeTogV2ViR0xRdWVyeXxDUFVUaW1lclF1ZXJ5O1xuICAgIGlmIChzaG91bGRUaW1lUHJvZ3JhbSkge1xuICAgICAgcXVlcnkgPSB0aGlzLnN0YXJ0VGltZXIoKTtcbiAgICB9XG5cbiAgICBncGdwdV9tYXRoLnJ1blByb2dyYW0oXG4gICAgICAgIHRoaXMuZ3BncHUsIGJpbmFyeSwgaW5wdXRzRGF0YSwgb3V0cHV0RGF0YSwgY3VzdG9tVW5pZm9ybVZhbHVlcyk7XG5cbiAgICBkYXRhVG9EaXNwb3NlLmZvckVhY2goaW5mbyA9PiB0aGlzLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGluZm8pKTtcblxuICAgIGlmIChzaG91bGRUaW1lUHJvZ3JhbSkge1xuICAgICAgcXVlcnkgPSB0aGlzLmVuZFRpbWVyKHF1ZXJ5KTtcbiAgICAgIHRoaXMuYWN0aXZlVGltZXJzLnB1c2goXG4gICAgICAgICAge25hbWU6IHByb2dyYW0uY29uc3RydWN0b3IubmFtZSwgcXVlcnk6IHRoaXMuZ2V0UXVlcnlUaW1lKHF1ZXJ5KX0pO1xuICAgIH1cblxuICAgIGNvbnN0IGdsRmx1c2hUaHJlc2hvbGQgPSBlbnYoKS5nZXQoJ1dFQkdMX0ZMVVNIX1RIUkVTSE9MRCcpO1xuICAgIC8vIE1hbnVhbGx5IEdMIGZsdXNoIHJlcXVlc3RlZFxuICAgIGlmIChnbEZsdXNoVGhyZXNob2xkID4gMCkge1xuICAgICAgY29uc3QgdGltZSA9IHV0aWwubm93KCk7XG4gICAgICBpZiAoKHRpbWUgLSB0aGlzLmxhc3RHbEZsdXNoVGltZSkgPiBnbEZsdXNoVGhyZXNob2xkKSB7XG4gICAgICAgIHRoaXMuZ3BncHUuZ2wuZmx1c2goKTtcbiAgICAgICAgdGhpcy5sYXN0R2xGbHVzaFRpbWUgPSB0aW1lO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghZW52KCkuZ2V0Qm9vbCgnV0VCR0xfTEFaSUxZX1VOUEFDSycpICYmIG91dERhdGEuaXNQYWNrZWQgJiZcbiAgICAgICAgcHJldmVudEVhZ2VyVW5wYWNraW5nT2ZPdXRwdXQgPT09IGZhbHNlKSB7XG4gICAgICBjb25zdCB1bnBhY2tlZCA9IHRoaXMudW5wYWNrVGVuc29yKG91dHB1dCk7XG4gICAgICB0aGlzLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKG91dHB1dCk7XG4gICAgICByZXR1cm4gdW5wYWNrZWQ7XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXQ7XG4gIH1cblxuICBjb21waWxlQW5kUnVuKFxuICAgICAgcHJvZ3JhbTogR1BHUFVQcm9ncmFtLCBpbnB1dHM6IFRlbnNvckluZm9bXSwgb3V0cHV0RHR5cGU/OiBEYXRhVHlwZSxcbiAgICAgIGN1c3RvbVVuaWZvcm1WYWx1ZXM/OiBudW1iZXJbXVtdLFxuICAgICAgcHJldmVudEVhZ2VyVW5wYWNraW5nT2ZPdXRwdXQgPSBmYWxzZSk6IFRlbnNvckluZm8ge1xuICAgIG91dHB1dER0eXBlID0gb3V0cHV0RHR5cGUgfHwgaW5wdXRzWzBdLmR0eXBlO1xuICAgIGNvbnN0IG91dEluZm8gPSB0aGlzLnJ1bldlYkdMUHJvZ3JhbShcbiAgICAgICAgcHJvZ3JhbSwgaW5wdXRzLCBvdXRwdXREdHlwZSwgY3VzdG9tVW5pZm9ybVZhbHVlcyxcbiAgICAgICAgcHJldmVudEVhZ2VyVW5wYWNraW5nT2ZPdXRwdXQpO1xuICAgIHJldHVybiBvdXRJbmZvO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRBbmRTYXZlQmluYXJ5KGtleTogc3RyaW5nLCBnZXRCaW5hcnk6ICgpID0+IEdQR1BVQmluYXJ5KTpcbiAgICAgIEdQR1BVQmluYXJ5IHtcbiAgICBpZiAoIShrZXkgaW4gdGhpcy5iaW5hcnlDYWNoZSkpIHtcbiAgICAgIHRoaXMuYmluYXJ5Q2FjaGVba2V5XSA9IGdldEJpbmFyeSgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5iaW5hcnlDYWNoZVtrZXldO1xuICB9XG5cbiAgZ2V0VGV4dHVyZU1hbmFnZXIoKTogVGV4dHVyZU1hbmFnZXIge1xuICAgIHJldHVybiB0aGlzLnRleHR1cmVNYW5hZ2VyO1xuICB9XG5cbiAgcHJpdmF0ZSBkaXNwb3NlZCA9IGZhbHNlO1xuXG4gIGRpc3Bvc2UoKSB7XG4gICAgaWYgKHRoaXMuZGlzcG9zZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gQXZvaWQgZGlzcG9zaW5nIHRoZSBjb21waWxlZCB3ZWJnbCBwcm9ncmFtcyBkdXJpbmcgdW5pdCB0ZXN0aW5nIGJlY2F1c2VcbiAgICAvLyBpdCBzbG93cyBkb3duIHRlc3QgZXhlY3V0aW9uLlxuICAgIGlmICghZW52KCkuZ2V0Qm9vbCgnSVNfVEVTVCcpKSB7XG4gICAgICBjb25zdCBhbGxLZXlzID0gT2JqZWN0LmtleXModGhpcy5iaW5hcnlDYWNoZSk7XG4gICAgICBhbGxLZXlzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgdGhpcy5ncGdwdS5kZWxldGVQcm9ncmFtKHRoaXMuYmluYXJ5Q2FjaGVba2V5XS53ZWJHTFByb2dyYW0pO1xuICAgICAgICBkZWxldGUgdGhpcy5iaW5hcnlDYWNoZVtrZXldO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMudGV4dHVyZU1hbmFnZXIuZGlzcG9zZSgpO1xuICAgIGlmICh0aGlzLmNhbnZhcyAhPSBudWxsICYmXG4gICAgICAgICh0eXBlb2YgKEhUTUxDYW52YXNFbGVtZW50KSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgIHRoaXMuY2FudmFzIGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQpKSB7XG4gICAgICB0aGlzLmNhbnZhcy5yZW1vdmUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jYW52YXMgPSBudWxsO1xuICAgIH1cbiAgICBpZiAodGhpcy5ncGdwdUNyZWF0ZWRMb2NhbGx5KSB7XG4gICAgICB0aGlzLmdwZ3B1LnByb2dyYW0gPSBudWxsO1xuICAgICAgdGhpcy5ncGdwdS5kaXNwb3NlKCk7XG4gICAgfVxuICAgIHRoaXMuZGlzcG9zZWQgPSB0cnVlO1xuICB9XG5cbiAgZmxvYXRQcmVjaXNpb24oKTogMTZ8MzIge1xuICAgIGlmICh0aGlzLmZsb2F0UHJlY2lzaW9uVmFsdWUgPT0gbnVsbCkge1xuICAgICAgdGhpcy5mbG9hdFByZWNpc2lvblZhbHVlID0gdGlkeSgoKSA9PiB7XG4gICAgICAgIGlmICghZW52KCkuZ2V0KCdXRUJHTF9SRU5ERVJfRkxPQVQzMl9FTkFCTEVEJykpIHtcbiAgICAgICAgICAvLyBNb21lbnRhcmlseSBzd2l0Y2hpbmcgREVCVUcgZmxhZyB0byBmYWxzZSBzbyB3ZSBkb24ndCB0aHJvdyBhblxuICAgICAgICAgIC8vIGVycm9yIHRyeWluZyB0byB1cGxvYWQgYSBzbWFsbCB2YWx1ZS5cbiAgICAgICAgICBjb25zdCBkZWJ1Z0ZsYWcgPSBlbnYoKS5nZXRCb29sKCdERUJVRycpO1xuICAgICAgICAgIGVudigpLnNldCgnREVCVUcnLCBmYWxzZSk7XG4gICAgICAgICAgY29uc3QgdW5kZXJmbG93Q2hlY2tWYWx1ZSA9IHRoaXMuYWJzKHNjYWxhcigxZS04KSkuZGF0YVN5bmMoKVswXTtcbiAgICAgICAgICBlbnYoKS5zZXQoJ0RFQlVHJywgZGVidWdGbGFnKTtcblxuICAgICAgICAgIGlmICh1bmRlcmZsb3dDaGVja1ZhbHVlID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIDMyO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMTY7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZmxvYXRQcmVjaXNpb25WYWx1ZTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBzbWFsbGVzdCByZXByZXNlbnRhYmxlIG51bWJlci4gICovXG4gIGVwc2lsb24oKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5mbG9hdFByZWNpc2lvbigpID09PSAzMiA/IEVQU0lMT05fRkxPQVQzMiA6IEVQU0lMT05fRkxPQVQxNjtcbiAgfVxuXG4gIHVwbG9hZFRvR1BVKGRhdGFJZDogRGF0YUlkKTogdm9pZCB7XG4gICAgY29uc3QgdGV4RGF0YSA9IHRoaXMudGV4RGF0YS5nZXQoZGF0YUlkKTtcbiAgICBjb25zdCB7c2hhcGUsIGR0eXBlLCB2YWx1ZXMsIHRleHR1cmUsIHVzYWdlLCBpc1BhY2tlZH0gPSB0ZXhEYXRhO1xuXG4gICAgaWYgKHRleHR1cmUgIT0gbnVsbCkge1xuICAgICAgLy8gQXJyYXkgaXMgYWxyZWFkeSBvbiBHUFUuIE5vLW9wLlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzaG91bGRUaW1lUHJvZ3JhbSA9IHRoaXMuYWN0aXZlVGltZXJzICE9IG51bGw7XG4gICAgbGV0IHN0YXJ0OiBudW1iZXI7XG4gICAgaWYgKHNob3VsZFRpbWVQcm9ncmFtKSB7XG4gICAgICBzdGFydCA9IHV0aWwubm93KCk7XG4gICAgfVxuXG4gICAgbGV0IHRleFNoYXBlID0gdGV4RGF0YS50ZXhTaGFwZTtcbiAgICBpZiAodGV4U2hhcGUgPT0gbnVsbCkge1xuICAgICAgdGV4U2hhcGUgPSB3ZWJnbF91dGlsLmdldFRleHR1cmVTaGFwZUZyb21Mb2dpY2FsU2hhcGUoc2hhcGUsIGlzUGFja2VkKTtcbiAgICAgIHRleERhdGEudGV4U2hhcGUgPSB0ZXhTaGFwZTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWVzICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IHNoYXBlQXMzRCA9IHdlYmdsX3V0aWwuZ2V0U2hhcGVBczNEKHNoYXBlKTtcblxuICAgICAgbGV0IHByb2dyYW07XG4gICAgICBsZXQgd2lkdGggPSB0ZXhTaGFwZVsxXSwgaGVpZ2h0ID0gdGV4U2hhcGVbMF07XG4gICAgICBjb25zdCBpc0J5dGVBcnJheSA9IHZhbHVlcyBpbnN0YW5jZW9mIFVpbnQ4QXJyYXk7XG5cbiAgICAgIGlmIChpc1BhY2tlZCkge1xuICAgICAgICBbd2lkdGgsIGhlaWdodF0gPSB0ZXhfdXRpbC5nZXRQYWNrZWRNYXRyaXhUZXh0dXJlU2hhcGVXaWR0aEhlaWdodChcbiAgICAgICAgICAgIHRleFNoYXBlWzBdLCB0ZXhTaGFwZVsxXSk7XG4gICAgICAgIHByb2dyYW0gPSBuZXcgRW5jb2RlTWF0cml4UGFja2VkUHJvZ3JhbShzaGFwZUFzM0QsIGlzQnl0ZUFycmF5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHByb2dyYW0gPSBuZXcgRW5jb2RlTWF0cml4UHJvZ3JhbShzaGFwZUFzM0QsIGlzQnl0ZUFycmF5KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdGVtcERlbnNlSW5wdXRIYW5kbGUgPSB0aGlzLm1ha2VUZW5zb3JJbmZvKFtoZWlnaHQsIHdpZHRoXSwgZHR5cGUpO1xuICAgICAgaWYgKGlzQnl0ZUFycmF5KSB7XG4gICAgICAgIHRoaXMudGV4RGF0YS5nZXQodGVtcERlbnNlSW5wdXRIYW5kbGUuZGF0YUlkKS51c2FnZSA9XG4gICAgICAgICAgICBUZXh0dXJlVXNhZ2UuUElYRUxTO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy50ZXhEYXRhLmdldCh0ZW1wRGVuc2VJbnB1dEhhbmRsZS5kYXRhSWQpLnVzYWdlID1cbiAgICAgICAgICAgIFRleHR1cmVVc2FnZS5VUExPQUQ7XG4gICAgICB9XG4gICAgICB0aGlzLmdwZ3B1LnVwbG9hZERlbnNlTWF0cml4VG9UZXh0dXJlKFxuICAgICAgICAgIHRoaXMuZ2V0VGV4dHVyZSh0ZW1wRGVuc2VJbnB1dEhhbmRsZS5kYXRhSWQpLCB3aWR0aCwgaGVpZ2h0LFxuICAgICAgICAgIHZhbHVlcyBhcyBUeXBlZEFycmF5KTtcblxuICAgICAgY29uc3QgY3VzdG9tVmFsdWVzID0gW1toZWlnaHQsIHdpZHRoXV07XG4gICAgICAvLyBXZSB3YW50IHRoZSBvdXRwdXQgdG8gcmVtYWluIHBhY2tlZCByZWdhcmRsZXNzIG9mIHRoZSB2YWx1ZSBvZlxuICAgICAgLy8gV0VCR0xfUEFDSy5cbiAgICAgIGNvbnN0IHByZXZlbnRFYWdlclVucGFja2luZyA9IHRydWU7XG4gICAgICBjb25zdCBlbmNvZGVkT3V0cHV0VGFyZ2V0ID0gdGhpcy5ydW5XZWJHTFByb2dyYW0oXG4gICAgICAgICAgcHJvZ3JhbSwgW3RlbXBEZW5zZUlucHV0SGFuZGxlXSwgZHR5cGUsIGN1c3RvbVZhbHVlcyxcbiAgICAgICAgICBwcmV2ZW50RWFnZXJVbnBhY2tpbmcpO1xuXG4gICAgICAvLyBIYXZlIHRoZSBvcmlnaW5hbCB0ZXh0dXJlIGFzc3VtZSB0aGUgaWRlbnRpdHkgb2YgdGhlIGVuY29kZWQgb3V0cHV0LlxuICAgICAgY29uc3Qgb3V0cHV0VGV4RGF0YSA9IHRoaXMudGV4RGF0YS5nZXQoZW5jb2RlZE91dHB1dFRhcmdldC5kYXRhSWQpO1xuICAgICAgdGV4RGF0YS50ZXh0dXJlID0gb3V0cHV0VGV4RGF0YS50ZXh0dXJlO1xuICAgICAgdGV4RGF0YS50ZXhTaGFwZSA9IG91dHB1dFRleERhdGEudGV4U2hhcGU7XG4gICAgICB0ZXhEYXRhLmlzUGFja2VkID0gb3V0cHV0VGV4RGF0YS5pc1BhY2tlZDtcbiAgICAgIHRleERhdGEudXNhZ2UgPSBvdXRwdXRUZXhEYXRhLnVzYWdlO1xuXG4gICAgICB0aGlzLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHRlbXBEZW5zZUlucHV0SGFuZGxlKTtcbiAgICAgIHRoaXMudGV4RGF0YS5kZWxldGUoZW5jb2RlZE91dHB1dFRhcmdldC5kYXRhSWQpO1xuXG4gICAgICAvLyBPbmNlIHVwbG9hZGVkLCBkb24ndCBzdG9yZSB0aGUgdmFsdWVzIG9uIGNwdS5cbiAgICAgIHRleERhdGEudmFsdWVzID0gbnVsbDtcbiAgICAgIGlmIChzaG91bGRUaW1lUHJvZ3JhbSkge1xuICAgICAgICB0aGlzLnVwbG9hZFdhaXRNcyArPSB1dGlsLm5vdygpIC0gc3RhcnQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG5ld1RleHR1cmUgPSB0aGlzLmFjcXVpcmVUZXh0dXJlKHRleFNoYXBlLCB1c2FnZSwgZHR5cGUsIGlzUGFja2VkKTtcbiAgICAgIHRleERhdGEudGV4dHVyZSA9IG5ld1RleHR1cmU7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0QW5kQ2FjaGVPbkNQVShkYXRhSWQ6IERhdGFJZCwgZmxvYXQzMlZhbHVlcz86IEZsb2F0MzJBcnJheSk6XG4gICAgICBUeXBlZEFycmF5IHtcbiAgICBjb25zdCB0ZXhEYXRhID0gdGhpcy50ZXhEYXRhLmdldChkYXRhSWQpO1xuICAgIGNvbnN0IHtkdHlwZX0gPSB0ZXhEYXRhO1xuXG4gICAgdGhpcy5yZWxlYXNlR1BVRGF0YShkYXRhSWQpO1xuXG4gICAgaWYgKGZsb2F0MzJWYWx1ZXMgIT0gbnVsbCkge1xuICAgICAgdGV4RGF0YS52YWx1ZXMgPSBmbG9hdDMyVG9UeXBlZEFycmF5KGZsb2F0MzJWYWx1ZXMsIGR0eXBlIGFzICdmbG9hdDMyJyk7XG4gICAgfVxuICAgIHJldHVybiB0ZXhEYXRhLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuICB9XG5cbiAgcHJpdmF0ZSBhY3F1aXJlVGV4dHVyZShcbiAgICAgIHRleFNoYXBlOiBbbnVtYmVyLCBudW1iZXJdLCB0ZXhUeXBlOiBUZXh0dXJlVXNhZ2UsIGR0eXBlOiBEYXRhVHlwZSxcbiAgICAgIGlzUGFja2VkOiBib29sZWFuKTogV2ViR0xUZXh0dXJlIHtcbiAgICB0aGlzLm51bUJ5dGVzSW5HUFUgKz0gdGhpcy5jb21wdXRlQnl0ZXModGV4U2hhcGUsIGR0eXBlKTtcbiAgICBpZiAoIXRoaXMud2FybmVkQWJvdXRNZW1vcnkgJiZcbiAgICAgICAgdGhpcy5udW1CeXRlc0luR1BVID4gdGhpcy5udW1NQkJlZm9yZVdhcm5pbmcgKiAxMDI0ICogMTAyNCkge1xuICAgICAgY29uc3QgbWIgPSAodGhpcy5udW1CeXRlc0luR1BVIC8gMTAyNCAvIDEwMjQpLnRvRml4ZWQoMik7XG4gICAgICB0aGlzLndhcm5lZEFib3V0TWVtb3J5ID0gdHJ1ZTtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgSGlnaCBtZW1vcnkgdXNhZ2UgaW4gR1BVOiAke21ifSBNQiwgYCArXG4gICAgICAgICAgYG1vc3QgbGlrZWx5IGR1ZSB0byBhIG1lbW9yeSBsZWFrYCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnRleHR1cmVNYW5hZ2VyLmFjcXVpcmVUZXh0dXJlKHRleFNoYXBlLCB0ZXhUeXBlLCBpc1BhY2tlZCk7XG4gIH1cblxuICBwcml2YXRlIGNvbXB1dGVCeXRlcyhzaGFwZTogW251bWJlciwgbnVtYmVyXSwgZHR5cGU6IERhdGFUeXBlKSB7XG4gICAgcmV0dXJuIHNoYXBlWzBdICogc2hhcGVbMV0gKiB1dGlsLmJ5dGVzUGVyRWxlbWVudChkdHlwZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmxvYXQzMlRvVHlwZWRBcnJheTxEIGV4dGVuZHMgTnVtZXJpY0RhdGFUeXBlPihcbiAgICBhOiBGbG9hdDMyQXJyYXksIGR0eXBlOiBEKTogdGYuRGF0YVR5cGVNYXBbRF0ge1xuICBpZiAoZHR5cGUgPT09ICdmbG9hdDMyJyB8fCBkdHlwZSA9PT0gJ2NvbXBsZXg2NCcpIHtcbiAgICByZXR1cm4gYSBhcyB0Zi5EYXRhVHlwZU1hcFtEXTtcbiAgfSBlbHNlIGlmIChkdHlwZSA9PT0gJ2ludDMyJyB8fCBkdHlwZSA9PT0gJ2Jvb2wnKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gKGR0eXBlID09PSAnaW50MzInKSA/IG5ldyBJbnQzMkFycmF5KGEubGVuZ3RoKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBVaW50OEFycmF5KGEubGVuZ3RoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7ICsraSkge1xuICAgICAgcmVzdWx0W2ldID0gTWF0aC5yb3VuZChhW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdCBhcyB0Zi5EYXRhVHlwZU1hcFtEXTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gZHR5cGUgJHtkdHlwZX1gKTtcbiAgfVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vLyBiYXNlLnRzIGlzIHRoZSB3ZWJnbCBiYWNrZW5kIHdpdGhvdXQgYXV0byBrZXJuZWwgcmVnaXN0cmF0aW9uLlxuXG5pbXBvcnQge2RldmljZV91dGlsLCByZWdpc3RlckJhY2tlbmR9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4vYmFja2VuZF93ZWJnbCc7XG5leHBvcnQge3ZlcnNpb24gYXMgdmVyc2lvbl93ZWJnbH0gZnJvbSAnLi92ZXJzaW9uJztcblxuaWYgKGRldmljZV91dGlsLmlzQnJvd3NlcigpKSB7XG4gIHJlZ2lzdGVyQmFja2VuZCgnd2ViZ2wnLCAoKSA9PiBuZXcgTWF0aEJhY2tlbmRXZWJHTCgpLCAyIC8qIHByaW9yaXR5ICovKTtcbn1cblxuLy8gRXhwb3J0IHdlYmdsIHV0aWxpdGllc1xuZXhwb3J0ICogZnJvbSAnLi93ZWJnbCc7XG5cbi8vIEV4cG9ydCBmb3JjZUhhbGZGbG9zdCB1bmRlciB3ZWJnbCBuYW1lc3BhY2UgZm9yIHRoZSB1bmlvbiBidW5kbGUuXG5pbXBvcnQge2ZvcmNlSGFsZkZsb2F0fSBmcm9tICcuL3dlYmdsJztcbmV4cG9ydCBjb25zdCB3ZWJnbCA9IHtmb3JjZUhhbGZGbG9hdH07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5cbmV4cG9ydCBjbGFzcyBCYXRjaE5vcm1Qcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lczogc3RyaW5nW107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXSA9IFtdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgeFNoYXBlOiBudW1iZXJbXSwgbWVhblNoYXBlOiBudW1iZXJbXSwgdmFyaWFuY2VTaGFwZTogbnVtYmVyW10sXG4gICAgICBvZmZzZXRTaGFwZTogbnVtYmVyW118bnVsbCwgc2NhbGVTaGFwZTogbnVtYmVyW118bnVsbCxcbiAgICAgIHZhcmlhbmNlRXBzaWxvbjogbnVtYmVyKSB7XG4gICAgdGhpcy52YXJpYWJsZU5hbWVzID0gWyd4JywgJ21lYW4nLCAndmFyaWFuY2UnXTtcbiAgICBiYWNrZW5kX3V0aWwuYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoeFNoYXBlLCBtZWFuU2hhcGUpO1xuICAgIGJhY2tlbmRfdXRpbC5hc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSh4U2hhcGUsIHZhcmlhbmNlU2hhcGUpO1xuXG4gICAgbGV0IG9mZnNldFNuaXBwZXQgPSAnMC4wJztcbiAgICBpZiAob2Zmc2V0U2hhcGUgIT0gbnVsbCkge1xuICAgICAgYmFja2VuZF91dGlsLmFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKHhTaGFwZSwgb2Zmc2V0U2hhcGUpO1xuICAgICAgdGhpcy52YXJpYWJsZU5hbWVzLnB1c2goJ29mZnNldCcpO1xuICAgICAgb2Zmc2V0U25pcHBldCA9ICdnZXRPZmZzZXRBdE91dENvb3JkcygpJztcbiAgICB9XG5cbiAgICBsZXQgc2NhbGVTbmlwcGV0ID0gJzEuMCc7XG4gICAgaWYgKHNjYWxlU2hhcGUgIT0gbnVsbCkge1xuICAgICAgYmFja2VuZF91dGlsLmFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKHhTaGFwZSwgc2NhbGVTaGFwZSk7XG4gICAgICB0aGlzLnZhcmlhYmxlTmFtZXMucHVzaCgnc2NhbGUnKTtcbiAgICAgIHNjYWxlU25pcHBldCA9ICdnZXRTY2FsZUF0T3V0Q29vcmRzKCknO1xuICAgIH1cblxuICAgIHRoaXMub3V0cHV0U2hhcGUgPSB4U2hhcGU7XG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgZmxvYXQgeCA9IGdldFhBdE91dENvb3JkcygpO1xuICAgICAgICBmbG9hdCBtZWFuID0gZ2V0TWVhbkF0T3V0Q29vcmRzKCk7XG4gICAgICAgIGZsb2F0IHZhcmlhbmNlID0gZ2V0VmFyaWFuY2VBdE91dENvb3JkcygpO1xuICAgICAgICBmbG9hdCBvZmZzZXQgPSAke29mZnNldFNuaXBwZXR9O1xuICAgICAgICBmbG9hdCBzY2FsZSA9ICR7c2NhbGVTbmlwcGV0fTtcbiAgICAgICAgZmxvYXQgaW52ID0gc2NhbGUgKiBpbnZlcnNlc3FydCh2YXJpYW5jZSArIGZsb2F0KCR7dmFyaWFuY2VFcHNpbG9ufSkpO1xuICAgICAgICBzZXRPdXRwdXQoZG90KHZlYzMoeCwgLW1lYW4sIG9mZnNldCksIHZlYzMoaW52LCBpbnYsIDEpKSk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuXG5leHBvcnQgY2xhc3MgQmF0Y2hOb3JtUGFja2VkUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXM6IHN0cmluZ1tdO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIHBhY2tlZElucHV0cyA9IHRydWU7XG4gIHBhY2tlZE91dHB1dCA9IHRydWU7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICB4U2hhcGU6IG51bWJlcltdLCBtZWFuU2hhcGU6IG51bWJlcltdLCB2YXJpYW5jZVNoYXBlOiBudW1iZXJbXSxcbiAgICAgIG9mZnNldFNoYXBlOiBudW1iZXJbXXxudWxsLCBzY2FsZVNoYXBlOiBudW1iZXJbXXxudWxsLFxuICAgICAgdmFyaWFuY2VFcHNpbG9uOiBudW1iZXIpIHtcbiAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBbJ3gnLCAnbWVhbicsICd2YXJpYW5jZSddO1xuICAgIGJhY2tlbmRfdXRpbC5hc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSh4U2hhcGUsIG1lYW5TaGFwZSk7XG4gICAgYmFja2VuZF91dGlsLmFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKHhTaGFwZSwgdmFyaWFuY2VTaGFwZSk7XG5cbiAgICBsZXQgb2Zmc2V0U25pcHBldCA9ICd2ZWM0KDAuMCknO1xuICAgIGlmIChvZmZzZXRTaGFwZSAhPSBudWxsKSB7XG4gICAgICBiYWNrZW5kX3V0aWwuYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoeFNoYXBlLCBvZmZzZXRTaGFwZSk7XG4gICAgICB0aGlzLnZhcmlhYmxlTmFtZXMucHVzaCgnb2Zmc2V0Jyk7XG4gICAgICBvZmZzZXRTbmlwcGV0ID0gJ2dldE9mZnNldEF0T3V0Q29vcmRzKCknO1xuICAgIH1cblxuICAgIGxldCBzY2FsZVNuaXBwZXQgPSAndmVjNCgxLjApJztcbiAgICBpZiAoc2NhbGVTaGFwZSAhPSBudWxsKSB7XG4gICAgICBiYWNrZW5kX3V0aWwuYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoeFNoYXBlLCBzY2FsZVNoYXBlKTtcbiAgICAgIHRoaXMudmFyaWFibGVOYW1lcy5wdXNoKCdzY2FsZScpO1xuICAgICAgc2NhbGVTbmlwcGV0ID0gJ2dldFNjYWxlQXRPdXRDb29yZHMoKSc7XG4gICAgfVxuXG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IHhTaGFwZTtcbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICB2ZWM0IG9mZnNldCA9ICR7b2Zmc2V0U25pcHBldH07XG4gICAgICAgIHZlYzQgc2NhbGUgPSAke3NjYWxlU25pcHBldH07XG5cbiAgICAgICAgdmVjNCB4ID0gZ2V0WEF0T3V0Q29vcmRzKCk7XG4gICAgICAgIHZlYzQgbWVhbiA9IGdldE1lYW5BdE91dENvb3JkcygpO1xuICAgICAgICB2ZWM0IHZhcmlhbmNlID0gZ2V0VmFyaWFuY2VBdE91dENvb3JkcygpO1xuXG4gICAgICAgIHZlYzQgaW52ID0gc2NhbGUgKiBpbnZlcnNlc3FydCh2YXJpYW5jZSArIHZlYzQoJHt2YXJpYW5jZUVwc2lsb259KSk7XG5cbiAgICAgICAgc2V0T3V0cHV0KCh4IC0gbWVhbikgKiBpbnYgKyBvZmZzZXQpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcblxuLy8gKEFyICsgQWkpKEJyICsgQmkpID1cbi8vIEFyQnIgKyBBckJpICsgQWlCciArIEFpQmkgPSBBckJyIC0gQUIgKyBBckJpICsgQWlCclxuLy8gWXIgPSBBckJyIC0gQUJcbi8vIFlpID0gQXJCaSArIEFpQnJcbmV4cG9ydCBjb25zdCBDT01QTEVYX01VTFRJUExZID0ge1xuICBSRUFMOiAncmV0dXJuIGFyZWFsICogYnJlYWwgLSBhaW1hZyAqIGJpbWFnOycsXG4gIElNQUc6ICdyZXR1cm4gYXJlYWwgKiBiaW1hZyArIGFpbWFnICogYnJlYWw7J1xufTtcblxuZXhwb3J0IGNsYXNzIEJpbmFyeU9wQ29tcGxleFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWydBUmVhbCcsICdBSW1hZycsICdCUmVhbCcsICdCSW1hZyddO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG5cbiAgY29uc3RydWN0b3Iob3A6IHN0cmluZywgYVNoYXBlOiBudW1iZXJbXSwgYlNoYXBlOiBudW1iZXJbXSkge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBiYWNrZW5kX3V0aWwuYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoYVNoYXBlLCBiU2hhcGUpO1xuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGZsb2F0IGJpbmFyeU9wQ29tcGxleChcbiAgICAgICAgICBmbG9hdCBhcmVhbCwgZmxvYXQgYWltYWcsIGZsb2F0IGJyZWFsLCBmbG9hdCBiaW1hZykge1xuICAgICAgICAke29wfVxuICAgICAgfVxuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGZsb2F0IGFyZWFsID0gZ2V0QVJlYWxBdE91dENvb3JkcygpO1xuICAgICAgICBmbG9hdCBhaW1hZyA9IGdldEFJbWFnQXRPdXRDb29yZHMoKTtcbiAgICAgICAgZmxvYXQgYnJlYWwgPSBnZXRCUmVhbEF0T3V0Q29vcmRzKCk7XG4gICAgICAgIGZsb2F0IGJpbWFnID0gZ2V0QkltYWdBdE91dENvb3JkcygpO1xuICAgICAgICBzZXRPdXRwdXQoYmluYXJ5T3BDb21wbGV4KGFyZWFsLCBhaW1hZywgYnJlYWwsIGJpbWFnKSk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtHUEdQVVByb2dyYW0sIHVzZVNoYXBlVW5pZm9ybXN9IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5cbmV4cG9ydCBjb25zdCBDSEVDS19OQU5fU05JUFBFVCA9IGBcbiAgaWYgKGlzbmFuKGEpKSByZXR1cm4gYTtcbiAgaWYgKGlzbmFuKGIpKSByZXR1cm4gYjtcbmA7XG5cbmV4cG9ydCBjb25zdCBTUVVBUkVEX0RJRkZFUkVOQ0UgPSAncmV0dXJuIChhIC0gYikgKiAoYSAtIGIpOyc7XG5leHBvcnQgY2xhc3MgQmluYXJ5T3BQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnQScsICdCJ107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcbiAgZW5hYmxlU2hhcGVVbmlmb3JtczogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihvcDogc3RyaW5nLCBhU2hhcGU6IG51bWJlcltdLCBiU2hhcGU6IG51bWJlcltdKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IGJhY2tlbmRfdXRpbC5hc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZShhU2hhcGUsIGJTaGFwZSk7XG4gICAgdGhpcy5lbmFibGVTaGFwZVVuaWZvcm1zID0gdXNlU2hhcGVVbmlmb3Jtcyh0aGlzLm91dHB1dFNoYXBlLmxlbmd0aCk7XG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGZsb2F0IGJpbmFyeU9wZXJhdGlvbihmbG9hdCBhLCBmbG9hdCBiKSB7XG4gICAgICAgICR7b3B9XG4gICAgICB9XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgZmxvYXQgYSA9IGdldEFBdE91dENvb3JkcygpO1xuICAgICAgICBmbG9hdCBiID0gZ2V0QkF0T3V0Q29vcmRzKCk7XG4gICAgICAgIHNldE91dHB1dChiaW5hcnlPcGVyYXRpb24oYSwgYikpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtLCB1c2VTaGFwZVVuaWZvcm1zfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuaW1wb3J0IHtnZXRDaGFubmVsc30gZnJvbSAnLi9wYWNraW5nX3V0aWwnO1xuaW1wb3J0IHtnZXRDb29yZHNEYXRhVHlwZX0gZnJvbSAnLi9zaGFkZXJfY29tcGlsZXInO1xuXG5leHBvcnQgY29uc3QgQ0hFQ0tfTkFOX1NOSVBQRVQgPSBgXG4gIHJlc3VsdC5yID0gaXNOYU4uciA+IDAuID8gTkFOIDogcmVzdWx0LnI7XG4gIHJlc3VsdC5nID0gaXNOYU4uZyA+IDAuID8gTkFOIDogcmVzdWx0Lmc7XG4gIHJlc3VsdC5iID0gaXNOYU4uYiA+IDAuID8gTkFOIDogcmVzdWx0LmI7XG4gIHJlc3VsdC5hID0gaXNOYU4uYSA+IDAuID8gTkFOIDogcmVzdWx0LmE7XG5gO1xuXG5leHBvcnQgY29uc3QgRUxVX0RFUiA9IGBcbiAgdmVjNCBiR1RFWmVybyA9IHZlYzQoZ3JlYXRlclRoYW5FcXVhbChiLCB2ZWM0KDAuKSkpO1xuICByZXR1cm4gKGJHVEVaZXJvICogYSkgKyAoKHZlYzQoMS4wKSAtIGJHVEVaZXJvKSAqIChhICogKGIgKyB2ZWM0KDEuMCkpKSk7XG5gO1xuXG5leHBvcnQgY29uc3QgTk9UX0VRVUFMID0gYFxuICByZXR1cm4gdmVjNChub3RFcXVhbChhLCBiKSk7XG5gO1xuXG5leHBvcnQgY2xhc3MgQmluYXJ5T3BQYWNrZWRQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnQScsICdCJ107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcbiAgc3VwcG9ydHNCcm9hZGNhc3RpbmcgPSB0cnVlO1xuICBwYWNrZWRJbnB1dHMgPSB0cnVlO1xuICBwYWNrZWRPdXRwdXQgPSB0cnVlO1xuICBlbmFibGVTaGFwZVVuaWZvcm1zOiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgb3A6IHN0cmluZywgYVNoYXBlOiBudW1iZXJbXSwgYlNoYXBlOiBudW1iZXJbXSxcbiAgICAgIGNoZWNrT3V0T2ZCb3VuZHMgPSBmYWxzZSkge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBiYWNrZW5kX3V0aWwuYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoYVNoYXBlLCBiU2hhcGUpO1xuICAgIGNvbnN0IHJhbmsgPSB0aGlzLm91dHB1dFNoYXBlLmxlbmd0aDtcbiAgICB0aGlzLmVuYWJsZVNoYXBlVW5pZm9ybXMgPSB1c2VTaGFwZVVuaWZvcm1zKHJhbmspO1xuICAgIGxldCBjaGVja091dE9mQm91bmRzU3RyaW5nID0gJyc7XG4gICAgaWYgKGNoZWNrT3V0T2ZCb3VuZHMpIHtcbiAgICAgIGlmIChyYW5rID09PSAwIHx8IHV0aWwuc2l6ZUZyb21TaGFwZSh0aGlzLm91dHB1dFNoYXBlKSA9PT0gMSkge1xuICAgICAgICBjaGVja091dE9mQm91bmRzU3RyaW5nID0gYFxuICAgICAgICAgIHJlc3VsdC55ID0gMC47XG4gICAgICAgICAgcmVzdWx0LnogPSAwLjtcbiAgICAgICAgICByZXN1bHQudyA9IDAuO1xuICAgICAgICBgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZHR5cGUgPSBnZXRDb29yZHNEYXRhVHlwZShyYW5rKTtcbiAgICAgICAgY2hlY2tPdXRPZkJvdW5kc1N0cmluZyA9IGBcbiAgICAgICAgICAke2R0eXBlfSBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgYDtcbiAgICAgICAgaWYgKHJhbmsgPT09IDEpIHtcbiAgICAgICAgICBpZiAodGhpcy5lbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgICAgICAgICBjaGVja091dE9mQm91bmRzU3RyaW5nICs9IGBcbiAgICAgICAgICAgIHJlc3VsdC55ID0gKGNvb3JkcyArIDEpID49IG91dFNoYXBlID8gMC4gOiByZXN1bHQueTtcbiAgICAgICAgICAgIHJlc3VsdC56ID0gMC47XG4gICAgICAgICAgICByZXN1bHQudyA9IDAuO1xuICAgICAgICAgIGA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNoZWNrT3V0T2ZCb3VuZHNTdHJpbmcgKz0gYFxuICAgICAgICAgICAgcmVzdWx0LnkgPSAoY29vcmRzICsgMSkgPj0gJHt0aGlzLm91dHB1dFNoYXBlWzBdfSA/IDAuIDogcmVzdWx0Lnk7XG4gICAgICAgICAgICByZXN1bHQueiA9IDAuO1xuICAgICAgICAgICAgcmVzdWx0LncgPSAwLjtcbiAgICAgICAgICBgO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBjaGFubmVscyA9IGdldENoYW5uZWxzKCdjb29yZHMnLCByYW5rKTtcbiAgICAgICAgICBpZiAodGhpcy5lbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgICAgICAgICBjaGVja091dE9mQm91bmRzU3RyaW5nICs9IGBcbiAgICAgICAgICAgIGJvb2wgbmV4dFJvd091dE9mQm91bmRzID1cbiAgICAgICAgICAgICAgKCR7Y2hhbm5lbHNbcmFuayAtIDJdfSArIDEpID49IG91dFNoYXBlWyR7cmFua30gLSAyXTtcbiAgICAgICAgICAgIGJvb2wgbmV4dENvbE91dE9mQm91bmRzID1cbiAgICAgICAgICAgICAgKCR7Y2hhbm5lbHNbcmFuayAtIDFdfSArIDEpID49IG91dFNoYXBlWyR7cmFua30gLSAxXTtcbiAgICAgICAgICAgIHJlc3VsdC55ID0gbmV4dENvbE91dE9mQm91bmRzID8gMC4gOiByZXN1bHQueTtcbiAgICAgICAgICAgIHJlc3VsdC56ID0gbmV4dFJvd091dE9mQm91bmRzID8gMC4gOiByZXN1bHQuejtcbiAgICAgICAgICAgIHJlc3VsdC53ID0gbmV4dENvbE91dE9mQm91bmRzIHx8IG5leHRSb3dPdXRPZkJvdW5kcyA/IDAuIDogcmVzdWx0Lnc7XG4gICAgICAgICAgYDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2hlY2tPdXRPZkJvdW5kc1N0cmluZyArPSBgXG4gICAgICAgICAgICBib29sIG5leHRSb3dPdXRPZkJvdW5kcyA9XG4gICAgICAgICAgICAgICgke2NoYW5uZWxzW3JhbmsgLSAyXX0gKyAxKSA+PSAke3RoaXMub3V0cHV0U2hhcGVbcmFuayAtIDJdfTtcbiAgICAgICAgICAgIGJvb2wgbmV4dENvbE91dE9mQm91bmRzID1cbiAgICAgICAgICAgICAgKCR7Y2hhbm5lbHNbcmFuayAtIDFdfSArIDEpID49ICR7dGhpcy5vdXRwdXRTaGFwZVtyYW5rIC0gMV19O1xuICAgICAgICAgICAgcmVzdWx0LnkgPSBuZXh0Q29sT3V0T2ZCb3VuZHMgPyAwLiA6IHJlc3VsdC55O1xuICAgICAgICAgICAgcmVzdWx0LnogPSBuZXh0Um93T3V0T2ZCb3VuZHMgPyAwLiA6IHJlc3VsdC56O1xuICAgICAgICAgICAgcmVzdWx0LncgPSBuZXh0Q29sT3V0T2ZCb3VuZHMgfHwgbmV4dFJvd091dE9mQm91bmRzID8gMC4gOiByZXN1bHQudztcbiAgICAgICAgICBgO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICB2ZWM0IGJpbmFyeU9wZXJhdGlvbih2ZWM0IGEsIHZlYzQgYikge1xuICAgICAgICAke29wfVxuICAgICAgfVxuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIHZlYzQgYSA9IGdldEFBdE91dENvb3JkcygpO1xuICAgICAgICB2ZWM0IGIgPSBnZXRCQXRPdXRDb29yZHMoKTtcblxuICAgICAgICB2ZWM0IHJlc3VsdCA9IGJpbmFyeU9wZXJhdGlvbihhLCBiKTtcbiAgICAgICAgJHtjaGVja091dE9mQm91bmRzU3RyaW5nfVxuXG4gICAgICAgIHNldE91dHB1dChyZXN1bHQpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuY29uc3QgY29udGV4dHM6IHtba2V5OiBzdHJpbmddOiBXZWJHTFJlbmRlcmluZ0NvbnRleHR9ID0ge307XG5cbmNvbnN0IFdFQkdMX0FUVFJJQlVURVM6IFdlYkdMQ29udGV4dEF0dHJpYnV0ZXMgPSB7XG4gIGFscGhhOiBmYWxzZSxcbiAgYW50aWFsaWFzOiBmYWxzZSxcbiAgcHJlbXVsdGlwbGllZEFscGhhOiBmYWxzZSxcbiAgcHJlc2VydmVEcmF3aW5nQnVmZmVyOiBmYWxzZSxcbiAgZGVwdGg6IGZhbHNlLFxuICBzdGVuY2lsOiBmYWxzZSxcbiAgZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdDogdHJ1ZVxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyV2ViR0xDb250ZXh0KHdlYkdMVmVyc2lvbjogbnVtYmVyKSB7XG4gIGRlbGV0ZSBjb250ZXh0c1t3ZWJHTFZlcnNpb25dO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0V2ViR0xDb250ZXh0KFxuICAgIHdlYkdMVmVyc2lvbjogbnVtYmVyLCBnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0KSB7XG4gIGNvbnRleHRzW3dlYkdMVmVyc2lvbl0gPSBnbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFdlYkdMQ29udGV4dCh3ZWJHTFZlcnNpb246IG51bWJlcik6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCB7XG4gIGlmICghKHdlYkdMVmVyc2lvbiBpbiBjb250ZXh0cykpIHtcbiAgICBjb25zdCBuZXdDdHggPSBnZXRXZWJHTFJlbmRlcmluZ0NvbnRleHQod2ViR0xWZXJzaW9uKTtcbiAgICBpZiAobmV3Q3R4ICE9PSBudWxsKSB7XG4gICAgICBjb250ZXh0c1t3ZWJHTFZlcnNpb25dID0gbmV3Q3R4O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZygnQ291bGQgbm90IGdldCBjb250ZXh0IGZvciBXZWJHTCB2ZXJzaW9uJywgd2ViR0xWZXJzaW9uKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuICBjb25zdCBnbCA9IGNvbnRleHRzW3dlYkdMVmVyc2lvbl07XG4gIGlmIChnbC5pc0NvbnRleHRMb3N0KCkpIHtcbiAgICBkZWxldGUgY29udGV4dHNbd2ViR0xWZXJzaW9uXTtcbiAgICByZXR1cm4gZ2V0V2ViR0xDb250ZXh0KHdlYkdMVmVyc2lvbik7XG4gIH1cblxuICBnbC5kaXNhYmxlKGdsLkRFUFRIX1RFU1QpO1xuICBnbC5kaXNhYmxlKGdsLlNURU5DSUxfVEVTVCk7XG4gIGdsLmRpc2FibGUoZ2wuQkxFTkQpO1xuICBnbC5kaXNhYmxlKGdsLkRJVEhFUik7XG4gIGdsLmRpc2FibGUoZ2wuUE9MWUdPTl9PRkZTRVRfRklMTCk7XG4gIGdsLmRpc2FibGUoZ2wuU0FNUExFX0NPVkVSQUdFKTtcbiAgZ2wuZW5hYmxlKGdsLlNDSVNTT1JfVEVTVCk7XG4gIGdsLmVuYWJsZShnbC5DVUxMX0ZBQ0UpO1xuICBnbC5jdWxsRmFjZShnbC5CQUNLKTtcblxuICByZXR1cm4gY29udGV4dHNbd2ViR0xWZXJzaW9uXTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQ2FudmFzKHdlYkdMVmVyc2lvbjogbnVtYmVyKSB7XG4gIGlmICh0eXBlb2YgT2Zmc2NyZWVuQ2FudmFzICE9PSAndW5kZWZpbmVkJyAmJiB3ZWJHTFZlcnNpb24gPT09IDIpIHtcbiAgICByZXR1cm4gbmV3IE9mZnNjcmVlbkNhbnZhcygzMDAsIDE1MCk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjcmVhdGUgYSBjYW52YXMgaW4gdGhpcyBjb250ZXh0Jyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0V2ViR0xSZW5kZXJpbmdDb250ZXh0KHdlYkdMVmVyc2lvbjogbnVtYmVyKTogV2ViR0xSZW5kZXJpbmdDb250ZXh0IHtcbiAgaWYgKHdlYkdMVmVyc2lvbiAhPT0gMSAmJiB3ZWJHTFZlcnNpb24gIT09IDIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBnZXQgV2ViR0wgcmVuZGVyaW5nIGNvbnRleHQsIFdlYkdMIGlzIGRpc2FibGVkLicpO1xuICB9XG4gIGNvbnN0IGNhbnZhcyA9IGNyZWF0ZUNhbnZhcyh3ZWJHTFZlcnNpb24pO1xuXG4gIGNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCd3ZWJnbGNvbnRleHRsb3N0JywgKGV2OiBFdmVudCkgPT4ge1xuICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZGVsZXRlIGNvbnRleHRzW3dlYkdMVmVyc2lvbl07XG4gIH0sIGZhbHNlKTtcbiAgaWYgKHdlYkdMVmVyc2lvbiA9PT0gMSkge1xuICAgIHJldHVybiAoY2FudmFzLmdldENvbnRleHQoJ3dlYmdsJywgV0VCR0xfQVRUUklCVVRFUykgfHxcbiAgICAgICAgICAgIGNhbnZhcy5nZXRDb250ZXh0KCdleHBlcmltZW50YWwtd2ViZ2wnLCBXRUJHTF9BVFRSSUJVVEVTKSkgYXNcbiAgICAgICAgV2ViR0xSZW5kZXJpbmdDb250ZXh0O1xuICB9XG4gIHJldHVybiBjYW52YXMuZ2V0Q29udGV4dCgnd2ViZ2wyJywgV0VCR0xfQVRUUklCVVRFUykgYXMgV2ViR0xSZW5kZXJpbmdDb250ZXh0O1xufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcbmltcG9ydCB7VW5pZm9ybVR5cGV9IGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyJztcblxuZXhwb3J0IGNsYXNzIENsaXBQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnQSddO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIGN1c3RvbVVuaWZvcm1zID0gW1xuICAgIHtuYW1lOiAnbWluVmFsJywgdHlwZTogJ2Zsb2F0JyBhcyBVbmlmb3JtVHlwZX0sXG4gICAge25hbWU6ICdtYXhWYWwnLCB0eXBlOiAnZmxvYXQnIGFzIFVuaWZvcm1UeXBlfVxuICBdO1xuXG4gIGNvbnN0cnVjdG9yKGFTaGFwZTogbnVtYmVyW10pIHtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gYVNoYXBlO1xuICAgIHRoaXMudXNlckNvZGUgPSBgXG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgZmxvYXQgdmFsdWUgPSBnZXRBQXRPdXRDb29yZHMoKTtcbiAgICAgICAgaWYgKGlzbmFuKHZhbHVlKSkge1xuICAgICAgICAgIHNldE91dHB1dCh2YWx1ZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgc2V0T3V0cHV0KGNsYW1wKHZhbHVlLCBtaW5WYWwsIG1heFZhbCkpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5pbXBvcnQge1VuaWZvcm1UeXBlfSBmcm9tICcuL3NoYWRlcl9jb21waWxlcic7XG5cbmV4cG9ydCBjbGFzcyBDbGlwUGFja2VkUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ0EnXTtcbiAgcGFja2VkSW5wdXRzID0gdHJ1ZTtcbiAgcGFja2VkT3V0cHV0ID0gdHJ1ZTtcbiAgdXNlckNvZGU6IHN0cmluZztcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICBjdXN0b21Vbmlmb3JtcyA9IFtcbiAgICB7bmFtZTogJ21pblZhbCcsIHR5cGU6ICdmbG9hdCcgYXMgVW5pZm9ybVR5cGV9LFxuICAgIHtuYW1lOiAnbWF4VmFsJywgdHlwZTogJ2Zsb2F0JyBhcyBVbmlmb3JtVHlwZX1cbiAgXTtcblxuICBjb25zdHJ1Y3RvcihhU2hhcGU6IG51bWJlcltdKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IGFTaGFwZTtcbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICB2ZWM0IHZhbHVlID0gZ2V0QUF0T3V0Q29vcmRzKCk7XG5cbiAgICAgICAgaWYgKGFueShpc25hbih2YWx1ZSkpKSB7XG4gICAgICAgICAgc2V0T3V0cHV0KHZhbHVlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBzZXRPdXRwdXQoY2xhbXAodmFsdWUsIHZlYzQobWluVmFsKSwgdmVjNChtYXhWYWwpKSk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcblxuZXhwb3J0IGNsYXNzIENvbXBsZXhBYnNQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsncmVhbCcsICdpbWFnJ107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcblxuICBjb25zdHJ1Y3RvcihzaGFwZTogbnVtYmVyW10pIHtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gc2hhcGU7XG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgZmxvYXQgcmUgPSBhYnMoZ2V0UmVhbEF0T3V0Q29vcmRzKCkpO1xuICAgICAgICBmbG9hdCBpbSA9IGFicyhnZXRJbWFnQXRPdXRDb29yZHMoKSk7XG4gICAgICAgIGZsb2F0IG14ID0gbWF4KHJlLCBpbSk7XG5cbiAgICAgICAgLy8gc2FkbHkgdGhlIGxlbmd0aCBmdW5jdGlvbiBpbiBnbHNsIGlzIG5vdCB1bmRlcmZsb3ctc2FmZVxuICAgICAgICAvLyAoYXQgbGVhc3Qgbm90IG9uIEludGVsIEdQVXMpLiBTbyB0aGUgc2FmZSBzb2x1dGlvbiBpc1xuICAgICAgICAvLyB0byBlbnN1cmUgdW5kZXJmbG93LXNhZmV0eSBpbiBhbGwgY2FzZXMuXG4gICAgICAgIHNldE91dHB1dChcbiAgICAgICAgICBteCA9PSAwLjAgPyAwLjAgOiBteCAqIGxlbmd0aCh2ZWMyKDEsIG1pbihyZSwgaW0pL214KSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5cbmV4cG9ydCBjbGFzcyBDb25jYXRQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lczogc3RyaW5nW107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXSA9IFtdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuXG4gIC8vIENvbmNhdHMgMmQgdGVuc29ycyBhbG9uZyBheGlzPTEuIFNlZSBjb21tZW50cyBpbiBNYXRoQmFja2VuZFdlYkdMLmNvbmNhdCgpLlxuICBjb25zdHJ1Y3RvcihzaGFwZXM6IEFycmF5PFtudW1iZXIsIG51bWJlcl0+KSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0U2hhcGUoc2hhcGVzLCAxIC8qIGF4aXMgKi8pO1xuICAgIHRoaXMudmFyaWFibGVOYW1lcyA9IHNoYXBlcy5tYXAoKF8sIGkpID0+IGBUJHtpfWApO1xuXG4gICAgY29uc3Qgb2Zmc2V0czogbnVtYmVyW10gPSBuZXcgQXJyYXkoc2hhcGVzLmxlbmd0aCAtIDEpO1xuICAgIG9mZnNldHNbMF0gPSBzaGFwZXNbMF1bMV07XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBvZmZzZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBvZmZzZXRzW2ldID0gb2Zmc2V0c1tpIC0gMV0gKyBzaGFwZXNbaV1bMV07XG4gICAgfVxuXG4gICAgY29uc3Qgc25pcHBldHMgPSBbYGlmICh5QyA8ICR7b2Zmc2V0c1swXX0pIHNldE91dHB1dChnZXRUMCh5UiwgeUMpKTtgXTtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IG9mZnNldHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHNoaWZ0ID0gb2Zmc2V0c1tpIC0gMV07XG4gICAgICBzbmlwcGV0cy5wdXNoKFxuICAgICAgICAgIGBlbHNlIGlmICh5QyA8ICR7b2Zmc2V0c1tpXX0pIGAgK1xuICAgICAgICAgIGBzZXRPdXRwdXQoZ2V0VCR7aX0oeVIsIHlDLSR7c2hpZnR9KSk7YCk7XG4gICAgfVxuICAgIGNvbnN0IGxhc3RJbmRleCA9IG9mZnNldHMubGVuZ3RoO1xuICAgIGNvbnN0IGxhc3RTaGlmdCA9IG9mZnNldHNbb2Zmc2V0cy5sZW5ndGggLSAxXTtcbiAgICBzbmlwcGV0cy5wdXNoKGBlbHNlIHNldE91dHB1dChnZXRUJHtsYXN0SW5kZXh9KHlSLCB5Qy0ke2xhc3RTaGlmdH0pKTtgKTtcblxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWMyIGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgeVIgPSBjb29yZHMueDtcbiAgICAgICAgaW50IHlDID0gY29vcmRzLnk7XG5cbiAgICAgICAgJHtzbmlwcGV0cy5qb2luKCdcXG4gICAgICAgICcpfVxuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuaW1wb3J0IHtnZXRDaGFubmVsc30gZnJvbSAnLi9wYWNraW5nX3V0aWwnO1xuaW1wb3J0IHtnZXRDb29yZHNEYXRhVHlwZX0gZnJvbSAnLi9zaGFkZXJfY29tcGlsZXInO1xuXG5leHBvcnQgY2xhc3MgQ29uY2F0UGFja2VkUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXM6IHN0cmluZ1tdO1xuICBwYWNrZWRJbnB1dHMgPSB0cnVlO1xuICBwYWNrZWRPdXRwdXQgPSB0cnVlO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW10gPSBbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihzaGFwZXM6IG51bWJlcltdW10sIGF4aXM6IG51bWJlcikge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBiYWNrZW5kX3V0aWwuY29tcHV0ZU91dFNoYXBlKHNoYXBlcywgYXhpcyk7XG4gICAgY29uc3Qgc2hhcGUgPSB0aGlzLm91dHB1dFNoYXBlO1xuICAgIGNvbnN0IHJhbmsgPSBzaGFwZS5sZW5ndGg7XG4gICAgY29uc3QgZHR5cGUgPSBnZXRDb29yZHNEYXRhVHlwZShyYW5rKTtcbiAgICBjb25zdCBjb29yZHMgPSBnZXRDaGFubmVscygnY29vcmRzJywgcmFuayk7XG4gICAgY29uc3QgY2hhbm5lbHMgPSBbJ3gnLCAneScsICd6JywgJ3cnLCAndScsICd2J10uc2xpY2UoMCwgcmFuayk7XG4gICAgdGhpcy52YXJpYWJsZU5hbWVzID0gc2hhcGVzLm1hcCgoXywgaSkgPT4gYFQke2l9YCk7XG5cbiAgICBjb25zdCBvZmZzZXRzOiBudW1iZXJbXSA9IG5ldyBBcnJheShzaGFwZXMubGVuZ3RoIC0gMSk7XG4gICAgb2Zmc2V0c1swXSA9IHNoYXBlc1swXVtheGlzXTtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IG9mZnNldHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIG9mZnNldHNbaV0gPSBvZmZzZXRzW2kgLSAxXSArIHNoYXBlc1tpXVtheGlzXTtcbiAgICB9XG5cbiAgICBjb25zdCBjaGFubmVsID0gY2hhbm5lbHNbYXhpc107XG4gICAgY29uc3QgbGFzdENoYW5uZWxzID0gY2hhbm5lbHMuc2xpY2UoLTIpO1xuICAgIGNvbnN0IGFsbENoYW5uZWxzID0gY2hhbm5lbHMuam9pbigpO1xuXG4gICAgbGV0IGdldFZhbHVlU25pcHBldCA9IGBpZiAoJHtjaGFubmVsfSA8ICR7b2Zmc2V0c1swXX0pIHtcbiAgICAgICAgcmV0dXJuIGdldENoYW5uZWwoXG4gICAgICAgICAgICBnZXRUMCgke2FsbENoYW5uZWxzfSksIHZlYzIoJHtsYXN0Q2hhbm5lbHMuam9pbigpfSkpO1xuICAgICAgICB9YDtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IG9mZnNldHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHNoaWZ0ID0gb2Zmc2V0c1tpIC0gMV07XG4gICAgICAvLyBOb3RlOiB0aGUgPj0gY29tcGFyaXNvbiBiZWxvdyBtYXkgc2VlbSB1bm5lY2Vzc2FyeSBnaXZlbiB0aGUgY2hlY2tcbiAgICAgIC8vIGFib3ZlIGJ1dCBpcyBuZWVkZWQgdG8gd29ya2Fyb3VuZCBicmFuY2ggZXhlY3V0aW9uIGlzc3VlcyBvbiBzb21lXG4gICAgICAvLyBkZXZpY2VzLiBJdCBtYWtlcyBhbGwgdGhlIGNvbmRpdGlvbnMgZXhjbHVzaXZlIHdpdGhvdXQgcmVseWluZyBvblxuICAgICAgLy8gZXhlY3V0aW9uIG9yZGVyLlxuICAgICAgZ2V0VmFsdWVTbmlwcGV0ICs9IGBcbiAgICAgICAgaWYgKCR7Y2hhbm5lbH0gPCAke29mZnNldHNbaV19ICAmJiAke2NoYW5uZWx9ID49ICR7b2Zmc2V0c1tpIC0gMV19KSB7XG4gICAgICAgICAgcmV0dXJuIGdldENoYW5uZWwoXG4gICAgICAgICAgICBnZXRUJHtpfSgke3NoaWZ0ZWRDaGFubmVscyhjaGFubmVscywgY2hhbm5lbCwgc2hpZnQpfSksXG4gICAgICAgICAgICB2ZWMyKCR7c2hpZnRlZENoYW5uZWxzKGxhc3RDaGFubmVscywgY2hhbm5lbCwgc2hpZnQpfSkpO1xuICAgICAgICB9YDtcbiAgICB9XG4gICAgY29uc3QgbGFzdEluZGV4ID0gb2Zmc2V0cy5sZW5ndGg7XG4gICAgY29uc3Qgc2hpZnQgPSBvZmZzZXRzW29mZnNldHMubGVuZ3RoIC0gMV07XG4gICAgZ2V0VmFsdWVTbmlwcGV0ICs9IGBcbiAgICAgICAgcmV0dXJuIGdldENoYW5uZWwoXG4gICAgICAgICAgZ2V0VCR7bGFzdEluZGV4fSgke3NoaWZ0ZWRDaGFubmVscyhjaGFubmVscywgY2hhbm5lbCwgc2hpZnQpfSksXG4gICAgICAgICAgdmVjMigke3NoaWZ0ZWRDaGFubmVscyhsYXN0Q2hhbm5lbHMsIGNoYW5uZWwsIHNoaWZ0KX0pKTtgO1xuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGZsb2F0IGdldFZhbHVlKCR7Y2hhbm5lbHMubWFwKHggPT4gJ2ludCAnICsgeCl9KSB7XG4gICAgICAgICR7Z2V0VmFsdWVTbmlwcGV0fVxuICAgICAgfVxuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICR7ZHR5cGV9IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICB2ZWM0IHJlc3VsdCA9IHZlYzQoZ2V0VmFsdWUoJHtjb29yZHN9KSwgMC4sIDAuLCAwLik7XG5cbiAgICAgICAgJHtjb29yZHNbcmFuayAtIDFdfSA9ICR7Y29vcmRzW3JhbmsgLSAxXX0gKyAxO1xuICAgICAgICBpZiAoJHtjb29yZHNbcmFuayAtIDFdfSA8ICR7c2hhcGVbcmFuayAtIDFdfSkge1xuICAgICAgICAgIHJlc3VsdC5nID0gZ2V0VmFsdWUoJHtjb29yZHN9KTtcbiAgICAgICAgfVxuXG4gICAgICAgICR7Y29vcmRzW3JhbmsgLSAyXX0gPSAke2Nvb3Jkc1tyYW5rIC0gMl19ICsgMTtcbiAgICAgICAgaWYgKCR7Y29vcmRzW3JhbmsgLSAyXX0gPCAke3NoYXBlW3JhbmsgLSAyXX0pIHtcbiAgICAgICAgICByZXN1bHQuYSA9IGdldFZhbHVlKCR7Y29vcmRzfSk7XG4gICAgICAgIH1cblxuICAgICAgICAke2Nvb3Jkc1tyYW5rIC0gMV19ID0gJHtjb29yZHNbcmFuayAtIDFdfSAtIDE7XG4gICAgICAgIGlmICgke2Nvb3Jkc1tyYW5rIC0gMl19IDwgJHtzaGFwZVtyYW5rIC0gMl19ICYmXG4gICAgICAgICAgICAke2Nvb3Jkc1tyYW5rIC0gMV19IDwgJHtzaGFwZVtyYW5rIC0gMV19KSB7XG4gICAgICAgICAgcmVzdWx0LmIgPSBnZXRWYWx1ZSgke2Nvb3Jkc30pO1xuICAgICAgICB9XG4gICAgICAgIHNldE91dHB1dChyZXN1bHQpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm4gYW4gZXhwcmVzc2lvbiBmb3IgY29vcmRpbmF0ZXMgaW50byBhIHZlY3RvciB3aGVyZSBhIGdpdmVuIGNoYW5uZWxcbiAqIHdpbGwgYmUgb2Zmc2V0IGJ5IFtzaGlmdF0uXG4gKlxuICogQHBhcmFtIGNoYW5uZWxzIHRoZSBjaGFubmVscyB0byBjb25zaWRlclxuICogQHBhcmFtIGNoYW5uZWwgdGhlIGNoYW5uZWwgd2Ugd2FudCBzaGlmdGVkXG4gKiBAcGFyYW0gc2hpZnQgIHRoZSBhbW91bnQgdG8gc3VidHJhY3QgZnJvbSB0aGUgY2hhbm5lbC5cbiAqXG4gKiBAcmV0dXJucyBhIHN0cmluZyBvZiB0aGUgZm9ybSAneCwgeS1bc2hpZnRdLCB6JyB3aGVyZSBhbnkgb25lIGNoYW5uZWwgY2FuXG4gKiBoYXZlIHRoZSBzaGlmdCBhcHBsaWVkLlxuICovXG5mdW5jdGlvbiBzaGlmdGVkQ2hhbm5lbHMoY2hhbm5lbHM6IHN0cmluZ1tdLCBjaGFubmVsOiBzdHJpbmcsIHNoaWZ0OiBudW1iZXIpIHtcbiAgY29uc3QgY2hhbm5lbElkeCA9IGNoYW5uZWxzLmluZGV4T2YoY2hhbm5lbCk7XG4gIGNvbnN0IHJlcyA9IGNoYW5uZWxzLm1hcCgoYywgaWR4KSA9PiB7XG4gICAgaWYgKGlkeCA9PT0gY2hhbm5lbElkeCkge1xuICAgICAgcmV0dXJuIGAke2N9IC0gJHtzaGlmdH1gO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYztcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmVzLmpvaW4oKTtcbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcblxuZXhwb3J0IGNsYXNzIENvbnYyRERlckZpbHRlclByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWyd4JywgJ2R5J107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihjb252SW5mbzogYmFja2VuZF91dGlsLkNvbnYyREluZm8pIHtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gY29udkluZm8uZmlsdGVyU2hhcGU7XG5cbiAgICBjb25zdCBzdHJpZGVIZWlnaHQgPSBjb252SW5mby5zdHJpZGVIZWlnaHQ7XG4gICAgY29uc3Qgc3RyaWRlV2lkdGggPSBjb252SW5mby5zdHJpZGVXaWR0aDtcbiAgICBjb25zdCBwYWRUb3AgPSBjb252SW5mby5wYWRJbmZvLnRvcDtcbiAgICBjb25zdCBwYWRMZWZ0ID0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuICAgIGNvbnN0IGlzQ2hhbm5lbHNMYXN0ID0gY29udkluZm8uZGF0YUZvcm1hdCA9PT0gJ2NoYW5uZWxzTGFzdCc7XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjNCBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IHdSID0gY29vcmRzLng7XG4gICAgICAgIGludCB3QyA9IGNvb3Jkcy55O1xuICAgICAgICBpbnQgZDEgPSBjb29yZHMuejtcbiAgICAgICAgaW50IGQyID0gY29vcmRzLnc7XG5cbiAgICAgICAgLy8gQ29udm9sdmUgeCg/LCA/LCBkMSkgd2l0aCBkeSg6LCA6LCBkMikgdG8gZ2V0IGR3KHdSLCB3QywgZDEsIGQyKS5cbiAgICAgICAgLy8gPyA9IHRvIGJlIGRldGVybWluZWQuIDogPSBhY3Jvc3MgYWxsIHZhbHVlcyBpbiB0aGF0IGF4aXMuXG4gICAgICAgIGZsb2F0IGRvdFByb2QgPSAwLjA7XG5cbiAgICAgICAgZm9yIChpbnQgYiA9IDA7IGIgPCAke2NvbnZJbmZvLmJhdGNoU2l6ZX07IGIrKykge1xuICAgICAgICAgIGZvciAoaW50IHlSID0gMDsgeVIgPCAke2NvbnZJbmZvLm91dEhlaWdodH07IHlSKyspIHtcbiAgICAgICAgICAgIGludCB4UiA9IHdSICsgeVIgKiAke3N0cmlkZUhlaWdodH0gLSAke3BhZFRvcH07XG5cbiAgICAgICAgICAgIGlmICh4UiA8IDAgfHwgeFIgPj0gJHtjb252SW5mby5pbkhlaWdodH0pIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAoaW50IHlDID0gMDsgeUMgPCAke2NvbnZJbmZvLm91dFdpZHRofTsgeUMrKykge1xuICAgICAgICAgICAgICBpbnQgeEMgPSB3QyArIHlDICogJHtzdHJpZGVXaWR0aH0gLSAke3BhZExlZnR9O1xuXG4gICAgICAgICAgICAgIGlmICh4QyA8IDAgfHwgeEMgPj0gJHtjb252SW5mby5pbldpZHRofSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKCR7aXNDaGFubmVsc0xhc3R9KSB7XG4gICAgICAgICAgICAgICAgZmxvYXQgZHlWYWx1ZSA9IGdldER5KGIsIHlSLCB5QywgZDIpO1xuICAgICAgICAgICAgICAgIGZsb2F0IHhWYWx1ZSA9IGdldFgoYiwgeFIsIHhDLCBkMSk7XG4gICAgICAgICAgICAgICAgZG90UHJvZCArPSAoeFZhbHVlICogZHlWYWx1ZSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZmxvYXQgZHlWYWx1ZSA9IGdldER5KGIsIGQyLCB5UiwgeUMpO1xuICAgICAgICAgICAgICAgIGZsb2F0IHhWYWx1ZSA9IGdldFgoYiwgZDEsIHhSLCB4Qyk7XG4gICAgICAgICAgICAgICAgZG90UHJvZCArPSAoeFZhbHVlICogZHlWYWx1ZSk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzZXRPdXRwdXQoZG90UHJvZCk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ29udjJERGVySW5wdXRQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnZHknLCAnVyddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoY29udkluZm86IGJhY2tlbmRfdXRpbC5Db252MkRJbmZvKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IGNvbnZJbmZvLmluU2hhcGU7XG5cbiAgICBjb25zdCBmaWx0ZXJIZWlnaHQgPSBjb252SW5mby5maWx0ZXJIZWlnaHQ7XG4gICAgY29uc3QgZmlsdGVyV2lkdGggPSBjb252SW5mby5maWx0ZXJXaWR0aDtcbiAgICBjb25zdCBzdHJpZGVIZWlnaHQgPSBjb252SW5mby5zdHJpZGVIZWlnaHQ7XG4gICAgY29uc3Qgc3RyaWRlV2lkdGggPSBjb252SW5mby5zdHJpZGVXaWR0aDtcbiAgICBjb25zdCBpc0NoYW5uZWxzTGFzdCA9IGNvbnZJbmZvLmRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0xhc3QnO1xuXG4gICAgY29uc3QgcGFkVG9wID0gZmlsdGVySGVpZ2h0IC0gMSAtIGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICAgIGNvbnN0IHBhZExlZnQgPSBmaWx0ZXJXaWR0aCAtIDEgLSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG5cbiAgICBjb25zdCByb3dEaW0gPSBpc0NoYW5uZWxzTGFzdCA/IDEgOiAyO1xuICAgIGNvbnN0IGNvbERpbSA9IGlzQ2hhbm5lbHNMYXN0ID8gMiA6IDM7XG4gICAgY29uc3QgY2hhbm5lbERpbSA9IGlzQ2hhbm5lbHNMYXN0ID8gMyA6IDE7XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgY29uc3QgaXZlYzIgcGFkcyA9IGl2ZWMyKCR7cGFkVG9wfSwgJHtwYWRMZWZ0fSk7XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBiYXRjaCA9IGNvb3Jkc1swXTtcbiAgICAgICAgaW50IGQxID0gY29vcmRzWyR7Y2hhbm5lbERpbX1dO1xuXG4gICAgICAgIGl2ZWMyIGR5Q29ybmVyID0gaXZlYzIoY29vcmRzWyR7cm93RGltfV0sIGNvb3Jkc1ske2NvbERpbX1dKSAtIHBhZHM7XG4gICAgICAgIGludCBkeVJDb3JuZXIgPSBkeUNvcm5lci54O1xuICAgICAgICBpbnQgZHlDQ29ybmVyID0gZHlDb3JuZXIueTtcblxuICAgICAgICAvLyBDb252b2x2ZSBkeSg/LCA/LCBkMikgd2l0aCB3KDosIDosIGQxLCBkMikgdG8gY29tcHV0ZSBkeCh4UiwgeEMsIGQxKS5cbiAgICAgICAgLy8gPyA9IHRvIGJlIGRldGVybWluZWQuIDogPSBhY3Jvc3MgYWxsIHZhbHVlcyBpbiB0aGF0IGF4aXMuXG4gICAgICAgIGZsb2F0IGRvdFByb2QgPSAwLjA7XG4gICAgICAgIGZvciAoaW50IHdSID0gMDsgd1IgPCAke2ZpbHRlckhlaWdodH07IHdSKyspIHtcbiAgICAgICAgICBmbG9hdCBkeVIgPSBmbG9hdChkeVJDb3JuZXIgKyB3UikgLyAke3N0cmlkZUhlaWdodH0uMDtcblxuICAgICAgICAgIGlmIChkeVIgPCAwLjAgfHwgZHlSID49ICR7Y29udkluZm8ub3V0SGVpZ2h0fS4wIHx8IGZyYWN0KGR5UikgPiAwLjApIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpbnQgaWR5UiA9IGludChkeVIpO1xuXG4gICAgICAgICAgaW50IHdSUGVybSA9ICR7ZmlsdGVySGVpZ2h0fSAtIDEgLSB3UjtcblxuICAgICAgICAgIGZvciAoaW50IHdDID0gMDsgd0MgPCAke2ZpbHRlcldpZHRofTsgd0MrKykge1xuICAgICAgICAgICAgZmxvYXQgZHlDID0gZmxvYXQoZHlDQ29ybmVyICsgd0MpIC8gJHtzdHJpZGVXaWR0aH0uMDtcblxuICAgICAgICAgICAgaWYgKGR5QyA8IDAuMCB8fCBkeUMgPj0gJHtjb252SW5mby5vdXRXaWR0aH0uMCB8fFxuICAgICAgICAgICAgICAgIGZyYWN0KGR5QykgPiAwLjApIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbnQgaWR5QyA9IGludChkeUMpO1xuXG4gICAgICAgICAgICBpbnQgd0NQZXJtID0gJHtmaWx0ZXJXaWR0aH0gLSAxIC0gd0M7XG5cbiAgICAgICAgICAgIGZvciAoaW50IGQyID0gMDsgZDIgPCAke2NvbnZJbmZvLm91dENoYW5uZWxzfTsgZDIrKykge1xuXG4gICAgICAgICAgICAgIGlmICgke2lzQ2hhbm5lbHNMYXN0fSkge1xuICAgICAgICAgICAgICAgIGZsb2F0IHhWYWx1ZSA9IGdldER5KGJhdGNoLCBpZHlSLCBpZHlDLCBkMik7XG4gICAgICAgICAgICAgICAgZmxvYXQgd1ZhbHVlID0gZ2V0Vyh3UlBlcm0sIHdDUGVybSwgZDEsIGQyKTtcbiAgICAgICAgICAgICAgICBkb3RQcm9kICs9IHhWYWx1ZSAqIHdWYWx1ZTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmbG9hdCB4VmFsdWUgPSBnZXREeShiYXRjaCwgZDIsIGlkeVIsIGlkeUMpO1xuICAgICAgICAgICAgICAgIGZsb2F0IHdWYWx1ZSA9IGdldFcod1JQZXJtLCB3Q1Blcm0sIGQxLCBkMik7XG4gICAgICAgICAgICAgICAgZG90UHJvZCArPSB4VmFsdWUgKiB3VmFsdWU7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzZXRPdXRwdXQoZG90UHJvZCk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ29udjNERGVyRmlsdGVyUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ3gnLCAnZHknXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGNvbnZJbmZvOiBiYWNrZW5kX3V0aWwuQ29udjNESW5mbykge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBjb252SW5mby5maWx0ZXJTaGFwZTtcblxuICAgIGNvbnN0IHN0cmlkZURlcHRoID0gY29udkluZm8uc3RyaWRlRGVwdGg7XG4gICAgY29uc3Qgc3RyaWRlSGVpZ2h0ID0gY29udkluZm8uc3RyaWRlSGVpZ2h0O1xuICAgIGNvbnN0IHN0cmlkZVdpZHRoID0gY29udkluZm8uc3RyaWRlV2lkdGg7XG4gICAgY29uc3QgcGFkRnJvbnQgPSBjb252SW5mby5wYWRJbmZvLmZyb250O1xuICAgIGNvbnN0IHBhZFRvcCA9IGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICAgIGNvbnN0IHBhZExlZnQgPSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjNSBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IHdGID0gY29vcmRzLng7XG4gICAgICAgIGludCB3UiA9IGNvb3Jkcy55O1xuICAgICAgICBpbnQgd0MgPSBjb29yZHMuejtcbiAgICAgICAgaW50IGQxID0gY29vcmRzLnc7XG4gICAgICAgIGludCBkMiA9IGNvb3Jkcy51O1xuXG4gICAgICAgIGZsb2F0IGRvdFByb2QgPSAwLjA7XG5cbiAgICAgICAgZm9yIChpbnQgYiA9IDA7IGIgPCAke2NvbnZJbmZvLmJhdGNoU2l6ZX07IGIrKykge1xuICAgICAgICAgIGZvciAoaW50IHlGID0gMDsgeUYgPCAke2NvbnZJbmZvLm91dERlcHRofTsgeUYrKykge1xuICAgICAgICAgICAgaW50IHhGID0gd0YgKyB5RiAqICR7c3RyaWRlRGVwdGh9IC0gJHtwYWRGcm9udH07XG5cbiAgICAgICAgICAgIGlmICh4RiA8IDAgfHwgeEYgPj0gJHtjb252SW5mby5pbkRlcHRofSkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChpbnQgeVIgPSAwOyB5UiA8ICR7Y29udkluZm8ub3V0SGVpZ2h0fTsgeVIrKykge1xuICAgICAgICAgICAgICBpbnQgeFIgPSB3UiArIHlSICogJHtzdHJpZGVIZWlnaHR9IC0gJHtwYWRUb3B9O1xuXG4gICAgICAgICAgICAgIGlmICh4UiA8IDAgfHwgeFIgPj0gJHtjb252SW5mby5pbkhlaWdodH0pIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGZvciAoaW50IHlDID0gMDsgeUMgPCAke2NvbnZJbmZvLm91dFdpZHRofTsgeUMrKykge1xuICAgICAgICAgICAgICAgIGludCB4QyA9IHdDICsgeUMgKiAke3N0cmlkZVdpZHRofSAtICR7cGFkTGVmdH07XG5cbiAgICAgICAgICAgICAgICBpZiAoeEMgPCAwIHx8IHhDID49ICR7Y29udkluZm8uaW5XaWR0aH0pIHtcbiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZsb2F0IGR5VmFsdWUgPSBnZXREeShiLCB5RiwgeVIsIHlDLCBkMik7XG4gICAgICAgICAgICAgICAgZmxvYXQgeFZhbHVlID0gZ2V0WChiLCB4RiwgeFIsIHhDLCBkMSk7XG4gICAgICAgICAgICAgICAgZG90UHJvZCArPSAoeFZhbHVlICogZHlWYWx1ZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc2V0T3V0cHV0KGRvdFByb2QpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbnYzRERlcklucHV0UHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ2R5JywgJ1cnXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGNvbnZJbmZvOiBiYWNrZW5kX3V0aWwuQ29udjNESW5mbykge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBjb252SW5mby5pblNoYXBlO1xuXG4gICAgY29uc3QgZmlsdGVyRGVwdGggPSBjb252SW5mby5maWx0ZXJEZXB0aDtcbiAgICBjb25zdCBmaWx0ZXJIZWlnaHQgPSBjb252SW5mby5maWx0ZXJIZWlnaHQ7XG4gICAgY29uc3QgZmlsdGVyV2lkdGggPSBjb252SW5mby5maWx0ZXJXaWR0aDtcbiAgICBjb25zdCBzdHJpZGVEZXB0aCA9IGNvbnZJbmZvLnN0cmlkZURlcHRoO1xuICAgIGNvbnN0IHN0cmlkZUhlaWdodCA9IGNvbnZJbmZvLnN0cmlkZUhlaWdodDtcbiAgICBjb25zdCBzdHJpZGVXaWR0aCA9IGNvbnZJbmZvLnN0cmlkZVdpZHRoO1xuXG4gICAgY29uc3QgcGFkRnJvbnQgPSBmaWx0ZXJEZXB0aCAtIDEgLSBjb252SW5mby5wYWRJbmZvLmZyb250O1xuICAgIGNvbnN0IHBhZFRvcCA9IGZpbHRlckhlaWdodCAtIDEgLSBjb252SW5mby5wYWRJbmZvLnRvcDtcbiAgICBjb25zdCBwYWRMZWZ0ID0gZmlsdGVyV2lkdGggLSAxIC0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGNvbnN0IGl2ZWMzIHBhZHMgPSBpdmVjMygke3BhZEZyb250fSwgJHtwYWRUb3B9LCAke3BhZExlZnR9KTtcblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjNSBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IGJhdGNoID0gY29vcmRzLng7XG4gICAgICAgIGludCBkMSA9IGNvb3Jkcy51O1xuXG5cbiAgICAgICAgaXZlYzMgZHlDb3JuZXIgPSBpdmVjMyhjb29yZHMueSwgY29vcmRzLnosIGNvb3Jkcy53KSAtIHBhZHM7XG4gICAgICAgIGludCBkeUZDb3JuZXIgPSBkeUNvcm5lci54O1xuICAgICAgICBpbnQgZHlSQ29ybmVyID0gZHlDb3JuZXIueTtcbiAgICAgICAgaW50IGR5Q0Nvcm5lciA9IGR5Q29ybmVyLno7XG5cbiAgICAgICAgZmxvYXQgZG90UHJvZCA9IDAuMDtcbiAgICAgICAgZm9yIChpbnQgd0YgPSAwOyB3RiA8ICR7ZmlsdGVyRGVwdGh9OyB3RisrKSB7XG4gICAgICAgICAgZmxvYXQgZHlGID0gZmxvYXQoZHlGQ29ybmVyICsgd0YpIC8gJHtzdHJpZGVEZXB0aH0uMDtcblxuICAgICAgICAgIGlmIChkeUYgPCAwLjAgfHwgZHlGID49ICR7Y29udkluZm8ub3V0RGVwdGh9LjAgfHwgZnJhY3QoZHlGKSA+IDAuMCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGludCBpZHlGID0gaW50KGR5Rik7XG5cbiAgICAgICAgICBpbnQgd0ZQZXJtID0gJHtmaWx0ZXJEZXB0aH0gLSAxIC0gd0Y7XG5cbiAgICAgICAgICBmb3IgKGludCB3UiA9IDA7IHdSIDwgJHtmaWx0ZXJIZWlnaHR9OyB3UisrKSB7XG4gICAgICAgICAgICBmbG9hdCBkeVIgPSBmbG9hdChkeVJDb3JuZXIgKyB3UikgLyAke3N0cmlkZUhlaWdodH0uMDtcblxuICAgICAgICAgICAgaWYgKGR5UiA8IDAuMCB8fCBkeVIgPj0gJHtjb252SW5mby5vdXRIZWlnaHR9LjAgfHxcbiAgICAgICAgICAgICAgZnJhY3QoZHlSKSA+IDAuMCkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGludCBpZHlSID0gaW50KGR5Uik7XG5cbiAgICAgICAgICAgIGludCB3UlBlcm0gPSAke2ZpbHRlckhlaWdodH0gLSAxIC0gd1I7XG5cbiAgICAgICAgICAgIGZvciAoaW50IHdDID0gMDsgd0MgPCAke2ZpbHRlcldpZHRofTsgd0MrKykge1xuICAgICAgICAgICAgICBmbG9hdCBkeUMgPSBmbG9hdChkeUNDb3JuZXIgKyB3QykgLyAke3N0cmlkZVdpZHRofS4wO1xuXG4gICAgICAgICAgICAgIGlmIChkeUMgPCAwLjAgfHwgZHlDID49ICR7Y29udkluZm8ub3V0V2lkdGh9LjAgfHxcbiAgICAgICAgICAgICAgICAgIGZyYWN0KGR5QykgPiAwLjApIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpbnQgaWR5QyA9IGludChkeUMpO1xuXG4gICAgICAgICAgICAgIGludCB3Q1Blcm0gPSAke2ZpbHRlcldpZHRofSAtIDEgLSB3QztcblxuICAgICAgICAgICAgICBmb3IgKGludCBkMiA9IDA7IGQyIDwgJHtjb252SW5mby5vdXRDaGFubmVsc307IGQyKyspIHtcbiAgICAgICAgICAgICAgICBmbG9hdCB4VmFsdWUgPSBnZXREeShiYXRjaCwgaWR5RiwgaWR5UiwgaWR5QywgZDIpO1xuICAgICAgICAgICAgICAgIGZsb2F0IHdWYWx1ZSA9IGdldFcod0ZQZXJtLCB3UlBlcm0sIHdDUGVybSwgZDEsIGQyKTtcbiAgICAgICAgICAgICAgICBkb3RQcm9kICs9IHhWYWx1ZSAqIHdWYWx1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzZXRPdXRwdXQoZG90UHJvZCk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuXG5leHBvcnQgY2xhc3MgRGVwdGh3aXNlQ29udjJERGVyRmlsdGVyUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ3gnLCAnZHknXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGNvbnZJbmZvOiBiYWNrZW5kX3V0aWwuQ29udjJESW5mbykge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBjb252SW5mby5maWx0ZXJTaGFwZTtcblxuICAgIGNvbnN0IHN0cmlkZUhlaWdodCA9IGNvbnZJbmZvLnN0cmlkZUhlaWdodDtcbiAgICBjb25zdCBzdHJpZGVXaWR0aCA9IGNvbnZJbmZvLnN0cmlkZVdpZHRoO1xuICAgIGNvbnN0IHBhZFRvcCA9IGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICAgIGNvbnN0IHBhZExlZnQgPSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG4gICAgY29uc3QgY2hhbm5lbE11bCA9IGNvbnZJbmZvLm91dENoYW5uZWxzIC8gY29udkluZm8uaW5DaGFubmVscztcblxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWM0IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgd1IgPSBjb29yZHMueDtcbiAgICAgICAgaW50IHdDID0gY29vcmRzLnk7XG4gICAgICAgIGludCBkMSA9IGNvb3Jkcy56O1xuICAgICAgICBpbnQgZG0gPSBjb29yZHMudztcbiAgICAgICAgaW50IGQyID0gZDEgKiAke2NoYW5uZWxNdWx9ICsgZG07XG5cbiAgICAgICAgZmxvYXQgZG90UHJvZCA9IDAuMDtcblxuICAgICAgICAvLyBUTyBETzogVmVjNCBvdmVyIHRoZSBiYXRjaCBzaXplXG4gICAgICAgIGZvciAoaW50IGIgPSAwOyBiIDwgJHtjb252SW5mby5iYXRjaFNpemV9OyBiKyspIHtcbiAgICAgICAgICBmb3IgKGludCB5UiA9IDA7IHlSIDwgJHtjb252SW5mby5vdXRIZWlnaHR9OyB5UisrKSB7XG4gICAgICAgICAgICBpbnQgeFIgPSB3UiArIHlSICogJHtzdHJpZGVIZWlnaHR9IC0gJHtwYWRUb3B9O1xuXG4gICAgICAgICAgICBpZiAoeFIgPCAwIHx8IHhSID49ICR7Y29udkluZm8uaW5IZWlnaHR9KSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGludCB5QyA9IDA7IHlDIDwgJHtjb252SW5mby5vdXRXaWR0aH07IHlDKyspIHtcbiAgICAgICAgICAgICAgaW50IHhDID0gd0MgKyB5QyAqICR7c3RyaWRlV2lkdGh9IC0gJHtwYWRMZWZ0fTtcblxuICAgICAgICAgICAgICBpZiAoeEMgPCAwIHx8IHhDID49ICR7Y29udkluZm8uaW5XaWR0aH0pIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGZsb2F0IGR5VmFsdWUgPSBnZXREeShiLCB5UiwgeUMsIGQyKTtcbiAgICAgICAgICAgICAgZmxvYXQgeFZhbHVlID0gZ2V0WChiLCB4UiwgeEMsIGQxKTtcbiAgICAgICAgICAgICAgZG90UHJvZCArPSAoeFZhbHVlICogZHlWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNldE91dHB1dChkb3RQcm9kKTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEZXB0aHdpc2VDb252MkREZXJJbnB1dFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWydkeScsICdXJ107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihjb252SW5mbzogYmFja2VuZF91dGlsLkNvbnYyREluZm8pIHtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gY29udkluZm8uaW5TaGFwZTtcblxuICAgIGNvbnN0IGZpbHRlckhlaWdodCA9IGNvbnZJbmZvLmZpbHRlckhlaWdodDtcbiAgICBjb25zdCBmaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmZpbHRlcldpZHRoO1xuICAgIGNvbnN0IHN0cmlkZUhlaWdodCA9IGNvbnZJbmZvLnN0cmlkZUhlaWdodDtcbiAgICBjb25zdCBzdHJpZGVXaWR0aCA9IGNvbnZJbmZvLnN0cmlkZVdpZHRoO1xuXG4gICAgY29uc3QgcGFkVG9wID0gZmlsdGVySGVpZ2h0IC0gMSAtIGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICAgIGNvbnN0IHBhZExlZnQgPSBmaWx0ZXJXaWR0aCAtIDEgLSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG4gICAgY29uc3QgY2hhbm5lbE11bCA9IGNvbnZJbmZvLm91dENoYW5uZWxzIC8gY29udkluZm8uaW5DaGFubmVscztcblxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICBjb25zdCBpdmVjMiBwYWRzID0gaXZlYzIoJHtwYWRUb3B9LCAke3BhZExlZnR9KTtcblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjNCBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IGJhdGNoID0gY29vcmRzWzBdO1xuICAgICAgICBpbnQgZDEgPSBjb29yZHNbM107XG4gICAgICAgIGl2ZWMyIGR5Q29ybmVyID0gY29vcmRzLnl6IC0gcGFkcztcbiAgICAgICAgaW50IGR5UkNvcm5lciA9IGR5Q29ybmVyLng7XG4gICAgICAgIGludCBkeUNDb3JuZXIgPSBkeUNvcm5lci55O1xuXG4gICAgICAgIGZsb2F0IGRvdFByb2QgPSAwLjA7XG5cbiAgICAgICAgZm9yIChpbnQgd1IgPSAwOyB3UiA8ICR7ZmlsdGVySGVpZ2h0fTsgd1IrKykge1xuICAgICAgICAgIGZsb2F0IGR5UiA9IGZsb2F0KGR5UkNvcm5lciArIHdSKSAvICR7c3RyaWRlSGVpZ2h0fS4wO1xuXG4gICAgICAgICAgaWYgKGR5UiA8IDAuMCB8fCBkeVIgPj0gJHtjb252SW5mby5vdXRIZWlnaHR9LjAgfHwgZnJhY3QoZHlSKSA+IDAuMCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGludCBpZHlSID0gaW50KGR5Uik7XG5cbiAgICAgICAgICBpbnQgd1JQZXJtID0gJHtmaWx0ZXJIZWlnaHR9IC0gMSAtIHdSO1xuXG4gICAgICAgICAgZm9yIChpbnQgd0MgPSAwOyB3QyA8ICR7ZmlsdGVyV2lkdGh9OyB3QysrKSB7XG4gICAgICAgICAgICBmbG9hdCBkeUMgPSBmbG9hdChkeUNDb3JuZXIgKyB3QykgLyAke3N0cmlkZVdpZHRofS4wO1xuXG4gICAgICAgICAgICBpZiAoZHlDIDwgMC4wIHx8IGR5QyA+PSAke2NvbnZJbmZvLm91dFdpZHRofS4wIHx8XG4gICAgICAgICAgICAgICAgZnJhY3QoZHlDKSA+IDAuMCkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGludCBpZHlDID0gaW50KGR5Qyk7XG5cbiAgICAgICAgICAgIGludCB3Q1Blcm0gPSAke2ZpbHRlcldpZHRofSAtIDEgLSB3QztcblxuICAgICAgICAgICAgLy8gVE8gRE86IFZlYzQgb3ZlciB0aGUgY2hhbm5lbE11bFxuICAgICAgICAgICAgZm9yIChpbnQgZG0gPSAwOyBkbSA8ICR7Y2hhbm5lbE11bH07IGRtKyspIHtcbiAgICAgICAgICAgICAgaW50IGQyID0gZDEgKiAke2NoYW5uZWxNdWx9ICsgZG07XG4gICAgICAgICAgICAgIGZsb2F0IHhWYWx1ZSA9IGdldER5KGJhdGNoLCBpZHlSLCBpZHlDLCBkMik7XG4gICAgICAgICAgICAgIGZsb2F0IHdWYWx1ZSA9IGdldFcod1JQZXJtLCB3Q1Blcm0sIGQxLCBkbSk7XG4gICAgICAgICAgICAgIGRvdFByb2QgKz0geFZhbHVlICogd1ZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzZXRPdXRwdXQoZG90UHJvZCk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuXG5leHBvcnQgY2xhc3MgQ29udjJEUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ3gnLCAnVyddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBjb252SW5mbzogYmFja2VuZF91dGlsLkNvbnYyREluZm8sIGFkZEJpYXMgPSBmYWxzZSxcbiAgICAgIGFjdGl2YXRpb246IHN0cmluZyA9IG51bGwsIGhhc1ByZWx1QWN0aXZhdGlvbldlaWdodHMgPSBmYWxzZSxcbiAgICAgIGhhc0xlYWt5cmVsdUFscGhhID0gZmFsc2UpIHtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gY29udkluZm8ub3V0U2hhcGU7XG4gICAgY29uc3QgcGFkVG9wID0gY29udkluZm8ucGFkSW5mby50b3A7XG4gICAgY29uc3QgcGFkTGVmdCA9IGNvbnZJbmZvLnBhZEluZm8ubGVmdDtcbiAgICBjb25zdCBzdHJpZGVIZWlnaHQgPSBjb252SW5mby5zdHJpZGVIZWlnaHQ7XG4gICAgY29uc3Qgc3RyaWRlV2lkdGggPSBjb252SW5mby5zdHJpZGVXaWR0aDtcbiAgICBjb25zdCBkaWxhdGlvbkhlaWdodCA9IGNvbnZJbmZvLmRpbGF0aW9uSGVpZ2h0O1xuICAgIGNvbnN0IGRpbGF0aW9uV2lkdGggPSBjb252SW5mby5kaWxhdGlvbldpZHRoO1xuICAgIGNvbnN0IGZpbHRlckhlaWdodCA9IGNvbnZJbmZvLmZpbHRlckhlaWdodDtcbiAgICBjb25zdCBmaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmZpbHRlcldpZHRoO1xuXG4gICAgY29uc3QgaW5wdXREZXB0aE5lYXJlc3RWZWM0ID0gTWF0aC5mbG9vcihjb252SW5mby5pbkNoYW5uZWxzIC8gNCkgKiA0O1xuICAgIGNvbnN0IGlucHV0RGVwdGhWZWM0UmVtYWluZGVyID0gY29udkluZm8uaW5DaGFubmVscyAlIDQ7XG4gICAgY29uc3QgaXNDaGFubmVsc0xhc3QgPSBjb252SW5mby5kYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNMYXN0JztcblxuICAgIGNvbnN0IHJvd0RpbSA9IGlzQ2hhbm5lbHNMYXN0ID8gMSA6IDI7XG4gICAgY29uc3QgY29sRGltID0gaXNDaGFubmVsc0xhc3QgPyAyIDogMztcbiAgICBjb25zdCBjaGFubmVsRGltID0gaXNDaGFubmVsc0xhc3QgPyAzIDogMTtcblxuICAgIGxldCBhY3RpdmF0aW9uU25pcHBldCA9ICcnLCBhcHBseUFjdGl2YXRpb25TbmlwcGV0ID0gJyc7XG4gICAgaWYgKGFjdGl2YXRpb24pIHtcbiAgICAgIGlmIChoYXNQcmVsdUFjdGl2YXRpb25XZWlnaHRzKSB7XG4gICAgICAgIGFjdGl2YXRpb25TbmlwcGV0ID0gYGZsb2F0IGFjdGl2YXRpb24oZmxvYXQgYSkge1xuICAgICAgICAgIGZsb2F0IGIgPSBnZXRQcmVsdUFjdGl2YXRpb25XZWlnaHRzQXRPdXRDb29yZHMoKTtcbiAgICAgICAgICAke2FjdGl2YXRpb259XG4gICAgICAgIH1gO1xuICAgICAgfSBlbHNlIGlmIChoYXNMZWFreXJlbHVBbHBoYSkge1xuICAgICAgICBhY3RpdmF0aW9uU25pcHBldCA9IGBmbG9hdCBhY3RpdmF0aW9uKGZsb2F0IGEpIHtcbiAgICAgICAgICBmbG9hdCBiID0gZ2V0TGVha3lyZWx1QWxwaGFBdE91dENvb3JkcygpO1xuICAgICAgICAgICR7YWN0aXZhdGlvbn1cbiAgICAgICAgfWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhY3RpdmF0aW9uU25pcHBldCA9IGBcbiAgICAgICAgICBmbG9hdCBhY3RpdmF0aW9uKGZsb2F0IHgpIHtcbiAgICAgICAgICAgICR7YWN0aXZhdGlvbn1cbiAgICAgICAgICB9XG4gICAgICAgIGA7XG4gICAgICB9XG5cbiAgICAgIGFwcGx5QWN0aXZhdGlvblNuaXBwZXQgPSBgcmVzdWx0ID0gYWN0aXZhdGlvbihyZXN1bHQpO2A7XG4gICAgfVxuXG4gICAgY29uc3QgYWRkQmlhc1NuaXBwZXQgPSBhZGRCaWFzID8gJ3Jlc3VsdCArPSBnZXRCaWFzQXRPdXRDb29yZHMoKTsnIDogJyc7XG4gICAgaWYgKGFkZEJpYXMpIHtcbiAgICAgIHRoaXMudmFyaWFibGVOYW1lcy5wdXNoKCdiaWFzJyk7XG4gICAgfVxuXG4gICAgaWYgKGhhc1ByZWx1QWN0aXZhdGlvbldlaWdodHMpIHtcbiAgICAgIHRoaXMudmFyaWFibGVOYW1lcy5wdXNoKCdwcmVsdUFjdGl2YXRpb25XZWlnaHRzJyk7XG4gICAgfVxuXG4gICAgaWYgKGhhc0xlYWt5cmVsdUFscGhhKSB7XG4gICAgICB0aGlzLnZhcmlhYmxlTmFtZXMucHVzaCgnbGVha3lyZWx1QWxwaGEnKTtcbiAgICB9XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgJHthY3RpdmF0aW9uU25pcHBldH1cblxuICAgICAgY29uc3QgaXZlYzIgc3RyaWRlcyA9IGl2ZWMyKCR7c3RyaWRlSGVpZ2h0fSwgJHtzdHJpZGVXaWR0aH0pO1xuICAgICAgY29uc3QgaXZlYzIgcGFkcyA9IGl2ZWMyKCR7cGFkVG9wfSwgJHtwYWRMZWZ0fSk7XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBiYXRjaCA9IGNvb3Jkc1swXTtcbiAgICAgICAgaW50IGQyID0gY29vcmRzWyR7Y2hhbm5lbERpbX1dO1xuXG4gICAgICAgIGl2ZWMyIHhSQ0Nvcm5lciA9XG4gICAgICAgICAgICBpdmVjMihjb29yZHNbJHtyb3dEaW19XSwgY29vcmRzWyR7Y29sRGltfV0pICogc3RyaWRlcyAtIHBhZHM7XG4gICAgICAgIGludCB4UkNvcm5lciA9IHhSQ0Nvcm5lci54O1xuICAgICAgICBpbnQgeENDb3JuZXIgPSB4UkNDb3JuZXIueTtcblxuICAgICAgICAvLyBDb252b2x2ZSB4KD8sID8sIGQxKSB3aXRoIHcoOiwgOiwgZDEsIGQyKSB0byBnZXQgeSh5UiwgeUMsIGQyKS5cbiAgICAgICAgLy8gPyA9IHRvIGJlIGRldGVybWluZWQuIDogPSBhY3Jvc3MgYWxsIHZhbHVlcyBpbiB0aGF0IGF4aXMuXG4gICAgICAgIGZsb2F0IGRvdFByb2QgPSAwLjA7XG4gICAgICAgIGZvciAoaW50IHdSID0gMDsgd1IgPCAke2ZpbHRlckhlaWdodH07IHdSKyspIHtcbiAgICAgICAgICBpbnQgeFIgPSB4UkNvcm5lciArIHdSICogJHtkaWxhdGlvbkhlaWdodH07XG5cbiAgICAgICAgICBpZiAoeFIgPCAwIHx8IHhSID49ICR7Y29udkluZm8uaW5IZWlnaHR9KSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmb3IgKGludCB3QyA9IDA7IHdDIDwgJHtmaWx0ZXJXaWR0aH07IHdDKyspIHtcbiAgICAgICAgICAgIGludCB4QyA9IHhDQ29ybmVyICsgd0MgKiAke2RpbGF0aW9uV2lkdGh9O1xuXG4gICAgICAgICAgICBpZiAoeEMgPCAwIHx8IHhDID49ICR7Y29udkluZm8uaW5XaWR0aH0pIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAoaW50IGQxID0gMDsgZDEgPCAke2lucHV0RGVwdGhOZWFyZXN0VmVjNH07IGQxICs9IDQpIHtcbiAgICAgICAgICAgICAgdmVjNCB3VmFsdWVzID0gdmVjNChcbiAgICAgICAgICAgICAgICBnZXRXKHdSLCB3QywgZDEsIGQyKSxcbiAgICAgICAgICAgICAgICBnZXRXKHdSLCB3QywgZDEgKyAxLCBkMiksXG4gICAgICAgICAgICAgICAgZ2V0Vyh3Uiwgd0MsIGQxICsgMiwgZDIpLFxuICAgICAgICAgICAgICAgIGdldFcod1IsIHdDLCBkMSArIDMsIGQyKVxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIGlmICgke2lzQ2hhbm5lbHNMYXN0fSkge1xuICAgICAgICAgICAgICAgIHZlYzQgeFZhbHVlcyA9IHZlYzQoXG4gICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCB4UiwgeEMsIGQxKSxcbiAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsIHhSLCB4QywgZDEgKyAxKSxcbiAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsIHhSLCB4QywgZDEgKyAyKSxcbiAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsIHhSLCB4QywgZDEgKyAzKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgZG90UHJvZCArPSBkb3QoeFZhbHVlcywgd1ZhbHVlcyk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmVjNCB4VmFsdWVzID0gdmVjNChcbiAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsIGQxLCB4UiwgeEMpLFxuICAgICAgICAgICAgICAgICAgZ2V0WChiYXRjaCwgZDEgKyAxLCB4UiwgeEMpLFxuICAgICAgICAgICAgICAgICAgZ2V0WChiYXRjaCwgZDEgKyAyLCB4UiwgeEMpLFxuICAgICAgICAgICAgICAgICAgZ2V0WChiYXRjaCwgZDEgKyAzLCB4UiwgeEMpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBkb3RQcm9kICs9IGRvdCh4VmFsdWVzLCB3VmFsdWVzKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoJHtpbnB1dERlcHRoVmVjNFJlbWFpbmRlciA9PT0gMX0pIHtcblxuICAgICAgICAgICAgICBpZiAoJHtpc0NoYW5uZWxzTGFzdH0pIHtcbiAgICAgICAgICAgICAgICBkb3RQcm9kICs9XG4gICAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsIHhSLCB4QywgJHtpbnB1dERlcHRoTmVhcmVzdFZlYzR9KSAqXG4gICAgICAgICAgICAgICAgICAgIGdldFcod1IsIHdDLCAke2lucHV0RGVwdGhOZWFyZXN0VmVjNH0sIGQyKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkb3RQcm9kICs9XG4gICAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fSwgeFIsIHhDKSAqXG4gICAgICAgICAgICAgICAgICAgIGdldFcod1IsIHdDLCAke2lucHV0RGVwdGhOZWFyZXN0VmVjNH0sIGQyKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9IGVsc2UgaWYgKCR7aW5wdXREZXB0aFZlYzRSZW1haW5kZXIgPT09IDJ9KSB7XG4gICAgICAgICAgICAgIHZlYzIgd1ZhbHVlcyA9IHZlYzIoXG4gICAgICAgICAgICAgICAgZ2V0Vyh3Uiwgd0MsICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fSwgZDIpLFxuICAgICAgICAgICAgICAgIGdldFcod1IsIHdDLCAke2lucHV0RGVwdGhOZWFyZXN0VmVjNH0gKyAxLCBkMilcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICBpZiAoJHtpc0NoYW5uZWxzTGFzdH0pIHtcbiAgICAgICAgICAgICAgICB2ZWMyIHhWYWx1ZXMgPSB2ZWMyKFxuICAgICAgICAgICAgICAgICAgZ2V0WChiYXRjaCwgeFIsIHhDLCAke2lucHV0RGVwdGhOZWFyZXN0VmVjNH0pLFxuICAgICAgICAgICAgICAgICAgZ2V0WChiYXRjaCwgeFIsIHhDLCAke2lucHV0RGVwdGhOZWFyZXN0VmVjNH0gKyAxKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgZG90UHJvZCArPSBkb3QoeFZhbHVlcywgd1ZhbHVlcyk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmVjMiB4VmFsdWVzID0gdmVjMihcbiAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fSwgeFIsIHhDKSxcbiAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fSArIDEsIHhSLCB4QylcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGRvdFByb2QgKz0gZG90KHhWYWx1ZXMsIHdWYWx1ZXMpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoJHtpbnB1dERlcHRoVmVjNFJlbWFpbmRlciA9PT0gM30pIHtcbiAgICAgICAgICAgICAgdmVjMyB3VmFsdWVzID0gdmVjMyhcbiAgICAgICAgICAgICAgICBnZXRXKHdSLCB3QywgJHtpbnB1dERlcHRoTmVhcmVzdFZlYzR9LCBkMiksXG4gICAgICAgICAgICAgICAgZ2V0Vyh3Uiwgd0MsICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fSArIDEsIGQyKSxcbiAgICAgICAgICAgICAgICBnZXRXKHdSLCB3QywgJHtpbnB1dERlcHRoTmVhcmVzdFZlYzR9ICsgMiwgZDIpXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgaWYgKCR7aXNDaGFubmVsc0xhc3R9KSB7XG4gICAgICAgICAgICAgICAgdmVjMyB4VmFsdWVzID0gdmVjMyhcbiAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsIHhSLCB4QywgJHtpbnB1dERlcHRoTmVhcmVzdFZlYzR9KSxcbiAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsIHhSLCB4QywgJHtpbnB1dERlcHRoTmVhcmVzdFZlYzR9ICsgMSksXG4gICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCB4UiwgeEMsICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fSArIDIpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBkb3RQcm9kICs9IGRvdCh4VmFsdWVzLCB3VmFsdWVzKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2ZWMzIHhWYWx1ZXMgPSB2ZWMzKFxuICAgICAgICAgICAgICAgICAgZ2V0WChiYXRjaCwgJHtpbnB1dERlcHRoTmVhcmVzdFZlYzR9LCB4UiwgeEMpLFxuICAgICAgICAgICAgICAgICAgZ2V0WChiYXRjaCwgJHtpbnB1dERlcHRoTmVhcmVzdFZlYzR9ICsgMSwgeFIsIHhDKSxcbiAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fSArIDIsIHhSLCB4QylcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGRvdFByb2QgKz0gZG90KHhWYWx1ZXMsIHdWYWx1ZXMpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmbG9hdCByZXN1bHQgPSBkb3RQcm9kO1xuICAgICAgICAke2FkZEJpYXNTbmlwcGV0fVxuICAgICAgICAke2FwcGx5QWN0aXZhdGlvblNuaXBwZXR9XG4gICAgICAgIHNldE91dHB1dChyZXN1bHQpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbnYzRFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWyd4JywgJ1cnXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGNvbnZJbmZvOiBiYWNrZW5kX3V0aWwuQ29udjNESW5mbykge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBjb252SW5mby5vdXRTaGFwZTtcbiAgICBjb25zdCBwYWRGcm9udCA9IGNvbnZJbmZvLnBhZEluZm8uZnJvbnQ7XG4gICAgY29uc3QgcGFkVG9wID0gY29udkluZm8ucGFkSW5mby50b3A7XG4gICAgY29uc3QgcGFkTGVmdCA9IGNvbnZJbmZvLnBhZEluZm8ubGVmdDtcbiAgICBjb25zdCBzdHJpZGVEZXB0aCA9IGNvbnZJbmZvLnN0cmlkZURlcHRoO1xuICAgIGNvbnN0IHN0cmlkZUhlaWdodCA9IGNvbnZJbmZvLnN0cmlkZUhlaWdodDtcbiAgICBjb25zdCBzdHJpZGVXaWR0aCA9IGNvbnZJbmZvLnN0cmlkZVdpZHRoO1xuICAgIGNvbnN0IGRpbGF0aW9uRGVwdGggPSBjb252SW5mby5kaWxhdGlvbkRlcHRoO1xuICAgIGNvbnN0IGRpbGF0aW9uSGVpZ2h0ID0gY29udkluZm8uZGlsYXRpb25IZWlnaHQ7XG4gICAgY29uc3QgZGlsYXRpb25XaWR0aCA9IGNvbnZJbmZvLmRpbGF0aW9uV2lkdGg7XG4gICAgY29uc3QgZmlsdGVyRGVwdGggPSBjb252SW5mby5maWx0ZXJEZXB0aDtcbiAgICBjb25zdCBmaWx0ZXJIZWlnaHQgPSBjb252SW5mby5maWx0ZXJIZWlnaHQ7XG4gICAgY29uc3QgZmlsdGVyV2lkdGggPSBjb252SW5mby5maWx0ZXJXaWR0aDtcblxuICAgIGNvbnN0IGlucHV0RGVwdGhOZWFyZXN0VmVjNCA9IE1hdGguZmxvb3IoY29udkluZm8uaW5DaGFubmVscyAvIDQpICogNDtcbiAgICBjb25zdCBpbnB1dERlcHRoVmVjNFJlbWFpbmRlciA9IGNvbnZJbmZvLmluQ2hhbm5lbHMgJSA0O1xuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGNvbnN0IGl2ZWMzIHN0cmlkZXMgPSBpdmVjMygke3N0cmlkZURlcHRofSwgJHtzdHJpZGVIZWlnaHR9LCAke1xuICAgICAgICBzdHJpZGVXaWR0aH0pO1xuICAgICAgY29uc3QgaXZlYzMgcGFkcyA9IGl2ZWMzKCR7cGFkRnJvbnR9LCAke3BhZFRvcH0sICR7cGFkTGVmdH0pO1xuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWM1IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgYmF0Y2ggPSBjb29yZHMueDtcbiAgICAgICAgaW50IGQyID0gY29vcmRzLnU7XG5cbiAgICAgICAgaXZlYzMgeEZSQ0Nvcm5lciA9IGl2ZWMzKGNvb3Jkcy55LCBjb29yZHMueiwgY29vcmRzLncpICogc3RyaWRlcyAtIHBhZHM7XG4gICAgICAgIGludCB4RkNvcm5lciA9IHhGUkNDb3JuZXIueDtcbiAgICAgICAgaW50IHhSQ29ybmVyID0geEZSQ0Nvcm5lci55O1xuICAgICAgICBpbnQgeENDb3JuZXIgPSB4RlJDQ29ybmVyLno7XG5cbiAgICAgICAgLy8gQ29udm9sdmUgeCg/LCA/LCA/LCBkMSkgd2l0aCB3KDosIDosIDosIGQxLCBkMikgdG8gZ2V0XG4gICAgICAgIC8vIHkoeUYsIHlSLCB5QywgZDIpLiA/ID0gdG8gYmUgZGV0ZXJtaW5lZC4gOiA9IGFjcm9zcyBhbGxcbiAgICAgICAgLy8gdmFsdWVzIGluIHRoYXQgYXhpcy5cbiAgICAgICAgZmxvYXQgZG90UHJvZCA9IDAuMDtcbiAgICAgICAgZm9yIChpbnQgd0YgPSAwOyB3RiA8ICR7ZmlsdGVyRGVwdGh9OyB3RisrKSB7XG4gICAgICAgICAgaW50IHhGID0geEZDb3JuZXIgKyB3RiAqICR7ZGlsYXRpb25EZXB0aH07XG5cbiAgICAgICAgICBpZiAoeEYgPCAwIHx8IHhGID49ICR7Y29udkluZm8uaW5EZXB0aH0pIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZvciAoaW50IHdSID0gMDsgd1IgPCAke2ZpbHRlckhlaWdodH07IHdSKyspIHtcbiAgICAgICAgICAgIGludCB4UiA9IHhSQ29ybmVyICsgd1IgKiAke2RpbGF0aW9uSGVpZ2h0fTtcblxuICAgICAgICAgICAgaWYgKHhSIDwgMCB8fCB4UiA+PSAke2NvbnZJbmZvLmluSGVpZ2h0fSkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChpbnQgd0MgPSAwOyB3QyA8ICR7ZmlsdGVyV2lkdGh9OyB3QysrKSB7XG4gICAgICAgICAgICAgIGludCB4QyA9IHhDQ29ybmVyICsgd0MgKiAke2RpbGF0aW9uV2lkdGh9O1xuXG4gICAgICAgICAgICAgIGlmICh4QyA8IDAgfHwgeEMgPj0gJHtjb252SW5mby5pbldpZHRofSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgZm9yIChpbnQgZDEgPSAwOyBkMSA8ICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fTsgZDEgKz0gNCkge1xuICAgICAgICAgICAgICAgIHZlYzQgeFZhbHVlcyA9IHZlYzQoXG4gICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCB4RiwgeFIsIHhDLCBkMSksXG4gICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCB4RiwgeFIsIHhDLCBkMSArIDEpLFxuICAgICAgICAgICAgICAgICAgZ2V0WChiYXRjaCwgeEYsIHhSLCB4QywgZDEgKyAyKSxcbiAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsIHhGLCB4UiwgeEMsIGQxICsgMylcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHZlYzQgd1ZhbHVlcyA9IHZlYzQoXG4gICAgICAgICAgICAgICAgICBnZXRXKHdGLCB3Uiwgd0MsIGQxLCBkMiksXG4gICAgICAgICAgICAgICAgICBnZXRXKHdGLCB3Uiwgd0MsIGQxICsgMSwgZDIpLFxuICAgICAgICAgICAgICAgICAgZ2V0Vyh3Riwgd1IsIHdDLCBkMSArIDIsIGQyKSxcbiAgICAgICAgICAgICAgICAgIGdldFcod0YsIHdSLCB3QywgZDEgKyAzLCBkMilcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgZG90UHJvZCArPSBkb3QoeFZhbHVlcywgd1ZhbHVlcyk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAoJHtpbnB1dERlcHRoVmVjNFJlbWFpbmRlciA9PT0gMX0pIHtcbiAgICAgICAgICAgICAgICBkb3RQcm9kICs9XG4gICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCB4RiwgeFIsIHhDLCAke2lucHV0RGVwdGhOZWFyZXN0VmVjNH0pICpcbiAgICAgICAgICAgICAgICAgIGdldFcod0YsIHdSLCB3QywgJHtpbnB1dERlcHRoTmVhcmVzdFZlYzR9LCBkMik7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoJHtpbnB1dERlcHRoVmVjNFJlbWFpbmRlciA9PT0gMn0pIHtcbiAgICAgICAgICAgICAgICB2ZWMyIHhWYWx1ZXMgPSB2ZWMyKFxuICAgICAgICAgICAgICAgICAgZ2V0WChiYXRjaCwgeEYsIHhSLCB4QywgJHtpbnB1dERlcHRoTmVhcmVzdFZlYzR9KSxcbiAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsIHhGLCB4UiwgeEMsICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fSArIDEpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB2ZWMyIHdWYWx1ZXMgPSB2ZWMyKFxuICAgICAgICAgICAgICAgICAgZ2V0Vyh3Riwgd1IsIHdDLCAke2lucHV0RGVwdGhOZWFyZXN0VmVjNH0sIGQyKSxcbiAgICAgICAgICAgICAgICAgIGdldFcod0YsIHdSLCB3QywgJHtpbnB1dERlcHRoTmVhcmVzdFZlYzR9ICsgMSwgZDIpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBkb3RQcm9kICs9IGRvdCh4VmFsdWVzLCB3VmFsdWVzKTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmICgke2lucHV0RGVwdGhWZWM0UmVtYWluZGVyID09PSAzfSkge1xuICAgICAgICAgICAgICAgIHZlYzMgeFZhbHVlcyA9IHZlYzMoXG4gICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCB4RiwgeFIsIHhDLCAke2lucHV0RGVwdGhOZWFyZXN0VmVjNH0pLFxuICAgICAgICAgICAgICAgICAgZ2V0WChiYXRjaCwgeEYsIHhSLCB4QywgJHtpbnB1dERlcHRoTmVhcmVzdFZlYzR9ICsgMSksXG4gICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCB4RiwgeFIsIHhDLCAke2lucHV0RGVwdGhOZWFyZXN0VmVjNH0gKyAyKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgdmVjMyB3VmFsdWVzID0gdmVjMyhcbiAgICAgICAgICAgICAgICAgIGdldFcod0YsIHdSLCB3QywgJHtpbnB1dERlcHRoTmVhcmVzdFZlYzR9LCBkMiksXG4gICAgICAgICAgICAgICAgICBnZXRXKHdGLCB3Uiwgd0MsICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fSArIDEsIGQyKSxcbiAgICAgICAgICAgICAgICAgIGdldFcod0YsIHdSLCB3QywgJHtpbnB1dERlcHRoTmVhcmVzdFZlYzR9ICsgMiwgZDIpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBkb3RQcm9kICs9IGRvdCh4VmFsdWVzLCB3VmFsdWVzKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzZXRPdXRwdXQoZG90UHJvZCk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7R1BHUFVQcm9ncmFtLCB1c2VTaGFwZVVuaWZvcm1zfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuXG5leHBvcnQgY2xhc3MgRGVwdGh3aXNlQ29udjJEUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ3gnLCAnVyddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIGVuYWJsZVNoYXBlVW5pZm9ybXM6IGJvb2xlYW47XG4gIGN1c3RvbVVuaWZvcm1zID0gW1xuICAgIHtuYW1lOiAncGFkcycsIHR5cGU6ICdpdmVjMicgYXMgY29uc3QgfSxcbiAgICB7bmFtZTogJ3N0cmlkZXMnLCB0eXBlOiAnaXZlYzInIGFzIGNvbnN0IH0sXG4gICAge25hbWU6ICdkaWxhdGlvbnMnLCB0eXBlOiAnaXZlYzInIGFzIGNvbnN0IH0sXG4gICAge25hbWU6ICdpbkRpbXMnLCB0eXBlOiAnaXZlYzInIGFzIGNvbnN0IH0sXG4gIF07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBjb252SW5mbzogYmFja2VuZF91dGlsLkNvbnYyREluZm8sIGFkZEJpYXMgPSBmYWxzZSxcbiAgICAgIGFjdGl2YXRpb246IHN0cmluZyA9IG51bGwsIGhhc1ByZWx1QWN0aXZhdGlvbiA9IGZhbHNlLFxuICAgICAgaGFzTGVha3lSZWx1QWxwaGEgPSBmYWxzZSkge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBjb252SW5mby5vdXRTaGFwZTtcbiAgICB0aGlzLmVuYWJsZVNoYXBlVW5pZm9ybXMgPSB1c2VTaGFwZVVuaWZvcm1zKHRoaXMub3V0cHV0U2hhcGUubGVuZ3RoKTtcblxuICAgIGNvbnN0IGZpbHRlckhlaWdodCA9IGNvbnZJbmZvLmZpbHRlckhlaWdodDtcbiAgICBjb25zdCBmaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmZpbHRlcldpZHRoO1xuICAgIGNvbnN0IGNoYW5uZWxNdWwgPSBjb252SW5mby5vdXRDaGFubmVscyAvIGNvbnZJbmZvLmluQ2hhbm5lbHM7XG5cbiAgICBsZXQgYWN0aXZhdGlvblNuaXBwZXQgPSAnJywgYXBwbHlBY3RpdmF0aW9uU25pcHBldCA9ICcnO1xuICAgIGlmIChhY3RpdmF0aW9uKSB7XG4gICAgICBpZiAoaGFzUHJlbHVBY3RpdmF0aW9uKSB7XG4gICAgICAgIGFjdGl2YXRpb25TbmlwcGV0ID0gYGZsb2F0IGFjdGl2YXRpb24oZmxvYXQgYSkge1xuICAgICAgICAgIGZsb2F0IGIgPSBnZXRQcmVsdUFjdGl2YXRpb25XZWlnaHRzQXRPdXRDb29yZHMoKTtcbiAgICAgICAgICAke2FjdGl2YXRpb259XG4gICAgICAgIH1gO1xuICAgICAgfSBlbHNlIGlmIChoYXNMZWFreVJlbHVBbHBoYSkge1xuICAgICAgICBhY3RpdmF0aW9uU25pcHBldCA9IGBmbG9hdCBhY3RpdmF0aW9uKGZsb2F0IGEpIHtcbiAgICAgICAgICBmbG9hdCBiID0gZ2V0TGVha3lyZWx1QWxwaGFBdE91dENvb3JkcygpO1xuICAgICAgICAgICR7YWN0aXZhdGlvbn1cbiAgICAgICAgfWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhY3RpdmF0aW9uU25pcHBldCA9IGBcbiAgICAgICAgICBmbG9hdCBhY3RpdmF0aW9uKGZsb2F0IHgpIHtcbiAgICAgICAgICAgICR7YWN0aXZhdGlvbn1cbiAgICAgICAgICB9XG4gICAgICAgIGA7XG4gICAgICB9XG5cbiAgICAgIGFwcGx5QWN0aXZhdGlvblNuaXBwZXQgPSBgcmVzdWx0ID0gYWN0aXZhdGlvbihyZXN1bHQpO2A7XG4gICAgfVxuXG4gICAgY29uc3QgYWRkQmlhc1NuaXBwZXQgPSBhZGRCaWFzID8gJ3Jlc3VsdCArPSBnZXRCaWFzQXRPdXRDb29yZHMoKTsnIDogJyc7XG4gICAgaWYgKGFkZEJpYXMpIHtcbiAgICAgIHRoaXMudmFyaWFibGVOYW1lcy5wdXNoKCdiaWFzJyk7XG4gICAgfVxuXG4gICAgaWYgKGhhc1ByZWx1QWN0aXZhdGlvbikge1xuICAgICAgdGhpcy52YXJpYWJsZU5hbWVzLnB1c2goJ3ByZWx1QWN0aXZhdGlvbldlaWdodHMnKTtcbiAgICB9XG4gICAgaWYgKGhhc0xlYWt5UmVsdUFscGhhKSB7XG4gICAgICB0aGlzLnZhcmlhYmxlTmFtZXMucHVzaCgnbGVha3lyZWx1QWxwaGEnKTtcbiAgICB9XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgJHthY3RpdmF0aW9uU25pcHBldH1cblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjNCBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IGJhdGNoID0gY29vcmRzLng7XG4gICAgICAgIGl2ZWMyIHhSQ0Nvcm5lciA9IGNvb3Jkcy55eiAqIHN0cmlkZXMgLSBwYWRzO1xuICAgICAgICBpbnQgZDIgPSBjb29yZHMudztcbiAgICAgICAgaW50IGQxID0gZDIgLyAke2NoYW5uZWxNdWx9O1xuICAgICAgICBpbnQgcSA9IGQyIC0gZDEgKiAke2NoYW5uZWxNdWx9O1xuXG4gICAgICAgIGludCB4UkNvcm5lciA9IHhSQ0Nvcm5lci54O1xuICAgICAgICBpbnQgeENDb3JuZXIgPSB4UkNDb3JuZXIueTtcblxuICAgICAgICAvLyBDb252b2x2ZSB4KD8sID8sIGQxKSB3aXRoIHcoOiwgOiwgZDEsIHEpIHRvIGdldCB5KHlSLCB5QywgZDIpLlxuICAgICAgICAvLyA/ID0gdG8gYmUgZGV0ZXJtaW5lZC4gOiA9IGFjcm9zcyBhbGwgdmFsdWVzIGluIHRoYXQgYXhpcy5cbiAgICAgICAgZmxvYXQgZG90UHJvZCA9IDAuMDtcbiAgICAgICAgLy8gVE8gRE8oZHNtaWxrb3YpOiBGbGF0dGVuIHRoZSB0d28gZm9yIGxvb3BzIGFuZCB2ZWM0IHRoZSBvcGVyYXRpb25zLlxuICAgICAgICBmb3IgKGludCB3UiA9IDA7IHdSIDwgJHtmaWx0ZXJIZWlnaHR9OyB3UisrKSB7XG4gICAgICAgICAgaW50IHhSID0geFJDb3JuZXIgKyB3UiAqIGRpbGF0aW9uc1swXTtcblxuICAgICAgICAgIGlmICh4UiA8IDAgfHwgeFIgPj0gaW5EaW1zWzBdKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmb3IgKGludCB3QyA9IDA7IHdDIDwgJHtmaWx0ZXJXaWR0aH07IHdDKyspIHtcbiAgICAgICAgICAgIGludCB4QyA9IHhDQ29ybmVyICsgd0MgKiBkaWxhdGlvbnNbMV07XG5cbiAgICAgICAgICAgIGlmICh4QyA8IDAgfHwgeEMgPj0gaW5EaW1zWzFdKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmbG9hdCB4VmFsID0gZ2V0WChiYXRjaCwgeFIsIHhDLCBkMSk7XG4gICAgICAgICAgICBmbG9hdCB3VmFsID0gZ2V0Vyh3Uiwgd0MsIGQxLCBxKTtcbiAgICAgICAgICAgIGRvdFByb2QgKz0geFZhbCAqIHdWYWw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZmxvYXQgcmVzdWx0ID0gZG90UHJvZDtcbiAgICAgICAgJHthZGRCaWFzU25pcHBldH1cbiAgICAgICAgJHthcHBseUFjdGl2YXRpb25TbmlwcGV0fVxuICAgICAgICBzZXRPdXRwdXQocmVzdWx0KTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge0dQR1BVUHJvZ3JhbSwgdXNlU2hhcGVVbmlmb3Jtc30gZnJvbSAnLi9ncGdwdV9tYXRoJztcblxuZXhwb3J0IGNsYXNzIERlcHRod2lzZUNvbnZQYWNrZWQyRFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWyd4JywgJ1cnXTtcbiAgcGFja2VkSW5wdXRzID0gdHJ1ZTtcbiAgcGFja2VkT3V0cHV0ID0gdHJ1ZTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuICBlbmFibGVTaGFwZVVuaWZvcm1zOiBib29sZWFuO1xuICBjdXN0b21Vbmlmb3JtcyA9IFtcbiAgICB7bmFtZTogJ3BhZHMnLCB0eXBlOiAnaXZlYzInIGFzIGNvbnN0IH0sXG4gICAge25hbWU6ICdzdHJpZGVzJywgdHlwZTogJ2l2ZWMyJyBhcyBjb25zdCB9LFxuICAgIHtuYW1lOiAnZGlsYXRpb25zJywgdHlwZTogJ2l2ZWMyJyBhcyBjb25zdCB9LFxuICAgIHtuYW1lOiAnaW5EaW1zJywgdHlwZTogJ2l2ZWMyJyBhcyBjb25zdCB9LFxuICBdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgY29udkluZm86IGJhY2tlbmRfdXRpbC5Db252MkRJbmZvLCBhZGRCaWFzID0gZmFsc2UsXG4gICAgICBhY3RpdmF0aW9uOiBzdHJpbmcgPSBudWxsLCBoYXNQcmVsdUFjdGl2YXRpb24gPSBmYWxzZSxcbiAgICAgIGhhc0xlYWt5UmVsdUFscGhhID0gZmFsc2UpIHtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gY29udkluZm8ub3V0U2hhcGU7XG4gICAgdGhpcy5lbmFibGVTaGFwZVVuaWZvcm1zID0gdXNlU2hhcGVVbmlmb3Jtcyh0aGlzLm91dHB1dFNoYXBlLmxlbmd0aCk7XG4gICAgY29uc3QgY2hhbm5lbE11bCA9IGNvbnZJbmZvLm91dENoYW5uZWxzIC8gY29udkluZm8uaW5DaGFubmVscztcbiAgICBjb25zdCBwYWRMZWZ0ID0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuICAgIGNvbnN0IHN0cmlkZVdpZHRoID0gY29udkluZm8uc3RyaWRlV2lkdGg7XG4gICAgY29uc3QgZGlsYXRpb25XaWR0aCA9IGNvbnZJbmZvLmRpbGF0aW9uV2lkdGg7XG4gICAgY29uc3QgZmlsdGVySGVpZ2h0ID0gY29udkluZm8uZmlsdGVySGVpZ2h0O1xuICAgIGNvbnN0IGZpbHRlcldpZHRoID0gY29udkluZm8uZmlsdGVyV2lkdGg7XG4gICAgY29uc3QgdGV4ZWxzQWNyb3NzID0gZmlsdGVyV2lkdGg7XG5cbiAgICBsZXQgbWFpbkxvb3AgPSBgXG4gICAgICBpbnQgeFI7IGludCB4QzsgaW50IHhDT2Zmc2V0O1xuICAgICAgdmVjNCB3VGV4ZWw7IHZlYzQgcHJldmlvdXM7IHZlYzQgZmluYWw7YDtcblxuICAgIGZvciAobGV0IGMgPSAwOyBjIDwgZmlsdGVyV2lkdGg7IGMrKykge1xuICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICAgIHZlYzQgeFRleGVsQyR7YyAqIDJ9O1xuICAgICAgICAgIGludCB4VGV4ZWxDJHtjICogMn1SZWFkeTtcbiAgICAgICAgICB2ZWM0IHhUZXhlbEMke2MgKiAyICsgMX07XG4gICAgICAgICAgaW50IHhUZXhlbEMke2MgKiAyICsgMX1SZWFkeTtcbiAgICAgICAgICB2ZWM0IHhDJHtjfTtgO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgdmVjdG9yaXplZCBpbXBsZW1lbnRhdGlvbiB3b3JrcyBieSBnYXRoZXJpbmcgdGhlIHZhbHVlcyBuZWVkZWQgZm9yXG4gICAgICogZWFjaCBvdXRwdXQgY2hhbm5lbCdzIGRvdCBwcm9kdWN0IGludG8gdmVjNCdzIGFuZCB0aGVuIG11bHRpcGx5aW5nIHRoZW1cbiAgICAgKiBhbGwgdG9nZXRoZXIgKHRoaXMgaGFwcGVucyBpbiB0aGUgZmluYWwgZG91YmxlIGZvci1sb29wIGJlbG93KS4gTW9zdCBvZlxuICAgICAqIHRoZSBtYWluIGxvb3AgY29uc2lzdHMgb2YgY29uc3RydWN0aW5nIHRoZXNlIHZlYzQncyB3aXRoIHRoZSBtaW5pbXVtXG4gICAgICogbnVtYmVyIG9mIHRleHR1cmUyRCBjYWxscywgd2hpY2ggbWVhbnMgbWFraW5nIHVzZSBvZiBhbGwgZm91ciByZXR1cm5lZFxuICAgICAqIHZhbHVlcyBmcm9tIGEgdGV4dHVyZTJEIGNhbGwgYXQgb25jZS5cbiAgICAgKi9cbiAgICBmb3IgKGxldCByID0gMDsgciA8IGZpbHRlckhlaWdodDsgcisrKSB7XG4gICAgICBmb3IgKGxldCBjID0gMDsgYyA8IGZpbHRlcldpZHRoOyBjKyspIHtcbiAgICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICAgIHhUZXhlbEMke2MgKiAyfSA9IHZlYzQoMC4wKTtcbiAgICAgICAgICB4VGV4ZWxDJHtjICogMn1SZWFkeSA9IDA7XG4gICAgICAgICAgeFRleGVsQyR7YyAqIDIgKyAxfSA9IHZlYzQoMC4wKTtcbiAgICAgICAgICB4VGV4ZWxDJHtjICogMiArIDF9UmVhZHkgPSAwO1xuICAgICAgICAgIHhDJHtjfSA9IHZlYzQoMC4wKTtgO1xuICAgICAgfVxuICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICB4UiA9IHhSQ29ybmVyICsgJHtyfSAqIGRpbGF0aW9uc1swXTtcbiAgICAgICAgaWYgKHhSID49MCAmJiB4UiA8IGluRGltc1swXSkge1xuICAgICAgYDtcblxuICAgICAgZm9yIChsZXQgdGV4ZWxDID0gMDsgdGV4ZWxDIDwgKHRleGVsc0Fjcm9zcyArIDEpIC8gMjsgdGV4ZWxDKyspIHtcbiAgICAgICAgY29uc3QgY29sSW5kZXggPSB0ZXhlbEMgKiAyO1xuXG4gICAgICAgIG1haW5Mb29wICs9IGBcbiAgICAgICAgICB4QyA9IHhDQ29ybmVyICsgJHtjb2xJbmRleCAqIGRpbGF0aW9uV2lkdGh9O1xuICAgICAgICAgIGA7XG5cbiAgICAgICAgaWYgKHN0cmlkZVdpZHRoID09PSAxKSB7XG4gICAgICAgICAgaWYgKGNvbEluZGV4IDwgZmlsdGVyV2lkdGgpIHtcbiAgICAgICAgICAgIC8vIElmIHBhZGRpbmcgaXMgb2RkLCB0aGUgb3V0ZXIgdGV4ZWxzIGhhdmUgdG8gYmUgY29tcG9zZWQuXG4gICAgICAgICAgICBpZiAocGFkTGVmdCAlIDIgPT09IDEpIHtcbiAgICAgICAgICAgICAgLy8gVE9ETzogRW5zdXJlIHZlYzQgcHJldmlvdXMgZG9lcyBub3QgcmVzdWx0IGluIHJlZHVuZGFudCBzYW1wbGUsXG4gICAgICAgICAgICAgIC8vIGFuZCBhdm9pZCBzZXR0aW5nIHhUZXhlbFJDJ3MgdGhhdCBleGNlZWQgdGhlIGJvdW5kYXJ5IGluIHRoZVxuICAgICAgICAgICAgICAvLyBmaXJzdCBwbGFjZSByYXRoZXIgdGhhbiByZXNldHRpbmcgdGhlbSB0byB2ZWM0KDApKS5cblxuICAgICAgICAgICAgICAvLyBUbyBjb21wdXRlIHhDT2Zmc2V0OlxuICAgICAgICAgICAgICAvLyAtIElmIHBhZGRpbmcgaXMgb2RkLCB3ZSBtdXN0IGFkZCAxIHRvIGVuc3VyZSB3ZSBhc2sgZm9yIGFuXG4gICAgICAgICAgICAgIC8vIGV2ZW4tbnVtYmVyZWQgcm93LlxuICAgICAgICAgICAgICAvLyAtIFdlIHN1YnRyYWN0IDIgdG8gYWNjZXNzIHRoZSBwcmV2aW91cyB0ZXhlbC5cblxuICAgICAgICAgICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgICAgICAgICAgeENPZmZzZXQgPSB4QyArIDE7XG4gICAgICAgICAgICAgICAgaWYgKHhDT2Zmc2V0ID49IDAgJiYgeENPZmZzZXQgPCBpbkRpbXNbMV0gJiYgeFRleGVsQyR7XG4gICAgICAgICAgICAgICAgICBjb2xJbmRleH1SZWFkeSA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleH0gPSBnZXRYKGJhdGNoLCB4UiwgeENPZmZzZXQsIGQxKTtcblxuICAgICAgICAgICAgICAgICAgLy8gTmVlZCB0byBtYW51YWxseSBjbGVhciB1bnVzZWQgY2hhbm5lbHMgaW4gY2FzZVxuICAgICAgICAgICAgICAgICAgLy8gd2UncmUgcmVhZGluZyBmcm9tIHJlY3ljbGVkIHRleHR1cmUuXG4gICAgICAgICAgICAgICAgICBpZiAoeENPZmZzZXQgKyAxID49IGluRGltc1sxXSkge1xuICAgICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleH0uencgPSB2ZWMyKDAuMCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleH1SZWFkeSA9IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBgO1xuICAgICAgICAgICAgICAvLyBUaGlzIHRleGVsIGhhcyBiZWVuIHJlYWQgaW4gcHJldmlvdXMgaXRlcmF0aW9uIGlmIHRoZSBkaWxhdGlvblxuICAgICAgICAgICAgICAvLyBpcyAxLlxuICAgICAgICAgICAgICBpZiAoZGlsYXRpb25XaWR0aCA9PT0gMSAmJiBjb2xJbmRleCA+IDApIHtcbiAgICAgICAgICAgICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgICAgICAgICAgeEMke2NvbEluZGV4fSA9IHZlYzQoeFRleGVsQyR7Y29sSW5kZXggLSAyfS56dywgeFRleGVsQyR7XG4gICAgICAgICAgICAgICAgICAgIGNvbEluZGV4fS54eSk7XG4gICAgICAgICAgICAgICAgYDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgICAgICAgICAgICB4Q09mZnNldCA9IHhDICsgMSAtIDI7XG5cbiAgICAgICAgICAgICAgICAgIGlmICh4Q09mZnNldCA+PSAwICYmIHhDT2Zmc2V0IDwgaW5EaW1zWzFdKSB7XG4gICAgICAgICAgICAgICAgICAgIHByZXZpb3VzID0gZ2V0WChiYXRjaCwgeFIsIHhDT2Zmc2V0LCBkMSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gTmVlZCB0byBtYW51YWxseSBjbGVhciB1bnVzZWQgY2hhbm5lbHMgaW4gY2FzZVxuICAgICAgICAgICAgICAgICAgICAvLyB3ZSdyZSByZWFkaW5nIGZyb20gcmVjeWNsZWQgdGV4dHVyZS5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHhDT2Zmc2V0ICsgMSA+PSBpbkRpbXNbMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91cy56dyA9IHZlYzIoMC4wKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHhDJHtjb2xJbmRleH0gPSB2ZWM0KHByZXZpb3VzLnp3LCB4VGV4ZWxDJHtjb2xJbmRleH0ueHkpO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgeEMke2NvbEluZGV4fSA9IHZlYzQoMC4wLCAwLjAsIHhUZXhlbEMke2NvbEluZGV4fS54eSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBgO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBQYWRkaW5nIGlzIGV2ZW4sIHNvIHhSQyBjb3JyZXNwb25kcyB0byBhIHNpbmdsZSB0ZXhlbC5cbiAgICAgICAgICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICAgICAgICAgIGlmICh4QyA+PSAwICYmIHhDIDwgaW5EaW1zWzFdICYmIHhUZXhlbEMke2NvbEluZGV4fVJlYWR5ID09IDApIHtcbiAgICAgICAgICAgICAgICAgIHhUZXhlbEMke2NvbEluZGV4fSA9IGdldFgoYmF0Y2gsIHhSLCB4QywgZDEpO1xuICAgICAgICAgICAgICAgICAgaWYgKHhDICsgMSA+PSBpbkRpbXNbMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgeFRleGVsQyR7Y29sSW5kZXh9Lnp3ID0gdmVjMigwLjApO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgeFRleGVsQyR7Y29sSW5kZXh9UmVhZHkgPSAxO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHhDJHtjb2xJbmRleH0gPSB4VGV4ZWxDJHtjb2xJbmRleH07XG4gICAgICAgICAgICAgICAgYDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNvbEluZGV4ICsgMSA8IGZpbHRlcldpZHRoKSB7XG4gICAgICAgICAgICAgIC8vIElmIGRpbGF0aW9uIGlzIGV2ZW4sIHRoZSBzZWNvbmQgZW50cnkgc2hvdWxkIG1hdGNoIHRoZSBmaXJzdFxuICAgICAgICAgICAgICAvLyAoZWl0aGVyIGJvdGggYXJlIGNvbXBvc2VkIG9yIGJvdGggYXJlIHNpbmdsZSBzYW1wbGVzKS4gQnV0IGlmXG4gICAgICAgICAgICAgIC8vIGRpbGF0aW9uIGlzIG9kZCwgdGhlbiB0aGUgc2Vjb25kIGVudHJ5IHNob3VsZCBiZSB0aGUgb3Bwb3NpdGVcbiAgICAgICAgICAgICAgLy8gb2YgdGhlIGZpcnN0IChpZiB0aGUgZmlyc3QgaXMgY29tcG9zZWQsIHRoZSBzZWNvbmQgaXMgYSBzaW5nbGVcbiAgICAgICAgICAgICAgLy8gc2FtcGxlLCBhbmQgdmljZSB2ZXJzYS4pXG5cbiAgICAgICAgICAgICAgY29uc3QgbmV4dFRleGVsT2Zmc2V0ID0gcGFkTGVmdCAlIDIgPT09IDAgP1xuICAgICAgICAgICAgICAgICAgdXRpbC5uZWFyZXN0TGFyZ2VyRXZlbihkaWxhdGlvbldpZHRoKSA6XG4gICAgICAgICAgICAgICAgICBkaWxhdGlvbldpZHRoO1xuXG4gICAgICAgICAgICAgIGlmICgoZGlsYXRpb25XaWR0aCAlIDIgPT09IDAgJiYgcGFkTGVmdCAlIDIgPT09IDEpIHx8XG4gICAgICAgICAgICAgICAgICAoZGlsYXRpb25XaWR0aCAlIDIgIT09IDAgJiYgcGFkTGVmdCAlIDIgIT09IDEpKSB7XG4gICAgICAgICAgICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICAgICAgICAgICAgeENPZmZzZXQgPSB4QyArIGltb2QocGFkc1sxXSwgMikgKyAke25leHRUZXhlbE9mZnNldH07XG5cbiAgICAgICAgICAgICAgICAgIGlmICh4Q09mZnNldCA+PSAwICYmIHhDT2Zmc2V0IDwgaW5EaW1zWzFdICYmIHhUZXhlbEMke1xuICAgICAgICAgICAgICAgICAgICBjb2xJbmRleCArIDF9UmVhZHkgPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleCArIDF9ID0gZ2V0WChiYXRjaCwgeFIsIHhDT2Zmc2V0LCBkMSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gTmVlZCB0byBtYW51YWxseSBjbGVhciB1bnVzZWQgY2hhbm5lbHMgaW4gY2FzZVxuICAgICAgICAgICAgICAgICAgICAvLyB3ZSdyZSByZWFkaW5nIGZyb20gcmVjeWNsZWQgdGV4dHVyZS5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHhDT2Zmc2V0ICsgMSA+PSBpbkRpbXNbMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleCArIDF9Lnp3ID0gdmVjMigwLjApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHhUZXhlbEMke2NvbEluZGV4ICsgMX1SZWFkeSA9IDE7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBgO1xuXG4gICAgICAgICAgICAgICAgLy8gSWYgZGlsYXRpb24gPiAxIHRoZW4gdGhlIHhSQydzIHdpbGwgbm90IGJlIGFibGUgdG8gc2hhcmUgYW55XG4gICAgICAgICAgICAgICAgLy8gdmFsdWVzLCBzbyBlYWNoIHhSQyB3aWxsIHJlcXVpcmUgdHdvIHVuaXF1ZSBjYWxscyB0byBnZXRYLlxuICAgICAgICAgICAgICAgIGlmIChkaWxhdGlvbldpZHRoID4gMSkge1xuICAgICAgICAgICAgICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICAgICAgICAgICAgICB4Q09mZnNldCAtPSAyO1xuICAgICAgICAgICAgICAgICAgICBpZiAoeENPZmZzZXQgPj0gMCAmJiB4Q09mZnNldCA8IGluRGltc1sxXSAmJiB4VGV4ZWxDJHtcbiAgICAgICAgICAgICAgICAgICAgICBjb2xJbmRleH1SZWFkeSA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgeFRleGVsQyR7Y29sSW5kZXh9ID0gZ2V0WChiYXRjaCwgeFIsIHhDT2Zmc2V0LCBkMSk7XG4gICAgICAgICAgICAgICAgICAgICAgeFRleGVsQyR7Y29sSW5kZXh9UmVhZHkgPSAxO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGA7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICAgICAgICAgICAgeEMke2NvbEluZGV4ICsgMX0gPSB2ZWM0KHhUZXhlbEMke2NvbEluZGV4fS56dywgeFRleGVsQyR7XG4gICAgICAgICAgICAgICAgICAgIGNvbEluZGV4ICsgMX0ueHkpO1xuICAgICAgICAgICAgICAgICAgYDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBJZiBkaWxhdGlvbiBpcyAxIGFuZCBwYWRkaW5nIGlzIG9kZCwgd2UgaGF2ZSBhbHJlYWR5IHJlYWQgdGhlXG4gICAgICAgICAgICAgICAgLy8gdGV4ZWwgd2hlbiBjb25zdHJ1Y3RpbmcgdGhlIHByZXZpb3VzIHggdmFsdWUuIEhlcmUgd2UgY2FuXG4gICAgICAgICAgICAgICAgLy8gc2ltcGx5IHNraXAgdGhlIHRleHR1cmUgcmVhZC5cbiAgICAgICAgICAgICAgICBpZiAobmV4dFRleGVsT2Zmc2V0ID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgICAgICAgICAgICAgIHhDJHtjb2xJbmRleCArIDF9ID0geFRleGVsQyR7Y29sSW5kZXh9O1xuICAgICAgICAgICAgICAgICAgICBgO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgICAgICAgICAgICAgIHhDT2Zmc2V0ID0geEMgKyAke25leHRUZXhlbE9mZnNldH07XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHhDT2Zmc2V0ID49IDAgJiYgeENPZmZzZXQgPCBpbkRpbXNbMV0gJiYgeFRleGVsQyR7XG4gICAgICAgICAgICAgICAgICAgICAgY29sSW5kZXggKyAxfVJlYWR5ID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleCArIDF9ID0gZ2V0WChiYXRjaCwgeFIsIHhDT2Zmc2V0LCBkMSk7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHhDT2Zmc2V0ICsgMSA+PSBpbkRpbXNbMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHhUZXhlbEMke2NvbEluZGV4ICsgMX0uencgPSB2ZWMyKDAuMCk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIHhUZXhlbEMke2NvbEluZGV4ICsgMX1SZWFkeSA9IDE7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB4QyR7Y29sSW5kZXggKyAxfSA9IHhUZXhlbEMke2NvbEluZGV4ICsgMX07XG4gICAgICAgICAgICAgICAgICAgIGA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgeyAgLy8gc3RyaWRlID09PSAyXG4gICAgICAgICAgaWYgKGNvbEluZGV4IDwgZmlsdGVyV2lkdGgpIHtcbiAgICAgICAgICAgIC8vIERlcGVuZGluZyBvbiB3aGV0aGVyIHBhZExlZnQgaXMgZXZlbiBvciBvZGQsIHdlIHdhbnQgZWl0aGVyIHRoZVxuICAgICAgICAgICAgLy8geHkgb3IgencgY2hhbm5lbHMgZnJvbSBYIHRleGVscyBmb3IgeEMke2NvbEluZGV4fS4gSWYgcGFkTGVmdCBpc1xuICAgICAgICAgICAgLy8gZXZlbiwgeEMke2NvbEluZGV4ICsxfSBpcyBzaW1wbHkgdGhlIHp3IGNoYW5uZWxzIG9mIHRleGVscyB3ZSd2ZVxuICAgICAgICAgICAgLy8gYWxyZWFkeSBzYW1wbGVkLiBCdXQgaWYgcGFkTGVmdCBpcyBvZGQsIHhDeyRjICsgMX0uencgd2lsbFxuICAgICAgICAgICAgLy8gbmVlZCB0byBjb21lIGZyb20gdGhlIHh5IGNoYW5uZWxzIG9mIGEgbmV3IHRleGVsLCBoZW5jZSB0aGUgYFxuICAgICAgICAgICAgLy8gdmVjNFxuICAgICAgICAgICAgLy8gZmluYWxgIGluaXRpYWxpemVkIGJlbG93LlxuICAgICAgICAgICAgaWYgKHBhZExlZnQgJSAyID09PSAxKSB7XG4gICAgICAgICAgICAgIG1haW5Mb29wICs9IGBcbiAgICAgICAgICAgICAgICB4Q09mZnNldCA9IHhDICsgMSAtIHN0cmlkZXNbMV07XG4gICAgICAgICAgICAgICAgaWYoeENPZmZzZXQgPj0gMCAmJiB4Q09mZnNldCA8IGluRGltc1sxXSAmJiB4VGV4ZWxDJHtcbiAgICAgICAgICAgICAgICAgIGNvbEluZGV4fVJlYWR5ID09IDApIHtcbiAgICAgICAgICAgICAgICAgIHhUZXhlbEMke2NvbEluZGV4fSA9IGdldFgoYmF0Y2gsIHhSLCB4Q09mZnNldCwgZDEpO1xuICAgICAgICAgICAgICAgICAgLy8gTmVlZCB0byBtYW51YWxseSBjbGVhciB1bnVzZWQgY2hhbm5lbHMgaW4gY2FzZVxuICAgICAgICAgICAgICAgICAgLy8gd2UncmUgcmVhZGluZyBmcm9tIHJlY3ljbGVkIHRleHR1cmUuXG4gICAgICAgICAgICAgICAgICBpZiAoeENPZmZzZXQgKyAxID49IGluRGltc1sxXSkge1xuICAgICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleH0uencgPSB2ZWMyKDAuMCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleH1SZWFkeSA9IDE7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYoeEMgKyAxID49IDAgJiYgeEMgKyAxIDwgaW5EaW1zWzFdICYmIHhUZXhlbEMke1xuICAgICAgICAgICAgICAgICAgY29sSW5kZXggKyAxfVJlYWR5ID09IDApIHtcbiAgICAgICAgICAgICAgICAgIHhUZXhlbEMke2NvbEluZGV4ICsgMX0gPSBnZXRYKGJhdGNoLCB4UiwgeEMgKyAxLCBkMSk7XG4gICAgICAgICAgICAgICAgICAvLyBOZWVkIHRvIG1hbnVhbGx5IGNsZWFyIHVudXNlZCBjaGFubmVscyBpbiBjYXNlXG4gICAgICAgICAgICAgICAgICAvLyB3ZSdyZSByZWFkaW5nIGZyb20gcmVjeWNsZWQgdGV4dHVyZS5cbiAgICAgICAgICAgICAgICAgIGlmICh4QyArIDIgPj0gaW5EaW1zWzFdKSB7XG4gICAgICAgICAgICAgICAgICAgIHhUZXhlbEMke2NvbEluZGV4ICsgMX0uencgPSB2ZWMyKDAuMCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleCArIDF9UmVhZHkgPSAxO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHhDJHtjb2xJbmRleH0gPSB2ZWM0KHhUZXhlbEMke2NvbEluZGV4fS56dywgeFRleGVsQyR7XG4gICAgICAgICAgICAgICAgICBjb2xJbmRleCArIDF9Lnp3KTtcbiAgICAgICAgICAgICAgYDtcblxuICAgICAgICAgICAgICBpZiAoY29sSW5kZXggKyAxIDwgZmlsdGVyV2lkdGgpIHtcbiAgICAgICAgICAgICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgICAgICAgICAgICBmaW5hbCA9IHZlYzQoMC4wKTtcbiAgICAgICAgICAgICAgICAgIHhDT2Zmc2V0ID0geEMgKyAxICsgc3RyaWRlc1sxXTtcbiAgICAgICAgICAgICAgICAgIGlmKHhDT2Zmc2V0ID49IDAgJiYgeENPZmZzZXQgPCBpbkRpbXNbMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgZmluYWwgPSBnZXRYKGJhdGNoLCB4UiwgeENPZmZzZXQsIGQxKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHhDJHtjb2xJbmRleCArIDF9ID0gdmVjNCh4VGV4ZWxDJHtjb2xJbmRleCArIDF9Lnh5LCBmaW5hbC54eSk7XG4gICAgICAgICAgICAgICAgYDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICAgICAgICAgIGlmKHhDID49IDAgJiYgeEMgPCBpbkRpbXNbMV0gJiYgeFRleGVsQyR7Y29sSW5kZXh9UmVhZHkgPT0gMCkge1xuICAgICAgICAgICAgICAgICAgeFRleGVsQyR7Y29sSW5kZXh9ID0gZ2V0WChiYXRjaCwgeFIsIHhDLCBkMSk7XG4gICAgICAgICAgICAgICAgICBpZiAoeEMgKyAxID49IGluRGltc1sxXSkge1xuICAgICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleH0uencgPSB2ZWMyKDAuMCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleH1SZWFkeSA9IDE7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgeENPZmZzZXQgPSB4QyArIHN0cmlkZXNbMV07XG4gICAgICAgICAgICAgICAgaWYoeENPZmZzZXQgPj0gMCAmJiB4Q09mZnNldCA8IGluRGltc1sxXSAmJiB4VGV4ZWxDJHtcbiAgICAgICAgICAgICAgICAgIGNvbEluZGV4ICsgMX1SZWFkeSA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleCArIDF9ID0gZ2V0WChiYXRjaCwgeFIsIHhDT2Zmc2V0LCBkMSk7XG4gICAgICAgICAgICAgICAgICBpZiAoeENPZmZzZXQgKyAxID49IGluRGltc1sxXSkge1xuICAgICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleCArIDF9Lnp3ID0gdmVjMigwLik7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleCArIDF9UmVhZHkgPSAxO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHhDJHtjb2xJbmRleH0gPSB2ZWM0KFxuICAgICAgICAgICAgICAgICAgeFRleGVsQyR7Y29sSW5kZXh9Lnh5LCB4VGV4ZWxDJHtjb2xJbmRleCArIDF9Lnh5KTtcbiAgICAgICAgICAgICAgYDtcblxuICAgICAgICAgICAgICBpZiAoY29sSW5kZXggKyAxIDwgZmlsdGVyV2lkdGgpIHtcbiAgICAgICAgICAgICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgICAgICAgICAgICB4QyR7Y29sSW5kZXggKyAxfSA9IHZlYzQoeFRleGVsQyR7Y29sSW5kZXh9Lnp3LCB4VGV4ZWxDJHtcbiAgICAgICAgICAgICAgICAgICAgY29sSW5kZXggKyAxfS56dyk7XG4gICAgICAgICAgICAgICAgYDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGxvY2FsaXplIHRoZSBkb3RQcm9kIGFjY3VtdWxhdGlvbiB3aXRoaW4gdGhlIGxvb3AsIHRoZSB0aGVvcnkgaXMgZm9yXG4gICAgICAgIC8vIEdQVSB3aXRoIGxpbWl0ZWQgY2FjaGUsIGFjY3VtdWxhdGUgc3VtIGFjcm9zcyBsYXJnZSBhbW91bnQgb2ZcbiAgICAgICAgLy8gdmVyaWFibGVzIHdpbGwgY2F1c2UgbG90cyBvZiBjYWNoZSBtaXNzZXMuIChpLmUuIDV4NSBmaWx0ZXIgd2lsbCBoYXZlXG4gICAgICAgIC8vIDUwIHZhcmlhYmxlcylcbiAgICAgICAgaWYgKGNvbEluZGV4IDwgZmlsdGVyV2lkdGgpIHtcbiAgICAgICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgICAgICB3VGV4ZWwgPSBnZXRXKCR7cn0sICR7Y29sSW5kZXh9LCBkMSwgcSk7XG4gICAgICAgICAgICBkb3RQcm9kICs9IHhDJHtjb2xJbmRleH0gKiB2ZWM0KHdUZXhlbC54eiwgd1RleGVsLnh6KTtcbiAgICAgICAgICBgO1xuXG4gICAgICAgICAgaWYgKGNvbEluZGV4ICsgMSA8IGZpbHRlcldpZHRoKSB7XG4gICAgICAgICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgICAgICAgIHdUZXhlbCA9IGdldFcoJHtyfSwgJHtjb2xJbmRleCArIDF9LCBkMSwgcSk7XG4gICAgICAgICAgICAgIGRvdFByb2QgKz0geEMke2NvbEluZGV4ICsgMX0gKiB2ZWM0KHdUZXhlbC54eiwgd1RleGVsLnh6KTtcbiAgICAgICAgICAgIGA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgIH1cbiAgICAgIGA7XG4gICAgfVxuXG4gICAgbGV0IGFjdGl2YXRpb25TbmlwcGV0ID0gJycsIGFwcGx5QWN0aXZhdGlvblNuaXBwZXQgPSAnJztcbiAgICBpZiAoYWN0aXZhdGlvbikge1xuICAgICAgaWYgKGhhc1ByZWx1QWN0aXZhdGlvbikge1xuICAgICAgICBhY3RpdmF0aW9uU25pcHBldCA9IGB2ZWM0IGFjdGl2YXRpb24odmVjNCBhKSB7XG4gICAgICAgICAgdmVjNCBiID0gZ2V0UHJlbHVBY3RpdmF0aW9uV2VpZ2h0c0F0T3V0Q29vcmRzKCk7XG4gICAgICAgICAgJHthY3RpdmF0aW9ufVxuICAgICAgICB9YDtcbiAgICAgIH0gZWxzZSBpZiAoaGFzTGVha3lSZWx1QWxwaGEpIHtcbiAgICAgICAgYWN0aXZhdGlvblNuaXBwZXQgPSBgdmVjNCBhY3RpdmF0aW9uKHZlYzQgYSkge1xuICAgICAgICAgIHZlYzQgYiA9IGdldExlYWt5cmVsdUFscGhhQXRPdXRDb29yZHMoKTtcbiAgICAgICAgICAke2FjdGl2YXRpb259XG4gICAgICAgIH1gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWN0aXZhdGlvblNuaXBwZXQgPSBgdmVjNCBhY3RpdmF0aW9uKHZlYzQgeCkge1xuICAgICAgICAgICR7YWN0aXZhdGlvbn1cbiAgICAgICAgfWA7XG4gICAgICB9XG5cbiAgICAgIGFwcGx5QWN0aXZhdGlvblNuaXBwZXQgPSBgcmVzdWx0ID0gYWN0aXZhdGlvbihyZXN1bHQpO2A7XG4gICAgfVxuXG4gICAgY29uc3QgYWRkQmlhc1NuaXBwZXQgPSBhZGRCaWFzID8gJ3Jlc3VsdCArPSBnZXRCaWFzQXRPdXRDb29yZHMoKTsnIDogJyc7XG4gICAgaWYgKGFkZEJpYXMpIHtcbiAgICAgIHRoaXMudmFyaWFibGVOYW1lcy5wdXNoKCdiaWFzJyk7XG4gICAgfVxuXG4gICAgaWYgKGhhc1ByZWx1QWN0aXZhdGlvbikge1xuICAgICAgdGhpcy52YXJpYWJsZU5hbWVzLnB1c2goJ3ByZWx1QWN0aXZhdGlvbldlaWdodHMnKTtcbiAgICB9XG4gICAgaWYgKGhhc0xlYWt5UmVsdUFscGhhKSB7XG4gICAgICB0aGlzLnZhcmlhYmxlTmFtZXMucHVzaCgnbGVha3lyZWx1QWxwaGEnKTtcbiAgICB9XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgJHthY3RpdmF0aW9uU25pcHBldH1cblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjNCBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IGJhdGNoID0gY29vcmRzLng7XG4gICAgICAgIGl2ZWMyIHhSQ0Nvcm5lciA9IGNvb3Jkcy55eiAqIHN0cmlkZXMgLSBwYWRzO1xuICAgICAgICBpbnQgZDIgPSBjb29yZHMudztcbiAgICAgICAgaW50IGQxID0gZDIgLyAke2NoYW5uZWxNdWx9O1xuICAgICAgICBpbnQgcSA9IGQyIC0gZDEgKiAke2NoYW5uZWxNdWx9O1xuICAgICAgICBpbnQgeFJDb3JuZXIgPSB4UkNDb3JuZXIueDtcbiAgICAgICAgaW50IHhDQ29ybmVyID0geFJDQ29ybmVyLnk7XG5cbiAgICAgICAgLy9pbnRpYWxpemUgZG90UHJvZCB3aXRoIGEgc21hbGwgZXBzaWxvbiBzZWVtcyB0byByZWR1Y2UgR1BVIGFjY3VyYWN5IGxvc3MuXG4gICAgICAgIHZlYzQgZG90UHJvZCA9IHZlYzQoMC4wMDAwMDAwMDAwMDAwMDEpO1xuXG4gICAgICAgICR7bWFpbkxvb3B9XG5cbiAgICAgICAgdmVjNCByZXN1bHQgPSBkb3RQcm9kIC0gdmVjNCgwLjAwMDAwMDAwMDAwMDAwMSk7XG4gICAgICAgICR7YWRkQmlhc1NuaXBwZXR9XG4gICAgICAgICR7YXBwbHlBY3RpdmF0aW9uU25pcHBldH1cbiAgICAgICAgc2V0T3V0cHV0KHJlc3VsdCk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcblxuZXhwb3J0IGNsYXNzIENyb3BBbmRSZXNpemVQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnSW1hZ2UnLCAnQm94ZXMnLCAnQm94SW5kJ107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXSA9IFtdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgaW1hZ2VTaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIGJveFNoYXBlOiBbbnVtYmVyLCBudW1iZXJdLFxuICAgICAgY3JvcFNpemU6IFtudW1iZXIsIG51bWJlcl0sIG1ldGhvZDogJ2JpbGluZWFyJ3wnbmVhcmVzdCcsXG4gICAgICBleHRyYXBvbGF0aW9uVmFsdWU6IG51bWJlcikge1xuICAgIGNvbnN0IFtiYXRjaCwgaW1hZ2VIZWlnaHQsIGltYWdlV2lkdGgsIGRlcHRoXSA9IGltYWdlU2hhcGU7XG4gICAgY29uc3QgW251bUJveGVzLCBdID0gYm94U2hhcGU7XG4gICAgY29uc3QgW2Nyb3BIZWlnaHQsIGNyb3BXaWR0aF0gPSBjcm9wU2l6ZTtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gW251bUJveGVzLCBjcm9wSGVpZ2h0LCBjcm9wV2lkdGgsIGRlcHRoXTtcbiAgICBjb25zdCBtZXRob2RJZCA9IG1ldGhvZCA9PT0gJ2JpbGluZWFyJyA/IDEgOiAwO1xuXG4gICAgY29uc3QgW2lucHV0SGVpZ2h0RmxvYXQsIGlucHV0V2lkdGhGbG9hdF0gPVxuICAgICAgICBbYCR7aW1hZ2VIZWlnaHQgLSAxfS4wYCwgYCR7aW1hZ2VXaWR0aCAtIDF9LjBgXTtcblxuICAgIGNvbnN0IFtoZWlnaHRSYXRpbywgaGVpZ2h0U2NhbGUsIGluWV0gPSBjcm9wSGVpZ2h0ID4gMSA/XG4gICAgICAgIFtcbiAgICAgICAgICBgJHsoaW1hZ2VIZWlnaHQgLSAxKSAvIChjcm9wSGVpZ2h0IC0gMSl9YCxcbiAgICAgICAgICAnKHkyLXkxKSAqIGhlaWdodF9yYXRpbycsXG4gICAgICAgICAgYHkxKiR7aW5wdXRIZWlnaHRGbG9hdH0gKyBmbG9hdCh5KSooaGVpZ2h0X3NjYWxlKWAsXG4gICAgICAgIF0gOlxuICAgICAgICBbXG4gICAgICAgICAgJzAuMCcsXG4gICAgICAgICAgJzAuMCcsXG4gICAgICAgICAgYDAuNSAqICh5MSt5MikgKiAke2lucHV0SGVpZ2h0RmxvYXR9YCxcbiAgICAgICAgXTtcbiAgICBjb25zdCBbd2lkdGhSYXRpbywgd2lkdGhTY2FsZSwgaW5YXSA9IGNyb3BXaWR0aCA+IDEgP1xuICAgICAgICBbXG4gICAgICAgICAgYCR7KGltYWdlV2lkdGggLSAxKSAvIChjcm9wV2lkdGggLSAxKX1gLFxuICAgICAgICAgICcoeDIteDEpICogd2lkdGhfcmF0aW8nLFxuICAgICAgICAgIGB4MSoke2lucHV0V2lkdGhGbG9hdH0gKyBmbG9hdCh4KSood2lkdGhfc2NhbGUpYCxcbiAgICAgICAgXSA6XG4gICAgICAgIFtcbiAgICAgICAgICAnMC4wJyxcbiAgICAgICAgICAnMC4wJyxcbiAgICAgICAgICBgMC41ICogKHgxK3gyKSAqICR7aW5wdXRXaWR0aEZsb2F0fWAsXG4gICAgICAgIF07XG5cbiAgICAvLyBSZWZlcmVuY2UgaW1wbGVtZW50YXRpb25cbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yZmxvdy9ibG9iL21hc3Rlci90ZW5zb3JmbG93L2NvcmUva2VybmVscy9jcm9wX2FuZF9yZXNpemVfb3BfZ3B1LmN1LmNjXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGNvbnN0IGZsb2F0IGhlaWdodF9yYXRpbyA9IGZsb2F0KCR7aGVpZ2h0UmF0aW99KTtcbiAgICAgIGNvbnN0IGZsb2F0IHdpZHRoX3JhdGlvID0gZmxvYXQoJHt3aWR0aFJhdGlvfSk7XG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWM0IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgYiA9IGNvb3Jkc1swXTtcbiAgICAgICAgaW50IHkgPSBjb29yZHNbMV07XG4gICAgICAgIGludCB4ID0gY29vcmRzWzJdO1xuICAgICAgICBpbnQgZCA9IGNvb3Jkc1szXTtcblxuICAgICAgICAvLyBnZXQgYm94IHZhbHNcbiAgICAgICAgZmxvYXQgeTEgPSBnZXRCb3hlcyhiLDApO1xuICAgICAgICBmbG9hdCB4MSA9IGdldEJveGVzKGIsMSk7XG4gICAgICAgIGZsb2F0IHkyID0gZ2V0Qm94ZXMoYiwyKTtcbiAgICAgICAgZmxvYXQgeDIgPSBnZXRCb3hlcyhiLDMpO1xuXG4gICAgICAgIC8vIGdldCBpbWFnZSBpbiBiYXRjaCBpbmRleFxuICAgICAgICBpbnQgYkluZCA9IHJvdW5kKGdldEJveEluZChiKSk7XG4gICAgICAgIGlmKGJJbmQgPCAwIHx8IGJJbmQgPj0gJHtiYXRjaH0pIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBmbG9hdCBoZWlnaHRfc2NhbGUgPSAke2hlaWdodFNjYWxlfTtcbiAgICAgICAgZmxvYXQgd2lkdGhfc2NhbGUgPSAke3dpZHRoU2NhbGV9O1xuXG4gICAgICAgIGZsb2F0IGluX3kgPSAke2luWX07XG4gICAgICAgIGlmKCBpbl95IDwgMC4wIHx8IGluX3kgPiAke2lucHV0SGVpZ2h0RmxvYXR9ICkge1xuICAgICAgICAgIHNldE91dHB1dChmbG9hdCgke2V4dHJhcG9sYXRpb25WYWx1ZX0pKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZmxvYXQgaW5feCA9ICR7aW5YfTtcbiAgICAgICAgaWYoIGluX3ggPCAwLjAgfHwgaW5feCA+ICR7aW5wdXRXaWR0aEZsb2F0fSApIHtcbiAgICAgICAgICBzZXRPdXRwdXQoZmxvYXQoJHtleHRyYXBvbGF0aW9uVmFsdWV9KSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmVjMiBzb3VyY2VGcmFjSW5kZXhDUiA9IHZlYzIoaW5feCxpbl95KTtcbiAgICAgICAgaWYoJHttZXRob2RJZH0gPT0gMSkge1xuICAgICAgICAgIC8vIENvbXB1dGUgdGhlIGZvdXIgaW50ZWdlciBpbmRpY2VzLlxuICAgICAgICAgIGl2ZWMyIHNvdXJjZUZsb29yQ1IgPSBpdmVjMihzb3VyY2VGcmFjSW5kZXhDUik7XG4gICAgICAgICAgaXZlYzIgc291cmNlQ2VpbENSID0gaXZlYzIoY2VpbChzb3VyY2VGcmFjSW5kZXhDUikpO1xuXG4gICAgICAgICAgZmxvYXQgdG9wTGVmdCA9IGdldEltYWdlKGIsIHNvdXJjZUZsb29yQ1IueSwgc291cmNlRmxvb3JDUi54LCBkKTtcbiAgICAgICAgICBmbG9hdCBib3R0b21MZWZ0ID0gZ2V0SW1hZ2UoYiwgc291cmNlQ2VpbENSLnksIHNvdXJjZUZsb29yQ1IueCwgZCk7XG4gICAgICAgICAgZmxvYXQgdG9wUmlnaHQgPSBnZXRJbWFnZShiLCBzb3VyY2VGbG9vckNSLnksIHNvdXJjZUNlaWxDUi54LCBkKTtcbiAgICAgICAgICBmbG9hdCBib3R0b21SaWdodCA9IGdldEltYWdlKGIsIHNvdXJjZUNlaWxDUi55LCBzb3VyY2VDZWlsQ1IueCwgZCk7XG5cbiAgICAgICAgICB2ZWMyIGZyYWNDUiA9IHNvdXJjZUZyYWNJbmRleENSIC0gdmVjMihzb3VyY2VGbG9vckNSKTtcblxuICAgICAgICAgIGZsb2F0IHRvcCA9IHRvcExlZnQgKyAodG9wUmlnaHQgLSB0b3BMZWZ0KSAqIGZyYWNDUi54O1xuICAgICAgICAgIGZsb2F0IGJvdHRvbSA9IGJvdHRvbUxlZnQgKyAoYm90dG9tUmlnaHQgLSBib3R0b21MZWZ0KSAqIGZyYWNDUi54O1xuICAgICAgICAgIGZsb2F0IG5ld1ZhbHVlID0gdG9wICsgKGJvdHRvbSAtIHRvcCkgKiBmcmFjQ1IueTtcbiAgICAgICAgICBzZXRPdXRwdXQobmV3VmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIENvbXB1dGUgdGhlIGNvb3JkaW5hdG9ycyBvZiBuZWFyZXN0IG5laWdoYm9yIHBvaW50LlxuICAgICAgICAgIGl2ZWMyIHNvdXJjZU5lYXJlc3RDUiA9IGl2ZWMyKGZsb29yKFxuICAgICAgICAgICAgc291cmNlRnJhY0luZGV4Q1IgKyB2ZWMyKDAuNSwwLjUpKSk7XG4gICAgICAgICAgZmxvYXQgbmV3VmFsdWUgPSBnZXRJbWFnZShiLCBzb3VyY2VOZWFyZXN0Q1IueSwgc291cmNlTmVhcmVzdENSLngsIGQpO1xuICAgICAgICAgIHNldE91dHB1dChuZXdWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcbmltcG9ydCB7Z2V0Q29vcmRzRGF0YVR5cGUsIFVuaWZvcm1UeXBlfSBmcm9tICcuL3NoYWRlcl9jb21waWxlcic7XG5cbmV4cG9ydCBjbGFzcyBDdW1TdW1Qcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsneCddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIGN1c3RvbVVuaWZvcm1zID0gW3tuYW1lOiAnaW5kZXgnLCB0eXBlOiAnZmxvYXQnIGFzIFVuaWZvcm1UeXBlfV07XG5cbiAgY29uc3RydWN0b3Ioc2hhcGU6IG51bWJlcltdLCBleGNsdXNpdmU6IGJvb2xlYW4sIHJldmVyc2U6IGJvb2xlYW4pIHtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gc2hhcGU7XG4gICAgY29uc3QgcmFuayA9IHNoYXBlLmxlbmd0aDtcbiAgICBjb25zdCB2YWwgPSBleGNsdXNpdmUgPyAnMC4wJyA6IGBnZXRYKCR7Z2V0Q29vcmRzKHJhbmssICdjb29yZHMnKX0pYDtcbiAgICBjb25zdCBsZW5ndGggPSBzaGFwZVtzaGFwZS5sZW5ndGggLSAxXTtcbiAgICBsZXQgY29uZGl0aW9uID0gJyc7XG4gICAgbGV0IGlkeFN0cmluZyA9ICcnO1xuICAgIC8vIFdoZW4gZXhjbHVzaXZlIGlzIHNldCwgdGhlIGN1bXN1bSBvcCBiZWNvbWVzIHJvbGwgb3AgdGhhdCBjb3BpZXMgdGhlXG4gICAgLy8gdmFsdWUgZnJvbSB0aGUgcHJldmlvdXMgaW5kZXggYmFzZWQgb24gdGhlIGRpcmVjdGlvbiBzcGVjaWZpZWQgYnkgdGhlXG4gICAgLy8gcmV2ZXJzZSBmbGFnLlxuICAgIGlmIChleGNsdXNpdmUpIHtcbiAgICAgIGNvbmRpdGlvbiA9IHJldmVyc2UgPyBgZW5kICE9ICR7bGVuZ3RoIC0gMX1gIDogJ2VuZCAhPSAwJztcbiAgICAgIGlkeFN0cmluZyA9IHJldmVyc2UgPyAnZW5kICsgMScgOiAnZW5kIC0gMSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbmRpdGlvbiA9IHJldmVyc2UgPyBgZW5kICsgcG93MiA8ICR7bGVuZ3RofWAgOiAnZW5kID49IHBvdzInO1xuICAgICAgaWR4U3RyaW5nID0gKHJldmVyc2UgPyAnZW5kICsgcG93MicgOiAnZW5kIC0gcG93MicpO1xuICAgIH1cblxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICR7Z2V0Q29vcmRzRGF0YVR5cGUocmFuayl9IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgZW5kID0gJHtnZXRGaW5hbENvb3JkKHJhbmssICdjb29yZHMnKX07XG4gICAgICAgIGZsb2F0IHZhbCA9ICR7dmFsfTtcbiAgICAgICAgaW50IHBvdzIgPSBpbnQocG93KDIuMCwgaW5kZXgpKTtcbiAgICAgICAgaWYgKCR7Y29uZGl0aW9ufSkge1xuICAgICAgICAgIGludCBpZHggPSAke2lkeFN0cmluZ307XG4gICAgICAgICAgJHtnZXRGaW5hbENvb3JkKHJhbmssICdjb29yZHMnKX0gPSBpZHg7XG4gICAgICAgICAgdmFsICs9IGdldFgoJHtnZXRDb29yZHMocmFuaywgJ2Nvb3JkcycpfSk7XG4gICAgICAgIH1cbiAgICAgICAgc2V0T3V0cHV0KHZhbCk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRDb29yZHMocmFuazogbnVtYmVyLCBuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAocmFuayA9PT0gMSkge1xuICAgIHJldHVybiBgJHtuYW1lfWA7XG4gIH0gZWxzZSBpZiAocmFuayA9PT0gMikge1xuICAgIHJldHVybiBgJHtuYW1lfS54LCAke25hbWV9LnlgO1xuICB9IGVsc2UgaWYgKHJhbmsgPT09IDMpIHtcbiAgICByZXR1cm4gYCR7bmFtZX0ueCwgJHtuYW1lfS55LCAke25hbWV9LnpgO1xuICB9IGVsc2UgaWYgKHJhbmsgPT09IDQpIHtcbiAgICByZXR1cm4gYCR7bmFtZX0ueCwgJHtuYW1lfS55LCAke25hbWV9LnosICR7bmFtZX0ud2A7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgRXJyb3IoYEN1bXVsYXRpdmUgc3VtIGZvciByYW5rICR7cmFua30gaXMgbm90IHlldCBzdXBwb3J0ZWRgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRGaW5hbENvb3JkKHJhbms6IG51bWJlciwgbmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKHJhbmsgPT09IDEpIHtcbiAgICByZXR1cm4gYCR7bmFtZX1gO1xuICB9IGVsc2UgaWYgKHJhbmsgPT09IDIpIHtcbiAgICByZXR1cm4gYCR7bmFtZX0ueWA7XG4gIH0gZWxzZSBpZiAocmFuayA9PT0gMykge1xuICAgIHJldHVybiBgJHtuYW1lfS56YDtcbiAgfSBlbHNlIGlmIChyYW5rID09PSA0KSB7XG4gICAgcmV0dXJuIGAke25hbWV9LndgO1xuICB9IGVsc2Uge1xuICAgIHRocm93IEVycm9yKGBDdW11bGF0aXZlIHN1bSBmb3IgcmFuayAke3Jhbmt9IGlzIG5vdCB5ZXQgc3VwcG9ydGVkYCk7XG4gIH1cbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtnZXRHbHNsRGlmZmVyZW5jZXN9IGZyb20gJy4vZ2xzbF92ZXJzaW9uJztcbmltcG9ydCB7R1BHUFVQcm9ncmFtLCB1c2VTaGFwZVVuaWZvcm1zfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuaW1wb3J0ICogYXMgc2hhZGVyX3V0aWwgZnJvbSAnLi9zaGFkZXJfY29tcGlsZXJfdXRpbCc7XG5pbXBvcnQge1BhY2tpbmdTY2hlbWV9IGZyb20gJy4vdGV4X3V0aWwnO1xuXG5leHBvcnQgY2xhc3MgRGVjb2RlTWF0cml4UHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ0EnXTtcbiAgdXNlckNvZGU6IHN0cmluZztcbiAgb3V0cHV0U2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcbiAgcGFja2VkSW5wdXRzID0gZmFsc2U7XG4gIHBhY2tlZE91dHB1dCA9IHRydWU7XG4gIG91dFBhY2tpbmdTY2hlbWUgPSBQYWNraW5nU2NoZW1lLkRFTlNFO1xuICBlbmFibGVTaGFwZVVuaWZvcm1zOiBib29sZWFuO1xuICBjdXN0b21Vbmlmb3JtcyA9IFt7bmFtZTogJ3RleFNoYXBlJywgdHlwZTogJ2l2ZWMyJyBhcyBjb25zdCB9XTtcblxuICBjb25zdHJ1Y3RvcihvdXRwdXRTaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdKSB7XG4gICAgY29uc3QgZ2xzbCA9IGdldEdsc2xEaWZmZXJlbmNlcygpO1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBvdXRwdXRTaGFwZTtcbiAgICB0aGlzLmVuYWJsZVNoYXBlVW5pZm9ybXMgPSB1c2VTaGFwZVVuaWZvcm1zKHRoaXMub3V0cHV0U2hhcGUubGVuZ3RoKTtcblxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICBpdmVjMyBvdXRDb29yZHNGcm9tRmxhdEluZGV4KGludCBpbmRleCkge1xuICAgICAgICAke1xuICAgICAgICB0aGlzLmVuYWJsZVNoYXBlVW5pZm9ybXMgP1xuICAgICAgICAgICAgc2hhZGVyX3V0aWwuZ2V0T3V0cHV0TG9naWNhbENvb3JkaW5hdGVzRnJvbUZsYXRJbmRleEJ5VW5pZm9ybShcbiAgICAgICAgICAgICAgICBbJ3InLCAnYycsICdkJ10sIG91dHB1dFNoYXBlKSA6XG4gICAgICAgICAgICBzaGFkZXJfdXRpbC5nZXRMb2dpY2FsQ29vcmRpbmF0ZXNGcm9tRmxhdEluZGV4KFxuICAgICAgICAgICAgICAgIFsncicsICdjJywgJ2QnXSwgb3V0cHV0U2hhcGUpfVxuICAgICAgICByZXR1cm4gaXZlYzMociwgYywgZCk7XG4gICAgICB9XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzIgcmVzVGV4UkMgPSBpdmVjMihyZXN1bHRVVi55eCAqIHZlYzIodGV4U2hhcGVbMF0sIHRleFNoYXBlWzFdKSk7XG4gICAgICAgIGludCBpbmRleCA9IDQgKiAocmVzVGV4UkMueCAqIHRleFNoYXBlWzFdICsgcmVzVGV4UkMueSk7XG5cbiAgICAgICAgdmVjNCByZXN1bHQgPSB2ZWM0KDAuKTtcblxuICAgICAgICBmb3IgKGludCBpPTA7IGk8NDsgaSsrKSB7XG4gICAgICAgICAgaW50IGZsYXRJbmRleCA9IGluZGV4ICsgaTtcbiAgICAgICAgICBpdmVjMyByYyA9IG91dENvb3Jkc0Zyb21GbGF0SW5kZXgoZmxhdEluZGV4KTtcbiAgICAgICAgICByZXN1bHRbaV0gPSBnZXRBKHJjLngsIHJjLnksIHJjLnopO1xuICAgICAgICB9XG5cbiAgICAgICAgJHtnbHNsLm91dHB1dH0gPSByZXN1bHQ7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2dldEdsc2xEaWZmZXJlbmNlc30gZnJvbSAnLi9nbHNsX3ZlcnNpb24nO1xuaW1wb3J0IHtHUEdQVVByb2dyYW0sIHVzZVNoYXBlVW5pZm9ybXN9IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5pbXBvcnQgKiBhcyBzaGFkZXJfdXRpbCBmcm9tICcuL3NoYWRlcl9jb21waWxlcl91dGlsJztcbmltcG9ydCB7UGFja2luZ1NjaGVtZX0gZnJvbSAnLi90ZXhfdXRpbCc7XG5cbmV4cG9ydCBjbGFzcyBEZWNvZGVNYXRyaXhQYWNrZWRQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnQSddO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuICBwYWNrZWRJbnB1dHMgPSB0cnVlO1xuICBwYWNrZWRPdXRwdXQgPSB0cnVlO1xuICBvdXRwdXRTaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuICBvdXRQYWNraW5nU2NoZW1lID0gUGFja2luZ1NjaGVtZS5ERU5TRTtcbiAgZW5hYmxlU2hhcGVVbmlmb3JtczogYm9vbGVhbjtcbiAgY3VzdG9tVW5pZm9ybXMgPSBbe25hbWU6ICd0ZXhTaGFwZScsIHR5cGU6ICdpdmVjMicgYXMgY29uc3QgfV07XG5cbiAgY29uc3RydWN0b3Iob3V0cHV0U2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSkge1xuICAgIGNvbnN0IGdsc2wgPSBnZXRHbHNsRGlmZmVyZW5jZXMoKTtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gb3V0cHV0U2hhcGU7XG4gICAgdGhpcy5lbmFibGVTaGFwZVVuaWZvcm1zID0gdXNlU2hhcGVVbmlmb3Jtcyh0aGlzLm91dHB1dFNoYXBlLmxlbmd0aCk7XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgaXZlYzMgb3V0Q29vcmRzRnJvbUZsYXRJbmRleChpbnQgaW5kZXgpIHtcbiAgICAgICAgJHtcbiAgICAgICAgdGhpcy5lbmFibGVTaGFwZVVuaWZvcm1zID9cbiAgICAgICAgICAgIHNoYWRlcl91dGlsLmdldE91dHB1dExvZ2ljYWxDb29yZGluYXRlc0Zyb21GbGF0SW5kZXhCeVVuaWZvcm0oXG4gICAgICAgICAgICAgICAgWydyJywgJ2MnLCAnZCddLCBvdXRwdXRTaGFwZSkgOlxuICAgICAgICAgICAgc2hhZGVyX3V0aWwuZ2V0TG9naWNhbENvb3JkaW5hdGVzRnJvbUZsYXRJbmRleChcbiAgICAgICAgICAgICAgICBbJ3InLCAnYycsICdkJ10sIG91dHB1dFNoYXBlKX1cbiAgICAgICAgcmV0dXJuIGl2ZWMzKHIsIGMsIGQpO1xuICAgICAgfVxuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWMyIHJlc1RleFJDID0gaXZlYzIocmVzdWx0VVYueXggKiB2ZWMyKHRleFNoYXBlWzBdLCB0ZXhTaGFwZVsxXSkpO1xuICAgICAgICBpbnQgaW5kZXggPSA0ICogKHJlc1RleFJDLnggKiB0ZXhTaGFwZVsxXSArIHJlc1RleFJDLnkpO1xuXG4gICAgICAgIHZlYzQgcmVzdWx0ID0gdmVjNCgwLik7XG5cbiAgICAgICAgZm9yIChpbnQgaT0wOyBpPDQ7IGkrKykge1xuICAgICAgICAgIGludCBmbGF0SW5kZXggPSBpbmRleCArIGk7XG4gICAgICAgICAgaXZlYzMgcmMgPSBvdXRDb29yZHNGcm9tRmxhdEluZGV4KGZsYXRJbmRleCk7XG4gICAgICAgICAgcmVzdWx0W2ldID0gZ2V0Q2hhbm5lbChnZXRBKHJjLngsIHJjLnksIHJjLnopLCB2ZWMyKHJjLnksIHJjLnopKTtcbiAgICAgICAgfVxuXG4gICAgICAgICR7Z2xzbC5vdXRwdXR9ID0gcmVzdWx0O1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5cbmV4cG9ydCBjbGFzcyBEZXB0aFRvU3BhY2VQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsneCddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW10gPSBbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcbiAgYmxvY2tTaXplOiBudW1iZXI7XG4gIGRhdGFGb3JtYXQ6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIG91dHB1dFNoYXBlOiBudW1iZXJbXSwgYmxvY2tTaXplOiBudW1iZXIsIGRhdGFGb3JtYXQ6ICdOSFdDJ3wnTkNIVycpIHtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gb3V0cHV0U2hhcGU7XG4gICAgdGhpcy5ibG9ja1NpemUgPSBibG9ja1NpemU7XG4gICAgdGhpcy5kYXRhRm9ybWF0ID0gZGF0YUZvcm1hdDtcbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgIHZvaWQgbWFpbigpIHtcbiAgICAgIGl2ZWM0IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgaW50IGIgPSBjb29yZHNbMF07XG4gICAgICBpbnQgaCA9ICR7dGhpcy5nZXRIZWlnaHRDb29yZFN0cmluZygpfTtcbiAgICAgIGludCB3ID0gJHt0aGlzLmdldFdpZHRoQ29vcmRTdHJpbmcoKX07XG4gICAgICBpbnQgZCA9ICR7dGhpcy5nZXREZXB0aENvb3JkU3RyaW5nKCl9O1xuXG4gICAgICBpbnQgaW5faCA9IGggLyAke2Jsb2NrU2l6ZX07XG4gICAgICBpbnQgb2Zmc2V0X2ggPSBpbW9kKGgsICR7YmxvY2tTaXplfSk7XG4gICAgICBpbnQgaW5fdyA9IHcgLyAke2Jsb2NrU2l6ZX07XG4gICAgICBpbnQgb2Zmc2V0X3cgPSBpbW9kKHcsICR7YmxvY2tTaXplfSk7XG4gICAgICBpbnQgb2Zmc2V0X2QgPSAob2Zmc2V0X2ggKiAke2Jsb2NrU2l6ZX0gKyBvZmZzZXRfdykgKlxuICAgICAgICAke3RoaXMuZ2V0T3V0cHV0RGVwdGhTaXplKCl9O1xuICAgICAgaW50IGluX2QgPSBkICsgb2Zmc2V0X2Q7XG5cbiAgICAgIGZsb2F0IHJlc3VsdCA9ICR7dGhpcy5nZXRJbnB1dFNhbXBsaW5nU3RyaW5nKCl9O1xuICAgICAgc2V0T3V0cHV0KHJlc3VsdCk7XG4gICAgfVxuICBgO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRIZWlnaHRDb29yZFN0cmluZygpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmRhdGFGb3JtYXQgPT09ICdOSFdDJykge1xuICAgICAgcmV0dXJuIGBjb29yZHNbMV1gO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYGNvb3Jkc1syXWA7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRXaWR0aENvb3JkU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuZGF0YUZvcm1hdCA9PT0gJ05IV0MnKSB7XG4gICAgICByZXR1cm4gYGNvb3Jkc1syXWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBgY29vcmRzWzNdYDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldERlcHRoQ29vcmRTdHJpbmcoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5kYXRhRm9ybWF0ID09PSAnTkhXQycpIHtcbiAgICAgIHJldHVybiBgY29vcmRzWzNdYDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGBjb29yZHNbMV1gO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0T3V0cHV0RGVwdGhTaXplKCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuZGF0YUZvcm1hdCA9PT0gJ05IV0MnKSB7XG4gICAgICByZXR1cm4gdGhpcy5vdXRwdXRTaGFwZVszXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMub3V0cHV0U2hhcGVbMV07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRJbnB1dFNhbXBsaW5nU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuZGF0YUZvcm1hdCA9PT0gJ05IV0MnKSB7XG4gICAgICByZXR1cm4gYGdldFgoYiwgaW5faCwgaW5fdywgaW5fZClgO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYGdldFgoYiwgaW5fZCwgaW5faCwgaW5fdylgO1xuICAgIH1cbiAgfVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcblxuZXhwb3J0IGNsYXNzIERpYWdQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnWCddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Ioc2l6ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IFtzaXplLCBzaXplXTtcbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAgIGl2ZWMyIGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICAgIGZsb2F0IHZhbCA9IGNvb3Jkc1swXSA9PSBjb29yZHNbMV0gPyBnZXRYKGNvb3Jkc1swXSkgOiAwLjA7XG4gICAgICAgICAgc2V0T3V0cHV0KHZhbCk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuXG5leHBvcnQgY2xhc3MgRGlsYXRpb24yRFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWyd4JywgJ1cnXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGNvbnZJbmZvOiBiYWNrZW5kX3V0aWwuQ29udjJESW5mbykge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBjb252SW5mby5vdXRTaGFwZTtcblxuICAgIGNvbnN0IHtcbiAgICAgIGluSGVpZ2h0LFxuICAgICAgaW5XaWR0aCxcbiAgICAgIHBhZEluZm8sXG4gICAgICBzdHJpZGVIZWlnaHQsXG4gICAgICBzdHJpZGVXaWR0aCxcbiAgICAgIGZpbHRlckhlaWdodCxcbiAgICAgIGZpbHRlcldpZHRoLFxuICAgICAgZGlsYXRpb25IZWlnaHQsXG4gICAgICBkaWxhdGlvbldpZHRoXG4gICAgfSA9IGNvbnZJbmZvO1xuXG4gICAgY29uc3Qge3RvcDogcGFkVG9wLCBsZWZ0OiBwYWRMZWZ0fSA9IHBhZEluZm87XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgY29uc3QgaXZlYzIgc3RyaWRlcyA9IGl2ZWMyKCR7c3RyaWRlSGVpZ2h0fSwgJHtzdHJpZGVXaWR0aH0pO1xuICAgICAgY29uc3QgaXZlYzIgcGFkcyA9IGl2ZWMyKCR7cGFkVG9wfSwgJHtwYWRMZWZ0fSk7XG4gICAgICBjb25zdCBmbG9hdCBuZWdfaW5maW5pdHkgPSAtMy40ZTM4O1xuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWM0IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgYmF0Y2ggPSBjb29yZHMueDtcbiAgICAgICAgaW50IGQxID0gY29vcmRzLnc7XG4gICAgICAgIGl2ZWMyIG91dFRvcExlZnRDb3JuZXIgPVxuICAgICAgICAgICAgY29vcmRzLnl6ICogc3RyaWRlcyAtIHBhZHM7XG4gICAgICAgIGludCBoQmVnID0gb3V0VG9wTGVmdENvcm5lci54O1xuICAgICAgICBpbnQgd0JlZyA9IG91dFRvcExlZnRDb3JuZXIueTtcblxuICAgICAgICBmbG9hdCBjdXJWYWwgPSBuZWdfaW5maW5pdHk7XG4gICAgICAgIGZvciAoaW50IGggPSAwOyBoIDwgJHtmaWx0ZXJIZWlnaHR9OyBoKyspIHtcbiAgICAgICAgICBpbnQgaEluID0gaEJlZyArIGggKiAke2RpbGF0aW9uSGVpZ2h0fTtcblxuICAgICAgICAgIGlmIChoSW4gPj0gMCAmJiBoSW4gPCAke2luSGVpZ2h0fSkge1xuICAgICAgICAgICAgZm9yIChpbnQgdyA9IDA7IHcgPCAke2ZpbHRlcldpZHRofTsgdysrKSB7XG4gICAgICAgICAgICAgIGludCB3SW4gPSB3QmVnICsgdyAqICR7ZGlsYXRpb25XaWR0aH07XG5cbiAgICAgICAgICAgICAgaWYgKHdJbiA+PSAwICYmIHdJbiA8ICR7aW5XaWR0aH0pIHtcbiAgICAgICAgICAgICAgICBmbG9hdCB4VmFsID0gZ2V0WChiYXRjaCwgaEluLCB3SW4sIGQxKTtcbiAgICAgICAgICAgICAgICBmbG9hdCB3VmFsID0gZ2V0VyhoLCB3LCBkMSk7XG5cbiAgICAgICAgICAgICAgICBmbG9hdCB2YWwgPSB4VmFsICsgd1ZhbDtcbiAgICAgICAgICAgICAgICBpZiAodmFsID4gY3VyVmFsKSB7XG4gICAgICAgICAgICAgICAgICBjdXJWYWwgPSB2YWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZmxvYXQgcmVzdWx0ID0gY3VyVmFsO1xuICAgICAgICBzZXRPdXRwdXQocmVzdWx0KTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7Z2V0R2xzbERpZmZlcmVuY2VzfSBmcm9tICcuL2dsc2xfdmVyc2lvbic7XG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcbmltcG9ydCB7RU5DT0RFX0ZMT0FUX1NOSVBQRVR9IGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyX3V0aWwnO1xuaW1wb3J0IHtUZXh0dXJlVXNhZ2V9IGZyb20gJy4vdGV4X3V0aWwnO1xuXG5leHBvcnQgY2xhc3MgRW5jb2RlRmxvYXRQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnQSddO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIG91dFRleFVzYWdlID0gVGV4dHVyZVVzYWdlLkRPV05MT0FEO1xuXG4gIGNvbnN0cnVjdG9yKG91dHB1dFNoYXBlOiBudW1iZXJbXSkge1xuICAgIGNvbnN0IGdsc2wgPSBnZXRHbHNsRGlmZmVyZW5jZXMoKTtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gb3V0cHV0U2hhcGU7XG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgICR7RU5DT0RFX0ZMT0FUX1NOSVBQRVR9XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgZmxvYXQgeCA9IGdldEFBdE91dENvb3JkcygpO1xuICAgICAgICAke2dsc2wub3V0cHV0fSA9IGVuY29kZV9mbG9hdCh4KTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7Z2V0R2xzbERpZmZlcmVuY2VzfSBmcm9tICcuL2dsc2xfdmVyc2lvbic7XG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcbmltcG9ydCB7RU5DT0RFX0ZMT0FUX1NOSVBQRVR9IGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyX3V0aWwnO1xuaW1wb3J0IHtUZXh0dXJlVXNhZ2V9IGZyb20gJy4vdGV4X3V0aWwnO1xuXG5leHBvcnQgY2xhc3MgRW5jb2RlRmxvYXRQYWNrZWRQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnQSddO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHBhY2tlZElucHV0cyA9IHRydWU7XG4gIHBhY2tlZE91dHB1dCA9IGZhbHNlO1xuICBvdXRUZXhVc2FnZSA9IFRleHR1cmVVc2FnZS5ET1dOTE9BRDtcblxuICBjb25zdHJ1Y3RvcihvdXRwdXRTaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdKSB7XG4gICAgY29uc3QgZ2xzbCA9IGdldEdsc2xEaWZmZXJlbmNlcygpO1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBvdXRwdXRTaGFwZTtcbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgJHtFTkNPREVfRkxPQVRfU05JUFBFVH1cblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjMyBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgZmxvYXQgeCA9IGdldENoYW5uZWwoZ2V0QUF0T3V0Q29vcmRzKCksIHZlYzIoY29vcmRzLnksIGNvb3Jkcy56KSk7XG4gICAgICAgICR7Z2xzbC5vdXRwdXR9ID0gZW5jb2RlX2Zsb2F0KHgpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtnZXRHbHNsRGlmZmVyZW5jZXN9IGZyb20gJy4vZ2xzbF92ZXJzaW9uJztcbmltcG9ydCB7R1BHUFVQcm9ncmFtLCB1c2VTaGFwZVVuaWZvcm1zfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuaW1wb3J0ICogYXMgc2hhZGVyX3V0aWwgZnJvbSAnLi9zaGFkZXJfY29tcGlsZXJfdXRpbCc7XG5cbmV4cG9ydCBjbGFzcyBFbmNvZGVNYXRyaXhQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnQSddO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIGVuYWJsZVNoYXBlVW5pZm9ybXM6IGJvb2xlYW47XG4gIGN1c3RvbVVuaWZvcm1zID0gW3tuYW1lOiAndGV4U2hhcGUnLCB0eXBlOiAnaXZlYzInIGFzIGNvbnN0IH1dO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgb3V0cHV0U2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgaW5wdXRJc1Vuc2lnbmVkQnl0ZSA9IGZhbHNlKSB7XG4gICAgY29uc3QgZ2xzbCA9IGdldEdsc2xEaWZmZXJlbmNlcygpO1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBvdXRwdXRTaGFwZTtcbiAgICB0aGlzLmVuYWJsZVNoYXBlVW5pZm9ybXMgPSB1c2VTaGFwZVVuaWZvcm1zKHRoaXMub3V0cHV0U2hhcGUubGVuZ3RoKTtcblxuICAgIGxldCBvdXRwdXQgPSBgcmVzdWx0YDtcbiAgICBpZiAoaW5wdXRJc1Vuc2lnbmVkQnl0ZSkge1xuICAgICAgb3V0cHV0ID0gYGZsb29yKHJlc3VsdCAqIDI1NS4gKyAwLjUpYDtcbiAgICB9XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgJHtcbiAgICAgICAgdGhpcy5lbmFibGVTaGFwZVVuaWZvcm1zID8gc2hhZGVyX3V0aWwuZ2V0RmxhdEluZGV4RnJvbTNET3V0cHV0KCkgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFkZXJfdXRpbC5nZXRGbGF0SW5kZXhGcm9tM0Qob3V0cHV0U2hhcGUpfVxuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWMzIGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuXG4gICAgICAgIGludCBmbGF0SW5kZXggPSBnZXRGbGF0SW5kZXgoY29vcmRzKTtcbiAgICAgICAgaW50IG9mZnNldCA9IGltb2QoZmxhdEluZGV4LCA0KTtcblxuICAgICAgICBmbGF0SW5kZXggPSBpZGl2KGZsYXRJbmRleCwgNCwgMS4pO1xuXG4gICAgICAgIGludCByID0gZmxhdEluZGV4IC8gdGV4U2hhcGVbMV07XG4gICAgICAgIGludCBjID0gaW1vZChmbGF0SW5kZXgsIHRleFNoYXBlWzFdKTtcbiAgICAgICAgdmVjMiB1diA9ICh2ZWMyKGMsIHIpICsgaGFsZkNSKSAvIHZlYzIodGV4U2hhcGVbMV0sIHRleFNoYXBlWzBdKTtcbiAgICAgICAgdmVjNCB2YWx1ZXMgPSAke2dsc2wudGV4dHVyZTJEfShBLCB1dik7XG5cbiAgICAgICAgZmxvYXQgcmVzdWx0O1xuXG4gICAgICAgIGlmKG9mZnNldCA9PSAwKSB7XG4gICAgICAgICAgcmVzdWx0ID0gdmFsdWVzWzBdO1xuICAgICAgICB9IGVsc2UgaWYob2Zmc2V0ID09IDEpIHtcbiAgICAgICAgICByZXN1bHQgPSB2YWx1ZXNbMV07XG4gICAgICAgIH0gZWxzZSBpZihvZmZzZXQgPT0gMikge1xuICAgICAgICAgIHJlc3VsdCA9IHZhbHVlc1syXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHQgPSB2YWx1ZXNbM107XG4gICAgICAgIH1cblxuICAgICAgICAke2dsc2wub3V0cHV0fSA9IHZlYzQoJHtvdXRwdXR9LCAwLiwgMC4sIDAuKTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7Z2V0R2xzbERpZmZlcmVuY2VzfSBmcm9tICcuL2dsc2xfdmVyc2lvbic7XG5pbXBvcnQge0dQR1BVUHJvZ3JhbSwgdXNlU2hhcGVVbmlmb3Jtc30gZnJvbSAnLi9ncGdwdV9tYXRoJztcbmltcG9ydCAqIGFzIHNoYWRlcl91dGlsIGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyX3V0aWwnO1xuXG4vKlxuVGhpcyBpcyBob3cgdGhlIHNoYWRlciBlbmNvZGVzIGEgdGVuc29yIHdpdGggc2hhcGUgPSBbMiwgMywgNV1cbihpbmRpY2VzIGFyZSBbYmF0Y2gsIHJvdywgY29sXSkuXG5cbjAwMHwwMDEgICAwMDJ8MDAzICAgMDA0fHh4eCAgIDAyMHwwMjEgICAwMjJ8MDIzICAgMDI0fHh4eFxuLS0tLS0tLSAgIC0tLS0tLS0gICAtLS0tLS0tICAgLS0tLS0tLSAgIC0tLS0tLS0gICAtLS0tLS0tXG4wMTB8MDExICAgMDEyfDAxMyAgIDAxNHx4eHggICB4eHh8eHh4ICAgeHh4fHh4eCAgIHh4eHx4eHhcblxuMTAwfDEwMSAgIDEwMnwxMDMgICAxMDR8eHh4ICAgMTIwfDEyMSAgIDEyMnwxMjMgICAxMjR8eHh4XG4tLS0tLS0tICAgLS0tLS0tLSAgIC0tLS0tLS0gICAtLS0tLS0tICAgLS0tLS0tLSAgIC0tLS0tLS1cbjExMHwxMTEgICAxMTJ8MTEzICAgMTE0fHh4eCAgIHh4eHx4eHggICB4eHh8eHh4ICAgeHh4fHh4eFxuXG5TaW5nbGUgdGV4ZWxzIGNvbnRhaW4gb25seSB2YWx1ZXMgZnJvbSB0aGUgc2FtZSBiYXRjaCwgYW5kIGZyb20gYWRqYWNlbnQgcm93c1xuYW5kIGNvbHVtbnMuXG4gKi9cblxuZXhwb3J0IGNsYXNzIEVuY29kZU1hdHJpeFBhY2tlZFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWydBJ107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgcGFja2VkSW5wdXRzID0gZmFsc2U7XG4gIHBhY2tlZE91dHB1dCA9IHRydWU7XG4gIGVuYWJsZVNoYXBlVW5pZm9ybXM6IGJvb2xlYW47XG4gIGN1c3RvbVVuaWZvcm1zID0gW3tuYW1lOiAndGV4U2hhcGUnLCB0eXBlOiAnaXZlYzInIGFzIGNvbnN0IH1dO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgb3V0cHV0U2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgaW5wdXRJc1Vuc2lnbmVkQnl0ZSA9IGZhbHNlKSB7XG4gICAgY29uc3QgZ2xzbCA9IGdldEdsc2xEaWZmZXJlbmNlcygpO1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBvdXRwdXRTaGFwZTtcbiAgICB0aGlzLmVuYWJsZVNoYXBlVW5pZm9ybXMgPSB1c2VTaGFwZVVuaWZvcm1zKHRoaXMub3V0cHV0U2hhcGUubGVuZ3RoKTtcblxuICAgIGxldCBtYWluTG9vcCA9ICcnO1xuICAgIGxldCBvdXRwdXQgPSAncmVzdWx0JztcbiAgICBpZiAoaW5wdXRJc1Vuc2lnbmVkQnl0ZSkge1xuICAgICAgb3V0cHV0ID0gJ2Zsb29yKHJlc3VsdCAqIDI1NS4gKyAwLjUpJztcbiAgICB9XG5cbiAgICBmb3IgKGxldCByb3cgPSAwOyByb3cgPD0gMTsgcm93KyspIHtcbiAgICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8PSAxOyBjb2wrKykge1xuICAgICAgICBjb25zdCBjaGFubmVsID0gcm93ICogMiArIGNvbDtcblxuICAgICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgICAgbG9jYWxDb29yZHMgPSBjb29yZHM7XG4gICAgICAgICAgaWYobG9jYWxDb29yZHNbMl0gKyAke2NvbH0gPCAke1xuICAgICAgICAgICAgdGhpcy5lbmFibGVTaGFwZVVuaWZvcm1zID8gJ291dFNoYXBlWzJdJyA6IGAke291dHB1dFNoYXBlWzJdfWB9KSB7XG4gICAgICAgICAgbG9jYWxDb29yZHNbMl0gKz0gJHtjb2x9O1xuICAgICAgICAgIGlmIChsb2NhbENvb3Jkc1sxXSArICR7cm93fSA8ICR7XG4gICAgICAgICAgICB0aGlzLmVuYWJsZVNoYXBlVW5pZm9ybXMgPyAnb3V0U2hhcGVbMV0nIDogYCR7b3V0cHV0U2hhcGVbMV19YH0pIHtcbiAgICAgICAgICAgIGxvY2FsQ29vcmRzWzFdICs9ICR7cm93fTtcblxuICAgICAgICAgICAgZmxhdEluZGV4ID0gZ2V0RmxhdEluZGV4KGxvY2FsQ29vcmRzKTtcbiAgICAgICAgICAgIG9mZnNldCA9IGltb2QoZmxhdEluZGV4LCA0KTtcblxuICAgICAgICAgICAgZmxhdEluZGV4ID0gaWRpdihmbGF0SW5kZXgsIDQsIDEuKTtcblxuICAgICAgICAgICAgaW50IHIgPSBmbGF0SW5kZXggLyB0ZXhTaGFwZVsxXTtcbiAgICAgICAgICAgIGludCBjID0gaW1vZChmbGF0SW5kZXgsIHRleFNoYXBlWzFdKTtcbiAgICAgICAgICAgIHZlYzIgdXYgPSAodmVjMihjLCByKSArIGhhbGZDUikgLyB2ZWMyKHRleFNoYXBlWzFdLCB0ZXhTaGFwZVswXSk7XG4gICAgICAgICAgICB2YWx1ZXMgPSAke2dsc2wudGV4dHVyZTJEfShBLCB1dik7XG5cbiAgICAgICAgICAgIGlmIChvZmZzZXQgPT0gMCkge1xuICAgICAgICAgICAgICByZXN1bHRbJHtjaGFubmVsfV0gPSB2YWx1ZXNbMF07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG9mZnNldCA9PSAxKSB7XG4gICAgICAgICAgICAgIHJlc3VsdFske2NoYW5uZWx9XSA9IHZhbHVlc1sxXTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAob2Zmc2V0ID09IDIpIHtcbiAgICAgICAgICAgICAgcmVzdWx0WyR7Y2hhbm5lbH1dID0gdmFsdWVzWzJdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVzdWx0WyR7Y2hhbm5lbH1dID0gdmFsdWVzWzNdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBgO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICAgICR7XG4gICAgICAgIHRoaXMuZW5hYmxlU2hhcGVVbmlmb3JtcyA/IHNoYWRlcl91dGlsLmdldEZsYXRJbmRleEZyb20zRE91dHB1dCgpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhZGVyX3V0aWwuZ2V0RmxhdEluZGV4RnJvbTNEKG91dHB1dFNoYXBlKX1cblxuICAgICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICAgaXZlYzMgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG5cbiAgICAgICAgICB2ZWM0IHJlc3VsdCA9IHZlYzQoMC4pO1xuICAgICAgICAgIGludCBmbGF0SW5kZXgsIHIsIGMsIG9mZnNldDtcbiAgICAgICAgICBpdmVjMyBsb2NhbENvb3JkcztcbiAgICAgICAgICB2ZWMyIHV2O1xuICAgICAgICAgIHZlYzQgdmFsdWVzO1xuXG4gICAgICAgICAgJHttYWluTG9vcH1cblxuICAgICAgICAgICR7Z2xzbC5vdXRwdXR9ID0gJHtvdXRwdXR9O1xuICAgICAgICB9XG4gICAgYDtcbiAgfVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcblxuZXhwb3J0IGNsYXNzIEZGVFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWydyZWFsJywgJ2ltYWcnXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgY29tcG9uZW50OiAncmVhbCd8J2ltYWcnLCBpbnB1dFNoYXBlOiBbbnVtYmVyLCBudW1iZXJdLFxuICAgICAgaW52ZXJzZTogYm9vbGVhbikge1xuICAgIGNvbnN0IGlubmVyRGltID0gaW5wdXRTaGFwZVsxXTtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gaW5wdXRTaGFwZTtcblxuICAgIGNvbnN0IGV4cG9uZW50TXVsdGlwbGllclNuaXBwZXQgPVxuICAgICAgICBpbnZlcnNlID8gYDIuMCAqICR7TWF0aC5QSX1gIDogYC0yLjAgKiAke01hdGguUEl9YDtcbiAgICBjb25zdCByZXN1bHREZW5vbWluYXRvciA9IGludmVyc2UgPyBgJHtpbm5lckRpbX0uMGAgOiAnMS4wJztcblxuICAgIGxldCBvcFN0cmluZzogc3RyaW5nO1xuICAgIGlmIChjb21wb25lbnQgPT09ICdyZWFsJykge1xuICAgICAgb3BTdHJpbmcgPSAncmV0dXJuIHJlYWwgKiBleHBSIC0gaW1hZyAqIGV4cEk7JztcbiAgICB9IGVsc2UgaWYgKGNvbXBvbmVudCA9PT0gJ2ltYWcnKSB7XG4gICAgICBvcFN0cmluZyA9ICdyZXR1cm4gcmVhbCAqIGV4cEkgKyBpbWFnICogZXhwUjsnO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEZGVCBjb21wb25lbnQgbXVzdCBiZSBlaXRoZXIgXCJyZWFsXCIgb3IgXCJpbWFnXCIsIGdvdCAke2NvbXBvbmVudH0uYCk7XG4gICAgfVxuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGNvbnN0IGZsb2F0IGV4cG9uZW50TXVsdGlwbGllciA9ICR7ZXhwb25lbnRNdWx0aXBsaWVyU25pcHBldH07XG5cbiAgICAgIGZsb2F0IHVuYXJ5T3BDb21wbGV4KGZsb2F0IHJlYWwsIGZsb2F0IGV4cFIsIGZsb2F0IGltYWcsIGZsb2F0IGV4cEkpIHtcbiAgICAgICAgJHtvcFN0cmluZ31cbiAgICAgIH1cblxuICAgICAgZmxvYXQgbXVsTWF0REZUKGludCBiYXRjaCwgaW50IGluZGV4KSB7XG4gICAgICAgIGZsb2F0IGluZGV4UmF0aW8gPSBmbG9hdChpbmRleCkgLyBmbG9hdCgke2lubmVyRGltfSk7XG4gICAgICAgIGZsb2F0IGV4cG9uZW50TXVsdGlwbGllclRpbWVzSW5kZXhSYXRpbyA9XG4gICAgICAgICAgICBleHBvbmVudE11bHRpcGxpZXIgKiBpbmRleFJhdGlvO1xuXG4gICAgICAgIGZsb2F0IHJlc3VsdCA9IDAuMDtcblxuICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8ICR7aW5uZXJEaW19OyBpKyspIHtcbiAgICAgICAgICAvLyB4ID0gKC0yfDIgKiBQSSAvIE4pICogaW5kZXggKiBpO1xuICAgICAgICAgIGZsb2F0IHggPSBleHBvbmVudE11bHRpcGxpZXJUaW1lc0luZGV4UmF0aW8gKiBmbG9hdChpKTtcbiAgICAgICAgICBmbG9hdCBleHBSID0gY29zKHgpO1xuICAgICAgICAgIGZsb2F0IGV4cEkgPSBzaW4oeCk7XG4gICAgICAgICAgZmxvYXQgcmVhbCA9IGdldFJlYWwoYmF0Y2gsIGkpO1xuICAgICAgICAgIGZsb2F0IGltYWcgPSBnZXRJbWFnKGJhdGNoLCBpKTtcblxuICAgICAgICAgIHJlc3VsdCArPVxuICAgICAgICAgICAgICB1bmFyeU9wQ29tcGxleChyZWFsLCBleHBSLCBpbWFnLCBleHBJKSAvICR7cmVzdWx0RGVub21pbmF0b3J9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjMiBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgc2V0T3V0cHV0KG11bE1hdERGVChjb29yZHNbMF0sIGNvb3Jkc1sxXSkpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5pbXBvcnQge1VuaWZvcm1UeXBlfSBmcm9tICcuL3NoYWRlcl9jb21waWxlcic7XG5cbmV4cG9ydCBjbGFzcyBGaWxsUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXM6IHN0cmluZ1tdO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW10gPSBbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcbiAgY3VzdG9tVW5pZm9ybXMgPSBbe25hbWU6ICd2YWx1ZScsIHR5cGU6ICdmbG9hdCcgYXMgVW5pZm9ybVR5cGV9XTtcblxuICBjb25zdHJ1Y3RvcihzaGFwZTogbnVtYmVyW10sIHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBbJ3gnXTtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gc2hhcGU7XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAvLyBJbnB1dCBjYW4gYmUgb2J0YWluZWQgZnJvbSB1bmlmb3JtIHZhbHVlLlxuICAgICAgICBzZXRPdXRwdXQodmFsdWUpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtkZXZpY2VfdXRpbCwgZW52fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge2dldE1heFRleHR1cmVzSW5TaGFkZXIsIGdldFdlYkdMRGlzam9pbnRRdWVyeVRpbWVyVmVyc2lvbiwgZ2V0V2ViR0xNYXhUZXh0dXJlU2l6ZSwgaXNDYXBhYmxlT2ZSZW5kZXJpbmdUb0Zsb2F0VGV4dHVyZSwgaXNEb3dubG9hZEZsb2F0VGV4dHVyZUVuYWJsZWQsIGlzV2ViR0xGZW5jZUVuYWJsZWQsIGlzV2ViR0xWZXJzaW9uRW5hYmxlZH0gZnJvbSAnLi93ZWJnbF91dGlsJztcblxuY29uc3QgRU5WID0gZW52KCk7XG5cbi8qKlxuICogVGhpcyBmaWxlIGNvbnRhaW5zIFdlYkdMLXNwZWNpZmljIGZsYWcgcmVnaXN0cmF0aW9ucy5cbiAqL1xuXG4vKipcbiAqIFRydWUgaWYgV2ViR0wgaXMgc3VwcG9ydGVkLlxuICovXG5FTlYucmVnaXN0ZXJGbGFnKCdIQVNfV0VCR0wnLCAoKSA9PiBFTlYuZ2V0TnVtYmVyKCdXRUJHTF9WRVJTSU9OJykgPiAwKTtcblxuLyoqIDA6IE5vIFdlYkdMLCAxOiBXZWJHTCAxLjAsIDI6IFdlYkdMIDIuMC4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ1dFQkdMX1ZFUlNJT04nLCAoKSA9PiB7XG4gIGlmIChpc1dlYkdMVmVyc2lvbkVuYWJsZWQoMikpIHtcbiAgICByZXR1cm4gMjtcbiAgfSBlbHNlIGlmIChpc1dlYkdMVmVyc2lvbkVuYWJsZWQoMSkpIHtcbiAgICByZXR1cm4gMTtcbiAgfVxuICByZXR1cm4gMDtcbn0pO1xuXG4vKiogV2hldGhlciB0byBjaGVjayBmb3IgbnVtZXJpY2FsIHJlcHJlc2VudGF0aW9uIHByb2JsZW1zLiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnV0VCR0xfQ0hFQ0tfTlVNRVJJQ0FMX1BST0JMRU1TJywgKCkgPT4gZmFsc2UpO1xuXG5FTlYucmVnaXN0ZXJGbGFnKFxuICAgICdXRUJHTF9CVUZGRVJfU1VQUE9SVEVEJywgKCkgPT4gRU5WLmdldCgnV0VCR0xfVkVSU0lPTicpID09PSAyKTtcblxuLyoqIFdoZXRoZXIgdGhlIFdlYkdMIGJhY2tlbmQgd2lsbCBzb21ldGltZXMgZm9yd2FyZCBvcHMgdG8gdGhlIENQVS4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ1dFQkdMX0NQVV9GT1JXQVJEJywgKCkgPT4gdHJ1ZSk7XG5cbi8qKiBXaGV0aGVyIHRoZSBXZWJHTCBiYWNrZW5kIHdpbGwgYWx3YXlzIHVzZSBmMTYgdGV4dHVyZXMgZm9yIHJlbmRlcmluZy4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ1dFQkdMX0ZPUkNFX0YxNl9URVhUVVJFUycsICgpID0+IGZhbHNlKTtcblxuLyoqIFdoZXRoZXIgdG8gdHVybiBhbGwgcGFja2luZyByZWxhdGVkIGZsYWdzIG9uLiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnV0VCR0xfUEFDSycsICgpID0+IEVOVi5nZXRCb29sKCdIQVNfV0VCR0wnKSk7XG5cbi8qKiBXaGV0aGVyIHdlIHdpbGwgcGFjayB0aGUgYmF0Y2hub3JtYWxpemF0aW9uIG9wLiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnV0VCR0xfUEFDS19OT1JNQUxJWkFUSU9OJywgKCkgPT4gRU5WLmdldEJvb2woJ1dFQkdMX1BBQ0snKSk7XG5cbi8qKiBXaGV0aGVyIHdlIHdpbGwgcGFjayB0aGUgY2xpcCBvcC4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ1dFQkdMX1BBQ0tfQ0xJUCcsICgpID0+IEVOVi5nZXRCb29sKCdXRUJHTF9QQUNLJykpO1xuXG4vKiogV2hldGhlciB3ZSB3aWxsIHBhY2sgdGhlIGRlcHRod2lzZSBjb252IG9wLiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnV0VCR0xfUEFDS19ERVBUSFdJU0VDT05WJywgKCkgPT4gRU5WLmdldEJvb2woJ1dFQkdMX1BBQ0snKSk7XG5cbi8qKiBXaGV0aGVyIHdlIHdpbGwgcGFjayBiaW5hcnkgb3BzLiAqL1xuRU5WLnJlZ2lzdGVyRmxhZyhcbiAgICAnV0VCR0xfUEFDS19CSU5BUllfT1BFUkFUSU9OUycsICgpID0+IEVOVi5nZXRCb29sKCdXRUJHTF9QQUNLJykpO1xuXG4vKiogV2hldGhlciB3ZSB3aWxsIHBhY2sgdW5hcnkgb3BzLiAqL1xuRU5WLnJlZ2lzdGVyRmxhZyhcbiAgICAnV0VCR0xfUEFDS19VTkFSWV9PUEVSQVRJT05TJywgKCkgPT4gRU5WLmdldEJvb2woJ1dFQkdMX1BBQ0snKSk7XG5cbi8qKiBXaGV0aGVyIHdlIHdpbGwgcGFjayBhcnJheSBvcHMuICovXG5FTlYucmVnaXN0ZXJGbGFnKFxuICAgICdXRUJHTF9QQUNLX0FSUkFZX09QRVJBVElPTlMnLCAoKSA9PiBFTlYuZ2V0Qm9vbCgnV0VCR0xfUEFDSycpKTtcblxuLyoqIFdoZXRoZXIgd2Ugd2lsbCBwYWNrIGltYWdlIG9wcy4gKi9cbkVOVi5yZWdpc3RlckZsYWcoXG4gICAgJ1dFQkdMX1BBQ0tfSU1BR0VfT1BFUkFUSU9OUycsICgpID0+IEVOVi5nZXRCb29sKCdXRUJHTF9QQUNLJykpO1xuXG4vKiogV2hldGhlciB3ZSB3aWxsIHBhY2sgcmVkdWNlIG9wcy4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ1dFQkdMX1BBQ0tfUkVEVUNFJywgKCkgPT4gRU5WLmdldEJvb2woJ1dFQkdMX1BBQ0snKSk7XG5cbi8qKiBXaGV0aGVyIHBhY2tlZCBXZWJHTCBrZXJuZWxzIGxhemlseSB1bnBhY2sgdGhlaXIgb3V0cHV0cy4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ1dFQkdMX0xBWklMWV9VTlBBQ0snLCAoKSA9PiBFTlYuZ2V0Qm9vbCgnV0VCR0xfUEFDSycpKTtcblxuLyoqIFdoZXRoZXIgd2Ugd2lsbCB1c2UgdGhlIGltMmNvbCBhbGdvcml0aG0gdG8gc3BlZWQgdXAgY29udm9sdXRpb25zLiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnV0VCR0xfQ09OVl9JTTJDT0wnLCAoKSA9PiBFTlYuZ2V0Qm9vbCgnV0VCR0xfUEFDSycpKTtcblxuLyoqIFRoZSBtYXhpbXVtIHRleHR1cmUgZGltZW5zaW9uLiAqL1xuRU5WLnJlZ2lzdGVyRmxhZyhcbiAgICAnV0VCR0xfTUFYX1RFWFRVUkVfU0laRScsXG4gICAgKCkgPT4gZ2V0V2ViR0xNYXhUZXh0dXJlU2l6ZShFTlYuZ2V0TnVtYmVyKCdXRUJHTF9WRVJTSU9OJykpKTtcblxuLyoqIFRoZSBtYXhpbXVtIHRleHR1cmUgZGltZW5zaW9uLiAqL1xuRU5WLnJlZ2lzdGVyRmxhZyhcbiAgICAnV0VCR0xfTUFYX1RFWFRVUkVTX0lOX1NIQURFUicsXG4gICAgKCkgPT4gZ2V0TWF4VGV4dHVyZXNJblNoYWRlcihFTlYuZ2V0TnVtYmVyKCdXRUJHTF9WRVJTSU9OJykpKTtcblxuLyoqXG4gKiBUaGUgZGlzam9pbnRfcXVlcnlfdGltZXIgZXh0ZW5zaW9uIHZlcnNpb24uXG4gKiAwOiBkaXNhYmxlZCwgMTogRVhUX2Rpc2pvaW50X3RpbWVyX3F1ZXJ5LCAyOlxuICogRVhUX2Rpc2pvaW50X3RpbWVyX3F1ZXJ5X3dlYmdsMi5cbiAqIEluIEZpcmVmb3ggd2l0aCBXZWJHTCAyLjAsXG4gKiBFWFRfZGlzam9pbnRfdGltZXJfcXVlcnlfd2ViZ2wyIGlzIG5vdCBhdmFpbGFibGUsIHNvIHdlIG11c3QgdXNlIHRoZVxuICogV2ViR0wgMS4wIGV4dGVuc2lvbi5cbiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnV0VCR0xfRElTSk9JTlRfUVVFUllfVElNRVJfRVhURU5TSU9OX1ZFUlNJT04nLCAoKSA9PiB7XG4gIGNvbnN0IHdlYkdMVmVyc2lvbiA9IEVOVi5nZXROdW1iZXIoJ1dFQkdMX1ZFUlNJT04nKTtcblxuICBpZiAod2ViR0xWZXJzaW9uID09PSAwKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgcmV0dXJuIGdldFdlYkdMRGlzam9pbnRRdWVyeVRpbWVyVmVyc2lvbih3ZWJHTFZlcnNpb24pO1xufSk7XG5cbi8qKlxuICogV2hldGhlciB0aGUgdGltZXIgb2JqZWN0IGZyb20gdGhlIGRpc2pvaW50X3F1ZXJ5X3RpbWVyIGV4dGVuc2lvbiBnaXZlc1xuICogdGltaW5nIGluZm9ybWF0aW9uIHRoYXQgaXMgcmVsaWFibGUuXG4gKi9cbkVOVi5yZWdpc3RlckZsYWcoXG4gICAgJ1dFQkdMX0RJU0pPSU5UX1FVRVJZX1RJTUVSX0VYVEVOU0lPTl9SRUxJQUJMRScsXG4gICAgKCkgPT4gRU5WLmdldE51bWJlcignV0VCR0xfRElTSk9JTlRfUVVFUllfVElNRVJfRVhURU5TSU9OX1ZFUlNJT04nKSA+IDAgJiZcbiAgICAgICAgIWRldmljZV91dGlsLmlzTW9iaWxlKCkpO1xuXG4vKipcbiAqIFdoZXRoZXIgdGhlIGRldmljZSBpcyBwaHlzaWNhbGx5IGNhcGFibGUgb2YgcmVuZGVyaW5nIHRvIGZsb2F0MzIgdGV4dHVyZXMuXG4gKi9cbkVOVi5yZWdpc3RlckZsYWcoXG4gICAgJ1dFQkdMX1JFTkRFUl9GTE9BVDMyX0NBUEFCTEUnLFxuICAgICgpID0+IGlzQ2FwYWJsZU9mUmVuZGVyaW5nVG9GbG9hdFRleHR1cmUoRU5WLmdldE51bWJlcignV0VCR0xfVkVSU0lPTicpKSk7XG5cbi8qKlxuICogV2hldGhlciByZW5kZXJpbmcgdG8gZmxvYXQzMiB0ZXh0dXJlcyBpcyBlbmFibGVkLiBJZiBkaXNhYmxlZCwgcmVuZGVycyB0b1xuICogZmxvYXQxNiB0ZXh0dXJlcy5cbiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnV0VCR0xfUkVOREVSX0ZMT0FUMzJfRU5BQkxFRCcsICgpID0+IHtcbiAgcmV0dXJuIEVOVi5nZXRCb29sKCdXRUJHTF9GT1JDRV9GMTZfVEVYVFVSRVMnKSA/XG4gICAgICBmYWxzZSA6XG4gICAgICBFTlYuZ2V0Qm9vbCgnV0VCR0xfUkVOREVSX0ZMT0FUMzJfQ0FQQUJMRScpO1xufSk7XG5cbi8qKlxuICogV2hldGhlciBkb3dubG9hZGluZyBmbG9hdCB0ZXh0dXJlcyBpcyBlbmFibGVkICgxNiBvciAzMiBiaXQpLiBJZiBkaXNhYmxlZCxcbiAqIHVzZXMgSUVFRSA3NTQgZW5jb2Rpbmcgb2YgdGhlIGZsb2F0MzIgdmFsdWVzIHRvIDQgdWludDggd2hlbiBkb3dubG9hZGluZy5cbiAqL1xuRU5WLnJlZ2lzdGVyRmxhZyhcbiAgICAnV0VCR0xfRE9XTkxPQURfRkxPQVRfRU5BQkxFRCcsXG4gICAgKCkgPT4gaXNEb3dubG9hZEZsb2F0VGV4dHVyZUVuYWJsZWQoRU5WLmdldE51bWJlcignV0VCR0xfVkVSU0lPTicpKSk7XG5cbi8qKiBXaGV0aGVyIHRoZSBmZW5jZSBBUEkgaXMgYXZhaWxhYmxlLiAqL1xuRU5WLnJlZ2lzdGVyRmxhZyhcbiAgICAnV0VCR0xfRkVOQ0VfQVBJX0VOQUJMRUQnLFxuICAgICgpID0+IGlzV2ViR0xGZW5jZUVuYWJsZWQoRU5WLmdldE51bWJlcignV0VCR0xfVkVSU0lPTicpKSk7XG5cbi8qKlxuICogVGVuc29ycyB3aXRoIHNpemUgPD0gdGhhbiB0aGlzIHdpbGwgYmUgdXBsb2FkZWQgYXMgdW5pZm9ybXMsIG5vdCB0ZXh0dXJlcy5cbiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnV0VCR0xfU0laRV9VUExPQURfVU5JRk9STScsICgpID0+IHtcbiAgLy8gVXNlIHVuaWZvcm0gdXBsb2FkcyBvbmx5IHdoZW4gMzJiaXQgZmxvYXRzIGFyZSBzdXBwb3J0ZWQuIEluXG4gIC8vIDE2Yml0XG4gIC8vIGVudmlyb25tZW50cyB0aGVyZSBhcmUgcHJvYmxlbXMgd2l0aCBjb21wYXJpbmcgYSAxNmJpdCB0ZXh0dXJlIHZhbHVlXG4gIC8vIHdpdGggYSAzMmJpdCB1bmlmb3JtIHZhbHVlLlxuICBjb25zdCB1c2VVbmlmb3JtcyA9IEVOVi5nZXRCb29sKCdXRUJHTF9SRU5ERVJfRkxPQVQzMl9FTkFCTEVEJyk7XG4gIHJldHVybiB1c2VVbmlmb3JtcyA/IDQgOiAwO1xufSk7XG5cbi8qKlxuICogSWYgdGhlIHRvdGFsIG51bWJlciBvZiBieXRlcyBhbGxvY2F0ZWQgb24gdGhlIEdQVSBpcyBncmVhdGVyIHRoYW4gdGhpc1xuICogbnVtYmVyLCB3ZSB3aWxsIGFnZ3Jlc3NpdmVseSBkZWxldGUgdGV4dHVyZXMgdXBvbiBkaXNwb3NhbCB3aXRoXG4gKiBnbC5kZWxldGVNYXRyaXhUZXh0dXJlLCByYXRoZXIgdGhhbiBtYWtpbmcgdGhlbSBhdmFpbGFibGUgZm9yIHJldXNlLlxuICpcbiAqIERlZmF1bHQgdmFsdWUgLTEgaW5kaWNhdGVzIHRoYXQgd2Ugd2lsbCBuZXZlciBhZ2dyZXNzaXZlbHkgZGVsZXRlIHRleHR1cmVzLlxuICovXG5FTlYucmVnaXN0ZXJGbGFnKFxuICAgICdXRUJHTF9ERUxFVEVfVEVYVFVSRV9USFJFU0hPTEQnLFxuICAgICgpID0+IHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9LFxuICAgIHRocmVzaG9sZCA9PiB7XG4gICAgICBpZiAodGhyZXNob2xkIDwgMCAmJiB0aHJlc2hvbGQgIT09IC0xKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBXRUJHTF9ERUxFVEVfVEVYVFVSRV9USFJFU0hPTEQgbXVzdCBiZSAtMSAoaW5kaWNhdGluZyBuZXZlciBgICtcbiAgICAgICAgICAgIGBkZWxldGUpIG9yIGF0IGxlYXN0IDAsIGJ1dCBnb3QgJHt0aHJlc2hvbGR9LmApO1xuICAgICAgfVxuICAgIH0pO1xuXG4vKipcbiAqIFRyaWdnZXIgYSBtYW51YWwgR0wgY29tbWFuZCBmbHVzaCBpZiB0aGUgdGhyZXNob2xkIG9mIHRpbWUgaGFzIHBhc3NlZCBzaW5jZVxuICogcHJldmlvdXMgS2VybmVsIGV4ZWN1dGlvbi4gVGhpcyBjYW4gYmUgdXNlZnVsIGZvciBBbmRvcmlkIGRldmljZSB3aGVyZSBHTFxuICogY29tbWFuZCBmbHVzaCBhcmUgZGVsYXllZCB1biB0aWwgdGhlIGVuZCBvZiBqYXZhc2NyaXB0IHRhc2suIFRoaXMgdmFsdWUgaXNcbiAqIG1lYXN1cmVkIGluIG1pbGxpc2Vjb25kLiBUeXBpY2FsbHkgeW91IHdhbnQgdG8gc2V0IHRoaXMgdmFsdWUgdG8gY2xvc2UgdG8gMS5cbiAqXG4gKiBEZWZhdWx0IHZhbHVlIDEgZm9yIG1vYmlsZSBjaHJvbWUsIGFuZCAtMSBmb3IgcmVzdCBjYXNlcy4gLTEgaW5kaWNhdGVzIHRoYXRcbiAqIHdlIHdpbGwgbm90IGVuZm9yY2UgbWFudWFsIGZsdXNoIGFuZCBkZXBlbmQgb24gc3lzdGVtIGRlZmF1bHQgZmx1c2ggc2NoZWR1bGUuXG4gKi9cbkVOVi5yZWdpc3RlckZsYWcoXG4gICAgJ1dFQkdMX0ZMVVNIX1RIUkVTSE9MRCcsXG4gICAgKCkgPT4ge1xuICAgICAgcmV0dXJuIGRldmljZV91dGlsLmlzTW9iaWxlKCkgJiYgRU5WLmdldEJvb2woJ0lTX0NIUk9NRScpID8gMSA6IC0xO1xuICAgIH0sXG4gICAgdGhyZXNob2xkID0+IHtcbiAgICAgIGlmICh0aHJlc2hvbGQgPCAwICYmIHRocmVzaG9sZCAhPT0gLTEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFdFQkdMX0ZMVVNIX1RIUkVTSE9MRCBtdXN0IGJlIC0xIChpbmRpY2F0aW5nIG5ldmVyIGAgK1xuICAgICAgICAgICAgYG1hbnVhbCBmbHVzaCkgb3IgYXQgbGVhc3QgMCwgYnV0IGdvdCAke3RocmVzaG9sZH0uYCk7XG4gICAgICB9XG4gICAgfSk7XG5cbi8qKlxuICogVGhyZXNob2xkIGZvciBpbnB1dCB0ZW5zb3Igc2l6ZSB0aGF0IGRldGVybWluZXMgd2hldGhlciBXZWJHTCBiYWNrZW5kIHdpbGxcbiAqIGRlbGVnYXRlIGNvbXB1dGF0aW9uIHRvIENQVS5cbiAqXG4gKiBEZWZhdWx0IHZhbHVlIGlzIDEyOC5cbiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnQ1BVX0hBTkRPRkZfU0laRV9USFJFU0hPTEQnLCAoKSA9PiAxMjgpO1xuXG4vKiogV2hldGhlciB3ZSB3aWxsIHVzZSBzaGFwZXMgdW5pZm9ybXMuICovXG5FTlYucmVnaXN0ZXJGbGFnKCdXRUJHTF9VU0VfU0hBUEVTX1VOSUZPUk1TJywgKCkgPT4gZmFsc2UpO1xuXG4vKipcbiAqIFRocmVzaG9sZCBmb3IgbGFzdCBkaW1lbnNpb24gb2YgaW5wdXQgdGVuc29yIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyXG4gKiBXZWJHTCBiYWNrZW5kIGZvciB0aGUgVG9wIEsgb3Agd2lsbCBkZWxlZ2F0ZSBjb21wdXRhdGlvbiB0byBDUFUuIElmIGlucHV0XG4gKiBpcyBzbWFsbGVyIHRoYW4gdGhyZXNob2xkIHRoZW4gQ1BVIHdpbGwgYmUgdXNlZFxuICpcbiAqIERlZmF1bHQgdmFsdWUgaXMgMTAwMDAwLlxuICovXG5FTlYucmVnaXN0ZXJGbGFnKCdUT1BLX0xBU1RfRElNX0NQVV9IQU5ET0ZGX1NJWkVfVEhSRVNIT0xEJywgKCkgPT4gMTAwMDAwKTtcblxuLyoqXG4gKiBUaHJlc2hvbGQgZm9yIEsgdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXJcbiAqIFdlYkdMIGJhY2tlbmQgZm9yIHRoZSBUb3AgSyBvcCB3aWxsIGRlbGVnYXRlIGNvbXB1dGF0aW9uIHRvIENQVS4gSWYga1xuICogaXMgbGFyZ2VyIHRoYW4gdGhyZXNob2xkIHRoZW4gQ1BVIHdpbGwgYmUgdXNlZFxuICpcbiAqIERlZmF1bHQgdmFsdWUgaXMgMTI4LlxuICovXG5FTlYucmVnaXN0ZXJGbGFnKCdUT1BLX0tfQ1BVX0hBTkRPRkZfVEhSRVNIT0xEJywgKCkgPT4gMTI4KTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5cbmV4cG9ydCBjbGFzcyBGbGlwTGVmdFJpZ2h0UHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ0ltYWdlJ107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXSA9IFtdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGltYWdlU2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdKSB7XG4gICAgY29uc3QgaW1hZ2VXaWR0aCA9IGltYWdlU2hhcGVbMl07XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IGltYWdlU2hhcGU7XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgICAgaW50IHggPSBjb29yZHNbMl07XG5cbiAgICAgICAgICBpbnQgY29vcmRYID0gJHtpbWFnZVdpZHRofSAtIHggLSAxO1xuICAgICAgICAgIGZsb2F0IG91dHB1dFZhbHVlO1xuICAgICAgICAgIGlmKGNvb3JkWCA+PSAwICYmIGNvb3JkWCA8ICR7aW1hZ2VXaWR0aH0pIHtcbiAgICAgICAgICAgIG91dHB1dFZhbHVlID0gZ2V0SW1hZ2UoY29vcmRzWzBdLCBjb29yZHNbMV0sIGNvb3JkWCwgY29vcmRzWzNdKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3V0cHV0VmFsdWUgPSBnZXRJbWFnZShjb29yZHNbMF0sIGNvb3Jkc1sxXSwgY29vcmRzWzJdLCBjb29yZHNbM10pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzZXRPdXRwdXQob3V0cHV0VmFsdWUpO1xuICAgICAgICB9XG4gICAgYDtcbiAgfVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcbmltcG9ydCB7Z2V0Q29vcmRzRGF0YVR5cGV9IGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyJztcblxuZXhwb3J0IGNsYXNzIEdhdGhlclByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWydBJywgJ2luZGljZXMnXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuICByYW5rOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoYVNoYXBlOiBudW1iZXJbXSwgb3V0cHV0U2hhcGU6IG51bWJlcltdKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IG91dHB1dFNoYXBlO1xuICAgIHRoaXMucmFuayA9IG91dHB1dFNoYXBlLmxlbmd0aDtcbiAgICBjb25zdCBkdHlwZSA9IGdldENvb3Jkc0RhdGFUeXBlKHRoaXMucmFuayk7XG4gICAgY29uc3Qgc291cmNlQ29vcmRzID0gZ2V0U291cmNlQ29vcmRzKGFTaGFwZSwgMik7XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAke2R0eXBlfSByZXNSQyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBzZXRPdXRwdXQoZ2V0QSgke3NvdXJjZUNvb3Jkc30pKTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG5cbi8vIFRoZSBpbnB1dCBhbmQgb3V0cHV0IGFyZSBhbHdheXMgZmxhdHRlbmVkIGludG8gcmFuayA0IHRlbnNvcnMuXG5mdW5jdGlvbiBnZXRTb3VyY2VDb29yZHMoYVNoYXBlOiBudW1iZXJbXSwgYXhpczogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgY3VycmVudENvb3JkcyA9IFsncmVzUkMueCcsICdyZXNSQy55JywgJ3Jlc1JDLnonLCAncmVzUkMudyddO1xuXG4gIGNvbnN0IHNvdXJjZUNvb3JkcyA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGFTaGFwZS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChpID09PSAyKSB7XG4gICAgICBzb3VyY2VDb29yZHMucHVzaCgnaW50KGdldEluZGljZXMocmVzUkMueCwgcmVzUkMueikpJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNvdXJjZUNvb3Jkcy5wdXNoKGAke2N1cnJlbnRDb29yZHNbaV19YCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBzb3VyY2VDb29yZHMuam9pbigpO1xufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5pbXBvcnQge2dldENvb3Jkc0RhdGFUeXBlfSBmcm9tICcuL3NoYWRlcl9jb21waWxlcic7XG5cbmV4cG9ydCBjbGFzcyBHYXRoZXJORFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWyd4JywgJ2luZGljZXMnXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuICBjb25zdHJ1Y3RvcihcbiAgICAgIHByaXZhdGUgc2xpY2VEaW06IG51bWJlciwgcHJpdmF0ZSBzdHJpZGVzOiBudW1iZXJbXSwgc2hhcGU6IG51bWJlcltdKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IHNoYXBlO1xuICAgIGNvbnN0IHN0cmlkZXNUeXBlID0gZ2V0Q29vcmRzRGF0YVR5cGUoc3RyaWRlcy5sZW5ndGgpO1xuICAgIGNvbnN0IGR0eXBlID0gZ2V0Q29vcmRzRGF0YVR5cGUoc2hhcGUubGVuZ3RoKTtcbiAgICBjb25zdCBzdHJpZGVTdHJpbmcgPSB0aGlzLnNsaWNlRGltID4gMSA/ICdzdHJpZGVzW2pdJyA6ICdzdHJpZGVzJztcbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgICAke3N0cmlkZXNUeXBlfSBzdHJpZGVzID0gJHtzdHJpZGVzVHlwZX0oJHt0aGlzLnN0cmlkZXN9KTtcbiAgICAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgICAke2R0eXBlfSBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgICBpbnQgZmxhdHRlbkluZGV4ID0gMDtcbiAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8ICR7dGhpcy5zbGljZURpbX07IGorKykge1xuICAgICAgICAgICAgaW50IGluZGV4ID0gcm91bmQoZ2V0SW5kaWNlcyhjb29yZHNbMF0sIGopKTtcbiAgICAgICAgICAgIGZsYXR0ZW5JbmRleCArPSBpbmRleCAqICR7c3RyaWRlU3RyaW5nfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2V0T3V0cHV0KGdldFgoZmxhdHRlbkluZGV4LCBjb29yZHNbMV0pKTtcbiAgICAgICAgfVxuICAgICAgYDtcbiAgfVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtlbnZ9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmV4cG9ydCB0eXBlIEdMU0wgPSB7XG4gIHZlcnNpb246IHN0cmluZyxcbiAgYXR0cmlidXRlOiBzdHJpbmcsXG4gIHZhcnlpbmdWczogc3RyaW5nLFxuICB2YXJ5aW5nRnM6IHN0cmluZyxcbiAgdGV4dHVyZTJEOiBzdHJpbmcsXG4gIG91dHB1dDogc3RyaW5nLFxuICBkZWZpbmVPdXRwdXQ6IHN0cmluZyxcbiAgZGVmaW5lU3BlY2lhbE5hTjogc3RyaW5nLFxuICBkZWZpbmVTcGVjaWFsSW5mOiBzdHJpbmcsXG4gIGRlZmluZVJvdW5kOiBzdHJpbmdcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRHbHNsRGlmZmVyZW5jZXMoKTogR0xTTCB7XG4gIGxldCB2ZXJzaW9uOiBzdHJpbmc7XG4gIGxldCBhdHRyaWJ1dGU6IHN0cmluZztcbiAgbGV0IHZhcnlpbmdWczogc3RyaW5nO1xuICBsZXQgdmFyeWluZ0ZzOiBzdHJpbmc7XG4gIGxldCB0ZXh0dXJlMkQ6IHN0cmluZztcbiAgbGV0IG91dHB1dDogc3RyaW5nO1xuICBsZXQgZGVmaW5lT3V0cHV0OiBzdHJpbmc7XG4gIGxldCBkZWZpbmVTcGVjaWFsTmFOOiBzdHJpbmc7XG4gIGxldCBkZWZpbmVTcGVjaWFsSW5mOiBzdHJpbmc7XG4gIGxldCBkZWZpbmVSb3VuZDogc3RyaW5nO1xuXG4gIGlmIChlbnYoKS5nZXROdW1iZXIoJ1dFQkdMX1ZFUlNJT04nKSA9PT0gMikge1xuICAgIHZlcnNpb24gPSAnI3ZlcnNpb24gMzAwIGVzJztcbiAgICBhdHRyaWJ1dGUgPSAnaW4nO1xuICAgIHZhcnlpbmdWcyA9ICdvdXQnO1xuICAgIHZhcnlpbmdGcyA9ICdpbic7XG4gICAgdGV4dHVyZTJEID0gJ3RleHR1cmUnO1xuICAgIG91dHB1dCA9ICdvdXRwdXRDb2xvcic7XG4gICAgZGVmaW5lT3V0cHV0ID0gJ291dCB2ZWM0IG91dHB1dENvbG9yOyc7XG5cbiAgICAvLyBVc2UgY3VzdG9tIGlzbmFuIGRlZmluaXRpb24gdG8gd29yayBhY3Jvc3MgZGlmZmVyZW5jZXMgYmV0d2VlblxuICAgIC8vIGltcGxlbWVudGF0aW9ucyBvbiB2YXJpb3VzIHBsYXRmb3Jtcy4gV2hpbGUgdGhpcyBzaG91bGQgaGFwcGVuIGluIEFOR0xFXG4gICAgLy8gd2Ugc3RpbGwgc2VlIGRpZmZlcmVuY2VzIGJldHdlZW4gYW5kcm9pZCBhbmQgd2luZG93cyAob24gY2hyb21lKSB3aGVuXG4gICAgLy8gdXNpbmcgaXNuYW4gZGlyZWN0bHkuXG4gICAgZGVmaW5lU3BlY2lhbE5hTiA9IGBcbiAgICAgIGJvb2wgaXNuYW5fY3VzdG9tKGZsb2F0IHZhbCkge1xuICAgICAgICByZXR1cm4gKHZhbCA+IDAuMCB8fCB2YWwgPCAwLjApID8gZmFsc2UgOiB2YWwgIT0gMC4wO1xuICAgICAgfVxuXG4gICAgICBidmVjNCBpc25hbl9jdXN0b20odmVjNCB2YWwpIHtcbiAgICAgICAgcmV0dXJuIGJ2ZWM0KGlzbmFuX2N1c3RvbSh2YWwueCksXG4gICAgICAgICAgaXNuYW5fY3VzdG9tKHZhbC55KSwgaXNuYW5fY3VzdG9tKHZhbC56KSwgaXNuYW5fY3VzdG9tKHZhbC53KSk7XG4gICAgICB9XG5cbiAgICAgICNkZWZpbmUgaXNuYW4odmFsdWUpIGlzbmFuX2N1c3RvbSh2YWx1ZSlcbiAgICBgO1xuICAgIC8vIEluIHdlYmdsIDIgd2UgZG8gbm90IG5lZWQgdG8gc3BlY2lmeSBhIGN1c3RvbSBpc2luZiBzbyB0aGVyZSBpcyBub1xuICAgIC8vIG5lZWQgZm9yIGEgc3BlY2lhbCBJTkZJTklUWSBjb25zdGFudC5cbiAgICBkZWZpbmVTcGVjaWFsSW5mID0gYGA7XG4gICAgZGVmaW5lUm91bmQgPSBgXG4gICAgICAjZGVmaW5lIHJvdW5kKHZhbHVlKSBuZXdSb3VuZCh2YWx1ZSlcbiAgICAgIGludCBuZXdSb3VuZChmbG9hdCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gaW50KGZsb29yKHZhbHVlICsgMC41KSk7XG4gICAgICB9XG5cbiAgICAgIGl2ZWM0IG5ld1JvdW5kKHZlYzQgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGl2ZWM0KGZsb29yKHZhbHVlICsgdmVjNCgwLjUpKSk7XG4gICAgICB9XG4gICAgYDtcbiAgfSBlbHNlIHtcbiAgICB2ZXJzaW9uID0gJyc7XG4gICAgYXR0cmlidXRlID0gJ2F0dHJpYnV0ZSc7XG4gICAgdmFyeWluZ1ZzID0gJ3ZhcnlpbmcnO1xuICAgIHZhcnlpbmdGcyA9ICd2YXJ5aW5nJztcbiAgICB0ZXh0dXJlMkQgPSAndGV4dHVyZTJEJztcbiAgICBvdXRwdXQgPSAnZ2xfRnJhZ0NvbG9yJztcbiAgICBkZWZpbmVPdXRwdXQgPSAnJztcbiAgICAvLyBXZWJHTDEgaGFzIG5vIGJ1aWx0IGluIGlzbmFuIHNvIHdlIGRlZmluZSBvbmUgaGVyZS5cbiAgICBkZWZpbmVTcGVjaWFsTmFOID0gYFxuICAgICAgI2RlZmluZSBpc25hbih2YWx1ZSkgaXNuYW5fY3VzdG9tKHZhbHVlKVxuICAgICAgYm9vbCBpc25hbl9jdXN0b20oZmxvYXQgdmFsKSB7XG4gICAgICAgIHJldHVybiAodmFsID4gMC4gfHwgdmFsIDwgMS4gfHwgdmFsID09IDAuKSA/IGZhbHNlIDogdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGJ2ZWM0IGlzbmFuX2N1c3RvbSh2ZWM0IHZhbCkge1xuICAgICAgICByZXR1cm4gYnZlYzQoaXNuYW4odmFsLngpLCBpc25hbih2YWwueSksIGlzbmFuKHZhbC56KSwgaXNuYW4odmFsLncpKTtcbiAgICAgIH1cbiAgICBgO1xuICAgIGRlZmluZVNwZWNpYWxJbmYgPSBgXG4gICAgICB1bmlmb3JtIGZsb2F0IElORklOSVRZO1xuXG4gICAgICBib29sIGlzaW5mKGZsb2F0IHZhbCkge1xuICAgICAgICByZXR1cm4gYWJzKHZhbCkgPT0gSU5GSU5JVFk7XG4gICAgICB9XG4gICAgICBidmVjNCBpc2luZih2ZWM0IHZhbCkge1xuICAgICAgICByZXR1cm4gZXF1YWwoYWJzKHZhbCksIHZlYzQoSU5GSU5JVFkpKTtcbiAgICAgIH1cbiAgICBgO1xuICAgIGRlZmluZVJvdW5kID0gYFxuICAgICAgaW50IHJvdW5kKGZsb2F0IHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBpbnQoZmxvb3IodmFsdWUgKyAwLjUpKTtcbiAgICAgIH1cblxuICAgICAgaXZlYzQgcm91bmQodmVjNCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gaXZlYzQoZmxvb3IodmFsdWUgKyB2ZWM0KDAuNSkpKTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB2ZXJzaW9uLFxuICAgIGF0dHJpYnV0ZSxcbiAgICB2YXJ5aW5nVnMsXG4gICAgdmFyeWluZ0ZzLFxuICAgIHRleHR1cmUyRCxcbiAgICBvdXRwdXQsXG4gICAgZGVmaW5lT3V0cHV0LFxuICAgIGRlZmluZVNwZWNpYWxOYU4sXG4gICAgZGVmaW5lU3BlY2lhbEluZixcbiAgICBkZWZpbmVSb3VuZFxuICB9O1xufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2VudiwgUGl4ZWxEYXRhLCBUeXBlZEFycmF5LCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge2dldFdlYkdMQ29udGV4dCwgc2V0V2ViR0xDb250ZXh0fSBmcm9tICcuL2NhbnZhc191dGlsJztcbmltcG9ydCAqIGFzIGdwZ3B1X3V0aWwgZnJvbSAnLi9ncGdwdV91dGlsJztcbmltcG9ydCAqIGFzIHRleF91dGlsIGZyb20gJy4vdGV4X3V0aWwnO1xuaW1wb3J0IHtUZXh0dXJlQ29uZmlnfSBmcm9tICcuL3RleF91dGlsJztcbmltcG9ydCB7V2ViR0wxRGlzam9pbnRRdWVyeVRpbWVyRXh0ZW5zaW9uLCBXZWJHTDJEaXNqb2ludFF1ZXJ5VGltZXJFeHRlbnNpb259IGZyb20gJy4vd2ViZ2xfdHlwZXMnO1xuaW1wb3J0ICogYXMgd2ViZ2xfdXRpbCBmcm9tICcuL3dlYmdsX3V0aWwnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZlbmNlQ29udGV4dCB7XG4gIHF1ZXJ5OiBXZWJHTFF1ZXJ5fFdlYkdMU3luYztcbiAgaXNGZW5jZVBhc3NlZCgpOiBib29sZWFuO1xufVxuXG5leHBvcnQgY2xhc3MgR1BHUFVDb250ZXh0IHtcbiAgZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dDtcbiAgdGV4dHVyZUZsb2F0RXh0ZW5zaW9uOiB7fTtcbiAgdGV4dHVyZUhhbGZGbG9hdEV4dGVuc2lvbjoge307XG4gIGNvbG9yQnVmZmVyRmxvYXRFeHRlbnNpb246IHt9O1xuICBjb2xvckJ1ZmZlckhhbGZGbG9hdEV4dGVuc2lvbjoge307XG4gIGRpc2pvaW50UXVlcnlUaW1lckV4dGVuc2lvbjogV2ViR0wyRGlzam9pbnRRdWVyeVRpbWVyRXh0ZW5zaW9ufFxuICAgICAgV2ViR0wxRGlzam9pbnRRdWVyeVRpbWVyRXh0ZW5zaW9uO1xuICB2ZXJ0ZXhCdWZmZXI6IFdlYkdMQnVmZmVyO1xuICBpbmRleEJ1ZmZlcjogV2ViR0xCdWZmZXI7XG4gIGZyYW1lYnVmZmVyOiBXZWJHTEZyYW1lYnVmZmVyO1xuICBvdXRwdXRUZXh0dXJlOiBXZWJHTFRleHR1cmV8bnVsbCA9IG51bGw7XG4gIHByb2dyYW06IFdlYkdMUHJvZ3JhbXxudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBkaXNwb3NlZCA9IGZhbHNlO1xuICBwcml2YXRlIGRpc2pvaW50OiBib29sZWFuO1xuICBwcml2YXRlIHZlcnRleFNoYWRlcjogV2ViR0xTaGFkZXI7XG4gIHRleHR1cmVDb25maWc6IFRleHR1cmVDb25maWc7XG5cbiAgY29uc3RydWN0b3IoZ2w/OiBXZWJHTFJlbmRlcmluZ0NvbnRleHQpIHtcbiAgICBjb25zdCBnbFZlcnNpb24gPSBlbnYoKS5nZXROdW1iZXIoJ1dFQkdMX1ZFUlNJT04nKTtcbiAgICBpZiAoZ2wgIT0gbnVsbCkge1xuICAgICAgdGhpcy5nbCA9IGdsO1xuICAgICAgc2V0V2ViR0xDb250ZXh0KGdsVmVyc2lvbiwgZ2wpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmdsID0gZ2V0V2ViR0xDb250ZXh0KGdsVmVyc2lvbik7XG4gICAgfVxuICAgIC8vIFdlYkdMIDIuMCBlbmFibGVzIHRleHR1cmUgZmxvYXRzIHdpdGhvdXQgYW4gZXh0ZW5zaW9uLlxuICAgIGxldCBDT0xPUl9CVUZGRVJfRkxPQVQgPSAnV0VCR0xfY29sb3JfYnVmZmVyX2Zsb2F0JztcbiAgICBjb25zdCBDT0xPUl9CVUZGRVJfSEFMRl9GTE9BVCA9ICdFWFRfY29sb3JfYnVmZmVyX2hhbGZfZmxvYXQnO1xuICAgIGlmIChlbnYoKS5nZXROdW1iZXIoJ1dFQkdMX1ZFUlNJT04nKSA9PT0gMSkge1xuICAgICAgY29uc3QgVEVYVFVSRV9GTE9BVCA9ICdPRVNfdGV4dHVyZV9mbG9hdCc7XG4gICAgICBjb25zdCBURVhUVVJFX0hBTEZfRkxPQVQgPSAnT0VTX3RleHR1cmVfaGFsZl9mbG9hdCc7XG5cbiAgICAgIHRoaXMudGV4dHVyZUZsb2F0RXh0ZW5zaW9uID1cbiAgICAgICAgICB3ZWJnbF91dGlsLmdldEV4dGVuc2lvbk9yVGhyb3codGhpcy5nbCwgVEVYVFVSRV9GTE9BVCk7XG4gICAgICBpZiAod2ViZ2xfdXRpbC5oYXNFeHRlbnNpb24odGhpcy5nbCwgVEVYVFVSRV9IQUxGX0ZMT0FUKSkge1xuICAgICAgICB0aGlzLnRleHR1cmVIYWxmRmxvYXRFeHRlbnNpb24gPVxuICAgICAgICAgICAgd2ViZ2xfdXRpbC5nZXRFeHRlbnNpb25PclRocm93KHRoaXMuZ2wsIFRFWFRVUkVfSEFMRl9GTE9BVCk7XG4gICAgICB9IGVsc2UgaWYgKGVudigpLmdldCgnV0VCR0xfRk9SQ0VfRjE2X1RFWFRVUkVTJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ0dMIGNvbnRleHQgZG9lcyBub3Qgc3VwcG9ydCBoYWxmIGZsb2F0IHRleHR1cmVzLCB5ZXQgdGhlICcgK1xuICAgICAgICAgICAgJ2Vudmlyb25tZW50IGZsYWcgV0VCR0xfRk9SQ0VfRjE2X1RFWFRVUkVTIGlzIHNldCB0byB0cnVlLicpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmNvbG9yQnVmZmVyRmxvYXRFeHRlbnNpb24gPSB0aGlzLmdsLmdldEV4dGVuc2lvbihDT0xPUl9CVUZGRVJfRkxPQVQpO1xuICAgICAgaWYgKHdlYmdsX3V0aWwuaGFzRXh0ZW5zaW9uKHRoaXMuZ2wsIENPTE9SX0JVRkZFUl9IQUxGX0ZMT0FUKSkge1xuICAgICAgICB0aGlzLmNvbG9yQnVmZmVySGFsZkZsb2F0RXh0ZW5zaW9uID1cbiAgICAgICAgICAgIHdlYmdsX3V0aWwuZ2V0RXh0ZW5zaW9uT3JUaHJvdyh0aGlzLmdsLCBDT0xPUl9CVUZGRVJfSEFMRl9GTE9BVCk7XG4gICAgICB9IGVsc2UgaWYgKGVudigpLmdldCgnV0VCR0xfRk9SQ0VfRjE2X1RFWFRVUkVTJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ0dMIGNvbnRleHQgZG9lcyBub3Qgc3VwcG9ydCBjb2xvciByZW5kZXJhYmxlIGhhbGYgZmxvYXRzLCB5ZXQgJyArXG4gICAgICAgICAgICAndGhlIGVudmlyb25tZW50IGZsYWcgV0VCR0xfRk9SQ0VfRjE2X1RFWFRVUkVTIGlzIHNldCB0byB0cnVlLicpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBDT0xPUl9CVUZGRVJfRkxPQVQgPSAnRVhUX2NvbG9yX2J1ZmZlcl9mbG9hdCc7XG4gICAgICBpZiAod2ViZ2xfdXRpbC5oYXNFeHRlbnNpb24odGhpcy5nbCwgQ09MT1JfQlVGRkVSX0ZMT0FUKSkge1xuICAgICAgICB0aGlzLmNvbG9yQnVmZmVyRmxvYXRFeHRlbnNpb24gPVxuICAgICAgICAgICAgdGhpcy5nbC5nZXRFeHRlbnNpb24oQ09MT1JfQlVGRkVSX0ZMT0FUKTtcbiAgICAgIH0gZWxzZSBpZiAod2ViZ2xfdXRpbC5oYXNFeHRlbnNpb24odGhpcy5nbCwgQ09MT1JfQlVGRkVSX0hBTEZfRkxPQVQpKSB7XG4gICAgICAgIHRoaXMuY29sb3JCdWZmZXJIYWxmRmxvYXRFeHRlbnNpb24gPVxuICAgICAgICAgICAgdGhpcy5nbC5nZXRFeHRlbnNpb24oQ09MT1JfQlVGRkVSX0hBTEZfRkxPQVQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdHTCBjb250ZXh0IGRvZXMgbm90IHN1cHBvcnQgY29sb3IgcmVuZGVyYWJsZSBmbG9hdHMnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnZlcnRleEJ1ZmZlciA9IGdwZ3B1X3V0aWwuY3JlYXRlVmVydGV4QnVmZmVyKHRoaXMuZ2wpO1xuICAgIHRoaXMuaW5kZXhCdWZmZXIgPSBncGdwdV91dGlsLmNyZWF0ZUluZGV4QnVmZmVyKHRoaXMuZ2wpO1xuICAgIHRoaXMuZnJhbWVidWZmZXIgPSB3ZWJnbF91dGlsLmNyZWF0ZUZyYW1lYnVmZmVyKHRoaXMuZ2wpO1xuXG4gICAgdGhpcy50ZXh0dXJlQ29uZmlnID1cbiAgICAgICAgdGV4X3V0aWwuZ2V0VGV4dHVyZUNvbmZpZyh0aGlzLmdsLCB0aGlzLnRleHR1cmVIYWxmRmxvYXRFeHRlbnNpb24pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgZGVidWcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGVudigpLmdldEJvb2woJ0RFQlVHJyk7XG4gIH1cblxuICBwdWJsaWMgZGlzcG9zZSgpIHtcbiAgICBpZiAodGhpcy5kaXNwb3NlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5wcm9ncmFtICE9IG51bGwpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAnRGlzcG9zaW5nIGEgR1BHUFVDb250ZXh0IHRoYXQgc3RpbGwgaGFzIGEgYm91bmQgV2ViR0xQcm9ncmFtLicgK1xuICAgICAgICAgICcgVGhpcyBpcyBwcm9iYWJseSBhIHJlc291cmNlIGxlYWssIGRlbGV0ZSB0aGUgcHJvZ3JhbSB3aXRoICcgK1xuICAgICAgICAgICdHUEdQVUNvbnRleHQuZGVsZXRlUHJvZ3JhbSBiZWZvcmUgZGlzcG9zaW5nLicpO1xuICAgIH1cbiAgICBpZiAodGhpcy5vdXRwdXRUZXh0dXJlICE9IG51bGwpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAnRGlzcG9zaW5nIGEgR1BHUFVDb250ZXh0IHRoYXQgc3RpbGwgaGFzIGEgYm91bmQgb3V0cHV0IG1hdHJpeCAnICtcbiAgICAgICAgICAndGV4dHVyZS4gIFRoaXMgaXMgcHJvYmFibHkgYSByZXNvdXJjZSBsZWFrLCBkZWxldGUgdGhlIG91dHB1dCAnICtcbiAgICAgICAgICAnbWF0cml4IHRleHR1cmUgd2l0aCBHUEdQVUNvbnRleHQuZGVsZXRlTWF0cml4VGV4dHVyZSBiZWZvcmUgJyArXG4gICAgICAgICAgJ2Rpc3Bvc2luZy4nKTtcbiAgICB9XG4gICAgY29uc3QgZ2wgPSB0aGlzLmdsO1xuICAgIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5maW5pc2goKSk7XG4gICAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgbnVsbCkpO1xuICAgIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5kZWxldGVGcmFtZWJ1ZmZlcih0aGlzLmZyYW1lYnVmZmVyKSk7XG4gICAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCBudWxsKSk7XG4gICAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soXG4gICAgICAgIGdsLCAoKSA9PiBnbC5iaW5kQnVmZmVyKGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCBudWxsKSk7XG4gICAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmRlbGV0ZUJ1ZmZlcih0aGlzLmluZGV4QnVmZmVyKSk7XG4gICAgdGhpcy5kaXNwb3NlZCA9IHRydWU7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlRmxvYXQzMk1hdHJpeFRleHR1cmUocm93czogbnVtYmVyLCBjb2x1bW5zOiBudW1iZXIpOlxuICAgICAgV2ViR0xUZXh0dXJlIHtcbiAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgIHJldHVybiBncGdwdV91dGlsLmNyZWF0ZUZsb2F0MzJNYXRyaXhUZXh0dXJlKFxuICAgICAgICB0aGlzLmdsLCByb3dzLCBjb2x1bW5zLCB0aGlzLnRleHR1cmVDb25maWcpO1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZUZsb2F0MTZNYXRyaXhUZXh0dXJlKHJvd3M6IG51bWJlciwgY29sdW1uczogbnVtYmVyKTpcbiAgICAgIFdlYkdMVGV4dHVyZSB7XG4gICAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgICByZXR1cm4gZ3BncHVfdXRpbC5jcmVhdGVGbG9hdDE2TWF0cml4VGV4dHVyZShcbiAgICAgICAgdGhpcy5nbCwgcm93cywgY29sdW1ucywgdGhpcy50ZXh0dXJlQ29uZmlnKTtcbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGVVbnNpZ25lZEJ5dGVzTWF0cml4VGV4dHVyZShyb3dzOiBudW1iZXIsIGNvbHVtbnM6IG51bWJlcik6XG4gICAgICBXZWJHTFRleHR1cmUge1xuICAgIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gICAgcmV0dXJuIGdwZ3B1X3V0aWwuY3JlYXRlVW5zaWduZWRCeXRlc01hdHJpeFRleHR1cmUoXG4gICAgICAgIHRoaXMuZ2wsIHJvd3MsIGNvbHVtbnMsIHRoaXMudGV4dHVyZUNvbmZpZyk7XG4gIH1cblxuICBwdWJsaWMgdXBsb2FkUGl4ZWxEYXRhVG9UZXh0dXJlKFxuICAgICAgdGV4dHVyZTogV2ViR0xUZXh0dXJlLFxuICAgICAgcGl4ZWxzOiBQaXhlbERhdGF8SW1hZ2VEYXRhfEhUTUxJbWFnZUVsZW1lbnR8SFRNTENhbnZhc0VsZW1lbnR8XG4gICAgICBJbWFnZUJpdG1hcCkge1xuICAgIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gICAgZ3BncHVfdXRpbC51cGxvYWRQaXhlbERhdGFUb1RleHR1cmUodGhpcy5nbCwgdGV4dHVyZSwgcGl4ZWxzKTtcbiAgfVxuXG4gIHB1YmxpYyB1cGxvYWREZW5zZU1hdHJpeFRvVGV4dHVyZShcbiAgICAgIHRleHR1cmU6IFdlYkdMVGV4dHVyZSwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIGRhdGE6IFR5cGVkQXJyYXkpIHtcbiAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgIGdwZ3B1X3V0aWwudXBsb2FkRGVuc2VNYXRyaXhUb1RleHR1cmUoXG4gICAgICAgIHRoaXMuZ2wsIHRleHR1cmUsIHdpZHRoLCBoZWlnaHQsIGRhdGEsIHRoaXMudGV4dHVyZUNvbmZpZyk7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlRmxvYXQxNlBhY2tlZE1hdHJpeFRleHR1cmUocm93czogbnVtYmVyLCBjb2x1bW5zOiBudW1iZXIpOlxuICAgICAgV2ViR0xUZXh0dXJlIHtcbiAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgIHJldHVybiBncGdwdV91dGlsLmNyZWF0ZUZsb2F0MTZQYWNrZWRNYXRyaXhUZXh0dXJlKFxuICAgICAgICB0aGlzLmdsLCByb3dzLCBjb2x1bW5zLCB0aGlzLnRleHR1cmVDb25maWcpO1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZVBhY2tlZE1hdHJpeFRleHR1cmUocm93czogbnVtYmVyLCBjb2x1bW5zOiBudW1iZXIpOlxuICAgICAgV2ViR0xUZXh0dXJlIHtcbiAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgIHJldHVybiBncGdwdV91dGlsLmNyZWF0ZVBhY2tlZE1hdHJpeFRleHR1cmUoXG4gICAgICAgIHRoaXMuZ2wsIHJvd3MsIGNvbHVtbnMsIHRoaXMudGV4dHVyZUNvbmZpZyk7XG4gIH1cblxuICBwdWJsaWMgZGVsZXRlTWF0cml4VGV4dHVyZSh0ZXh0dXJlOiBXZWJHTFRleHR1cmUpIHtcbiAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgIGlmICh0aGlzLm91dHB1dFRleHR1cmUgPT09IHRleHR1cmUpIHtcbiAgICAgIHdlYmdsX3V0aWwudW5iaW5kQ29sb3JUZXh0dXJlRnJvbUZyYW1lYnVmZmVyKHRoaXMuZ2wsIHRoaXMuZnJhbWVidWZmZXIpO1xuICAgICAgdGhpcy5vdXRwdXRUZXh0dXJlID0gbnVsbDtcbiAgICB9XG4gICAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2sodGhpcy5nbCwgKCkgPT4gdGhpcy5nbC5kZWxldGVUZXh0dXJlKHRleHR1cmUpKTtcbiAgfVxuXG4gIHB1YmxpYyBkb3dubG9hZEJ5dGVFbmNvZGVkRmxvYXRNYXRyaXhGcm9tT3V0cHV0VGV4dHVyZShcbiAgICAgIHRleHR1cmU6IFdlYkdMVGV4dHVyZSwgcm93czogbnVtYmVyLCBjb2x1bW5zOiBudW1iZXIpOiBGbG9hdDMyQXJyYXkge1xuICAgIHJldHVybiB0aGlzLmRvd25sb2FkTWF0cml4RHJpdmVyKFxuICAgICAgICB0ZXh0dXJlLFxuICAgICAgICAoKSA9PiBncGdwdV91dGlsLmRvd25sb2FkQnl0ZUVuY29kZWRGbG9hdE1hdHJpeEZyb21PdXRwdXRUZXh0dXJlKFxuICAgICAgICAgICAgdGhpcy5nbCwgcm93cywgY29sdW1ucywgdGhpcy50ZXh0dXJlQ29uZmlnKSk7XG4gIH1cblxuICBwdWJsaWMgZG93bmxvYWRQYWNrZWRNYXRyaXhGcm9tQnVmZmVyKFxuICAgICAgYnVmZmVyOiBXZWJHTEJ1ZmZlciwgYmF0Y2g6IG51bWJlciwgcm93czogbnVtYmVyLCBjb2x1bW5zOiBudW1iZXIsXG4gICAgICBwaHlzaWNhbFJvd3M6IG51bWJlciwgcGh5c2ljYWxDb2xzOiBudW1iZXIpOiBGbG9hdDMyQXJyYXkge1xuICAgIHJldHVybiBncGdwdV91dGlsLmRvd25sb2FkUGFja2VkTWF0cml4RnJvbUJ1ZmZlcihcbiAgICAgICAgdGhpcy5nbCwgYnVmZmVyLCBiYXRjaCwgcm93cywgY29sdW1ucywgcGh5c2ljYWxSb3dzLCBwaHlzaWNhbENvbHMsXG4gICAgICAgIHRoaXMudGV4dHVyZUNvbmZpZyk7XG4gIH1cblxuICBwdWJsaWMgZG93bmxvYWRGbG9hdDMyTWF0cml4RnJvbUJ1ZmZlcihidWZmZXI6IFdlYkdMQnVmZmVyLCBzaXplOiBudW1iZXIpOlxuICAgICAgRmxvYXQzMkFycmF5IHtcbiAgICByZXR1cm4gZ3BncHVfdXRpbC5kb3dubG9hZEZsb2F0MzJNYXRyaXhGcm9tQnVmZmVyKHRoaXMuZ2wsIGJ1ZmZlciwgc2l6ZSk7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlQnVmZmVyRnJvbVRleHR1cmUoXG4gICAgICB0ZXh0dXJlOiBXZWJHTFRleHR1cmUsIHJvd3M6IG51bWJlciwgY29sdW1uczogbnVtYmVyKTogV2ViR0xCdWZmZXIge1xuICAgIHRoaXMuYmluZFRleHR1cmVUb0ZyYW1lQnVmZmVyKHRleHR1cmUpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGdwZ3B1X3V0aWwuY3JlYXRlQnVmZmVyRnJvbU91dHB1dFRleHR1cmUoXG4gICAgICAgIHRoaXMuZ2wgYXMgV2ViR0wyUmVuZGVyaW5nQ29udGV4dCwgcm93cywgY29sdW1ucywgdGhpcy50ZXh0dXJlQ29uZmlnKTtcbiAgICB0aGlzLnVuYmluZFRleHR1cmVUb0ZyYW1lQnVmZmVyKCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGVBbmRXYWl0Rm9yRmVuY2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZmVuY2VDb250ZXh0ID0gdGhpcy5jcmVhdGVGZW5jZSh0aGlzLmdsKTtcbiAgICByZXR1cm4gdGhpcy5wb2xsRmVuY2UoZmVuY2VDb250ZXh0KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRmVuY2UoZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCk6IEZlbmNlQ29udGV4dCB7XG4gICAgbGV0IHF1ZXJ5OiBXZWJHTFF1ZXJ5fFdlYkdMU3luYztcbiAgICBsZXQgaXNGZW5jZVBhc3NlZDogKCkgPT4gYm9vbGVhbjtcblxuICAgIGlmIChlbnYoKS5nZXRCb29sKCdXRUJHTF9GRU5DRV9BUElfRU5BQkxFRCcpKSB7XG4gICAgICBjb25zdCBnbDIgPSBnbCBhcyBXZWJHTDJSZW5kZXJpbmdDb250ZXh0O1xuXG4gICAgICBjb25zdCBzeW5jID0gZ2wyLmZlbmNlU3luYyhnbDIuU1lOQ19HUFVfQ09NTUFORFNfQ09NUExFVEUsIDApO1xuICAgICAgZ2wuZmx1c2goKTtcblxuICAgICAgaXNGZW5jZVBhc3NlZCA9ICgpID0+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gZ2wyLmNsaWVudFdhaXRTeW5jKHN5bmMsIDAsIDApO1xuICAgICAgICByZXR1cm4gc3RhdHVzID09PSBnbDIuQUxSRUFEWV9TSUdOQUxFRCB8fFxuICAgICAgICAgICAgc3RhdHVzID09PSBnbDIuQ09ORElUSU9OX1NBVElTRklFRDtcbiAgICAgIH07XG5cbiAgICAgIHF1ZXJ5ID0gc3luYztcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgICBlbnYoKS5nZXROdW1iZXIoJ1dFQkdMX0RJU0pPSU5UX1FVRVJZX1RJTUVSX0VYVEVOU0lPTl9WRVJTSU9OJykgPiAwKSB7XG4gICAgICBxdWVyeSA9IHRoaXMuYmVnaW5RdWVyeSgpO1xuICAgICAgdGhpcy5lbmRRdWVyeSgpO1xuICAgICAgaXNGZW5jZVBhc3NlZCA9ICgpID0+IHRoaXMuaXNRdWVyeUF2YWlsYWJsZShcbiAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICBlbnYoKS5nZXROdW1iZXIoJ1dFQkdMX0RJU0pPSU5UX1FVRVJZX1RJTUVSX0VYVEVOU0lPTl9WRVJTSU9OJykpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJZiB3ZSBoYXZlIG5vIHdheSB0byBmZW5jZSwgcmV0dXJuIHRydWUgaW1tZWRpYXRlbHkuIFRoaXMgd2lsbCBmaXJlIGluXG4gICAgICAvLyBXZWJHTCAxLjAgd2hlbiB0aGVyZSBpcyBubyBkaXNqb2ludCBxdWVyeSB0aW1lci4gSW4gdGhpcyBjYXNlLCBiZWNhdXNlXG4gICAgICAvLyB0aGUgZmVuY2UgcGFzc2VzIGltbWVkaWF0ZWx5LCB3ZSdsbCBpbW1lZGlhdGVseSBhc2sgZm9yIGEgZG93bmxvYWQgb2ZcbiAgICAgIC8vIHRoZSB0ZXh0dXJlLCB3aGljaCB3aWxsIGNhdXNlIHRoZSBVSSB0aHJlYWQgdG8gaGFuZy5cbiAgICAgIGlzRmVuY2VQYXNzZWQgPSAoKSA9PiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiB7cXVlcnksIGlzRmVuY2VQYXNzZWR9O1xuICB9XG5cbiAgcHVibGljIGRvd25sb2FkTWF0cml4RnJvbVBhY2tlZFRleHR1cmUoXG4gICAgICB0ZXh0dXJlOiBXZWJHTFRleHR1cmUsIHBoeXNpY2FsUm93czogbnVtYmVyLFxuICAgICAgcGh5c2ljYWxDb2xzOiBudW1iZXIpOiBGbG9hdDMyQXJyYXkge1xuICAgIHJldHVybiB0aGlzLmRvd25sb2FkTWF0cml4RHJpdmVyKFxuICAgICAgICB0ZXh0dXJlLFxuICAgICAgICAoKSA9PiBncGdwdV91dGlsLmRvd25sb2FkTWF0cml4RnJvbVBhY2tlZE91dHB1dFRleHR1cmUoXG4gICAgICAgICAgICB0aGlzLmdsLCBwaHlzaWNhbFJvd3MsIHBoeXNpY2FsQ29scykpO1xuICB9XG5cbiAgcHJpdmF0ZSB2ZXJ0ZXhBdHRyc0FyZUJvdW5kID0gZmFsc2U7XG5cbiAgcHVibGljIGNyZWF0ZVByb2dyYW0oZnJhZ21lbnRTaGFkZXJTb3VyY2U6IHN0cmluZyk6IFdlYkdMUHJvZ3JhbSB7XG4gICAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgICBjb25zdCBnbCA9IHRoaXMuZ2w7XG4gICAgY29uc3QgZnJhZ21lbnRTaGFkZXI6IFdlYkdMU2hhZGVyID1cbiAgICAgICAgd2ViZ2xfdXRpbC5jcmVhdGVGcmFnbWVudFNoYWRlcihnbCwgZnJhZ21lbnRTaGFkZXJTb3VyY2UpO1xuICAgIGlmICh0aGlzLnZlcnRleFNoYWRlciA9PSBudWxsKSB7XG4gICAgICB0aGlzLnZlcnRleFNoYWRlciA9IGdwZ3B1X3V0aWwuY3JlYXRlVmVydGV4U2hhZGVyKGdsKTtcbiAgICB9XG4gICAgY29uc3QgcHJvZ3JhbTogV2ViR0xQcm9ncmFtID0gd2ViZ2xfdXRpbC5jcmVhdGVQcm9ncmFtKGdsKTtcbiAgICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayhcbiAgICAgICAgZ2wsICgpID0+IGdsLmF0dGFjaFNoYWRlcihwcm9ncmFtLCB0aGlzLnZlcnRleFNoYWRlcikpO1xuICAgIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5hdHRhY2hTaGFkZXIocHJvZ3JhbSwgZnJhZ21lbnRTaGFkZXIpKTtcbiAgICB3ZWJnbF91dGlsLmxpbmtQcm9ncmFtKGdsLCBwcm9ncmFtKTtcbiAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgd2ViZ2xfdXRpbC52YWxpZGF0ZVByb2dyYW0oZ2wsIHByb2dyYW0pO1xuICAgIH1cbiAgICBpZiAoIXRoaXMudmVydGV4QXR0cnNBcmVCb3VuZCkge1xuICAgICAgdGhpcy5zZXRQcm9ncmFtKHByb2dyYW0pO1xuICAgICAgdGhpcy52ZXJ0ZXhBdHRyc0FyZUJvdW5kID0gZ3BncHVfdXRpbC5iaW5kVmVydGV4UHJvZ3JhbUF0dHJpYnV0ZVN0cmVhbXMoXG4gICAgICAgICAgZ2wsIHRoaXMucHJvZ3JhbSwgdGhpcy52ZXJ0ZXhCdWZmZXIpO1xuICAgIH1cbiAgICByZXR1cm4gcHJvZ3JhbTtcbiAgfVxuXG4gIHB1YmxpYyBkZWxldGVQcm9ncmFtKHByb2dyYW06IFdlYkdMUHJvZ3JhbSkge1xuICAgIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gICAgaWYgKHByb2dyYW0gPT09IHRoaXMucHJvZ3JhbSkge1xuICAgICAgdGhpcy5wcm9ncmFtID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHByb2dyYW0gIT0gbnVsbCkge1xuICAgICAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2sodGhpcy5nbCwgKCkgPT4gdGhpcy5nbC5kZWxldGVQcm9ncmFtKHByb2dyYW0pKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2V0UHJvZ3JhbShwcm9ncmFtOiBXZWJHTFByb2dyYW18bnVsbCkge1xuICAgIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gICAgdGhpcy5wcm9ncmFtID0gcHJvZ3JhbTtcbiAgICBpZiAoKHRoaXMucHJvZ3JhbSAhPSBudWxsKSAmJiB0aGlzLmRlYnVnKSB7XG4gICAgICB3ZWJnbF91dGlsLnZhbGlkYXRlUHJvZ3JhbSh0aGlzLmdsLCB0aGlzLnByb2dyYW0pO1xuICAgIH1cbiAgICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayh0aGlzLmdsLCAoKSA9PiB0aGlzLmdsLnVzZVByb2dyYW0ocHJvZ3JhbSkpO1xuICB9XG5cbiAgcHVibGljIGdldFVuaWZvcm1Mb2NhdGlvbihcbiAgICAgIHByb2dyYW06IFdlYkdMUHJvZ3JhbSwgdW5pZm9ybU5hbWU6IHN0cmluZyxcbiAgICAgIHNob3VsZFRocm93ID0gdHJ1ZSk6IFdlYkdMVW5pZm9ybUxvY2F0aW9uIHtcbiAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgIGlmIChzaG91bGRUaHJvdykge1xuICAgICAgcmV0dXJuIHdlYmdsX3V0aWwuZ2V0UHJvZ3JhbVVuaWZvcm1Mb2NhdGlvbk9yVGhyb3coXG4gICAgICAgICAgdGhpcy5nbCwgcHJvZ3JhbSwgdW5pZm9ybU5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gd2ViZ2xfdXRpbC5nZXRQcm9ncmFtVW5pZm9ybUxvY2F0aW9uKFxuICAgICAgICAgIHRoaXMuZ2wsIHByb2dyYW0sIHVuaWZvcm1OYW1lKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0QXR0cmlidXRlTG9jYXRpb24ocHJvZ3JhbTogV2ViR0xQcm9ncmFtLCBhdHRyaWJ1dGU6IHN0cmluZyk6XG4gICAgICBudW1iZXIge1xuICAgIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gICAgcmV0dXJuIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKFxuICAgICAgICB0aGlzLmdsLCAoKSA9PiB0aGlzLmdsLmdldEF0dHJpYkxvY2F0aW9uKHByb2dyYW0sIGF0dHJpYnV0ZSkpO1xuICB9XG5cbiAgcHVibGljIGdldFVuaWZvcm1Mb2NhdGlvbk5vVGhyb3cocHJvZ3JhbTogV2ViR0xQcm9ncmFtLCB1bmlmb3JtTmFtZTogc3RyaW5nKTpcbiAgICAgIFdlYkdMVW5pZm9ybUxvY2F0aW9uIHtcbiAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgIHJldHVybiB0aGlzLmdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCB1bmlmb3JtTmFtZSk7XG4gIH1cblxuICBwdWJsaWMgc2V0SW5wdXRNYXRyaXhUZXh0dXJlKFxuICAgICAgaW5wdXRNYXRyaXhUZXh0dXJlOiBXZWJHTFRleHR1cmUsIHVuaWZvcm1Mb2NhdGlvbjogV2ViR0xVbmlmb3JtTG9jYXRpb24sXG4gICAgICB0ZXh0dXJlVW5pdDogbnVtYmVyKSB7XG4gICAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgICB0aGlzLnRocm93SWZOb1Byb2dyYW0oKTtcbiAgICB3ZWJnbF91dGlsLmJpbmRUZXh0dXJlVG9Qcm9ncmFtVW5pZm9ybVNhbXBsZXIoXG4gICAgICAgIHRoaXMuZ2wsIGlucHV0TWF0cml4VGV4dHVyZSwgdW5pZm9ybUxvY2F0aW9uLCB0ZXh0dXJlVW5pdCk7XG4gIH1cblxuICBwdWJsaWMgc2V0T3V0cHV0TWF0cml4VGV4dHVyZShcbiAgICAgIG91dHB1dE1hdHJpeFRleHR1cmU6IFdlYkdMVGV4dHVyZSwgcm93czogbnVtYmVyLCBjb2x1bW5zOiBudW1iZXIpIHtcbiAgICB0aGlzLnNldE91dHB1dE1hdHJpeFRleHR1cmVEcml2ZXIob3V0cHV0TWF0cml4VGV4dHVyZSwgY29sdW1ucywgcm93cyk7XG4gIH1cblxuICBwdWJsaWMgc2V0T3V0cHV0UGFja2VkTWF0cml4VGV4dHVyZShcbiAgICAgIG91dHB1dFBhY2tlZE1hdHJpeFRleHR1cmU6IFdlYkdMVGV4dHVyZSwgcm93czogbnVtYmVyLCBjb2x1bW5zOiBudW1iZXIpIHtcbiAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgIGNvbnN0IFt3aWR0aCwgaGVpZ2h0XSA9XG4gICAgICAgIHRleF91dGlsLmdldFBhY2tlZE1hdHJpeFRleHR1cmVTaGFwZVdpZHRoSGVpZ2h0KHJvd3MsIGNvbHVtbnMpO1xuICAgIHRoaXMuc2V0T3V0cHV0TWF0cml4VGV4dHVyZURyaXZlcihvdXRwdXRQYWNrZWRNYXRyaXhUZXh0dXJlLCB3aWR0aCwgaGVpZ2h0KTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRPdXRwdXRNYXRyaXhXcml0ZVJlZ2lvbihcbiAgICAgIHN0YXJ0Um93OiBudW1iZXIsIG51bVJvd3M6IG51bWJlciwgc3RhcnRDb2x1bW46IG51bWJlcixcbiAgICAgIG51bUNvbHVtbnM6IG51bWJlcikge1xuICAgIHRoaXMuc2V0T3V0cHV0TWF0cml4V3JpdGVSZWdpb25Ecml2ZXIoXG4gICAgICAgIHN0YXJ0Q29sdW1uLCBzdGFydFJvdywgbnVtQ29sdW1ucywgbnVtUm93cyk7XG4gIH1cblxuICBwdWJsaWMgc2V0T3V0cHV0UGFja2VkTWF0cml4V3JpdGVSZWdpb24oXG4gICAgICBzdGFydFJvdzogbnVtYmVyLCBudW1Sb3dzOiBudW1iZXIsIHN0YXJ0Q29sdW1uOiBudW1iZXIsXG4gICAgICBudW1Db2x1bW5zOiBudW1iZXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldE91dHB1dFBhY2tlZE1hdHJpeFdyaXRlUmVnaW9uIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuXG4gIHB1YmxpYyBkZWJ1Z1ZhbGlkYXRlKCkge1xuICAgIGlmICh0aGlzLnByb2dyYW0gIT0gbnVsbCkge1xuICAgICAgd2ViZ2xfdXRpbC52YWxpZGF0ZVByb2dyYW0odGhpcy5nbCwgdGhpcy5wcm9ncmFtKTtcbiAgICB9XG4gICAgd2ViZ2xfdXRpbC52YWxpZGF0ZUZyYW1lYnVmZmVyKHRoaXMuZ2wpO1xuICB9XG5cbiAgcHVibGljIGV4ZWN1dGVQcm9ncmFtKCkge1xuICAgIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gICAgdGhpcy50aHJvd0lmTm9Qcm9ncmFtKCk7XG4gICAgY29uc3QgZ2wgPSB0aGlzLmdsO1xuICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICB0aGlzLmRlYnVnVmFsaWRhdGUoKTtcbiAgICB9XG4gICAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soXG4gICAgICAgIGdsLCAoKSA9PiBnbC5kcmF3RWxlbWVudHMoZ2wuVFJJQU5HTEVTLCA2LCBnbC5VTlNJR05FRF9TSE9SVCwgMCkpO1xuICB9XG5cbiAgcHVibGljIGJsb2NrVW50aWxBbGxQcm9ncmFtc0NvbXBsZXRlZCgpIHtcbiAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKHRoaXMuZ2wsICgpID0+IHRoaXMuZ2wuZmluaXNoKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRRdWVyeVRpbWVyRXh0ZW5zaW9uKCk6IFdlYkdMMURpc2pvaW50UXVlcnlUaW1lckV4dGVuc2lvblxuICAgICAgfFdlYkdMMkRpc2pvaW50UXVlcnlUaW1lckV4dGVuc2lvbiB7XG4gICAgaWYgKHRoaXMuZGlzam9pbnRRdWVyeVRpbWVyRXh0ZW5zaW9uID09IG51bGwpIHtcbiAgICAgIHRoaXMuZGlzam9pbnRRdWVyeVRpbWVyRXh0ZW5zaW9uID1cbiAgICAgICAgICB3ZWJnbF91dGlsLmdldEV4dGVuc2lvbk9yVGhyb3coXG4gICAgICAgICAgICAgIHRoaXMuZ2wsXG4gICAgICAgICAgICAgIGVudigpLmdldE51bWJlcihcbiAgICAgICAgICAgICAgICAgICdXRUJHTF9ESVNKT0lOVF9RVUVSWV9USU1FUl9FWFRFTlNJT05fVkVSU0lPTicpID09PSAyID9cbiAgICAgICAgICAgICAgICAgICdFWFRfZGlzam9pbnRfdGltZXJfcXVlcnlfd2ViZ2wyJyA6XG4gICAgICAgICAgICAgICAgICAnRVhUX2Rpc2pvaW50X3RpbWVyX3F1ZXJ5JykgYXNcbiAgICAgICAgICAgICAgV2ViR0wxRGlzam9pbnRRdWVyeVRpbWVyRXh0ZW5zaW9uIHxcbiAgICAgICAgICBXZWJHTDJEaXNqb2ludFF1ZXJ5VGltZXJFeHRlbnNpb247XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmRpc2pvaW50UXVlcnlUaW1lckV4dGVuc2lvbjtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UXVlcnlUaW1lckV4dGVuc2lvbldlYkdMMigpOiBXZWJHTDJEaXNqb2ludFF1ZXJ5VGltZXJFeHRlbnNpb24ge1xuICAgIHJldHVybiB0aGlzLmdldFF1ZXJ5VGltZXJFeHRlbnNpb24oKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UXVlcnlUaW1lckV4dGVuc2lvbldlYkdMMSgpOiBXZWJHTDFEaXNqb2ludFF1ZXJ5VGltZXJFeHRlbnNpb24ge1xuICAgIHJldHVybiB0aGlzLmdldFF1ZXJ5VGltZXJFeHRlbnNpb24oKSBhcyBXZWJHTDFEaXNqb2ludFF1ZXJ5VGltZXJFeHRlbnNpb247XG4gIH1cblxuICBiZWdpblF1ZXJ5KCk6IFdlYkdMUXVlcnkge1xuICAgIGlmIChlbnYoKS5nZXROdW1iZXIoJ1dFQkdMX0RJU0pPSU5UX1FVRVJZX1RJTUVSX0VYVEVOU0lPTl9WRVJTSU9OJykgPT09IDIpIHtcbiAgICAgIGNvbnN0IGdsMiA9IHRoaXMuZ2wgYXMgV2ViR0wyUmVuZGVyaW5nQ29udGV4dDtcbiAgICAgIGNvbnN0IGV4dCA9IHRoaXMuZ2V0UXVlcnlUaW1lckV4dGVuc2lvbldlYkdMMigpO1xuXG4gICAgICBjb25zdCBxdWVyeSA9IGdsMi5jcmVhdGVRdWVyeSgpO1xuICAgICAgZ2wyLmJlZ2luUXVlcnkoZXh0LlRJTUVfRUxBUFNFRF9FWFQsIHF1ZXJ5KTtcbiAgICAgIHJldHVybiBxdWVyeTtcbiAgICB9XG4gICAgY29uc3QgZXh0ID0gdGhpcy5nZXRRdWVyeVRpbWVyRXh0ZW5zaW9uV2ViR0wxKCk7XG4gICAgY29uc3QgcXVlcnkgPSBleHQuY3JlYXRlUXVlcnlFWFQoKSBhcyBXZWJHTFF1ZXJ5O1xuICAgIGV4dC5iZWdpblF1ZXJ5RVhUKGV4dC5USU1FX0VMQVBTRURfRVhULCBxdWVyeSk7XG4gICAgcmV0dXJuIHF1ZXJ5O1xuICB9XG5cbiAgZW5kUXVlcnkoKSB7XG4gICAgaWYgKGVudigpLmdldE51bWJlcignV0VCR0xfRElTSk9JTlRfUVVFUllfVElNRVJfRVhURU5TSU9OX1ZFUlNJT04nKSA9PT0gMikge1xuICAgICAgY29uc3QgZ2wyID0gdGhpcy5nbCBhcyBXZWJHTDJSZW5kZXJpbmdDb250ZXh0O1xuICAgICAgY29uc3QgZXh0ID0gdGhpcy5nZXRRdWVyeVRpbWVyRXh0ZW5zaW9uV2ViR0wyKCk7XG4gICAgICBnbDIuZW5kUXVlcnkoZXh0LlRJTUVfRUxBUFNFRF9FWFQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBleHQgPSB0aGlzLmdldFF1ZXJ5VGltZXJFeHRlbnNpb25XZWJHTDEoKTtcbiAgICBleHQuZW5kUXVlcnlFWFQoZXh0LlRJTUVfRUxBUFNFRF9FWFQpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHdhaXRGb3JRdWVyeUFuZEdldFRpbWUocXVlcnk6IFdlYkdMUXVlcnkpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGF3YWl0IHV0aWwucmVwZWF0ZWRUcnkoXG4gICAgICAgICgpID0+IHRoaXMuZGlzcG9zZWQgfHwgIC8vIHdoaWxlIHRlc3RpbmcgY29udGV4dHMgYXJlIGNyZWF0ZWQgLyBkaXNwb3NlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiByYXBpZCBzdWNjZXNzaW9uLCBzbyB3aXRob3V0IHRoaXMgY2hlY2sgd2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWF5IHBvbGwgZm9yIHRoZSBxdWVyeSB0aW1lciBpbmRlZmluaXRlbHlcbiAgICAgICAgICAgIHRoaXMuaXNRdWVyeUF2YWlsYWJsZShcbiAgICAgICAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICAgICAgICBlbnYoKS5nZXROdW1iZXIoXG4gICAgICAgICAgICAgICAgICAgICdXRUJHTF9ESVNKT0lOVF9RVUVSWV9USU1FUl9FWFRFTlNJT05fVkVSU0lPTicpKSk7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UXVlcnlUaW1lKFxuICAgICAgICBxdWVyeSwgZW52KCkuZ2V0TnVtYmVyKCdXRUJHTF9ESVNKT0lOVF9RVUVSWV9USU1FUl9FWFRFTlNJT05fVkVSU0lPTicpKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UXVlcnlUaW1lKHF1ZXJ5OiBXZWJHTFF1ZXJ5LCBxdWVyeVRpbWVyVmVyc2lvbjogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBpZiAocXVlcnlUaW1lclZlcnNpb24gPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChxdWVyeVRpbWVyVmVyc2lvbiA9PT0gMikge1xuICAgICAgY29uc3QgZ2wyID0gdGhpcy5nbCBhcyBXZWJHTDJSZW5kZXJpbmdDb250ZXh0O1xuXG4gICAgICBjb25zdCB0aW1lRWxhcHNlZE5hbm9zID0gZ2wyLmdldFF1ZXJ5UGFyYW1ldGVyKHF1ZXJ5LCBnbDIuUVVFUllfUkVTVUxUKTtcbiAgICAgIC8vIFJldHVybiBtaWxsaXNlY29uZHMuXG4gICAgICByZXR1cm4gdGltZUVsYXBzZWROYW5vcyAvIDEwMDAwMDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGV4dCA9IHRoaXMuZ2V0UXVlcnlUaW1lckV4dGVuc2lvbldlYkdMMSgpO1xuXG4gICAgICBjb25zdCB0aW1lRWxhcHNlZE5hbm9zID1cbiAgICAgICAgICBleHQuZ2V0UXVlcnlPYmplY3RFWFQocXVlcnksIGV4dC5RVUVSWV9SRVNVTFRfRVhUKTtcbiAgICAgIC8vIFJldHVybiBtaWxsaXNlY29uZHMuXG4gICAgICByZXR1cm4gdGltZUVsYXBzZWROYW5vcyAvIDEwMDAwMDA7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpc1F1ZXJ5QXZhaWxhYmxlKHF1ZXJ5OiBXZWJHTFF1ZXJ5LCBxdWVyeVRpbWVyVmVyc2lvbjogbnVtYmVyKTpcbiAgICAgIGJvb2xlYW4ge1xuICAgIGlmIChxdWVyeVRpbWVyVmVyc2lvbiA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHF1ZXJ5VGltZXJWZXJzaW9uID09PSAyKSB7XG4gICAgICBjb25zdCBnbDIgPSB0aGlzLmdsIGFzIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQ7XG4gICAgICBjb25zdCBleHQgPSB0aGlzLmdldFF1ZXJ5VGltZXJFeHRlbnNpb25XZWJHTDIoKTtcblxuICAgICAgY29uc3QgYXZhaWxhYmxlID1cbiAgICAgICAgICBnbDIuZ2V0UXVlcnlQYXJhbWV0ZXIocXVlcnksIGdsMi5RVUVSWV9SRVNVTFRfQVZBSUxBQkxFKTtcbiAgICAgIGlmICh0aGlzLmRpc2pvaW50ID09IG51bGwpIHtcbiAgICAgICAgdGhpcy5kaXNqb2ludCA9IHRoaXMuZ2wuZ2V0UGFyYW1ldGVyKGV4dC5HUFVfRElTSk9JTlRfRVhUKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF2YWlsYWJsZSAmJiAhdGhpcy5kaXNqb2ludDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZXh0ID0gdGhpcy5nZXRRdWVyeVRpbWVyRXh0ZW5zaW9uV2ViR0wxKCk7XG5cbiAgICAgIGNvbnN0IGF2YWlsYWJsZSA9XG4gICAgICAgICAgZXh0LmdldFF1ZXJ5T2JqZWN0RVhUKHF1ZXJ5LCBleHQuUVVFUllfUkVTVUxUX0FWQUlMQUJMRV9FWFQpO1xuICAgICAgaWYgKHRoaXMuZGlzam9pbnQgPT0gbnVsbCkge1xuICAgICAgICB0aGlzLmRpc2pvaW50ID0gdGhpcy5nbC5nZXRQYXJhbWV0ZXIoZXh0LkdQVV9ESVNKT0lOVF9FWFQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXZhaWxhYmxlICYmICF0aGlzLmRpc2pvaW50O1xuICAgIH1cbiAgfVxuXG4gIHBvbGxGZW5jZShmZW5jZUNvbnRleHQ6IEZlbmNlQ29udGV4dCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPihyZXNvbHZlID0+IHtcbiAgICAgIHRoaXMuYWRkSXRlbVRvUG9sbCgoKSA9PiBmZW5jZUNvbnRleHQuaXNGZW5jZVBhc3NlZCgpLCAoKSA9PiByZXNvbHZlKCkpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBpdGVtc1RvUG9sbDogUG9sbEl0ZW1bXSA9IFtdO1xuXG4gIHBvbGxJdGVtcygpOiB2b2lkIHtcbiAgICAvLyBGaW5kIHRoZSBsYXN0IHF1ZXJ5IHRoYXQgaGFzIGZpbmlzaGVkLlxuICAgIGNvbnN0IGluZGV4ID0gbGluZWFyU2VhcmNoTGFzdFRydWUodGhpcy5pdGVtc1RvUG9sbC5tYXAoeCA9PiB4LmlzRG9uZUZuKSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gaW5kZXg7ICsraSkge1xuICAgICAgY29uc3Qge3Jlc29sdmVGbn0gPSB0aGlzLml0ZW1zVG9Qb2xsW2ldO1xuICAgICAgcmVzb2x2ZUZuKCk7XG4gICAgfVxuICAgIHRoaXMuaXRlbXNUb1BvbGwgPSB0aGlzLml0ZW1zVG9Qb2xsLnNsaWNlKGluZGV4ICsgMSk7XG4gIH1cblxuICBwcml2YXRlIGFkZEl0ZW1Ub1BvbGwoaXNEb25lRm46ICgpID0+IGJvb2xlYW4sIHJlc29sdmVGbjogKCkgPT4gdm9pZCkge1xuICAgIHRoaXMuaXRlbXNUb1BvbGwucHVzaCh7aXNEb25lRm4sIHJlc29sdmVGbn0pO1xuICAgIGlmICh0aGlzLml0ZW1zVG9Qb2xsLmxlbmd0aCA+IDEpIHtcbiAgICAgIC8vIFdlIGFscmVhZHkgaGF2ZSBhIHJ1bm5pbmcgbG9vcCB0aGF0IHBvbGxzLlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBTdGFydCBhIG5ldyBsb29wIHRoYXQgcG9sbHMuXG4gICAgdXRpbC5yZXBlYXRlZFRyeSgoKSA9PiB7XG4gICAgICB0aGlzLnBvbGxJdGVtcygpO1xuICAgICAgLy8gRW5kIHRoZSBsb29wIGlmIG5vIG1vcmUgaXRlbXMgdG8gcG9sbC5cbiAgICAgIHJldHVybiB0aGlzLml0ZW1zVG9Qb2xsLmxlbmd0aCA9PT0gMDtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYmluZFRleHR1cmVUb0ZyYW1lQnVmZmVyKHRleHR1cmU6IFdlYkdMVGV4dHVyZSkge1xuICAgIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gICAgd2ViZ2xfdXRpbC5iaW5kQ29sb3JUZXh0dXJlVG9GcmFtZWJ1ZmZlcihcbiAgICAgICAgdGhpcy5nbCwgdGV4dHVyZSwgdGhpcy5mcmFtZWJ1ZmZlcik7XG4gICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgIHdlYmdsX3V0aWwudmFsaWRhdGVGcmFtZWJ1ZmZlcih0aGlzLmdsKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVuYmluZFRleHR1cmVUb0ZyYW1lQnVmZmVyKCkge1xuICAgIGlmICh0aGlzLm91dHB1dFRleHR1cmUgIT0gbnVsbCkge1xuICAgICAgd2ViZ2xfdXRpbC5iaW5kQ29sb3JUZXh0dXJlVG9GcmFtZWJ1ZmZlcihcbiAgICAgICAgICB0aGlzLmdsLCB0aGlzLm91dHB1dFRleHR1cmUsIHRoaXMuZnJhbWVidWZmZXIpO1xuICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgd2ViZ2xfdXRpbC52YWxpZGF0ZUZyYW1lYnVmZmVyKHRoaXMuZ2wpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB3ZWJnbF91dGlsLnVuYmluZENvbG9yVGV4dHVyZUZyb21GcmFtZWJ1ZmZlcih0aGlzLmdsLCB0aGlzLmZyYW1lYnVmZmVyKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGRvd25sb2FkTWF0cml4RHJpdmVyKFxuICAgICAgdGV4dHVyZTogV2ViR0xUZXh0dXJlLFxuICAgICAgZG93bmxvYWRBbmREZWNvZGU6ICgpID0+IEZsb2F0MzJBcnJheSk6IEZsb2F0MzJBcnJheSB7XG4gICAgdGhpcy5iaW5kVGV4dHVyZVRvRnJhbWVCdWZmZXIodGV4dHVyZSk7XG4gICAgY29uc3QgcmVzdWx0ID0gZG93bmxvYWRBbmREZWNvZGUoKTtcbiAgICB0aGlzLnVuYmluZFRleHR1cmVUb0ZyYW1lQnVmZmVyKCk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRPdXRwdXRNYXRyaXhUZXh0dXJlRHJpdmVyKFxuICAgICAgb3V0cHV0TWF0cml4VGV4dHVyZU1heWJlUGFja2VkOiBXZWJHTFRleHR1cmUsIHdpZHRoOiBudW1iZXIsXG4gICAgICBoZWlnaHQ6IG51bWJlcikge1xuICAgIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gICAgY29uc3QgZ2wgPSB0aGlzLmdsO1xuICAgIHdlYmdsX3V0aWwuYmluZENvbG9yVGV4dHVyZVRvRnJhbWVidWZmZXIoXG4gICAgICAgIGdsLCBvdXRwdXRNYXRyaXhUZXh0dXJlTWF5YmVQYWNrZWQsIHRoaXMuZnJhbWVidWZmZXIpO1xuICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICB3ZWJnbF91dGlsLnZhbGlkYXRlRnJhbWVidWZmZXIoZ2wpO1xuICAgIH1cbiAgICB0aGlzLm91dHB1dFRleHR1cmUgPSBvdXRwdXRNYXRyaXhUZXh0dXJlTWF5YmVQYWNrZWQ7XG4gICAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLnZpZXdwb3J0KDAsIDAsIHdpZHRoLCBoZWlnaHQpKTtcbiAgICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuc2Npc3NvcigwLCAwLCB3aWR0aCwgaGVpZ2h0KSk7XG4gIH1cblxuICBwcml2YXRlIHNldE91dHB1dE1hdHJpeFdyaXRlUmVnaW9uRHJpdmVyKFxuICAgICAgeDogbnVtYmVyLCB5OiBudW1iZXIsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKSB7XG4gICAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayhcbiAgICAgICAgdGhpcy5nbCwgKCkgPT4gdGhpcy5nbC5zY2lzc29yKHgsIHksIHdpZHRoLCBoZWlnaHQpKTtcbiAgfVxuXG4gIHByaXZhdGUgdGhyb3dJZkRpc3Bvc2VkKCkge1xuICAgIGlmICh0aGlzLmRpc3Bvc2VkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0F0dGVtcHRlZCB0byB1c2UgZGlzcG9zZWQgR1BHUFVDb250ZXh0LicpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdGhyb3dJZk5vUHJvZ3JhbSgpIHtcbiAgICBpZiAodGhpcy5wcm9ncmFtID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gR1BVIHByb2dyYW0gaXMgY3VycmVudGx5IHNldC4nKTtcbiAgICB9XG4gIH1cbn1cblxudHlwZSBQb2xsSXRlbSA9IHtcbiAgaXNEb25lRm46ICgpID0+IGJvb2xlYW4sXG4gIHJlc29sdmVGbjogKCkgPT4gdm9pZFxufTtcblxuLyoqXG4gKiBGaW5kcyB0aGUgaW5kZXggb2YgdGhlIGxhc3QgdHJ1ZSBlbGVtZW50IHVzaW5nIGxpbmVhciBzZWFyY2guXG4gKiBOb3RlOiBXZSBjYW4ndCBkbyBiaW5hcnkgc2VhcmNoIGJlY2F1c2UgQ2hyb21lIGV4cGVjdHMgdXMgdG8gZXhwbGljaXRseVxuICogdGVzdCBhbGwgZmVuY2VzIGJlZm9yZSBkb3dubG9hZDpcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RmanMvaXNzdWVzLzExNDVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpbmVhclNlYXJjaExhc3RUcnVlKGFycjogQXJyYXk8KCkgPT4gYm9vbGVhbj4pOiBudW1iZXIge1xuICBsZXQgaSA9IDA7XG4gIGZvciAoOyBpIDwgYXJyLmxlbmd0aDsgKytpKSB7XG4gICAgY29uc3QgaXNEb25lID0gYXJyW2ldKCk7XG4gICAgaWYgKCFpc0RvbmUpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gaSAtIDE7XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBlbnYsIFRlbnNvciwgVHlwZWRBcnJheSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtHUEdQVUNvbnRleHR9IGZyb20gJy4vZ3BncHVfY29udGV4dCc7XG5pbXBvcnQgKiBhcyBzaGFkZXJfY29tcGlsZXIgZnJvbSAnLi9zaGFkZXJfY29tcGlsZXInO1xuaW1wb3J0IHtJbnB1dEluZm8sIFNoYXBlSW5mbywgVW5pZm9ybVR5cGV9IGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyJztcbmltcG9ydCB7UGFja2luZ1NjaGVtZSwgVGV4dHVyZURhdGEsIFRleHR1cmVVc2FnZX0gZnJvbSAnLi90ZXhfdXRpbCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lczogc3RyaW5nW107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcbiAgZW5hYmxlU2hhcGVVbmlmb3Jtcz86IGJvb2xlYW47XG4gIC8qKiBJZiB0cnVlLCB0aGlzIHByb2dyYW0gZXhwZWN0cyBwYWNrZWQgaW5wdXQgdGV4dHVyZXMuIERlZmF1bHRzIHRvIGZhbHNlLiAqL1xuICBwYWNrZWRJbnB1dHM/OiBib29sZWFuO1xuICAvKiogSWYgdHJ1ZSwgdGhpcyBwcm9ncmFtIHByb2R1Y2VzIGEgcGFja2VkIHRleHR1cmUuIERlZmF1bHRzIHRvIGZhbHNlLiAqL1xuICBwYWNrZWRPdXRwdXQ/OiBib29sZWFuO1xuICAvKipcbiAgICogQWZmZWN0cyB3aGF0IHR5cGUgb2YgdGV4dHVyZSB3ZSBhbGxvY2F0ZSBmb3IgdGhlIG91dHB1dC4gRGVmYXVsdHMgdG9cbiAgICogYFRleHR1cmVVc2FnZS5SRU5ERVJgLlxuICAgKi9cbiAgb3V0VGV4VXNhZ2U/OiBUZXh0dXJlVXNhZ2U7XG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiBzY2hlbWUgdG8gdXNlIHdoZW4gcGFja2luZyB0ZXhlbHMgZm9yIHRoZSBvdXRwdXQgdmFsdWVzLlxuICAgKiBTZWUgYFBhY2tpbmdTY2hlbWVgIGZvciBkZXRhaWxzLiBEZWZhdWx0cyB0byBgUGFja2luZ1NjaGVtZS5TSEFSRURfQkFUQ0hgLlxuICAgKi9cbiAgb3V0UGFja2luZ1NjaGVtZT86IFBhY2tpbmdTY2hlbWU7XG4gIGN1c3RvbVVuaWZvcm1zPzpcbiAgICAgIEFycmF5PHtuYW1lOiBzdHJpbmc7IGFycmF5SW5kZXg/OiBudW1iZXI7IHR5cGU6IFVuaWZvcm1UeXBlO30+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdQR1BVQmluYXJ5IHtcbiAgd2ViR0xQcm9ncmFtOiBXZWJHTFByb2dyYW07XG4gIHByb2dyYW06IEdQR1BVUHJvZ3JhbTtcbiAgdW5pZm9ybUxvY2F0aW9uczoge1tuYW1lOiBzdHJpbmddOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbn07XG4gIGN1c3RvbVVuaWZvcm1Mb2NhdGlvbnM/OiBXZWJHTFVuaWZvcm1Mb2NhdGlvbltdO1xuICBzb3VyY2U6IHN0cmluZztcbiAgaW5TaGFwZUluZm9zOiBTaGFwZUluZm9bXTtcbiAgb3V0U2hhcGVJbmZvOiBTaGFwZUluZm87XG4gIGluZkxvYzogV2ViR0xVbmlmb3JtTG9jYXRpb247XG4gIG5hbkxvYzogV2ViR0xVbmlmb3JtTG9jYXRpb247XG4gIGluU2hhcGVzTG9jYXRpb25zPzoge1tuYW1lOiBzdHJpbmddOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbn07XG4gIGluVGV4U2hhcGVzTG9jYXRpb25zPzoge1tuYW1lOiBzdHJpbmddOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbn07XG4gIG91dFNoYXBlTG9jYXRpb24/OiBXZWJHTFVuaWZvcm1Mb2NhdGlvbjtcbiAgb3V0U2hhcGVTdHJpZGVzTG9jYXRpb24/OiBXZWJHTFVuaWZvcm1Mb2NhdGlvbjtcbiAgb3V0VGV4U2hhcGVMb2NhdGlvbj86IFdlYkdMVW5pZm9ybUxvY2F0aW9uO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRlbnNvckRhdGEge1xuICBzaGFwZTogbnVtYmVyW107XG4gIHRleERhdGE6IFRleHR1cmVEYXRhO1xuICBpc1VuaWZvcm06IGJvb2xlYW47XG4gIC8vIEF2YWlsYWJsZSB3aGVuIHdlIGRlY2lkZSB0byB1cGxvYWQgYXMgdW5pZm9ybSBpbnN0ZWFkIG9mIHRleHR1cmUuXG4gIHVuaWZvcm1WYWx1ZXM/OiBUeXBlZEFycmF5O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcGlsZVByb2dyYW08VCBleHRlbmRzIFRlbnNvciwgSyBleHRlbmRzIFRlbnNvcj4oXG4gICAgZ3BncHU6IEdQR1BVQ29udGV4dCwgcHJvZ3JhbTogR1BHUFVQcm9ncmFtLCBpbnB1dHM6IFRlbnNvckRhdGFbXSxcbiAgICBvdXRwdXQ6IFRlbnNvckRhdGEpOiBHUEdQVUJpbmFyeSB7XG4gIGNvbnN0IGlucHV0SW5mb3M6IElucHV0SW5mb1tdID0gaW5wdXRzLm1hcCgoaW5wdXQsIGkpID0+IHtcbiAgICBjb25zdCBzaGFwZUluZm86IFNoYXBlSW5mbyA9IHtcbiAgICAgIGxvZ2ljYWxTaGFwZTogaW5wdXQuc2hhcGUsXG4gICAgICB0ZXhTaGFwZTogaW5wdXQuaXNVbmlmb3JtID8gbnVsbCA6IGlucHV0LnRleERhdGEudGV4U2hhcGUsXG4gICAgICBpc1VuaWZvcm06IGlucHV0LmlzVW5pZm9ybSxcbiAgICAgIGlzUGFja2VkOiBpbnB1dC5pc1VuaWZvcm0gPyBmYWxzZSA6IGlucHV0LnRleERhdGEuaXNQYWNrZWQsXG4gICAgICBmbGF0T2Zmc2V0OiBudWxsXG4gICAgfTtcbiAgICBpZiAoaW5wdXQudGV4RGF0YSAhPSBudWxsICYmIGlucHV0LnRleERhdGEuc2xpY2UgIT0gbnVsbCAmJlxuICAgICAgICBpbnB1dC50ZXhEYXRhLnNsaWNlLmZsYXRPZmZzZXQgPiAwKSB7XG4gICAgICBzaGFwZUluZm8uZmxhdE9mZnNldCA9IGlucHV0LnRleERhdGEuc2xpY2UuZmxhdE9mZnNldDtcbiAgICB9XG4gICAgcmV0dXJuIHtuYW1lOiBwcm9ncmFtLnZhcmlhYmxlTmFtZXNbaV0sIHNoYXBlSW5mb307XG4gIH0pO1xuICBjb25zdCBpblNoYXBlSW5mb3MgPSBpbnB1dEluZm9zLm1hcCh4ID0+IHguc2hhcGVJbmZvKTtcbiAgY29uc3Qgb3V0U2hhcGVJbmZvOiBTaGFwZUluZm8gPSB7XG4gICAgbG9naWNhbFNoYXBlOiBvdXRwdXQuc2hhcGUsXG4gICAgdGV4U2hhcGU6IG91dHB1dC50ZXhEYXRhLnRleFNoYXBlLFxuICAgIGlzVW5pZm9ybTogZmFsc2UsXG4gICAgaXNQYWNrZWQ6IG91dHB1dC50ZXhEYXRhLmlzUGFja2VkLFxuICAgIGZsYXRPZmZzZXQ6IG51bGxcbiAgfTtcbiAgY29uc3Qgc291cmNlID0gc2hhZGVyX2NvbXBpbGVyLm1ha2VTaGFkZXIoaW5wdXRJbmZvcywgb3V0U2hhcGVJbmZvLCBwcm9ncmFtKTtcblxuICBjb25zdCB3ZWJHTFByb2dyYW0gPSBncGdwdS5jcmVhdGVQcm9ncmFtKHNvdXJjZSk7XG5cbiAgLy8gQWRkIHNwZWNpYWwgdW5pZm9ybXMgKE5BTiwgSU5GSU5JVFkpXG4gIGxldCBpbmZMb2M6IFdlYkdMVW5pZm9ybUxvY2F0aW9uID0gbnVsbDtcbiAgY29uc3QgbmFuTG9jID0gZ3BncHUuZ2V0VW5pZm9ybUxvY2F0aW9uKHdlYkdMUHJvZ3JhbSwgJ05BTicsIGZhbHNlKTtcbiAgaWYgKGVudigpLmdldE51bWJlcignV0VCR0xfVkVSU0lPTicpID09PSAxKSB7XG4gICAgaW5mTG9jID0gZ3BncHUuZ2V0VW5pZm9ybUxvY2F0aW9uKHdlYkdMUHJvZ3JhbSwgJ0lORklOSVRZJywgZmFsc2UpO1xuICB9XG5cbiAgLy8gQWRkIHVzZXItZGVmaW5lZCB1bmlmb3Jtc1xuICBjb25zdCBzaG91bGRUaHJvdyA9IGZhbHNlO1xuICBjb25zdCB1bmlmb3JtTG9jYXRpb25zOiB7W25hbWU6IHN0cmluZ106IFdlYkdMVW5pZm9ybUxvY2F0aW9ufSA9IHt9O1xuICBjb25zdCBpblNoYXBlc0xvY2F0aW9uczoge1tuYW1lOiBzdHJpbmddOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbn0gPSB7fTtcbiAgY29uc3QgaW5UZXhTaGFwZXNMb2NhdGlvbnM6IHtbbmFtZTogc3RyaW5nXTogV2ViR0xVbmlmb3JtTG9jYXRpb259ID0ge307XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvZ3JhbS52YXJpYWJsZU5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgdmFyTmFtZSA9IHByb2dyYW0udmFyaWFibGVOYW1lc1tpXTtcbiAgICB1bmlmb3JtTG9jYXRpb25zW3Zhck5hbWVdID1cbiAgICAgICAgZ3BncHUuZ2V0VW5pZm9ybUxvY2F0aW9uKHdlYkdMUHJvZ3JhbSwgdmFyTmFtZSwgc2hvdWxkVGhyb3cpO1xuICAgIHVuaWZvcm1Mb2NhdGlvbnNbYG9mZnNldCR7dmFyTmFtZX1gXSA9XG4gICAgICAgIGdwZ3B1LmdldFVuaWZvcm1Mb2NhdGlvbih3ZWJHTFByb2dyYW0sIGBvZmZzZXQke3Zhck5hbWV9YCwgc2hvdWxkVGhyb3cpO1xuICAgIGlmIChwcm9ncmFtLmVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICAgIGluU2hhcGVzTG9jYXRpb25zW2Ake3Zhck5hbWV9U2hhcGVgXSA9IGdwZ3B1LmdldFVuaWZvcm1Mb2NhdGlvbihcbiAgICAgICAgICB3ZWJHTFByb2dyYW0sIGAke3Zhck5hbWV9U2hhcGVgLCBzaG91bGRUaHJvdyk7XG4gICAgICBpblRleFNoYXBlc0xvY2F0aW9uc1tgJHt2YXJOYW1lfVRleFNoYXBlYF0gPSBncGdwdS5nZXRVbmlmb3JtTG9jYXRpb24oXG4gICAgICAgICAgd2ViR0xQcm9ncmFtLCBgJHt2YXJOYW1lfVRleFNoYXBlYCwgc2hvdWxkVGhyb3cpO1xuICAgIH1cbiAgfVxuXG4gIGxldCBvdXRTaGFwZUxvY2F0aW9uOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbjtcbiAgbGV0IG91dFRleFNoYXBlTG9jYXRpb246IFdlYkdMVW5pZm9ybUxvY2F0aW9uO1xuICBsZXQgb3V0U2hhcGVTdHJpZGVzTG9jYXRpb246IFdlYkdMVW5pZm9ybUxvY2F0aW9uO1xuICBpZiAocHJvZ3JhbS5lbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgb3V0U2hhcGVMb2NhdGlvbiA9XG4gICAgICAgIGdwZ3B1LmdldFVuaWZvcm1Mb2NhdGlvbih3ZWJHTFByb2dyYW0sICdvdXRTaGFwZScsIHNob3VsZFRocm93KTtcbiAgICBvdXRTaGFwZVN0cmlkZXNMb2NhdGlvbiA9XG4gICAgICAgIGdwZ3B1LmdldFVuaWZvcm1Mb2NhdGlvbih3ZWJHTFByb2dyYW0sICdvdXRTaGFwZVN0cmlkZXMnLCBzaG91bGRUaHJvdyk7XG4gICAgb3V0VGV4U2hhcGVMb2NhdGlvbiA9XG4gICAgICAgIGdwZ3B1LmdldFVuaWZvcm1Mb2NhdGlvbih3ZWJHTFByb2dyYW0sICdvdXRUZXhTaGFwZScsIHNob3VsZFRocm93KTtcbiAgfVxuXG4gIGNvbnN0IGN1c3RvbVVuaWZvcm1Mb2NhdGlvbnM6IFdlYkdMVW5pZm9ybUxvY2F0aW9uW10gPSBbXTtcbiAgaWYgKHByb2dyYW0uY3VzdG9tVW5pZm9ybXMpIHtcbiAgICBwcm9ncmFtLmN1c3RvbVVuaWZvcm1zLmZvckVhY2goKGQsIGkpID0+IHtcbiAgICAgIGN1c3RvbVVuaWZvcm1Mb2NhdGlvbnNbaV0gPVxuICAgICAgICAgIGdwZ3B1LmdldFVuaWZvcm1Mb2NhdGlvbih3ZWJHTFByb2dyYW0sIGQubmFtZSwgc2hvdWxkVGhyb3cpO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBwcm9ncmFtLFxuICAgIHNvdXJjZSxcbiAgICB3ZWJHTFByb2dyYW0sXG4gICAgdW5pZm9ybUxvY2F0aW9ucyxcbiAgICBjdXN0b21Vbmlmb3JtTG9jYXRpb25zLFxuICAgIGluU2hhcGVJbmZvcyxcbiAgICBvdXRTaGFwZUluZm8sXG4gICAgaW5mTG9jLFxuICAgIG5hbkxvYyxcbiAgICBpblNoYXBlc0xvY2F0aW9ucyxcbiAgICBpblRleFNoYXBlc0xvY2F0aW9ucyxcbiAgICBvdXRTaGFwZUxvY2F0aW9uLFxuICAgIG91dFNoYXBlU3RyaWRlc0xvY2F0aW9uLFxuICAgIG91dFRleFNoYXBlTG9jYXRpb25cbiAgfTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVCaW5hcnlBbmRQcm9ncmFtKFxuICAgIHNoYXBlSW5mb3M6IFNoYXBlSW5mb1tdLCBpbnB1dHM6IFRlbnNvckRhdGFbXSkge1xuICBpZiAoc2hhcGVJbmZvcy5sZW5ndGggIT09IGlucHV0cy5sZW5ndGgpIHtcbiAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgYEJpbmFyeSB3YXMgY29tcGlsZWQgd2l0aCAke3NoYXBlSW5mb3MubGVuZ3RofSBpbnB1dHMsIGJ1dCBgICtcbiAgICAgICAgYHdhcyBleGVjdXRlZCB3aXRoICR7aW5wdXRzLmxlbmd0aH0gaW5wdXRzYCk7XG4gIH1cblxuICBzaGFwZUluZm9zLmZvckVhY2goKHMsIGkpID0+IHtcbiAgICBjb25zdCBzaGFwZUEgPSBzLmxvZ2ljYWxTaGFwZTtcbiAgICBjb25zdCBpbnB1dCA9IGlucHV0c1tpXTtcbiAgICBjb25zdCBzaGFwZUIgPSBpbnB1dC5zaGFwZTtcblxuICAgIGlmICghdXRpbC5hcnJheXNFcXVhbChzaGFwZUEsIHNoYXBlQikpIHtcbiAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgIGBCaW5hcnkgd2FzIGNvbXBpbGVkIHdpdGggZGlmZmVyZW50IHNoYXBlcyB0aGFuIGAgK1xuICAgICAgICAgIGB0aGUgY3VycmVudCBhcmdzLiBTaGFwZXMgJHtzaGFwZUF9IGFuZCAke3NoYXBlQn0gbXVzdCBtYXRjaGApO1xuICAgIH1cbiAgICAvLyBUaGUgaW5wdXQgaXMgdXBsb2FkZWQgYXMgdW5pZm9ybS5cbiAgICBpZiAocy5pc1VuaWZvcm0gJiYgaW5wdXQuaXNVbmlmb3JtKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdGV4U2hhcGVBID0gcy50ZXhTaGFwZTtcbiAgICBjb25zdCB0ZXhTaGFwZUIgPSBpbnB1dC5pc1VuaWZvcm0gPyBudWxsIDogaW5wdXQudGV4RGF0YS50ZXhTaGFwZTtcbiAgICBpZiAoIXV0aWwuYXJyYXlzRXF1YWwodGV4U2hhcGVBLCB0ZXhTaGFwZUIpKSB7XG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICBgQmluYXJ5IHdhcyBjb21waWxlZCB3aXRoIGRpZmZlcmVudCB0ZXh0dXJlIHNoYXBlcyB0aGFuIHRoZWAgK1xuICAgICAgICAgIGAgY3VycmVudCBhcmdzLiBTaGFwZSAke3RleFNoYXBlQX0gYW5kICR7dGV4U2hhcGVCfSBtdXN0IG1hdGNoYCk7XG4gICAgfVxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1blByb2dyYW08VCBleHRlbmRzIFRlbnNvciwgSyBleHRlbmRzIFRlbnNvcj4oXG4gICAgZ3BncHU6IEdQR1BVQ29udGV4dCwgYmluYXJ5OiBHUEdQVUJpbmFyeSwgaW5wdXRzOiBUZW5zb3JEYXRhW10sXG4gICAgb3V0cHV0OiBUZW5zb3JEYXRhLCBjdXN0b21Vbmlmb3JtVmFsdWVzPzogbnVtYmVyW11bXSk6IHZvaWQge1xuICBpZiAoIWJpbmFyeS5wcm9ncmFtLmVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICB2YWxpZGF0ZUJpbmFyeUFuZFByb2dyYW0oYmluYXJ5LmluU2hhcGVJbmZvcywgaW5wdXRzKTtcbiAgICB2YWxpZGF0ZUJpbmFyeUFuZFByb2dyYW0oW2JpbmFyeS5vdXRTaGFwZUluZm9dLCBbb3V0cHV0XSk7XG4gIH1cblxuICBjb25zdCBvdXRUZXggPSBvdXRwdXQudGV4RGF0YS50ZXh0dXJlO1xuICBjb25zdCBvdXRUZXhTaGFwZSA9IG91dHB1dC50ZXhEYXRhLnRleFNoYXBlO1xuICBpZiAob3V0cHV0LnRleERhdGEuaXNQYWNrZWQpIHtcbiAgICBncGdwdS5zZXRPdXRwdXRQYWNrZWRNYXRyaXhUZXh0dXJlKG91dFRleCwgb3V0VGV4U2hhcGVbMF0sIG91dFRleFNoYXBlWzFdKTtcbiAgfSBlbHNlIHtcbiAgICBncGdwdS5zZXRPdXRwdXRNYXRyaXhUZXh0dXJlKG91dFRleCwgb3V0VGV4U2hhcGVbMF0sIG91dFRleFNoYXBlWzFdKTtcbiAgfVxuICBncGdwdS5zZXRQcm9ncmFtKGJpbmFyeS53ZWJHTFByb2dyYW0pO1xuXG4gIC8vIFNldCBzcGVjaWFsIHVuaWZvcm1zIChOQU4sIElORklOSVRZKVxuICBpZiAoZW52KCkuZ2V0TnVtYmVyKCdXRUJHTF9WRVJTSU9OJykgPT09IDEpIHtcbiAgICBpZiAoYmluYXJ5LmluZkxvYyAhPT0gbnVsbCkge1xuICAgICAgZ3BncHUuZ2wudW5pZm9ybTFmKGJpbmFyeS5pbmZMb2MsIEluZmluaXR5KTtcbiAgICB9XG4gIH1cbiAgaWYgKGJpbmFyeS5uYW5Mb2MgIT09IG51bGwpIHtcbiAgICBncGdwdS5nbC51bmlmb3JtMWYoYmluYXJ5Lm5hbkxvYywgTmFOKTtcbiAgfVxuXG4gIC8vIFNldCB1c2VyLWRlZmluZWQgaW5wdXRzXG4gIGlucHV0cy5mb3JFYWNoKChpbnB1dCwgaSkgPT4ge1xuICAgIGNvbnN0IHZhck5hbWUgPSBiaW5hcnkucHJvZ3JhbS52YXJpYWJsZU5hbWVzW2ldO1xuICAgIGNvbnN0IHZhckxvYyA9IGJpbmFyeS51bmlmb3JtTG9jYXRpb25zW3Zhck5hbWVdO1xuICAgIGNvbnN0IHZhck9mZnNldExvYyA9IGJpbmFyeS51bmlmb3JtTG9jYXRpb25zW2BvZmZzZXQke3Zhck5hbWV9YF07XG4gICAgY29uc3QgdmFyU2hhcGVMb2MgPSBiaW5hcnkuaW5TaGFwZXNMb2NhdGlvbnNbYCR7dmFyTmFtZX1TaGFwZWBdO1xuICAgIGNvbnN0IHZhclRleFNoYXBlTG9jID0gYmluYXJ5LmluVGV4U2hhcGVzTG9jYXRpb25zW2Ake3Zhck5hbWV9VGV4U2hhcGVgXTtcblxuICAgIGlmICh2YXJTaGFwZUxvYykge1xuICAgICAgY29uc3Qge3VuaWZvcm1TaGFwZX0gPSBzaGFkZXJfY29tcGlsZXIuZ2V0VW5pZm9ybUluZm9Gcm9tU2hhcGUoXG4gICAgICAgICAgYmluYXJ5LnByb2dyYW0ucGFja2VkSW5wdXRzLCBpbnB1dC5zaGFwZSwgaW5wdXQudGV4RGF0YS50ZXhTaGFwZSk7XG4gICAgICBzd2l0Y2ggKHVuaWZvcm1TaGFwZS5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIGdwZ3B1LmdsLnVuaWZvcm0xaXYodmFyU2hhcGVMb2MsIG5ldyBJbnQzMkFycmF5KHVuaWZvcm1TaGFwZSkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgZ3BncHUuZ2wudW5pZm9ybTJpdih2YXJTaGFwZUxvYywgbmV3IEludDMyQXJyYXkodW5pZm9ybVNoYXBlKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBncGdwdS5nbC51bmlmb3JtM2l2KHZhclNoYXBlTG9jLCBuZXcgSW50MzJBcnJheSh1bmlmb3JtU2hhcGUpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIGdwZ3B1LmdsLnVuaWZvcm00aXYodmFyU2hhcGVMb2MsIG5ldyBJbnQzMkFycmF5KHVuaWZvcm1TaGFwZSkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodmFyVGV4U2hhcGVMb2MpIHtcbiAgICAgIGdwZ3B1LmdsLnVuaWZvcm0yaShcbiAgICAgICAgICB2YXJUZXhTaGFwZUxvYywgaW5wdXQudGV4RGF0YS50ZXhTaGFwZVswXSwgaW5wdXQudGV4RGF0YS50ZXhTaGFwZVsxXSk7XG4gICAgfVxuXG4gICAgaWYgKHZhckxvYyA9PSBudWxsKSB7XG4gICAgICAvLyBUaGUgY29tcGlsZXIgaW5mZXJyZWQgdGhhdCB0aGlzIHZhcmlhYmxlIGlzIG5vdCB1c2VkIGluIHRoaXMgc2hhZGVyLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChpbnB1dC5pc1VuaWZvcm0pIHtcbiAgICAgIC8vIFVwbG9hZCB0aGUgdmFsdWVzIG9mIHRoZSB0ZW5zb3IgYXMgdW5pZm9ybS5cbiAgICAgIGlmICh1dGlsLnNpemVGcm9tU2hhcGUoaW5wdXQuc2hhcGUpIDwgMikge1xuICAgICAgICBncGdwdS5nbC51bmlmb3JtMWYodmFyTG9jLCBpbnB1dC51bmlmb3JtVmFsdWVzWzBdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCB2YWxzID0gaW5wdXQudW5pZm9ybVZhbHVlcztcbiAgICAgICAgaWYgKCEodmFscyBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSkpIHtcbiAgICAgICAgICB2YWxzID0gbmV3IEZsb2F0MzJBcnJheSh2YWxzKTtcbiAgICAgICAgfVxuICAgICAgICBncGdwdS5nbC51bmlmb3JtMWZ2KHZhckxvYywgdmFscyk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIGlucHV0IHdhcyBzbGljZWQsIHVwbG9hZCB0aGUgZmxhdCBvZmZzZXQgaW5kZXguXG4gICAgaWYgKGlucHV0LnRleERhdGEuc2xpY2UgIT0gbnVsbCAmJiB2YXJPZmZzZXRMb2MgIT0gbnVsbCkge1xuICAgICAgZ3BncHUuZ2wudW5pZm9ybTFpKHZhck9mZnNldExvYywgaW5wdXQudGV4RGF0YS5zbGljZS5mbGF0T2Zmc2V0KTtcbiAgICB9XG5cbiAgICBncGdwdS5zZXRJbnB1dE1hdHJpeFRleHR1cmUoaW5wdXQudGV4RGF0YS50ZXh0dXJlLCB2YXJMb2MsIGkpO1xuICB9KTtcblxuICBjb25zdCBvdXRTaGFwZUxvYyA9IGJpbmFyeS5vdXRTaGFwZUxvY2F0aW9uO1xuICBpZiAob3V0U2hhcGVMb2MpIHtcbiAgICBzd2l0Y2ggKG91dHB1dC5zaGFwZS5sZW5ndGgpIHtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgZ3BncHUuZ2wudW5pZm9ybTFpdihvdXRTaGFwZUxvYywgbmV3IEludDMyQXJyYXkob3V0cHV0LnNoYXBlKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyOlxuICAgICAgICBncGdwdS5nbC51bmlmb3JtMml2KG91dFNoYXBlTG9jLCBuZXcgSW50MzJBcnJheShvdXRwdXQuc2hhcGUpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDM6XG4gICAgICAgIGdwZ3B1LmdsLnVuaWZvcm0zaXYob3V0U2hhcGVMb2MsIG5ldyBJbnQzMkFycmF5KG91dHB1dC5zaGFwZSkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNDpcbiAgICAgICAgZ3BncHUuZ2wudW5pZm9ybTRpdihvdXRTaGFwZUxvYywgbmV3IEludDMyQXJyYXkob3V0cHV0LnNoYXBlKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIGlmIChiaW5hcnkub3V0U2hhcGVTdHJpZGVzTG9jYXRpb24pIHtcbiAgICBjb25zdCBzdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyhvdXRwdXQuc2hhcGUpO1xuICAgIHN3aXRjaCAob3V0cHV0LnNoYXBlLmxlbmd0aCkge1xuICAgICAgY2FzZSAyOlxuICAgICAgICBncGdwdS5nbC51bmlmb3JtMWl2KFxuICAgICAgICAgICAgYmluYXJ5Lm91dFNoYXBlU3RyaWRlc0xvY2F0aW9uLCBuZXcgSW50MzJBcnJheShzdHJpZGVzKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAzOlxuICAgICAgICBncGdwdS5nbC51bmlmb3JtMml2KFxuICAgICAgICAgICAgYmluYXJ5Lm91dFNoYXBlU3RyaWRlc0xvY2F0aW9uLCBuZXcgSW50MzJBcnJheShzdHJpZGVzKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA0OlxuICAgICAgICBncGdwdS5nbC51bmlmb3JtM2l2KFxuICAgICAgICAgICAgYmluYXJ5Lm91dFNoYXBlU3RyaWRlc0xvY2F0aW9uLCBuZXcgSW50MzJBcnJheShzdHJpZGVzKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIGlmIChiaW5hcnkub3V0VGV4U2hhcGVMb2NhdGlvbikge1xuICAgIGdwZ3B1LmdsLnVuaWZvcm0yaShcbiAgICAgICAgYmluYXJ5Lm91dFRleFNoYXBlTG9jYXRpb24sIG91dHB1dC50ZXhEYXRhLnRleFNoYXBlWzBdLFxuICAgICAgICBvdXRwdXQudGV4RGF0YS50ZXhTaGFwZVsxXSk7XG4gIH1cblxuICBpZiAoYmluYXJ5LnByb2dyYW0uY3VzdG9tVW5pZm9ybXMgJiYgY3VzdG9tVW5pZm9ybVZhbHVlcykge1xuICAgIGJpbmFyeS5wcm9ncmFtLmN1c3RvbVVuaWZvcm1zLmZvckVhY2goKGQsIGkpID0+IHtcbiAgICAgIGNvbnN0IGN1c3RvbUxvYyA9IGJpbmFyeS5jdXN0b21Vbmlmb3JtTG9jYXRpb25zW2ldO1xuICAgICAgY29uc3QgY3VzdG9tVmFsdWUgPSBjdXN0b21Vbmlmb3JtVmFsdWVzW2ldO1xuICAgICAgaWYgKGQudHlwZSA9PT0gJ2Zsb2F0Jykge1xuICAgICAgICBncGdwdS5nbC51bmlmb3JtMWZ2KGN1c3RvbUxvYywgY3VzdG9tVmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChkLnR5cGUgPT09ICd2ZWMyJykge1xuICAgICAgICBncGdwdS5nbC51bmlmb3JtMmZ2KGN1c3RvbUxvYywgY3VzdG9tVmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChkLnR5cGUgPT09ICd2ZWMzJykge1xuICAgICAgICBncGdwdS5nbC51bmlmb3JtM2Z2KGN1c3RvbUxvYywgY3VzdG9tVmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChkLnR5cGUgPT09ICd2ZWM0Jykge1xuICAgICAgICBncGdwdS5nbC51bmlmb3JtNGZ2KGN1c3RvbUxvYywgY3VzdG9tVmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChkLnR5cGUgPT09ICdpbnQnKSB7XG4gICAgICAgIGdwZ3B1LmdsLnVuaWZvcm0xaXYoY3VzdG9tTG9jLCBjdXN0b21WYWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKGQudHlwZSA9PT0gJ2l2ZWMyJykge1xuICAgICAgICBncGdwdS5nbC51bmlmb3JtMml2KGN1c3RvbUxvYywgY3VzdG9tVmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChkLnR5cGUgPT09ICdpdmVjMycpIHtcbiAgICAgICAgZ3BncHUuZ2wudW5pZm9ybTNpdihjdXN0b21Mb2MsIGN1c3RvbVZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAoZC50eXBlID09PSAnaXZlYzQnKSB7XG4gICAgICAgIGdwZ3B1LmdsLnVuaWZvcm00aXYoY3VzdG9tTG9jLCBjdXN0b21WYWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBFcnJvcihgdW5pZm9ybSB0eXBlICR7ZC50eXBlfSBpcyBub3Qgc3VwcG9ydGVkIHlldC5gKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBncGdwdS5leGVjdXRlUHJvZ3JhbSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWFrZVNoYWRlcktleShcbiAgICBwcm9ncmFtOiBHUEdQVVByb2dyYW0sIGlucHV0czogVGVuc29yRGF0YVtdLCBvdXRwdXQ6IFRlbnNvckRhdGEpOiBzdHJpbmcge1xuICBsZXQga2V5SW5wdXRzID0gJyc7XG4gIGlucHV0cy5jb25jYXQob3V0cHV0KS5mb3JFYWNoKHggPT4ge1xuICAgIGNvbnN0IGhhc09mZnNldCA9IHgudGV4RGF0YSAhPSBudWxsICYmIHgudGV4RGF0YS5zbGljZSAhPSBudWxsICYmXG4gICAgICAgIHgudGV4RGF0YS5zbGljZS5mbGF0T2Zmc2V0ID4gMDtcbiAgICAvLyBUT0RPOiBSZW1vdmUgdGhlIGNvbmRpdGlvbiBvZiAheC5pc1VuaWZvcm0uXG4gICAgaWYgKHByb2dyYW0uZW5hYmxlU2hhcGVVbmlmb3JtcyAmJiAheC5pc1VuaWZvcm0pIHtcbiAgICAgIGNvbnN0IHhUZXhTaGFwZSA9IHgudGV4RGF0YS50ZXhTaGFwZTtcbiAgICAgIGNvbnN0IHt1c2VTcXVlZXplU2hhcGUsIHVuaWZvcm1TaGFwZSwga2VwdERpbXN9ID1cbiAgICAgICAgICBzaGFkZXJfY29tcGlsZXIuZ2V0VW5pZm9ybUluZm9Gcm9tU2hhcGUoXG4gICAgICAgICAgICAgIHByb2dyYW0ucGFja2VkSW5wdXRzLCB4LnNoYXBlLCB4VGV4U2hhcGUpO1xuICAgICAgbGV0IHJhbmsxID0gJycsIHJhbmsyID0gJycsIHJhbmszNCA9ICcnO1xuICAgICAgaWYgKHVuaWZvcm1TaGFwZS5sZW5ndGggPT09IDEgJiYgcHJvZ3JhbS5wYWNrZWRJbnB1dHMpIHtcbiAgICAgICAgY29uc3QgcGFja2VkVGV4U2hhcGUgPVxuICAgICAgICAgICAgW01hdGguY2VpbCh4VGV4U2hhcGVbMF0gLyAyKSwgTWF0aC5jZWlsKHhUZXhTaGFwZVsxXSAvIDIpXTtcbiAgICAgICAgcmFuazEgPSBgJHtwYWNrZWRUZXhTaGFwZVswXSA+IDF9XyR7cGFja2VkVGV4U2hhcGVbMV0gPiAxfWA7XG4gICAgICB9IGVsc2UgaWYgKHVuaWZvcm1TaGFwZS5sZW5ndGggPT09IDIgJiYgIXByb2dyYW0ucGFja2VkSW5wdXRzKSB7XG4gICAgICAgIHJhbmsyID0gYCR7dW5pZm9ybVNoYXBlWzBdID4gMX1fJHt1bmlmb3JtU2hhcGVbMV0gPiAxfWA7XG4gICAgICB9IGVsc2UgaWYgKHVuaWZvcm1TaGFwZS5sZW5ndGggPiAyICYmICFwcm9ncmFtLnBhY2tlZElucHV0cykge1xuICAgICAgICBjb25zdCBzdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyh1bmlmb3JtU2hhcGUpO1xuICAgICAgICByYW5rMzQgPSBgJHtzdHJpZGVzWzBdID09PSB4VGV4U2hhcGVbMV19XyR7XG4gICAgICAgICAgICBzdHJpZGVzW3N0cmlkZXMubGVuZ3RoIC0gMV0gPT09IHhUZXhTaGFwZVsxXX1gO1xuICAgICAgfVxuICAgICAgY29uc3QgeFJhbmsgPSB4LnNoYXBlLmxlbmd0aDtcbiAgICAgIGNvbnN0IGlzTG9naWNhbFNoYXBUZXhTaGFwZUVxdWFsID1cbiAgICAgICAgICB1bmlmb3JtU2hhcGUubGVuZ3RoID09PSAyICYmIHV0aWwuYXJyYXlzRXF1YWwoeC5zaGFwZSwgeFRleFNoYXBlKTtcbiAgICAgIGNvbnN0IGlzU2NhbGFyID0gdXRpbC5zaXplRnJvbVNoYXBlKHguc2hhcGUpID09PSAxO1xuICAgICAgY29uc3QgYnJvYWRjYXN0RGltcyA9XG4gICAgICAgICAgYmFja2VuZF91dGlsLmdldEJyb2FkY2FzdERpbXMoeC5zaGFwZSwgb3V0cHV0LnNoYXBlKTtcbiAgICAgIGNvbnN0IGlzSW5PdXRUZXhTaGFwZUVxdWFsID0gIXByb2dyYW0ucGFja2VkSW5wdXRzICYmXG4gICAgICAgICAgeFJhbmsgPT09IG91dHB1dC5zaGFwZS5sZW5ndGggJiZcbiAgICAgICAgICB1dGlsLmFycmF5c0VxdWFsKHhUZXhTaGFwZSwgb3V0cHV0LnRleERhdGEudGV4U2hhcGUpO1xuICAgICAgY29uc3QgaXNUZXhTaGFwZUdyZWF0ZXJUaGFuT25lID1cbiAgICAgICAgICBwcm9ncmFtLnBhY2tlZElucHV0cyB8fCB1bmlmb3JtU2hhcGUubGVuZ3RoID4gMiA/XG4gICAgICAgICAgJycgOlxuICAgICAgICAgIGAke3hUZXhTaGFwZVswXSA+IDF9XyR7eFRleFNoYXBlWzFdID4gMX1gO1xuICAgICAgLy8gVGhlc2Uga2V5IGNvbXBvbmVudHMgYXJlIG5lZWRlZCBkdWUgdG8gc2hhZGVyX2NvbXBpbGVyIGlzIGVtYmVkZGluZ1xuICAgICAgLy8gdGhlbSBpbiB0aGUgc2hhZGVyLlxuICAgICAgLy8gfHhSYW5rfCBpcyB1c2VkIHRvIGRldGVybWluZSB0aGUgY29vcmRzIGxlbmd0aC4gU2VlXG4gICAgICAvLyBnZXRbUGFja2VkXVNhbXBsZXJBdE91dHB1dENvb3Jkcy5cbiAgICAgIC8vIHxpc0luT3V0VGV4U2hhcGVFcXVhbHwgaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciBnb2luZyB0byBhblxuICAgICAgLy8gb3B0aW1pemF0aW9uIHBhdGggaW4gZ2V0U2FtcGxlckF0T3V0cHV0Q29vcmRzLlxuICAgICAgLy8gfHVzZVNxdWVlemVTaGFwZXwgaXMgZXh0cmFjdGVkIGZyb20gc3F1ZWV6ZUlucHV0SW5mbyBvZlxuICAgICAgLy8gZ2V0U2FtcGxlclsyfDN8NF1EL2dldFBhY2tlZFNhbXBsZXIzRC5cbiAgICAgIC8vIHxpc1NjYWxhcnwgaXMgZXh0cmFjdGVkIGZyb20gaXNJbnB1dFNjYWxhci9pc091dHB1dFNjYWxhciBpblxuICAgICAgLy8gZ2V0UGFja2VkU2FtcGxlckF0T3V0cHV0Q29vcmRzLlxuICAgICAgLy8gfGJyb2FkY2FzdERpbXN8IGlzIGV4dHJhY3RlZCBmcm9tIGdldFtQYWNrZWRdU2FtcGxlckF0T3V0cHV0Q29vcmRzLlxuICAgICAgLy8gfGlzTG9naWNhbFNoYXBUZXhTaGFwZUVxdWFsfCBpcyB1c2VkIGluXG4gICAgICAvLyBnZXRPdXRwdXRbUGFja2VkXTJEQ29vcmRzL2dldFtQYWNrZWRdU2FtcGxlcjJELlxuICAgICAgLy8gfHJhbmsxfCBpcyB1c2VkIGluIGdldE91dHB1dFBhY2tlZDFEQ29vcmRzLlxuICAgICAgLy8gfHJhbmsyfCBpcyB1c2VkIGluIGdldE91dHB1dDJEQ29vcmRzLlxuICAgICAgLy8gfHJhbmszNHwgaXMgdXNlZCBpbiBnZXRTYW1wbGVyM0QvZ2V0U2FtcGxlcjRELlxuICAgICAgLy8gfGlzVGV4U2hhcGVHcmVhdGVyVGhhbk9uZXwgYXJlIHVzZWQgaW5cbiAgICAgIC8vIGdldFNhbXBsZXJbU2NhbGFyfDFEfDJEXS9nZXRPdXRwdXQxRENvb3Jkcy5cbiAgICAgIGtleUlucHV0cyArPSBgJHt4UmFua31fJHtpc0luT3V0VGV4U2hhcGVFcXVhbH1fJHtcbiAgICAgICAgICB1c2VTcXVlZXplU2hhcGUgPyBrZXB0RGltcyA6ICcnfV8ke3VuaWZvcm1TaGFwZS5sZW5ndGh9XyR7aXNTY2FsYXJ9XyR7XG4gICAgICAgICAgYnJvYWRjYXN0RGltc31fJHtpc0xvZ2ljYWxTaGFwVGV4U2hhcGVFcXVhbH1fJHtyYW5rMX1fJHtyYW5rMn1fJHtcbiAgICAgICAgICByYW5rMzR9XyR7aXNUZXhTaGFwZUdyZWF0ZXJUaGFuT25lfV8ke2hhc09mZnNldH1gO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB0ZXhTaGFwZSA9IHguaXNVbmlmb3JtID8gJ3VuaWZvcm0nIDogeC50ZXhEYXRhLnRleFNoYXBlO1xuICAgICAga2V5SW5wdXRzICs9IGAke3guc2hhcGV9XyR7dGV4U2hhcGV9XyR7aGFzT2Zmc2V0fWA7XG4gICAgfVxuICB9KTtcbiAgY29uc3Qga2V5VXNlckNvZGUgPSBwcm9ncmFtLnVzZXJDb2RlO1xuICBsZXQga2V5ID0gcHJvZ3JhbS5jb25zdHJ1Y3Rvci5uYW1lO1xuICAvLyBGYXN0IHN0cmluZyBjb25jYXQuIFNlZSBodHRwczovL2pzcGVyZi5jb20vc3RyaW5nLWNvbmNhdGVuYXRpb24vMTQuXG4gIGtleSArPSAnXycgKyBrZXlJbnB1dHMgKyAnXycgKyBrZXlVc2VyQ29kZSArXG4gICAgICBgJHtlbnYoKS5nZXROdW1iZXIoJ1dFQkdMX1ZFUlNJT04nKX1gO1xuICByZXR1cm4ga2V5O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlU2hhcGVVbmlmb3JtcyhyYW5rOiBudW1iZXIpIHtcbiAgLy8gVE9ETzogUmVtb3ZlIHRoZSBsaW1pdGFpb24gb2YgcmFuayA8PSA0LlxuICByZXR1cm4gZW52KCkuZ2V0Qm9vbCgnV0VCR0xfVVNFX1NIQVBFU19VTklGT1JNUycpICYmIHJhbmsgPD0gNDtcbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtQaXhlbERhdGEsIFR5cGVkQXJyYXl9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7Z2V0R2xzbERpZmZlcmVuY2VzfSBmcm9tICcuL2dsc2xfdmVyc2lvbic7XG5pbXBvcnQgKiBhcyB0ZXhfdXRpbCBmcm9tICcuL3RleF91dGlsJztcbmltcG9ydCB7VGV4dHVyZUNvbmZpZ30gZnJvbSAnLi90ZXhfdXRpbCc7XG5pbXBvcnQgKiBhcyB3ZWJnbF91dGlsIGZyb20gJy4vd2ViZ2xfdXRpbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVWZXJ0ZXhTaGFkZXIoZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCk6IFdlYkdMU2hhZGVyIHtcbiAgY29uc3QgZ2xzbCA9IGdldEdsc2xEaWZmZXJlbmNlcygpO1xuICBjb25zdCB2ZXJ0ZXhTaGFkZXJTb3VyY2UgPSBgJHtnbHNsLnZlcnNpb259XG4gICAgcHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xuICAgICR7Z2xzbC5hdHRyaWJ1dGV9IHZlYzMgY2xpcFNwYWNlUG9zO1xuICAgICR7Z2xzbC5hdHRyaWJ1dGV9IHZlYzIgdXY7XG4gICAgJHtnbHNsLnZhcnlpbmdWc30gdmVjMiByZXN1bHRVVjtcblxuICAgIHZvaWQgbWFpbigpIHtcbiAgICAgIGdsX1Bvc2l0aW9uID0gdmVjNChjbGlwU3BhY2VQb3MsIDEpO1xuICAgICAgcmVzdWx0VVYgPSB1djtcbiAgICB9YDtcbiAgcmV0dXJuIHdlYmdsX3V0aWwuY3JlYXRlVmVydGV4U2hhZGVyKGdsLCB2ZXJ0ZXhTaGFkZXJTb3VyY2UpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVmVydGV4QnVmZmVyKGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQpOiBXZWJHTEJ1ZmZlciB7XG4gIC8vIFt4IHkgeiB1IHZdICogW3VwcGVyLWxlZnQsIGxvd2VyLWxlZnQsIHVwcGVyLXJpZ2h0LCBsb3dlci1yaWdodF1cbiAgY29uc3QgdmVydGV4QXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KFxuICAgICAgWy0xLCAxLCAwLCAwLCAxLCAtMSwgLTEsIDAsIDAsIDAsIDEsIDEsIDAsIDEsIDEsIDEsIC0xLCAwLCAxLCAwXSk7XG4gIHJldHVybiB3ZWJnbF91dGlsLmNyZWF0ZVN0YXRpY1ZlcnRleEJ1ZmZlcihnbCwgdmVydGV4QXJyYXkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSW5kZXhCdWZmZXIoZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCk6IFdlYkdMQnVmZmVyIHtcbiAgLy8gT3BlbkdMIChhbmQgV2ViR0wpIGhhdmUgXCJDQ1cgPT0gZnJvbnRcIiB3aW5kaW5nXG4gIGNvbnN0IHRyaWFuZ2xlVmVydGV4SW5kaWNlcyA9IG5ldyBVaW50MTZBcnJheShbMCwgMSwgMiwgMiwgMSwgM10pO1xuICByZXR1cm4gd2ViZ2xfdXRpbC5jcmVhdGVTdGF0aWNJbmRleEJ1ZmZlcihnbCwgdHJpYW5nbGVWZXJ0ZXhJbmRpY2VzKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQW5kQ29uZmlndXJlVGV4dHVyZShcbiAgICBnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0LCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcixcbiAgICBpbnRlcm5hbEZvcm1hdDogbnVtYmVyLCB0ZXh0dXJlRm9ybWF0OiBudW1iZXIsXG4gICAgdGV4dHVyZVR5cGU6IG51bWJlcik6IFdlYkdMVGV4dHVyZSB7XG4gIHdlYmdsX3V0aWwudmFsaWRhdGVUZXh0dXJlU2l6ZSh3aWR0aCwgaGVpZ2h0KTtcbiAgY29uc3QgdGV4dHVyZSA9IHdlYmdsX3V0aWwuY3JlYXRlVGV4dHVyZShnbCk7XG5cbiAgY29uc3QgdGV4MmQgPSBnbC5URVhUVVJFXzJEO1xuICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuYmluZFRleHR1cmUodGV4MmQsIHRleHR1cmUpKTtcbiAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soXG4gICAgICBnbCwgKCkgPT4gZ2wudGV4UGFyYW1ldGVyaSh0ZXgyZCwgZ2wuVEVYVFVSRV9XUkFQX1MsIGdsLkNMQU1QX1RPX0VER0UpKTtcbiAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soXG4gICAgICBnbCwgKCkgPT4gZ2wudGV4UGFyYW1ldGVyaSh0ZXgyZCwgZ2wuVEVYVFVSRV9XUkFQX1QsIGdsLkNMQU1QX1RPX0VER0UpKTtcbiAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soXG4gICAgICBnbCwgKCkgPT4gZ2wudGV4UGFyYW1ldGVyaSh0ZXgyZCwgZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCBnbC5ORUFSRVNUKSk7XG4gIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKFxuICAgICAgZ2wsICgpID0+IGdsLnRleFBhcmFtZXRlcmkodGV4MmQsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgZ2wuTkVBUkVTVCkpO1xuICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayhcbiAgICAgIGdsLFxuICAgICAgKCkgPT4gZ2wudGV4SW1hZ2UyRChcbiAgICAgICAgICB0ZXgyZCwgMCwgaW50ZXJuYWxGb3JtYXQsIHdpZHRoLCBoZWlnaHQsIDAsIHRleHR1cmVGb3JtYXQsXG4gICAgICAgICAgdGV4dHVyZVR5cGUsIG51bGwpKTtcbiAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIG51bGwpKTtcbiAgcmV0dXJuIHRleHR1cmU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnRlcm5hbEZvcm1hdEZvckZsb2F0MzJNYXRyaXhUZXh0dXJlKFxuICAgIHRleHR1cmVDb25maWc6IFRleHR1cmVDb25maWcpIHtcbiAgcmV0dXJuIHRleHR1cmVDb25maWcuaW50ZXJuYWxGb3JtYXRGbG9hdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZsb2F0MzJNYXRyaXhUZXh0dXJlKFxuICAgIGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQsIHJvd3M6IG51bWJlciwgY29sdW1uczogbnVtYmVyLFxuICAgIHRleHR1cmVDb25maWc6IFRleHR1cmVDb25maWcpOiBXZWJHTFRleHR1cmUge1xuICBjb25zdCBbd2lkdGgsIGhlaWdodF0gPVxuICAgICAgdGV4X3V0aWwuZ2V0VW5wYWNrZWRNYXRyaXhUZXh0dXJlU2hhcGVXaWR0aEhlaWdodChyb3dzLCBjb2x1bW5zKTtcbiAgcmV0dXJuIGNyZWF0ZUFuZENvbmZpZ3VyZVRleHR1cmUoXG4gICAgICBnbCwgd2lkdGgsIGhlaWdodCxcbiAgICAgIGdldEludGVybmFsRm9ybWF0Rm9yRmxvYXQzMk1hdHJpeFRleHR1cmUodGV4dHVyZUNvbmZpZyksXG4gICAgICB0ZXh0dXJlQ29uZmlnLnRleHR1cmVGb3JtYXRGbG9hdCwgZ2wuRkxPQVQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW50ZXJuYWxGb3JtYXRGb3JGbG9hdDE2TWF0cml4VGV4dHVyZShcbiAgICB0ZXh0dXJlQ29uZmlnOiBUZXh0dXJlQ29uZmlnKSB7XG4gIHJldHVybiB0ZXh0dXJlQ29uZmlnLmludGVybmFsRm9ybWF0SGFsZkZsb2F0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRmxvYXQxNk1hdHJpeFRleHR1cmUoXG4gICAgZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgcm93czogbnVtYmVyLCBjb2x1bW5zOiBudW1iZXIsXG4gICAgdGV4dHVyZUNvbmZpZzogVGV4dHVyZUNvbmZpZyk6IFdlYkdMVGV4dHVyZSB7XG4gIGNvbnN0IFt3aWR0aCwgaGVpZ2h0XSA9XG4gICAgICB0ZXhfdXRpbC5nZXRVbnBhY2tlZE1hdHJpeFRleHR1cmVTaGFwZVdpZHRoSGVpZ2h0KHJvd3MsIGNvbHVtbnMpO1xuICByZXR1cm4gY3JlYXRlQW5kQ29uZmlndXJlVGV4dHVyZShcbiAgICAgIGdsLCB3aWR0aCwgaGVpZ2h0LFxuICAgICAgZ2V0SW50ZXJuYWxGb3JtYXRGb3JGbG9hdDE2TWF0cml4VGV4dHVyZSh0ZXh0dXJlQ29uZmlnKSxcbiAgICAgIHRleHR1cmVDb25maWcudGV4dHVyZUZvcm1hdEZsb2F0LCB0ZXh0dXJlQ29uZmlnLnRleHR1cmVUeXBlSGFsZkZsb2F0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEludGVybmFsRm9ybWF0Rm9yVW5zaWduZWRCeXRlc01hdHJpeFRleHR1cmUoXG4gICAgdGV4dHVyZUNvbmZpZzogVGV4dHVyZUNvbmZpZykge1xuICByZXR1cm4gdGV4dHVyZUNvbmZpZy5kb3dubG9hZFRleHR1cmVGb3JtYXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVVbnNpZ25lZEJ5dGVzTWF0cml4VGV4dHVyZShcbiAgICBnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0LCByb3dzOiBudW1iZXIsIGNvbHVtbnM6IG51bWJlcixcbiAgICB0ZXh0dXJlQ29uZmlnOiBUZXh0dXJlQ29uZmlnKTogV2ViR0xUZXh0dXJlIHtcbiAgY29uc3QgW3dpZHRoLCBoZWlnaHRdID1cbiAgICAgIHRleF91dGlsLmdldFVucGFja2VkTWF0cml4VGV4dHVyZVNoYXBlV2lkdGhIZWlnaHQocm93cywgY29sdW1ucyk7XG4gIHJldHVybiBjcmVhdGVBbmRDb25maWd1cmVUZXh0dXJlKFxuICAgICAgZ2wsIHdpZHRoLCBoZWlnaHQsXG4gICAgICBnZXRJbnRlcm5hbEZvcm1hdEZvclVuc2lnbmVkQnl0ZXNNYXRyaXhUZXh0dXJlKHRleHR1cmVDb25maWcpLCBnbC5SR0JBLFxuICAgICAgZ2wuVU5TSUdORURfQllURSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnRlcm5hbEZvcm1hdEZvclBhY2tlZE1hdHJpeFRleHR1cmUoXG4gICAgdGV4dHVyZUNvbmZpZzogVGV4dHVyZUNvbmZpZykge1xuICByZXR1cm4gdGV4dHVyZUNvbmZpZy5pbnRlcm5hbEZvcm1hdFBhY2tlZEZsb2F0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUGFja2VkTWF0cml4VGV4dHVyZShcbiAgICBnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0LCByb3dzOiBudW1iZXIsIGNvbHVtbnM6IG51bWJlcixcbiAgICB0ZXh0dXJlQ29uZmlnOiBUZXh0dXJlQ29uZmlnKTogV2ViR0xUZXh0dXJlIHtcbiAgY29uc3QgW3dpZHRoLCBoZWlnaHRdID1cbiAgICAgIHRleF91dGlsLmdldFBhY2tlZE1hdHJpeFRleHR1cmVTaGFwZVdpZHRoSGVpZ2h0KHJvd3MsIGNvbHVtbnMpO1xuICByZXR1cm4gY3JlYXRlQW5kQ29uZmlndXJlVGV4dHVyZShcbiAgICAgIGdsLCB3aWR0aCwgaGVpZ2h0LCBnZXRJbnRlcm5hbEZvcm1hdEZvclBhY2tlZE1hdHJpeFRleHR1cmUodGV4dHVyZUNvbmZpZyksXG4gICAgICBnbC5SR0JBLCBnbC5GTE9BVCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnRlcm5hbEZvcm1hdEZvckZsb2F0MTZQYWNrZWRNYXRyaXhUZXh0dXJlKFxuICAgIHRleHR1cmVDb25maWc6IFRleHR1cmVDb25maWcpIHtcbiAgcmV0dXJuIHRleHR1cmVDb25maWcuaW50ZXJuYWxGb3JtYXRQYWNrZWRIYWxmRmxvYXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGbG9hdDE2UGFja2VkTWF0cml4VGV4dHVyZShcbiAgICBnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0LCByb3dzOiBudW1iZXIsIGNvbHVtbnM6IG51bWJlcixcbiAgICB0ZXh0dXJlQ29uZmlnOiBUZXh0dXJlQ29uZmlnKTogV2ViR0xUZXh0dXJlIHtcbiAgY29uc3QgW3dpZHRoLCBoZWlnaHRdID1cbiAgICAgIHRleF91dGlsLmdldFBhY2tlZE1hdHJpeFRleHR1cmVTaGFwZVdpZHRoSGVpZ2h0KHJvd3MsIGNvbHVtbnMpO1xuICByZXR1cm4gY3JlYXRlQW5kQ29uZmlndXJlVGV4dHVyZShcbiAgICAgIGdsLCB3aWR0aCwgaGVpZ2h0LFxuICAgICAgZ2V0SW50ZXJuYWxGb3JtYXRGb3JGbG9hdDE2UGFja2VkTWF0cml4VGV4dHVyZSh0ZXh0dXJlQ29uZmlnKSwgZ2wuUkdCQSxcbiAgICAgIHRleHR1cmVDb25maWcudGV4dHVyZVR5cGVIYWxmRmxvYXQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYmluZFZlcnRleFByb2dyYW1BdHRyaWJ1dGVTdHJlYW1zKFxuICAgIGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQsIHByb2dyYW06IFdlYkdMUHJvZ3JhbSxcbiAgICB2ZXJ0ZXhCdWZmZXI6IFdlYkdMQnVmZmVyKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBvc09mZnNldCA9IDA7ICAgICAgICAgICAgICAgLy8geCBpcyB0aGUgZmlyc3QgYnVmZmVyIGVsZW1lbnRcbiAgY29uc3QgdXZPZmZzZXQgPSAzICogNDsgICAgICAgICAgICAvLyB1diBjb21lcyBhZnRlciBbeCB5IHpdXG4gIGNvbnN0IHN0cmlkZSA9ICgzICogNCkgKyAoMiAqIDQpOyAgLy8geHl6ICsgdXYsIGVhY2ggZW50cnkgaXMgNC1ieXRlIGZsb2F0LlxuICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayhcbiAgICAgIGdsLCAoKSA9PiBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgdmVydGV4QnVmZmVyKSk7XG4gIGNvbnN0IHN1Y2Nlc3MgPSB3ZWJnbF91dGlsLmJpbmRWZXJ0ZXhCdWZmZXJUb1Byb2dyYW1BdHRyaWJ1dGUoXG4gICAgICBnbCwgcHJvZ3JhbSwgJ2NsaXBTcGFjZVBvcycsIHZlcnRleEJ1ZmZlciwgMywgc3RyaWRlLCBwb3NPZmZzZXQpO1xuICByZXR1cm4gc3VjY2VzcyAmJlxuICAgICAgd2ViZ2xfdXRpbC5iaW5kVmVydGV4QnVmZmVyVG9Qcm9ncmFtQXR0cmlidXRlKFxuICAgICAgICAgIGdsLCBwcm9ncmFtLCAndXYnLCB2ZXJ0ZXhCdWZmZXIsIDIsIHN0cmlkZSwgdXZPZmZzZXQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBsb2FkRGVuc2VNYXRyaXhUb1RleHR1cmUoXG4gICAgZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgdGV4dHVyZTogV2ViR0xUZXh0dXJlLCB3aWR0aDogbnVtYmVyLFxuICAgIGhlaWdodDogbnVtYmVyLCBkYXRhOiBUeXBlZEFycmF5LCB0ZXh0dXJlQ29uZmlnOiBUZXh0dXJlQ29uZmlnKSB7XG4gIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCB0ZXh0dXJlKSk7XG5cbiAgbGV0IGRhdGFGb3JVcGxvYWQ6IFR5cGVkQXJyYXksIHRleGVsRGF0YVR5cGU6IG51bWJlciwgaW50ZXJuYWxGb3JtYXQ6IG51bWJlcjtcbiAgaWYgKGRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7XG4gICAgZGF0YUZvclVwbG9hZCA9IG5ldyBVaW50OEFycmF5KHdpZHRoICogaGVpZ2h0ICogNCk7XG4gICAgdGV4ZWxEYXRhVHlwZSA9IGdsLlVOU0lHTkVEX0JZVEU7XG4gICAgaW50ZXJuYWxGb3JtYXQgPSBnbC5SR0JBO1xuICB9IGVsc2Uge1xuICAgIGRhdGFGb3JVcGxvYWQgPSBuZXcgRmxvYXQzMkFycmF5KHdpZHRoICogaGVpZ2h0ICogNCk7XG4gICAgdGV4ZWxEYXRhVHlwZSA9IGdsLkZMT0FUO1xuICAgIGludGVybmFsRm9ybWF0ID0gdGV4dHVyZUNvbmZpZy5pbnRlcm5hbEZvcm1hdFBhY2tlZEZsb2F0O1xuICB9XG5cbiAgZGF0YUZvclVwbG9hZC5zZXQoZGF0YSk7XG5cbiAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soXG4gICAgICBnbCxcbiAgICAgICgpID0+IGdsLnRleEltYWdlMkQoXG4gICAgICAgICAgZ2wuVEVYVFVSRV8yRCwgMCwgaW50ZXJuYWxGb3JtYXQsIHdpZHRoLCBoZWlnaHQsIDAsIGdsLlJHQkEsXG4gICAgICAgICAgdGV4ZWxEYXRhVHlwZSwgZGF0YUZvclVwbG9hZCkpO1xuXG4gIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBudWxsKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGxvYWRQaXhlbERhdGFUb1RleHR1cmUoXG4gICAgZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgdGV4dHVyZTogV2ViR0xUZXh0dXJlLFxuICAgIHBpeGVsczogUGl4ZWxEYXRhfEltYWdlRGF0YXxIVE1MSW1hZ2VFbGVtZW50fEhUTUxDYW52YXNFbGVtZW50fFxuICAgIEhUTUxWaWRlb0VsZW1lbnR8SW1hZ2VCaXRtYXApIHtcbiAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRleHR1cmUpKTtcbiAgaWYgKChwaXhlbHMgYXMgUGl4ZWxEYXRhKS5kYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKFxuICAgICAgICBnbCxcbiAgICAgICAgKCkgPT4gZ2wudGV4SW1hZ2UyRChcbiAgICAgICAgICAgIGdsLlRFWFRVUkVfMkQsIDAsIGdsLlJHQkEsIHBpeGVscy53aWR0aCwgcGl4ZWxzLmhlaWdodCwgMCwgZ2wuUkdCQSxcbiAgICAgICAgICAgIGdsLlVOU0lHTkVEX0JZVEUsIChwaXhlbHMgYXMgUGl4ZWxEYXRhKS5kYXRhKSk7XG4gIH0gZWxzZSB7XG4gICAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soXG4gICAgICAgIGdsLFxuICAgICAgICAoKSA9PiBnbC50ZXhJbWFnZTJEKFxuICAgICAgICAgICAgZ2wuVEVYVFVSRV8yRCwgMCwgZ2wuUkdCQSwgZ2wuUkdCQSwgZ2wuVU5TSUdORURfQllURSxcbiAgICAgICAgICAgIHBpeGVscyBhcyBJbWFnZURhdGEgfCBIVE1MSW1hZ2VFbGVtZW50IHwgSFRNTENhbnZhc0VsZW1lbnQgfFxuICAgICAgICAgICAgICAgIEhUTUxWaWRlb0VsZW1lbnR8SW1hZ2VCaXRtYXApKTtcbiAgfVxuXG4gIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBudWxsKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVCdWZmZXJGcm9tT3V0cHV0VGV4dHVyZShcbiAgICBnbDI6IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQsIHJvd3M6IG51bWJlciwgY29sdW1uczogbnVtYmVyLFxuICAgIHRleHR1cmVDb25maWc6IFRleHR1cmVDb25maWcpOiBXZWJHTEJ1ZmZlciB7XG4gIC8vIENyZWF0ZSBhbmQgYmluZCB0aGUgYnVmZmVyLlxuICBjb25zdCBidWZmZXIgPSBnbDIuY3JlYXRlQnVmZmVyKCk7XG4gIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKFxuICAgICAgZ2wyLCAoKSA9PiBnbDIuYmluZEJ1ZmZlcihnbDIuUElYRUxfUEFDS19CVUZGRVIsIGJ1ZmZlcikpO1xuXG4gIC8vIEluaXRpYWxpemUgdGhlIGJ1ZmZlciB0byB0aGUgc2l6ZSBvZiB0aGUgdGV4dHVyZSBpbiBieXRlcy5cbiAgY29uc3QgYnl0ZXNQZXJGbG9hdCA9IDQ7XG4gIGNvbnN0IHZhbHVlc1BlclRleGVsID0gNDtcbiAgY29uc3QgYnVmZmVyU2l6ZUJ5dGVzID0gYnl0ZXNQZXJGbG9hdCAqIHZhbHVlc1BlclRleGVsICogcm93cyAqIGNvbHVtbnM7XG5cbiAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soXG4gICAgICBnbDIsXG4gICAgICAoKSA9PiBnbDIuYnVmZmVyRGF0YShcbiAgICAgICAgICBnbDIuUElYRUxfUEFDS19CVUZGRVIsIGJ1ZmZlclNpemVCeXRlcywgZ2wyLlNUUkVBTV9SRUFEKSk7XG5cbiAgLy8gRW5xdWV1ZSBhIGNvbW1hbmQgb24gdGhlIEdQVSBjb21tYW5kIHF1ZXVlIHRvIGNvcHkgb2YgdGV4dHVyZSBpbnRvIHRoZVxuICAvLyBidWZmZXIuXG4gIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKFxuICAgICAgZ2wyLCAoKSA9PiBnbDIucmVhZFBpeGVscygwLCAwLCBjb2x1bW5zLCByb3dzLCBnbDIuUkdCQSwgZ2wyLkZMT0FULCAwKSk7XG5cbiAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soXG4gICAgICBnbDIsICgpID0+IGdsMi5iaW5kQnVmZmVyKGdsMi5QSVhFTF9QQUNLX0JVRkZFUiwgbnVsbCkpO1xuXG4gIHJldHVybiBidWZmZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkb3dubG9hZEZsb2F0MzJNYXRyaXhGcm9tQnVmZmVyKFxuICAgIGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQsIGJ1ZmZlcjogV2ViR0xCdWZmZXIsXG4gICAgc2l6ZTogbnVtYmVyKTogRmxvYXQzMkFycmF5IHtcbiAgY29uc3QgZ2wyID0gZ2wgYXMgV2ViR0wyUmVuZGVyaW5nQ29udGV4dDtcblxuICBjb25zdCBkb3dubG9hZFRhcmdldCA9IG5ldyBGbG9hdDMyQXJyYXkoc2l6ZSk7XG5cbiAgZ2wyLmJpbmRCdWZmZXIoZ2wyLlBJWEVMX1BBQ0tfQlVGRkVSLCBidWZmZXIpO1xuICBnbDIuZ2V0QnVmZmVyU3ViRGF0YShnbDIuUElYRUxfUEFDS19CVUZGRVIsIDAsIGRvd25sb2FkVGFyZ2V0KTtcbiAgZ2wyLmJpbmRCdWZmZXIoZ2wyLlBJWEVMX1BBQ0tfQlVGRkVSLCBudWxsKTtcblxuICByZXR1cm4gZG93bmxvYWRUYXJnZXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkb3dubG9hZEJ5dGVFbmNvZGVkRmxvYXRNYXRyaXhGcm9tT3V0cHV0VGV4dHVyZShcbiAgICBnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0LCByb3dzOiBudW1iZXIsIGNvbHVtbnM6IG51bWJlcixcbiAgICB0ZXh0dXJlQ29uZmlnOiBUZXh0dXJlQ29uZmlnKSB7XG4gIGNvbnN0IFt3LCBoXSA9XG4gICAgICB0ZXhfdXRpbC5nZXRVbnBhY2tlZE1hdHJpeFRleHR1cmVTaGFwZVdpZHRoSGVpZ2h0KHJvd3MsIGNvbHVtbnMpO1xuXG4gIGNvbnN0IG51bUNoYW5uZWxzID0gNDtcbiAgY29uc3QgZG93bmxvYWRUYXJnZXQgPSBuZXcgVWludDhBcnJheShcbiAgICAgIHRleF91dGlsLmdldFVucGFja2VkQXJyYXlTaXplRnJvbU1hdHJpeFNpemUocm93cyAqIGNvbHVtbnMsIG51bUNoYW5uZWxzKSk7XG5cbiAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soXG4gICAgICBnbCxcbiAgICAgICgpID0+IGdsLnJlYWRQaXhlbHMoXG4gICAgICAgICAgMCwgMCwgdywgaCwgdGV4dHVyZUNvbmZpZy5kb3dubG9hZFRleHR1cmVGb3JtYXQsIGdsLlVOU0lHTkVEX0JZVEUsXG4gICAgICAgICAgZG93bmxvYWRUYXJnZXQpKTtcblxuICAvLyBCeSB3cmFwcGluZyB0aGUgYnVmZmVyIGluIGEgRmxvYXQzMkFycmF5LCB3ZSB1c2UgbmF0aXZlIGJyb3dzZXIgSUVFRSA3NTRcbiAgLy8gZGVjb2Rpbmcgb2YgdGhlIDQgYnl0ZXMgdGhhdCBiYWNrIGVhY2ggMzIgYml0IGZsb2F0LlxuICByZXR1cm4gbmV3IEZsb2F0MzJBcnJheShkb3dubG9hZFRhcmdldC5idWZmZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZG93bmxvYWRQYWNrZWRNYXRyaXhGcm9tQnVmZmVyKFxuICAgIGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQsIGJ1ZmZlcjogV2ViR0xCdWZmZXIsIGJhdGNoOiBudW1iZXIsIHJvd3M6IG51bWJlcixcbiAgICBjb2xzOiBudW1iZXIsIHBoeXNpY2FsUm93czogbnVtYmVyLCBwaHlzaWNhbENvbHM6IG51bWJlcixcbiAgICB0ZXh0dXJlQ29uZmlnOiBUZXh0dXJlQ29uZmlnKTogRmxvYXQzMkFycmF5IHtcbiAgY29uc3QgZ2wyID0gZ2wgYXMgV2ViR0wyUmVuZGVyaW5nQ29udGV4dDtcblxuICBjb25zdCBkb3dubG9hZFRhcmdldCA9XG4gICAgICBuZXcgRmxvYXQzMkFycmF5KHRleF91dGlsLmdldFBhY2tlZFJHQkFBcnJheVNpemVGcm9tTWF0cml4U2hhcGUoXG4gICAgICAgICAgcGh5c2ljYWxSb3dzLCBwaHlzaWNhbENvbHMpKTtcblxuICBnbDIuYmluZEJ1ZmZlcihnbDIuUElYRUxfUEFDS19CVUZGRVIsIGJ1ZmZlcik7XG4gIGdsMi5nZXRCdWZmZXJTdWJEYXRhKGdsMi5QSVhFTF9QQUNLX0JVRkZFUiwgMCwgZG93bmxvYWRUYXJnZXQpO1xuICBnbDIuYmluZEJ1ZmZlcihnbDIuUElYRUxfUEFDS19CVUZGRVIsIG51bGwpO1xuXG4gIHJldHVybiBkb3dubG9hZFRhcmdldDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRvd25sb2FkTWF0cml4RnJvbVBhY2tlZE91dHB1dFRleHR1cmUoXG4gICAgZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgcGh5c2ljYWxSb3dzOiBudW1iZXIsXG4gICAgcGh5c2ljYWxDb2xzOiBudW1iZXIpOiBGbG9hdDMyQXJyYXkge1xuICBjb25zdCBwYWNrZWRSR0JBID0gbmV3IEZsb2F0MzJBcnJheShwaHlzaWNhbFJvd3MgKiBwaHlzaWNhbENvbHMgKiA0KTtcbiAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soXG4gICAgICBnbCxcbiAgICAgICgpID0+IGdsLnJlYWRQaXhlbHMoXG4gICAgICAgICAgMCwgMCwgcGh5c2ljYWxDb2xzLCBwaHlzaWNhbFJvd3MsIGdsLlJHQkEsIGdsLkZMT0FULCBwYWNrZWRSR0JBKSk7XG5cbiAgcmV0dXJuIHBhY2tlZFJHQkE7XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtnZXRHbHNsRGlmZmVyZW5jZXN9IGZyb20gJy4vZ2xzbF92ZXJzaW9uJztcbmltcG9ydCB7R1BHUFVQcm9ncmFtLCB1c2VTaGFwZVVuaWZvcm1zfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuXG5leHBvcnQgY2xhc3MgSW0yQ29sUGFja2VkUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ0EnXTtcbiAgcGFja2VkSW5wdXRzID0gdHJ1ZTtcbiAgcGFja2VkT3V0cHV0ID0gdHJ1ZTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuICBlbmFibGVTaGFwZVVuaWZvcm1zOiBib29sZWFuO1xuICBjdXN0b21Vbmlmb3JtcyA9IFtcbiAgICB7bmFtZTogJ2lucHV0U2hhcGUnLCB0eXBlOiAnaXZlYzMnIGFzIGNvbnN0IH0sXG4gICAge25hbWU6ICdwYWQnLCB0eXBlOiAnaXZlYzInIGFzIGNvbnN0IH0sXG4gICAge25hbWU6ICdzdHJpZGUnLCB0eXBlOiAnaXZlYzInIGFzIGNvbnN0IH0sXG4gICAge25hbWU6ICdkaWxhdGlvbicsIHR5cGU6ICdpdmVjMicgYXMgY29uc3QgfSxcbiAgICB7bmFtZTogJ2luQ2hhbm5lbHMnLCB0eXBlOiAnaW50JyBhcyBjb25zdCB9LFxuICAgIHtuYW1lOiAnaXRlbXNQZXJCbG9ja1JvdycsIHR5cGU6ICdpbnQnIGFzIGNvbnN0IH0sXG4gICAge25hbWU6ICdvdXRXaWR0aCcsIHR5cGU6ICdpbnQnIGFzIGNvbnN0IH0sXG4gIF07XG5cbiAgY29uc3RydWN0b3Iob3V0cHV0U2hhcGU6IG51bWJlcltdLCBjb252SW5mbzogYmFja2VuZF91dGlsLkNvbnYyREluZm8pIHtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gb3V0cHV0U2hhcGU7XG4gICAgdGhpcy5lbmFibGVTaGFwZVVuaWZvcm1zID0gdXNlU2hhcGVVbmlmb3Jtcyh0aGlzLm91dHB1dFNoYXBlLmxlbmd0aCk7XG4gICAgY29uc3Qge2RhdGFGb3JtYXR9ID0gY29udkluZm87XG4gICAgY29uc3QgZ2xzbCA9IGdldEdsc2xEaWZmZXJlbmNlcygpO1xuICAgIGNvbnN0IGlzQ2hhbm5lbHNMYXN0ID0gZGF0YUZvcm1hdCA9PT0gJ2NoYW5uZWxzTGFzdCc7XG4gICAgY29uc3Qgcm93RGltID0gaXNDaGFubmVsc0xhc3QgPyAwIDogMTtcbiAgICBjb25zdCBjb2xEaW0gPSBpc0NoYW5uZWxzTGFzdCA/IDEgOiAyO1xuXG4gICAgY29uc3QgYm91bmRzQ2hlY2tpbmdTbmlwcGV0ID0gdGhpcy5lbmFibGVTaGFwZVVuaWZvcm1zID9cbiAgICAgICAgJ2lmKGJsb2NrSW5kZXggPCBvdXRTaGFwZVsxXSAmJiBwb3MgPCBvdXRTaGFwZVswXSkgeycgOlxuICAgICAgICBgaWYoYmxvY2tJbmRleCA8ICR7b3V0cHV0U2hhcGVbMV19ICYmIHBvcyA8ICR7b3V0cHV0U2hhcGVbMF19KSB7YDtcbiAgICBsZXQgdW5yb2xsZWQgPSBgYDtcblxuICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8PSAxOyByb3crKykge1xuICAgICAgZm9yIChsZXQgY29sID0gMDsgY29sIDw9IDE7IGNvbCsrKSB7XG4gICAgICAgIHVucm9sbGVkICs9IGBcbiAgICAgICAgICBibG9ja0luZGV4ID0gcmMueSArICR7Y29sfTtcbiAgICAgICAgICBwb3MgPSByYy54ICsgJHtyb3d9O1xuXG4gICAgICAgICAgJHtib3VuZHNDaGVja2luZ1NuaXBwZXR9XG4gICAgICAgICAgICBvZmZzZXRZID0gaW50KGJsb2NrSW5kZXggLyBvdXRXaWR0aCkgKiBzdHJpZGVbMF0gLSBwYWRbMF07XG4gICAgICAgICAgICBkMCA9IG9mZnNldFkgKyBkaWxhdGlvblswXSAqIChwb3MgLyBpdGVtc1BlckJsb2NrUm93KTtcblxuICAgICAgICAgICAgaWYoZDAgPCBpbnB1dFNoYXBlWyR7cm93RGltfV0gJiYgZDAgPj0gMCkge1xuICAgICAgICAgICAgICAvLyBVc2UgY3VzdG9tIGltb2QgaW5zdGVhZCBtb2QuIE9uIEludGVsIEdQVSwgbW9kIG1heSBnZW5lcmF0ZVxuICAgICAgICAgICAgICAvLyB1bmV4cGVjdGVkIHZhbHVlLlxuICAgICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZmpzL2lzc3Vlcy81NDQ3XG4gICAgICAgICAgICAgIG9mZnNldFggPSBpbW9kKGJsb2NrSW5kZXgsIG91dFdpZHRoKSAqIHN0cmlkZVsxXSAtIHBhZFsxXTtcbiAgICAgICAgICAgICAgZDEgPSBvZmZzZXRYICsgZGlsYXRpb25bMV0gKiAoaW1vZChwb3MsIGl0ZW1zUGVyQmxvY2tSb3cpIC9cbiAgICAgICAgICAgICAgICAgIGluQ2hhbm5lbHMpO1xuXG4gICAgICAgICAgICAgIGlmKGQxIDwgaW5wdXRTaGFwZVske2NvbERpbX1dICYmIGQxID49IDApIHtcblxuICAgICAgICAgICAgICAgIGNoID0gaW1vZChwb3MsIGluQ2hhbm5lbHMpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCR7aXNDaGFubmVsc0xhc3R9KSB7XG4gICAgICAgICAgICAgICAgICBpbm5lckRpbXMgPSB2ZWMyKGQxLCBjaCk7XG4gICAgICAgICAgICAgICAgICByZXN1bHRbJHtyb3cgKiAyICsgY29sfV0gPSBnZXRDaGFubmVsKFxuICAgICAgICAgICAgICAgICAgICBnZXRBKGQwLCBpbnQoaW5uZXJEaW1zLngpLFxuICAgICAgICAgICAgICAgICAgICBpbnQoaW5uZXJEaW1zLnkpKSwgaW5uZXJEaW1zKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgaW5uZXJEaW1zID0gdmVjMihkMCwgZDEpO1xuICAgICAgICAgICAgICAgICAgcmVzdWx0WyR7cm93ICogMiArIGNvbH1dID0gZ2V0Q2hhbm5lbChcbiAgICAgICAgICAgICAgICAgICAgZ2V0QShjaCwgaW50KGlubmVyRGltcy54KSxcbiAgICAgICAgICAgICAgICAgICAgaW50KGlubmVyRGltcy55KSksIGlubmVyRGltcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICBgO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWMyIHJjID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG5cbiAgICAgICAgdmVjNCByZXN1bHQgPSB2ZWM0KDApO1xuXG4gICAgICAgIGludCBibG9ja0luZGV4LCBwb3MsIG9mZnNldFksIGQwLCBvZmZzZXRYLCBkMSwgY2g7XG4gICAgICAgIHZlYzIgaW5uZXJEaW1zO1xuXG4gICAgICAgICR7dW5yb2xsZWR9XG5cbiAgICAgICAgJHtnbHNsLm91dHB1dH0gPSByZXN1bHQ7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vLyBBbGwgZXhwb3J0cyBmcm9tIHRoaXMgcGFja2FnZSBzaG91bGQgYmUgaW4gYmFzZS5cbmV4cG9ydCAqIGZyb20gJy4vYmFzZSc7XG5pbXBvcnQgJy4vcmVnaXN0ZXJfYWxsX2tlcm5lbHMnO1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgZW52LCBUZW5zb3JJbmZvLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge0FyZ01pbk1heFByb2dyYW19IGZyb20gJy4uL2FyZ21pbm1heF9ncHUnO1xuaW1wb3J0IHtBcmdNaW5NYXhQYWNrZWRQcm9ncmFtfSBmcm9tICcuLi9hcmdtaW5tYXhfcGFja2VkX2dwdSc7XG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuLi9rZXJuZWxzL1Jlc2hhcGUnO1xuXG5mdW5jdGlvbiBhcmdSZWR1Y2UoXG4gICAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCwgeDogVGVuc29ySW5mbywgcmVkdWNlVHlwZTogJ21heCd8J21pbicsXG4gICAgYmVzdEluZGljZXNBOiBUZW5zb3JJbmZvID0gbnVsbCk6IFRlbnNvckluZm8ge1xuICBsZXQgYmF0Y2hTaXplID0geC5zaGFwZVswXTtcbiAgbGV0IGluU2l6ZSA9IHguc2hhcGVbMV07XG4gIGlmIChiZXN0SW5kaWNlc0EgIT0gbnVsbCkge1xuICAgIGJhdGNoU2l6ZSA9IGJlc3RJbmRpY2VzQS5zaGFwZVswXTtcbiAgICBpblNpemUgPSBiZXN0SW5kaWNlc0Euc2hhcGVbMV07XG4gIH1cbiAgY29uc3Qgd2luZG93U2l6ZSA9IGJhY2tlbmRfdXRpbC5jb21wdXRlT3B0aW1hbFdpbmRvd1NpemUoaW5TaXplKTtcbiAgY29uc3QgcmVkdWNlSW5mbyA9XG4gICAgICB7d2luZG93U2l6ZSwgaW5TaXplLCBiYXRjaFNpemUsIG91dFNpemU6IE1hdGguY2VpbChpblNpemUgLyB3aW5kb3dTaXplKX07XG4gIGNvbnN0IHByb2dyYW0gPVxuICAgICAgbmV3IEFyZ01pbk1heFByb2dyYW0ocmVkdWNlSW5mbywgcmVkdWNlVHlwZSwgYmVzdEluZGljZXNBID09IG51bGwpO1xuICBjb25zdCBpbnB1dHMgPSBbeF07XG4gIGlmIChiZXN0SW5kaWNlc0EgIT0gbnVsbCkge1xuICAgIGlucHV0cy5wdXNoKGJlc3RJbmRpY2VzQSk7XG4gIH1cbiAgY29uc3Qgb3V0cHV0ID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgaW5wdXRzLCAnaW50MzInKTtcbiAgLy8gTm8gbmVlZCB0byBydW4gYW5vdGhlciBHUEdQVSBwcm9ncmFtLlxuICBpZiAob3V0cHV0LnNoYXBlWzFdID09PSAxKSB7XG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfVxuICBjb25zdCByZXN1bHQgPSBhcmdSZWR1Y2UoYmFja2VuZCwgeCwgcmVkdWNlVHlwZSwgb3V0cHV0KTtcbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhvdXRwdXQpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBhcmdSZWR1Y2VQYWNrZWQoXG4gICAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCwgeDogVGVuc29ySW5mbywgcmVkdWNlVHlwZTogJ21heCd8J21pbicsXG4gICAgYmVzdEluZGljZXNBOiBUZW5zb3JJbmZvID0gbnVsbCk6IFRlbnNvckluZm8ge1xuICBjb25zdCBpblNoYXBlID0gYmVzdEluZGljZXNBICE9IG51bGwgPyBiZXN0SW5kaWNlc0Euc2hhcGUgOiB4LnNoYXBlO1xuICBjb25zdCBpblNpemUgPSBpblNoYXBlW2luU2hhcGUubGVuZ3RoIC0gMV07XG4gIGNvbnN0IHdpbmRvd1NpemUgPSBiYWNrZW5kX3V0aWwuY29tcHV0ZU9wdGltYWxXaW5kb3dTaXplKGluU2l6ZSk7XG4gIGNvbnN0IHByb2dyYW0gPSBuZXcgQXJnTWluTWF4UGFja2VkUHJvZ3JhbShcbiAgICAgIGluU2hhcGUsIHdpbmRvd1NpemUsIHJlZHVjZVR5cGUsIGJlc3RJbmRpY2VzQSA9PSBudWxsKTtcbiAgY29uc3QgaW5wdXRzID0gYmVzdEluZGljZXNBID09IG51bGwgPyBbeF0gOiBbeCwgYmVzdEluZGljZXNBXTtcbiAgY29uc3Qgb3V0cHV0ID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgaW5wdXRzLCAnaW50MzInKTtcbiAgaWYgKG91dHB1dC5zaGFwZS5sZW5ndGggPT09IHguc2hhcGUubGVuZ3RoKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXJnUmVkdWNlUGFja2VkKGJhY2tlbmQsIHgsIHJlZHVjZVR5cGUsIG91dHB1dCk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhvdXRwdXQpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgcmV0dXJuIG91dHB1dDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFyZ01pbk1heFJlZHVjZShcbiAgICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLCB4OiBUZW5zb3JJbmZvLCBheGlzOiBudW1iZXIsXG4gICAgcmVkdWNlVHlwZTogJ21pbid8J21heCcpOiBUZW5zb3JJbmZvIHtcbiAgY29uc3QgYXhlcyA9IFtheGlzXTtcbiAgYmFja2VuZF91dGlsLmFzc2VydEF4ZXNBcmVJbm5lck1vc3REaW1zKFxuICAgICAgJ2FyZycgKyByZWR1Y2VUeXBlLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgcmVkdWNlVHlwZS5zbGljZSgxKSwgYXhlcyxcbiAgICAgIHguc2hhcGUubGVuZ3RoKTtcbiAgaWYgKCFlbnYoKS5nZXRCb29sKCdXRUJHTF9QQUNLX1JFRFVDRScpIHx8IHguc2hhcGUubGVuZ3RoIDw9IDIpIHtcbiAgICBjb25zdCBpbnRlcm1lZGlhdGVUZW5zb3JJbmZvcyA9IFtdO1xuICAgIC8vIEVhZ2VybHkgdW5wYWNrIHggaW5wdXQgc2luY2UgaXQgaXMgcGFzc2VkIGluIHRvIGFsbCB0aGUgc2hhZGVycyB3aGljaFxuICAgIC8vIHJlcXVpcmUgdW5wYWNrZWQgaW5wdXRzLlxuICAgIGNvbnN0IHh0ZXhEYXRhID0gYmFja2VuZC50ZXhEYXRhLmdldCh4LmRhdGFJZCk7XG4gICAgY29uc3QgeElzUGFja2VkID0geHRleERhdGEgIT09IG51bGwgJiYgeHRleERhdGEuaXNQYWNrZWQ7XG4gICAgbGV0IHhVblBhY2tlZCA9IHg7XG4gICAgaWYgKHhJc1BhY2tlZCkge1xuICAgICAgeFVuUGFja2VkID0gYmFja2VuZC51bnBhY2tUZW5zb3IoeCk7XG4gICAgICBpbnRlcm1lZGlhdGVUZW5zb3JJbmZvcy5wdXNoKHhVblBhY2tlZCk7XG4gICAgfVxuXG4gICAgY29uc3QgW291dFNoYXBlLCByZWR1Y2VTaGFwZV0gPVxuICAgICAgICBiYWNrZW5kX3V0aWwuY29tcHV0ZU91dEFuZFJlZHVjZVNoYXBlcyh4VW5QYWNrZWQuc2hhcGUsIGF4ZXMpO1xuICAgIGNvbnN0IGluU2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShyZWR1Y2VTaGFwZSk7XG4gICAgY29uc3QgYTJEID0gcmVzaGFwZShcbiAgICAgICAge2lucHV0czoge3g6IHhVblBhY2tlZH0sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IFstMSwgaW5TaXplXX19KTtcbiAgICBpbnRlcm1lZGlhdGVUZW5zb3JJbmZvcy5wdXNoKGEyRCk7XG5cbiAgICBjb25zdCByZWR1Y2VkID0gYXJnUmVkdWNlKGJhY2tlbmQsIGEyRCwgcmVkdWNlVHlwZSk7XG4gICAgaW50ZXJtZWRpYXRlVGVuc29ySW5mb3MucHVzaChyZWR1Y2VkKTtcbiAgICBjb25zdCByZXNoYXBlZCA9XG4gICAgICAgIHJlc2hhcGUoe2lucHV0czoge3g6IHJlZHVjZWR9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBvdXRTaGFwZX19KTtcblxuICAgIGludGVybWVkaWF0ZVRlbnNvckluZm9zLmZvckVhY2goXG4gICAgICAgIHQgPT4gYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh0KSk7XG4gICAgcmV0dXJuIHJlc2hhcGVkO1xuICB9XG4gIHJldHVybiBhcmdSZWR1Y2VQYWNrZWQoYmFja2VuZCwgeCwgcmVkdWNlVHlwZSk7XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7VGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7VW5hcnlPcFByb2dyYW19IGZyb20gJy4uL3VuYXJ5b3BfZ3B1JztcblxuY29uc3QgVE9fSU5UID0gYHJldHVybiBmbG9hdChpbnQoeCkpO2A7XG5cbmV4cG9ydCBmdW5jdGlvbiBpbnQoaW5wdXQ6IFRlbnNvckluZm8sIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wpOiBUZW5zb3JJbmZvIHtcbiAgY29uc3QgcHJvZ3JhbSA9IG5ldyBVbmFyeU9wUHJvZ3JhbShpbnB1dC5zaGFwZSwgVE9fSU5UKTtcbiAgY29uc3Qgb3V0cHV0ID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW2lucHV0XSwgJ2ludDMyJyk7XG4gIHJldHVybiB7ZGF0YUlkOiBvdXRwdXQuZGF0YUlkLCBzaGFwZTogb3V0cHV0LnNoYXBlLCBkdHlwZTogb3V0cHV0LmR0eXBlfTtcbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIEJpbmFyeUlucHV0cywgRGF0YVR5cGUsIGVudiwgS2VybmVsRnVuYywgVHlwZWRBcnJheSwgVW5hcnlJbnB1dHMsIHVwY2FzdFR5cGV9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge0JpbmFyeU9wUHJvZ3JhbX0gZnJvbSAnLi4vYmluYXJ5b3BfZ3B1JztcbmltcG9ydCB7QmluYXJ5T3BQYWNrZWRQcm9ncmFtfSBmcm9tICcuLi9iaW5hcnlvcF9wYWNrZWRfZ3B1JztcbmltcG9ydCB7Y29tcGxleH0gZnJvbSAnLi4va2VybmVscy9Db21wbGV4JztcbmltcG9ydCB7TEVBS1lSRUxVLCBMRUFLWVJFTFVfUEFDS0VEfSBmcm9tICcuLi9rZXJuZWxzL0xlYWt5UmVsdSc7XG5pbXBvcnQge1BSRUxVLCBQUkVMVV9QQUNLRUR9IGZyb20gJy4uL2tlcm5lbHMvUHJlbHUnO1xuaW1wb3J0ICogYXMgdW5hcnlfb3AgZnJvbSAnLi4vdW5hcnlvcF9ncHUnO1xuaW1wb3J0IHtVbmFyeU9wUHJvZ3JhbX0gZnJvbSAnLi4vdW5hcnlvcF9ncHUnO1xuaW1wb3J0ICogYXMgdW5hcnlfcGFja2VkX29wIGZyb20gJy4uL3VuYXJ5b3BfcGFja2VkX2dwdSc7XG5pbXBvcnQge1VuYXJ5T3BQYWNrZWRQcm9ncmFtfSBmcm9tICcuLi91bmFyeW9wX3BhY2tlZF9ncHUnO1xuXG5pbXBvcnQge1NpbXBsZUJpbmFyeUtlcm5lbEltcGxDUFUsIFNpbXBsZVVuYXJ5S2VybmVsSW1wbENQVX0gZnJvbSAnLi9zaGFyZWQnO1xuXG5leHBvcnQgY29uc3QgQ0hFQ0tfTkFOX1NOSVBQRVRfVU5BUlkgPSBgaWYgKGlzbmFuKHgpKSByZXR1cm4geDtgO1xuXG5leHBvcnQgY29uc3QgQ0hFQ0tfTkFOX1NOSVBQRVRfQklOQVJZID0gYFxuICBpZiAoaXNuYW4oYSkpIHJldHVybiBhO1xuICBpZiAoaXNuYW4oYikpIHJldHVybiBiO1xuYDtcblxuZXhwb3J0IGNvbnN0IENIRUNLX05BTl9TTklQUEVUX0JJTkFSWV9QQUNLRUQgPSBgXG4gIHJlc3VsdC5yID0gaXNOYU4uciA+IDAuID8gTkFOIDogcmVzdWx0LnI7XG4gIHJlc3VsdC5nID0gaXNOYU4uZyA+IDAuID8gTkFOIDogcmVzdWx0Lmc7XG4gIHJlc3VsdC5iID0gaXNOYU4uYiA+IDAuID8gTkFOIDogcmVzdWx0LmI7XG4gIHJlc3VsdC5hID0gaXNOYU4uYSA+IDAuID8gTkFOIDogcmVzdWx0LmE7XG5gO1xuXG50eXBlIFVuYXJ5S2VybmVsRnVuY0NvbmZpZyA9IHtcbiAgb3BTbmlwcGV0OiBzdHJpbmcsXG4gIHBhY2tlZE9wU25pcHBldD86IHN0cmluZyxcbiAgY3B1S2VybmVsSW1wbD86IFNpbXBsZVVuYXJ5S2VybmVsSW1wbENQVSxcbiAgZHR5cGU/OiBEYXRhVHlwZVxufTtcblxuLyoqXG4gKiBUZW1wbGF0ZSB0aGF0IGNyZWF0ZXMgYSBgS2VybmVsRnVuY2AgZm9yIHVuYXJ5IG9wcy5cbiAqIEBwYXJhbSBvcFNuaXBwZXQgT3Agc25pcHBldCB0byBjcmVhdGUgYFVuYXJ5T3BQcm9ncmFtYC5cbiAqIEBwYXJhbSBwYWNrZWRPcFNuaXBwZXQgT3Agc25pcHBldCB0byBjcmVhdGUgYFVuYXJ5T3BQYWNrZWRQcm9ncmFtYC5cbiAqIEBwYXJhbSBkdHlwZSBPcHRpb25hbC4gSWYgc2V0LCB0aGUgcmVzdWx0IGhhcyB0aGlzIGR0eXBlLiBPdGhlcndpc2UsIHRoZVxuICogICAgIHJlc3VsdCBoYXMgdGhlIHNhbWUgZHR5cGUgYXMgdGhlIGZpcnN0IGlucHV0LiBUaGlzIGlzIG1haW5seSB1c2VkIGluXG4gKiAgICAgY29tcGFyaXNvbiBrZXJuZWxzLCBzdWNoIGFzIEVxdWFsLCBMZXNzLCBHcmVhdGVyLCBldGMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmFyeUtlcm5lbEZ1bmMoXG4gICAge29wU25pcHBldCwgcGFja2VkT3BTbmlwcGV0LCBjcHVLZXJuZWxJbXBsLCBkdHlwZX06IFVuYXJ5S2VybmVsRnVuY0NvbmZpZyk6XG4gICAgS2VybmVsRnVuYyB7XG4gIHJldHVybiAoe2lucHV0cywgYmFja2VuZH0pID0+IHtcbiAgICBjb25zdCB7eH0gPSBpbnB1dHMgYXMgVW5hcnlJbnB1dHM7XG4gICAgY29uc3Qgd2ViZ2xCYWNrZW5kID0gYmFja2VuZCBhcyBNYXRoQmFja2VuZFdlYkdMO1xuXG4gICAgY29uc3QgJGR0eXBlID0gZHR5cGUgfHwgeC5kdHlwZTtcbiAgICBpZiAod2ViZ2xCYWNrZW5kLnNob3VsZEV4ZWN1dGVPbkNQVShbeF0pICYmIGNwdUtlcm5lbEltcGwgIT0gbnVsbCkge1xuICAgICAgY29uc3QgeERhdGEgPSB3ZWJnbEJhY2tlbmQudGV4RGF0YS5nZXQoeC5kYXRhSWQpO1xuICAgICAgY29uc3Qgb3V0VmFsdWVzID0gY3B1S2VybmVsSW1wbCh4RGF0YS52YWx1ZXMgYXMgVHlwZWRBcnJheSwgJGR0eXBlKTtcbiAgICAgIHJldHVybiB3ZWJnbEJhY2tlbmQubWFrZVRlbnNvckluZm8oeC5zaGFwZSwgJGR0eXBlLCBvdXRWYWx1ZXMpO1xuICAgIH1cblxuICAgIGNvbnN0IHNob3VsZFVzZVBhY2tlZFByb2dyYW0gPVxuICAgICAgICBlbnYoKS5nZXRCb29sKCdXRUJHTF9QQUNLX1VOQVJZX09QRVJBVElPTlMnKSAmJiBwYWNrZWRPcFNuaXBwZXQgIT0gbnVsbDtcbiAgICBsZXQgcHJvZ3JhbTogVW5hcnlPcFByb2dyYW18VW5hcnlPcFBhY2tlZFByb2dyYW07XG4gICAgaWYgKHNob3VsZFVzZVBhY2tlZFByb2dyYW0pIHtcbiAgICAgIHByb2dyYW0gPSBuZXcgVW5hcnlPcFBhY2tlZFByb2dyYW0oeC5zaGFwZSwgcGFja2VkT3BTbmlwcGV0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvZ3JhbSA9IG5ldyBVbmFyeU9wUHJvZ3JhbSh4LnNoYXBlLCBvcFNuaXBwZXQpO1xuICAgIH1cblxuICAgIHJldHVybiB3ZWJnbEJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFt4XSwgJGR0eXBlKTtcbiAgfTtcbn1cblxudHlwZSBCaW5hcnlLZXJuZWxGdW5jQ29uZmlnID0ge1xuICBvcFNuaXBwZXQ6IHN0cmluZyxcbiAgcGFja2VkT3BTbmlwcGV0Pzogc3RyaW5nLFxuICBjaGVja091dE9mQm91bmRzPzogYm9vbGVhbixcbiAgc3VwcG9ydHNDb21wbGV4PzogYm9vbGVhbixcbiAgY3B1S2VybmVsSW1wbD86IFNpbXBsZUJpbmFyeUtlcm5lbEltcGxDUFUsXG4gIGR0eXBlPzogRGF0YVR5cGVcbn07XG5cbi8qKlxuICogVGVtcGxhdGUgdGhhdCBjcmVhdGVzIGEgYEtlcm5lbEZ1bmNgIGZvciBiaW5hcnkgb3BzLlxuICogQHBhcmFtIG9wU25pcHBldCBPcCBzbmlwcGV0IHRvIGNyZWF0ZSBgQmluYXJ5T3BQcm9ncmFtYC5cbiAqIEBwYXJhbSBwYWNrZWRPcFNuaXBwZXQgT3Agc25pcHBldCB0byBjcmVhdGUgYEJpbmFyeU9wUGFja2VkUHJvZ3JhbWAuXG4gKiBAcGFyYW0gY2hlY2tPdXRPZkJvdW5kc0ZvclBhY2tlZFByb2dyYW0gV2hldGhlciB0byBzZXQgY2hlY2tPdXRPZkJvdW5kcz10cnVlXG4gKiAgICAgd2hlbiBjcmVhdGluZyBCaW5hcnlPcFBhY2tlZFByb2dyYW0uXG4gKiBAcGFyYW0gZHR5cGUgT3B0aW9uYWwuIElmIHNldCwgdGhlIHJlc3VsdCBoYXMgdGhpcyBkdHlwZS4gT3RoZXJ3aXNlLCB0aGVcbiAqICAgICByZXN1bHQgaGFzIHRoZSBzYW1lIGR0eXBlIGFzIHRoZSBmaXJzdCBpbnB1dC4gVGhpcyBpcyBtYWlubHkgdXNlZCBpblxuICogICAgIGNvbXBhcmlzb24ga2VybmVscywgc3VjaCBhcyBFcXVhbCwgTGVzcywgR3JlYXRlciwgZXRjLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYmluYXJ5S2VybmVsRnVuYyh7XG4gIG9wU25pcHBldCxcbiAgcGFja2VkT3BTbmlwcGV0LFxuICBjaGVja091dE9mQm91bmRzID0gZmFsc2UsXG4gIHN1cHBvcnRzQ29tcGxleCA9IGZhbHNlLFxuICBjcHVLZXJuZWxJbXBsLFxuICBkdHlwZVxufTogQmluYXJ5S2VybmVsRnVuY0NvbmZpZyk6IEtlcm5lbEZ1bmMge1xuICByZXR1cm4gKHtpbnB1dHMsIGJhY2tlbmR9KSA9PiB7XG4gICAgY29uc3Qge2EsIGJ9ID0gaW5wdXRzIGFzIEJpbmFyeUlucHV0cztcbiAgICBjb25zdCB3ZWJnbEJhY2tlbmQgPSBiYWNrZW5kIGFzIE1hdGhCYWNrZW5kV2ViR0w7XG5cbiAgICBpZiAoc3VwcG9ydHNDb21wbGV4ICYmIGEuZHR5cGUgPT09ICdjb21wbGV4NjQnKSB7XG4gICAgICBjb25zdCBhRGF0YSA9IHdlYmdsQmFja2VuZC50ZXhEYXRhLmdldChhLmRhdGFJZCk7XG4gICAgICBjb25zdCBiRGF0YSA9IHdlYmdsQmFja2VuZC50ZXhEYXRhLmdldChiLmRhdGFJZCk7XG5cbiAgICAgIGNvbnN0IFtyZWFsLCBpbWFnXSA9IFtcbiAgICAgICAgW2FEYXRhLmNvbXBsZXhUZW5zb3JJbmZvcy5yZWFsLCBiRGF0YS5jb21wbGV4VGVuc29ySW5mb3MucmVhbF0sXG4gICAgICAgIFthRGF0YS5jb21wbGV4VGVuc29ySW5mb3MuaW1hZywgYkRhdGEuY29tcGxleFRlbnNvckluZm9zLmltYWddXG4gICAgICBdLm1hcChjb21wbGV4UGFydHMgPT4ge1xuICAgICAgICBjb25zdCBbYVBhcnQsIGJQYXJ0XSA9IGNvbXBsZXhQYXJ0cztcblxuICAgICAgICBjb25zdCBhSGFuZGxlID0ge1xuICAgICAgICAgIGRhdGFJZDogYVBhcnQuZGF0YUlkLFxuICAgICAgICAgIGR0eXBlOiBhUGFydC5kdHlwZSxcbiAgICAgICAgICBzaGFwZTogYS5zaGFwZVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBiSGFuZGxlID0ge1xuICAgICAgICAgIGRhdGFJZDogYlBhcnQuZGF0YUlkLFxuICAgICAgICAgIGR0eXBlOiBiUGFydC5kdHlwZSxcbiAgICAgICAgICBzaGFwZTogYi5zaGFwZVxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHByb2dyYW0gPSBuZXcgQmluYXJ5T3BQcm9ncmFtKG9wU25pcHBldCwgYS5zaGFwZSwgYi5zaGFwZSk7XG4gICAgICAgIHJldHVybiB3ZWJnbEJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKFxuICAgICAgICAgICAgcHJvZ3JhbSwgW2FIYW5kbGUsIGJIYW5kbGVdLCB1cGNhc3RUeXBlKGFQYXJ0LmR0eXBlLCBiUGFydC5kdHlwZSkpO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGNvbXBsZXhPdXRwdXQgPVxuICAgICAgICAgIGNvbXBsZXgoe2lucHV0czoge3JlYWwsIGltYWd9LCBiYWNrZW5kOiB3ZWJnbEJhY2tlbmR9KTtcblxuICAgICAgd2ViZ2xCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlYWwpO1xuICAgICAgd2ViZ2xCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGltYWcpO1xuXG4gICAgICAvLyBUT0RPKGFubnhpbmd5dWFuKTogSW1wbGVtZW50IENQVSBmb3J3YXJkaW5nIGZvciBjb21wbGV4IGlucHV0cy5cblxuICAgICAgcmV0dXJuIGNvbXBsZXhPdXRwdXQ7XG4gICAgfVxuXG4gICAgY29uc3QgJGR0eXBlID0gZHR5cGUgfHwgdXBjYXN0VHlwZShhLmR0eXBlLCBiLmR0eXBlKTtcbiAgICBpZiAoKGEuZHR5cGUgPT09ICdzdHJpbmcnIHx8IGIuZHR5cGUgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICB3ZWJnbEJhY2tlbmQuc2hvdWxkRXhlY3V0ZU9uQ1BVKFthLCBiXSkpICYmXG4gICAgICAgIGNwdUtlcm5lbEltcGwgIT0gbnVsbCkge1xuICAgICAgY29uc3QgYVZhbHMgPSB3ZWJnbEJhY2tlbmQudGV4RGF0YS5nZXQoYS5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuICAgICAgY29uc3QgYlZhbHMgPSB3ZWJnbEJhY2tlbmQudGV4RGF0YS5nZXQoYi5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuXG4gICAgICBjb25zdCBkZWNvZGVkQVZhbHMgPSBhLmR0eXBlID09PSAnc3RyaW5nJyA/XG4gICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1hbnlcbiAgICAgICAgICBiYWNrZW5kX3V0aWwuZnJvbVVpbnQ4VG9TdHJpbmdBcnJheShhVmFscyBhcyBhbnkgYXMgVWludDhBcnJheVtdKSA6XG4gICAgICAgICAgYVZhbHM7XG4gICAgICBjb25zdCBkZWNvZGVkQlZhbHMgPSBhLmR0eXBlID09PSAnc3RyaW5nJyA/XG4gICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1hbnlcbiAgICAgICAgICBiYWNrZW5kX3V0aWwuZnJvbVVpbnQ4VG9TdHJpbmdBcnJheShiVmFscyBhcyBhbnkgYXMgVWludDhBcnJheVtdKSA6XG4gICAgICAgICAgYlZhbHM7XG4gICAgICBjb25zdCBbb3V0VmFsdWVzLCBvdXRTaGFwZV0gPVxuICAgICAgICAgIGNwdUtlcm5lbEltcGwoYS5zaGFwZSwgYi5zaGFwZSwgZGVjb2RlZEFWYWxzLCBkZWNvZGVkQlZhbHMsICRkdHlwZSk7XG5cbiAgICAgIGNvbnN0IG91dCA9IHdlYmdsQmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRTaGFwZSwgJGR0eXBlKTtcbiAgICAgIGNvbnN0IG91dERhdGEgPSB3ZWJnbEJhY2tlbmQudGV4RGF0YS5nZXQob3V0LmRhdGFJZCk7XG4gICAgICBvdXREYXRhLnZhbHVlcyA9IG91dFZhbHVlcztcbiAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuXG4gICAgY29uc3Qgc2hvdWxkVXNlUGFja2VkUHJvZ3JhbSA9XG4gICAgICAgIGVudigpLmdldEJvb2woJ1dFQkdMX1BBQ0tfQklOQVJZX09QRVJBVElPTlMnKSAmJlxuICAgICAgICBwYWNrZWRPcFNuaXBwZXQgIT0gbnVsbDtcbiAgICBsZXQgcHJvZ3JhbTogQmluYXJ5T3BQcm9ncmFtfEJpbmFyeU9wUGFja2VkUHJvZ3JhbTtcbiAgICBpZiAoc2hvdWxkVXNlUGFja2VkUHJvZ3JhbSkge1xuICAgICAgcHJvZ3JhbSA9IG5ldyBCaW5hcnlPcFBhY2tlZFByb2dyYW0oXG4gICAgICAgICAgcGFja2VkT3BTbmlwcGV0LCBhLnNoYXBlLCBiLnNoYXBlLCBjaGVja091dE9mQm91bmRzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvZ3JhbSA9IG5ldyBCaW5hcnlPcFByb2dyYW0ob3BTbmlwcGV0LCBhLnNoYXBlLCBiLnNoYXBlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gd2ViZ2xCYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbYSwgYl0sICRkdHlwZSk7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXBBY3RpdmF0aW9uVG9TaGFkZXJQcm9ncmFtKFxuICAgIGFjdGl2YXRpb246IGJhY2tlbmRfdXRpbC5BY3RpdmF0aW9uLCBwYWNrZWQgPSBmYWxzZSk6IHN0cmluZyB7XG4gIGlmIChhY3RpdmF0aW9uID09PSAnbGluZWFyJykge1xuICAgIGlmIChwYWNrZWQpIHtcbiAgICAgIHJldHVybiB1bmFyeV9wYWNrZWRfb3AuTElORUFSO1xuICAgIH1cbiAgICByZXR1cm4gdW5hcnlfb3AuTElORUFSO1xuICB9IGVsc2UgaWYgKGFjdGl2YXRpb24gPT09ICdyZWx1Jykge1xuICAgIGlmIChwYWNrZWQpIHtcbiAgICAgIHJldHVybiB1bmFyeV9wYWNrZWRfb3AuUkVMVTtcbiAgICB9XG4gICAgcmV0dXJuIHVuYXJ5X29wLlJFTFU7XG4gIH0gZWxzZSBpZiAoYWN0aXZhdGlvbiA9PT0gJ2VsdScpIHtcbiAgICBpZiAocGFja2VkKSB7XG4gICAgICByZXR1cm4gdW5hcnlfcGFja2VkX29wLkVMVTtcbiAgICB9XG4gICAgcmV0dXJuIHVuYXJ5X29wLkVMVTtcbiAgfSBlbHNlIGlmIChhY3RpdmF0aW9uID09PSAncmVsdTYnKSB7XG4gICAgaWYgKHBhY2tlZCkge1xuICAgICAgcmV0dXJuIHVuYXJ5X3BhY2tlZF9vcC5SRUxVNjtcbiAgICB9XG4gICAgcmV0dXJuIHVuYXJ5X29wLlJFTFU2O1xuICB9IGVsc2UgaWYgKGFjdGl2YXRpb24gPT09ICdwcmVsdScpIHtcbiAgICBpZiAocGFja2VkKSB7XG4gICAgICByZXR1cm4gUFJFTFVfUEFDS0VEO1xuICAgIH1cbiAgICByZXR1cm4gUFJFTFU7XG4gIH0gZWxzZSBpZiAoYWN0aXZhdGlvbiA9PT0gJ2xlYWt5cmVsdScpIHtcbiAgICBpZiAocGFja2VkKSB7XG4gICAgICByZXR1cm4gTEVBS1lSRUxVX1BBQ0tFRDtcbiAgICB9XG4gICAgcmV0dXJuIExFQUtZUkVMVTtcbiAgfSBlbHNlIGlmIChhY3RpdmF0aW9uID09PSAnc2lnbW9pZCcpIHtcbiAgICBpZiAocGFja2VkKSB7XG4gICAgICByZXR1cm4gdW5hcnlfcGFja2VkX29wLlNJR01PSUQ7XG4gICAgfVxuICAgIHJldHVybiB1bmFyeV9vcC5TSUdNT0lEO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihgQWN0aXZhdGlvbiAke1xuICAgICAgYWN0aXZhdGlvbn0gaGFzIG5vdCBiZWVuIGltcGxlbWVudGVkIGZvciB0aGUgV2ViR0wgYmFja2VuZC5gKTtcbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIERhdGFUeXBlLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtNZWFuUHJvZ3JhbX0gZnJvbSAnLi4vbWVhbl9ncHUnO1xuaW1wb3J0IHtSZWR1Y2VQcm9ncmFtfSBmcm9tICcuLi9yZWR1Y2VfZ3B1JztcblxudHlwZSBSZWR1Y2VUeXBlcyA9ICdhbGwnfCdhbnknfCdtYXgnfCdtaW4nfCdzdW0nfCdwcm9kJ3wnbWVhbic7XG5cbi8vIFJldHVybnMgYW4gYXJyYXkgb2YgY29uZmlndXJhdGlvbiBvYmplY3RzIHRoYXQgZGVzY3JpYmUgZWFjaCBzdGFnZSBvZiB0aGVcbi8vIHJlZHVjdGlvbi5cbmZ1bmN0aW9uIGdldFJlZHVjdGlvblN0YWdlcyhpblNoYXBlOiBudW1iZXJbXSk6XG4gICAgQXJyYXk8e2luU2l6ZTogbnVtYmVyLCB3aW5kb3dTaXplOiBudW1iZXIsIG91dFNpemU6IG51bWJlcn0+IHtcbiAgY29uc3Qgc3RhZ2VzID0gW107XG5cbiAgd2hpbGUgKHN0YWdlcy5sZW5ndGggPT09IDAgfHwgc3RhZ2VzW3N0YWdlcy5sZW5ndGggLSAxXS5vdXRTaXplICE9PSAxKSB7XG4gICAgY29uc3Qgb3V0U2l6ZTogbnVtYmVyID1cbiAgICAgICAgc3RhZ2VzLmxlbmd0aCA/IHN0YWdlc1tzdGFnZXMubGVuZ3RoIC0gMV0ub3V0U2l6ZSA6IGluU2hhcGVbMV07XG4gICAgY29uc3Qgd2luZG93U2l6ZSA9IGJhY2tlbmRfdXRpbC5jb21wdXRlT3B0aW1hbFdpbmRvd1NpemUob3V0U2l6ZSk7XG4gICAgc3RhZ2VzLnB1c2goe1xuICAgICAgaW5TaXplOiBvdXRTaXplLFxuICAgICAgd2luZG93U2l6ZSxcbiAgICAgIG91dFNpemU6IE1hdGguY2VpbChvdXRTaXplIC8gd2luZG93U2l6ZSlcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBzdGFnZXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWR1Y2UoXG4gICAgeDogVGVuc29ySW5mbywgZHR5cGU6IERhdGFUeXBlLCByZWR1Y3Rpb25UeXBlOiBSZWR1Y2VUeXBlcyxcbiAgICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMKTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHJlZHVjdGlvblN0YWdlcyA9IGdldFJlZHVjdGlvblN0YWdlcyh4LnNoYXBlKTtcblxuICBsZXQgcmVzdWx0ID0geDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByZWR1Y3Rpb25TdGFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCB7aW5TaXplLCB3aW5kb3dTaXplLCBvdXRTaXplfSA9IHJlZHVjdGlvblN0YWdlc1tpXTtcblxuICAgIGxldCBwcm9ncmFtOiBSZWR1Y2VQcm9ncmFtfE1lYW5Qcm9ncmFtO1xuICAgIGxldCBwcmV2aW91c1Jlc3VsdDogVGVuc29ySW5mbztcbiAgICBpZiAocmVkdWN0aW9uVHlwZSA9PT0gJ21lYW4nKSB7XG4gICAgICBwcm9ncmFtID0gaSA9PT0gMCA/XG4gICAgICAgICAgbmV3IE1lYW5Qcm9ncmFtKFxuICAgICAgICAgICAgICB7d2luZG93U2l6ZSwgaW5TaXplLCBiYXRjaFNpemU6IHguc2hhcGVbMF0sIG91dFNpemV9LCBpblNpemUpIDpcbiAgICAgICAgICBuZXcgTWVhblByb2dyYW0oe3dpbmRvd1NpemUsIGluU2l6ZSwgYmF0Y2hTaXplOiB4LnNoYXBlWzBdLCBvdXRTaXplfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2dyYW0gPSBuZXcgUmVkdWNlUHJvZ3JhbShcbiAgICAgICAgICB7d2luZG93U2l6ZSwgaW5TaXplLCBiYXRjaFNpemU6IHguc2hhcGVbMF0sIG91dFNpemV9LCByZWR1Y3Rpb25UeXBlKTtcbiAgICB9XG5cbiAgICBwcmV2aW91c1Jlc3VsdCA9IHJlc3VsdDtcbiAgICByZXN1bHQgPSBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbcmVzdWx0XSwgZHR5cGUpO1xuXG4gICAgaWYgKHByZXZpb3VzUmVzdWx0LmRhdGFJZCAhPT0geC5kYXRhSWQpIHtcbiAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocHJldmlvdXNSZXN1bHQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7VGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7UmVzaGFwZVBhY2tlZFByb2dyYW19IGZyb20gJy4uL3Jlc2hhcGVfcGFja2VkX2dwdSc7XG5pbXBvcnQge2dldEJhdGNoRGltLCBnZXRSb3dzQ29sc30gZnJvbSAnLi4vd2ViZ2xfdXRpbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBwYWNrZWRSZXNoYXBlKFxuICAgIGlucHV0OiBUZW5zb3JJbmZvLCBhZnRlclNoYXBlOiBudW1iZXJbXSxcbiAgICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMKTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IGlucHV0M0RTaGFwZSA9XG4gICAgICBbZ2V0QmF0Y2hEaW0oaW5wdXQuc2hhcGUpLFxuICAgICAgIC4uLmdldFJvd3NDb2xzKGlucHV0LnNoYXBlKV0gYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuICBjb25zdCBpbnB1dDNEOiBUZW5zb3JJbmZvID0ge1xuICAgIGR0eXBlOiBpbnB1dC5kdHlwZSxcbiAgICBzaGFwZTogaW5wdXQzRFNoYXBlLFxuICAgIGRhdGFJZDogaW5wdXQuZGF0YUlkXG4gIH07XG4gIGNvbnN0IGFmdGVyU2hhcGVBczNEID1cbiAgICAgIFtnZXRCYXRjaERpbShhZnRlclNoYXBlKSxcbiAgICAgICAuLi5nZXRSb3dzQ29scyhhZnRlclNoYXBlKV0gYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuXG4gIGNvbnN0IHByb2dyYW0gPSBuZXcgUmVzaGFwZVBhY2tlZFByb2dyYW0oYWZ0ZXJTaGFwZUFzM0QsIGlucHV0M0RTaGFwZSk7XG4gIGNvbnN0IHByZXZlbnRFYWdlclVucGFja2luZ09mT3V0cHV0ID0gdHJ1ZTtcbiAgY29uc3QgY3VzdG9tVmFsdWVzID0gW2lucHV0M0RTaGFwZV07XG4gIGNvbnN0IG91dHB1dCA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKFxuICAgICAgcHJvZ3JhbSwgW2lucHV0M0RdLCBpbnB1dC5kdHlwZSwgY3VzdG9tVmFsdWVzLFxuICAgICAgcHJldmVudEVhZ2VyVW5wYWNraW5nT2ZPdXRwdXQpO1xuICByZXR1cm4ge2RhdGFJZDogb3V0cHV0LmRhdGFJZCwgc2hhcGU6IGFmdGVyU2hhcGUsIGR0eXBlOiBvdXRwdXQuZHR5cGV9O1xufVxuIiwiXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8vIEltcG9ydCBzaGFyZWQgZnVuY3Rpb25hbGl0eSBmcm9tIHRmanMtYmFja2VuZC1jcHUgd2l0aG91dCB0cmlnZ2VyaW5nXG4vLyBzaWRlIGVmZmVjdHMuXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWltcG9ydHMtZnJvbS1kaXN0XG5pbXBvcnQgKiBhcyBzaGFyZWQgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L3NoYXJlZCc7XG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWltcG9ydHMtZnJvbS1kaXN0XG5pbXBvcnQge1NpbXBsZUJpbmFyeUtlcm5lbEltcGx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9zaGFyZWQnO1xuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1pbXBvcnRzLWZyb20tZGlzdFxuaW1wb3J0IHtTaW1wbGVVbmFyeUltcGx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC91dGlscy91bmFyeV90eXBlcyc7XG5cbmV4cG9ydCB0eXBlIFNpbXBsZUJpbmFyeUtlcm5lbEltcGxDUFUgPSBTaW1wbGVCaW5hcnlLZXJuZWxJbXBsO1xuZXhwb3J0IHR5cGUgU2ltcGxlVW5hcnlLZXJuZWxJbXBsQ1BVID0gU2ltcGxlVW5hcnlJbXBsO1xuY29uc3Qge1xuICBhZGRJbXBsOiBhZGRJbXBsQ1BVLFxuICBiaW5jb3VudEltcGw6IGJpbmNvdW50SW1wbENQVSxcbiAgYmluY291bnRSZWR1Y2VJbXBsOiBiaW5jb3VudFJlZHVjZUltcGxDUFUsXG4gIGNlaWxJbXBsOiBjZWlsSW1wbENQVSxcbiAgY29uY2F0SW1wbDogY29uY2F0SW1wbENQVSxcbiAgZXF1YWxJbXBsOiBlcXVhbEltcGxDUFUsXG4gIGV4cEltcGw6IGV4cEltcGxDUFUsXG4gIGV4cG0xSW1wbDogZXhwbTFJbXBsQ1BVLFxuICBmbG9vckltcGw6IGZsb29ySW1wbENQVSxcbiAgZ2F0aGVyTmRJbXBsOiBnYXRoZXJOZEltcGxDUFUsXG4gIGdhdGhlclYySW1wbDogZ2F0aGVyVjJJbXBsQ1BVLFxuICBncmVhdGVySW1wbDogZ3JlYXRlckltcGxDUFUsXG4gIGdyZWF0ZXJFcXVhbEltcGw6IGdyZWF0ZXJFcXVhbEltcGxDUFUsXG4gIGxlc3NJbXBsOiBsZXNzSW1wbENQVSxcbiAgbGVzc0VxdWFsSW1wbDogbGVzc0VxdWFsSW1wbENQVSxcbiAgbGluU3BhY2VJbXBsOiBsaW5TcGFjZUltcGxDUFUsXG4gIGxvZ0ltcGw6IGxvZ0ltcGxDUFUsXG4gIG1heEltcGw6IG1heEltcGxDUFUsXG4gIG1heGltdW1JbXBsOiBtYXhpbXVtSW1wbENQVSxcbiAgbWluaW11bUltcGw6IG1pbmltdW1JbXBsQ1BVLFxuICBtdWx0aXBseUltcGw6IG11bHRpcGx5SW1wbENQVSxcbiAgbmVnSW1wbDogbmVnSW1wbENQVSxcbiAgbm90RXF1YWxJbXBsOiBub3RFcXVhbEltcGxDUFUsXG4gIHByb2RJbXBsOiBwcm9kSW1wbENQVSxcbiAgcmFuZ2VJbXBsOiByYW5nZUltcGxDUFUsXG4gIHJzcXJ0SW1wbDogcnNxcnRJbXBsQ1BVLFxuICBzaWdtb2lkSW1wbDogc2lnbW9pZEltcGxDUFUsXG4gIHNpbXBsZUFic0ltcGw6IHNpbXBsZUFic0ltcGxDUFUsXG4gIHNsaWNlSW1wbDogc2xpY2VJbXBsQ1BVLFxuICBzcGFyc2VGaWxsRW1wdHlSb3dzSW1wbDogc3BhcnNlRmlsbEVtcHR5Um93c0ltcGxDUFUsXG4gIHNwYXJzZVJlc2hhcGVJbXBsOiBzcGFyc2VSZXNoYXBlSW1wbENQVSxcbiAgc3BhcnNlU2VnbWVudFJlZHVjdGlvbkltcGw6IHNwYXJzZVNlZ21lbnRSZWR1Y3Rpb25JbXBsQ1BVLFxuICBzcXJ0SW1wbDogc3FydEltcGxDUFUsXG4gIHN0cmlkZWRTbGljZUltcGw6IHN0cmlkZWRTbGljZUltcGxDUFUsXG4gIHN0cmluZ05HcmFtc0ltcGw6IHN0cmluZ05HcmFtc0ltcGxDUFUsXG4gIHN0cmluZ1NwbGl0SW1wbDogc3RyaW5nU3BsaXRJbXBsQ1BVLFxuICBzdHJpbmdUb0hhc2hCdWNrZXRGYXN0SW1wbDogc3RyaW5nVG9IYXNoQnVja2V0RmFzdEltcGxDUFUsXG4gIHN1YkltcGw6IHN1YkltcGxDUFUsXG4gIHRpbGVJbXBsOiB0aWxlSW1wbENQVSxcbiAgdG9wS0ltcGw6IHRvcEtJbXBsQ1BVLFxuICB0cmFuc3Bvc2VJbXBsOiB0cmFuc3Bvc2VJbXBsQ1BVLFxuICB1bmlxdWVJbXBsOiB1bmlxdWVJbXBsQ1BVLFxufSA9IHNoYXJlZDtcblxuZXhwb3J0IHtcbiAgYWRkSW1wbENQVSxcbiAgYmluY291bnRJbXBsQ1BVLFxuICBiaW5jb3VudFJlZHVjZUltcGxDUFUsXG4gIGNlaWxJbXBsQ1BVLFxuICBjb25jYXRJbXBsQ1BVLFxuICBlcXVhbEltcGxDUFUsXG4gIGV4cEltcGxDUFUsXG4gIGV4cG0xSW1wbENQVSxcbiAgZmxvb3JJbXBsQ1BVLFxuICBnYXRoZXJOZEltcGxDUFUsXG4gIGdhdGhlclYySW1wbENQVSxcbiAgZ3JlYXRlckVxdWFsSW1wbENQVSxcbiAgZ3JlYXRlckltcGxDUFUsXG4gIGxlc3NFcXVhbEltcGxDUFUsXG4gIGxlc3NJbXBsQ1BVLFxuICBsaW5TcGFjZUltcGxDUFUsXG4gIGxvZ0ltcGxDUFUsXG4gIG1heEltcGxDUFUsXG4gIG1heGltdW1JbXBsQ1BVLFxuICBtaW5pbXVtSW1wbENQVSxcbiAgbXVsdGlwbHlJbXBsQ1BVLFxuICBuZWdJbXBsQ1BVLFxuICBub3RFcXVhbEltcGxDUFUsXG4gIHByb2RJbXBsQ1BVLFxuICBzaWdtb2lkSW1wbENQVSxcbiAgc2ltcGxlQWJzSW1wbENQVSxcbiAgc2xpY2VJbXBsQ1BVLFxuICBzcGFyc2VGaWxsRW1wdHlSb3dzSW1wbENQVSxcbiAgc3BhcnNlUmVzaGFwZUltcGxDUFUsXG4gIHNwYXJzZVNlZ21lbnRSZWR1Y3Rpb25JbXBsQ1BVLFxuICBzcXJ0SW1wbENQVSxcbiAgc3RyaWRlZFNsaWNlSW1wbENQVSxcbiAgc3RyaW5nTkdyYW1zSW1wbENQVSxcbiAgc3RyaW5nU3BsaXRJbXBsQ1BVLFxuICBzdHJpbmdUb0hhc2hCdWNrZXRGYXN0SW1wbENQVSxcbiAgc3ViSW1wbENQVSxcbiAgcmFuZ2VJbXBsQ1BVLFxuICByc3FydEltcGxDUFUsXG4gIHRpbGVJbXBsQ1BVLFxuICB0b3BLSW1wbENQVSxcbiAgdHJhbnNwb3NlSW1wbENQVSxcbiAgdW5pcXVlSW1wbENQVSxcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7QWJzLCBBYnNJbnB1dHMsIGVudiwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvLCBUeXBlZEFycmF5fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtzaW1wbGVBYnNJbXBsQ1BVfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcbmltcG9ydCB7VW5hcnlPcFByb2dyYW19IGZyb20gJy4uL3VuYXJ5b3BfZ3B1JztcbmltcG9ydCB7VW5hcnlPcFBhY2tlZFByb2dyYW19IGZyb20gJy4uL3VuYXJ5b3BfcGFja2VkX2dwdSc7XG5cbmNvbnN0IEFCUyA9IGByZXR1cm4gYWJzKHgpO2A7XG5cbmV4cG9ydCBmdW5jdGlvbiBhYnMoYXJnczoge2lucHV0czogQWJzSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmR9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuXG4gIC8vIFRPRE86IGhhbmRsZSBjYXNlcyB3aGVuIHggaXMgY29tcGxleC4gT25jZSB0aGUgY3B1IGltcGxlbWVudGF0aW9uXG4gIC8vIGNhbiBoYW5kbGUgY29tcGxleCB2YWx1ZXMsIHJlZmFjdG9yIHRvIHVzZSB1bmFyeUtlcm5lbEZ1bmMuXG4gIGlmIChiYWNrZW5kLnNob3VsZEV4ZWN1dGVPbkNQVShbeF0pICYmIHguZHR5cGUgIT09ICdjb21wbGV4NjQnKSB7XG4gICAgY29uc3QgeERhdGEgPSBiYWNrZW5kLnRleERhdGEuZ2V0KHguZGF0YUlkKTtcbiAgICBjb25zdCBvdXRWYWx1ZXMgPSBzaW1wbGVBYnNJbXBsQ1BVKHhEYXRhLnZhbHVlcyBhcyBUeXBlZEFycmF5KTtcbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyh4LnNoYXBlLCB4LmR0eXBlLCBvdXRWYWx1ZXMpO1xuICB9XG5cbiAgbGV0IHByb2dyYW06IFVuYXJ5T3BQcm9ncmFtfFVuYXJ5T3BQYWNrZWRQcm9ncmFtO1xuICBpZiAoZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUEFDS19VTkFSWV9PUEVSQVRJT05TJykpIHtcbiAgICBwcm9ncmFtID0gbmV3IFVuYXJ5T3BQYWNrZWRQcm9ncmFtKHguc2hhcGUsIEFCUyk7XG4gIH0gZWxzZSB7XG4gICAgcHJvZ3JhbSA9IG5ldyBVbmFyeU9wUHJvZ3JhbSh4LnNoYXBlLCBBQlMpO1xuICB9XG4gIHJldHVybiBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbeF0sIHguZHR5cGUpO1xufVxuXG5leHBvcnQgY29uc3QgYWJzQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEFicyxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGFicyBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0Fjb3MsIEtlcm5lbENvbmZpZ30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHt1bmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuaW1wb3J0IHtDSEVDS19OQU5fU05JUFBFVH0gZnJvbSAnLi4vdW5hcnlvcF9ncHUnO1xuXG5jb25zdCBBQ09TID0gQ0hFQ0tfTkFOX1NOSVBQRVQgKyBgXG4gIGlmIChhYnMoeCkgPiAxLikge1xuICAgIHJldHVybiBOQU47XG4gIH1cbiAgcmV0dXJuIGFjb3MoeCk7XG5gO1xuXG5leHBvcnQgY29uc3QgYWNvcyA9IHVuYXJ5S2VybmVsRnVuYyh7b3BTbmlwcGV0OiBBQ09TfSk7XG5cbmV4cG9ydCBjb25zdCBhY29zQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEFjb3MsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBhY29zLFxufTtcbiIsIlxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0Fjb3NoLCBLZXJuZWxDb25maWd9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7Q0hFQ0tfTkFOX1NOSVBQRVR9IGZyb20gJy4uL3VuYXJ5b3BfZ3B1JztcblxuY29uc3QgQUNPU0ggPSBDSEVDS19OQU5fU05JUFBFVCArIGBcbiAgaWYgKHggPCAxLjApIHJldHVybiBOQU47XG5yZXR1cm4gbG9nKHggKyBzcXJ0KHggKiB4IC0gMS4wKSk7YDtcblxuZXhwb3J0IGNvbnN0IGFjb3NoID0gdW5hcnlLZXJuZWxGdW5jKHtvcFNuaXBwZXQ6IEFDT1NIfSk7XG5cbmV4cG9ydCBjb25zdCBhY29zaENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBBY29zaCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGFjb3NoLFxufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtBZGQsIEtlcm5lbENvbmZpZ30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtiaW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7YWRkSW1wbENQVSBhcyBjcHVBZGR9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuXG5jb25zdCBBREQgPSAncmV0dXJuIGEgKyBiOyc7XG5cbmV4cG9ydCBjb25zdCBhZGRLZXJuZWxGdW5jID0gYmluYXJ5S2VybmVsRnVuYyh7XG4gIG9wU25pcHBldDogQURELFxuICBwYWNrZWRPcFNuaXBwZXQ6IEFERCxcbiAgc3VwcG9ydHNDb21wbGV4OiB0cnVlLFxuICBjcHVLZXJuZWxJbXBsOiBjcHVBZGRcbn0pO1xuXG5leHBvcnQgY29uc3QgYWRkQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEFkZCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGFkZEtlcm5lbEZ1bmNcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7QWRkTiwgQWRkTklucHV0cywgZW52LCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm8sIHVwY2FzdFR5cGV9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7QWRkTlByb2dyYW19IGZyb20gJy4uL2FkZG5fZ3B1JztcbmltcG9ydCB7QWRkTlBhY2tlZFByb2dyYW19IGZyb20gJy4uL2FkZG5fcGFja2VkX2dwdSc7XG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtpZGVudGl0eX0gZnJvbSAnLi9JZGVudGl0eSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGROKGFyZ3M6IHtpbnB1dHM6IEFkZE5JbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0x9KTpcbiAgICBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZH0gPSBhcmdzO1xuXG4gIGNvbnN0IHRlbnNvcnMgPSBpbnB1dHM7XG4gIGlmICh0ZW5zb3JzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBpZGVudGl0eSh7aW5wdXRzOiB7eDogdGVuc29yc1swXX0sIGJhY2tlbmR9KTtcbiAgfVxuXG4gIC8vIExpbWl0IHRoZSBudW1iZXIgb2YgdXBsb2FkZWQgdGV4dHVyZXMgZm9yIG9wdGltaXphdGlvbi5cbiAgaWYgKHRlbnNvcnMubGVuZ3RoID4gZW52KCkuZ2V0KCdXRUJHTF9NQVhfVEVYVFVSRVNfSU5fU0hBREVSJykpIHtcbiAgICBjb25zdCBtaWRJbmRleCA9IE1hdGguZmxvb3IodGVuc29ycy5sZW5ndGggLyAyKTtcbiAgICBjb25zdCBsZWZ0U2lkZSA9IGFkZE4oe2lucHV0czogdGVuc29ycy5zbGljZSgwLCBtaWRJbmRleCksIGJhY2tlbmR9KTtcbiAgICBjb25zdCByaWdodFNpZGUgPSBhZGROKHtpbnB1dHM6IHRlbnNvcnMuc2xpY2UobWlkSW5kZXgpLCBiYWNrZW5kfSk7XG4gICAgcmV0dXJuIGFkZE4oe2lucHV0czogW2xlZnRTaWRlLCByaWdodFNpZGVdLCBiYWNrZW5kfSk7XG4gIH1cblxuICBjb25zdCBkdHlwZSA9XG4gICAgICB0ZW5zb3JzLm1hcCh0ID0+IHQuZHR5cGUpLnJlZHVjZSgoZDEsIGQyKSA9PiB1cGNhc3RUeXBlKGQxLCBkMikpO1xuICBjb25zdCBzaGFwZXMgPSB0ZW5zb3JzLm1hcCh0ID0+IHQuc2hhcGUpO1xuICAvLyBXZSBjYW4gbWFrZSBzdXJlIHNoYXBlcyBhcmUgaWRlbnRpY2FsIGluIG9wIGxldmVsLlxuICBjb25zdCB1c2VQYWNrZWRPcCA9IGVudigpLmdldEJvb2woJ1dFQkdMX1BBQ0snKTtcbiAgY29uc3QgcHJvZ3JhbSA9IHVzZVBhY2tlZE9wID9cbiAgICAgIG5ldyBBZGROUGFja2VkUHJvZ3JhbSh0ZW5zb3JzWzBdLnNoYXBlLCBzaGFwZXMpIDpcbiAgICAgIG5ldyBBZGROUHJvZ3JhbSh0ZW5zb3JzWzBdLnNoYXBlLCBzaGFwZXMpO1xuICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgdGVuc29ycywgZHR5cGUpO1xufVxuXG5leHBvcnQgY29uc3QgYWRkTkNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBBZGROLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogYWRkTiBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0FsbCwgQWxsQXR0cnMsIEFsbElucHV0cywgYmFja2VuZF91dGlsLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge3JlZHVjZX0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3JlZHVjZSc7XG5cbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9SZXNoYXBlJztcbmltcG9ydCB7dHJhbnNwb3NlfSBmcm9tICcuL1RyYW5zcG9zZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBhbGwoXG4gICAgYXJnczoge2lucHV0czogQWxsSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLCBhdHRyczogQWxsQXR0cnN9KTpcbiAgICBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICBjb25zdCB7YXhpcywga2VlcERpbXN9ID0gYXR0cnM7XG5cbiAgY29uc3QgeFJhbmsgPSB4LnNoYXBlLmxlbmd0aDtcblxuICBjb25zdCBvcmlnQXhlcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oYXhpcywgeC5zaGFwZSk7XG4gIGxldCBheGVzID0gb3JpZ0F4ZXM7XG4gIGNvbnN0IHBlcm11dGVkQXhlcyA9IGJhY2tlbmRfdXRpbC5nZXRBeGVzUGVybXV0YXRpb24oYXhlcywgeFJhbmspO1xuICBsZXQgcGVybXV0ZWRYID0geDtcbiAgaWYgKHBlcm11dGVkQXhlcyAhPSBudWxsKSB7XG4gICAgcGVybXV0ZWRYID0gdHJhbnNwb3NlKHtpbnB1dHM6IHt4fSwgYmFja2VuZCwgYXR0cnM6IHtwZXJtOiBwZXJtdXRlZEF4ZXN9fSk7XG4gICAgYXhlcyA9IGJhY2tlbmRfdXRpbC5nZXRJbm5lck1vc3RBeGVzKGF4ZXMubGVuZ3RoLCB4UmFuayk7XG4gIH1cblxuICBiYWNrZW5kX3V0aWwuYXNzZXJ0QXhlc0FyZUlubmVyTW9zdERpbXMoJ2FsbCcsIGF4ZXMsIHhSYW5rKTtcbiAgY29uc3QgW291dFNoYXBlLCByZWR1Y2VTaGFwZV0gPVxuICAgICAgYmFja2VuZF91dGlsLmNvbXB1dGVPdXRBbmRSZWR1Y2VTaGFwZXMocGVybXV0ZWRYLnNoYXBlLCBheGVzKTtcbiAgY29uc3QgaW5TaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHJlZHVjZVNoYXBlKTtcblxuICBjb25zdCBhMkQgPVxuICAgICAgcmVzaGFwZSh7aW5wdXRzOiB7eDogcGVybXV0ZWRYfSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogWy0xLCBpblNpemVdfX0pO1xuICBjb25zdCByZWR1Y2VkID0gcmVkdWNlKGEyRCwgYTJELmR0eXBlLCAnYWxsJywgYmFja2VuZCk7XG5cbiAgbGV0IHJlcztcbiAgaWYgKGtlZXBEaW1zKSB7XG4gICAgY29uc3QgbmV3U2hhcGUgPSBiYWNrZW5kX3V0aWwuZXhwYW5kU2hhcGVUb0tlZXBEaW0ob3V0U2hhcGUsIG9yaWdBeGVzKTtcbiAgICByZXMgPSByZXNoYXBlKHtpbnB1dHM6IHt4OiByZWR1Y2VkfSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogbmV3U2hhcGV9fSk7XG4gIH0gZWxzZSB7XG4gICAgcmVzID0gcmVzaGFwZSh7aW5wdXRzOiB7eDogcmVkdWNlZH0sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IG91dFNoYXBlfX0pO1xuICB9XG5cbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhhMkQpO1xuICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlZHVjZWQpO1xuXG4gIGlmIChwZXJtdXRlZEF4ZXMgIT0gbnVsbCkge1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocGVybXV0ZWRYKTtcbiAgfVxuXG4gIHJldHVybiByZXM7XG59XG5cbmV4cG9ydCBjb25zdCBhbGxDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQWxsLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogYWxsIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7QW55LCBBbnlBdHRycywgQW55SW5wdXRzLCBiYWNrZW5kX3V0aWwsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mbywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7cmVkdWNlfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvcmVkdWNlJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9SZXNoYXBlJztcbmltcG9ydCB7dHJhbnNwb3NlfSBmcm9tICcuL1RyYW5zcG9zZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBhbnkoXG4gICAgYXJnczoge2lucHV0czogQW55SW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLCBhdHRyczogQW55QXR0cnN9KTpcbiAgICBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICBjb25zdCB7YXhpcywga2VlcERpbXN9ID0gYXR0cnM7XG5cbiAgY29uc3QgeFJhbmsgPSB4LnNoYXBlLmxlbmd0aDtcblxuICBjb25zdCBvcmlnQXhlcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oYXhpcywgeC5zaGFwZSk7XG4gIGxldCBheGVzID0gb3JpZ0F4ZXM7XG4gIGNvbnN0IHBlcm11dGVkQXhlcyA9IGJhY2tlbmRfdXRpbC5nZXRBeGVzUGVybXV0YXRpb24oYXhlcywgeFJhbmspO1xuICBsZXQgcGVybXV0ZWRYID0geDtcbiAgaWYgKHBlcm11dGVkQXhlcyAhPSBudWxsKSB7XG4gICAgcGVybXV0ZWRYID0gdHJhbnNwb3NlKHtpbnB1dHM6IHt4fSwgYmFja2VuZCwgYXR0cnM6IHtwZXJtOiBwZXJtdXRlZEF4ZXN9fSk7XG4gICAgYXhlcyA9IGJhY2tlbmRfdXRpbC5nZXRJbm5lck1vc3RBeGVzKGF4ZXMubGVuZ3RoLCB4UmFuayk7XG4gIH1cblxuICBiYWNrZW5kX3V0aWwuYXNzZXJ0QXhlc0FyZUlubmVyTW9zdERpbXMoJ2FueScsIGF4ZXMsIHhSYW5rKTtcbiAgY29uc3QgW291dFNoYXBlLCByZWR1Y2VTaGFwZV0gPVxuICAgICAgYmFja2VuZF91dGlsLmNvbXB1dGVPdXRBbmRSZWR1Y2VTaGFwZXMocGVybXV0ZWRYLnNoYXBlLCBheGVzKTtcbiAgY29uc3QgaW5TaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHJlZHVjZVNoYXBlKTtcblxuICBjb25zdCBhMkQgPVxuICAgICAgcmVzaGFwZSh7aW5wdXRzOiB7eDogcGVybXV0ZWRYfSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogWy0xLCBpblNpemVdfX0pO1xuICBjb25zdCByZWR1Y2VkID0gcmVkdWNlKGEyRCwgYTJELmR0eXBlLCAnYW55JywgYmFja2VuZCk7XG5cbiAgbGV0IHJlcztcbiAgaWYgKGtlZXBEaW1zKSB7XG4gICAgY29uc3QgbmV3U2hhcGUgPSBiYWNrZW5kX3V0aWwuZXhwYW5kU2hhcGVUb0tlZXBEaW0ob3V0U2hhcGUsIG9yaWdBeGVzKTtcbiAgICByZXMgPSByZXNoYXBlKHtpbnB1dHM6IHt4OiByZWR1Y2VkfSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogbmV3U2hhcGV9fSk7XG4gIH0gZWxzZSB7XG4gICAgcmVzID0gcmVzaGFwZSh7aW5wdXRzOiB7eDogcmVkdWNlZH0sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IG91dFNoYXBlfX0pO1xuICB9XG5cbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhhMkQpO1xuICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlZHVjZWQpO1xuXG4gIGlmIChwZXJtdXRlZEF4ZXMgIT0gbnVsbCkge1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocGVybXV0ZWRYKTtcbiAgfVxuXG4gIHJldHVybiByZXM7XG59XG5cbmV4cG9ydCBjb25zdCBhbnlDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQW55LFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogYW55IGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7QXJnTWF4LCBBcmdNYXhBdHRycywgQXJnTWF4SW5wdXRzLCBiYWNrZW5kX3V0aWwsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mbywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7YXJnTWluTWF4UmVkdWNlfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvYXJnX21pbl9tYXgnO1xuXG5pbXBvcnQge3RyYW5zcG9zZX0gZnJvbSAnLi9UcmFuc3Bvc2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gYXJnTWF4KFxuICAgIGFyZ3M6XG4gICAgICAgIHtpbnB1dHM6IEFyZ01heElucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCwgYXR0cnM6IEFyZ01heEF0dHJzfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4fSA9IGlucHV0cztcbiAgY29uc3Qge2F4aXN9ID0gYXR0cnM7XG5cbiAgbGV0IGF4ZXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKGF4aXMsIHguc2hhcGUpO1xuICBjb25zdCBwZXJtdXRlZEF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0QXhlc1Blcm11dGF0aW9uKGF4ZXMsIHguc2hhcGUubGVuZ3RoKTtcbiAgbGV0ICR4ID0geDtcbiAgY29uc3QgaW50ZXJtZWRpYXRlVGVuc29ySW5mb3MgPSBbXTtcbiAgaWYgKHBlcm11dGVkQXhlcyAhPSBudWxsKSB7XG4gICAgJHggPSB0cmFuc3Bvc2Uoe2lucHV0czoge3h9LCBiYWNrZW5kLCBhdHRyczoge3Blcm06IHBlcm11dGVkQXhlc319KTtcbiAgICBpbnRlcm1lZGlhdGVUZW5zb3JJbmZvcy5wdXNoKCR4KTtcbiAgICBheGVzID0gYmFja2VuZF91dGlsLmdldElubmVyTW9zdEF4ZXMoYXhlcy5sZW5ndGgsICR4LnNoYXBlLmxlbmd0aCk7XG4gIH1cblxuICBiYWNrZW5kX3V0aWwuYXNzZXJ0QXhlc0FyZUlubmVyTW9zdERpbXMoJ2FyZ01heCcsIFtheGVzWzBdXSwgJHguc2hhcGUubGVuZ3RoKTtcbiAgY29uc3Qgb3V0ID0gYXJnTWluTWF4UmVkdWNlKGJhY2tlbmQsICR4LCBheGVzWzBdLCAnbWF4Jyk7XG5cbiAgaW50ZXJtZWRpYXRlVGVuc29ySW5mb3MuZm9yRWFjaChcbiAgICAgIHQgPT4gYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh0KSk7XG4gIHJldHVybiBvdXQ7XG59XG5cbmV4cG9ydCBjb25zdCBhcmdNYXhDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQXJnTWF4LFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogYXJnTWF4IGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7QXJnTWluLCBBcmdNaW5BdHRycywgQXJnTWluSW5wdXRzLCBiYWNrZW5kX3V0aWwsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mbywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7YXJnTWluTWF4UmVkdWNlfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvYXJnX21pbl9tYXgnO1xuaW1wb3J0IHt0cmFuc3Bvc2V9IGZyb20gJy4vVHJhbnNwb3NlJztcblxuZXhwb3J0IGZ1bmN0aW9uIGFyZ01pbihcbiAgICBhcmdzOlxuICAgICAgICB7aW5wdXRzOiBBcmdNaW5JbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsIGF0dHJzOiBBcmdNaW5BdHRyc30pOlxuICAgIFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG4gIGNvbnN0IHtheGlzfSA9IGF0dHJzO1xuXG4gIGxldCBheGVzID0gdXRpbC5wYXJzZUF4aXNQYXJhbShheGlzLCB4LnNoYXBlKTtcbiAgY29uc3QgcGVybXV0ZWRBeGVzID0gYmFja2VuZF91dGlsLmdldEF4ZXNQZXJtdXRhdGlvbihheGVzLCB4LnNoYXBlLmxlbmd0aCk7XG4gIGxldCAkeCA9IHg7XG4gIGNvbnN0IGludGVybWVkaWF0ZVRlbnNvckluZm9zID0gW107XG4gIGlmIChwZXJtdXRlZEF4ZXMgIT0gbnVsbCkge1xuICAgICR4ID0gdHJhbnNwb3NlKHtpbnB1dHM6IHt4fSwgYmFja2VuZCwgYXR0cnM6IHtwZXJtOiBwZXJtdXRlZEF4ZXN9fSk7XG4gICAgaW50ZXJtZWRpYXRlVGVuc29ySW5mb3MucHVzaCgkeCk7XG4gICAgYXhlcyA9IGJhY2tlbmRfdXRpbC5nZXRJbm5lck1vc3RBeGVzKGF4ZXMubGVuZ3RoLCAkeC5zaGFwZS5sZW5ndGgpO1xuICB9XG5cbiAgYmFja2VuZF91dGlsLmFzc2VydEF4ZXNBcmVJbm5lck1vc3REaW1zKCdhcmdNaW4nLCBbYXhlc1swXV0sICR4LnNoYXBlLmxlbmd0aCk7XG5cbiAgY29uc3Qgb3V0ID0gYXJnTWluTWF4UmVkdWNlKGJhY2tlbmQsICR4LCBheGVzWzBdLCAnbWluJyk7XG5cbiAgaW50ZXJtZWRpYXRlVGVuc29ySW5mb3MuZm9yRWFjaChcbiAgICAgIHQgPT4gYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh0KSk7XG4gIHJldHVybiBvdXQ7XG59XG5cbmV4cG9ydCBjb25zdCBhcmdNaW5Db25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQXJnTWluLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogYXJnTWluIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7QXNpbiwgS2VybmVsQ29uZmlnfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge3VuYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5pbXBvcnQge0NIRUNLX05BTl9TTklQUEVUfSBmcm9tICcuLi91bmFyeW9wX2dwdSc7XG5cbmNvbnN0IEFTSU4gPSBDSEVDS19OQU5fU05JUFBFVCArIGBcbiAgaWYgKGFicyh4KSA+IDEuKSB7XG4gICAgcmV0dXJuIE5BTjtcbiAgfVxuICByZXR1cm4gYXNpbih4KTtcbmA7XG5cbmV4cG9ydCBjb25zdCBhc2luID0gdW5hcnlLZXJuZWxGdW5jKHtvcFNuaXBwZXQ6IEFTSU59KTtcblxuZXhwb3J0IGNvbnN0IGFzaW5Db25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQXNpbixcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGFzaW4sXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0FzaW5oLCBLZXJuZWxDb25maWd9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7Q0hFQ0tfTkFOX1NOSVBQRVR9IGZyb20gJy4uL3VuYXJ5b3BfZ3B1JztcblxuY29uc3QgQVNJTkggPSBDSEVDS19OQU5fU05JUFBFVCArIGByZXR1cm4gbG9nKHggKyBzcXJ0KHggKiB4ICsgMS4wKSk7YDtcblxuZXhwb3J0IGNvbnN0IGFzaW5oID0gdW5hcnlLZXJuZWxGdW5jKHtvcFNuaXBwZXQ6IEFTSU5IfSk7XG5cbmV4cG9ydCBjb25zdCBhc2luaENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBBc2luaCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGFzaW5oLFxufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtBdGFuLCBLZXJuZWxDb25maWd9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7Q0hFQ0tfTkFOX1NOSVBQRVR9IGZyb20gJy4uL3VuYXJ5b3BfZ3B1JztcblxuY29uc3QgQVRBTiA9IENIRUNLX05BTl9TTklQUEVUICsgYFxuICByZXR1cm4gYXRhbih4KTtcbmA7XG5cbmV4cG9ydCBjb25zdCBhdGFuID0gdW5hcnlLZXJuZWxGdW5jKHtvcFNuaXBwZXQ6IEFUQU59KTtcblxuZXhwb3J0IGNvbnN0IGF0YW5Db25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQXRhbixcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGF0YW4sXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0F0YW4yfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtLZXJuZWxDb25maWd9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7YmluYXJ5S2VybmVsRnVuYywgQ0hFQ0tfTkFOX1NOSVBQRVRfQklOQVJZLCBDSEVDS19OQU5fU05JUFBFVF9CSU5BUllfUEFDS0VEfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcblxuY29uc3QgQVRBTjIgPSBDSEVDS19OQU5fU05JUFBFVF9CSU5BUlkgKyBgXG4gIHJldHVybiBhdGFuKGEsIGIpO1xuYDtcblxuY29uc3QgQVRBTjJfUEFDS0VEID0gYFxuICB2ZWM0IHJlc3VsdCA9IGF0YW4oYSwgYik7XG4gIHZlYzQgaXNOYU4gPSBtaW4odmVjNChpc25hbihhKSkgKyB2ZWM0KGlzbmFuKGIpKSwgdmVjNCgxLjApKTtcbiAgYCArXG4gICAgQ0hFQ0tfTkFOX1NOSVBQRVRfQklOQVJZX1BBQ0tFRCArIGBcbiAgcmV0dXJuIHJlc3VsdDtcbmA7XG5cbmV4cG9ydCBjb25zdCBhdGFuMiA9XG4gICAgYmluYXJ5S2VybmVsRnVuYyh7b3BTbmlwcGV0OiBBVEFOMiwgcGFja2VkT3BTbmlwcGV0OiBBVEFOMl9QQUNLRUR9KTtcblxuZXhwb3J0IGNvbnN0IGF0YW4yQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEF0YW4yLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogYXRhbjIsXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0F0YW5oLCBLZXJuZWxDb25maWd9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7Q0hFQ0tfTkFOX1NOSVBQRVR9IGZyb20gJy4uL3VuYXJ5b3BfZ3B1JztcblxuY29uc3QgQVRBTkggPSBDSEVDS19OQU5fU05JUFBFVCArIGBcbiAgaWYgKCh4IDwgLTEuMCkgfHwgKHggPiAxLjApKSByZXR1cm4gTkFOO1xucmV0dXJuIChsb2coMS4wICsgeCkgLSBsb2coMS4wIC0geCkpIC8gMi4wO2A7XG5cbmV4cG9ydCBjb25zdCBhdGFuaCA9IHVuYXJ5S2VybmVsRnVuYyh7b3BTbmlwcGV0OiBBVEFOSH0pO1xuXG5leHBvcnQgY29uc3QgYXRhbmhDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQXRhbmgsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBhdGFuaCxcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge0F2Z1Bvb2wsIEF2Z1Bvb2xBdHRycywgQXZnUG9vbElucHV0cywgYmFja2VuZF91dGlsLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge1Bvb2wyRFByb2dyYW19IGZyb20gJy4uL3Bvb2xfZ3B1JztcbmltcG9ydCB7YXNzZXJ0Tm90Q29tcGxleH0gZnJvbSAnLi4vd2ViZ2xfdXRpbCc7XG5pbXBvcnQge2lkZW50aXR5fSBmcm9tICcuL0lkZW50aXR5JztcblxuZXhwb3J0IGZ1bmN0aW9uIGF2Z1Bvb2woYXJnczoge1xuICBpbnB1dHM6IEF2Z1Bvb2xJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsXG4gIGF0dHJzOiBBdmdQb29sQXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICBhc3NlcnROb3RDb21wbGV4KHgsICdhdmdQb29sJyk7XG4gIGNvbnN0IHtmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWQsIGRpbVJvdW5kaW5nTW9kZX0gPSBhdHRycztcbiAgY29uc3QgZGlsYXRpb25zID0gMTtcblxuICB1dGlsLmFzc2VydChcbiAgICAgIGJhY2tlbmRfdXRpbC5laXRoZXJTdHJpZGVzT3JEaWxhdGlvbnNBcmVPbmUoc3RyaWRlcywgZGlsYXRpb25zKSxcbiAgICAgICgpID0+ICdFcnJvciBpbiBhdmdQb29sOiBFaXRoZXIgc3RyaWRlcyBvciBkaWxhdGlvbnMgbXVzdCBiZSAxLiAnICtcbiAgICAgICAgICBgR290IHN0cmlkZXMgJHtzdHJpZGVzfSBhbmQgZGlsYXRpb25zICcke2RpbGF0aW9uc30nYCk7XG5cbiAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZVBvb2wyREluZm8oXG4gICAgICB4LnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLCBmaWx0ZXJTaXplLCBzdHJpZGVzLFxuICAgICAgZGlsYXRpb25zLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSk7XG4gIGlmIChjb252SW5mby5maWx0ZXJXaWR0aCA9PT0gMSAmJiBjb252SW5mby5maWx0ZXJIZWlnaHQgPT09IDEgJiZcbiAgICAgIHV0aWwuYXJyYXlzRXF1YWwoY29udkluZm8uaW5TaGFwZSwgY29udkluZm8ub3V0U2hhcGUpKSB7XG4gICAgcmV0dXJuIGlkZW50aXR5KHtpbnB1dHM6IHt4fSwgYmFja2VuZH0pO1xuICB9XG4gIGNvbnN0IGF2Z1Bvb2xQcm9ncmFtID0gbmV3IFBvb2wyRFByb2dyYW0oY29udkluZm8sICdhdmcnLCBmYWxzZSk7XG4gIHJldHVybiBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShhdmdQb29sUHJvZ3JhbSwgW3hdLCAnZmxvYXQzMicpO1xufVxuXG5leHBvcnQgY29uc3QgYXZnUG9vbENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBBdmdQb29sLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogYXZnUG9vbCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtBdmdQb29sM0QsIEF2Z1Bvb2wzREF0dHJzLCBBdmdQb29sM0RJbnB1dHMsIGJhY2tlbmRfdXRpbCwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtQb29sM0RQcm9ncmFtfSBmcm9tICcuLi9wb29sX2dwdSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBhdmdQb29sM0QoYXJnczoge1xuICBpbnB1dHM6IEF2Z1Bvb2wzRElucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IEF2Z1Bvb2wzREF0dHJzXG59KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4fSA9IGlucHV0cztcbiAgY29uc3Qge2ZpbHRlclNpemUsIHN0cmlkZXMsIHBhZCwgZGltUm91bmRpbmdNb2RlLCBkYXRhRm9ybWF0fSA9IGF0dHJzO1xuICBjb25zdCBkaWxhdGlvbnM6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9IFsxLCAxLCAxXTtcblxuICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlUG9vbDNESW5mbyhcbiAgICAgIHguc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgZmlsdGVyU2l6ZSwgc3RyaWRlcyxcbiAgICAgIGRpbGF0aW9ucywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIGRhdGFGb3JtYXQpO1xuICBjb25zdCBhdmdQb29sUHJvZ3JhbSA9IG5ldyBQb29sM0RQcm9ncmFtKGNvbnZJbmZvLCAnYXZnJywgZmFsc2UpO1xuICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0oYXZnUG9vbFByb2dyYW0sIFt4XSwgJ2Zsb2F0MzInKTtcbn1cblxuZXhwb3J0IGNvbnN0IGF2Z1Bvb2wzRENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBBdmdQb29sM0QsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBhdmdQb29sM0QgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7QXZnUG9vbDNER3JhZCwgQXZnUG9vbDNER3JhZEF0dHJzLCBBdmdQb29sM0RHcmFkSW5wdXRzLCBiYWNrZW5kX3V0aWwsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtBdmdQb29sM0RCYWNrcHJvcFByb2dyYW19IGZyb20gJy4uL2F2Z19wb29sX2JhY2twcm9wX2dwdSc7XG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuXG5leHBvcnQgZnVuY3Rpb24gYXZnUG9vbDNER3JhZChhcmdzOiB7XG4gIGlucHV0czogQXZnUG9vbDNER3JhZElucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IEF2Z1Bvb2wzREdyYWRBdHRyc1xufSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7ZHksIGlucHV0fSA9IGlucHV0cztcbiAgY29uc3QgeCA9IGlucHV0O1xuICBjb25zdCB7ZmlsdGVyU2l6ZSwgc3RyaWRlcywgcGFkLCBkaW1Sb3VuZGluZ01vZGV9ID0gYXR0cnM7XG4gIGNvbnN0IGRpbGF0aW9uczogW251bWJlciwgbnVtYmVyLCBudW1iZXJdID0gWzEsIDEsIDFdO1xuXG4gIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVQb29sM0RJbmZvKFxuICAgICAgeC5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLCBmaWx0ZXJTaXplLCBzdHJpZGVzLFxuICAgICAgZGlsYXRpb25zLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSk7XG4gIGNvbnN0IGF2Z1Bvb2xCYWNrcHJvcFByb2dyYW0gPSBuZXcgQXZnUG9vbDNEQmFja3Byb3BQcm9ncmFtKGNvbnZJbmZvKTtcbiAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKGF2Z1Bvb2xCYWNrcHJvcFByb2dyYW0sIFtkeV0sIHguZHR5cGUpO1xufVxuXG5leHBvcnQgY29uc3QgYXZnUG9vbEdyYWQzRENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBBdmdQb29sM0RHcmFkLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogYXZnUG9vbDNER3JhZCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtBdmdQb29sR3JhZCwgQXZnUG9vbEdyYWRBdHRycywgQXZnUG9vbEdyYWRJbnB1dHMsIGJhY2tlbmRfdXRpbCwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge0F2Z1Bvb2wyREJhY2twcm9wUHJvZ3JhbX0gZnJvbSAnLi4vYXZnX3Bvb2xfYmFja3Byb3BfZ3B1JztcbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge2Fzc2VydE5vdENvbXBsZXh9IGZyb20gJy4uL3dlYmdsX3V0aWwnO1xuXG5leHBvcnQgZnVuY3Rpb24gYXZnUG9vbEdyYWQoYXJnczoge1xuICBpbnB1dHM6IEF2Z1Bvb2xHcmFkSW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLFxuICBhdHRyczogQXZnUG9vbEdyYWRBdHRyc1xufSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7ZHksIGlucHV0fSA9IGlucHV0cztcbiAgY29uc3QgeCA9IGlucHV0O1xuICBhc3NlcnROb3RDb21wbGV4KFtkeSwgaW5wdXRdLCAnYXZnUG9vbEdyYWQnKTtcbiAgY29uc3Qge2ZpbHRlclNpemUsIHN0cmlkZXMsIHBhZH0gPSBhdHRycztcblxuICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlUG9vbDJESW5mbyhcbiAgICAgIHguc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIGZpbHRlclNpemUsIHN0cmlkZXMsXG4gICAgICAxIC8qIGRpbGF0aW9ucyAqLywgcGFkKTtcbiAgY29uc3QgYXZnUG9vbEJhY2twcm9wUHJvZ3JhbSA9IG5ldyBBdmdQb29sMkRCYWNrcHJvcFByb2dyYW0oY29udkluZm8pO1xuICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0oYXZnUG9vbEJhY2twcm9wUHJvZ3JhbSwgW2R5XSwgeC5kdHlwZSk7XG59XG5cbmV4cG9ydCBjb25zdCBhdmdQb29sR3JhZENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBBdmdQb29sR3JhZCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGF2Z1Bvb2xHcmFkIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7QmF0Y2hNYXRNdWwsIEJhdGNoTWF0TXVsQXR0cnMsIEJhdGNoTWF0TXVsSW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmN9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge2JhdGNoTWF0TXVsSW1wbH0gZnJvbSAnLi9CYXRjaE1hdE11bF9pbXBsJztcblxuZXhwb3J0IGZ1bmN0aW9uIGJhdGNoTWF0TXVsKGFyZ3M6IHtcbiAgaW5wdXRzOiBCYXRjaE1hdE11bElucHV0cyxcbiAgYXR0cnM6IEJhdGNoTWF0TXVsQXR0cnMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0xcbn0pIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge2EsIGJ9ID0gaW5wdXRzO1xuICBjb25zdCB7dHJhbnNwb3NlQSwgdHJhbnNwb3NlQn0gPSBhdHRycztcblxuICByZXR1cm4gYmF0Y2hNYXRNdWxJbXBsKHthLCBiLCB0cmFuc3Bvc2VBLCB0cmFuc3Bvc2VCLCBiYWNrZW5kfSk7XG59XG5cbmV4cG9ydCBjb25zdCBiYXRjaE1hdE11bENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBCYXRjaE1hdE11bCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGJhdGNoTWF0TXVsIGFzIHt9IGFzIEtlcm5lbEZ1bmMsXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgVGVuc29ySW5mbywgdXBjYXN0VHlwZSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7bWFwQWN0aXZhdGlvblRvU2hhZGVyUHJvZ3JhbX0gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5pbXBvcnQge01hdE11bFBhY2tlZFByb2dyYW19IGZyb20gJy4uL211bG1hdF9wYWNrZWRfZ3B1JztcblxuaW1wb3J0IHttdWx0aXBseX0gZnJvbSAnLi9NdWx0aXBseSc7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4vUmVzaGFwZSc7XG5pbXBvcnQge3N1bX0gZnJvbSAnLi9TdW0nO1xuaW1wb3J0IHt0cmFuc3Bvc2V9IGZyb20gJy4vVHJhbnNwb3NlJztcblxuLy8gRW1waXJpY2FsbHkgZGV0ZXJtaW5lZCBtaW5pbWFsIHNoYXJlZCBkaW1lbnNpb24gaW4gbWF0bXVsIGJlZm9yZSB3ZSBmb3J3YXJkXG4vLyB0byBhLm11bChiKS5zdW0oKSBpbiBvcmRlciB0byB0YWtlIGFkdmFudGFnZSBvZiBHUFUgcGFyYWxsZWxpc20uIFNlZVxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGZqcy1jb3JlL3B1bGwvMTM3OSBmb3IgYmVuY2htYXJrcy5cbmV4cG9ydCBjb25zdCBNQVRNVUxfU0hBUkVEX0RJTV9USFJFU0hPTEQgPSAxMDAwO1xuXG50eXBlIEJhdGNoTWF0TXVsQ29uZmlnID0ge1xuICBhOiBUZW5zb3JJbmZvLFxuICBiOiBUZW5zb3JJbmZvLFxuICB0cmFuc3Bvc2VBOiBib29sZWFuLFxuICB0cmFuc3Bvc2VCOiBib29sZWFuLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLFxuICBiaWFzPzogVGVuc29ySW5mbyxcbiAgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cz86IFRlbnNvckluZm8sXG4gIGxlYWt5cmVsdUFscGhhPzogbnVtYmVyLFxuICBhY3RpdmF0aW9uPzogYmFja2VuZF91dGlsLkFjdGl2YXRpb25cbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBiYXRjaE1hdE11bEltcGwoe1xuICBhLFxuICBiLFxuICB0cmFuc3Bvc2VBLFxuICB0cmFuc3Bvc2VCLFxuICBiYWNrZW5kLFxuICBiaWFzID0gbnVsbCxcbiAgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyA9IG51bGwsXG4gIGxlYWt5cmVsdUFscGhhID0gMCxcbiAgYWN0aXZhdGlvbiA9IG51bGxcbn06IEJhdGNoTWF0TXVsQ29uZmlnKTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IGFSYW5rID0gYS5zaGFwZS5sZW5ndGg7XG4gIGNvbnN0IGJSYW5rID0gYi5zaGFwZS5sZW5ndGg7XG5cbiAgY29uc3QgaW5uZXJTaGFwZUEgPSB0cmFuc3Bvc2VBID8gYS5zaGFwZVthUmFuayAtIDJdIDogYS5zaGFwZVthUmFuayAtIDFdO1xuICBjb25zdCBpbm5lclNoYXBlQiA9IHRyYW5zcG9zZUIgPyBiLnNoYXBlW2JSYW5rIC0gMV0gOiBiLnNoYXBlW2JSYW5rIC0gMl07XG5cbiAgY29uc3Qgb3V0ZXJTaGFwZUEgPSB0cmFuc3Bvc2VBID8gYS5zaGFwZVthUmFuayAtIDFdIDogYS5zaGFwZVthUmFuayAtIDJdO1xuICBjb25zdCBvdXRlclNoYXBlQiA9IHRyYW5zcG9zZUIgPyBiLnNoYXBlW2JSYW5rIC0gMl0gOiBiLnNoYXBlW2JSYW5rIC0gMV07XG5cbiAgY29uc3Qgb3V0ZXJEaW1zQSA9IGEuc2hhcGUuc2xpY2UoMCwgLTIpO1xuICBjb25zdCBvdXRlckRpbXNCID0gYi5zaGFwZS5zbGljZSgwLCAtMik7XG5cbiAgY29uc3QgYmF0Y2hEaW1BID0gdXRpbC5zaXplRnJvbVNoYXBlKG91dGVyRGltc0EpO1xuICBjb25zdCBiYXRjaERpbUIgPSB1dGlsLnNpemVGcm9tU2hhcGUob3V0ZXJEaW1zQik7XG5cbiAgY29uc3QgYmF0Y2hEaW1zQ29tcGF0aWJsZSA9XG4gICAgICBiYXRjaERpbUEgPT09IGJhdGNoRGltQiB8fCBiYXRjaERpbUEgPT09IDEgfHwgYmF0Y2hEaW1CID09PSAxO1xuXG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgYVJhbmsgPj0gMiAmJiBiUmFuayA+PSAyICYmIGJhdGNoRGltc0NvbXBhdGlibGUsXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gbWF0TXVsOiB0aGUgaW5wdXQgYmF0Y2ggZGltZW5zaW9ucyBtdXN0IGVpdGhlciBiZSB0aGUgYCArXG4gICAgICAgICAgYHNhbWUgb3IgYXQgbGVhc3Qgb25lIGlucHV0IGJhdGNoIGRpbWVuc2lvbiBtdXN0IGJlIDEuIEdvdCBpbnB1dCBgICtcbiAgICAgICAgICBgYmF0Y2ggZGltZW5zaW9ucyBvZiAoJHtvdXRlckRpbXNBfSkgYW5kICgke291dGVyRGltc0J9KS5gKTtcblxuICBjb25zdCBvdXRTaGFwZU91dGVyRGltcyA9XG4gICAgICBiYXRjaERpbUEgPiBiYXRjaERpbUIgPyBhLnNoYXBlLnNsaWNlKDAsIC0yKSA6IGIuc2hhcGUuc2xpY2UoMCwgLTIpO1xuICBjb25zdCBvdXRTaGFwZSA9IG91dFNoYXBlT3V0ZXJEaW1zLmNvbmNhdChbb3V0ZXJTaGFwZUEsIG91dGVyU2hhcGVCXSk7XG5cbiAgdXRpbC5hc3NlcnQoXG4gICAgICBpbm5lclNoYXBlQSA9PT0gaW5uZXJTaGFwZUIsXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gbWF0TXVsOiBpbm5lciBzaGFwZXMgKCR7aW5uZXJTaGFwZUF9KSBhbmQgKGAgK1xuICAgICAgICAgIGAke2lubmVyU2hhcGVCfSkgb2YgVGVuc29ycyB3aXRoIHNoYXBlcyAke2Euc2hhcGV9IGFuZCBgICtcbiAgICAgICAgICBgJHtiLnNoYXBlfSBhbmQgdHJhbnNwb3NlQT0ke3RyYW5zcG9zZUF9YCArXG4gICAgICAgICAgYCBhbmQgdHJhbnNwb3NlQj0ke3RyYW5zcG9zZUJ9IG11c3QgbWF0Y2guYCk7XG5cbiAgY29uc3QgYTNkU2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9IHRyYW5zcG9zZUEgP1xuICAgICAgW2JhdGNoRGltQSwgaW5uZXJTaGFwZUEsIG91dGVyU2hhcGVBXSA6XG4gICAgICBbYmF0Y2hEaW1BLCBvdXRlclNoYXBlQSwgaW5uZXJTaGFwZUFdO1xuICBjb25zdCBiM2RTaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdID0gdHJhbnNwb3NlQiA/XG4gICAgICBbYmF0Y2hEaW1CLCBvdXRlclNoYXBlQiwgaW5uZXJTaGFwZUJdIDpcbiAgICAgIFtiYXRjaERpbUIsIGlubmVyU2hhcGVCLCBvdXRlclNoYXBlQl07XG5cbiAgLy8gVGhlIHJlc3Qgb2YgdGhlIGltcGxlbWVudGF0aW9uIGlzIGRlc2lnbmVkIHRvIG9wZXJhdGUgb24gcmFuay0zIHRlbnNvcnNcbiAgY29uc3QgYTNkID0gcmVzaGFwZSh7aW5wdXRzOiB7eDogYX0sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IGEzZFNoYXBlfX0pO1xuICBjb25zdCBiM2QgPSByZXNoYXBlKHtpbnB1dHM6IHt4OiBifSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogYjNkU2hhcGV9fSk7XG5cbiAgY29uc3QgaW50ZXJtZWRpYXRlczogVGVuc29ySW5mb1tdID0gW2EzZCwgYjNkXTtcblxuICBjb25zdCBiYXRjaERpbSA9IE1hdGgubWF4KGJhdGNoRGltQSwgYmF0Y2hEaW1CKTtcbiAgY29uc3Qgc2hhcmVkRGltID0gdHJhbnNwb3NlQSA/IGEzZC5zaGFwZVsxXSA6IGEzZC5zaGFwZVsyXTtcblxuICBjb25zdCBoYXNCaWFzID0gYmlhcyAhPSBudWxsO1xuICBjb25zdCBoYXNQcmVsdUFjdGl2YXRpb25XZWlnaHRzID0gcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyAhPSBudWxsO1xuICBjb25zdCBoYXNMZWFreXJlbHVBbHBoYSA9IGFjdGl2YXRpb24gPT09ICdsZWFreXJlbHUnO1xuICBjb25zdCBmdXNlZEFjdGl2YXRpb24gPSBhY3RpdmF0aW9uICE9IG51bGwgP1xuICAgICAgbWFwQWN0aXZhdGlvblRvU2hhZGVyUHJvZ3JhbShhY3RpdmF0aW9uLCB0cnVlKSA6XG4gICAgICBudWxsO1xuICBjb25zdCBjb250YWluc0Z1c2VkT3BzID0gaGFzQmlhcyB8fCBoYXNQcmVsdUFjdGl2YXRpb25XZWlnaHRzIHx8XG4gICAgICBoYXNMZWFreXJlbHVBbHBoYSB8fCBmdXNlZEFjdGl2YXRpb24gIT0gbnVsbDtcbiAgbGV0IG91dDogVGVuc29ySW5mbztcblxuICAvLyBTaW5jZSB0aGUgbWF0cmljZXMgYXJlIHZlY3RvcnMsIGl0IGlzIGZhc3RlciB0byBjYWxsIG11bCgpLnN1bSgpXG4gIC8vIGJlY2F1c2Ugc3VtKCkgaXMgTyhzcXJ0KE4pKSBkdWUgdG8gZGl2aWRlLWFuZC1jb25xdWVyLlxuICBpZiAoKG91dGVyU2hhcGVBID09PSAxIHx8IG91dGVyU2hhcGVCID09PSAxKSAmJlxuICAgICAgc2hhcmVkRGltID4gTUFUTVVMX1NIQVJFRF9ESU1fVEhSRVNIT0xEICYmIGNvbnRhaW5zRnVzZWRPcHMgPT09IGZhbHNlKSB7XG4gICAgbGV0IGFWZWMgPSBhM2Q7XG4gICAgbGV0IGJWZWMgPSBiM2Q7XG4gICAgaWYgKHRyYW5zcG9zZUEpIHtcbiAgICAgIGFWZWMgPSB0cmFuc3Bvc2Uoe2lucHV0czoge3g6IGEzZH0sIGJhY2tlbmQsIGF0dHJzOiB7cGVybTogWzAsIDIsIDFdfX0pO1xuICAgICAgaW50ZXJtZWRpYXRlcy5wdXNoKGFWZWMpO1xuICAgIH1cbiAgICBpZiAodHJhbnNwb3NlQikge1xuICAgICAgYlZlYyA9IHRyYW5zcG9zZSh7aW5wdXRzOiB7eDogYjNkfSwgYmFja2VuZCwgYXR0cnM6IHtwZXJtOiBbMCwgMiwgMV19fSk7XG4gICAgICBpbnRlcm1lZGlhdGVzLnB1c2goYlZlYyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2hvdWxkUmVzaGFwZUEgPSBvdXRlclNoYXBlQiAhPT0gMTtcbiAgICBjb25zdCBzaG91bGRSZXNoYXBlQiA9IG91dGVyU2hhcGVCID09PSAxO1xuXG4gICAgbGV0IGFWZWMzZCA9IGFWZWM7XG4gICAgaWYgKHNob3VsZFJlc2hhcGVBKSB7XG4gICAgICBhVmVjM2QgPSByZXNoYXBlKHtcbiAgICAgICAgaW5wdXRzOiB7eDogYVZlY30sXG4gICAgICAgIGJhY2tlbmQsXG4gICAgICAgIGF0dHJzOiB7c2hhcGU6IFtiYXRjaERpbSwgc2hhcmVkRGltLCAxXX1cbiAgICAgIH0pO1xuXG4gICAgICBpbnRlcm1lZGlhdGVzLnB1c2goYVZlYzNkKTtcbiAgICB9XG5cbiAgICBjb25zdCBheGlzID0gb3V0ZXJTaGFwZUIgPT09IDEgPyAyIDogMTtcblxuICAgIGxldCBiVmVjM2QgPSBiVmVjO1xuICAgIGlmIChzaG91bGRSZXNoYXBlQikge1xuICAgICAgYlZlYzNkID0gcmVzaGFwZSh7XG4gICAgICAgIGlucHV0czoge3g6IGJWZWN9LFxuICAgICAgICBiYWNrZW5kLFxuICAgICAgICBhdHRyczoge3NoYXBlOiBbYmF0Y2hEaW0sIDEsIHNoYXJlZERpbV19XG4gICAgICB9KTtcblxuICAgICAgaW50ZXJtZWRpYXRlcy5wdXNoKGJWZWMzZCk7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvZHVjdCA9IG11bHRpcGx5KHtpbnB1dHM6IHthOiBhVmVjM2QsIGI6IGJWZWMzZH0sIGJhY2tlbmR9KTtcbiAgICBvdXQgPSBzdW0oe2lucHV0czoge3g6IHByb2R1Y3R9LCBiYWNrZW5kLCBhdHRyczoge2F4aXMsIGtlZXBEaW1zOiB0cnVlfX0pO1xuICAgIGludGVybWVkaWF0ZXMucHVzaChwcm9kdWN0KTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBkdHlwZSA9IHVwY2FzdFR5cGUoYS5kdHlwZSwgYi5kdHlwZSk7XG5cbiAgICBjb25zdCBwcm9ncmFtID0gbmV3IE1hdE11bFBhY2tlZFByb2dyYW0oXG4gICAgICAgIGEzZFNoYXBlLCBiM2RTaGFwZSwgW2JhdGNoRGltLCBvdXRlclNoYXBlQSwgb3V0ZXJTaGFwZUJdLCB0cmFuc3Bvc2VBLFxuICAgICAgICB0cmFuc3Bvc2VCLCBoYXNCaWFzLCBmdXNlZEFjdGl2YXRpb24sIGhhc1ByZWx1QWN0aXZhdGlvbldlaWdodHMsXG4gICAgICAgIGhhc0xlYWt5cmVsdUFscGhhKTtcblxuICAgIGNvbnN0IGlucHV0czogVGVuc29ySW5mb1tdID0gW2EzZCwgYjNkXTtcbiAgICBpZiAoYmlhcyAhPSBudWxsKSB7XG4gICAgICBpbnB1dHMucHVzaChiaWFzKTtcbiAgICB9XG4gICAgaWYgKGhhc1ByZWx1QWN0aXZhdGlvbldlaWdodHMpIHtcbiAgICAgIGlucHV0cy5wdXNoKHByZWx1QWN0aXZhdGlvbldlaWdodHMpO1xuICAgIH1cbiAgICBpZiAoaGFzTGVha3lyZWx1QWxwaGEpIHtcbiAgICAgIGNvbnN0ICRsZWFreXJlbHVBbHBoYSA9IGJhY2tlbmQubWFrZVRlbnNvckluZm8oXG4gICAgICAgICAgW10sICdmbG9hdDMyJyxcbiAgICAgICAgICB1dGlsLmNyZWF0ZVNjYWxhclZhbHVlKGxlYWt5cmVsdUFscGhhIGFzIHt9IGFzICdmbG9hdDMyJywgJ2Zsb2F0MzInKSk7XG4gICAgICBpbnB1dHMucHVzaCgkbGVha3lyZWx1QWxwaGEpO1xuICAgICAgaW50ZXJtZWRpYXRlcy5wdXNoKCRsZWFreXJlbHVBbHBoYSk7XG4gICAgfVxuXG4gICAgb3V0ID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgaW5wdXRzLCBkdHlwZSk7XG4gIH1cblxuICBjb25zdCBvdXRSZXNoYXBlZCA9XG4gICAgICByZXNoYXBlKHtpbnB1dHM6IHt4OiBvdXR9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBvdXRTaGFwZX19KTtcbiAgaW50ZXJtZWRpYXRlcy5wdXNoKG91dCk7XG4gIGZvciAoY29uc3QgaSBvZiBpbnRlcm1lZGlhdGVzKSB7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhpKTtcbiAgfVxuICByZXR1cm4gb3V0UmVzaGFwZWQ7XG59XG4iLCJcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtlbnYsIEZ1c2VkQmF0Y2hOb3JtLCBGdXNlZEJhdGNoTm9ybUF0dHJzLCBGdXNlZEJhdGNoTm9ybUlucHV0cywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtCYXRjaE5vcm1Qcm9ncmFtfSBmcm9tICcuLi9iYXRjaG5vcm1fZ3B1JztcbmltcG9ydCB7QmF0Y2hOb3JtUGFja2VkUHJvZ3JhbX0gZnJvbSAnLi4vYmF0Y2hub3JtX3BhY2tlZF9ncHUnO1xuXG5leHBvcnQgY29uc3QgYmF0Y2hOb3JtOiAocGFyYW1zOiB7XG4gIGlucHV0czogRnVzZWRCYXRjaE5vcm1JbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsXG4gIGF0dHJzOiBGdXNlZEJhdGNoTm9ybUF0dHJzXG59KSA9PiBUZW5zb3JJbmZvID0gKHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSkgPT4ge1xuICBjb25zdCB7eCwgbWVhbiwgdmFyaWFuY2UsIG9mZnNldCwgc2NhbGV9ID0gaW5wdXRzO1xuXG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgbWVhbi5zaGFwZS5sZW5ndGggPT09IHZhcmlhbmNlLnNoYXBlLmxlbmd0aCxcbiAgICAgICgpID0+ICdCYXRjaCBub3JtYWxpemF0aW9uIGdyYWRpZW50IHJlcXVpcmVzIG1lYW4gYW5kIHZhcmlhbmNlIHRvIGhhdmUgJyArXG4gICAgICAgICAgJ2VxdWFsIHJhbmtzLicpO1xuICB1dGlsLmFzc2VydChcbiAgICAgIG9mZnNldCA9PSBudWxsIHx8IG1lYW4uc2hhcGUubGVuZ3RoID09PSBvZmZzZXQuc2hhcGUubGVuZ3RoLFxuICAgICAgKCkgPT4gJ0JhdGNoIG5vcm1hbGl6YXRpb24gZ3JhZGllbnQgcmVxdWlyZXMgbWVhbiBhbmQgb2Zmc2V0IHRvIGhhdmUgJyArXG4gICAgICAgICAgJ2VxdWFsIHJhbmtzLicpO1xuICB1dGlsLmFzc2VydChcbiAgICAgIHNjYWxlID09IG51bGwgfHwgbWVhbi5zaGFwZS5sZW5ndGggPT09IHNjYWxlLnNoYXBlLmxlbmd0aCxcbiAgICAgICgpID0+ICdCYXRjaCBub3JtYWxpemF0aW9uIGdyYWRpZW50IHJlcXVpcmVzIG1lYW4gYW5kIHNjYWxlIHRvIGhhdmUgJyArXG4gICAgICAgICAgJ2VxdWFsIHJhbmtzLicpO1xuXG4gIGxldCB7dmFyaWFuY2VFcHNpbG9ufSA9IGF0dHJzO1xuICBpZiAodmFyaWFuY2VFcHNpbG9uID09IG51bGwpIHtcbiAgICB2YXJpYW5jZUVwc2lsb24gPSAwLjAwMTtcbiAgfVxuXG4gIGNvbnN0IGZpbmFsSW5wdXRzID0gW3gsIG1lYW4sIHZhcmlhbmNlXTtcblxuICBsZXQgb2Zmc2V0U2hhcGUgPSBudWxsO1xuICBpZiAob2Zmc2V0ICE9IG51bGwpIHtcbiAgICBvZmZzZXRTaGFwZSA9IG9mZnNldC5zaGFwZTtcbiAgICBmaW5hbElucHV0cy5wdXNoKG9mZnNldCk7XG4gIH1cblxuICBsZXQgc2NhbGVTaGFwZSA9IG51bGw7XG4gIGlmIChzY2FsZSAhPSBudWxsKSB7XG4gICAgc2NhbGVTaGFwZSA9IHNjYWxlLnNoYXBlO1xuICAgIGZpbmFsSW5wdXRzLnB1c2goc2NhbGUpO1xuICB9XG5cbiAgY29uc3QgcHJvZ3JhbSA9IGVudigpLmdldEJvb2woJ1dFQkdMX1BBQ0tfTk9STUFMSVpBVElPTicpID9cbiAgICAgIG5ldyBCYXRjaE5vcm1QYWNrZWRQcm9ncmFtKFxuICAgICAgICAgIHguc2hhcGUsIG1lYW4uc2hhcGUsIHZhcmlhbmNlLnNoYXBlLCBvZmZzZXRTaGFwZSwgc2NhbGVTaGFwZSxcbiAgICAgICAgICB2YXJpYW5jZUVwc2lsb24pIDpcbiAgICAgIG5ldyBCYXRjaE5vcm1Qcm9ncmFtKFxuICAgICAgICAgIHguc2hhcGUsIG1lYW4uc2hhcGUsIHZhcmlhbmNlLnNoYXBlLCBvZmZzZXRTaGFwZSwgc2NhbGVTaGFwZSxcbiAgICAgICAgICB2YXJpYW5jZUVwc2lsb24pO1xuICBjb25zdCBvdXRwdXQgPVxuICAgICAgYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgZmluYWxJbnB1dHMsIGZpbmFsSW5wdXRzWzBdLmR0eXBlKTtcblxuICByZXR1cm4gb3V0cHV0O1xufTtcblxuZXhwb3J0IGNvbnN0IGJhdGNoTm9ybUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBGdXNlZEJhdGNoTm9ybSxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGJhdGNoTm9ybSBhcyB7fSBhcyBLZXJuZWxGdW5jLFxufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIEJhdGNoVG9TcGFjZU5ELCBCYXRjaFRvU3BhY2VOREF0dHJzLCBCYXRjaFRvU3BhY2VORElucHV0cywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuXG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4vUmVzaGFwZSc7XG5pbXBvcnQge3NsaWNlfSBmcm9tICcuL1NsaWNlJztcbmltcG9ydCB7dHJhbnNwb3NlfSBmcm9tICcuL1RyYW5zcG9zZSc7XG5cbmV4cG9ydCBjb25zdCBiYXRjaFRvU3BhY2VORCA9IChhcmdzOiB7XG4gIGlucHV0czogQmF0Y2hUb1NwYWNlTkRJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsXG4gIGF0dHJzOiBCYXRjaFRvU3BhY2VOREF0dHJzXG59KTogVGVuc29ySW5mbyA9PiB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4fSA9IGlucHV0cztcbiAgY29uc3Qge2Jsb2NrU2hhcGUsIGNyb3BzfSA9IGF0dHJzO1xuXG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgeC5zaGFwZS5sZW5ndGggPD0gNCxcbiAgICAgICgpID0+ICdiYXRjaFRvU3BhY2VORCBmb3IgcmFuayA+IDQgd2l0aCBhIFdlYkdMIGJhY2tlbmQgbm90ICcgK1xuICAgICAgICAgICdpbXBsZW1lbnRlZCB5ZXQnKTtcbiAgY29uc3QgcHJvZCA9IGJsb2NrU2hhcGUucmVkdWNlKChhLCBiKSA9PiBhICogYik7XG5cbiAgY29uc3QgcmVzaGFwZWQgPSBiYWNrZW5kX3V0aWwuZ2V0UmVzaGFwZWQoeC5zaGFwZSwgYmxvY2tTaGFwZSwgcHJvZCk7XG4gIGNvbnN0IHBlcm11dGVkID0gYmFja2VuZF91dGlsLmdldFBlcm11dGVkKHJlc2hhcGVkLmxlbmd0aCwgYmxvY2tTaGFwZS5sZW5ndGgpO1xuICBjb25zdCByZXNoYXBlZFBlcm11dGVkID1cbiAgICAgIGJhY2tlbmRfdXRpbC5nZXRSZXNoYXBlZFBlcm11dGVkKHguc2hhcGUsIGJsb2NrU2hhcGUsIHByb2QpO1xuICBjb25zdCBzbGljZUJlZ2luQ29vcmRzID1cbiAgICAgIGJhY2tlbmRfdXRpbC5nZXRTbGljZUJlZ2luQ29vcmRzKGNyb3BzLCBibG9ja1NoYXBlLmxlbmd0aCk7XG4gIGNvbnN0IHNsaWNlU2l6ZSA9XG4gICAgICBiYWNrZW5kX3V0aWwuZ2V0U2xpY2VTaXplKHJlc2hhcGVkUGVybXV0ZWQsIGNyb3BzLCBibG9ja1NoYXBlLmxlbmd0aCk7XG5cbiAgY29uc3QgdG9EaXNwb3NlID0gW107XG5cbiAgY29uc3QgcmVzaGFwZWRJbnRlcm1lZGlhdGUgPVxuICAgICAgcmVzaGFwZSh7aW5wdXRzOiB7eH0sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IHJlc2hhcGVkfX0pO1xuICBjb25zdCB0cmFuc3Bvc2VkSW50ZXJtZWRpYXRlID0gdHJhbnNwb3NlKFxuICAgICAge2lucHV0czoge3g6IHJlc2hhcGVkSW50ZXJtZWRpYXRlfSwgYmFja2VuZCwgYXR0cnM6IHtwZXJtOiBwZXJtdXRlZH19KTtcbiAgY29uc3QgcmVzaGFwZWRJbnRlcm1lZGlhdGUyID0gcmVzaGFwZSh7XG4gICAgaW5wdXRzOiB7eDogdHJhbnNwb3NlZEludGVybWVkaWF0ZX0sXG4gICAgYmFja2VuZCxcbiAgICBhdHRyczoge3NoYXBlOiByZXNoYXBlZFBlcm11dGVkfVxuICB9KTtcbiAgY29uc3Qgc2xpY2VkID0gc2xpY2Uoe1xuICAgIGlucHV0czoge3g6IHJlc2hhcGVkSW50ZXJtZWRpYXRlMn0sXG4gICAgYmFja2VuZCxcbiAgICBhdHRyczoge2JlZ2luOiBzbGljZUJlZ2luQ29vcmRzLCBzaXplOiBzbGljZVNpemV9XG4gIH0pO1xuXG4gIHRvRGlzcG9zZS5wdXNoKHJlc2hhcGVkSW50ZXJtZWRpYXRlKTtcbiAgdG9EaXNwb3NlLnB1c2godHJhbnNwb3NlZEludGVybWVkaWF0ZSk7XG4gIHRvRGlzcG9zZS5wdXNoKHJlc2hhcGVkSW50ZXJtZWRpYXRlMik7XG5cbiAgdG9EaXNwb3NlLmZvckVhY2godCA9PiBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHQpKTtcblxuICByZXR1cm4gc2xpY2VkO1xufTtcblxuZXhwb3J0IGNvbnN0IGJhdGNoVG9TcGFjZU5EQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEJhdGNoVG9TcGFjZU5ELFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogYmF0Y2hUb1NwYWNlTkQgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtCaW5jb3VudCwgQmluY291bnRBdHRycywgQmluY291bnRJbnB1dHMsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mbywgVHlwZWRBcnJheX0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7YmluY291bnRJbXBsQ1BVfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcblxuZXhwb3J0IGZ1bmN0aW9uIGJpbmNvdW50KGFyZ3M6IHtcbiAgaW5wdXRzOiBCaW5jb3VudElucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IEJpbmNvdW50QXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3gsIHdlaWdodHN9ID0gaW5wdXRzO1xuICBjb25zdCB7c2l6ZX0gPSBhdHRycztcblxuICBjb25zdCB4VmFscyA9IGJhY2tlbmQucmVhZFN5bmMoeC5kYXRhSWQpIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0IHdlaWdodHNWYWxzID0gYmFja2VuZC5yZWFkU3luYyh3ZWlnaHRzLmRhdGFJZCkgYXMgVHlwZWRBcnJheTtcblxuICBjb25zdCBvdXRWYWxzID1cbiAgICAgIGJpbmNvdW50SW1wbENQVSh4VmFscywgd2VpZ2h0c1ZhbHMsIHdlaWdodHMuZHR5cGUsIHdlaWdodHMuc2hhcGUsIHNpemUpO1xuXG4gIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtzaXplXSwgd2VpZ2h0cy5kdHlwZSwgb3V0VmFscyk7XG59XG5cbmV4cG9ydCBjb25zdCBiaW5jb3VudENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBCaW5jb3VudCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGJpbmNvdW50IGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgKiBhcyB0ZiBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtCaW5hcnlJbnB1dHMsIENhc3QsIENhc3RBdHRycywgQ2FzdElucHV0cywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuXG5pbXBvcnQge2NvbXBsZXh9IGZyb20gJy4vQ29tcGxleCc7XG5pbXBvcnQge2lkZW50aXR5fSBmcm9tICcuL0lkZW50aXR5JztcbmltcG9ydCB7bm90RXF1YWx9IGZyb20gJy4vTm90RXF1YWwnO1xuaW1wb3J0IHtyZWFsfSBmcm9tICcuL1JlYWwnO1xuXG5pbXBvcnQge2ludH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL2ludCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjYXN0KFxuICAgIGFyZ3M6IHtpbnB1dHM6IENhc3RJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsIGF0dHJzOiBDYXN0QXR0cnN9KTpcbiAgICBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICBjb25zdCB7ZHR5cGV9ID0gYXR0cnM7XG5cbiAgLy8gQ2FzdGluZyB0byBjb21wbGV4NjQuXG4gIGlmIChkdHlwZSA9PT0gJ2NvbXBsZXg2NCcpIHtcbiAgICBpZiAoeC5kdHlwZSA9PT0gJ2NvbXBsZXg2NCcpIHtcbiAgICAgIHJldHVybiBpZGVudGl0eSh7aW5wdXRzOiB7eH0sIGJhY2tlbmR9KTtcbiAgICB9XG5cbiAgICAvLyBUT0RPKGFubnhpbmd5dWFuKTogSW1wb3J0IGtlcm5lbCBmdW5jdGlvbiBvbmNlIHplcm9zIGlzIG1vZHVsYXJpemVkLlxuICAgIGNvbnN0IHplcm9zVGVuc29yID0gdGYuemVyb3MoeC5zaGFwZSk7XG4gICAgY29uc3QgZmxvYXRYID0gY2FzdCh7aW5wdXRzOiB7eH0sIGJhY2tlbmQsIGF0dHJzOiB7ZHR5cGU6ICdmbG9hdDMyJ319KTtcblxuICAgIGNvbnN0IHJlc3VsdCA9XG4gICAgICAgIGNvbXBsZXgoe2lucHV0czoge3JlYWw6IGZsb2F0WCwgaW1hZzogemVyb3NUZW5zb3J9LCBiYWNrZW5kfSk7XG5cbiAgICB6ZXJvc1RlbnNvci5kaXNwb3NlKCk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhmbG9hdFgpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8vIENhc3RpbmcgZnJvbSBjb21wbGV4NjRcbiAgaWYgKHguZHR5cGUgPT09ICdjb21wbGV4NjQnKSB7XG4gICAgY29uc3QgcmVhbFBhcnQgPSByZWFsKHtpbnB1dHM6IHtpbnB1dDogeH0sIGJhY2tlbmR9KTtcbiAgICBjb25zdCByZXN1bHQgPSBjYXN0KHtpbnB1dHM6IHt4OiByZWFsUGFydH0sIGJhY2tlbmQsIGF0dHJzOiB7ZHR5cGV9fSk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZWFsUGFydCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGlmICghdXRpbC5oYXNFbmNvZGluZ0xvc3MoeC5kdHlwZSwgZHR5cGUpKSB7XG4gICAgLy8gV2UgZG9uJ3QgY2hhbmdlIHRoZSB1bmRlcmx5aW5nIGRhdGEsIHNpbmNlIHdlIGNhc3QgdG8gaGlnaGVyXG4gICAgLy8gcHJlY2lzaW9uLlxuICAgIGNvbnN0IHJlc3VsdCA9IGlkZW50aXR5KHtpbnB1dHM6IHt4fSwgYmFja2VuZH0pO1xuICAgIHJldHVybiB7ZGF0YUlkOiByZXN1bHQuZGF0YUlkLCBzaGFwZTogcmVzdWx0LnNoYXBlLCBkdHlwZX07XG4gIH1cblxuICBpZiAoZHR5cGUgPT09ICdpbnQzMicpIHtcbiAgICByZXR1cm4gaW50KHgsIGJhY2tlbmQpO1xuICB9XG5cbiAgaWYgKGR0eXBlID09PSAnYm9vbCcpIHtcbiAgICBjb25zdCB6ZXJvc1RlbnNvckluZm8gPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFxuICAgICAgICBbXSwgJ2Jvb2wnLCB1dGlsLmdldFR5cGVkQXJyYXlGcm9tRFR5cGUoJ2Jvb2wnLCAxKSk7XG5cbiAgICBjb25zdCBiaW5hcnlJbnB1dHM6IEJpbmFyeUlucHV0cyA9IHthOiB4LCBiOiB6ZXJvc1RlbnNvckluZm99O1xuXG4gICAgY29uc3QgcmVzdWx0ID0gbm90RXF1YWwoe2lucHV0czogYmluYXJ5SW5wdXRzLCBiYWNrZW5kfSkgYXMgVGVuc29ySW5mbztcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHplcm9zVGVuc29ySW5mbyk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihgRXJyb3IgaW4gQ2FzdDogZmFpbGVkIHRvIGNhc3QgJHt4LmR0eXBlfSB0byAke2R0eXBlfWApO1xufVxuXG5leHBvcnQgY29uc3QgY2FzdENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBDYXN0LFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogY2FzdCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0NlaWwsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuY30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7Y2VpbEltcGxDUFV9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuXG5jb25zdCBDRUlMID0gYHJldHVybiBjZWlsKHgpO2A7XG5cbmV4cG9ydCBjb25zdCBjZWlsID0gdW5hcnlLZXJuZWxGdW5jKFxuICAgIHtvcFNuaXBwZXQ6IENFSUwsIHBhY2tlZE9wU25pcHBldDogQ0VJTCwgY3B1S2VybmVsSW1wbDogY2VpbEltcGxDUFV9KTtcblxuZXhwb3J0IGNvbnN0IGNlaWxDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQ2VpbCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGNlaWwgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtDbGlwQnlWYWx1ZSwgQ2xpcEJ5VmFsdWVBdHRycywgQ2xpcEJ5VmFsdWVJbnB1dHMsIGVudiwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtDbGlwUHJvZ3JhbX0gZnJvbSAnLi4vY2xpcF9ncHUnO1xuaW1wb3J0IHtDbGlwUGFja2VkUHJvZ3JhbX0gZnJvbSAnLi4vY2xpcF9wYWNrZWRfZ3B1JztcblxuZXhwb3J0IGZ1bmN0aW9uIGNsaXBCeVZhbHVlKGFyZ3M6IHtcbiAgaW5wdXRzOiBDbGlwQnlWYWx1ZUlucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IENsaXBCeVZhbHVlQXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICBjb25zdCB7Y2xpcFZhbHVlTWluLCBjbGlwVmFsdWVNYXh9ID0gYXR0cnM7XG5cbiAgbGV0IHByb2dyYW07XG4gIGlmIChlbnYoKS5nZXRCb29sKCdXRUJHTF9QQUNLX0NMSVAnKSkge1xuICAgIHByb2dyYW0gPSBuZXcgQ2xpcFBhY2tlZFByb2dyYW0oeC5zaGFwZSk7XG4gIH0gZWxzZSB7XG4gICAgcHJvZ3JhbSA9IG5ldyBDbGlwUHJvZ3JhbSh4LnNoYXBlKTtcbiAgfVxuICBjb25zdCBjdXN0b21WYWx1ZXMgPSBbW2NsaXBWYWx1ZU1pbl0sIFtjbGlwVmFsdWVNYXhdXTtcbiAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFt4XSwgeC5kdHlwZSwgY3VzdG9tVmFsdWVzKTtcbn1cblxuZXhwb3J0IGNvbnN0IGNsaXBCeVZhbHVlQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IENsaXBCeVZhbHVlLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogY2xpcEJ5VmFsdWUgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtDb21wbGV4LCBDb21wbGV4SW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge2lkZW50aXR5fSBmcm9tICcuL0lkZW50aXR5JztcblxuLyoqXG4gKiBJbiBXZWJHTCBkYXRhIGlzIHN0b3JlZCBpbiBHUFUgdGV4dHVyZXMgd2hpY2ggY2FuJ3QgYmUgZWZmaWNpZW50bHkgY29waWVkLCBzb1xuICogY29tcGxleCB0ZW5zb3JzIHNoYXJlIGRhdGEgd2l0aCB0aGVpciByZWFsIGFuZCBpbWFnaW5hcnkgY29tcG9uZW50cy4gQ29tcGxleFxuICogdGVuc29ycycgcmVmZXJlbmNlIHRvIHRoZSBjb21wb25lbnRzIGlzIHRyYWNrZWQgYnkgcmVmQ291bnQgb24gdGhlIGluZGl2aWR1YWxcbiAqIGNvbXBvbmVudC4gVGhlIHJlZkNvdW50cyBhcmUgaW5jcmVhc2VkIGJ5IHRoZSBpZGVudGl0eSBjYWxsLlxuICpcbiAqIFdoZW4gYSBjb21wbGV4IHRlbnNvciBpcyBkaXNwb3NlZCwgaXQgd2lsbCByZWR1Y2UgdGhlIHJlZkNvdW50IG9uIHRoZVxuICogY29tcG9uZW50cyBieSBjYWxsaW5nIGRpc3Bvc2VEYXRhIG9uIGVhY2guXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wbGV4KFxuICAgIGFyZ3M6IHtpbnB1dHM6IENvbXBsZXhJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0x9KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmR9ID0gYXJncztcbiAgY29uc3Qge3JlYWwsIGltYWd9ID0gaW5wdXRzO1xuXG4gIGNvbnN0IGNvbXBsZXhJbmZvID0gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhyZWFsLnNoYXBlLCAnY29tcGxleDY0Jyk7XG4gIGNvbnN0IGNvbXBsZXggPSBiYWNrZW5kLnRleERhdGEuZ2V0KGNvbXBsZXhJbmZvLmRhdGFJZCk7XG5cbiAgY29uc3QgcmVhbFRlbnNvckluZm8gPSBpZGVudGl0eSh7aW5wdXRzOiB7eDogcmVhbH0sIGJhY2tlbmR9KTtcblxuICBjb25zdCBpbWFnVGVuc29ySW5mbyA9IGlkZW50aXR5KHtpbnB1dHM6IHt4OiBpbWFnfSwgYmFja2VuZH0pO1xuXG4gIGNvbXBsZXguY29tcGxleFRlbnNvckluZm9zID0ge3JlYWw6IHJlYWxUZW5zb3JJbmZvLCBpbWFnOiBpbWFnVGVuc29ySW5mb307XG5cbiAgcmV0dXJuIGNvbXBsZXhJbmZvO1xufVxuXG5leHBvcnQgY29uc3QgY29tcGxleENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBDb21wbGV4LFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogY29tcGxleCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0NvbXBsZXhBYnMsIENvbXBsZXhBYnNJbnB1dHMsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7Q29tcGxleEFic1Byb2dyYW19IGZyb20gJy4uL2NvbXBsZXhfYWJzX2dwdSc7XG5cbi8vIFJldHVybnMgYSBUZW5zb3JJbmZvIHdpdGggdGhlIGNvbXBsZXggc2hhcGUgYW5kIHRoZSBkYXRhSWQgb2YgdGhlXG4vLyB1bmRlcmx5aW5nIHBhcnQuIFdlIG5lZWQgdG8gZG8gdGhpcyBiZWNhdXNlIGEgcmVzaGFwZWQgY29tcGxleCB0ZW5zb3IgaXNcbi8vIG5vdCByZWZsZWN0ZWQgaW4gaXRzIHBhcnRzLlxuZnVuY3Rpb24gbWFrZUNvbXBsZXhDb21wb25lbnRUZW5zb3JJbmZvKFxuICAgIGNvbXBsZXhUZW5zb3I6IFRlbnNvckluZm8sIGNvbXBsZXhQYXJ0OiBUZW5zb3JJbmZvKTogVGVuc29ySW5mbyB7XG4gIHJldHVybiB7XG4gICAgZGF0YUlkOiBjb21wbGV4UGFydC5kYXRhSWQsXG4gICAgZHR5cGU6IGNvbXBsZXhQYXJ0LmR0eXBlLFxuICAgIHNoYXBlOiBjb21wbGV4VGVuc29yLnNoYXBlXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wbGV4QWJzKFxuICAgIGFyZ3M6IHtpbnB1dHM6IENvbXBsZXhBYnNJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0x9KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmR9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuXG4gIGNvbnN0IHhEYXRhID0gYmFja2VuZC50ZXhEYXRhLmdldCh4LmRhdGFJZCk7XG5cbiAgY29uc3QgcHJvZ3JhbSA9IG5ldyBDb21wbGV4QWJzUHJvZ3JhbSh4LnNoYXBlKTtcbiAgY29uc3QgcHJvZ3JhbUlucHV0cyA9IFtcbiAgICBtYWtlQ29tcGxleENvbXBvbmVudFRlbnNvckluZm8oeCwgeERhdGEuY29tcGxleFRlbnNvckluZm9zLnJlYWwpLFxuICAgIG1ha2VDb21wbGV4Q29tcG9uZW50VGVuc29ySW5mbyh4LCB4RGF0YS5jb21wbGV4VGVuc29ySW5mb3MuaW1hZyksXG4gIF07XG5cbiAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKFxuICAgICAgcHJvZ3JhbSwgcHJvZ3JhbUlucHV0cywgcHJvZ3JhbUlucHV0c1swXS5kdHlwZSk7XG59XG5cbmV4cG9ydCBjb25zdCBjb21wbGV4QWJzQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IENvbXBsZXhBYnMsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBjb21wbGV4QWJzIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBDb25jYXQsIENvbmNhdEF0dHJzLCBDb25jYXRJbnB1dHMsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mbywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7Y29uY2F0SW1wbH0gZnJvbSAnLi9Db25jYXRfaW1wbCc7XG5pbXBvcnQge2lkZW50aXR5fSBmcm9tICcuL0lkZW50aXR5JztcblxuZXhwb3J0IGZ1bmN0aW9uIGNvbmNhdChcbiAgICBhcmdzOlxuICAgICAgICB7aW5wdXRzOiBDb25jYXRJbnB1dHMsIGF0dHJzOiBDb25jYXRBdHRycywgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTH0pOlxuICAgIFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7YXhpc30gPSBhdHRycztcblxuICBjb25zdCAkYXhpcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oYXhpcywgaW5wdXRzWzBdLnNoYXBlKVswXTtcbiAgY29uc3Qgb3V0U2hhcGUgPVxuICAgICAgYmFja2VuZF91dGlsLmNvbXB1dGVPdXRTaGFwZShpbnB1dHMubWFwKHQgPT4gdC5zaGFwZSksICRheGlzKTtcblxuICBpZiAodXRpbC5zaXplRnJvbVNoYXBlKG91dFNoYXBlKSA9PT0gMCkge1xuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dFNoYXBlLCBpbnB1dHNbMF0uZHR5cGUsIFtdKTtcbiAgfVxuXG4gIC8vIEtlZXAgb25seSBub24tZW1wdHkgdGVuc29ycyAoaWdub3JlIHRlbnNvcnMgd2l0aCAwIGluIHRoZWlyIHNoYXBlKS5cbiAgY29uc3QgJGlucHV0cyA9IGlucHV0cy5maWx0ZXIodCA9PiB1dGlsLnNpemVGcm9tU2hhcGUodC5zaGFwZSkgPiAwKTtcbiAgaWYgKCRpbnB1dHMubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIGlkZW50aXR5KHtpbnB1dHM6IHt4OiAkaW5wdXRzWzBdfSwgYmFja2VuZH0pO1xuICB9XG5cbiAgY29uc3Qgc2hhcGVzID0gJGlucHV0cy5tYXAodCA9PiB0LnNoYXBlKTtcbiAgYmFja2VuZF91dGlsLmFzc2VydFBhcmFtc0NvbnNpc3RlbnQoc2hhcGVzLCAkYXhpcyk7XG5cbiAgcmV0dXJuIGNvbmNhdEltcGwoJGlucHV0cywgJGF4aXMsIGJhY2tlbmQpO1xufVxuXG5leHBvcnQgY29uc3QgY29uY2F0Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IENvbmNhdCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGNvbmNhdCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgQ29uY2F0SW5wdXRzLCBlbnYsIFRlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge0NvbmNhdFByb2dyYW19IGZyb20gJy4uL2NvbmNhdF9ncHUnO1xuaW1wb3J0IHtDb25jYXRQYWNrZWRQcm9ncmFtfSBmcm9tICcuLi9jb25jYXRfcGFja2VkX2dwdSc7XG5pbXBvcnQge2NvbmNhdEltcGxDUFV9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuXG5pbXBvcnQge2NvbXBsZXh9IGZyb20gJy4vQ29tcGxleCc7XG5pbXBvcnQge2ltYWd9IGZyb20gJy4vSW1hZyc7XG5pbXBvcnQge3JlYWx9IGZyb20gJy4vUmVhbCc7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4vUmVzaGFwZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjb25jYXRJbXBsKFxuICAgIGlucHV0czogQ29uY2F0SW5wdXRzLCBheGlzOiBudW1iZXIsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wpOiBUZW5zb3JJbmZvIHtcbiAgY29uc3QgZHR5cGUgPSBpbnB1dHNbMF0uZHR5cGU7XG4gIGlmIChkdHlwZSA9PT0gJ2NvbXBsZXg2NCcpIHtcbiAgICBjb25zdCByZWFscyA9IGlucHV0cy5tYXAoKHQpID0+IHJlYWwoe2lucHV0czoge2lucHV0OiB0fSwgYmFja2VuZH0pKTtcbiAgICBjb25zdCBpbWFncyA9IGlucHV0cy5tYXAoKHQpID0+IGltYWcoe2lucHV0czoge2lucHV0OiB0fSwgYmFja2VuZH0pKTtcblxuICAgIGNvbnN0IHJlYWxDb25jYXRlZCA9IGNvbmNhdEltcGwocmVhbHMsIGF4aXMsIGJhY2tlbmQpO1xuICAgIGNvbnN0IGltYWdDb25jYXRlZCA9IGNvbmNhdEltcGwoaW1hZ3MsIGF4aXMsIGJhY2tlbmQpO1xuXG4gICAgY29uc3QgcmVzdWx0ID1cbiAgICAgICAgY29tcGxleCh7aW5wdXRzOiB7cmVhbDogcmVhbENvbmNhdGVkLCBpbWFnOiBpbWFnQ29uY2F0ZWR9LCBiYWNrZW5kfSk7XG5cbiAgICByZWFscy5mb3JFYWNoKHIgPT4gYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyKSk7XG4gICAgaW1hZ3MuZm9yRWFjaChpID0+IGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oaSkpO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVhbENvbmNhdGVkKTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGltYWdDb25jYXRlZCk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgbGV0IHJ1bk9uQ3B1ID0gYmFja2VuZC5zaG91bGRFeGVjdXRlT25DUFUoaW5wdXRzKTtcblxuICAvLyBSdW4gb24gY3B1IGlmIGR0eXBlIGlzIHN0cmluZy4gRm9yIHN0cmluZywgdGhlIGJhY2tlbmQgcmVwcmVzZW50cyBpdFxuICAvLyBhcyBVaW50OEFycmF5W10sIHdoZXJlIGVhY2ggVWludDhBcnJheSBpcyBhIGNoYXJhY3Rlci4gR2l2ZW4gdGhhdCB0aGVcbiAgLy8gY29tcHV0YXRpb24gaXMgb25seSBvbiB0aGUgb3V0ZXIgYXJyYXksIHVwbG9hZGluZyB0aGUgd2hvbGUgZGF0YSBvbnRvXG4gIC8vIGdwdSBpcyB3YXN0ZWZ1bC4gQWxzbywgY3VycmVudGx5IHdlYmdsIGRvZXNuJ3QgaGF2ZSBhIGRlc2lnbiB0b1xuICAvLyB1cGxvYWQgYW5kIHJldHJpZXZlIFVpbnQ4QXJyYXlbXSBiZXR3ZWVuIGNwdSBhbmQgZ3B1LiBUaGVyZWZvcmUsIHdlXG4gIC8vIGp1c3QgcnVuIHRoZSBrZXJuZWwgb24gY3B1IGlmIGR0eXBlIGlzIHN0cmluZy5cbiAgaWYgKGR0eXBlID09PSAnc3RyaW5nJykge1xuICAgIHJ1bk9uQ3B1ID0gdHJ1ZTtcbiAgfVxuXG4gIGlmIChydW5PbkNwdSkge1xuICAgIC8vIEFueSBjb25jYXQgb2Ygbi1kaW1lbnNpb25hbCB0ZW5zb3JzIGFjcm9zcyBhbnkgYXhpcyBjYW4gYmUgcmVkdWNlZCB0b1xuICAgIC8vIGEgY29uY2F0ZW5hdGlvbiBvZiB0d28tZGltZW5zaW9uYWwgdGVuc29ycyBhY3Jvc3MgdGhlIGF4aXMgMSBieSBmaXJzdFxuICAgIC8vIHBhcnRpdGlvbmluZyB0aGUgYXhlcyBvZiB0aGUgb3JpZ2luYWwgdGVuc29ycyBpbnRvIHRob3NlIGxlc3MgdGhhbiB0aGVcbiAgICAvLyBheGlzIHRvIGJlIGNvbmNhdGVuYXRlZCBhbmQgdGhlIHJlc3QuIFRoZW4gcmVzaGFwZSB0aGUgdGVuc29yc1xuICAgIC8vIGludG8gYSB0d28tZGltZW5zaW9uYWwgdGVuc29yIGJ5IGNvbGxhcHNpbmcgdGhlc2UgdHdvIHNldHMgb2YgYXhlcyBhbmRcbiAgICAvLyBjb25jYXRlbmF0ZSB0aGUgcmVzdWx0aW5nIG1hdHJpY2VzIGFjcm9zcyB0aGUgYXhpcyAxLCBmaW5hbGx5IHJlc2hhcGluZ1xuICAgIC8vIHRoZSByZXN1bHQgdG8gaGF2ZSB0aGUgcHJvcGVyIHNoYXBlLlxuICAgIGNvbnN0IHRlbnNvcnMyRCA9IGlucHV0cy5tYXAodCA9PiB7XG4gICAgICBjb25zdCBpbm5lclNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUodC5zaGFwZS5zbGljZShheGlzKSk7XG4gICAgICBjb25zdCBzaGFwZSA9IFstMSwgaW5uZXJTaXplXTtcbiAgICAgIHJldHVybiByZXNoYXBlKHtpbnB1dHM6IHt4OiB0fSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZX19KTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGlucHV0c1ZhbFNoYXBlcyA9IHRlbnNvcnMyRC5tYXAodCA9PiB7XG4gICAgICByZXR1cm4ge3ZhbHM6IGJhY2tlbmQucmVhZFN5bmModC5kYXRhSWQpLCBzaGFwZTogdC5zaGFwZX07XG4gICAgfSk7XG5cbiAgICAvLyBDb25jYXRzIDJkIHRlbnNvcnMgYWxvbmcgYXhpcz0xLlxuICAgIGNvbnN0IG91dFNoYXBlID1cbiAgICAgICAgYmFja2VuZF91dGlsLmNvbXB1dGVPdXRTaGFwZSh0ZW5zb3JzMkQubWFwKHQgPT4gdC5zaGFwZSksIDEgLyogYXhpcyAqLyk7XG4gICAgY29uc3Qgc2ltcGx5Q29uY2F0ID0gdGVuc29yczJEWzBdLnNoYXBlWzBdID09PSAxO1xuICAgIGNvbnN0IG91dFZhbHMgPVxuICAgICAgICBjb25jYXRJbXBsQ1BVKGlucHV0c1ZhbFNoYXBlcywgb3V0U2hhcGUsIGR0eXBlLCBzaW1wbHlDb25jYXQpO1xuXG4gICAgY29uc3QgZmluYWxPdXRTaGFwZSA9XG4gICAgICAgIGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0U2hhcGUoaW5wdXRzLm1hcCh0ID0+IHQuc2hhcGUpLCBheGlzKTtcblxuICAgIGNvbnN0IG91dEluZm8gPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKGZpbmFsT3V0U2hhcGUsIGR0eXBlLCBvdXRWYWxzKTtcblxuICAgIHRlbnNvcnMyRC5mb3JFYWNoKHQgPT4gYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh0KSk7XG5cbiAgICByZXR1cm4gb3V0SW5mbztcbiAgfVxuXG4gIGlmIChpbnB1dHMubGVuZ3RoID4gZW52KCkuZ2V0TnVtYmVyKCdXRUJHTF9NQVhfVEVYVFVSRVNfSU5fU0hBREVSJykpIHtcbiAgICBjb25zdCBtaWRJbmRleCA9IE1hdGguZmxvb3IoaW5wdXRzLmxlbmd0aCAvIDIpO1xuICAgIGNvbnN0IGxlZnRTaWRlID0gY29uY2F0SW1wbChpbnB1dHMuc2xpY2UoMCwgbWlkSW5kZXgpLCBheGlzLCBiYWNrZW5kKTtcbiAgICBjb25zdCByaWdodFNpZGUgPSBjb25jYXRJbXBsKGlucHV0cy5zbGljZShtaWRJbmRleCksIGF4aXMsIGJhY2tlbmQpO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gY29uY2F0SW1wbChbbGVmdFNpZGUsIHJpZ2h0U2lkZV0sIGF4aXMsIGJhY2tlbmQpO1xuXG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhsZWZ0U2lkZSk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyaWdodFNpZGUpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGlmIChlbnYoKS5nZXRCb29sKCdXRUJHTF9QQUNLX0FSUkFZX09QRVJBVElPTlMnKSAmJlxuICAgICAgaW5wdXRzWzBdLnNoYXBlLmxlbmd0aCA+IDEpIHtcbiAgICBjb25zdCBwcm9ncmFtID0gbmV3IENvbmNhdFBhY2tlZFByb2dyYW0oaW5wdXRzLm1hcCh0ID0+IHQuc2hhcGUpLCBheGlzKTtcbiAgICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgaW5wdXRzLCBkdHlwZSk7XG4gIH1cblxuICBjb25zdCB7dGVuc29yczJELCBvdXRTaGFwZX0gPSBjb21wdXRlVGVuc29yczJEKGlucHV0cywgYXhpcywgYmFja2VuZCk7XG4gIGNvbnN0IHByb2dyYW0gPVxuICAgICAgbmV3IENvbmNhdFByb2dyYW0odGVuc29yczJELm1hcCh0ID0+IHQuc2hhcGUgYXMgW251bWJlciwgbnVtYmVyXSkpO1xuICBjb25zdCByZXN1bHQgPSBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCB0ZW5zb3JzMkQsIGR0eXBlKTtcblxuICB0ZW5zb3JzMkQuZm9yRWFjaChyID0+IGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocikpO1xuICBjb25zdCByZXNoYXBlZFJlc3VsdCA9XG4gICAgICByZXNoYXBlKHtpbnB1dHM6IHt4OiByZXN1bHR9LCBhdHRyczoge3NoYXBlOiBvdXRTaGFwZX0sIGJhY2tlbmR9KTtcbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZXN1bHQpO1xuXG4gIHJldHVybiByZXNoYXBlZFJlc3VsdDtcbn1cblxuZnVuY3Rpb24gY29tcHV0ZVRlbnNvcnMyRChcbiAgICBpbnB1dHM6IENvbmNhdElucHV0cywgYXhpczogbnVtYmVyLCBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMKSB7XG4gIC8vIEFueSBjb25jYXQgb2Ygbi1kaW1lbnNpb25hbCB0ZW5zb3JzIGFjcm9zcyBhbnkgYXhpcyBjYW4gYmUgcmVkdWNlZCB0b1xuICAvLyBhIGNvbmNhdGVuYXRpb24gb2YgdHdvLWRpbWVuc2lvbmFsIHRlbnNvcnMgYWNyb3NzIHRoZSBheGlzIDEgYnkgZmlyc3RcbiAgLy8gcGFydGl0aW9uaW5nIHRoZSBheGVzIG9mIHRoZSBvcmlnaW5hbCB0ZW5zb3JzIGludG8gdGhvc2UgbGVzcyB0aGFuIHRoZVxuICAvLyBheGlzIHRvIGJlIGNvbmNhdGVuYXRlZCBhbmQgdGhlIHJlc3QuIFRoZW4gcmVzaGFwZSB0aGUgdGVuc29yc1xuICAvLyBpbnRvIGEgdHdvLWRpbWVuc2lvbmFsIHRlbnNvciBieSBjb2xsYXBzaW5nIHRoZXNlIHR3byBzZXRzIG9mIGF4ZXMgYW5kXG4gIC8vIGNvbmNhdGVuYXRlIHRoZSByZXN1bHRpbmcgbWF0cmljZXMgYWNyb3NzIHRoZSBheGlzIDEsIGZpbmFsbHkgcmVzaGFwaW5nXG4gIC8vIHRoZSByZXN1bHQgdG8gaGF2ZSB0aGUgcHJvcGVyIHNoYXBlLlxuICBjb25zdCBvdXRTaGFwZSA9IGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0U2hhcGUoaW5wdXRzLm1hcCh0ID0+IHQuc2hhcGUpLCBheGlzKTtcbiAgY29uc3QgdGVuc29yczJEID0gaW5wdXRzLm1hcChcbiAgICAgIHggPT4gcmVzaGFwZSh7XG4gICAgICAgIGlucHV0czoge3h9LFxuICAgICAgICBhdHRyczoge3NoYXBlOiBbLTEsIHV0aWwuc2l6ZUZyb21TaGFwZSh4LnNoYXBlLnNsaWNlKGF4aXMpKV19LFxuICAgICAgICBiYWNrZW5kXG4gICAgICB9KSk7XG5cbiAgcmV0dXJuIHt0ZW5zb3JzMkQsIG91dFNoYXBlfTtcbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIENvbnYyRCwgQ29udjJEQXR0cnMsIENvbnYyRElucHV0cywgZW52LCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge0NvbnYyRFByb2dyYW19IGZyb20gJy4uL2NvbnZfZ3B1JztcbmltcG9ydCB7Y29udjJkQnlNYXRNdWwsIGNvbnYyZFdpdGhJbTJSb3d9IGZyb20gJy4vQ29udjJEX2ltcGwnO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL1Jlc2hhcGUnO1xuXG5leHBvcnQgZnVuY3Rpb24gY29udjJkKFxuICAgIGFyZ3M6XG4gICAgICAgIHtpbnB1dHM6IENvbnYyRElucHV0cywgYXR0cnM6IENvbnYyREF0dHJzLCBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMfSkge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eCwgZmlsdGVyfSA9IGlucHV0cztcbiAgY29uc3Qge3N0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdCwgZGlsYXRpb25zLCBkaW1Sb3VuZGluZ01vZGV9ID0gYXR0cnM7XG5cbiAgY29uc3QgJGRhdGFGb3JtYXQgPSBiYWNrZW5kX3V0aWwuY29udmVydENvbnYyRERhdGFGb3JtYXQoZGF0YUZvcm1hdCk7XG4gIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVDb252MkRJbmZvKFxuICAgICAgeC5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICAgIGZpbHRlci5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgc3RyaWRlcywgZGlsYXRpb25zLCBwYWQsXG4gICAgICBkaW1Sb3VuZGluZ01vZGUsIGZhbHNlIC8qIGRlcHRod2lzZSAqLywgJGRhdGFGb3JtYXQpO1xuICBsZXQgb3V0OiBUZW5zb3JJbmZvO1xuXG4gIGlmIChjb252SW5mby5maWx0ZXJIZWlnaHQgPT09IDEgJiYgY29udkluZm8uZmlsdGVyV2lkdGggPT09IDEgJiZcbiAgICAgIGNvbnZJbmZvLmRpbGF0aW9uSGVpZ2h0ID09PSAxICYmIGNvbnZJbmZvLmRpbGF0aW9uV2lkdGggPT09IDEgJiZcbiAgICAgIGNvbnZJbmZvLnN0cmlkZUhlaWdodCA9PT0gMSAmJiBjb252SW5mby5zdHJpZGVXaWR0aCA9PT0gMSAmJlxuICAgICAgKGNvbnZJbmZvLnBhZEluZm8udHlwZSA9PT0gJ1NBTUUnIHx8IGNvbnZJbmZvLnBhZEluZm8udHlwZSA9PT0gJ1ZBTElEJykpIHtcbiAgICBvdXQgPSBjb252MmRCeU1hdE11bCh7eCwgZmlsdGVyLCBjb252SW5mbywgYmFja2VuZH0pO1xuICB9IGVsc2UgaWYgKGVudigpLmdldEJvb2woJ1dFQkdMX0NPTlZfSU0yQ09MJykgJiYgeC5zaGFwZVswXSA9PT0gMSkge1xuICAgIG91dCA9IGNvbnYyZFdpdGhJbTJSb3coe3gsIGZpbHRlciwgY29udkluZm8sIGJhY2tlbmR9KTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBwcm9ncmFtID0gbmV3IENvbnYyRFByb2dyYW0oY29udkluZm8pO1xuICAgIG91dCA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFt4LCBmaWx0ZXJdLCAnZmxvYXQzMicpO1xuICB9XG5cbiAgY29uc3Qgb3V0UmVzaGFwZWQgPVxuICAgICAgcmVzaGFwZSh7aW5wdXRzOiB7eDogb3V0fSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogY29udkluZm8ub3V0U2hhcGV9fSk7XG4gIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ob3V0KTtcblxuICByZXR1cm4gb3V0UmVzaGFwZWQ7XG59XG5cbmV4cG9ydCBjb25zdCBjb252MkRDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQ29udjJELFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogY29udjJkIGFzIHt9IGFzIEtlcm5lbEZ1bmMsXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgQ29udjJEQmFja3Byb3BGaWx0ZXIsIENvbnYyREJhY2twcm9wRmlsdGVyQXR0cnMsIENvbnYyREJhY2twcm9wRmlsdGVySW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmN9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge0NvbnYyRERlckZpbHRlclByb2dyYW19IGZyb20gJy4uL2NvbnZfYmFja3Byb3BfZ3B1JztcblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnYyREJhY2twcm9wRmlsdGVyKGFyZ3M6IHtcbiAgaW5wdXRzOiBDb252MkRCYWNrcHJvcEZpbHRlcklucHV0cyxcbiAgYXR0cnM6IENvbnYyREJhY2twcm9wRmlsdGVyQXR0cnMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0xcbn0pIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3gsIGR5fSA9IGlucHV0cztcbiAgY29uc3Qge3N0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdCwgZGltUm91bmRpbmdNb2RlLCBmaWx0ZXJTaGFwZX0gPSBhdHRycztcblxuICBjb25zdCAkZGF0YUZvcm1hdCA9IGJhY2tlbmRfdXRpbC5jb252ZXJ0Q29udjJERGF0YUZvcm1hdChkYXRhRm9ybWF0KTtcbiAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZUNvbnYyREluZm8oXG4gICAgICB4LnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLCBmaWx0ZXJTaGFwZSwgc3RyaWRlcyxcbiAgICAgIDEgLyogZGlsYXRpb25zICovLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSwgZmFsc2UgLyogZGVwdGh3aXNlICovLFxuICAgICAgJGRhdGFGb3JtYXQpO1xuXG4gIGNvbnN0IHByb2dyYW0gPSBuZXcgQ29udjJERGVyRmlsdGVyUHJvZ3JhbShjb252SW5mbyk7XG4gIHJldHVybiBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbeCwgZHldLCAnZmxvYXQzMicpO1xufVxuXG5leHBvcnQgY29uc3QgY29udjJEQmFja3Byb3BGaWx0ZXJDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQ29udjJEQmFja3Byb3BGaWx0ZXIsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBjb252MkRCYWNrcHJvcEZpbHRlciBhcyB7fSBhcyBLZXJuZWxGdW5jLFxufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIENvbnYyREJhY2twcm9wSW5wdXQsIENvbnYyREJhY2twcm9wSW5wdXRBdHRycywgQ29udjJEQmFja3Byb3BJbnB1dElucHV0cywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtDb252MkREZXJJbnB1dFByb2dyYW19IGZyb20gJy4uL2NvbnZfYmFja3Byb3BfZ3B1JztcblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnYyREJhY2twcm9wSW5wdXQoYXJnczoge1xuICBpbnB1dHM6IENvbnYyREJhY2twcm9wSW5wdXRJbnB1dHMsXG4gIGF0dHJzOiBDb252MkRCYWNrcHJvcElucHV0QXR0cnMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0xcbn0pIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge2R5LCBmaWx0ZXJ9ID0gaW5wdXRzO1xuICBjb25zdCB7aW5wdXRTaGFwZSwgc3RyaWRlcywgcGFkLCBkYXRhRm9ybWF0LCBkaW1Sb3VuZGluZ01vZGV9ID0gYXR0cnM7XG5cbiAgY29uc3QgJGRhdGFGb3JtYXQgPSBiYWNrZW5kX3V0aWwuY29udmVydENvbnYyRERhdGFGb3JtYXQoZGF0YUZvcm1hdCk7XG4gIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVDb252MkRJbmZvKFxuICAgICAgaW5wdXRTaGFwZSwgZmlsdGVyLnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLCBzdHJpZGVzLFxuICAgICAgMSAvKiBkaWxhdGlvbnMgKi8sIHBhZCwgZGltUm91bmRpbmdNb2RlLCBmYWxzZSwgJGRhdGFGb3JtYXQpO1xuXG4gIGNvbnN0IHByb2dyYW0gPSBuZXcgQ29udjJERGVySW5wdXRQcm9ncmFtKGNvbnZJbmZvKTtcbiAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFtkeSwgZmlsdGVyXSwgJ2Zsb2F0MzInKTtcbn1cblxuZXhwb3J0IGNvbnN0IGNvbnYyREJhY2twcm9wSW5wdXRDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQ29udjJEQmFja3Byb3BJbnB1dCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGNvbnYyREJhY2twcm9wSW5wdXQgYXMge30gYXMgS2VybmVsRnVuYyxcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBUZW5zb3JJbmZvLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtJbTJDb2xQYWNrZWRQcm9ncmFtfSBmcm9tICcuLi9pbTJjb2xfcGFja2VkX2dwdSc7XG5pbXBvcnQge21hcEFjdGl2YXRpb25Ub1NoYWRlclByb2dyYW19IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuaW1wb3J0IHtNYXRNdWxQYWNrZWRQcm9ncmFtfSBmcm9tICcuLi9tdWxtYXRfcGFja2VkX2dwdSc7XG5pbXBvcnQgKiBhcyB3ZWJnbF91dGlsIGZyb20gJy4uL3dlYmdsX3V0aWwnO1xuXG5pbXBvcnQge2JhdGNoTWF0TXVsSW1wbCwgTUFUTVVMX1NIQVJFRF9ESU1fVEhSRVNIT0xEfSBmcm9tICcuL0JhdGNoTWF0TXVsX2ltcGwnO1xuaW1wb3J0IHtpZGVudGl0eX0gZnJvbSAnLi9JZGVudGl0eSc7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4vUmVzaGFwZSc7XG5cbnR5cGUgQ29udjJEQ29uZmlnID0ge1xuICB4OiBUZW5zb3JJbmZvLFxuICBmaWx0ZXI6IFRlbnNvckluZm8sXG4gIGNvbnZJbmZvOiBiYWNrZW5kX3V0aWwuQ29udjJESW5mbyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYmlhcz86IFRlbnNvckluZm8sXG4gIHByZWx1QWN0aXZhdGlvbldlaWdodHM/OiBUZW5zb3JJbmZvLFxuICBsZWFreXJlbHVBbHBoYT86IG51bWJlcixcbiAgYWN0aXZhdGlvbj86IGJhY2tlbmRfdXRpbC5BY3RpdmF0aW9uXG59O1xuXG4vLyBGb3IgMXgxIGtlcm5lbHMgdGhhdCBpdGVyYXRlIHRocm91Z2ggZXZlcnkgcG9pbnQgaW4gdGhlIGlucHV0LCBjb252b2x1dGlvblxuLy8gY2FuIGJlIGV4cHJlc3NlZCBhcyBtYXRyaXggbXVsdGlwbGljYXRpb24gKHdpdGhvdXQgbmVlZCBmb3IgbWVtb3J5XG4vLyByZW1hcHBpbmcpLlxuZXhwb3J0IGZ1bmN0aW9uIGNvbnYyZEJ5TWF0TXVsKHtcbiAgeCxcbiAgZmlsdGVyLFxuICBjb252SW5mbyxcbiAgYmFja2VuZCxcbiAgYmlhcyA9IG51bGwsXG4gIHByZWx1QWN0aXZhdGlvbldlaWdodHMgPSBudWxsLFxuICBsZWFreXJlbHVBbHBoYSA9IDAsXG4gIGFjdGl2YXRpb24gPSBudWxsXG59OiBDb252MkRDb25maWcpIHtcbiAgLy8gUmVzaGFwZXMgY29udjJEIGlucHV0IHRvIDJEIHRlbnNvcnMsIHVzZXMgbWF0TXVsIGFuZCB0aGVuIHJlc2hhcGUgdGhlXG4gIC8vIHJlc3VsdCBmcm9tIDJEIHRvIDRELlxuICBjb25zdCB4U2hhcGUgPSB4LnNoYXBlO1xuICBjb25zdCB4VGV4RGF0YSA9IGJhY2tlbmQudGV4RGF0YS5nZXQoeC5kYXRhSWQpO1xuICBjb25zdCBzaGFyZWRNYXRNdWxEaW0gPSBjb252SW5mby5pbkNoYW5uZWxzO1xuICBjb25zdCBvdXRlclNoYXBlWCA9IHhTaGFwZVswXSAqIHhTaGFwZVsxXSAqIHhTaGFwZVsyXTtcbiAgY29uc3Qgb3V0ZXJTaGFwZUZpbHRlciA9IGNvbnZJbmZvLm91dENoYW5uZWxzO1xuICBjb25zdCBpc0NoYW5uZWxzTGFzdCA9IGNvbnZJbmZvLmRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0xhc3QnO1xuICBjb25zdCB0cmFuc3Bvc2VBID0gZmFsc2U7XG4gIGNvbnN0IHRyYW5zcG9zZUIgPSBmYWxzZTtcblxuICBsZXQgb3V0OiBUZW5zb3JJbmZvO1xuICBjb25zdCBpbnRlcm1lZGlhdGVzOiBUZW5zb3JJbmZvW10gPSBbXTtcblxuICAvLyBUT0RPOiBPbmNlIHJlZHVjdGlvbiBvcHMgYXJlIHBhY2tlZCwgYmF0Y2hNYXRNdWwgd2lsbCBhbHdheXMgYmUgcGFja2VkXG4gIC8vIGFuZCB3ZSBjYW4gcmVtb3ZlIHRoaXMgY29uZGl0aW9uLlxuICBjb25zdCBiYXRjaE1hdE11bFdpbGxCZVVucGFja2VkID1cbiAgICAgIChvdXRlclNoYXBlWCA9PT0gMSB8fCBvdXRlclNoYXBlRmlsdGVyID09PSAxKSAmJlxuICAgICAgc2hhcmVkTWF0TXVsRGltID4gTUFUTVVMX1NIQVJFRF9ESU1fVEhSRVNIT0xEO1xuXG4gIC8vIFRoZSBhbGdvcml0aG0gaW4gdGhlIGlmIGNvbmRpdGlvbiBhc3N1bWVzICgxKSB0aGUgb3V0cHV0IHdpbGwgYmUgcGFja2VkLFxuICAvLyAoMikgeCBpcyBwYWNrZWQsICgzKSB4IGlzQ2hhbm5lbHNMYXN0LCAoNCkgIHgncyBwYWNrZWQgdGV4dHVyZSBpcyBhbHJlYWR5XG4gIC8vIG9uIEdQVSwgKDUpIGNvbCBpcyBvZGQsICg2KSB0aGUgd2lkdGgsIGhlaWdodCBhbmQgaW5DaGFubmVscyBhcmUgdGhlIHNhbWVcbiAgLy8gZm9yIHhUZXhEYXRhLnNoYXBlIGFuZCB4U2hhcGUuXG4gIGNvbnN0IGNhbk9wdGltaXplID0gIWJhdGNoTWF0TXVsV2lsbEJlVW5wYWNrZWQgJiYgeFRleERhdGEuaXNQYWNrZWQgJiZcbiAgICAgIGlzQ2hhbm5lbHNMYXN0ICYmIHhUZXhEYXRhLnRleHR1cmUgIT0gbnVsbCAmJiB4U2hhcGVbMl0gJSAyICE9PSAwICYmXG4gICAgICB1dGlsLmFycmF5c0VxdWFsKHhUZXhEYXRhLnNoYXBlLnNsaWNlKC0zKSwgeFNoYXBlLnNsaWNlKC0zKSk7XG5cbiAgaWYgKGNhbk9wdGltaXplKSB7XG4gICAgLy8gV2UgYXZvaWQgZXhwZW5zaXZlIHBhY2tlZCAyeDIgcmVzaGFwZSBieSBwYWRkaW5nIGNvbCBjb3VudCB0byBuZXh0LFxuICAgIC8vIGV2ZW4gbnVtYmVyLiBXaGVuIGNvbCBpcyBvZGQsIHRoZSByZXN1bHQgb2YgcGFja2VkIGJhdGNoTWF0TXVsIGlzXG4gICAgLy8gdGhlIHNhbWUgKGhhcyB0aGUgc2FtZSB0ZXh0dXJlIGxheW91dCBhbmQgYW5kIHZhbHVlcyBpbiB0aGUgdGV4dHVyZSkgYXNcbiAgICAvLyBpdCBpcyBmb3IgbmV4dCBldmVuIGNvbC4gV2UgbWFrZSB0aGUgb2RkLWNvbHMgdGVuc29yIHRvIGxvb2sgbGlrZVxuICAgIC8vIGV2ZW4tY29scyB0ZW5zb3IgYmVmb3JlIHRoZSBvcGVyYXRpb24gYW5kLCBhZnRlciB0aGUgYmF0Y2hNYXRNdWwsXG4gICAgLy8gZml4IHRoZSBldmVuLWNvbHMgcmVzdWx0IHRvIGhhdmUgb2RkIG51bWJlciBvZiBjb2xzLlxuICAgIGNvbnN0IHRhcmdldFNoYXBlID0geFNoYXBlWzBdICogeFNoYXBlWzFdICogKHhTaGFwZVsyXSArIDEpO1xuICAgIGNvbnN0IHhSZXNoYXBlZDogVGVuc29ySW5mbyA9IHtcbiAgICAgIGRhdGFJZDogeC5kYXRhSWQsXG4gICAgICBzaGFwZTogWzEsIHRhcmdldFNoYXBlLCBjb252SW5mby5pbkNoYW5uZWxzXSxcbiAgICAgIGR0eXBlOiB4LmR0eXBlXG4gICAgfTtcbiAgICAvLyB4VGV4RGF0YS5zaGFwZSBnZXRzIHJlZmVyZW5jZWQgZnJvbSBHUEdQVUJpbmFyeS5pblNoYXBlSW5mb3MuXG4gICAgLy8gRGVjcmVtZW50aW5nIGNvbCBjb3VudCwgYWZ0ZXIgYmF0Y2hNYXRNdWwtPi4uLi0+Y29tcGlsZVByb2dyYW0gbGVhZHMgdG9cbiAgICAvLyBpbnZhbGlkIGNvbCBjb3VudCB3aXRoaW4gdGhlIHJlZmVyZW5jZSBpbiBHUEdQVUJpbmFyeS5pblNoYXBlSW5mb3MuXG4gICAgLy8gQWx0ZXJuYXRpdmUgZml4IHdvdWxkIGJlIHRvIHByb3ZpZGUgYSBjb3B5IHRvIEdQR1BVQmluYXJ5LmluU2hhcGVJbmZvc1xuICAgIC8vIGluIGNvbXBpbGVQcm9ncmFtIG1ldGhvZCwgYnV0IHRoYXQgd291bGQgYWZmZWN0IGNvbXBpbGF0aW9uIG9mIGFsbFxuICAgIC8vIHByb2dyYW1zIC0gaW5zdGVhZCwgcHJvdmlkZSBhIGNvcHkgaGVyZSwgd2l0aCBldmVuIGNvbCBjb3VudCwgYmVmb3JlXG4gICAgLy8gY2FsbGluZyBiYXRjaE1hdE11bC0+Li4uLT5jb21waWxlUHJvZ3JhbSBhbmQgYWZ0ZXIgdGhhdCwgdGhlIG9yaWdpbmFsXG4gICAgLy8geFRleERhdGEuc2hhcGUgaXMgcmVzdG9yZWQuXG4gICAgY29uc3Qgb3JpZ2luYWxYVGV4RGF0YVNoYXBlID0geFRleERhdGEuc2hhcGU7XG4gICAgeFRleERhdGEuc2hhcGUgPSB4VGV4RGF0YS5zaGFwZS5zbGljZSgpO1xuICAgIHhUZXhEYXRhLnNoYXBlW3hUZXhEYXRhLnNoYXBlLmxlbmd0aCAtIDJdKys7XG4gICAgdXRpbC5hc3NlcnQoXG4gICAgICAgIHdlYmdsX3V0aWwuaXNSZXNoYXBlRnJlZSh4VGV4RGF0YS5zaGFwZSwgeFJlc2hhcGVkLnNoYXBlKSxcbiAgICAgICAgKCkgPT4gYHBhY2tlZCByZXNoYXBlICR7eFRleERhdGEuc2hhcGV9IHRvICR7XG4gICAgICAgICAgICB4UmVzaGFwZWQuc2hhcGV9IGlzbid0IGZyZWVgKTtcbiAgICBjb25zdCBmaWx0ZXJSZXNoYXBlZCA9IHJlc2hhcGUoe1xuICAgICAgaW5wdXRzOiB7eDogZmlsdGVyfSxcbiAgICAgIGJhY2tlbmQsXG4gICAgICBhdHRyczoge3NoYXBlOiBbMSwgY29udkluZm8uaW5DaGFubmVscywgY29udkluZm8ub3V0Q2hhbm5lbHNdfVxuICAgIH0pO1xuICAgIGludGVybWVkaWF0ZXMucHVzaChmaWx0ZXJSZXNoYXBlZCk7XG4gICAgY29uc3QgcG9pbnR3aXNlQ29udiA9IGJhdGNoTWF0TXVsSW1wbCh7XG4gICAgICBhOiB4UmVzaGFwZWQsXG4gICAgICBiOiBmaWx0ZXJSZXNoYXBlZCxcbiAgICAgIGJhY2tlbmQsXG4gICAgICB0cmFuc3Bvc2VBLFxuICAgICAgdHJhbnNwb3NlQixcbiAgICAgIGJpYXMsXG4gICAgICBhY3RpdmF0aW9uLFxuICAgICAgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyxcbiAgICAgIGxlYWt5cmVsdUFscGhhXG4gICAgfSk7XG5cbiAgICBjb25zdCBwb2ludHdpc2VDb252VGV4RGF0YSA9IGJhY2tlbmQudGV4RGF0YS5nZXQocG9pbnR3aXNlQ29udi5kYXRhSWQpO1xuICAgIHV0aWwuYXNzZXJ0KFxuICAgICAgICBwb2ludHdpc2VDb252VGV4RGF0YS5pc1BhY2tlZCxcbiAgICAgICAgKCkgPT4gJ2JhdGNoTWF0TXVsIHJlc3VsdCBpcyBleHBlY3RlZCB0byBiZSBwYWNrZWQnKTtcbiAgICAvLyBSZXN0b3JlIHRoZSBpbnB1dCBzaGFwZSB0byBvcmlnaW5hbC5cbiAgICB4VGV4RGF0YS5zaGFwZSA9IG9yaWdpbmFsWFRleERhdGFTaGFwZTtcbiAgICAvLyBTZXQgdGhlIG91dHB1dCBzaGFwZSAtIHRoZXJlIGlzIG5vIG5lZWQgZm9yIGV4cGVuc2l2ZSByZXNoYXBlIGFzIGRhdGFcbiAgICAvLyBsYXlvdXQgaXMgYWxyZWFkeSBjb3JyZWN0LlxuICAgIHBvaW50d2lzZUNvbnZUZXhEYXRhLnNoYXBlID0gY29udkluZm8ub3V0U2hhcGU7XG5cbiAgICBvdXQgPSBpZGVudGl0eSh7aW5wdXRzOiB7eDogcG9pbnR3aXNlQ29udn0sIGJhY2tlbmR9KTtcbiAgICBvdXQuc2hhcGUgPSBjb252SW5mby5vdXRTaGFwZTtcblxuICAgIGludGVybWVkaWF0ZXMucHVzaChwb2ludHdpc2VDb252KTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCB0YXJnZXRTaGFwZSA9IGlzQ2hhbm5lbHNMYXN0ID8geFNoYXBlWzBdICogeFNoYXBlWzFdICogeFNoYXBlWzJdIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFNoYXBlWzBdICogeFNoYXBlWzJdICogeFNoYXBlWzNdO1xuICAgIGNvbnN0IHhSZXNoYXBlZCA9IHJlc2hhcGUoe1xuICAgICAgaW5wdXRzOiB7eH0sXG4gICAgICBiYWNrZW5kLFxuICAgICAgYXR0cnM6IHtzaGFwZTogWzEsIHRhcmdldFNoYXBlLCBjb252SW5mby5pbkNoYW5uZWxzXX1cbiAgICB9KTtcbiAgICBjb25zdCBmaWx0ZXJSZXNoYXBlZCA9IHJlc2hhcGUoe1xuICAgICAgaW5wdXRzOiB7eDogZmlsdGVyfSxcbiAgICAgIGJhY2tlbmQsXG4gICAgICBhdHRyczoge3NoYXBlOiBbMSwgY29udkluZm8uaW5DaGFubmVscywgY29udkluZm8ub3V0Q2hhbm5lbHNdfVxuICAgIH0pO1xuICAgIGNvbnN0IHJlc3VsdCA9IGJhdGNoTWF0TXVsSW1wbCh7XG4gICAgICBhOiB4UmVzaGFwZWQsXG4gICAgICBiOiBmaWx0ZXJSZXNoYXBlZCxcbiAgICAgIHRyYW5zcG9zZUEsXG4gICAgICB0cmFuc3Bvc2VCLFxuICAgICAgYmFja2VuZCxcbiAgICAgIGJpYXMsXG4gICAgICBhY3RpdmF0aW9uLFxuICAgICAgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyxcbiAgICAgIGxlYWt5cmVsdUFscGhhXG4gICAgfSk7XG5cbiAgICBvdXQgPSByZXNoYXBlKFxuICAgICAgICB7aW5wdXRzOiB7eDogcmVzdWx0fSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogY29udkluZm8ub3V0U2hhcGV9fSk7XG5cbiAgICBpbnRlcm1lZGlhdGVzLnB1c2goeFJlc2hhcGVkKTtcbiAgICBpbnRlcm1lZGlhdGVzLnB1c2goZmlsdGVyUmVzaGFwZWQpO1xuICAgIGludGVybWVkaWF0ZXMucHVzaChyZXN1bHQpO1xuICB9XG5cbiAgZm9yIChjb25zdCBpIG9mIGludGVybWVkaWF0ZXMpIHtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGkpO1xuICB9XG5cbiAgcmV0dXJuIG91dDtcbn1cblxuLy8gSW1wbGVtZW50cyB0aGUgaW0ycm93IGFsZ29yaXRobSBhcyBvdXRsaW5lZCBpbiBcIkhpZ2ggUGVyZm9ybWFuY2Vcbi8vIENvbnZvbHV0aW9uYWwgTmV1cmFsIE5ldHdvcmtzIGZvciBEb2N1bWVudCBQcm9jZXNzaW5nXCIgKFN1dmlzb2Z0LCAyMDA2KVxuZXhwb3J0IGZ1bmN0aW9uIGNvbnYyZFdpdGhJbTJSb3coe1xuICB4LFxuICBmaWx0ZXIsXG4gIGNvbnZJbmZvLFxuICBiYWNrZW5kLFxuICBiaWFzID0gbnVsbCxcbiAgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyA9IG51bGwsXG4gIGxlYWt5cmVsdUFscGhhID0gMCxcbiAgYWN0aXZhdGlvbiA9IG51bGxcbn06IENvbnYyRENvbmZpZykge1xuICAvLyBSZWFycmFuZ2VzIGNvbnYyZCBpbnB1dCBzbyBlYWNoIGJsb2NrIHRvIGJlIGNvbnZvbHZlZCBvdmVyIGZvcm1zIHRoZVxuICAvLyBjb2x1bW4gb2YgYSBuZXcgbWF0cml4IHdpdGggc2hhcGUgW2ZpbHRlcldpZHRoICogZmlsdGVySGVpZ2h0ICpcbiAgLy8gaW5DaGFubmVscywgb3V0SGVpZ2h0ICogb3V0V2lkdGhdLiBUaGUgZmlsdGVyIGlzIGFsc28gcmVhcnJhbmdlZCBzbyBlYWNoXG4gIC8vIG91dHB1dCBjaGFubmVsIGZvcm1zIGEgcm93IG9mIGEgbmV3IG1hdHJpeCB3aXRoIHNoYXBlIFtvdXRDaGFubmVscyxcbiAgLy8gZmlsdGVyV2lkdGggKiBmaWx0ZXJIZWlnaHQgKiBpbkNoYW5uZWxzXS4gVGhlIGNvbnZvbHV0aW9uIGlzIHRoZW5cbiAgLy8gY29tcHV0ZWQgYnkgbXVsdGlwbHlpbmcgdGhlc2UgbWF0cmljZXMgYW5kIHJlc2hhcGluZyB0aGUgcmVzdWx0LlxuICBjb25zdCB7XG4gICAgZmlsdGVyV2lkdGgsXG4gICAgZmlsdGVySGVpZ2h0LFxuICAgIGluQ2hhbm5lbHMsXG4gICAgb3V0V2lkdGgsXG4gICAgb3V0SGVpZ2h0LFxuICAgIGRhdGFGb3JtYXRcbiAgfSA9IGNvbnZJbmZvO1xuXG4gIGNvbnN0IGlzQ2hhbm5lbHNMYXN0ID0gZGF0YUZvcm1hdCA9PT0gJ2NoYW5uZWxzTGFzdCc7XG5cbiAgY29uc3Qgc2hhcmVkRGltID0gZmlsdGVyV2lkdGggKiBmaWx0ZXJIZWlnaHQgKiBpbkNoYW5uZWxzO1xuICBjb25zdCBudW1Db2xzID0gb3V0SGVpZ2h0ICogb3V0V2lkdGg7XG4gIGNvbnN0IHgyQ29sU2hhcGUgPSBbc2hhcmVkRGltLCBudW1Db2xzXTtcbiAgY29uc3QgdHJhbnNwb3NlQSA9IHRydWU7XG4gIGNvbnN0IHRyYW5zcG9zZUIgPSBmYWxzZTtcblxuICBjb25zdCBpbnRlcm1lZGlhdGVzOiBUZW5zb3JJbmZvW10gPSBbXTtcblxuICBjb25zdCB4U3F1ZWV6ZWQgPVxuICAgICAgcmVzaGFwZSh7aW5wdXRzOiB7eH0sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IHguc2hhcGUuc2xpY2UoMSl9fSk7XG4gIGNvbnN0IHcyUm93ID0gcmVzaGFwZSh7XG4gICAgaW5wdXRzOiB7eDogZmlsdGVyfSxcbiAgICBiYWNrZW5kLFxuICAgIGF0dHJzOiB7c2hhcGU6IFsxLCBzaGFyZWREaW0sIHV0aWwuc2l6ZUZyb21TaGFwZShmaWx0ZXIuc2hhcGUpIC8gc2hhcmVkRGltXX1cbiAgfSk7XG5cbiAgaW50ZXJtZWRpYXRlcy5wdXNoKHhTcXVlZXplZCk7XG4gIGludGVybWVkaWF0ZXMucHVzaCh3MlJvdyk7XG5cbiAgY29uc3QgaW0yQ29sUHJvZ3JhbSA9IG5ldyBJbTJDb2xQYWNrZWRQcm9ncmFtKHgyQ29sU2hhcGUsIGNvbnZJbmZvKTtcbiAgY29uc3QgY3VzdG9tVmFsdWVzID0gW1xuICAgIHhTcXVlZXplZC5zaGFwZSwgW2NvbnZJbmZvLnBhZEluZm8udG9wLCBjb252SW5mby5wYWRJbmZvLmxlZnRdLFxuICAgIFtjb252SW5mby5zdHJpZGVIZWlnaHQsIGNvbnZJbmZvLnN0cmlkZVdpZHRoXSxcbiAgICBbY29udkluZm8uZGlsYXRpb25IZWlnaHQsIGNvbnZJbmZvLmRpbGF0aW9uV2lkdGhdLCBbY29udkluZm8uaW5DaGFubmVsc10sXG4gICAgW2NvbnZJbmZvLmZpbHRlcldpZHRoICogY29udkluZm8uaW5DaGFubmVsc10sIFtjb252SW5mby5vdXRXaWR0aF1cbiAgXTtcbiAgY29uc3QgaW0yQ29sID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0oXG4gICAgICBpbTJDb2xQcm9ncmFtLCBbeFNxdWVlemVkXSwgJ2Zsb2F0MzInLCBjdXN0b21WYWx1ZXMpO1xuICBjb25zdCBpbTJDb2xSZXNoYXBlZCA9IHJlc2hhcGUoe1xuICAgIGlucHV0czoge3g6IGltMkNvbH0sXG4gICAgYmFja2VuZCxcbiAgICBhdHRyczoge3NoYXBlOiBbMSwgeDJDb2xTaGFwZVswXSwgeDJDb2xTaGFwZVsxXV19XG4gIH0pO1xuXG4gIGludGVybWVkaWF0ZXMucHVzaChpbTJDb2wpO1xuICBpbnRlcm1lZGlhdGVzLnB1c2goaW0yQ29sUmVzaGFwZWQpO1xuXG4gIGNvbnN0IGhhc0JpYXMgPSBiaWFzICE9IG51bGw7XG4gIGNvbnN0IGhhc1ByZWx1QWN0aXZhdGlvbldlaWdodHMgPSBwcmVsdUFjdGl2YXRpb25XZWlnaHRzICE9IG51bGw7XG4gIGNvbnN0IGhhc0xlYWt5cmVsdUFscGhhID0gYWN0aXZhdGlvbiA9PT0gJ2xlYWt5cmVsdSc7XG4gIGNvbnN0IGZ1c2VkQWN0aXZhdGlvbiA9XG4gICAgICBhY3RpdmF0aW9uID8gbWFwQWN0aXZhdGlvblRvU2hhZGVyUHJvZ3JhbShhY3RpdmF0aW9uLCB0cnVlKSA6IG51bGw7XG4gIGNvbnN0IG1hdG11bFByb2dyYW0gPSBuZXcgTWF0TXVsUGFja2VkUHJvZ3JhbShcbiAgICAgIGltMkNvbFJlc2hhcGVkLnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICAgIHcyUm93LnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICAgIFsxLCBudW1Db2xzLCBjb252SW5mby5vdXRDaGFubmVsc10sIHRyYW5zcG9zZUEsIHRyYW5zcG9zZUIsIGhhc0JpYXMsXG4gICAgICBmdXNlZEFjdGl2YXRpb24sIGhhc1ByZWx1QWN0aXZhdGlvbldlaWdodHMsIGhhc0xlYWt5cmVsdUFscGhhKTtcbiAgY29uc3QgaW5wdXRzOiBUZW5zb3JJbmZvW10gPSBbaW0yQ29sUmVzaGFwZWQsIHcyUm93XTtcbiAgaWYgKGJpYXMpIHtcbiAgICBpbnB1dHMucHVzaChiaWFzKTtcbiAgfVxuICBpZiAoaGFzUHJlbHVBY3RpdmF0aW9uV2VpZ2h0cykge1xuICAgIGlucHV0cy5wdXNoKHByZWx1QWN0aXZhdGlvbldlaWdodHMpO1xuICB9XG4gIGlmIChoYXNMZWFreXJlbHVBbHBoYSkge1xuICAgIGNvbnN0ICRsZWFreXJlbHVBbHBoYSA9IGJhY2tlbmQubWFrZVRlbnNvckluZm8oXG4gICAgICAgIFtdLCAnZmxvYXQzMicsXG4gICAgICAgIHV0aWwuY3JlYXRlU2NhbGFyVmFsdWUobGVha3lyZWx1QWxwaGEgYXMge30gYXMgJ2Zsb2F0MzInLCAnZmxvYXQzMicpKTtcbiAgICBpbnB1dHMucHVzaCgkbGVha3lyZWx1QWxwaGEpO1xuICAgIGludGVybWVkaWF0ZXMucHVzaCgkbGVha3lyZWx1QWxwaGEpO1xuICB9XG4gIGNvbnN0IHByb2R1Y3QgPSBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShtYXRtdWxQcm9ncmFtLCBpbnB1dHMsICdmbG9hdDMyJyk7XG5cbiAgY29uc3Qgb3V0U2hhcGUgPSBpc0NoYW5uZWxzTGFzdCA/XG4gICAgICBbMSwgb3V0SGVpZ2h0LCBvdXRXaWR0aCwgY29udkluZm8ub3V0Q2hhbm5lbHNdIDpcbiAgICAgIFsxLCBjb252SW5mby5vdXRDaGFubmVscywgb3V0SGVpZ2h0LCBvdXRXaWR0aF07XG4gIGNvbnN0IG91dCA9XG4gICAgICByZXNoYXBlKHtpbnB1dHM6IHt4OiBwcm9kdWN0fSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogb3V0U2hhcGV9fSk7XG5cbiAgaW50ZXJtZWRpYXRlcy5wdXNoKHByb2R1Y3QpO1xuICBmb3IgKGNvbnN0IGkgb2YgaW50ZXJtZWRpYXRlcykge1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oaSk7XG4gIH1cblxuICByZXR1cm4gb3V0O1xufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgQ29udjNELCBDb252M0RBdHRycywgQ29udjNESW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmN9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge0NvbnYzRFByb2dyYW19IGZyb20gJy4uL2NvbnZfZ3B1JztcblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnYzRChcbiAgICBhcmdzOlxuICAgICAgICB7aW5wdXRzOiBDb252M0RJbnB1dHMsIGF0dHJzOiBDb252M0RBdHRycywgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTH0pIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3gsIGZpbHRlcn0gPSBpbnB1dHM7XG4gIGNvbnN0IHtzdHJpZGVzLCBwYWQsIGRpbGF0aW9uc30gPSBhdHRycztcblxuICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlQ29udjNESW5mbyhcbiAgICAgIHguc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICAgIGZpbHRlci5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLCBzdHJpZGVzLFxuICAgICAgZGlsYXRpb25zLCBwYWQpO1xuXG4gIGNvbnN0IHByb2dyYW0gPSBuZXcgQ29udjNEUHJvZ3JhbShjb252SW5mbyk7XG4gIHJldHVybiBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbeCwgZmlsdGVyXSwgJ2Zsb2F0MzInKTtcbn1cblxuZXhwb3J0IGNvbnN0IGNvbnYzRENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBDb252M0QsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBjb252M0QgYXMge30gYXMgS2VybmVsRnVuYyxcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBDb252M0RCYWNrcHJvcEZpbHRlclYyLCBDb252M0RCYWNrcHJvcEZpbHRlclYyQXR0cnMsIENvbnYzREJhY2twcm9wRmlsdGVyVjJJbnB1dHMsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuY30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7Q29udjNERGVyRmlsdGVyUHJvZ3JhbX0gZnJvbSAnLi4vY29udl9iYWNrcHJvcF9ncHUnO1xuXG5leHBvcnQgZnVuY3Rpb24gY29udjNEQmFja3Byb3BGaWx0ZXJWMihhcmdzOiB7XG4gIGlucHV0czogQ29udjNEQmFja3Byb3BGaWx0ZXJWMklucHV0cyxcbiAgYXR0cnM6IENvbnYzREJhY2twcm9wRmlsdGVyVjJBdHRycyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTFxufSkge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eCwgZHl9ID0gaW5wdXRzO1xuICBjb25zdCB7c3RyaWRlcywgcGFkLCBmaWx0ZXJTaGFwZX0gPSBhdHRycztcblxuICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlQ29udjNESW5mbyhcbiAgICAgIHguc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgZmlsdGVyU2hhcGUsIHN0cmlkZXMsXG4gICAgICAxIC8qIGRpbGF0aW9ucyAqLywgcGFkKTtcblxuICBjb25zdCBwcm9ncmFtID0gbmV3IENvbnYzRERlckZpbHRlclByb2dyYW0oY29udkluZm8pO1xuICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3gsIGR5XSwgJ2Zsb2F0MzInKTtcbn1cblxuZXhwb3J0IGNvbnN0IGNvbnYzREJhY2twcm9wRmlsdGVyVjJDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQ29udjNEQmFja3Byb3BGaWx0ZXJWMixcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGNvbnYzREJhY2twcm9wRmlsdGVyVjIgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIENvbnYzREJhY2twcm9wSW5wdXRWMiwgQ29udjNEQmFja3Byb3BJbnB1dFYyQXR0cnMsIENvbnYzREJhY2twcm9wSW5wdXRWMklucHV0cywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtDb252M0REZXJJbnB1dFByb2dyYW19IGZyb20gJy4uL2NvbnZfYmFja3Byb3BfZ3B1JztcblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnYzREJhY2twcm9wSW5wdXQoYXJnczoge1xuICBpbnB1dHM6IENvbnYzREJhY2twcm9wSW5wdXRWMklucHV0cyxcbiAgYXR0cnM6IENvbnYzREJhY2twcm9wSW5wdXRWMkF0dHJzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMXG59KSB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHtkeSwgZmlsdGVyfSA9IGlucHV0cztcbiAgY29uc3Qge3BhZCwgc3RyaWRlcywgaW5wdXRTaGFwZX0gPSBhdHRycztcblxuICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlQ29udjNESW5mbyhcbiAgICAgIGlucHV0U2hhcGUsIGZpbHRlci5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLFxuICAgICAgc3RyaWRlcywgMSAvKiBkaWxhdGlvbnMgKi8sIHBhZCk7XG5cbiAgY29uc3QgcHJvZ3JhbSA9IG5ldyBDb252M0REZXJJbnB1dFByb2dyYW0oY29udkluZm8pO1xuICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW2R5LCBmaWx0ZXJdLCAnZmxvYXQzMicpO1xufVxuXG5leHBvcnQgY29uc3QgY29udjNEQmFja3Byb3BJbnB1dENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBDb252M0RCYWNrcHJvcElucHV0VjIsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBjb252M0RCYWNrcHJvcElucHV0IGFzIHt9IGFzIEtlcm5lbEZ1bmMsXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0NvcywgS2VybmVsQ29uZmlnfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge0NIRUNLX05BTl9TTklQUEVUX1VOQVJZLCB1bmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuXG5jb25zdCBDT1MgPSBDSEVDS19OQU5fU05JUFBFVF9VTkFSWSArIGBcbiAgcmV0dXJuIGNvcyh4KTtcbmA7XG5cbmV4cG9ydCBjb25zdCBjb3MgPSB1bmFyeUtlcm5lbEZ1bmMoe29wU25pcHBldDogQ09TfSk7XG5cbmV4cG9ydCBjb25zdCBjb3NDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQ29zLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogY29zLFxufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtDb3NoLCBLZXJuZWxDb25maWd9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge3VuYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5cbmNvbnN0IENPU0ggPSBgXG4gIGZsb2F0IGUyeCA9IGV4cCgteCk7XG4gIHJldHVybiAoZTJ4ICsgMS4wIC8gZTJ4KSAvIDIuMDtcbmA7XG5cbmV4cG9ydCBjb25zdCBjb3NoID0gdW5hcnlLZXJuZWxGdW5jKHtvcFNuaXBwZXQ6IENPU0h9KTtcblxuZXhwb3J0IGNvbnN0IGNvc2hDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQ29zaCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGNvc2gsXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0Nyb3BBbmRSZXNpemUsIENyb3BBbmRSZXNpemVBdHRycywgQ3JvcEFuZFJlc2l6ZUlucHV0cywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtDcm9wQW5kUmVzaXplUHJvZ3JhbX0gZnJvbSAnLi4vY3JvcF9hbmRfcmVzaXplX2dwdSc7XG5cbmV4cG9ydCBjb25zdCBjcm9wQW5kUmVzaXplID0gKGFyZ3M6IHtcbiAgaW5wdXRzOiBDcm9wQW5kUmVzaXplSW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLFxuICBhdHRyczogQ3JvcEFuZFJlc2l6ZUF0dHJzXG59KTogVGVuc29ySW5mbyA9PiB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHtpbWFnZSwgYm94ZXMsIGJveEluZH0gPSBpbnB1dHM7XG4gIGNvbnN0IHtjcm9wU2l6ZSwgbWV0aG9kLCBleHRyYXBvbGF0aW9uVmFsdWV9ID0gYXR0cnM7XG5cbiAgY29uc3QgcHJvZ3JhbSA9IG5ldyBDcm9wQW5kUmVzaXplUHJvZ3JhbShcbiAgICAgIGltYWdlLnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLFxuICAgICAgYm94ZXMuc2hhcGUgYXMgW251bWJlciwgbnVtYmVyXSwgY3JvcFNpemUsIG1ldGhvZCwgZXh0cmFwb2xhdGlvblZhbHVlKTtcbiAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFtpbWFnZSwgYm94ZXMsIGJveEluZF0sICdmbG9hdDMyJyk7XG59O1xuXG5leHBvcnQgY29uc3QgY3JvcEFuZFJlc2l6ZUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBDcm9wQW5kUmVzaXplLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogY3JvcEFuZFJlc2l6ZSBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgQ3Vtc3VtLCBDdW1zdW1BdHRycywgQ3Vtc3VtSW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge0N1bVN1bVByb2dyYW19IGZyb20gJy4uL2N1bXN1bV9ncHUnO1xuXG5pbXBvcnQge2lkZW50aXR5fSBmcm9tICcuL0lkZW50aXR5JztcbmltcG9ydCB7dHJhbnNwb3NlfSBmcm9tICcuL1RyYW5zcG9zZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjdW1zdW0oXG4gICAgYXJnczpcbiAgICAgICAge2lucHV0czogQ3Vtc3VtSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLCBhdHRyczogQ3Vtc3VtQXR0cnN9KTpcbiAgICBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICBjb25zdCB7YXhpcywgZXhjbHVzaXZlLCByZXZlcnNlfSA9IGF0dHJzO1xuXG4gIGNvbnN0IHhSYW5rID0geC5zaGFwZS5sZW5ndGg7XG4gIGNvbnN0IHBlcm11dGF0aW9uID0gYmFja2VuZF91dGlsLmdldEF4ZXNQZXJtdXRhdGlvbihbYXhpc10sIHhSYW5rKTtcbiAgbGV0IHBlcm11dGVkWCA9IHg7XG4gIGlmIChwZXJtdXRhdGlvbiAhPSBudWxsKSB7XG4gICAgcGVybXV0ZWRYID0gdHJhbnNwb3NlKHtpbnB1dHM6IHt4fSwgYmFja2VuZCwgYXR0cnM6IHtwZXJtOiBwZXJtdXRhdGlvbn19KTtcbiAgfVxuICBjb25zdCBwZXJtdXRlZEF4aXMgPSBiYWNrZW5kX3V0aWwuZ2V0SW5uZXJNb3N0QXhlcygxLCB4UmFuaylbMF07XG5cbiAgaWYgKHBlcm11dGVkQXhpcyAhPT0geFJhbmsgLSAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgV2ViR0wgY3Vtc3VtIHNoYWRlciBleHBlY3RzIGFuIGlubmVyLW1vc3QgYXhpcz0ke1xuICAgICAgICAgICAgeC5zaGFwZS5sZW5ndGggLSAxfSBgICtcbiAgICAgICAgYGJ1dCBnb3QgYXhpcz0ke2F4aXN9YCk7XG4gIH1cbiAgY29uc3Qgc2l6ZSA9IHBlcm11dGVkWC5zaGFwZVtwZXJtdXRlZEF4aXNdO1xuICBsZXQgcmVzdWx0ID0gaWRlbnRpdHkoe2lucHV0czoge3g6IHBlcm11dGVkWH0sIGJhY2tlbmR9KTtcbiAgLy8gVXNlIGN1bXN1bSBwYXJhbGxlbCBhbGdvcml0aG0sIHJlZjpcbiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubnZpZGlhLmNvbS9ncHVnZW1zL2dwdWdlbXMzL3BhcnQtdmktZ3B1LWNvbXB1dGluZy9jaGFwdGVyLTM5LXBhcmFsbGVsLXByZWZpeC1zdW0tc2Nhbi1jdWRhXG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPD0gTWF0aC5jZWlsKE1hdGgubG9nMihzaXplKSkgLSAxOyBpKyspIHtcbiAgICBjb25zdCBwcm9ncmFtID0gbmV3IEN1bVN1bVByb2dyYW0ocGVybXV0ZWRYLnNoYXBlLCBmYWxzZSwgcmV2ZXJzZSk7XG4gICAgY29uc3QgY3VzdG9tVmFsdWVzID0gW1tpXV07XG4gICAgY29uc3QgcHJldlJlc3VsdCA9IHJlc3VsdDtcbiAgICByZXN1bHQgPVxuICAgICAgICBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbcmVzdWx0XSwgcmVzdWx0LmR0eXBlLCBjdXN0b21WYWx1ZXMpO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocHJldlJlc3VsdCk7XG4gIH1cbiAgLy8gRm9yIGV4Y2x1c2l2ZSBjdW1zdW0sIHNoaWZ0IHRoZSBlbmQgcmVzdWx0IGluIHRoZSBkaXJlY3Rpb24gb2Ygc3VtXG4gIC8vIGFuZCBhZGQgMCB0byB0aGUgZnJvbnQgaW5kZXguXG4gIGlmIChleGNsdXNpdmUpIHtcbiAgICBjb25zdCBwcm9ncmFtID0gbmV3IEN1bVN1bVByb2dyYW0ocGVybXV0ZWRYLnNoYXBlLCBleGNsdXNpdmUsIHJldmVyc2UpO1xuICAgIGNvbnN0IHByZXZSZXN1bHQgPSByZXN1bHQ7XG4gICAgcmVzdWx0ID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3Jlc3VsdF0sIHJlc3VsdC5kdHlwZSk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhwcmV2UmVzdWx0KTtcbiAgfVxuXG4gIGlmIChwZXJtdXRhdGlvbiAhPSBudWxsKSB7XG4gICAgY29uc3QgcmV2ZXJzZVBlcm11dGF0aW9uID0gYmFja2VuZF91dGlsLmdldFVuZG9BeGVzUGVybXV0YXRpb24ocGVybXV0YXRpb24pO1xuICAgIGNvbnN0IHJldmVyc2VUcmFuc3Bvc2VkUmVzdWx0ID0gdHJhbnNwb3NlKFxuICAgICAgICB7aW5wdXRzOiB7eDogcmVzdWx0fSwgYmFja2VuZCwgYXR0cnM6IHtwZXJtOiByZXZlcnNlUGVybXV0YXRpb259fSk7XG5cbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlc3VsdCk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhwZXJtdXRlZFgpO1xuXG4gICAgcmV0dXJuIHJldmVyc2VUcmFuc3Bvc2VkUmVzdWx0O1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGNvbnN0IGN1bXN1bUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBDdW1zdW0sXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBjdW1zdW0gYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtEZW5zZUJpbmNvdW50LCBEZW5zZUJpbmNvdW50QXR0cnMsIERlbnNlQmluY291bnRJbnB1dHMsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mbywgVHlwZWRBcnJheX0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7YmluY291bnRJbXBsQ1BVLCBiaW5jb3VudFJlZHVjZUltcGxDUFV9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuXG5leHBvcnQgZnVuY3Rpb24gZGVuc2VCaW5jb3VudChhcmdzOiB7XG4gIGlucHV0czogRGVuc2VCaW5jb3VudElucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IERlbnNlQmluY291bnRBdHRyc1xufSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eCwgd2VpZ2h0c30gPSBpbnB1dHM7XG4gIGNvbnN0IHtzaXplLCBiaW5hcnlPdXRwdXR9ID0gYXR0cnM7XG5cbiAgaWYgKHguc2hhcGUubGVuZ3RoID09PSAxKSB7XG4gICAgY29uc3QgeFZhbHMgPSBiYWNrZW5kLnJlYWRTeW5jKHguZGF0YUlkKSBhcyBUeXBlZEFycmF5O1xuICAgIGNvbnN0IHdlaWdodHNWYWxzID0gYmFja2VuZC5yZWFkU3luYyh3ZWlnaHRzLmRhdGFJZCkgYXMgVHlwZWRBcnJheTtcblxuICAgIGNvbnN0IG91dFZhbHMgPVxuICAgICAgICBiaW5jb3VudEltcGxDUFUoeFZhbHMsIHdlaWdodHNWYWxzLCB3ZWlnaHRzLmR0eXBlLCB3ZWlnaHRzLnNoYXBlLCBzaXplKTtcblxuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtzaXplXSwgd2VpZ2h0cy5kdHlwZSwgb3V0VmFscyk7XG4gIH0gZWxzZSBpZiAoeC5zaGFwZS5sZW5ndGggPT09IDIpIHtcbiAgICBjb25zdCB4QnVmID0gYmFja2VuZC5idWZmZXJTeW5jKHgpO1xuICAgIGNvbnN0IHdlaWdodHNCdWYgPSBiYWNrZW5kLmJ1ZmZlclN5bmMod2VpZ2h0cyk7XG5cbiAgICBjb25zdCBvdXRCdWYgPSBiaW5jb3VudFJlZHVjZUltcGxDUFUoeEJ1Ziwgd2VpZ2h0c0J1Ziwgc2l6ZSwgYmluYXJ5T3V0cHV0KTtcblxuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dEJ1Zi5zaGFwZSwgd2VpZ2h0cy5kdHlwZSwgb3V0QnVmLnZhbHVlcyk7XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgRXJyb3IgaW4gZGVuc2VCaW5jb3VudDogaW5wdXQgbXVzdCBiZSBhdCBtb3N0IHJhbmsgMiwgYnV0IGdvdCByYW5rYCArXG4gICAgICBgJHt4LnNoYXBlLmxlbmd0aH0uYCk7XG59XG5cbmV4cG9ydCBjb25zdCBkZW5zZUJpbmNvdW50Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IERlbnNlQmluY291bnQsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBkZW5zZUJpbmNvdW50IGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RGVwdGhUb1NwYWNlLCBEZXB0aFRvU3BhY2VBdHRycywgRGVwdGhUb1NwYWNlSW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge0RlcHRoVG9TcGFjZVByb2dyYW19IGZyb20gJy4uL2RlcHRoX3RvX3NwYWNlX2dwdSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBkZXB0aFRvU3BhY2UoYXJnczoge1xuICBpbnB1dHM6IERlcHRoVG9TcGFjZUlucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IERlcHRoVG9TcGFjZUF0dHJzXG59KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4fSA9IGlucHV0cztcbiAgY29uc3Qge2Jsb2NrU2l6ZSwgZGF0YUZvcm1hdH0gPSBhdHRycztcblxuICB1dGlsLmFzc2VydChcbiAgICAgIGJsb2NrU2l6ZSA+IDEsXG4gICAgICAoKSA9PiBgYmxvY2tTaXplIHNob3VsZCBiZSA+IDEgZm9yIGRlcHRoVG9TcGFjZSwgYnV0IHdhczogJHtibG9ja1NpemV9YCk7XG5cbiAgY29uc3QgYmF0Y2hTaXplID0geC5zaGFwZVswXTtcbiAgY29uc3QgaW5wdXRIZWlnaHQgPSAoZGF0YUZvcm1hdCA9PT0gJ05IV0MnKSA/IHguc2hhcGVbMV0gOiB4LnNoYXBlWzJdO1xuICBjb25zdCBpbnB1dFdpZHRoID0gKGRhdGFGb3JtYXQgPT09ICdOSFdDJykgPyB4LnNoYXBlWzJdIDogeC5zaGFwZVszXTtcbiAgY29uc3QgaW5wdXREZXB0aCA9IChkYXRhRm9ybWF0ID09PSAnTkhXQycpID8geC5zaGFwZVszXSA6IHguc2hhcGVbMV07XG5cbiAgY29uc3Qgb3V0cHV0SGVpZ2h0ID0gaW5wdXRIZWlnaHQgKiBibG9ja1NpemU7XG4gIGNvbnN0IG91dHB1dFdpZHRoID0gaW5wdXRXaWR0aCAqIGJsb2NrU2l6ZTtcbiAgY29uc3Qgb3V0cHV0RGVwdGggPSBpbnB1dERlcHRoIC8gKGJsb2NrU2l6ZSAqIGJsb2NrU2l6ZSk7XG5cbiAgY29uc3Qgb3V0cHV0U2hhcGUgPSAoZGF0YUZvcm1hdCA9PT0gJ05IV0MnKSA/XG4gICAgICBbYmF0Y2hTaXplLCBvdXRwdXRIZWlnaHQsIG91dHB1dFdpZHRoLCBvdXRwdXREZXB0aF0gOlxuICAgICAgW2JhdGNoU2l6ZSwgb3V0cHV0RGVwdGgsIG91dHB1dEhlaWdodCwgb3V0cHV0V2lkdGhdO1xuXG4gIGNvbnN0IHByb2dyYW0gPSBuZXcgRGVwdGhUb1NwYWNlUHJvZ3JhbShvdXRwdXRTaGFwZSwgYmxvY2tTaXplLCBkYXRhRm9ybWF0KTtcbiAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFt4XSwgeC5kdHlwZSk7XG59XG5cbmV4cG9ydCBjb25zdCBkZXB0aFRvU3BhY2VDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogRGVwdGhUb1NwYWNlLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogZGVwdGhUb1NwYWNlIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBEZXB0aHdpc2VDb252MmROYXRpdmUsIERlcHRod2lzZUNvbnYyZE5hdGl2ZUF0dHJzLCBEZXB0aHdpc2VDb252MmROYXRpdmVJbnB1dHMsIGVudiwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtEZXB0aHdpc2VDb252MkRQcm9ncmFtfSBmcm9tICcuLi9jb252X2dwdV9kZXB0aHdpc2UnO1xuaW1wb3J0IHtEZXB0aHdpc2VDb252UGFja2VkMkRQcm9ncmFtfSBmcm9tICcuLi9jb252X3BhY2tlZF9ncHVfZGVwdGh3aXNlJztcblxuZXhwb3J0IGZ1bmN0aW9uIGRlcHRod2lzZUNvbnYyZE5hdGl2ZShhcmdzOiB7XG4gIGlucHV0czogRGVwdGh3aXNlQ29udjJkTmF0aXZlSW5wdXRzLFxuICBhdHRyczogRGVwdGh3aXNlQ29udjJkTmF0aXZlQXR0cnMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0xcbn0pIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3gsIGZpbHRlcn0gPSBpbnB1dHM7XG4gIGNvbnN0IHtzdHJpZGVzLCBwYWQsIGRpbGF0aW9ucywgZGltUm91bmRpbmdNb2RlfSA9IGF0dHJzO1xuXG4gIGxldCAkZGlsYXRpb25zID0gZGlsYXRpb25zO1xuICBpZiAoJGRpbGF0aW9ucyA9PSBudWxsKSB7XG4gICAgJGRpbGF0aW9ucyA9IFsxLCAxXTtcbiAgfVxuXG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgYmFja2VuZF91dGlsLmVpdGhlclN0cmlkZXNPckRpbGF0aW9uc0FyZU9uZShzdHJpZGVzLCAkZGlsYXRpb25zKSxcbiAgICAgICgpID0+ICdFcnJvciBpbiBkZXB0aHdpc2VDb252MmQ6IEVpdGhlciBzdHJpZGVzIG9yIGRpbGF0aW9ucyBtdXN0IGJlICcgK1xuICAgICAgICAgIGAxLiBHb3Qgc3RyaWRlcyAke3N0cmlkZXN9IGFuZCBkaWxhdGlvbnMgJyR7JGRpbGF0aW9uc30nYCk7XG5cbiAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZUNvbnYyREluZm8oXG4gICAgICB4LnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLFxuICAgICAgZmlsdGVyLnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLCBzdHJpZGVzLCAkZGlsYXRpb25zLFxuICAgICAgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIHRydWUgLyogZGVwdGh3aXNlICovKTtcblxuICBsZXQgcHJvZ3JhbTogRGVwdGh3aXNlQ29udjJEUHJvZ3JhbXxEZXB0aHdpc2VDb252UGFja2VkMkRQcm9ncmFtO1xuICBpZiAoZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUEFDS19ERVBUSFdJU0VDT05WJykgJiYgY29udkluZm8uc3RyaWRlV2lkdGggPD0gMiAmJlxuICAgICAgY29udkluZm8ub3V0Q2hhbm5lbHMgLyBjb252SW5mby5pbkNoYW5uZWxzID09PSAxKSB7XG4gICAgcHJvZ3JhbSA9IG5ldyBEZXB0aHdpc2VDb252UGFja2VkMkRQcm9ncmFtKGNvbnZJbmZvKTtcbiAgfSBlbHNlIHtcbiAgICBwcm9ncmFtID0gbmV3IERlcHRod2lzZUNvbnYyRFByb2dyYW0oY29udkluZm8pO1xuICB9XG4gIGNvbnN0IGN1c3RvbVZhbHVlcyA9IFtcbiAgICBbY29udkluZm8ucGFkSW5mby50b3AsIGNvbnZJbmZvLnBhZEluZm8ubGVmdF0sXG4gICAgW2NvbnZJbmZvLnN0cmlkZUhlaWdodCwgY29udkluZm8uc3RyaWRlV2lkdGhdLFxuICAgIFtjb252SW5mby5kaWxhdGlvbkhlaWdodCwgY29udkluZm8uZGlsYXRpb25XaWR0aF0sXG4gICAgW2NvbnZJbmZvLmluSGVpZ2h0LCBjb252SW5mby5pbldpZHRoXVxuICBdO1xuICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3gsIGZpbHRlcl0sICdmbG9hdDMyJywgY3VzdG9tVmFsdWVzKTtcbn1cblxuZXhwb3J0IGNvbnN0IGRlcHRod2lzZUNvbnYyZE5hdGl2ZUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBEZXB0aHdpc2VDb252MmROYXRpdmUsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBkZXB0aHdpc2VDb252MmROYXRpdmUgYXMge30gYXMgS2VybmVsRnVuYyxcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlciwgRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXJBdHRycywgRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXJJbnB1dHMsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuY30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7RGVwdGh3aXNlQ29udjJERGVyRmlsdGVyUHJvZ3JhbX0gZnJvbSAnLi4vY29udl9iYWNrcHJvcF9ncHVfZGVwdGh3aXNlJztcblxuZXhwb3J0IGZ1bmN0aW9uIGRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyKGFyZ3M6IHtcbiAgaW5wdXRzOiBEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlcklucHV0cyxcbiAgYXR0cnM6IERlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyQXR0cnMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0xcbn0pIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3gsIGR5fSA9IGlucHV0cztcbiAgY29uc3Qge3N0cmlkZXMsIGRpbGF0aW9ucywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIGZpbHRlclNoYXBlfSA9IGF0dHJzO1xuXG4gIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVDb252MkRJbmZvKFxuICAgICAgeC5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgZmlsdGVyU2hhcGUsIHN0cmlkZXMsXG4gICAgICBkaWxhdGlvbnMsIHBhZCwgZGltUm91bmRpbmdNb2RlLCB0cnVlIC8qIGRlcHRod2lzZSAqLyk7XG5cbiAgY29uc3QgcHJvZ3JhbSA9IG5ldyBEZXB0aHdpc2VDb252MkREZXJGaWx0ZXJQcm9ncmFtKGNvbnZJbmZvKTtcbiAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFt4LCBkeV0sICdmbG9hdDMyJyk7XG59XG5cbmV4cG9ydCBjb25zdCBkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlckNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlcixcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0LCBEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0QXR0cnMsIERlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXRJbnB1dHMsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuY30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7RGVwdGh3aXNlQ29udjJERGVySW5wdXRQcm9ncmFtfSBmcm9tICcuLi9jb252X2JhY2twcm9wX2dwdV9kZXB0aHdpc2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dChhcmdzOiB7XG4gIGlucHV0czogRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dElucHV0cyxcbiAgYXR0cnM6IERlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXRBdHRycyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTFxufSkge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7ZHksIGZpbHRlcn0gPSBpbnB1dHM7XG4gIGNvbnN0IHtzdHJpZGVzLCBkaWxhdGlvbnMsIHBhZCwgZGltUm91bmRpbmdNb2RlLCBpbnB1dFNoYXBlfSA9IGF0dHJzO1xuXG4gIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVDb252MkRJbmZvKFxuICAgICAgaW5wdXRTaGFwZSwgZmlsdGVyLnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLCBzdHJpZGVzLFxuICAgICAgZGlsYXRpb25zLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSwgdHJ1ZSAvKiBkZXB0aHdpc2UgKi8pO1xuXG4gIGNvbnN0IHByb2dyYW0gPSBuZXcgRGVwdGh3aXNlQ29udjJERGVySW5wdXRQcm9ncmFtKGNvbnZJbmZvKTtcbiAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFtkeSwgZmlsdGVyXSwgJ2Zsb2F0MzInKTtcbn1cblxuZXhwb3J0IGNvbnN0IGRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXRDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXQgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtEaWFnLCBEaWFnSW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge0RpYWdQcm9ncmFtfSBmcm9tICcuLi9kaWFnX2dwdSc7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4vUmVzaGFwZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBkaWFnKGFyZ3M6IHtpbnB1dHM6IERpYWdJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0x9KTpcbiAgICBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZH0gPSBhcmdzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG5cbiAgY29uc3Qgb3V0U2hhcGUgPSBbLi4ueC5zaGFwZSwgLi4ueC5zaGFwZV07XG4gIGNvbnN0IHhTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHguc2hhcGUpO1xuXG4gIGNvbnN0IGZsYXQgPSByZXNoYXBlKHtpbnB1dHM6IHt4fSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogW3hTaXplXX19KTtcblxuICBjb25zdCBwcm9ncmFtID0gbmV3IERpYWdQcm9ncmFtKHhTaXplKTtcbiAgY29uc3QgcmVzID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW2ZsYXRdLCBmbGF0LmR0eXBlKTtcblxuICBjb25zdCBvdXQgPSByZXNoYXBlKHtpbnB1dHM6IHt4OiByZXN9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBvdXRTaGFwZX19KTtcblxuICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGZsYXQpO1xuICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlcyk7XG5cbiAgcmV0dXJuIG91dDtcbn1cblxuZXhwb3J0IGNvbnN0IGRpYWdDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogRGlhZyxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGRpYWcgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIERpbGF0aW9uMkQsIERpbGF0aW9uMkRBdHRycywgRGlsYXRpb24yRElucHV0cywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtEaWxhdGlvbjJEUHJvZ3JhbX0gZnJvbSAnLi4vZGlsYXRpb25fZ3B1JztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9SZXNoYXBlJztcblxuZXhwb3J0IGZ1bmN0aW9uIGRpbGF0aW9uMkQoYXJnczoge1xuICBpbnB1dHM6IERpbGF0aW9uMkRJbnB1dHMsXG4gIGF0dHJzOiBEaWxhdGlvbjJEQXR0cnMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0xcbn0pIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3gsIGZpbHRlcn0gPSBpbnB1dHM7XG4gIGNvbnN0IHtzdHJpZGVzLCBwYWQsIGRpbGF0aW9uc30gPSBhdHRycztcblxuICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlRGlsYXRpb24yREluZm8oXG4gICAgICB4LnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLFxuICAgICAgZmlsdGVyLnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgc3RyaWRlcywgcGFkLFxuICAgICAgJ05IV0MnIC8qIGRhdGFGb3JtYXQgKi8sIGRpbGF0aW9ucyk7XG4gIGxldCBvdXQ6IFRlbnNvckluZm87XG5cbiAgY29uc3QgcHJvZ3JhbSA9IG5ldyBEaWxhdGlvbjJEUHJvZ3JhbShjb252SW5mbyk7XG4gIG91dCA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFt4LCBmaWx0ZXJdLCAnZmxvYXQzMicpO1xuXG4gIGNvbnN0IG91dFJlc2hhcGVkID1cbiAgICAgIHJlc2hhcGUoe2lucHV0czoge3g6IG91dH0sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IGNvbnZJbmZvLm91dFNoYXBlfX0pO1xuICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKG91dCk7XG5cbiAgcmV0dXJuIG91dFJlc2hhcGVkO1xufVxuXG5leHBvcnQgY29uc3QgZGlsYXRpb24yRENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBEaWxhdGlvbjJELFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogZGlsYXRpb24yRCBhcyB7fSBhcyBLZXJuZWxGdW5jLFxufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIEVpbnN1bSwgRWluc3VtQXR0cnMsIEVpbnN1bUlucHV0cywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3IsIFRlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5cbmltcG9ydCB7bXVsdGlwbHl9IGZyb20gJy4vTXVsdGlwbHknO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL1Jlc2hhcGUnO1xuaW1wb3J0IHtzdW19IGZyb20gJy4vU3VtJztcbmltcG9ydCB7dHJhbnNwb3NlfSBmcm9tICcuL1RyYW5zcG9zZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBlaW5zdW0oXG4gICAgYXJnczpcbiAgICAgICAge2lucHV0czogRWluc3VtSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLCBhdHRyczogRWluc3VtQXR0cnN9KTpcbiAgICBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge2VxdWF0aW9ufSA9IGF0dHJzO1xuICBjb25zdCB0ZW5zb3JzID0gaW5wdXRzIGFzIFRlbnNvcltdO1xuXG4gIGNvbnN0IHthbGxEaW1zLCBzdW1tZWREaW1zLCBpZERpbXN9ID1cbiAgICAgIGJhY2tlbmRfdXRpbC5kZWNvZGVFaW5zdW1FcXVhdGlvbihlcXVhdGlvbiwgdGVuc29ycy5sZW5ndGgpO1xuICBiYWNrZW5kX3V0aWwuY2hlY2tFaW5zdW1EaW1TaXplcyhhbGxEaW1zLmxlbmd0aCwgaWREaW1zLCB0ZW5zb3JzKTtcbiAgY29uc3Qge3BhdGgsIHN0ZXBzfSA9IGJhY2tlbmRfdXRpbC5nZXRFaW5zdW1Db21wdXRlUGF0aChzdW1tZWREaW1zLCBpZERpbXMpO1xuXG4gIGNvbnN0IG5TdGVwcyA9IHN0ZXBzLmxlbmd0aDtcbiAgbGV0IG91dDogVGVuc29ySW5mb3xudWxsID0gbnVsbDtcbiAgbGV0IG51bURpbXNSZW1haW5pbmcgPSBhbGxEaW1zLmxlbmd0aDtcbiAgY29uc3QgdGVuc29yc1RvRGlzcG9zZTogVGVuc29ySW5mb1tdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgblN0ZXBzOyArK2kpIHtcbiAgICBmb3IgKGNvbnN0IGlkVGVybSBvZiBzdGVwc1tpXSkge1xuICAgICAgY29uc3Qge3Blcm11dGF0aW9uSW5kaWNlczogcGVybSwgZXhwYW5kRGltczogZGltc1RvRXhwYW5kfSA9XG4gICAgICAgICAgYmFja2VuZF91dGlsLmdldEVpbnN1bVBlcm11dGF0aW9uKG51bURpbXNSZW1haW5pbmcsIGlkRGltc1tpZFRlcm1dKTtcbiAgICAgIGxldCB4OiBUZW5zb3JJbmZvO1xuICAgICAgaWYgKGJhY2tlbmRfdXRpbC5pc0lkZW50aXR5UGVybXV0YXRpb24ocGVybSkpIHtcbiAgICAgICAgeCA9IHRlbnNvcnNbaWRUZXJtXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHggPSB0cmFuc3Bvc2Uoe2lucHV0czoge3g6IHRlbnNvcnNbaWRUZXJtXX0sIGJhY2tlbmQsIGF0dHJzOiB7cGVybX19KTtcbiAgICAgICAgdGVuc29yc1RvRGlzcG9zZS5wdXNoKHgpO1xuICAgICAgfVxuICAgICAgY29uc3QgdGFyZ2V0U2hhcGU6IG51bWJlcltdID0geC5zaGFwZS5zbGljZSgpO1xuICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBkaW1zVG9FeHBhbmQubGVuZ3RoOyArK2spIHtcbiAgICAgICAgdGFyZ2V0U2hhcGUuc3BsaWNlKGRpbXNUb0V4cGFuZFtrXSwgMCwgMSk7XG4gICAgICB9XG5cbiAgICAgIGlmICghdXRpbC5hcnJheXNFcXVhbCh4LnNoYXBlLCB0YXJnZXRTaGFwZSkpIHtcbiAgICAgICAgeCA9IHJlc2hhcGUoe2lucHV0czoge3h9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiB0YXJnZXRTaGFwZX19KTtcbiAgICAgICAgdGVuc29yc1RvRGlzcG9zZS5wdXNoKHgpO1xuICAgICAgfVxuICAgICAgaWYgKG91dCA9PT0gbnVsbCkge1xuICAgICAgICBvdXQgPSB4O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICAgICAgICBvdXQgPSBtdWx0aXBseSh7aW5wdXRzOiB7YTogeCwgYjogb3V0fSwgYmFja2VuZH0pIGFzIFRlbnNvckluZm87XG4gICAgICAgIHRlbnNvcnNUb0Rpc3Bvc2UucHVzaChvdXQpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaSA8IG5TdGVwcyAtIDEpIHtcbiAgICAgIGlmIChwYXRoW2ldID49IDApIHtcbiAgICAgICAgb3V0ID0gc3VtKHtcbiAgICAgICAgICBpbnB1dHM6IHt4OiBvdXR9LFxuICAgICAgICAgIGJhY2tlbmQsXG4gICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgIGF4aXM6IHBhdGhbaV0gLSAoYWxsRGltcy5sZW5ndGggLSBudW1EaW1zUmVtYWluaW5nKSxcbiAgICAgICAgICAgIGtlZXBEaW1zOiBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRlbnNvcnNUb0Rpc3Bvc2UucHVzaChvdXQpO1xuICAgICAgfVxuICAgICAgbnVtRGltc1JlbWFpbmluZy0tO1xuICAgIH1cbiAgfVxuXG4gIC8vIENsZWFuIHVwIGludGVybWVkaWF0ZSB0ZW5zb3JzLlxuICBmb3IgKGNvbnN0IHRlbnNvckluZm8gb2YgdGVuc29yc1RvRGlzcG9zZSkge1xuICAgIGlmICh0ZW5zb3JJbmZvID09PSBvdXQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHRlbnNvckluZm8pO1xuICB9XG5cbiAgcmV0dXJuIG91dDtcbn1cblxuZXhwb3J0IGNvbnN0IGVpbnN1bUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBFaW5zdW0sXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBlaW5zdW0gYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFbHUsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuY30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcblxuY29uc3QgRUxVID0gYHJldHVybiAoeCA+PSAwLjApID8geCA6IChleHAoeCkgLSAxLjApO2A7XG5cbmNvbnN0IEVMVV9QQUNLRUQgPSBgXG4gIHZlYzQgcmVzdWx0O1xuXG4gIHJlc3VsdC5yID0gKHguciA+PSAwLjApID8geC5yIDogKGV4cCh4LnIpIC0gMS4wKTtcbiAgcmVzdWx0LmcgPSAoeC5nID49IDAuMCkgPyB4LmcgOiAoZXhwKHguZykgLSAxLjApO1xuICByZXN1bHQuYiA9ICh4LmIgPj0gMC4wKSA/IHguYiA6IChleHAoeC5iKSAtIDEuMCk7XG4gIHJlc3VsdC5hID0gKHguYSA+PSAwLjApID8geC5hIDogKGV4cCh4LmEpIC0gMS4wKTtcblxuICByZXR1cm4gcmVzdWx0O1xuYDtcblxuY29uc3QgZWx1ID0gdW5hcnlLZXJuZWxGdW5jKHtvcFNuaXBwZXQ6IEVMVSwgcGFja2VkT3BTbmlwcGV0OiBFTFVfUEFDS0VEfSk7XG5cbmV4cG9ydCBjb25zdCBlbHVDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogRWx1LFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogZWx1IGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RWx1R3JhZCwgRWx1R3JhZElucHV0cywgZW52LCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge0JpbmFyeU9wUHJvZ3JhbX0gZnJvbSAnLi4vYmluYXJ5b3BfZ3B1JztcbmltcG9ydCB7QmluYXJ5T3BQYWNrZWRQcm9ncmFtfSBmcm9tICcuLi9iaW5hcnlvcF9wYWNrZWRfZ3B1JztcblxuY29uc3QgRUxVX0RFUiA9IGByZXR1cm4gKGIgPj0gMS4wKSA/IGEgOiBhICogKGIgKyAxLjApO2A7XG5jb25zdCBFTFVfREVSX1BBQ0tFRCA9IGBcbiAgdmVjNCBiR1RFWmVybyA9IHZlYzQoZ3JlYXRlclRoYW5FcXVhbChiLCB2ZWM0KDAuKSkpO1xuICByZXR1cm4gKGJHVEVaZXJvICogYSkgKyAoKHZlYzQoMS4wKSAtIGJHVEVaZXJvKSAqIChhICogKGIgKyB2ZWM0KDEuMCkpKSk7XG5gO1xuXG5leHBvcnQgY29uc3QgZWx1R3JhZCA9XG4gICAgKGFyZ3M6IHtpbnB1dHM6IEVsdUdyYWRJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0x9KTogVGVuc29ySW5mbyA9PiB7XG4gICAgICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kfSA9IGFyZ3M7XG4gICAgICBjb25zdCB7ZHksIHl9ID0gaW5wdXRzO1xuXG4gICAgICBjb25zdCBwcm9ncmFtID0gZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUEFDS19CSU5BUllfT1BFUkFUSU9OUycpID9cbiAgICAgICAgICBuZXcgQmluYXJ5T3BQYWNrZWRQcm9ncmFtKEVMVV9ERVJfUEFDS0VELCBkeS5zaGFwZSwgeS5zaGFwZSkgOlxuICAgICAgICAgIG5ldyBCaW5hcnlPcFByb2dyYW0oRUxVX0RFUiwgZHkuc2hhcGUsIHkuc2hhcGUpO1xuICAgICAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFtkeSwgeV0sIGR5LmR0eXBlKTtcbiAgICB9O1xuXG5leHBvcnQgY29uc3QgZWx1R3JhZENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBFbHVHcmFkLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogZWx1R3JhZCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VxdWFsLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmN9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge2JpbmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuaW1wb3J0IHtlcXVhbEltcGxDUFV9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuY29uc3QgUEFDS0VEX0VRVUFMID0gYFxuICByZXR1cm4gdmVjNChlcXVhbChhLCBiKSk7XG5gO1xuXG5jb25zdCBFUVVBTCA9IGByZXR1cm4gZmxvYXQoYSA9PSBiKTtgO1xuXG5leHBvcnQgY29uc3QgZXF1YWwgPSBiaW5hcnlLZXJuZWxGdW5jKHtcbiAgb3BTbmlwcGV0OiBFUVVBTCxcbiAgcGFja2VkT3BTbmlwcGV0OiBQQUNLRURfRVFVQUwsXG4gIGR0eXBlOiAnYm9vbCcsXG4gIGNwdUtlcm5lbEltcGw6IGVxdWFsSW1wbENQVSxcbn0pO1xuXG5leHBvcnQgY29uc3QgZXF1YWxDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogRXF1YWwsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBlcXVhbCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgRXJmLCBLZXJuZWxDb25maWd9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcblxuY29uc3QgRVJGID0gYFxuICAvLyBFcnJvciBmdW5jdGlvbiBpcyBjYWxjdWxhdGVkIGFwcHJveGltYXRlbHkgd2l0aCBlbGVtZW50YXJ5IGZ1bmN0aW9uLlxuICAvLyBTZWUgXCJIYW5kYm9vayBvZiBNYXRoZW1hdGljYWwgRnVuY3Rpb25zIHdpdGggRm9ybXVsYXMsXG4gIC8vIEdyYXBocywgYW5kIE1hdGhlbWF0aWNhbCBUYWJsZXNcIiwgQWJyYW1vd2l0eiBhbmQgU3RlZ3VuLlxuICBmbG9hdCBwID0gJHtiYWNrZW5kX3V0aWwuRVJGX1B9O1xuICBmbG9hdCBhMSA9ICR7YmFja2VuZF91dGlsLkVSRl9BMX07XG4gIGZsb2F0IGEyID0gJHtiYWNrZW5kX3V0aWwuRVJGX0EyfTtcbiAgZmxvYXQgYTMgPSAke2JhY2tlbmRfdXRpbC5FUkZfQTN9O1xuICBmbG9hdCBhNCA9ICR7YmFja2VuZF91dGlsLkVSRl9BNH07XG4gIGZsb2F0IGE1ID0gJHtiYWNrZW5kX3V0aWwuRVJGX0E1fTtcblxuICBmbG9hdCBzaWduID0gc2lnbih4KTtcbiAgeCA9IGFicyh4KTtcbiAgZmxvYXQgdCA9IDEuMCAvICgxLjAgKyBwICogeCk7XG4gIHJldHVybiBzaWduICogKDEuMCAtICgoKCgoYTUqdCArIGE0KSp0KSArIGEzKSp0ICsgYTIpKnQgKyBhMSkqdCpleHAoLXgqeCkpO1xuYDtcblxuZXhwb3J0IGNvbnN0IGVyZiA9IHVuYXJ5S2VybmVsRnVuYyh7b3BTbmlwcGV0OiBFUkZ9KTtcblxuZXhwb3J0IGNvbnN0IGVyZkNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBFcmYsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBlcmYsXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0V4cCwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge3VuYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5pbXBvcnQge2V4cEltcGxDUFV9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuXG5leHBvcnQgY29uc3QgRVhQID0gYHJldHVybiBleHAoeCk7YDtcbmV4cG9ydCBjb25zdCBleHAgPSB1bmFyeUtlcm5lbEZ1bmMoXG4gICAge29wU25pcHBldDogRVhQLCBwYWNrZWRPcFNuaXBwZXQ6IEVYUCwgY3B1S2VybmVsSW1wbDogZXhwSW1wbENQVX0pO1xuXG5leHBvcnQgY29uc3QgZXhwQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEV4cCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGV4cCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFeHBhbmREaW1zLCBFeHBhbmREaW1zQXR0cnMsIEV4cGFuZERpbXNJbnB1dHMsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mbywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9SZXNoYXBlJztcblxuZXhwb3J0IGZ1bmN0aW9uIGV4cGFuZERpbXMoYXJnczoge1xuICBpbnB1dHM6IEV4cGFuZERpbXNJbnB1dHMsXG4gIGF0dHJzOiBFeHBhbmREaW1zQXR0cnMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0xcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYXR0cnMsIGJhY2tlbmR9ID0gYXJncztcbiAgY29uc3Qge2RpbX0gPSBhdHRycztcbiAgY29uc3Qge2lucHV0fSA9IGlucHV0cztcblxuICBjb25zdCBpbnB1dFJhbmsgPSBpbnB1dC5zaGFwZS5sZW5ndGg7XG4gIGNvbnN0IG5ld1NoYXBlID0gaW5wdXQuc2hhcGUuc2xpY2UoKTtcbiAgbGV0ICRkaW0gPSBkaW07XG4gIGlmIChkaW0gPCAwKSB7XG4gICAgLy8gTmVnYXRpdmUgdmFsdWUgaXMgY291bnRlZCBmcm9tIHRoZSB0YWlsIG9mIHJhbmsuXG4gICAgdXRpbC5hc3NlcnQoXG4gICAgICAgIC0oaW5wdXRSYW5rICsgMSkgPD0gZGltLFxuICAgICAgICAoKSA9PiBgQXhpcyBtdXN0IGJlIGluIHRoZSBpbnRlcnZhbCBbJHstIChpbnB1dFJhbmsgKyAxKX0sICR7XG4gICAgICAgICAgICBpbnB1dFJhbmt9XWApO1xuICAgICRkaW0gPSBpbnB1dFJhbmsgKyBkaW0gKyAxO1xuICB9XG4gIG5ld1NoYXBlLnNwbGljZSgkZGltLCAwLCAxKTtcblxuICByZXR1cm4gcmVzaGFwZSh7aW5wdXRzOiB7eDogaW5wdXR9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBuZXdTaGFwZX19KTtcbn1cblxuZXhwb3J0IGNvbnN0IGV4cGFuZERpbXNDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogRXhwYW5kRGltcyxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGV4cGFuZERpbXMgYXMge30gYXMgS2VybmVsRnVuYyxcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RXhwbTEsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuY30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7ZXhwbTFJbXBsQ1BVfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcblxuY29uc3QgRVhQTTEgPSBgcmV0dXJuIGV4cCh4KSAtIDEuMDtgO1xuXG5leHBvcnQgY29uc3QgZXhwbTEgPSB1bmFyeUtlcm5lbEZ1bmMoXG4gICAge29wU25pcHBldDogRVhQTTEsIHBhY2tlZE9wU25pcHBldDogRVhQTTEsIGNwdUtlcm5lbEltcGw6IGV4cG0xSW1wbENQVX0pO1xuXG5leHBvcnQgY29uc3QgZXhwbTFDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogRXhwbTEsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBleHBtMSBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0ZGVCwgRkZUSW5wdXRzLCBLZXJuZWxDb25maWcsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5cbmltcG9ydCB7ZmZ0SW1wbH0gZnJvbSAnLi9GRlRfaW1wbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBmZnQoYXJnczoge2lucHV0czogRkZUSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmR9ID0gYXJncztcbiAgY29uc3Qge2lucHV0fSA9IGlucHV0cztcblxuICByZXR1cm4gZmZ0SW1wbChpbnB1dCwgZmFsc2UgLyogaW52ZXJzZSAqLywgYmFja2VuZCk7XG59XG5cbmV4cG9ydCBjb25zdCBmZnRDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogRkZULFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogZmZ0XG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1RlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge0ZGVFByb2dyYW19IGZyb20gJy4uL2ZmdF9ncHUnO1xuXG5pbXBvcnQge2NvbXBsZXh9IGZyb20gJy4vQ29tcGxleCc7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4vUmVzaGFwZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBmZnRJbXBsKFxuICAgIHg6IFRlbnNvckluZm8sIGludmVyc2U6IGJvb2xlYW4sIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wpOiBUZW5zb3JJbmZvIHtcbiAgY29uc3QgeERhdGEgPSBiYWNrZW5kLnRleERhdGEuZ2V0KHguZGF0YUlkKTtcblxuICBjb25zdCBpbnB1dFNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoeC5zaGFwZSk7XG4gIC8vIENvbGxhcHNlIGFsbCBvdXRlciBkaW1lbnNpb25zIHRvIGEgc2luZ2xlIGJhdGNoIGRpbWVuc2lvbi5cbiAgY29uc3QgaW5uZXJEaW1lbnNpb25TaXplID0geC5zaGFwZVt4LnNoYXBlLmxlbmd0aCAtIDFdO1xuICBjb25zdCBiYXRjaCA9IGlucHV0U2l6ZSAvIGlubmVyRGltZW5zaW9uU2l6ZTtcblxuICBjb25zdCBpbnB1dDJEID0gcmVzaGFwZShcbiAgICAgIHtpbnB1dHM6IHt4fSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogW2JhdGNoLCBpbm5lckRpbWVuc2lvblNpemVdfX0pO1xuXG4gIGNvbnN0IHhTaGFwZSA9IGlucHV0MkQuc2hhcGUgYXMgW251bWJlciwgbnVtYmVyXTtcbiAgY29uc3QgcmVhbFByb2dyYW0gPSBuZXcgRkZUUHJvZ3JhbSgncmVhbCcsIHhTaGFwZSwgaW52ZXJzZSk7XG4gIGNvbnN0IGltYWdQcm9ncmFtID0gbmV3IEZGVFByb2dyYW0oJ2ltYWcnLCB4U2hhcGUsIGludmVyc2UpO1xuXG4gIGNvbnN0IGlucHV0cyA9IFtcbiAgICB7XG4gICAgICBkYXRhSWQ6IHhEYXRhLmNvbXBsZXhUZW5zb3JJbmZvcy5yZWFsLmRhdGFJZCxcbiAgICAgIGR0eXBlOiB4RGF0YS5jb21wbGV4VGVuc29ySW5mb3MucmVhbC5kdHlwZSxcbiAgICAgIHNoYXBlOiB4U2hhcGVcbiAgICB9LFxuICAgIHtcbiAgICAgIGRhdGFJZDogeERhdGEuY29tcGxleFRlbnNvckluZm9zLmltYWcuZGF0YUlkLFxuICAgICAgZHR5cGU6IHhEYXRhLmNvbXBsZXhUZW5zb3JJbmZvcy5pbWFnLmR0eXBlLFxuICAgICAgc2hhcGU6IHhTaGFwZVxuICAgIH1cbiAgXTtcblxuICBjb25zdCByZWFsUGFydCA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHJlYWxQcm9ncmFtLCBpbnB1dHMsICdmbG9hdDMyJyk7XG4gIGNvbnN0IGltYWdQYXJ0ID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0oaW1hZ1Byb2dyYW0sIGlucHV0cywgJ2Zsb2F0MzInKTtcblxuICBjb25zdCBjb21wbGV4T3V0cHV0ID1cbiAgICAgIGNvbXBsZXgoe2lucHV0czoge3JlYWw6IHJlYWxQYXJ0LCBpbWFnOiBpbWFnUGFydH0sIGJhY2tlbmR9KTtcblxuICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlYWxQYXJ0KTtcbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhpbWFnUGFydCk7XG5cbiAgY29uc3QgY29tcGxleE91dHB1dFJlc2hhcGVkID1cbiAgICAgIHJlc2hhcGUoe2lucHV0czoge3g6IGNvbXBsZXhPdXRwdXR9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiB4LnNoYXBlfX0pO1xuXG4gIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oaW5wdXQyRCk7XG4gIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oY29tcGxleE91dHB1dCk7XG4gIHJldHVybiBjb21wbGV4T3V0cHV0UmVzaGFwZWQ7XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RmlsbCwgRmlsbEF0dHJzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge0ZpbGxQcm9ncmFtfSBmcm9tICcuLi9maWxsX2dwdSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBmaWxsKGFyZ3M6IHtiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLCBhdHRyczogRmlsbEF0dHJzfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7c2hhcGUsIHZhbHVlfSA9IGF0dHJzO1xuICBsZXQge2R0eXBlfSA9IGF0dHJzO1xuXG4gIGR0eXBlID0gZHR5cGUgfHwgdXRpbC5pbmZlckR0eXBlKHZhbHVlKTtcblxuICBpZiAoZHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgLy8gU3RyaW5nIHR5cGUgc2hvdWxkIGJlIGhhbmRsZWQgaW4gQ1BVIG1lbW9yeS5cbiAgICBjb25zdCB2YWx1ZXMgPSB1dGlsLmdldEFycmF5RnJvbURUeXBlKGR0eXBlLCB1dGlsLnNpemVGcm9tU2hhcGUoc2hhcGUpKTtcbiAgICB2YWx1ZXMuZmlsbCh2YWx1ZSBhcyBzdHJpbmcpO1xuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHNoYXBlLCBkdHlwZSwgdmFsdWVzKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBwcm9ncmFtID0gbmV3IEZpbGxQcm9ncmFtKHNoYXBlLCB2YWx1ZSBhcyBudW1iZXIpO1xuICAgIGNvbnN0IGN1c3RvbVZhbHVlcyA9IFtbdmFsdWUgYXMgbnVtYmVyXV07XG4gICAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFtdLCBkdHlwZSwgY3VzdG9tVmFsdWVzKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZmlsbENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBGaWxsLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogZmlsbCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgVGVuc29yNER9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge0ZsaXBMZWZ0UmlnaHQsIEZsaXBMZWZ0UmlnaHRJbnB1dHN9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge0ZsaXBMZWZ0UmlnaHRQcm9ncmFtfSBmcm9tICcuLi9mbGlwX2xlZnRfcmlnaHRfZ3B1JztcblxuZXhwb3J0IGNvbnN0IGZsaXBMZWZ0UmlnaHRDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogRmxpcExlZnRSaWdodCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6ICh7aW5wdXRzLCBiYWNrZW5kfSkgPT4ge1xuICAgIGNvbnN0IHtpbWFnZX0gPSBpbnB1dHMgYXMgRmxpcExlZnRSaWdodElucHV0cztcbiAgICBjb25zdCB3ZWJnbEJhY2tlbmQgPSBiYWNrZW5kIGFzIE1hdGhCYWNrZW5kV2ViR0w7XG5cbiAgICBjb25zdCBwcm9ncmFtID0gbmV3IEZsaXBMZWZ0UmlnaHRQcm9ncmFtKChpbWFnZSBhcyBUZW5zb3I0RCkuc2hhcGUpO1xuICAgIGNvbnN0IG91dHB1dCA9IHdlYmdsQmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW2ltYWdlXSwgaW1hZ2UuZHR5cGUpO1xuICAgIHJldHVybiBvdXRwdXQ7XG4gIH1cbn07XG4iLCJcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtGbG9vciwgS2VybmVsQ29uZmlnfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHt1bmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuaW1wb3J0IHtmbG9vckltcGxDUFV9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuXG5jb25zdCBGTE9PUiA9IGByZXR1cm4gZmxvb3IoeCk7YDtcblxuZXhwb3J0IGNvbnN0IGZsb29yID0gdW5hcnlLZXJuZWxGdW5jKFxuICAgIHtvcFNuaXBwZXQ6IEZMT09SLCBwYWNrZWRPcFNuaXBwZXQ6IEZMT09SLCBjcHVLZXJuZWxJbXBsOiBmbG9vckltcGxDUFV9KTtcblxuZXhwb3J0IGNvbnN0IGZsb29yQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEZsb29yLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogZmxvb3IsXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0Zsb29yRGl2LCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmN9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7YmluYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5cbi8vIFdlIHVzZSBuYXRpdmUgaW50ZWdlciBkaXZpc2lvbiB0byBkZWFsIHdpdGggZmxvYXRpbmcgcG9pbnQgaW1wcmVjaXNpb24uIFNpbmNlXG4vLyB3ZSBpbXBsZW1lbnQgZmxvb3IgZGl2aXNpb24gYW5kIGdsc2wgaW1wbGVtZW50cyB0cnVuY2F0ZWQgZGl2aXNpb24sIHdlXG4vLyBjb3JyZWN0IGZvciB0aGlzIGJ5IHN1YnRyYWN0aW5nIDEgZnJvbSByZXN1bHQgd2hlbiB0aGUgcmVzdWx0IGlzIG5lZ2F0aXZlIGFuZFxuLy8gdGhlcmUgaXMgYSByZW1haW5kZXIuXG5jb25zdCBJTlRfRElWID0gYFxuICBmbG9hdCBzID0gc2lnbihhKSAqIHNpZ24oYik7XG4gIGludCBpYSA9IHJvdW5kKGEpO1xuICBpbnQgaWIgPSByb3VuZChiKTtcbiAgaWYgKGliICE9IDApIHtcbiAgICAvLyBXaW5kb3dzIChEM0QpIHdhbnRzIGd1YXJhbnRlZWQgbm9uLXplcm8gaW50IGRpdmlzaW9uIGF0IGNvbXBpbGUtdGltZS5cbiAgICByZXR1cm4gZmxvYXQoaWRpdihpYSwgaWIsIHMpKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gTkFOO1xuICB9XG5gO1xuXG5jb25zdCBJTlRfRElWX1BBQ0tFRCA9IGBcbiAgaXZlYzQgaWEgPSByb3VuZChhKTtcbiAgaXZlYzQgaWIgPSByb3VuZChiKTtcbiAgYnZlYzQgY29uZCA9IG5vdEVxdWFsKGliLCBpdmVjNCgwKSk7XG4gIGl2ZWM0IHJlc3VsdCA9IGl2ZWM0KDApO1xuICB2ZWM0IHMgPSBzaWduKGEpICogc2lnbihiKTtcblxuICAvLyBXaW5kb3dzIChEM0QpIHdhbnRzIGd1YXJhbnRlZWQgbm9uLXplcm8gaW50IGRpdmlzaW9uIGF0IGNvbXBpbGUtdGltZS5cbiAgaWYgKGNvbmRbMF0pIHtcbiAgICByZXN1bHRbMF0gPSBpZGl2KGlhWzBdLCBpYlswXSwgc1swXSk7XG4gIH1cbiAgaWYgKGNvbmRbMV0pIHtcbiAgICByZXN1bHRbMV0gPSBpZGl2KGlhWzFdLCBpYlsxXSwgc1sxXSk7XG4gIH1cbiAgaWYgKGNvbmRbMl0pIHtcbiAgICByZXN1bHRbMl0gPSBpZGl2KGlhWzJdLCBpYlsyXSwgc1syXSk7XG4gIH1cbiAgaWYgKGNvbmRbM10pIHtcbiAgICByZXN1bHRbM10gPSBpZGl2KGlhWzNdLCBpYlszXSwgc1szXSk7XG4gIH1cbiAgcmV0dXJuIHZlYzQocmVzdWx0KTtcbmA7XG5cbmV4cG9ydCBjb25zdCBmbG9vckRpdiA9IGJpbmFyeUtlcm5lbEZ1bmMoXG4gICAge29wU25pcHBldDogSU5UX0RJViwgcGFja2VkT3BTbmlwcGV0OiBJTlRfRElWX1BBQ0tFRCwgZHR5cGU6ICdpbnQzMid9KTtcblxuZXhwb3J0IGNvbnN0IGZsb29yRGl2Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEZsb29yRGl2LFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogZmxvb3JEaXYgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtlbnYsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7RnJvbVBpeGVscywgRnJvbVBpeGVsc0F0dHJzLCBGcm9tUGl4ZWxzSW5wdXRzfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtUZXh0dXJlVXNhZ2V9IGZyb20gJy4uL3RleF91dGlsJztcblxuaW1wb3J0IHtGcm9tUGl4ZWxzUHJvZ3JhbX0gZnJvbSAnLi9Gcm9tUGl4ZWxzX3V0aWxzL2Zyb21fcGl4ZWxzX2dwdSc7XG5pbXBvcnQge0Zyb21QaXhlbHNQYWNrZWRQcm9ncmFtfSBmcm9tICcuL0Zyb21QaXhlbHNfdXRpbHMvZnJvbV9waXhlbHNfcGFja2VkX2dwdSc7XG5cbmV4cG9ydCBjb25zdCBmcm9tUGl4ZWxzQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEZyb21QaXhlbHMsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBmcm9tUGl4ZWxzIGFzIHt9IGFzIEtlcm5lbEZ1bmMsXG59O1xuXG5sZXQgZnJvbVBpeGVsczJEQ29udGV4dDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEO1xuXG5mdW5jdGlvbiBmcm9tUGl4ZWxzKGFyZ3M6IHtcbiAgaW5wdXRzOiBGcm9tUGl4ZWxzSW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLFxuICBhdHRyczogRnJvbVBpeGVsc0F0dHJzXG59KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGxldCB7cGl4ZWxzfSA9IGlucHV0cztcbiAgY29uc3Qge251bUNoYW5uZWxzfSA9IGF0dHJzO1xuXG4gIGNvbnN0IGlzVmlkZW8gPSB0eXBlb2YgKEhUTUxWaWRlb0VsZW1lbnQpICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgcGl4ZWxzIGluc3RhbmNlb2YgSFRNTFZpZGVvRWxlbWVudDtcbiAgY29uc3QgaXNJbWFnZSA9IHR5cGVvZiAoSFRNTEltYWdlRWxlbWVudCkgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICBwaXhlbHMgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50O1xuICBjb25zdCBbd2lkdGgsIGhlaWdodF0gPSBpc1ZpZGVvID9cbiAgICAgIFtcbiAgICAgICAgKHBpeGVscyBhcyBIVE1MVmlkZW9FbGVtZW50KS52aWRlb1dpZHRoLFxuICAgICAgICAocGl4ZWxzIGFzIEhUTUxWaWRlb0VsZW1lbnQpLnZpZGVvSGVpZ2h0XG4gICAgICBdIDpcbiAgICAgIFtwaXhlbHMud2lkdGgsIHBpeGVscy5oZWlnaHRdO1xuXG4gIGNvbnN0IHRleFNoYXBlOiBbbnVtYmVyLCBudW1iZXJdID0gW2hlaWdodCwgd2lkdGhdO1xuICBjb25zdCBvdXRTaGFwZSA9IFtoZWlnaHQsIHdpZHRoLCBudW1DaGFubmVsc107XG5cbiAgaWYgKGlzSW1hZ2UgfHwgaXNWaWRlbykge1xuICAgIGlmIChmcm9tUGl4ZWxzMkRDb250ZXh0ID09IG51bGwpIHtcbiAgICAgIGZyb21QaXhlbHMyRENvbnRleHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKS5nZXRDb250ZXh0KCcyZCcpO1xuICAgIH1cblxuICAgIGZyb21QaXhlbHMyRENvbnRleHQuY2FudmFzLndpZHRoID0gd2lkdGg7XG4gICAgZnJvbVBpeGVsczJEQ29udGV4dC5jYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgIGZyb21QaXhlbHMyRENvbnRleHQuZHJhd0ltYWdlKFxuICAgICAgICBwaXhlbHMgYXMgSFRNTFZpZGVvRWxlbWVudCB8IEhUTUxJbWFnZUVsZW1lbnQgfCBJbWFnZUJpdG1hcCxcbiAgICAgICAgMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgcGl4ZWxzID0gZnJvbVBpeGVsczJEQ29udGV4dC5jYW52YXM7XG4gIH1cblxuICBjb25zdCB0ZW1wUGl4ZWxIYW5kbGUgPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHRleFNoYXBlLCAnaW50MzInKTtcbiAgLy8gVGhpcyBpcyBhIGJ5dGUgdGV4dHVyZSB3aXRoIHBpeGVscy5cbiAgYmFja2VuZC50ZXhEYXRhLmdldCh0ZW1wUGl4ZWxIYW5kbGUuZGF0YUlkKS51c2FnZSA9IFRleHR1cmVVc2FnZS5QSVhFTFM7XG4gIGJhY2tlbmQuZ3BncHUudXBsb2FkUGl4ZWxEYXRhVG9UZXh0dXJlKFxuICAgICAgYmFja2VuZC5nZXRUZXh0dXJlKHRlbXBQaXhlbEhhbmRsZS5kYXRhSWQpLCBwaXhlbHMgYXMgSW1hZ2VEYXRhKTtcbiAgY29uc3QgcHJvZ3JhbSA9IGVudigpLmdldEJvb2woJ1dFQkdMX1BBQ0snKSA/XG4gICAgICBuZXcgRnJvbVBpeGVsc1BhY2tlZFByb2dyYW0ob3V0U2hhcGUpIDpcbiAgICAgIG5ldyBGcm9tUGl4ZWxzUHJvZ3JhbShvdXRTaGFwZSk7XG4gIGNvbnN0IHJlcyA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFt0ZW1wUGl4ZWxIYW5kbGVdLCAnaW50MzInKTtcbiAgYmFja2VuZC5kaXNwb3NlRGF0YSh0ZW1wUGl4ZWxIYW5kbGUuZGF0YUlkKTtcbiAgcmV0dXJuIHJlcztcbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtnZXRHbHNsRGlmZmVyZW5jZXN9IGZyb20gJy4uLy4uL2dsc2xfdmVyc2lvbic7XG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi4vLi4vZ3BncHVfbWF0aCc7XG5cbmV4cG9ydCBjbGFzcyBGcm9tUGl4ZWxzUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ0EnXTtcbiAgdXNlckNvZGU6IHN0cmluZztcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuXG4gIGNvbnN0cnVjdG9yKG91dHB1dFNoYXBlOiBudW1iZXJbXSkge1xuICAgIGNvbnN0IGdsc2wgPSBnZXRHbHNsRGlmZmVyZW5jZXMoKTtcbiAgICBjb25zdCBbaGVpZ2h0LCB3aWR0aCwgXSA9IG91dHB1dFNoYXBlO1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBvdXRwdXRTaGFwZTtcbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjMyBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IHRleFIgPSBjb29yZHNbMF07XG4gICAgICAgIGludCB0ZXhDID0gY29vcmRzWzFdO1xuICAgICAgICBpbnQgZGVwdGggPSBjb29yZHNbMl07XG4gICAgICAgIHZlYzIgdXYgPSAodmVjMih0ZXhDLCB0ZXhSKSArIGhhbGZDUikgLyB2ZWMyKCR7d2lkdGh9LjAsICR7aGVpZ2h0fS4wKTtcblxuICAgICAgICB2ZWM0IHZhbHVlcyA9ICR7Z2xzbC50ZXh0dXJlMkR9KEEsIHV2KTtcbiAgICAgICAgZmxvYXQgdmFsdWU7XG4gICAgICAgIGlmIChkZXB0aCA9PSAwKSB7XG4gICAgICAgICAgdmFsdWUgPSB2YWx1ZXMucjtcbiAgICAgICAgfSBlbHNlIGlmIChkZXB0aCA9PSAxKSB7XG4gICAgICAgICAgdmFsdWUgPSB2YWx1ZXMuZztcbiAgICAgICAgfSBlbHNlIGlmIChkZXB0aCA9PSAyKSB7XG4gICAgICAgICAgdmFsdWUgPSB2YWx1ZXMuYjtcbiAgICAgICAgfSBlbHNlIGlmIChkZXB0aCA9PSAzKSB7XG4gICAgICAgICAgdmFsdWUgPSB2YWx1ZXMuYTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNldE91dHB1dChmbG9vcih2YWx1ZSAqIDI1NS4wICsgMC41KSk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2dldEdsc2xEaWZmZXJlbmNlc30gZnJvbSAnLi4vLi4vZ2xzbF92ZXJzaW9uJztcbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuLi8uLi9ncGdwdV9tYXRoJztcblxuZXhwb3J0IGNsYXNzIEZyb21QaXhlbHNQYWNrZWRQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnQSddO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHBhY2tlZElucHV0cyA9IGZhbHNlO1xuICBwYWNrZWRPdXRwdXQgPSB0cnVlO1xuXG4gIGNvbnN0cnVjdG9yKG91dHB1dFNoYXBlOiBudW1iZXJbXSkge1xuICAgIGNvbnN0IGdsc2wgPSBnZXRHbHNsRGlmZmVyZW5jZXMoKTtcbiAgICBjb25zdCBbaGVpZ2h0LCB3aWR0aCwgXSA9IG91dHB1dFNoYXBlO1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBvdXRwdXRTaGFwZTtcbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjMyBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IHRleFIgPSBjb29yZHNbMF07XG4gICAgICAgIGludCB0ZXhDID0gY29vcmRzWzFdO1xuICAgICAgICBpbnQgZGVwdGggPSBjb29yZHNbMl07XG5cbiAgICAgICAgdmVjNCByZXN1bHQgPSB2ZWM0KDAuKTtcblxuICAgICAgICBmb3IoaW50IHJvdz0wOyByb3c8PTE7IHJvdysrKSB7XG4gICAgICAgICAgZm9yKGludCBjb2w9MDsgY29sPD0xOyBjb2wrKykge1xuICAgICAgICAgICAgdGV4QyA9IGNvb3Jkc1sxXSArIHJvdztcbiAgICAgICAgICAgIGRlcHRoID0gY29vcmRzWzJdICsgY29sO1xuXG4gICAgICAgICAgICB2ZWMyIHV2ID0gKHZlYzIodGV4QywgdGV4UikgKyBoYWxmQ1IpIC9cbiAgICAgICAgICAgICAgICAgICAgICAgdmVjMigke3dpZHRofS4wLCAke2hlaWdodH0uMCk7XG4gICAgICAgICAgICB2ZWM0IHZhbHVlcyA9ICR7Z2xzbC50ZXh0dXJlMkR9KEEsIHV2KTtcbiAgICAgICAgICAgIGZsb2F0IHZhbHVlO1xuICAgICAgICAgICAgaWYgKGRlcHRoID09IDApIHtcbiAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZXMucjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVwdGggPT0gMSkge1xuICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlcy5nO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChkZXB0aCA9PSAyKSB7XG4gICAgICAgICAgICAgIHZhbHVlID0gdmFsdWVzLmI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGRlcHRoID09IDMpIHtcbiAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZXMuYTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVzdWx0W3JvdyAqIDIgKyBjb2xdID0gZmxvb3IodmFsdWUgKiAyNTUuMCArIDAuNSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgJHtnbHNsLm91dHB1dH0gPSByZXN1bHQ7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgZW52LCBGdXNlZENvbnYyRCwgRnVzZWRDb252MkRBdHRycywgRnVzZWRDb252MkRJbnB1dHMsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mbywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7Q29udjJEUHJvZ3JhbX0gZnJvbSAnLi4vY29udl9ncHUnO1xuaW1wb3J0IHttYXBBY3RpdmF0aW9uVG9TaGFkZXJQcm9ncmFtfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcblxuaW1wb3J0IHtjb252MmRCeU1hdE11bCwgY29udjJkV2l0aEltMlJvd30gZnJvbSAnLi9Db252MkRfaW1wbCc7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4vUmVzaGFwZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBmdXNlZENvbnYyZChhcmdzOiB7XG4gIGlucHV0czogRnVzZWRDb252MkRJbnB1dHMsXG4gIGF0dHJzOiBGdXNlZENvbnYyREF0dHJzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMXG59KSB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4LCBmaWx0ZXIsIGJpYXMsIHByZWx1QWN0aXZhdGlvbldlaWdodHN9ID0gaW5wdXRzO1xuICBjb25zdCB7XG4gICAgc3RyaWRlcyxcbiAgICBwYWQsXG4gICAgZGF0YUZvcm1hdCxcbiAgICBkaWxhdGlvbnMsXG4gICAgZGltUm91bmRpbmdNb2RlLFxuICAgIGFjdGl2YXRpb24sXG4gICAgbGVha3lyZWx1QWxwaGFcbiAgfSA9IGF0dHJzO1xuXG4gIGNvbnN0ICRkYXRhRm9ybWF0ID0gYmFja2VuZF91dGlsLmNvbnZlcnRDb252MkREYXRhRm9ybWF0KGRhdGFGb3JtYXQpO1xuICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlQ29udjJESW5mbyhcbiAgICAgIHguc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgICBmaWx0ZXIuc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIHN0cmlkZXMsIGRpbGF0aW9ucywgcGFkLFxuICAgICAgZGltUm91bmRpbmdNb2RlLCBmYWxzZSAvKiBkZXB0aHdpc2UgKi8sICRkYXRhRm9ybWF0KTtcbiAgbGV0IG91dDogVGVuc29ySW5mbztcbiAgY29uc3QgaW50ZXJtZWRpYXRlczogVGVuc29ySW5mb1tdID0gW107XG5cbiAgaWYgKGNvbnZJbmZvLmZpbHRlckhlaWdodCA9PT0gMSAmJiBjb252SW5mby5maWx0ZXJXaWR0aCA9PT0gMSAmJlxuICAgICAgY29udkluZm8uZGlsYXRpb25IZWlnaHQgPT09IDEgJiYgY29udkluZm8uZGlsYXRpb25XaWR0aCA9PT0gMSAmJlxuICAgICAgY29udkluZm8uc3RyaWRlSGVpZ2h0ID09PSAxICYmIGNvbnZJbmZvLnN0cmlkZVdpZHRoID09PSAxICYmXG4gICAgICAoY29udkluZm8ucGFkSW5mby50eXBlID09PSAnU0FNRScgfHwgY29udkluZm8ucGFkSW5mby50eXBlID09PSAnVkFMSUQnKSkge1xuICAgIG91dCA9IGNvbnYyZEJ5TWF0TXVsKHtcbiAgICAgIHgsXG4gICAgICBmaWx0ZXIsXG4gICAgICBjb252SW5mbyxcbiAgICAgIGJhY2tlbmQsXG4gICAgICBiaWFzLFxuICAgICAgYWN0aXZhdGlvbixcbiAgICAgIHByZWx1QWN0aXZhdGlvbldlaWdodHMsXG4gICAgICBsZWFreXJlbHVBbHBoYVxuICAgIH0pO1xuICB9IGVsc2UgaWYgKGVudigpLmdldEJvb2woJ1dFQkdMX0NPTlZfSU0yQ09MJykgJiYgeC5zaGFwZVswXSA9PT0gMSkge1xuICAgIG91dCA9IGNvbnYyZFdpdGhJbTJSb3coe1xuICAgICAgeCxcbiAgICAgIGZpbHRlcixcbiAgICAgIGNvbnZJbmZvLFxuICAgICAgYmFja2VuZCxcbiAgICAgIGJpYXMsXG4gICAgICBhY3RpdmF0aW9uLFxuICAgICAgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyxcbiAgICAgIGxlYWt5cmVsdUFscGhhXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgaGFzQmlhcyA9IGJpYXMgIT0gbnVsbDtcbiAgICBjb25zdCBoYXNQcmVsdUFjdGl2YXRpb25XZWlnaHRzID0gcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyAhPSBudWxsO1xuICAgIGNvbnN0IGhhc0xlYWt5cmVsdUFscGhhID0gYWN0aXZhdGlvbiA9PT0gJ2xlYWt5cmVsdSc7XG4gICAgY29uc3QgZnVzZWRBY3RpdmF0aW9uID1cbiAgICAgICAgYWN0aXZhdGlvbiA/IG1hcEFjdGl2YXRpb25Ub1NoYWRlclByb2dyYW0oYWN0aXZhdGlvbiwgZmFsc2UpIDogbnVsbDtcbiAgICBjb25zdCBwcm9ncmFtID0gbmV3IENvbnYyRFByb2dyYW0oXG4gICAgICAgIGNvbnZJbmZvLCBoYXNCaWFzLCBmdXNlZEFjdGl2YXRpb24sIGhhc1ByZWx1QWN0aXZhdGlvbldlaWdodHMsXG4gICAgICAgIGhhc0xlYWt5cmVsdUFscGhhKTtcbiAgICBjb25zdCBpbnB1dHM6IFRlbnNvckluZm9bXSA9IFt4LCBmaWx0ZXJdO1xuICAgIGlmIChiaWFzKSB7XG4gICAgICBpbnB1dHMucHVzaChiaWFzKTtcbiAgICB9XG4gICAgaWYgKHByZWx1QWN0aXZhdGlvbldlaWdodHMpIHtcbiAgICAgIGlucHV0cy5wdXNoKHByZWx1QWN0aXZhdGlvbldlaWdodHMpO1xuICAgIH1cbiAgICBpZiAoaGFzTGVha3lyZWx1QWxwaGEpIHtcbiAgICAgIGNvbnN0ICRsZWFreXJlbHVBbHBoYSA9IGJhY2tlbmQubWFrZVRlbnNvckluZm8oXG4gICAgICAgICAgW10sICdmbG9hdDMyJyxcbiAgICAgICAgICB1dGlsLmNyZWF0ZVNjYWxhclZhbHVlKGxlYWt5cmVsdUFscGhhIGFzIHt9IGFzICdmbG9hdDMyJywgJ2Zsb2F0MzInKSk7XG4gICAgICBpbnB1dHMucHVzaCgkbGVha3lyZWx1QWxwaGEpO1xuICAgICAgaW50ZXJtZWRpYXRlcy5wdXNoKCRsZWFreXJlbHVBbHBoYSk7XG4gICAgfVxuICAgIG91dCA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIGlucHV0cywgJ2Zsb2F0MzInKTtcbiAgfVxuXG4gIGNvbnN0IG91dFJlc2hhcGVkID1cbiAgICAgIHJlc2hhcGUoe2lucHV0czoge3g6IG91dH0sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IGNvbnZJbmZvLm91dFNoYXBlfX0pO1xuXG4gIGludGVybWVkaWF0ZXMucHVzaChvdXQpO1xuICBpbnRlcm1lZGlhdGVzLmZvckVhY2godCA9PiBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHQpKTtcblxuICByZXR1cm4gb3V0UmVzaGFwZWQ7XG59XG5cbmV4cG9ydCBjb25zdCBmdXNlZENvbnYyRENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBGdXNlZENvbnYyRCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGZ1c2VkQ29udjJkIGFzIHt9IGFzIEtlcm5lbEZ1bmMsXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgZW52LCBGdXNlZERlcHRod2lzZUNvbnYyRCwgRnVzZWREZXB0aHdpc2VDb252MkRBdHRycywgRnVzZWREZXB0aHdpc2VDb252MkRJbnB1dHMsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mbywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7RGVwdGh3aXNlQ29udjJEUHJvZ3JhbX0gZnJvbSAnLi4vY29udl9ncHVfZGVwdGh3aXNlJztcbmltcG9ydCB7RGVwdGh3aXNlQ29udlBhY2tlZDJEUHJvZ3JhbX0gZnJvbSAnLi4vY29udl9wYWNrZWRfZ3B1X2RlcHRod2lzZSc7XG5pbXBvcnQge21hcEFjdGl2YXRpb25Ub1NoYWRlclByb2dyYW19IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZnVzZWREZXB0aHdpc2VDb252MkQoYXJnczoge1xuICBpbnB1dHM6IEZ1c2VkRGVwdGh3aXNlQ29udjJESW5wdXRzLFxuICBhdHRyczogRnVzZWREZXB0aHdpc2VDb252MkRBdHRycyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTFxufSkge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eCwgZmlsdGVyLCBiaWFzLCBwcmVsdUFjdGl2YXRpb25XZWlnaHRzfSA9IGlucHV0cztcbiAgY29uc3Qge3N0cmlkZXMsIHBhZCwgZGlsYXRpb25zLCBkaW1Sb3VuZGluZ01vZGUsIGFjdGl2YXRpb24sIGxlYWt5cmVsdUFscGhhfSA9XG4gICAgICBhdHRycztcblxuICBjb25zdCBpbnRlcm1lZGlhdGVzOiBUZW5zb3JJbmZvW10gPSBbXTtcblxuICBsZXQgJGRpbGF0aW9ucyA9IGRpbGF0aW9ucztcbiAgaWYgKCRkaWxhdGlvbnMgPT0gbnVsbCkge1xuICAgICRkaWxhdGlvbnMgPSBbMSwgMV07XG4gIH1cblxuICB1dGlsLmFzc2VydChcbiAgICAgIGJhY2tlbmRfdXRpbC5laXRoZXJTdHJpZGVzT3JEaWxhdGlvbnNBcmVPbmUoc3RyaWRlcywgJGRpbGF0aW9ucyksXG4gICAgICAoKSA9PiAnRXJyb3IgaW4gZGVwdGh3aXNlQ29udjJkOiBFaXRoZXIgc3RyaWRlcyBvciBkaWxhdGlvbnMgbXVzdCBiZSAnICtcbiAgICAgICAgICBgMS4gR290IHN0cmlkZXMgJHtzdHJpZGVzfSBhbmQgZGlsYXRpb25zICckeyRkaWxhdGlvbnN9J2ApO1xuXG4gIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVDb252MkRJbmZvKFxuICAgICAgeC5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICAgIGZpbHRlci5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgc3RyaWRlcywgJGRpbGF0aW9ucyxcbiAgICAgIHBhZCwgZGltUm91bmRpbmdNb2RlLCB0cnVlIC8qIGRlcHRod2lzZSAqLyk7XG5cbiAgY29uc3Qgc2hvdWxkUGFja0RlcHRod2lzZUNvbnYgPSBlbnYoKS5nZXRCb29sKCdXRUJHTF9QQUNLX0RFUFRIV0lTRUNPTlYnKSAmJlxuICAgICAgY29udkluZm8uc3RyaWRlV2lkdGggPD0gMiAmJlxuICAgICAgY29udkluZm8ub3V0Q2hhbm5lbHMgLyBjb252SW5mby5pbkNoYW5uZWxzID09PSAxO1xuICBjb25zdCBmdXNlZEFjdGl2YXRpb24gPSBhY3RpdmF0aW9uID9cbiAgICAgIG1hcEFjdGl2YXRpb25Ub1NoYWRlclByb2dyYW0oYWN0aXZhdGlvbiwgc2hvdWxkUGFja0RlcHRod2lzZUNvbnYpIDpcbiAgICAgIG51bGw7XG4gIGNvbnN0IHByb2dyYW1JbnB1dHM6IFRlbnNvckluZm9bXSA9IFt4LCBmaWx0ZXJdO1xuXG4gIGNvbnN0IGhhc0JpYXMgPSBiaWFzICE9IG51bGw7XG4gIGNvbnN0IGhhc1ByZWx1QWN0aXZhdGlvbldlaWdodHMgPSBwcmVsdUFjdGl2YXRpb25XZWlnaHRzICE9IG51bGw7XG4gIGNvbnN0IGhhc0xlYWt5cmVsdUFscGhhID0gYWN0aXZhdGlvbiA9PT0gJ2xlYWt5cmVsdSc7XG5cbiAgaWYgKGhhc0JpYXMpIHtcbiAgICBwcm9ncmFtSW5wdXRzLnB1c2goYmlhcyk7XG4gIH1cbiAgaWYgKGhhc1ByZWx1QWN0aXZhdGlvbldlaWdodHMpIHtcbiAgICBwcm9ncmFtSW5wdXRzLnB1c2gocHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyk7XG4gIH1cbiAgaWYgKGhhc0xlYWt5cmVsdUFscGhhKSB7XG4gICAgY29uc3QgJGxlYWt5cmVsdUFscGhhID0gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhcbiAgICAgICAgW10sICdmbG9hdDMyJyxcbiAgICAgICAgdXRpbC5jcmVhdGVTY2FsYXJWYWx1ZShsZWFreXJlbHVBbHBoYSBhcyB7fSBhcyAnZmxvYXQzMicsICdmbG9hdDMyJykpO1xuICAgIHByb2dyYW1JbnB1dHMucHVzaCgkbGVha3lyZWx1QWxwaGEpO1xuICAgIGludGVybWVkaWF0ZXMucHVzaCgkbGVha3lyZWx1QWxwaGEpO1xuICB9XG5cbiAgbGV0IHByb2dyYW06IERlcHRod2lzZUNvbnYyRFByb2dyYW18RGVwdGh3aXNlQ29udlBhY2tlZDJEUHJvZ3JhbTtcbiAgaWYgKHNob3VsZFBhY2tEZXB0aHdpc2VDb252KSB7XG4gICAgcHJvZ3JhbSA9IG5ldyBEZXB0aHdpc2VDb252UGFja2VkMkRQcm9ncmFtKFxuICAgICAgICBjb252SW5mbywgaGFzQmlhcywgZnVzZWRBY3RpdmF0aW9uLCBoYXNQcmVsdUFjdGl2YXRpb25XZWlnaHRzLFxuICAgICAgICBoYXNMZWFreXJlbHVBbHBoYSk7XG4gIH0gZWxzZSB7XG4gICAgcHJvZ3JhbSA9IG5ldyBEZXB0aHdpc2VDb252MkRQcm9ncmFtKFxuICAgICAgICBjb252SW5mbywgaGFzQmlhcywgZnVzZWRBY3RpdmF0aW9uLCBoYXNQcmVsdUFjdGl2YXRpb25XZWlnaHRzLFxuICAgICAgICBoYXNMZWFreXJlbHVBbHBoYSk7XG4gIH1cbiAgY29uc3QgY3VzdG9tVmFsdWVzID0gW1xuICAgIFtjb252SW5mby5wYWRJbmZvLnRvcCwgY29udkluZm8ucGFkSW5mby5sZWZ0XSxcbiAgICBbY29udkluZm8uc3RyaWRlSGVpZ2h0LCBjb252SW5mby5zdHJpZGVXaWR0aF0sXG4gICAgW2NvbnZJbmZvLmRpbGF0aW9uSGVpZ2h0LCBjb252SW5mby5kaWxhdGlvbldpZHRoXSxcbiAgICBbY29udkluZm8uaW5IZWlnaHQsIGNvbnZJbmZvLmluV2lkdGhdXG4gIF07XG4gIGNvbnN0IHJlc3VsdCA9XG4gICAgICBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBwcm9ncmFtSW5wdXRzLCAnZmxvYXQzMicsIGN1c3RvbVZhbHVlcyk7XG5cbiAgaW50ZXJtZWRpYXRlcy5mb3JFYWNoKHQgPT4gYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh0KSk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGNvbnN0IGZ1c2VkRGVwdGh3aXNlQ29udjJEQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEZ1c2VkRGVwdGh3aXNlQ29udjJELFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogZnVzZWREZXB0aHdpc2VDb252MkQgYXMge30gYXMgS2VybmVsRnVuYyxcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBHYXRoZXJOZCwgR2F0aGVyTmRJbnB1dHMsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mbywgVHlwZWRBcnJheSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7R2F0aGVyTkRQcm9ncmFtfSBmcm9tICcuLi9nYXRoZXJfbmRfZ3B1JztcbmltcG9ydCB7Z2F0aGVyTmRJbXBsQ1BVfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcblxuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL1Jlc2hhcGUnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2F0aGVyTmQoXG4gICAgYXJnczoge2lucHV0czogR2F0aGVyTmRJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0x9KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmR9ID0gYXJncztcbiAgY29uc3Qge3BhcmFtcywgaW5kaWNlc30gPSBpbnB1dHM7XG5cbiAgY29uc3QgaW5kaWNlc1NoYXBlID0gaW5kaWNlcy5zaGFwZTtcbiAgY29uc3Qgc2xpY2VSYW5rID0gaW5kaWNlc1NoYXBlW2luZGljZXNTaGFwZS5sZW5ndGggLSAxXTtcbiAgY29uc3QgcGFyYW1zU2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShwYXJhbXMuc2hhcGUpO1xuXG4gIGNvbnN0IFtyZXN1bHRTaGFwZSwgbnVtU2xpY2VzLCBzbGljZVNpemUsIHN0cmlkZXNdID1cbiAgICAgIGJhY2tlbmRfdXRpbC5wcmVwYXJlQW5kVmFsaWRhdGUocGFyYW1zLCBpbmRpY2VzKTtcblxuICBjb25zdCBmbGF0dGVuSW5kaWNlcyA9IHJlc2hhcGUoXG4gICAgICB7aW5wdXRzOiB7eDogaW5kaWNlc30sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IFtudW1TbGljZXMsIHNsaWNlUmFua119fSk7XG4gIGNvbnN0IGZsYXR0ZW5YID0gcmVzaGFwZSh7XG4gICAgaW5wdXRzOiB7eDogcGFyYW1zfSxcbiAgICBiYWNrZW5kLFxuICAgIGF0dHJzOiB7c2hhcGU6IFsodXRpbC5zaXplRnJvbVNoYXBlKHBhcmFtcy5zaGFwZSkgLyBzbGljZVNpemUpLCBzbGljZVNpemVdfVxuICB9KTtcblxuICBpZiAoYmFja2VuZC5zaG91bGRFeGVjdXRlT25DUFUoW3BhcmFtcywgaW5kaWNlc10pIHx8XG4gICAgICBwYXJhbXMuZHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgaW5kaWNlc0RhdGEgPSBiYWNrZW5kLnJlYWRTeW5jKGluZGljZXMuZGF0YUlkKSBhcyBUeXBlZEFycmF5O1xuICAgIGNvbnN0IHBhcmFtc0J1ZiA9IGJhY2tlbmQuYnVmZmVyU3luYyhwYXJhbXMpO1xuICAgIGNvbnN0IG91dFZhbHVlID0gZ2F0aGVyTmRJbXBsQ1BVKFxuICAgICAgICBpbmRpY2VzRGF0YSwgcGFyYW1zQnVmLCBwYXJhbXMuZHR5cGUsIG51bVNsaWNlcywgc2xpY2VSYW5rLCBzbGljZVNpemUsXG4gICAgICAgIHN0cmlkZXMsIHBhcmFtcy5zaGFwZSwgcGFyYW1zU2l6ZSk7XG5cbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhyZXN1bHRTaGFwZSwgcGFyYW1zLmR0eXBlLCBvdXRWYWx1ZS52YWx1ZXMpO1xuICB9XG4gIGNvbnN0IHByb2dyYW0gPVxuICAgICAgbmV3IEdhdGhlck5EUHJvZ3JhbShzbGljZVJhbmssIHN0cmlkZXMsIFtudW1TbGljZXMsIHNsaWNlU2l6ZV0pO1xuICBjb25zdCByZXMgPSBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShcbiAgICAgIHByb2dyYW0sIFtmbGF0dGVuWCwgZmxhdHRlbkluZGljZXNdLCBmbGF0dGVuWC5kdHlwZSk7XG5cbiAgY29uc3QgcmVzaGFwZWQgPVxuICAgICAgcmVzaGFwZSh7aW5wdXRzOiB7eDogcmVzfSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogcmVzdWx0U2hhcGV9fSk7XG5cbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhmbGF0dGVuSW5kaWNlcyk7XG4gIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oZmxhdHRlblgpO1xuICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlcyk7XG5cbiAgcmV0dXJuIHJlc2hhcGVkO1xufVxuXG5leHBvcnQgY29uc3QgZ2F0aGVyTmRDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogR2F0aGVyTmQsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBnYXRoZXJOZCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgR2F0aGVyVjIsIEdhdGhlclYyQXR0cnMsIEdhdGhlclYySW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm8sIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge0dhdGhlclByb2dyYW19IGZyb20gJy4uL2dhdGhlcl9ncHUnO1xuaW1wb3J0IHtnYXRoZXJWMkltcGxDUFV9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuXG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4vUmVzaGFwZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnYXRoZXJWMihhcmdzOiB7XG4gIGlucHV0czogR2F0aGVyVjJJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsXG4gIGF0dHJzOiBHYXRoZXJWMkF0dHJzXG59KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4LCBpbmRpY2VzfSA9IGlucHV0cztcbiAgY29uc3Qge2F4aXMsIGJhdGNoRGltc30gPSBhdHRycztcblxuICBjb25zdCBwYXJzZWRBeGlzID0gdXRpbC5wYXJzZUF4aXNQYXJhbShheGlzLCB4LnNoYXBlKVswXTtcbiAgY29uc3Qgc2hhcGVJbmZvID0gYmFja2VuZF91dGlsLnNlZ21lbnRfdXRpbC5jb2xsZWN0R2F0aGVyT3BTaGFwZUluZm8oXG4gICAgICB4LCBpbmRpY2VzLCBwYXJzZWRBeGlzLCBiYXRjaERpbXMpO1xuXG4gIGNvbnN0IGluZGljZXNTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKGluZGljZXMuc2hhcGUpO1xuXG4gIGNvbnN0IHRvRGlzcG9zZSA9IFtdO1xuXG4gIGNvbnN0IGZsYXR0ZW5YID0gcmVzaGFwZSh7XG4gICAgaW5wdXRzOiB7eH0sXG4gICAgYmFja2VuZCxcbiAgICBhdHRyczoge1xuICAgICAgc2hhcGU6IFtcbiAgICAgICAgc2hhcGVJbmZvLmJhdGNoU2l6ZSwgc2hhcGVJbmZvLm91dGVyU2l6ZSwgc2hhcGVJbmZvLmRpbVNpemUsXG4gICAgICAgIHNoYXBlSW5mby5zbGljZVNpemVcbiAgICAgIF1cbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IGZsYXR0ZW5JbmRleCA9IHJlc2hhcGUoe1xuICAgIGlucHV0czoge3g6IGluZGljZXN9LFxuICAgIGJhY2tlbmQsXG4gICAgYXR0cnM6IHtzaGFwZTogW3NoYXBlSW5mby5iYXRjaFNpemUsIGluZGljZXNTaXplIC8gc2hhcGVJbmZvLmJhdGNoU2l6ZV19XG4gIH0pO1xuXG4gIHRvRGlzcG9zZS5wdXNoKGZsYXR0ZW5YKTtcbiAgdG9EaXNwb3NlLnB1c2goZmxhdHRlbkluZGV4KTtcblxuICBjb25zdCBmbGF0dGVuT3V0cHV0U2hhcGUgPSBbXG4gICAgc2hhcGVJbmZvLmJhdGNoU2l6ZSwgc2hhcGVJbmZvLm91dGVyU2l6ZSwgaW5kaWNlc1NpemUgLyBzaGFwZUluZm8uYmF0Y2hTaXplLFxuICAgIHNoYXBlSW5mby5zbGljZVNpemVcbiAgXTtcblxuICBpZiAoYmFja2VuZC5zaG91bGRFeGVjdXRlT25DUFUoW3gsIGluZGljZXNdKSB8fCB4LmR0eXBlID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IGluZGljZXNCdWYgPSBiYWNrZW5kLmJ1ZmZlclN5bmMoZmxhdHRlbkluZGV4KTtcbiAgICBjb25zdCB4QnVmID0gYmFja2VuZC5idWZmZXJTeW5jKGZsYXR0ZW5YKTtcbiAgICBjb25zdCBvdXRCdWYgPSBnYXRoZXJWMkltcGxDUFUoeEJ1ZiwgaW5kaWNlc0J1ZiwgZmxhdHRlbk91dHB1dFNoYXBlKTtcblxuICAgIHRvRGlzcG9zZS5mb3JFYWNoKHQgPT4gYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh0KSk7XG5cbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhcbiAgICAgICAgc2hhcGVJbmZvLm91dHB1dFNoYXBlLCBvdXRCdWYuZHR5cGUsIG91dEJ1Zi52YWx1ZXMgYXMgVHlwZWRBcnJheSk7XG4gIH1cblxuICBjb25zdCBwcm9ncmFtID0gbmV3IEdhdGhlclByb2dyYW0oZmxhdHRlblguc2hhcGUsIGZsYXR0ZW5PdXRwdXRTaGFwZSk7XG4gIGNvbnN0IHJlcyA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKFxuICAgICAgcHJvZ3JhbSwgW2ZsYXR0ZW5YLCBmbGF0dGVuSW5kZXhdLCBmbGF0dGVuWC5kdHlwZSk7XG4gIHRvRGlzcG9zZS5wdXNoKHJlcyk7XG5cbiAgY29uc3QgcmVzaGFwZWQgPSByZXNoYXBlKFxuICAgICAge2lucHV0czoge3g6IHJlc30sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IHNoYXBlSW5mby5vdXRwdXRTaGFwZX19KTtcbiAgdG9EaXNwb3NlLmZvckVhY2godCA9PiBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHQpKTtcbiAgcmV0dXJuIHJlc2hhcGVkO1xufVxuXG5leHBvcnQgY29uc3QgZ2F0aGVyVjJDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogR2F0aGVyVjIsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBnYXRoZXJWMiBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0dyZWF0ZXIsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuY30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtiaW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7Z3JlYXRlckltcGxDUFV9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuXG5jb25zdCBHUkVBVEVSID0gYHJldHVybiBmbG9hdChhID4gYik7YDtcbmNvbnN0IEdSRUFURVJfUEFDS0VEID0gYFxuICByZXR1cm4gdmVjNChncmVhdGVyVGhhbihhLCBiKSk7XG5gO1xuXG5leHBvcnQgY29uc3QgZ3JlYXRlciA9IGJpbmFyeUtlcm5lbEZ1bmMoe1xuICBvcFNuaXBwZXQ6IEdSRUFURVIsXG4gIHBhY2tlZE9wU25pcHBldDogR1JFQVRFUl9QQUNLRUQsXG4gIGNwdUtlcm5lbEltcGw6IGdyZWF0ZXJJbXBsQ1BVLFxuICBkdHlwZTogJ2Jvb2wnXG59KTtcblxuZXhwb3J0IGNvbnN0IGdyZWF0ZXJDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogR3JlYXRlcixcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGdyZWF0ZXIgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtHcmVhdGVyRXF1YWwsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuY30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7YmluYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5pbXBvcnQge2dyZWF0ZXJFcXVhbEltcGxDUFV9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuXG5jb25zdCBHUkVBVEVSX0VRVUFMID0gYHJldHVybiBmbG9hdChhID49IGIpO2A7XG5jb25zdCBHUkVBVEVSX0VRVUFMX1BBQ0tFRCA9IGBcbiAgcmV0dXJuIHZlYzQoZ3JlYXRlclRoYW5FcXVhbChhLCBiKSk7XG5gO1xuXG5leHBvcnQgY29uc3QgZ3JlYXRlckVxdWFsID0gYmluYXJ5S2VybmVsRnVuYyh7XG4gIG9wU25pcHBldDogR1JFQVRFUl9FUVVBTCxcbiAgcGFja2VkT3BTbmlwcGV0OiBHUkVBVEVSX0VRVUFMX1BBQ0tFRCxcbiAgZHR5cGU6ICdib29sJyxcbiAgY3B1S2VybmVsSW1wbDogZ3JlYXRlckVxdWFsSW1wbENQVVxufSk7XG5cbmV4cG9ydCBjb25zdCBncmVhdGVyRXF1YWxDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogR3JlYXRlckVxdWFsLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogZ3JlYXRlckVxdWFsIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7SUZGVCwgSUZGVElucHV0cywgS2VybmVsQ29uZmlnLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuXG5pbXBvcnQge2ZmdEltcGx9IGZyb20gJy4vRkZUX2ltcGwnO1xuXG5leHBvcnQgZnVuY3Rpb24gaWZmdChhcmdzOiB7aW5wdXRzOiBJRkZUSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmR9ID0gYXJncztcbiAgY29uc3Qge2lucHV0fSA9IGlucHV0cztcblxuICByZXR1cm4gZmZ0SW1wbChpbnB1dCwgdHJ1ZSAvKiBpbnZlcnNlICovLCBiYWNrZW5kKTtcbn1cblxuZXhwb3J0IGNvbnN0IGlmZnRDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogSUZGVCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGlmZnRcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7SWRlbnRpdHksIElkZW50aXR5SW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBpZGVudGl0eShcbiAgICBhcmdzOiB7aW5wdXRzOiBJZGVudGl0eUlucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTH0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZH0gPSBhcmdzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG5cbiAgYmFja2VuZC5pbmNSZWYoeC5kYXRhSWQpO1xuXG4gIHJldHVybiB7ZGF0YUlkOiB4LmRhdGFJZCwgc2hhcGU6IHguc2hhcGUsIGR0eXBlOiB4LmR0eXBlfTtcbn1cblxuZXhwb3J0IGNvbnN0IGlkZW50aXR5Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IElkZW50aXR5LFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogaWRlbnRpdHkgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtJbWFnLCBJbWFnSW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge2lkZW50aXR5fSBmcm9tICcuL0lkZW50aXR5JztcblxuZXhwb3J0IGZ1bmN0aW9uIGltYWcoYXJnczoge2lucHV0czogSW1hZ0lucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTH0pOlxuICAgIFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kfSA9IGFyZ3M7XG4gIGNvbnN0IHtpbnB1dH0gPSBpbnB1dHM7XG4gIGNvbnN0IGlucHV0RGF0YSA9IGJhY2tlbmQudGV4RGF0YS5nZXQoaW5wdXQuZGF0YUlkKTtcblxuICByZXR1cm4gaWRlbnRpdHkoe2lucHV0czoge3g6IGlucHV0RGF0YS5jb21wbGV4VGVuc29ySW5mb3MuaW1hZ30sIGJhY2tlbmR9KTtcbn1cblxuZXhwb3J0IGNvbnN0IGltYWdDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogSW1hZyxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGltYWcgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtJc0Zpbml0ZSwgS2VybmVsQ29uZmlnfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHt1bmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuXG5jb25zdCBJU19GSU5JVEUgPSBgcmV0dXJuIGZsb2F0KCFpc25hbih4KSAmJiAhaXNpbmYoeCkpO2A7XG5cbmV4cG9ydCBjb25zdCBpc0Zpbml0ZSA9IHVuYXJ5S2VybmVsRnVuYyh7b3BTbmlwcGV0OiBJU19GSU5JVEUsIGR0eXBlOiAnYm9vbCd9KTtcblxuZXhwb3J0IGNvbnN0IGlzRmluaXRlQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IElzRmluaXRlLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogaXNGaW5pdGUsXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0lzSW5mLCBLZXJuZWxDb25maWd9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge3VuYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5cbmNvbnN0IElTX0lORiA9IGByZXR1cm4gZmxvYXQoaXNpbmYoeCkpO2A7XG5cbmV4cG9ydCBjb25zdCBpc0luZiA9IHVuYXJ5S2VybmVsRnVuYyh7b3BTbmlwcGV0OiBJU19JTkYsIGR0eXBlOiAnYm9vbCd9KTtcblxuZXhwb3J0IGNvbnN0IGlzSW5mQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IElzSW5mLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogaXNJbmYsXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0lzTmFuLCBLZXJuZWxDb25maWd9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge3VuYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5cbmNvbnN0IElTX05BTiA9IGByZXR1cm4gZmxvYXQoaXNuYW4oeCkpO2A7XG5cbmV4cG9ydCBjb25zdCBpc05hTiA9IHVuYXJ5S2VybmVsRnVuYyh7b3BTbmlwcGV0OiBJU19OQU4sIGR0eXBlOiAnYm9vbCd9KTtcblxuZXhwb3J0IGNvbnN0IGlzTmFOQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IElzTmFuLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogaXNOYU4sXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2VudiwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBMUk4sIExSTkF0dHJzLCBMUk5JbnB1dHMsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge0xSTlByb2dyYW19IGZyb20gJy4uL2xybl9ncHUnO1xuaW1wb3J0IHtMUk5QYWNrZWRQcm9ncmFtfSBmcm9tICcuLi9scm5fcGFja2VkX2dwdSc7XG5cbmV4cG9ydCBjb25zdCBscm4gPVxuICAgIChhcmdzOiB7aW5wdXRzOiBMUk5JbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsIGF0dHJzOiBMUk5BdHRyc30pOlxuICAgICAgICBUZW5zb3JJbmZvID0+IHtcbiAgICAgICAgICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICAgICAgICAgIGNvbnN0IHt4fSA9IGlucHV0cztcbiAgICAgICAgICBjb25zdCB7ZGVwdGhSYWRpdXMsIGJpYXMsIGFscGhhLCBiZXRhfSA9IGF0dHJzO1xuXG4gICAgICAgICAgY29uc3QgcHJvZ3JhbSA9IGVudigpLmdldEJvb2woJ1dFQkdMX1BBQ0tfTk9STUFMSVpBVElPTicpID9cbiAgICAgICAgICAgICAgbmV3IExSTlBhY2tlZFByb2dyYW0oeC5zaGFwZSwgZGVwdGhSYWRpdXMsIGJpYXMsIGFscGhhLCBiZXRhKSA6XG4gICAgICAgICAgICAgIG5ldyBMUk5Qcm9ncmFtKHguc2hhcGUsIGRlcHRoUmFkaXVzLCBiaWFzLCBhbHBoYSwgYmV0YSk7XG4gICAgICAgICAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFt4XSwgeC5kdHlwZSk7XG4gICAgICAgIH07XG5cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogdmFyaWFibGUtbmFtZVxuZXhwb3J0IGNvbnN0IExSTkNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBMUk4sXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBscm4gYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIExSTkdyYWQsIExSTkdyYWRBdHRycywgTFJOR3JhZElucHV0cywgVGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7TFJOR3JhZFByb2dyYW19IGZyb20gJy4uL2xybl9ncmFkX2dwdSc7XG5cbmV4cG9ydCBjb25zdCBscm5HcmFkID0gKGFyZ3M6IHtcbiAgaW5wdXRzOiBMUk5HcmFkSW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLFxuICBhdHRyczogTFJOR3JhZEF0dHJzXG59KTogVGVuc29ySW5mbyA9PiB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4LCB5LCBkeX0gPSBpbnB1dHM7XG4gIGNvbnN0IHtkZXB0aFJhZGl1cywgYmlhcywgYWxwaGEsIGJldGF9ID0gYXR0cnM7XG5cbiAgY29uc3QgcHJvZ3JhbSA9IG5ldyBMUk5HcmFkUHJvZ3JhbSh4LnNoYXBlLCBkZXB0aFJhZGl1cywgYmlhcywgYWxwaGEsIGJldGEpO1xuICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3gsIHksIGR5XSwgeC5kdHlwZSk7XG59O1xuXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IHZhcmlhYmxlLW5hbWVcbmV4cG9ydCBjb25zdCBMUk5HcmFkQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IExSTkdyYWQsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBscm5HcmFkIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7ZW52LCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIExlYWt5UmVsdSwgTGVha3lSZWx1QXR0cnMsIExlYWt5UmVsdUlucHV0cywgVGVuc29ySW5mbywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge0JpbmFyeU9wUHJvZ3JhbX0gZnJvbSAnLi4vYmluYXJ5b3BfZ3B1JztcbmltcG9ydCB7QmluYXJ5T3BQYWNrZWRQcm9ncmFtfSBmcm9tICcuLi9iaW5hcnlvcF9wYWNrZWRfZ3B1JztcblxuZXhwb3J0IGNvbnN0IExFQUtZUkVMVSA9IGByZXR1cm4gKGEgPCAwLikgPyBiICogYSA6IGE7YDtcbmV4cG9ydCBjb25zdCBMRUFLWVJFTFVfUEFDS0VEID0gYFxuICB2ZWM0IGFMZXNzVGhhblplcm8gPSB2ZWM0KGxlc3NUaGFuKGEsIHZlYzQoMC4pKSk7XG4gIHJldHVybiAoYUxlc3NUaGFuWmVybyAqIChiICogYSkpICsgKCh2ZWM0KDEuMCkgLSBhTGVzc1RoYW5aZXJvKSAqIGEpO1xuYDtcblxuZXhwb3J0IGZ1bmN0aW9uIGxlYWt5UmVsdShhcmdzOiB7XG4gIGlucHV0czogTGVha3lSZWx1SW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLFxuICBhdHRyczogTGVha3lSZWx1QXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICBjb25zdCB7YWxwaGF9ID0gYXR0cnM7XG5cbiAgY29uc3QgJGFscGhhID0gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhcbiAgICAgIFtdLCAnZmxvYXQzMicsXG4gICAgICB1dGlsLmNyZWF0ZVNjYWxhclZhbHVlKGFscGhhIGFzIHt9IGFzICdmbG9hdDMyJywgJ2Zsb2F0MzInKSk7XG5cbiAgY29uc3QgcHJvZ3JhbSA9IGVudigpLmdldEJvb2woJ1dFQkdMX1BBQ0tfQklOQVJZX09QRVJBVElPTlMnKSA/XG4gICAgICBuZXcgQmluYXJ5T3BQYWNrZWRQcm9ncmFtKExFQUtZUkVMVV9QQUNLRUQsIHguc2hhcGUsICRhbHBoYS5zaGFwZSkgOlxuICAgICAgbmV3IEJpbmFyeU9wUHJvZ3JhbShMRUFLWVJFTFUsIHguc2hhcGUsICRhbHBoYS5zaGFwZSk7XG4gIGNvbnN0IHJlc3VsdCA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFt4LCAkYWxwaGFdLCB4LmR0eXBlKTtcblxuICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKCRhbHBoYSk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGNvbnN0IGxlYWt5UmVsdUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBMZWFreVJlbHUsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBsZWFreVJlbHUgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIExlc3N9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7YmluYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5pbXBvcnQge2xlc3NJbXBsQ1BVfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcblxuY29uc3QgTEVTUyA9IGByZXR1cm4gZmxvYXQoYSA8IGIpO2A7XG5jb25zdCBMRVNTX1BBQ0tFRCA9IGBcbiAgcmV0dXJuIHZlYzQobGVzc1RoYW4oYSwgYikpO1xuYDtcblxuZXhwb3J0IGNvbnN0IGxlc3MgPSBiaW5hcnlLZXJuZWxGdW5jKHtcbiAgb3BTbmlwcGV0OiBMRVNTLFxuICBwYWNrZWRPcFNuaXBwZXQ6IExFU1NfUEFDS0VELFxuICBjcHVLZXJuZWxJbXBsOiBsZXNzSW1wbENQVSxcbiAgZHR5cGU6ICdib29sJ1xufSk7XG5cbmV4cG9ydCBjb25zdCBsZXNzQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IExlc3MsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBsZXNzIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBMZXNzRXF1YWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7YmluYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5pbXBvcnQge2xlc3NFcXVhbEltcGxDUFV9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuXG5leHBvcnQgY29uc3QgTEVTU19FUVVBTCA9IGByZXR1cm4gZmxvYXQoYSA8PSBiKTtgO1xuZXhwb3J0IGNvbnN0IExFU1NfRVFVQUxfUEFDS0VEID0gYFxuICByZXR1cm4gdmVjNChsZXNzVGhhbkVxdWFsKGEsIGIpKTtcbmA7XG5cbmV4cG9ydCBjb25zdCBsZXNzRXF1YWwgPSBiaW5hcnlLZXJuZWxGdW5jKHtcbiAgb3BTbmlwcGV0OiBMRVNTX0VRVUFMLFxuICBwYWNrZWRPcFNuaXBwZXQ6IExFU1NfRVFVQUxfUEFDS0VELFxuICBjcHVLZXJuZWxJbXBsOiBsZXNzRXF1YWxJbXBsQ1BVLFxuICBkdHlwZTogJ2Jvb2wnXG59KTtcblxuZXhwb3J0IGNvbnN0IGxlc3NFcXVhbENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBMZXNzRXF1YWwsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBsZXNzRXF1YWwgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIExpblNwYWNlLCBMaW5TcGFjZUF0dHJzLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtsaW5TcGFjZUltcGxDUFV9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuXG5leHBvcnQgZnVuY3Rpb24gbGluU3BhY2UoXG4gICAgYXJnczoge2JhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsIGF0dHJzOiBMaW5TcGFjZUF0dHJzfSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7YmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3N0YXJ0LCBzdG9wLCBudW19ID0gYXR0cnM7XG5cbiAgLy8gVE9ETzogVXNlIENQVSBpbXBsZW1lbnRhdGlvbiBkdWUgdG8gdGhlIHByZWNpc2lvbiBwcm9ibGVtIGluIFNhZmFyaS5cbiAgY29uc3Qgb3V0VmFscyA9IGxpblNwYWNlSW1wbENQVShzdGFydCwgc3RvcCwgbnVtKTtcbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oW291dFZhbHMubGVuZ3RoXSwgJ2Zsb2F0MzInLCBvdXRWYWxzKTtcbn1cblxuZXhwb3J0IGNvbnN0IGxpblNwYWNlQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IExpblNwYWNlLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogbGluU3BhY2UgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIExvZ30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7bG9nSW1wbENQVX0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5cbmNvbnN0IExPRyA9IGBpZiAoeCA8IDAuMCkgcmV0dXJuIE5BTjtcbiAgcmV0dXJuIGxvZyh4KTtgO1xuXG5jb25zdCBMT0dfUEFDS0VEID0gYFxuICB2ZWM0IHJlc3VsdCA9IGxvZyh4KTtcbiAgdmVjNCBpc05hTiA9IHZlYzQobGVzc1RoYW4oeCwgdmVjNCgwLjApKSk7XG4gIHJlc3VsdC5yID0gaXNOYU4uciA9PSAxLjAgPyBOQU4gOiByZXN1bHQucjtcbiAgcmVzdWx0LmcgPSBpc05hTi5nID09IDEuMCA/IE5BTiA6IHJlc3VsdC5nO1xuICByZXN1bHQuYiA9IGlzTmFOLmIgPT0gMS4wID8gTkFOIDogcmVzdWx0LmI7XG4gIHJlc3VsdC5hID0gaXNOYU4uYSA9PSAxLjAgPyBOQU4gOiByZXN1bHQuYTtcblxuICByZXR1cm4gcmVzdWx0O1xuYDtcblxuZXhwb3J0IGNvbnN0IGxvZyA9IHVuYXJ5S2VybmVsRnVuYyhcbiAgICB7b3BTbmlwcGV0OiBMT0csIHBhY2tlZE9wU25pcHBldDogTE9HX1BBQ0tFRCwgY3B1S2VybmVsSW1wbDogbG9nSW1wbENQVX0pO1xuXG5leHBvcnQgY29uc3QgbG9nQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IExvZyxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGxvZyBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgTG9nMXB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge3VuYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5cbmNvbnN0IExPRzFQID0gYHJldHVybiBsb2coMS4wICsgeCk7YDtcblxuZXhwb3J0IGNvbnN0IGxvZzFwID0gdW5hcnlLZXJuZWxGdW5jKHtvcFNuaXBwZXQ6IExPRzFQfSk7XG5cbmV4cG9ydCBjb25zdCBsb2cxcENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBMb2cxcCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGxvZzFwLFxufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIExvZ2ljYWxBbmR9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7YmluYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5cbmNvbnN0IExPR0lDQUxfQU5EID0gYHJldHVybiBmbG9hdChhID49IDEuMCAmJiBiID49IDEuMCk7YDtcbmNvbnN0IExPR0lDQUxfQU5EX1BBQ0tFRCA9IGBcbiAgcmV0dXJuIHZlYzQoXG4gICAgdmVjNChncmVhdGVyVGhhbkVxdWFsKGEsIHZlYzQoMS4wKSkpICpcbiAgICB2ZWM0KGdyZWF0ZXJUaGFuRXF1YWwoYiwgdmVjNCgxLjApKSkpO1xuYDtcblxuZXhwb3J0IGNvbnN0IGxvZ2ljYWxBbmQgPSBiaW5hcnlLZXJuZWxGdW5jKHtcbiAgb3BTbmlwcGV0OiBMT0dJQ0FMX0FORCxcbiAgcGFja2VkT3BTbmlwcGV0OiBMT0dJQ0FMX0FORF9QQUNLRUQsXG4gIGR0eXBlOiAnYm9vbCdcbn0pO1xuXG5leHBvcnQgY29uc3QgbG9naWNhbEFuZENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBMb2dpY2FsQW5kLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogbG9naWNhbEFuZCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgTG9naWNhbE5vdH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcblxuY29uc3QgTE9HSUNBTF9OT1QgPSBgcmV0dXJuIGZsb2F0KCEoeCA+PSAxLjApKTtgO1xuXG5leHBvcnQgY29uc3QgbG9naWNhbE5vdCA9IHVuYXJ5S2VybmVsRnVuYyh7b3BTbmlwcGV0OiBMT0dJQ0FMX05PVH0pO1xuXG5leHBvcnQgY29uc3QgbG9naWNhbE5vdENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBMb2dpY2FsTm90LFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogbG9naWNhbE5vdCxcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBMb2dpY2FsT3J9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7YmluYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5cbmNvbnN0IExPR0lDQUxfT1IgPSBgcmV0dXJuIGZsb2F0KGEgPj0gMS4wIHx8IGIgPj0gMS4wKTtgO1xuY29uc3QgTE9HSUNBTF9PUl9QQUNLRUQgPSBgXG4gIHJldHVybiBtaW4oXG4gICAgdmVjNChncmVhdGVyVGhhbkVxdWFsKGEsIHZlYzQoMS4wKSkpICtcbiAgICB2ZWM0KGdyZWF0ZXJUaGFuRXF1YWwoYiwgdmVjNCgxLjApKSksXG4gICAgdmVjNCgxLjApKTtcbmA7XG5cbmV4cG9ydCBjb25zdCBsb2dpY2FsT3IgPSBiaW5hcnlLZXJuZWxGdW5jKFxuICAgIHtvcFNuaXBwZXQ6IExPR0lDQUxfT1IsIHBhY2tlZE9wU25pcHBldDogTE9HSUNBTF9PUl9QQUNLRUQsIGR0eXBlOiAnYm9vbCd9KTtcblxuZXhwb3J0IGNvbnN0IGxvZ2ljYWxPckNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBMb2dpY2FsT3IsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBsb2dpY2FsT3IgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxGdW5jLCBNYXgsIE1heEF0dHJzLCBNYXhJbnB1dHMsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgS2VybmVsQ29uZmlnLCBUeXBlZEFycmF5LCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHttYXhJbXBsQ1BVfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcblxuaW1wb3J0IHttYXhJbXBsfSBmcm9tICcuL01heF9pbXBsJztcbmltcG9ydCB7dHJhbnNwb3NlSW1wbCwgdHJhbnNwb3NlSW1wbENQVX0gZnJvbSAnLi9UcmFuc3Bvc2VfaW1wbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXgoXG4gICAgYXJnczoge2lucHV0czogTWF4SW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLCBhdHRyczogTWF4QXR0cnN9KTpcbiAgICBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICBjb25zdCB7cmVkdWN0aW9uSW5kaWNlcywga2VlcERpbXN9ID0gYXR0cnM7XG5cbiAgY29uc3QgeFJhbmsgPSB4LnNoYXBlLmxlbmd0aDtcblxuICBjb25zdCBvcmlnQXhlcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0ocmVkdWN0aW9uSW5kaWNlcywgeC5zaGFwZSk7XG4gIGxldCBheGVzID0gb3JpZ0F4ZXM7XG4gIGNvbnN0IHBlcm11dGVkQXhlcyA9IGJhY2tlbmRfdXRpbC5nZXRBeGVzUGVybXV0YXRpb24oYXhlcywgeFJhbmspO1xuICBjb25zdCBtYXhJbnB1dElzVHJhbnNwb3NlZCA9IHBlcm11dGVkQXhlcyAhPSBudWxsO1xuICBjb25zdCBzaG91bGRFeGVjdXRlT25DUFUgPSBiYWNrZW5kLnNob3VsZEV4ZWN1dGVPbkNQVShbeF0pO1xuXG4gIGxldCBtYXhJbnB1dCA9IHg7XG4gIGlmIChtYXhJbnB1dElzVHJhbnNwb3NlZCkge1xuICAgIGlmIChzaG91bGRFeGVjdXRlT25DUFUpIHtcbiAgICAgIGNvbnN0IHhUZXhEYXRhID0gYmFja2VuZC50ZXhEYXRhLmdldChtYXhJbnB1dC5kYXRhSWQpO1xuICAgICAgY29uc3QgdmFsdWVzID0geFRleERhdGEudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG5cbiAgICAgIGNvbnN0IG5ld1NoYXBlOiBudW1iZXJbXSA9IG5ldyBBcnJheSh4UmFuayk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld1NoYXBlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG5ld1NoYXBlW2ldID0geC5zaGFwZVtwZXJtdXRlZEF4ZXNbaV1dO1xuICAgICAgfVxuICAgICAgY29uc3QgbWF4SW5wdXRWYWx1ZXMgPVxuICAgICAgICAgIHRyYW5zcG9zZUltcGxDUFUodmFsdWVzLCB4LnNoYXBlLCB4LmR0eXBlLCBwZXJtdXRlZEF4ZXMsIG5ld1NoYXBlKTtcblxuICAgICAgbWF4SW5wdXQgPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG5ld1NoYXBlLCB4LmR0eXBlKTtcbiAgICAgIGNvbnN0IG1heElucHV0RGF0YSA9IGJhY2tlbmQudGV4RGF0YS5nZXQobWF4SW5wdXQuZGF0YUlkKTtcbiAgICAgIG1heElucHV0RGF0YS52YWx1ZXMgPSBtYXhJbnB1dFZhbHVlcztcbiAgICB9IGVsc2Uge1xuICAgICAgbWF4SW5wdXQgPSB0cmFuc3Bvc2VJbXBsKHgsIHBlcm11dGVkQXhlcywgYmFja2VuZCk7XG4gICAgfVxuXG4gICAgYXhlcyA9IGJhY2tlbmRfdXRpbC5nZXRJbm5lck1vc3RBeGVzKGF4ZXMubGVuZ3RoLCB4UmFuayk7XG4gIH1cblxuICBiYWNrZW5kX3V0aWwuYXNzZXJ0QXhlc0FyZUlubmVyTW9zdERpbXMoJ21heCcsIGF4ZXMsIHhSYW5rKTtcbiAgY29uc3QgW21heE91dFNoYXBlLCByZWR1Y2VTaGFwZV0gPVxuICAgICAgYmFja2VuZF91dGlsLmNvbXB1dGVPdXRBbmRSZWR1Y2VTaGFwZXMobWF4SW5wdXQuc2hhcGUsIGF4ZXMpO1xuXG4gIGxldCBvdXRTaGFwZSA9IG1heE91dFNoYXBlO1xuICBpZiAoa2VlcERpbXMpIHtcbiAgICAvLyByYXRoZXIgdGhhbiByZXNoYXBlIGF0IHRoZSBlbmQsIHNldCB0aGUgdGFyZ2V0IHNoYXBlIGhlcmUuXG4gICAgb3V0U2hhcGUgPSBiYWNrZW5kX3V0aWwuZXhwYW5kU2hhcGVUb0tlZXBEaW0obWF4T3V0U2hhcGUsIG9yaWdBeGVzKTtcbiAgfVxuXG4gIGxldCBvdXQ7XG4gIGlmIChzaG91bGRFeGVjdXRlT25DUFUpIHtcbiAgICBjb25zdCB4VGV4RGF0YSA9IGJhY2tlbmQudGV4RGF0YS5nZXQobWF4SW5wdXQuZGF0YUlkKTtcbiAgICBjb25zdCB2YWx1ZXMgPSB4VGV4RGF0YS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcblxuICAgIGNvbnN0IG91dFZhbHVlcyA9XG4gICAgICAgIG1heEltcGxDUFUodmFsdWVzLCB1dGlsLnNpemVGcm9tU2hhcGUocmVkdWNlU2hhcGUpLCBvdXRTaGFwZSwgeC5kdHlwZSk7XG5cbiAgICBvdXQgPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dFNoYXBlLCB4LmR0eXBlKTtcbiAgICBjb25zdCBvdXREYXRhID0gYmFja2VuZC50ZXhEYXRhLmdldChvdXQuZGF0YUlkKTtcbiAgICBvdXREYXRhLnZhbHVlcyA9IG91dFZhbHVlcztcbiAgfSBlbHNlIHtcbiAgICBvdXQgPSBtYXhJbXBsKG1heElucHV0LCByZWR1Y2VTaGFwZSwgb3V0U2hhcGUsIGJhY2tlbmQpO1xuICB9XG5cbiAgaWYgKG1heElucHV0SXNUcmFuc3Bvc2VkKSB7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhtYXhJbnB1dCk7XG4gIH1cblxuICByZXR1cm4gb3V0O1xufVxuXG5leHBvcnQgY29uc3QgbWF4Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IE1heCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IG1heCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgTWF4UG9vbCwgTWF4UG9vbEF0dHJzLCBNYXhQb29sSW5wdXRzLCBUZW5zb3JJbmZvLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtQb29sMkRQcm9ncmFtfSBmcm9tICcuLi9wb29sX2dwdSc7XG5pbXBvcnQge2Fzc2VydE5vdENvbXBsZXh9IGZyb20gJy4uL3dlYmdsX3V0aWwnO1xuaW1wb3J0IHtpZGVudGl0eX0gZnJvbSAnLi9JZGVudGl0eSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXhQb29sKGFyZ3M6IHtcbiAgaW5wdXRzOiBNYXhQb29sSW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLFxuICBhdHRyczogTWF4UG9vbEF0dHJzXG59KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4fSA9IGlucHV0cztcbiAgYXNzZXJ0Tm90Q29tcGxleCh4LCAnbWF4UG9vbCcpO1xuICBjb25zdCB7ZmlsdGVyU2l6ZSwgc3RyaWRlcywgcGFkLCBkaW1Sb3VuZGluZ01vZGV9ID0gYXR0cnM7XG4gIGNvbnN0IGRpbGF0aW9ucyA9IDE7XG5cbiAgdXRpbC5hc3NlcnQoXG4gICAgICBiYWNrZW5kX3V0aWwuZWl0aGVyU3RyaWRlc09yRGlsYXRpb25zQXJlT25lKHN0cmlkZXMsIGRpbGF0aW9ucyksXG4gICAgICAoKSA9PiAnRXJyb3IgaW4gbWF4UG9vbDogRWl0aGVyIHN0cmlkZXMgb3IgZGlsYXRpb25zIG11c3QgYmUgMS4gJyArXG4gICAgICAgICAgYEdvdCBzdHJpZGVzICR7c3RyaWRlc30gYW5kIGRpbGF0aW9ucyAnJHtkaWxhdGlvbnN9J2ApO1xuXG4gIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVQb29sMkRJbmZvKFxuICAgICAgeC5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgZmlsdGVyU2l6ZSwgc3RyaWRlcyxcbiAgICAgIGRpbGF0aW9ucywgcGFkLCBkaW1Sb3VuZGluZ01vZGUpO1xuICBpZiAoY29udkluZm8uZmlsdGVyV2lkdGggPT09IDEgJiYgY29udkluZm8uZmlsdGVySGVpZ2h0ID09PSAxICYmXG4gICAgICB1dGlsLmFycmF5c0VxdWFsKGNvbnZJbmZvLmluU2hhcGUsIGNvbnZJbmZvLm91dFNoYXBlKSkge1xuICAgIHJldHVybiBpZGVudGl0eSh7aW5wdXRzOiB7eH0sIGJhY2tlbmR9KTtcbiAgfVxuICBjb25zdCBtYXhQb29sUHJvZ3JhbSA9IG5ldyBQb29sMkRQcm9ncmFtKGNvbnZJbmZvLCAnbWF4JywgZmFsc2UpO1xuICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0obWF4UG9vbFByb2dyYW0sIFt4XSwgeC5kdHlwZSk7XG59XG5cbmV4cG9ydCBjb25zdCBtYXhQb29sQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IE1heFBvb2wsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBtYXhQb29sIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBNYXhQb29sM0QsIE1heFBvb2wzREF0dHJzLCBNYXhQb29sM0RJbnB1dHMsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge1Bvb2wzRFByb2dyYW19IGZyb20gJy4uL3Bvb2xfZ3B1JztcblxuZXhwb3J0IGZ1bmN0aW9uIG1heFBvb2wzZChhcmdzOiB7XG4gIGlucHV0czogTWF4UG9vbDNESW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLFxuICBhdHRyczogTWF4UG9vbDNEQXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICBjb25zdCB7ZmlsdGVyU2l6ZSwgc3RyaWRlcywgcGFkLCBkYXRhRm9ybWF0LCBkaW1Sb3VuZGluZ01vZGV9ID0gYXR0cnM7XG4gIGNvbnN0IGRpbGF0aW9uczogW251bWJlciwgbnVtYmVyLCBudW1iZXJdID0gWzEsIDEsIDFdO1xuXG4gIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVQb29sM0RJbmZvKFxuICAgICAgeC5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLCBmaWx0ZXJTaXplLCBzdHJpZGVzLFxuICAgICAgZGlsYXRpb25zLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSwgZGF0YUZvcm1hdCk7XG4gIGNvbnN0IG1heFBvb2xQcm9ncmFtID0gbmV3IFBvb2wzRFByb2dyYW0oY29udkluZm8sICdtYXgnLCBmYWxzZSk7XG4gIHJldHVybiBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShtYXhQb29sUHJvZ3JhbSwgW3hdLCB4LmR0eXBlKTtcbn1cblxuZXhwb3J0IGNvbnN0IG1heFBvb2wzRENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBNYXhQb29sM0QsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBtYXhQb29sM2QgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7YmFja2VuZF91dGlsLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIE1heFBvb2wzREdyYWQsIE1heFBvb2wzREdyYWRBdHRycywgTWF4UG9vbDNER3JhZElucHV0cywgVGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7TWF4UG9vbDNEQmFja3Byb3BQcm9ncmFtfSBmcm9tICcuLi9tYXhfcG9vbF9iYWNrcHJvcF9ncHUnO1xuaW1wb3J0IHtQb29sM0RQcm9ncmFtfSBmcm9tICcuLi9wb29sX2dwdSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXhQb29sM0RHcmFkKGFyZ3M6IHtcbiAgaW5wdXRzOiBNYXhQb29sM0RHcmFkSW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLFxuICBhdHRyczogTWF4UG9vbDNER3JhZEF0dHJzXG59KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHtkeSwgaW5wdXR9ID0gaW5wdXRzO1xuICBjb25zdCB4ID0gaW5wdXQ7XG4gIGNvbnN0IHtmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWQsIGRpbVJvdW5kaW5nTW9kZX0gPSBhdHRycztcbiAgY29uc3QgZGlsYXRpb25zOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPSBbMSwgMSwgMV07XG5cbiAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZVBvb2wzREluZm8oXG4gICAgICB4LnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIGZpbHRlclNpemUsIHN0cmlkZXMsXG4gICAgICBkaWxhdGlvbnMsIHBhZCwgZGltUm91bmRpbmdNb2RlKTtcblxuICBjb25zdCBtYXhQb29sM2RQb3NpdGlvbnNQcm9ncmFtID1cbiAgICAgIG5ldyBQb29sM0RQcm9ncmFtKGNvbnZJbmZvLCAnbWF4JywgdHJ1ZSAvKiBnZXQgcG9zaXRpb25zICovKTtcbiAgY29uc3QgbWF4UG9vbDNkUG9zaXRpb25zID1cbiAgICAgIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKG1heFBvb2wzZFBvc2l0aW9uc1Byb2dyYW0sIFt4XSwgeC5kdHlwZSk7XG4gIGNvbnN0IG1heFBvb2xCYWNrcHJvcFByb2dyYW0gPSBuZXcgTWF4UG9vbDNEQmFja3Byb3BQcm9ncmFtKGNvbnZJbmZvKTtcbiAgY29uc3QgcmVzdWx0ID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0oXG4gICAgICBtYXhQb29sQmFja3Byb3BQcm9ncmFtLCBbZHksIG1heFBvb2wzZFBvc2l0aW9uc10sIHguZHR5cGUpO1xuICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKG1heFBvb2wzZFBvc2l0aW9ucyk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBjb25zdCBtYXhQb29sR3JhZDNEQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IE1heFBvb2wzREdyYWQsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBtYXhQb29sM0RHcmFkIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBNYXhQb29sR3JhZCwgTWF4UG9vbEdyYWRBdHRycywgTWF4UG9vbEdyYWRJbnB1dHMsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge01heFBvb2wyREJhY2twcm9wUHJvZ3JhbX0gZnJvbSAnLi4vbWF4X3Bvb2xfYmFja3Byb3BfZ3B1JztcbmltcG9ydCB7UG9vbDJEUHJvZ3JhbX0gZnJvbSAnLi4vcG9vbF9ncHUnO1xuaW1wb3J0IHthc3NlcnROb3RDb21wbGV4fSBmcm9tICcuLi93ZWJnbF91dGlsJztcblxuZXhwb3J0IGZ1bmN0aW9uIG1heFBvb2xHcmFkKGFyZ3M6IHtcbiAgaW5wdXRzOiBNYXhQb29sR3JhZElucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IE1heFBvb2xHcmFkQXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge2R5LCBpbnB1dCwgb3V0cHV0fSA9IGlucHV0cztcbiAgY29uc3QgeCA9IGlucHV0O1xuICBhc3NlcnROb3RDb21wbGV4KFtpbnB1dCwgb3V0cHV0XSwgJ21heFBvb2xHcmFkJyk7XG4gIGNvbnN0IHtmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWQsIGRpbVJvdW5kaW5nTW9kZX0gPSBhdHRycztcblxuICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlUG9vbDJESW5mbyhcbiAgICAgIHguc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIGZpbHRlclNpemUsIHN0cmlkZXMsXG4gICAgICAxIC8qIGRpbGF0aW9ucyAqLywgcGFkLCBkaW1Sb3VuZGluZ01vZGUpO1xuICBjb25zdCBnZXRQb3NpdGlvbnMgPSB0cnVlO1xuICBjb25zdCBtYXhQb29sUG9zaXRpb25zUHJvZ3JhbSA9XG4gICAgICBuZXcgUG9vbDJEUHJvZ3JhbShjb252SW5mbywgJ21heCcsIGdldFBvc2l0aW9ucyk7XG4gIGNvbnN0IG1heFBvb2xQb3NpdGlvbnM6IFRlbnNvckluZm8gPVxuICAgICAgYmFja2VuZC5ydW5XZWJHTFByb2dyYW0obWF4UG9vbFBvc2l0aW9uc1Byb2dyYW0sIFt4XSwgeC5kdHlwZSk7XG5cbiAgY29uc3QgbWF4UG9vbEJhY2tQcm9wUHJvZ3JhbSA9IG5ldyBNYXhQb29sMkRCYWNrcHJvcFByb2dyYW0oY29udkluZm8pO1xuICBjb25zdCByZXN1bHQgPSBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShcbiAgICAgIG1heFBvb2xCYWNrUHJvcFByb2dyYW0sIFtkeSwgbWF4UG9vbFBvc2l0aW9uc10sIHguZHR5cGUpO1xuICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKG1heFBvb2xQb3NpdGlvbnMpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgY29uc3QgbWF4UG9vbEdyYWRDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTWF4UG9vbEdyYWQsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBtYXhQb29sR3JhZCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge01heFBvb2xXaXRoQXJnbWF4LCBNYXhQb29sV2l0aEFyZ21heEF0dHJzLCBNYXhQb29sV2l0aEFyZ21heElucHV0c30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7YmFja2VuZF91dGlsLCBLZXJuZWxDb25maWcsIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5cbmltcG9ydCB7bWF4UG9vbFdpdGhBcmdtYXhJbXBsfSBmcm9tICcuL01heFBvb2xXaXRoQXJnbWF4X2ltcGwnO1xuXG5leHBvcnQgY29uc3QgbWF4UG9vbFdpdGhBcmdtYXhDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTWF4UG9vbFdpdGhBcmdtYXgsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiAoe2lucHV0cywgYXR0cnMsIGJhY2tlbmR9KSA9PiB7XG4gICAgY29uc3Qge3h9ID0gaW5wdXRzIGFzIE1heFBvb2xXaXRoQXJnbWF4SW5wdXRzO1xuICAgIGNvbnN0IHtmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWQsIGluY2x1ZGVCYXRjaEluSW5kZXh9ID1cbiAgICAgICAgYXR0cnMgYXMge30gYXMgTWF4UG9vbFdpdGhBcmdtYXhBdHRycztcbiAgICBjb25zdCB3ZWJnbEJhY2tlbmQgPSBiYWNrZW5kIGFzIE1hdGhCYWNrZW5kV2ViR0w7XG5cbiAgICB1dGlsLmFzc2VydChcbiAgICAgICAgeC5zaGFwZS5sZW5ndGggPT09IDQsXG4gICAgICAgICgpID0+IGBFcnJvciBpbiBtYXhQb29sOiBpbnB1dCBtdXN0IGJlIHJhbmsgNCBidXQgZ290IHJhbmsgJHtcbiAgICAgICAgICAgIHguc2hhcGUubGVuZ3RofS5gKTtcbiAgICBjb25zdCBkaWxhdGlvbnM6IFtudW1iZXIsIG51bWJlcl0gPSBbMSwgMV07XG4gICAgdXRpbC5hc3NlcnQoXG4gICAgICAgIGJhY2tlbmRfdXRpbC5laXRoZXJTdHJpZGVzT3JEaWxhdGlvbnNBcmVPbmUoc3RyaWRlcywgZGlsYXRpb25zKSxcbiAgICAgICAgKCkgPT4gJ0Vycm9yIGluIG1heFBvb2w6IEVpdGhlciBzdHJpZGVzIG9yIGRpbGF0aW9ucyBtdXN0IGJlIDEuICcgK1xuICAgICAgICAgICAgYEdvdCBzdHJpZGVzICR7c3RyaWRlc30gYW5kIGRpbGF0aW9ucyAnJHtkaWxhdGlvbnN9J2ApO1xuXG4gICAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZVBvb2wyREluZm8oXG4gICAgICAgIHguc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIGZpbHRlclNpemUsIHN0cmlkZXMsXG4gICAgICAgIGRpbGF0aW9ucywgcGFkKTtcblxuICAgIGNvbnN0IFtyZXN1bHQsIGluZGV4ZXNdID1cbiAgICAgICAgbWF4UG9vbFdpdGhBcmdtYXhJbXBsKHgsIGluY2x1ZGVCYXRjaEluSW5kZXgsIGNvbnZJbmZvLCB3ZWJnbEJhY2tlbmQpO1xuICAgIHJldHVybiBbcmVzdWx0LCBpbmRleGVzXTtcbiAgfVxufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge1Bvb2wyRFByb2dyYW19IGZyb20gJy4uL3Bvb2xfZ3B1JztcblxuZXhwb3J0IGZ1bmN0aW9uIG1heFBvb2xXaXRoQXJnbWF4SW1wbChcbiAgICB4OiBUZW5zb3JJbmZvLCBpbmNsdWRlQmF0Y2hJbkluZGV4OiBib29sZWFuLFxuICAgIGNvbnZJbmZvOiBiYWNrZW5kX3V0aWwuQ29udjJESW5mbyxcbiAgICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMKTogVGVuc29ySW5mb1tdIHtcbiAgbGV0IHByb2dyYW0gPSBuZXcgUG9vbDJEUHJvZ3JhbShjb252SW5mbywgJ21heCcsIGZhbHNlKTtcbiAgY29uc3QgcG9vbE91dHB1dCA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFt4XSwgJ2Zsb2F0MzInKTtcblxuICBwcm9ncmFtID0gbmV3IFBvb2wyRFByb2dyYW0oY29udkluZm8sICdtYXgnLCB0cnVlLCB0cnVlLCBpbmNsdWRlQmF0Y2hJbkluZGV4KTtcbiAgY29uc3QgaW5kZXhPdXRwdXQgPSBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbeF0sICdmbG9hdDMyJyk7XG4gIHJldHVybiBbcG9vbE91dHB1dCwgaW5kZXhPdXRwdXRdO1xufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1RlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge3JlZHVjZX0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3JlZHVjZSc7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4uL2tlcm5lbHMvUmVzaGFwZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXhJbXBsKFxuICAgIHg6IFRlbnNvckluZm8sIHJlZHVjZVNoYXBlOiBudW1iZXJbXSwgb3V0U2hhcGU6IG51bWJlcltdLFxuICAgIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wpOiBUZW5zb3JJbmZvIHtcbiAgY29uc3QgaW5TaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHJlZHVjZVNoYXBlKTtcbiAgY29uc3QgeFNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoeC5zaGFwZSk7XG4gIGNvbnN0IGJhdGNoU2l6ZSA9IHhTaXplIC8gaW5TaXplO1xuICBjb25zdCByZXNoYXBlZElucHV0ID1cbiAgICAgIHJlc2hhcGUoe2lucHV0czoge3h9LCBhdHRyczoge3NoYXBlOiBbYmF0Y2hTaXplLCBpblNpemVdfSwgYmFja2VuZH0pO1xuXG4gIGNvbnN0IHJlZHVjZWQgPSByZWR1Y2UocmVzaGFwZWRJbnB1dCwgeC5kdHlwZSwgJ21heCcsIGJhY2tlbmQpO1xuICBjb25zdCByZXNoYXBlZE91dHB1dCA9XG4gICAgICByZXNoYXBlKHtpbnB1dHM6IHt4OiByZWR1Y2VkfSwgYXR0cnM6IHtzaGFwZTogb3V0U2hhcGV9LCBiYWNrZW5kfSk7XG5cbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZXNoYXBlZElucHV0KTtcbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZWR1Y2VkKTtcblxuICByZXR1cm4gcmVzaGFwZWRPdXRwdXQ7XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBNYXhpbXVtfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge0NIRUNLX05BTl9TTklQUEVUfSBmcm9tICcuLi9iaW5hcnlvcF9ncHUnO1xuaW1wb3J0IHtDSEVDS19OQU5fU05JUFBFVCBhcyBDSEVDS19OQU5fU05JUFBFVF9QQUNLRUR9IGZyb20gJy4uL2JpbmFyeW9wX3BhY2tlZF9ncHUnO1xuaW1wb3J0IHtiaW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7bWF4aW11bUltcGxDUFV9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuXG5jb25zdCBNQVhJTVVNID0gQ0hFQ0tfTkFOX1NOSVBQRVQgKyBgXG4gIHJldHVybiBtYXgoYSwgYik7XG5gO1xuXG5jb25zdCBNQVhJTVVNX1BBQ0tFRCA9IGBcbiAgdmVjNCByZXN1bHQgPSB2ZWM0KG1heChhLCBiKSk7XG4gIHZlYzQgaXNOYU4gPSBtaW4odmVjNChpc25hbihhKSkgKyB2ZWM0KGlzbmFuKGIpKSwgdmVjNCgxLjApKTtcbiAgYCArXG4gICAgQ0hFQ0tfTkFOX1NOSVBQRVRfUEFDS0VEICsgYFxuICByZXR1cm4gcmVzdWx0O1xuYDtcblxuZXhwb3J0IGNvbnN0IG1heGltdW0gPSBiaW5hcnlLZXJuZWxGdW5jKHtcbiAgb3BTbmlwcGV0OiBNQVhJTVVNLFxuICBwYWNrZWRPcFNuaXBwZXQ6IE1BWElNVU1fUEFDS0VELFxuICBjcHVLZXJuZWxJbXBsOiBtYXhpbXVtSW1wbENQVVxufSk7XG5cbmV4cG9ydCBjb25zdCBtYXhpbXVtQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IE1heGltdW0sXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBtYXhpbXVtIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBLZXJuZWxDb25maWcsIE1lYW4sIE1lYW5BdHRycywgTWVhbklucHV0cywgVGVuc29ySW5mbywgVHlwZWRBcnJheSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcblxuaW1wb3J0IHttZWFuSW1wbH0gZnJvbSAnLi9NZWFuX2ltcGwnO1xuaW1wb3J0IHt0cmFuc3Bvc2VJbXBsLCB0cmFuc3Bvc2VJbXBsQ1BVfSBmcm9tICcuL1RyYW5zcG9zZV9pbXBsJztcblxuZXhwb3J0IGNvbnN0IG1lYW5Db25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTWVhbixcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6ICh7aW5wdXRzLCBhdHRycywgYmFja2VuZH0pID0+IHtcbiAgICBjb25zdCB7eH0gPSBpbnB1dHMgYXMgTWVhbklucHV0cztcbiAgICBjb25zdCB7a2VlcERpbXMsIGF4aXN9ID0gYXR0cnMgYXMge30gYXMgTWVhbkF0dHJzO1xuICAgIGNvbnN0IHdlYmdsQmFja2VuZCA9IGJhY2tlbmQgYXMgTWF0aEJhY2tlbmRXZWJHTDtcblxuICAgIGNvbnN0IHhSYW5rID0geC5zaGFwZS5sZW5ndGg7XG4gICAgY29uc3Qgb3JpZ0F4ZXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKGF4aXMsIHguc2hhcGUpO1xuXG4gICAgbGV0IGF4ZXMgPSBvcmlnQXhlcztcbiAgICBjb25zdCBwZXJtdXRlZEF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0QXhlc1Blcm11dGF0aW9uKGF4ZXMsIHhSYW5rKTtcbiAgICBjb25zdCBtZWFuSW5wdXRJc1RyYW5zcG9zZWQgPSBwZXJtdXRlZEF4ZXMgIT0gbnVsbDtcbiAgICBjb25zdCBzaG91bGRFeGVjdXRlT25DUFUgPSB3ZWJnbEJhY2tlbmQuc2hvdWxkRXhlY3V0ZU9uQ1BVKFt4XSk7XG5cbiAgICBjb25zdCBpbnRlcm1lZGlhdGVzOiBUZW5zb3JJbmZvW10gPSBbXTtcblxuICAgIGxldCBtZWFuSW5wdXQgPSB4O1xuICAgIGlmIChtZWFuSW5wdXRJc1RyYW5zcG9zZWQpIHtcbiAgICAgIGlmIChzaG91bGRFeGVjdXRlT25DUFUpIHtcbiAgICAgICAgY29uc3QgeFRleERhdGEgPSB3ZWJnbEJhY2tlbmQudGV4RGF0YS5nZXQobWVhbklucHV0LmRhdGFJZCk7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IHhUZXhEYXRhLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuXG4gICAgICAgIGNvbnN0IG5ld1NoYXBlOiBudW1iZXJbXSA9IG5ldyBBcnJheSh4UmFuayk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3U2hhcGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBuZXdTaGFwZVtpXSA9IHguc2hhcGVbcGVybXV0ZWRBeGVzW2ldXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtZWFuSW5wdXRWYWx1ZXMgPVxuICAgICAgICAgICAgdHJhbnNwb3NlSW1wbENQVSh2YWx1ZXMsIHguc2hhcGUsIHguZHR5cGUsIHBlcm11dGVkQXhlcywgbmV3U2hhcGUpO1xuXG4gICAgICAgIG1lYW5JbnB1dCA9IHdlYmdsQmFja2VuZC5tYWtlVGVuc29ySW5mbyhuZXdTaGFwZSwgeC5kdHlwZSk7XG4gICAgICAgIGNvbnN0IG1lYW5JbnB1dERhdGEgPSB3ZWJnbEJhY2tlbmQudGV4RGF0YS5nZXQobWVhbklucHV0LmRhdGFJZCk7XG4gICAgICAgIG1lYW5JbnB1dERhdGEudmFsdWVzID0gbWVhbklucHV0VmFsdWVzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWVhbklucHV0ID0gdHJhbnNwb3NlSW1wbCh4LCBwZXJtdXRlZEF4ZXMsIHdlYmdsQmFja2VuZCk7XG4gICAgICB9XG5cbiAgICAgIGludGVybWVkaWF0ZXMucHVzaChtZWFuSW5wdXQpO1xuICAgICAgYXhlcyA9IGJhY2tlbmRfdXRpbC5nZXRJbm5lck1vc3RBeGVzKGF4ZXMubGVuZ3RoLCB4UmFuayk7XG4gICAgfVxuXG4gICAgYmFja2VuZF91dGlsLmFzc2VydEF4ZXNBcmVJbm5lck1vc3REaW1zKCdzdW0nLCBheGVzLCB4UmFuayk7XG4gICAgY29uc3QgW21lYW5PdXRTaGFwZSwgcmVkdWNlU2hhcGVdID1cbiAgICAgICAgYmFja2VuZF91dGlsLmNvbXB1dGVPdXRBbmRSZWR1Y2VTaGFwZXMobWVhbklucHV0LnNoYXBlLCBheGVzKTtcblxuICAgIGxldCBvdXRTaGFwZSA9IG1lYW5PdXRTaGFwZTtcbiAgICBpZiAoa2VlcERpbXMpIHtcbiAgICAgIC8vIHJhdGhlciB0aGFuIHJlc2hhcGUgYXQgdGhlIGVuZCwgc2V0IHRoZSB0YXJnZXQgc2hhcGUgaGVyZS5cbiAgICAgIG91dFNoYXBlID0gYmFja2VuZF91dGlsLmV4cGFuZFNoYXBlVG9LZWVwRGltKG1lYW5PdXRTaGFwZSwgb3JpZ0F4ZXMpO1xuICAgIH1cblxuICAgIGNvbnN0IG91dCA9IG1lYW5JbXBsKG1lYW5JbnB1dCwgcmVkdWNlU2hhcGUsIG91dFNoYXBlLCB3ZWJnbEJhY2tlbmQpO1xuICAgIGZvciAoY29uc3QgaSBvZiBpbnRlcm1lZGlhdGVzKSB7XG4gICAgICB3ZWJnbEJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oaSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dDtcbiAgfVxufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtUZW5zb3JJbmZvLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtyZWR1Y2V9IGZyb20gJy4uL2tlcm5lbF91dGlscy9yZWR1Y2UnO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuLi9rZXJuZWxzL1Jlc2hhcGUnO1xuXG5leHBvcnQgZnVuY3Rpb24gbWVhbkltcGwoXG4gICAgeDogVGVuc29ySW5mbywgcmVkdWNlU2hhcGU6IG51bWJlcltdLCBvdXRTaGFwZTogbnVtYmVyW10sXG4gICAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCk6IFRlbnNvckluZm8ge1xuICBjb25zdCBpblNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUocmVkdWNlU2hhcGUpO1xuICBjb25zdCB4U2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZSh4LnNoYXBlKTtcbiAgY29uc3QgYmF0Y2hTaXplID0geFNpemUgLyBpblNpemU7XG4gIGNvbnN0IHJlc2hhcGVkSW5wdXQgPVxuICAgICAgcmVzaGFwZSh7aW5wdXRzOiB7eH0sIGF0dHJzOiB7c2hhcGU6IFtiYXRjaFNpemUsIGluU2l6ZV19LCBiYWNrZW5kfSk7XG5cbiAgY29uc3QgcmVkdWNlZCA9IHJlZHVjZShyZXNoYXBlZElucHV0LCAnZmxvYXQzMicsICdtZWFuJywgYmFja2VuZCk7XG4gIGNvbnN0IHJlc2hhcGVkT3V0cHV0ID1cbiAgICAgIHJlc2hhcGUoe2lucHV0czoge3g6IHJlZHVjZWR9LCBhdHRyczoge3NoYXBlOiBvdXRTaGFwZX0sIGJhY2tlbmR9KTtcblxuICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlc2hhcGVkSW5wdXQpO1xuICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlZHVjZWQpO1xuXG4gIHJldHVybiByZXNoYXBlZE91dHB1dDtcbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgTWluLCBNaW5BdHRycywgTWluSW5wdXRzLCBUZW5zb3JJbmZvLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtyZWR1Y2V9IGZyb20gJy4uL2tlcm5lbF91dGlscy9yZWR1Y2UnO1xuXG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4vUmVzaGFwZSc7XG5pbXBvcnQge3RyYW5zcG9zZX0gZnJvbSAnLi9UcmFuc3Bvc2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gbWluKFxuICAgIGFyZ3M6IHtpbnB1dHM6IE1pbklucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCwgYXR0cnM6IE1pbkF0dHJzfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4fSA9IGlucHV0cztcbiAgY29uc3Qge2F4aXMsIGtlZXBEaW1zfSA9IGF0dHJzO1xuXG4gIGNvbnN0IHhSYW5rID0geC5zaGFwZS5sZW5ndGg7XG5cbiAgY29uc3Qgb3JpZ0F4ZXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKGF4aXMsIHguc2hhcGUpO1xuICBsZXQgYXhlcyA9IG9yaWdBeGVzO1xuICBjb25zdCBwZXJtdXRlZEF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0QXhlc1Blcm11dGF0aW9uKGF4ZXMsIHhSYW5rKTtcbiAgbGV0IHBlcm11dGVkWCA9IHg7XG4gIGlmIChwZXJtdXRlZEF4ZXMgIT0gbnVsbCkge1xuICAgIHBlcm11dGVkWCA9IHRyYW5zcG9zZSh7aW5wdXRzOiB7eH0sIGJhY2tlbmQsIGF0dHJzOiB7cGVybTogcGVybXV0ZWRBeGVzfX0pO1xuICAgIGF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0SW5uZXJNb3N0QXhlcyhheGVzLmxlbmd0aCwgeC5zaGFwZS5sZW5ndGgpO1xuICB9XG5cbiAgYmFja2VuZF91dGlsLmFzc2VydEF4ZXNBcmVJbm5lck1vc3REaW1zKCdtaW4nLCBheGVzLCB4UmFuayk7XG4gIGNvbnN0IFtvdXRTaGFwZSwgcmVkdWNlU2hhcGVdID1cbiAgICAgIGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0QW5kUmVkdWNlU2hhcGVzKHBlcm11dGVkWC5zaGFwZSwgYXhlcyk7XG4gIGNvbnN0IGluU2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShyZWR1Y2VTaGFwZSk7XG4gIGNvbnN0IGEyRCA9XG4gICAgICByZXNoYXBlKHtpbnB1dHM6IHt4OiBwZXJtdXRlZFh9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBbLTEsIGluU2l6ZV19fSk7XG4gIGNvbnN0IHJlZHVjZWQgPSByZWR1Y2UoYTJELCBhMkQuZHR5cGUsICdtaW4nLCBiYWNrZW5kKTtcblxuICBsZXQgcmVzO1xuICBpZiAoa2VlcERpbXMpIHtcbiAgICBjb25zdCBuZXdTaGFwZSA9IGJhY2tlbmRfdXRpbC5leHBhbmRTaGFwZVRvS2VlcERpbShvdXRTaGFwZSwgb3JpZ0F4ZXMpO1xuICAgIHJlcyA9IHJlc2hhcGUoe2lucHV0czoge3g6IHJlZHVjZWR9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBuZXdTaGFwZX19KTtcbiAgfSBlbHNlIHtcbiAgICByZXMgPSByZXNoYXBlKHtpbnB1dHM6IHt4OiByZWR1Y2VkfSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogb3V0U2hhcGV9fSk7XG4gIH1cblxuICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGEyRCk7XG4gIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVkdWNlZCk7XG5cbiAgaWYgKHBlcm11dGVkQXhlcyAhPSBudWxsKSB7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhwZXJtdXRlZFgpO1xuICB9XG5cbiAgcmV0dXJuIHJlcztcbn1cblxuZXhwb3J0IGNvbnN0IG1pbkNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBNaW4sXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBtaW4gYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIE1pbmltdW19IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7Q0hFQ0tfTkFOX1NOSVBQRVR9IGZyb20gJy4uL2JpbmFyeW9wX2dwdSc7XG5pbXBvcnQge0NIRUNLX05BTl9TTklQUEVUIGFzIENIRUNLX05BTl9TTklQUEVUX1BBQ0tFRH0gZnJvbSAnLi4vYmluYXJ5b3BfcGFja2VkX2dwdSc7XG5pbXBvcnQge2JpbmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuaW1wb3J0IHttaW5pbXVtSW1wbENQVX0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5cbmNvbnN0IE1JTklNVU0gPSBDSEVDS19OQU5fU05JUFBFVCArIGBcbiAgcmV0dXJuIG1pbihhLCBiKTtcbmA7XG5cbmNvbnN0IE1JTklNVU1fUEFDS0VEID0gYFxuICB2ZWM0IHJlc3VsdCA9IHZlYzQobWluKGEsIGIpKTtcbiAgdmVjNCBpc05hTiA9IG1pbih2ZWM0KGlzbmFuKGEpKSArIHZlYzQoaXNuYW4oYikpLCB2ZWM0KDEuMCkpO1xuICBgICtcbiAgICBDSEVDS19OQU5fU05JUFBFVF9QQUNLRUQgKyBgXG4gIHJldHVybiByZXN1bHQ7XG5gO1xuXG5leHBvcnQgY29uc3QgbWluaW11bSA9IGJpbmFyeUtlcm5lbEZ1bmMoe1xuICBvcFNuaXBwZXQ6IE1JTklNVU0sXG4gIHBhY2tlZE9wU25pcHBldDogTUlOSU1VTV9QQUNLRUQsXG4gIGNwdUtlcm5lbEltcGw6IG1pbmltdW1JbXBsQ1BVXG59KTtcblxuZXhwb3J0IGNvbnN0IG1pbmltdW1Db25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTWluaW11bSxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IG1pbmltdW0gYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtlbnYsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgTWlycm9yUGFkLCBNaXJyb3JQYWRBdHRycywgTWlycm9yUGFkSW5wdXRzLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtNaXJyb3JQYWRQcm9ncmFtfSBmcm9tICcuLi9taXJyb3JfcGFkX2dwdSc7XG5pbXBvcnQge01pcnJvclBhZFBhY2tlZFByb2dyYW19IGZyb20gJy4uL21pcnJvcl9wYWRfcGFja2VkX2dwdSc7XG5cbmV4cG9ydCBjb25zdCBtaXJyb3JQYWRLZXJuZWxGdW5jOiAocGFyYW1zOiB7XG4gIGlucHV0czogTWlycm9yUGFkSW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLFxuICBhdHRyczogTWlycm9yUGFkQXR0cnNcbn0pID0+IFRlbnNvckluZm8gPSAoe2lucHV0cywgYmFja2VuZCwgYXR0cnN9KSA9PiB7XG4gIGNvbnN0IHt4fSA9IGlucHV0cztcbiAgY29uc3Qge3BhZGRpbmdzLCBtb2RlfSA9IGF0dHJzO1xuXG4gIGNvbnN0IHByb2dyYW0gPSBlbnYoKS5nZXRCb29sKCdXRUJHTF9QQUNLX0FSUkFZX09QRVJBVElPTlMnKSA/XG4gICAgICBuZXcgTWlycm9yUGFkUGFja2VkUHJvZ3JhbSh4LnNoYXBlLCBwYWRkaW5ncywgbW9kZSkgOlxuICAgICAgbmV3IE1pcnJvclBhZFByb2dyYW0oeC5zaGFwZSwgcGFkZGluZ3MsIG1vZGUpO1xuXG4gIGNvbnN0IG91dHB1dCA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFt4XSwgeC5kdHlwZSk7XG5cbiAgcmV0dXJuIG91dHB1dDtcbn07XG5cbmV4cG9ydCBjb25zdCBtaXJyb3JQYWRDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTWlycm9yUGFkLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogbWlycm9yUGFkS2VybmVsRnVuYyBhcyB7fSBhcyBLZXJuZWxGdW5jLFxufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIE1vZH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtDSEVDS19OQU5fU05JUFBFVH0gZnJvbSAnLi4vYmluYXJ5b3BfcGFja2VkX2dwdSc7XG5pbXBvcnQge2JpbmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuXG5jb25zdCBNT0QgPSBgaWYgKGIgPT0gMC4wKSByZXR1cm4gTkFOO1xuICByZXR1cm4gbW9kKGEsIGIpO2A7XG5cbmNvbnN0IE1PRF9QQUNLRUQgPSBgXG4gIHZlYzQgcmVzdWx0ID0gbW9kKGEsIGIpO1xuICB2ZWM0IGlzTmFOID0gdmVjNChlcXVhbChiLCB2ZWM0KDAuMCkpKTtcbiAgYCArXG4gICAgQ0hFQ0tfTkFOX1NOSVBQRVQgKyBgXG4gIHJldHVybiByZXN1bHQ7XG5gO1xuXG5leHBvcnQgY29uc3QgbW9kID0gYmluYXJ5S2VybmVsRnVuYyh7XG4gIG9wU25pcHBldDogTU9ELFxuICBwYWNrZWRPcFNuaXBwZXQ6IE1PRF9QQUNLRUQsXG59KTtcblxuZXhwb3J0IGNvbnN0IG1vZENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBNb2QsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBtb2QgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIE11bHRpbm9taWFsLCBNdWx0aW5vbWlhbEF0dHJzLCBNdWx0aW5vbWlhbElucHV0cywgVGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7TXVsdGlub21pYWxQcm9ncmFtfSBmcm9tICcuLi9tdWx0aW5vbWlhbF9ncHUnO1xuXG5pbXBvcnQge3NvZnRtYXh9IGZyb20gJy4vU29mdG1heCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aW5vbWlhbChhcmdzOiB7XG4gIGlucHV0czogTXVsdGlub21pYWxJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsXG4gIGF0dHJzOiBNdWx0aW5vbWlhbEF0dHJzXG59KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHtsb2dpdHN9ID0gaW5wdXRzO1xuICBjb25zdCB7bnVtU2FtcGxlcywgc2VlZCwgbm9ybWFsaXplZH0gPSBhdHRycztcblxuICBjb25zdCBwcm9icyA9IG5vcm1hbGl6ZWQgP1xuICAgICAgbG9naXRzIDpcbiAgICAgIHNvZnRtYXgoXG4gICAgICAgICAge2lucHV0czoge2xvZ2l0c30sIGJhY2tlbmQsIGF0dHJzOiB7ZGltOiBsb2dpdHMuc2hhcGUubGVuZ3RoIC0gMX19KTtcbiAgY29uc3QgYmF0Y2hTaXplID0gcHJvYnMuc2hhcGVbMF07XG4gIGNvbnN0IG51bU91dGNvbWVzID0gcHJvYnMuc2hhcGVbMV07XG4gIGNvbnN0IHByb2dyYW0gPSBuZXcgTXVsdGlub21pYWxQcm9ncmFtKGJhdGNoU2l6ZSwgbnVtT3V0Y29tZXMsIG51bVNhbXBsZXMpO1xuICBjb25zdCBjdXN0b21WYWx1ZXMgPSBbW3NlZWRdXTtcbiAgY29uc3QgcmVzID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3Byb2JzXSwgJ2ludDMyJywgY3VzdG9tVmFsdWVzKTtcbiAgaWYgKCFub3JtYWxpemVkKSB7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhwcm9icyk7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cblxuZXhwb3J0IGNvbnN0IG11bHRpbm9taWFsQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IE11bHRpbm9taWFsLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogbXVsdGlub21pYWwgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIEJpbmFyeUlucHV0cywgZW52LCBLZXJuZWxDb25maWcsIE11bHRpcGx5LCBUZW5zb3JJbmZvLCBUeXBlZEFycmF5fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0ICogYXMgYmluYXJ5b3BfY29tcGxleF9ncHUgZnJvbSAnLi4vYmluYXJ5b3BfY29tcGxleF9ncHUnO1xuaW1wb3J0IHtCaW5hcnlPcENvbXBsZXhQcm9ncmFtfSBmcm9tICcuLi9iaW5hcnlvcF9jb21wbGV4X2dwdSc7XG5pbXBvcnQge0JpbmFyeU9wUHJvZ3JhbX0gZnJvbSAnLi4vYmluYXJ5b3BfZ3B1JztcbmltcG9ydCB7QmluYXJ5T3BQYWNrZWRQcm9ncmFtfSBmcm9tICcuLi9iaW5hcnlvcF9wYWNrZWRfZ3B1JztcbmltcG9ydCB7bXVsdGlwbHlJbXBsQ1BVIGFzIGNwdU11bHRpcGx5fSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcblxuaW1wb3J0IHtjb21wbGV4fSBmcm9tICcuL0NvbXBsZXgnO1xuXG5jb25zdCBNVUwgPSAncmV0dXJuIGEgKiBiOyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseShcbiAgICBhcmdzOiB7aW5wdXRzOiBCaW5hcnlJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0x9KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmR9ID0gYXJncztcbiAgY29uc3Qge2EsIGJ9ID0gaW5wdXRzO1xuICBjb25zdCBkdHlwZSA9IGJhY2tlbmRfdXRpbC51cGNhc3RUeXBlKGEuZHR5cGUsIGIuZHR5cGUpO1xuXG4gIGlmIChhLmR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgIGNvbnN0IGFEYXRhID0gYmFja2VuZC50ZXhEYXRhLmdldChhLmRhdGFJZCk7XG4gICAgY29uc3QgYkRhdGEgPSBiYWNrZW5kLnRleERhdGEuZ2V0KGIuZGF0YUlkKTtcblxuICAgIGNvbnN0IHJlYWxQcm9ncmFtID0gbmV3IEJpbmFyeU9wQ29tcGxleFByb2dyYW0oXG4gICAgICAgIGJpbmFyeW9wX2NvbXBsZXhfZ3B1LkNPTVBMRVhfTVVMVElQTFkuUkVBTCwgYS5zaGFwZSwgYi5zaGFwZSk7XG4gICAgY29uc3QgaW1hZ1Byb2dyYW0gPSBuZXcgQmluYXJ5T3BDb21wbGV4UHJvZ3JhbShcbiAgICAgICAgYmluYXJ5b3BfY29tcGxleF9ncHUuQ09NUExFWF9NVUxUSVBMWS5JTUFHLCBhLnNoYXBlLCBiLnNoYXBlKTtcblxuICAgIGNvbnN0IGlucHV0cyA9IFtcbiAgICAgIHtcbiAgICAgICAgZGF0YUlkOiBhRGF0YS5jb21wbGV4VGVuc29ySW5mb3MucmVhbC5kYXRhSWQsXG4gICAgICAgIGR0eXBlOiBhRGF0YS5jb21wbGV4VGVuc29ySW5mb3MucmVhbC5kdHlwZSxcbiAgICAgICAgc2hhcGU6IGEuc2hhcGVcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGRhdGFJZDogYURhdGEuY29tcGxleFRlbnNvckluZm9zLmltYWcuZGF0YUlkLFxuICAgICAgICBkdHlwZTogYURhdGEuY29tcGxleFRlbnNvckluZm9zLmltYWcuZHR5cGUsXG4gICAgICAgIHNoYXBlOiBhLnNoYXBlXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBkYXRhSWQ6IGJEYXRhLmNvbXBsZXhUZW5zb3JJbmZvcy5yZWFsLmRhdGFJZCxcbiAgICAgICAgZHR5cGU6IGJEYXRhLmNvbXBsZXhUZW5zb3JJbmZvcy5yZWFsLmR0eXBlLFxuICAgICAgICBzaGFwZTogYi5zaGFwZVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgZGF0YUlkOiBiRGF0YS5jb21wbGV4VGVuc29ySW5mb3MuaW1hZy5kYXRhSWQsXG4gICAgICAgIGR0eXBlOiBiRGF0YS5jb21wbGV4VGVuc29ySW5mb3MuaW1hZy5kdHlwZSxcbiAgICAgICAgc2hhcGU6IGIuc2hhcGVcbiAgICAgIH1cbiAgICBdO1xuXG4gICAgY29uc3QgcmVhbFBhcnQgPSBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShyZWFsUHJvZ3JhbSwgaW5wdXRzLCAnZmxvYXQzMicpO1xuICAgIGNvbnN0IGltYWdQYXJ0ID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0oaW1hZ1Byb2dyYW0sIGlucHV0cywgJ2Zsb2F0MzInKTtcblxuICAgIGNvbnN0IGNvbXBsZXhPdXRwdXQgPVxuICAgICAgICBjb21wbGV4KHtpbnB1dHM6IHtyZWFsOiByZWFsUGFydCwgaW1hZzogaW1hZ1BhcnR9LCBiYWNrZW5kfSk7XG5cbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlYWxQYXJ0KTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGltYWdQYXJ0KTtcblxuICAgIC8vIFRPRE8oYW5ueGluZ3l1YW4pOiBDUFUgZm9yd2FyZGluZyBmb3IgY29tcGxleCBpbnB1dHMuXG4gICAgcmV0dXJuIGNvbXBsZXhPdXRwdXQ7XG4gIH1cblxuICBpZiAoYmFja2VuZC5zaG91bGRFeGVjdXRlT25DUFUoW2EsIGJdKSkge1xuICAgIGNvbnN0IGFEYXRhID0gYmFja2VuZC50ZXhEYXRhLmdldChhLmRhdGFJZCk7XG4gICAgY29uc3QgYkRhdGEgPSBiYWNrZW5kLnRleERhdGEuZ2V0KGIuZGF0YUlkKTtcbiAgICBjb25zdCBbb3V0VmFsdWVzLCBvdXRTaGFwZV0gPSBjcHVNdWx0aXBseShcbiAgICAgICAgYS5zaGFwZSwgYi5zaGFwZSwgYURhdGEudmFsdWVzIGFzIFR5cGVkQXJyYXksXG4gICAgICAgIGJEYXRhLnZhbHVlcyBhcyBUeXBlZEFycmF5LCBkdHlwZSk7XG5cbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dFNoYXBlLCBkdHlwZSk7XG4gICAgY29uc3Qgb3V0RGF0YSA9IGJhY2tlbmQudGV4RGF0YS5nZXQob3V0LmRhdGFJZCk7XG4gICAgb3V0RGF0YS52YWx1ZXMgPSBvdXRWYWx1ZXM7XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIGxldCBwcm9ncmFtOiBCaW5hcnlPcFByb2dyYW18QmluYXJ5T3BQYWNrZWRQcm9ncmFtO1xuICBpZiAoZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUEFDS19CSU5BUllfT1BFUkFUSU9OUycpKSB7XG4gICAgcHJvZ3JhbSA9IG5ldyBCaW5hcnlPcFBhY2tlZFByb2dyYW0oTVVMLCBhLnNoYXBlLCBiLnNoYXBlKTtcbiAgfSBlbHNlIHtcbiAgICBwcm9ncmFtID0gbmV3IEJpbmFyeU9wUHJvZ3JhbShNVUwsIGEuc2hhcGUsIGIuc2hhcGUpO1xuICB9XG5cbiAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFthLCBiXSwgZHR5cGUpO1xufVxuXG5leHBvcnQgY29uc3QgbXVsdGlwbHlDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTXVsdGlwbHksXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBtdWx0aXBseVxufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtlbnYsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgTmVnLCBOZWdJbnB1dHMsIFRlbnNvckluZm8sIFR5cGVkQXJyYXl9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtuZWdJbXBsQ1BVfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcbmltcG9ydCB7VW5hcnlPcFByb2dyYW19IGZyb20gJy4uL3VuYXJ5b3BfZ3B1JztcbmltcG9ydCB7VW5hcnlPcFBhY2tlZFByb2dyYW19IGZyb20gJy4uL3VuYXJ5b3BfcGFja2VkX2dwdSc7XG5cbmNvbnN0IE5FRyA9IGByZXR1cm4gLXg7YDtcblxuLy8gVGhpcyBkb2Vzbid0IHVzZSB1bmFyeUtlcm5lbEZ1bmMgYmVjYXVzZSBuZWdJbXBsQ1BVIGlzIG5vdCBvZiB0eXBlXG4vLyBTaW1wbGVVbmFyeUtlcm5lbEltcGxDUFUuXG5leHBvcnQgZnVuY3Rpb24gbmVnKGFyZ3M6IHtpbnB1dHM6IE5lZ0lucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTH0pOlxuICAgIFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kfSA9IGFyZ3M7XG4gIGNvbnN0IHt4fSA9IGlucHV0cztcblxuICBpZiAoYmFja2VuZC5zaG91bGRFeGVjdXRlT25DUFUoW3hdKSkge1xuICAgIGNvbnN0IHhEYXRhID0gYmFja2VuZC50ZXhEYXRhLmdldCh4LmRhdGFJZCk7XG4gICAgY29uc3QgW291dFZhbHVlcywgbmV3U2hhcGVdID1cbiAgICAgICAgbmVnSW1wbENQVSh4RGF0YS52YWx1ZXMgYXMgVHlwZWRBcnJheSwgeC5zaGFwZSwgeC5kdHlwZSk7XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8obmV3U2hhcGUsIHguZHR5cGUsIG91dFZhbHVlcyk7XG4gIH1cblxuICBsZXQgcHJvZ3JhbTogVW5hcnlPcFByb2dyYW18VW5hcnlPcFBhY2tlZFByb2dyYW07XG4gIGlmIChlbnYoKS5nZXRCb29sKCdXRUJHTF9QQUNLX1VOQVJZX09QRVJBVElPTlMnKSkge1xuICAgIHByb2dyYW0gPSBuZXcgVW5hcnlPcFBhY2tlZFByb2dyYW0oeC5zaGFwZSwgTkVHKTtcbiAgfSBlbHNlIHtcbiAgICBwcm9ncmFtID0gbmV3IFVuYXJ5T3BQcm9ncmFtKHguc2hhcGUsIE5FRyk7XG4gIH1cblxuICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3hdLCB4LmR0eXBlKTtcbn1cblxuZXhwb3J0IGNvbnN0IG5lZ0NvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBOZWcsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBuZWcgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIGtlcm5lbF9pbXBscywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBOb25NYXhTdXBwcmVzc2lvblYzLCBOb25NYXhTdXBwcmVzc2lvblYzQXR0cnMsIE5vbk1heFN1cHByZXNzaW9uVjNJbnB1dHMsIFR5cGVkQXJyYXl9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmNvbnN0IG5vbk1heFN1cHByZXNzaW9uVjNJbXBsID0ga2VybmVsX2ltcGxzLm5vbk1heFN1cHByZXNzaW9uVjNJbXBsO1xuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcblxuZXhwb3J0IGZ1bmN0aW9uIG5vbk1heFN1cHByZXNzaW9uVjMoYXJnczoge1xuICBpbnB1dHM6IE5vbk1heFN1cHByZXNzaW9uVjNJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsXG4gIGF0dHJzOiBOb25NYXhTdXBwcmVzc2lvblYzQXR0cnNcbn0pIHtcbiAgYmFja2VuZF91dGlsLndhcm4oXG4gICAgICAndGYubm9uTWF4U3VwcHJlc3Npb24oKSBpbiB3ZWJnbCBsb2NrcyB0aGUgVUkgdGhyZWFkLiAnICtcbiAgICAgICdDYWxsIHRmLm5vbk1heFN1cHByZXNzaW9uQXN5bmMoKSBpbnN0ZWFkJyk7XG5cbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge2JveGVzLCBzY29yZXN9ID0gaW5wdXRzO1xuICBjb25zdCB7bWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLCBzY29yZVRocmVzaG9sZH0gPSBhdHRycztcblxuICBjb25zdCBib3hlc1ZhbHMgPSBiYWNrZW5kLnJlYWRTeW5jKGJveGVzLmRhdGFJZCkgYXMgVHlwZWRBcnJheTtcbiAgY29uc3Qgc2NvcmVzVmFscyA9IGJhY2tlbmQucmVhZFN5bmMoc2NvcmVzLmRhdGFJZCkgYXMgVHlwZWRBcnJheTtcblxuICBjb25zdCB7c2VsZWN0ZWRJbmRpY2VzfSA9IG5vbk1heFN1cHByZXNzaW9uVjNJbXBsKFxuICAgICAgYm94ZXNWYWxzLCBzY29yZXNWYWxzLCBtYXhPdXRwdXRTaXplLCBpb3VUaHJlc2hvbGQsIHNjb3JlVGhyZXNob2xkKTtcblxuICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhcbiAgICAgIFtzZWxlY3RlZEluZGljZXMubGVuZ3RoXSwgJ2ludDMyJywgbmV3IEludDMyQXJyYXkoc2VsZWN0ZWRJbmRpY2VzKSk7XG59XG5cbmV4cG9ydCBjb25zdCBub25NYXhTdXBwcmVzc2lvblYzQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IE5vbk1heFN1cHByZXNzaW9uVjMsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBub25NYXhTdXBwcmVzc2lvblYzIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBrZXJuZWxfaW1wbHMsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgTm9uTWF4U3VwcHJlc3Npb25WNCwgTm9uTWF4U3VwcHJlc3Npb25WNEF0dHJzLCBOb25NYXhTdXBwcmVzc2lvblY0SW5wdXRzLCBUZW5zb3JJbmZvLCBUeXBlZEFycmF5fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuY29uc3Qgbm9uTWF4U3VwcHJlc3Npb25WNEltcGwgPSBrZXJuZWxfaW1wbHMubm9uTWF4U3VwcHJlc3Npb25WNEltcGw7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBub25NYXhTdXBwcmVzc2lvblY0KGFyZ3M6IHtcbiAgaW5wdXRzOiBOb25NYXhTdXBwcmVzc2lvblY0SW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLFxuICBhdHRyczogTm9uTWF4U3VwcHJlc3Npb25WNEF0dHJzXG59KTogW1RlbnNvckluZm8sIFRlbnNvckluZm9dIHtcbiAgYmFja2VuZF91dGlsLndhcm4oXG4gICAgICAndGYubm9uTWF4U3VwcHJlc3Npb24oKSBpbiB3ZWJnbCBsb2NrcyB0aGUgVUkgdGhyZWFkLiAnICtcbiAgICAgICdDYWxsIHRmLm5vbk1heFN1cHByZXNzaW9uQXN5bmMoKSBpbnN0ZWFkJyk7XG5cbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge2JveGVzLCBzY29yZXN9ID0gaW5wdXRzO1xuICBjb25zdCB7bWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLCBzY29yZVRocmVzaG9sZCwgcGFkVG9NYXhPdXRwdXRTaXplfSA9XG4gICAgICBhdHRycztcblxuICBjb25zdCBib3hlc1ZhbHMgPSBiYWNrZW5kLnJlYWRTeW5jKGJveGVzLmRhdGFJZCkgYXMgVHlwZWRBcnJheTtcbiAgY29uc3Qgc2NvcmVzVmFscyA9IGJhY2tlbmQucmVhZFN5bmMoc2NvcmVzLmRhdGFJZCkgYXMgVHlwZWRBcnJheTtcblxuICBjb25zdCB7c2VsZWN0ZWRJbmRpY2VzLCB2YWxpZE91dHB1dHN9ID0gbm9uTWF4U3VwcHJlc3Npb25WNEltcGwoXG4gICAgICBib3hlc1ZhbHMsIHNjb3Jlc1ZhbHMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQsXG4gICAgICBwYWRUb01heE91dHB1dFNpemUpO1xuXG4gIHJldHVybiBbXG4gICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhcbiAgICAgICAgW3NlbGVjdGVkSW5kaWNlcy5sZW5ndGhdLCAnaW50MzInLCBuZXcgSW50MzJBcnJheShzZWxlY3RlZEluZGljZXMpKSxcbiAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtdLCAnaW50MzInLCBuZXcgSW50MzJBcnJheShbdmFsaWRPdXRwdXRzXSkpXG4gIF07XG59XG5cbmV4cG9ydCBjb25zdCBub25NYXhTdXBwcmVzc2lvblY0Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IE5vbk1heFN1cHByZXNzaW9uVjQsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBub25NYXhTdXBwcmVzc2lvblY0IGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBrZXJuZWxfaW1wbHMsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgTm9uTWF4U3VwcHJlc3Npb25WNSwgTm9uTWF4U3VwcHJlc3Npb25WNUF0dHJzLCBOb25NYXhTdXBwcmVzc2lvblY1SW5wdXRzLCBUZW5zb3JJbmZvLCBUeXBlZEFycmF5fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5jb25zdCBub25NYXhTdXBwcmVzc2lvblY1SW1wbCA9IGtlcm5lbF9pbXBscy5ub25NYXhTdXBwcmVzc2lvblY1SW1wbDtcbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBub25NYXhTdXBwcmVzc2lvblY1KGFyZ3M6IHtcbiAgaW5wdXRzOiBOb25NYXhTdXBwcmVzc2lvblY1SW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLFxuICBhdHRyczogTm9uTWF4U3VwcHJlc3Npb25WNUF0dHJzXG59KTogW1RlbnNvckluZm8sIFRlbnNvckluZm9dIHtcbiAgYmFja2VuZF91dGlsLndhcm4oXG4gICAgICAndGYubm9uTWF4U3VwcHJlc3Npb24oKSBpbiB3ZWJnbCBsb2NrcyB0aGUgVUkgdGhyZWFkLiAnICtcbiAgICAgICdDYWxsIHRmLm5vbk1heFN1cHByZXNzaW9uQXN5bmMoKSBpbnN0ZWFkJyk7XG5cbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge2JveGVzLCBzY29yZXN9ID0gaW5wdXRzO1xuICBjb25zdCB7bWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLCBzY29yZVRocmVzaG9sZCwgc29mdE5tc1NpZ21hfSA9IGF0dHJzO1xuXG4gIGNvbnN0IGJveGVzVmFscyA9IGJhY2tlbmQucmVhZFN5bmMoYm94ZXMuZGF0YUlkKSBhcyBUeXBlZEFycmF5O1xuICBjb25zdCBzY29yZXNWYWxzID0gYmFja2VuZC5yZWFkU3luYyhzY29yZXMuZGF0YUlkKSBhcyBUeXBlZEFycmF5O1xuXG4gIGNvbnN0IG1heE91dHB1dFNpemVWYWwgPSBtYXhPdXRwdXRTaXplO1xuICBjb25zdCBpb3VUaHJlc2hvbGRWYWwgPSBpb3VUaHJlc2hvbGQ7XG4gIGNvbnN0IHNjb3JlVGhyZXNob2xkVmFsID0gc2NvcmVUaHJlc2hvbGQ7XG4gIGNvbnN0IHNvZnRObXNTaWdtYVZhbCA9IHNvZnRObXNTaWdtYTtcblxuICBjb25zdCB7c2VsZWN0ZWRJbmRpY2VzLCBzZWxlY3RlZFNjb3Jlc30gPSBub25NYXhTdXBwcmVzc2lvblY1SW1wbChcbiAgICAgIGJveGVzVmFscywgc2NvcmVzVmFscywgbWF4T3V0cHV0U2l6ZVZhbCwgaW91VGhyZXNob2xkVmFsLFxuICAgICAgc2NvcmVUaHJlc2hvbGRWYWwsIHNvZnRObXNTaWdtYVZhbCk7XG5cbiAgcmV0dXJuIFtcbiAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFxuICAgICAgICBbc2VsZWN0ZWRJbmRpY2VzLmxlbmd0aF0sICdpbnQzMicsIG5ldyBJbnQzMkFycmF5KHNlbGVjdGVkSW5kaWNlcykpLFxuICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oXG4gICAgICAgIFtzZWxlY3RlZFNjb3Jlcy5sZW5ndGhdLCAnZmxvYXQzMicsIG5ldyBGbG9hdDMyQXJyYXkoc2VsZWN0ZWRTY29yZXMpKVxuICBdO1xufVxuXG5leHBvcnQgY29uc3Qgbm9uTWF4U3VwcHJlc3Npb25WNUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBOb25NYXhTdXBwcmVzc2lvblY1LFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogbm9uTWF4U3VwcHJlc3Npb25WNSBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge05vdEVxdWFsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtLZXJuZWxDb25maWd9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge2JpbmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuaW1wb3J0IHtub3RFcXVhbEltcGxDUFV9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuXG5jb25zdCBOT1RfRVFVQUwgPSBgcmV0dXJuIGZsb2F0KGEgIT0gYik7YDtcblxuZXhwb3J0IGNvbnN0IG5vdEVxdWFsID0gYmluYXJ5S2VybmVsRnVuYyhcbiAgICB7b3BTbmlwcGV0OiBOT1RfRVFVQUwsIGNwdUtlcm5lbEltcGw6IG5vdEVxdWFsSW1wbENQVSwgZHR5cGU6ICdib29sJ30pO1xuXG5leHBvcnQgY29uc3Qgbm90RXF1YWxDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTm90RXF1YWwsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBub3RFcXVhbCxcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBPbmVIb3QsIE9uZUhvdEF0dHJzLCBPbmVIb3RJbnB1dHMsIFRlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge09uZUhvdFByb2dyYW19IGZyb20gJy4uL29uZWhvdF9ncHUnO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL1Jlc2hhcGUnO1xuXG5leHBvcnQgY29uc3Qgb25lSG90ID0gKGFyZ3M6IHtcbiAgaW5wdXRzOiBPbmVIb3RJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsXG4gIGF0dHJzOiBPbmVIb3RBdHRyc1xufSk6IFRlbnNvckluZm8gPT4ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7aW5kaWNlc30gPSBpbnB1dHM7XG4gIGNvbnN0IHtkZXB0aCwgb25WYWx1ZSwgb2ZmVmFsdWV9ID0gYXR0cnM7XG5cbiAgY29uc3QgaW5kaWNlc1NpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoaW5kaWNlcy5zaGFwZSk7XG4gIGNvbnN0IHByb2dyYW0gPSBuZXcgT25lSG90UHJvZ3JhbShpbmRpY2VzU2l6ZSwgZGVwdGgsIG9uVmFsdWUsIG9mZlZhbHVlKTtcbiAgY29uc3QgcmVzaGFwZWQgPVxuICAgICAgcmVzaGFwZSh7aW5wdXRzOiB7eDogaW5kaWNlc30sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IFtpbmRpY2VzU2l6ZV19fSk7XG4gIGNvbnN0IHJlc3VsdCA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFtyZXNoYXBlZF0sIGluZGljZXMuZHR5cGUpO1xuICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlc2hhcGVkKTtcblxuICBjb25zdCBvdXRTaGFwZSA9IFsuLi5pbmRpY2VzLnNoYXBlLCBkZXB0aF07XG4gIGNvbnN0IG91dCA9IHJlc2hhcGUoe2lucHV0czoge3g6IHJlc3VsdH0sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IG91dFNoYXBlfX0pO1xuICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlc3VsdCk7XG4gIHJldHVybiBvdXQ7XG59O1xuXG5leHBvcnQgY29uc3Qgb25lSG90Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IE9uZUhvdCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IG9uZUhvdCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgT25lc0xpa2UsIE9uZXNMaWtlSW5wdXRzLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuXG5pbXBvcnQge2NvbXBsZXh9IGZyb20gJy4vQ29tcGxleCc7XG5pbXBvcnQge2ZpbGx9IGZyb20gJy4vRmlsbCc7XG5pbXBvcnQge2ltYWd9IGZyb20gJy4vSW1hZyc7XG5pbXBvcnQge3JlYWx9IGZyb20gJy4vUmVhbCc7XG5pbXBvcnQge3plcm9zTGlrZX0gZnJvbSAnLi9aZXJvc0xpa2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gb25lc0xpa2UoXG4gICAgYXJnczoge2lucHV0czogT25lc0xpa2VJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0x9KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmR9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuXG4gIGlmICh4LmR0eXBlID09PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBFcnJvcignb25lc0xpa2UgaXMgbm90IHN1cHBvcnRlZCB1bmRlciBzdHJpbmcgZHR5cGUnKTtcbiAgfSBlbHNlIGlmICh4LmR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgIGNvbnN0IHJlYWxQYXJ0ID0gcmVhbCh7aW5wdXRzOiB7aW5wdXQ6IHh9LCBiYWNrZW5kfSk7XG4gICAgY29uc3QgciA9IG9uZXNMaWtlKHtpbnB1dHM6IHt4OiByZWFsUGFydH0sIGJhY2tlbmR9KTtcbiAgICBjb25zdCBpbWFnUGFydCA9IGltYWcoe2lucHV0czoge2lucHV0OiB4fSwgYmFja2VuZH0pO1xuICAgIGNvbnN0IGkgPSB6ZXJvc0xpa2Uoe2lucHV0czoge3g6IGltYWdQYXJ0fSwgYmFja2VuZH0pO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gY29tcGxleCh7aW5wdXRzOiB7cmVhbDogciwgaW1hZzogaX0sIGJhY2tlbmR9KTtcblxuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVhbFBhcnQpO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocik7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhpbWFnUGFydCk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhpKTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0gZWxzZSB7XG4gICAgLy8gVE9ETyhjYWlzLCBzbWlsa292KTogQWRkIFdlYkdMIHNoYWRlciBmb3Igb25lc0xpa2U6XG4gICAgLy8gICBodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZmpzL2lzc3Vlcy8xMjkzXG4gICAgcmV0dXJuIGZpbGwoe2F0dHJzOiB7c2hhcGU6IHguc2hhcGUsIGR0eXBlOiB4LmR0eXBlLCB2YWx1ZTogMX0sIGJhY2tlbmR9KTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgb25lc0xpa2VDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogT25lc0xpa2UsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBvbmVzTGlrZSBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgUGFjaywgUGFja0F0dHJzLCBQYWNrSW5wdXRzLCBUZW5zb3JJbmZvLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtjb25jYXR9IGZyb20gJy4vQ29uY2F0JztcbmltcG9ydCB7ZXhwYW5kRGltc30gZnJvbSAnLi9FeHBhbmREaW1zJztcblxuZXhwb3J0IGZ1bmN0aW9uIHBhY2soXG4gICAgYXJnczoge2lucHV0czogUGFja0lucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCwgYXR0cnM6IFBhY2tBdHRyc30pOlxuICAgIFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7YXhpc30gPSBhdHRycztcblxuICBpZiAoaW5wdXRzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBleHBhbmREaW1zKFxuICAgICAgICB7aW5wdXRzOiB7aW5wdXQ6IGlucHV0c1swXX0sIGJhY2tlbmQsIGF0dHJzOiB7ZGltOiBheGlzfX0pO1xuICB9XG5cbiAgY29uc3Qgc2hhcGUgPSBpbnB1dHNbMF0uc2hhcGU7XG4gIGNvbnN0IGR0eXBlID0gaW5wdXRzWzBdLmR0eXBlO1xuXG4gIGlucHV0cy5mb3JFYWNoKHQgPT4ge1xuICAgIHV0aWwuYXNzZXJ0U2hhcGVzTWF0Y2goXG4gICAgICAgIHNoYXBlLCB0LnNoYXBlLFxuICAgICAgICAnQWxsIHRlbnNvcnMgcGFzc2VkIHRvIHN0YWNrIG11c3QgaGF2ZSBtYXRjaGluZyBzaGFwZXMnKTtcbiAgICB1dGlsLmFzc2VydChcbiAgICAgICAgZHR5cGUgPT09IHQuZHR5cGUsXG4gICAgICAgICgpID0+ICdBbGwgdGVuc29ycyBwYXNzZWQgdG8gc3RhY2sgbXVzdCBoYXZlIG1hdGNoaW5nIGR0eXBlcycpO1xuICB9KTtcblxuICBjb25zdCBpbnRlcm1lZGlhdGVUZW5zb3JJbmZvczogVGVuc29ySW5mb1tdID0gW107XG4gIGNvbnN0IGV4cGFuZGVkVGVuc29ycyA9IGlucHV0cy5tYXAodCA9PiB7XG4gICAgY29uc3QgZXhwYW5kZWRUID1cbiAgICAgICAgZXhwYW5kRGltcyh7aW5wdXRzOiB7aW5wdXQ6IHR9LCBiYWNrZW5kLCBhdHRyczoge2RpbTogYXhpc319KTtcbiAgICBpbnRlcm1lZGlhdGVUZW5zb3JJbmZvcy5wdXNoKGV4cGFuZGVkVCk7XG4gICAgcmV0dXJuIGV4cGFuZGVkVDtcbiAgfSk7XG5cbiAgY29uc3QgcmVzdWx0ID0gY29uY2F0KHtpbnB1dHM6IGV4cGFuZGVkVGVuc29ycywgYmFja2VuZCwgYXR0cnM6IHtheGlzfX0pO1xuXG4gIGludGVybWVkaWF0ZVRlbnNvckluZm9zLmZvckVhY2goXG4gICAgICB0ID0+IGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8odCkpO1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBjb25zdCBwYWNrQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFBhY2ssXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBwYWNrIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7ZW52LCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFBhZFYyLCBQYWRWMkF0dHJzLCBQYWRWMklucHV0cywgVGVuc29ySW5mbywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7UGFkUHJvZ3JhbX0gZnJvbSAnLi4vcGFkX2dwdSc7XG5pbXBvcnQge1BhZFBhY2tlZFByb2dyYW19IGZyb20gJy4uL3BhZF9wYWNrZWRfZ3B1JztcbmltcG9ydCB7ZmlsbH0gZnJvbSAnLi9GaWxsJztcblxuZXhwb3J0IGNvbnN0IHBhZFYyID1cbiAgICAoYXJnczoge2lucHV0czogUGFkVjJJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsIGF0dHJzOiBQYWRWMkF0dHJzfSk6XG4gICAgICAgIFRlbnNvckluZm8gPT4ge1xuICAgICAgICAgIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gICAgICAgICAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICAgICAgICAgIGNvbnN0IHtwYWRkaW5ncywgY29uc3RhbnRWYWx1ZX0gPSBhdHRycztcblxuICAgICAgICAgIGlmICh1dGlsLnNpemVGcm9tU2hhcGUoeC5zaGFwZSkgPT09IDApIHtcbiAgICAgICAgICAgIC8vIFNob3J0LWNpcmN1aXQgdGhlIGNvbXB1dGF0aW9uLCBzaW5jZSB4IGRvZXNuJ3QgaGF2ZSB2YWx1ZSwgb25seVxuICAgICAgICAgICAgLy8gdGhlIHNoYXBlIGlzIHVzZWQgdG8gY29tcHV0ZSBvdXRwdXQgc2hhcGUgdG8gcGFkLlxuICAgICAgICAgICAgY29uc3Qgb3V0cHV0U2hhcGUgPSBwYWRkaW5ncy5tYXAoXG4gICAgICAgICAgICAgICAgKHAsIGkpID0+XG4gICAgICAgICAgICAgICAgICAgIHBbMF0gLyogYmVmb3JlUGFkICovICsgeC5zaGFwZVtpXSArIHBbMV0gLyogYWZ0ZXJQYWQgKi8pO1xuICAgICAgICAgICAgcmV0dXJuIGZpbGwoe1xuICAgICAgICAgICAgICBiYWNrZW5kLFxuICAgICAgICAgICAgICBhdHRyczoge3NoYXBlOiBvdXRwdXRTaGFwZSwgdmFsdWU6IGNvbnN0YW50VmFsdWUsIGR0eXBlOiB4LmR0eXBlfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgcHJvZ3JhbSA9IGVudigpLmdldEJvb2woJ1dFQkdMX1BBQ0tfQVJSQVlfT1BFUkFUSU9OUycpID9cbiAgICAgICAgICAgICAgbmV3IFBhZFBhY2tlZFByb2dyYW0oeC5zaGFwZSwgcGFkZGluZ3MsIGNvbnN0YW50VmFsdWUpIDpcbiAgICAgICAgICAgICAgbmV3IFBhZFByb2dyYW0oeC5zaGFwZSwgcGFkZGluZ3MsIGNvbnN0YW50VmFsdWUpO1xuICAgICAgICAgIGNvbnN0IGN1c3RvbVZhbHVlcyA9IFtbY29uc3RhbnRWYWx1ZV1dO1xuICAgICAgICAgIHJldHVybiBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbeF0sIHguZHR5cGUsIGN1c3RvbVZhbHVlcyk7XG4gICAgICAgIH07XG5cbmV4cG9ydCBjb25zdCBwYWRWMkNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBQYWRWMixcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHBhZFYyIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBQb3d9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7Q0hFQ0tfTkFOX1NOSVBQRVR9IGZyb20gJy4uL2JpbmFyeW9wX3BhY2tlZF9ncHUnO1xuaW1wb3J0IHtiaW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcblxuY29uc3QgUE9XID0gYFxuICBpZihhIDwgMC4wICYmIGZsb29yKGIpIDwgYil7XG4gICAgcmV0dXJuIE5BTjtcbiAgfVxuICBpZiAoYiA9PSAwLjApIHtcbiAgICByZXR1cm4gMS4wO1xuICB9XG4gIHJldHVybiAocm91bmQobW9kKGIsIDIuMCkpICE9IDEpID9cbiAgICAgIHBvdyhhYnMoYSksIGIpIDogc2lnbihhKSAqIHBvdyhhYnMoYSksIGIpO1xuYDtcblxuY29uc3QgUE9XX1BBQ0tFRCA9IGBcbiAgLy8gaXNNb2RSb3VuZDEgaGFzIDEgZm9yIGNvbXBvbmVudHMgd2l0aCByb3VuZChtb2QoYiwgMi4wKSkgPT0gMSwgMCBvdGhlcndpc2UuXG4gIHZlYzQgaXNNb2RSb3VuZDEgPSB2ZWM0KGVxdWFsKHJvdW5kKG1vZChiLCAyLjApKSwgaXZlYzQoMSkpKTtcbiAgdmVjNCBtdWx0aXBsaWVyID0gc2lnbihhKSAqIGlzTW9kUm91bmQxICsgKHZlYzQoMS4wKSAtIGlzTW9kUm91bmQxKTtcbiAgdmVjNCByZXN1bHQgPSBtdWx0aXBsaWVyICogcG93KGFicyhhKSwgYik7XG5cbiAgLy8gRW5zdXJlIHRoYXQgYV4wID0gMSwgaW5jbHVkaW5nIDBeMCA9IDEgYXMgdGhpcyBjb3JyZXNwb25kIHRvIFRGIGFuZCBKU1xuICBidmVjNCBpc0V4cFplcm8gPSBlcXVhbChiLCB2ZWM0KDAuMCkpO1xuICByZXN1bHQuciA9IGlzRXhwWmVyby5yID8gMS4wIDogcmVzdWx0LnI7XG4gIHJlc3VsdC5nID0gaXNFeHBaZXJvLmcgPyAxLjAgOiByZXN1bHQuZztcbiAgcmVzdWx0LmIgPSBpc0V4cFplcm8uYiA/IDEuMCA6IHJlc3VsdC5iO1xuICByZXN1bHQuYSA9IGlzRXhwWmVyby5hID8gMS4wIDogcmVzdWx0LmE7XG5cbiAgdmVjNCBpc05hTiA9IHZlYzQobGVzc1RoYW4oYSwgdmVjNCgwLjApKSkgKiB2ZWM0KGxlc3NUaGFuKGZsb29yKGIpLCBiKSk7XG4gIGAgK1xuICAgIENIRUNLX05BTl9TTklQUEVUICsgYFxuICByZXR1cm4gcmVzdWx0O1xuYDtcblxuZXhwb3J0IGNvbnN0IHBvdyA9XG4gICAgYmluYXJ5S2VybmVsRnVuYyh7b3BTbmlwcGV0OiBQT1csIHBhY2tlZE9wU25pcHBldDogUE9XX1BBQ0tFRH0pO1xuXG5leHBvcnQgY29uc3QgcG93Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFBvdyxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHBvdyBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2VudiwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBQcmVsdSwgUHJlbHVJbnB1dHMsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge0JpbmFyeU9wUHJvZ3JhbX0gZnJvbSAnLi4vYmluYXJ5b3BfZ3B1JztcbmltcG9ydCB7QmluYXJ5T3BQYWNrZWRQcm9ncmFtfSBmcm9tICcuLi9iaW5hcnlvcF9wYWNrZWRfZ3B1JztcblxuZXhwb3J0IGNvbnN0IFBSRUxVID0gYHJldHVybiAoYSA8IDAuKSA/IGIgKiBhIDogYTtgO1xuZXhwb3J0IGNvbnN0IFBSRUxVX1BBQ0tFRCA9IGBcbiAgdmVjNCBhTGVzc1RoYW5aZXJvID0gdmVjNChsZXNzVGhhbihhLCB2ZWM0KDAuKSkpO1xuICByZXR1cm4gKGFMZXNzVGhhblplcm8gKiAoYiAqIGEpKSArICgodmVjNCgxLjApIC0gYUxlc3NUaGFuWmVybykgKiBhKTtcbmA7XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmVsdShhcmdzOiB7aW5wdXRzOiBQcmVsdUlucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTH0pOlxuICAgIFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kfSA9IGFyZ3M7XG4gIGNvbnN0IHt4LCBhbHBoYX0gPSBpbnB1dHM7XG5cbiAgY29uc3QgcHJvZ3JhbSA9IGVudigpLmdldEJvb2woJ1dFQkdMX1BBQ0tfQklOQVJZX09QRVJBVElPTlMnKSA/XG4gICAgICBuZXcgQmluYXJ5T3BQYWNrZWRQcm9ncmFtKFBSRUxVX1BBQ0tFRCwgeC5zaGFwZSwgYWxwaGEuc2hhcGUpIDpcbiAgICAgIG5ldyBCaW5hcnlPcFByb2dyYW0oUFJFTFUsIHguc2hhcGUsIGFscGhhLnNoYXBlKTtcbiAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFt4LCBhbHBoYV0sIHguZHR5cGUpO1xufVxuXG5leHBvcnQgY29uc3QgcHJlbHVDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogUHJlbHUsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBwcmVsdSBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBQcm9kLCBQcm9kQXR0cnMsIFByb2RJbnB1dHMsIHN1bU91dFR5cGUsIFRlbnNvckluZm8sIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge3JlZHVjZX0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3JlZHVjZSc7XG5pbXBvcnQge3Byb2RJbXBsQ1BVfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcblxuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL1Jlc2hhcGUnO1xuaW1wb3J0IHt0cmFuc3Bvc2V9IGZyb20gJy4vVHJhbnNwb3NlJztcblxuZXhwb3J0IGZ1bmN0aW9uIHByb2QoXG4gICAgYXJnczoge2lucHV0czogUHJvZElucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCwgYXR0cnM6IFByb2RBdHRyc30pOlxuICAgIFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG4gIGNvbnN0IHtheGlzLCBrZWVwRGltc30gPSBhdHRycztcblxuICBjb25zdCB4UmFuayA9IHguc2hhcGUubGVuZ3RoO1xuICBjb25zdCB0b0Rpc3Bvc2UgPSBbXTtcblxuICBjb25zdCBvcmlnQXhlcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oYXhpcywgeC5zaGFwZSk7XG4gIGxldCBheGVzID0gb3JpZ0F4ZXM7XG4gIGNvbnN0IHBlcm11dGVkQXhlcyA9IGJhY2tlbmRfdXRpbC5nZXRBeGVzUGVybXV0YXRpb24oYXhlcywgeFJhbmspO1xuICBsZXQgcGVybXV0ZWRYID0geDtcbiAgaWYgKHBlcm11dGVkQXhlcyAhPSBudWxsKSB7XG4gICAgcGVybXV0ZWRYID0gdHJhbnNwb3NlKHtpbnB1dHM6IHt4fSwgYmFja2VuZCwgYXR0cnM6IHtwZXJtOiBwZXJtdXRlZEF4ZXN9fSk7XG4gICAgYXhlcyA9IGJhY2tlbmRfdXRpbC5nZXRJbm5lck1vc3RBeGVzKGF4ZXMubGVuZ3RoLCB4UmFuayk7XG4gICAgdG9EaXNwb3NlLnB1c2gocGVybXV0ZWRYKTtcbiAgfVxuXG4gIGJhY2tlbmRfdXRpbC5hc3NlcnRBeGVzQXJlSW5uZXJNb3N0RGltcygncHJvZCcsIGF4ZXMsIHhSYW5rKTtcblxuICBsZXQgcmVzO1xuICBpZiAoYmFja2VuZC5zaG91bGRFeGVjdXRlT25DUFUoW3Blcm11dGVkWF0pKSB7XG4gICAgY29uc3QgeFZhbHMgPSBiYWNrZW5kLnRleERhdGEuZ2V0KHBlcm11dGVkWC5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuICAgIGNvbnN0IHtvdXRWYWxzLCBvdXRTaGFwZSwgb3V0RHR5cGV9ID1cbiAgICAgICAgcHJvZEltcGxDUFUocGVybXV0ZWRYLnNoYXBlLCBwZXJtdXRlZFguZHR5cGUsIHhWYWxzLCBheGVzKTtcbiAgICByZXMgPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dFNoYXBlLCBvdXREdHlwZSwgb3V0VmFscyk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgW291dFNoYXBlLCByZWR1Y2VTaGFwZV0gPVxuICAgICAgICBiYWNrZW5kX3V0aWwuY29tcHV0ZU91dEFuZFJlZHVjZVNoYXBlcyhwZXJtdXRlZFguc2hhcGUsIGF4ZXMpO1xuICAgIGNvbnN0IGluU2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShyZWR1Y2VTaGFwZSk7XG4gICAgY29uc3QgYTJEID0gcmVzaGFwZShcbiAgICAgICAge2lucHV0czoge3g6IHBlcm11dGVkWH0sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IFstMSwgaW5TaXplXX19KTtcbiAgICBjb25zdCBvdXRwdXREVHlwZSA9IHN1bU91dFR5cGUoeC5kdHlwZSk7XG4gICAgY29uc3QgcmVkdWNlZCA9IHJlZHVjZShhMkQsIG91dHB1dERUeXBlLCAncHJvZCcsIGJhY2tlbmQpO1xuICAgIHJlcyA9IHJlc2hhcGUoe2lucHV0czoge3g6IHJlZHVjZWR9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBvdXRTaGFwZX19KTtcblxuICAgIHRvRGlzcG9zZS5wdXNoKGEyRCk7XG4gICAgdG9EaXNwb3NlLnB1c2gocmVkdWNlZCk7XG4gIH1cblxuICBpZiAoa2VlcERpbXMpIHtcbiAgICB0b0Rpc3Bvc2UucHVzaChyZXMpO1xuICAgIGNvbnN0IG5ld1NoYXBlID0gYmFja2VuZF91dGlsLmV4cGFuZFNoYXBlVG9LZWVwRGltKHJlcy5zaGFwZSwgb3JpZ0F4ZXMpO1xuICAgIHJlcyA9IHJlc2hhcGUoe2lucHV0czoge3g6IHJlc30sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IG5ld1NoYXBlfX0pO1xuICB9XG5cbiAgdG9EaXNwb3NlLmZvckVhY2godCA9PiBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHQpKTtcblxuICByZXR1cm4gcmVzO1xufVxuXG5leHBvcnQgY29uc3QgcHJvZENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBQcm9kLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogcHJvZCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgUmFuZ2UsIFJhbmdlQXR0cnMsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge3JhbmdlSW1wbENQVX0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5cbmV4cG9ydCBjb25zdCByYW5nZSA9XG4gICAgKGFyZ3M6IHtiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLCBhdHRyczogUmFuZ2VBdHRyc30pOiBUZW5zb3JJbmZvID0+IHtcbiAgICAgIGNvbnN0IHtiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICAgICAgY29uc3Qge3N0YXJ0LCBzdG9wLCBzdGVwLCBkdHlwZX0gPSBhdHRycztcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHJhbmdlSW1wbENQVShzdGFydCwgc3RvcCwgc3RlcCwgZHR5cGUpO1xuICAgICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oW3ZhbHVlcy5sZW5ndGhdLCBkdHlwZSwgdmFsdWVzKTtcbiAgICB9O1xuXG5leHBvcnQgY29uc3QgcmFuZ2VDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogUmFuZ2UsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiByYW5nZSBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgUmVhbCwgUmVhbElucHV0cywgVGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7aWRlbnRpdHl9IGZyb20gJy4vSWRlbnRpdHknO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVhbChhcmdzOiB7aW5wdXRzOiBSZWFsSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmR9ID0gYXJncztcbiAgY29uc3Qge2lucHV0fSA9IGlucHV0cztcbiAgY29uc3QgaW5wdXREYXRhID0gYmFja2VuZC50ZXhEYXRhLmdldChpbnB1dC5kYXRhSWQpO1xuXG4gIHJldHVybiBpZGVudGl0eSh7aW5wdXRzOiB7eDogaW5wdXREYXRhLmNvbXBsZXhUZW5zb3JJbmZvcy5yZWFsfSwgYmFja2VuZH0pO1xufVxuXG5leHBvcnQgY29uc3QgcmVhbENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBSZWFsLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogcmVhbCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1JlYWxEaXZ9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge0tlcm5lbENvbmZpZ30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7YmluYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5cbi8vIFdpdGhvdXQgdGhlIGVxdWFsaXR5IGNoZWNrIGRpdiBwcm9kdWNlcyAwLjk5OTkgZm9yIGEgPSBiLCB3aGljaCB3aGVuXG4vLyBmbG9vcmVkIGNhbiBjYXVzZSBlcnJvcnMuXG5jb25zdCBESVYgPSBgXG5pZiAoYSA9PSBiKSB7XG4gIHJldHVybiAxLjA7XG59O1xucmV0dXJuIGEgLyBiO2A7XG5cbi8vIFdlIGRvIHRoZSBzYW1lIGFzIGluIC4vYmluYXJ5b3BfZ3B1LCB3aXRoIHZlYzQgYW5kIGl2ZWM0LlxuLy8gT24gTGludXgsIHRoZSB2ZWN0b3JpemVkIGltcGxlbWVudGF0aW9uIHByb2R1Y2VzIE5hTnMgd2hlbiBhIGFuZCBiIGFyZSAwLlxuY29uc3QgRElWX1BBQ0tFRCA9IGBcbiAgLy8gdmVjNCBvbmUgPSB2ZWM0KGVxdWFsKGEsIGIpKTtcbiAgLy8gcmV0dXJuIG9uZSArICh2ZWM0KDEuMCkgLSBvbmUpICogYSAvIGI7XG4gIHZlYzQgcmVzdWx0ID0gYSAvIGI7XG4gIGlmKGEueCA9PSBiLngpIHtcbiAgICByZXN1bHQueCA9IDEuO1xuICB9XG4gIGlmKGEueSA9PSBiLnkpIHtcbiAgICByZXN1bHQueSA9IDEuO1xuICB9XG4gIGlmKGEueiA9PSBiLnopIHtcbiAgICByZXN1bHQueiA9IDEuO1xuICB9XG4gIGlmKGEudyA9PSBiLncpIHtcbiAgICByZXN1bHQudyA9IDEuO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbmA7XG5cbmV4cG9ydCBjb25zdCByZWFsRGl2ID0gYmluYXJ5S2VybmVsRnVuYyhcbiAgICB7b3BTbmlwcGV0OiBESVYsIHBhY2tlZE9wU25pcHBldDogRElWX1BBQ0tFRCwgY2hlY2tPdXRPZkJvdW5kczogdHJ1ZX0pO1xuXG5leHBvcnQgY29uc3QgcmVhbERpdkNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBSZWFsRGl2LFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogcmVhbERpdixcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBSZWNpcHJvY2FsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHt1bmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuXG5jb25zdCBSRUNJUFJPQ0FMID0gYHJldHVybiAxLjAgLyB4O2A7XG5cbmV4cG9ydCBjb25zdCByZWNpcHJvY2FsID0gdW5hcnlLZXJuZWxGdW5jKHtvcFNuaXBwZXQ6IFJFQ0lQUk9DQUx9KTtcblxuZXhwb3J0IGNvbnN0IHJlY2lwcm9jYWxDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogUmVjaXByb2NhbCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHJlY2lwcm9jYWwsXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgUmVsdX0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7Q0hFQ0tfTkFOX1NOSVBQRVR9IGZyb20gJy4uL3VuYXJ5b3BfZ3B1JztcblxuY29uc3QgUkVMVSA9IENIRUNLX05BTl9TTklQUEVUICsgYFxuICByZXR1cm4gKHggPCAwLjApID8gMC4wIDogeDtcbmA7XG5cbmNvbnN0IFJFTFVfUEFDS0VEID0gYFxuICB2ZWM0IHJlc3VsdCA9IHggKiB2ZWM0KGdyZWF0ZXJUaGFuRXF1YWwoeCwgdmVjNCgwLjApKSk7XG4gIGJ2ZWM0IGlzTmFOID0gaXNuYW4oeCk7XG5cbiAgcmVzdWx0LnIgPSBpc05hTi5yID8geC5yIDogcmVzdWx0LnI7XG4gIHJlc3VsdC5nID0gaXNOYU4uZyA/IHguZyA6IHJlc3VsdC5nO1xuICByZXN1bHQuYiA9IGlzTmFOLmIgPyB4LmIgOiByZXN1bHQuYjtcbiAgcmVzdWx0LmEgPSBpc05hTi5hID8geC5hIDogcmVzdWx0LmE7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbmA7XG5cbmV4cG9ydCBjb25zdCByZWx1ID1cbiAgICB1bmFyeUtlcm5lbEZ1bmMoe29wU25pcHBldDogUkVMVSwgcGFja2VkT3BTbmlwcGV0OiBSRUxVX1BBQ0tFRH0pO1xuXG5leHBvcnQgY29uc3QgcmVsdUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBSZWx1LFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogcmVsdSBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgUmVsdTZ9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge3VuYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5pbXBvcnQge0NIRUNLX05BTl9TTklQUEVUfSBmcm9tICcuLi91bmFyeW9wX2dwdSc7XG5cbmNvbnN0IFJFTFU2ID0gQ0hFQ0tfTkFOX1NOSVBQRVQgKyBgXG4gIHJldHVybiAoeCA8IDAuMCkgPyAwLjAgOiBtaW4oNi4wLCB4KTtcbmA7XG5cbmNvbnN0IFJFTFU2X1BBQ0tFRCA9IGBcbiAgdmVjNCByZXN1bHQgPSBtaW4oeCwgdmVjNCg2LikpICogdmVjNChncmVhdGVyVGhhbkVxdWFsKHgsIHZlYzQoMC4wKSkpO1xuICBidmVjNCBpc05hTiA9IGlzbmFuKHgpO1xuXG4gIHJlc3VsdC5yID0gaXNOYU4uciA/IHguciA6IHJlc3VsdC5yO1xuICByZXN1bHQuZyA9IGlzTmFOLmcgPyB4LmcgOiByZXN1bHQuZztcbiAgcmVzdWx0LmIgPSBpc05hTi5iID8geC5iIDogcmVzdWx0LmI7XG4gIHJlc3VsdC5hID0gaXNOYU4uYSA/IHguYSA6IHJlc3VsdC5hO1xuXG4gIHJldHVybiByZXN1bHQ7XG5gO1xuXG5leHBvcnQgY29uc3QgcmVsdTYgPVxuICAgIHVuYXJ5S2VybmVsRnVuYyh7b3BTbmlwcGV0OiBSRUxVNiwgcGFja2VkT3BTbmlwcGV0OiBSRUxVNl9QQUNLRUR9KTtcblxuZXhwb3J0IGNvbnN0IHJlbHU2Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFJlbHU2LFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogcmVsdTYgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFJlc2hhcGUsIFJlc2hhcGVBdHRycywgUmVzaGFwZUlucHV0cywgVGVuc29ySW5mbywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7cGFja2VkUmVzaGFwZX0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3Jlc2hhcGUnO1xuaW1wb3J0IHtpc1Jlc2hhcGVGcmVlfSBmcm9tICcuLi93ZWJnbF91dGlsJztcblxuZXhwb3J0IGZ1bmN0aW9uIHJlc2hhcGUoYXJnczoge1xuICBpbnB1dHM6IFJlc2hhcGVJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsXG4gIGF0dHJzOiBSZXNoYXBlQXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICBjb25zdCB7c2hhcGV9ID0gYXR0cnM7XG4gIGNvbnN0IHdlYmdsQmFja2VuZCA9IGJhY2tlbmQ7XG5cbiAgY29uc3QgeFNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoeC5zaGFwZSk7XG4gIGNvbnN0ICRzaGFwZSA9IHV0aWwuaW5mZXJGcm9tSW1wbGljaXRTaGFwZShzaGFwZSwgeFNpemUpO1xuICBjb25zdCAkeFNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoJHNoYXBlKTtcblxuICB1dGlsLmFzc2VydChcbiAgICAgIHhTaXplID09PSAkeFNpemUsXG4gICAgICAoKSA9PiBgVGhlIG5ldyBzaGFwZSAoJHskc2hhcGV9KSBoYXMgJHskeFNpemV9IGVsZW1lbnRzIGFuZCB0aGUgb2xkIGAgK1xuICAgICAgICAgIGBzaGFwZSAoJHt4LnNoYXBlfSkgaGFzICR7eFNpemV9IGVsZW1lbnRzLiBUaGUgbmV3IHNoYXBlIGFuZCBvbGQgYCArXG4gICAgICAgICAgYHNoYXBlIG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgZWxlbWVudHMuYCk7XG5cbiAgY29uc3QgeFRleERhdGEgPSB3ZWJnbEJhY2tlbmQudGV4RGF0YS5nZXQoeC5kYXRhSWQpO1xuICBpZiAoeFRleERhdGEuaXNQYWNrZWQgJiYgIWlzUmVzaGFwZUZyZWUoeC5zaGFwZSwgJHNoYXBlKSAmJlxuICAgICAgISh4VGV4RGF0YS50ZXh0dXJlICE9PSBudWxsICYmIGlzUmVzaGFwZUZyZWUoeFRleERhdGEuc2hhcGUsICRzaGFwZSkpKSB7XG4gICAgcmV0dXJuIHBhY2tlZFJlc2hhcGUoeCwgJHNoYXBlLCB3ZWJnbEJhY2tlbmQpO1xuICB9XG5cbiAgd2ViZ2xCYWNrZW5kLmluY1JlZih4LmRhdGFJZCk7XG5cbiAgcmV0dXJuIHtkYXRhSWQ6IHguZGF0YUlkLCBzaGFwZTogJHNoYXBlLCBkdHlwZTogeC5kdHlwZX07XG59XG5cbmV4cG9ydCBjb25zdCByZXNoYXBlQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFJlc2hhcGUsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiByZXNoYXBlIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7ZW52LCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFJlc2l6ZUJpbGluZWFyLCBSZXNpemVCaWxpbmVhckF0dHJzLCBSZXNpemVCaWxpbmVhcklucHV0cywgVGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7UmVzaXplQmlsaW5lYXJQcm9ncmFtfSBmcm9tICcuLi9yZXNpemVfYmlsaW5lYXJfZ3B1JztcbmltcG9ydCB7UmVzaXplQmlsaW5lYXJQYWNrZWRQcm9ncmFtfSBmcm9tICcuLi9yZXNpemVfYmlsaW5lYXJfcGFja2VkX2dwdSc7XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNpemVCaWxpbmVhcihhcmdzOiB7XG4gIGlucHV0czogUmVzaXplQmlsaW5lYXJJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsXG4gIGF0dHJzOiBSZXNpemVCaWxpbmVhckF0dHJzXG59KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHtpbWFnZXN9ID0gaW5wdXRzO1xuICBjb25zdCB7YWxpZ25Db3JuZXJzLCBoYWxmUGl4ZWxDZW50ZXJzLCBzaXplfSA9IGF0dHJzO1xuXG4gIGNvbnN0IFtuZXdIZWlnaHQsIG5ld1dpZHRoXSA9IHNpemU7XG5cbiAgY29uc3QgcHJvZ3JhbSA9IGVudigpLmdldEJvb2woJ1dFQkdMX1BBQ0tfSU1BR0VfT1BFUkFUSU9OUycpID9cbiAgICAgIG5ldyBSZXNpemVCaWxpbmVhclBhY2tlZFByb2dyYW0oXG4gICAgICAgICAgaW1hZ2VzLnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLCBuZXdIZWlnaHQsIG5ld1dpZHRoLFxuICAgICAgICAgIGFsaWduQ29ybmVycywgaGFsZlBpeGVsQ2VudGVycykgOlxuICAgICAgbmV3IFJlc2l6ZUJpbGluZWFyUHJvZ3JhbShcbiAgICAgICAgICBpbWFnZXMuc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIG5ld0hlaWdodCwgbmV3V2lkdGgsXG4gICAgICAgICAgYWxpZ25Db3JuZXJzLCBoYWxmUGl4ZWxDZW50ZXJzKTtcbiAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFtpbWFnZXNdLCAnZmxvYXQzMicpO1xufVxuXG5leHBvcnQgY29uc3QgcmVzaXplQmlsaW5lYXJDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogUmVzaXplQmlsaW5lYXIsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiByZXNpemVCaWxpbmVhciBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgUmVzaXplQmlsaW5lYXJHcmFkLCBSZXNpemVCaWxpbmVhckdyYWRBdHRycywgUmVzaXplQmlsaW5lYXJHcmFkSW5wdXRzLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtSZXNpemVCaWxpbmVhckJhY2twcm9wUHJvZ3JhbX0gZnJvbSAnLi4vcmVzaXplX2JpbGluZWFyX2JhY2twcm9wX2dwdSc7XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNpemVCaWxpbmVhckdyYWQoYXJnczoge1xuICBpbnB1dHM6IFJlc2l6ZUJpbGluZWFyR3JhZElucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IFJlc2l6ZUJpbGluZWFyR3JhZEF0dHJzXG59KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHtpbWFnZXMsIGR5fSA9IGlucHV0cztcbiAgY29uc3Qge2FsaWduQ29ybmVyc30gPSBhdHRycztcblxuICBjb25zdCBwcm9ncmFtID0gbmV3IFJlc2l6ZUJpbGluZWFyQmFja3Byb3BQcm9ncmFtKFxuICAgICAgZHkuc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgICBpbWFnZXMuc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIGFsaWduQ29ybmVycyk7XG5cbiAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFtkeV0sIGR5LmR0eXBlKTtcbn1cblxuZXhwb3J0IGNvbnN0IHJlc2l6ZUJpbGluZWFyR3JhZENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBSZXNpemVCaWxpbmVhckdyYWQsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiByZXNpemVCaWxpbmVhckdyYWQgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtlbnYsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgUmVzaXplTmVhcmVzdE5laWdoYm9yLCBSZXNpemVOZWFyZXN0TmVpZ2hib3JBdHRycywgUmVzaXplTmVhcmVzdE5laWdoYm9ySW5wdXRzLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtSZXNpemVOZWFyZXN0TmVpZ2hib3JQcm9ncmFtfSBmcm9tICcuLi9yZXNpemVfbmVhcmVzdF9uZWlnaGJvcl9ncHUnO1xuaW1wb3J0IHtSZXNpemVOZWFyZXN0TmVpZ2hib3JQYWNrZWRQcm9ncmFtfSBmcm9tICcuLi9yZXNpemVfbmVhcmVzdF9uZWlnaGJvcl9wYWNrZWRfZ3B1JztcblxuZXhwb3J0IGZ1bmN0aW9uIHJlc2l6ZU5lYXJlc3ROZWlnaGJvcihhcmdzOiB7XG4gIGlucHV0czogUmVzaXplTmVhcmVzdE5laWdoYm9ySW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLFxuICBhdHRyczogUmVzaXplTmVhcmVzdE5laWdoYm9yQXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge2ltYWdlc30gPSBpbnB1dHM7XG4gIGNvbnN0IHthbGlnbkNvcm5lcnMsIGhhbGZQaXhlbENlbnRlcnMsIHNpemV9ID0gYXR0cnM7XG5cbiAgY29uc3QgW25ld0hlaWdodCwgbmV3V2lkdGhdID0gc2l6ZTtcblxuICBjb25zdCBwcm9ncmFtID0gZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUEFDS19JTUFHRV9PUEVSQVRJT05TJykgP1xuICAgICAgbmV3IFJlc2l6ZU5lYXJlc3ROZWlnaGJvclBhY2tlZFByb2dyYW0oXG4gICAgICAgICAgaW1hZ2VzLnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLCBuZXdIZWlnaHQsIG5ld1dpZHRoLFxuICAgICAgICAgIGFsaWduQ29ybmVycywgaGFsZlBpeGVsQ2VudGVycykgOlxuICAgICAgbmV3IFJlc2l6ZU5lYXJlc3ROZWlnaGJvclByb2dyYW0oXG4gICAgICAgICAgaW1hZ2VzLnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLCBuZXdIZWlnaHQsIG5ld1dpZHRoLFxuICAgICAgICAgIGFsaWduQ29ybmVycywgaGFsZlBpeGVsQ2VudGVycyk7XG4gIHJldHVybiBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbaW1hZ2VzXSwgaW1hZ2VzLmR0eXBlKTtcbn1cblxuZXhwb3J0IGNvbnN0IHJlc2l6ZU5lYXJlc3ROZWlnaGJvckNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBSZXNpemVOZWFyZXN0TmVpZ2hib3IsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiByZXNpemVOZWFyZXN0TmVpZ2hib3IgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFJlc2l6ZU5lYXJlc3ROZWlnaGJvckdyYWQsIFJlc2l6ZU5lYXJlc3ROZWlnaGJvckdyYWRBdHRycywgUmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZElucHV0cywgVGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7UmVzaXplTmVhcmVzdE5laWdib3JCYWNrcHJvcFByb2dyYW19IGZyb20gJy4uL3Jlc2l6ZV9uZWFyZXN0X25laWdoYm9yX2JhY2twcm9wX2dwdSc7XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkKGFyZ3M6IHtcbiAgaW5wdXRzOiBSZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkSW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLFxuICBhdHRyczogUmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZEF0dHJzXG59KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHtpbWFnZXMsIGR5fSA9IGlucHV0cztcbiAgY29uc3Qge2FsaWduQ29ybmVyc30gPSBhdHRycztcblxuICBjb25zdCBwcm9ncmFtID0gbmV3IFJlc2l6ZU5lYXJlc3ROZWlnYm9yQmFja3Byb3BQcm9ncmFtKFxuICAgICAgZHkuc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgICBpbWFnZXMuc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIGFsaWduQ29ybmVycyk7XG4gIHJldHVybiBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbZHldLCBkeS5kdHlwZSk7XG59XG5cbmV4cG9ydCBjb25zdCByZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFJlc2l6ZU5lYXJlc3ROZWlnaGJvckdyYWQsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiByZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7ZW52LCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFJldmVyc2UsIFJldmVyc2VBdHRycywgUmV2ZXJzZUlucHV0cywgVGVuc29ySW5mbywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7UmV2ZXJzZVByb2dyYW19IGZyb20gJy4uL3JldmVyc2VfZ3B1JztcbmltcG9ydCB7UmV2ZXJzZVBhY2tlZFByb2dyYW19IGZyb20gJy4uL3JldmVyc2VfcGFja2VkX2dwdSc7XG5cbmltcG9ydCB7aWRlbnRpdHl9IGZyb20gJy4vSWRlbnRpdHknO1xuXG5leHBvcnQgZnVuY3Rpb24gcmV2ZXJzZShhcmdzOiB7XG4gIGlucHV0czogUmV2ZXJzZUlucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IFJldmVyc2VBdHRyc1xufSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG4gIGNvbnN0IHtkaW1zfSA9IGF0dHJzO1xuXG4gIGNvbnN0IHhSYW5rID0geC5zaGFwZS5sZW5ndGg7XG5cbiAgY29uc3QgJGRpbXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKGRpbXMsIHguc2hhcGUpO1xuICBpZiAoeFJhbmsgPT09IDApIHtcbiAgICByZXR1cm4gaWRlbnRpdHkoe2lucHV0czoge3h9LCBiYWNrZW5kfSk7XG4gIH1cblxuICBjb25zdCBwcm9ncmFtID0gZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUEFDS19BUlJBWV9PUEVSQVRJT05TJykgP1xuICAgICAgbmV3IFJldmVyc2VQYWNrZWRQcm9ncmFtKHguc2hhcGUsICRkaW1zKSA6XG4gICAgICBuZXcgUmV2ZXJzZVByb2dyYW0oeC5zaGFwZSwgJGRpbXMpO1xuXG4gIHJldHVybiBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbeF0sIHguZHR5cGUpO1xufVxuXG5leHBvcnQgY29uc3QgcmV2ZXJzZUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBSZXZlcnNlLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogcmV2ZXJzZSBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgS2VybmVsQ29uZmlnLCBUZW5zb3I0RH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7Um90YXRlV2l0aE9mZnNldCwgUm90YXRlV2l0aE9mZnNldEF0dHJzLCBSb3RhdGVXaXRoT2Zmc2V0SW5wdXRzfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtSb3RhdGVQcm9ncmFtfSBmcm9tICcuLi9yb3RhdGVfZ3B1JztcblxuZXhwb3J0IGNvbnN0IHJvdGF0ZVdpdGhPZmZzZXRDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogUm90YXRlV2l0aE9mZnNldCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6ICh7aW5wdXRzLCBhdHRycywgYmFja2VuZH0pID0+IHtcbiAgICBjb25zdCB7aW1hZ2V9ID0gaW5wdXRzIGFzIFJvdGF0ZVdpdGhPZmZzZXRJbnB1dHM7XG4gICAgY29uc3Qge3JhZGlhbnMsIGZpbGxWYWx1ZSwgY2VudGVyfSA9IGF0dHJzIGFzIHt9IGFzIFJvdGF0ZVdpdGhPZmZzZXRBdHRycztcbiAgICBjb25zdCB3ZWJnbEJhY2tlbmQgPSBiYWNrZW5kIGFzIE1hdGhCYWNrZW5kV2ViR0w7XG5cbiAgICBjb25zdCBwcm9ncmFtID0gbmV3IFJvdGF0ZVByb2dyYW0oKGltYWdlIGFzIFRlbnNvcjREKS5zaGFwZSwgZmlsbFZhbHVlKTtcbiAgICBjb25zdCBbY2VudGVyWCwgY2VudGVyWV0gPVxuICAgICAgICBiYWNrZW5kX3V0aWwuZ2V0SW1hZ2VDZW50ZXIoY2VudGVyLCBpbWFnZS5zaGFwZVsxXSwgaW1hZ2Uuc2hhcGVbMl0pO1xuICAgIGNvbnN0IGN1c3RvbVZhbHVlcyA9XG4gICAgICAgIFtbY2VudGVyWCwgY2VudGVyWSwgTWF0aC5zaW4ocmFkaWFucyksIE1hdGguY29zKHJhZGlhbnMpXV07XG4gICAgY29uc3Qgb3V0cHV0ID0gd2ViZ2xCYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShcbiAgICAgICAgcHJvZ3JhbSwgW2ltYWdlXSwgaW1hZ2UuZHR5cGUsIGN1c3RvbVZhbHVlcyk7XG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfVxufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIFJvdW5kfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHt1bmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuXG5jb25zdCBST1VORCA9IGBcbiAgLy8gT3BlbkdMIEVTIGRvZXMgbm90IHN1cHBvcnQgcm91bmQgZnVuY3Rpb24uXG4gIC8vIFRoZSBhbGdvcml0aG0gaXMgYmFzZWQgb24gYmFua2VyJ3Mgcm91bmRpbmcuXG4gIGZsb2F0IGJhc2UgPSBmbG9vcih4KTtcbiAgaWYgKCh4IC0gYmFzZSkgPCAwLjUpIHtcbiAgICByZXR1cm4gZmxvb3IoeCk7XG4gIH0gZWxzZSBpZiAoKHggLSBiYXNlKSA+IDAuNSkge1xuICAgIHJldHVybiBjZWlsKHgpO1xuICB9IGVsc2Uge1xuICAgIGlmIChtb2QoYmFzZSwgMi4wKSA9PSAwLjApIHtcbiAgICAgIHJldHVybiBiYXNlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYmFzZSArIDEuMDtcbiAgICB9XG4gIH1cbmA7XG5cbmV4cG9ydCBjb25zdCByb3VuZCA9IHVuYXJ5S2VybmVsRnVuYyh7b3BTbmlwcGV0OiBST1VORH0pO1xuXG5leHBvcnQgY29uc3Qgcm91bmRDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogUm91bmQsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiByb3VuZCxcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBSc3FydH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7cnNxcnRJbXBsQ1BVfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcblxuY29uc3QgUlNRUlQgPSBgcmV0dXJuIGludmVyc2VzcXJ0KHgpO2A7XG5cbmV4cG9ydCBjb25zdCByc3FydCA9XG4gICAgdW5hcnlLZXJuZWxGdW5jKHtvcFNuaXBwZXQ6IFJTUVJULCBjcHVLZXJuZWxJbXBsOiByc3FydEltcGxDUFV9KTtcblxuZXhwb3J0IGNvbnN0IHJzcXJ0Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFJzcXJ0LFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogcnNxcnQgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgU2NhdHRlck5kLCBTY2F0dGVyTmRBdHRycywgU2NhdHRlck5kSW5wdXRzLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtTY2F0dGVyUHJvZ3JhbX0gZnJvbSAnLi4vc2NhdHRlcl9ncHUnO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL1Jlc2hhcGUnO1xuXG5leHBvcnQgZnVuY3Rpb24gc2NhdHRlck5kKGFyZ3M6IHtcbiAgaW5wdXRzOiBTY2F0dGVyTmRJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsXG4gIGF0dHJzOiBTY2F0dGVyTmRBdHRyc1xufSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7aW5kaWNlcywgdXBkYXRlc30gPSBpbnB1dHM7XG4gIGNvbnN0IHtzaGFwZX0gPSBhdHRycztcblxuICBjb25zdCB7c2xpY2VSYW5rLCBudW1VcGRhdGVzLCBzbGljZVNpemUsIHN0cmlkZXMsIG91dHB1dFNpemV9ID1cbiAgICAgIGJhY2tlbmRfdXRpbC5jYWxjdWxhdGVTaGFwZXModXBkYXRlcywgaW5kaWNlcywgc2hhcGUpO1xuXG4gIGNvbnN0IGZsYXR0ZW5TaGFwZSA9IFtvdXRwdXRTaXplIC8gc2xpY2VTaXplLCBzbGljZVNpemVdO1xuXG4gIGlmIChvdXRwdXRTaXplID09PSAwKSB7XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oc2hhcGUsIGluZGljZXMuZHR5cGUpO1xuICB9XG5cbiAgY29uc3QgZmxhdHRlbkluZGljZXMgPSByZXNoYXBlKFxuICAgICAge2lucHV0czoge3g6IGluZGljZXN9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBbbnVtVXBkYXRlcywgc2xpY2VSYW5rXX19KTtcbiAgY29uc3QgZmxhdHRlblggPSByZXNoYXBlKFxuICAgICAge2lucHV0czoge3g6IHVwZGF0ZXN9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBbbnVtVXBkYXRlcywgc2xpY2VTaXplXX19KTtcblxuICBjb25zdCBkZWZhdWx0VmFsdWUgPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFxuICAgICAgW10sICdmbG9hdDMyJywgbmV3IEZsb2F0MzJBcnJheShbMF0pKTsgIC8vIHNjYWxhcigwKVxuICBjb25zdCBwcm9ncmFtID0gbmV3IFNjYXR0ZXJQcm9ncmFtKFxuICAgICAgbnVtVXBkYXRlcywgc2xpY2VSYW5rLCBmbGF0dGVuSW5kaWNlcy5zaGFwZS5sZW5ndGgsIGZsYXR0ZW5YLnNoYXBlLmxlbmd0aCxcbiAgICAgIHN0cmlkZXMsIGZsYXR0ZW5TaGFwZSk7XG4gIGNvbnN0IHJlcyA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKFxuICAgICAgcHJvZ3JhbSwgW2ZsYXR0ZW5YLCBmbGF0dGVuSW5kaWNlcywgZGVmYXVsdFZhbHVlXSwgZmxhdHRlblguZHR5cGUpO1xuXG4gIGNvbnN0IHJlc2hhcGVkID0gcmVzaGFwZSh7aW5wdXRzOiB7eDogcmVzfSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZX19KTtcblxuICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGZsYXR0ZW5JbmRpY2VzKTtcbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhmbGF0dGVuWCk7XG4gIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVzKTtcbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhkZWZhdWx0VmFsdWUpO1xuXG4gIHJldHVybiByZXNoYXBlZDtcbn1cblxuZXhwb3J0IGNvbnN0IHNjYXR0ZXJOZENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBTY2F0dGVyTmQsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBzY2F0dGVyTmQgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFNlbGVjdCwgU2VsZWN0SW5wdXRzLCBUZW5zb3JJbmZvLCB1cGNhc3RUeXBlfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtTZWxlY3RQcm9ncmFtfSBmcm9tICcuLi9zZWxlY3RfZ3B1JztcblxuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdChhcmdzOiB7aW5wdXRzOiBTZWxlY3RJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0x9KTpcbiAgICBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZH0gPSBhcmdzO1xuICBjb25zdCB7Y29uZGl0aW9uLCB0LCBlfSA9IGlucHV0cztcblxuICBjb25zdCBwcm9ncmFtID1cbiAgICAgIG5ldyBTZWxlY3RQcm9ncmFtKGNvbmRpdGlvbi5zaGFwZS5sZW5ndGgsIHQuc2hhcGUsIHQuc2hhcGUubGVuZ3RoKTtcbiAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKFxuICAgICAgcHJvZ3JhbSwgW2NvbmRpdGlvbiwgdCwgZV0sIHVwY2FzdFR5cGUodC5kdHlwZSwgZS5kdHlwZSkpO1xufVxuXG5leHBvcnQgY29uc3Qgc2VsZWN0Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFNlbGVjdCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHNlbGVjdCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgS2VybmVsQ29uZmlnLCBTZWx1fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge3VuYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5cbmNvbnN0IFNFTFUgPSBgXG4gIC8vIFN0YWJsZSBhbmQgQXR0cmFjdGluZyBGaXhlZCBQb2ludCAoMCwgMSkgZm9yIE5vcm1hbGl6ZWQgV2VpZ2h0cy5cbiAgLy8gc2VlOiBodHRwczovL2FyeGl2Lm9yZy9hYnMvMTcwNi4wMjUxNVxuICBmbG9hdCBzY2FsZUFscGhhID0gJHtiYWNrZW5kX3V0aWwuU0VMVV9TQ0FMRUFMUEhBfTtcbiAgZmxvYXQgc2NhbGUgPSAke2JhY2tlbmRfdXRpbC5TRUxVX1NDQUxFfTtcbiAgcmV0dXJuICh4ID49IDAuMCkgPyBzY2FsZSAqIHggOiBzY2FsZUFscGhhICogKGV4cCh4KSAtIDEuMCk7XG5gO1xuXG5leHBvcnQgY29uc3Qgc2VsdSA9IHVuYXJ5S2VybmVsRnVuYyh7b3BTbmlwcGV0OiBTRUxVfSk7XG5cbmV4cG9ydCBjb25zdCBzZWx1Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFNlbHUsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBzZWx1LFxufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIFNpZ21vaWR9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge3VuYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5pbXBvcnQge3NpZ21vaWRJbXBsQ1BVfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcblxuY29uc3QgU0lHTU9JRCA9IGByZXR1cm4gMS4wIC8gKDEuMCArIGV4cCgtMS4wICogeCkpO2A7XG5cbmV4cG9ydCBjb25zdCBzaWdtb2lkID0gdW5hcnlLZXJuZWxGdW5jKHtcbiAgb3BTbmlwcGV0OiBTSUdNT0lELFxuICBwYWNrZWRPcFNuaXBwZXQ6IFNJR01PSUQsXG4gIGNwdUtlcm5lbEltcGw6IHNpZ21vaWRJbXBsQ1BVXG59KTtcblxuZXhwb3J0IGNvbnN0IHNpZ21vaWRDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogU2lnbW9pZCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHNpZ21vaWQsXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgU2lnbn0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHt1bmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuXG4vLyBTaWduIGRvZXMgbm90IHByb3BhZ2F0ZSBOQU5zLlxuY29uc3QgU0lHTiA9IGBcbiAgaWYgKGlzbmFuKHgpKSB7IHJldHVybiAwLjA7IH1cbiAgcmV0dXJuIHNpZ24oeCk7XG5gO1xuXG5leHBvcnQgY29uc3Qgc2lnbiA9IHVuYXJ5S2VybmVsRnVuYyh7b3BTbmlwcGV0OiBTSUdOfSk7XG5cbmV4cG9ydCBjb25zdCBzaWduQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFNpZ24sXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBzaWduLFxufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIFNpbn0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtDSEVDS19OQU5fU05JUFBFVF9VTkFSWSwgdW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcblxuY29uc3QgU0lOID0gQ0hFQ0tfTkFOX1NOSVBQRVRfVU5BUlkgKyBgXG4gIHJldHVybiBzaW4oeCk7XG5gO1xuXG5leHBvcnQgY29uc3Qgc2luID0gdW5hcnlLZXJuZWxGdW5jKHtvcFNuaXBwZXQ6IFNJTn0pO1xuXG5leHBvcnQgY29uc3Qgc2luQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFNpbixcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHNpbixcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBTaW5ofSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHt1bmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuXG5jb25zdCBTSU5IID0gYFxuICBmbG9hdCBlMnggPSBleHAoeCk7XG4gIHJldHVybiAoZTJ4IC0gMS4wIC8gZTJ4KSAvIDIuMDtcbmA7XG5cbmV4cG9ydCBjb25zdCBzaW5oID0gdW5hcnlLZXJuZWxGdW5jKHtvcFNuaXBwZXQ6IFNJTkh9KTtcblxuZXhwb3J0IGNvbnN0IHNpbmhDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogU2luaCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHNpbmgsXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2VudiwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBTbGljZSwgc2xpY2VfdXRpbCwgU2xpY2VBdHRycywgU2xpY2VJbnB1dHMsIFRlbnNvckluZm8sIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge3NsaWNlSW1wbENQVX0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5pbXBvcnQge1NsaWNlUHJvZ3JhbX0gZnJvbSAnLi4vc2xpY2VfZ3B1JztcbmltcG9ydCB7U2xpY2VQYWNrZWRQcm9ncmFtfSBmcm9tICcuLi9zbGljZV9wYWNrZWRfZ3B1JztcblxuZnVuY3Rpb24gc2hhbGxvd1NsaWNlKFxuICAgIHg6IFRlbnNvckluZm8sIGJlZ2luOiBudW1iZXJbXSwgc2l6ZTogbnVtYmVyW10sIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wpIHtcbiAgY29uc3QgeFRleERhdGEgPSBiYWNrZW5kLnRleERhdGEuZ2V0KHguZGF0YUlkKTtcbiAgY29uc3QgdCA9IGJhY2tlbmQubWFrZVRlbnNvckluZm8oc2l6ZSwgeC5kdHlwZSk7XG4gIGNvbnN0IG5ld1RleERhdGEgPSBiYWNrZW5kLnRleERhdGEuZ2V0KHQuZGF0YUlkKTtcbiAgLy8gQ29weSB0ZXh0dXJlIGRhdGEgZnJvbSB0aGUgb3JpZ2luYWwgdGVuc29yLlxuICBPYmplY3QuYXNzaWduKG5ld1RleERhdGEsIHhUZXhEYXRhKTtcbiAgbmV3VGV4RGF0YS5yZWZDb3VudCA9IDE7XG4gIG5ld1RleERhdGEuc2hhcGUgPSBzaXplO1xuICBuZXdUZXhEYXRhLmR0eXBlID0geC5kdHlwZTtcbiAgbGV0IGZsYXRPZmZzZXQgPVxuICAgICAgc2xpY2VfdXRpbC5jb21wdXRlRmxhdE9mZnNldChiZWdpbiwgdXRpbC5jb21wdXRlU3RyaWRlcyh4LnNoYXBlKSk7XG4gIGlmICh4VGV4RGF0YS5zbGljZSkge1xuICAgIC8vIFdlIGFyZSBzbGljaW5nIGFuIGFscmVhZHkgc2xpY2VkIHRlbnNvciwgc28gd2UgaGF2ZSB0byBhY2N1bXVsYXRlXG4gICAgLy8gdGhlIG9mZnNldC5cbiAgICBmbGF0T2Zmc2V0ICs9IHhUZXhEYXRhLnNsaWNlLmZsYXRPZmZzZXQ7XG4gIH1cbiAgbmV3VGV4RGF0YS5zbGljZSA9IHtcbiAgICBmbGF0T2Zmc2V0LFxuICAgIC8vIFBvaW50IHRvIHRoZSBvcmlnaW5hbCBkYXRhSWQsIHdoaWNoIGlzIHVzZWQgdG8gZG8gcmVmIGNvdW50aW5nLlxuICAgIG9yaWdEYXRhSWQ6IHhUZXhEYXRhLnNsaWNlICYmIHhUZXhEYXRhLnNsaWNlLm9yaWdEYXRhSWQgfHwgeC5kYXRhSWRcbiAgfTtcblxuICAvLyBJbmNyZWFzZSB0aGUgcmVmIGNvdW50IGZvciB0aGF0IGRhdGEgYnVja2V0LlxuICBjb25zdCByZWZDb3VudCA9IGJhY2tlbmQuZGF0YVJlZkNvdW50LmdldChuZXdUZXhEYXRhLnNsaWNlLm9yaWdEYXRhSWQpIHx8IDE7XG4gIGJhY2tlbmQuZGF0YVJlZkNvdW50LnNldChuZXdUZXhEYXRhLnNsaWNlLm9yaWdEYXRhSWQsIHJlZkNvdW50ICsgMSk7XG4gIHJldHVybiB0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2xpY2UoXG4gICAgYXJnczoge2lucHV0czogU2xpY2VJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsIGF0dHJzOiBTbGljZUF0dHJzfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4fSA9IGlucHV0cztcbiAgY29uc3Qge2JlZ2luLCBzaXplfSA9IGF0dHJzO1xuXG4gIGNvbnN0IFskYmVnaW4sICRzaXplXSA9IHNsaWNlX3V0aWwucGFyc2VTbGljZVBhcmFtcyh4LCBiZWdpbiwgc2l6ZSk7XG4gIHNsaWNlX3V0aWwuYXNzZXJ0UGFyYW1zVmFsaWQoeCwgJGJlZ2luLCAkc2l6ZSk7XG5cbiAgaWYgKHV0aWwuc2l6ZUZyb21TaGFwZSgkc2l6ZSkgPT09IDApIHtcbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbygkc2l6ZSwgeC5kdHlwZSwgW10pO1xuICB9XG5cbiAgLy8gUnVuIG9uIGNwdSBpZiBkdHlwZSBpcyBzdHJpbmcuIEZvciBzdHJpbmcsIHRoZSBiYWNrZW5kIHJlcHJlc2VudHMgaXRcbiAgLy8gYXMgVWludDhBcnJheVtdLCB3aGVyZSBlYWNoIFVpbnQ4QXJyYXkgaXMgYSBjaGFyYWN0ZXIuIEdpdmVuIHRoYXQgdGhlXG4gIC8vIGNvbXB1dGF0aW9uIGlzIG9ubHkgb24gdGhlIG91dGVyIGFycmF5LCB1cGxvYWRpbmcgdGhlIHdob2xlIGRhdGEgb250b1xuICAvLyBncHUgaXMgd2FzdGVmdWwuIEFsc28sIGN1cnJlbnRseSB3ZWJnbCBkb2Vzbid0IGhhdmUgYSBkZXNpZ24gdG9cbiAgLy8gdXBsb2FkIGFuZCByZXRyaWV2ZSBVaW50OEFycmF5W10gYmV0d2VlbiBjcHUgYW5kIGdwdS4gVGhlcmVmb3JlLCB3ZVxuICAvLyBqdXN0IHJ1biB0aGUga2VybmVsIG9uIGNwdSBpZiBkdHlwZSBpcyBzdHJpbmcuXG4gIGlmIChiYWNrZW5kLnNob3VsZEV4ZWN1dGVPbkNQVShbeF0pIHx8IHguZHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgeFRleERhdGEgPSBiYWNrZW5kLnRleERhdGEuZ2V0KHguZGF0YUlkKTtcbiAgICBjb25zdCBvdXRWYWx1ZXMgPSBzbGljZUltcGxDUFUoXG4gICAgICAgIHhUZXhEYXRhLnZhbHVlcyBhcyBUeXBlZEFycmF5LCAkYmVnaW4sICRzaXplLCB4LnNoYXBlLCB4LmR0eXBlKTtcbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbygkc2l6ZSwgeC5kdHlwZSwgb3V0VmFsdWVzKTtcbiAgfVxuXG4gIGNvbnN0IHtpc1BhY2tlZH0gPSBiYWNrZW5kLnRleERhdGEuZ2V0KHguZGF0YUlkKTtcbiAgY29uc3QgaXNDb250aW5vdXMgPSBzbGljZV91dGlsLmlzU2xpY2VDb250aW5vdXMoeC5zaGFwZSwgJGJlZ2luLCAkc2l6ZSk7XG4gIGlmIChpc1BhY2tlZCB8fCAhaXNDb250aW5vdXMpIHtcbiAgICBjb25zdCBwcm9ncmFtID0gZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUEFDS19BUlJBWV9PUEVSQVRJT05TJykgP1xuICAgICAgICBuZXcgU2xpY2VQYWNrZWRQcm9ncmFtKCRzaXplKSA6XG4gICAgICAgIG5ldyBTbGljZVByb2dyYW0oJHNpemUpO1xuICAgIGNvbnN0IGN1c3RvbVZhbHVlcyA9IFskYmVnaW5dO1xuICAgIHJldHVybiBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbeF0sIHguZHR5cGUsIGN1c3RvbVZhbHVlcyk7XG4gIH1cbiAgYmFja2VuZC51cGxvYWRUb0dQVSh4LmRhdGFJZCk7XG4gIHJldHVybiBzaGFsbG93U2xpY2UoeCwgJGJlZ2luLCAkc2l6ZSwgYmFja2VuZCk7XG59XG5cbmV4cG9ydCBjb25zdCBzbGljZUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBTbGljZSxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHNsaWNlIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFNvZnRtYXgsIFNvZnRtYXhBdHRycywgU29mdG1heElucHV0cywgVGVuc29ySW5mbywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcblxuaW1wb3J0IHtleHB9IGZyb20gJy4vRXhwJztcbmltcG9ydCB7bWF4fSBmcm9tICcuL01heCc7XG5pbXBvcnQge3JlYWxEaXZ9IGZyb20gJy4vUmVhbERpdic7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4vUmVzaGFwZSc7XG5pbXBvcnQge3N1Yn0gZnJvbSAnLi9TdWInO1xuaW1wb3J0IHtzdW19IGZyb20gJy4vU3VtJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNvZnRtYXgoYXJnczoge1xuICBpbnB1dHM6IFNvZnRtYXhJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsXG4gIGF0dHJzOiBTb2Z0bWF4QXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge2xvZ2l0c30gPSBpbnB1dHM7XG4gIGNvbnN0IHtkaW19ID0gYXR0cnM7XG5cbiAgY29uc3QgYXhlcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oW2RpbV0sIGxvZ2l0cy5zaGFwZSk7XG5cbiAgY29uc3QgbWF4TG9naXQgPSBtYXgoe1xuICAgIGlucHV0czoge3g6IGxvZ2l0c30sXG4gICAgYmFja2VuZCxcbiAgICBhdHRyczoge3JlZHVjdGlvbkluZGljZXM6IGF4ZXMsIGtlZXBEaW1zOiBmYWxzZX1cbiAgfSk7XG5cbiAgY29uc3QgZXhwYW5kZWRTaGFwZSA9IGJhY2tlbmRfdXRpbC5leHBhbmRTaGFwZVRvS2VlcERpbShtYXhMb2dpdC5zaGFwZSwgYXhlcyk7XG5cbiAgY29uc3QgbWF4TG9naXRzUmVzaGFwZWQgPVxuICAgICAgcmVzaGFwZSh7aW5wdXRzOiB7eDogbWF4TG9naXR9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBleHBhbmRlZFNoYXBlfX0pO1xuICBjb25zdCBhID1cbiAgICAgIHN1Yih7aW5wdXRzOiB7YTogbG9naXRzLCBiOiBtYXhMb2dpdHNSZXNoYXBlZH0sIGJhY2tlbmR9KSBhcyBUZW5zb3JJbmZvO1xuICBjb25zdCBiID0gZXhwKHtpbnB1dHM6IHt4OiBhfSwgYmFja2VuZH0pIGFzIFRlbnNvckluZm87XG4gIGNvbnN0IHN1bUV4cCA9XG4gICAgICBzdW0oe2lucHV0czoge3g6IGJ9LCBiYWNrZW5kLCBhdHRyczoge2F4aXM6IGF4ZXMsIGtlZXBEaW1zOiBmYWxzZX19KTtcbiAgY29uc3Qgc3VtRXhwUmVzaGFwZWQgPVxuICAgICAgcmVzaGFwZSh7aW5wdXRzOiB7eDogc3VtRXhwfSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogZXhwYW5kZWRTaGFwZX19KTtcblxuICBjb25zdCByZXMgPVxuICAgICAgcmVhbERpdih7aW5wdXRzOiB7YTogYiwgYjogc3VtRXhwUmVzaGFwZWR9LCBiYWNrZW5kfSkgYXMgVGVuc29ySW5mbztcblxuICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKG1heExvZ2l0KTtcbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhtYXhMb2dpdHNSZXNoYXBlZCk7XG4gIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oYSk7XG4gIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oYik7XG4gIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oc3VtRXhwKTtcbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhzdW1FeHBSZXNoYXBlZCk7XG5cbiAgcmV0dXJuIHJlcztcbn1cblxuZXhwb3J0IGNvbnN0IHNvZnRtYXhDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogU29mdG1heCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHNvZnRtYXggYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIFNvZnRwbHVzfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHt1bmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuXG5jb25zdCBTT0ZUUExVUyA9IGBcbiAgZmxvYXQgZXBzaWxvbiA9IDEuMTkyMDkyODk1NTA3ODEyNWUtNztcbiAgZmxvYXQgdGhyZXNob2xkID0gbG9nKGVwc2lsb24pICsgMi4wO1xuXG4gIGJvb2wgdG9vX2xhcmdlID0geCA+IC10aHJlc2hvbGQ7XG4gIGJvb2wgdG9vX3NtYWxsID0geCA8IHRocmVzaG9sZDtcblxuICBmbG9hdCByZXN1bHQ7XG4gIGZsb2F0IGV4cF94ID0gZXhwKHgpO1xuXG4gIGlmICh0b29fbGFyZ2Upe1xuICAgIHJlc3VsdCA9IHg7XG4gIH1cbiAgZWxzZSBpZiAodG9vX3NtYWxsKXtcbiAgICByZXN1bHQgPSBleHBfeDtcbiAgfVxuICBlbHNle1xuICAgIHJlc3VsdCA9IGxvZyhleHBfeCArIDEuMCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbmA7XG5cbmV4cG9ydCBjb25zdCBzb2Z0cGx1cyA9IHVuYXJ5S2VybmVsRnVuYyh7b3BTbmlwcGV0OiBTT0ZUUExVU30pO1xuXG5leHBvcnQgY29uc3Qgc29mdHBsdXNDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogU29mdHBsdXMsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBzb2Z0cGx1cyxcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFNwYWNlVG9CYXRjaE5ELCBTcGFjZVRvQmF0Y2hOREF0dHJzLCBTcGFjZVRvQmF0Y2hORElucHV0cywgVGVuc29ySW5mbywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcblxuaW1wb3J0IHtwYWRWMn0gZnJvbSAnLi9QYWRWMic7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4vUmVzaGFwZSc7XG5pbXBvcnQge3RyYW5zcG9zZX0gZnJvbSAnLi9UcmFuc3Bvc2UnO1xuXG5leHBvcnQgY29uc3Qgc3BhY2VUb0JhdGNoTkQgPSAoYXJnczoge1xuICBpbnB1dHM6IFNwYWNlVG9CYXRjaE5ESW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLFxuICBhdHRyczogU3BhY2VUb0JhdGNoTkRBdHRyc1xufSk6IFRlbnNvckluZm8gPT4ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG4gIGNvbnN0IHtibG9ja1NoYXBlLCBwYWRkaW5nc30gPSBhdHRycztcblxuICB1dGlsLmFzc2VydChcbiAgICAgIHguc2hhcGUubGVuZ3RoIDw9IDQsXG4gICAgICAoKSA9PiAnc3BhY2VUb0JhdGNoTkQgZm9yIHJhbmsgPiA0IHdpdGggYSBXZWJHTCBiYWNrZW5kIG5vdCAnICtcbiAgICAgICAgICAnaW1wbGVtZW50ZWQgeWV0Jyk7XG5cbiAgY29uc3QgcHJvZCA9IGJsb2NrU2hhcGUucmVkdWNlKChhLCBiKSA9PiBhICogYik7XG5cbiAgY29uc3QgY29tcGxldGVQYWRkaW5nczogQXJyYXk8W251bWJlciwgbnVtYmVyXT4gPSBbWzAsIDBdXTtcbiAgY29tcGxldGVQYWRkaW5ncy5wdXNoKC4uLnBhZGRpbmdzIGFzIEFycmF5PFtudW1iZXIsIG51bWJlcl0+KTtcbiAgZm9yIChsZXQgaSA9IDEgKyBibG9ja1NoYXBlLmxlbmd0aDsgaSA8IHguc2hhcGUubGVuZ3RoOyArK2kpIHtcbiAgICBjb21wbGV0ZVBhZGRpbmdzLnB1c2goWzAsIDBdKTtcbiAgfVxuXG4gIGNvbnN0IHRvRGlzcG9zZSA9IFtdO1xuXG4gIGNvbnN0IHBhZGRlZFggPSBwYWRWMih7XG4gICAgaW5wdXRzOiB7eH0sXG4gICAgYmFja2VuZCxcbiAgICBhdHRyczoge3BhZGRpbmdzOiBjb21wbGV0ZVBhZGRpbmdzLCBjb25zdGFudFZhbHVlOiAwfVxuICB9KTtcblxuICBjb25zdCByZXNoYXBlZFBhZGRlZFNoYXBlID1cbiAgICAgIGJhY2tlbmRfdXRpbC5nZXRSZXNoYXBlZChwYWRkZWRYLnNoYXBlLCBibG9ja1NoYXBlLCBwcm9kLCBmYWxzZSk7XG5cbiAgY29uc3QgcGVybXV0ZWRSZXNoYXBlZFBhZGRlZFBlcm11dGF0aW9uID0gYmFja2VuZF91dGlsLmdldFBlcm11dGVkKFxuICAgICAgcmVzaGFwZWRQYWRkZWRTaGFwZS5sZW5ndGgsIGJsb2NrU2hhcGUubGVuZ3RoLCBmYWxzZSk7XG5cbiAgY29uc3QgZmxhdHRlblNoYXBlID1cbiAgICAgIGJhY2tlbmRfdXRpbC5nZXRSZXNoYXBlZFBlcm11dGVkKHBhZGRlZFguc2hhcGUsIGJsb2NrU2hhcGUsIHByb2QsIGZhbHNlKTtcblxuICBjb25zdCByZXNoYXBlZFBhZGRlZFggPSByZXNoYXBlKFxuICAgICAge2lucHV0czoge3g6IHBhZGRlZFh9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiByZXNoYXBlZFBhZGRlZFNoYXBlfX0pO1xuXG4gIGNvbnN0IHBhZGRlZFhUID0gdHJhbnNwb3NlKHtcbiAgICBpbnB1dHM6IHt4OiByZXNoYXBlZFBhZGRlZFh9LFxuICAgIGJhY2tlbmQsXG4gICAgYXR0cnM6IHtwZXJtOiBwZXJtdXRlZFJlc2hhcGVkUGFkZGVkUGVybXV0YXRpb259XG4gIH0pO1xuXG4gIGNvbnN0IHJlc3VsdCA9XG4gICAgICByZXNoYXBlKHtpbnB1dHM6IHt4OiBwYWRkZWRYVH0sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IGZsYXR0ZW5TaGFwZX19KTtcblxuICB0b0Rpc3Bvc2UucHVzaChwYWRkZWRYKTtcbiAgdG9EaXNwb3NlLnB1c2gocmVzaGFwZWRQYWRkZWRYKTtcbiAgdG9EaXNwb3NlLnB1c2gocGFkZGVkWFQpO1xuXG4gIHRvRGlzcG9zZS5mb3JFYWNoKHQgPT4gYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh0KSk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbmV4cG9ydCBjb25zdCBzcGFjZVRvQmF0Y2hORENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBTcGFjZVRvQmF0Y2hORCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHNwYWNlVG9CYXRjaE5EIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBTcGFyc2VGaWxsRW1wdHlSb3dzLCBTcGFyc2VGaWxsRW1wdHlSb3dzSW5wdXRzLCBUZW5zb3JJbmZvLCBUeXBlZEFycmF5fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtzcGFyc2VGaWxsRW1wdHlSb3dzSW1wbENQVX0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGFyc2VGaWxsRW1wdHlSb3dzKGFyZ3M6IHtcbiAgaW5wdXRzOiBTcGFyc2VGaWxsRW1wdHlSb3dzSW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMXG59KTogW1RlbnNvckluZm8sIFRlbnNvckluZm8sIFRlbnNvckluZm8sIFRlbnNvckluZm9dIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZH0gPSBhcmdzO1xuICBjb25zdCB7aW5kaWNlcywgdmFsdWVzLCBkZW5zZVNoYXBlLCBkZWZhdWx0VmFsdWV9ID0gaW5wdXRzO1xuICBpZiAoZGVuc2VTaGFwZS5zaGFwZS5sZW5ndGggIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYERlbnNlIHNoYXBlIG11c3QgYmUgYSB2ZWN0b3IsIHNhdzpcbiAgICAgICAgICR7ZGVuc2VTaGFwZS5zaGFwZX1gKTtcbiAgfVxuICBpZiAoaW5kaWNlcy5zaGFwZS5sZW5ndGggIT09IDIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEluZGljZXMgbXVzdCBiZSBhIG1hdHJpeCwgc2F3OlxuICAgICAgICAgJHtpbmRpY2VzLnNoYXBlfWApO1xuICB9XG4gIGlmICh2YWx1ZXMuc2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBWYWx1ZXMgbXVzdCBiZSBhIHZlY3Rvciwgc2F3OlxuICAgICAgICAgJHt2YWx1ZXMuc2hhcGV9YCk7XG4gIH1cbiAgaWYgKGRlZmF1bHRWYWx1ZS5zaGFwZS5sZW5ndGggIT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYERlZmF1bHQgdmFsdWUgbXVzdCBiZSBhIHNjYWxhciwgc2F3OlxuICAgICAgICAke2RlZmF1bHRWYWx1ZS5zaGFwZX1gKTtcbiAgfVxuXG4gIGNvbnN0ICRpbmRpY2VzID0gYmFja2VuZC5yZWFkU3luYyhpbmRpY2VzLmRhdGFJZCkgYXMgVHlwZWRBcnJheTtcbiAgY29uc3QgJHZhbHVlcyA9IGJhY2tlbmQucmVhZFN5bmModmFsdWVzLmRhdGFJZCkgYXMgVHlwZWRBcnJheTtcbiAgY29uc3QgJGRlbnNlU2hhcGUgPSBiYWNrZW5kLnJlYWRTeW5jKGRlbnNlU2hhcGUuZGF0YUlkKSBhcyBUeXBlZEFycmF5O1xuICBjb25zdCAkZGVmYXVsdFZhbHVlID1cbiAgICAgIGJhY2tlbmQucmVhZFN5bmMoZGVmYXVsdFZhbHVlLmRhdGFJZClbMF0gYXMgbnVtYmVyO1xuXG4gIGNvbnN0IFtvdXRwdXRJbmRpY2VzLCBvdXRwdXRJbmRpY2VzU2hhcGUsIG91dHB1dFZhbHVlcyxcbiAgICAgICAgIGVtcHR5Um93SW5kaWNhdG9yLCByZXZlcnNlSW5kZXhNYXBdID1cbiAgICAgIHNwYXJzZUZpbGxFbXB0eVJvd3NJbXBsQ1BVKFxuICAgICAgICAgICRpbmRpY2VzLCBpbmRpY2VzLnNoYXBlLCBpbmRpY2VzLmR0eXBlLCAkdmFsdWVzLCB2YWx1ZXMuZHR5cGUsXG4gICAgICAgICAgJGRlbnNlU2hhcGUsICRkZWZhdWx0VmFsdWUpO1xuICByZXR1cm4gW1xuICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0cHV0SW5kaWNlc1NoYXBlLCBpbmRpY2VzLmR0eXBlLCBvdXRwdXRJbmRpY2VzKSxcbiAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFxuICAgICAgICBbb3V0cHV0SW5kaWNlc1NoYXBlWzBdXSwgdmFsdWVzLmR0eXBlLCBvdXRwdXRWYWx1ZXMpLFxuICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oXG4gICAgICAgIFtlbXB0eVJvd0luZGljYXRvci5sZW5ndGhdLCAnYm9vbCcsXG4gICAgICAgIG5ldyBVaW50OEFycmF5KFxuICAgICAgICAgICAgZW1wdHlSb3dJbmRpY2F0b3IubWFwKCh2YWx1ZTogYm9vbGVhbikgPT4gTnVtYmVyKHZhbHVlKSkpKSxcbiAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFxuICAgICAgICBbcmV2ZXJzZUluZGV4TWFwLmxlbmd0aF0sIGluZGljZXMuZHR5cGUsXG4gICAgICAgIG5ldyBJbnQzMkFycmF5KHJldmVyc2VJbmRleE1hcCkpLFxuICBdO1xufVxuXG5leHBvcnQgY29uc3Qgc3BhcnNlRmlsbEVtcHR5Um93c0NvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBTcGFyc2VGaWxsRW1wdHlSb3dzLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogc3BhcnNlRmlsbEVtcHR5Um93cyBhcyB7fSBhcyBLZXJuZWxGdW5jLFxufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIFNwYXJzZVJlc2hhcGUsIFNwYXJzZVJlc2hhcGVJbnB1dHMsIFRlbnNvckluZm8sIFR5cGVkQXJyYXl9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge3NwYXJzZVJlc2hhcGVJbXBsQ1BVfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXJzZVJlc2hhcGUoXG4gICAgYXJnczoge2lucHV0czogU3BhcnNlUmVzaGFwZUlucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTH0pOlxuICAgIFtUZW5zb3JJbmZvLCBUZW5zb3JJbmZvXSB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmR9ID0gYXJncztcbiAgY29uc3Qge2lucHV0SW5kaWNlcywgaW5wdXRTaGFwZSwgbmV3U2hhcGV9ID0gaW5wdXRzO1xuICBpZiAoaW5wdXRJbmRpY2VzLnNoYXBlLmxlbmd0aCAhPT0gMikge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW5wdXQgaW5kaWNlcyBzaG91bGQgYmUgYSBtYXRyaXggYnV0IHJlY2VpdmVkIHNoYXBlICR7XG4gICAgICAgIGlucHV0SW5kaWNlcy5zaGFwZX1gKTtcbiAgfVxuICBpZiAoaW5wdXRTaGFwZS5zaGFwZS5sZW5ndGggIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYElucHV0IHNoYXBlIHNob3VsZCBiZSBhIHZlY3RvciBidXQgcmVjZWl2ZWQgc2hhcGUgJHtcbiAgICAgICAgaW5wdXRTaGFwZS5zaGFwZX1gKTtcbiAgfVxuXG4gIGlmIChuZXdTaGFwZS5zaGFwZS5sZW5ndGggIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUYXJnZXQgc2hhcGUgc2hvdWxkIGJlIGEgdmVjdG9yIGJ1dCByZWNlaXZlZCBzaGFwZSAke25ld1NoYXBlLnNoYXBlfWApO1xuICB9XG5cbiAgY29uc3QgJGlucHV0U2hhcGUgPVxuICAgICAgQXJyYXkuZnJvbShiYWNrZW5kLnJlYWRTeW5jKGlucHV0U2hhcGUuZGF0YUlkKSBhcyBUeXBlZEFycmF5KTtcbiAgY29uc3QgJGlucHV0SW5kaWNlcyA9IGJhY2tlbmQucmVhZFN5bmMoaW5wdXRJbmRpY2VzLmRhdGFJZCkgYXMgVHlwZWRBcnJheTtcbiAgY29uc3QgdGFyZ2V0U2hhcGUgPVxuICAgICAgQXJyYXkuZnJvbShiYWNrZW5kLnJlYWRTeW5jKG5ld1NoYXBlLmRhdGFJZCkgYXMgVHlwZWRBcnJheSk7XG5cbiAgY29uc3QgW25ld0luZGljZXMsIGluZGljZXNTaGFwZSwgb3V0cHV0U2hhcGVdID0gc3BhcnNlUmVzaGFwZUltcGxDUFUoXG4gICAgICAkaW5wdXRJbmRpY2VzLCBpbnB1dEluZGljZXMuc2hhcGUsIGlucHV0SW5kaWNlcy5kdHlwZSwgJGlucHV0U2hhcGUsXG4gICAgICB0YXJnZXRTaGFwZSk7XG4gIHJldHVybiBbXG4gICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhpbmRpY2VzU2hhcGUsIGlucHV0SW5kaWNlcy5kdHlwZSwgbmV3SW5kaWNlcyksXG4gICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhcbiAgICAgICAgW291dHB1dFNoYXBlLmxlbmd0aF0sIG5ld1NoYXBlLmR0eXBlLCBuZXcgSW50MzJBcnJheShvdXRwdXRTaGFwZSkpLFxuICBdO1xufVxuXG5leHBvcnQgY29uc3Qgc3BhcnNlUmVzaGFwZUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBTcGFyc2VSZXNoYXBlLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogc3BhcnNlUmVzaGFwZSxcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBTcGFyc2VTZWdtZW50TWVhbiwgU3BhcnNlU2VnbWVudE1lYW5JbnB1dHMsIFRlbnNvckluZm8sIFR5cGVkQXJyYXl9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge3NwYXJzZVNlZ21lbnRSZWR1Y3Rpb25JbXBsQ1BVfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXJzZVNlZ21lbnRNZWFuKFxuICAgIGFyZ3M6IHtpbnB1dHM6IFNwYXJzZVNlZ21lbnRNZWFuSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmR9ID0gYXJncztcbiAgY29uc3Qge2RhdGEsIGluZGljZXMsIHNlZ21lbnRJZHN9ID0gaW5wdXRzO1xuICBpZiAoZGF0YS5zaGFwZS5sZW5ndGggPCAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRGF0YSBzaG91bGQgYmUgYXQgbGVhc3QgMSBkaW1lbnNpb25hbCBidXQgcmVjZWl2ZWQgc2NhbGFyYCk7XG4gIH1cbiAgaWYgKGluZGljZXMuc2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbmRpY2VzIHNob3VsZCBiZSBhIHZlY3RvciBidXQgcmVjZWl2ZWQgc2hhcGVcbiAgICAgICAgICAgICAgJHtpbmRpY2VzLnNoYXBlfWApO1xuICB9XG4gIGlmIChzZWdtZW50SWRzLnNoYXBlLmxlbmd0aCAhPT0gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgU2VnbWVudCBpZHMgc2hvdWxkIGJlIGEgdmVjdG9yIGJ1dCByZWNlaXZlZCBzaGFwZVxuICAgICAgICAgICAgICAke3NlZ21lbnRJZHMuc2hhcGV9YCk7XG4gIH1cblxuICBjb25zdCAkZGF0YSA9IGJhY2tlbmQucmVhZFN5bmMoZGF0YS5kYXRhSWQpIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0ICRpbmRpY2VzID0gYmFja2VuZC5yZWFkU3luYyhpbmRpY2VzLmRhdGFJZCkgYXMgVHlwZWRBcnJheTtcbiAgY29uc3QgJHNlZ21lbnRJZHMgPSBiYWNrZW5kLnJlYWRTeW5jKHNlZ21lbnRJZHMuZGF0YUlkKSBhcyBUeXBlZEFycmF5O1xuXG4gIGNvbnN0IFtvdXRwdXREYXRhLCBvdXRwdXREYXRhU2hhcGVdID0gc3BhcnNlU2VnbWVudFJlZHVjdGlvbkltcGxDUFUoXG4gICAgICAkZGF0YSwgZGF0YS5zaGFwZSwgZGF0YS5kdHlwZSwgJGluZGljZXMsICRzZWdtZW50SWRzLCB0cnVlKTtcbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0cHV0RGF0YVNoYXBlLCBkYXRhLmR0eXBlLCBvdXRwdXREYXRhKTtcbn1cblxuZXhwb3J0IGNvbnN0IHNwYXJzZVNlZ21lbnRNZWFuQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFNwYXJzZVNlZ21lbnRNZWFuLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogc3BhcnNlU2VnbWVudE1lYW4gYXMge30gYXMgS2VybmVsRnVuYyxcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBTcGFyc2VTZWdtZW50U3VtLCBTcGFyc2VTZWdtZW50U3VtSW5wdXRzLCBUZW5zb3JJbmZvLCBUeXBlZEFycmF5fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtzcGFyc2VTZWdtZW50UmVkdWN0aW9uSW1wbENQVX0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGFyc2VTZWdtZW50U3VtKFxuICAgIGFyZ3M6IHtpbnB1dHM6IFNwYXJzZVNlZ21lbnRTdW1JbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0x9KTpcbiAgICBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZH0gPSBhcmdzO1xuICBjb25zdCB7ZGF0YSwgaW5kaWNlcywgc2VnbWVudElkc30gPSBpbnB1dHM7XG4gIGlmIChkYXRhLnNoYXBlLmxlbmd0aCA8IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBEYXRhIHNob3VsZCBiZSBhdCBsZWFzdCAxIGRpbWVuc2lvbmFsIGJ1dCByZWNlaXZlZCBzY2FsYXJgKTtcbiAgfVxuICBpZiAoaW5kaWNlcy5zaGFwZS5sZW5ndGggIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEluZGljZXMgc2hvdWxkIGJlIGEgdmVjdG9yIGJ1dCByZWNlaXZlZCBzaGFwZVxuICAgICAgICAgICAgICR7aW5kaWNlcy5zaGFwZX1gKTtcbiAgfVxuICBpZiAoc2VnbWVudElkcy5zaGFwZS5sZW5ndGggIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFNlZ21lbnQgaWRzIHNob3VsZCBiZSBhIHZlY3RvciBidXQgcmVjZWl2ZWQgc2hhcGVcbiAgICAgICAgICAgICAke3NlZ21lbnRJZHMuc2hhcGV9YCk7XG4gIH1cblxuICBjb25zdCAkZGF0YSA9IGJhY2tlbmQucmVhZFN5bmMoZGF0YS5kYXRhSWQpIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0ICRpbmRpY2VzID0gYmFja2VuZC5yZWFkU3luYyhpbmRpY2VzLmRhdGFJZCkgYXMgVHlwZWRBcnJheTtcbiAgY29uc3QgJHNlZ21lbnRJZHMgPSBiYWNrZW5kLnJlYWRTeW5jKHNlZ21lbnRJZHMuZGF0YUlkKSBhcyBUeXBlZEFycmF5O1xuXG4gIGNvbnN0IFtvdXRwdXREYXRhLCBvdXRwdXREYXRhU2hhcGVdID0gc3BhcnNlU2VnbWVudFJlZHVjdGlvbkltcGxDUFUoXG4gICAgICAkZGF0YSwgZGF0YS5zaGFwZSwgZGF0YS5kdHlwZSwgJGluZGljZXMsICRzZWdtZW50SWRzKTtcbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0cHV0RGF0YVNoYXBlLCBkYXRhLmR0eXBlLCBvdXRwdXREYXRhKTtcbn1cblxuZXhwb3J0IGNvbnN0IHNwYXJzZVNlZ21lbnRTdW1Db25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogU3BhcnNlU2VnbWVudFN1bSxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHNwYXJzZVNlZ21lbnRTdW0gYXMge30gYXMgS2VybmVsRnVuYyxcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFNwYXJzZVRvRGVuc2UsIFNwYXJzZVRvRGVuc2VBdHRycywgU3BhcnNlVG9EZW5zZUlucHV0cywgVGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7U2NhdHRlclByb2dyYW19IGZyb20gJy4uL3NjYXR0ZXJfZ3B1JztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9SZXNoYXBlJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXJzZVRvRGVuc2UoYXJnczoge1xuICBpbnB1dHM6IFNwYXJzZVRvRGVuc2VJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsXG4gIGF0dHJzOiBTcGFyc2VUb0RlbnNlQXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3NwYXJzZUluZGljZXMsIHNwYXJzZVZhbHVlcywgZGVmYXVsdFZhbHVlfSA9IGlucHV0cztcbiAgY29uc3Qge291dHB1dFNoYXBlfSA9IGF0dHJzO1xuXG4gIGNvbnN0IHtzbGljZVJhbmssIG51bVVwZGF0ZXMsIHN0cmlkZXMsIG91dHB1dFNpemV9ID1cbiAgICAgIGJhY2tlbmRfdXRpbC5jYWxjdWxhdGVTaGFwZXMoc3BhcnNlVmFsdWVzLCBzcGFyc2VJbmRpY2VzLCBvdXRwdXRTaGFwZSk7XG5cbiAgY29uc3Qgc3VtRHVwZUluZGljZXMgPSBmYWxzZTtcbiAgY29uc3QgcHJvZ3JhbSA9IG5ldyBTY2F0dGVyUHJvZ3JhbShcbiAgICAgIG51bVVwZGF0ZXMsIHNsaWNlUmFuaywgc3BhcnNlSW5kaWNlcy5zaGFwZS5sZW5ndGgsXG4gICAgICBzcGFyc2VWYWx1ZXMuc2hhcGUubGVuZ3RoLCBzdHJpZGVzLCBbb3V0cHV0U2l6ZSwgMV0sIHN1bUR1cGVJbmRpY2VzKTtcblxuICBjb25zdCByZXMgPSBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShcbiAgICAgIHByb2dyYW0sIFtzcGFyc2VWYWx1ZXMsIHNwYXJzZUluZGljZXMsIGRlZmF1bHRWYWx1ZV0sIHNwYXJzZVZhbHVlcy5kdHlwZSk7XG5cbiAgY29uc3QgcmVzaGFwZWQgPVxuICAgICAgcmVzaGFwZSh7aW5wdXRzOiB7eDogcmVzfSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogb3V0cHV0U2hhcGV9fSk7XG5cbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZXMpO1xuICByZXR1cm4gcmVzaGFwZWQ7XG59XG5cbmV4cG9ydCBjb25zdCBzcGFyc2VUb0RlbnNlQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFNwYXJzZVRvRGVuc2UsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBzcGFyc2VUb0RlbnNlIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFNwbGl0ViwgU3BsaXRWQXR0cnMsIFNwbGl0VklucHV0cywgVGVuc29ySW5mbywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7c2xpY2V9IGZyb20gJy4vU2xpY2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gc3BsaXRWKFxuICAgIGFyZ3M6XG4gICAgICAgIHtpbnB1dHM6IFNwbGl0VklucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCwgYXR0cnM6IFNwbGl0VkF0dHJzfSk6XG4gICAgVGVuc29ySW5mb1tdIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICBjb25zdCB7bnVtT3JTaXplU3BsaXRzLCBheGlzfSA9IGF0dHJzO1xuXG4gIGNvbnN0ICRheGlzID0gdXRpbC5wYXJzZUF4aXNQYXJhbShheGlzLCB4LnNoYXBlKVswXTtcbiAgY29uc3Qgc3BsaXRTaXplcyA9IGJhY2tlbmRfdXRpbC5wcmVwYXJlU3BsaXRTaXplKHgsIG51bU9yU2l6ZVNwbGl0cywgJGF4aXMpO1xuXG4gIGNvbnN0IHhSYW5rID0geC5zaGFwZS5sZW5ndGg7XG4gIGNvbnN0IGJlZ2luID0gbmV3IEFycmF5KHhSYW5rKS5maWxsKDApO1xuICBjb25zdCBzaXplID0geC5zaGFwZS5zbGljZSgpO1xuXG4gIHJldHVybiBzcGxpdFNpemVzLm1hcChzID0+IHtcbiAgICBjb25zdCBzbGljZVNpemUgPSBbLi4uc2l6ZV07XG4gICAgc2xpY2VTaXplWyRheGlzXSA9IHM7XG4gICAgY29uc3Qgc2xpY2VUID1cbiAgICAgICAgc2xpY2Uoe2lucHV0czoge3h9LCBiYWNrZW5kLCBhdHRyczoge2JlZ2luLCBzaXplOiBzbGljZVNpemV9fSk7XG4gICAgYmVnaW5bJGF4aXNdICs9IHM7XG4gICAgcmV0dXJuIHNsaWNlVDtcbiAgfSk7XG59XG5cbmV4cG9ydCBjb25zdCBzcGxpdFZDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogU3BsaXRWLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogc3BsaXRWIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBTcXJ0fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge3VuYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5pbXBvcnQge3NxcnRJbXBsQ1BVfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcblxuY29uc3QgU1FSVCA9IGByZXR1cm4gc3FydCh4KTtgO1xuXG5leHBvcnQgY29uc3Qgc3FydCA9IHVuYXJ5S2VybmVsRnVuYyhcbiAgICB7b3BTbmlwcGV0OiBTUVJULCBwYWNrZWRPcFNuaXBwZXQ6IFNRUlQsIGNwdUtlcm5lbEltcGw6IHNxcnRJbXBsQ1BVfSk7XG5cbmV4cG9ydCBjb25zdCBzcXJ0Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFNxcnQsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBzcXJ0IGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBTcXVhcmV9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcblxuY29uc3QgU1FVQVJFID0gYHJldHVybiB4ICogeDtgO1xuXG5leHBvcnQgY29uc3Qgc3F1YXJlID0gdW5hcnlLZXJuZWxGdW5jKHtvcFNuaXBwZXQ6IFNRVUFSRX0pO1xuXG5leHBvcnQgY29uc3Qgc3F1YXJlQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFNxdWFyZSxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHNxdWFyZSxcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBTcXVhcmVkRGlmZmVyZW5jZX0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtiaW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcblxuY29uc3QgU1FVQVJFRF9ESUZGRVJFTkNFID0gJ3JldHVybiAoYSAtIGIpICogKGEgLSBiKTsnO1xuXG5leHBvcnQgY29uc3Qgc3F1YXJlZERpZmZlcmVuY2UgPSBiaW5hcnlLZXJuZWxGdW5jKFxuICAgIHtvcFNuaXBwZXQ6IFNRVUFSRURfRElGRkVSRU5DRSwgcGFja2VkT3BTbmlwcGV0OiBTUVVBUkVEX0RJRkZFUkVOQ0V9KTtcblxuZXhwb3J0IGNvbnN0IHNxdWFyZWREaWZmZXJlbmNlQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFNxdWFyZWREaWZmZXJlbmNlLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogc3F1YXJlZERpZmZlcmVuY2UsXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgU3RlcCwgU3RlcEF0dHJzLCBUZW5zb3JJbmZvLCBVbmFyeUlucHV0c30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7Q0hFQ0tfTkFOX1NOSVBQRVQsIFVuYXJ5T3BQcm9ncmFtfSBmcm9tICcuLi91bmFyeW9wX2dwdSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzdGVwKFxuICAgIHtpbnB1dHMsIGF0dHJzLCBiYWNrZW5kfTpcbiAgICAgICAge2lucHV0czogVW5hcnlJbnB1dHMsIGF0dHJzOiBTdGVwQXR0cnMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0x9KTpcbiAgICBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICBjb25zdCBvcFNuaXBwZXQgPSBDSEVDS19OQU5fU05JUFBFVCArIGBcbiAgICByZXR1cm4geCA+IDAuMCA/IDEuMCA6IGZsb2F0KCR7YXR0cnMuYWxwaGF9KTtcbiAgYDtcblxuICBjb25zdCBwcm9ncmFtID0gbmV3IFVuYXJ5T3BQcm9ncmFtKHguc2hhcGUsIG9wU25pcHBldCk7XG5cbiAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFt4XSwgeC5kdHlwZSk7XG59XG5cbmV4cG9ydCBjb25zdCBzdGVwQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFN0ZXAsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBzdGVwIGFzIHt9IGFzIEtlcm5lbEZ1bmMsXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2J1ZmZlciwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBSYW5rLCBzbGljZV91dGlsLCBTdHJpZGVkU2xpY2UsIFN0cmlkZWRTbGljZUF0dHJzLCBTdHJpZGVkU2xpY2VJbnB1dHMsIFRlbnNvckJ1ZmZlciwgVGVuc29ySW5mbywgVHlwZWRBcnJheX0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7c3RyaWRlZFNsaWNlSW1wbENQVX0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5pbXBvcnQge1N0cmlkZWRTbGljZVByb2dyYW19IGZyb20gJy4uL3N0cmlkZWRfc2xpY2VfZ3B1JztcblxuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL1Jlc2hhcGUnO1xuaW1wb3J0IHtzbGljZX0gZnJvbSAnLi9TbGljZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzdHJpZGVkU2xpY2UoYXJnczoge1xuICBpbnB1dHM6IFN0cmlkZWRTbGljZUlucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IFN0cmlkZWRTbGljZUF0dHJzXG59KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4fSA9IGlucHV0cztcbiAgY29uc3Qge1xuICAgIGJlZ2luLFxuICAgIGVuZCxcbiAgICBzdHJpZGVzLFxuICAgIGJlZ2luTWFzayxcbiAgICBlbmRNYXNrLFxuICAgIGVsbGlwc2lzTWFzayxcbiAgICBuZXdBeGlzTWFzayxcbiAgICBzaHJpbmtBeGlzTWFza1xuICB9ID0gYXR0cnM7XG5cbiAgY29uc3Qge25vblN0cmlkZWQsICRiZWdpbiwgJHN0cmlkZXMsIHNpemUsIG5ld1NoYXBlLCBvdXRTaGFwZX0gPVxuICAgICAgc2xpY2VfdXRpbC5zbGljZUluZm8oXG4gICAgICAgICAgeC5zaGFwZSwgYmVnaW4sIGVuZCwgc3RyaWRlcywgYmVnaW5NYXNrLCBlbmRNYXNrLCBlbGxpcHNpc01hc2ssXG4gICAgICAgICAgbmV3QXhpc01hc2ssIHNocmlua0F4aXNNYXNrKTtcblxuICBjb25zdCAkeCA9IHJlc2hhcGUoe2lucHV0czoge3h9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBuZXdTaGFwZX19KTtcblxuICBsZXQgcmVzdWx0O1xuICBpZiAobm9uU3RyaWRlZCkge1xuICAgIGNvbnN0IHNsaWNlZCA9XG4gICAgICAgIHNsaWNlKHtpbnB1dHM6IHt4OiAkeH0sIGJhY2tlbmQsIGF0dHJzOiB7YmVnaW46ICRiZWdpbiwgc2l6ZX19KTtcbiAgICByZXN1bHQgPSByZXNoYXBlKHtpbnB1dHM6IHt4OiBzbGljZWR9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBvdXRTaGFwZX19KTtcblxuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oc2xpY2VkKTtcbiAgfSBlbHNlIGlmIChvdXRTaGFwZS5zb21lKGF4aXMgPT4gYXhpcyA9PT0gMCkpIHtcbiAgICByZXN1bHQgPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dFNoYXBlLCB4LmR0eXBlLCBbXSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3Qgc2hvdWxkRXhlY3V0ZU9uQ1BVID0gYmFja2VuZC5zaG91bGRFeGVjdXRlT25DUFUoWyR4XSk7XG4gICAgaWYgKHNob3VsZEV4ZWN1dGVPbkNQVSkge1xuICAgICAgY29uc3QgeFRleERhdGEgPSBiYWNrZW5kLnRleERhdGEuZ2V0KCR4LmRhdGFJZCk7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB4VGV4RGF0YS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcbiAgICAgIGNvbnN0IHhCdWYgPSBidWZmZXIoJHguc2hhcGUsICR4LmR0eXBlLCB2YWx1ZXMpIGFzIFRlbnNvckJ1ZmZlcjxSYW5rPjtcbiAgICAgIGNvbnN0IHJlc3VsdFZhbHVlcyA9XG4gICAgICAgICAgc3RyaWRlZFNsaWNlSW1wbENQVShvdXRTaGFwZSwgeEJ1ZiwgJHN0cmlkZXMsICRiZWdpbik7XG4gICAgICByZXN1bHQgPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dFNoYXBlLCAkeC5kdHlwZSwgcmVzdWx0VmFsdWVzLnZhbHVlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHByb2dyYW0gPSBuZXcgU3RyaWRlZFNsaWNlUHJvZ3JhbSgkYmVnaW4sICRzdHJpZGVzLCBvdXRTaGFwZSk7XG4gICAgICByZXN1bHQgPSBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbJHhdLCAkeC5kdHlwZSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcmVzdWx0UmVzaGFwZWQgPVxuICAgICAgcmVzaGFwZSh7aW5wdXRzOiB7eDogcmVzdWx0fSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogb3V0U2hhcGV9fSk7XG5cbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbygkeCk7XG4gIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVzdWx0KTtcblxuICByZXR1cm4gcmVzdWx0UmVzaGFwZWQ7XG59XG5cbmV4cG9ydCBjb25zdCBzdHJpZGVkU2xpY2VDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogU3RyaWRlZFNsaWNlLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogc3RyaWRlZFNsaWNlIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBTdHJpbmdOR3JhbXMsIFN0cmluZ05HcmFtc0F0dHJzLCBTdHJpbmdOR3JhbXNJbnB1dHMsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge3N0cmluZ05HcmFtc0ltcGxDUFV9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuXG5leHBvcnQgZnVuY3Rpb24gc3RyaW5nTkdyYW1zKGFyZ3M6IHtcbiAgaW5wdXRzOiBTdHJpbmdOR3JhbXNJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsXG4gIGF0dHJzOiBTdHJpbmdOR3JhbXNBdHRyc1xufSk6IFtUZW5zb3JJbmZvLCBUZW5zb3JJbmZvXSB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHtcbiAgICBzZXBhcmF0b3IsXG4gICAgbkdyYW1XaWR0aHMsXG4gICAgbGVmdFBhZCxcbiAgICByaWdodFBhZCxcbiAgICBwYWRXaWR0aCxcbiAgICBwcmVzZXJ2ZVNob3J0U2VxdWVuY2VzXG4gIH0gPSBhdHRycztcbiAgY29uc3Qge2RhdGEsIGRhdGFTcGxpdHN9ID0gaW5wdXRzO1xuICBjb25zdCAkZGF0YSA9IGJhY2tlbmQucmVhZFN5bmMoZGF0YS5kYXRhSWQpIGFzIFVpbnQ4QXJyYXlbXTtcbiAgY29uc3QgJGRhdGFTcGxpdHMgPSBiYWNrZW5kLnJlYWRTeW5jKGRhdGFTcGxpdHMuZGF0YUlkKSBhcyBJbnQzMkFycmF5O1xuXG4gIGNvbnN0IFtuR3JhbXMsIG5HcmFtc1NwbGl0c10gPSBzdHJpbmdOR3JhbXNJbXBsQ1BVKFxuICAgICAgJGRhdGEsICRkYXRhU3BsaXRzLCBzZXBhcmF0b3IsIG5HcmFtV2lkdGhzLCBsZWZ0UGFkLCByaWdodFBhZCwgcGFkV2lkdGgsXG4gICAgICBwcmVzZXJ2ZVNob3J0U2VxdWVuY2VzKTtcbiAgcmV0dXJuIFtcbiAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtuR3JhbXMubGVuZ3RoXSwgJ3N0cmluZycsIG5HcmFtcyksXG4gICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhkYXRhU3BsaXRzLnNoYXBlLCAnaW50MzInLCBuR3JhbXNTcGxpdHMpLFxuICBdO1xufVxuXG5leHBvcnQgY29uc3Qgc3RyaW5nTkdyYW1zQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFN0cmluZ05HcmFtcyxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHN0cmluZ05HcmFtcyBhcyB7fSBhcyBLZXJuZWxGdW5jLFxufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFN0cmluZ1NwbGl0LCBTdHJpbmdTcGxpdEF0dHJzLCBTdHJpbmdTcGxpdElucHV0cywgVGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7c3RyaW5nU3BsaXRJbXBsQ1BVfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcblxuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ1NwbGl0KGFyZ3M6IHtcbiAgaW5wdXRzOiBTdHJpbmdTcGxpdElucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IFN0cmluZ1NwbGl0QXR0cnNcbn0pOiBbVGVuc29ySW5mbywgVGVuc29ySW5mbywgVGVuc29ySW5mb10ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7c2tpcEVtcHR5fSA9IGF0dHJzO1xuICBjb25zdCB7aW5wdXQsIGRlbGltaXRlcn0gPSBpbnB1dHM7XG5cbiAgaWYgKGlucHV0LmR0eXBlICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBFcnJvcignSW5wdXQgbXVzdCBiZSBvZiBkYXRhdHlwZSBzdHJpbmcnKTtcbiAgfVxuICBpZiAoaW5wdXQuc2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnB1dCBtdXN0IGJlIGEgdmVjdG9yLCBnb3Qgc2hhcGU6ICR7aW5wdXQuc2hhcGV9YCk7XG4gIH1cbiAgaWYgKGRlbGltaXRlci5zaGFwZS5sZW5ndGggIT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBEZWxpbWl0ZXIgbXVzdCBiZSBhIHNjYWxhciwgZ290IHNoYXBlOiAke2RlbGltaXRlci5zaGFwZX1gKTtcbiAgfVxuXG4gIGNvbnN0ICRpbnB1dCA9IGJhY2tlbmQucmVhZFN5bmMoaW5wdXQuZGF0YUlkKSBhcyBVaW50OEFycmF5W107XG4gIGNvbnN0ICRkZWxpbWl0ZXIgPSBiYWNrZW5kLnJlYWRTeW5jKGRlbGltaXRlci5kYXRhSWQpWzBdIGFzIFVpbnQ4QXJyYXk7XG5cbiAgY29uc3QgW2luZGljZXMsIHZhbHVlcywgc2hhcGVdID1cbiAgICAgIHN0cmluZ1NwbGl0SW1wbENQVSgkaW5wdXQsICRkZWxpbWl0ZXIsIHNraXBFbXB0eSk7XG4gIGNvbnN0IG91dHB1dFNpemUgPSB2YWx1ZXMubGVuZ3RoO1xuICByZXR1cm4gW1xuICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oW291dHB1dFNpemUsIDJdLCAnaW50MzInLCBpbmRpY2VzKSxcbiAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtvdXRwdXRTaXplXSwgJ3N0cmluZycsIHZhbHVlcyksXG4gICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhbMl0sICdpbnQzMicsIG5ldyBJbnQzMkFycmF5KHNoYXBlKSlcbiAgXTtcbn1cblxuZXhwb3J0IGNvbnN0IHN0cmluZ1NwbGl0Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFN0cmluZ1NwbGl0LFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogc3RyaW5nU3BsaXQgYXMge30gYXMgS2VybmVsRnVuYyxcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBTdHJpbmdUb0hhc2hCdWNrZXRGYXN0LCBTdHJpbmdUb0hhc2hCdWNrZXRGYXN0QXR0cnMsIFN0cmluZ1RvSGFzaEJ1Y2tldEZhc3RJbnB1dHMsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge3N0cmluZ1RvSGFzaEJ1Y2tldEZhc3RJbXBsQ1BVfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcblxuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ1RvSGFzaEJ1Y2tldEZhc3QoYXJnczoge1xuICBpbnB1dHM6IFN0cmluZ1RvSGFzaEJ1Y2tldEZhc3RJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsXG4gIGF0dHJzOiBTdHJpbmdUb0hhc2hCdWNrZXRGYXN0QXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge251bUJ1Y2tldHN9ID0gYXR0cnM7XG4gIGNvbnN0IHtpbnB1dH0gPSBpbnB1dHM7XG5cbiAgaWYgKGlucHV0LmR0eXBlICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBFcnJvcignSW5wdXQgbXVzdCBiZSBvZiBkYXRhdHlwZSBzdHJpbmcnKTtcbiAgfVxuICBpZiAobnVtQnVja2V0cyA8PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBOdW1iZXIgb2YgYnVja2V0cyBtdXN0IGJlIGF0IGxlYXN0IDFgKTtcbiAgfVxuXG4gIGNvbnN0ICRpbnB1dCA9IGJhY2tlbmQucmVhZFN5bmMoaW5wdXQuZGF0YUlkKSBhcyBVaW50OEFycmF5W107XG5cbiAgY29uc3Qgb3V0cHV0ID0gc3RyaW5nVG9IYXNoQnVja2V0RmFzdEltcGxDUFUoJGlucHV0LCBudW1CdWNrZXRzKTtcbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oaW5wdXQuc2hhcGUsICdpbnQzMicsIG91dHB1dCk7XG59XG5cbmV4cG9ydCBjb25zdCBzdHJpbmdUb0hhc2hCdWNrZXRGYXN0Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFN0cmluZ1RvSGFzaEJ1Y2tldEZhc3QsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBzdHJpbmdUb0hhc2hCdWNrZXRGYXN0IGFzIHt9IGFzIEtlcm5lbEZ1bmMsXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgU3VifSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge2JpbmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuaW1wb3J0IHtzdWJJbXBsQ1BVIGFzIGNwdVN1Yn0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5cbmNvbnN0IFNVQiA9ICdyZXR1cm4gYSAtIGI7JztcblxuZXhwb3J0IGNvbnN0IHN1YiA9IGJpbmFyeUtlcm5lbEZ1bmMoe1xuICBvcFNuaXBwZXQ6IFNVQixcbiAgcGFja2VkT3BTbmlwcGV0OiBTVUIsXG4gIHN1cHBvcnRzQ29tcGxleDogdHJ1ZSxcbiAgY3B1S2VybmVsSW1wbDogY3B1U3ViXG59KTtcblxuZXhwb3J0IGNvbnN0IHN1YkNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBTdWIsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBzdWJcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBTdW0sIFN1bUF0dHJzLCBTdW1JbnB1dHN9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5cbmltcG9ydCB7c3VtSW1wbH0gZnJvbSAnLi9TdW1faW1wbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzdW0oXG4gICAgYXJnczoge2lucHV0czogU3VtSW5wdXRzLCBhdHRyczogU3VtQXR0cnMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0x9KSB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG5cbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICBjb25zdCB7YXhpcywga2VlcERpbXN9ID0gYXR0cnM7XG5cbiAgcmV0dXJuIHN1bUltcGwoeCwgYXhpcywga2VlcERpbXMsIGJhY2tlbmQpO1xufVxuXG5leHBvcnQgY29uc3Qgc3VtQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFN1bSxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHN1bSBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgc3VtT3V0VHlwZSwgVGVuc29ySW5mbywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7cmVkdWNlfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvcmVkdWNlJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9SZXNoYXBlJztcblxuaW1wb3J0IHt0cmFuc3Bvc2VJbXBsfSBmcm9tICcuL1RyYW5zcG9zZV9pbXBsJztcblxuZXhwb3J0IGZ1bmN0aW9uIHN1bUltcGwoXG4gICAgeDogVGVuc29ySW5mbywgYXhpczogbnVtYmVyfG51bWJlcltdLCBrZWVwRGltczogYm9vbGVhbixcbiAgICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMKTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHJlZHVjdGlvbkluZGljZXMgPSBheGlzO1xuXG4gIGNvbnN0IHhSYW5rID0geC5zaGFwZS5sZW5ndGg7XG5cbiAgY29uc3Qgb3JpZ0F4ZXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKHJlZHVjdGlvbkluZGljZXMsIHguc2hhcGUpO1xuICBsZXQgYXhlcyA9IG9yaWdBeGVzO1xuICBjb25zdCBwZXJtdXRlZEF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0QXhlc1Blcm11dGF0aW9uKGF4ZXMsIHhSYW5rKTtcbiAgY29uc3Qgc3VtSW5wdXRJc1RyYW5zcG9zZWQgPSBwZXJtdXRlZEF4ZXMgIT0gbnVsbDtcblxuICBsZXQgc3VtSW5wdXQgPSB4O1xuICBpZiAoc3VtSW5wdXRJc1RyYW5zcG9zZWQpIHtcbiAgICBzdW1JbnB1dCA9IHRyYW5zcG9zZUltcGwoeCwgcGVybXV0ZWRBeGVzLCBiYWNrZW5kKTtcblxuICAgIGF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0SW5uZXJNb3N0QXhlcyhheGVzLmxlbmd0aCwgeFJhbmspO1xuICB9XG5cbiAgYmFja2VuZF91dGlsLmFzc2VydEF4ZXNBcmVJbm5lck1vc3REaW1zKCdzdW0nLCBheGVzLCB4UmFuayk7XG4gIGNvbnN0IFtzdW1PdXRTaGFwZSwgcmVkdWNlU2hhcGVdID1cbiAgICAgIGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0QW5kUmVkdWNlU2hhcGVzKHN1bUlucHV0LnNoYXBlLCBheGVzKTtcblxuICBsZXQgb3V0U2hhcGUgPSBzdW1PdXRTaGFwZTtcbiAgaWYgKGtlZXBEaW1zKSB7XG4gICAgLy8gcmF0aGVyIHRoYW4gcmVzaGFwZSBhdCB0aGUgZW5kLCBzZXQgdGhlIHRhcmdldCBzaGFwZSBoZXJlLlxuICAgIG91dFNoYXBlID0gYmFja2VuZF91dGlsLmV4cGFuZFNoYXBlVG9LZWVwRGltKHN1bU91dFNoYXBlLCBvcmlnQXhlcyk7XG4gIH1cblxuICBjb25zdCBpblNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUocmVkdWNlU2hhcGUpO1xuICBjb25zdCB4U2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZSh4LnNoYXBlKTtcbiAgY29uc3QgYmF0Y2hTaXplID0geFNpemUgLyBpblNpemU7XG4gIGNvbnN0IHJlc2hhcGVkSW5wdXQgPSByZXNoYXBlKFxuICAgICAge2lucHV0czoge3g6IHN1bUlucHV0fSwgYXR0cnM6IHtzaGFwZTogW2JhdGNoU2l6ZSwgaW5TaXplXX0sIGJhY2tlbmR9KTtcblxuICBjb25zdCBvdXRUeXBlID0gc3VtT3V0VHlwZSh4LmR0eXBlKTtcblxuICBjb25zdCByZWR1Y2VkID0gcmVkdWNlKHJlc2hhcGVkSW5wdXQsIG91dFR5cGUsICdzdW0nLCBiYWNrZW5kKTtcbiAgY29uc3Qgb3V0ID1cbiAgICAgIHJlc2hhcGUoe2lucHV0czoge3g6IHJlZHVjZWR9LCBhdHRyczoge3NoYXBlOiBvdXRTaGFwZX0sIGJhY2tlbmR9KTtcblxuICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlc2hhcGVkSW5wdXQpO1xuICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlZHVjZWQpO1xuICBpZiAoc3VtSW5wdXRJc1RyYW5zcG9zZWQpIHtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHN1bUlucHV0KTtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBUYW59IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcblxuY29uc3QgVEFOID0gYHJldHVybiB0YW4oeCk7YDtcblxuZXhwb3J0IGNvbnN0IHRhbiA9IHVuYXJ5S2VybmVsRnVuYyh7b3BTbmlwcGV0OiBUQU59KTtcblxuZXhwb3J0IGNvbnN0IHRhbkNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBUYW4sXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiB0YW4sXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgVGFuaH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcblxuY29uc3QgVEFOSCA9IGBcbiAgZmxvYXQgZTJ4ID0gZXhwKC0yLjAgKiBhYnMoeCkpO1xuICByZXR1cm4gc2lnbih4KSAqICgxLjAgLSBlMngpIC8gKDEuMCArIGUyeCk7XG5gO1xuXG5leHBvcnQgY29uc3QgdGFuaCA9IHVuYXJ5S2VybmVsRnVuYyh7b3BTbmlwcGV0OiBUQU5IfSk7XG5cbmV4cG9ydCBjb25zdCB0YW5oQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFRhbmgsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiB0YW5oLFxufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtidWZmZXIsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mbywgVGlsZSwgVGlsZUF0dHJzLCBUaWxlSW5wdXRzLCBUeXBlZEFycmF5LCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHt0aWxlSW1wbENQVX0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5pbXBvcnQge1RpbGVQcm9ncmFtfSBmcm9tICcuLi90aWxlX2dwdSc7XG5cbmV4cG9ydCBmdW5jdGlvbiB0aWxlKFxuICAgIHBhcmFtczoge2lucHV0czogVGlsZUlucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCwgYXR0cnM6IFRpbGVBdHRyc30pOlxuICAgIFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBwYXJhbXM7XG4gIGNvbnN0IHt4fSA9IGlucHV0cztcbiAgY29uc3Qge3JlcHN9ID0gYXR0cnM7XG5cbiAgLy8gdGlsZSBncHUgcHJvZ3JhbSBjYW5ub3QgaGFuZGxlIHJhbmsgPiA1IGNhc2UuXG4gIGlmICh4LmR0eXBlID09PSAnc3RyaW5nJyB8fCB4LnNoYXBlLmxlbmd0aCA+IDUpIHtcbiAgICAvLyBFdmVuIHRob3VnaHQgc3RyaW5nIHRlbnNvciBpcyBhbHdheXMgb24gQ1BVLCBqdXN0IHRvIGJlIGNvbnNpc3RlbnQgb24gaG93XG4gICAgLy8gdG8gYWNjZXNzIHRlbnNvciBkYXRhLlxuICAgIGNvbnN0IGRhdGEgPSBiYWNrZW5kLnJlYWRTeW5jKHguZGF0YUlkKTtcbiAgICBjb25zdCB2YWx1ZSA9IHguZHR5cGUgPT09ICdzdHJpbmcnID9cbiAgICAgICAgKGRhdGEgYXMgVWludDhBcnJheVtdKS5tYXAoZCA9PiB1dGlsLmRlY29kZVN0cmluZyhkKSkgOlxuICAgICAgICBkYXRhIGFzIFR5cGVkQXJyYXk7XG4gICAgY29uc3QgYnVmID0gYnVmZmVyKHguc2hhcGUsIHguZHR5cGUsIHZhbHVlKTtcbiAgICBjb25zdCBvdXRCdWYgPSB0aWxlSW1wbENQVShidWYsIHJlcHMpO1xuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dEJ1Zi5zaGFwZSwgb3V0QnVmLmR0eXBlLCBvdXRCdWYudmFsdWVzKTtcbiAgfVxuXG4gIGNvbnN0IHByb2dyYW0gPSBuZXcgVGlsZVByb2dyYW0oeC5zaGFwZSwgcmVwcyk7XG4gIGNvbnN0IG91dHB1dCA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFt4XSwgeC5kdHlwZSk7XG5cbiAgcmV0dXJuIG91dHB1dDtcbn1cblxuZXhwb3J0IGNvbnN0IHRpbGVDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogVGlsZSxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHRpbGUgYXMge30gYXMgS2VybmVsRnVuYyxcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7ZW52LCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIE51bWVyaWNEYXRhVHlwZSwgVGVuc29ySW5mbywgVG9wSywgVG9wS0F0dHJzLCBUb3BLSW5wdXRzLCBUeXBlZEFycmF5LCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHt0b3BLSW1wbENQVX0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5pbXBvcnQge01lcmdlUHJvZ3JhbSwgU3dhcFByb2dyYW19IGZyb20gJy4uL3RvcF9rX2dwdSc7XG5pbXBvcnQge2ZpbGx9IGZyb20gJy4vRmlsbCc7XG5pbXBvcnQge2dhdGhlclYyfSBmcm9tICcuL0dhdGhlclYyJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9SZXNoYXBlJztcbmltcG9ydCB7c2xpY2V9IGZyb20gJy4vU2xpY2UnO1xuXG5mdW5jdGlvbiBkaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mb09yTnVsbChcbiAgICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLCB0ZW5zb3JJbmZvOiBUZW5zb3JJbmZvKSB7XG4gIGlmICh0ZW5zb3JJbmZvICE9PSBudWxsKSB7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh0ZW5zb3JJbmZvKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByb3VuZFVwVG9Qb3cyKG51bTogbnVtYmVyKSB7XG4gIGxldCBwb3cyID0gMTtcbiAgd2hpbGUgKHBvdzIgPCBudW0pIHtcbiAgICBwb3cyICo9IDI7XG4gIH1cbiAgcmV0dXJuIHBvdzI7XG59XG5cbi8vIEJhc2VkIG9uIEFsZ29yaXRobSAyIG9mIEJpdG9uaWMgVG9wIEssIHJlZjpcbi8vIGh0dHBzOi8vYW5pbHNoYW5iaGFnLmluL3N0YXRpYy9wYXBlcnMvZ3B1dG9wa19zaWdtb2QxOC5wZGZcbmV4cG9ydCBmdW5jdGlvbiB0b3BLKFxuICAgIGFyZ3M6IHtpbnB1dHM6IFRvcEtJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsIGF0dHJzOiBUb3BLQXR0cnN9KTpcbiAgICBUZW5zb3JJbmZvW10ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG4gIGNvbnN0IHtrLCBzb3J0ZWR9ID0gYXR0cnM7XG5cbiAgLy8gRW1waXJpY2FsbHkgZGV0ZXJtaW5lZCBjb25zdGFudCB1c2VkIHRvIGRldGVybWluZSBsYXN0IGRpbSB0aHJlc2hvbGQgZm9yXG4gIC8vIGhhbmRpbmcgb2ZmIGV4ZWN1dGlvbiB0byB0aGUgQ1BVLlxuICBjb25zdCBUT1BLX0xBU1RfRElNX0NQVV9IQU5ET0ZGX1NJWkVfVEhSRVNIT0xEID1cbiAgICAgIGVudigpLmdldE51bWJlcignVE9QS19MQVNUX0RJTV9DUFVfSEFORE9GRl9TSVpFX1RIUkVTSE9MRCcpO1xuXG4gIC8vIEVtcGlyaWNhbGx5IGRldGVybWluZWQgY29uc3RhbnQgdXNlZCB0byBkZXRlcm1pbmUgayB0aHJlc2hvbGQgZm9yIGhhbmRpbmdcbiAgLy8gb2ZmIGV4ZWN1dGlvbiB0byB0aGUgQ1BVLlxuICBjb25zdCBUT1BLX0tfQ1BVX0hBTkRPRkZfVEhSRVNIT0xEID1cbiAgICAgIGVudigpLmdldE51bWJlcignVE9QS19LX0NQVV9IQU5ET0ZGX1RIUkVTSE9MRCcpO1xuXG4gIGNvbnN0IHhTaGFwZSA9IHguc2hhcGU7XG4gIGNvbnN0IGxhc3REaW0gPSB4U2hhcGVbeFNoYXBlLmxlbmd0aCAtIDFdO1xuXG4gIGlmIChiYWNrZW5kLnNob3VsZEV4ZWN1dGVPbkNQVShbeF0pIHx8XG4gICAgICBsYXN0RGltIDwgVE9QS19MQVNUX0RJTV9DUFVfSEFORE9GRl9TSVpFX1RIUkVTSE9MRCB8fFxuICAgICAgayA+IFRPUEtfS19DUFVfSEFORE9GRl9USFJFU0hPTEQpIHtcbiAgICBjb25zdCB4VmFscyA9IGJhY2tlbmQucmVhZFN5bmMoeC5kYXRhSWQpIGFzIFR5cGVkQXJyYXk7XG4gICAgY29uc3QgW2FsbFRvcEtWYWxzLCBhbGxUb3BLSW5kaWNlc10gPVxuICAgICAgICB0b3BLSW1wbENQVSh4VmFscywgeFNoYXBlLCB4LmR0eXBlIGFzIE51bWVyaWNEYXRhVHlwZSwgaywgc29ydGVkKTtcblxuICAgIHJldHVybiBbXG4gICAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFxuICAgICAgICAgIGFsbFRvcEtWYWxzLnNoYXBlLCBhbGxUb3BLVmFscy5kdHlwZSwgYWxsVG9wS1ZhbHMudmFsdWVzKSxcbiAgICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oXG4gICAgICAgICAgYWxsVG9wS0luZGljZXMuc2hhcGUsIGFsbFRvcEtJbmRpY2VzLmR0eXBlLCBhbGxUb3BLSW5kaWNlcy52YWx1ZXMpXG4gICAgXTtcbiAgfVxuXG4gIGlmIChrID09PSAwKSB7XG4gICAgeFNoYXBlW3hTaGFwZS5sZW5ndGggLSAxXSA9IDA7XG4gICAgcmV0dXJuIFtcbiAgICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oeFNoYXBlLCB4LmR0eXBlLCBbXSksXG4gICAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHhTaGFwZSwgJ2ludDMyJywgW10pXG4gICAgXTtcbiAgfVxuXG4gIGlmIChsYXN0RGltID09PSAxIC8qIGZpcnN0UGFzcyAqLykge1xuICAgIHJldHVybiBbXG4gICAgICB4LCBmaWxsKHthdHRyczoge3NoYXBlOiB4U2hhcGUsIGR0eXBlOiAnaW50MzInLCB2YWx1ZTogMH0sIGJhY2tlbmR9KVxuICAgIF07XG4gIH1cblxuICAvLyBFYWdlcmx5IHVucGFjayB4IGlucHV0IHNpbmNlIGl0IGlzIHBhc3NlZCBpbiB0byBhbGwgdGhlIHNoYWRlcnMgd2hpY2hcbiAgLy8gcmVxdWlyZSB1bnBhY2tlZCBpbnB1dHMuXG4gIGNvbnN0IHh0ZXhEYXRhID0gYmFja2VuZC50ZXhEYXRhLmdldCh4LmRhdGFJZCk7XG4gIGNvbnN0IHhJc1BhY2tlZCA9IHh0ZXhEYXRhICE9PSBudWxsICYmIHh0ZXhEYXRhLmlzUGFja2VkO1xuICBjb25zdCB4VW5QYWNrZWQgPSB4SXNQYWNrZWQgPyBiYWNrZW5kLnVucGFja1RlbnNvcih4KSA6IHg7XG5cbiAgLy8gUmVzaGFwZSBpbnRvIGEgMmQgdGVuc29yIFtiYXRjaCwgbGFzdERpbV0gYW5kIGNvbXB1dGUgdG9wayBhbG9uZyBsYXN0RGltLlxuICBjb25zdCB4U2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZSh4U2hhcGUpO1xuICBjb25zdCBiYXRjaCA9IHhTaXplIC8gbGFzdERpbTtcbiAgY29uc3QgeDJEID0gcmVzaGFwZShcbiAgICAgIHtpbnB1dHM6IHt4OiB4VW5QYWNrZWR9LCBhdHRyczoge3NoYXBlOiBbYmF0Y2gsIGxhc3REaW1dfSwgYmFja2VuZH0pO1xuXG4gIGlmICh4SXNQYWNrZWQpIHtcbiAgICBkaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mb09yTnVsbChiYWNrZW5kLCB4VW5QYWNrZWQpO1xuICB9XG5cbiAgY29uc3Qga1BvdzIgPSByb3VuZFVwVG9Qb3cyKGspO1xuICBjb25zdCBsYXN0RGltUG93MiA9IHJvdW5kVXBUb1BvdzIobGFzdERpbSk7XG5cbiAgLy8gT25seSB0aGUgaW5kaWNlcyBjb250YWluaW5nIHRoZSB0b3AgSyBhcmUga2VwdCBhdCBldmVyeSBzdGVwIHRvIHJlZHVjZVxuICAvLyBudW1iZXIgb2Ygb3V0cHV0cyBpbiB0aGUgR1BVIGFsZ29yaXRobXMsIHNvIG9uY2UgdGhlIGZpbmFsIHNldCBvZiBpbmRpY2VzXG4gIC8vIGlzIGNvbXB1dGVkIHRoZW4gZ2F0aGVyIGlzIHVzZWQgdG8gZ3JhYiB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZXNcbiAgLy8gZnJvbSB0aGUgb3JpZ2luYWwgaW5wdXQuXG4gIGxldCBpbmRpY2VzOiBUZW5zb3JJbmZvID0gbnVsbDtcblxuICAvLyBHUFUgYWxnb3JpdGhtIGFsd2F5cyB0YWtlcyBpbiBhbiBpbmRpY2VzIGlucHV0IGJ1dCB0aGlzIGlucHV0IGlzIG5vdCB1c2VkXG4gIC8vIG9uIHRoZSBmaXJzdCBydW4gb2YgYSBHUFUgYWxnb3JpdGhtLCB0aGVyZWZvcmUgaWYgaW5kaWNlcyBpcyBudWxsIHdlIHNpbXBseVxuICAvLyBwYXNzIGluIHgyRCBpbnN0ZWFkIG9mIGl0IGJ1dCB0aGUgdmFsdWUgd2lsbCBub3QgYWN0dWFsbHkgYmUgdXNlZFxuICBjb25zdCBnZXRJbnB1dHMgPSAoKSA9PiBpbmRpY2VzID09PSBudWxsID8gW3gyRCwgeDJEXSA6IFt4MkQsIGluZGljZXNdO1xuXG4gIGNvbnN0IHJ1blN3YXAgPSAoZGlyOiBudW1iZXIsIGluYzogbnVtYmVyLCBzaGFwZTogbnVtYmVyW10pID0+IHtcbiAgICBjb25zdCBpbnB1dHMgPSBnZXRJbnB1dHMoKTtcbiAgICBjb25zdCBwcm9ncmFtID0gbmV3IFN3YXBQcm9ncmFtKHNoYXBlKTtcbiAgICBjb25zdCBmaXN0UGFzcyA9IGluZGljZXMgPT09IG51bGwgPyAxIDogMDtcbiAgICBjb25zdCBjdXN0b21WYWx1ZXMgPVxuICAgICAgICBbW2xhc3REaW1dLCBbZmlzdFBhc3NdLCBbTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZXSwgW2Rpcl0sIFtpbmNdXTtcbiAgICBjb25zdCBwcmV2SW5kaWNlcyA9IGluZGljZXM7XG4gICAgaW5kaWNlcyA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIGlucHV0cywgJ2ludDMyJywgY3VzdG9tVmFsdWVzKTtcbiAgICBkaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mb09yTnVsbChiYWNrZW5kLCBwcmV2SW5kaWNlcyk7XG4gIH07XG5cbiAgLy8gU3RlcCAxOiBsb2NhbCBzb3J0XG4gIGZvciAobGV0IGxlbiA9IDE7IGxlbiA8IGtQb3cyOyBsZW4gKj0gMikge1xuICAgIGNvbnN0IGRpciA9IGxlbiAqIDI7XG4gICAgZm9yIChsZXQgaW5jID0gbGVuOyBpbmMgPj0gMTsgaW5jIC89IDIpIHtcbiAgICAgIHJ1blN3YXAoZGlyLCBpbmMsIFtiYXRjaCwgbGFzdERpbVBvdzJdKTtcbiAgICB9XG4gIH1cblxuICAvLyBTdGVwIDI6IG1lcmdlXG4gIGZvciAobGV0IGluZGljZXNTaXplID0gbGFzdERpbVBvdzI7IGluZGljZXNTaXplID4ga1BvdzI7IGluZGljZXNTaXplIC89IDIpIHtcbiAgICBjb25zdCBpbnB1dHMgPSBnZXRJbnB1dHMoKTtcbiAgICBjb25zdCBtZXJnZVByb2dyYW0gPSBuZXcgTWVyZ2VQcm9ncmFtKFtiYXRjaCwgaW5kaWNlc1NpemUgLyAyXSk7XG4gICAgY29uc3QgZmlyc3RQYXNzID0gaW5kaWNlcyA9PT0gbnVsbCA/IDEgOiAwO1xuICAgIGNvbnN0IGN1c3RvbVZhbHVlcyA9IFtbbGFzdERpbV0sIFtmaXJzdFBhc3NdLCBba1BvdzJdXTtcbiAgICBjb25zdCBwcmV2SW5kaWNlcyA9IGluZGljZXM7XG4gICAgaW5kaWNlcyA9XG4gICAgICAgIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKG1lcmdlUHJvZ3JhbSwgaW5wdXRzLCAnaW50MzInLCBjdXN0b21WYWx1ZXMpO1xuICAgIGRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvT3JOdWxsKGJhY2tlbmQsIHByZXZJbmRpY2VzKTtcblxuICAgIC8vIFN0ZXAgMzogcmVidWlsZFxuICAgIGNvbnN0IGxlbiA9IGtQb3cyIC8gMjtcbiAgICBjb25zdCBkaXIgPSBsZW4gKiAyO1xuICAgIGZvciAobGV0IGluYyA9IGxlbjsgaW5jID49IDE7IGluYyAvPSAyKSB7XG4gICAgICBydW5Td2FwKGRpciwgaW5jLCBpbmRpY2VzLnNoYXBlKTtcbiAgICB9XG4gIH1cblxuICAvLyBLZWVwIG9ubHkgdGhlIHJlcXVlc3RlZCB0b3AgSyByZXN1bHRzIGluc3RlYWQgb2Yga1BvdzJcbiAgbGV0IHByZXZJbmRpY2VzID0gaW5kaWNlcztcbiAgaW5kaWNlcyA9IHNsaWNlKFxuICAgICAge2lucHV0czoge3g6IGluZGljZXN9LCBiYWNrZW5kLCBhdHRyczoge2JlZ2luOiAwLCBzaXplOiBbYmF0Y2gsIGtdfX0pO1xuICBkaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mb09yTnVsbChiYWNrZW5kLCBwcmV2SW5kaWNlcyk7XG5cbiAgLy8gR2F0aGVyIHZhbHVlcyBvbiBsYXN0IGRpbWVuc2lvblxuICBsZXQgdmFsdWVzID0gZ2F0aGVyVjIoXG4gICAgICB7aW5wdXRzOiB7eDogeDJELCBpbmRpY2VzfSwgYmFja2VuZCwgYXR0cnM6IHtheGlzOiAxLCBiYXRjaERpbXM6IDF9fSk7XG4gIGRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvT3JOdWxsKGJhY2tlbmQsIHgyRCk7XG5cbiAgLy8gUmVzaGFwZSBiYWNrIHRvIHRoZSBvcmlnaW5hbCBpbnB1dCBzaGFwZSwgZXhjZXB0IHRoYXQgdGhlIGxhc3RcbiAgLy8gZGltZW5zaW9uIGlzIGsuXG4gIGNvbnN0IG5ld1NoYXBlID0geFNoYXBlLnNsaWNlKDAsIC0xKTtcbiAgbmV3U2hhcGUucHVzaChrKTtcblxuICBwcmV2SW5kaWNlcyA9IGluZGljZXM7XG4gIGluZGljZXMgPSByZXNoYXBlKHtpbnB1dHM6IHt4OiBpbmRpY2VzfSwgYXR0cnM6IHtzaGFwZTogbmV3U2hhcGV9LCBiYWNrZW5kfSk7XG4gIGRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvT3JOdWxsKGJhY2tlbmQsIHByZXZJbmRpY2VzKTtcblxuICBjb25zdCBwcmV2VmFsdWVzID0gdmFsdWVzO1xuICB2YWx1ZXMgPSByZXNoYXBlKHtpbnB1dHM6IHt4OiB2YWx1ZXN9LCBhdHRyczoge3NoYXBlOiBuZXdTaGFwZX0sIGJhY2tlbmR9KTtcbiAgZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm9Pck51bGwoYmFja2VuZCwgcHJldlZhbHVlcyk7XG5cbiAgcmV0dXJuIFt2YWx1ZXMsIGluZGljZXNdO1xufVxuXG5leHBvcnQgY29uc3QgdG9wS0NvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBUb3BLLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogdG9wSyBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mbywgVHJhbnNmb3JtLCBUcmFuc2Zvcm1BdHRycywgVHJhbnNmb3JtSW5wdXRzfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtUcmFuc2Zvcm1Qcm9ncmFtfSBmcm9tICcuLi90cmFuc2Zvcm1fZ3B1JztcblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybShhcmdzOiB7XG4gIGlucHV0czogVHJhbnNmb3JtSW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLFxuICBhdHRyczogVHJhbnNmb3JtQXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge2ltYWdlLCB0cmFuc2Zvcm1zfSA9IGlucHV0cztcbiAgY29uc3Qge2ludGVycG9sYXRpb24sIGZpbGxNb2RlLCBmaWxsVmFsdWUsIG91dHB1dFNoYXBlfSA9IGF0dHJzO1xuXG4gIGNvbnN0IFtiYXRjaCwgaW1hZ2VIZWlnaHQsIGltYWdlV2lkdGgsIG51bUNoYW5uZWxzXSA9IGltYWdlLnNoYXBlO1xuICBjb25zdCBbb3V0SGVpZ2h0LCBvdXRXaWR0aF0gPVxuICAgICAgb3V0cHV0U2hhcGUgIT0gbnVsbCA/IG91dHB1dFNoYXBlIDogW2ltYWdlSGVpZ2h0LCBpbWFnZVdpZHRoXTtcbiAgY29uc3Qgb3V0U2hhcGUgPVxuICAgICAgW2JhdGNoLCBvdXRIZWlnaHQsIG91dFdpZHRoLFxuICAgICAgIG51bUNoYW5uZWxzXSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcblxuICBjb25zdCBwcm9ncmFtID0gbmV3IFRyYW5zZm9ybVByb2dyYW0oXG4gICAgICBpbWFnZUhlaWdodCwgaW1hZ2VXaWR0aCwgaW50ZXJwb2xhdGlvbiwgZmlsbE1vZGUsIGZpbGxWYWx1ZSwgb3V0U2hhcGUpO1xuICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW2ltYWdlLCB0cmFuc2Zvcm1zXSwgJ2Zsb2F0MzInKTtcbn1cblxuZXhwb3J0IGNvbnN0IHRyYW5zZm9ybUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBUcmFuc2Zvcm0sXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiB0cmFuc2Zvcm0gYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm8sIFRyYW5zcG9zZSwgVHJhbnNwb3NlQXR0cnMsIFRyYW5zcG9zZUlucHV0cywgVHlwZWRBcnJheX0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcblxuaW1wb3J0IHt0cmFuc3Bvc2VJbXBsfSBmcm9tICcuL1RyYW5zcG9zZV9pbXBsJztcbmltcG9ydCB7dHJhbnNwb3NlSW1wbENQVSBhcyBjcHVUcmFuc3Bvc2V9IGZyb20gJy4vVHJhbnNwb3NlX2ltcGwnO1xuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNwb3NlKGFyZ3M6IHtcbiAgaW5wdXRzOiBUcmFuc3Bvc2VJbnB1dHMsXG4gIGF0dHJzOiBUcmFuc3Bvc2VBdHRycyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTFxufSkge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG4gIGNvbnN0IHtwZXJtfSA9IGF0dHJzO1xuICBjb25zdCB3ZWJnbEJhY2tlbmQgPSBiYWNrZW5kO1xuXG4gIGNvbnN0IHhSYW5rID0geC5zaGFwZS5sZW5ndGg7XG5cbiAgY29uc3QgbmV3U2hhcGU6IG51bWJlcltdID0gbmV3IEFycmF5KHhSYW5rKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXdTaGFwZS5sZW5ndGg7IGkrKykge1xuICAgIG5ld1NoYXBlW2ldID0geC5zaGFwZVtwZXJtW2ldXTtcbiAgfVxuXG4gIGxldCBvdXQ6IFRlbnNvckluZm87XG4gIGlmICh3ZWJnbEJhY2tlbmQuc2hvdWxkRXhlY3V0ZU9uQ1BVKFt4XSkpIHtcbiAgICBjb25zdCB4VGV4RGF0YSA9IHdlYmdsQmFja2VuZC50ZXhEYXRhLmdldCh4LmRhdGFJZCk7XG4gICAgY29uc3QgdmFsdWVzID0geFRleERhdGEudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gICAgY29uc3Qgb3V0VmFsdWVzID0gY3B1VHJhbnNwb3NlKHZhbHVlcywgeC5zaGFwZSwgeC5kdHlwZSwgcGVybSwgbmV3U2hhcGUpO1xuXG4gICAgb3V0ID0gd2ViZ2xCYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG5ld1NoYXBlLCB4LmR0eXBlKTtcbiAgICBjb25zdCBvdXREYXRhID0gd2ViZ2xCYWNrZW5kLnRleERhdGEuZ2V0KG91dC5kYXRhSWQpO1xuICAgIG91dERhdGEudmFsdWVzID0gb3V0VmFsdWVzO1xuICB9IGVsc2Uge1xuICAgIG91dCA9IHRyYW5zcG9zZUltcGwoeCwgcGVybSwgd2ViZ2xCYWNrZW5kKTtcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG5leHBvcnQgY29uc3QgdHJhbnNwb3NlQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFRyYW5zcG9zZSxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHRyYW5zcG9zZSBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2VudiwgVGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7dHJhbnNwb3NlSW1wbENQVX0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5pbXBvcnQge1RyYW5zcG9zZVByb2dyYW19IGZyb20gJy4uL3RyYW5zcG9zZV9ncHUnO1xuaW1wb3J0IHtUcmFuc3Bvc2VQYWNrZWRQcm9ncmFtfSBmcm9tICcuLi90cmFuc3Bvc2VfcGFja2VkX2dwdSc7XG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc3Bvc2VJbXBsKFxuICAgIHg6IFRlbnNvckluZm8sIHBlcm06IG51bWJlcltdLCBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMKTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHByb2dyYW0gPSBlbnYoKS5nZXRCb29sKCdXRUJHTF9QQUNLX0FSUkFZX09QRVJBVElPTlMnKSA/XG4gICAgICBuZXcgVHJhbnNwb3NlUGFja2VkUHJvZ3JhbSh4LnNoYXBlLCBwZXJtKSA6XG4gICAgICBuZXcgVHJhbnNwb3NlUHJvZ3JhbSh4LnNoYXBlLCBwZXJtKTtcbiAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFt4XSwgeC5kdHlwZSk7XG59XG5cbmV4cG9ydCB7dHJhbnNwb3NlSW1wbENQVX07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mbywgVW5pcXVlLCBVbmlxdWVBdHRycywgVW5pcXVlSW5wdXRzfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHt1bmlxdWVJbXBsQ1BVfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcbmltcG9ydCB7YXNzZXJ0Tm90Q29tcGxleH0gZnJvbSAnLi4vd2ViZ2xfdXRpbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiB1bmlxdWUoXG4gICAgYXJnczpcbiAgICAgICAge2lucHV0czogVW5pcXVlSW5wdXRzLCBhdHRyczogVW5pcXVlQXR0cnMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0x9KTpcbiAgICBUZW5zb3JJbmZvW10ge1xuICBjb25zdCB7aW5wdXRzLCBhdHRycywgYmFja2VuZH0gPSBhcmdzO1xuICBjb25zdCB7YXhpc30gPSBhdHRycztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICBhc3NlcnROb3RDb21wbGV4KHgsICd1bmlxdWUnKTtcblxuICAvLyBGb3Igbm93LCBhbHdheXMgZm9yd2FyZCBjYWxjdWxhdGlvbiB0byB0aGUgQ1BVIGJhY2tlbmQuXG4gIGNvbnNvbGUud2FybihcbiAgICAgICdXQVJOSU5HOiAnLFxuICAgICAgJ1VJIG1pZ2h0IGJlIGxvY2tlZCB0ZW1wb3JhcmlseSBhcyBkYXRhIGlzIGJlaW5nIGRvd25sb2FkZWQnKTtcbiAgY29uc3QgdmFsdWVzID0gYmFja2VuZC5yZWFkU3luYyh4LmRhdGFJZCk7XG4gIGNvbnN0IHtvdXRwdXRWYWx1ZXMsIG91dHB1dFNoYXBlLCBpbmRpY2VzfSA9XG4gICAgICB1bmlxdWVJbXBsQ1BVKHZhbHVlcywgYXhpcywgeC5zaGFwZSwgeC5kdHlwZSk7XG4gIHJldHVybiBbXG4gICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRwdXRTaGFwZSwgeC5kdHlwZSwgb3V0cHV0VmFsdWVzKSxcbiAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtpbmRpY2VzLmxlbmd0aF0sICdpbnQzMicsIGluZGljZXMpLFxuICBdO1xufVxuXG5leHBvcnQgY29uc3QgdW5pcXVlQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFVuaXF1ZSxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHVuaXF1ZSBhcyB7fSBhcyBLZXJuZWxGdW5jLFxufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm8sIFVucGFjaywgVW5wYWNrQXR0cnMsIFVucGFja0lucHV0c30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcblxuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL1Jlc2hhcGUnO1xuaW1wb3J0IHtzbGljZX0gZnJvbSAnLi9TbGljZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiB1bnBhY2soXG4gICAgYXJnczpcbiAgICAgICAge2lucHV0czogVW5wYWNrSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLCBhdHRyczogVW5wYWNrQXR0cnN9KTpcbiAgICBUZW5zb3JJbmZvW10ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7dmFsdWV9ID0gaW5wdXRzO1xuICBsZXQge2F4aXN9ID0gYXR0cnM7XG5cbiAgaWYgKGF4aXMgPCAwKSB7XG4gICAgYXhpcyArPSB2YWx1ZS5zaGFwZS5sZW5ndGg7XG4gIH1cblxuICBjb25zdCB4ID0gdmFsdWU7XG4gIGNvbnN0IHhSYW5rID0geC5zaGFwZS5sZW5ndGg7XG5cbiAgY29uc3QgbnVtID0gdmFsdWUuc2hhcGVbYXhpc107XG4gIGNvbnN0IG91dFNoYXBlOiBudW1iZXJbXSA9IG5ldyBBcnJheSh4UmFuayAtIDEpO1xuICBsZXQgb3V0SW5kZXggPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHhSYW5rOyBpKyspIHtcbiAgICBpZiAoaSAhPT0gYXhpcykge1xuICAgICAgb3V0U2hhcGVbb3V0SW5kZXgrK10gPSB4LnNoYXBlW2ldO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHRvRGlzcG9zZSA9IFtdO1xuXG4gIGNvbnN0IGJlZ2luID0gbmV3IEFycmF5KHhSYW5rKS5maWxsKDApO1xuICBjb25zdCBzaXplID0geC5zaGFwZS5zbGljZSgpO1xuICBzaXplW2F4aXNdID0gMTtcbiAgY29uc3QgcmVzOiBUZW5zb3JJbmZvW10gPSBuZXcgQXJyYXkobnVtKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXMubGVuZ3RoOyBpKyspIHtcbiAgICBiZWdpbltheGlzXSA9IGk7XG4gICAgY29uc3Qgc2xpY2VkID0gc2xpY2Uoe2lucHV0czoge3h9LCBiYWNrZW5kLCBhdHRyczoge2JlZ2luLCBzaXplfX0pO1xuICAgIGNvbnN0IHJlc2hhcGVkID1cbiAgICAgICAgcmVzaGFwZSh7aW5wdXRzOiB7eDogc2xpY2VkfSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogb3V0U2hhcGV9fSk7XG4gICAgcmVzW2ldID0gcmVzaGFwZWQ7XG5cbiAgICB0b0Rpc3Bvc2UucHVzaChzbGljZWQpO1xuICB9XG5cbiAgdG9EaXNwb3NlLmZvckVhY2godCA9PiBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHQpKTtcbiAgcmV0dXJuIHJlcztcbn1cblxuZXhwb3J0IGNvbnN0IHVucGFja0NvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBVbnBhY2ssXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiB1bnBhY2sgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIERhdGFUeXBlLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIHN1bU91dFR5cGUsIFRlbnNvckluZm8sIFVuc29ydGVkU2VnbWVudFN1bSwgVW5zb3J0ZWRTZWdtZW50U3VtQXR0cnMsIFVuc29ydGVkU2VnbWVudFN1bUlucHV0cywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7U2VnbWVudE9wUHJvZ3JhbX0gZnJvbSAnLi4vc2VnbWVudF9ncHUnO1xuXG5pbXBvcnQge3JhbmdlfSBmcm9tICcuL1JhbmdlJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9SZXNoYXBlJztcbmltcG9ydCB7dGlsZX0gZnJvbSAnLi9UaWxlJztcbmltcG9ydCB7dHJhbnNwb3NlfSBmcm9tICcuL1RyYW5zcG9zZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiB1bnNvcnRlZFNlZ21lbnRTdW0oYXJnczoge1xuICBpbnB1dHM6IFVuc29ydGVkU2VnbWVudFN1bUlucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IFVuc29ydGVkU2VnbWVudFN1bUF0dHJzXG59KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4LCBzZWdtZW50SWRzfSA9IGlucHV0cztcbiAgY29uc3Qge251bVNlZ21lbnRzfSA9IGF0dHJzO1xuXG4gIGNvbnN0IHhSYW5rID0geC5zaGFwZS5sZW5ndGg7XG5cbiAgY29uc3QgdG9EaXNwb3NlID0gW107XG5cbiAgbGV0IGF4aXMgPSAwO1xuICBjb25zdCBwZXJtdXRhdGlvbiA9IGJhY2tlbmRfdXRpbC5nZXRBeGVzUGVybXV0YXRpb24oW2F4aXNdLCB4UmFuayk7XG4gIGxldCBwZXJtdXRlZFggPSB4O1xuICBpZiAocGVybXV0YXRpb24gIT0gbnVsbCkge1xuICAgIHBlcm11dGVkWCA9IHRyYW5zcG9zZSh7aW5wdXRzOiB7eH0sIGJhY2tlbmQsIGF0dHJzOiB7cGVybTogcGVybXV0YXRpb259fSk7XG4gICAgdG9EaXNwb3NlLnB1c2gocGVybXV0ZWRYKTtcbiAgICBheGlzID0gYmFja2VuZF91dGlsLmdldElubmVyTW9zdEF4ZXMoMSwgeFJhbmspWzBdO1xuICB9XG5cbiAgY29uc3Qgb3V0U2hhcGUgPSBiYWNrZW5kX3V0aWwuc2VnbWVudF91dGlsLmNvbXB1dGVPdXRTaGFwZShcbiAgICAgIHBlcm11dGVkWC5zaGFwZSwgYXhpcywgbnVtU2VnbWVudHMpO1xuICBjb25zdCBpblNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoW3Blcm11dGVkWC5zaGFwZVtheGlzXV0pO1xuICBjb25zdCBhMkQgPVxuICAgICAgcmVzaGFwZSh7aW5wdXRzOiB7eDogcGVybXV0ZWRYfSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogWy0xLCBpblNpemVdfX0pO1xuICB0b0Rpc3Bvc2UucHVzaChhMkQpO1xuXG4gIGNvbnN0IG91dHB1dERUeXBlID0gc3VtT3V0VHlwZSh4LmR0eXBlKTtcblxuICBjb25zdCBzZWdPcENvbXB1dGUgPVxuICAgICAgKHg6IFRlbnNvckluZm8sIHNlZ09wVHlwZTogJ3Vuc29ydGVkU2VnbWVudFN1bScsIHNlZ21lbnRJZHM6IFRlbnNvckluZm8sXG4gICAgICAgZHR5cGU6IERhdGFUeXBlLCBudW1TZWdtZW50czogbnVtYmVyKTogVGVuc29ySW5mbyA9PiB7XG4gICAgICAgIGNvbnN0IGJhdGNoU2l6ZSA9IHguc2hhcGVbMF07XG4gICAgICAgIGNvbnN0IGluU2l6ZSA9IHguc2hhcGVbMV07XG4gICAgICAgIGNvbnN0IHdpbmRvd1NpemUgPVxuICAgICAgICAgICAgYmFja2VuZF91dGlsLnNlZ21lbnRfdXRpbC5zZWdPcENvbXB1dGVPcHRpbWFsV2luZG93U2l6ZShcbiAgICAgICAgICAgICAgICBpblNpemUsIG51bVNlZ21lbnRzKTtcbiAgICAgICAgY29uc3Qgc2VnT3BJbmZvID0ge3dpbmRvd1NpemUsIGluU2l6ZSwgYmF0Y2hTaXplLCBudW1TZWdtZW50c307XG4gICAgICAgIGNvbnN0IHByb2dyYW0gPSBuZXcgU2VnbWVudE9wUHJvZ3JhbShzZWdPcEluZm8sIHNlZ09wVHlwZSk7XG4gICAgICAgIGNvbnN0IG91dHB1dCA9IGJhY2tlbmQuY29tcGlsZUFuZFJ1bihwcm9ncmFtLCBbeCwgc2VnbWVudElkc10sIGR0eXBlKTtcbiAgICAgICAgdG9EaXNwb3NlLnB1c2gob3V0cHV0KTtcbiAgICAgICAgLy8gTm8gbmVlZCB0byBydW4gYW5vdGhlciBHUEdQVSBwcm9ncmFtLlxuICAgICAgICBpZiAob3V0cHV0LnNoYXBlWzFdID09PSBudW1TZWdtZW50cykge1xuICAgICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmFuZ2VJbmZvID0gcmFuZ2Uoe1xuICAgICAgICAgIGJhY2tlbmQsXG4gICAgICAgICAgYXR0cnM6IHtzdGFydDogMCwgc3RvcDogbnVtU2VnbWVudHMsIHN0ZXA6IDEsIGR0eXBlOiAnZmxvYXQzMid9XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCB0aWxlSW5mbyA9IHRpbGUoe1xuICAgICAgICAgIGlucHV0czoge3g6IHJhbmdlSW5mb30sXG4gICAgICAgICAgYmFja2VuZCxcbiAgICAgICAgICBhdHRyczoge3JlcHM6IFtpblNpemUgLyB3aW5kb3dTaXplXX1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdG9EaXNwb3NlLnB1c2gocmFuZ2VJbmZvKTtcbiAgICAgICAgdG9EaXNwb3NlLnB1c2godGlsZUluZm8pO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9XG4gICAgICAgICAgICBzZWdPcENvbXB1dGUob3V0cHV0LCBzZWdPcFR5cGUsIHRpbGVJbmZvLCBkdHlwZSwgbnVtU2VnbWVudHMpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcblxuICBjb25zdCBzZWdPcFJlc3VsdCA9IHNlZ09wQ29tcHV0ZShcbiAgICAgIGEyRCwgJ3Vuc29ydGVkU2VnbWVudFN1bScsIHNlZ21lbnRJZHMsIG91dHB1dERUeXBlLCBudW1TZWdtZW50cyk7XG5cbiAgY29uc3QgcmVzaGFwZWQgPVxuICAgICAgcmVzaGFwZSh7aW5wdXRzOiB7eDogc2VnT3BSZXN1bHR9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBvdXRTaGFwZX19KTtcblxuICBsZXQgcmVzdWx0ID0gcmVzaGFwZWQ7XG4gIGlmIChwZXJtdXRhdGlvbiAhPSBudWxsKSB7XG4gICAgdG9EaXNwb3NlLnB1c2gocmVzaGFwZWQpO1xuICAgIGNvbnN0IHBlcm0gPSBiYWNrZW5kX3V0aWwuZ2V0VW5kb0F4ZXNQZXJtdXRhdGlvbihwZXJtdXRhdGlvbik7XG4gICAgcmVzdWx0ID0gdHJhbnNwb3NlKHtpbnB1dHM6IHt4OiByZXN1bHR9LCBiYWNrZW5kLCBhdHRyczoge3Blcm19fSk7XG4gIH1cblxuICB0b0Rpc3Bvc2UuZm9yRWFjaCh0ID0+IGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8odCkpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgY29uc3QgdW5zb3J0ZWRTZWdtZW50U3VtQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFVuc29ydGVkU2VnbWVudFN1bSxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHVuc29ydGVkU2VnbWVudFN1bSBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mbywgWmVyb3NMaWtlLCBaZXJvc0xpa2VJbnB1dHN9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5cbmltcG9ydCB7Y29tcGxleH0gZnJvbSAnLi9Db21wbGV4JztcbmltcG9ydCB7ZmlsbH0gZnJvbSAnLi9GaWxsJztcbmltcG9ydCB7aW1hZ30gZnJvbSAnLi9JbWFnJztcbmltcG9ydCB7cmVhbH0gZnJvbSAnLi9SZWFsJztcblxuZXhwb3J0IGZ1bmN0aW9uIHplcm9zTGlrZShcbiAgICBhcmdzOiB7aW5wdXRzOiBaZXJvc0xpa2VJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0x9KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmR9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuXG4gIGlmICh4LmR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgIGNvbnN0IHJlYWxQYXJ0ID0gcmVhbCh7aW5wdXRzOiB7aW5wdXQ6IHh9LCBiYWNrZW5kfSk7XG4gICAgY29uc3QgciA9IHplcm9zTGlrZSh7aW5wdXRzOiB7eDogcmVhbFBhcnR9LCBiYWNrZW5kfSk7XG4gICAgY29uc3QgaW1hZ1BhcnQgPSBpbWFnKHtpbnB1dHM6IHtpbnB1dDogeH0sIGJhY2tlbmR9KTtcbiAgICBjb25zdCBpID0gemVyb3NMaWtlKHtpbnB1dHM6IHt4OiBpbWFnUGFydH0sIGJhY2tlbmR9KTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGNvbXBsZXgoe2lucHV0czoge3JlYWw6IHIsIGltYWc6IGl9LCBiYWNrZW5kfSk7XG5cbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlYWxQYXJ0KTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHIpO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oaW1hZ1BhcnQpO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oaSk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBmaWxsKHtcbiAgICAgIGF0dHJzOiB7XG4gICAgICAgIHNoYXBlOiB4LnNoYXBlLFxuICAgICAgICBkdHlwZTogeC5kdHlwZSxcbiAgICAgICAgdmFsdWU6IHguZHR5cGUgPT09ICdzdHJpbmcnID8gJycgOiAwXG4gICAgICB9LFxuICAgICAgYmFja2VuZFxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCB6ZXJvc0xpa2VDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogWmVyb3NMaWtlLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogemVyb3NMaWtlIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge19GdXNlZE1hdE11bCwgX0Z1c2VkTWF0TXVsQXR0cnMsIF9GdXNlZE1hdE11bElucHV0cywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtiYXRjaE1hdE11bEltcGx9IGZyb20gJy4vQmF0Y2hNYXRNdWxfaW1wbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBfZnVzZWRNYXRNdWwoYXJnczoge1xuICBpbnB1dHM6IF9GdXNlZE1hdE11bElucHV0cyxcbiAgYXR0cnM6IF9GdXNlZE1hdE11bEF0dHJzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMXG59KSB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHthLCBiLCBiaWFzLCBwcmVsdUFjdGl2YXRpb25XZWlnaHRzfSA9IGlucHV0cztcbiAgY29uc3Qge3RyYW5zcG9zZUEsIHRyYW5zcG9zZUIsIGFjdGl2YXRpb24sIGxlYWt5cmVsdUFscGhhfSA9IGF0dHJzO1xuXG4gIHJldHVybiBiYXRjaE1hdE11bEltcGwoe1xuICAgIGEsXG4gICAgYixcbiAgICB0cmFuc3Bvc2VBLFxuICAgIHRyYW5zcG9zZUIsXG4gICAgYmFja2VuZCxcbiAgICBiaWFzLFxuICAgIHByZWx1QWN0aXZhdGlvbldlaWdodHMsXG4gICAgbGVha3lyZWx1QWxwaGEsXG4gICAgYWN0aXZhdGlvblxuICB9KTtcbn1cblxuZXhwb3J0IGNvbnN0IF9mdXNlZE1hdE11bENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBfRnVzZWRNYXRNdWwsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBfZnVzZWRNYXRNdWwgYXMge30gYXMgS2VybmVsRnVuYyxcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuXG5leHBvcnQgY2xhc3MgTFJOUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ3gnXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdID0gW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICB4U2hhcGU6IG51bWJlcltdLCByYWRpdXM6IG51bWJlciwgYmlhczogbnVtYmVyLCBhbHBoYTogbnVtYmVyLFxuICAgICAgYmV0YTogbnVtYmVyKSB7XG4gICAgY29uc3QgcmFkID0gcmFkaXVzO1xuICAgIGNvbnN0IG1heEQgPSB4U2hhcGVbM10gLSAxO1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSB4U2hhcGU7XG5cbiAgICAvLyBvcHRpbWl6ZSBwb3coYmlhcyArIGFscGhhICogc3VtLCAtYmV0YSlcbiAgICAvLyBzcmM6IGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmZsb3cvLi5cbiAgICAvLyBibG9iLzI2MDMzYTE2NDRhOWM0YTVmYmUzMTcwYWIyZTg2NGI2YTRjY2Q0Y2EvLi5cbiAgICAvLyB0ZW5zb3JmbG93L2NvcmUva2VybmVscy9ta2xfbHJuX29wLmNjI0wzMjBcbiAgICBsZXQgcG93T3BlcmF0b3I7XG4gICAgY29uc3QgYmFzaXMgPSBgZmxvYXQoJHtiaWFzfSkgKyBmbG9hdCgke2FscGhhfSkgKiBzdW1gO1xuICAgIGlmIChiZXRhID09PSAwLjUpIHtcbiAgICAgIHBvd09wZXJhdG9yID0gYGludmVyc2VzcXJ0KCR7YmFzaXN9KWA7XG4gICAgfSBlbHNlIGlmIChiZXRhID09PSAxLjApIHtcbiAgICAgIHBvd09wZXJhdG9yID0gYDEuMC8oJHtiYXNpc30pYDtcbiAgICB9IGVsc2Uge1xuICAgICAgcG93T3BlcmF0b3IgPSBgZXhwKGxvZygke2Jhc2lzfSkgKiBmbG9hdCgtJHtiZXRhfSkpO2A7XG4gICAgfVxuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBiID0gY29vcmRzWzBdO1xuICAgICAgICBpbnQgciA9IGNvb3Jkc1sxXTtcbiAgICAgICAgaW50IGMgPSBjb29yZHNbMl07XG4gICAgICAgIGludCBkID0gY29vcmRzWzNdO1xuICAgICAgICBmbG9hdCB4ID0gZ2V0WChiLCByLCBjLCBkKTtcbiAgICAgICAgZmxvYXQgc3VtID0gMC4wO1xuICAgICAgICBmb3IgKGludCBqID0gLSR7cmFkfTsgaiA8PSAke3JhZH07IGorKykge1xuICAgICAgICAgIGludCBpZHggPSBkICsgajtcbiAgICAgICAgICBpZiAoaWR4ID49IDAgJiYgaWR4IDw9ICAke21heER9KSB7XG4gICAgICAgICAgICBmbG9hdCB6ID0gZ2V0WChiLCByLCBjLCBpZHgpO1xuICAgICAgICAgICAgc3VtICs9IHogKiB6O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmbG9hdCB2YWwgPSB4ICogJHtwb3dPcGVyYXRvcn07XG4gICAgICAgIHNldE91dHB1dCh2YWwpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5cbmV4cG9ydCBjbGFzcyBMUk5HcmFkUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ2lucHV0SW1hZ2UnLCAnb3V0cHV0SW1hZ2UnLCAnZHknXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdID0gW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIGRlcHRoUmFkaXVzOiBudW1iZXI7XG4gIGJpYXM6IG51bWJlcjtcbiAgYWxwaGE6IG51bWJlcjtcbiAgYmV0YTogbnVtYmVyO1xuICBkZXB0aDogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgaW5wdXRTaGFwZTogbnVtYmVyW10sIGRlcHRoUmFkaXVzOiBudW1iZXIsIGJpYXM6IG51bWJlciwgYWxwaGE6IG51bWJlcixcbiAgICAgIGJldGE6IG51bWJlcikge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBpbnB1dFNoYXBlO1xuICAgIHRoaXMuZGVwdGggPSBpbnB1dFNoYXBlWzNdO1xuICAgIHRoaXMuZGVwdGhSYWRpdXMgPSBkZXB0aFJhZGl1cztcbiAgICB0aGlzLmJpYXMgPSBiaWFzO1xuICAgIHRoaXMuYWxwaGEgPSBhbHBoYTtcbiAgICB0aGlzLmJldGEgPSBiZXRhO1xuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWM0IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgYiA9IGNvb3Jkc1swXTtcbiAgICAgICAgaW50IHIgPSBjb29yZHNbMV07XG4gICAgICAgIGludCBjID0gY29vcmRzWzJdO1xuXG4gICAgICAgIGZsb2F0IHJlc3VsdCA9IDAuMDtcbiAgICAgICAgZm9yIChpbnQgZCA9IDA7IGQgPCAke3RoaXMuZGVwdGh9OyArK2QpIHtcbiAgICAgICAgICBpbnQgZGVwdGhCZWdpbiA9IGludChtYXgoMC4wLCBmbG9hdChkIC0gJHtkZXB0aFJhZGl1c30pKSk7XG4gICAgICAgICAgaW50IGRlcHRoRW5kID0gaW50KG1pbihmbG9hdCgke3RoaXMuZGVwdGh9KSxcbiAgICAgICAgICAgICAgZmxvYXQoZCArICR7ZGVwdGhSYWRpdXN9ICsgMSkpKTtcblxuICAgICAgICAgIGNvbnN0IGludCBNSU5fREVQVEhfQkVHSU4gPSAwO1xuICAgICAgICAgIGNvbnN0IGludCBNQVhfREVQVEhfRU5EID0gJHt0aGlzLmRlcHRofTtcblxuICAgICAgICAgIGZsb2F0IG5vcm0gPSAwLjA7XG4gICAgICAgICAgZm9yIChpbnQgayA9IE1JTl9ERVBUSF9CRUdJTjsgayA8IE1BWF9ERVBUSF9FTkQ7ICsraykge1xuICAgICAgICAgICAgaWYgKGsgPCBkZXB0aEJlZ2luKXtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChrID49IGRlcHRoQmVnaW4gJiYgayA8IGRlcHRoRW5kKSB7XG4gICAgICAgICAgICAgIG5vcm0gKz0gZ2V0SW5wdXRJbWFnZShiLCByLCBjLCBrKSAqIGdldElucHV0SW1hZ2UoYiwgciwgYywgayk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbm9ybSA9IGZsb2F0KCR7YWxwaGF9KSAqIG5vcm0gKyBmbG9hdCgke2JpYXN9KTtcblxuICAgICAgICAgIGZvcihpbnQgayA9IE1JTl9ERVBUSF9CRUdJTjsgayA8IE1BWF9ERVBUSF9FTkQ7ICsrayl7XG4gICAgICAgICAgICBpZiAoayA8IGRlcHRoQmVnaW4pe1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGsgPj0gZGVwdGhCZWdpbiAmJiBrIDwgZGVwdGhFbmQpe1xuICAgICAgICAgICAgICBmbG9hdCBkeWkgPSAtMi4wICogZmxvYXQoJHthbHBoYX0pXG4gICAgICAgICAgICAgICAgKiBmbG9hdCgke2JldGF9KVxuICAgICAgICAgICAgICAgICogZ2V0SW5wdXRJbWFnZShiICxyICxjLCBrKSAqIGdldE91dHB1dEltYWdlKGIsIHIsIGMsIGQpXG4gICAgICAgICAgICAgICAgLyBub3JtO1xuICAgICAgICAgICAgICBpZiAoayA9PSBkKSB7XG4gICAgICAgICAgICAgICAgZHlpICs9IHBvdyhub3JtLCAtMS4wICogJHtiZXRhfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGsgPT0gY29vcmRzWzNdKSB7XG4gICAgICAgICAgICAgICAgZHlpICo9IGdldER5KGIsIHIsIGMsIGQpO1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBkeWk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgICBzZXRPdXRwdXQocmVzdWx0KTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuXG5leHBvcnQgY2xhc3MgTFJOUGFja2VkUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ3gnXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdID0gW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIHBhY2tlZElucHV0cyA9IHRydWU7XG4gIHBhY2tlZE91dHB1dCA9IHRydWU7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICB4U2hhcGU6IG51bWJlcltdLCByYWRpdXM6IG51bWJlciwgYmlhczogbnVtYmVyLCBhbHBoYTogbnVtYmVyLFxuICAgICAgYmV0YTogbnVtYmVyKSB7XG4gICAgY29uc3QgcmFkID0gcmFkaXVzO1xuICAgIGNvbnN0IG1heEQgPSB4U2hhcGVbM10gLSAxO1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSB4U2hhcGU7XG5cbiAgICAvLyBvcHRpbWl6ZSBwb3coYmlhcyArIGFscGhhICogc3VtLCAtYmV0YSlcbiAgICAvLyBzcmM6IGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmZsb3cvLi5cbiAgICAvLyBibG9iLzI2MDMzYTE2NDRhOWM0YTVmYmUzMTcwYWIyZTg2NGI2YTRjY2Q0Y2EvLi5cbiAgICAvLyB0ZW5zb3JmbG93L2NvcmUva2VybmVscy9ta2xfbHJuX29wLmNjI0wzMjBcbiAgICBsZXQgcG93T3BlcmF0b3I7XG4gICAgY29uc3QgYmFzaXMgPSBgZmxvYXQoJHtiaWFzfSkgKyBmbG9hdCgke2FscGhhfSkgKiBzdW1gO1xuICAgIGlmIChiZXRhID09PSAwLjUpIHtcbiAgICAgIHBvd09wZXJhdG9yID0gYGludmVyc2VzcXJ0KCR7YmFzaXN9KWA7XG4gICAgfSBlbHNlIGlmIChiZXRhID09PSAxLjApIHtcbiAgICAgIHBvd09wZXJhdG9yID0gYDEuMC8oJHtiYXNpc30pYDtcbiAgICB9IGVsc2Uge1xuICAgICAgcG93T3BlcmF0b3IgPSBgZXhwKGxvZygke2Jhc2lzfSkgKiBmbG9hdCgtJHtiZXRhfSkpO2A7XG4gICAgfVxuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBiID0gY29vcmRzLng7XG4gICAgICAgIGludCByID0gY29vcmRzLnk7XG4gICAgICAgIGludCBjID0gY29vcmRzLno7XG4gICAgICAgIGludCBkID0gY29vcmRzLnc7XG5cbiAgICAgICAgYm9vbCBoYXNOZXh0Q29sID0gZCA8ICR7dGhpcy5vdXRwdXRTaGFwZVszXX07XG4gICAgICAgIGJvb2wgaGFzTmV4dFJvdyA9IGMgPCAke3RoaXMub3V0cHV0U2hhcGVbMl19O1xuXG4gICAgICAgIHZlYzQgc3VtID0gdmVjNCgwLik7XG4gICAgICAgIHZlYzQgeEZyYWdBdE91dHB1dENvb3JkcyA9IGdldFgoYiwgciwgYywgZCk7XG5cbiAgICAgICAgdmVjNCB4QXRPdXRwdXRDb29yZHMgPSB2ZWM0KFxuICAgICAgICAgIGdldENoYW5uZWwoeEZyYWdBdE91dHB1dENvb3JkcywgdmVjMihjLCBkKSksXG4gICAgICAgICAgaGFzTmV4dENvbCA/XG4gICAgICAgICAgICBnZXRDaGFubmVsKHhGcmFnQXRPdXRwdXRDb29yZHMsIHZlYzIoYywgZCArIDEpKSA6IDAuMCxcbiAgICAgICAgICBoYXNOZXh0Um93ID9cbiAgICAgICAgICAgIGdldENoYW5uZWwoeEZyYWdBdE91dHB1dENvb3JkcyAsIHZlYzIoYyArIDEsIGQpKSA6IDAuMCxcbiAgICAgICAgICAoaGFzTmV4dFJvdyAmJiBoYXNOZXh0Q29sKSA/XG4gICAgICAgICAgICBnZXRDaGFubmVsKHhGcmFnQXRPdXRwdXRDb29yZHMsIHZlYzIoYyArIDEsIGQgKyAxKSkgOiAwLjBcbiAgICAgICAgKTtcblxuICAgICAgICBpbnQgZmlyc3RDaGFubmVsID0gZCAtICR7cmFkfTtcbiAgICAgICAgdmVjMiBjYWNoZSA9IHZlYzIoMC4pO1xuICAgICAgICBpZihmaXJzdENoYW5uZWwgPj0gMCl7XG4gICAgICAgICAgdmVjNCBmaXJzdENoYW5uZWxGcmFnID0gZ2V0WChiLCByLCBjLCBmaXJzdENoYW5uZWwpO1xuICAgICAgICAgIGNhY2hlLnggPSBnZXRDaGFubmVsKGZpcnN0Q2hhbm5lbEZyYWcsIHZlYzIoYywgZmlyc3RDaGFubmVsKSk7XG4gICAgICAgICAgICBpZihoYXNOZXh0Um93KXtcbiAgICAgICAgICAgICAgY2FjaGUueSA9IGdldENoYW5uZWwoZmlyc3RDaGFubmVsRnJhZywgdmVjMihjICsgMSwgZmlyc3RDaGFubmVsKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpdmVjMiBkZXB0aCA9IGl2ZWMyKGQsIGQgKyAxKTtcbiAgICAgICAgZm9yIChpbnQgaiA9IC0gJHtyYWR9OyBqIDw9ICR7cmFkfTsgaisrKSB7XG4gICAgICAgICAgaXZlYzIgaWR4ID0gZGVwdGggKyBqO1xuICAgICAgICAgIGJ2ZWMyIGFib3ZlTG93ZXJCb3VuZCA9IGdyZWF0ZXJUaGFuRXF1YWwoaWR4LCBpdmVjMigwKSk7XG4gICAgICAgICAgYnZlYzIgYmVsb3dVcHBlckJvdW5kID0gbGVzc1RoYW5FcXVhbChpZHgsIGl2ZWMyKCR7bWF4RH0pKTtcblxuICAgICAgICAgIGJvb2wgZGVwdGhJblJhbmdlID0gYWJvdmVMb3dlckJvdW5kLnggJiYgYmVsb3dVcHBlckJvdW5kLng7XG4gICAgICAgICAgYm9vbCBkZXB0aFBsdXNPbmVJblJhbmdlID0gYWJvdmVMb3dlckJvdW5kLnkgJiYgYmVsb3dVcHBlckJvdW5kLnk7XG5cbiAgICAgICAgICBpZihkZXB0aEluUmFuZ2UgfHwgZGVwdGhQbHVzT25lSW5SYW5nZSl7XG4gICAgICAgICAgICB2ZWM0IHogPSB2ZWM0KDAuKTtcbiAgICAgICAgICAgIHZlYzQgeEZyYWdBdEN1cnJlbnREZXB0aDtcbiAgICAgICAgICAgIHoueHogPSBjYWNoZS54eTtcbiAgICAgICAgICAgIGlmKGRlcHRoUGx1c09uZUluUmFuZ2UgJiYgaGFzTmV4dENvbCl7XG4gICAgICAgICAgICAgIHhGcmFnQXRDdXJyZW50RGVwdGggPSBpZHgueSAhPSBkID9cbiAgICAgICAgICAgICAgICBnZXRYKGIsIHIsIGMsIGlkeC55KSA6IHhGcmFnQXRPdXRwdXRDb29yZHM7XG4gICAgICAgICAgICAgIHoueSA9IGdldENoYW5uZWwoeEZyYWdBdEN1cnJlbnREZXB0aCwgdmVjMihjLCBpZHgueSkpO1xuICAgICAgICAgICAgICBpZihoYXNOZXh0Um93KXtcbiAgICAgICAgICAgICAgICB6LncgPSBnZXRDaGFubmVsKHhGcmFnQXRDdXJyZW50RGVwdGgsIHZlYzIoYyArIDEsIGlkeC55KSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhY2hlLnh5ID0gei55dztcbiAgICAgICAgICAgIHN1bSArPSB6ICogejtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmVjNCByZXN1bHQgPSB4QXRPdXRwdXRDb29yZHMgKiAke3Bvd09wZXJhdG9yfTtcbiAgICAgICAgc2V0T3V0cHV0KHJlc3VsdCk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuXG5leHBvcnQgY2xhc3MgTWF4UG9vbDJEQmFja3Byb3BQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnZHknLCAnbWF4UG9zJ107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihjb252SW5mbzogYmFja2VuZF91dGlsLkNvbnYyREluZm8pIHtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gY29udkluZm8uaW5TaGFwZTtcbiAgICBjb25zdCBzdHJpZGVIZWlnaHQgPSBjb252SW5mby5zdHJpZGVIZWlnaHQ7XG4gICAgY29uc3Qgc3RyaWRlV2lkdGggPSBjb252SW5mby5zdHJpZGVXaWR0aDtcbiAgICBjb25zdCBkaWxhdGlvbkhlaWdodCA9IGNvbnZJbmZvLmRpbGF0aW9uSGVpZ2h0O1xuICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlckhlaWdodCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlckhlaWdodDtcbiAgICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlcldpZHRoO1xuXG4gICAgY29uc3QgcGFkVG9wID0gZWZmZWN0aXZlRmlsdGVySGVpZ2h0IC0gMSAtIGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICAgIGNvbnN0IHBhZExlZnQgPSBlZmZlY3RpdmVGaWx0ZXJXaWR0aCAtIDEgLSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG5cbiAgICBjb25zdCBsYXN0SW5kZXggPSBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgKiBlZmZlY3RpdmVGaWx0ZXJXaWR0aCAtIDE7XG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGNvbnN0IGl2ZWMyIHBhZHMgPSBpdmVjMigke3BhZFRvcH0sICR7cGFkTGVmdH0pO1xuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWM0IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgYiA9IGNvb3Jkc1swXTtcbiAgICAgICAgaW50IGQgPSBjb29yZHNbM107XG5cbiAgICAgICAgaXZlYzIgZHlSQ0Nvcm5lciA9IGNvb3Jkcy55eiAtIHBhZHM7XG4gICAgICAgIGludCBkeVJDb3JuZXIgPSBkeVJDQ29ybmVyLng7XG4gICAgICAgIGludCBkeUNDb3JuZXIgPSBkeVJDQ29ybmVyLnk7XG5cbiAgICAgICAgLy8gQ29udm9sdmUgZHkoPywgPywgZCkgd2l0aCBwb3MgbWFzayg6LCA6LCBkKSB0byBnZXQgZHgoeFIsIHhDLCBkKS5cbiAgICAgICAgLy8gPyA9IHRvIGJlIGRldGVybWluZWQuIDogPSBhY3Jvc3MgYWxsIHZhbHVlcyBpbiB0aGF0IGF4aXMuXG4gICAgICAgIGZsb2F0IGRvdFByb2QgPSAwLjA7XG4gICAgICAgIGZvciAoaW50IHdSID0gMDsgd1IgPCAke2VmZmVjdGl2ZUZpbHRlckhlaWdodH07XG4gICAgICAgICAgd1IgKz0gJHtkaWxhdGlvbkhlaWdodH0pIHtcbiAgICAgICAgICBmbG9hdCBkeVIgPSBmbG9hdChkeVJDb3JuZXIgKyB3UikgLyAke3N0cmlkZUhlaWdodH0uMDtcblxuICAgICAgICAgIGlmIChkeVIgPCAwLjAgfHwgZHlSID49ICR7Y29udkluZm8ub3V0SGVpZ2h0fS4wIHx8IGZyYWN0KGR5UikgPiAwLjApIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpbnQgaWR5UiA9IGludChkeVIpO1xuXG4gICAgICAgICAgZm9yIChpbnQgd0MgPSAwOyB3QyA8ICR7ZWZmZWN0aXZlRmlsdGVyV2lkdGh9OyB3QysrKSB7XG4gICAgICAgICAgICBmbG9hdCBkeUMgPSBmbG9hdChkeUNDb3JuZXIgKyB3QykgLyAke3N0cmlkZVdpZHRofS4wO1xuXG4gICAgICAgICAgICBpZiAoZHlDIDwgMC4wIHx8IGR5QyA+PSAke2NvbnZJbmZvLm91dFdpZHRofS4wIHx8XG4gICAgICAgICAgICAgICAgZnJhY3QoZHlDKSA+IDAuMCkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGludCBpZHlDID0gaW50KGR5Qyk7XG5cbiAgICAgICAgICAgIGZsb2F0IGR5VmFsdWUgPSBnZXREeShiLCBpZHlSLCBpZHlDLCBkKTtcbiAgICAgICAgICAgIGludCBtYXhQb3NWYWx1ZSA9ICR7bGFzdEluZGV4fSAtIGludChnZXRNYXhQb3MoYiwgaWR5UiwgaWR5QywgZCkpO1xuXG4gICAgICAgICAgICAvLyBHZXQgdGhlIGN1cnJlbnQgdmFsdWUsIGNoZWNrIGl0IGFnYWluc3QgdGhlIHZhbHVlIGZyb20gdGhlXG4gICAgICAgICAgICAvLyBwb3NpdGlvbiBtYXRyaXguXG4gICAgICAgICAgICBpbnQgY3VyUG9zVmFsdWUgPSB3UiAqICR7ZWZmZWN0aXZlRmlsdGVyV2lkdGh9ICsgd0M7XG4gICAgICAgICAgICBmbG9hdCBtYXNrID0gZmxvYXQobWF4UG9zVmFsdWUgPT0gY3VyUG9zVmFsdWUgPyAxLjAgOiAwLjApO1xuXG4gICAgICAgICAgICBkb3RQcm9kICs9IGR5VmFsdWUgKiBtYXNrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzZXRPdXRwdXQoZG90UHJvZCk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTWF4UG9vbDNEQmFja3Byb3BQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnZHknLCAnbWF4UG9zJ107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihjb252SW5mbzogYmFja2VuZF91dGlsLkNvbnYzREluZm8pIHtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gY29udkluZm8uaW5TaGFwZTtcbiAgICBjb25zdCBzdHJpZGVEZXB0aCA9IGNvbnZJbmZvLnN0cmlkZURlcHRoO1xuICAgIGNvbnN0IHN0cmlkZUhlaWdodCA9IGNvbnZJbmZvLnN0cmlkZUhlaWdodDtcbiAgICBjb25zdCBzdHJpZGVXaWR0aCA9IGNvbnZJbmZvLnN0cmlkZVdpZHRoO1xuICAgIGNvbnN0IGRpbGF0aW9uRGVwdGggPSBjb252SW5mby5kaWxhdGlvbkRlcHRoO1xuICAgIGNvbnN0IGRpbGF0aW9uSGVpZ2h0ID0gY29udkluZm8uZGlsYXRpb25IZWlnaHQ7XG4gICAgY29uc3QgZGlsYXRpb25XaWR0aCA9IGNvbnZJbmZvLmRpbGF0aW9uV2lkdGg7XG4gICAgY29uc3QgZWZmZWN0aXZlRmlsdGVyRGVwdGggPSBjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJEZXB0aDtcbiAgICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgPSBjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJIZWlnaHQ7XG4gICAgY29uc3QgZWZmZWN0aXZlRmlsdGVyV2lkdGggPSBjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJXaWR0aDtcblxuICAgIGNvbnN0IHBhZEZyb250ID0gZWZmZWN0aXZlRmlsdGVyRGVwdGggLSAxIC0gY29udkluZm8ucGFkSW5mby5mcm9udDtcbiAgICBjb25zdCBwYWRUb3AgPSBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgLSAxIC0gY29udkluZm8ucGFkSW5mby50b3A7XG4gICAgY29uc3QgcGFkTGVmdCA9IGVmZmVjdGl2ZUZpbHRlcldpZHRoIC0gMSAtIGNvbnZJbmZvLnBhZEluZm8ubGVmdDtcblxuICAgIGNvbnN0IGxhc3RJbmRleCA9XG4gICAgICAgIGVmZmVjdGl2ZUZpbHRlckRlcHRoICogZWZmZWN0aXZlRmlsdGVySGVpZ2h0ICogZWZmZWN0aXZlRmlsdGVyV2lkdGggLSAxO1xuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICBjb25zdCBpdmVjMyBwYWRzID0gaXZlYzMoJHtwYWRGcm9udH0sICR7cGFkVG9wfSwgJHtwYWRMZWZ0fSk7XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzUgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBiYXRjaCA9IGNvb3Jkcy54O1xuICAgICAgICBpbnQgY2ggPSBjb29yZHMudTtcblxuICAgICAgICBpdmVjMyBkeUNvcm5lciA9IGl2ZWMzKGNvb3Jkcy55LCBjb29yZHMueiwgY29vcmRzLncpIC0gcGFkcztcbiAgICAgICAgaW50IGR5RENvcm5lciA9IGR5Q29ybmVyLng7XG4gICAgICAgIGludCBkeVJDb3JuZXIgPSBkeUNvcm5lci55O1xuICAgICAgICBpbnQgZHlDQ29ybmVyID0gZHlDb3JuZXIuejtcblxuICAgICAgICAvLyBDb252b2x2ZSBkeSg/LCA/LCA/LCBjaCkgd2l0aCBwb3MgbWFzayg6LCA6LCA6LCBkKSB0byBnZXRcbiAgICAgICAgLy8gZHgoeEQsIHhSLCB4QywgY2gpLlxuICAgICAgICAvLyA/ID0gdG8gYmUgZGV0ZXJtaW5lZC4gOiA9IGFjcm9zcyBhbGwgdmFsdWVzIGluIHRoYXQgYXhpcy5cbiAgICAgICAgZmxvYXQgZG90UHJvZCA9IDAuMDtcblxuICAgICAgICBmb3IgKGludCB3RCA9IDA7IHdEIDwgJHtlZmZlY3RpdmVGaWx0ZXJEZXB0aH07XG4gICAgICAgICAgIHdEICs9ICR7ZGlsYXRpb25EZXB0aH0pIHtcbiAgICAgICAgICBmbG9hdCBkeUQgPSBmbG9hdChkeURDb3JuZXIgKyB3RCkgLyAke3N0cmlkZURlcHRofS4wO1xuXG4gICAgICAgICAgaWYgKGR5RCA8IDAuMCB8fCBkeUQgPj0gJHtjb252SW5mby5vdXREZXB0aH0uMCB8fCBmcmFjdChkeUQpID4gMC4wKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaW50IGlkeUQgPSBpbnQoZHlEKTtcblxuICAgICAgICAgIGZvciAoaW50IHdSID0gMDsgd1IgPCAke2VmZmVjdGl2ZUZpbHRlckhlaWdodH07XG4gICAgICAgICAgICAgIHdSICs9ICR7ZGlsYXRpb25IZWlnaHR9KSB7XG4gICAgICAgICAgICBmbG9hdCBkeVIgPSBmbG9hdChkeVJDb3JuZXIgKyB3UikgLyAke3N0cmlkZUhlaWdodH0uMDtcblxuICAgICAgICAgICAgaWYgKGR5UiA8IDAuMCB8fCBkeVIgPj0gJHtjb252SW5mby5vdXRIZWlnaHR9LjAgfHxcbiAgICAgICAgICAgICAgICBmcmFjdChkeVIpID4gMC4wKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW50IGlkeVIgPSBpbnQoZHlSKTtcblxuICAgICAgICAgICAgZm9yIChpbnQgd0MgPSAwOyB3QyA8ICR7ZWZmZWN0aXZlRmlsdGVyV2lkdGh9O1xuICAgICAgICAgICAgICAgIHdDICs9ICR7ZGlsYXRpb25XaWR0aH0pIHtcbiAgICAgICAgICAgICAgZmxvYXQgZHlDID0gZmxvYXQoZHlDQ29ybmVyICsgd0MpIC8gJHtzdHJpZGVXaWR0aH0uMDtcblxuICAgICAgICAgICAgICBpZiAoZHlDIDwgMC4wIHx8IGR5QyA+PSAke2NvbnZJbmZvLm91dFdpZHRofS4wIHx8XG4gICAgICAgICAgICAgICAgICBmcmFjdChkeUMpID4gMC4wKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaW50IGlkeUMgPSBpbnQoZHlDKTtcblxuICAgICAgICAgICAgICBmbG9hdCBkeVZhbHVlID0gZ2V0RHkoYmF0Y2gsIGlkeUQsIGlkeVIsIGlkeUMsIGNoKTtcbiAgICAgICAgICAgICAgaW50IG1heFBvc1ZhbHVlID0gJHtsYXN0SW5kZXh9IC1cbiAgICAgICAgICAgICAgICAgIGludChnZXRNYXhQb3MoYmF0Y2gsIGlkeUQsIGlkeVIsIGlkeUMsIGNoKSk7XG5cbiAgICAgICAgICAgICAgLy8gR2V0IHRoZSBjdXJyZW50IHZhbHVlLCBjaGVjayBpdCBhZ2FpbnN0IHRoZSB2YWx1ZSBmcm9tIHRoZVxuICAgICAgICAgICAgICAvLyBwb3NpdGlvbiBtYXRyaXguXG4gICAgICAgICAgICAgIGludCBjdXJQb3NWYWx1ZSA9XG4gICAgICAgICAgICAgICAgICB3RCAqICR7ZWZmZWN0aXZlRmlsdGVySGVpZ2h0fSAqICR7ZWZmZWN0aXZlRmlsdGVyV2lkdGh9ICtcbiAgICAgICAgICAgICAgICAgIHdSICogJHtlZmZlY3RpdmVGaWx0ZXJXaWR0aH0gKyB3QztcbiAgICAgICAgICAgICAgZmxvYXQgbWFzayA9IGZsb2F0KG1heFBvc1ZhbHVlID09IGN1clBvc1ZhbHVlID8gMS4wIDogMC4wKTtcblxuICAgICAgICAgICAgICBkb3RQcm9kICs9IGR5VmFsdWUgKiBtYXNrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzZXRPdXRwdXQoZG90UHJvZCk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuXG5leHBvcnQgY2xhc3MgTWVhblByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWyd4J107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihyZWR1Y2VJbmZvOiBiYWNrZW5kX3V0aWwuUmVkdWNlSW5mbywgZGl2aXNvcj86IG51bWJlcikge1xuICAgIGNvbnN0IHt3aW5kb3dTaXplLCBiYXRjaFNpemUsIGluU2l6ZSwgb3V0U2l6ZX0gPSByZWR1Y2VJbmZvO1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBbYmF0Y2hTaXplLCBvdXRTaXplXTtcblxuICAgIGNvbnN0IHdpbmRvd1NpemVOZWFyZXN0VmVjNCA9IE1hdGguZmxvb3Iod2luZG93U2l6ZSAvIDQpICogNDtcbiAgICBjb25zdCB3aW5kb3dTaXplVmVjNFJlbWFpbmRlciA9IHdpbmRvd1NpemUgJSA0O1xuXG4gICAgbGV0IHVwZGF0ZVNuaXBwZXQgPSBgc3VtVmFsdWUgKz0gZG90KHZhbHVlcywgb25lcyk7YDtcbiAgICBpZiAoZGl2aXNvciAhPSBudWxsKSB7XG4gICAgICBjb25zdCBkZW5vbWluYXRvciA9IDEgLyBkaXZpc29yO1xuICAgICAgdXBkYXRlU25pcHBldCA9IGBzdW1WYWx1ZSArPSBkb3QodmFsdWVzICogJHtcbiAgICAgICAgICB1dGlsLmlzSW50KGRlbm9taW5hdG9yKSA/IGRlbm9taW5hdG9yLnRvUHJlY2lzaW9uKDIpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbm9taW5hdG9yfSwgb25lcyk7YDtcbiAgICB9XG5cbiAgICBsZXQgY2hlY2tPdXRPZkJvdW5kcyA9ICcnO1xuICAgIGlmIChpblNpemUgJSB3aW5kb3dTaXplID4gMCkge1xuICAgICAgY2hlY2tPdXRPZkJvdW5kcyA9IGBcbiAgICAgICAgaWYgKGluSWR4IDwgMCB8fCBpbklkeCA+PSAke2luU2l6ZX0pIHtcbiAgICAgICAgICByZXR1cm4gMC4wO1xuICAgICAgICB9XG4gICAgICBgO1xuICAgIH1cblxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICBjb25zdCB2ZWM0IG9uZXMgPSB2ZWM0KDEuMCwgMS4wLCAxLjAsIDEuMCk7XG5cbiAgICAgIGZsb2F0IGdldFZhbHVlKGludCBiYXRjaCwgaW50IGluSWR4KSB7XG4gICAgICAgICR7Y2hlY2tPdXRPZkJvdW5kc31cbiAgICAgICAgcmV0dXJuIGdldFgoYmF0Y2gsIGluSWR4KTtcbiAgICAgIH1cblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjMiBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IGJhdGNoID0gY29vcmRzWzBdO1xuICAgICAgICBpbnQgb3V0SWR4ID0gY29vcmRzWzFdO1xuICAgICAgICBpbnQgaW5PZmZzZXQgPSBvdXRJZHggKiAke3dpbmRvd1NpemV9O1xuXG4gICAgICAgIGZsb2F0IHN1bVZhbHVlID0gMC4wO1xuXG4gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgJHt3aW5kb3dTaXplTmVhcmVzdFZlYzR9OyBpICs9IDQpIHtcbiAgICAgICAgICBpbnQgaW5JZHggPSBpbk9mZnNldCArIGk7XG4gICAgICAgICAgdmVjNCB2YWx1ZXMgPSB2ZWM0KFxuICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIGluSWR4KSxcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCArIDEpLFxuICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIGluSWR4ICsgMiksXG4gICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgaW5JZHggKyAzKVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAke3VwZGF0ZVNuaXBwZXR9XG4gICAgICAgIH1cblxuICAgICAgICBpbnQgaW5JZHggPSBpbk9mZnNldCArICR7d2luZG93U2l6ZU5lYXJlc3RWZWM0fTtcbiAgICAgICAgaWYgKCR7d2luZG93U2l6ZVZlYzRSZW1haW5kZXIgPT09IDF9KSB7XG4gICAgICAgICAgdmVjNCB2YWx1ZXMgPSB2ZWM0KGdldFZhbHVlKGJhdGNoLCBpbklkeCksIDAuMCwgMC4wLCAwLjApO1xuXG4gICAgICAgICAgJHt1cGRhdGVTbmlwcGV0fVxuICAgICAgICB9IGVsc2UgaWYgKCR7d2luZG93U2l6ZVZlYzRSZW1haW5kZXIgPT09IDJ9KSB7XG4gICAgICAgICAgdmVjNCB2YWx1ZXMgPSB2ZWM0KFxuICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIGluSWR4KSxcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCArIDEpLCAwLjAsIDAuMCk7XG5cbiAgICAgICAgICAke3VwZGF0ZVNuaXBwZXR9XG4gICAgICAgIH0gZWxzZSBpZiAoJHt3aW5kb3dTaXplVmVjNFJlbWFpbmRlciA9PT0gM30pIHtcbiAgICAgICAgICB2ZWM0IHZhbHVlcyA9IHZlYzQoXG4gICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgaW5JZHgpLFxuICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIGluSWR4ICsgMSksXG4gICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgaW5JZHggKyAyKSwgMC4wKTtcblxuICAgICAgICAgICR7dXBkYXRlU25pcHBldH1cbiAgICAgICAgfVxuICAgICAgICBzZXRPdXRwdXQoc3VtVmFsdWUpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5pbXBvcnQge2dldENvb3Jkc0RhdGFUeXBlfSBmcm9tICcuL3NoYWRlcl9jb21waWxlcic7XG5cbmV4cG9ydCBjbGFzcyBNaXJyb3JQYWRQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsneCddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICB4U2hhcGU6IG51bWJlcltdLCBwYWRkaW5nczogQXJyYXk8W251bWJlciwgbnVtYmVyXT4sXG4gICAgICBtb2RlOiAncmVmbGVjdCd8J3N5bW1ldHJpYycpIHtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gcGFkZGluZ3MubWFwKFxuICAgICAgICAocCwgaSkgPT4gcFswXSAvKiBiZWZvcmVQYWQgKi8gKyB4U2hhcGVbaV0gKyBwWzFdIC8qIGFmdGVyUGFkICovKTtcbiAgICBjb25zdCByYW5rID0geFNoYXBlLmxlbmd0aDtcbiAgICBjb25zdCBkdHlwZSA9IGdldENvb3Jkc0RhdGFUeXBlKHJhbmspO1xuXG4gICAgY29uc3Qgc3RhcnQgPSBwYWRkaW5ncy5tYXAocCA9PiBwWzBdKS5qb2luKCcsJyk7XG4gICAgY29uc3QgZW5kID0gcGFkZGluZ3MubWFwKChwLCBpKSA9PiBwWzBdICsgeFNoYXBlW2ldKS5qb2luKCcsJyk7XG4gICAgY29uc3QgdW5wYWNrZWRDb29yZHMgPVxuICAgICAgICBbJ2Nvb3Jkc1swXScsICdjb29yZHNbMV0nLCAnY29vcmRzWzJdJywgJ2Nvb3Jkc1szXSddLnNsaWNlKDAsIHJhbmspO1xuICAgIGNvbnN0IG9mZnNldCA9IG1vZGUgPT09ICdyZWZsZWN0JyA/IDAgOiAxO1xuXG4gICAgaWYgKHJhbmsgPT09IDEpIHtcbiAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICAgIGludCBzdGFydCA9ICR7c3RhcnR9O1xuICAgICAgICBpbnQgZW5kID0gJHtlbmR9O1xuXG4gICAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgICBpbnQgb3V0QyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICAgIGlmIChvdXRDIDwgc3RhcnQpIHtcbiAgICAgICAgICAgIG91dEMgPSBzdGFydCAqIDIgLSBvdXRDIC0gJHtvZmZzZXR9O1xuICAgICAgICAgIH0gZWxzZSBpZihvdXRDID49IGVuZCkge1xuICAgICAgICAgICAgb3V0QyA9IChlbmQgLSAxKSAqIDIgLSBvdXRDICsgJHtvZmZzZXR9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBzZXRPdXRwdXQoZ2V0WChvdXRDIC0gc3RhcnQpKTtcbiAgICAgICAgfVxuICAgICAgYDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgICR7ZHR5cGV9IHN0YXJ0ID0gJHtkdHlwZX0oJHtzdGFydH0pO1xuICAgICAgJHtkdHlwZX0gZW5kID0gJHtkdHlwZX0oJHtlbmR9KTtcblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAke2R0eXBlfSBvdXRDID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgJHtyYW5rfTsgaSsrKSB7XG4gICAgICAgICAgaWYgKG91dENbaV0gPCBzdGFydFtpXSkge1xuICAgICAgICAgICAgb3V0Q1tpXSA9IHN0YXJ0W2ldICogMiAtIG91dENbaV0gLSAke29mZnNldH07XG4gICAgICAgICAgfSBlbHNlIGlmKG91dENbaV0gPj0gZW5kW2ldKSB7XG4gICAgICAgICAgICBvdXRDW2ldID0gKGVuZFtpXSAtIDEpICogMiAtIG91dENbaV0gKyAke29mZnNldH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgICR7ZHR5cGV9IGNvb3JkcyA9IG91dEMgLSBzdGFydDtcbiAgICAgICAgc2V0T3V0cHV0KGdldFgoJHt1bnBhY2tlZENvb3Jkc30pKTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuaW1wb3J0IHtnZXRDaGFubmVsc30gZnJvbSAnLi9wYWNraW5nX3V0aWwnO1xuaW1wb3J0IHtnZXRDb29yZHNEYXRhVHlwZX0gZnJvbSAnLi9zaGFkZXJfY29tcGlsZXInO1xuXG4vKipcbiAqIEV4YW1wbGUgc2hhZGVyIGNvZGUgZm9yXG4gKiBgbWlycm9yUGFkKHRmLnRlbnNvcjFkKFsxLCAyLCAzXSwgJ2ludDMyJyksIFtbMiwgMl1dLCAncmVmbGVjdCcpYFxuICogYGBgXG4gKiAgICBjb25zdCBpbnQgc3RhcnQgPSBpbnQoMik7XG4gKiAgICBjb25zdCBpbnQgZW5kID0gaW50KDUpO1xuICpcbiAqICAgIHZvaWQgbWFpbigpIHtcbiAqICAgICAgIGludCBvdXRwdXRMb2MgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAqICAgICAgIHZlYzQgcmVzdWx0ID0gdmVjNCgwLik7XG4gKlxuICogICAgICAgaW50IHJjID0gb3V0cHV0TG9jO1xuICpcbiAqICAgICAgIGludCBzb3VyY2UgPSByYztcbiAqICAgICAgIGlmIChzb3VyY2UgPCBzdGFydCkge1xuICogICAgICAgICBzb3VyY2UgPSBzdGFydCAqIDIgLSBzb3VyY2UgLSAwO1xuICogICAgICAgfSBlbHNlIGlmIChzb3VyY2UgPj0gZW5kKSB7XG4gKiAgICAgICAgIHNvdXJjZSA9IChlbmQgLSAxKSAqIDIgLSBzb3VyY2UgKyAwO1xuICogICAgICAgfVxuICogICAgICAgc291cmNlIC09IHN0YXJ0O1xuICpcbiAqICAgICAgIHJlc3VsdFswXSA9IGdldENoYW5uZWwoZ2V0WChzb3VyY2UpLCBzb3VyY2UpO1xuICogICAgICAgcmMgKz0gMTtcbiAqICAgICAgIGlmKHJjIDwgNikge1xuICogICAgICAgICAgaW50IHNvdXJjZSA9IHJjO1xuICogICAgICAgICAgaWYgKHNvdXJjZSA8IHN0YXJ0KSB7XG4gKiAgICAgICAgICAgIHNvdXJjZSA9IHN0YXJ0ICogMiAtIHNvdXJjZSAtIDA7XG4gKiAgICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZSA+PSBlbmQpIHtcbiAqICAgICAgICAgICAgc291cmNlID0gKGVuZCAtIDEpICogMiAtIHNvdXJjZSArIDA7XG4gKiAgICAgICAgICB9XG4gKiAgICAgICAgICBzb3VyY2UgLT0gc3RhcnQ7XG4gKlxuICogICAgICAgICByZXN1bHRbMV0gPSBnZXRDaGFubmVsKGdldFgoc291cmNlKSwgc291cmNlKTtcbiAqICAgICAgIH1cbiAqXG4gKiAgICAgICBzZXRPdXRwdXQocmVzdWx0KTtcbiAqICAgICB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIE1pcnJvclBhZFBhY2tlZFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWyd4J107XG4gIHBhY2tlZElucHV0cyA9IHRydWU7XG4gIHBhY2tlZE91dHB1dCA9IHRydWU7XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIHhTaGFwZTogbnVtYmVyW10sIHBhZGRpbmdzOiBBcnJheTxbbnVtYmVyLCBudW1iZXJdPixcbiAgICAgIG1vZGU6ICdyZWZsZWN0J3wnc3ltbWV0cmljJykge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBwYWRkaW5ncy5tYXAoXG4gICAgICAgIChwLCBpKSA9PiBwWzBdIC8qIGJlZm9yZVBhZCAqLyArIHhTaGFwZVtpXSArIHBbMV0gLyogYWZ0ZXJQYWQgKi8pO1xuICAgIGNvbnN0IHJhbmsgPSB4U2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IGR0eXBlID0gZ2V0Q29vcmRzRGF0YVR5cGUocmFuayk7XG5cbiAgICBjb25zdCBzdGFydCA9IHBhZGRpbmdzLm1hcChwID0+IHBbMF0pLmpvaW4oJywnKTtcbiAgICBjb25zdCBlbmQgPSBwYWRkaW5ncy5tYXAoKHAsIGkpID0+IHBbMF0gKyB4U2hhcGVbaV0pLmpvaW4oJywnKTtcbiAgICBjb25zdCBjb29yZHMgPSBnZXRDaGFubmVscygncmMnLCByYW5rKTtcbiAgICBjb25zdCBzb3VyY2UgPSBnZXRDaGFubmVscygnc291cmNlJywgcmFuayk7XG4gICAgY29uc3QgY0xpbWl0ID0gYCR7Y29vcmRzW3JhbmsgLSAxXX0gPCAke3RoaXMub3V0cHV0U2hhcGVbcmFuayAtIDFdfWA7XG4gICAgY29uc3QgaW5uZXJEaW1zID1cbiAgICAgICAgcmFuayA9PT0gMSA/ICdzb3VyY2UnIDogYHZlYzIoJHtzb3VyY2Uuc2xpY2UoLTIpLmpvaW4oKX0pYDtcbiAgICBjb25zdCBvZmZzZXQgPSBtb2RlID09PSAncmVmbGVjdCcgPyAwIDogMTtcblxuICAgIGxldCBtYWluTG9vcCA9ICcnO1xuICAgIGlmIChyYW5rID09PSAxKSB7XG4gICAgICBjb25zdCBwYWRTZXR1cCA9IGBcbiAgICAgICAgJHtkdHlwZX0gc291cmNlID0gcmM7XG4gICAgICAgIGlmIChzb3VyY2UgPCBzdGFydCkge1xuICAgICAgICAgIHNvdXJjZSA9IHN0YXJ0ICogMiAtIHNvdXJjZSAtICR7b2Zmc2V0fTtcbiAgICAgICAgfSBlbHNlIGlmIChzb3VyY2UgPj0gZW5kKSB7XG4gICAgICAgICAgc291cmNlID0gKGVuZCAtIDEpICogMiAtIHNvdXJjZSArICR7b2Zmc2V0fTtcbiAgICAgICAgfVxuICAgICAgICBzb3VyY2UgLT0gc3RhcnQ7XG4gICAgICBgO1xuICAgICAgbWFpbkxvb3AgPSBgXG4gICAgICAgICR7ZHR5cGV9IHJjID0gb3V0cHV0TG9jO1xuICAgICAgICAke3BhZFNldHVwfVxuICAgICAgICByZXN1bHRbMF0gPSBnZXRDaGFubmVsKGdldFgoJHtzb3VyY2Uuam9pbigpfSksICR7aW5uZXJEaW1zfSk7XG4gICAgICAgICR7Y29vcmRzW3JhbmsgLSAxXX0gKz0gMTtcbiAgICAgICAgaWYoJHtjTGltaXR9KSB7XG4gICAgICAgICAgJHtwYWRTZXR1cH1cbiAgICAgICAgICByZXN1bHRbMV0gPSBnZXRDaGFubmVsKGdldFgoJHtzb3VyY2Uuam9pbigpfSksICR7aW5uZXJEaW1zfSk7XG4gICAgICAgIH1cbiAgICAgIGA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHBhZFNldHVwID0gYFxuICAgICAgICAke2R0eXBlfSBzb3VyY2UgPSByYztcbiAgICAgICAgJHtkdHlwZX0gbHQgPSAke2R0eXBlfShsZXNzVGhhbihzb3VyY2UsIHN0YXJ0KSk7XG4gICAgICAgICR7ZHR5cGV9IGd0ZSA9ICR7ZHR5cGV9KGdyZWF0ZXJUaGFuRXF1YWwoc291cmNlLCBlbmQpKTtcbiAgICAgICAgJHtkdHlwZX0gb3JpZyA9IDEgLSAobHQgKyBndGUpO1xuICAgICAgICBzb3VyY2UgPSBvcmlnICogc291cmNlICtcbiAgICAgICAgICAgICAgICBsdCAqIChzdGFydCAqIDIgLSBzb3VyY2UgLSAke29mZnNldH0pICtcbiAgICAgICAgICAgICAgICBndGUgKiAoKGVuZCAtIDEpICogMiAtIHNvdXJjZSArICR7b2Zmc2V0fSk7XG4gICAgICAgIHNvdXJjZSAtPSBzdGFydDtcbiAgICAgIGA7XG5cbiAgICAgIG1haW5Mb29wID0gYFxuICAgICAgICAke2R0eXBlfSByYyA9IG91dHB1dExvYztcbiAgICAgICAgJHtwYWRTZXR1cH1cbiAgICAgICAgcmVzdWx0WzBdID0gZ2V0Q2hhbm5lbChnZXRYKCR7c291cmNlLmpvaW4oKX0pLCAke2lubmVyRGltc30pO1xuICAgICAgICAke2Nvb3Jkc1tyYW5rIC0gMV19ICs9IDE7XG4gICAgICAgIGlmKCR7Y0xpbWl0fSkge1xuICAgICAgICAgICR7cGFkU2V0dXB9XG4gICAgICAgICAgcmVzdWx0WzFdID0gZ2V0Q2hhbm5lbChnZXRYKCR7c291cmNlLmpvaW4oKX0pLCAke2lubmVyRGltc30pO1xuICAgICAgICB9XG4gICAgICAgIHJjID0gb3V0cHV0TG9jO1xuICAgICAgICAke2Nvb3Jkc1tyYW5rIC0gMl19ICs9IDE7XG4gICAgICAgIGlmKCR7Y29vcmRzW3JhbmsgLSAyXX0gPCAke3RoaXMub3V0cHV0U2hhcGVbcmFuayAtIDJdfSkge1xuICAgICAgICAgICR7cGFkU2V0dXB9XG4gICAgICAgICAgcmVzdWx0WzJdID0gZ2V0Q2hhbm5lbChnZXRYKCR7c291cmNlLmpvaW4oKX0pLCAke2lubmVyRGltc30pO1xuICAgICAgICAgICR7Y29vcmRzW3JhbmsgLSAxXX0gKz0gMTtcbiAgICAgICAgICBpZigke2NMaW1pdH0pIHtcbiAgICAgICAgICAgICR7cGFkU2V0dXB9XG4gICAgICAgICAgICByZXN1bHRbM10gPSBnZXRDaGFubmVsKGdldFgoJHtzb3VyY2Uuam9pbigpfSksICR7aW5uZXJEaW1zfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBgO1xuICAgIH1cblxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICBjb25zdCAke2R0eXBlfSBzdGFydCA9ICR7ZHR5cGV9KCR7c3RhcnR9KTtcbiAgICAgIGNvbnN0ICR7ZHR5cGV9IGVuZCA9ICR7ZHR5cGV9KCR7ZW5kfSk7XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgJHtkdHlwZX0gb3V0cHV0TG9jID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIHZlYzQgcmVzdWx0ID0gdmVjNCgwLik7XG4gICAgICAgICR7bWFpbkxvb3B9XG4gICAgICAgIHNldE91dHB1dChyZXN1bHQpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtHUEdQVVByb2dyYW0sIHVzZVNoYXBlVW5pZm9ybXN9IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5cbmV4cG9ydCBjbGFzcyBNYXRNdWxQYWNrZWRQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnbWF0cml4QScsICdtYXRyaXhCJ107XG4gIHBhY2tlZElucHV0cyA9IHRydWU7XG4gIHBhY2tlZE91dHB1dCA9IHRydWU7XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcbiAgZW5hYmxlU2hhcGVVbmlmb3JtczogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIGFTaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdLCBiU2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICAgIG91dHB1dFNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIHRyYW5zcG9zZUEgPSBmYWxzZSxcbiAgICAgIHRyYW5zcG9zZUIgPSBmYWxzZSwgYWRkQmlhcyA9IGZhbHNlLCBhY3RpdmF0aW9uOiBzdHJpbmcgPSBudWxsLFxuICAgICAgaGFzUHJlbHVBY3RpdmF0aW9uID0gZmFsc2UsIGhhc0xlYWt5cmVsdUFjdGl2YXRpb24gPSBmYWxzZSkge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBvdXRwdXRTaGFwZTtcbiAgICB0aGlzLmVuYWJsZVNoYXBlVW5pZm9ybXMgPSB1c2VTaGFwZVVuaWZvcm1zKHRoaXMub3V0cHV0U2hhcGUubGVuZ3RoKTtcblxuICAgIGNvbnN0IHNoYXJlZERpbSA9IHRyYW5zcG9zZUEgPyBhU2hhcGVbMV0gOiBhU2hhcGVbMl07XG4gICAgY29uc3Qgc2hhcmVkRGltZW5zaW9uUGFja2VkID0gTWF0aC5jZWlsKHNoYXJlZERpbSAvIDIpO1xuXG4gICAgY29uc3QgYVNhbXBsZSA9IHRyYW5zcG9zZUEgPyAnaSAqIDIsIHJjLnknIDogJ3JjLnksIGkgKiAyJztcbiAgICBjb25zdCBiU2FtcGxlID0gdHJhbnNwb3NlQiA/ICdyYy56LCBpICogMicgOiAnaSAqIDIsIHJjLnonO1xuICAgIGNvbnN0IGFTd2l6emxlID0gdHJhbnNwb3NlQSA/IFsnYS54eHl5JywgJ2Euenp3dyddIDogWydhLnh4enonLCAnYS55eXd3J107XG4gICAgY29uc3QgYlN3aXp6bGUgPSB0cmFuc3Bvc2VCID8gWydiLnh6eHonLCAnYi55d3l3J10gOiBbJ2IueHl4eScsICdiLnp3encnXTtcblxuICAgIGxldCBhY3RpdmF0aW9uU25pcHBldCA9ICcnLCBhcHBseUFjdGl2YXRpb25TbmlwcGV0ID0gJyc7XG4gICAgaWYgKGFjdGl2YXRpb24pIHtcbiAgICAgIGlmIChoYXNQcmVsdUFjdGl2YXRpb24pIHtcbiAgICAgICAgYWN0aXZhdGlvblNuaXBwZXQgPSBgdmVjNCBhY3RpdmF0aW9uKHZlYzQgYSkge1xuICAgICAgICAgIHZlYzQgYiA9IGdldFByZWx1QWN0aXZhdGlvbldlaWdodHNBdE91dENvb3JkcygpO1xuICAgICAgICAgICR7YWN0aXZhdGlvbn1cbiAgICAgICAgfWA7XG4gICAgICB9IGVsc2UgaWYgKGhhc0xlYWt5cmVsdUFjdGl2YXRpb24pIHtcbiAgICAgICAgYWN0aXZhdGlvblNuaXBwZXQgPSBgdmVjNCBhY3RpdmF0aW9uKHZlYzQgYSkge1xuICAgICAgICAgIHZlYzQgYiA9IGdldExlYWt5cmVsdUFscGhhQXRPdXRDb29yZHMoKTtcbiAgICAgICAgICAke2FjdGl2YXRpb259XG4gICAgICAgIH1gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWN0aXZhdGlvblNuaXBwZXQgPSBgdmVjNCBhY3RpdmF0aW9uKHZlYzQgeCkge1xuICAgICAgICAgICR7YWN0aXZhdGlvbn1cbiAgICAgICAgfWA7XG4gICAgICB9XG5cbiAgICAgIGFwcGx5QWN0aXZhdGlvblNuaXBwZXQgPSBgcmVzdWx0ID0gYWN0aXZhdGlvbihyZXN1bHQpO2A7XG4gICAgfVxuXG4gICAgY29uc3QgYWRkQmlhc1NuaXBwZXQgPSBhZGRCaWFzID8gJ3Jlc3VsdCArPSBnZXRCaWFzQXRPdXRDb29yZHMoKTsnIDogJyc7XG4gICAgaWYgKGFkZEJpYXMpIHtcbiAgICAgIHRoaXMudmFyaWFibGVOYW1lcy5wdXNoKCdiaWFzJyk7XG4gICAgfVxuXG4gICAgaWYgKGhhc1ByZWx1QWN0aXZhdGlvbikge1xuICAgICAgdGhpcy52YXJpYWJsZU5hbWVzLnB1c2goJ3ByZWx1QWN0aXZhdGlvbldlaWdodHMnKTtcbiAgICB9XG5cbiAgICBpZiAoaGFzTGVha3lyZWx1QWN0aXZhdGlvbikge1xuICAgICAgdGhpcy52YXJpYWJsZU5hbWVzLnB1c2goJ2xlYWt5cmVsdUFscGhhJyk7XG4gICAgfVxuXG4gICAgbGV0IGJhdGNoQVNuaXBwZXQgPSAncmMueCc7XG4gICAgbGV0IGJhdGNoQlNuaXBwZXQgPSAncmMueCc7XG4gICAgaWYgKGFTaGFwZVswXSA8IGJTaGFwZVswXSkge1xuICAgICAgYmF0Y2hBU25pcHBldCA9IGBpbnQobWluKGZsb2F0KHJjLngpLCAke2FTaGFwZVswXSAtIDF9LikpYDtcbiAgICB9IGVsc2UgaWYgKGJTaGFwZVswXSA8IGFTaGFwZVswXSkge1xuICAgICAgYmF0Y2hCU25pcHBldCA9IGBpbnQobWluKGZsb2F0KHJjLngpLCAke2JTaGFwZVswXSAtIDF9LikpYDtcbiAgICB9XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgJHthY3RpdmF0aW9uU25pcHBldH1cbiAgICAgIC8vIERvbid0IHVzZSB1bmlmb3JtIGZvciBzaGFyZWREaW1lbnNpb25QYWNrZWQgZm9yIHBlcmZvcm1hbmNlLlxuICAgICAgY29uc3QgZmxvYXQgc2hhcmVkRGltZW5zaW9uID0gJHtzaGFyZWREaW1lbnNpb25QYWNrZWR9LjA7XG5cbiAgICAgIHZlYzQgZG90MngyQVJvd0JDb2woaXZlYzMgcmMpIHtcbiAgICAgICAgdmVjNCByZXN1bHQgPSB2ZWM0KDApO1xuICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8ICR7c2hhcmVkRGltZW5zaW9uUGFja2VkfTsgaSsrKSB7XG4gICAgICAgICAgaW50IGJhdGNoQSA9ICR7YmF0Y2hBU25pcHBldH07XG4gICAgICAgICAgaW50IGJhdGNoQiA9ICR7YmF0Y2hCU25pcHBldH07XG4gICAgICAgICAgdmVjNCBhID0gZ2V0TWF0cml4QShiYXRjaEEsICR7YVNhbXBsZX0pO1xuICAgICAgICAgIHZlYzQgYiA9IGdldE1hdHJpeEIoYmF0Y2hCLCAke2JTYW1wbGV9KTtcblxuICAgICAgICAgIC8vIFRoZXNlIHN3aXp6bGVkIHByb2R1Y3RzIG5lZWQgdG8gYmUgc2VwYXJhdGVseSBhZGRlZC5cbiAgICAgICAgICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RmanMvaXNzdWVzLzE3MzVcbiAgICAgICAgICByZXN1bHQgKz0gKCR7YVN3aXp6bGVbMF19ICogJHtiU3dpenpsZVswXX0pO1xuICAgICAgICAgIHJlc3VsdCArPSAoJHthU3dpenpsZVsxXX0gKiAke2JTd2l6emxlWzFdfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjMyByYyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICB2ZWM0IHJlc3VsdCA9IGRvdDJ4MkFSb3dCQ29sKHJjKTtcblxuICAgICAgICAke2FkZEJpYXNTbmlwcGV0fVxuXG4gICAgICAgICR7YXBwbHlBY3RpdmF0aW9uU25pcHBldH1cblxuICAgICAgICBzZXRPdXRwdXQocmVzdWx0KTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuaW1wb3J0IHtVbmlmb3JtVHlwZX0gZnJvbSAnLi9zaGFkZXJfY29tcGlsZXInO1xuXG5leHBvcnQgY2xhc3MgTXVsdGlub21pYWxQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsncHJvYnMnXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuICBjdXN0b21Vbmlmb3JtcyA9IFt7bmFtZTogJ3NlZWQnLCB0eXBlOiAnZmxvYXQnIGFzIFVuaWZvcm1UeXBlfV07XG5cbiAgY29uc3RydWN0b3IoYmF0Y2hTaXplOiBudW1iZXIsIG51bU91dGNvbWVzOiBudW1iZXIsIG51bVNhbXBsZXM6IG51bWJlcikge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBbYmF0Y2hTaXplLCBudW1TYW1wbGVzXTtcblxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWMyIGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgYmF0Y2ggPSBjb29yZHNbMF07XG5cbiAgICAgICAgZmxvYXQgciA9IHJhbmRvbShzZWVkKTtcbiAgICAgICAgZmxvYXQgY2RmID0gMC4wO1xuXG4gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgJHtudW1PdXRjb21lcyAtIDF9OyBpKyspIHtcbiAgICAgICAgICBjZGYgKz0gZ2V0UHJvYnMoYmF0Y2gsIGkpO1xuXG4gICAgICAgICAgaWYgKHIgPCBjZGYpIHtcbiAgICAgICAgICAgIHNldE91dHB1dChmbG9hdChpKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgbm8gb3RoZXIgZXZlbnQgaGFwcGVuZWQsIGxhc3QgZXZlbnQgaGFwcGVuZWQuXG4gICAgICAgIHNldE91dHB1dChmbG9hdCgke251bU91dGNvbWVzIC0gMX0pKTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuXG5leHBvcnQgY2xhc3MgT25lSG90UHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ2luZGljZXMnXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuXG4gIC8vIENhY2hpbmcgdW5pZm9ybSBsb2NhdGlvbiBmb3Igc3BlZWQuXG4gIHNlZWRMb2M6IFdlYkdMVW5pZm9ybUxvY2F0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgbnVtSW5kaWNlczogbnVtYmVyLCBkZXB0aDogbnVtYmVyLCBvblZhbHVlOiBudW1iZXIsIG9mZlZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gW251bUluZGljZXMsIGRlcHRoXTtcblxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWMyIGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgaW5kZXggPSByb3VuZChnZXRJbmRpY2VzKGNvb3Jkcy54KSk7XG4gICAgICAgIHNldE91dHB1dChtaXgoZmxvYXQoJHtvZmZWYWx1ZX0pLCBmbG9hdCgke29uVmFsdWV9KSxcbiAgICAgICAgICAgICAgICAgICAgICBmbG9hdChpbmRleCA9PSBjb29yZHMueSkpKTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuaW1wb3J0IHtnZXRDaGFubmVsc30gZnJvbSAnLi9wYWNraW5nX3V0aWwnO1xuaW1wb3J0IHtnZXRDb29yZHNEYXRhVHlwZX0gZnJvbSAnLi9zaGFkZXJfY29tcGlsZXInO1xuXG5leHBvcnQgY2xhc3MgUGFja1Byb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWydBJ107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcbiAgcGFja2VkSW5wdXRzID0gZmFsc2U7XG4gIHBhY2tlZE91dHB1dCA9IHRydWU7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBvdXRwdXRTaGFwZTpcbiAgICAgICAgICBudW1iZXJbXSkgeyAgLy8gVE9ETyhodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZmpzL2lzc3Vlcy84OTMpOlxuICAgICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IGlucHV0IC8gb3V0cHV0IDNEIHRlbnNvcnMuXG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IG91dHB1dFNoYXBlO1xuICAgIGNvbnN0IHJhbmsgPSBvdXRwdXRTaGFwZS5sZW5ndGg7XG5cbiAgICBpZiAocmFuayA9PT0gMCkge1xuICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAgIHNldE91dHB1dCh2ZWM0KGdldEEoKSwgMC4sIDAuLCAwLikpO1xuICAgICAgICB9XG4gICAgICBgO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjaGFubmVscyA9IGdldENoYW5uZWxzKCdyYycsIHJhbmspO1xuICAgICAgY29uc3QgZHR5cGUgPSBnZXRDb29yZHNEYXRhVHlwZShyYW5rKTtcbiAgICAgIGNvbnN0IG91dE9mQm91bmRzQ29uZGl0aW9uID1cbiAgICAgICAgICBnZXRPdXRPZkJvdW5kc0NvbmRpdGlvbihyYW5rLCBvdXRwdXRTaGFwZSwgY2hhbm5lbHMpO1xuICAgICAgY29uc3Qgc2V0dXAgPSBnZXRTZXR1cChcbiAgICAgICAgICByYW5rLCBvdXRwdXRTaGFwZVtvdXRwdXRTaGFwZS5sZW5ndGggLSAxXSxcbiAgICAgICAgICBvdXRwdXRTaGFwZVtvdXRwdXRTaGFwZS5sZW5ndGggLSAyXSwgY2hhbm5lbHMpO1xuICAgICAgY29uc3Qgb3V0cHV0ID0gZ2V0T3V0cHV0KG91dHB1dFNoYXBlLCBjaGFubmVscyk7XG5cbiAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgICAke2R0eXBlfSByYyA9IGdldE91dHB1dENvb3JkcygpO1xuXG4gICAgICAgICAgaWYoJHtvdXRPZkJvdW5kc0NvbmRpdGlvbn0pIHtcbiAgICAgICAgICAgIHNldE91dHB1dCh2ZWM0KDApKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgJHtzZXR1cH1cblxuICAgICAgICAgICAgc2V0T3V0cHV0KHZlYzQoJHtvdXRwdXR9KSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBgO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRTb3VyY2VDb29yZHNBcnIocmFuazogbnVtYmVyLCBkaW1zOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgY29uc3QgY29vcmRzID0gW107XG5cbiAgZm9yIChsZXQgcm93ID0gMDsgcm93IDw9IDE7IHJvdysrKSB7XG4gICAgZm9yIChsZXQgY29sID0gMDsgY29sIDw9IDE7IGNvbCsrKSB7XG4gICAgICBsZXQgY29vcmQgPSBgJHtyb3cgPT09IDAgPyAncicgOiAncnAxJ30sICR7Y29sID09PSAwID8gJ2MnIDogJ2NwMSd9YDtcblxuICAgICAgZm9yIChsZXQgZCA9IDI7IGQgPCByYW5rOyBkKyspIHtcbiAgICAgICAgY29vcmQgPSBgJHtkaW1zW2RpbXMubGVuZ3RoIC0gMSAtIGRdfSxgICsgY29vcmQ7XG4gICAgICB9XG5cbiAgICAgIGNvb3Jkcy5wdXNoKGNvb3JkKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNvb3Jkcztcbn1cblxuZnVuY3Rpb24gZ2V0T3V0T2ZCb3VuZHNDb25kaXRpb24oXG4gICAgcmFuazogbnVtYmVyLCBzaGFwZTogbnVtYmVyW10sIGRpbXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgaWYgKHJhbmsgPT09IDEpIHtcbiAgICByZXR1cm4gYHJjID4gJHtzaGFwZVswXX1gO1xuICB9XG5cbiAgbGV0IGNvbmQgPSAnJztcbiAgZm9yIChsZXQgaSA9IHJhbmsgLSAyOyBpIDwgcmFuazsgaSsrKSB7XG4gICAgY29uZCArPSBgJHtkaW1zW2ldfSA+PSAke3NoYXBlW2ldfWA7XG4gICAgaWYgKGkgPCByYW5rIC0gMSkge1xuICAgICAgY29uZCArPSAnfHwnO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjb25kO1xufVxuXG5mdW5jdGlvbiBnZXRTZXR1cChcbiAgICByYW5rOiBudW1iZXIsIGNvbHM6IG51bWJlciwgcm93czogbnVtYmVyLCBkaW1zOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIGlmIChyYW5rID09PSAxKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgY29uc3QgaW5uZXJEaW1zID0gZGltcy5zbGljZSgtMik7XG5cbiAgcmV0dXJuIGBcbiAgICBpbnQgciA9ICR7aW5uZXJEaW1zWzBdfTtcbiAgICBpbnQgYyA9ICR7aW5uZXJEaW1zWzFdfTtcbiAgICBpbnQgcnAxID0gciArIDE7XG4gICAgaW50IGNwMSA9IGMgKyAxO1xuXG4gICAgYm9vbCBjRWRnZSA9IGNwMSA+PSAke2NvbHN9O1xuICAgIGJvb2wgckVkZ2UgPSBycDEgPj0gJHtyb3dzfTtcbiAgYDtcbn1cblxuZnVuY3Rpb24gZ2V0T3V0cHV0KHNoYXBlOiBudW1iZXJbXSwgZGltczogc3RyaW5nW10pOiBzdHJpbmcge1xuICBjb25zdCByYW5rID0gc2hhcGUubGVuZ3RoO1xuICBjb25zdCBzb3VyY2VDb29yZHMgPSBnZXRTb3VyY2VDb29yZHNBcnIocmFuaywgZGltcyk7XG4gIGlmIChyYW5rID09PSAxKSB7XG4gICAgcmV0dXJuIGBnZXRBKHJjKSxcbiAgICAgICAgICAgIHJjICsgMSA+PSAke3NoYXBlWzBdfSA/IDAuIDogZ2V0QShyYyArIDEpLFxuICAgICAgICAgICAgMCwgMGA7XG4gIH1cblxuICByZXR1cm4gYGdldEEoJHtzb3VyY2VDb29yZHNbMF19KSxcbiAgICAgICAgICBjRWRnZSA/IDAuIDogZ2V0QSgke3NvdXJjZUNvb3Jkc1sxXX0pLFxuICAgICAgICAgIHJFZGdlID8gMC4gOiBnZXRBKCR7c291cmNlQ29vcmRzWzJdfSksXG4gICAgICAgICAgckVkZ2UgfHwgY0VkZ2UgPyAwLiA6IGdldEEoJHtzb3VyY2VDb29yZHNbM119KWA7XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRWZWNDaGFubmVscyhuYW1lOiBzdHJpbmcsIHJhbms6IG51bWJlcik6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFsneCcsICd5JywgJ3onLCAndycsICd1JywgJ3YnXS5zbGljZSgwLCByYW5rKS5tYXAoZCA9PiBgJHtuYW1lfS4ke2R9YCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDaGFubmVscyhuYW1lOiBzdHJpbmcsIHJhbms6IG51bWJlcik6IHN0cmluZ1tdIHtcbiAgaWYgKHJhbmsgPT09IDEpIHtcbiAgICByZXR1cm4gW25hbWVdO1xuICB9XG4gIHJldHVybiBnZXRWZWNDaGFubmVscyhuYW1lLCByYW5rKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNvdXJjZUNvb3JkcyhyYW5rOiBudW1iZXIsIGRpbXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgaWYgKHJhbmsgPT09IDEpIHtcbiAgICByZXR1cm4gJ3JjJztcbiAgfVxuXG4gIGxldCBjb29yZHMgPSAnJztcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByYW5rOyBpKyspIHtcbiAgICBjb29yZHMgKz0gZGltc1tpXTtcbiAgICBpZiAoaSA8IHJhbmsgLSAxKSB7XG4gICAgICBjb29yZHMgKz0gJywnO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY29vcmRzO1xufSIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5pbXBvcnQge2dldENvb3Jkc0RhdGFUeXBlLCBVbmlmb3JtVHlwZX0gZnJvbSAnLi9zaGFkZXJfY29tcGlsZXInO1xuXG5leHBvcnQgY2xhc3MgUGFkUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ3gnXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuICBjdXN0b21Vbmlmb3JtcyA9IFt7bmFtZTogJ3ZhbHVlJywgdHlwZTogJ2Zsb2F0JyBhcyBVbmlmb3JtVHlwZX1dO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgeFNoYXBlOiBudW1iZXJbXSwgcGFkZGluZ3M6IEFycmF5PFtudW1iZXIsIG51bWJlcl0+LFxuICAgICAgY29uc3RhbnRWYWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IHBhZGRpbmdzLm1hcChcbiAgICAgICAgKHAsIGkpID0+IHBbMF0gLyogYmVmb3JlUGFkICovICsgeFNoYXBlW2ldICsgcFsxXSAvKiBhZnRlclBhZCAqLyk7XG4gICAgY29uc3QgcmFuayA9IHhTaGFwZS5sZW5ndGg7XG4gICAgY29uc3QgdHlwZSA9IGdldENvb3Jkc0RhdGFUeXBlKHJhbmspO1xuXG4gICAgY29uc3Qgc3RhcnQgPSBwYWRkaW5ncy5tYXAocCA9PiBwWzBdKS5qb2luKCcsJyk7XG4gICAgY29uc3QgZW5kID0gcGFkZGluZ3MubWFwKChwLCBpKSA9PiBwWzBdICsgeFNoYXBlW2ldKS5qb2luKCcsJyk7XG4gICAgY29uc3QgdW5wYWNrZWRDb29yZHMgPVxuICAgICAgICBbJ2Nvb3Jkc1swXScsICdjb29yZHNbMV0nLCAnY29vcmRzWzJdJywgJ2Nvb3Jkc1szXSddLnNsaWNlKDAsIHJhbmspO1xuXG4gICAgaWYgKHJhbmsgPT09IDEpIHtcbiAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICAgIGludCBzdGFydCA9ICR7c3RhcnR9O1xuICAgICAgICBpbnQgZW5kID0gJHtlbmR9O1xuXG4gICAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgICBpbnQgb3V0QyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICAgIGlmIChvdXRDIDwgc3RhcnQgfHwgb3V0QyA+PSBlbmQpIHtcbiAgICAgICAgICAgIHNldE91dHB1dCh2YWx1ZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNldE91dHB1dChnZXRYKG91dEMgLSBzdGFydCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgYDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgICR7dHlwZX0gc3RhcnQgPSAke3R5cGV9KCR7c3RhcnR9KTtcbiAgICAgICR7dHlwZX0gZW5kID0gJHt0eXBlfSgke2VuZH0pO1xuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICR7dHlwZX0gb3V0QyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpZiAoYW55KGxlc3NUaGFuKG91dEMsIHN0YXJ0KSkgfHwgYW55KGdyZWF0ZXJUaGFuRXF1YWwob3V0QywgZW5kKSkpIHtcbiAgICAgICAgICBzZXRPdXRwdXQodmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICR7dHlwZX0gY29vcmRzID0gb3V0QyAtIHN0YXJ0O1xuICAgICAgICAgIHNldE91dHB1dChnZXRYKCR7dW5wYWNrZWRDb29yZHN9KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuaW1wb3J0IHtnZXRDaGFubmVsc30gZnJvbSAnLi9wYWNraW5nX3V0aWwnO1xuaW1wb3J0IHtnZXRDb29yZHNEYXRhVHlwZSwgVW5pZm9ybVR5cGV9IGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyJztcblxuZXhwb3J0IGNsYXNzIFBhZFBhY2tlZFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWyd4J107XG4gIHBhY2tlZElucHV0cyA9IHRydWU7XG4gIHBhY2tlZE91dHB1dCA9IHRydWU7XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcbiAgY3VzdG9tVW5pZm9ybXMgPSBbe25hbWU6ICd2YWx1ZScsIHR5cGU6ICdmbG9hdCcgYXMgVW5pZm9ybVR5cGV9XTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIHhTaGFwZTogbnVtYmVyW10sIHBhZGRpbmdzOiBBcnJheTxbbnVtYmVyLCBudW1iZXJdPixcbiAgICAgIGNvbnN0YW50VmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBwYWRkaW5ncy5tYXAoXG4gICAgICAgIChwLCBpKSA9PiBwWzBdIC8qIGJlZm9yZVBhZCAqLyArIHhTaGFwZVtpXSArIHBbMV0gLyogYWZ0ZXJQYWQgKi8pO1xuICAgIGNvbnN0IHJhbmsgPSB4U2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IGR0eXBlID0gZ2V0Q29vcmRzRGF0YVR5cGUocmFuayk7XG5cbiAgICBjb25zdCBzdGFydCA9IHBhZGRpbmdzLm1hcChwID0+IHBbMF0pLmpvaW4oJywnKTtcbiAgICBjb25zdCBlbmQgPSBwYWRkaW5ncy5tYXAoKHAsIGkpID0+IHBbMF0gKyB4U2hhcGVbaV0pLmpvaW4oJywnKTtcbiAgICBjb25zdCBjb29yZHMgPSBnZXRDaGFubmVscygncmMnLCByYW5rKTtcbiAgICBjb25zdCBzb3VyY2UgPSBnZXRDaGFubmVscygnc291cmNlJywgcmFuayk7XG4gICAgY29uc3QgY0xpbWl0ID0gYCR7Y29vcmRzW3JhbmsgLSAxXX0gPCAke3RoaXMub3V0cHV0U2hhcGVbcmFuayAtIDFdfWA7XG4gICAgY29uc3QgaW5uZXJEaW1zID1cbiAgICAgICAgcmFuayA9PT0gMSA/ICdzb3VyY2UnIDogYHZlYzIoJHtzb3VyY2Uuc2xpY2UoLTIpLmpvaW4oKX0pYDtcblxuICAgIGNvbnN0IGNvbXBvbmVudFNldHVwID0gW1xuICAgICAgYCR7ZHR5cGV9IHJjID0gb3V0cHV0TG9jO2AsIGAke2Nvb3Jkc1tyYW5rIC0gMV19ICs9IDE7XG4gICAgICAgaWYoJHtjTGltaXR9KSB7XG4gICAgICBgLFxuICAgICAgcmFuayA9PT0gMSA/ICcnIDogYH1cbiAgICAgICByYyA9IG91dHB1dExvYztcbiAgICAgICAke2Nvb3Jkc1tyYW5rIC0gMl19ICs9IDE7XG4gICAgICAgaWYoJHtjb29yZHNbcmFuayAtIDJdfSA8ICR7dGhpcy5vdXRwdXRTaGFwZVtyYW5rIC0gMl19KSB7YCxcbiAgICAgIHJhbmsgPT09IDEgPyAnJyA6IGAgICR7Y29vcmRzW3JhbmsgLSAxXX0gKz0gMTtcbiAgICAgICAgIGlmKCR7Y0xpbWl0fSkge2BcbiAgICBdO1xuXG4gICAgY29uc3QgcGFkZGluZ0FyZWEgPSByYW5rID09PSAxID9cbiAgICAgICAgJ3JjIDwgc3RhcnQgfHwgcmMgPj0gZW5kJyA6XG4gICAgICAgICdhbnkobGVzc1RoYW4ocmMsIHN0YXJ0KSkgfHwgYW55KGdyZWF0ZXJUaGFuRXF1YWwocmMsIGVuZCkpJztcbiAgICBsZXQgbWFpbkxvb3AgPSAnJztcbiAgICBmb3IgKGxldCBpID0gMCwgaiA9IHJhbmsgPT09IDEgPyAyIDogNDsgaSA8IGo7IGkrKykge1xuICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICAke2NvbXBvbmVudFNldHVwW2ldfVxuICAgICAgICBpZiAoJHtwYWRkaW5nQXJlYX0pIHtcbiAgICAgICAgICByZXN1bHRbJHtpfV0gPSBmbG9hdCh2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgJHtkdHlwZX0gc291cmNlID0gcmMgLSBzdGFydDtcbiAgICAgICAgICByZXN1bHRbJHtpfV0gPSBnZXRDaGFubmVsKGdldFgoJHtzb3VyY2Uuam9pbigpfSksICR7aW5uZXJEaW1zfSk7XG4gICAgICAgIH1cbiAgICAgIGA7XG4gICAgfVxuICAgIG1haW5Mb29wICs9IChyYW5rID09PSAxID8gYH0gYCA6IGB9fWApO1xuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGNvbnN0ICR7ZHR5cGV9IHN0YXJ0ID0gJHtkdHlwZX0oJHtzdGFydH0pO1xuICAgICAgY29uc3QgJHtkdHlwZX0gZW5kID0gJHtkdHlwZX0oJHtlbmR9KTtcblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAke2R0eXBlfSBvdXRwdXRMb2MgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgdmVjNCByZXN1bHQgPSB2ZWM0KDAuKTtcbiAgICAgICAgJHttYWluTG9vcH1cbiAgICAgICAgc2V0T3V0cHV0KHJlc3VsdCk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuXG5leHBvcnQgY2xhc3MgUG9vbDJEUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ3gnXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgY29udkluZm86IGJhY2tlbmRfdXRpbC5Db252MkRJbmZvLCBwb29sVHlwZTogJ21heCd8J2F2ZycsXG4gICAgICBjb21wdXRlUG9zaXRpb25zOiBib29sZWFuLCBmbGF0dGVuUG9zaXRpb25zID0gZmFsc2UsXG4gICAgICBpbmNsdWRlQmF0Y2hJbkluZGV4ID0gZmFsc2UpIHtcbiAgICBpZiAocG9vbFR5cGUgPT09ICdhdmcnICYmIGNvbXB1dGVQb3NpdGlvbnMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNvbXB1dGUgcG9zaXRpb25zIGZvciBhdmVyYWdlIHBvb2wuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZmlsdGVyV2lkdGggPSBjb252SW5mby5maWx0ZXJXaWR0aDtcbiAgICBjb25zdCBzdHJpZGVIZWlnaHQgPSBjb252SW5mby5zdHJpZGVIZWlnaHQ7XG4gICAgY29uc3Qgc3RyaWRlV2lkdGggPSBjb252SW5mby5zdHJpZGVXaWR0aDtcbiAgICBjb25zdCBkaWxhdGlvbkhlaWdodCA9IGNvbnZJbmZvLmRpbGF0aW9uSGVpZ2h0O1xuICAgIGNvbnN0IGRpbGF0aW9uV2lkdGggPSBjb252SW5mby5kaWxhdGlvbldpZHRoO1xuICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlckhlaWdodCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlckhlaWdodDtcbiAgICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlcldpZHRoO1xuXG4gICAgY29uc3QgcGFkVG9wID0gY29udkluZm8ucGFkSW5mby50b3A7XG4gICAgY29uc3QgcGFkTGVmdCA9IGNvbnZJbmZvLnBhZEluZm8ubGVmdDtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gY29udkluZm8ub3V0U2hhcGU7XG5cbiAgICBjb25zdCBpc0F2Z1Bvb2wgPSBwb29sVHlwZSA9PT0gJ2F2Zyc7XG4gICAgY29uc3QgYmF0Y2hGbGF0dGVuUG9zaXRpb25TdHIgPSBgKChiYXRjaCAgKiAke2NvbnZJbmZvLmluSGVpZ2h0fSArIHhSKSAqICR7XG4gICAgICAgIGNvbnZJbmZvLmluV2lkdGh9ICsgeEMpICogJHtjb252SW5mby5pbkNoYW5uZWxzfSArIGRgO1xuICAgIGNvbnN0IGZsYXR0ZW5Qb3NpdGlvblN0ciA9XG4gICAgICAgIGAoeFIgKiAke2NvbnZJbmZvLmluV2lkdGh9ICsgeEMpICogJHtjb252SW5mby5pbkNoYW5uZWxzfSArIGRgO1xuXG4gICAgbGV0IGluaXRpYWxpemF0aW9uVmFsdWUgPSAnMC4wJztcbiAgICBpZiAoIWlzQXZnUG9vbCkge1xuICAgICAgLy8gV2ViR0wgb24gRmlyZWZveCBMaW51eCBjYW4ndCBjb21waWxlIDEvMCBzbyB3ZSBkbyAxL2Vwcy5cbiAgICAgIGluaXRpYWxpemF0aW9uVmFsdWUgPSAnLTEuMCAvIDFlLTIwJztcbiAgICB9XG5cbiAgICBpZiAoY29tcHV0ZVBvc2l0aW9ucykge1xuICAgICAgY29uc3QgY29tcGFyZU9wID0gJz49JztcblxuICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgICAgY29uc3QgaXZlYzIgc3RyaWRlcyA9IGl2ZWMyKCR7c3RyaWRlSGVpZ2h0fSwgJHtzdHJpZGVXaWR0aH0pO1xuICAgICAgICBjb25zdCBpdmVjMiBwYWRzID0gaXZlYzIoJHtwYWRUb3B9LCAke3BhZExlZnR9KTtcblxuICAgICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgICAgaW50IGJhdGNoID0gY29vcmRzWzBdO1xuICAgICAgICAgIGludCBkID0gY29vcmRzWzNdO1xuXG4gICAgICAgICAgaXZlYzIgeFJDQ29ybmVyID0gY29vcmRzLnl6ICogc3RyaWRlcyAtIHBhZHM7XG4gICAgICAgICAgaW50IHhSQ29ybmVyID0geFJDQ29ybmVyLng7XG4gICAgICAgICAgaW50IHhDQ29ybmVyID0geFJDQ29ybmVyLnk7XG5cbiAgICAgICAgICAvLyBtYXgvbWluIHgoPywgPywgZCkgdG8gZ2V0IHkoeVIsIHlDLCBkKS5cbiAgICAgICAgICAvLyA/ID0gdG8gYmUgZGV0ZXJtaW5lZFxuICAgICAgICAgIGZsb2F0IG1pbk1heFZhbHVlID0gMC4wO1xuICAgICAgICAgIGZsb2F0IG1pbk1heFZhbHVlRm91bmQgPSAwLjA7XG4gICAgICAgICAgaW50IG1pbk1heFBvc2l0aW9uID0gMDtcbiAgICAgICAgICBmbG9hdCBhdmdWYWx1ZSA9IDAuMDtcblxuICAgICAgICAgIGZvciAoaW50IHdSID0gMDsgd1IgPCAke2VmZmVjdGl2ZUZpbHRlckhlaWdodH07XG4gICAgICAgICAgICAgIHdSICs9ICR7ZGlsYXRpb25IZWlnaHR9KSB7XG4gICAgICAgICAgICBpbnQgeFIgPSB4UkNvcm5lciArIHdSO1xuXG4gICAgICAgICAgICBpZiAoeFIgPCAwIHx8IHhSID49ICR7Y29udkluZm8uaW5IZWlnaHR9KSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGludCB3QyA9IDA7IHdDIDwgJHtlZmZlY3RpdmVGaWx0ZXJXaWR0aH07XG4gICAgICAgICAgICAgICAgd0MgKz0gJHtkaWxhdGlvbldpZHRofSkge1xuICAgICAgICAgICAgICBpbnQgeEMgPSB4Q0Nvcm5lciArIHdDO1xuXG4gICAgICAgICAgICAgIGlmICh4QyA8IDAgfHwgeEMgPj0gJHtjb252SW5mby5pbldpZHRofSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgZmxvYXQgdmFsdWUgPSBnZXRYKGJhdGNoLCB4UiwgeEMsIGQpO1xuXG4gICAgICAgICAgICAgIC8vIElmIGEgbWluIC8gbWF4IHZhbHVlIGhhcyBhbHJlYWR5IGJlZW4gZm91bmQsIHVzZSBpdC4gSWYgbm90LFxuICAgICAgICAgICAgICAvLyB1c2UgdGhlIGN1cnJlbnQgdmFsdWUuXG4gICAgICAgICAgICAgIGZsb2F0IGN1cnJNaW5NYXhWYWx1ZSA9IG1peChcbiAgICAgICAgICAgICAgICAgIHZhbHVlLCBtaW5NYXhWYWx1ZSwgbWluTWF4VmFsdWVGb3VuZCk7XG4gICAgICAgICAgICAgIGlmICh2YWx1ZSAke2NvbXBhcmVPcH0gY3Vyck1pbk1heFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgbWluTWF4VmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICBtaW5NYXhWYWx1ZUZvdW5kID0gMS4wO1xuICAgICAgICAgICAgICAgIG1pbk1heFBvc2l0aW9uID0gJHtcbiAgICAgICAgICBmbGF0dGVuUG9zaXRpb25zID8gKGluY2x1ZGVCYXRjaEluSW5kZXggPyBiYXRjaEZsYXR0ZW5Qb3NpdGlvblN0ciA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhdHRlblBvc2l0aW9uU3RyKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGB3UiAqICR7ZWZmZWN0aXZlRmlsdGVyV2lkdGh9ICsgd0NgfTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBzZXRPdXRwdXQoZmxvYXQobWluTWF4UG9zaXRpb24pKTtcbiAgICAgICAgfVxuICAgICAgYDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjb21wYXJlT3AgPSAnbWF4JztcblxuICAgIGxldCByZXR1cm5WYWx1ZSA9IGAke3Bvb2xUeXBlfSgke3Bvb2xUeXBlfSgke3Bvb2xUeXBlfShgICtcbiAgICAgICAgJ21pbk1heFZhbHVlWzBdLCBtaW5NYXhWYWx1ZVsxXSksIG1pbk1heFZhbHVlWzJdKSwgbWluTWF4VmFsdWVbM10pJztcbiAgICBpZiAocG9vbFR5cGUgPT09ICdhdmcnKSB7XG4gICAgICByZXR1cm5WYWx1ZSA9IGBhdmdWYWx1ZSAvIGNvdW50YDtcbiAgICB9XG5cbiAgICBjb25zdCBmaWx0ZXJXaWR0aE5lYXJlc3RWZWM0ID0gTWF0aC5mbG9vcihmaWx0ZXJXaWR0aCAvIDQpICogNDtcbiAgICBjb25zdCBmaWx0ZXJXaWR0aFZlYzRSZW1haW5kZXIgPSBmaWx0ZXJXaWR0aCAlIDQ7XG5cbiAgICBjb25zdCB1cGRhdGVTbmlwcGV0ID0gYFxuICAgICAgaWYgKCR7aXNBdmdQb29sfSkge1xuICAgICAgICBhdmdWYWx1ZSArPSBkb3QodmFsdWVzLCBvbmVzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1pbk1heFZhbHVlID0gJHtjb21wYXJlT3B9KHZhbHVlcywgbWluTWF4VmFsdWUpO1xuICAgICAgfVxuICAgIGA7XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgY29uc3QgaXZlYzIgc3RyaWRlcyA9IGl2ZWMyKCR7c3RyaWRlSGVpZ2h0fSwgJHtzdHJpZGVXaWR0aH0pO1xuICAgICAgY29uc3QgaXZlYzIgcGFkcyA9IGl2ZWMyKCR7cGFkVG9wfSwgJHtwYWRMZWZ0fSk7XG4gICAgICBjb25zdCBmbG9hdCBpbml0aWFsaXphdGlvblZhbHVlID0gJHtpbml0aWFsaXphdGlvblZhbHVlfTtcbiAgICAgIGNvbnN0IHZlYzQgb25lcyA9IHZlYzQoMS4wLCAxLjAsIDEuMCwgMS4wKTtcblxuICAgICAgZmxvYXQgY291bnQgPSAwLjA7XG5cbiAgICAgIGZsb2F0IGdldFZhbHVlKGludCBiYXRjaCwgaW50IHhSLCBpbnQgeEMsIGludCBkKSB7XG4gICAgICAgIGlmICh4QyA8IDAgfHwgeEMgPj0gJHtjb252SW5mby5pbldpZHRofSkge1xuICAgICAgICAgIHJldHVybiBpbml0aWFsaXphdGlvblZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGNvdW50ICs9IDEuMDtcbiAgICAgICAgcmV0dXJuIGdldFgoYmF0Y2gsIHhSLCB4QywgZCk7XG4gICAgICB9XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBiYXRjaCA9IGNvb3Jkc1swXTtcbiAgICAgICAgaW50IGQgPSBjb29yZHNbM107XG5cbiAgICAgICAgaXZlYzIgeFJDQ29ybmVyID0gY29vcmRzLnl6ICogc3RyaWRlcyAtIHBhZHM7XG4gICAgICAgIGludCB4UkNvcm5lciA9IHhSQ0Nvcm5lci54O1xuICAgICAgICBpbnQgeENDb3JuZXIgPSB4UkNDb3JuZXIueTtcblxuICAgICAgICAvLyBtYXgvbWluIHgoPywgPywgZCkgdG8gZ2V0IHkoeVIsIHlDLCBkKS5cbiAgICAgICAgLy8gPyA9IHRvIGJlIGRldGVybWluZWRcbiAgICAgICAgdmVjNCBtaW5NYXhWYWx1ZSA9IHZlYzQoJHtpbml0aWFsaXphdGlvblZhbHVlfSk7XG4gICAgICAgIGZsb2F0IGF2Z1ZhbHVlID0gMC4wO1xuICAgICAgICBjb3VudCA9IDAuMDtcblxuICAgICAgICBmb3IgKGludCB3UiA9IDA7IHdSIDwgJHtlZmZlY3RpdmVGaWx0ZXJIZWlnaHR9O1xuICAgICAgICAgICAgd1IgKz0gJHtkaWxhdGlvbkhlaWdodH0pIHtcbiAgICAgICAgICBpbnQgeFIgPSB4UkNvcm5lciArIHdSO1xuXG4gICAgICAgICAgaWYgKHhSIDwgMCB8fCB4UiA+PSAke2NvbnZJbmZvLmluSGVpZ2h0fSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm9yIChpbnQgd0MgPSAwOyB3QyA8ICR7ZmlsdGVyV2lkdGhOZWFyZXN0VmVjNH07IHdDICs9IDQpIHtcbiAgICAgICAgICAgIGludCB4QyA9IHhDQ29ybmVyICsgd0MgKiAke2RpbGF0aW9uV2lkdGh9O1xuXG4gICAgICAgICAgICB2ZWM0IHZhbHVlcyA9IHZlYzQoXG4gICAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCB4UiwgeEMsIGQpLFxuICAgICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgeFIsIHhDICsgJHtkaWxhdGlvbldpZHRofSwgZCksXG4gICAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCB4UiwgeEMgKyAyICogJHtkaWxhdGlvbldpZHRofSwgZCksXG4gICAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCB4UiwgeEMgKyAzICogJHtkaWxhdGlvbldpZHRofSwgZClcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICR7dXBkYXRlU25pcHBldH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpbnQgeEMgPSB4Q0Nvcm5lciArICR7ZmlsdGVyV2lkdGhOZWFyZXN0VmVjNH07XG4gICAgICAgICAgaWYgKCR7ZmlsdGVyV2lkdGhWZWM0UmVtYWluZGVyID09PSAxfSkge1xuICAgICAgICAgICAgdmVjNCB2YWx1ZXMgPSB2ZWM0KFxuICAgICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgeFIsIHhDLCBkKSxcbiAgICAgICAgICAgICAgaW5pdGlhbGl6YXRpb25WYWx1ZSxcbiAgICAgICAgICAgICAgaW5pdGlhbGl6YXRpb25WYWx1ZSxcbiAgICAgICAgICAgICAgaW5pdGlhbGl6YXRpb25WYWx1ZVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgJHt1cGRhdGVTbmlwcGV0fVxuICAgICAgICAgIH0gZWxzZSBpZiAoJHtmaWx0ZXJXaWR0aFZlYzRSZW1haW5kZXIgPT09IDJ9KSB7XG4gICAgICAgICAgICB2ZWM0IHZhbHVlcyA9IHZlYzQoXG4gICAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCB4UiwgeEMsIGQpLFxuICAgICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgeFIsIHhDICsgJHtkaWxhdGlvbldpZHRofSwgZCksXG4gICAgICAgICAgICAgIGluaXRpYWxpemF0aW9uVmFsdWUsXG4gICAgICAgICAgICAgIGluaXRpYWxpemF0aW9uVmFsdWVcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICR7dXBkYXRlU25pcHBldH1cbiAgICAgICAgICB9IGVsc2UgaWYgKCR7ZmlsdGVyV2lkdGhWZWM0UmVtYWluZGVyID09PSAzfSkge1xuICAgICAgICAgICAgdmVjNCB2YWx1ZXMgPSB2ZWM0KFxuICAgICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgeFIsIHhDLCBkKSxcbiAgICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIHhSLCB4QyArICR7ZGlsYXRpb25XaWR0aH0sIGQpLFxuICAgICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgeFIsIHhDICsgMiAqICR7ZGlsYXRpb25XaWR0aH0sIGQpLFxuICAgICAgICAgICAgICBpbml0aWFsaXphdGlvblZhbHVlXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAke3VwZGF0ZVNuaXBwZXR9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNldE91dHB1dCgke3JldHVyblZhbHVlfSk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUG9vbDNEUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ3gnXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgY29udkluZm86IGJhY2tlbmRfdXRpbC5Db252M0RJbmZvLCBwb29sVHlwZTogJ21heCd8J2F2ZycsXG4gICAgICBjb21wdXRlUG9zaXRpb25zOiBib29sZWFuLCBmbGF0dGVuUG9zaXRpb25zID0gZmFsc2UsXG4gICAgICBpbmNsdWRlQmF0Y2hJbkluZGV4ID0gZmFsc2UpIHtcbiAgICBpZiAocG9vbFR5cGUgPT09ICdhdmcnICYmIGNvbXB1dGVQb3NpdGlvbnMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNvbXB1dGUgcG9zaXRpb25zIGZvciBhdmVyYWdlIHBvb2wuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZmlsdGVyV2lkdGggPSBjb252SW5mby5maWx0ZXJXaWR0aDtcbiAgICBjb25zdCBzdHJpZGVEZXB0aCA9IGNvbnZJbmZvLnN0cmlkZURlcHRoO1xuICAgIGNvbnN0IHN0cmlkZUhlaWdodCA9IGNvbnZJbmZvLnN0cmlkZUhlaWdodDtcbiAgICBjb25zdCBzdHJpZGVXaWR0aCA9IGNvbnZJbmZvLnN0cmlkZVdpZHRoO1xuICAgIGNvbnN0IGRpbGF0aW9uRGVwdGggPSBjb252SW5mby5kaWxhdGlvbkRlcHRoO1xuICAgIGNvbnN0IGRpbGF0aW9uSGVpZ2h0ID0gY29udkluZm8uZGlsYXRpb25IZWlnaHQ7XG4gICAgY29uc3QgZGlsYXRpb25XaWR0aCA9IGNvbnZJbmZvLmRpbGF0aW9uV2lkdGg7XG4gICAgY29uc3QgZWZmZWN0aXZlRmlsdGVyRGVwdGggPSBjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJEZXB0aDtcbiAgICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgPSBjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJIZWlnaHQ7XG4gICAgY29uc3QgZWZmZWN0aXZlRmlsdGVyV2lkdGggPSBjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJXaWR0aDtcblxuICAgIGNvbnN0IHBhZEZyb250ID0gY29udkluZm8ucGFkSW5mby5mcm9udDtcbiAgICBjb25zdCBwYWRUb3AgPSBjb252SW5mby5wYWRJbmZvLnRvcDtcbiAgICBjb25zdCBwYWRMZWZ0ID0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBjb252SW5mby5vdXRTaGFwZTtcblxuICAgIGNvbnN0IGlzQXZnUG9vbCA9IHBvb2xUeXBlID09PSAnYXZnJztcblxuICAgIGxldCBpbml0aWFsaXphdGlvblZhbHVlID0gJzAuMCc7XG4gICAgaWYgKCFpc0F2Z1Bvb2wpIHtcbiAgICAgIC8vIFdlYkdMIG9uIEZpcmVmb3ggTGludXggY2FuJ3QgY29tcGlsZSAxLzAgc28gd2UgZG8gMS9lcHMuXG4gICAgICBpbml0aWFsaXphdGlvblZhbHVlID0gJy0xLjAgLyAxZS0yMCc7XG4gICAgfVxuXG4gICAgaWYgKGNvbXB1dGVQb3NpdGlvbnMpIHtcbiAgICAgIGNvbnN0IGNvbXBhcmVPcCA9ICc+PSc7XG5cbiAgICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICAgIGNvbnN0IGl2ZWMzIHN0cmlkZXMgPVxuICAgICAgICAgICAgaXZlYzMoJHtzdHJpZGVEZXB0aH0sICR7c3RyaWRlSGVpZ2h0fSwgJHtzdHJpZGVXaWR0aH0pO1xuICAgICAgICBjb25zdCBpdmVjMyBwYWRzID0gaXZlYzMoJHtwYWRGcm9udH0sICR7cGFkVG9wfSwgJHtwYWRMZWZ0fSk7XG5cbiAgICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAgIGl2ZWM1IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICAgIGludCBiYXRjaCA9IGNvb3Jkcy54O1xuICAgICAgICAgIGludCBjaCA9IGNvb3Jkcy51O1xuXG4gICAgICAgICAgaXZlYzMgeENvcm5lciA9IGl2ZWMzKGNvb3Jkcy55LCBjb29yZHMueiwgY29vcmRzLncpICogc3RyaWRlcyAtIHBhZHM7XG4gICAgICAgICAgaW50IHhEQ29ybmVyID0geENvcm5lci54O1xuICAgICAgICAgIGludCB4UkNvcm5lciA9IHhDb3JuZXIueTtcbiAgICAgICAgICBpbnQgeENDb3JuZXIgPSB4Q29ybmVyLno7XG5cbiAgICAgICAgICAvLyBtYXgvbWluIHgoPywgPywgPywgY2gpIHRvIGdldCB5KHlELCB5UiwgeUMsIGNoKS5cbiAgICAgICAgICAvLyA/ID0gdG8gYmUgZGV0ZXJtaW5lZFxuICAgICAgICAgIGZsb2F0IG1pbk1heFZhbHVlID0gMC4wO1xuICAgICAgICAgIGZsb2F0IG1pbk1heFZhbHVlRm91bmQgPSAwLjA7XG4gICAgICAgICAgaW50IG1pbk1heFBvc2l0aW9uID0gMDtcblxuICAgICAgICAgIGZvciAoaW50IHdEID0gMDsgd0QgPCAke2VmZmVjdGl2ZUZpbHRlckRlcHRofTtcbiAgICAgICAgICAgICAgd0QgKz0gJHtkaWxhdGlvbkRlcHRofSkge1xuICAgICAgICAgICAgaW50IHhEID0geERDb3JuZXIgKyB3RDtcblxuICAgICAgICAgICAgaWYgKHhEIDwgMCB8fCB4RCA+PSAke2NvbnZJbmZvLmluRGVwdGh9KSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGludCB3UiA9IDA7IHdSIDwgJHtlZmZlY3RpdmVGaWx0ZXJIZWlnaHR9O1xuICAgICAgICAgICAgICAgIHdSICs9ICR7ZGlsYXRpb25IZWlnaHR9KSB7XG4gICAgICAgICAgICAgIGludCB4UiA9IHhSQ29ybmVyICsgd1I7XG5cbiAgICAgICAgICAgICAgaWYgKHhSIDwgMCB8fCB4UiA+PSAke2NvbnZJbmZvLmluSGVpZ2h0fSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgZm9yIChpbnQgd0MgPSAwOyB3QyA8ICR7ZWZmZWN0aXZlRmlsdGVyV2lkdGh9O1xuICAgICAgICAgICAgICAgICAgd0MgKz0gJHtkaWxhdGlvbldpZHRofSkge1xuICAgICAgICAgICAgICAgIGludCB4QyA9IHhDQ29ybmVyICsgd0M7XG5cbiAgICAgICAgICAgICAgICBpZiAoeEMgPCAwIHx8IHhDID49ICR7Y29udkluZm8uaW5XaWR0aH0pIHtcbiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZsb2F0IHZhbHVlID0gZ2V0WChiYXRjaCwgeEQsIHhSLCB4QywgY2gpO1xuXG4gICAgICAgICAgICAgICAgLy8gSWYgYSBtaW4gLyBtYXggdmFsdWUgaGFzIGFscmVhZHkgYmVlbiBmb3VuZCwgdXNlIGl0LiBJZiBub3QsXG4gICAgICAgICAgICAgICAgLy8gdXNlIHRoZSBjdXJyZW50IHZhbHVlLlxuICAgICAgICAgICAgICAgIGZsb2F0IGN1cnJNaW5NYXhWYWx1ZSA9IG1peChcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUsIG1pbk1heFZhbHVlLCBtaW5NYXhWYWx1ZUZvdW5kKTtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgJHtjb21wYXJlT3B9IGN1cnJNaW5NYXhWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgbWluTWF4VmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgIG1pbk1heFZhbHVlRm91bmQgPSAxLjA7XG4gICAgICAgICAgICAgICAgICBtaW5NYXhQb3NpdGlvbiA9ICR7XG4gICAgICAgICAgZmxhdHRlblBvc2l0aW9ucyA/XG4gICAgICAgICAgICAgIChpbmNsdWRlQmF0Y2hJbkluZGV4ID9cbiAgICAgICAgICAgICAgICAgICBgKCgoYmF0Y2ggKiAke2NvbnZJbmZvLmluRGVwdGh9ICsgeEQpICogJHtcbiAgICAgICAgICAgICAgICAgICAgICAgY29udkluZm8uaW5IZWlnaHR9ICsgeFIpICogJHtjb252SW5mby5pbldpZHRofSArIHhDKSAqICR7XG4gICAgICAgICAgICAgICAgICAgICAgIGNvbnZJbmZvLmluQ2hhbm5lbHN9ICsgY2hgIDpcbiAgICAgICAgICAgICAgICAgICBgKCh4RCAqICR7Y29udkluZm8uaW5IZWlnaHR9ICsgeFIpICogJHtcbiAgICAgICAgICAgICAgICAgICAgICAgY29udkluZm8uaW5XaWR0aH0gKyB4QykgKiAke2NvbnZJbmZvLmluQ2hhbm5lbHN9ICsgY2hgKSA6XG4gICAgICAgICAgICAgIGB3RCAqICR7ZWZmZWN0aXZlRmlsdGVySGVpZ2h0fSAqICR7ZWZmZWN0aXZlRmlsdGVyV2lkdGh9ICtcbiAgICAgICAgICAgICAgICAgICAgICB3UiAqICR7ZWZmZWN0aXZlRmlsdGVyV2lkdGh9ICsgd0NgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgc2V0T3V0cHV0KGZsb2F0KG1pbk1heFBvc2l0aW9uKSk7XG4gICAgICAgIH1cbiAgICAgIGA7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29tcGFyZU9wID0gJ21heCc7XG5cbiAgICBsZXQgcmV0dXJuVmFsdWUgPSBgJHtwb29sVHlwZX0oJHtwb29sVHlwZX0oJHtwb29sVHlwZX0oYCArXG4gICAgICAgICdtaW5NYXhWYWx1ZVswXSwgbWluTWF4VmFsdWVbMV0pLCBtaW5NYXhWYWx1ZVsyXSksIG1pbk1heFZhbHVlWzNdKSc7XG4gICAgaWYgKHBvb2xUeXBlID09PSAnYXZnJykge1xuICAgICAgcmV0dXJuVmFsdWUgPSBgYXZnVmFsdWUgLyBjb3VudGA7XG4gICAgfVxuXG4gICAgY29uc3QgZmlsdGVyV2lkdGhOZWFyZXN0VmVjNCA9IE1hdGguZmxvb3IoZmlsdGVyV2lkdGggLyA0KSAqIDQ7XG4gICAgY29uc3QgZmlsdGVyV2lkdGhWZWM0UmVtYWluZGVyID0gZmlsdGVyV2lkdGggJSA0O1xuXG4gICAgY29uc3QgdXBkYXRlU25pcHBldCA9IGBcbiAgICAgIGlmICgke2lzQXZnUG9vbH0pIHtcbiAgICAgICAgYXZnVmFsdWUgKz0gZG90KHZhbHVlcywgb25lcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtaW5NYXhWYWx1ZSA9ICR7Y29tcGFyZU9wfSh2YWx1ZXMsIG1pbk1heFZhbHVlKTtcbiAgICAgIH1cbiAgICBgO1xuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGNvbnN0IGl2ZWMzIHN0cmlkZXMgPVxuICAgICAgICBpdmVjMygke3N0cmlkZURlcHRofSwgJHtzdHJpZGVIZWlnaHR9LCAke3N0cmlkZVdpZHRofSk7XG4gICAgICBjb25zdCBpdmVjMyBwYWRzID0gaXZlYzMoJHtwYWRGcm9udH0sICR7cGFkVG9wfSwgJHtwYWRMZWZ0fSk7XG4gICAgICBjb25zdCBmbG9hdCBpbml0aWFsaXphdGlvblZhbHVlID0gJHtpbml0aWFsaXphdGlvblZhbHVlfTtcbiAgICAgIGNvbnN0IHZlYzQgb25lcyA9IHZlYzQoMS4wLCAxLjAsIDEuMCwgMS4wKTtcblxuICAgICAgZmxvYXQgY291bnQgPSAwLjA7XG5cbiAgICAgIGZsb2F0IGdldFZhbHVlKGludCBiYXRjaCwgaW50IHhELCBpbnQgeFIsIGludCB4QywgaW50IGNoKSB7XG4gICAgICAgIGlmICh4QyA8IDAgfHwgeEMgPj0gJHtjb252SW5mby5pbldpZHRofSkge1xuICAgICAgICAgIHJldHVybiBpbml0aWFsaXphdGlvblZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGNvdW50ICs9IDEuMDtcbiAgICAgICAgcmV0dXJuIGdldFgoYmF0Y2gsIHhELCB4UiwgeEMsIGNoKTtcbiAgICAgIH1cblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjNSBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IGJhdGNoID0gY29vcmRzLng7XG4gICAgICAgIGludCBjaCA9IGNvb3Jkcy51O1xuXG4gICAgICAgIGl2ZWMzIHhDb3JuZXIgPSBpdmVjMyhjb29yZHMueSwgY29vcmRzLnosIGNvb3Jkcy53KSAqIHN0cmlkZXMgLSBwYWRzO1xuICAgICAgICBpbnQgeERDb3JuZXIgPSB4Q29ybmVyLng7XG4gICAgICAgIGludCB4UkNvcm5lciA9IHhDb3JuZXIueTtcbiAgICAgICAgaW50IHhDQ29ybmVyID0geENvcm5lci56O1xuXG4gICAgICAgIC8vIG1heC9taW4geCg/LCA/LCA/LCBkKSB0byBnZXQgeSh5RCwgeVIsIHlDLCBjaCkuXG4gICAgICAgIC8vID8gPSB0byBiZSBkZXRlcm1pbmVkXG4gICAgICAgIHZlYzQgbWluTWF4VmFsdWUgPSB2ZWM0KCR7aW5pdGlhbGl6YXRpb25WYWx1ZX0pO1xuICAgICAgICBmbG9hdCBhdmdWYWx1ZSA9IDAuMDtcbiAgICAgICAgY291bnQgPSAwLjA7XG5cbiAgICAgICAgZm9yIChpbnQgd0QgPSAwOyB3RCA8ICR7ZWZmZWN0aXZlRmlsdGVyRGVwdGh9O1xuICAgICAgICAgICAgd0QgKz0gJHtkaWxhdGlvbkRlcHRofSkge1xuICAgICAgICAgIGludCB4RCA9IHhEQ29ybmVyICsgd0Q7XG5cbiAgICAgICAgICBpZiAoeEQgPCAwIHx8IHhEID49ICR7Y29udkluZm8uaW5EZXB0aH0pIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZvciAoaW50IHdSID0gMDsgd1IgPCAke2VmZmVjdGl2ZUZpbHRlckhlaWdodH07XG4gICAgICAgICAgICB3UiArPSAke2RpbGF0aW9uSGVpZ2h0fSkge1xuICAgICAgICAgICAgaW50IHhSID0geFJDb3JuZXIgKyB3UjtcblxuICAgICAgICAgICAgaWYgKHhSIDwgMCB8fCB4UiA+PSAke2NvbnZJbmZvLmluSGVpZ2h0fSkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChpbnQgd0MgPSAwOyB3QyA8ICR7ZmlsdGVyV2lkdGhOZWFyZXN0VmVjNH07IHdDICs9IDQpIHtcbiAgICAgICAgICAgICAgaW50IHhDID0geENDb3JuZXIgKyB3QyAqICR7ZGlsYXRpb25XaWR0aH07XG5cbiAgICAgICAgICAgICAgdmVjNCB2YWx1ZXMgPSB2ZWM0KFxuICAgICAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCB4RCwgeFIsIHhDLCBjaCksXG4gICAgICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIHhELCB4UiwgeEMgKyAke2RpbGF0aW9uV2lkdGh9LCBjaCksXG4gICAgICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIHhELCB4UiwgeEMgKyAyICogJHtkaWxhdGlvbldpZHRofSwgY2gpLFxuICAgICAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCB4RCwgeFIsIHhDICsgMyAqICR7ZGlsYXRpb25XaWR0aH0sIGNoKVxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICR7dXBkYXRlU25pcHBldH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaW50IHhDID0geENDb3JuZXIgKyAke2ZpbHRlcldpZHRoTmVhcmVzdFZlYzR9O1xuICAgICAgICAgICAgaWYgKCR7ZmlsdGVyV2lkdGhWZWM0UmVtYWluZGVyID09PSAxfSkge1xuICAgICAgICAgICAgICB2ZWM0IHZhbHVlcyA9IHZlYzQoXG4gICAgICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIHhELCB4UiwgeEMsIGNoKSxcbiAgICAgICAgICAgICAgICBpbml0aWFsaXphdGlvblZhbHVlLFxuICAgICAgICAgICAgICAgIGluaXRpYWxpemF0aW9uVmFsdWUsXG4gICAgICAgICAgICAgICAgaW5pdGlhbGl6YXRpb25WYWx1ZVxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICR7dXBkYXRlU25pcHBldH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoJHtmaWx0ZXJXaWR0aFZlYzRSZW1haW5kZXIgPT09IDJ9KSB7XG4gICAgICAgICAgICAgIHZlYzQgdmFsdWVzID0gdmVjNChcbiAgICAgICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgeEQsIHhSLCB4QywgY2gpLFxuICAgICAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCB4RCwgeFIsIHhDICsgJHtkaWxhdGlvbldpZHRofSwgY2gpLFxuICAgICAgICAgICAgICAgIGluaXRpYWxpemF0aW9uVmFsdWUsXG4gICAgICAgICAgICAgICAgaW5pdGlhbGl6YXRpb25WYWx1ZVxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICR7dXBkYXRlU25pcHBldH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoJHtmaWx0ZXJXaWR0aFZlYzRSZW1haW5kZXIgPT09IDN9KSB7XG4gICAgICAgICAgICAgIHZlYzQgdmFsdWVzID0gdmVjNChcbiAgICAgICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgeEQsIHhSLCB4QywgY2gpLFxuICAgICAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCB4RCwgeFIsIHhDICsgJHtkaWxhdGlvbldpZHRofSwgY2gpLFxuICAgICAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCB4RCwgeFIsIHhDICsgMiAqICR7ZGlsYXRpb25XaWR0aH0sIGNoKSxcbiAgICAgICAgICAgICAgICBpbml0aWFsaXphdGlvblZhbHVlXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgJHt1cGRhdGVTbmlwcGV0fVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBzZXRPdXRwdXQoJHtyZXR1cm5WYWx1ZX0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuXG5leHBvcnQgY2xhc3MgUmVkdWNlUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ3gnXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgcmVkdWNlSW5mbzogYmFja2VuZF91dGlsLlJlZHVjZUluZm8sXG4gICAgICByZWR1Y2VUeXBlOiAnYWxsJ3wnYW55J3wnbWF4J3wnbWluJ3wnc3VtJ3wncHJvZCcpIHtcbiAgICBjb25zdCB7d2luZG93U2l6ZSwgYmF0Y2hTaXplLCBpblNpemUsIG91dFNpemV9ID0gcmVkdWNlSW5mbztcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gW2JhdGNoU2l6ZSwgb3V0U2l6ZV07XG5cbiAgICBsZXQgaW5pdGlhbGl6YXRpb25WYWx1ZSA9ICcwLjAnO1xuICAgIGxldCBjb21wYXJlT3AgPSBgYDtcblxuICAgIGlmIChyZWR1Y2VUeXBlID09PSAncHJvZCcpIHtcbiAgICAgIGluaXRpYWxpemF0aW9uVmFsdWUgPSAnMS4wJztcbiAgICB9IGVsc2UgaWYgKHJlZHVjZVR5cGUgPT09ICdtaW4nKSB7XG4gICAgICAvLyBXZWJHTCBvbiBGaXJlZm94IExpbnV4IGNhbid0IGNvbXBpbGUgMS8wIHNvIHdlIGRvIDEvZXBzLlxuICAgICAgaW5pdGlhbGl6YXRpb25WYWx1ZSA9ICcxLjAgLyAxZS0yMCc7XG4gICAgICBjb21wYXJlT3AgPSBgbWluYDtcbiAgICB9IGVsc2UgaWYgKHJlZHVjZVR5cGUgPT09ICdtYXgnKSB7XG4gICAgICAvLyBXZWJHTCBvbiBGaXJlZm94IExpbnV4IGNhbid0IGNvbXBpbGUgMS8wIHNvIHdlIGRvIDEvZXBzLlxuICAgICAgaW5pdGlhbGl6YXRpb25WYWx1ZSA9ICctMS4wIC8gMWUtMjAnO1xuICAgICAgY29tcGFyZU9wID0gYG1heGA7XG4gICAgfVxuXG4gICAgbGV0IHJldHVyblZhbHVlID0gYCR7cmVkdWNlVHlwZX0oJHtyZWR1Y2VUeXBlfSgke3JlZHVjZVR5cGV9KGAgK1xuICAgICAgICAnbWluTWF4VmFsdWVbMF0sIG1pbk1heFZhbHVlWzFdKSwgbWluTWF4VmFsdWVbMl0pLCBtaW5NYXhWYWx1ZVszXSknO1xuXG4gICAgaWYgKHJlZHVjZVR5cGUgPT09ICdzdW0nKSB7XG4gICAgICByZXR1cm5WYWx1ZSA9IGBzdW1WYWx1ZWA7XG4gICAgfSBlbHNlIGlmIChyZWR1Y2VUeXBlID09PSAncHJvZCcpIHtcbiAgICAgIHJldHVyblZhbHVlID0gYHByb2RWYWx1ZWA7XG4gICAgfSBlbHNlIGlmIChyZWR1Y2VUeXBlID09PSAnYWxsJykge1xuICAgICAgcmV0dXJuVmFsdWUgPSBgYWxsVmFsdWVgO1xuICAgIH0gZWxzZSBpZiAocmVkdWNlVHlwZSA9PT0gJ2FueScpIHtcbiAgICAgIHJldHVyblZhbHVlID0gYGFueVZhbHVlYDtcbiAgICB9XG5cbiAgICBjb25zdCB3aW5kb3dTaXplTmVhcmVzdFZlYzQgPSBNYXRoLmZsb29yKHdpbmRvd1NpemUgLyA0KSAqIDQ7XG4gICAgY29uc3Qgd2luZG93U2l6ZVZlYzRSZW1haW5kZXIgPSB3aW5kb3dTaXplICUgNDtcblxuICAgIGxldCB1cGRhdGVTbmlwcGV0ID0gYFxuICAgICAgaWYgKCR7cmVkdWNlVHlwZSA9PT0gJ3N1bSd9KSB7XG4gICAgICAgIHN1bVZhbHVlICs9IGRvdCh2YWx1ZXMsIG9uZXMpO1xuICAgICAgfSBlbHNlIGlmICgke3JlZHVjZVR5cGUgPT09ICdwcm9kJ30pIHtcbiAgICAgICAgdmVjMiB0bXAgPSB2ZWMyKHZhbHVlc1swXSwgdmFsdWVzWzFdKSAqIHZlYzIodmFsdWVzWzJdLCB2YWx1ZXNbM10pO1xuICAgICAgICBwcm9kVmFsdWUgKj0gdG1wWzBdICogdG1wWzFdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWluTWF4VmFsdWUgPSAke2NvbXBhcmVPcH0odmFsdWVzLCBtaW5NYXhWYWx1ZSk7XG4gICAgICAgIGlmICgke3JlZHVjZVR5cGUgPT09ICdtaW4nfSB8fCAke3JlZHVjZVR5cGUgPT09ICdtYXgnfSkge1xuICAgICAgICAgIG1pbk1heFZhbHVlID0gJHtjb21wYXJlT3B9KHZhbHVlcywgbWluTWF4VmFsdWUpO1xuICAgICAgICAgIGJ2ZWM0IGlzTmFOID0gaXNuYW4odmFsdWVzKTtcbiAgICAgICAgICBpZiAoaXNOYU4uciB8fCBpc05hTi5nIHx8IGlzTmFOLmIgfHwgaXNOYU4uYSkge1xuICAgICAgICAgICAgbWluTWF4VmFsdWUgPSB2ZWM0KE5BTik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgYDtcblxuICAgIGxldCB2ZWNUeXBlID0gYHZlYzRgO1xuXG4gICAgaWYgKHJlZHVjZVR5cGUgPT09ICdhbGwnKSB7XG4gICAgICBpbml0aWFsaXphdGlvblZhbHVlID0gJzEuMCc7XG4gICAgICB1cGRhdGVTbmlwcGV0ID0gYFxuICAgICAgICBib29sIHJlZHVjZWRBbGxWYWx1ZSA9IGFsbCh2YWx1ZXMpO1xuICAgICAgICBmbG9hdCBmbG9hdGVkUmVkdWNlZEFsbFZhbHVlID0gZmxvYXQocmVkdWNlZEFsbFZhbHVlKTtcbiAgICAgICAgYWxsVmFsdWUgPSBmbG9hdChhbGxWYWx1ZSA+PSAxLjAgJiYgZmxvYXRlZFJlZHVjZWRBbGxWYWx1ZSA+PSAxLjApO1xuICAgICAgYDtcbiAgICAgIHZlY1R5cGUgPSBgYnZlYzRgO1xuICAgIH0gZWxzZSBpZiAocmVkdWNlVHlwZSA9PT0gJ2FueScpIHtcbiAgICAgIGluaXRpYWxpemF0aW9uVmFsdWUgPSAnMC4wJztcbiAgICAgIHVwZGF0ZVNuaXBwZXQgPSBgXG4gICAgICAgIGJvb2wgcmVkdWNlZEFueVZhbHVlID0gYW55KHZhbHVlcyk7XG4gICAgICAgIGZsb2F0IGZsb2F0ZWRSZWR1Y2VkQW55VmFsdWUgPSBmbG9hdChyZWR1Y2VkQW55VmFsdWUpO1xuICAgICAgICBhbnlWYWx1ZSA9IGZsb2F0KGFueVZhbHVlID49IDEuMCB8fCBmbG9hdGVkUmVkdWNlZEFueVZhbHVlID49IDEuMCk7XG4gICAgICBgO1xuICAgICAgdmVjVHlwZSA9IGBidmVjNGA7XG4gICAgfVxuXG4gICAgbGV0IGNoZWNrT3V0T2ZCb3VuZHMgPSAnJztcbiAgICBpZiAoaW5TaXplICUgd2luZG93U2l6ZSA+IDApIHtcbiAgICAgIGNoZWNrT3V0T2ZCb3VuZHMgPSBgXG4gICAgICAgIGlmIChpbklkeCA8IDAgfHwgaW5JZHggPj0gJHtpblNpemV9KSB7XG4gICAgICAgICAgcmV0dXJuIGluaXRpYWxpemF0aW9uVmFsdWU7XG4gICAgICAgIH1cbiAgICAgIGA7XG4gICAgfVxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICBjb25zdCBmbG9hdCBpbml0aWFsaXphdGlvblZhbHVlID0gJHtpbml0aWFsaXphdGlvblZhbHVlfTtcbiAgICAgIGNvbnN0IHZlYzQgb25lcyA9IHZlYzQoMS4wLCAxLjAsIDEuMCwgMS4wKTtcblxuICAgICAgZmxvYXQgZ2V0VmFsdWUoaW50IGJhdGNoLCBpbnQgaW5JZHgpIHtcbiAgICAgICAgJHtjaGVja091dE9mQm91bmRzfVxuICAgICAgICByZXR1cm4gZ2V0WChiYXRjaCwgaW5JZHgpO1xuICAgICAgfVxuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWMyIGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgYmF0Y2ggPSBjb29yZHNbMF07XG4gICAgICAgIGludCBvdXRJZHggPSBjb29yZHNbMV07XG4gICAgICAgIGludCBpbk9mZnNldCA9IG91dElkeCAqICR7d2luZG93U2l6ZX07XG5cbiAgICAgICAgdmVjNCBtaW5NYXhWYWx1ZSA9IHZlYzQoJHtpbml0aWFsaXphdGlvblZhbHVlfSk7XG4gICAgICAgIGZsb2F0IHByb2RWYWx1ZSA9IDEuMDtcbiAgICAgICAgZmxvYXQgc3VtVmFsdWUgPSAwLjA7XG4gICAgICAgIGZsb2F0IGFsbFZhbHVlID0gMS4wO1xuICAgICAgICBmbG9hdCBhbnlWYWx1ZSA9IDAuMDtcblxuICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8ICR7d2luZG93U2l6ZU5lYXJlc3RWZWM0fTsgaSArPSA0KSB7XG4gICAgICAgICAgaW50IGluSWR4ID0gaW5PZmZzZXQgKyBpO1xuICAgICAgICAgICR7dmVjVHlwZX0gdmFsdWVzID0gJHt2ZWNUeXBlfShcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCksXG4gICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgaW5JZHggKyAxKSxcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCArIDIpLFxuICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIGluSWR4ICsgMylcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgJHt1cGRhdGVTbmlwcGV0fVxuICAgICAgICB9XG5cbiAgICAgICAgaW50IGluSWR4ID0gaW5PZmZzZXQgKyAke3dpbmRvd1NpemVOZWFyZXN0VmVjNH07XG4gICAgICAgIGlmICgke3dpbmRvd1NpemVWZWM0UmVtYWluZGVyID09PSAxfSkge1xuICAgICAgICAgICR7dmVjVHlwZX0gdmFsdWVzID0gJHt2ZWNUeXBlfShcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCksXG4gICAgICAgICAgICBpbml0aWFsaXphdGlvblZhbHVlLFxuICAgICAgICAgICAgaW5pdGlhbGl6YXRpb25WYWx1ZSxcbiAgICAgICAgICAgIGluaXRpYWxpemF0aW9uVmFsdWVcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgJHt1cGRhdGVTbmlwcGV0fVxuICAgICAgICB9IGVsc2UgaWYgKCR7d2luZG93U2l6ZVZlYzRSZW1haW5kZXIgPT09IDJ9KSB7XG4gICAgICAgICAgJHt2ZWNUeXBlfSB2YWx1ZXMgPSAke3ZlY1R5cGV9KFxuICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIGluSWR4KSxcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCArIDEpLFxuICAgICAgICAgICAgaW5pdGlhbGl6YXRpb25WYWx1ZSxcbiAgICAgICAgICAgIGluaXRpYWxpemF0aW9uVmFsdWVcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgJHt1cGRhdGVTbmlwcGV0fVxuICAgICAgICB9IGVsc2UgaWYgKCR7d2luZG93U2l6ZVZlYzRSZW1haW5kZXIgPT09IDN9KSB7XG4gICAgICAgICAgJHt2ZWNUeXBlfSB2YWx1ZXMgPSAke3ZlY1R5cGV9KFxuICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIGluSWR4KSxcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCArIDEpLFxuICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIGluSWR4ICsgMiksXG4gICAgICAgICAgICBpbml0aWFsaXphdGlvblZhbHVlXG4gICAgICAgICAgKTtcblxuICAgICAgICAgICR7dXBkYXRlU25pcHBldH1cbiAgICAgICAgfVxuICAgICAgICBzZXRPdXRwdXQoJHtyZXR1cm5WYWx1ZX0pO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7S2VybmVsQ29uZmlnLCByZWdpc3Rlcktlcm5lbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtfZnVzZWRNYXRNdWxDb25maWd9IGZyb20gJy4va2VybmVscy9fRnVzZWRNYXRNdWwnO1xuaW1wb3J0IHthYnNDb25maWd9IGZyb20gJy4va2VybmVscy9BYnMnO1xuaW1wb3J0IHthY29zQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvQWNvcyc7XG5pbXBvcnQge2Fjb3NoQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvQWNvc2gnO1xuaW1wb3J0IHthZGRDb25maWd9IGZyb20gJy4va2VybmVscy9BZGQnO1xuaW1wb3J0IHthZGROQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvQWRkTic7XG5pbXBvcnQge2FsbENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0FsbCc7XG5pbXBvcnQge2FueUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0FueSc7XG5pbXBvcnQge2FyZ01heENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0FyZ01heCc7XG5pbXBvcnQge2FyZ01pbkNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0FyZ01pbic7XG5pbXBvcnQge2FzaW5Db25maWd9IGZyb20gJy4va2VybmVscy9Bc2luJztcbmltcG9ydCB7YXNpbmhDb25maWd9IGZyb20gJy4va2VybmVscy9Bc2luaCc7XG5pbXBvcnQge2F0YW5Db25maWd9IGZyb20gJy4va2VybmVscy9BdGFuJztcbmltcG9ydCB7YXRhbjJDb25maWd9IGZyb20gJy4va2VybmVscy9BdGFuMic7XG5pbXBvcnQge2F0YW5oQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvQXRhbmgnO1xuaW1wb3J0IHthdmdQb29sQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvQXZnUG9vbCc7XG5pbXBvcnQge2F2Z1Bvb2wzRENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0F2Z1Bvb2wzRCc7XG5pbXBvcnQge2F2Z1Bvb2xHcmFkM0RDb25maWd9IGZyb20gJy4va2VybmVscy9BdmdQb29sM0RHcmFkJztcbmltcG9ydCB7YXZnUG9vbEdyYWRDb25maWd9IGZyb20gJy4va2VybmVscy9BdmdQb29sR3JhZCc7XG5pbXBvcnQge2JhdGNoTWF0TXVsQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvQmF0Y2hNYXRNdWwnO1xuaW1wb3J0IHtiYXRjaE5vcm1Db25maWd9IGZyb20gJy4va2VybmVscy9CYXRjaE5vcm0nO1xuaW1wb3J0IHtiYXRjaFRvU3BhY2VORENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0JhdGNoVG9TcGFjZU5EJztcbmltcG9ydCB7YmluY291bnRDb25maWd9IGZyb20gJy4va2VybmVscy9CaW5jb3VudCc7XG5pbXBvcnQge2Nhc3RDb25maWd9IGZyb20gJy4va2VybmVscy9DYXN0JztcbmltcG9ydCB7Y2VpbENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0NlaWwnO1xuaW1wb3J0IHtjbGlwQnlWYWx1ZUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0NsaXBCeVZhbHVlJztcbmltcG9ydCB7Y29tcGxleENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0NvbXBsZXgnO1xuaW1wb3J0IHtjb21wbGV4QWJzQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvQ29tcGxleEFicyc7XG5pbXBvcnQge2NvbmNhdENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0NvbmNhdCc7XG5pbXBvcnQge2NvbnYyRENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0NvbnYyRCc7XG5pbXBvcnQge2NvbnYyREJhY2twcm9wRmlsdGVyQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvQ29udjJEQmFja3Byb3BGaWx0ZXInO1xuaW1wb3J0IHtjb252MkRCYWNrcHJvcElucHV0Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvQ29udjJEQmFja3Byb3BJbnB1dCc7XG5pbXBvcnQge2NvbnYzRENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0NvbnYzRCc7XG5pbXBvcnQge2NvbnYzREJhY2twcm9wRmlsdGVyVjJDb25maWd9IGZyb20gJy4va2VybmVscy9Db252M0RCYWNrcHJvcEZpbHRlclYyJztcbmltcG9ydCB7Y29udjNEQmFja3Byb3BJbnB1dENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0NvbnYzREJhY2twcm9wSW5wdXRWMic7XG5pbXBvcnQge2Nvc0NvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0Nvcyc7XG5pbXBvcnQge2Nvc2hDb25maWd9IGZyb20gJy4va2VybmVscy9Db3NoJztcbmltcG9ydCB7Y3JvcEFuZFJlc2l6ZUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0Nyb3BBbmRSZXNpemUnO1xuaW1wb3J0IHtjdW1zdW1Db25maWd9IGZyb20gJy4va2VybmVscy9DdW1zdW0nO1xuaW1wb3J0IHtkZW5zZUJpbmNvdW50Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvRGVuc2VCaW5jb3VudCc7XG5pbXBvcnQge2RlcHRoVG9TcGFjZUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0RlcHRoVG9TcGFjZSc7XG5pbXBvcnQge2RlcHRod2lzZUNvbnYyZE5hdGl2ZUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0RlcHRod2lzZUNvbnYyZE5hdGl2ZSc7XG5pbXBvcnQge2RlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXInO1xuaW1wb3J0IHtkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dCc7XG5pbXBvcnQge2RpYWdDb25maWd9IGZyb20gJy4va2VybmVscy9EaWFnJztcbmltcG9ydCB7ZGlsYXRpb24yRENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0RpbGF0aW9uMkQnO1xuaW1wb3J0IHtlaW5zdW1Db25maWd9IGZyb20gJy4va2VybmVscy9FaW5zdW0nO1xuaW1wb3J0IHtlbHVDb25maWd9IGZyb20gJy4va2VybmVscy9FbHUnO1xuaW1wb3J0IHtlbHVHcmFkQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvRWx1R3JhZCc7XG5pbXBvcnQge2VxdWFsQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvRXF1YWwnO1xuaW1wb3J0IHtlcmZDb25maWd9IGZyb20gJy4va2VybmVscy9FcmYnO1xuaW1wb3J0IHtleHBDb25maWd9IGZyb20gJy4va2VybmVscy9FeHAnO1xuaW1wb3J0IHtleHBhbmREaW1zQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvRXhwYW5kRGltcyc7XG5pbXBvcnQge2V4cG0xQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvRXhwbTEnO1xuaW1wb3J0IHtmZnRDb25maWd9IGZyb20gJy4va2VybmVscy9GRlQnO1xuaW1wb3J0IHtmaWxsQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvRmlsbCc7XG5pbXBvcnQge2ZsaXBMZWZ0UmlnaHRDb25maWd9IGZyb20gJy4va2VybmVscy9GbGlwTGVmdFJpZ2h0JztcbmltcG9ydCB7Zmxvb3JDb25maWd9IGZyb20gJy4va2VybmVscy9GbG9vcic7XG5pbXBvcnQge2Zsb29yRGl2Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvRmxvb3JEaXYnO1xuaW1wb3J0IHtmcm9tUGl4ZWxzQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvRnJvbVBpeGVscyc7XG5pbXBvcnQge2Z1c2VkQ29udjJEQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvRnVzZWRDb252MkQnO1xuaW1wb3J0IHtmdXNlZERlcHRod2lzZUNvbnYyRENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0Z1c2VkRGVwdGh3aXNlQ29udjJEJztcbmltcG9ydCB7Z2F0aGVyTmRDb25maWd9IGZyb20gJy4va2VybmVscy9HYXRoZXJOZCc7XG5pbXBvcnQge2dhdGhlclYyQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvR2F0aGVyVjInO1xuaW1wb3J0IHtncmVhdGVyQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvR3JlYXRlcic7XG5pbXBvcnQge2dyZWF0ZXJFcXVhbENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0dyZWF0ZXJFcXVhbCc7XG5pbXBvcnQge2lkZW50aXR5Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvSWRlbnRpdHknO1xuaW1wb3J0IHtpZmZ0Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvSUZGVCc7XG5pbXBvcnQge2ltYWdDb25maWd9IGZyb20gJy4va2VybmVscy9JbWFnJztcbmltcG9ydCB7aXNGaW5pdGVDb25maWd9IGZyb20gJy4va2VybmVscy9Jc0Zpbml0ZSc7XG5pbXBvcnQge2lzSW5mQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvSXNJbmYnO1xuaW1wb3J0IHtpc05hTkNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0lzTmFOJztcbmltcG9ydCB7bGVha3lSZWx1Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvTGVha3lSZWx1JztcbmltcG9ydCB7bGVzc0NvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0xlc3MnO1xuaW1wb3J0IHtsZXNzRXF1YWxDb25maWd9IGZyb20gJy4va2VybmVscy9MZXNzRXF1YWwnO1xuaW1wb3J0IHtsaW5TcGFjZUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0xpblNwYWNlJztcbmltcG9ydCB7bG9nQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvTG9nJztcbmltcG9ydCB7bG9nMXBDb25maWd9IGZyb20gJy4va2VybmVscy9Mb2cxcCc7XG5pbXBvcnQge2xvZ2ljYWxBbmRDb25maWd9IGZyb20gJy4va2VybmVscy9Mb2dpY2FsQW5kJztcbmltcG9ydCB7bG9naWNhbE5vdENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0xvZ2ljYWxOb3QnO1xuaW1wb3J0IHtsb2dpY2FsT3JDb25maWd9IGZyb20gJy4va2VybmVscy9Mb2dpY2FsT3InO1xuaW1wb3J0IHtMUk5Db25maWd9IGZyb20gJy4va2VybmVscy9MUk4nO1xuaW1wb3J0IHtMUk5HcmFkQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvTFJOR3JhZCc7XG5pbXBvcnQge21heENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL01heCc7XG5pbXBvcnQge21heGltdW1Db25maWd9IGZyb20gJy4va2VybmVscy9NYXhpbXVtJztcbmltcG9ydCB7bWF4UG9vbENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL01heFBvb2wnO1xuaW1wb3J0IHttYXhQb29sM0RDb25maWd9IGZyb20gJy4va2VybmVscy9NYXhQb29sM0QnO1xuaW1wb3J0IHttYXhQb29sR3JhZDNEQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvTWF4UG9vbDNER3JhZCc7XG5pbXBvcnQge21heFBvb2xHcmFkQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvTWF4UG9vbEdyYWQnO1xuaW1wb3J0IHttYXhQb29sV2l0aEFyZ21heENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL01heFBvb2xXaXRoQXJnbWF4JztcbmltcG9ydCB7bWVhbkNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL01lYW4nO1xuaW1wb3J0IHttaW5Db25maWd9IGZyb20gJy4va2VybmVscy9NaW4nO1xuaW1wb3J0IHttaW5pbXVtQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvTWluaW11bSc7XG5pbXBvcnQge21pcnJvclBhZENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL01pcnJvclBhZCc7XG5pbXBvcnQge21vZENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL01vZCc7XG5pbXBvcnQge211bHRpbm9taWFsQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvTXVsdGlub21pYWwnO1xuaW1wb3J0IHttdWx0aXBseUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL011bHRpcGx5JztcbmltcG9ydCB7bmVnQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvTmVnJztcbmltcG9ydCB7bm9uTWF4U3VwcHJlc3Npb25WM0NvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL05vbk1heFN1cHByZXNzaW9uVjMnO1xuaW1wb3J0IHtub25NYXhTdXBwcmVzc2lvblY0Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvTm9uTWF4U3VwcHJlc3Npb25WNCc7XG5pbXBvcnQge25vbk1heFN1cHByZXNzaW9uVjVDb25maWd9IGZyb20gJy4va2VybmVscy9Ob25NYXhTdXBwcmVzc2lvblY1JztcbmltcG9ydCB7bm90RXF1YWxDb25maWd9IGZyb20gJy4va2VybmVscy9Ob3RFcXVhbCc7XG5pbXBvcnQge29uZUhvdENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL09uZUhvdCc7XG5pbXBvcnQge29uZXNMaWtlQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvT25lc0xpa2UnO1xuaW1wb3J0IHtwYWNrQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvUGFjayc7XG5pbXBvcnQge3BhZFYyQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvUGFkVjInO1xuaW1wb3J0IHtwb3dDb25maWd9IGZyb20gJy4va2VybmVscy9Qb3cnO1xuaW1wb3J0IHtwcmVsdUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1ByZWx1JztcbmltcG9ydCB7cHJvZENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1Byb2QnO1xuaW1wb3J0IHtyYW5nZUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1JhbmdlJztcbmltcG9ydCB7cmVhbENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1JlYWwnO1xuaW1wb3J0IHtyZWFsRGl2Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvUmVhbERpdic7XG5pbXBvcnQge3JlY2lwcm9jYWxDb25maWd9IGZyb20gJy4va2VybmVscy9SZWNpcHJvY2FsJztcbmltcG9ydCB7cmVsdUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1JlbHUnO1xuaW1wb3J0IHtyZWx1NkNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1JlbHU2JztcbmltcG9ydCB7cmVzaGFwZUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1Jlc2hhcGUnO1xuaW1wb3J0IHtyZXNpemVCaWxpbmVhckNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1Jlc2l6ZUJpbGluZWFyJztcbmltcG9ydCB7cmVzaXplQmlsaW5lYXJHcmFkQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvUmVzaXplQmlsaW5lYXJHcmFkJztcbmltcG9ydCB7cmVzaXplTmVhcmVzdE5laWdoYm9yQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvUmVzaXplTmVhcmVzdE5laWdoYm9yJztcbmltcG9ydCB7cmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1Jlc2l6ZU5lYXJlc3ROZWlnaGJvckdyYWQnO1xuaW1wb3J0IHtyZXZlcnNlQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvUmV2ZXJzZSc7XG5pbXBvcnQge3JvdGF0ZVdpdGhPZmZzZXRDb25maWd9IGZyb20gJy4va2VybmVscy9Sb3RhdGVXaXRoT2Zmc2V0JztcbmltcG9ydCB7cm91bmRDb25maWd9IGZyb20gJy4va2VybmVscy9Sb3VuZCc7XG5pbXBvcnQge3JzcXJ0Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvUnNxcnQnO1xuaW1wb3J0IHtzY2F0dGVyTmRDb25maWd9IGZyb20gJy4va2VybmVscy9TY2F0dGVyTmQnO1xuaW1wb3J0IHtzZWxlY3RDb25maWd9IGZyb20gJy4va2VybmVscy9TZWxlY3QnO1xuaW1wb3J0IHtzZWx1Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvU2VsdSc7XG5pbXBvcnQge3NpZ21vaWRDb25maWd9IGZyb20gJy4va2VybmVscy9TaWdtb2lkJztcbmltcG9ydCB7c2lnbkNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1NpZ24nO1xuaW1wb3J0IHtzaW5Db25maWd9IGZyb20gJy4va2VybmVscy9TaW4nO1xuaW1wb3J0IHtzaW5oQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvU2luaCc7XG5pbXBvcnQge3NsaWNlQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvU2xpY2UnO1xuaW1wb3J0IHtzb2Z0bWF4Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvU29mdG1heCc7XG5pbXBvcnQge3NvZnRwbHVzQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvU29mdHBsdXMnO1xuaW1wb3J0IHtzcGFjZVRvQmF0Y2hORENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1NwYWNlVG9CYXRjaE5EJztcbmltcG9ydCB7c3BhcnNlRmlsbEVtcHR5Um93c0NvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1NwYXJzZUZpbGxFbXB0eVJvd3MnO1xuaW1wb3J0IHtzcGFyc2VSZXNoYXBlQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvU3BhcnNlUmVzaGFwZSc7XG5pbXBvcnQge3NwYXJzZVNlZ21lbnRNZWFuQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvU3BhcnNlU2VnbWVudE1lYW4nO1xuaW1wb3J0IHtzcGFyc2VTZWdtZW50U3VtQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvU3BhcnNlU2VnbWVudFN1bSc7XG5pbXBvcnQge3NwYXJzZVRvRGVuc2VDb25maWd9IGZyb20gJy4va2VybmVscy9TcGFyc2VUb0RlbnNlJztcbmltcG9ydCB7c3BsaXRWQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvU3BsaXRWJztcbmltcG9ydCB7c3FydENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1NxcnQnO1xuaW1wb3J0IHtzcXVhcmVDb25maWd9IGZyb20gJy4va2VybmVscy9TcXVhcmUnO1xuaW1wb3J0IHtzcXVhcmVkRGlmZmVyZW5jZUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1NxdWFyZWREaWZmZXJlbmNlJztcbmltcG9ydCB7c3RlcENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1N0ZXAnO1xuaW1wb3J0IHtzdHJpZGVkU2xpY2VDb25maWd9IGZyb20gJy4va2VybmVscy9TdHJpZGVkU2xpY2UnO1xuaW1wb3J0IHtzdHJpbmdOR3JhbXNDb25maWd9IGZyb20gJy4va2VybmVscy9TdHJpbmdOR3JhbXMnO1xuaW1wb3J0IHtzdHJpbmdTcGxpdENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1N0cmluZ1NwbGl0JztcbmltcG9ydCB7c3RyaW5nVG9IYXNoQnVja2V0RmFzdENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1N0cmluZ1RvSGFzaEJ1Y2tldEZhc3QnO1xuaW1wb3J0IHtzdWJDb25maWd9IGZyb20gJy4va2VybmVscy9TdWInO1xuaW1wb3J0IHtzdW1Db25maWd9IGZyb20gJy4va2VybmVscy9TdW0nO1xuaW1wb3J0IHt0YW5Db25maWd9IGZyb20gJy4va2VybmVscy9UYW4nO1xuaW1wb3J0IHt0YW5oQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvVGFuaCc7XG5pbXBvcnQge3RpbGVDb25maWd9IGZyb20gJy4va2VybmVscy9UaWxlJztcbmltcG9ydCB7dG9wS0NvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1RvcEsnO1xuaW1wb3J0IHt0cmFuc2Zvcm1Db25maWd9IGZyb20gJy4va2VybmVscy9UcmFuc2Zvcm0nO1xuaW1wb3J0IHt0cmFuc3Bvc2VDb25maWd9IGZyb20gJy4va2VybmVscy9UcmFuc3Bvc2UnO1xuaW1wb3J0IHt1bmlxdWVDb25maWd9IGZyb20gJy4va2VybmVscy9VbmlxdWUnO1xuaW1wb3J0IHt1bnBhY2tDb25maWd9IGZyb20gJy4va2VybmVscy9VbnBhY2snO1xuaW1wb3J0IHt1bnNvcnRlZFNlZ21lbnRTdW1Db25maWd9IGZyb20gJy4va2VybmVscy9VbnNvcnRlZFNlZ21lbnRTdW0nO1xuaW1wb3J0IHt6ZXJvc0xpa2VDb25maWd9IGZyb20gJy4va2VybmVscy9aZXJvc0xpa2UnO1xuXG4vLyBMaXN0IGFsbCBrZXJuZWwgY29uZmlncyBoZXJlXG5jb25zdCBrZXJuZWxDb25maWdzOiBLZXJuZWxDb25maWdbXSA9IFtcbiAgTFJOQ29uZmlnLFxuICBMUk5HcmFkQ29uZmlnLFxuICBfZnVzZWRNYXRNdWxDb25maWcsXG4gIGFic0NvbmZpZyxcbiAgYWNvc0NvbmZpZyxcbiAgYWNvc2hDb25maWcsXG4gIGFkZENvbmZpZyxcbiAgYWRkTkNvbmZpZyxcbiAgYWxsQ29uZmlnLFxuICBhbnlDb25maWcsXG4gIGFyZ01heENvbmZpZyxcbiAgYXJnTWluQ29uZmlnLFxuICBhc2luQ29uZmlnLFxuICBhc2luaENvbmZpZyxcbiAgYXRhbjJDb25maWcsXG4gIGF0YW5Db25maWcsXG4gIGF0YW5oQ29uZmlnLFxuICBhdmdQb29sM0RDb25maWcsXG4gIGF2Z1Bvb2xDb25maWcsXG4gIGF2Z1Bvb2xHcmFkM0RDb25maWcsXG4gIGF2Z1Bvb2xHcmFkQ29uZmlnLFxuICBiYXRjaE1hdE11bENvbmZpZyxcbiAgYmF0Y2hOb3JtQ29uZmlnLFxuICBiYXRjaFRvU3BhY2VORENvbmZpZyxcbiAgYmluY291bnRDb25maWcsXG4gIGNhc3RDb25maWcsXG4gIGNlaWxDb25maWcsXG4gIGNsaXBCeVZhbHVlQ29uZmlnLFxuICBjb21wbGV4QWJzQ29uZmlnLFxuICBjb21wbGV4Q29uZmlnLFxuICBjb25jYXRDb25maWcsXG4gIGNvbnYyREJhY2twcm9wRmlsdGVyQ29uZmlnLFxuICBjb252MkRCYWNrcHJvcElucHV0Q29uZmlnLFxuICBjb252MkRDb25maWcsXG4gIGNvbnYzREJhY2twcm9wRmlsdGVyVjJDb25maWcsXG4gIGNvbnYzREJhY2twcm9wSW5wdXRDb25maWcsXG4gIGNvbnYzRENvbmZpZyxcbiAgY29zQ29uZmlnLFxuICBjb3NoQ29uZmlnLFxuICBjcm9wQW5kUmVzaXplQ29uZmlnLFxuICBjdW1zdW1Db25maWcsXG4gIGRlbnNlQmluY291bnRDb25maWcsXG4gIGRlcHRoVG9TcGFjZUNvbmZpZyxcbiAgZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXJDb25maWcsXG4gIGRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXRDb25maWcsXG4gIGRlcHRod2lzZUNvbnYyZE5hdGl2ZUNvbmZpZyxcbiAgZGlhZ0NvbmZpZyxcbiAgZGlsYXRpb24yRENvbmZpZyxcbiAgZWluc3VtQ29uZmlnLFxuICBlbHVDb25maWcsXG4gIGVsdUdyYWRDb25maWcsXG4gIGVxdWFsQ29uZmlnLFxuICBlcmZDb25maWcsXG4gIGV4cENvbmZpZyxcbiAgZXhwYW5kRGltc0NvbmZpZyxcbiAgZXhwbTFDb25maWcsXG4gIGZmdENvbmZpZyxcbiAgZmlsbENvbmZpZyxcbiAgZmxpcExlZnRSaWdodENvbmZpZyxcbiAgZmxvb3JDb25maWcsXG4gIGZsb29yRGl2Q29uZmlnLFxuICBmcm9tUGl4ZWxzQ29uZmlnLFxuICBmdXNlZENvbnYyRENvbmZpZyxcbiAgZnVzZWREZXB0aHdpc2VDb252MkRDb25maWcsXG4gIGdhdGhlck5kQ29uZmlnLFxuICBnYXRoZXJWMkNvbmZpZyxcbiAgZ3JlYXRlckNvbmZpZyxcbiAgZ3JlYXRlckVxdWFsQ29uZmlnLFxuICBpZGVudGl0eUNvbmZpZyxcbiAgaWZmdENvbmZpZyxcbiAgaW1hZ0NvbmZpZyxcbiAgaXNGaW5pdGVDb25maWcsXG4gIGlzSW5mQ29uZmlnLFxuICBpc05hTkNvbmZpZyxcbiAgbGVha3lSZWx1Q29uZmlnLFxuICBsZXNzQ29uZmlnLFxuICBsZXNzRXF1YWxDb25maWcsXG4gIGxpblNwYWNlQ29uZmlnLFxuICBsb2cxcENvbmZpZyxcbiAgbG9nQ29uZmlnLFxuICBsb2dpY2FsQW5kQ29uZmlnLFxuICBsb2dpY2FsTm90Q29uZmlnLFxuICBsb2dpY2FsT3JDb25maWcsXG4gIG1heENvbmZpZyxcbiAgbWF4UG9vbDNEQ29uZmlnLFxuICBtYXhQb29sQ29uZmlnLFxuICBtYXhQb29sR3JhZDNEQ29uZmlnLFxuICBtYXhQb29sR3JhZENvbmZpZyxcbiAgbWF4UG9vbFdpdGhBcmdtYXhDb25maWcsXG4gIG1heGltdW1Db25maWcsXG4gIG1lYW5Db25maWcsXG4gIG1pbkNvbmZpZyxcbiAgbWluaW11bUNvbmZpZyxcbiAgbWlycm9yUGFkQ29uZmlnLFxuICBtb2RDb25maWcsXG4gIG11bHRpbm9taWFsQ29uZmlnLFxuICBtdWx0aXBseUNvbmZpZyxcbiAgbmVnQ29uZmlnLFxuICBub25NYXhTdXBwcmVzc2lvblYzQ29uZmlnLFxuICBub25NYXhTdXBwcmVzc2lvblY0Q29uZmlnLFxuICBub25NYXhTdXBwcmVzc2lvblY1Q29uZmlnLFxuICBub3RFcXVhbENvbmZpZyxcbiAgb25lSG90Q29uZmlnLFxuICBvbmVzTGlrZUNvbmZpZyxcbiAgcGFja0NvbmZpZyxcbiAgcGFkVjJDb25maWcsXG4gIHBvd0NvbmZpZyxcbiAgcHJlbHVDb25maWcsXG4gIHByb2RDb25maWcsXG4gIHJhbmdlQ29uZmlnLFxuICByZWFsQ29uZmlnLFxuICByZWFsRGl2Q29uZmlnLFxuICByZWNpcHJvY2FsQ29uZmlnLFxuICByZWx1NkNvbmZpZyxcbiAgcmVsdUNvbmZpZyxcbiAgcmVzaGFwZUNvbmZpZyxcbiAgcmVzaXplQmlsaW5lYXJDb25maWcsXG4gIHJlc2l6ZUJpbGluZWFyR3JhZENvbmZpZyxcbiAgcmVzaXplTmVhcmVzdE5laWdoYm9yQ29uZmlnLFxuICByZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkQ29uZmlnLFxuICByZXZlcnNlQ29uZmlnLFxuICByb3RhdGVXaXRoT2Zmc2V0Q29uZmlnLFxuICByb3VuZENvbmZpZyxcbiAgcnNxcnRDb25maWcsXG4gIHNjYXR0ZXJOZENvbmZpZyxcbiAgc2VsZWN0Q29uZmlnLFxuICBzZWx1Q29uZmlnLFxuICBzaWdtb2lkQ29uZmlnLFxuICBzaWduQ29uZmlnLFxuICBzaW5Db25maWcsXG4gIHNpbmhDb25maWcsXG4gIHNsaWNlQ29uZmlnLFxuICBzb2Z0bWF4Q29uZmlnLFxuICBzb2Z0cGx1c0NvbmZpZyxcbiAgc3BhY2VUb0JhdGNoTkRDb25maWcsXG4gIHNwYXJzZUZpbGxFbXB0eVJvd3NDb25maWcsXG4gIHNwYXJzZVJlc2hhcGVDb25maWcsXG4gIHNwYXJzZVNlZ21lbnRNZWFuQ29uZmlnLFxuICBzcGFyc2VTZWdtZW50U3VtQ29uZmlnLFxuICBzcGFyc2VUb0RlbnNlQ29uZmlnLFxuICBzcGxpdFZDb25maWcsXG4gIHNxcnRDb25maWcsXG4gIHNxdWFyZUNvbmZpZyxcbiAgc3F1YXJlZERpZmZlcmVuY2VDb25maWcsXG4gIHN0ZXBDb25maWcsXG4gIHN0cmlkZWRTbGljZUNvbmZpZyxcbiAgc3RyaW5nTkdyYW1zQ29uZmlnLFxuICBzdHJpbmdTcGxpdENvbmZpZyxcbiAgc3RyaW5nVG9IYXNoQnVja2V0RmFzdENvbmZpZyxcbiAgc3ViQ29uZmlnLFxuICBzdW1Db25maWcsXG4gIHRhbkNvbmZpZyxcbiAgdGFuaENvbmZpZyxcbiAgdGlsZUNvbmZpZyxcbiAgdG9wS0NvbmZpZyxcbiAgdHJhbnNmb3JtQ29uZmlnLFxuICB0cmFuc3Bvc2VDb25maWcsXG4gIHVuaXF1ZUNvbmZpZyxcbiAgdW5wYWNrQ29uZmlnLFxuICB1bnNvcnRlZFNlZ21lbnRTdW1Db25maWcsXG4gIHplcm9zTGlrZUNvbmZpZ1xuXTtcblxuZm9yIChjb25zdCBrZXJuZWxDb25maWcgb2Yga2VybmVsQ29uZmlncykge1xuICByZWdpc3Rlcktlcm5lbChrZXJuZWxDb25maWcpO1xufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0dQR1BVUHJvZ3JhbSwgdXNlU2hhcGVVbmlmb3Jtc30gZnJvbSAnLi9ncGdwdV9tYXRoJztcbmltcG9ydCAqIGFzIHNoYWRlcl91dGlsIGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyX3V0aWwnO1xuXG5leHBvcnQgY2xhc3MgUmVzaGFwZVBhY2tlZFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWydBJ107XG4gIHBhY2tlZElucHV0cyA9IHRydWU7XG4gIHBhY2tlZE91dHB1dCA9IHRydWU7XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcbiAgZW5hYmxlU2hhcGVVbmlmb3JtczogYm9vbGVhbjtcbiAgY3VzdG9tVW5pZm9ybXMgPSBbe25hbWU6ICdpbnB1dFNoYXBlJywgdHlwZTogJ2l2ZWMzJyBhcyBjb25zdCB9XTtcblxuICBjb25zdHJ1Y3RvcihvdXRwdXRTaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdLCBpbnB1dFNoYXBlOiBbXG4gICAgbnVtYmVyLCBudW1iZXIsIG51bWJlclxuICBdKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IG91dHB1dFNoYXBlO1xuICAgIHRoaXMuZW5hYmxlU2hhcGVVbmlmb3JtcyA9IHVzZVNoYXBlVW5pZm9ybXModGhpcy5vdXRwdXRTaGFwZS5sZW5ndGgpO1xuXG4gICAgbGV0IG1haW5Mb29wID0gYGA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICAgIGxldCB0aGlzUkMgPSBgdGhpc1JDID0gcmM7YDtcbiAgICAgIGlmIChpICUgMiA9PT0gMSkge1xuICAgICAgICB0aGlzUkMgKz0gYHRoaXNSQy56ICs9IDE7YDtcbiAgICAgIH1cbiAgICAgIGlmIChpID4gMSkge1xuICAgICAgICB0aGlzUkMgKz0gYHRoaXNSQy55ICs9IDE7YDtcbiAgICAgIH1cblxuICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICAke3RoaXNSQ31cbiAgICAgICAgJHtpID4gMCA/IGBpZih0aGlzUkMueSA8IHJvd3MgJiYgdGhpc1JDLnogPCBjb2xzKXtgIDogJyd9XG4gICAgICAgICAgaW50IGZsYXRJbmRleCA9IGdldEZsYXRJbmRleCh0aGlzUkMpO1xuXG4gICAgICAgICAgaXZlYzMgaW5wdXRSQyA9IGlucHV0Q29vcmRzRnJvbVJlc2hhcGVkT3V0Q29vcmRzKGZsYXRJbmRleCk7XG4gICAgICAgICAgdmVjMiBpbnB1dFJDSW5uZXJEaW1zID0gdmVjMihmbG9hdChpbnB1dFJDLnkpLGZsb2F0KGlucHV0UkMueikpO1xuXG4gICAgICAgICAgcmVzdWx0WyR7aX1dID1cbiAgICAgICAgICAgIGdldENoYW5uZWwoZ2V0QShpbnB1dFJDLngsIGlucHV0UkMueSwgaW5wdXRSQy56KSwgaW5wdXRSQ0lubmVyRGltcyk7XG4gICAgICAgICR7aSA+IDAgPyAnfScgOiAnJ31cbiAgICAgIGA7XG4gICAgfVxuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgICR7Z2V0UmVzaGFwZWRJbnB1dENvb3JkcyhpbnB1dFNoYXBlLCB0aGlzLmVuYWJsZVNoYXBlVW5pZm9ybXMpfVxuICAgICAgJHtcbiAgICAgICAgdGhpcy5lbmFibGVTaGFwZVVuaWZvcm1zID8gc2hhZGVyX3V0aWwuZ2V0RmxhdEluZGV4RnJvbTNET3V0cHV0KCkgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFkZXJfdXRpbC5nZXRGbGF0SW5kZXhGcm9tM0Qob3V0cHV0U2hhcGUpfVxuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWMzIHJjID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG5cbiAgICAgICAgdmVjNCByZXN1bHQgPSB2ZWM0KDAuKTtcblxuICAgICAgICBpdmVjMyB0aGlzUkM7XG4gICAgICAgIGludCByb3dzID0gJHt0aGlzLmVuYWJsZVNoYXBlVW5pZm9ybXMgPyAnb3V0U2hhcGVbMV0nIDogb3V0cHV0U2hhcGVbMV19O1xuICAgICAgICBpbnQgY29scyA9ICR7dGhpcy5lbmFibGVTaGFwZVVuaWZvcm1zID8gJ291dFNoYXBlWzJdJyA6IG91dHB1dFNoYXBlWzJdfTtcblxuICAgICAgICAke21haW5Mb29wfVxuXG4gICAgICAgIHNldE91dHB1dChyZXN1bHQpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0UmVzaGFwZWRJbnB1dENvb3JkcyhcbiAgICBzaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdLCBlbmFibGVTaGFwZVVuaWZvcm1zOiBib29sZWFuKTogc3RyaW5nIHtcbiAgY29uc3QgY29vcmRzRnJvbUluZGV4U25pcHBldCA9IGVuYWJsZVNoYXBlVW5pZm9ybXMgP1xuICAgICAgc2hhZGVyX3V0aWwuZ2V0TG9naWNhbENvb3JkaW5hdGVzRnJvbUZsYXRJbmRleEJ5VW5pZm9ybShcbiAgICAgICAgICBbJ3InLCAnYycsICdkJ10sICdpbnB1dFNoYXBlJykgOlxuICAgICAgc2hhZGVyX3V0aWwuZ2V0TG9naWNhbENvb3JkaW5hdGVzRnJvbUZsYXRJbmRleChbJ3InLCAnYycsICdkJ10sIHNoYXBlKTtcblxuICByZXR1cm4gYFxuICAgIGl2ZWMzIGlucHV0Q29vcmRzRnJvbVJlc2hhcGVkT3V0Q29vcmRzKGludCBpbmRleCkge1xuICAgICAgJHtjb29yZHNGcm9tSW5kZXhTbmlwcGV0fVxuICAgICAgcmV0dXJuIGl2ZWMzKHIsIGMsIGQpO1xuICAgIH1cbiAgYDtcbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5cbmV4cG9ydCBjbGFzcyBSZXNpemVCaWxpbmVhckJhY2twcm9wUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ2R5J107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXSA9IFtdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgZHlTaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgICBpbnB1dFNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgYWxpZ25Db3JuZXJzOiBib29sZWFuKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IGlucHV0U2hhcGU7XG4gICAgY29uc3QgWywgeEhlaWdodCwgeFdpZHRoLCBdID0gaW5wdXRTaGFwZTtcbiAgICBjb25zdCBbLCB5SGVpZ2h0LCB5V2lkdGhdID0gZHlTaGFwZTtcblxuICAgIC8vIEluIHRoZSBiYWNrd2FyZHMgcGFzcywgd2Ugd2FudCB0byBmaW5kIHRoZSBwaXhlbHMgdGhhdCB3ZXJlIGdlbmVyYXRlZCBmb3JcbiAgICAvLyBlYWNoIHBpeGVsIGluIHRoZSBpbnB1dCBpbWFnZSB0aGUgZm9yd2FyZCBwYXNzIGFuZCBhZGQgdGhlIGNvcnJlc3BvbmRpbmdcbiAgICAvLyBjb2VmZmljaWVudCBmcm9tIGR5IHRvIHRoZSBncmFkaWVudCAod2l0aCBzb21lIGludGVycG9sYXRpb24pLlxuXG4gICAgY29uc3QgZWZmZWN0aXZlWFNpemU6IFtudW1iZXIsIG51bWJlcl0gPSBbXG4gICAgICAoYWxpZ25Db3JuZXJzICYmIHlIZWlnaHQgPiAxKSA/IHhIZWlnaHQgLSAxIDogeEhlaWdodCxcbiAgICAgIChhbGlnbkNvcm5lcnMgJiYgeVdpZHRoID4gMSkgPyB4V2lkdGggLSAxIDogeFdpZHRoXG4gICAgXTtcblxuICAgIGNvbnN0IGVmZmVjdGl2ZVlTaXplOiBbbnVtYmVyLCBudW1iZXJdID0gW1xuICAgICAgKGFsaWduQ29ybmVycyAmJiB5SGVpZ2h0ID4gMSkgPyB5SGVpZ2h0IC0gMSA6IHlIZWlnaHQsXG4gICAgICAoYWxpZ25Db3JuZXJzICYmIHlXaWR0aCA+IDEpID8geVdpZHRoIC0gMSA6IHlXaWR0aFxuICAgIF07XG5cbiAgICBjb25zdCBoZWlnaHRTY2FsZSA9IGVmZmVjdGl2ZVhTaXplWzBdIC8gZWZmZWN0aXZlWVNpemVbMF07XG4gICAgY29uc3Qgd2lkdGhTY2FsZSA9IGVmZmVjdGl2ZVhTaXplWzFdIC8gZWZmZWN0aXZlWVNpemVbMV07XG5cbiAgICBjb25zdCBpbnZIZWlnaHRTY2FsZSA9IDEgLyBoZWlnaHRTY2FsZTtcbiAgICBjb25zdCBpbnZXaWR0aFNjYWxlID0gMSAvIHdpZHRoU2NhbGU7XG5cbiAgICAvLyBUaGlzIGRlZmluZXMgdGhlIHNpemUgb2YgdGhlIHdpbmRvdyBvZiB2YWx1ZXMgYXJvdW5kIGEgcGFydGljdWxhclxuICAgIC8vIGluZGV4IGluIGR5IHRoYXQgd2Ugd2FudCB0byBzZWFyY2ggZm9yIGNvbnRyaWJ1dGlvbnMgdG8gZHguXG4gICAgY29uc3Qgd2luSGVpZ2h0ID0gKE1hdGguY2VpbChpbnZIZWlnaHRTY2FsZSkgKiAyKSArIDI7XG4gICAgY29uc3Qgd2luV2lkdGggPSAoTWF0aC5jZWlsKGludldpZHRoU2NhbGUpICogMikgKyAyO1xuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBiID0gY29vcmRzWzBdO1xuICAgICAgICBpbnQgZCA9IGNvb3Jkc1szXTtcbiAgICAgICAgaW50IHIgPSBjb29yZHNbMV07XG4gICAgICAgIGludCBjID0gY29vcmRzWzJdO1xuXG4gICAgICAgIGZsb2F0IGFjY3VtdWxhdG9yID0gMC4wO1xuXG4gICAgICAgIGNvbnN0IGZsb2F0IGhlaWdodFNjYWxlID0gZmxvYXQoJHtoZWlnaHRTY2FsZX0pO1xuICAgICAgICBjb25zdCBmbG9hdCB3aWR0aFNjYWxlID0gZmxvYXQoJHt3aWR0aFNjYWxlfSk7XG5cbiAgICAgICAgY29uc3QgZmxvYXQgaW52SGVpZ2h0U2NhbGUgPSBmbG9hdCgke2ludkhlaWdodFNjYWxlfSk7XG4gICAgICAgIGNvbnN0IGZsb2F0IGludldpZHRoU2NhbGUgPSBmbG9hdCgke2ludldpZHRoU2NhbGV9KTtcblxuICAgICAgICBjb25zdCBpbnQgd2luSGVpZ2h0ID0gaW50KCR7d2luSGVpZ2h0fSk7XG4gICAgICAgIGNvbnN0IGludCB3aW5XaWR0aCA9IGludCgke3dpbldpZHRofSk7XG5cbiAgICAgICAgLy8gQ29tcHV0ZSBib3VuZHMgZm9yIHdoZXJlIGluIGR5IHdlIHdpbGwgbG9va1xuICAgICAgICBmbG9hdCBzdGFydFJMZXJwID0gZmxvb3IoZmxvYXQocikgKiBpbnZIZWlnaHRTY2FsZSk7XG4gICAgICAgIGludCBzdGFydER5UiA9IGludChzdGFydFJMZXJwIC0gZmxvYXQod2luSGVpZ2h0IC8gMikpO1xuXG4gICAgICAgIGZsb2F0IHN0YXJ0Q0xlcnAgPSBmbG9vcihmbG9hdChjKSAqIGludldpZHRoU2NhbGUpO1xuICAgICAgICBpbnQgc3RhcnREeUMgPSBpbnQoc3RhcnRDTGVycCAtIGZsb2F0KHdpbldpZHRoIC8gMikpO1xuXG4gICAgICAgIC8vIExvb3Agb3ZlciBkeVxuICAgICAgICBmb3IgKGludCBkeVJPZmZzZXQgPSAwOyBkeVJPZmZzZXQgPCB3aW5IZWlnaHQ7IGR5Uk9mZnNldCsrKSB7XG4gICAgICAgICAgaW50IGR5UiA9IGR5Uk9mZnNldCArIHN0YXJ0RHlSO1xuXG4gICAgICAgICAgLy8gR3VhcmQgYWdhaW5zdCB0aGUgd2luZG93IGV4Y2VlZGluZyB0aGUgYm91bmRzIG9mIGR5XG4gICAgICAgICAgaWYgKGR5UiA8IDAgfHwgZHlSID49ICR7eUhlaWdodH0pIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZvciAoaW50IGR5Q09mZnNldCA9IDA7IGR5Q09mZnNldCA8IHdpbldpZHRoOyBkeUNPZmZzZXQrKykge1xuICAgICAgICAgICAgaW50IGR5QyA9IGR5Q09mZnNldCArIHN0YXJ0RHlDO1xuXG4gICAgICAgICAgICAvLyBHdWFyZCBhZ2FpbnN0IHRoZSB3aW5kb3cgZXhjZWVkaW5nIHRoZSBib3VuZHMgb2YgZHlcbiAgICAgICAgICAgIGlmIChkeUMgPCAwIHx8IGR5QyA+PSAke3lXaWR0aH0pIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZsb2F0IGR4UiA9IGZsb2F0KGR5UikgKiBoZWlnaHRTY2FsZTtcbiAgICAgICAgICAgIGludCB0b3BEeFJJbmRleCA9IGludChmbG9vcihkeFIpKTtcbiAgICAgICAgICAgIGludCBib3R0b21EeFJJbmRleCA9IGludChtaW4oY2VpbChkeFIpLCAke3hIZWlnaHQgLSAxfS4wKSk7XG4gICAgICAgICAgICBmbG9hdCBkeFJMZXJwID0gZHhSIC0gZmxvYXQodG9wRHhSSW5kZXgpO1xuICAgICAgICAgICAgZmxvYXQgaW52ZXJzZUR4UkxlcnAgPSAxLjAgLSBkeFJMZXJwO1xuXG4gICAgICAgICAgICBmbG9hdCBkeEMgPSBmbG9hdChkeUMpICogd2lkdGhTY2FsZTtcbiAgICAgICAgICAgIGludCBsZWZ0RHhDSW5kZXggPSBpbnQoZmxvb3IoZHhDKSk7XG4gICAgICAgICAgICBpbnQgcmlnaHREeENJbmRleCA9IGludChtaW4oY2VpbChkeEMpLCAke3hXaWR0aCAtIDF9LjApKTtcbiAgICAgICAgICAgIGZsb2F0IGR4Q0xlcnAgPSBkeEMgLSBmbG9hdChsZWZ0RHhDSW5kZXgpO1xuICAgICAgICAgICAgZmxvYXQgaW52ZXJzZUR4Q0xlcnAgPSAxLjAgLSBkeENMZXJwO1xuXG4gICAgICAgICAgICBpZiAociA9PSB0b3BEeFJJbmRleCAmJiBjID09IGxlZnREeENJbmRleCkge1xuICAgICAgICAgICAgICAvLyB0b3BMZWZ0XG4gICAgICAgICAgICAgIGFjY3VtdWxhdG9yICs9XG4gICAgICAgICAgICAgICAgZ2V0RHkoYiwgZHlSLCBkeUMsIGQpICogaW52ZXJzZUR4UkxlcnAgKiBpbnZlcnNlRHhDTGVycDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHIgPT0gdG9wRHhSSW5kZXggJiYgYyA9PSByaWdodER4Q0luZGV4KSB7XG4gICAgICAgICAgICAgIC8vIHRvcFJpZ2h0XG4gICAgICAgICAgICAgIGFjY3VtdWxhdG9yICs9IGdldER5KGIsIGR5UiwgZHlDLCBkKSAqIGludmVyc2VEeFJMZXJwICogZHhDTGVycDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHIgPT0gYm90dG9tRHhSSW5kZXggJiYgYyA9PSBsZWZ0RHhDSW5kZXgpIHtcbiAgICAgICAgICAgICAgLy8gYm90dG9tTGVmdFxuICAgICAgICAgICAgICBhY2N1bXVsYXRvciArPSBnZXREeShiLCBkeVIsIGR5QywgZCkgKiBkeFJMZXJwICogaW52ZXJzZUR4Q0xlcnA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChyID09IGJvdHRvbUR4UkluZGV4ICYmIGMgPT0gcmlnaHREeENJbmRleCkge1xuICAgICAgICAgICAgICAvLyBib3R0b21SaWdodFxuICAgICAgICAgICAgICBhY2N1bXVsYXRvciArPSBnZXREeShiLCBkeVIsIGR5QywgZCkgKiBkeFJMZXJwICogZHhDTGVycDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gRW5kIGxvb3Agb3ZlciBkeVxuXG4gICAgICAgIHNldE91dHB1dChhY2N1bXVsYXRvcik7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcblxuZXhwb3J0IGNsYXNzIFJlc2l6ZUJpbGluZWFyUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ0EnXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdID0gW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBpbnB1dFNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgbmV3SGVpZ2h0OiBudW1iZXIsXG4gICAgICBuZXdXaWR0aDogbnVtYmVyLCBhbGlnbkNvcm5lcnM6IGJvb2xlYW4sIGhhbGZQaXhlbENlbnRlcnM6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBbYmF0Y2gsIG9sZEhlaWdodCwgb2xkV2lkdGgsIGRlcHRoXSA9IGlucHV0U2hhcGU7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IFtiYXRjaCwgbmV3SGVpZ2h0LCBuZXdXaWR0aCwgZGVwdGhdO1xuXG4gICAgY29uc3QgZWZmZWN0aXZlSW5TaXplOiBbbnVtYmVyLCBudW1iZXJdID0gW1xuICAgICAgKGFsaWduQ29ybmVycyAmJiBuZXdIZWlnaHQgPiAxKSA/IG9sZEhlaWdodCAtIDEgOiBvbGRIZWlnaHQsXG4gICAgICAoYWxpZ25Db3JuZXJzICYmIG5ld1dpZHRoID4gMSkgPyBvbGRXaWR0aCAtIDEgOiBvbGRXaWR0aFxuICAgIF07XG5cbiAgICBjb25zdCBlZmZlY3RpdmVPdXRTaXplOiBbbnVtYmVyLCBudW1iZXJdID0gW1xuICAgICAgKGFsaWduQ29ybmVycyAmJiBuZXdIZWlnaHQgPiAxKSA/IG5ld0hlaWdodCAtIDEgOiBuZXdIZWlnaHQsXG4gICAgICAoYWxpZ25Db3JuZXJzICYmIG5ld1dpZHRoID4gMSkgPyBuZXdXaWR0aCAtIDEgOiBuZXdXaWR0aFxuICAgIF07XG5cbiAgICBsZXQgc291cmNlRnJhY0luZGV4UkM6IHN0cmluZztcbiAgICBpZiAoaGFsZlBpeGVsQ2VudGVycykge1xuICAgICAgc291cmNlRnJhY0luZGV4UkMgPVxuICAgICAgICAgIGAodmVjMih5UkMpICsgdmVjMigwLjUpKSAqIGVmZmVjdGl2ZUlucHV0T3Zlck91dHB1dFJhdGlvUkNgICtcbiAgICAgICAgICBgIC0gdmVjMigwLjUpYDtcbiAgICB9IGVsc2Uge1xuICAgICAgc291cmNlRnJhY0luZGV4UkMgPSBgdmVjMih5UkMpICogZWZmZWN0aXZlSW5wdXRPdmVyT3V0cHV0UmF0aW9SQ2A7XG4gICAgfVxuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGNvbnN0IHZlYzIgZWZmZWN0aXZlSW5wdXRPdmVyT3V0cHV0UmF0aW9SQyA9IHZlYzIoXG4gICAgICAgICAgJHtlZmZlY3RpdmVJblNpemVbMF0gLyBlZmZlY3RpdmVPdXRTaXplWzBdfSxcbiAgICAgICAgICAke2VmZmVjdGl2ZUluU2l6ZVsxXSAvIGVmZmVjdGl2ZU91dFNpemVbMV19KTtcbiAgICAgIGNvbnN0IHZlYzIgaW5wdXRTaGFwZVJDID0gdmVjMigke29sZEhlaWdodH0uMCwgJHtvbGRXaWR0aH0uMCk7XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBiID0gY29vcmRzWzBdO1xuICAgICAgICBpbnQgZCA9IGNvb3Jkc1szXTtcbiAgICAgICAgaXZlYzIgeVJDID0gY29vcmRzLnl6O1xuXG4gICAgICAgIC8vIEZyYWN0aW9uYWwgc291cmNlIGluZGV4LlxuICAgICAgICB2ZWMyIHNvdXJjZUZyYWNJbmRleFJDID0gJHtzb3VyY2VGcmFjSW5kZXhSQ307XG5cbiAgICAgICAgLy8gQ29tcHV0ZSB0aGUgZm91ciBpbnRlZ2VyIGluZGljZXMuXG4gICAgICAgIGl2ZWMyIHNvdXJjZUZsb29yUkMgPSBpdmVjMihtYXgoc291cmNlRnJhY0luZGV4UkMsIHZlYzIoMC4wKSkpO1xuICAgICAgICBpdmVjMiBzb3VyY2VDZWlsUkMgPSBpdmVjMihcbiAgICAgICAgICBtaW4oaW5wdXRTaGFwZVJDIC0gMS4wLCBjZWlsKHNvdXJjZUZyYWNJbmRleFJDKSkpO1xuXG4gICAgICAgIGZsb2F0IHRvcExlZnQgPSBnZXRBKGIsIHNvdXJjZUZsb29yUkMueCwgc291cmNlRmxvb3JSQy55LCBkKTtcbiAgICAgICAgZmxvYXQgYm90dG9tTGVmdCA9IGdldEEoYiwgc291cmNlQ2VpbFJDLngsIHNvdXJjZUZsb29yUkMueSwgZCk7XG4gICAgICAgIGZsb2F0IHRvcFJpZ2h0ID0gZ2V0QShiLCBzb3VyY2VGbG9vclJDLngsIHNvdXJjZUNlaWxSQy55LCBkKTtcbiAgICAgICAgZmxvYXQgYm90dG9tUmlnaHQgPSBnZXRBKGIsIHNvdXJjZUNlaWxSQy54LCBzb3VyY2VDZWlsUkMueSwgZCk7XG5cbiAgICAgICAgdmVjMiBmcmFjUkMgPSBzb3VyY2VGcmFjSW5kZXhSQyAtIHZlYzIoc291cmNlRmxvb3JSQyk7XG5cbiAgICAgICAgZmxvYXQgdG9wID0gdG9wTGVmdCArICh0b3BSaWdodCAtIHRvcExlZnQpICogZnJhY1JDLnk7XG4gICAgICAgIGZsb2F0IGJvdHRvbSA9IGJvdHRvbUxlZnQgKyAoYm90dG9tUmlnaHQgLSBib3R0b21MZWZ0KSAqIGZyYWNSQy55O1xuICAgICAgICBmbG9hdCBuZXdWYWx1ZSA9IHRvcCArIChib3R0b20gLSB0b3ApICogZnJhY1JDLng7XG5cbiAgICAgICAgc2V0T3V0cHV0KG5ld1ZhbHVlKTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuXG5leHBvcnQgY2xhc3MgUmVzaXplQmlsaW5lYXJQYWNrZWRQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnQSddO1xuICBwYWNrZWRJbnB1dHMgPSB0cnVlO1xuICBwYWNrZWRPdXRwdXQgPSB0cnVlO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW10gPSBbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIGlucHV0U2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLCBuZXdIZWlnaHQ6IG51bWJlcixcbiAgICAgIG5ld1dpZHRoOiBudW1iZXIsIGFsaWduQ29ybmVyczogYm9vbGVhbiwgaGFsZlBpeGVsQ2VudGVyczogYm9vbGVhbikge1xuICAgIGNvbnN0IFtiYXRjaCwgb2xkSGVpZ2h0LCBvbGRXaWR0aCwgZGVwdGhdID0gaW5wdXRTaGFwZTtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gW2JhdGNoLCBuZXdIZWlnaHQsIG5ld1dpZHRoLCBkZXB0aF07XG5cbiAgICBjb25zdCBlZmZlY3RpdmVJblNpemU6IFtudW1iZXIsIG51bWJlcl0gPSBbXG4gICAgICAoYWxpZ25Db3JuZXJzICYmIG5ld0hlaWdodCA+IDEpID8gb2xkSGVpZ2h0IC0gMSA6IG9sZEhlaWdodCxcbiAgICAgIChhbGlnbkNvcm5lcnMgJiYgbmV3V2lkdGggPiAxKSA/IG9sZFdpZHRoIC0gMSA6IG9sZFdpZHRoXG4gICAgXTtcblxuICAgIGNvbnN0IGVmZmVjdGl2ZU91dFNpemU6IFtudW1iZXIsIG51bWJlcl0gPSBbXG4gICAgICAoYWxpZ25Db3JuZXJzICYmIG5ld0hlaWdodCA+IDEpID8gbmV3SGVpZ2h0IC0gMSA6IG5ld0hlaWdodCxcbiAgICAgIChhbGlnbkNvcm5lcnMgJiYgbmV3V2lkdGggPiAxKSA/IG5ld1dpZHRoIC0gMSA6IG5ld1dpZHRoXG4gICAgXTtcblxuICAgIGxldCBzb3VyY2VGcmFjSW5kZXhSQzogc3RyaW5nO1xuICAgIGlmIChoYWxmUGl4ZWxDZW50ZXJzKSB7XG4gICAgICBzb3VyY2VGcmFjSW5kZXhSQyA9IGAodmVjMyh5UkMpICsgdmVjMygwLjUpKSAqIGAgK1xuICAgICAgICAgIGBlZmZlY3RpdmVJbnB1dE92ZXJPdXRwdXRSYXRpb1JDIC0gdmVjMygwLjUpYDtcbiAgICB9IGVsc2Uge1xuICAgICAgc291cmNlRnJhY0luZGV4UkMgPSBgdmVjMyh5UkMpICogZWZmZWN0aXZlSW5wdXRPdmVyT3V0cHV0UmF0aW9SQ2A7XG4gICAgfVxuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGNvbnN0IHZlYzMgZWZmZWN0aXZlSW5wdXRPdmVyT3V0cHV0UmF0aW9SQyA9IHZlYzMoXG4gICAgICAgICAgJHtlZmZlY3RpdmVJblNpemVbMF0gLyBlZmZlY3RpdmVPdXRTaXplWzBdfSxcbiAgICAgICAgICAke2VmZmVjdGl2ZUluU2l6ZVsxXSAvIGVmZmVjdGl2ZU91dFNpemVbMV19LFxuICAgICAgICAgICR7ZWZmZWN0aXZlSW5TaXplWzFdIC8gZWZmZWN0aXZlT3V0U2l6ZVsxXX0pO1xuICAgICAgY29uc3QgdmVjMyBpbnB1dFNoYXBlUkMgPSB2ZWMzKCR7b2xkSGVpZ2h0fS4wLCAke29sZFdpZHRofS4wLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7b2xkV2lkdGh9LjApO1xuXG4gICAgICBmbG9hdCBnZXRBVmFsdWUoaW50IGIsIGludCByLCBpbnQgYywgaW50IGQpIHtcbiAgICAgICAgcmV0dXJuIGdldENoYW5uZWwoZ2V0QShiLCByLCBjLCBkKSwgdmVjMihjLCBkKSk7XG4gICAgICB9XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBiID0gY29vcmRzWzBdO1xuICAgICAgICBpbnQgZCA9IGNvb3Jkc1szXTtcbiAgICAgICAgLy8gQ2FsY3VsYXRlIHZhbHVlcyBmb3IgbmV4dCBjb2x1bW4gaW4geVJDLnouXG4gICAgICAgIGl2ZWMzIHlSQyA9IGNvb3Jkcy55enogKyBpdmVjMygwLCAwLCAxKTtcblxuICAgICAgICAvLyBGcmFjdGlvbmFsIHNvdXJjZSBpbmRleC5cbiAgICAgICAgdmVjMyBzb3VyY2VGcmFjSW5kZXhSQyA9ICR7c291cmNlRnJhY0luZGV4UkN9O1xuXG4gICAgICAgIC8vIENvbXB1dGUgdGhlIGZvdXIgaW50ZWdlciBpbmRpY2VzLlxuICAgICAgICBpdmVjMyBzb3VyY2VGbG9vclJDID0gaXZlYzMobWF4KHNvdXJjZUZyYWNJbmRleFJDLCB2ZWMzKDAuMCkpKTtcbiAgICAgICAgaXZlYzMgc291cmNlQ2VpbFJDID0gaXZlYzMoXG4gICAgICAgICAgbWluKGlucHV0U2hhcGVSQyAtIDEuMCwgY2VpbChzb3VyY2VGcmFjSW5kZXhSQykpKTtcblxuICAgICAgICAvLyBTaG91bGQgd2UgY2FsY3VsYXRlIG5leHQgY29sdW1uIGFuZCByb3cgZWxlbWVudHMgaW4gMngyIHBhY2tlZCBjZWxsLlxuICAgICAgICBib29sIGhhc05leHRDb2wgPSBkIDwgJHtkZXB0aCAtIDF9O1xuICAgICAgICBib29sIGhhc05leHRSb3cgPSBjb29yZHMueiA8ICR7bmV3V2lkdGggLSAxfTtcblxuICAgICAgICAvLyBJbiBwYXJhbGxlbCwgY29uc3RydWN0IGZvdXIgY29ybmVycyBmb3IgYWxsIGZvdXIgY29tcG9uZW50cyBpblxuICAgICAgICAvLyBwYWNrZWQgMngyIGNlbGwuXG4gICAgICAgIHZlYzQgdG9wTGVmdCA9IHZlYzQoXG4gICAgICAgICAgZ2V0QVZhbHVlKGIsIHNvdXJjZUZsb29yUkMueCwgc291cmNlRmxvb3JSQy55LCBkKSxcbiAgICAgICAgICBoYXNOZXh0Q29sID8gZ2V0QVZhbHVlKGIsIHNvdXJjZUZsb29yUkMueCwgc291cmNlRmxvb3JSQy55LCBkICsgMSlcbiAgICAgICAgICAgICAgICAgICAgIDogMC4wLFxuICAgICAgICAgIGhhc05leHRSb3cgPyBnZXRBVmFsdWUoYiwgc291cmNlRmxvb3JSQy54LCBzb3VyY2VGbG9vclJDLnosIGQpXG4gICAgICAgICAgICAgICAgICAgICA6IDAuMCxcbiAgICAgICAgICAoaGFzTmV4dFJvdyAmJiBoYXNOZXh0Q29sKSA/XG4gICAgICAgICAgICBnZXRBVmFsdWUoYiwgc291cmNlRmxvb3JSQy54LCBzb3VyY2VGbG9vclJDLnosIGQgKyAxKSA6IDAuMCk7XG5cbiAgICAgICAgdmVjNCBib3R0b21MZWZ0ID0gdmVjNChcbiAgICAgICAgICBnZXRBVmFsdWUoYiwgc291cmNlQ2VpbFJDLngsIHNvdXJjZUZsb29yUkMueSwgZCksXG4gICAgICAgICAgaGFzTmV4dENvbCA/IGdldEFWYWx1ZShiLCBzb3VyY2VDZWlsUkMueCwgc291cmNlRmxvb3JSQy55LCBkICsgMSlcbiAgICAgICAgICAgICAgICAgICAgIDogMC4wLFxuICAgICAgICAgIGhhc05leHRSb3cgPyBnZXRBVmFsdWUoYiwgc291cmNlQ2VpbFJDLngsIHNvdXJjZUZsb29yUkMueiwgZClcbiAgICAgICAgICAgICAgICAgICAgIDogMC4wLFxuICAgICAgICAgIChoYXNOZXh0Um93ICYmIGhhc05leHRDb2wpID9cbiAgICAgICAgICAgIGdldEFWYWx1ZShiLCBzb3VyY2VDZWlsUkMueCwgc291cmNlRmxvb3JSQy56LCBkICsgMSkgOiAwLjApO1xuXG4gICAgICAgIHZlYzQgdG9wUmlnaHQgPSB2ZWM0KFxuICAgICAgICAgIGdldEFWYWx1ZShiLCBzb3VyY2VGbG9vclJDLngsIHNvdXJjZUNlaWxSQy55LCBkKSxcbiAgICAgICAgICBoYXNOZXh0Q29sID8gZ2V0QVZhbHVlKGIsIHNvdXJjZUZsb29yUkMueCwgc291cmNlQ2VpbFJDLnksIGQgKyAxKVxuICAgICAgICAgICAgICAgICAgICAgOiAwLjAsXG4gICAgICAgICAgaGFzTmV4dFJvdyA/IGdldEFWYWx1ZShiLCBzb3VyY2VGbG9vclJDLngsIHNvdXJjZUNlaWxSQy56LCBkKVxuICAgICAgICAgICAgICAgICAgICAgOiAwLjAsXG4gICAgICAgICAgKGhhc05leHRSb3cgJiYgaGFzTmV4dENvbCkgP1xuICAgICAgICAgICAgZ2V0QVZhbHVlKGIsIHNvdXJjZUZsb29yUkMueCwgc291cmNlQ2VpbFJDLnosIGQgKyAxKSA6IDAuMCk7XG5cbiAgICAgICAgdmVjNCBib3R0b21SaWdodCA9IHZlYzQoXG4gICAgICAgICAgZ2V0QVZhbHVlKGIsIHNvdXJjZUNlaWxSQy54LCBzb3VyY2VDZWlsUkMueSwgZCksXG4gICAgICAgICAgaGFzTmV4dENvbCA/IGdldEFWYWx1ZShiLCBzb3VyY2VDZWlsUkMueCwgc291cmNlQ2VpbFJDLnksIGQgKyAxKVxuICAgICAgICAgICAgICAgICAgICAgOiAwLjAsXG4gICAgICAgICAgaGFzTmV4dFJvdyA/IGdldEFWYWx1ZShiLCBzb3VyY2VDZWlsUkMueCwgc291cmNlQ2VpbFJDLnosIGQpXG4gICAgICAgICAgICAgICAgICAgICA6IDAuMCxcbiAgICAgICAgICAoaGFzTmV4dFJvdyAmJiBoYXNOZXh0Q29sKSA/XG4gICAgICAgICAgICBnZXRBVmFsdWUoYiwgc291cmNlQ2VpbFJDLngsIHNvdXJjZUNlaWxSQy56LCBkICsgMSkgOiAwLjApO1xuXG4gICAgICAgIHZlYzMgZnJhY1JDID0gc291cmNlRnJhY0luZGV4UkMgLSB2ZWMzKHNvdXJjZUZsb29yUkMpO1xuXG4gICAgICAgIHZlYzQgdG9wID0gbWl4KHRvcExlZnQsIHRvcFJpZ2h0LCBmcmFjUkMueXl6eik7XG4gICAgICAgIHZlYzQgYm90dG9tID0gbWl4KGJvdHRvbUxlZnQsIGJvdHRvbVJpZ2h0LCBmcmFjUkMueXl6eik7XG4gICAgICAgIHZlYzQgbmV3VmFsdWUgPSBtaXgodG9wLCBib3R0b20sIGZyYWNSQy54KTtcblxuICAgICAgICBzZXRPdXRwdXQobmV3VmFsdWUpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5cbmV4cG9ydCBjbGFzcyBSZXNpemVOZWFyZXN0TmVpZ2JvckJhY2twcm9wUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ2R5J107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXSA9IFtdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgZHlTaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgICBpbnB1dFNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgYWxpZ25Db3JuZXJzOiBib29sZWFuKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IGlucHV0U2hhcGU7XG4gICAgY29uc3QgWywgeEhlaWdodCwgeFdpZHRoLCBdID0gaW5wdXRTaGFwZTtcbiAgICBjb25zdCBbLCB5SGVpZ2h0LCB5V2lkdGhdID0gZHlTaGFwZTtcblxuICAgIC8vIEluIHRoZSBiYWNrd2FyZHMgcGFzcywgd2Ugd2FudCB0byBmaW5kIHRoZSBwaXhlbHMgdGhhdCB3ZXJlIGdlbmVyYXRlZCBmb3JcbiAgICAvLyBlYWNoIHBpeGVsIGluIHRoZSBpbnB1dCBpbWFnZSB0aGUgZm9yd2FyZCBwYXNzIGFuZCBhZGQgdGhlIGNvcnJlc3BvbmRpbmdcbiAgICAvLyBjb2VmZmljaWVudCBmcm9tIGR5IHRvIHRoZSBncmFkaWVudCAod2l0aCBzb21lIGludGVycG9sYXRpb24pLlxuXG4gICAgY29uc3QgZWZmZWN0aXZlWFNpemU6IFtudW1iZXIsIG51bWJlcl0gPSBbXG4gICAgICAoYWxpZ25Db3JuZXJzICYmIHlIZWlnaHQgPiAxKSA/IHhIZWlnaHQgLSAxIDogeEhlaWdodCxcbiAgICAgIChhbGlnbkNvcm5lcnMgJiYgeVdpZHRoID4gMSkgPyB4V2lkdGggLSAxIDogeFdpZHRoXG4gICAgXTtcblxuICAgIGNvbnN0IGVmZmVjdGl2ZVlTaXplOiBbbnVtYmVyLCBudW1iZXJdID0gW1xuICAgICAgKGFsaWduQ29ybmVycyAmJiB5SGVpZ2h0ID4gMSkgPyB5SGVpZ2h0IC0gMSA6IHlIZWlnaHQsXG4gICAgICAoYWxpZ25Db3JuZXJzICYmIHlXaWR0aCA+IDEpID8geVdpZHRoIC0gMSA6IHlXaWR0aFxuICAgIF07XG5cbiAgICBjb25zdCBoZWlnaHRTY2FsZSA9IGVmZmVjdGl2ZVhTaXplWzBdIC8gZWZmZWN0aXZlWVNpemVbMF07XG4gICAgY29uc3Qgd2lkdGhTY2FsZSA9IGVmZmVjdGl2ZVhTaXplWzFdIC8gZWZmZWN0aXZlWVNpemVbMV07XG5cbiAgICBjb25zdCBpbnZIZWlnaHRTY2FsZSA9IDEgLyBoZWlnaHRTY2FsZTtcbiAgICBjb25zdCBpbnZXaWR0aFNjYWxlID0gMSAvIHdpZHRoU2NhbGU7XG5cbiAgICAvLyBUaGlzIGRlZmluZXMgdGhlIHNpemUgb2YgdGhlIHdpbmRvdyBvZiB2YWx1ZXMgYXJvdW5kIGEgcGFydGljdWxhclxuICAgIC8vIGluZGV4IGluIGR5IHRoYXQgd2Ugd2FudCB0byBzZWFyY2ggZm9yIGNvbnRyaWJ1dGlvbnMgdG8gZHguXG4gICAgY29uc3Qgd2luSGVpZ2h0ID0gKE1hdGguY2VpbChpbnZIZWlnaHRTY2FsZSkgKiAyKSArIDI7XG4gICAgY29uc3Qgd2luV2lkdGggPSAoTWF0aC5jZWlsKGludldpZHRoU2NhbGUpICogMikgKyAyO1xuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBiID0gY29vcmRzWzBdO1xuICAgICAgICBpbnQgZCA9IGNvb3Jkc1szXTtcbiAgICAgICAgaW50IHIgPSBjb29yZHNbMV07XG4gICAgICAgIGludCBjID0gY29vcmRzWzJdO1xuXG4gICAgICAgIGZsb2F0IGFjY3VtdWxhdG9yID0gMC4wO1xuXG4gICAgICAgIGNvbnN0IGZsb2F0IGhlaWdodFNjYWxlID0gZmxvYXQoJHtoZWlnaHRTY2FsZX0pO1xuICAgICAgICBjb25zdCBmbG9hdCB3aWR0aFNjYWxlID0gZmxvYXQoJHt3aWR0aFNjYWxlfSk7XG5cbiAgICAgICAgY29uc3QgZmxvYXQgaW52SGVpZ2h0U2NhbGUgPSBmbG9hdCgke2ludkhlaWdodFNjYWxlfSk7XG4gICAgICAgIGNvbnN0IGZsb2F0IGludldpZHRoU2NhbGUgPSBmbG9hdCgke2ludldpZHRoU2NhbGV9KTtcblxuICAgICAgICBjb25zdCBpbnQgd2luSGVpZ2h0ID0gaW50KCR7d2luSGVpZ2h0fSk7XG4gICAgICAgIGNvbnN0IGludCB3aW5XaWR0aCA9IGludCgke3dpbldpZHRofSk7XG5cbiAgICAgICAgLy8gQ29tcHV0ZSBib3VuZHMgZm9yIHdoZXJlIGluIGR5IHdlIHdpbGwgbG9va1xuICAgICAgICBmbG9hdCBzdGFydFJMZXJwID0gZmxvb3IoZmxvYXQocikgKiBpbnZIZWlnaHRTY2FsZSk7XG4gICAgICAgIGludCBzdGFydER5UiA9IGludChmbG9vcihzdGFydFJMZXJwIC0gZmxvYXQod2luSGVpZ2h0IC8gMikpKTtcblxuICAgICAgICBmbG9hdCBzdGFydENMZXJwID0gZmxvb3IoZmxvYXQoYykgKiBpbnZXaWR0aFNjYWxlKTtcbiAgICAgICAgaW50IHN0YXJ0RHlDID0gaW50KGZsb29yKHN0YXJ0Q0xlcnAgLSBmbG9hdCh3aW5XaWR0aCAvIDIpKSk7XG5cbiAgICAgICAgLy8gTG9vcCBvdmVyIGR5XG4gICAgICAgIGZvciAoaW50IGR5Uk9mZnNldCA9IDA7IGR5Uk9mZnNldCA8IHdpbkhlaWdodDsgZHlST2Zmc2V0KyspIHtcbiAgICAgICAgICBpbnQgZHlSID0gZHlST2Zmc2V0ICsgc3RhcnREeVI7XG5cbiAgICAgICAgICAvLyBHdWFyZCBhZ2FpbnN0IHRoZSB3aW5kb3cgZXhjZWVkaW5nIHRoZSBib3VuZHMgb2YgZHlcbiAgICAgICAgICBpZiAoZHlSIDwgMCB8fCBkeVIgPj0gJHt5SGVpZ2h0fSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm9yIChpbnQgZHlDT2Zmc2V0ID0gMDsgZHlDT2Zmc2V0IDwgd2luV2lkdGg7IGR5Q09mZnNldCsrKSB7XG4gICAgICAgICAgICBpbnQgZHlDID0gZHlDT2Zmc2V0ICsgc3RhcnREeUM7XG5cbiAgICAgICAgICAgIC8vIEd1YXJkIGFnYWluc3QgdGhlIHdpbmRvdyBleGNlZWRpbmcgdGhlIGJvdW5kcyBvZiBkeVxuICAgICAgICAgICAgaWYgKGR5QyA8IDAgfHwgZHlDID49ICR7eVdpZHRofSkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZmxvYXQgc291cmNlRnJhY1JvdyA9XG4gICAgICAgICAgICAgIGZsb2F0KCR7ZWZmZWN0aXZlWFNpemVbMF19KSAqXG4gICAgICAgICAgICAgICAgKGZsb2F0KGR5UikgLyBmbG9hdCgke2VmZmVjdGl2ZVlTaXplWzBdfSkpO1xuXG4gICAgICAgICAgICBmbG9hdCBzb3VyY2VGcmFjQ29sID1cbiAgICAgICAgICAgICAgICBmbG9hdCgke2VmZmVjdGl2ZVhTaXplWzFdfSkgKlxuICAgICAgICAgICAgICAgICAgKGZsb2F0KGR5QykgLyBmbG9hdCgke2VmZmVjdGl2ZVlTaXplWzFdfSkpO1xuXG4gICAgICAgICAgICBpbnQgc291cmNlTmVhcmVzdFJvdyA9IGludChtaW4oXG4gICAgICAgICAgICAgICAgZmxvYXQoaW50KCR7eEhlaWdodH0pIC0gMSksXG4gICAgICAgICAgICAgICAgJHthbGlnbkNvcm5lcnN9ID8gZmxvYXQocm91bmQoc291cmNlRnJhY1JvdykpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdChmbG9vcihzb3VyY2VGcmFjUm93KSkpKTtcblxuICAgICAgICAgICAgaW50IHNvdXJjZU5lYXJlc3RDb2wgPSBpbnQobWluKFxuICAgICAgICAgICAgICAgIGZsb2F0KGludCgke3hXaWR0aH0pIC0gMSksXG4gICAgICAgICAgICAgICAgJHthbGlnbkNvcm5lcnN9ID8gZmxvYXQocm91bmQoc291cmNlRnJhY0NvbCkpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdChmbG9vcihzb3VyY2VGcmFjQ29sKSkpKTtcblxuICAgICAgICAgICAgaWYgKHIgPT0gc291cmNlTmVhcmVzdFJvdyAmJiBjID09IHNvdXJjZU5lYXJlc3RDb2wpIHtcbiAgICAgICAgICAgICAgYWNjdW11bGF0b3IgKz0gZ2V0RHkoYiwgZHlSLCBkeUMsIGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBFbmQgbG9vcCBvdmVyIGR5XG5cbiAgICAgICAgc2V0T3V0cHV0KGFjY3VtdWxhdG9yKTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuXG5leHBvcnQgY2xhc3MgUmVzaXplTmVhcmVzdE5laWdoYm9yUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ0EnXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdID0gW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBpbnB1dFNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgbmV3SGVpZ2h0OiBudW1iZXIsXG4gICAgICBuZXdXaWR0aDogbnVtYmVyLCBhbGlnbkNvcm5lcnM6IGJvb2xlYW4sIGhhbGZQaXhlbENlbnRlcnM6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBbYmF0Y2gsIG9sZEhlaWdodCwgb2xkV2lkdGgsIGRlcHRoXSA9IGlucHV0U2hhcGU7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IFtiYXRjaCwgbmV3SGVpZ2h0LCBuZXdXaWR0aCwgZGVwdGhdO1xuXG4gICAgY29uc3QgZWZmZWN0aXZlSW5TaXplOiBbbnVtYmVyLCBudW1iZXJdID0gW1xuICAgICAgKGFsaWduQ29ybmVycyAmJiBuZXdIZWlnaHQgPiAxKSA/IG9sZEhlaWdodCAtIDEgOiBvbGRIZWlnaHQsXG4gICAgICAoYWxpZ25Db3JuZXJzICYmIG5ld1dpZHRoID4gMSkgPyBvbGRXaWR0aCAtIDEgOiBvbGRXaWR0aFxuICAgIF07XG5cbiAgICBjb25zdCBlZmZlY3RpdmVPdXRTaXplOiBbbnVtYmVyLCBudW1iZXJdID0gW1xuICAgICAgKGFsaWduQ29ybmVycyAmJiBuZXdIZWlnaHQgPiAxKSA/IG5ld0hlaWdodCAtIDEgOiBuZXdIZWlnaHQsXG4gICAgICAoYWxpZ25Db3JuZXJzICYmIG5ld1dpZHRoID4gMSkgPyBuZXdXaWR0aCAtIDEgOiBuZXdXaWR0aFxuICAgIF07XG5cbiAgICAvLyBXaGVuIGFsaWduIGNvcm5lcnMgaXMgZmFsc2UsIHdlIHJvdW5kcyB0aGUgdmFsdWUgd2l0aCBmbG9vci5cbiAgICBjb25zdCByb3VuZEJhc2UgPSBhbGlnbkNvcm5lcnMgPyAnMC41JyA6ICcwLjAnO1xuXG4gICAgbGV0IHNvdXJjZUZyYWNJbmRleFJDOiBzdHJpbmc7XG4gICAgaWYgKGhhbGZQaXhlbENlbnRlcnMpIHtcbiAgICAgIHNvdXJjZUZyYWNJbmRleFJDID1cbiAgICAgICAgICBgbWF4KCh2ZWMyKHlSQykgKyB2ZWMyKDAuNSkpICogZWZmZWN0aXZlSW5wdXRPdmVyT3V0cHV0UmF0aW9SQ2AgK1xuICAgICAgICAgIGAsIHZlYzIoMC4wKSlgO1xuICAgIH0gZWxzZSB7XG4gICAgICBzb3VyY2VGcmFjSW5kZXhSQyA9IGB2ZWMyKHlSQykgKiBlZmZlY3RpdmVJbnB1dE92ZXJPdXRwdXRSYXRpb1JDYDtcbiAgICB9XG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGNvbnN0IHZlYzIgZWZmZWN0aXZlSW5wdXRPdmVyT3V0cHV0UmF0aW9SQyA9IHZlYzIoXG4gICAgICAgICAgJHtlZmZlY3RpdmVJblNpemVbMF0gLyBlZmZlY3RpdmVPdXRTaXplWzBdfSxcbiAgICAgICAgICAke2VmZmVjdGl2ZUluU2l6ZVsxXSAvIGVmZmVjdGl2ZU91dFNpemVbMV19KTtcbiAgICAgIGNvbnN0IHZlYzIgaW5wdXRTaGFwZVJDID0gdmVjMigke29sZEhlaWdodH0uMCwgJHtvbGRXaWR0aH0uMCk7XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBiID0gY29vcmRzWzBdO1xuICAgICAgICBpbnQgZCA9IGNvb3Jkc1szXTtcbiAgICAgICAgaXZlYzIgeVJDID0gY29vcmRzLnl6O1xuXG4gICAgICAgIC8vIEZyYWN0aW9uYWwgc291cmNlIGluZGV4LlxuICAgICAgICB2ZWMyIHNvdXJjZUZyYWNJbmRleFJDID0gJHtzb3VyY2VGcmFjSW5kZXhSQ307XG5cbiAgICAgICAgLy8gQ29tcHV0ZSB0aGUgY29vcmRpbmF0b3JzIG9mIG5lYXJlc3QgbmVpZ2hib3IgcG9pbnQuXG4gICAgICAgIGl2ZWMyIHNvdXJjZU5lYXJlc3RSQyA9IGl2ZWMyKFxuICAgICAgICAgIG1pbihpbnB1dFNoYXBlUkMgLSAxLjAsIGZsb29yKHNvdXJjZUZyYWNJbmRleFJDICsgJHtyb3VuZEJhc2V9KSkpO1xuICAgICAgICBmbG9hdCBuZXdWYWx1ZSA9IGdldEEoYiwgc291cmNlTmVhcmVzdFJDLngsIHNvdXJjZU5lYXJlc3RSQy55LCBkKTtcblxuICAgICAgICBzZXRPdXRwdXQobmV3VmFsdWUpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5cbmV4cG9ydCBjbGFzcyBSZXNpemVOZWFyZXN0TmVpZ2hib3JQYWNrZWRQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnQSddO1xuICBwYWNrZWRJbnB1dHMgPSB0cnVlO1xuICBwYWNrZWRPdXRwdXQgPSB0cnVlO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW10gPSBbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIGlucHV0U2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLCBuZXdIZWlnaHQ6IG51bWJlcixcbiAgICAgIG5ld1dpZHRoOiBudW1iZXIsIGFsaWduQ29ybmVyczogYm9vbGVhbiwgaGFsZlBpeGVsQ2VudGVyczogYm9vbGVhbikge1xuICAgIGNvbnN0IFtiYXRjaCwgb2xkSGVpZ2h0LCBvbGRXaWR0aCwgZGVwdGhdID0gaW5wdXRTaGFwZTtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gW2JhdGNoLCBuZXdIZWlnaHQsIG5ld1dpZHRoLCBkZXB0aF07XG5cbiAgICBjb25zdCBlZmZlY3RpdmVJblNpemU6IFtudW1iZXIsIG51bWJlcl0gPSBbXG4gICAgICAoYWxpZ25Db3JuZXJzICYmIG5ld0hlaWdodCA+IDEpID8gb2xkSGVpZ2h0IC0gMSA6IG9sZEhlaWdodCxcbiAgICAgIChhbGlnbkNvcm5lcnMgJiYgbmV3V2lkdGggPiAxKSA/IG9sZFdpZHRoIC0gMSA6IG9sZFdpZHRoXG4gICAgXTtcblxuICAgIGNvbnN0IGVmZmVjdGl2ZU91dFNpemU6IFtudW1iZXIsIG51bWJlcl0gPSBbXG4gICAgICAoYWxpZ25Db3JuZXJzICYmIG5ld0hlaWdodCA+IDEpID8gbmV3SGVpZ2h0IC0gMSA6IG5ld0hlaWdodCxcbiAgICAgIChhbGlnbkNvcm5lcnMgJiYgbmV3V2lkdGggPiAxKSA/IG5ld1dpZHRoIC0gMSA6IG5ld1dpZHRoXG4gICAgXTtcblxuICAgIC8vIFdoZW4gYWxpZ24gY29ybmVycyBpcyBmYWxzZSwgd2Ugcm91bmRzIHRoZSB2YWx1ZSB3aXRoIGZsb29yLlxuICAgIGNvbnN0IHJvdW5kQmFzZSA9IGFsaWduQ29ybmVycyA/ICcwLjUnIDogJzAuMCc7XG4gICAgbGV0IHNvdXJjZUZyYWNJbmRleFJDOiBzdHJpbmc7XG4gICAgaWYgKGhhbGZQaXhlbENlbnRlcnMpIHtcbiAgICAgIHNvdXJjZUZyYWNJbmRleFJDID0gYG1heCgodmVjMyh5UkMpICsgdmVjMygwLjUpKSAqIGAgK1xuICAgICAgICAgIGBlZmZlY3RpdmVJbnB1dE92ZXJPdXRwdXRSYXRpb1JDLCB2ZWMzKDAuMCkpYDtcbiAgICB9IGVsc2Uge1xuICAgICAgc291cmNlRnJhY0luZGV4UkMgPSBgdmVjMyh5UkMpICogZWZmZWN0aXZlSW5wdXRPdmVyT3V0cHV0UmF0aW9SQ2A7XG4gICAgfVxuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGNvbnN0IHZlYzMgZWZmZWN0aXZlSW5wdXRPdmVyT3V0cHV0UmF0aW9SQyA9IHZlYzMoXG4gICAgICAgICAgJHtlZmZlY3RpdmVJblNpemVbMF0gLyBlZmZlY3RpdmVPdXRTaXplWzBdfSxcbiAgICAgICAgICAke2VmZmVjdGl2ZUluU2l6ZVsxXSAvIGVmZmVjdGl2ZU91dFNpemVbMV19LFxuICAgICAgICAgICR7ZWZmZWN0aXZlSW5TaXplWzFdIC8gZWZmZWN0aXZlT3V0U2l6ZVsxXX0pO1xuICAgICAgY29uc3QgdmVjMyBpbnB1dFNoYXBlUkMgPSB2ZWMzKCR7b2xkSGVpZ2h0fS4wLCAke29sZFdpZHRofS4wLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7b2xkV2lkdGh9LjApO1xuXG4gICAgICBmbG9hdCBnZXRBVmFsdWUoaW50IGIsIGludCByLCBpbnQgYywgaW50IGQpIHtcbiAgICAgICAgcmV0dXJuIGdldENoYW5uZWwoZ2V0QShiLCByLCBjLCBkKSwgdmVjMihjLCBkKSk7XG4gICAgICB9XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBiID0gY29vcmRzWzBdO1xuICAgICAgICBpbnQgZCA9IGNvb3Jkc1szXTtcbiAgICAgICAgLy8gQ2FsY3VsYXRlIHZhbHVlcyBmb3IgbmV4dCBjb2x1bW4gaW4geVJDLnouXG4gICAgICAgIGl2ZWMzIHlSQyA9IGNvb3Jkcy55enogKyBpdmVjMygwLCAwLCAxKTtcblxuICAgICAgICAvLyBGcmFjdGlvbmFsIHNvdXJjZSBpbmRleC5cbiAgICAgICAgdmVjMyBzb3VyY2VGcmFjSW5kZXhSQyA9ICR7c291cmNlRnJhY0luZGV4UkN9O1xuXG4gICAgICAgIC8vIENvbXB1dGUgdGhlIGNvb3JkaW5hdG9ycyBvZiBuZWFyZXN0IG5laWdoYm9yIHBvaW50LlxuICAgICAgICBpdmVjMyBzb3VyY2VOZWFyZXN0UkMgPSBpdmVjMyhcbiAgICAgICAgICBtaW4oaW5wdXRTaGFwZVJDIC0gMS4wLCBmbG9vcihzb3VyY2VGcmFjSW5kZXhSQyArICR7cm91bmRCYXNlfSkpKTtcblxuICAgICAgICAvLyBTaG91bGQgd2UgY2FsY3VsYXRlIG5leHQgY29sdW1uIGFuZCByb3cgZWxlbWVudHMgaW4gMngyIHBhY2tlZCBjZWxsLlxuICAgICAgICBib29sIGhhc05leHRDb2wgPSBkIDwgJHtkZXB0aCAtIDF9O1xuICAgICAgICBib29sIGhhc05leHRSb3cgPSBjb29yZHMueiA8ICR7bmV3V2lkdGggLSAxfTtcblxuICAgICAgICB2ZWM0IG5ld1ZhbHVlID0gdmVjNChcbiAgICAgICAgICBnZXRBVmFsdWUoYiwgc291cmNlTmVhcmVzdFJDLngsIHNvdXJjZU5lYXJlc3RSQy55LCBkKSxcbiAgICAgICAgICBoYXNOZXh0Q29sID8gZ2V0QVZhbHVlKGIsIHNvdXJjZU5lYXJlc3RSQy54LCBzb3VyY2VOZWFyZXN0UkMueSwgZCArIDEpXG4gICAgICAgICAgICAgICAgICAgICA6IDAuMCxcbiAgICAgICAgICBoYXNOZXh0Um93ID8gZ2V0QVZhbHVlKGIsIHNvdXJjZU5lYXJlc3RSQy54LCBzb3VyY2VOZWFyZXN0UkMueiwgZClcbiAgICAgICAgICAgICAgICAgICAgIDogMC4wLFxuICAgICAgICAgIChoYXNOZXh0Um93ICYmIGhhc05leHRDb2wpID9cbiAgICAgICAgICAgIGdldEFWYWx1ZShiLCBzb3VyY2VOZWFyZXN0UkMueCwgc291cmNlTmVhcmVzdFJDLnosIGQgKyAxKSA6IDAuMCk7XG5cbiAgICAgICAgc2V0T3V0cHV0KG5ld1ZhbHVlKTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuaW1wb3J0IHtnZXRDb29yZHNEYXRhVHlwZX0gZnJvbSAnLi9zaGFkZXJfY29tcGlsZXInO1xuXG5leHBvcnQgY2xhc3MgUmV2ZXJzZVByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWyd4J107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcih4U2hhcGU6IG51bWJlcltdLCBheGlzOiBudW1iZXJbXSkge1xuICAgIGNvbnN0IHJhbmsgPSB4U2hhcGUubGVuZ3RoO1xuICAgIGlmIChyYW5rID4gNCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBXZWJHTCBiYWNrZW5kOiBSZXZlcnNlIG9mIHJhbmstJHtyYW5rfSB0ZW5zb3IgaXMgbm90IHlldCBzdXBwb3J0ZWRgKTtcbiAgICB9XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IHhTaGFwZTtcblxuICAgIGlmIChyYW5rID09PSAxKSB7XG4gICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICAgaW50IGNvb3JkID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgICAgc2V0T3V0cHV0KGdldFgoJHt4U2hhcGVbMF19IC0gY29vcmQgLSAxKSk7XG4gICAgICAgIH1cbiAgICAgIGA7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGdldEluQ29vcmQgPSAoaTogbnVtYmVyKSA9PiB7XG4gICAgICBpZiAoYXhpcy5pbmRleE9mKGkpICE9PSAtMSAmJiB4U2hhcGVbaV0gIT09IDEpIHtcbiAgICAgICAgcmV0dXJuIGAke3hTaGFwZVtpXX0gLSBjb29yZHNbJHtpfV0gLSAxYDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBgY29vcmRzWyR7aX1dYDtcbiAgICB9O1xuICAgIGNvbnN0IGluQ29vcmRzID0geFNoYXBlLm1hcCgoXywgaSkgPT4gZ2V0SW5Db29yZChpKSkuam9pbignLCcpO1xuICAgIGNvbnN0IHR5cGUgPSBnZXRDb29yZHNEYXRhVHlwZShyYW5rKTtcblxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICR7dHlwZX0gY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIHNldE91dHB1dChnZXRYKCR7aW5Db29yZHN9KSk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcbmltcG9ydCB7Z2V0Q2hhbm5lbHN9IGZyb20gJy4vcGFja2luZ191dGlsJztcbmltcG9ydCB7Z2V0Q29vcmRzRGF0YVR5cGV9IGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyJztcblxuZXhwb3J0IGNsYXNzIFJldmVyc2VQYWNrZWRQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsneCddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIHBhY2tlZElucHV0cyA9IHRydWU7XG4gIHBhY2tlZE91dHB1dCA9IHRydWU7XG5cbiAgY29uc3RydWN0b3IoeFNoYXBlOiBudW1iZXJbXSwgYXhpczogbnVtYmVyW10pIHtcbiAgICBjb25zdCByYW5rID0geFNoYXBlLmxlbmd0aDtcbiAgICBpZiAocmFuayA+IDQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgV2ViR0wgYmFja2VuZDogUmV2ZXJzZSBvZiByYW5rLSR7cmFua30gdGVuc29yIGlzIG5vdCB5ZXQgc3VwcG9ydGVkYCk7XG4gICAgfVxuICAgIHRoaXMub3V0cHV0U2hhcGUgPSB4U2hhcGU7XG4gICAgY29uc3QgY2hhbm5lbHMgPSBnZXRDaGFubmVscygncmMnLCByYW5rKTtcbiAgICBjb25zdCBuZXh0Q29sdW1uID1cbiAgICAgICAgYCR7Y2hhbm5lbHNbcmFuayAtIDFdfSArIDEgPCAke3RoaXMub3V0cHV0U2hhcGVbcmFuayAtIDFdfWA7XG4gICAgY29uc3QgbmV4dFJvdyA9IGAke2NoYW5uZWxzW3JhbmsgLSAyXX0gKyAxIDwgJHt0aGlzLm91dHB1dFNoYXBlW3JhbmsgLSAyXX1gO1xuICAgIGNvbnN0IHR5cGUgPSBnZXRDb29yZHNEYXRhVHlwZShyYW5rKTtcbiAgICBpZiAocmFuayA9PT0gMSkge1xuICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgICAgdm9pZCBtYWluKCl7XG4gICAgICAgICAgaW50IHJjID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgICAgdmVjNCByZXN1bHQgPSB2ZWM0KDAuKTtcbiAgICAgICAgICByZXN1bHQuciA9IGdldENoYW5uZWwoZ2V0WCgke3hTaGFwZVswXX0gLSByYyAtIDEpLFxuICAgICAgICAgICAgJHt4U2hhcGVbMF19IC0gcmMgLSAxKTtcbiAgICAgICAgICBpZigke25leHRDb2x1bW59KXtcbiAgICAgICAgICAgICAgcmVzdWx0LmcgPSBnZXRDaGFubmVsKGdldFgoJHt4U2hhcGVbMF19IC0gKHJjICArIDEpIC0gMSksXG4gICAgICAgICAgICAgICAgJHt4U2hhcGVbMF19IC0gKHJjICArIDEpIC0gMSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNldE91dHB1dChyZXN1bHQpO1xuICAgICAgICB9XG4gICAgICBgO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICAgJHt0eXBlfSByYyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICAgIHZlYzQgcmVzdWx0ID0gdmVjNCgwLik7XG4gICAgICAgICAgcmVzdWx0LnIgPSAke2dldFIoY2hhbm5lbHMuc2xpY2UoKSl9O1xuICAgICAgICAgIGlmKCR7bmV4dENvbHVtbn0pe1xuICAgICAgICAgICAgcmVzdWx0LmcgPSAke2dldEcoY2hhbm5lbHMuc2xpY2UoKSl9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZigke25leHRSb3d9KSB7XG4gICAgICAgICAgICByZXN1bHQuYiA9ICR7Z2V0QihjaGFubmVscy5zbGljZSgpKX07XG4gICAgICAgICAgICBpZigke25leHRDb2x1bW59KSB7XG4gICAgICAgICAgICAgIHJlc3VsdC5hID0gJHtnZXRBKGNoYW5uZWxzLnNsaWNlKCkpfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgc2V0T3V0cHV0KHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICBgO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFIoY2hhbm5lbHM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiBnZXRDaGFubmVsKGNoYW5uZWxzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRHKGNoYW5uZWxzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gICAgICBjaGFubmVsc1tyYW5rIC0gMV0gPSAnKCcgKyBjaGFubmVsc1tyYW5rIC0gMV0gKyBgICsgMSlgO1xuICAgICAgcmV0dXJuIGdldENoYW5uZWwoY2hhbm5lbHMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldEIoY2hhbm5lbHM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICAgIGNoYW5uZWxzW3JhbmsgLSAyXSA9ICcoJyArIGNoYW5uZWxzW3JhbmsgLSAyXSArIGAgKyAxKWA7XG4gICAgICByZXR1cm4gZ2V0Q2hhbm5lbChjaGFubmVscyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0QShjaGFubmVsczogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgICAgY2hhbm5lbHNbcmFuayAtIDFdID0gJygnICsgY2hhbm5lbHNbcmFuayAtIDFdICsgYCArIDEpYDtcbiAgICAgIGNoYW5uZWxzW3JhbmsgLSAyXSA9ICcoJyArIGNoYW5uZWxzW3JhbmsgLSAyXSArIGAgKyAxKWA7XG4gICAgICByZXR1cm4gZ2V0Q2hhbm5lbChjaGFubmVscyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0Q2hhbm5lbChjaGFubmVsczogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgICAgY29uc3QgaW5Db29yZHNBcnJheSA9IHhTaGFwZS5tYXAoKF8sIGkpID0+IGdldEluQ29vcmQoaSwgY2hhbm5lbHMpKTtcbiAgICAgIGNvbnN0IGluQ29vcmRzID0gaW5Db29yZHNBcnJheS5qb2luKCcsJyk7XG4gICAgICBjb25zdCBpbm5lckRpbXMgPSBpbkNvb3Jkc0FycmF5LnNsaWNlKC0yKS5qb2luKCcsJyk7XG4gICAgICByZXR1cm4gYGdldENoYW5uZWwoZ2V0WCgke2luQ29vcmRzfSksIHZlYzIoJHtpbm5lckRpbXN9KSlgO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldEluQ29vcmQoaTogbnVtYmVyLCBjaGFubmVsczE6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICAgIGlmIChheGlzLmluZGV4T2YoaSkgIT09IC0xICYmIHhTaGFwZVtpXSAhPT0gMSkge1xuICAgICAgICByZXR1cm4gYCR7eFNoYXBlW2ldfSAtICR7Y2hhbm5lbHMxW2ldfSAtIDFgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGAke2NoYW5uZWxzMVtpXX1gO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcbmltcG9ydCB7VW5pZm9ybVR5cGV9IGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyJztcblxuZXhwb3J0IGNsYXNzIFJvdGF0ZVByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWydJbWFnZSddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW10gPSBbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcbiAgY3VzdG9tVW5pZm9ybXMgPSBbe25hbWU6ICdwYXJhbXMnLCB0eXBlOiAndmVjNCcgYXMgVW5pZm9ybVR5cGV9XTtcbiAgY29uc3RydWN0b3IoXG4gICAgICBpbWFnZVNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICAgIGZpbGxWYWx1ZTogbnVtYmVyfFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSkge1xuICAgIGNvbnN0IGltYWdlSGVpZ2h0ID0gaW1hZ2VTaGFwZVsxXTtcbiAgICBjb25zdCBpbWFnZVdpZHRoID0gaW1hZ2VTaGFwZVsyXTtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gaW1hZ2VTaGFwZTtcblxuICAgIGxldCBmaWxsU25pcHBldCA9ICcnO1xuICAgIGlmICh0eXBlb2YgZmlsbFZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgZmlsbFNuaXBwZXQgPSBgZmxvYXQgb3V0cHV0VmFsdWUgPSAke2ZpbGxWYWx1ZS50b0ZpeGVkKDIpfTtgO1xuICAgIH0gZWxzZSB7XG4gICAgICBmaWxsU25pcHBldCA9IGBcbiAgICAgICAgdmVjMyBmaWxsID0gdmVjMygke2ZpbGxWYWx1ZS5qb2luKCcsJyl9KTtcbiAgICAgICAgZmxvYXQgb3V0cHV0VmFsdWUgPSBmaWxsW2Nvb3Jkc1szXV07YDtcbiAgICB9XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgICAgaW50IHggPSBjb29yZHNbMl07XG4gICAgICAgICAgaW50IHkgPSBjb29yZHNbMV07XG4gICAgICAgICAgZmxvYXQgY29vcmRYRmxvYXQgPSAoZmxvYXQoeCkgLSBwYXJhbXNbMF0pICogcGFyYW1zWzNdIC1cbiAgICAgICAgICAgIChmbG9hdCh5KSAtIHBhcmFtc1sxXSkgKiBwYXJhbXNbMl07XG4gICAgICAgICAgZmxvYXQgY29vcmRZRmxvYXQgPSAoZmxvYXQoeCkgLSBwYXJhbXNbMF0pICogcGFyYW1zWzJdICtcbiAgICAgICAgICAgIChmbG9hdCh5KSAtIHBhcmFtc1sxXSkgKiBwYXJhbXNbM107XG4gICAgICAgICAgaW50IGNvb3JkWCA9IGludChyb3VuZChjb29yZFhGbG9hdCArIHBhcmFtc1swXSkpO1xuICAgICAgICAgIGludCBjb29yZFkgPSBpbnQocm91bmQoY29vcmRZRmxvYXQgKyBwYXJhbXNbMV0pKTtcbiAgICAgICAgICAke2ZpbGxTbmlwcGV0fVxuICAgICAgICAgIGlmKGNvb3JkWCA+PSAwICYmIGNvb3JkWCA8ICR7aW1hZ2VXaWR0aH0gJiYgY29vcmRZID49IDAgJiYgY29vcmRZIDwgJHtcbiAgICAgICAgaW1hZ2VIZWlnaHR9KSB7XG4gICAgICAgICAgICBvdXRwdXRWYWx1ZSA9IGdldEltYWdlKGNvb3Jkc1swXSwgY29vcmRZLCBjb29yZFgsIGNvb3Jkc1szXSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNldE91dHB1dChvdXRwdXRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuaW1wb3J0IHtnZXRDb29yZHNEYXRhVHlwZX0gZnJvbSAnLi9zaGFkZXJfY29tcGlsZXInO1xuXG5leHBvcnQgY2xhc3MgU2NhdHRlclByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWyd1cGRhdGVzJywgJ2luZGljZXMnLCAnZGVmYXVsdFZhbHVlJ107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIHVwZGF0ZVNpemU6IG51bWJlciwgc2xpY2VEaW06IG51bWJlciwgaW5kaWNlc1Jhbms6IG51bWJlcixcbiAgICAgIHVwZGF0ZXNSYW5rOiBudW1iZXIsIHN0cmlkZXM6IG51bWJlcltdLCBzaGFwZTogbnVtYmVyW10sXG4gICAgICBzdW1taW5nRHVwZUluZGV4ID0gdHJ1ZSkge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBzaGFwZTtcbiAgICBjb25zdCBzdHJpZGVzVHlwZSA9IGdldENvb3Jkc0RhdGFUeXBlKHN0cmlkZXMubGVuZ3RoKTtcbiAgICBjb25zdCBkdHlwZSA9IGdldENvb3Jkc0RhdGFUeXBlKHNoYXBlLmxlbmd0aCk7XG4gICAgbGV0IGluZGljZXNTdHJpbmcgPSAnJztcbiAgICBpZiAoaW5kaWNlc1JhbmsgPT09IDEpIHtcbiAgICAgIGluZGljZXNTdHJpbmcgPSAnaSc7XG4gICAgfSBlbHNlIGlmIChpbmRpY2VzUmFuayA9PT0gMikge1xuICAgICAgaW5kaWNlc1N0cmluZyA9ICdpLCBqJztcbiAgICB9XG4gICAgY29uc3QgaW5kaWNlc1NuaXBwZXQgPSBgZ2V0SW5kaWNlcygke2luZGljZXNTdHJpbmd9KWA7XG5cbiAgICBsZXQgdXBkYXRlc1N0cmluZyA9ICcnO1xuICAgIGlmICh1cGRhdGVzUmFuayA9PT0gMSkge1xuICAgICAgdXBkYXRlc1N0cmluZyA9ICdpJztcbiAgICB9IGVsc2UgaWYgKHVwZGF0ZXNSYW5rID09PSAyKSB7XG4gICAgICB1cGRhdGVzU3RyaW5nID0gJ2ksIGNvb3Jkc1sxXSc7XG4gICAgfVxuICAgIGNvbnN0IHVwZGF0ZXNTbmlwcGV0ID0gYGdldFVwZGF0ZXMoJHt1cGRhdGVzU3RyaW5nfSlgO1xuXG4gICAgY29uc3Qgc3RyaWRlU3RyaW5nID0gc2xpY2VEaW0gPiAxID8gJ3N0cmlkZXNbal0nIDogJ3N0cmlkZXMnO1xuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICAgICR7c3RyaWRlc1R5cGV9IHN0cmlkZXMgPSAke3N0cmlkZXNUeXBlfSgke3N0cmlkZXN9KTtcblxuICAgICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICAgJHtkdHlwZX0gY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgICAgZmxvYXQgc3VtID0gMC4wO1xuICAgICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTtcbiAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8ICR7dXBkYXRlU2l6ZX07IGkrKykge1xuICAgICAgICAgICAgaW50IGZsYXR0ZW5lZEluZGV4ID0gMDtcbiAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgJHtzbGljZURpbX07IGorKykge1xuICAgICAgICAgICAgICBpbnQgaW5kZXggPSByb3VuZCgke2luZGljZXNTbmlwcGV0fSk7XG4gICAgICAgICAgICAgIGZsYXR0ZW5lZEluZGV4ICs9IGluZGV4ICogJHtzdHJpZGVTdHJpbmd9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZsYXR0ZW5lZEluZGV4ID09IGNvb3Jkc1swXSkge1xuICAgICAgICAgICAgICBzdW0gKz0gJHt1cGRhdGVzU25pcHBldH07XG4gICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgc2V0T3V0cHV0KG1peChnZXREZWZhdWx0VmFsdWUoKSwgc3VtLCBmbG9hdChmb3VuZCkpKTtcbiAgICAgICAgfVxuICAgICAgYDtcbiAgfVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuXG5leHBvcnQgY2xhc3MgU2VnbWVudE9wUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ3gnLCAnc2VnbWVudElkcyddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBzZWdPcEluZm86IGJhY2tlbmRfdXRpbC5zZWdtZW50X3V0aWwuU2VnT3BJbmZvLFxuICAgICAgc2VnT3BUeXBlOiAndW5zb3J0ZWRTZWdtZW50U3VtJykge1xuICAgIGNvbnN0IHdpbmRvd1NpemUgPSBzZWdPcEluZm8ud2luZG93U2l6ZTtcbiAgICBjb25zdCBiYXRjaFNpemUgPSBzZWdPcEluZm8uYmF0Y2hTaXplO1xuICAgIGNvbnN0IGluU2l6ZSA9IHNlZ09wSW5mby5pblNpemU7XG4gICAgY29uc3QgbnVtU2VnbWVudHMgPSBzZWdPcEluZm8ubnVtU2VnbWVudHM7XG4gICAgY29uc3Qgb3V0U2l6ZSA9IG51bVNlZ21lbnRzICogTWF0aC5jZWlsKGluU2l6ZSAvIHdpbmRvd1NpemUpO1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBbYmF0Y2hTaXplLCBvdXRTaXplXTtcblxuICAgIGNvbnN0IGluaXRpYWxpemF0aW9uVmFsdWUgPSAnMC4wJztcbiAgICBjb25zdCByZXR1cm5WYWx1ZSA9IGBzdW1WYWx1ZWA7XG5cbiAgICBjb25zdCB3aW5kb3dTaXplTmVhcmVzdFZlYzQgPSBNYXRoLmZsb29yKHdpbmRvd1NpemUgLyA0KSAqIDQ7XG4gICAgY29uc3Qgd2luZG93U2l6ZVZlYzRSZW1haW5kZXIgPSB3aW5kb3dTaXplICUgNDtcblxuICAgIGNvbnN0IHVwZGF0ZVNuaXBwZXQgPSBgXG4gICAgICAgIHN1bVZhbHVlICs9IGRvdCh2YWx1ZXMsIHNlZ0ZpbHRlcik7XG4gICAgYDtcblxuICAgIGxldCBjaGVja1ZhbHVlT3V0T2ZCb3VuZHMgPSAnJztcbiAgICBpZiAoaW5TaXplICUgd2luZG93U2l6ZSA+IDApIHtcbiAgICAgIGNoZWNrVmFsdWVPdXRPZkJvdW5kcyA9IGBcbiAgICAgICAgaWYgKGluSWR4IDwgMCB8fCBpbklkeCA+PSAke2luU2l6ZX0pIHtcbiAgICAgICAgICByZXR1cm4gaW5pdGlhbGl6YXRpb25WYWx1ZTtcbiAgICAgICAgfVxuICAgICAgYDtcbiAgICB9XG5cbiAgICBsZXQgY2hlY2tTZWdtZW50SWRPdXRPZkJvdW5kcyA9ICcnO1xuICAgIGlmIChpblNpemUgJSB3aW5kb3dTaXplID4gMCkge1xuICAgICAgY2hlY2tTZWdtZW50SWRPdXRPZkJvdW5kcyA9IGBcbiAgICAgICAgaWYgKGluSWR4IDwgMCB8fCBpbklkeCA+PSAke2luU2l6ZX0pIHtcbiAgICAgICAgICByZXR1cm4gLTEuMDtcbiAgICAgICAgfVxuICAgICAgYDtcbiAgICB9XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgY29uc3QgZmxvYXQgaW5pdGlhbGl6YXRpb25WYWx1ZSA9ICR7aW5pdGlhbGl6YXRpb25WYWx1ZX07XG5cbiAgICAgIGZsb2F0IGdldFZhbHVlKGludCBiYXRjaCwgaW50IGluSWR4KSB7XG4gICAgICAgICR7Y2hlY2tWYWx1ZU91dE9mQm91bmRzfVxuICAgICAgICByZXR1cm4gZ2V0WChiYXRjaCwgaW5JZHgpO1xuICAgICAgfVxuXG4gICAgICBmbG9hdCBnZXRTZWdtZW50SWRBdEluZGV4KGludCBpbklkeCkge1xuICAgICAgICAke2NoZWNrU2VnbWVudElkT3V0T2ZCb3VuZHN9XG4gICAgICAgIHJldHVybiBnZXRTZWdtZW50SWRzKGluSWR4KTtcbiAgICAgIH1cblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjMiBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IGJhdGNoID0gY29vcmRzWzBdO1xuICAgICAgICBpbnQgb3V0SWR4ID0gY29vcmRzWzFdO1xuICAgICAgICBpbnQgaW5PZmZzZXQgPSBpbnQoZmxvb3IoZmxvYXQob3V0SWR4KSAvIGZsb2F0KFxuICAgICAgICAgICR7bnVtU2VnbWVudHN9KSkgKiBmbG9hdCgke3dpbmRvd1NpemV9KSk7XG4gICAgICAgIGludCBjdXJyZW50U2VnID0gaW50KG1vZChmbG9hdChvdXRJZHgpLCBmbG9hdCgke251bVNlZ21lbnRzfSkpKTtcblxuICAgICAgICBmbG9hdCBzdW1WYWx1ZSA9IDAuMDtcblxuICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8ICR7d2luZG93U2l6ZU5lYXJlc3RWZWM0fTsgaSArPSA0KSB7XG4gICAgICAgICAgaW50IGluSWR4ID0gaW5PZmZzZXQgKyBpO1xuICAgICAgICAgIHZlYzQgdmFsdWVzID0gdmVjNChcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCksXG4gICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgaW5JZHggKyAxKSxcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCArIDIpLFxuICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIGluSWR4ICsgMylcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgdmVjNCBzZWdGaWx0ZXIgPSB2ZWM0KFxuICAgICAgICAgICAgaW50KGdldFNlZ21lbnRJZEF0SW5kZXgoaW5JZHgpKSA9PSBjdXJyZW50U2VnID8gMSA6IDAsXG4gICAgICAgICAgICBpbnQoZ2V0U2VnbWVudElkQXRJbmRleChpbklkeCArIDEpKSA9PSBjdXJyZW50U2VnID8gMSA6IDAsXG4gICAgICAgICAgICBpbnQoZ2V0U2VnbWVudElkQXRJbmRleChpbklkeCArIDIpKSA9PSBjdXJyZW50U2VnID8gMSA6IDAsXG4gICAgICAgICAgICBpbnQoZ2V0U2VnbWVudElkQXRJbmRleChpbklkeCArIDMpKSA9PSBjdXJyZW50U2VnID8gMSA6IDBcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgJHt1cGRhdGVTbmlwcGV0fVxuICAgICAgICB9XG5cbiAgICAgICAgaW50IGluSWR4ID0gaW5PZmZzZXQgKyAke3dpbmRvd1NpemVOZWFyZXN0VmVjNH07XG4gICAgICAgIGlmICgke3dpbmRvd1NpemVWZWM0UmVtYWluZGVyID09PSAxfSkge1xuICAgICAgICAgIHZlYzQgdmFsdWVzID0gdmVjNChcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCksXG4gICAgICAgICAgICBpbml0aWFsaXphdGlvblZhbHVlLFxuICAgICAgICAgICAgaW5pdGlhbGl6YXRpb25WYWx1ZSxcbiAgICAgICAgICAgIGluaXRpYWxpemF0aW9uVmFsdWVcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaW50IGluSWR4U2VnID0gaW50KGdldFNlZ21lbnRJZEF0SW5kZXgoaW5JZHgpKTtcblxuICAgICAgICAgIHZlYzQgc2VnRmlsdGVyID0gdmVjNChcbiAgICAgICAgICAgIGludChnZXRTZWdtZW50SWRBdEluZGV4KGluSWR4KSkgPT0gY3VycmVudFNlZyA/IDEgOiAwLFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAwXG4gICAgICAgICAgKTtcblxuICAgICAgICAgICR7dXBkYXRlU25pcHBldH1cbiAgICAgICAgfSBlbHNlIGlmICgke3dpbmRvd1NpemVWZWM0UmVtYWluZGVyID09PSAyfSkge1xuICAgICAgICAgIHZlYzQgdmFsdWVzID0gdmVjNChcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCksXG4gICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgaW5JZHggKyAxKSxcbiAgICAgICAgICAgIGluaXRpYWxpemF0aW9uVmFsdWUsXG4gICAgICAgICAgICBpbml0aWFsaXphdGlvblZhbHVlXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHZlYzQgc2VnRmlsdGVyID0gdmVjNChcbiAgICAgICAgICAgIGludChnZXRTZWdtZW50SWRBdEluZGV4KGluSWR4KSkgPT0gY3VycmVudFNlZyA/IDEgOiAwLFxuICAgICAgICAgICAgaW50KGdldFNlZ21lbnRJZEF0SW5kZXgoaW5JZHggKyAxKSkgPT0gY3VycmVudFNlZyA/IDEgOiAwLFxuICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAwXG4gICAgICAgICAgKTtcblxuICAgICAgICAgICR7dXBkYXRlU25pcHBldH1cbiAgICAgICAgfSBlbHNlIGlmICgke3dpbmRvd1NpemVWZWM0UmVtYWluZGVyID09PSAzfSkge1xuICAgICAgICAgIHZlYzQgdmFsdWVzID0gdmVjNChcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCksXG4gICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgaW5JZHggKyAxKSxcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCArIDIpLFxuICAgICAgICAgICAgaW5pdGlhbGl6YXRpb25WYWx1ZVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICB2ZWM0IHNlZ0ZpbHRlciA9IHZlYzQoXG4gICAgICAgICAgICBpbnQoZ2V0U2VnbWVudElkQXRJbmRleChpbklkeCkpID09IGN1cnJlbnRTZWcgPyAxIDogMCxcbiAgICAgICAgICAgIGludChnZXRTZWdtZW50SWRBdEluZGV4KGluSWR4ICsgMSkpID09IGN1cnJlbnRTZWcgPyAxIDogMCxcbiAgICAgICAgICAgIGludChnZXRTZWdtZW50SWRBdEluZGV4KGluSWR4ICsgMikpID09IGN1cnJlbnRTZWcgPyAxIDogMCxcbiAgICAgICAgICAgIDBcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgJHt1cGRhdGVTbmlwcGV0fVxuICAgICAgICB9XG4gICAgICAgIHNldE91dHB1dCgke3JldHVyblZhbHVlfSk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcbmltcG9ydCB7Z2V0Q29vcmRzRGF0YVR5cGV9IGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyJztcblxuZXhwb3J0IGNsYXNzIFNlbGVjdFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWydjJywgJ2EnLCAnYiddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoY1Jhbms6IG51bWJlciwgc2hhcGU6IG51bWJlcltdLCByYW5rOiBudW1iZXIpIHtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gc2hhcGU7XG5cbiAgICBsZXQgY0Nvb3JkcztcbiAgICBsZXQgYWJDb29yZHM7XG4gICAgaWYgKHJhbmsgPiA0KSB7XG4gICAgICB0aHJvdyBFcnJvcihgV2hlcmUgZm9yIHJhbmsgJHtyYW5rfSBpcyBub3QgeWV0IHN1cHBvcnRlZGApO1xuICAgIH1cblxuICAgIGlmIChyYW5rID09PSAxKSB7XG4gICAgICBhYkNvb3JkcyA9IGByZXNSQ2A7XG4gICAgICBjQ29vcmRzID0gYHJlc1JDYDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY3VycmVudENvb3JkcyA9IFsncmVzUkMueCcsICdyZXNSQy55JywgJ3Jlc1JDLnonLCAncmVzUkMudyddO1xuICAgICAgY29uc3QgY0Nvb3JkVmFycyA9IFtdO1xuICAgICAgY29uc3QgYWJDb29yZFZhcnMgPSBbXTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2hhcGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYWJDb29yZFZhcnMucHVzaChgJHtjdXJyZW50Q29vcmRzW2ldfWApO1xuICAgICAgICBpZiAoaSA8IGNSYW5rKSB7XG4gICAgICAgICAgY0Nvb3JkVmFycy5wdXNoKGAke2N1cnJlbnRDb29yZHNbaV19YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNDb29yZHMgPSBjQ29vcmRWYXJzLmpvaW4oKTtcbiAgICAgIGFiQ29vcmRzID0gYWJDb29yZFZhcnMuam9pbigpO1xuICAgIH1cblxuICAgIGNvbnN0IGR0eXBlID0gZ2V0Q29vcmRzRGF0YVR5cGUocmFuayk7XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAke2R0eXBlfSByZXNSQyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBmbG9hdCBjVmFsID0gZ2V0Qygke2NDb29yZHN9KTtcbiAgICAgICAgaWYgKGNWYWwgPj0gMS4wKSB7XG4gICAgICAgICAgc2V0T3V0cHV0KGdldEEoJHthYkNvb3Jkc30pKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZXRPdXRwdXQoZ2V0Qigke2FiQ29vcmRzfSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vLyBQbGVhc2UgbWFrZSBzdXJlIHRoZSBzaGFrZXIga2V5IGluIG1ha2VTaGFkZXJLZXkgaW4gZ3BncHVfbWF0aC50cyBpcyB3ZWxsXG4vLyBtYXBwZWQgaWYgYW55IHNoYWRlciBzb3VyY2UgY29kZSBpcyBjaGFuZ2VkIGluIHRoaXMgZmlsZS5cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5jb25zdCB7Z2V0QnJvYWRjYXN0RGltc30gPSBiYWNrZW5kX3V0aWw7XG5pbXBvcnQge2dldEdsc2xEaWZmZXJlbmNlcywgR0xTTH0gZnJvbSAnLi9nbHNsX3ZlcnNpb24nO1xuaW1wb3J0ICogYXMgc2hhZGVyX3V0aWwgZnJvbSAnLi9zaGFkZXJfY29tcGlsZXJfdXRpbCc7XG5cbmV4cG9ydCB0eXBlIFNoYXBlSW5mbyA9IHtcbiAgbG9naWNhbFNoYXBlOiBudW1iZXJbXSxcbiAgdGV4U2hhcGU6IFtudW1iZXIsIG51bWJlcl0sXG4gIGlzVW5pZm9ybTogYm9vbGVhbixcbiAgaXNQYWNrZWQ6IGJvb2xlYW4sXG4gIGZsYXRPZmZzZXQ6IG51bWJlclxufTtcblxuZXhwb3J0IHR5cGUgSW5wdXRJbmZvID0ge1xuICBuYW1lOiBzdHJpbmcsXG4gIHNoYXBlSW5mbzogU2hhcGVJbmZvXG59O1xuXG5leHBvcnQgdHlwZSBVbmlmb3JtVHlwZSA9XG4gICAgJ2Zsb2F0J3wndmVjMid8J3ZlYzMnfCd2ZWM0J3wnaW50J3wnaXZlYzInfCdpdmVjMyd8J2l2ZWM0JztcblxuaW50ZXJmYWNlIFByb2dyYW1QYXJhbXMge1xuICB1c2VyQ29kZTogc3RyaW5nO1xuICBlbmFibGVTaGFwZVVuaWZvcm1zPzogYm9vbGVhbjtcbiAgcGFja2VkSW5wdXRzPzogYm9vbGVhbjtcbiAgY3VzdG9tVW5pZm9ybXM/OlxuICAgICAgQXJyYXk8e25hbWU6IHN0cmluZzsgYXJyYXlJbmRleD86IG51bWJlcjsgdHlwZTogVW5pZm9ybVR5cGU7fT47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYWtlU2hhZGVyKFxuICAgIGlucHV0c0luZm86IElucHV0SW5mb1tdLCBvdXRwdXRTaGFwZTogU2hhcGVJbmZvLFxuICAgIHByb2dyYW06IFByb2dyYW1QYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCBwcmVmaXhTbmlwcGV0czogc3RyaW5nW10gPSBbXTtcbiAgaW5wdXRzSW5mby5mb3JFYWNoKHggPT4ge1xuICAgIGNvbnN0IHNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoeC5zaGFwZUluZm8ubG9naWNhbFNoYXBlKTtcblxuICAgIC8vIFNuaXBwZXQgd2hlbiB3ZSBkZWNpZGVkIHRvIHVwbG9hZCB0aGUgdmFsdWVzIGFzIHVuaWZvcm0uXG4gICAgaWYgKHguc2hhcGVJbmZvLmlzVW5pZm9ybSkge1xuICAgICAgcHJlZml4U25pcHBldHMucHVzaChcbiAgICAgICAgICBgdW5pZm9ybSBmbG9hdCAke3gubmFtZX0ke3NpemUgPiAxID8gYFske3NpemV9XWAgOiAnJ307YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByZWZpeFNuaXBwZXRzLnB1c2goYHVuaWZvcm0gc2FtcGxlcjJEICR7eC5uYW1lfTtgKTtcbiAgICAgIHByZWZpeFNuaXBwZXRzLnB1c2goYHVuaWZvcm0gaW50IG9mZnNldCR7eC5uYW1lfTtgKTtcbiAgICB9XG5cbiAgICBpZiAocHJvZ3JhbS5lbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgICBjb25zdCB7dW5pZm9ybVNoYXBlfSA9IGdldFVuaWZvcm1JbmZvRnJvbVNoYXBlKFxuICAgICAgICAgIHByb2dyYW0ucGFja2VkSW5wdXRzLCB4LnNoYXBlSW5mby5sb2dpY2FsU2hhcGUsIHguc2hhcGVJbmZvLnRleFNoYXBlKTtcbiAgICAgIHN3aXRjaCAodW5pZm9ybVNoYXBlLmxlbmd0aCkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgcHJlZml4U25pcHBldHMucHVzaChgdW5pZm9ybSBpbnQgJHt4Lm5hbWV9U2hhcGU7YCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBwcmVmaXhTbmlwcGV0cy5wdXNoKGB1bmlmb3JtIGl2ZWMyICR7eC5uYW1lfVNoYXBlO2ApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgcHJlZml4U25pcHBldHMucHVzaChgdW5pZm9ybSBpdmVjMyAke3gubmFtZX1TaGFwZTtgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIHByZWZpeFNuaXBwZXRzLnB1c2goYHVuaWZvcm0gaXZlYzQgJHt4Lm5hbWV9U2hhcGU7YCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBwcmVmaXhTbmlwcGV0cy5wdXNoKGB1bmlmb3JtIGl2ZWMyICR7eC5uYW1lfVRleFNoYXBlO2ApO1xuICAgIH1cbiAgfSk7XG5cbiAgaWYgKHByb2dyYW0uZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgIHN3aXRjaCAob3V0cHV0U2hhcGUubG9naWNhbFNoYXBlLmxlbmd0aCkge1xuICAgICAgY2FzZSAxOlxuICAgICAgICBwcmVmaXhTbmlwcGV0cy5wdXNoKGB1bmlmb3JtIGludCBvdXRTaGFwZTtgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI6XG4gICAgICAgIHByZWZpeFNuaXBwZXRzLnB1c2goYHVuaWZvcm0gaXZlYzIgb3V0U2hhcGU7YCk7XG4gICAgICAgIHByZWZpeFNuaXBwZXRzLnB1c2goYHVuaWZvcm0gaW50IG91dFNoYXBlU3RyaWRlcztgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDM6XG4gICAgICAgIHByZWZpeFNuaXBwZXRzLnB1c2goYHVuaWZvcm0gaXZlYzMgb3V0U2hhcGU7YCk7XG4gICAgICAgIHByZWZpeFNuaXBwZXRzLnB1c2goYHVuaWZvcm0gaXZlYzIgb3V0U2hhcGVTdHJpZGVzO2ApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNDpcbiAgICAgICAgcHJlZml4U25pcHBldHMucHVzaChgdW5pZm9ybSBpdmVjNCBvdXRTaGFwZTtgKTtcbiAgICAgICAgcHJlZml4U25pcHBldHMucHVzaChgdW5pZm9ybSBpdmVjMyBvdXRTaGFwZVN0cmlkZXM7YCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHByZWZpeFNuaXBwZXRzLnB1c2goYHVuaWZvcm0gaXZlYzIgb3V0VGV4U2hhcGU7YCk7XG4gIH1cbiAgaWYgKHByb2dyYW0uY3VzdG9tVW5pZm9ybXMpIHtcbiAgICBwcm9ncmFtLmN1c3RvbVVuaWZvcm1zLmZvckVhY2goKGQpID0+IHtcbiAgICAgIHByZWZpeFNuaXBwZXRzLnB1c2goYHVuaWZvcm0gJHtkLnR5cGV9ICR7ZC5uYW1lfSR7XG4gICAgICAgICAgZC5hcnJheUluZGV4ID8gYFske2QuYXJyYXlJbmRleH1dYCA6ICcnfTtgKTtcbiAgICB9KTtcbiAgfVxuICBjb25zdCBpbnB1dFByZWZpeFNuaXBwZXQgPSBwcmVmaXhTbmlwcGV0cy5qb2luKCdcXG4nKTtcblxuICBjb25zdCBpbnB1dFNhbXBsaW5nU25pcHBldCA9IGlucHV0c0luZm9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPT4gZ2V0SW5wdXRTYW1wbGluZ1NuaXBwZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCwgb3V0cHV0U2hhcGUsIHByb2dyYW0ucGFja2VkSW5wdXRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyYW0uZW5hYmxlU2hhcGVVbmlmb3JtcykpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5qb2luKCdcXG4nKTtcbiAgY29uc3Qgb3V0VGV4U2hhcGUgPSBvdXRwdXRTaGFwZS50ZXhTaGFwZTtcbiAgY29uc3QgZ2xzbCA9IGdldEdsc2xEaWZmZXJlbmNlcygpO1xuICBjb25zdCBmbG9hdFRleHR1cmVTYW1wbGVTbmlwcGV0ID0gZ2V0RmxvYXRUZXh0dXJlU2FtcGxlU25pcHBldChnbHNsKTtcbiAgbGV0IG91dHB1dFNhbXBsaW5nU25pcHBldDogc3RyaW5nO1xuICBsZXQgZmxvYXRUZXh0dXJlU2V0T3V0cHV0U25pcHBldDogc3RyaW5nO1xuICBsZXQgc2hhZGVyUHJlZml4ID0gZ2V0U2hhZGVyUHJlZml4KGdsc2wpO1xuXG4gIGlmIChvdXRwdXRTaGFwZS5pc1BhY2tlZCkge1xuICAgIG91dHB1dFNhbXBsaW5nU25pcHBldCA9IGdldFBhY2tlZE91dHB1dFNhbXBsaW5nU25pcHBldChcbiAgICAgICAgb3V0cHV0U2hhcGUubG9naWNhbFNoYXBlLCBvdXRUZXhTaGFwZSwgcHJvZ3JhbS5lbmFibGVTaGFwZVVuaWZvcm1zKTtcbiAgICBmbG9hdFRleHR1cmVTZXRPdXRwdXRTbmlwcGV0ID0gZ2V0RmxvYXRUZXh0dXJlU2V0UkdCQVNuaXBwZXQoZ2xzbCk7XG4gIH0gZWxzZSB7XG4gICAgb3V0cHV0U2FtcGxpbmdTbmlwcGV0ID0gZ2V0T3V0cHV0U2FtcGxpbmdTbmlwcGV0KFxuICAgICAgICBvdXRwdXRTaGFwZS5sb2dpY2FsU2hhcGUsIG91dFRleFNoYXBlLCBwcm9ncmFtLmVuYWJsZVNoYXBlVW5pZm9ybXMpO1xuICAgIGZsb2F0VGV4dHVyZVNldE91dHB1dFNuaXBwZXQgPSBnZXRGbG9hdFRleHR1cmVTZXRSU25pcHBldChnbHNsKTtcbiAgfVxuXG4gIGlmIChwcm9ncmFtLnBhY2tlZElucHV0cykge1xuICAgIHNoYWRlclByZWZpeCArPSBTSEFERVJfUEFDS0VEX1BSRUZJWDtcbiAgfVxuXG4gIGNvbnN0IHNvdXJjZSA9IFtcbiAgICBzaGFkZXJQcmVmaXgsIGZsb2F0VGV4dHVyZVNhbXBsZVNuaXBwZXQsIGZsb2F0VGV4dHVyZVNldE91dHB1dFNuaXBwZXQsXG4gICAgaW5wdXRQcmVmaXhTbmlwcGV0LCBvdXRwdXRTYW1wbGluZ1NuaXBwZXQsIGlucHV0U2FtcGxpbmdTbmlwcGV0LFxuICAgIHByb2dyYW0udXNlckNvZGVcbiAgXS5qb2luKCdcXG4nKTtcbiAgcmV0dXJuIHNvdXJjZTtcbn1cblxuZnVuY3Rpb24gZ2V0U2FtcGxlckZyb21JbkluZm8oXG4gICAgaW5JbmZvOiBJbnB1dEluZm8sIGVuYWJsZVNoYXBlVW5pZm9ybXMgPSBmYWxzZSk6IHN0cmluZyB7XG4gIGNvbnN0IHNoYXBlID0gaW5JbmZvLnNoYXBlSW5mby5sb2dpY2FsU2hhcGU7XG4gIHN3aXRjaCAoc2hhcGUubGVuZ3RoKSB7XG4gICAgY2FzZSAwOlxuICAgICAgcmV0dXJuIGdldFNhbXBsZXJTY2FsYXIoaW5JbmZvLCBlbmFibGVTaGFwZVVuaWZvcm1zKTtcbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4gZ2V0U2FtcGxlcjFEKGluSW5mbywgZW5hYmxlU2hhcGVVbmlmb3Jtcyk7XG4gICAgY2FzZSAyOlxuICAgICAgcmV0dXJuIGdldFNhbXBsZXIyRChpbkluZm8sIGVuYWJsZVNoYXBlVW5pZm9ybXMpO1xuICAgIGNhc2UgMzpcbiAgICAgIHJldHVybiBnZXRTYW1wbGVyM0QoaW5JbmZvLCBlbmFibGVTaGFwZVVuaWZvcm1zKTtcbiAgICBjYXNlIDQ6XG4gICAgICByZXR1cm4gZ2V0U2FtcGxlcjREKGluSW5mbywgZW5hYmxlU2hhcGVVbmlmb3Jtcyk7XG4gICAgY2FzZSA1OlxuICAgICAgcmV0dXJuIGdldFNhbXBsZXI1RChpbkluZm8pO1xuICAgIGNhc2UgNjpcbiAgICAgIHJldHVybiBnZXRTYW1wbGVyNkQoaW5JbmZvKTtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGAke3NoYXBlLmxlbmd0aH0tRCBpbnB1dCBzYW1wbGluZ2AgK1xuICAgICAgICAgIGAgaXMgbm90IHlldCBzdXBwb3J0ZWRgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRQYWNrZWRTYW1wbGVyRnJvbUluSW5mbyhcbiAgICBpbkluZm86IElucHV0SW5mbywgZW5hYmxlU2hhcGVVbmlmb3JtczogYm9vbGVhbik6IHN0cmluZyB7XG4gIGNvbnN0IHNoYXBlID0gaW5JbmZvLnNoYXBlSW5mby5sb2dpY2FsU2hhcGU7XG4gIHN3aXRjaCAoc2hhcGUubGVuZ3RoKSB7XG4gICAgY2FzZSAwOlxuICAgICAgcmV0dXJuIGdldFBhY2tlZFNhbXBsZXJTY2FsYXIoaW5JbmZvKTtcbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4gZ2V0UGFja2VkU2FtcGxlcjFEKGluSW5mbywgZW5hYmxlU2hhcGVVbmlmb3Jtcyk7XG4gICAgY2FzZSAyOlxuICAgICAgcmV0dXJuIGdldFBhY2tlZFNhbXBsZXIyRChpbkluZm8sIGVuYWJsZVNoYXBlVW5pZm9ybXMpO1xuICAgIGNhc2UgMzpcbiAgICAgIHJldHVybiBnZXRQYWNrZWRTYW1wbGVyM0QoaW5JbmZvLCBlbmFibGVTaGFwZVVuaWZvcm1zKTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGdldFBhY2tlZFNhbXBsZXJORChpbkluZm8sIGVuYWJsZVNoYXBlVW5pZm9ybXMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldElucHV0U2FtcGxpbmdTbmlwcGV0KFxuICAgIGluSW5mbzogSW5wdXRJbmZvLCBvdXRTaGFwZUluZm86IFNoYXBlSW5mbywgdXNlc1BhY2tlZFRleHR1cmVzID0gZmFsc2UsXG4gICAgZW5hYmxlU2hhcGVVbmlmb3JtczogYm9vbGVhbik6IHN0cmluZyB7XG4gIGxldCByZXMgPSAnJztcbiAgaWYgKHVzZXNQYWNrZWRUZXh0dXJlcykge1xuICAgIHJlcyArPSBnZXRQYWNrZWRTYW1wbGVyRnJvbUluSW5mbyhpbkluZm8sIGVuYWJsZVNoYXBlVW5pZm9ybXMpO1xuICB9IGVsc2Uge1xuICAgIHJlcyArPSBnZXRTYW1wbGVyRnJvbUluSW5mbyhpbkluZm8sIGVuYWJsZVNoYXBlVW5pZm9ybXMpO1xuICB9XG5cbiAgY29uc3QgaW5TaGFwZSA9IGluSW5mby5zaGFwZUluZm8ubG9naWNhbFNoYXBlO1xuICBjb25zdCBvdXRTaGFwZSA9IG91dFNoYXBlSW5mby5sb2dpY2FsU2hhcGU7XG4gIGlmIChpblNoYXBlLmxlbmd0aCA8PSBvdXRTaGFwZS5sZW5ndGgpIHtcbiAgICBpZiAodXNlc1BhY2tlZFRleHR1cmVzKSB7XG4gICAgICByZXMgKz0gZ2V0UGFja2VkU2FtcGxlckF0T3V0cHV0Q29vcmRzKGluSW5mbywgb3V0U2hhcGVJbmZvKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzICs9IGdldFNhbXBsZXJBdE91dHB1dENvb3JkcyhpbkluZm8sIG91dFNoYXBlSW5mbyk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXM7XG59XG5cbmZ1bmN0aW9uIGdldFBhY2tlZE91dHB1dFNhbXBsaW5nU25pcHBldChcbiAgICBvdXRTaGFwZTogbnVtYmVyW10sIG91dFRleFNoYXBlOiBbbnVtYmVyLCBudW1iZXJdLFxuICAgIGVuYWJsZVNoYXBlVW5pZm9ybXM6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBzd2l0Y2ggKG91dFNoYXBlLmxlbmd0aCkge1xuICAgIGNhc2UgMDpcbiAgICAgIHJldHVybiBnZXRPdXRwdXRTY2FsYXJDb29yZHMoKTtcbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4gZ2V0T3V0cHV0UGFja2VkMURDb29yZHMoXG4gICAgICAgICAgb3V0U2hhcGUgYXMgW251bWJlcl0sIG91dFRleFNoYXBlLCBlbmFibGVTaGFwZVVuaWZvcm1zKTtcbiAgICBjYXNlIDI6XG4gICAgICByZXR1cm4gZ2V0T3V0cHV0UGFja2VkMkRDb29yZHMoXG4gICAgICAgICAgb3V0U2hhcGUgYXMgW251bWJlciwgbnVtYmVyXSwgb3V0VGV4U2hhcGUsIGVuYWJsZVNoYXBlVW5pZm9ybXMpO1xuICAgIGNhc2UgMzpcbiAgICAgIHJldHVybiBnZXRPdXRwdXRQYWNrZWQzRENvb3JkcyhcbiAgICAgICAgICBvdXRTaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIG91dFRleFNoYXBlLFxuICAgICAgICAgIGVuYWJsZVNoYXBlVW5pZm9ybXMpO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZ2V0T3V0cHV0UGFja2VkTkRDb29yZHMoXG4gICAgICAgICAgb3V0U2hhcGUsIG91dFRleFNoYXBlLCBlbmFibGVTaGFwZVVuaWZvcm1zKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRPdXRwdXRTYW1wbGluZ1NuaXBwZXQoXG4gICAgb3V0U2hhcGU6IG51bWJlcltdLCBvdXRUZXhTaGFwZTogW251bWJlciwgbnVtYmVyXSxcbiAgICBlbmFibGVTaGFwZVVuaWZvcm1zOiBib29sZWFuKTogc3RyaW5nIHtcbiAgc3dpdGNoIChvdXRTaGFwZS5sZW5ndGgpIHtcbiAgICBjYXNlIDA6XG4gICAgICByZXR1cm4gZ2V0T3V0cHV0U2NhbGFyQ29vcmRzKCk7XG4gICAgY2FzZSAxOlxuICAgICAgcmV0dXJuIGdldE91dHB1dDFEQ29vcmRzKFxuICAgICAgICAgIG91dFNoYXBlIGFzIFtudW1iZXJdLCBvdXRUZXhTaGFwZSwgZW5hYmxlU2hhcGVVbmlmb3Jtcyk7XG4gICAgY2FzZSAyOlxuICAgICAgcmV0dXJuIGdldE91dHB1dDJEQ29vcmRzKFxuICAgICAgICAgIG91dFNoYXBlIGFzIFtudW1iZXIsIG51bWJlcl0sIG91dFRleFNoYXBlLCBlbmFibGVTaGFwZVVuaWZvcm1zKTtcbiAgICBjYXNlIDM6XG4gICAgICByZXR1cm4gZ2V0T3V0cHV0M0RDb29yZHMoXG4gICAgICAgICAgb3V0U2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXJdLCBvdXRUZXhTaGFwZSxcbiAgICAgICAgICBlbmFibGVTaGFwZVVuaWZvcm1zKTtcbiAgICBjYXNlIDQ6XG4gICAgICByZXR1cm4gZ2V0T3V0cHV0NERDb29yZHMoXG4gICAgICAgICAgb3V0U2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIG91dFRleFNoYXBlLFxuICAgICAgICAgIGVuYWJsZVNoYXBlVW5pZm9ybXMpO1xuICAgIGNhc2UgNTpcbiAgICAgIHJldHVybiBnZXRPdXRwdXQ1RENvb3JkcyhcbiAgICAgICAgICBvdXRTaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLCBvdXRUZXhTaGFwZSk7XG4gICAgY2FzZSA2OlxuICAgICAgcmV0dXJuIGdldE91dHB1dDZEQ29vcmRzKFxuICAgICAgICAgIG91dFNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICAgICAgICBvdXRUZXhTaGFwZSk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgJHtvdXRTaGFwZS5sZW5ndGh9LUQgb3V0cHV0IHNhbXBsaW5nIGlzIG5vdCB5ZXQgc3VwcG9ydGVkYCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0RmxvYXRUZXh0dXJlU2FtcGxlU25pcHBldChnbHNsOiBHTFNMKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBcbiAgICBmbG9hdCBzYW1wbGVUZXh0dXJlKHNhbXBsZXIyRCB0ZXh0dXJlU2FtcGxlciwgdmVjMiB1dikge1xuICAgICAgcmV0dXJuICR7Z2xzbC50ZXh0dXJlMkR9KHRleHR1cmVTYW1wbGVyLCB1dikucjtcbiAgICB9XG4gIGA7XG59XG5cbmZ1bmN0aW9uIGdldEZsb2F0VGV4dHVyZVNldFJTbmlwcGV0KGdsc2w6IEdMU0wpOiBzdHJpbmcge1xuICByZXR1cm4gYFxuICAgIHZvaWQgc2V0T3V0cHV0KGZsb2F0IHZhbCkge1xuICAgICAgJHtnbHNsLm91dHB1dH0gPSB2ZWM0KHZhbCwgMCwgMCwgMCk7XG4gICAgfVxuICBgO1xufVxuXG5mdW5jdGlvbiBnZXRGbG9hdFRleHR1cmVTZXRSR0JBU25pcHBldChnbHNsOiBHTFNMKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBcbiAgICB2b2lkIHNldE91dHB1dCh2ZWM0IHZhbCkge1xuICAgICAgJHtnbHNsLm91dHB1dH0gPSB2YWw7XG4gICAgfVxuICBgO1xufVxuXG5mdW5jdGlvbiBnZXRTaGFkZXJQcmVmaXgoZ2xzbDogR0xTTCk6IHN0cmluZyB7XG4gIGNvbnN0IFNIQURFUl9QUkVGSVggPSBgJHtnbHNsLnZlcnNpb259XG4gICAgcHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xuICAgIHByZWNpc2lvbiBoaWdocCBpbnQ7XG4gICAgcHJlY2lzaW9uIGhpZ2hwIHNhbXBsZXIyRDtcbiAgICAke2dsc2wudmFyeWluZ0ZzfSB2ZWMyIHJlc3VsdFVWO1xuICAgICR7Z2xzbC5kZWZpbmVPdXRwdXR9XG4gICAgY29uc3QgdmVjMiBoYWxmQ1IgPSB2ZWMyKDAuNSwgMC41KTtcblxuICAgIHN0cnVjdCBpdmVjNVxuICAgIHtcbiAgICAgIGludCB4O1xuICAgICAgaW50IHk7XG4gICAgICBpbnQgejtcbiAgICAgIGludCB3O1xuICAgICAgaW50IHU7XG4gICAgfTtcblxuICAgIHN0cnVjdCBpdmVjNlxuICAgIHtcbiAgICAgIGludCB4O1xuICAgICAgaW50IHk7XG4gICAgICBpbnQgejtcbiAgICAgIGludCB3O1xuICAgICAgaW50IHU7XG4gICAgICBpbnQgdjtcbiAgICB9O1xuXG4gICAgdW5pZm9ybSBmbG9hdCBOQU47XG4gICAgJHtnbHNsLmRlZmluZVNwZWNpYWxOYU59XG4gICAgJHtnbHNsLmRlZmluZVNwZWNpYWxJbmZ9XG4gICAgJHtnbHNsLmRlZmluZVJvdW5kfVxuXG4gICAgaW50IGltb2QoaW50IHgsIGludCB5KSB7XG4gICAgICByZXR1cm4geCAtIHkgKiAoeCAvIHkpO1xuICAgIH1cblxuICAgIGludCBpZGl2KGludCBhLCBpbnQgYiwgZmxvYXQgc2lnbikge1xuICAgICAgaW50IHJlcyA9IGEgLyBiO1xuICAgICAgaW50IG1vZCA9IGltb2QoYSwgYik7XG4gICAgICBpZiAoc2lnbiA8IDAuICYmIG1vZCAhPSAwKSB7XG4gICAgICAgIHJlcyAtPSAxO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvL0Jhc2VkIG9uIHRoZSB3b3JrIG9mIERhdmUgSG9za2luc1xuICAgIC8vaHR0cHM6Ly93d3cuc2hhZGVydG95LmNvbS92aWV3LzRkalNSV1xuICAgICNkZWZpbmUgSEFTSFNDQUxFMSA0NDMuODk3NVxuICAgIGZsb2F0IHJhbmRvbShmbG9hdCBzZWVkKXtcbiAgICAgIHZlYzIgcCA9IHJlc3VsdFVWICogc2VlZDtcbiAgICAgIHZlYzMgcDMgID0gZnJhY3QodmVjMyhwLnh5eCkgKiBIQVNIU0NBTEUxKTtcbiAgICAgIHAzICs9IGRvdChwMywgcDMueXp4ICsgMTkuMTkpO1xuICAgICAgcmV0dXJuIGZyYWN0KChwMy54ICsgcDMueSkgKiBwMy56KTtcbiAgICB9XG5cbiAgICAke1NBTVBMRV8xRF9TTklQUEVUfVxuICAgICR7U0FNUExFXzJEX1NOSVBQRVR9XG4gICAgJHtTQU1QTEVfM0RfU05JUFBFVH1cbiAgYDtcblxuICByZXR1cm4gU0hBREVSX1BSRUZJWDtcbn1cblxuY29uc3QgU0FNUExFXzFEX1NOSVBQRVQgPSBgXG52ZWMyIHV2RnJvbUZsYXQoaW50IHRleE51bVIsIGludCB0ZXhOdW1DLCBpbnQgaW5kZXgpIHtcbiAgaW50IHRleFIgPSBpbmRleCAvIHRleE51bUM7XG4gIGludCB0ZXhDID0gaW5kZXggLSB0ZXhSICogdGV4TnVtQztcbiAgcmV0dXJuICh2ZWMyKHRleEMsIHRleFIpICsgaGFsZkNSKSAvIHZlYzIodGV4TnVtQywgdGV4TnVtUik7XG59XG52ZWMyIHBhY2tlZFVWZnJvbTFEKGludCB0ZXhOdW1SLCBpbnQgdGV4TnVtQywgaW50IGluZGV4KSB7XG4gIGludCB0ZXhlbEluZGV4ID0gaW5kZXggLyAyO1xuICBpbnQgdGV4UiA9IHRleGVsSW5kZXggLyB0ZXhOdW1DO1xuICBpbnQgdGV4QyA9IHRleGVsSW5kZXggLSB0ZXhSICogdGV4TnVtQztcbiAgcmV0dXJuICh2ZWMyKHRleEMsIHRleFIpICsgaGFsZkNSKSAvIHZlYzIodGV4TnVtQywgdGV4TnVtUik7XG59XG5gO1xuXG5jb25zdCBTQU1QTEVfMkRfU05JUFBFVCA9IGBcbnZlYzIgcGFja2VkVVZmcm9tMkQoaW50IHRleGVsc0luTG9naWNhbFJvdywgaW50IHRleE51bVIsXG4gIGludCB0ZXhOdW1DLCBpbnQgcm93LCBpbnQgY29sKSB7XG4gIGludCB0ZXhlbEluZGV4ID0gKHJvdyAvIDIpICogdGV4ZWxzSW5Mb2dpY2FsUm93ICsgKGNvbCAvIDIpO1xuICBpbnQgdGV4UiA9IHRleGVsSW5kZXggLyB0ZXhOdW1DO1xuICBpbnQgdGV4QyA9IHRleGVsSW5kZXggLSB0ZXhSICogdGV4TnVtQztcbiAgcmV0dXJuICh2ZWMyKHRleEMsIHRleFIpICsgaGFsZkNSKSAvIHZlYzIodGV4TnVtQywgdGV4TnVtUik7XG59XG5gO1xuXG5jb25zdCBTQU1QTEVfM0RfU05JUFBFVCA9IGBcbnZlYzIgcGFja2VkVVZmcm9tM0QoaW50IHRleE51bVIsIGludCB0ZXhOdW1DLFxuICAgIGludCB0ZXhlbHNJbkJhdGNoLCBpbnQgdGV4ZWxzSW5Mb2dpY2FsUm93LCBpbnQgYixcbiAgICBpbnQgcm93LCBpbnQgY29sKSB7XG4gIGludCBpbmRleCA9IGIgKiB0ZXhlbHNJbkJhdGNoICsgKHJvdyAvIDIpICogdGV4ZWxzSW5Mb2dpY2FsUm93ICsgKGNvbCAvIDIpO1xuICBpbnQgdGV4UiA9IGluZGV4IC8gdGV4TnVtQztcbiAgaW50IHRleEMgPSBpbmRleCAtIHRleFIgKiB0ZXhOdW1DO1xuICByZXR1cm4gKHZlYzIodGV4QywgdGV4UikgKyBoYWxmQ1IpIC8gdmVjMih0ZXhOdW1DLCB0ZXhOdW1SKTtcbn1cbmA7XG5cbmNvbnN0IFNIQURFUl9QQUNLRURfUFJFRklYID0gYFxuICBmbG9hdCBnZXRDaGFubmVsKHZlYzQgZnJhZywgdmVjMiBpbm5lckRpbXMpIHtcbiAgICB2ZWMyIG1vZENvb3JkID0gbW9kKGlubmVyRGltcywgMi4pO1xuICAgIHJldHVybiBtb2RDb29yZC54ID09IDAuID9cbiAgICAgIChtb2RDb29yZC55ID09IDAuID8gZnJhZy5yIDogZnJhZy5nKSA6XG4gICAgICAobW9kQ29vcmQueSA9PSAwLiA/IGZyYWcuYiA6IGZyYWcuYSk7XG4gIH1cbiAgZmxvYXQgZ2V0Q2hhbm5lbCh2ZWM0IGZyYWcsIGludCBkaW0pIHtcbiAgICBmbG9hdCBtb2RDb29yZCA9IG1vZChmbG9hdChkaW0pLCAyLik7XG4gICAgcmV0dXJuIG1vZENvb3JkID09IDAuID8gZnJhZy5yIDogZnJhZy5nO1xuICB9XG5gO1xuXG5mdW5jdGlvbiBnZXRPdXRwdXRTY2FsYXJDb29yZHMoKSB7XG4gIHJldHVybiBgXG4gICAgaW50IGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgYDtcbn1cblxuZnVuY3Rpb24gZ2V0T3V0cHV0UGFja2VkMURDb29yZHMoXG4gICAgc2hhcGU6IFtudW1iZXJdLCB0ZXhTaGFwZTogW251bWJlciwgbnVtYmVyXSxcbiAgICBlbmFibGVTaGFwZVVuaWZvcm1zOiBib29sZWFuKTogc3RyaW5nIHtcbiAgY29uc3QgcGFja2VkVGV4U2hhcGUgPVxuICAgICAgW01hdGguY2VpbCh0ZXhTaGFwZVswXSAvIDIpLCBNYXRoLmNlaWwodGV4U2hhcGVbMV0gLyAyKV07XG4gIGlmIChwYWNrZWRUZXhTaGFwZVswXSA9PT0gMSkge1xuICAgIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgICByZXR1cm4gYFxuICAgICAgaW50IGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgICAgcmV0dXJuIDIgKiBpbnQocmVzdWx0VVYueCAqIGNlaWwoZmxvYXQob3V0VGV4U2hhcGVbMV0pIC8gMi4wKSk7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG5cbiAgICByZXR1cm4gYFxuICAgICAgaW50IGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgICAgcmV0dXJuIDIgKiBpbnQocmVzdWx0VVYueCAqICR7cGFja2VkVGV4U2hhcGVbMV19LjApO1xuICAgICAgfVxuICAgIGA7XG4gIH1cblxuICBpZiAocGFja2VkVGV4U2hhcGVbMV0gPT09IDEpIHtcbiAgICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgICAgcmV0dXJuIGBcbiAgICAgIGludCBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICAgIHJldHVybiAyICogaW50KHJlc3VsdFVWLnkgKiBjZWlsKGZsb2F0KG91dFRleFNoYXBlWzBdKSAvIDIuMCkpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGBcbiAgICAgIGludCBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICAgIHJldHVybiAyICogaW50KHJlc3VsdFVWLnkgKiAke3BhY2tlZFRleFNoYXBlWzBdfS4wKTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG5cbiAgaWYgKGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICByZXR1cm4gYFxuICAgIGludCBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICBpdmVjMiBwYWNrZWRUZXhTaGFwZSA9IGl2ZWMyKGNlaWwoZmxvYXQob3V0VGV4U2hhcGVbMF0pIC8gMi4wKSwgY2VpbChmbG9hdChvdXRUZXhTaGFwZVsxXSkgLyAyLjApKTtcbiAgICAgIGl2ZWMyIHJlc1RleFJDID0gaXZlYzIocmVzdWx0VVYueXggKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMyKHBhY2tlZFRleFNoYXBlWzBdLCBwYWNrZWRUZXhTaGFwZVsxXSkpO1xuICAgICAgcmV0dXJuIDIgKiAocmVzVGV4UkMueCAqIHBhY2tlZFRleFNoYXBlWzFdICsgcmVzVGV4UkMueSk7XG4gICAgfVxuICBgO1xuICB9XG5cbiAgcmV0dXJuIGBcbiAgICBpbnQgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgaXZlYzIgcmVzVGV4UkMgPSBpdmVjMihyZXN1bHRVVi55eCAqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzIoJHtwYWNrZWRUZXhTaGFwZVswXX0sICR7cGFja2VkVGV4U2hhcGVbMV19KSk7XG4gICAgICByZXR1cm4gMiAqIChyZXNUZXhSQy54ICogJHtwYWNrZWRUZXhTaGFwZVsxXX0gKyByZXNUZXhSQy55KTtcbiAgICB9XG4gIGA7XG59XG5cbmZ1bmN0aW9uIGdldE91dHB1dDFEQ29vcmRzKFxuICAgIHNoYXBlOiBbbnVtYmVyXSwgdGV4U2hhcGU6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgZW5hYmxlU2hhcGVVbmlmb3JtczogYm9vbGVhbik6IHN0cmluZyB7XG4gIGlmICh0ZXhTaGFwZVswXSA9PT0gMSkge1xuICAgIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgICByZXR1cm4gYFxuICAgICAgaW50IGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgICAgcmV0dXJuIGludChyZXN1bHRVVi54ICogZmxvYXQob3V0VGV4U2hhcGVbMV0pKTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbiAgICByZXR1cm4gYFxuICAgICAgaW50IGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgICAgcmV0dXJuIGludChyZXN1bHRVVi54ICogJHt0ZXhTaGFwZVsxXX0uMCk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxuICBpZiAodGV4U2hhcGVbMV0gPT09IDEpIHtcbiAgICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgICAgcmV0dXJuIGBcbiAgICAgIGludCBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICAgIHJldHVybiBpbnQocmVzdWx0VVYueSAqIGZsb2F0KG91dFRleFNoYXBlWzBdKSk7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG4gICAgcmV0dXJuIGBcbiAgICAgIGludCBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICAgIHJldHVybiBpbnQocmVzdWx0VVYueSAqICR7dGV4U2hhcGVbMF19LjApO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbiAgaWYgKGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICByZXR1cm4gYFxuICAgIGludCBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMihvdXRUZXhTaGFwZVswXSwgb3V0VGV4U2hhcGVbMV0pKTtcbiAgICAgIHJldHVybiByZXNUZXhSQy54ICogb3V0VGV4U2hhcGVbMV0gKyByZXNUZXhSQy55O1xuICAgIH1cbiAgYDtcbiAgfVxuICByZXR1cm4gYFxuICAgIGludCBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMigke3RleFNoYXBlWzBdfSwgJHt0ZXhTaGFwZVsxXX0pKTtcbiAgICAgIHJldHVybiByZXNUZXhSQy54ICogJHt0ZXhTaGFwZVsxXX0gKyByZXNUZXhSQy55O1xuICAgIH1cbiAgYDtcbn1cblxuZnVuY3Rpb24gZ2V0T3V0cHV0UGFja2VkM0RDb29yZHMoXG4gICAgc2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgdGV4U2hhcGU6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgZW5hYmxlU2hhcGVVbmlmb3JtczogYm9vbGVhbik6IHN0cmluZyB7XG4gIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgcmV0dXJuIGBcbiAgICBpdmVjMyBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICBpdmVjMiBwYWNrZWRUZXhTaGFwZSA9IGl2ZWMyKGNlaWwoZmxvYXQob3V0VGV4U2hhcGVbMF0pIC8gMi4wKSwgY2VpbChmbG9hdChvdXRUZXhTaGFwZVsxXSkgLyAyLjApKTtcbiAgICAgIGludCB0ZXhlbHNJbkxvZ2ljYWxSb3cgPSBpbnQoY2VpbChmbG9hdChvdXRTaGFwZVsyXSkgLyAyLjApKTtcbiAgICAgIGludCB0ZXhlbHNJbkJhdGNoID0gdGV4ZWxzSW5Mb2dpY2FsUm93ICogaW50KGNlaWwoZmxvYXQob3V0U2hhcGVbMV0pIC8gMi4wKSk7XG4gICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMihwYWNrZWRUZXhTaGFwZVswXSwgcGFja2VkVGV4U2hhcGVbMV0pKTtcbiAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnggKiBwYWNrZWRUZXhTaGFwZVsxXSArIHJlc1RleFJDLnk7XG5cbiAgICAgIGludCBiID0gaW5kZXggLyB0ZXhlbHNJbkJhdGNoO1xuICAgICAgaW5kZXggLT0gYiAqIHRleGVsc0luQmF0Y2g7XG5cbiAgICAgIGludCByID0gMiAqIChpbmRleCAvIHRleGVsc0luTG9naWNhbFJvdyk7XG4gICAgICBpbnQgYyA9IGltb2QoaW5kZXgsIHRleGVsc0luTG9naWNhbFJvdykgKiAyO1xuXG4gICAgICByZXR1cm4gaXZlYzMoYiwgciwgYyk7XG4gICAgfVxuICBgO1xuICB9XG5cbiAgY29uc3QgcGFja2VkVGV4U2hhcGUgPVxuICAgICAgW01hdGguY2VpbCh0ZXhTaGFwZVswXSAvIDIpLCBNYXRoLmNlaWwodGV4U2hhcGVbMV0gLyAyKV07XG4gIGNvbnN0IHRleGVsc0luTG9naWNhbFJvdyA9IE1hdGguY2VpbChzaGFwZVsyXSAvIDIpO1xuICBjb25zdCB0ZXhlbHNJbkJhdGNoID0gdGV4ZWxzSW5Mb2dpY2FsUm93ICogTWF0aC5jZWlsKHNoYXBlWzFdIC8gMik7XG5cbiAgcmV0dXJuIGBcbiAgICBpdmVjMyBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMigke3BhY2tlZFRleFNoYXBlWzBdfSwgJHtwYWNrZWRUZXhTaGFwZVsxXX0pKTtcbiAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnggKiAke3BhY2tlZFRleFNoYXBlWzFdfSArIHJlc1RleFJDLnk7XG5cbiAgICAgIGludCBiID0gaW5kZXggLyAke3RleGVsc0luQmF0Y2h9O1xuICAgICAgaW5kZXggLT0gYiAqICR7dGV4ZWxzSW5CYXRjaH07XG5cbiAgICAgIGludCByID0gMiAqIChpbmRleCAvICR7dGV4ZWxzSW5Mb2dpY2FsUm93fSk7XG4gICAgICBpbnQgYyA9IGltb2QoaW5kZXgsICR7dGV4ZWxzSW5Mb2dpY2FsUm93fSkgKiAyO1xuXG4gICAgICByZXR1cm4gaXZlYzMoYiwgciwgYyk7XG4gICAgfVxuICBgO1xufVxuXG5mdW5jdGlvbiBnZXRPdXRwdXQzRENvb3JkcyhcbiAgICBzaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdLCB0ZXhTaGFwZTogW251bWJlciwgbnVtYmVyXSxcbiAgICBlbmFibGVTaGFwZVVuaWZvcm1zOiBib29sZWFuKTogc3RyaW5nIHtcbiAgaWYgKGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICBjb25zdCBjb29yZHNGcm9tSW5kZXhTbmlwcGV0ID1cbiAgICAgICAgc2hhZGVyX3V0aWwuZ2V0T3V0cHV0TG9naWNhbENvb3JkaW5hdGVzRnJvbUZsYXRJbmRleEJ5VW5pZm9ybShcbiAgICAgICAgICAgIFsncicsICdjJywgJ2QnXSwgc2hhcGUpO1xuXG4gICAgcmV0dXJuIGBcbiAgaXZlYzMgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgIGl2ZWMyIHJlc1RleFJDID0gaXZlYzIocmVzdWx0VVYueXggKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMihvdXRUZXhTaGFwZVswXSwgb3V0VGV4U2hhcGVbMV0pKTtcbiAgICBpbnQgaW5kZXggPSByZXNUZXhSQy54ICogb3V0VGV4U2hhcGVbMV0gKyByZXNUZXhSQy55O1xuICAgICR7Y29vcmRzRnJvbUluZGV4U25pcHBldH1cbiAgICByZXR1cm4gaXZlYzMociwgYywgZCk7XG4gIH1cbmA7XG4gIH1cbiAgY29uc3QgY29vcmRzRnJvbUluZGV4U25pcHBldCA9XG4gICAgICBzaGFkZXJfdXRpbC5nZXRMb2dpY2FsQ29vcmRpbmF0ZXNGcm9tRmxhdEluZGV4KFsncicsICdjJywgJ2QnXSwgc2hhcGUpO1xuXG4gIHJldHVybiBgXG4gICAgaXZlYzMgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgaXZlYzIgcmVzVGV4UkMgPSBpdmVjMihyZXN1bHRVVi55eCAqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzIoJHt0ZXhTaGFwZVswXX0sICR7dGV4U2hhcGVbMV19KSk7XG4gICAgICBpbnQgaW5kZXggPSByZXNUZXhSQy54ICogJHt0ZXhTaGFwZVsxXX0gKyByZXNUZXhSQy55O1xuICAgICAgJHtjb29yZHNGcm9tSW5kZXhTbmlwcGV0fVxuICAgICAgcmV0dXJuIGl2ZWMzKHIsIGMsIGQpO1xuICAgIH1cbiAgYDtcbn1cblxuZnVuY3Rpb24gZ2V0T3V0cHV0UGFja2VkTkRDb29yZHMoXG4gICAgc2hhcGU6IG51bWJlcltdLCB0ZXhTaGFwZTogW251bWJlciwgbnVtYmVyXSxcbiAgICBlbmFibGVTaGFwZVVuaWZvcm1zOiBib29sZWFuKTogc3RyaW5nIHtcbiAgaWYgKGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICAvLyBUT0RPOiBzdXBwb3J0IDVkIGFuZCA2ZFxuICAgIHJldHVybiBgXG4gICAgaXZlYzQgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgaXZlYzIgcGFja2VkVGV4U2hhcGUgPSBpdmVjMihjZWlsKGZsb2F0KG91dFRleFNoYXBlWzBdKSAvIDIuMCksIGNlaWwoZmxvYXQob3V0VGV4U2hhcGVbMV0pIC8gMi4wKSk7XG4gICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMihwYWNrZWRUZXhTaGFwZVswXSwgcGFja2VkVGV4U2hhcGVbMV0pKTtcbiAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnggKiBwYWNrZWRUZXhTaGFwZVsxXSArIHJlc1RleFJDLnk7XG5cbiAgICAgIGludCB0ZXhlbHNJbkxvZ2ljYWxSb3cgPSBpbnQoY2VpbChmbG9hdChvdXRTaGFwZVszXSkgLyAyLjApKTtcbiAgICAgIGludCB0ZXhlbHNJbkJhdGNoID0gdGV4ZWxzSW5Mb2dpY2FsUm93ICogaW50KGNlaWwoZmxvYXQob3V0U2hhcGVbMl0pIC8gMi4wKSk7XG4gICAgICBpbnQgdGV4ZWxzSW5CYXRjaE4gPSB0ZXhlbHNJbkJhdGNoICogb3V0U2hhcGVbMV07XG5cbiAgICAgIGludCBiMiA9IGluZGV4IC8gdGV4ZWxzSW5CYXRjaE47XG4gICAgICBpbmRleCAtPSBiMiAqIHRleGVsc0luQmF0Y2hOO1xuXG4gICAgICBpbnQgYiA9IGluZGV4IC8gdGV4ZWxzSW5CYXRjaDtcbiAgICAgIGluZGV4IC09IGIgKiB0ZXhlbHNJbkJhdGNoO1xuXG4gICAgICBpbnQgciA9IDIgKiAoaW5kZXggLyB0ZXhlbHNJbkxvZ2ljYWxSb3cpO1xuICAgICAgaW50IGMgPSBpbW9kKGluZGV4LCB0ZXhlbHNJbkxvZ2ljYWxSb3cpICogMjtcblxuICAgICAgcmV0dXJuIGl2ZWM0KGIyLCBiLCByLCBjKTtcbiAgICB9XG4gIGA7XG4gIH1cbiAgY29uc3QgcGFja2VkVGV4U2hhcGUgPVxuICAgICAgW01hdGguY2VpbCh0ZXhTaGFwZVswXSAvIDIpLCBNYXRoLmNlaWwodGV4U2hhcGVbMV0gLyAyKV07XG5cbiAgY29uc3QgdGV4ZWxzSW5Mb2dpY2FsUm93ID0gTWF0aC5jZWlsKHNoYXBlW3NoYXBlLmxlbmd0aCAtIDFdIC8gMik7XG4gIGNvbnN0IHRleGVsc0luQmF0Y2ggPVxuICAgICAgdGV4ZWxzSW5Mb2dpY2FsUm93ICogTWF0aC5jZWlsKHNoYXBlW3NoYXBlLmxlbmd0aCAtIDJdIC8gMik7XG4gIGxldCB0ZXhlbHNJbkJhdGNoTiA9IHRleGVsc0luQmF0Y2g7XG4gIGxldCBiYXRjaGVzID0gYGA7XG4gIGxldCBjb29yZHMgPSAnYiwgciwgYyc7XG5cbiAgZm9yIChsZXQgYiA9IDI7IGIgPCBzaGFwZS5sZW5ndGggLSAxOyBiKyspIHtcbiAgICB0ZXhlbHNJbkJhdGNoTiAqPSBzaGFwZVtzaGFwZS5sZW5ndGggLSBiIC0gMV07XG4gICAgYmF0Y2hlcyA9IGBcbiAgICAgIGludCBiJHtifSA9IGluZGV4IC8gJHt0ZXhlbHNJbkJhdGNoTn07XG4gICAgICBpbmRleCAtPSBiJHtifSAqICR7dGV4ZWxzSW5CYXRjaE59O1xuICAgIGAgKyBiYXRjaGVzO1xuICAgIGNvb3JkcyA9IGBiJHtifSwgYCArIGNvb3JkcztcbiAgfVxuXG4gIHJldHVybiBgXG4gICAgaXZlYyR7c2hhcGUubGVuZ3RofSBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMigke3BhY2tlZFRleFNoYXBlWzBdfSwgJHtwYWNrZWRUZXhTaGFwZVsxXX0pKTtcbiAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnggKiAke3BhY2tlZFRleFNoYXBlWzFdfSArIHJlc1RleFJDLnk7XG5cbiAgICAgICR7YmF0Y2hlc31cblxuICAgICAgaW50IGIgPSBpbmRleCAvICR7dGV4ZWxzSW5CYXRjaH07XG4gICAgICBpbmRleCAtPSBiICogJHt0ZXhlbHNJbkJhdGNofTtcblxuICAgICAgaW50IHIgPSAyICogKGluZGV4IC8gJHt0ZXhlbHNJbkxvZ2ljYWxSb3d9KTtcbiAgICAgIGludCBjID0gaW1vZChpbmRleCwgJHt0ZXhlbHNJbkxvZ2ljYWxSb3d9KSAqIDI7XG5cbiAgICAgIHJldHVybiBpdmVjJHtzaGFwZS5sZW5ndGh9KCR7Y29vcmRzfSk7XG4gICAgfVxuICBgO1xufVxuXG5mdW5jdGlvbiBnZXRPdXRwdXQ0RENvb3JkcyhcbiAgICBzaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIHRleFNoYXBlOiBbbnVtYmVyLCBudW1iZXJdLFxuICAgIGVuYWJsZVNoYXBlVW5pZm9ybXM6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgIGNvbnN0IGNvb3Jkc0Zyb21JbmRleFNuaXBwZXQgPVxuICAgICAgICBzaGFkZXJfdXRpbC5nZXRPdXRwdXRMb2dpY2FsQ29vcmRpbmF0ZXNGcm9tRmxhdEluZGV4QnlVbmlmb3JtKFxuICAgICAgICAgICAgWydyJywgJ2MnLCAnZCcsICdkMiddLCBzaGFwZSk7XG5cbiAgICByZXR1cm4gYFxuICAgIGl2ZWM0IGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgIGl2ZWMyIHJlc1RleFJDID0gaXZlYzIocmVzdWx0VVYueXggKlxuICAgICAgICB2ZWMyKG91dFRleFNoYXBlWzBdLCBvdXRUZXhTaGFwZVsxXSkpO1xuICAgICAgaW50IGluZGV4ID0gcmVzVGV4UkMueCAqIG91dFRleFNoYXBlWzFdICsgcmVzVGV4UkMueTtcbiAgICAgICR7Y29vcmRzRnJvbUluZGV4U25pcHBldH1cbiAgICAgIHJldHVybiBpdmVjNChyLCBjLCBkLCBkMik7XG4gICAgfVxuICBgO1xuICB9XG4gIGNvbnN0IGNvb3Jkc0Zyb21JbmRleFNuaXBwZXQgPSBzaGFkZXJfdXRpbC5nZXRMb2dpY2FsQ29vcmRpbmF0ZXNGcm9tRmxhdEluZGV4KFxuICAgICAgWydyJywgJ2MnLCAnZCcsICdkMiddLCBzaGFwZSk7XG5cbiAgcmV0dXJuIGBcbiAgICBpdmVjNCBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgdmVjMigke3RleFNoYXBlWzBdfSwgJHt0ZXhTaGFwZVsxXX0pKTtcbiAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnggKiAke3RleFNoYXBlWzFdfSArIHJlc1RleFJDLnk7XG4gICAgICAke2Nvb3Jkc0Zyb21JbmRleFNuaXBwZXR9XG4gICAgICByZXR1cm4gaXZlYzQociwgYywgZCwgZDIpO1xuICAgIH1cbiAgYDtcbn1cblxuZnVuY3Rpb24gZ2V0T3V0cHV0NURDb29yZHMoXG4gICAgc2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgdGV4U2hhcGU6IFtudW1iZXIsIG51bWJlcl0pOiBzdHJpbmcge1xuICBjb25zdCBjb29yZHNGcm9tSW5kZXhTbmlwcGV0ID0gc2hhZGVyX3V0aWwuZ2V0TG9naWNhbENvb3JkaW5hdGVzRnJvbUZsYXRJbmRleChcbiAgICAgIFsncicsICdjJywgJ2QnLCAnZDInLCAnZDMnXSwgc2hhcGUpO1xuXG4gIHJldHVybiBgXG4gICAgaXZlYzUgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgaXZlYzIgcmVzVGV4UkMgPSBpdmVjMihyZXN1bHRVVi55eCAqIHZlYzIoJHt0ZXhTaGFwZVswXX0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7dGV4U2hhcGVbMV19KSk7XG5cbiAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnggKiAke3RleFNoYXBlWzFdfSArIHJlc1RleFJDLnk7XG5cbiAgICAgICR7Y29vcmRzRnJvbUluZGV4U25pcHBldH1cblxuICAgICAgaXZlYzUgb3V0U2hhcGUgPSBpdmVjNShyLCBjLCBkLCBkMiwgZDMpO1xuICAgICAgcmV0dXJuIG91dFNoYXBlO1xuICAgIH1cbiAgYDtcbn1cblxuZnVuY3Rpb24gZ2V0T3V0cHV0NkRDb29yZHMoXG4gICAgc2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICB0ZXhTaGFwZTogW251bWJlciwgbnVtYmVyXSk6IHN0cmluZyB7XG4gIGNvbnN0IGNvb3Jkc0Zyb21JbmRleFNuaXBwZXQgPSBzaGFkZXJfdXRpbC5nZXRMb2dpY2FsQ29vcmRpbmF0ZXNGcm9tRmxhdEluZGV4KFxuICAgICAgWydyJywgJ2MnLCAnZCcsICdkMicsICdkMycsICdkNCddLCBzaGFwZSk7XG5cbiAgcmV0dXJuIGBcbiAgICBpdmVjNiBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgdmVjMigke3RleFNoYXBlWzBdfSwgJHt0ZXhTaGFwZVsxXX0pKTtcbiAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnggKiAke3RleFNoYXBlWzFdfSArIHJlc1RleFJDLnk7XG5cbiAgICAgICR7Y29vcmRzRnJvbUluZGV4U25pcHBldH1cblxuICAgICAgaXZlYzYgcmVzdWx0ID0gaXZlYzYociwgYywgZCwgZDIsIGQzLCBkNCk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgYDtcbn1cblxuZnVuY3Rpb24gZ2V0T3V0cHV0UGFja2VkMkRDb29yZHMoXG4gICAgc2hhcGU6IFtudW1iZXIsIG51bWJlcl0sIHRleFNoYXBlOiBbbnVtYmVyLCBudW1iZXJdLFxuICAgIGVuYWJsZVNoYXBlVW5pZm9ybXM6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBjb25zdCBwYWNrZWRUZXhTaGFwZSA9XG4gICAgICBbTWF0aC5jZWlsKHRleFNoYXBlWzBdIC8gMiksIE1hdGguY2VpbCh0ZXhTaGFwZVsxXSAvIDIpXTtcbiAgaWYgKHV0aWwuYXJyYXlzRXF1YWwoc2hhcGUsIHRleFNoYXBlKSkge1xuICAgIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgICByZXR1cm4gYFxuICAgICAgaXZlYzIgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgICBpdmVjMiBwYWNrZWRUZXhTaGFwZSA9IGl2ZWMyKGNlaWwoZmxvYXQob3V0VGV4U2hhcGVbMF0pIC8gMi4wKSwgY2VpbChmbG9hdChvdXRUZXhTaGFwZVsxXSkgLyAyLjApKTtcbiAgICAgICAgcmV0dXJuIDIgKiBpdmVjMihyZXN1bHRVVi55eCAqIHZlYzIocGFja2VkVGV4U2hhcGVbMF0sIHBhY2tlZFRleFNoYXBlWzFdKSk7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG5cbiAgICByZXR1cm4gYFxuICAgICAgaXZlYzIgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgICByZXR1cm4gMiAqIGl2ZWMyKHJlc3VsdFVWLnl4ICogdmVjMigke3BhY2tlZFRleFNoYXBlWzBdfSwgJHtcbiAgICAgICAgcGFja2VkVGV4U2hhcGVbMV19KSk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxuXG4gIC8vIHRleGVscyBuZWVkZWQgdG8gYWNjb21tb2RhdGUgYSBsb2dpY2FsIHJvd1xuICBjb25zdCB0ZXhlbHNJbkxvZ2ljYWxSb3cgPSBNYXRoLmNlaWwoc2hhcGVbMV0gLyAyKTtcblxuICAvKipcbiAgICogZ2V0T3V0cHV0Q29vcmRzXG4gICAqXG4gICAqIHJlc1RleFJDOiBUaGUgcm93cyBhbmQgY29sdW1ucyBvZiB0aGUgdGV4ZWxzLiBJZiB5b3UgbW92ZSBvdmVyIG9uZVxuICAgKiB0ZXhlbCB0byB0aGUgcmlnaHQgaW4gdGhlIHBhY2tlZCB0ZXh0dXJlLCB5b3UgYXJlIG1vdmluZyBvdmVyIG9uZSBjb2x1bW5cbiAgICogKG5vdCB0d28pLlxuICAgKlxuICAgKiBpbmRleDogVGhlIHRleGVsIGluZGV4XG4gICAqL1xuICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgIHJldHVybiBgXG4gICAgaXZlYzIgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgaXZlYzIgcGFja2VkVGV4U2hhcGUgPSBpdmVjMihjZWlsKGZsb2F0KG91dFRleFNoYXBlWzBdKSAvIDIuMCksIGNlaWwoZmxvYXQob3V0VGV4U2hhcGVbMV0pIC8gMi4wKSk7XG4gICAgICBpbnQgdGV4ZWxzSW5Mb2dpY2FsUm93ID0gaW50KGNlaWwoZmxvYXQob3V0U2hhcGVbMV0pIC8gMi4wKSk7XG4gICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMihwYWNrZWRUZXhTaGFwZVswXSwgcGFja2VkVGV4U2hhcGVbMV0pKTtcblxuICAgICAgaW50IGluZGV4ID0gcmVzVGV4UkMueCAqIHBhY2tlZFRleFNoYXBlWzFdICsgcmVzVGV4UkMueTtcbiAgICAgIGludCByID0gMiAqIChpbmRleCAvIHRleGVsc0luTG9naWNhbFJvdyk7XG4gICAgICBpbnQgYyA9IGltb2QoaW5kZXgsIHRleGVsc0luTG9naWNhbFJvdykgKiAyO1xuXG4gICAgICByZXR1cm4gaXZlYzIociwgYyk7XG4gICAgfVxuICBgO1xuICB9XG5cbiAgcmV0dXJuIGBcbiAgICBpdmVjMiBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMigke3BhY2tlZFRleFNoYXBlWzBdfSwgJHtwYWNrZWRUZXhTaGFwZVsxXX0pKTtcblxuICAgICAgaW50IGluZGV4ID0gcmVzVGV4UkMueCAqICR7cGFja2VkVGV4U2hhcGVbMV19ICsgcmVzVGV4UkMueTtcbiAgICAgIGludCByID0gMiAqIChpbmRleCAvICR7dGV4ZWxzSW5Mb2dpY2FsUm93fSk7XG4gICAgICBpbnQgYyA9IGltb2QoaW5kZXgsICR7dGV4ZWxzSW5Mb2dpY2FsUm93fSkgKiAyO1xuXG4gICAgICByZXR1cm4gaXZlYzIociwgYyk7XG4gICAgfVxuICBgO1xufVxuXG5mdW5jdGlvbiBnZXRPdXRwdXQyRENvb3JkcyhcbiAgICBzaGFwZTogW251bWJlciwgbnVtYmVyXSwgdGV4U2hhcGU6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgZW5hYmxlU2hhcGVVbmlmb3JtczogYm9vbGVhbik6IHN0cmluZyB7XG4gIGlmICh1dGlsLmFycmF5c0VxdWFsKHNoYXBlLCB0ZXhTaGFwZSkpIHtcbiAgICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgICAgcmV0dXJuIGBcbiAgICAgIGl2ZWMyIGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgICAgcmV0dXJuIGl2ZWMyKHJlc3VsdFVWLnl4ICogdmVjMihvdXRUZXhTaGFwZVswXSwgb3V0VGV4U2hhcGVbMV0pKTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbiAgICByZXR1cm4gYFxuICAgICAgaXZlYzIgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgICByZXR1cm4gaXZlYzIocmVzdWx0VVYueXggKiB2ZWMyKCR7dGV4U2hhcGVbMF19LCAke3RleFNoYXBlWzFdfSkpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbiAgaWYgKHNoYXBlWzFdID09PSAxKSB7XG4gICAgaWYgKGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICAgIHJldHVybiBgXG4gICAgICBpdmVjMiBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICAgIGl2ZWMyIHJlc1RleFJDID0gaXZlYzIocmVzdWx0VVYueXggKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzIob3V0VGV4U2hhcGVbMF0sIG91dFRleFNoYXBlWzFdKSk7XG4gICAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnggKiBvdXRUZXhTaGFwZVsxXSArIHJlc1RleFJDLnk7XG4gICAgICAgIHJldHVybiBpdmVjMihpbmRleCwgMCk7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG4gICAgcmV0dXJuIGBcbiAgICAgIGl2ZWMyIGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgICAgaXZlYzIgcmVzVGV4UkMgPSBpdmVjMihyZXN1bHRVVi55eCAqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMigke3RleFNoYXBlWzBdfSwgJHt0ZXhTaGFwZVsxXX0pKTtcbiAgICAgICAgaW50IGluZGV4ID0gcmVzVGV4UkMueCAqICR7dGV4U2hhcGVbMV19ICsgcmVzVGV4UkMueTtcbiAgICAgICAgcmV0dXJuIGl2ZWMyKGluZGV4LCAwKTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG4gIGlmIChzaGFwZVswXSA9PT0gMSkge1xuICAgIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgICByZXR1cm4gYFxuICAgICAgaXZlYzIgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMyKG91dFRleFNoYXBlWzBdLCBvdXRUZXhTaGFwZVsxXSkpO1xuICAgICAgICBpbnQgaW5kZXggPSByZXNUZXhSQy54ICogb3V0VGV4U2hhcGVbMV0gKyByZXNUZXhSQy55O1xuICAgICAgICByZXR1cm4gaXZlYzIoMCwgaW5kZXgpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxuICAgIHJldHVybiBgXG4gICAgICBpdmVjMiBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICAgIGl2ZWMyIHJlc1RleFJDID0gaXZlYzIocmVzdWx0VVYueXggKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzIoJHt0ZXhTaGFwZVswXX0sICR7dGV4U2hhcGVbMV19KSk7XG4gICAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnggKiAke3RleFNoYXBlWzFdfSArIHJlc1RleFJDLnk7XG4gICAgICAgIHJldHVybiBpdmVjMigwLCBpbmRleCk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxuICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgIHJldHVybiBgXG4gICAgaXZlYzIgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgaXZlYzIgcmVzVGV4UkMgPSBpdmVjMihyZXN1bHRVVi55eCAqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzIob3V0VGV4U2hhcGVbMF0sIG91dFRleFNoYXBlWzFdKSk7XG4gICAgICBpbnQgaW5kZXggPSByZXNUZXhSQy54ICogb3V0VGV4U2hhcGVbMV0gKyByZXNUZXhSQy55O1xuICAgICAgaW50IHIgPSBpbmRleCAvIG91dFNoYXBlWzFdO1xuICAgICAgaW50IGMgPSBpbmRleCAtIHIgKiBvdXRTaGFwZVsxXTtcbiAgICAgIHJldHVybiBpdmVjMihyLCBjKTtcbiAgICB9XG4gIGA7XG4gIH1cbiAgcmV0dXJuIGBcbiAgICBpdmVjMiBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMigke3RleFNoYXBlWzBdfSwgJHt0ZXhTaGFwZVsxXX0pKTtcbiAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnggKiAke3RleFNoYXBlWzFdfSArIHJlc1RleFJDLnk7XG4gICAgICBpbnQgciA9IGluZGV4IC8gJHtzaGFwZVsxXX07XG4gICAgICBpbnQgYyA9IGluZGV4IC0gciAqICR7c2hhcGVbMV19O1xuICAgICAgcmV0dXJuIGl2ZWMyKHIsIGMpO1xuICAgIH1cbiAgYDtcbn1cblxuZnVuY3Rpb24gZ2V0RmxhdE9mZnNldFVuaWZvcm1OYW1lKHRleE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgb2Zmc2V0JHt0ZXhOYW1lfWA7XG59XG5cbmZ1bmN0aW9uIGdldFBhY2tlZFNhbXBsZXJTY2FsYXIoaW5wdXRJbmZvOiBJbnB1dEluZm8pOiBzdHJpbmcge1xuICBjb25zdCB0ZXhOYW1lID0gaW5wdXRJbmZvLm5hbWU7XG4gIGNvbnN0IGZ1bmNOYW1lID0gJ2dldCcgKyB0ZXhOYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdGV4TmFtZS5zbGljZSgxKTtcbiAgY29uc3QgZ2xzbCA9IGdldEdsc2xEaWZmZXJlbmNlcygpO1xuICByZXR1cm4gYFxuICAgIHZlYzQgJHtmdW5jTmFtZX0oKSB7XG4gICAgICByZXR1cm4gJHtnbHNsLnRleHR1cmUyRH0oJHt0ZXhOYW1lfSwgaGFsZkNSKTtcbiAgICB9XG4gIGA7XG59XG5cbmZ1bmN0aW9uIGdldFNhbXBsZXJTY2FsYXIoXG4gICAgaW5wdXRJbmZvOiBJbnB1dEluZm8sIGVuYWJsZVNoYXBlVW5pZm9ybXM6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBjb25zdCB0ZXhOYW1lID0gaW5wdXRJbmZvLm5hbWU7XG4gIGNvbnN0IGZ1bmNOYW1lID0gJ2dldCcgKyB0ZXhOYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdGV4TmFtZS5zbGljZSgxKTtcbiAgaWYgKGlucHV0SW5mby5zaGFwZUluZm8uaXNVbmlmb3JtKSB7XG4gICAgcmV0dXJuIGBmbG9hdCAke2Z1bmNOYW1lfSgpIHtyZXR1cm4gJHt0ZXhOYW1lfTt9YDtcbiAgfVxuICBjb25zdCBbdGV4TnVtUiwgdGV4TnVtQ10gPSBpbnB1dEluZm8uc2hhcGVJbmZvLnRleFNoYXBlO1xuICBpZiAodGV4TnVtUiA9PT0gMSAmJiB0ZXhOdW1DID09PSAxKSB7XG4gICAgcmV0dXJuIGBcbiAgICAgIGZsb2F0ICR7ZnVuY05hbWV9KCkge1xuICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3RleE5hbWV9LCBoYWxmQ1IpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cblxuICBjb25zdCBvZmZzZXQgPSBnZXRGbGF0T2Zmc2V0VW5pZm9ybU5hbWUodGV4TmFtZSk7XG4gIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgcmV0dXJuIGBcbiAgICBmbG9hdCAke2Z1bmNOYW1lfSgpIHtcbiAgICAgIHZlYzIgdXYgPSB1dkZyb21GbGF0KCR7dGV4TmFtZX1UZXhTaGFwZVswXSwgJHt0ZXhOYW1lfVRleFNoYXBlWzFdLCAke1xuICAgICAgICBvZmZzZXR9KTtcbiAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICB9XG4gIGA7XG4gIH1cblxuICBjb25zdCBbdE51bVIsIHROdW1DXSA9IGlucHV0SW5mby5zaGFwZUluZm8udGV4U2hhcGU7XG4gIHJldHVybiBgXG4gICAgZmxvYXQgJHtmdW5jTmFtZX0oKSB7XG4gICAgICB2ZWMyIHV2ID0gdXZGcm9tRmxhdCgke3ROdW1SfSwgJHt0TnVtQ30sICR7b2Zmc2V0fSk7XG4gICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3RleE5hbWV9LCB1dik7XG4gICAgfVxuICBgO1xufVxuXG5mdW5jdGlvbiBnZXRQYWNrZWRTYW1wbGVyMUQoXG4gICAgaW5wdXRJbmZvOiBJbnB1dEluZm8sIGVuYWJsZVNoYXBlVW5pZm9ybXM6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBjb25zdCB0ZXhOYW1lID0gaW5wdXRJbmZvLm5hbWU7XG4gIGNvbnN0IGZ1bmNOYW1lID0gJ2dldCcgKyB0ZXhOYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdGV4TmFtZS5zbGljZSgxKTtcbiAgY29uc3QgdGV4U2hhcGUgPSBpbnB1dEluZm8uc2hhcGVJbmZvLnRleFNoYXBlO1xuICBjb25zdCBnbHNsID0gZ2V0R2xzbERpZmZlcmVuY2VzKCk7XG4gIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgcmV0dXJuIGBcbiAgICB2ZWM0ICR7ZnVuY05hbWV9KGludCBpbmRleCkge1xuICAgICAgaXZlYzIgcGFja2VkVGV4U2hhcGUgPSBpdmVjMihjZWlsKGZsb2F0KCR7XG4gICAgICAgIHRleE5hbWV9VGV4U2hhcGVbMF0pIC8gMi4wKSwgY2VpbChmbG9hdCgke3RleE5hbWV9VGV4U2hhcGVbMV0pIC8gMi4wKSk7XG4gICAgICB2ZWMyIHV2ID0gcGFja2VkVVZmcm9tMUQoXG4gICAgICAgIHBhY2tlZFRleFNoYXBlWzBdLCBwYWNrZWRUZXhTaGFwZVsxXSwgaW5kZXgpO1xuICAgICAgcmV0dXJuICR7Z2xzbC50ZXh0dXJlMkR9KCR7dGV4TmFtZX0sIHV2KTtcbiAgICB9XG4gIGA7XG4gIH1cbiAgY29uc3QgcGFja2VkVGV4U2hhcGUgPVxuICAgICAgW01hdGguY2VpbCh0ZXhTaGFwZVswXSAvIDIpLCBNYXRoLmNlaWwodGV4U2hhcGVbMV0gLyAyKV07XG4gIHJldHVybiBgXG4gICAgdmVjNCAke2Z1bmNOYW1lfShpbnQgaW5kZXgpIHtcbiAgICAgIHZlYzIgdXYgPSBwYWNrZWRVVmZyb20xRChcbiAgICAgICAgJHtwYWNrZWRUZXhTaGFwZVswXX0sICR7cGFja2VkVGV4U2hhcGVbMV19LCBpbmRleCk7XG4gICAgICByZXR1cm4gJHtnbHNsLnRleHR1cmUyRH0oJHt0ZXhOYW1lfSwgdXYpO1xuICAgIH1cbiAgYDtcbn1cblxuZnVuY3Rpb24gZ2V0U2FtcGxlcjFEKFxuICAgIGlucHV0SW5mbzogSW5wdXRJbmZvLCBlbmFibGVTaGFwZVVuaWZvcm1zOiBib29sZWFuKTogc3RyaW5nIHtcbiAgY29uc3QgdGV4TmFtZSA9IGlucHV0SW5mby5uYW1lO1xuICBjb25zdCBmdW5jTmFtZSA9ICdnZXQnICsgdGV4TmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHRleE5hbWUuc2xpY2UoMSk7XG5cbiAgaWYgKGlucHV0SW5mby5zaGFwZUluZm8uaXNVbmlmb3JtKSB7XG4gICAgLy8gVW5pZm9ybSBhcnJheXMgd2lsbCBiZSBsZXNzIHRoYW4gNjU1MDUgKG5vIHJpc2sgb2YgZmxvYXQxNiBvdmVyZmxvdykuXG4gICAgcmV0dXJuIGBcbiAgICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCBpbmRleCkge1xuICAgICAgICAke2dldFVuaWZvcm1TYW1wbGVyKGlucHV0SW5mbyl9XG4gICAgICB9XG4gICAgYDtcbiAgfVxuXG4gIGNvbnN0IHRleFNoYXBlID0gaW5wdXRJbmZvLnNoYXBlSW5mby50ZXhTaGFwZTtcbiAgY29uc3QgdE51bVIgPSB0ZXhTaGFwZVswXTtcbiAgY29uc3QgdE51bUMgPSB0ZXhTaGFwZVsxXTtcblxuICBpZiAodE51bUMgPT09IDEgJiYgdE51bVIgPT09IDEpIHtcbiAgICByZXR1cm4gYFxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IGluZGV4KSB7XG4gICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIGhhbGZDUik7XG4gICAgICB9XG4gICAgYDtcbiAgfVxuICBjb25zdCBvZmZzZXQgPSBnZXRGbGF0T2Zmc2V0VW5pZm9ybU5hbWUodGV4TmFtZSk7XG4gIGlmICh0TnVtQyA9PT0gMSkge1xuICAgIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgICByZXR1cm4gYFxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IGluZGV4KSB7XG4gICAgICAgIHZlYzIgdXYgPSB2ZWMyKDAuNSwgKGZsb2F0KGluZGV4ICsgJHtvZmZzZXR9KSArIDAuNSkgLyBmbG9hdCgke1xuICAgICAgICAgIHRleE5hbWV9VGV4U2hhcGVbMF0pKTtcbiAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGBcbiAgICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCBpbmRleCkge1xuICAgICAgICB2ZWMyIHV2ID0gdmVjMigwLjUsIChmbG9hdChpbmRleCArICR7b2Zmc2V0fSkgKyAwLjUpIC8gJHt0TnVtUn0uMCk7XG4gICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG4gIGlmICh0TnVtUiA9PT0gMSkge1xuICAgIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgICByZXR1cm4gYFxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IGluZGV4KSB7XG4gICAgICAgIHZlYzIgdXYgPSB2ZWMyKChmbG9hdChpbmRleCArICR7b2Zmc2V0fSkgKyAwLjUpIC8gZmxvYXQoJHtcbiAgICAgICAgICB0ZXhOYW1lfVRleFNoYXBlWzFdKSwgMC41KTtcbiAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGBcbiAgICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCBpbmRleCkge1xuICAgICAgICB2ZWMyIHV2ID0gdmVjMigoZmxvYXQoaW5kZXggKyAke29mZnNldH0pICsgMC41KSAvICR7dE51bUN9LjAsIDAuNSk7XG4gICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG5cbiAgaWYgKGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICByZXR1cm4gYFxuICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCBpbmRleCkge1xuICAgICAgdmVjMiB1diA9IHV2RnJvbUZsYXQoJHt0ZXhOYW1lfVRleFNoYXBlWzBdLCAke1xuICAgICAgICB0ZXhOYW1lfVRleFNoYXBlWzFdLCBpbmRleCArICR7b2Zmc2V0fSk7XG4gICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3RleE5hbWV9LCB1dik7XG4gICAgfVxuICBgO1xuICB9XG5cbiAgcmV0dXJuIGBcbiAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgaW5kZXgpIHtcbiAgICAgIHZlYzIgdXYgPSB1dkZyb21GbGF0KCR7dE51bVJ9LCAke3ROdW1DfSwgaW5kZXggKyAke29mZnNldH0pO1xuICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICAgIH1cbiAgYDtcbn1cblxuZnVuY3Rpb24gZ2V0UGFja2VkU2FtcGxlcjJEKFxuICAgIGlucHV0SW5mbzogSW5wdXRJbmZvLCBlbmFibGVTaGFwZVVuaWZvcm1zOiBib29sZWFuKTogc3RyaW5nIHtcbiAgY29uc3Qgc2hhcGUgPSBpbnB1dEluZm8uc2hhcGVJbmZvLmxvZ2ljYWxTaGFwZTtcbiAgY29uc3QgdGV4TmFtZSA9IGlucHV0SW5mby5uYW1lO1xuICBjb25zdCBmdW5jTmFtZSA9ICdnZXQnICsgdGV4TmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHRleE5hbWUuc2xpY2UoMSk7XG4gIGNvbnN0IHRleFNoYXBlID0gaW5wdXRJbmZvLnNoYXBlSW5mby50ZXhTaGFwZTtcblxuICBjb25zdCB0ZXhOdW1SID0gdGV4U2hhcGVbMF07XG4gIGNvbnN0IHRleE51bUMgPSB0ZXhTaGFwZVsxXTtcbiAgY29uc3QgZ2xzbCA9IGdldEdsc2xEaWZmZXJlbmNlcygpO1xuICBpZiAodGV4U2hhcGUgIT0gbnVsbCAmJiB1dGlsLmFycmF5c0VxdWFsKHNoYXBlLCB0ZXhTaGFwZSkpIHtcbiAgICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgICAgcmV0dXJuIGBcbiAgICAgIHZlYzQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCkge1xuICAgICAgICB2ZWMyIHV2ID0gKHZlYzIoY29sLCByb3cpICsgaGFsZkNSKSAvIHZlYzIoJHt0ZXhOYW1lfVRleFNoYXBlWzFdLCAke1xuICAgICAgICAgIHRleE5hbWV9VGV4U2hhcGVbMF0pO1xuXG4gICAgICAgIHJldHVybiAke2dsc2wudGV4dHVyZTJEfSgke3RleE5hbWV9LCB1dik7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG4gICAgcmV0dXJuIGBcbiAgICAgIHZlYzQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCkge1xuICAgICAgICB2ZWMyIHV2ID0gKHZlYzIoY29sLCByb3cpICsgaGFsZkNSKSAvIHZlYzIoJHt0ZXhOdW1DfS4wLCAke3RleE51bVJ9LjApO1xuXG4gICAgICAgIHJldHVybiAke2dsc2wudGV4dHVyZTJEfSgke3RleE5hbWV9LCB1dik7XG4gICAgICB9XG4gICAgYDtcbiAgfVxuXG4gIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgcmV0dXJuIGBcbiAgICB2ZWM0ICR7ZnVuY05hbWV9KGludCByb3csIGludCBjb2wpIHtcbiAgICAgIGl2ZWMyIHBhY2tlZFRleFNoYXBlID0gaXZlYzIoY2VpbChmbG9hdCgke1xuICAgICAgICB0ZXhOYW1lfVRleFNoYXBlWzBdKSAvIDIuMCksIGNlaWwoZmxvYXQoJHt0ZXhOYW1lfVRleFNoYXBlWzFdKSAvIDIuMCkpO1xuICAgICAgaW50IHZhbHVlc1BlclJvdyA9IGludChjZWlsKGZsb2F0KCR7dGV4TmFtZX1TaGFwZVsxXSkgLyAyLjApKTtcbiAgICAgIHZlYzIgdXYgPSBwYWNrZWRVVmZyb20yRCh2YWx1ZXNQZXJSb3csIHBhY2tlZFRleFNoYXBlWzBdLCBwYWNrZWRUZXhTaGFwZVsxXSwgcm93LCBjb2wpO1xuICAgICAgcmV0dXJuICR7Z2xzbC50ZXh0dXJlMkR9KCR7dGV4TmFtZX0sIHV2KTtcbiAgICB9XG4gIGA7XG4gIH1cbiAgY29uc3QgcGFja2VkVGV4U2hhcGUgPVxuICAgICAgW01hdGguY2VpbCh0ZXhTaGFwZVswXSAvIDIpLCBNYXRoLmNlaWwodGV4U2hhcGVbMV0gLyAyKV07XG4gIGNvbnN0IHZhbHVlc1BlclJvdyA9IE1hdGguY2VpbChzaGFwZVsxXSAvIDIpO1xuXG4gIHJldHVybiBgXG4gICAgdmVjNCAke2Z1bmNOYW1lfShpbnQgcm93LCBpbnQgY29sKSB7XG4gICAgICB2ZWMyIHV2ID0gcGFja2VkVVZmcm9tMkQoJHt2YWx1ZXNQZXJSb3d9LCAke3BhY2tlZFRleFNoYXBlWzBdfSwgJHtcbiAgICAgIHBhY2tlZFRleFNoYXBlWzFdfSwgcm93LCBjb2wpO1xuICAgICAgcmV0dXJuICR7Z2xzbC50ZXh0dXJlMkR9KCR7dGV4TmFtZX0sIHV2KTtcbiAgICB9XG4gIGA7XG59XG5cbmZ1bmN0aW9uIGdldFNhbXBsZXIyRChcbiAgICBpbnB1dEluZm86IElucHV0SW5mbywgZW5hYmxlU2hhcGVVbmlmb3JtczogYm9vbGVhbik6IHN0cmluZyB7XG4gIGNvbnN0IHNoYXBlID0gaW5wdXRJbmZvLnNoYXBlSW5mby5sb2dpY2FsU2hhcGU7XG4gIGNvbnN0IHRleE5hbWUgPSBpbnB1dEluZm8ubmFtZTtcbiAgY29uc3QgZnVuY05hbWUgPSAnZ2V0JyArIHRleE5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB0ZXhOYW1lLnNsaWNlKDEpO1xuICBjb25zdCB0ZXhTaGFwZSA9IGlucHV0SW5mby5zaGFwZUluZm8udGV4U2hhcGU7XG5cbiAgaWYgKHRleFNoYXBlICE9IG51bGwgJiYgdXRpbC5hcnJheXNFcXVhbChzaGFwZSwgdGV4U2hhcGUpKSB7XG4gICAgaWYgKGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICAgIHJldHVybiBgXG4gICAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgcm93LCBpbnQgY29sKSB7XG4gICAgICAgIHZlYzIgdXYgPSAodmVjMihjb2wsIHJvdykgKyBoYWxmQ1IpIC8gdmVjMigke3RleE5hbWV9VGV4U2hhcGVbMV0sICR7XG4gICAgICAgICAgdGV4TmFtZX1UZXhTaGFwZVswXSk7XG4gICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cblxuICAgIGNvbnN0IHRleE51bVIgPSB0ZXhTaGFwZVswXTtcbiAgICBjb25zdCB0ZXhOdW1DID0gdGV4U2hhcGVbMV07XG4gICAgcmV0dXJuIGBcbiAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgcm93LCBpbnQgY29sKSB7XG4gICAgICB2ZWMyIHV2ID0gKHZlYzIoY29sLCByb3cpICsgaGFsZkNSKSAvIHZlYzIoJHt0ZXhOdW1DfS4wLCAke3RleE51bVJ9LjApO1xuICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICAgIH1cbiAgYDtcbiAgfVxuXG4gIGNvbnN0IHtuZXdTaGFwZSwga2VwdERpbXN9ID0gdXRpbC5zcXVlZXplU2hhcGUoc2hhcGUpO1xuICBjb25zdCBzcXVlZXplZFNoYXBlID0gbmV3U2hhcGU7XG4gIGlmIChzcXVlZXplZFNoYXBlLmxlbmd0aCA8IHNoYXBlLmxlbmd0aCkge1xuICAgIGNvbnN0IG5ld0lucHV0SW5mbyA9IHNxdWVlemVJbnB1dEluZm8oaW5wdXRJbmZvLCBzcXVlZXplZFNoYXBlKTtcbiAgICBjb25zdCBwYXJhbXMgPSBbJ3JvdycsICdjb2wnXTtcbiAgICByZXR1cm4gYFxuICAgICAgJHtnZXRTYW1wbGVyRnJvbUluSW5mbyhuZXdJbnB1dEluZm8sIGVuYWJsZVNoYXBlVW5pZm9ybXMpfVxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCkge1xuICAgICAgICByZXR1cm4gJHtmdW5jTmFtZX0oJHtnZXRTcXVlZXplZFBhcmFtcyhwYXJhbXMsIGtlcHREaW1zKX0pO1xuICAgICAgfVxuICAgIGA7XG4gIH1cblxuICBpZiAoaW5wdXRJbmZvLnNoYXBlSW5mby5pc1VuaWZvcm0pIHtcbiAgICAvLyBVbmlmb3JtIGFycmF5cyB3aWxsIGJlIGxlc3MgdGhhbiA2NTUwNSAobm8gcmlzayBvZiBmbG9hdDE2IG92ZXJmbG93KS5cbiAgICByZXR1cm4gYFxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCkge1xuICAgICAgICBpbnQgaW5kZXggPSByb3VuZChkb3QodmVjMihyb3csIGNvbCksIHZlYzIoJHtzaGFwZVsxXX0sIDEpKSk7XG4gICAgICAgICR7Z2V0VW5pZm9ybVNhbXBsZXIoaW5wdXRJbmZvKX1cbiAgICAgIH1cbiAgICBgO1xuICB9XG5cbiAgY29uc3QgdGV4TnVtUiA9IHRleFNoYXBlWzBdO1xuICBjb25zdCB0ZXhOdW1DID0gdGV4U2hhcGVbMV07XG4gIGNvbnN0IG9mZnNldCA9IGdldEZsYXRPZmZzZXRVbmlmb3JtTmFtZSh0ZXhOYW1lKTtcbiAgaWYgKHRleE51bUMgPT09IDEpIHtcbiAgICAvLyBpbmRleCBpcyB1c2VkIGRpcmVjdGx5IGFzIHBoeXNpY2FsIChubyByaXNrIG9mIGZsb2F0MTYgb3ZlcmZsb3cpLlxuICAgIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgICByZXR1cm4gYFxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCkge1xuICAgICAgICBmbG9hdCBpbmRleCA9IGRvdCh2ZWMzKHJvdywgY29sLCAke29mZnNldH0pLCB2ZWMzKCR7XG4gICAgICAgICAgdGV4TmFtZX1TaGFwZVsxXSwgMSwgMSkpO1xuICAgICAgICB2ZWMyIHV2ID0gdmVjMigwLjUsIChpbmRleCArIDAuNSkgLyBmbG9hdCgke3RleE5hbWV9VGV4U2hhcGVbMF0pKTtcbiAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxuICAgIHJldHVybiBgXG4gICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCkge1xuICAgICAgZmxvYXQgaW5kZXggPSBkb3QodmVjMyhyb3csIGNvbCwgJHtvZmZzZXR9KSwgdmVjMygke3NoYXBlWzFdfSwgMSwgMSkpO1xuICAgICAgdmVjMiB1diA9IHZlYzIoMC41LCAoaW5kZXggKyAwLjUpIC8gJHt0ZXhOdW1SfS4wKTtcbiAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICB9XG4gIGA7XG4gIH1cbiAgaWYgKHRleE51bVIgPT09IDEpIHtcbiAgICAvLyBpbmRleCBpcyB1c2VkIGRpcmVjdGx5IGFzIHBoeXNpY2FsIChubyByaXNrIG9mIGZsb2F0MTYgb3ZlcmZsb3cpLlxuICAgIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgICByZXR1cm4gYFxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCkge1xuICAgICAgICBmbG9hdCBpbmRleCA9IGRvdCh2ZWMzKHJvdywgY29sLCAke29mZnNldH0pLCB2ZWMzKCR7XG4gICAgICAgICAgdGV4TmFtZX1TaGFwZVsxXSwgMSwgMSkpO1xuICAgICAgICB2ZWMyIHV2ID0gdmVjMigoaW5kZXggKyAwLjUpIC8gZmxvYXQoJHt0ZXhOYW1lfVRleFNoYXBlWzFdKSwgMC41KTtcbiAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxuICAgIHJldHVybiBgXG4gICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCkge1xuICAgICAgZmxvYXQgaW5kZXggPSBkb3QodmVjMyhyb3csIGNvbCwgJHtvZmZzZXR9KSwgdmVjMygke3NoYXBlWzFdfSwgMSwgMSkpO1xuICAgICAgdmVjMiB1diA9IHZlYzIoKGluZGV4ICsgMC41KSAvICR7dGV4TnVtQ30uMCwgMC41KTtcbiAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICB9XG4gIGA7XG4gIH1cblxuICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgIHJldHVybiBgXG4gICAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgcm93LCBpbnQgY29sKSB7XG4gICAgICAgIC8vIEV4cGxpY2l0bHkgdXNlIGludGVnZXIgb3BlcmF0aW9ucyBhcyBkb3QoKSBvbmx5IHdvcmtzIG9uIGZsb2F0cy5cbiAgICAgICAgaW50IGluZGV4ID0gcm93ICogJHt0ZXhOYW1lfVNoYXBlWzFdICsgY29sICsgJHtvZmZzZXR9O1xuICAgICAgICB2ZWMyIHV2ID0gdXZGcm9tRmxhdCgke3RleE5hbWV9VGV4U2hhcGVbMF0sICR7XG4gICAgICAgIHRleE5hbWV9VGV4U2hhcGVbMV0sIGluZGV4KTtcbiAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbiAgcmV0dXJuIGBcbiAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCkge1xuICAgIC8vIEV4cGxpY2l0bHkgdXNlIGludGVnZXIgb3BlcmF0aW9ucyBhcyBkb3QoKSBvbmx5IHdvcmtzIG9uIGZsb2F0cy5cbiAgICBpbnQgaW5kZXggPSByb3cgKiAke3NoYXBlWzFdfSArIGNvbCArICR7b2Zmc2V0fTtcbiAgICB2ZWMyIHV2ID0gdXZGcm9tRmxhdCgke3RleE51bVJ9LCAke3RleE51bUN9LCBpbmRleCk7XG4gICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICB9XG5gO1xufVxuXG5mdW5jdGlvbiBnZXRQYWNrZWRTYW1wbGVyM0QoXG4gICAgaW5wdXRJbmZvOiBJbnB1dEluZm8sIGVuYWJsZVNoYXBlVW5pZm9ybXM6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBjb25zdCBzaGFwZSA9IGlucHV0SW5mby5zaGFwZUluZm8ubG9naWNhbFNoYXBlO1xuICBjb25zdCB0ZXhOYW1lID0gaW5wdXRJbmZvLm5hbWU7XG4gIGNvbnN0IGZ1bmNOYW1lID0gJ2dldCcgKyB0ZXhOYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdGV4TmFtZS5zbGljZSgxKTtcbiAgY29uc3QgdGV4U2hhcGUgPSBpbnB1dEluZm8uc2hhcGVJbmZvLnRleFNoYXBlO1xuICBjb25zdCBwYWNrZWRUZXhTaGFwZSA9XG4gICAgICBbTWF0aC5jZWlsKHRleFNoYXBlWzBdIC8gMiksIE1hdGguY2VpbCh0ZXhTaGFwZVsxXSAvIDIpXTtcblxuICBpZiAoc2hhcGVbMF0gPT09IDEpIHtcbiAgICBjb25zdCBzcXVlZXplZFNoYXBlID0gc2hhcGUuc2xpY2UoMSk7XG4gICAgY29uc3Qga2VwdERpbXMgPSBbMSwgMl07XG4gICAgY29uc3QgbmV3SW5wdXRJbmZvID0gc3F1ZWV6ZUlucHV0SW5mbyhpbnB1dEluZm8sIHNxdWVlemVkU2hhcGUpO1xuICAgIGNvbnN0IHBhcmFtcyA9IFsnYicsICdyb3cnLCAnY29sJ107XG4gICAgcmV0dXJuIGBcbiAgICAgICAgJHtnZXRQYWNrZWRTYW1wbGVyRnJvbUluSW5mbyhuZXdJbnB1dEluZm8sIGVuYWJsZVNoYXBlVW5pZm9ybXMpfVxuICAgICAgICB2ZWM0ICR7ZnVuY05hbWV9KGludCBiLCBpbnQgcm93LCBpbnQgY29sKSB7XG4gICAgICAgICAgcmV0dXJuICR7ZnVuY05hbWV9KCR7Z2V0U3F1ZWV6ZWRQYXJhbXMocGFyYW1zLCBrZXB0RGltcyl9KTtcbiAgICAgICAgfVxuICAgICAgYDtcbiAgfVxuXG4gIGNvbnN0IGdsc2wgPSBnZXRHbHNsRGlmZmVyZW5jZXMoKTtcbiAgaWYgKGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICByZXR1cm4gYFxuICAgIHZlYzQgJHtmdW5jTmFtZX0oaW50IGIsIGludCByb3csIGludCBjb2wpIHtcbiAgICAgIGl2ZWMyIHBhY2tlZFRleFNoYXBlID0gaXZlYzIoY2VpbChmbG9hdCgke1xuICAgICAgICB0ZXhOYW1lfVRleFNoYXBlWzBdKSAvIDIuMCksIGNlaWwoZmxvYXQoJHt0ZXhOYW1lfVRleFNoYXBlWzFdKSAvIDIuMCkpO1xuICAgICAgaW50IHZhbHVlc1BlclJvdyA9IGludChjZWlsKGZsb2F0KCR7dGV4TmFtZX1TaGFwZVsyXSkgLyAyLjApKTtcbiAgICAgIGludCB0ZXhlbHNJbkJhdGNoID0gdmFsdWVzUGVyUm93ICogaW50KGNlaWwoZmxvYXQoJHtcbiAgICAgICAgdGV4TmFtZX1TaGFwZVsxXSkgLyAyLjApKTtcbiAgICAgIHZlYzIgdXYgPSBwYWNrZWRVVmZyb20zRChcbiAgICAgICAgcGFja2VkVGV4U2hhcGVbMF0sIHBhY2tlZFRleFNoYXBlWzFdLCB0ZXhlbHNJbkJhdGNoLCB2YWx1ZXNQZXJSb3csIGIsIHJvdywgY29sKTtcbiAgICAgIHJldHVybiAke2dsc2wudGV4dHVyZTJEfSgke3RleE5hbWV9LCB1dik7XG4gICAgfVxuICBgO1xuICB9XG5cbiAgY29uc3QgdGV4TnVtUiA9IHBhY2tlZFRleFNoYXBlWzBdO1xuICBjb25zdCB0ZXhOdW1DID0gcGFja2VkVGV4U2hhcGVbMV07XG5cbiAgY29uc3QgdmFsdWVzUGVyUm93ID0gTWF0aC5jZWlsKHNoYXBlWzJdIC8gMik7XG4gIGNvbnN0IHRleGVsc0luQmF0Y2ggPSB2YWx1ZXNQZXJSb3cgKiBNYXRoLmNlaWwoc2hhcGVbMV0gLyAyKTtcblxuICByZXR1cm4gYFxuICAgIHZlYzQgJHtmdW5jTmFtZX0oaW50IGIsIGludCByb3csIGludCBjb2wpIHtcbiAgICAgIHZlYzIgdXYgPSBwYWNrZWRVVmZyb20zRChcbiAgICAgICAgJHt0ZXhOdW1SfSwgJHt0ZXhOdW1DfSwgJHt0ZXhlbHNJbkJhdGNofSwgJHt2YWx1ZXNQZXJSb3d9LCBiLCByb3csIGNvbCk7XG4gICAgICByZXR1cm4gJHtnbHNsLnRleHR1cmUyRH0oJHt0ZXhOYW1lfSwgdXYpO1xuICAgIH1cbiAgYDtcbn1cblxuZnVuY3Rpb24gZ2V0U2FtcGxlcjNEKFxuICAgIGlucHV0SW5mbzogSW5wdXRJbmZvLCBlbmFibGVTaGFwZVVuaWZvcm1zOiBib29sZWFuKTogc3RyaW5nIHtcbiAgY29uc3Qgc2hhcGUgPSBpbnB1dEluZm8uc2hhcGVJbmZvLmxvZ2ljYWxTaGFwZTtcbiAgY29uc3QgdGV4TmFtZSA9IGlucHV0SW5mby5uYW1lO1xuICBjb25zdCBmdW5jTmFtZSA9ICdnZXQnICsgdGV4TmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHRleE5hbWUuc2xpY2UoMSk7XG4gIGNvbnN0IHN0cmlkZTAgPSBzaGFwZVsxXSAqIHNoYXBlWzJdO1xuICBjb25zdCBzdHJpZGUxID0gc2hhcGVbMl07XG5cbiAgY29uc3Qge25ld1NoYXBlLCBrZXB0RGltc30gPSB1dGlsLnNxdWVlemVTaGFwZShzaGFwZSk7XG4gIGNvbnN0IHNxdWVlemVkU2hhcGUgPSBuZXdTaGFwZTtcbiAgaWYgKHNxdWVlemVkU2hhcGUubGVuZ3RoIDwgc2hhcGUubGVuZ3RoKSB7XG4gICAgY29uc3QgbmV3SW5wdXRJbmZvID0gc3F1ZWV6ZUlucHV0SW5mbyhpbnB1dEluZm8sIHNxdWVlemVkU2hhcGUpO1xuICAgIGNvbnN0IHBhcmFtcyA9IFsncm93JywgJ2NvbCcsICdkZXB0aCddO1xuICAgIHJldHVybiBgXG4gICAgICAgICR7Z2V0U2FtcGxlckZyb21JbkluZm8obmV3SW5wdXRJbmZvLCBlbmFibGVTaGFwZVVuaWZvcm1zKX1cbiAgICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoKSB7XG4gICAgICAgICAgcmV0dXJuICR7ZnVuY05hbWV9KCR7Z2V0U3F1ZWV6ZWRQYXJhbXMocGFyYW1zLCBrZXB0RGltcyl9KTtcbiAgICAgICAgfVxuICAgICAgYDtcbiAgfVxuXG4gIGlmIChpbnB1dEluZm8uc2hhcGVJbmZvLmlzVW5pZm9ybSkge1xuICAgIC8vIFVuaWZvcm0gYXJyYXlzIHdpbGwgYmUgbGVzcyB0aGFuIDY1NTA1IChubyByaXNrIG9mIGZsb2F0MTYgb3ZlcmZsb3cpLlxuICAgIHJldHVybiBgXG4gICAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgcm93LCBpbnQgY29sLCBpbnQgZGVwdGgpIHtcbiAgICAgICAgaW50IGluZGV4ID0gcm91bmQoZG90KHZlYzMocm93LCBjb2wsIGRlcHRoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMygke3N0cmlkZTB9LCAke3N0cmlkZTF9LCAxKSkpO1xuICAgICAgICAke2dldFVuaWZvcm1TYW1wbGVyKGlucHV0SW5mbyl9XG4gICAgICB9XG4gICAgYDtcbiAgfVxuXG4gIGNvbnN0IHRleFNoYXBlID0gaW5wdXRJbmZvLnNoYXBlSW5mby50ZXhTaGFwZTtcbiAgY29uc3QgdGV4TnVtUiA9IHRleFNoYXBlWzBdO1xuICBjb25zdCB0ZXhOdW1DID0gdGV4U2hhcGVbMV07XG4gIGNvbnN0IGZsYXRPZmZzZXQgPSBpbnB1dEluZm8uc2hhcGVJbmZvLmZsYXRPZmZzZXQ7XG4gIGlmICh0ZXhOdW1DID09PSBzdHJpZGUwICYmIGZsYXRPZmZzZXQgPT0gbnVsbCkge1xuICAgIC8vIHRleEMgaXMgdXNlZCBkaXJlY3RseSBhcyBwaHlzaWNhbCAobm8gcmlzayBvZiBmbG9hdDE2IG92ZXJmbG93KS5cbiAgICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgICAgcmV0dXJuIGBcbiAgICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCByb3csIGludCBjb2wsIGludCBkZXB0aCkge1xuICAgICAgICBpbnQgc3RyaWRlMSA9ICR7dGV4TmFtZX1TaGFwZVsyXTtcbiAgICAgICAgZmxvYXQgdGV4UiA9IGZsb2F0KHJvdyk7XG4gICAgICAgIGZsb2F0IHRleEMgPSBkb3QodmVjMihjb2wsIGRlcHRoKSwgdmVjMihzdHJpZGUxLCAxKSk7XG4gICAgICAgIHZlYzIgdXYgPSAodmVjMih0ZXhDLCB0ZXhSKSArIGhhbGZDUikgL1xuICAgICAgICAgICAgICAgICAgIHZlYzIoJHt0ZXhOYW1lfVRleFNoYXBlWzFdLCAke3RleE5hbWV9VGV4U2hhcGVbMF0pO1xuICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3RleE5hbWV9LCB1dik7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG4gICAgcmV0dXJuIGBcbiAgICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoKSB7XG4gICAgICAgICAgZmxvYXQgdGV4UiA9IGZsb2F0KHJvdyk7XG4gICAgICAgICAgZmxvYXQgdGV4QyA9IGRvdCh2ZWMyKGNvbCwgZGVwdGgpLCB2ZWMyKCR7c3RyaWRlMX0sIDEpKTtcbiAgICAgICAgICB2ZWMyIHV2ID0gKHZlYzIodGV4QywgdGV4UikgKyBoYWxmQ1IpIC9cbiAgICAgICAgICAgICAgICAgICAgIHZlYzIoJHt0ZXhOdW1DfS4wLCAke3RleE51bVJ9LjApO1xuICAgICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICAgICAgfVxuICAgICAgYDtcbiAgfVxuXG4gIGlmICh0ZXhOdW1DID09PSBzdHJpZGUxICYmIGZsYXRPZmZzZXQgPT0gbnVsbCkge1xuICAgIC8vIHRleFIgaXMgdXNlZCBkaXJlY3RseSBhcyBwaHlzaWNhbCAobm8gcmlzayBvZiBmbG9hdDE2IG92ZXJmbG93KS5cbiAgICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgICAgcmV0dXJuIGBcbiAgICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCByb3csIGludCBjb2wsIGludCBkZXB0aCkge1xuICAgICAgICBmbG9hdCB0ZXhSID0gZG90KHZlYzIocm93LCBjb2wpLCB2ZWMyKCR7dGV4TmFtZX1TaGFwZVsxXSwgMSkpO1xuICAgICAgICBmbG9hdCB0ZXhDID0gZmxvYXQoZGVwdGgpO1xuICAgICAgICB2ZWMyIHV2ID0gKHZlYzIodGV4QywgdGV4UikgKyBoYWxmQ1IpIC8gdmVjMigke3RleE5hbWV9VGV4U2hhcGVbMV0sICR7XG4gICAgICAgICAgdGV4TmFtZX1UZXhTaGFwZVswXSk7XG4gICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbiAgICByZXR1cm4gYFxuICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCByb3csIGludCBjb2wsIGludCBkZXB0aCkge1xuICAgICAgZmxvYXQgdGV4UiA9IGRvdCh2ZWMyKHJvdywgY29sKSwgdmVjMigke3NoYXBlWzFdfSwgMSkpO1xuICAgICAgZmxvYXQgdGV4QyA9IGZsb2F0KGRlcHRoKTtcbiAgICAgIHZlYzIgdXYgPSAodmVjMih0ZXhDLCB0ZXhSKSArIGhhbGZDUikgLyB2ZWMyKCR7dGV4TnVtQ30uMCwgJHt0ZXhOdW1SfS4wKTtcbiAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICB9XG4gIGA7XG4gIH1cblxuICBjb25zdCBvZmZzZXQgPSBnZXRGbGF0T2Zmc2V0VW5pZm9ybU5hbWUodGV4TmFtZSk7XG4gIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgcmV0dXJuIGBcbiAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgcm93LCBpbnQgY29sLCBpbnQgZGVwdGgpIHtcbiAgICAgIC8vIEV4cGxpY2l0bHkgdXNlIGludGVnZXIgb3BlcmF0aW9ucyBhcyBkb3QoKSBvbmx5IHdvcmtzIG9uIGZsb2F0cy5cbiAgICAgIGludCBzdHJpZGUwID0gJHt0ZXhOYW1lfVNoYXBlWzFdICogJHt0ZXhOYW1lfVNoYXBlWzJdO1xuICAgICAgaW50IHN0cmlkZTEgPSAke3RleE5hbWV9U2hhcGVbMl07XG4gICAgICBpbnQgaW5kZXggPSByb3cgKiAke3N0cmlkZTB9ICsgY29sICogJHtzdHJpZGUxfSArIGRlcHRoICsgJHtvZmZzZXR9O1xuICAgICAgdmVjMiB1diA9IHV2RnJvbUZsYXQoJHt0ZXhOYW1lfVRleFNoYXBlWzBdLCAke3RleE5hbWV9VGV4U2hhcGVbMV0sIGluZGV4KTtcbiAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICB9XG4gICAgYDtcbiAgfVxuICByZXR1cm4gYFxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoKSB7XG4gICAgICAgIC8vIEV4cGxpY2l0bHkgdXNlIGludGVnZXIgb3BlcmF0aW9ucyBhcyBkb3QoKSBvbmx5IHdvcmtzIG9uIGZsb2F0cy5cbiAgICAgICAgaW50IGluZGV4ID0gcm93ICogJHtzdHJpZGUwfSArIGNvbCAqICR7c3RyaWRlMX0gKyBkZXB0aCArICR7b2Zmc2V0fTtcbiAgICAgICAgdmVjMiB1diA9IHV2RnJvbUZsYXQoJHt0ZXhOdW1SfSwgJHt0ZXhOdW1DfSwgaW5kZXgpO1xuICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3RleE5hbWV9LCB1dik7XG4gICAgICB9XG4gIGA7XG59XG5cbmZ1bmN0aW9uIGdldFBhY2tlZFNhbXBsZXJORChcbiAgICBpbnB1dEluZm86IElucHV0SW5mbywgZW5hYmxlU2hhcGVVbmlmb3JtczogYm9vbGVhbik6IHN0cmluZyB7XG4gIGNvbnN0IHRleE5hbWUgPSBpbnB1dEluZm8ubmFtZTtcbiAgY29uc3QgZnVuY05hbWUgPSAnZ2V0JyArIHRleE5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB0ZXhOYW1lLnNsaWNlKDEpO1xuICBjb25zdCBnbHNsID0gZ2V0R2xzbERpZmZlcmVuY2VzKCk7XG4gIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgLy8gVE9ETzogc3VwcG9ydCA1ZCBhbmQgNmRcbiAgICByZXR1cm4gYFxuICAgIHZlYzQgJHtmdW5jTmFtZX0oaW50IGIyLCBpbnQgYiwgaW50IHJvdywgaW50IGNvbCkge1xuICAgICAgaW50IHZhbHVlc1BlclJvdyA9IGludChjZWlsKGZsb2F0KCR7dGV4TmFtZX1TaGFwZVszXSkgLyAyLjApKTtcbiAgICAgIGludCB0ZXhlbHNJbkJhdGNoID0gdmFsdWVzUGVyUm93ICogaW50KGNlaWwoZmxvYXQoJHtcbiAgICAgICAgdGV4TmFtZX1TaGFwZVsyXSkgLyAyLjApKTtcbiAgICAgIGludCBpbmRleCA9IGIgKiB0ZXhlbHNJbkJhdGNoICsgKHJvdyAvIDIpICogdmFsdWVzUGVyUm93ICsgKGNvbCAvIDIpO1xuICAgICAgdGV4ZWxzSW5CYXRjaCAqPSAke3RleE5hbWV9U2hhcGVbMV07XG4gICAgICBpbmRleCA9IGIyICogdGV4ZWxzSW5CYXRjaCArIGluZGV4O1xuICAgICAgaXZlYzIgcGFja2VkVGV4U2hhcGUgPSBpdmVjMihjZWlsKGZsb2F0KCR7XG4gICAgICAgIHRleE5hbWV9VGV4U2hhcGVbMF0pIC8gMi4wKSwgY2VpbChmbG9hdCgke3RleE5hbWV9VGV4U2hhcGVbMV0pIC8gMi4wKSk7XG4gICAgICBpbnQgdGV4UiA9IGluZGV4IC8gcGFja2VkVGV4U2hhcGVbMV07XG4gICAgICBpbnQgdGV4QyA9IGluZGV4IC0gdGV4UiAqIHBhY2tlZFRleFNoYXBlWzFdO1xuICAgICAgdmVjMiB1diA9ICh2ZWMyKHRleEMsIHRleFIpICsgaGFsZkNSKSAvIHZlYzIocGFja2VkVGV4U2hhcGVbMV0sIHBhY2tlZFRleFNoYXBlWzBdKTsgcmV0dXJuICR7XG4gICAgICAgIGdsc2wudGV4dHVyZTJEfSgke3RleE5hbWV9LCB1dik7XG4gICAgfVxuICBgO1xuICB9XG4gIGNvbnN0IHNoYXBlID0gaW5wdXRJbmZvLnNoYXBlSW5mby5sb2dpY2FsU2hhcGU7XG4gIGNvbnN0IHJhbmsgPSBzaGFwZS5sZW5ndGg7XG4gIGNvbnN0IHRleFNoYXBlID0gaW5wdXRJbmZvLnNoYXBlSW5mby50ZXhTaGFwZTtcbiAgY29uc3QgcGFja2VkVGV4U2hhcGUgPVxuICAgICAgW01hdGguY2VpbCh0ZXhTaGFwZVswXSAvIDIpLCBNYXRoLmNlaWwodGV4U2hhcGVbMV0gLyAyKV07XG4gIGNvbnN0IHRleE51bVIgPSBwYWNrZWRUZXhTaGFwZVswXTtcbiAgY29uc3QgdGV4TnVtQyA9IHBhY2tlZFRleFNoYXBlWzFdO1xuXG4gIGNvbnN0IHZhbHVlc1BlclJvdyA9IE1hdGguY2VpbChzaGFwZVtyYW5rIC0gMV0gLyAyKTtcbiAgbGV0IHRleGVsc0luQmF0Y2ggPSB2YWx1ZXNQZXJSb3cgKiBNYXRoLmNlaWwoc2hhcGVbcmFuayAtIDJdIC8gMik7XG4gIGxldCBwYXJhbXMgPSBgaW50IGIsIGludCByb3csIGludCBjb2xgO1xuICBsZXQgaW5kZXggPSBgYiAqICR7dGV4ZWxzSW5CYXRjaH0gKyAocm93IC8gMikgKiAke3ZhbHVlc1BlclJvd30gKyAoY29sIC8gMilgO1xuICBmb3IgKGxldCBiID0gMjsgYiA8IHJhbmsgLSAxOyBiKyspIHtcbiAgICBwYXJhbXMgPSBgaW50IGIke2J9LCBgICsgcGFyYW1zO1xuICAgIHRleGVsc0luQmF0Y2ggKj0gc2hhcGVbcmFuayAtIGIgLSAxXTtcbiAgICBpbmRleCA9IGBiJHtifSAqICR7dGV4ZWxzSW5CYXRjaH0gKyBgICsgaW5kZXg7XG4gIH1cbiAgcmV0dXJuIGBcbiAgICB2ZWM0ICR7ZnVuY05hbWV9KCR7cGFyYW1zfSkge1xuICAgICAgaW50IGluZGV4ID0gJHtpbmRleH07XG4gICAgICBpbnQgdGV4UiA9IGluZGV4IC8gJHt0ZXhOdW1DfTtcbiAgICAgIGludCB0ZXhDID0gaW5kZXggLSB0ZXhSICogJHt0ZXhOdW1DfTtcbiAgICAgIHZlYzIgdXYgPSAodmVjMih0ZXhDLCB0ZXhSKSArIGhhbGZDUikgLyB2ZWMyKCR7dGV4TnVtQ30sICR7dGV4TnVtUn0pO1xuICAgICAgcmV0dXJuICR7Z2xzbC50ZXh0dXJlMkR9KCR7dGV4TmFtZX0sIHV2KTtcbiAgICB9XG4gIGA7XG59XG5cbmZ1bmN0aW9uIGdldFNhbXBsZXI0RChcbiAgICBpbnB1dEluZm86IElucHV0SW5mbywgZW5hYmxlU2hhcGVVbmlmb3JtczogYm9vbGVhbik6IHN0cmluZyB7XG4gIGNvbnN0IHNoYXBlID0gaW5wdXRJbmZvLnNoYXBlSW5mby5sb2dpY2FsU2hhcGU7XG4gIGNvbnN0IHRleE5hbWUgPSBpbnB1dEluZm8ubmFtZTtcbiAgY29uc3QgZnVuY05hbWUgPSAnZ2V0JyArIHRleE5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB0ZXhOYW1lLnNsaWNlKDEpO1xuICBjb25zdCBzdHJpZGUyID0gc2hhcGVbM107XG4gIGNvbnN0IHN0cmlkZTEgPSBzaGFwZVsyXSAqIHN0cmlkZTI7XG4gIGNvbnN0IHN0cmlkZTAgPSBzaGFwZVsxXSAqIHN0cmlkZTE7XG5cbiAgY29uc3Qge25ld1NoYXBlLCBrZXB0RGltc30gPSB1dGlsLnNxdWVlemVTaGFwZShzaGFwZSk7XG4gIGlmIChuZXdTaGFwZS5sZW5ndGggPCBzaGFwZS5sZW5ndGgpIHtcbiAgICBjb25zdCBuZXdJbnB1dEluZm8gPSBzcXVlZXplSW5wdXRJbmZvKGlucHV0SW5mbywgbmV3U2hhcGUpO1xuICAgIGNvbnN0IHBhcmFtcyA9IFsncm93JywgJ2NvbCcsICdkZXB0aCcsICdkZXB0aDInXTtcbiAgICByZXR1cm4gYFxuICAgICAgJHtnZXRTYW1wbGVyRnJvbUluSW5mbyhuZXdJbnB1dEluZm8sIGVuYWJsZVNoYXBlVW5pZm9ybXMpfVxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoLCBpbnQgZGVwdGgyKSB7XG4gICAgICAgIHJldHVybiAke2Z1bmNOYW1lfSgke2dldFNxdWVlemVkUGFyYW1zKHBhcmFtcywga2VwdERpbXMpfSk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxuXG4gIGlmIChpbnB1dEluZm8uc2hhcGVJbmZvLmlzVW5pZm9ybSkge1xuICAgIC8vIFVuaWZvcm0gYXJyYXlzIHdpbGwgYmUgbGVzcyB0aGFuIDY1NTA1IChubyByaXNrIG9mIGZsb2F0MTYgb3ZlcmZsb3cpLlxuICAgIHJldHVybiBgXG4gICAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgcm93LCBpbnQgY29sLCBpbnQgZGVwdGgsIGludCBkZXB0aDIpIHtcbiAgICAgICAgaW50IGluZGV4ID0gcm91bmQoZG90KHZlYzQocm93LCBjb2wsIGRlcHRoLCBkZXB0aDIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWM0KCR7c3RyaWRlMH0sICR7c3RyaWRlMX0sICR7c3RyaWRlMn0sIDEpKSk7XG4gICAgICAgICR7Z2V0VW5pZm9ybVNhbXBsZXIoaW5wdXRJbmZvKX1cbiAgICAgIH1cbiAgICBgO1xuICB9XG5cbiAgY29uc3QgZmxhdE9mZnNldCA9IGlucHV0SW5mby5zaGFwZUluZm8uZmxhdE9mZnNldDtcbiAgY29uc3QgdGV4U2hhcGUgPSBpbnB1dEluZm8uc2hhcGVJbmZvLnRleFNoYXBlO1xuICBjb25zdCB0ZXhOdW1SID0gdGV4U2hhcGVbMF07XG4gIGNvbnN0IHRleE51bUMgPSB0ZXhTaGFwZVsxXTtcblxuICBjb25zdCBzdHJpZGUyU3RyID0gYGludCBzdHJpZGUyID0gJHt0ZXhOYW1lfVNoYXBlWzNdO2A7XG4gIGNvbnN0IHN0cmlkZTFTdHIgPSBgaW50IHN0cmlkZTEgPSAke3RleE5hbWV9U2hhcGVbMl0gKiBzdHJpZGUyO2A7XG4gIGNvbnN0IHN0cmlkZTBTdHIgPSBgaW50IHN0cmlkZTAgPSAke3RleE5hbWV9U2hhcGVbMV0gKiBzdHJpZGUxO2A7XG4gIGlmICh0ZXhOdW1DID09PSBzdHJpZGUwICYmIGZsYXRPZmZzZXQgPT0gbnVsbCkge1xuICAgIC8vIHRleEMgaXMgdXNlZCBkaXJlY3RseSBhcyBwaHlzaWNhbCAobm8gcmlzayBvZiBmbG9hdDE2IG92ZXJmbG93KS5cbiAgICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgICAgcmV0dXJuIGBcbiAgICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCByb3csIGludCBjb2wsIGludCBkZXB0aCwgaW50IGRlcHRoMikge1xuICAgICAgICAke3N0cmlkZTJTdHJ9XG4gICAgICAgICR7c3RyaWRlMVN0cn1cbiAgICAgICAgZmxvYXQgdGV4UiA9IGZsb2F0KHJvdyk7XG4gICAgICAgIGZsb2F0IHRleEMgPVxuICAgICAgICAgICAgZG90KHZlYzMoY29sLCBkZXB0aCwgZGVwdGgyKSxcbiAgICAgICAgICAgICAgICB2ZWMzKHN0cmlkZTEsIHN0cmlkZTIsIDEpKTtcbiAgICAgICAgdmVjMiB1diA9ICh2ZWMyKHRleEMsIHRleFIpICsgaGFsZkNSKSAvXG4gICAgICAgICAgICAgICAgICAgdmVjMigke3RleE5hbWV9VGV4U2hhcGVbMV0sICR7dGV4TmFtZX1UZXhTaGFwZVswXSk7XG4gICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbiAgICByZXR1cm4gYFxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoLCBpbnQgZGVwdGgyKSB7XG4gICAgICAgIGZsb2F0IHRleFIgPSBmbG9hdChyb3cpO1xuICAgICAgICBmbG9hdCB0ZXhDID1cbiAgICAgICAgICAgIGRvdCh2ZWMzKGNvbCwgZGVwdGgsIGRlcHRoMiksXG4gICAgICAgICAgICAgICAgdmVjMygke3N0cmlkZTF9LCAke3N0cmlkZTJ9LCAxKSk7XG4gICAgICAgIHZlYzIgdXYgPSAodmVjMih0ZXhDLCB0ZXhSKSArIGhhbGZDUikgL1xuICAgICAgICAgICAgICAgICAgIHZlYzIoJHt0ZXhOdW1DfS4wLCAke3RleE51bVJ9LjApO1xuICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3RleE5hbWV9LCB1dik7XG4gICAgICB9XG4gICAgYDtcbiAgfVxuICBpZiAodGV4TnVtQyA9PT0gc3RyaWRlMiAmJiBmbGF0T2Zmc2V0ID09IG51bGwpIHtcbiAgICAvLyB0ZXhSIGlzIHVzZWQgZGlyZWN0bHkgYXMgcGh5c2ljYWwgKG5vIHJpc2sgb2YgZmxvYXQxNiBvdmVyZmxvdykuXG4gICAgaWYgKGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICAgIHJldHVybiBgXG4gICAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgcm93LCBpbnQgY29sLCBpbnQgZGVwdGgsIGludCBkZXB0aDIpIHtcbiAgICAgICAgZmxvYXQgdGV4UiA9IGRvdCh2ZWMzKHJvdywgY29sLCBkZXB0aCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgdmVjMygke3RleE5hbWV9U2hhcGVbMV0gKiAke3RleE5hbWV9U2hhcGVbMl0sICR7XG4gICAgICAgICAgdGV4TmFtZX1TaGFwZVsyXSwgMSkpO1xuICAgICAgICBmbG9hdCB0ZXhDID0gZmxvYXQoZGVwdGgyKTtcbiAgICAgICAgdmVjMiB1diA9ICh2ZWMyKHRleEMsIHRleFIpICsgaGFsZkNSKSAvXG4gICAgICAgICAgICAgICAgICB2ZWMyKCR7dGV4TmFtZX1UZXhTaGFwZVsxXSwgJHt0ZXhOYW1lfVRleFNoYXBlWzBdKTtcbiAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxuICAgIHJldHVybiBgXG4gICAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgcm93LCBpbnQgY29sLCBpbnQgZGVwdGgsIGludCBkZXB0aDIpIHtcbiAgICAgICAgZmxvYXQgdGV4UiA9IGRvdCh2ZWMzKHJvdywgY29sLCBkZXB0aCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgdmVjMygke3NoYXBlWzFdICogc2hhcGVbMl19LCAke3NoYXBlWzJdfSwgMSkpO1xuICAgICAgICBmbG9hdCB0ZXhDID0gZmxvYXQoZGVwdGgyKTtcbiAgICAgICAgdmVjMiB1diA9ICh2ZWMyKHRleEMsIHRleFIpICsgaGFsZkNSKSAvXG4gICAgICAgICAgICAgICAgICB2ZWMyKCR7dGV4TnVtQ30uMCwgJHt0ZXhOdW1SfS4wKTtcbiAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cblxuICBjb25zdCBvZmZzZXQgPSBnZXRGbGF0T2Zmc2V0VW5pZm9ybU5hbWUodGV4TmFtZSk7XG4gIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgcmV0dXJuIGBcbiAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgcm93LCBpbnQgY29sLCBpbnQgZGVwdGgsIGludCBkZXB0aDIpIHtcbiAgICAgIC8vIEV4cGxpY2l0bHkgdXNlIGludGVnZXIgb3BlcmF0aW9ucyBhcyBkb3QoKSBvbmx5IHdvcmtzIG9uIGZsb2F0cy5cbiAgICAgICR7c3RyaWRlMlN0cn1cbiAgICAgICR7c3RyaWRlMVN0cn1cbiAgICAgICR7c3RyaWRlMFN0cn1cbiAgICAgIGludCBpbmRleCA9IHJvdyAqIHN0cmlkZTAgKyBjb2wgKiBzdHJpZGUxICtcbiAgICAgICAgICBkZXB0aCAqIHN0cmlkZTIgKyBkZXB0aDI7XG4gICAgICB2ZWMyIHV2ID0gdXZGcm9tRmxhdCgke3RleE5hbWV9VGV4U2hhcGVbMF0sICR7XG4gICAgICAgIHRleE5hbWV9VGV4U2hhcGVbMV0sIGluZGV4ICsgJHtvZmZzZXR9KTtcbiAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICB9XG4gIGA7XG4gIH1cbiAgcmV0dXJuIGBcbiAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgcm93LCBpbnQgY29sLCBpbnQgZGVwdGgsIGludCBkZXB0aDIpIHtcbiAgICAgIC8vIEV4cGxpY2l0bHkgdXNlIGludGVnZXIgb3BlcmF0aW9ucyBhcyBkb3QoKSBvbmx5IHdvcmtzIG9uIGZsb2F0cy5cbiAgICAgIGludCBpbmRleCA9IHJvdyAqICR7c3RyaWRlMH0gKyBjb2wgKiAke3N0cmlkZTF9ICtcbiAgICAgICAgICBkZXB0aCAqICR7c3RyaWRlMn0gKyBkZXB0aDI7XG4gICAgICB2ZWMyIHV2ID0gdXZGcm9tRmxhdCgke3RleE51bVJ9LCAke3RleE51bUN9LCBpbmRleCArICR7b2Zmc2V0fSk7XG4gICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3RleE5hbWV9LCB1dik7XG4gICAgfVxuICBgO1xufVxuXG5mdW5jdGlvbiBnZXRTYW1wbGVyNUQoaW5wdXRJbmZvOiBJbnB1dEluZm8pOiBzdHJpbmcge1xuICBjb25zdCBzaGFwZSA9IGlucHV0SW5mby5zaGFwZUluZm8ubG9naWNhbFNoYXBlO1xuICBjb25zdCB0ZXhOYW1lID0gaW5wdXRJbmZvLm5hbWU7XG4gIGNvbnN0IGZ1bmNOYW1lID0gJ2dldCcgKyB0ZXhOYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdGV4TmFtZS5zbGljZSgxKTtcbiAgY29uc3Qgc3RyaWRlMyA9IHNoYXBlWzRdO1xuICBjb25zdCBzdHJpZGUyID0gc2hhcGVbM10gKiBzdHJpZGUzO1xuICBjb25zdCBzdHJpZGUxID0gc2hhcGVbMl0gKiBzdHJpZGUyO1xuICBjb25zdCBzdHJpZGUwID0gc2hhcGVbMV0gKiBzdHJpZGUxO1xuXG4gIGNvbnN0IHtuZXdTaGFwZSwga2VwdERpbXN9ID0gdXRpbC5zcXVlZXplU2hhcGUoc2hhcGUpO1xuICBpZiAobmV3U2hhcGUubGVuZ3RoIDwgc2hhcGUubGVuZ3RoKSB7XG4gICAgY29uc3QgbmV3SW5wdXRJbmZvID0gc3F1ZWV6ZUlucHV0SW5mbyhpbnB1dEluZm8sIG5ld1NoYXBlKTtcbiAgICBjb25zdCBwYXJhbXMgPSBbJ3JvdycsICdjb2wnLCAnZGVwdGgnLCAnZGVwdGgyJywgJ2RlcHRoMyddO1xuICAgIHJldHVybiBgXG4gICAgICAke2dldFNhbXBsZXJGcm9tSW5JbmZvKG5ld0lucHV0SW5mbyl9XG4gICAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgcm93LCBpbnQgY29sLCBpbnQgZGVwdGgsIGludCBkZXB0aDIsIGludCBkZXB0aDMpIHtcbiAgICAgICAgcmV0dXJuICR7ZnVuY05hbWV9KCR7Z2V0U3F1ZWV6ZWRQYXJhbXMocGFyYW1zLCBrZXB0RGltcyl9KTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG5cbiAgaWYgKGlucHV0SW5mby5zaGFwZUluZm8uaXNVbmlmb3JtKSB7XG4gICAgLy8gVW5pZm9ybSBhcnJheXMgd2lsbCBiZSBsZXNzIHRoYW4gNjU1MDUgKG5vIHJpc2sgb2YgZmxvYXQxNiBvdmVyZmxvdykuXG4gICAgcmV0dXJuIGBcbiAgICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCByb3csIGludCBjb2wsIGludCBkZXB0aCwgaW50IGRlcHRoMiwgaW50IGRlcHRoMykge1xuICAgICAgICBmbG9hdCBpbmRleCA9IGRvdChcbiAgICAgICAgICB2ZWM0KHJvdywgY29sLCBkZXB0aCwgZGVwdGgyKSxcbiAgICAgICAgICB2ZWM0KCR7c3RyaWRlMH0sICR7c3RyaWRlMX0sICR7c3RyaWRlMn0sICR7c3RyaWRlM30pKSArXG4gICAgICAgICAgZGVwdGgzO1xuICAgICAgICAke2dldFVuaWZvcm1TYW1wbGVyKGlucHV0SW5mbyl9XG4gICAgICB9XG4gICAgYDtcbiAgfVxuXG4gIGNvbnN0IGZsYXRPZmZzZXQgPSBpbnB1dEluZm8uc2hhcGVJbmZvLmZsYXRPZmZzZXQ7XG4gIGNvbnN0IHRleFNoYXBlID0gaW5wdXRJbmZvLnNoYXBlSW5mby50ZXhTaGFwZTtcbiAgY29uc3QgdGV4TnVtUiA9IHRleFNoYXBlWzBdO1xuICBjb25zdCB0ZXhOdW1DID0gdGV4U2hhcGVbMV07XG5cbiAgaWYgKHRleE51bUMgPT09IHN0cmlkZTAgJiYgZmxhdE9mZnNldCA9PSBudWxsKSB7XG4gICAgLy8gdGV4QyBpcyB1c2VkIGRpcmVjdGx5IGFzIHBoeXNpY2FsIChubyByaXNrIG9mIGZsb2F0MTYgb3ZlcmZsb3cpLlxuICAgIHJldHVybiBgXG4gICAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgcm93LCBpbnQgY29sLCBpbnQgZGVwdGgsIGludCBkZXB0aDIsIGludCBkZXB0aDMpIHtcbiAgICAgICAgaW50IHRleFIgPSByb3c7XG4gICAgICAgIGZsb2F0IHRleEMgPSBkb3QodmVjNChjb2wsIGRlcHRoLCBkZXB0aDIsIGRlcHRoMyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgdmVjNCgke3N0cmlkZTF9LCAke3N0cmlkZTJ9LCAke3N0cmlkZTN9LCAxKSk7XG4gICAgICAgIHZlYzIgdXYgPSAodmVjMih0ZXhDLCB0ZXhSKSArIGhhbGZDUikgL1xuICAgICAgICAgICAgICAgICAgIHZlYzIoJHt0ZXhOdW1DfS4wLCAke3RleE51bVJ9LjApO1xuICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3RleE5hbWV9LCB1dik7XG4gICAgICB9XG4gICAgYDtcbiAgfVxuXG4gIGlmICh0ZXhOdW1DID09PSBzdHJpZGUzICYmIGZsYXRPZmZzZXQgPT0gbnVsbCkge1xuICAgIC8vIHRleFIgaXMgdXNlZCBkaXJlY3RseSBhcyBwaHlzaWNhbCAobm8gcmlzayBvZiBmbG9hdDE2IG92ZXJmbG93KS5cbiAgICByZXR1cm4gYFxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoLCBpbnQgZGVwdGgyLCBpbnQgZGVwdGgzKSB7XG4gICAgICAgIGZsb2F0IHRleFIgPSBkb3QoXG4gICAgICAgICAgdmVjNChyb3csIGNvbCwgZGVwdGgsIGRlcHRoMiksXG4gICAgICAgICAgdmVjNCgke3NoYXBlWzFdICogc2hhcGVbMl0gKiBzaGFwZVszXX0sXG4gICAgICAgICAgICAgICAke3NoYXBlWzJdICogc2hhcGVbM119LCAke3NoYXBlWzNdfSwgMSkpO1xuICAgICAgICBpbnQgdGV4QyA9IGRlcHRoMztcbiAgICAgICAgdmVjMiB1diA9ICh2ZWMyKHRleEMsIHRleFIpICsgaGFsZkNSKSAvXG4gICAgICAgICAgICAgICAgICB2ZWMyKCR7dGV4TnVtQ30uMCwgJHt0ZXhOdW1SfS4wKTtcbiAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cblxuICBjb25zdCBvZmZzZXQgPSBnZXRGbGF0T2Zmc2V0VW5pZm9ybU5hbWUodGV4TmFtZSk7XG4gIHJldHVybiBgXG4gICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoLCBpbnQgZGVwdGgyLCBpbnQgZGVwdGgzKSB7XG4gICAgICAvLyBFeHBsaWNpdGx5IHVzZSBpbnRlZ2VyIG9wZXJhdGlvbnMgYXMgZG90KCkgb25seSB3b3JrcyBvbiBmbG9hdHMuXG4gICAgICBpbnQgaW5kZXggPSByb3cgKiAke3N0cmlkZTB9ICsgY29sICogJHtzdHJpZGUxfSArIGRlcHRoICogJHtzdHJpZGUyfSArXG4gICAgICAgICAgZGVwdGgyICogJHtzdHJpZGUzfSArIGRlcHRoMyArICR7b2Zmc2V0fTtcbiAgICAgIHZlYzIgdXYgPSB1dkZyb21GbGF0KCR7dGV4TnVtUn0sICR7dGV4TnVtQ30sIGluZGV4KTtcbiAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICB9XG4gIGA7XG59XG5cbmZ1bmN0aW9uIGdldFNhbXBsZXI2RChpbnB1dEluZm86IElucHV0SW5mbyk6IHN0cmluZyB7XG4gIGNvbnN0IHNoYXBlID0gaW5wdXRJbmZvLnNoYXBlSW5mby5sb2dpY2FsU2hhcGU7XG4gIGNvbnN0IHRleE5hbWUgPSBpbnB1dEluZm8ubmFtZTtcbiAgY29uc3QgZnVuY05hbWUgPSAnZ2V0JyArIHRleE5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB0ZXhOYW1lLnNsaWNlKDEpO1xuXG4gIGNvbnN0IHtuZXdTaGFwZSwga2VwdERpbXN9ID0gdXRpbC5zcXVlZXplU2hhcGUoc2hhcGUpO1xuICBpZiAobmV3U2hhcGUubGVuZ3RoIDwgc2hhcGUubGVuZ3RoKSB7XG4gICAgY29uc3QgbmV3SW5wdXRJbmZvID0gc3F1ZWV6ZUlucHV0SW5mbyhpbnB1dEluZm8sIG5ld1NoYXBlKTtcbiAgICBjb25zdCBwYXJhbXMgPSBbJ3JvdycsICdjb2wnLCAnZGVwdGgnLCAnZGVwdGgyJywgJ2RlcHRoMycsICdkZXB0aDQnXTtcbiAgICByZXR1cm4gYFxuICAgICAgJHtnZXRTYW1wbGVyRnJvbUluSW5mbyhuZXdJbnB1dEluZm8pfVxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoLFxuICAgICAgICAgICAgICAgICAgICBpbnQgZGVwdGgyLCBpbnQgZGVwdGgzLCBpbnQgZGVwdGg0KSB7XG4gICAgICAgIHJldHVybiAke2Z1bmNOYW1lfSgke2dldFNxdWVlemVkUGFyYW1zKHBhcmFtcywga2VwdERpbXMpfSk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxuXG4gIGNvbnN0IHN0cmlkZTQgPSBzaGFwZVs1XTtcbiAgY29uc3Qgc3RyaWRlMyA9IHNoYXBlWzRdICogc3RyaWRlNDtcbiAgY29uc3Qgc3RyaWRlMiA9IHNoYXBlWzNdICogc3RyaWRlMztcbiAgY29uc3Qgc3RyaWRlMSA9IHNoYXBlWzJdICogc3RyaWRlMjtcbiAgY29uc3Qgc3RyaWRlMCA9IHNoYXBlWzFdICogc3RyaWRlMTtcblxuICBpZiAoaW5wdXRJbmZvLnNoYXBlSW5mby5pc1VuaWZvcm0pIHtcbiAgICAvLyBVbmlmb3JtIGFycmF5cyB3aWxsIGJlIGxlc3MgdGhhbiA2NTUwNSAobm8gcmlzayBvZiBmbG9hdDE2IG92ZXJmbG93KS5cbiAgICByZXR1cm4gYFxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoLFxuICAgICAgICAgICAgICAgICAgaW50IGRlcHRoMiwgaW50IGRlcHRoMywgaW50IGRlcHRoNCkge1xuICAgICAgICBpbnQgaW5kZXggPSByb3VuZChkb3QoXG4gICAgICAgICAgdmVjNChyb3csIGNvbCwgZGVwdGgsIGRlcHRoMiksXG4gICAgICAgICAgdmVjNCgke3N0cmlkZTB9LCAke3N0cmlkZTF9LCAke3N0cmlkZTJ9LCAke3N0cmlkZTN9KSkgK1xuICAgICAgICAgIGRvdChcbiAgICAgICAgICAgIHZlYzIoZGVwdGgzLCBkZXB0aDQpLFxuICAgICAgICAgICAgdmVjMigke3N0cmlkZTR9LCAxKSkpO1xuICAgICAgICAke2dldFVuaWZvcm1TYW1wbGVyKGlucHV0SW5mbyl9XG4gICAgICB9XG4gICAgYDtcbiAgfVxuXG4gIGNvbnN0IGZsYXRPZmZzZXQgPSBpbnB1dEluZm8uc2hhcGVJbmZvLmZsYXRPZmZzZXQ7XG4gIGNvbnN0IHRleFNoYXBlID0gaW5wdXRJbmZvLnNoYXBlSW5mby50ZXhTaGFwZTtcbiAgY29uc3QgdGV4TnVtUiA9IHRleFNoYXBlWzBdO1xuICBjb25zdCB0ZXhOdW1DID0gdGV4U2hhcGVbMV07XG4gIGlmICh0ZXhOdW1DID09PSBzdHJpZGUwICYmIGZsYXRPZmZzZXQgPT0gbnVsbCkge1xuICAgIC8vIHRleEMgaXMgdXNlZCBkaXJlY3RseSBhcyBwaHlzaWNhbCAobm8gcmlzayBvZiBmbG9hdDE2IG92ZXJmbG93KS5cbiAgICByZXR1cm4gYFxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoLFxuICAgICAgICAgICAgICAgICAgICBpbnQgZGVwdGgyLCBpbnQgZGVwdGgzLCBpbnQgZGVwdGg0KSB7XG4gICAgICAgIGludCB0ZXhSID0gcm93O1xuICAgICAgICBmbG9hdCB0ZXhDID0gZG90KHZlYzQoY29sLCBkZXB0aCwgZGVwdGgyLCBkZXB0aDMpLFxuICAgICAgICAgIHZlYzQoJHtzdHJpZGUxfSwgJHtzdHJpZGUyfSwgJHtzdHJpZGUzfSwgJHtzdHJpZGU0fSkpICtcbiAgICAgICAgICAgICAgIGZsb2F0KGRlcHRoNCk7XG4gICAgICAgIHZlYzIgdXYgPSAodmVjMih0ZXhDLCB0ZXhSKSArIGhhbGZDUikgL1xuICAgICAgICAgICAgICAgICAgIHZlYzIoJHt0ZXhOdW1DfS4wLCAke3RleE51bVJ9LjApO1xuICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3RleE5hbWV9LCB1dik7XG4gICAgICB9XG4gICAgYDtcbiAgfVxuICBpZiAodGV4TnVtQyA9PT0gc3RyaWRlNCAmJiBmbGF0T2Zmc2V0ID09IG51bGwpIHtcbiAgICAvLyB0ZXhSIGlzIHVzZWQgZGlyZWN0bHkgYXMgcGh5c2ljYWwgKG5vIHJpc2sgb2YgZmxvYXQxNiBvdmVyZmxvdykuXG4gICAgcmV0dXJuIGBcbiAgICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCByb3csIGludCBjb2wsIGludCBkZXB0aCxcbiAgICAgICAgICAgICAgICAgICAgaW50IGRlcHRoMiwgaW50IGRlcHRoMywgaW50IGRlcHRoNCkge1xuICAgICAgICBmbG9hdCB0ZXhSID0gZG90KHZlYzQocm93LCBjb2wsIGRlcHRoLCBkZXB0aDIpLFxuICAgICAgICAgIHZlYzQoJHtzaGFwZVsxXSAqIHNoYXBlWzJdICogc2hhcGVbM10gKiBzaGFwZVs0XX0sXG4gICAgICAgICAgICAgICAke3NoYXBlWzJdICogc2hhcGVbM10gKiBzaGFwZVs0XX0sXG4gICAgICAgICAgICAgICAke3NoYXBlWzNdICogc2hhcGVbNF19LFxuICAgICAgICAgICAgICAgJHtzaGFwZVs0XX0pKSArIGZsb2F0KGRlcHRoMyk7XG4gICAgICAgIGludCB0ZXhDID0gZGVwdGg0O1xuICAgICAgICB2ZWMyIHV2ID0gKHZlYzIodGV4QywgdGV4UikgKyBoYWxmQ1IpIC9cbiAgICAgICAgICAgICAgICAgIHZlYzIoJHt0ZXhOdW1DfS4wLCAke3RleE51bVJ9LjApO1xuICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3RleE5hbWV9LCB1dik7XG4gICAgICB9XG4gICAgYDtcbiAgfVxuICBjb25zdCBvZmZzZXQgPSBnZXRGbGF0T2Zmc2V0VW5pZm9ybU5hbWUodGV4TmFtZSk7XG4gIHJldHVybiBgXG4gICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoLFxuICAgICAgICAgICAgICAgICAgaW50IGRlcHRoMiwgaW50IGRlcHRoMywgaW50IGRlcHRoNCkge1xuICAgICAgLy8gRXhwbGljaXRseSB1c2UgaW50ZWdlciBvcGVyYXRpb25zIGFzIGRvdCgpIG9ubHkgd29ya3Mgb24gZmxvYXRzLlxuICAgICAgaW50IGluZGV4ID0gcm93ICogJHtzdHJpZGUwfSArIGNvbCAqICR7c3RyaWRlMX0gKyBkZXB0aCAqICR7c3RyaWRlMn0gK1xuICAgICAgICAgIGRlcHRoMiAqICR7c3RyaWRlM30gKyBkZXB0aDMgKiAke3N0cmlkZTR9ICsgZGVwdGg0ICsgJHtvZmZzZXR9O1xuICAgICAgdmVjMiB1diA9IHV2RnJvbUZsYXQoJHt0ZXhOdW1SfSwgJHt0ZXhOdW1DfSwgaW5kZXgpO1xuICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICAgIH1cbiAgYDtcbn1cblxuZnVuY3Rpb24gZ2V0VW5pZm9ybVNhbXBsZXIoaW5wdXRJbmZvOiBJbnB1dEluZm8pOiBzdHJpbmcge1xuICBjb25zdCB0ZXhOYW1lID0gaW5wdXRJbmZvLm5hbWU7XG4gIGNvbnN0IGluU2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShpbnB1dEluZm8uc2hhcGVJbmZvLmxvZ2ljYWxTaGFwZSk7XG5cbiAgaWYgKGluU2l6ZSA8IDIpIHtcbiAgICByZXR1cm4gYHJldHVybiAke3RleE5hbWV9O2A7XG4gIH1cblxuICByZXR1cm4gYFxuICAgIGZvciAoaW50IGkgPSAwOyBpIDwgJHtpblNpemV9OyBpKyspIHtcbiAgICAgIGlmIChpID09IGluZGV4KSB7XG4gICAgICAgIHJldHVybiAke3RleE5hbWV9W2ldO1xuICAgICAgfVxuICAgIH1cbiAgYDtcbn1cblxuZnVuY3Rpb24gZ2V0UGFja2VkU2FtcGxlckF0T3V0cHV0Q29vcmRzKFxuICAgIGlucHV0SW5mbzogSW5wdXRJbmZvLCBvdXRTaGFwZUluZm86IFNoYXBlSW5mbykge1xuICBjb25zdCB0ZXhOYW1lID0gaW5wdXRJbmZvLm5hbWU7XG4gIGNvbnN0IHRleEZ1bmNTbmlwcGV0ID0gdGV4TmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHRleE5hbWUuc2xpY2UoMSk7XG4gIGNvbnN0IGZ1bmNOYW1lID0gJ2dldCcgKyB0ZXhGdW5jU25pcHBldCArICdBdE91dENvb3Jkcyc7XG4gIGNvbnN0IGluUmFuayA9IGlucHV0SW5mby5zaGFwZUluZm8ubG9naWNhbFNoYXBlLmxlbmd0aDtcbiAgY29uc3Qgb3V0UmFuayA9IG91dFNoYXBlSW5mby5sb2dpY2FsU2hhcGUubGVuZ3RoO1xuXG4gIGNvbnN0IGJyb2FkY2FzdERpbXMgPSBnZXRCcm9hZGNhc3REaW1zKFxuICAgICAgaW5wdXRJbmZvLnNoYXBlSW5mby5sb2dpY2FsU2hhcGUsIG91dFNoYXBlSW5mby5sb2dpY2FsU2hhcGUpO1xuXG4gIGNvbnN0IHR5cGUgPSBnZXRDb29yZHNEYXRhVHlwZShvdXRSYW5rKTtcbiAgY29uc3QgcmFua0RpZmYgPSBvdXRSYW5rIC0gaW5SYW5rO1xuICBsZXQgY29vcmRzU25pcHBldDogc3RyaW5nO1xuICBjb25zdCBmaWVsZHMgPSBbJ3gnLCAneScsICd6JywgJ3cnLCAndScsICd2J107XG5cbiAgaWYgKGluUmFuayA9PT0gMCkge1xuICAgIGNvb3Jkc1NuaXBwZXQgPSAnJztcbiAgfSBlbHNlIGlmIChvdXRSYW5rIDwgMiAmJiBicm9hZGNhc3REaW1zLmxlbmd0aCA+PSAxKSB7XG4gICAgY29vcmRzU25pcHBldCA9ICdjb29yZHMgPSAwOyc7XG4gIH0gZWxzZSB7XG4gICAgY29vcmRzU25pcHBldCA9XG4gICAgICAgIGJyb2FkY2FzdERpbXMubWFwKGQgPT4gYGNvb3Jkcy4ke2ZpZWxkc1tkICsgcmFua0RpZmZdfSA9IDA7YClcbiAgICAgICAgICAgIC5qb2luKCdcXG4nKTtcbiAgfVxuICBsZXQgdW5wYWNrZWRDb29yZHNTbmlwcGV0ID0gJyc7XG4gIGlmIChvdXRSYW5rIDwgMiAmJiBpblJhbmsgPiAwKSB7XG4gICAgdW5wYWNrZWRDb29yZHNTbmlwcGV0ID0gJ2Nvb3Jkcyc7XG4gIH0gZWxzZSB7XG4gICAgdW5wYWNrZWRDb29yZHNTbmlwcGV0ID0gaW5wdXRJbmZvLnNoYXBlSW5mby5sb2dpY2FsU2hhcGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgocywgaSkgPT4gYGNvb3Jkcy4ke2ZpZWxkc1tpICsgcmFua0RpZmZdfWApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5qb2luKCcsICcpO1xuICB9XG5cbiAgbGV0IG91dHB1dCA9IGByZXR1cm4gb3V0cHV0VmFsdWU7YDtcbiAgY29uc3QgaW5TaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKGlucHV0SW5mby5zaGFwZUluZm8ubG9naWNhbFNoYXBlKTtcbiAgY29uc3QgaXNJbnB1dFNjYWxhciA9IGluU2l6ZSA9PT0gMTtcbiAgY29uc3Qgb3V0U2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShvdXRTaGFwZUluZm8ubG9naWNhbFNoYXBlKTtcbiAgY29uc3QgaXNPdXRwdXRTY2FsYXIgPSBvdXRTaXplID09PSAxO1xuXG4gIGlmIChpblJhbmsgPT09IDEgJiYgIWlzSW5wdXRTY2FsYXIgJiYgIWlzT3V0cHV0U2NhbGFyKSB7XG4gICAgb3V0cHV0ID0gYFxuICAgICAgcmV0dXJuIHZlYzQob3V0cHV0VmFsdWUueHksIG91dHB1dFZhbHVlLnh5KTtcbiAgICBgO1xuICB9IGVsc2UgaWYgKGlzSW5wdXRTY2FsYXIgJiYgIWlzT3V0cHV0U2NhbGFyKSB7XG4gICAgaWYgKG91dFJhbmsgPT09IDEpIHtcbiAgICAgIG91dHB1dCA9IGBcbiAgICAgICAgcmV0dXJuIHZlYzQob3V0cHV0VmFsdWUueCwgb3V0cHV0VmFsdWUueCwgMC4sIDAuKTtcbiAgICAgIGA7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dHB1dCA9IGBcbiAgICAgICAgcmV0dXJuIHZlYzQob3V0cHV0VmFsdWUueCk7XG4gICAgICBgO1xuICAgIH1cbiAgfSBlbHNlIGlmIChicm9hZGNhc3REaW1zLmxlbmd0aCkge1xuICAgIGNvbnN0IHJvd3MgPSBpblJhbmsgLSAyO1xuICAgIGNvbnN0IGNvbHMgPSBpblJhbmsgLSAxO1xuXG4gICAgaWYgKGJyb2FkY2FzdERpbXMuaW5kZXhPZihyb3dzKSA+IC0xICYmIGJyb2FkY2FzdERpbXMuaW5kZXhPZihjb2xzKSA+IC0xKSB7XG4gICAgICBvdXRwdXQgPSBgcmV0dXJuIHZlYzQob3V0cHV0VmFsdWUueCk7YDtcbiAgICB9IGVsc2UgaWYgKGJyb2FkY2FzdERpbXMuaW5kZXhPZihyb3dzKSA+IC0xKSB7XG4gICAgICBvdXRwdXQgPSBgcmV0dXJuIHZlYzQob3V0cHV0VmFsdWUueCwgb3V0cHV0VmFsdWUueSwgYCArXG4gICAgICAgICAgYG91dHB1dFZhbHVlLngsIG91dHB1dFZhbHVlLnkpO2A7XG4gICAgfSBlbHNlIGlmIChicm9hZGNhc3REaW1zLmluZGV4T2YoY29scykgPiAtMSkge1xuICAgICAgb3V0cHV0ID0gYHJldHVybiB2ZWM0KG91dHB1dFZhbHVlLnh4LCBvdXRwdXRWYWx1ZS56eik7YDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYFxuICAgIHZlYzQgJHtmdW5jTmFtZX0oKSB7XG4gICAgICAke3R5cGV9IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgJHtjb29yZHNTbmlwcGV0fVxuICAgICAgdmVjNCBvdXRwdXRWYWx1ZSA9IGdldCR7dGV4RnVuY1NuaXBwZXR9KCR7dW5wYWNrZWRDb29yZHNTbmlwcGV0fSk7XG4gICAgICAke291dHB1dH1cbiAgICB9XG4gIGA7XG59XG5cbmZ1bmN0aW9uIGdldFNhbXBsZXJBdE91dHB1dENvb3JkcyhcbiAgICBpbnB1dEluZm86IElucHV0SW5mbywgb3V0U2hhcGVJbmZvOiBTaGFwZUluZm8pIHtcbiAgY29uc3QgdGV4TmFtZSA9IGlucHV0SW5mby5uYW1lO1xuICBjb25zdCB0ZXhGdW5jU25pcHBldCA9IHRleE5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB0ZXhOYW1lLnNsaWNlKDEpO1xuICBjb25zdCBmdW5jTmFtZSA9ICdnZXQnICsgdGV4RnVuY1NuaXBwZXQgKyAnQXRPdXRDb29yZHMnO1xuICBjb25zdCBvdXRUZXhTaGFwZSA9IG91dFNoYXBlSW5mby50ZXhTaGFwZTtcbiAgY29uc3QgaW5UZXhTaGFwZSA9IGlucHV0SW5mby5zaGFwZUluZm8udGV4U2hhcGU7XG4gIGNvbnN0IGluUmFuayA9IGlucHV0SW5mby5zaGFwZUluZm8ubG9naWNhbFNoYXBlLmxlbmd0aDtcbiAgY29uc3Qgb3V0UmFuayA9IG91dFNoYXBlSW5mby5sb2dpY2FsU2hhcGUubGVuZ3RoO1xuXG4gIGlmICghaW5wdXRJbmZvLnNoYXBlSW5mby5pc1VuaWZvcm0gJiYgaW5SYW5rID09PSBvdXRSYW5rICYmXG4gICAgICBpbnB1dEluZm8uc2hhcGVJbmZvLmZsYXRPZmZzZXQgPT0gbnVsbCAmJlxuICAgICAgdXRpbC5hcnJheXNFcXVhbChpblRleFNoYXBlLCBvdXRUZXhTaGFwZSkpIHtcbiAgICByZXR1cm4gYFxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oKSB7XG4gICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHJlc3VsdFVWKTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG5cbiAgY29uc3QgdHlwZSA9IGdldENvb3Jkc0RhdGFUeXBlKG91dFJhbmspO1xuICBjb25zdCBicm9hZGNhc3REaW1zID0gZ2V0QnJvYWRjYXN0RGltcyhcbiAgICAgIGlucHV0SW5mby5zaGFwZUluZm8ubG9naWNhbFNoYXBlLCBvdXRTaGFwZUluZm8ubG9naWNhbFNoYXBlKTtcbiAgY29uc3QgcmFua0RpZmYgPSBvdXRSYW5rIC0gaW5SYW5rO1xuICBsZXQgY29vcmRzU25pcHBldDogc3RyaW5nO1xuICBjb25zdCBmaWVsZHMgPSBbJ3gnLCAneScsICd6JywgJ3cnLCAndScsICd2J107XG5cbiAgaWYgKGluUmFuayA9PT0gMCkge1xuICAgIGNvb3Jkc1NuaXBwZXQgPSAnJztcbiAgfSBlbHNlIGlmIChvdXRSYW5rIDwgMiAmJiBicm9hZGNhc3REaW1zLmxlbmd0aCA+PSAxKSB7XG4gICAgY29vcmRzU25pcHBldCA9ICdjb29yZHMgPSAwOyc7XG4gIH0gZWxzZSB7XG4gICAgY29vcmRzU25pcHBldCA9XG4gICAgICAgIGJyb2FkY2FzdERpbXMubWFwKGQgPT4gYGNvb3Jkcy4ke2ZpZWxkc1tkICsgcmFua0RpZmZdfSA9IDA7YClcbiAgICAgICAgICAgIC5qb2luKCdcXG4nKTtcbiAgfVxuICBsZXQgdW5wYWNrZWRDb29yZHNTbmlwcGV0ID0gJyc7XG4gIGlmIChvdXRSYW5rIDwgMiAmJiBpblJhbmsgPiAwKSB7XG4gICAgdW5wYWNrZWRDb29yZHNTbmlwcGV0ID0gJ2Nvb3Jkcyc7XG4gIH0gZWxzZSB7XG4gICAgdW5wYWNrZWRDb29yZHNTbmlwcGV0ID0gaW5wdXRJbmZvLnNoYXBlSW5mby5sb2dpY2FsU2hhcGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgocywgaSkgPT4gYGNvb3Jkcy4ke2ZpZWxkc1tpICsgcmFua0RpZmZdfWApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5qb2luKCcsICcpO1xuICB9XG5cbiAgcmV0dXJuIGBcbiAgICBmbG9hdCAke2Z1bmNOYW1lfSgpIHtcbiAgICAgICR7dHlwZX0gY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAke2Nvb3Jkc1NuaXBwZXR9XG4gICAgICByZXR1cm4gZ2V0JHt0ZXhGdW5jU25pcHBldH0oJHt1bnBhY2tlZENvb3Jkc1NuaXBwZXR9KTtcbiAgICB9XG4gIGA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb29yZHNEYXRhVHlwZShyYW5rOiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAocmFuayA8PSAxKSB7XG4gICAgcmV0dXJuICdpbnQnO1xuICB9IGVsc2UgaWYgKHJhbmsgPT09IDIpIHtcbiAgICByZXR1cm4gJ2l2ZWMyJztcbiAgfSBlbHNlIGlmIChyYW5rID09PSAzKSB7XG4gICAgcmV0dXJuICdpdmVjMyc7XG4gIH0gZWxzZSBpZiAocmFuayA9PT0gNCkge1xuICAgIHJldHVybiAnaXZlYzQnO1xuICB9IGVsc2UgaWYgKHJhbmsgPT09IDUpIHtcbiAgICByZXR1cm4gJ2l2ZWM1JztcbiAgfSBlbHNlIGlmIChyYW5rID09PSA2KSB7XG4gICAgcmV0dXJuICdpdmVjNic7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgRXJyb3IoYEdQVSBmb3IgcmFuayAke3Jhbmt9IGlzIG5vdCB5ZXQgc3VwcG9ydGVkYCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFVuaWZvcm1JbmZvRnJvbVNoYXBlKFxuICAgIGlzUGFja2VkOiBib29sZWFuLCBzaGFwZTogbnVtYmVyW10sIHRleFNoYXBlOiBudW1iZXJbXSkge1xuICBjb25zdCB7bmV3U2hhcGUsIGtlcHREaW1zfSA9IHV0aWwuc3F1ZWV6ZVNoYXBlKHNoYXBlKTtcbiAgY29uc3QgcmFuayA9IHNoYXBlLmxlbmd0aDtcbiAgY29uc3QgdXNlU3F1ZWV6ZVBhY2tlZFNoYXBlID0gaXNQYWNrZWQgJiYgcmFuayA9PT0gMyAmJiBzaGFwZVswXSA9PT0gMTtcbiAgY29uc3Qgc3F1ZWV6ZVNoYXBlID0gdXNlU3F1ZWV6ZVBhY2tlZFNoYXBlID8gc2hhcGUuc2xpY2UoMSkgOiBuZXdTaGFwZTtcbiAgY29uc3QgdXNlU3F1ZWV6ZVNoYXBlID1cbiAgICAgICghaXNQYWNrZWQgJiYgcmFuayA+IDEgJiYgIXV0aWwuYXJyYXlzRXF1YWwoc2hhcGUsIHRleFNoYXBlKSAmJlxuICAgICAgIG5ld1NoYXBlLmxlbmd0aCA8IHJhbmspIHx8XG4gICAgICB1c2VTcXVlZXplUGFja2VkU2hhcGU7XG4gIGNvbnN0IHVuaWZvcm1TaGFwZSA9IHVzZVNxdWVlemVTaGFwZSA/IHNxdWVlemVTaGFwZSA6IHNoYXBlO1xuICByZXR1cm4ge3VzZVNxdWVlemVTaGFwZSwgdW5pZm9ybVNoYXBlLCBrZXB0RGltc307XG59XG5cbi8qKiBSZXR1cm5zIGEgbmV3IGlucHV0IGluZm8gKGEgY29weSkgdGhhdCBoYXMgYSBzcXVlZXplZCBsb2dpY2FsIHNoYXBlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNxdWVlemVJbnB1dEluZm8oXG4gICAgaW5JbmZvOiBJbnB1dEluZm8sIHNxdWVlemVkU2hhcGU6IG51bWJlcltdKTogSW5wdXRJbmZvIHtcbiAgLy8gRGVlcCBjb3B5LlxuICBjb25zdCBuZXdJbnB1dEluZm86IElucHV0SW5mbyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoaW5JbmZvKSk7XG4gIG5ld0lucHV0SW5mby5zaGFwZUluZm8ubG9naWNhbFNoYXBlID0gc3F1ZWV6ZWRTaGFwZTtcbiAgcmV0dXJuIG5ld0lucHV0SW5mbztcbn1cblxuZnVuY3Rpb24gZ2V0U3F1ZWV6ZWRQYXJhbXMocGFyYW1zOiBzdHJpbmdbXSwga2VwdERpbXM6IG51bWJlcltdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGtlcHREaW1zLm1hcChkID0+IHBhcmFtc1tkXSkuam9pbignLCAnKTtcbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHt1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG4vKipcbiAqIFByb2R1Y2VzIEdMU0wgY29kZSB0aGF0IGRlcml2ZXMgbG9naWNhbCBjb29yZGluYXRlcyBmcm9tIGEgZmxhdFxuICogaW5kZXguIFRoZSBjb2RlIHBlcmZvcm1zIGludGVnZXIgZGl2aXNpb24gd2l0aCBlYWNoIHN0cmlkZSBhbmQgZGVjcmVtZW50c1xuICogdGhlIGluZGV4IHVudGlsIHRoZSBpbmRleCBlcXVhbHMgdGhlIGZpbmFsIGRpbWVuc2lvbiBjb29yZGluYXRlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TG9naWNhbENvb3JkaW5hdGVzRnJvbUZsYXRJbmRleChcbiAgICBjb29yZHM6IHN0cmluZ1tdLCBzaGFwZTogbnVtYmVyW10sIGluZGV4ID0gJ2luZGV4Jyk6IHN0cmluZyB7XG4gIGNvbnN0IHN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKHNoYXBlKTtcbiAgcmV0dXJuIHN0cmlkZXNcbiAgICAgIC5tYXAoKHN0cmlkZSwgaSkgPT4ge1xuICAgICAgICBjb25zdCBsaW5lMSA9IGBpbnQgJHtjb29yZHNbaV19ID0gJHtpbmRleH0gLyAke3N0cmlkZX1gO1xuICAgICAgICBjb25zdCBsaW5lMiA9IGkgPT09IHN0cmlkZXMubGVuZ3RoIC0gMSA/XG4gICAgICAgICAgICBgaW50ICR7Y29vcmRzW2kgKyAxXX0gPSAke2luZGV4fSAtICR7Y29vcmRzW2ldfSAqICR7c3RyaWRlfWAgOlxuICAgICAgICAgICAgYGluZGV4IC09ICR7Y29vcmRzW2ldfSAqICR7c3RyaWRlfWA7XG4gICAgICAgIHJldHVybiBgJHtsaW5lMX07ICR7bGluZTJ9O2A7XG4gICAgICB9KVxuICAgICAgLmpvaW4oJycpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0T3V0cHV0TG9naWNhbENvb3JkaW5hdGVzRnJvbUZsYXRJbmRleEJ5VW5pZm9ybShcbiAgICBjb29yZHM6IHN0cmluZ1tdLCBzaGFwZTogbnVtYmVyW10sIGluZGV4ID0gJ2luZGV4Jyk6IHN0cmluZyB7XG4gIGNvbnN0IHN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKHNoYXBlKTtcbiAgcmV0dXJuIHN0cmlkZXNcbiAgICAgIC5tYXAoKF8sIGkpID0+IHtcbiAgICAgICAgY29uc3QgbGluZTEgPSBgaW50ICR7Y29vcmRzW2ldfSA9ICR7aW5kZXh9IC8gb3V0U2hhcGVTdHJpZGVzWyR7aX1dYDtcbiAgICAgICAgY29uc3QgbGluZTIgPSBpID09PSBzdHJpZGVzLmxlbmd0aCAtIDEgP1xuICAgICAgICAgICAgYGludCAke2Nvb3Jkc1tpICsgMV19ID0gJHtpbmRleH0gLSAke2Nvb3Jkc1tpXX0gKiBvdXRTaGFwZVN0cmlkZXNbJHtcbiAgICAgICAgICAgICAgICBpfV1gIDpcbiAgICAgICAgICAgIGBpbmRleCAtPSAke2Nvb3Jkc1tpXX0gKiBvdXRTaGFwZVN0cmlkZXNbJHtpfV1gO1xuICAgICAgICByZXR1cm4gYCR7bGluZTF9OyAke2xpbmUyfTtgO1xuICAgICAgfSlcbiAgICAgIC5qb2luKCcnKTtcbn1cblxuLy8gUHJvZHVjZXMgR0xTTCBjb2RlIHRoYXQgY29tcHV0ZXMgc3RyaWRlcy5cbmZ1bmN0aW9uIHN5bWJvbGljYWxseUNvbXB1dGVTdHJpZGVzKFxuICAgIGluZGljZXNBcnI6IG51bWJlcltdLCB2YXJpYWJsZU5hbWU6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgbnVtQ29vcmRzID0gaW5kaWNlc0Fyci5sZW5ndGg7XG4gIGNvbnN0IHNoYXBlID0gaW5kaWNlc0Fyci5tYXAoZCA9PiBgJHt2YXJpYWJsZU5hbWV9WyR7ZH1dYCk7XG4gIGNvbnN0IHN0cmlkZXMgPSBuZXcgQXJyYXkobnVtQ29vcmRzIC0gMSk7XG4gIHN0cmlkZXNbbnVtQ29vcmRzIC0gMl0gPSBzaGFwZVtudW1Db29yZHMgLSAxXTtcbiAgZm9yIChsZXQgaSA9IG51bUNvb3JkcyAtIDM7IGkgPj0gMDsgLS1pKSB7XG4gICAgc3RyaWRlc1tpXSA9IGAoJHtzdHJpZGVzW2kgKyAxXX0gKiAke3NoYXBlW2kgKyAxXX0pYDtcbiAgfVxuXG4gIHJldHVybiBzdHJpZGVzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TG9naWNhbENvb3JkaW5hdGVzRnJvbUZsYXRJbmRleEJ5VW5pZm9ybShcbiAgICBjb29yZHM6IHN0cmluZ1tdLCB2YXJpYWJsZU5hbWU6IHN0cmluZywgaW5kZXggPSAnaW5kZXgnKTogc3RyaW5nIHtcbiAgY29uc3QgaW5kaWNlc0FycmF5ID0gY29vcmRzLm1hcCgoXywgaSkgPT4gaSk7XG4gIGNvbnN0IHN0cmlkZXMgPSBzeW1ib2xpY2FsbHlDb21wdXRlU3RyaWRlcyhpbmRpY2VzQXJyYXksIHZhcmlhYmxlTmFtZSk7XG4gIHJldHVybiBzdHJpZGVzXG4gICAgICAubWFwKChfLCBpKSA9PiB7XG4gICAgICAgIGNvbnN0IGxpbmUxID0gYGludCAke2Nvb3Jkc1tpXX0gPSAke2luZGV4fSAvICR7c3RyaWRlc1tpXX1gO1xuICAgICAgICBjb25zdCBsaW5lMiA9IGkgPT09IHN0cmlkZXMubGVuZ3RoIC0gMSA/XG4gICAgICAgICAgICBgaW50ICR7Y29vcmRzW2kgKyAxXX0gPSAke2luZGV4fSAtICR7Y29vcmRzW2ldfSAqICR7c3RyaWRlc1tpXX1gIDpcbiAgICAgICAgICAgIGBpbmRleCAtPSAke2Nvb3Jkc1tpXX0gKiAke3N0cmlkZXNbaV19YDtcbiAgICAgICAgcmV0dXJuIGAke2xpbmUxfTsgJHtsaW5lMn07YDtcbiAgICAgIH0pXG4gICAgICAuam9pbignJyk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkVmVjKHg6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgaWYgKHgubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIGAke3hbMF19YDtcbiAgfVxuICByZXR1cm4gYHZlYyR7eC5sZW5ndGh9KCR7eC5qb2luKCcsJyl9KWA7XG59XG5cbi8qKlxuICogUHJvZHVjZXMgR0xTTCBjb2RlIHRoYXQgY29tcHV0ZXMgdGhlIGRvdCBwcm9kdWN0IG9mIHRoZSBpbnB1dCB4IGFuZCB5XG4gKiB2ZWN0b3JzLiBIYW5kbGVzIHNwbGl0dGluZyBpbnB1dHMgaW50byBpbmNyZW1lbnRzIG9mIHZlYzRzIHdoZW4gbmVjZXNzYXJ5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZG90aWZ5KHg6IHN0cmluZ1tdLCB5OiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIGlmICh4Lmxlbmd0aCAhPT0geS5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBWZWN0b3JzIHRvIGJlIGRvdHRlZCBtdXN0IGJlIG9mIHRoZSBzYW1lIGxlbmd0aCAtYCArXG4gICAgICAgIGBnb3QgJHt4Lmxlbmd0aH0gYW5kICR7eS5sZW5ndGh9YCk7XG4gIH1cblxuICBjb25zdCBzbGljZXM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IG5lYXJlc3RWZWM0ID0gTWF0aC5mbG9vcih4Lmxlbmd0aCAvIDQpO1xuICBjb25zdCBuZWFyZXN0VmVjNFJlbWFpbmRlciA9IHgubGVuZ3RoICUgNDtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IG5lYXJlc3RWZWM0OyBpKyspIHtcbiAgICBjb25zdCB4U2xpY2UgPSB4LnNsaWNlKGkgKiA0LCBpICogNCArIDQpO1xuICAgIGNvbnN0IHlTbGljZSA9IHkuc2xpY2UoaSAqIDQsIGkgKiA0ICsgNCk7XG4gICAgc2xpY2VzLnB1c2goYCR7YnVpbGRWZWMoeFNsaWNlKX0sICR7YnVpbGRWZWMoeVNsaWNlKX1gKTtcbiAgfVxuXG4gIGlmIChuZWFyZXN0VmVjNFJlbWFpbmRlciAhPT0gMCkge1xuICAgIGxldCB4U2xpY2UgPSB4LnNsaWNlKG5lYXJlc3RWZWM0ICogNCk7XG4gICAgbGV0IHlTbGljZSA9IHkuc2xpY2UobmVhcmVzdFZlYzQgKiA0KTtcbiAgICBpZiAoeFNsaWNlLmxlbmd0aCA9PT0gMSkge1xuICAgICAgeFNsaWNlID0geFNsaWNlLm1hcChkID0+IGBmbG9hdCgke2R9KWApO1xuICAgICAgeVNsaWNlID0geVNsaWNlLm1hcChkID0+IGBmbG9hdCgke2R9KWApO1xuICAgIH1cbiAgICBzbGljZXMucHVzaChgJHtidWlsZFZlYyh4U2xpY2UpfSwgJHtidWlsZFZlYyh5U2xpY2UpfWApO1xuICB9XG5cbiAgcmV0dXJuIHNsaWNlcy5tYXAoKGQsIGkpID0+IGBkb3QoJHtkfSlgKS5qb2luKCcrJyk7XG59XG5cbi8qKlxuICogUHJvZHVjZXMgR0xTTCB0aGF0IGNvbXB1dGVzIHRoZSBmbGF0IGluZGV4IGZyb20gM0QgY29vcmRpbmF0ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGbGF0SW5kZXhGcm9tM0Qoc2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSk6IHN0cmluZyB7XG4gIGNvbnN0IHN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKHNoYXBlKS5tYXAoZCA9PiBkLnRvU3RyaW5nKCkpO1xuXG4gIHJldHVybiBgXG4gIGludCBnZXRGbGF0SW5kZXgoaXZlYzMgY29vcmRzKSB7XG4gICAgcmV0dXJuIGNvb3Jkcy54ICogJHtzdHJpZGVzWzBdfSArIGNvb3Jkcy55ICogJHtzdHJpZGVzWzFdfSArIGNvb3Jkcy56O1xuICB9XG5gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmxhdEluZGV4RnJvbTNET3V0cHV0KCk6IHN0cmluZyB7XG4gIHJldHVybiBgXG4gIGludCBnZXRGbGF0SW5kZXgoaXZlYzMgY29vcmRzKSB7XG4gICAgcmV0dXJuIGNvb3Jkcy54ICogb3V0U2hhcGVTdHJpZGVzWzBdICsgY29vcmRzLnkgKiBvdXRTaGFwZVN0cmlkZXNbMV0gKyBjb29yZHMuejtcbiAgfVxuYDtcbn1cblxuZXhwb3J0IGNvbnN0IEVOQ09ERV9GTE9BVF9TTklQUEVUID0gYFxuICBjb25zdCBmbG9hdCBGTE9BVF9NQVggPSAxLjcwMTQxMTg0ZTM4O1xuICBjb25zdCBmbG9hdCBGTE9BVF9NSU4gPSAxLjE3NTQ5NDM1ZS0zODtcblxuICBsb3dwIHZlYzQgZW5jb2RlX2Zsb2F0KGhpZ2hwIGZsb2F0IHYpIHtcbiAgICBpZiAoaXNuYW4odikpIHtcbiAgICAgIHJldHVybiB2ZWM0KDI1NSwgMjU1LCAyNTUsIDI1NSk7XG4gICAgfVxuXG4gICAgaGlnaHAgZmxvYXQgYXYgPSBhYnModik7XG5cbiAgICBpZihhdiA8IEZMT0FUX01JTikge1xuICAgICAgcmV0dXJuIHZlYzQoMC4wLCAwLjAsIDAuMCwgMC4wKTtcbiAgICB9IGVsc2UgaWYodiA+IEZMT0FUX01BWCkge1xuICAgICAgcmV0dXJuIHZlYzQoMC4wLCAwLjAsIDEyOC4wLCAxMjcuMCkgLyAyNTUuMDtcbiAgICB9IGVsc2UgaWYodiA8IC1GTE9BVF9NQVgpIHtcbiAgICAgIHJldHVybiB2ZWM0KDAuMCwgMC4wLCAgMTI4LjAsIDI1NS4wKSAvIDI1NS4wO1xuICAgIH1cblxuICAgIGhpZ2hwIHZlYzQgYyA9IHZlYzQoMCwwLDAsMCk7XG5cbiAgICBoaWdocCBmbG9hdCBlID0gZmxvb3IobG9nMihhdikpO1xuICAgIGhpZ2hwIGZsb2F0IG0gPSBleHAyKGZyYWN0KGxvZzIoYXYpKSkgLSAxLjA7XG5cbiAgICBjWzJdID0gZmxvb3IoMTI4LjAgKiBtKTtcbiAgICBtIC09IGNbMl0gLyAxMjguMDtcbiAgICBjWzFdID0gZmxvb3IoMzI3NjguMCAqIG0pO1xuICAgIG0gLT0gY1sxXSAvIDMyNzY4LjA7XG4gICAgY1swXSA9IGZsb29yKDgzODg2MDguMCAqIG0pO1xuXG4gICAgaGlnaHAgZmxvYXQgZWJpYXMgPSBlICsgMTI3LjA7XG4gICAgY1szXSA9IGZsb29yKGViaWFzIC8gMi4wKTtcbiAgICBlYmlhcyAtPSBjWzNdICogMi4wO1xuICAgIGNbMl0gKz0gZmxvb3IoZWJpYXMpICogMTI4LjA7XG5cbiAgICBjWzNdICs9IDEyOC4wICogc3RlcCgwLjAsIC12KTtcblxuICAgIHJldHVybiBjIC8gMjU1LjA7XG4gIH1cbmA7XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuaW1wb3J0IHtnZXRDb29yZHNEYXRhVHlwZSwgVW5pZm9ybVR5cGV9IGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyJztcblxuZXhwb3J0IGNsYXNzIFNsaWNlUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ3NvdXJjZSddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIHJhbms6IG51bWJlcjtcbiAgY3VzdG9tVW5pZm9ybXM6IEFycmF5PHtuYW1lOiBzdHJpbmc7IGFycmF5SW5kZXg6IG51bWJlcjsgdHlwZTogVW5pZm9ybVR5cGU7fT47XG5cbiAgY29uc3RydWN0b3IoZGVzdFNpemU6IG51bWJlcltdKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IGRlc3RTaXplO1xuICAgIHRoaXMucmFuayA9IGRlc3RTaXplLmxlbmd0aDtcblxuICAgIGNvbnN0IGR0eXBlID0gZ2V0Q29vcmRzRGF0YVR5cGUodGhpcy5yYW5rKTtcbiAgICB0aGlzLmN1c3RvbVVuaWZvcm1zID0gW3tuYW1lOiAnc3RhcnQnLCBhcnJheUluZGV4OiB0aGlzLnJhbmssIHR5cGU6ICdpbnQnfV07XG4gICAgY29uc3Qgc291cmNlQ29vcmRzID0gZ2V0Q29vcmRzKHRoaXMucmFuayk7XG5cbiAgICBsZXQgYm9keTogc3RyaW5nO1xuICAgIGNvbnN0IGNvb3JkU3VtID0gZGVzdFNpemUubWFwKChfLCBpKSA9PiB7XG4gICAgICByZXR1cm4gYHNvdXJjZUxvYy4ke2Nvb3Jkc1tpXX0gPSBzdGFydFske2l9XSArIGNvb3Jkcy4ke2Nvb3Jkc1tpXX07YDtcbiAgICB9KTtcbiAgICBib2R5ID0gYFxuICAgICAgICAke2R0eXBlfSBzb3VyY2VMb2M7XG4gICAgICAgICR7ZHR5cGV9IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICAke2Nvb3JkU3VtLmpvaW4oJ1xcbicpfVxuICAgICAgYDtcbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAke2JvZHl9XG4gICAgICAgIHNldE91dHB1dChnZXRTb3VyY2UoJHtzb3VyY2VDb29yZHN9KSk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuXG5jb25zdCBjb29yZHMgPSBbJ3gnLCAneScsICd6JywgJ3cnLCAndScsICd2J107XG5cbmZ1bmN0aW9uIGdldENvb3JkcyhyYW5rOiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAocmFuayA9PT0gMSkge1xuICAgIHJldHVybiAnc291cmNlTG9jJztcbiAgfSBlbHNlIGlmIChyYW5rIDw9IDYpIHtcbiAgICByZXR1cm4gY29vcmRzLnNsaWNlKDAsIHJhbmspLm1hcCh4ID0+ICdzb3VyY2VMb2MuJyArIHgpLmpvaW4oJywnKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBFcnJvcihgU2xpY2luZyBmb3IgcmFuayAke3Jhbmt9IGlzIG5vdCB5ZXQgc3VwcG9ydGVkYCk7XG4gIH1cbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5pbXBvcnQge2dldENoYW5uZWxzfSBmcm9tICcuL3BhY2tpbmdfdXRpbCc7XG5pbXBvcnQge2dldENvb3Jkc0RhdGFUeXBlLCBVbmlmb3JtVHlwZX0gZnJvbSAnLi9zaGFkZXJfY29tcGlsZXInO1xuXG5leHBvcnQgY2xhc3MgU2xpY2VQYWNrZWRQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnc291cmNlJ107XG4gIHBhY2tlZElucHV0cyA9IHRydWU7XG4gIHBhY2tlZE91dHB1dCA9IHRydWU7XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcbiAgcmFuazogbnVtYmVyO1xuICBjdXN0b21Vbmlmb3JtczogQXJyYXk8e25hbWU6IHN0cmluZzsgYXJyYXlJbmRleDogbnVtYmVyOyB0eXBlOiBVbmlmb3JtVHlwZTt9PjtcblxuICBjb25zdHJ1Y3RvcihkZXN0U2l6ZTogbnVtYmVyW10pIHtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gZGVzdFNpemU7XG4gICAgdGhpcy5yYW5rID0gZGVzdFNpemUubGVuZ3RoO1xuICAgIHRoaXMuY3VzdG9tVW5pZm9ybXMgPSBbe25hbWU6ICdzdGFydCcsIGFycmF5SW5kZXg6IHRoaXMucmFuaywgdHlwZTogJ2ludCd9XTtcbiAgICBjb25zdCBkdHlwZSA9IGdldENvb3Jkc0RhdGFUeXBlKHRoaXMucmFuayk7XG4gICAgY29uc3QgY29vcmRzID0gZ2V0Q2hhbm5lbHMoJ2Nvb3JkcycsIHRoaXMucmFuayk7XG4gICAgY29uc3Qgc291cmNlTG9jID0gZ2V0Q2hhbm5lbHMoJ3NvdXJjZUxvYycsIHRoaXMucmFuayk7XG5cbiAgICBjb25zdCBpbm5lckRpbXMgPVxuICAgICAgICB0aGlzLnJhbmsgPT09IDEgPyAnc291cmNlTG9jJyA6IGB2ZWMyKCR7c291cmNlTG9jLnNsaWNlKC0yKS5qb2luKCl9KWA7XG4gICAgY29uc3QgZ2V0Q2hhbm5lbCA9XG4gICAgICAgIGBnZXRDaGFubmVsKGdldFNvdXJjZSgke3NvdXJjZUxvYy5qb2luKCl9KSwgJHtpbm5lckRpbXN9KWA7XG4gICAgY29uc3QgdXBwZXJSb3cgPSBgXG4gICAgICByZXN1bHQueCA9ICR7Z2V0Q2hhbm5lbH07XG4gICAgICBpZiAoKyske2Nvb3Jkc1t0aGlzLnJhbmsgLSAxXX0gPCAke2Rlc3RTaXplW3RoaXMucmFuayAtIDFdfSkge1xuICAgICAgICArKyR7c291cmNlTG9jW3RoaXMucmFuayAtIDFdfTtcbiAgICAgICAgcmVzdWx0LnkgPSAke2dldENoYW5uZWx9O1xuICAgICAgICAtLSR7c291cmNlTG9jW3RoaXMucmFuayAtIDFdfTtcbiAgICAgIH1cbiAgICBgO1xuICAgIGNvbnN0IGxvd2VyUm93ID0gdGhpcy5yYW5rID09PSAxID8gJycgOiBgXG4gICAgICAtLSR7Y29vcmRzW3RoaXMucmFuayAtIDFdfTtcbiAgICAgIGlmICgrKyR7Y29vcmRzW3RoaXMucmFuayAtIDJdfSA8ICR7ZGVzdFNpemVbdGhpcy5yYW5rIC0gMl19KSB7XG4gICAgICAgICsrJHtzb3VyY2VMb2NbdGhpcy5yYW5rIC0gMl19O1xuICAgICAgICByZXN1bHQueiA9ICR7Z2V0Q2hhbm5lbH07XG4gICAgICAgIGlmICgrKyR7Y29vcmRzW3RoaXMucmFuayAtIDFdfSA8ICR7ZGVzdFNpemVbdGhpcy5yYW5rIC0gMV19KSB7XG4gICAgICAgICAgKyske3NvdXJjZUxvY1t0aGlzLnJhbmsgLSAxXX07XG4gICAgICAgICAgcmVzdWx0LncgPSAke2dldENoYW5uZWx9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgYDtcblxuICAgIGNvbnN0IHNvdXJjZUxvY1NldHVwID0gdGhpcy5yYW5rIDw9IDQgP1xuICAgICAgICBgc291cmNlTG9jID0gY29vcmRzICtcbiAgICAgICAgICAgICR7ZHR5cGV9KCR7ZGVzdFNpemUubWFwKChfLCBpKSA9PiBgc3RhcnRbJHtpfV1gKS5qb2luKCl9KTtgIDpcbiAgICAgICAgZGVzdFNpemUubWFwKChfLCBpKSA9PiBgJHtzb3VyY2VMb2NbaV19ID0gJHtjb29yZHNbaV19ICsgc3RhcnRbJHtpfV07YClcbiAgICAgICAgICAgIC5qb2luKCdcXG4nKTtcbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAke2R0eXBlfSBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgJHtkdHlwZX0gc291cmNlTG9jO1xuICAgICAgICAke3NvdXJjZUxvY1NldHVwfVxuICAgICAgICB2ZWM0IHJlc3VsdCA9IHZlYzQoMC4pO1xuICAgICAgICAke3VwcGVyUm93fVxuICAgICAgICAke2xvd2VyUm93fVxuICAgICAgICBzZXRPdXRwdXQocmVzdWx0KTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuaW1wb3J0IHtnZXRDb29yZHNEYXRhVHlwZX0gZnJvbSAnLi9zaGFkZXJfY29tcGlsZXInO1xuXG5leHBvcnQgY2xhc3MgU3RyaWRlZFNsaWNlUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ3gnXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGJlZ2luOiBudW1iZXJbXSwgc3RyaWRlczogbnVtYmVyW10sIHNpemU6IG51bWJlcltdKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IHNpemU7XG4gICAgY29uc3QgcmFuayA9IHNpemUubGVuZ3RoO1xuICAgIGNvbnN0IGlucHV0RHR5cGUgPSBnZXRDb29yZHNEYXRhVHlwZShzaXplLmxlbmd0aCk7XG4gICAgY29uc3QgZHR5cGUgPSBnZXRDb29yZHNEYXRhVHlwZShzaXplLmxlbmd0aCk7XG5cbiAgICBsZXQgbmV3Q29vcmRzID0gJyc7XG4gICAgaWYgKHJhbmsgPT09IDEpIHtcbiAgICAgIG5ld0Nvb3JkcyA9ICdjb29yZHMgKiBzdHJpZGVzICsgYmVnaW4nO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgb3V0cHV0QXhpcyA9IDA7XG4gICAgICBuZXdDb29yZHMgPVxuICAgICAgICAgIHNpemUubWFwKChfLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgb3V0cHV0QXhpcysrO1xuICAgICAgICAgICAgICAgIHJldHVybiBzaXplLmxlbmd0aCA9PT0gMSA/XG4gICAgICAgICAgICAgICAgICAgIGBjb29yZHMgKiBzdHJpZGVzWyR7aX1dICsgYmVnaW5bJHtpfV1gIDpcbiAgICAgICAgICAgICAgICAgICAgYGNvb3Jkc1ske291dHB1dEF4aXMgLSAxfV0gKiBzdHJpZGVzWyR7aX1dICsgYmVnaW5bJHtpfV1gO1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAuam9pbignLCcpO1xuICAgIH1cblxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICAke2lucHV0RHR5cGV9IGJlZ2luID0gJHtpbnB1dER0eXBlfSgke2JlZ2lufSk7XG4gICAgICAke2lucHV0RHR5cGV9IHN0cmlkZXMgPSAke2lucHV0RHR5cGV9KCR7c3RyaWRlc30pO1xuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICR7ZHR5cGV9IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBzZXRPdXRwdXQoZ2V0WCgke25ld0Nvb3Jkc30pKTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBEYXRhSWQsIERhdGFUeXBlLCBlbnYsIFRlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmV4cG9ydCBlbnVtIFBhY2tpbmdTY2hlbWUge1xuICAvKipcbiAgICogQWxsIHZhbHVlcyBpbiBhIHNpbmdsZSB0ZXhlbCBhcmUgZGVuc2VseSBwYWNrZWQgd2l0aG91dCBhbnkgY29uc3RyYWludHMuXG4gICAqXG4gICAqIFRoaXMgaXMgaG93IHRoZSBzaGFkZXIgZW5jb2RlcyBhIHRlbnNvciB3aXRoIHNoYXBlID0gWzIsIDMsIDRdXG4gICAqIChpbmRpY2VzIGFyZSBbYmF0Y2gsIHJvdywgY29sXSkuXG4gICAqXG4gICAqIDAwMHwwMDEgICAwMTB8MDExICAgMDIwfDAyMVxuICAgKiAtLS0tLS0tICAgLS0tLS0tLSAgIC0tLS0tLS1cbiAgICogMDAyfDAwMyAgIDAxMnwwMTMgICAwMjJ8MDIzXG4gICAqXG4gICAqIDEwMHwxMDEgICAxMTB8MTExICAgMTIwfDEyMVxuICAgKiAtLS0tLS0tICAgLS0tLS0tLSAgIC0tLS0tLS1cbiAgICogMTAyfDEwMyAgIDExMnwxMTMgICAxMjJ8MTIzXG4gICAqXG4gICAqL1xuICBERU5TRSxcblxuICAvKipcbiAgICogU2luZ2xlIHRleGVscyBjb250YWluIG9ubHkgdmFsdWVzIGZyb20gdGhlIHNhbWUgYmF0Y2gsIGFuZCBmcm9tIGFkamFjZW50XG4gICAqIHJvd3MgYW5kIGNvbHVtbnMuXG4gICAqXG4gICAqIFRoaXMgaXMgaG93IHRoZSBzaGFkZXIgZW5jb2RlcyBhIHRlbnNvciB3aXRoIHNoYXBlID0gWzIsIDMsIDVdXG4gICAqIChpbmRpY2VzIGFyZSBbYmF0Y2gsIHJvdywgY29sXSkuXG4gICAqXG4gICAqIDAwMHwwMDEgICAwMDJ8MDAzICAgMDA0fHh4eCAgIDAyMHwwMjEgICAwMjJ8MDIzICAgMDI0fHh4eFxuICAgKiAtLS0tLS0tICAgLS0tLS0tLSAgIC0tLS0tLS0gICAtLS0tLS0tICAgLS0tLS0tLSAgIC0tLS0tLS1cbiAgICogMDEwfDAxMSAgIDAxMnwwMTMgICAwMTR8eHh4ICAgeHh4fHh4eCAgIHh4eHx4eHggICB4eHh8eHh4XG4gICAqXG4gICAqIDEwMHwxMDEgICAxMDJ8MTAzICAgMTA0fHh4eCAgIDEyMHwxMjEgICAxMjJ8MTIzICAgMTI0fHh4eFxuICAgKiAtLS0tLS0tICAgLS0tLS0tLSAgIC0tLS0tLS0gICAtLS0tLS0tICAgLS0tLS0tLSAgIC0tLS0tLS1cbiAgICogMTEwfDExMSAgIDExMnwxMTMgICAxMTR8eHh4ICAgeHh4fHh4eCAgIHh4eHx4eHggICB4eHh8eHh4XG4gICAqXG4gICAqL1xuICBTSEFSRURfQkFUQ0hcbn1cblxuZXhwb3J0IGVudW0gVGV4dHVyZVVzYWdlIHtcbiAgUkVOREVSLFxuICBVUExPQUQsXG4gIFBJWEVMUyxcbiAgRE9XTkxPQURcbn1cblxuZXhwb3J0IGVudW0gUGh5c2ljYWxUZXh0dXJlVHlwZSB7XG4gIFVOUEFDS0VEX0ZMT0FUMTYsXG4gIFVOUEFDS0VEX0ZMT0FUMzIsXG4gIFBBQ0tFRF80WDFfVU5TSUdORURfQllURSxcbiAgUEFDS0VEXzJYMl9GTE9BVDMyLFxuICBQQUNLRURfMlgyX0ZMT0FUMTZcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUZXh0dXJlRGF0YSB7XG4gIC8vIFJlcXVpcmVkLlxuICBzaGFwZTogbnVtYmVyW107XG4gIGR0eXBlOiBEYXRhVHlwZTtcblxuICAvLyBPcHRpb25hbC5cbiAgdmFsdWVzPzogYmFja2VuZF91dGlsLkJhY2tlbmRWYWx1ZXM7XG4gIHRleHR1cmU/OiBXZWJHTFRleHR1cmU7XG4gIC8vIEZvciBjb21wbGV4IG51bWJlcnMsIHRoZSByZWFsIGFuZCBpbWFnaW5hcnkgcGFydHMgYXJlIHN0b3JlZCBhcyB0aGVpciBvd25cbiAgLy8gaW5kaXZpZHVhbCB0ZW5zb3JJbmZvcywgd2l0aCBhIHBhcmVudCBqb2luaW5nIHRoZSB0d28gd2l0aCB0aGVcbiAgLy8gY29tcGxleFRlbnNvcnMgZmllbGQuIFdoZW4gdGhpcyBpcyBkZWZpbmVkLCB0ZXh0dXJlIHdpbGwgYmUgbnVsbC5cbiAgY29tcGxleFRlbnNvckluZm9zPzoge3JlYWw6IFRlbnNvckluZm8sIGltYWc6IFRlbnNvckluZm99O1xuICAvKiogW3Jvd3MsIGNvbHVtbnNdIHNoYXBlIG9mIHRoZSB0ZXh0dXJlLiAqL1xuICB0ZXhTaGFwZT86IFtudW1iZXIsIG51bWJlcl07XG4gIHVzYWdlPzogVGV4dHVyZVVzYWdlO1xuICBpc1BhY2tlZD86IGJvb2xlYW47XG5cbiAgcmVmQ291bnQ6IG51bWJlcjtcblxuICAvLyBBdmFpbGFibGUgd2hlbiB0aGUgdGVuc29yIGhhcyBiZWVuIHNsaWNlZC5cbiAgc2xpY2U/OiB7XG4gICAgLy8gT2Zmc2V0IGluIHRoZSAnZmxhdCBpbmRleCcgc3BhY2UuXG4gICAgZmxhdE9mZnNldDogbnVtYmVyO1xuICAgIC8vIFVzZWQgZm9yIGNvdW50aW5nIGhvdyBtYW55IHNsaWNlZCB0ZW5zb3JzIHBvaW50IHRvIHRoZSBzYW1lIHRleHR1cmUuXG4gICAgb3JpZ0RhdGFJZDogRGF0YUlkO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VW5wYWNrZWRNYXRyaXhUZXh0dXJlU2hhcGVXaWR0aEhlaWdodChcbiAgICByb3dzOiBudW1iZXIsIGNvbHVtbnM6IG51bWJlcik6IFtudW1iZXIsIG51bWJlcl0ge1xuICByZXR1cm4gW2NvbHVtbnMsIHJvd3NdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VW5wYWNrZWRBcnJheVNpemVGcm9tTWF0cml4U2l6ZShcbiAgICBtYXRyaXhTaXplOiBudW1iZXIsIGNoYW5uZWxzUGVyVGV4dHVyZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIG1hdHJpeFNpemUgKiBjaGFubmVsc1BlclRleHR1cmU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb2xvck1hdHJpeFRleHR1cmVTaGFwZVdpZHRoSGVpZ2h0KFxuICAgIHJvd3M6IG51bWJlciwgY29sdW1uczogbnVtYmVyKTogW251bWJlciwgbnVtYmVyXSB7XG4gIHJldHVybiBbY29sdW1ucyAqIDQsIHJvd3NdO1xufVxuXG4vKipcbiAqIEdldCBzaGFwZSBmb3IgZGVuc2VseSBwYWNrZWQgUkdCQSB0ZXh0dXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVuc2VUZXhTaGFwZShzaGFwZTogbnVtYmVyW10pOiBbbnVtYmVyLCBudW1iZXJdIHtcbiAgY29uc3Qgc2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShzaGFwZSk7XG4gIGNvbnN0IHRleGVsc05lZWRlZCA9IE1hdGguY2VpbChzaXplIC8gNCk7XG4gIHJldHVybiB1dGlsLnNpemVUb1NxdWFyaXNoU2hhcGUodGV4ZWxzTmVlZGVkKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1hdHJpeFNpemVGcm9tVW5wYWNrZWRBcnJheVNpemUoXG4gICAgdW5wYWNrZWRTaXplOiBudW1iZXIsIGNoYW5uZWxzUGVyVGV4dHVyZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgaWYgKHVucGFja2VkU2l6ZSAlIGNoYW5uZWxzUGVyVGV4dHVyZSAhPT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYHVucGFja2VkU2l6ZSAoJHt1bnBhY2tlZFNpemV9KSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgYCArXG4gICAgICAgIGAke2NoYW5uZWxzUGVyVGV4dHVyZX1gKTtcbiAgfVxuICByZXR1cm4gdW5wYWNrZWRTaXplIC8gY2hhbm5lbHNQZXJUZXh0dXJlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlTWF0cml4RnJvbVVucGFja2VkQ29sb3JSR0JBQXJyYXkoXG4gICAgdW5wYWNrZWRBcnJheTogRmxvYXQzMkFycmF5LCBtYXRyaXg6IEZsb2F0MzJBcnJheSwgY2hhbm5lbHM6IG51bWJlcikge1xuICBjb25zdCByZXF1aXJlZFNpemUgPSB1bnBhY2tlZEFycmF5Lmxlbmd0aCAqIGNoYW5uZWxzIC8gNDtcbiAgaWYgKG1hdHJpeC5sZW5ndGggPCByZXF1aXJlZFNpemUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBtYXRyaXggbGVuZ3RoICgke21hdHJpeC5sZW5ndGh9KSBtdXN0IGJlID49ICR7cmVxdWlyZWRTaXplfWApO1xuICB9XG4gIGxldCBkc3QgPSAwO1xuICBmb3IgKGxldCBzcmMgPSAwOyBzcmMgPCB1bnBhY2tlZEFycmF5Lmxlbmd0aDsgc3JjICs9IDQpIHtcbiAgICBmb3IgKGxldCBjID0gMDsgYyA8IGNoYW5uZWxzOyBjKyspIHtcbiAgICAgIG1hdHJpeFtkc3QrK10gPSB1bnBhY2tlZEFycmF5W3NyYyArIGNdO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFja2VkTWF0cml4VGV4dHVyZVNoYXBlV2lkdGhIZWlnaHQoXG4gICAgcm93czogbnVtYmVyLCBjb2x1bW5zOiBudW1iZXIpOiBbbnVtYmVyLCBudW1iZXJdIHtcbiAgcmV0dXJuIFtcbiAgICBNYXRoLm1heCgxLCBNYXRoLmNlaWwoY29sdW1ucyAvIDIpKSwgTWF0aC5tYXgoMSwgTWF0aC5jZWlsKHJvd3MgLyAyKSlcbiAgXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFBhY2tlZFJHQkFBcnJheVNpemVGcm9tTWF0cml4U2hhcGUoXG4gICAgcm93czogbnVtYmVyLCBjb2x1bW5zOiBudW1iZXIpOiBudW1iZXIge1xuICBjb25zdCBbdywgaF0gPSBnZXRQYWNrZWRNYXRyaXhUZXh0dXJlU2hhcGVXaWR0aEhlaWdodChyb3dzLCBjb2x1bW5zKTtcbiAgcmV0dXJuIHcgKiBoICogNDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUZXh0dXJlQ29uZmlnIHtcbiAgaW50ZXJuYWxGb3JtYXRGbG9hdDogbnVtYmVyO1xuICB0ZXh0dXJlRm9ybWF0RmxvYXQ6IG51bWJlcjtcbiAgaW50ZXJuYWxGb3JtYXRQYWNrZWRIYWxmRmxvYXQ6IG51bWJlcjtcbiAgaW50ZXJuYWxGb3JtYXRIYWxmRmxvYXQ6IG51bWJlcjtcbiAgaW50ZXJuYWxGb3JtYXRQYWNrZWRGbG9hdDogbnVtYmVyO1xuXG4gIC8vIFRoZSBmb3JtYXQgdG8gdXNlIGR1cmluZyBhIGdsLnJlYWRQaXhlbHMgY2FsbC5cbiAgZG93bmxvYWRUZXh0dXJlRm9ybWF0OiBudW1iZXI7XG4gIC8vIEhvdyBtYW55IGNoYW5uZWxzIG5lZWQgdG8gYmUgdW5wYWNrZWQgYWZ0ZXIgYSBnbC5yZWFkUGl4ZWxzIGNhbGwuXG4gIGRvd25sb2FkVW5wYWNrTnVtQ2hhbm5lbHM6IG51bWJlcjtcblxuICBkZWZhdWx0TnVtQ2hhbm5lbHM6IG51bWJlcjtcbiAgdGV4dHVyZVR5cGVIYWxmRmxvYXQ6IG51bWJlcjtcbiAgdGV4dHVyZVR5cGVGbG9hdDogbnVtYmVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGV4dHVyZUNvbmZpZyhcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gICAgZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgdGV4dHVyZUhhbGZGbG9hdEV4dGVuc2lvbj86IGFueSk6IFRleHR1cmVDb25maWcge1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gIGNvbnN0IGdsYW55ID0gZ2wgYXMgYW55O1xuXG4gIGxldCBpbnRlcm5hbEZvcm1hdEZsb2F0OiBudW1iZXI7XG4gIGxldCBpbnRlcm5hbEZvcm1hdEhhbGZGbG9hdDogbnVtYmVyO1xuICBsZXQgaW50ZXJuYWxGb3JtYXRQYWNrZWRIYWxmRmxvYXQ6IG51bWJlcjtcbiAgbGV0IGludGVybmFsRm9ybWF0UGFja2VkRmxvYXQ6IG51bWJlcjtcbiAgbGV0IHRleHR1cmVGb3JtYXRGbG9hdDogbnVtYmVyO1xuXG4gIGxldCBkb3dubG9hZFRleHR1cmVGb3JtYXQ6IG51bWJlcjtcbiAgbGV0IGRvd25sb2FkVW5wYWNrTnVtQ2hhbm5lbHM6IG51bWJlcjtcblxuICBsZXQgZGVmYXVsdE51bUNoYW5uZWxzOiBudW1iZXI7XG4gIGxldCB0ZXh0dXJlVHlwZUhhbGZGbG9hdDogbnVtYmVyO1xuICBsZXQgdGV4dHVyZVR5cGVGbG9hdDogbnVtYmVyO1xuXG4gIGlmIChlbnYoKS5nZXROdW1iZXIoJ1dFQkdMX1ZFUlNJT04nKSA9PT0gMikge1xuICAgIGludGVybmFsRm9ybWF0RmxvYXQgPSBnbGFueS5SMzJGO1xuICAgIGludGVybmFsRm9ybWF0SGFsZkZsb2F0ID0gZ2xhbnkuUjE2RjtcbiAgICBpbnRlcm5hbEZvcm1hdFBhY2tlZEhhbGZGbG9hdCA9IGdsYW55LlJHQkExNkY7XG4gICAgaW50ZXJuYWxGb3JtYXRQYWNrZWRGbG9hdCA9IGdsYW55LlJHQkEzMkY7XG4gICAgdGV4dHVyZUZvcm1hdEZsb2F0ID0gZ2xhbnkuUkVEO1xuICAgIGRvd25sb2FkVW5wYWNrTnVtQ2hhbm5lbHMgPSA0O1xuICAgIGRlZmF1bHROdW1DaGFubmVscyA9IDE7XG4gICAgdGV4dHVyZVR5cGVIYWxmRmxvYXQgPSBnbGFueS5IQUxGX0ZMT0FUO1xuICAgIHRleHR1cmVUeXBlRmxvYXQgPSBnbGFueS5GTE9BVDtcbiAgfSBlbHNlIHtcbiAgICBpbnRlcm5hbEZvcm1hdEZsb2F0ID0gZ2wuUkdCQTtcbiAgICBpbnRlcm5hbEZvcm1hdEhhbGZGbG9hdCA9IGdsLlJHQkE7XG4gICAgaW50ZXJuYWxGb3JtYXRQYWNrZWRIYWxmRmxvYXQgPSBnbC5SR0JBO1xuICAgIGludGVybmFsRm9ybWF0UGFja2VkRmxvYXQgPSBnbGFueS5SR0JBO1xuICAgIHRleHR1cmVGb3JtYXRGbG9hdCA9IGdsLlJHQkE7XG4gICAgZG93bmxvYWRVbnBhY2tOdW1DaGFubmVscyA9IDQ7XG4gICAgZGVmYXVsdE51bUNoYW5uZWxzID0gNDtcbiAgICB0ZXh0dXJlVHlwZUhhbGZGbG9hdCA9IHRleHR1cmVIYWxmRmxvYXRFeHRlbnNpb24gIT0gbnVsbCA/XG4gICAgICAgIHRleHR1cmVIYWxmRmxvYXRFeHRlbnNpb24uSEFMRl9GTE9BVF9PRVMgOlxuICAgICAgICBudWxsO1xuICAgIHRleHR1cmVUeXBlRmxvYXQgPSBnbC5GTE9BVDtcbiAgfVxuICBkb3dubG9hZFRleHR1cmVGb3JtYXQgPSBnbC5SR0JBO1xuXG4gIHJldHVybiB7XG4gICAgaW50ZXJuYWxGb3JtYXRGbG9hdCxcbiAgICBpbnRlcm5hbEZvcm1hdEhhbGZGbG9hdCxcbiAgICBpbnRlcm5hbEZvcm1hdFBhY2tlZEhhbGZGbG9hdCxcbiAgICBpbnRlcm5hbEZvcm1hdFBhY2tlZEZsb2F0LFxuICAgIHRleHR1cmVGb3JtYXRGbG9hdCxcbiAgICBkb3dubG9hZFRleHR1cmVGb3JtYXQsXG4gICAgZG93bmxvYWRVbnBhY2tOdW1DaGFubmVscyxcbiAgICBkZWZhdWx0TnVtQ2hhbm5lbHMsXG4gICAgdGV4dHVyZVR5cGVIYWxmRmxvYXQsXG4gICAgdGV4dHVyZVR5cGVGbG9hdFxuICB9O1xufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2Vudn0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtHUEdQVUNvbnRleHR9IGZyb20gJy4vZ3BncHVfY29udGV4dCc7XG5pbXBvcnQge2dldEludGVybmFsRm9ybWF0Rm9yRmxvYXQxNk1hdHJpeFRleHR1cmUsIGdldEludGVybmFsRm9ybWF0Rm9yRmxvYXQxNlBhY2tlZE1hdHJpeFRleHR1cmUsIGdldEludGVybmFsRm9ybWF0Rm9yRmxvYXQzMk1hdHJpeFRleHR1cmUsIGdldEludGVybmFsRm9ybWF0Rm9yUGFja2VkTWF0cml4VGV4dHVyZSwgZ2V0SW50ZXJuYWxGb3JtYXRGb3JVbnNpZ25lZEJ5dGVzTWF0cml4VGV4dHVyZX0gZnJvbSAnLi9ncGdwdV91dGlsJztcbmltcG9ydCB7Z2V0UGFja2VkTWF0cml4VGV4dHVyZVNoYXBlV2lkdGhIZWlnaHQsIGdldFVucGFja2VkTWF0cml4VGV4dHVyZVNoYXBlV2lkdGhIZWlnaHQsIFBoeXNpY2FsVGV4dHVyZVR5cGUsIFRleHR1cmVDb25maWcsIFRleHR1cmVVc2FnZX0gZnJvbSAnLi90ZXhfdXRpbCc7XG5cbmV4cG9ydCBjbGFzcyBUZXh0dXJlTWFuYWdlciB7XG4gIHByaXZhdGUgbnVtVXNlZFRleHR1cmVzID0gMDtcbiAgcHJpdmF0ZSBudW1GcmVlVGV4dHVyZXMgPSAwO1xuICBwcml2YXRlIF9udW1CeXRlc0FsbG9jYXRlZCA9IDA7XG4gIHByaXZhdGUgX251bUJ5dGVzRnJlZSA9IDA7ICAvLyBIb3cgbWFueSBieXRlcyB0aGF0IGhhdmUgYmVlbiBhbGxvY2F0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFyZSBhdmFpbGFibGUgZm9yIHJldXNlLlxuICBwcml2YXRlIGZyZWVUZXh0dXJlczoge1tzaGFwZTogc3RyaW5nXTogV2ViR0xUZXh0dXJlW119ID0ge307XG4gIHByaXZhdGUgbG9nRW5hYmxlZCA9IGZhbHNlO1xuICBwcml2YXRlIHVzZWRUZXh0dXJlczoge1tzaGFwZTogc3RyaW5nXTogV2ViR0xUZXh0dXJlW119ID0ge307XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBncGdwdTogR1BHUFVDb250ZXh0KSB7fVxuXG4gIGFjcXVpcmVUZXh0dXJlKFxuICAgICAgc2hhcGVSQzogW251bWJlciwgbnVtYmVyXSwgdXNhZ2U6IFRleHR1cmVVc2FnZSxcbiAgICAgIGlzUGFja2VkOiBib29sZWFuKTogV2ViR0xUZXh0dXJlIHtcbiAgICBjb25zdCBwaHlzaWNhbFRleFR5cGUgPSBnZXRQaHlzaWNhbEZyb21Mb2dpY2FsVGV4dHVyZVR5cGUodXNhZ2UsIGlzUGFja2VkKTtcblxuICAgIGNvbnN0IHNoYXBlS2V5ID0gZ2V0S2V5RnJvbVRleHR1cmVTaGFwZShzaGFwZVJDLCBwaHlzaWNhbFRleFR5cGUsIGlzUGFja2VkKTtcbiAgICBpZiAoIShzaGFwZUtleSBpbiB0aGlzLmZyZWVUZXh0dXJlcykpIHtcbiAgICAgIHRoaXMuZnJlZVRleHR1cmVzW3NoYXBlS2V5XSA9IFtdO1xuICAgIH1cbiAgICBpZiAoIShzaGFwZUtleSBpbiB0aGlzLnVzZWRUZXh0dXJlcykpIHtcbiAgICAgIHRoaXMudXNlZFRleHR1cmVzW3NoYXBlS2V5XSA9IFtdO1xuICAgIH1cblxuICAgIGNvbnN0IHRleEJ5dGVzID0gY29tcHV0ZUJ5dGVzKFxuICAgICAgICBzaGFwZVJDLCBwaHlzaWNhbFRleFR5cGUsIHRoaXMuZ3BncHUuZ2wsIHRoaXMuZ3BncHUudGV4dHVyZUNvbmZpZyxcbiAgICAgICAgaXNQYWNrZWQpO1xuXG4gICAgaWYgKHRoaXMuZnJlZVRleHR1cmVzW3NoYXBlS2V5XS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLm51bUZyZWVUZXh0dXJlcy0tO1xuICAgICAgdGhpcy5udW1Vc2VkVGV4dHVyZXMrKztcbiAgICAgIHRoaXMuX251bUJ5dGVzRnJlZSAtPSB0ZXhCeXRlcztcbiAgICAgIHRoaXMubG9nKCk7XG4gICAgICBjb25zdCBuZXdUZXh0dXJlID0gdGhpcy5mcmVlVGV4dHVyZXNbc2hhcGVLZXldLnNoaWZ0KCk7XG4gICAgICB0aGlzLnVzZWRUZXh0dXJlc1tzaGFwZUtleV0ucHVzaChuZXdUZXh0dXJlKTtcbiAgICAgIHJldHVybiBuZXdUZXh0dXJlO1xuICAgIH1cblxuICAgIGxldCBuZXdUZXh0dXJlOiBXZWJHTFRleHR1cmU7XG4gICAgaWYgKHBoeXNpY2FsVGV4VHlwZSA9PT0gUGh5c2ljYWxUZXh0dXJlVHlwZS5QQUNLRURfMlgyX0ZMT0FUMzIpIHtcbiAgICAgIG5ld1RleHR1cmUgPSB0aGlzLmdwZ3B1LmNyZWF0ZVBhY2tlZE1hdHJpeFRleHR1cmUoc2hhcGVSQ1swXSwgc2hhcGVSQ1sxXSk7XG4gICAgfSBlbHNlIGlmIChwaHlzaWNhbFRleFR5cGUgPT09IFBoeXNpY2FsVGV4dHVyZVR5cGUuUEFDS0VEXzJYMl9GTE9BVDE2KSB7XG4gICAgICBuZXdUZXh0dXJlID1cbiAgICAgICAgICB0aGlzLmdwZ3B1LmNyZWF0ZUZsb2F0MTZQYWNrZWRNYXRyaXhUZXh0dXJlKHNoYXBlUkNbMF0sIHNoYXBlUkNbMV0pO1xuICAgIH0gZWxzZSBpZiAocGh5c2ljYWxUZXhUeXBlID09PSBQaHlzaWNhbFRleHR1cmVUeXBlLlVOUEFDS0VEX0ZMT0FUMzIpIHtcbiAgICAgIG5ld1RleHR1cmUgPVxuICAgICAgICAgIHRoaXMuZ3BncHUuY3JlYXRlRmxvYXQzMk1hdHJpeFRleHR1cmUoc2hhcGVSQ1swXSwgc2hhcGVSQ1sxXSk7XG4gICAgfSBlbHNlIGlmIChwaHlzaWNhbFRleFR5cGUgPT09IFBoeXNpY2FsVGV4dHVyZVR5cGUuVU5QQUNLRURfRkxPQVQxNikge1xuICAgICAgbmV3VGV4dHVyZSA9XG4gICAgICAgICAgdGhpcy5ncGdwdS5jcmVhdGVGbG9hdDE2TWF0cml4VGV4dHVyZShzaGFwZVJDWzBdLCBzaGFwZVJDWzFdKTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgICBwaHlzaWNhbFRleFR5cGUgPT09IFBoeXNpY2FsVGV4dHVyZVR5cGUuUEFDS0VEXzRYMV9VTlNJR05FRF9CWVRFKSB7XG4gICAgICBuZXdUZXh0dXJlID1cbiAgICAgICAgICB0aGlzLmdwZ3B1LmNyZWF0ZVVuc2lnbmVkQnl0ZXNNYXRyaXhUZXh0dXJlKHNoYXBlUkNbMF0sIHNoYXBlUkNbMV0pO1xuICAgIH1cbiAgICB0aGlzLnVzZWRUZXh0dXJlc1tzaGFwZUtleV0ucHVzaChuZXdUZXh0dXJlKTtcblxuICAgIHRoaXMubnVtVXNlZFRleHR1cmVzKys7XG4gICAgdGhpcy5fbnVtQnl0ZXNBbGxvY2F0ZWQgKz0gdGV4Qnl0ZXM7XG4gICAgdGhpcy5sb2coKTtcblxuICAgIHJldHVybiBuZXdUZXh0dXJlO1xuICB9XG5cbiAgcmVsZWFzZVRleHR1cmUoXG4gICAgICB0ZXh0dXJlOiBXZWJHTFRleHR1cmUsIHNoYXBlOiBbbnVtYmVyLCBudW1iZXJdLFxuICAgICAgbG9naWNhbFRleFR5cGU6IFRleHR1cmVVc2FnZSwgaXNQYWNrZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5mcmVlVGV4dHVyZXMgPT0gbnVsbCkge1xuICAgICAgLy8gQWxyZWFkeSBkaXNwb3NlZC5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcGh5c2ljYWxUZXhUeXBlID1cbiAgICAgICAgZ2V0UGh5c2ljYWxGcm9tTG9naWNhbFRleHR1cmVUeXBlKGxvZ2ljYWxUZXhUeXBlLCBpc1BhY2tlZCk7XG4gICAgY29uc3Qgc2hhcGVLZXkgPSBnZXRLZXlGcm9tVGV4dHVyZVNoYXBlKHNoYXBlLCBwaHlzaWNhbFRleFR5cGUsIGlzUGFja2VkKTtcbiAgICBpZiAoIShzaGFwZUtleSBpbiB0aGlzLmZyZWVUZXh0dXJlcykpIHtcbiAgICAgIHRoaXMuZnJlZVRleHR1cmVzW3NoYXBlS2V5XSA9IFtdO1xuICAgIH1cblxuICAgIGNvbnN0IHRleEJ5dGVzID0gY29tcHV0ZUJ5dGVzKFxuICAgICAgICBzaGFwZSwgcGh5c2ljYWxUZXhUeXBlLCB0aGlzLmdwZ3B1LmdsLCB0aGlzLmdwZ3B1LnRleHR1cmVDb25maWcsXG4gICAgICAgIGlzUGFja2VkKTtcbiAgICBjb25zdCBkZWxldGVUZXhUaHJlc2hvbGQgPSBlbnYoKS5nZXQoJ1dFQkdMX0RFTEVURV9URVhUVVJFX1RIUkVTSE9MRCcpO1xuICAgIGlmIChkZWxldGVUZXhUaHJlc2hvbGQgIT09IC0xICYmXG4gICAgICAgIHRoaXMuX251bUJ5dGVzQWxsb2NhdGVkID4gZGVsZXRlVGV4VGhyZXNob2xkKSB7XG4gICAgICB0aGlzLmdwZ3B1LmRlbGV0ZU1hdHJpeFRleHR1cmUodGV4dHVyZSk7XG4gICAgICB0aGlzLl9udW1CeXRlc0FsbG9jYXRlZCAtPSB0ZXhCeXRlcztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5mcmVlVGV4dHVyZXNbc2hhcGVLZXldLnB1c2godGV4dHVyZSk7XG4gICAgICB0aGlzLm51bUZyZWVUZXh0dXJlcysrO1xuICAgICAgdGhpcy5fbnVtQnl0ZXNGcmVlICs9IHRleEJ5dGVzO1xuICAgIH1cblxuICAgIHRoaXMubnVtVXNlZFRleHR1cmVzLS07XG5cbiAgICBjb25zdCB0ZXhMaXN0ID0gdGhpcy51c2VkVGV4dHVyZXNbc2hhcGVLZXldO1xuICAgIGNvbnN0IHRleEluZGV4ID0gdGV4TGlzdC5pbmRleE9mKHRleHR1cmUpO1xuICAgIGlmICh0ZXhJbmRleCA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnQ2Fubm90IHJlbGVhc2UgYSB0ZXh0dXJlIHRoYXQgd2FzIG5ldmVyIHByb3ZpZGVkIGJ5IHRoaXMgJyArXG4gICAgICAgICAgJ3RleHR1cmUgbWFuYWdlcicpO1xuICAgIH1cbiAgICB0ZXhMaXN0LnNwbGljZSh0ZXhJbmRleCwgMSk7XG4gICAgdGhpcy5sb2coKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9nKCkge1xuICAgIGlmICghdGhpcy5sb2dFbmFibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRvdGFsID0gdGhpcy5udW1GcmVlVGV4dHVyZXMgKyB0aGlzLm51bVVzZWRUZXh0dXJlcztcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgJ0ZyZWUvVXNlZCcsIGAke3RoaXMubnVtRnJlZVRleHR1cmVzfSAvICR7dGhpcy5udW1Vc2VkVGV4dHVyZXN9YCxcbiAgICAgICAgYCgke3RvdGFsfSlgKTtcbiAgICBjb25zdCBmcmVlUmF0aW8gPSB0aGlzLl9udW1CeXRlc0ZyZWUgLyB0aGlzLl9udW1CeXRlc0FsbG9jYXRlZDtcbiAgICBjb25zb2xlLmxvZyhgQnl0ZXMgYWxsb2NhdGVkOiAke3RoaXMuX251bUJ5dGVzQWxsb2NhdGVkfWApO1xuICAgIGNvbnNvbGUubG9nKGBCeXRlcyB1bnVzZWQ6ICR7dGhpcy5fbnVtQnl0ZXNGcmVlfSAoJHtcbiAgICAgICAgTWF0aC5yb3VuZCgxMDAgKiBmcmVlUmF0aW8pfSUpYCk7XG4gIH1cblxuICBnZXQgbnVtQnl0ZXNBbGxvY2F0ZWQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fbnVtQnl0ZXNBbGxvY2F0ZWQ7XG4gIH1cblxuICBnZXQgbnVtQnl0ZXNGcmVlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX251bUJ5dGVzRnJlZTtcbiAgfVxuXG4gIGdldE51bVVzZWRUZXh0dXJlcygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLm51bVVzZWRUZXh0dXJlcztcbiAgfVxuXG4gIGdldE51bUZyZWVUZXh0dXJlcygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLm51bUZyZWVUZXh0dXJlcztcbiAgfVxuXG4gIGRpc3Bvc2UoKSB7XG4gICAgaWYgKHRoaXMuZnJlZVRleHR1cmVzID09IG51bGwpIHtcbiAgICAgIC8vIEFscmVhZHkgZGlzcG9zZWQuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3QgdGV4U2hhcGUgaW4gdGhpcy5mcmVlVGV4dHVyZXMpIHtcbiAgICAgIHRoaXMuZnJlZVRleHR1cmVzW3RleFNoYXBlXS5mb3JFYWNoKHRleCA9PiB7XG4gICAgICAgIHRoaXMuZ3BncHUuZGVsZXRlTWF0cml4VGV4dHVyZSh0ZXgpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgdGV4U2hhcGUgaW4gdGhpcy51c2VkVGV4dHVyZXMpIHtcbiAgICAgIHRoaXMudXNlZFRleHR1cmVzW3RleFNoYXBlXS5mb3JFYWNoKHRleCA9PiB7XG4gICAgICAgIHRoaXMuZ3BncHUuZGVsZXRlTWF0cml4VGV4dHVyZSh0ZXgpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuZnJlZVRleHR1cmVzID0gbnVsbDtcbiAgICB0aGlzLnVzZWRUZXh0dXJlcyA9IG51bGw7XG4gICAgdGhpcy5udW1Vc2VkVGV4dHVyZXMgPSAwO1xuICAgIHRoaXMubnVtRnJlZVRleHR1cmVzID0gMDtcbiAgICB0aGlzLl9udW1CeXRlc0FsbG9jYXRlZCA9IDA7XG4gICAgdGhpcy5fbnVtQnl0ZXNGcmVlID0gMDtcbiAgfVxufVxuXG5mdW5jdGlvbiBudW1CeXRlc0ZvckludGVybmFsRm9ybWF0KFxuICAgIGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQsIGludGVybmFsRm9ybWF0OiBudW1iZXIpOiBudW1iZXIge1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gIGNvbnN0IGdsYW55ID0gZ2wgYXMgYW55O1xuICBpZiAoaW50ZXJuYWxGb3JtYXQgPT09IGdsYW55LlIzMkYpIHtcbiAgICByZXR1cm4gNDtcbiAgfSBlbHNlIGlmIChpbnRlcm5hbEZvcm1hdCA9PT0gZ2xhbnkuUjE2Rikge1xuICAgIHJldHVybiAyO1xuICB9IGVsc2UgaWYgKGludGVybmFsRm9ybWF0ID09PSBnbGFueS5SR0JBMzJGKSB7XG4gICAgcmV0dXJuIDE2O1xuICB9IGVsc2UgaWYgKGludGVybmFsRm9ybWF0ID09PSBnbC5SR0JBKSB7XG4gICAgcmV0dXJuIDE2O1xuICB9IGVsc2UgaWYgKGludGVybmFsRm9ybWF0ID09PSBnbGFueS5SR0JBMTZGKSB7XG4gICAgcmV0dXJuIDg7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGludGVybmFsIGZvcm1hdCAke2ludGVybmFsRm9ybWF0fWApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZUJ5dGVzKFxuICAgIHNoYXBlOiBbbnVtYmVyLCBudW1iZXJdLCBwaHlzaWNhbFRleFR5cGU6IFBoeXNpY2FsVGV4dHVyZVR5cGUsXG4gICAgZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgdGV4dHVyZUNvbmZpZzogVGV4dHVyZUNvbmZpZyxcbiAgICBpc1BhY2tlZDogYm9vbGVhbik6IG51bWJlciB7XG4gIC8vIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBpbmZlciBwYWNrZWQgc3RhdHVzIGZyb20gdGhlIHRleHR1cmUgdHlwZSBiZWNhdXNlXG4gIC8vIGRlcGVuZGluZyBvbiB0aGUgdGV4dHVyZUNvbmZpZywgZGlmZmVyZW50ICB0ZXh0dXJlIHR5cGVzIG1heSByZXNvbHZlIHRvIHRoZVxuICAvLyBzYW1lIGludGVybmFsIGZvcm1hdCAoZS5nLiBpbiBXZWJHTDEsIHRoZSBpbnRlcm5hbCBmb3JtYXQgZm9yXG4gIC8vIFVOUEFDS0VEX0ZMT0FUMTYgdGV4dHVyZXMgaXMgZ2wuUkdCQSkuIFRoZXJlZm9yZSB3ZSBwYXNzIGluIGBpc1BhY2tlZGBcbiAgLy8gZXhwbGljaXRseS5cbiAgY29uc3QgaW50ZXJuYWxGb3JtYXQgPVxuICAgICAgaW50ZXJuYWxGb3JtYXRGb3JQaHlzaWNhbFRleFR5cGUocGh5c2ljYWxUZXhUeXBlLCB0ZXh0dXJlQ29uZmlnKTtcblxuICBsZXQgbnVtRWxlbWVudHM6IG51bWJlcjtcbiAgaWYgKGlzUGFja2VkKSB7XG4gICAgY29uc3QgW3BhY2tlZFdpZHRoLCBwYWNrZWRIZWlnaHRdID1cbiAgICAgICAgZ2V0UGFja2VkTWF0cml4VGV4dHVyZVNoYXBlV2lkdGhIZWlnaHQoc2hhcGVbMF0sIHNoYXBlWzFdKTtcbiAgICBudW1FbGVtZW50cyA9IHBhY2tlZFdpZHRoICogcGFja2VkSGVpZ2h0O1xuXG4gIH0gZWxzZSB7XG4gICAgY29uc3QgW3dpZHRoLCBoZWlnaHRdID1cbiAgICAgICAgZ2V0VW5wYWNrZWRNYXRyaXhUZXh0dXJlU2hhcGVXaWR0aEhlaWdodChzaGFwZVswXSwgc2hhcGVbMV0pO1xuICAgIG51bUVsZW1lbnRzID0gd2lkdGggKiBoZWlnaHQ7XG4gIH1cblxuICBjb25zdCBieXRlc1BlckVsZW1lbnQgPSBudW1CeXRlc0ZvckludGVybmFsRm9ybWF0KGdsLCBpbnRlcm5hbEZvcm1hdCk7XG4gIHJldHVybiBudW1FbGVtZW50cyAqIGJ5dGVzUGVyRWxlbWVudDtcbn1cblxuZnVuY3Rpb24gaW50ZXJuYWxGb3JtYXRGb3JQaHlzaWNhbFRleFR5cGUoXG4gICAgcGh5c2ljYWxUZXhUeXBlOiBQaHlzaWNhbFRleHR1cmVUeXBlLFxuICAgIHRleHR1cmVDb25maWc6IFRleHR1cmVDb25maWcpOiBudW1iZXIge1xuICBzd2l0Y2ggKHBoeXNpY2FsVGV4VHlwZSkge1xuICAgIGNhc2UgUGh5c2ljYWxUZXh0dXJlVHlwZS5QQUNLRURfMlgyX0ZMT0FUMzI6XG4gICAgICByZXR1cm4gZ2V0SW50ZXJuYWxGb3JtYXRGb3JQYWNrZWRNYXRyaXhUZXh0dXJlKHRleHR1cmVDb25maWcpO1xuICAgIGNhc2UgUGh5c2ljYWxUZXh0dXJlVHlwZS5QQUNLRURfMlgyX0ZMT0FUMTY6XG4gICAgICByZXR1cm4gZ2V0SW50ZXJuYWxGb3JtYXRGb3JGbG9hdDE2UGFja2VkTWF0cml4VGV4dHVyZSh0ZXh0dXJlQ29uZmlnKTtcbiAgICBjYXNlIFBoeXNpY2FsVGV4dHVyZVR5cGUuVU5QQUNLRURfRkxPQVQzMjpcbiAgICAgIHJldHVybiBnZXRJbnRlcm5hbEZvcm1hdEZvckZsb2F0MzJNYXRyaXhUZXh0dXJlKHRleHR1cmVDb25maWcpO1xuICAgIGNhc2UgUGh5c2ljYWxUZXh0dXJlVHlwZS5VTlBBQ0tFRF9GTE9BVDE2OlxuICAgICAgcmV0dXJuIGdldEludGVybmFsRm9ybWF0Rm9yRmxvYXQxNk1hdHJpeFRleHR1cmUodGV4dHVyZUNvbmZpZyk7XG4gICAgY2FzZSBQaHlzaWNhbFRleHR1cmVUeXBlLlBBQ0tFRF80WDFfVU5TSUdORURfQllURTpcbiAgICAgIHJldHVybiBnZXRJbnRlcm5hbEZvcm1hdEZvclVuc2lnbmVkQnl0ZXNNYXRyaXhUZXh0dXJlKHRleHR1cmVDb25maWcpO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gcGh5c2ljYWwgdGV4dHVyZSB0eXBlICR7cGh5c2ljYWxUZXhUeXBlfWApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFBoeXNpY2FsVGV4dHVyZUZvclJlbmRlcmluZyhpc1BhY2tlZDogYm9vbGVhbik6XG4gICAgUGh5c2ljYWxUZXh0dXJlVHlwZSB7XG4gIGlmIChlbnYoKS5nZXRCb29sKCdXRUJHTF9SRU5ERVJfRkxPQVQzMl9FTkFCTEVEJykpIHtcbiAgICBpZiAoaXNQYWNrZWQpIHtcbiAgICAgIHJldHVybiBQaHlzaWNhbFRleHR1cmVUeXBlLlBBQ0tFRF8yWDJfRkxPQVQzMjtcbiAgICB9XG4gICAgcmV0dXJuIFBoeXNpY2FsVGV4dHVyZVR5cGUuVU5QQUNLRURfRkxPQVQzMjtcbiAgfVxuXG4gIGlmIChpc1BhY2tlZCkge1xuICAgIHJldHVybiBQaHlzaWNhbFRleHR1cmVUeXBlLlBBQ0tFRF8yWDJfRkxPQVQxNjtcbiAgfVxuICByZXR1cm4gUGh5c2ljYWxUZXh0dXJlVHlwZS5VTlBBQ0tFRF9GTE9BVDE2O1xufVxuXG5mdW5jdGlvbiBnZXRQaHlzaWNhbEZyb21Mb2dpY2FsVGV4dHVyZVR5cGUoXG4gICAgbG9naWNhbFRleFR5cGU6IFRleHR1cmVVc2FnZSwgaXNQYWNrZWQ6IGJvb2xlYW4pOiBQaHlzaWNhbFRleHR1cmVUeXBlIHtcbiAgaWYgKGxvZ2ljYWxUZXhUeXBlID09PSBUZXh0dXJlVXNhZ2UuVVBMT0FEKSB7XG4gICAgcmV0dXJuIFBoeXNpY2FsVGV4dHVyZVR5cGUuUEFDS0VEXzJYMl9GTE9BVDMyO1xuICB9IGVsc2UgaWYgKGxvZ2ljYWxUZXhUeXBlID09PSBUZXh0dXJlVXNhZ2UuUkVOREVSIHx8IGxvZ2ljYWxUZXhUeXBlID09IG51bGwpIHtcbiAgICByZXR1cm4gZ2V0UGh5c2ljYWxUZXh0dXJlRm9yUmVuZGVyaW5nKGlzUGFja2VkKTtcbiAgfSBlbHNlIGlmIChcbiAgICAgIGxvZ2ljYWxUZXhUeXBlID09PSBUZXh0dXJlVXNhZ2UuRE9XTkxPQUQgfHxcbiAgICAgIGxvZ2ljYWxUZXhUeXBlID09PSBUZXh0dXJlVXNhZ2UuUElYRUxTKSB7XG4gICAgcmV0dXJuIFBoeXNpY2FsVGV4dHVyZVR5cGUuUEFDS0VEXzRYMV9VTlNJR05FRF9CWVRFO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBsb2dpY2FsIHRleHR1cmUgdHlwZSAke2xvZ2ljYWxUZXhUeXBlfWApO1xufVxuXG5mdW5jdGlvbiBnZXRLZXlGcm9tVGV4dHVyZVNoYXBlKFxuICAgIHNoYXBlUm93c0NvbDogW251bWJlciwgbnVtYmVyXSwgcGh5c2ljYWxUZXhUeXBlOiBQaHlzaWNhbFRleHR1cmVUeXBlLFxuICAgIGlzUGFja2VkOiBib29sZWFuKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke3NoYXBlUm93c0NvbFswXX1fJHtzaGFwZVJvd3NDb2xbMV19XyR7cGh5c2ljYWxUZXhUeXBlfV8ke2lzUGFja2VkfWA7XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuaW1wb3J0IHtnZXRDb29yZHNEYXRhVHlwZX0gZnJvbSAnLi9zaGFkZXJfY29tcGlsZXInO1xuXG5leHBvcnQgY2xhc3MgVGlsZVByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWydBJ107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcbiAgcmFuazogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKGFTaGFwZTogbnVtYmVyW10sIHJlcHM6IG51bWJlcltdKSB7XG4gICAgY29uc3Qgb3V0cHV0U2hhcGU6IG51bWJlcltdID0gbmV3IEFycmF5KGFTaGFwZS5sZW5ndGgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3V0cHV0U2hhcGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIG91dHB1dFNoYXBlW2ldID0gYVNoYXBlW2ldICogcmVwc1tpXTtcbiAgICB9XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IG91dHB1dFNoYXBlO1xuICAgIHRoaXMucmFuayA9IG91dHB1dFNoYXBlLmxlbmd0aDtcbiAgICBjb25zdCBkdHlwZSA9IGdldENvb3Jkc0RhdGFUeXBlKHRoaXMucmFuayk7XG4gICAgY29uc3Qgc291cmNlQ29vcmRzID0gZ2V0U291cmNlQ29vcmRzKGFTaGFwZSk7XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAke2R0eXBlfSByZXNSQyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBzZXRPdXRwdXQoZ2V0QSgke3NvdXJjZUNvb3Jkc30pKTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFNvdXJjZUNvb3JkcyhhU2hhcGU6IG51bWJlcltdKTogc3RyaW5nIHtcbiAgY29uc3QgcmFuayA9IGFTaGFwZS5sZW5ndGg7XG4gIGlmIChyYW5rID4gNSkge1xuICAgIHRocm93IEVycm9yKGBUaWxlIGZvciByYW5rICR7cmFua30gaXMgbm90IHlldCBzdXBwb3J0ZWRgKTtcbiAgfVxuICBpZiAocmFuayA9PT0gMSkge1xuICAgIHJldHVybiBgaW1vZChyZXNSQywgJHthU2hhcGVbMF19KWA7XG4gIH1cblxuICBjb25zdCBjdXJyZW50Q29vcmRzID0gWydyZXNSQy54JywgJ3Jlc1JDLnknLCAncmVzUkMueicsICdyZXNSQy53JywgJ3Jlc1JDLnUnXTtcblxuICBjb25zdCBzb3VyY2VDb29yZHMgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhU2hhcGUubGVuZ3RoOyBpKyspIHtcbiAgICBzb3VyY2VDb29yZHMucHVzaChgaW1vZCgke2N1cnJlbnRDb29yZHNbaV19LCAke2FTaGFwZVtpXX0pYCk7XG4gIH1cbiAgcmV0dXJuIHNvdXJjZUNvb3Jkcy5qb2luKCk7XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcbmltcG9ydCB7VW5pZm9ybVR5cGV9IGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyJztcblxuLy8gQmFzZWQgb24gQWxnb3JpdGhtIDIgb2YgQml0b25pYyBUb3AgSywgcmVmOlxuLy8gaHR0cHM6Ly9hbmlsc2hhbmJoYWcuaW4vc3RhdGljL3BhcGVycy9ncHV0b3BrX3NpZ21vZDE4LnBkZlxuLy8gVGhlIG9yaWdpbmFsIGFsZ29yaXRobSBpcyBiYXNlZCBvbiBjb21wdXRpbmcgdGhlIHRvcCBLIG9ubHksIGhvd2V2ZXJcbi8vIHNpbmNlIGZvciBURkpTIHdlIHJlcXVpcmUgdGhlIGluZGljZXMgb2YgdGhlIHRvcCBLIHZhbHVlcyBhcyB3ZWxsIHRoZW4gdGhlXG4vLyBhbGdvcml0aG0gZm91bmQgaGVyZSBpcyBhIGJpdCBtb2RpZmllZC4gUmF0aGVyIHRoYW4gcHJvZHVjaW5nIHRoZSB2YWx1ZXNcbi8vIGF0IGVhY2ggc3RlcCwgdGhlIGluZGljZXMgY29udGFpbmluZyB0aGUgdG9wIEsgYXJlIGdlbmVyYXRlZCBpbnN0ZWFkLlxuLy8gVGhlIG91dHB1dCB2YWx1ZXMgYXJlIG5vdCBnZW5lcmF0ZWQgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2Ygb3V0cHV0cyBpbiB0aGVcbi8vIEdQVSwgdGhlIHZhbHVlcyBjYW4gZWFzaWx5IGJlIHJldHJpZXZlZCBmcm9tIHRoZSBpbmRpY2VzIHVzaW5nIGEgZ2F0aGVyXG4vLyBvcC5cbmV4cG9ydCBjbGFzcyBTd2FwUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ3gnLCAnaW5kaWNlcyddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIC8vIHxufCBTaXplIG9mIHRoZSBvcmlnaW5hbCBpbnB1dCBvZiBUb3BLLlxuICAvLyB8Zmlyc3RQYXNzfGluZGljYXRlcyBpZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHN3YXAgaXMgYmVpbmcgdXNlZCB3aGljaFxuICAvLyBtZWFucyBubyBpbmRpY2VzIGlucHV0IGNvbnRhaW5pbmcgdGhlIHRvcCBLIGlzIHByZXNlbnQgeWV0LlxuICAvLyB8aW5jfCBTd2FwcyBwYWlycyBvZiBpbmRpY2VzICgwLCBpbmMpLCAoMSwgaW5jICsgMSksICgyLCBpbmMgKyAyKSAuLi5cbiAgY3VzdG9tVW5pZm9ybXMgPSBbXG4gICAge25hbWU6ICduJywgdHlwZTogJ2ludCcgYXMgVW5pZm9ybVR5cGV9LFxuICAgIHtuYW1lOiAnZmlyc3RQYXNzJywgdHlwZTogJ2ludCcgYXMgVW5pZm9ybVR5cGV9LFxuICAgIHtuYW1lOiAnbmVnYXRpdmVJbmYnLCB0eXBlOiAnZmxvYXQnIGFzIFVuaWZvcm1UeXBlfSxcbiAgICB7bmFtZTogJ2RpcicsIHR5cGU6ICdpbnQnIGFzIFVuaWZvcm1UeXBlfSxcbiAgICB7bmFtZTogJ2luYycsIHR5cGU6ICdpbnQnIGFzIFVuaWZvcm1UeXBlfVxuICBdO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gc2hhcGUgZGVzaXJlZCBvdXRwdXQgc2hhcGUgKGNhbiBiZSBsYXJnZXIgdGhhbiBpbnB1dCBzaGFwZSwgb3V0cHV0XG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBwYWRkZWQgd2l0aCAtSW5maW5pdHkpXG4gICAqL1xuICBjb25zdHJ1Y3RvcihzaGFwZTogbnVtYmVyW10pIHtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gc2hhcGU7XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgIGl2ZWMyIGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICAgaW50IGJhdGNoID0gY29vcmRzWzBdO1xuICAgICAgICAgaW50IGVsZW1JZHggPSBjb29yZHNbMV07XG5cbiAgICAgICAgIC8vIFdlIGNvbXBhcmUgZWxlbWVudHMgcGFpci13aXNlIHdpdGhpbiBhIGdyb3VwIG9mIHNpemUgMiAqIGluYy5cbiAgICAgICAgIC8vIFRoZSBjb21wYXJpbmcgcnVsZSBmb3IgZWFjaCBncm91cCBhbHRlcm5hdGVzIGJldHdlZW4gYXNjZW5kaW5nXG4gICAgICAgICAvLyBhbmQgZGVzY2VuZGluZy4gV2l0aGluIGVhY2ggZ3JvdXAsIHdlIGNvbXBhcmUgZWFjaCBwYWlyIGF0XG4gICAgICAgICAvLyBwb3NpdGlvbnMgaSBhbmQgaStpbmMuIFRvIGRlY2lkZSB3aGV0aGVyIGFuIGVsZW1lbnQgYXQgcG9zaXRpb24gaVxuICAgICAgICAgLy8gaXMgeDAgb3IgeDEsIHdlIG1vZCBpdCBieSAyICogaW5jLCBpZiB0aGUgcmVzdWx0IGlzIHNtYWxsZXIgdGhhblxuICAgICAgICAgLy8gaW5jLCBpdCBpcyBpbiB0aGUgZmlyc3QgaGFsZiBvZiB0aGUgZ3JvdXAsIHdlIGRlbm90ZSBpdCBhcyB4MCxcbiAgICAgICAgIC8vIG90aGVyd2lzZSB3ZSBkZW5vdGUgaXQgYXMgeDEuXG4gICAgICAgICAvLyBGb3IgZXhhbXBsZSwgYXMgc2hvd24gaW4gdGhlIEJpdG9uaWMgdG9wIEsgcGFwZXIgcmVmZXJlbmNlZCBhYm92ZSxcbiAgICAgICAgIC8vIEZpZ3VyZTUoYSkgc2hvd3MgdGhhdCBlbGVtZW50WzFdIGlzIGluIHRoZVxuICAgICAgICAgLy8gc2Vjb25kIGhhbGYgb2YgdGhlIGdyb3VwIHdoZW4gZ3JvdXAgc2l6ZSBpcyAyLCBidXQgaXQgaXMgaW4gdGhlXG4gICAgICAgICAvLyBmaXJzdCBoYWxmIG9mIHRoZSBncm91cCB3aGVuIGdyb3VwIHNpemUgaXMgNC5cblxuICAgICAgICAgYm9vbCBpc0ZpcnN0SW5QYWlyID0gaW1vZChlbGVtSWR4LCAyICogaW5jKSA8IGluYztcbiAgICAgICAgIGludCBpID0gaXNGaXJzdEluUGFpciA/IGVsZW1JZHggOiBlbGVtSWR4IC0gaW5jO1xuXG4gICAgICAgICBpbnQgaTAgPSBmaXJzdFBhc3MgPT0gMSA/IGkgOiBpbnQoZ2V0SW5kaWNlcyhiYXRjaCwgaSkpO1xuICAgICAgICAgaW50IGkxID0gZmlyc3RQYXNzID09IDEgPyBpICsgaW5jIDogaW50KGdldEluZGljZXMoYmF0Y2gsIGkgKyBpbmMpKTtcbiAgICAgICAgIGZsb2F0IHgwID0gaTAgPCBuID8gZ2V0WChiYXRjaCwgaTApIDogbmVnYXRpdmVJbmY7XG4gICAgICAgICBmbG9hdCB4MSA9IGkxIDwgbiA/IGdldFgoYmF0Y2gsIGkxKSA6IG5lZ2F0aXZlSW5mO1xuXG4gICAgICAgICAvLyBEZW5vdGVzIHdoaWNoIGRpcmVjdGlvbiBpbmRpY2VzIGFyZSBpbiAoYXNjZW5kaW5nIG9yIGRlc2NlbmRpbmcpLlxuICAgICAgICAgYm9vbCByZXZlcnNlID0gaW1vZChlbGVtSWR4LCAyICogZGlyKSA+PSBkaXI7XG4gICAgICAgICBib29sIGlzR3JlYXRlciA9IHgwID4geDEgfHwgKHgwID09IHgxICYmIGkxID4gaTApO1xuICAgICAgICAgaWYgKHJldmVyc2UgPT0gaXNHcmVhdGVyKSB7IC8vIEVsZW1lbnRzIGluIG9wcG9zaXRlIG9yZGVyIG9mIGRpcmVjdGlvblxuICAgICAgICAgICBpbnQgaVRlbXAgPSBpMDtcbiAgICAgICAgICAgaTAgPSBpMTtcbiAgICAgICAgICAgaTEgPSBpVGVtcDtcbiAgICAgICAgIH1cbiAgICAgICAgIGlmIChpc0ZpcnN0SW5QYWlyKSB7XG4gICAgICAgICAgICBzZXRPdXRwdXQoZmxvYXQoaTApKTtcbiAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZXRPdXRwdXQoZmxvYXQoaTEpKTtcbiAgICAgICAgIH1cbiAgICAgICB9XG4gICAgIGA7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1lcmdlUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ3gnLCAnaW5kaWNlcyddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIC8vIHxufCBTaXplIG9mIHRoZSBvcmlnaW5hbCBpbnB1dCBvZiBUb3BLXG4gIC8vIHxmaXJzdFBhc3N8IGluZGljYXRlcyBpZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHN3YXAgaXMgYmVpbmcgdXNlZCB3aGljaFxuICAvLyBtZWFucyBubyBpbmRpY2VzIGlucHV0IGNvbnRhaW5pbmcgdGhlIHRvcCBLIGlzIHByZXNlbnQgeWV0LlxuICAvLyB8a3wgVG9wIGsgZWxlbWVudHMgZGVzaXJlZFxuICBjdXN0b21Vbmlmb3JtcyA9IFtcbiAgICB7bmFtZTogJ24nLCB0eXBlOiAnaW50JyBhcyBVbmlmb3JtVHlwZX0sXG4gICAge25hbWU6ICdmaXJzdFBhc3MnLCB0eXBlOiAnaW50JyBhcyBVbmlmb3JtVHlwZX0sXG4gICAge25hbWU6ICdrJywgdHlwZTogJ2ludCcgYXMgVW5pZm9ybVR5cGV9XG4gIF07XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBzaGFwZSBkZXNpcmVkIG91dHB1dCBzaGFwZSAobXVzdCBiZSBoYWxmIG9mIHRoZSBpbnB1dCBzaXplKVxuICAgKi9cbiAgY29uc3RydWN0b3Ioc2hhcGU6IG51bWJlcltdKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IHNoYXBlO1xuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICAvLyBUYWtlcyBtYXggb2YgaW5kaWNlcyAoMCwgayksICgxLCBrICsgMSksICgyLCBrICsgMikgLi4uXG4gICAgICAgICBpdmVjMiBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgIGludCBiYXRjaCA9IGNvb3Jkc1swXTtcbiAgICAgICAgIGludCBlbGVtSWR4ID0gY29vcmRzWzFdO1xuXG4gICAgICAgICAvLyBUaGUgb3V0cHV0IHNpemUgaXMgaGFsZiBvZiB0aGUgcHJldmlvdXMgc2l6ZS5cbiAgICAgICAgIC8vIElmIHRoZSBwcmV2aW91cyBzZXF1ZW5jZSBpcyB8IHwgfCB8IF8gXyBfIF8gIHwgfCB8IHwgIF8gXyBfIF8gKGs9NCksXG4gICAgICAgICAvLyB3ZSBvbmx5IG5lZWQgdG8gb3V0cHV0IHRoZSBpbmRpY2VzIGF0IHBvc2l0aW9ucyB8LCB0aGUgaW5kaWNlcyBhdFxuICAgICAgICAgLy8gcG9zaXRpb25zIF8gY2FuIGJlIHRocm93biBhd2F5LCBzZWUgRmlndXJlNShiKSBBZnRlciBQaGFzZSAyXG4gICAgICAgICAvLyAoTWVyZ2UgcGhhc2UpIGluIHRoZSBCaXRvbmljIFRvcCBLIHBhcGVyIHJlZmVyZW5jZWQgYWJvdmUuXG4gICAgICAgICAvLyBGb3IgZXhhbXBsZSwgdGhlIHBhcGVyIHNob3dzIHdlIG9ubHkgbmVlZCB0byBvdXRwdXQgdGhlIG9yYW5nZSBiYXJzLlxuICAgICAgICAgLy8gVGhlIG91dHB1dCBzZXF1ZW5jZSBzaG91bGQgbG9vayBsaWtlIHRoaXMgfCB8IHwgfCB8IHwgfCB8LlxuICAgICAgICAgLy8gQmVjYXVzZSB0aGUgc2VxdWVuY2UgaXMgaGFsdmVkLCB0byBtYXAgdGhlIG91dHB1dCBpbmRleCBiYWNrXG4gICAgICAgICAvLyB0byB0aGUgcHJldmlvdXMgc2VxdWVuY2UgdG8gZmluZCB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSxcbiAgICAgICAgIC8vIHdlIG5lZWQgdG8gZG91YmxlIHRoZSBpbmRleC4gV2hlbiB3ZSBkb3VibGUgdGhlIGluZGV4LFxuICAgICAgICAgLy8gd2UgYmFzaWNhbGx5IGludGVycG9sYXRlIGEgcG9zaXRpb24sIHNvIDJpIGxvb2tzIGxpa2VcbiAgICAgICAgIC8vIHwgXyB8IF8gfCBfIHwgXyB8IF8gfCBfIHwgXy4gV2UgbW92ZSB0aGUgfCB0byB0aGUgZmlyc3QgayBwb3NpdGlvblxuICAgICAgICAgLy8gb2YgZWFjaCAyayBwb3NpdGlvbnMgYnkgLSBlbGVtSWR4ICUgay4gRS5nLiBmb3Igb3V0cHV0IGF0XG4gICAgICAgICAvLyBpbmRleCA0LDUsNiw3LCB3ZSB3YW50IHRvIGdldCB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50IGF0XG4gICAgICAgICAvLyBvcmlnaW5hbCBpbmRleCA4LDksMTAsMTEsIGZvciBvdXRwdXQgYXQgaW5kZXggOCw5LDEwLDExLFxuICAgICAgICAgLy8gd2Ugd2FudCB0byBnZXQgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBhdCBvcmlnaW5hbCBpbmRleFxuICAgICAgICAgLy8gMTYsMTcsMTgsMTksIHNvIG9uIGFuZCBzbyBmb3J0aC5cblxuICAgICAgICAgaW50IGkgPSBlbGVtSWR4IDwgayA/IGVsZW1JZHggOiAoZWxlbUlkeCAqIDIgLSBpbW9kKGVsZW1JZHgsIGspKTtcbiAgICAgICAgIGludCBpMCA9IGZpcnN0UGFzcyA9PSAxID8gaSA6IGludChnZXRJbmRpY2VzKGJhdGNoLCBpKSk7XG4gICAgICAgICBpbnQgaTEgPSBmaXJzdFBhc3MgPT0gMSA/IGkgKyBrIDogaW50KGdldEluZGljZXMoYmF0Y2gsIGkgKyBrKSk7XG5cbiAgICAgICAgIGZsb2F0IHgwID0gZ2V0WChiYXRjaCwgaTApO1xuICAgICAgICAgZmxvYXQgeDEgPSBpMSA8IG4gPyBnZXRYKGJhdGNoLCBpMSkgOiB4MDtcblxuICAgICAgICAgc2V0T3V0cHV0KHgwID49IHgxID8gZmxvYXQoaTApIDogZmxvYXQoaTEpKTtcbiAgICAgICB9XG4gICAgIGA7XG4gIH1cbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2Zvcm1Qcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnSW1hZ2UnLCAnVHJhbnNmb3JtcyddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBpbWFnZUhlaWdodDogbnVtYmVyLCBpbWFnZVdpZHRoOiBudW1iZXIsXG4gICAgICBpbnRlcnBvbGF0aW9uOiAnbmVhcmVzdCd8J2JpbGluZWFyJyxcbiAgICAgIGZpbGxNb2RlOiAnY29uc3RhbnQnfCdyZWZsZWN0J3wnd3JhcCd8J25lYXJlc3QnLCBmaWxsVmFsdWU6IG51bWJlcixcbiAgICAgIG91dFNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSkge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBvdXRTaGFwZTtcbiAgICBjb25zdCBpbnRlcnBvbGF0aW9uTW9kZUlkID0gaW50ZXJwb2xhdGlvbiA9PT0gJ25lYXJlc3QnID8gMSA6IDI7XG4gICAgbGV0IGZpbGxNb2RlSWQ7XG4gICAgc3dpdGNoIChmaWxsTW9kZSkge1xuICAgICAgY2FzZSAnY29uc3RhbnQnOlxuICAgICAgICBmaWxsTW9kZUlkID0gMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdyZWZsZWN0JzpcbiAgICAgICAgZmlsbE1vZGVJZCA9IDI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnd3JhcCc6XG4gICAgICAgIGZpbGxNb2RlSWQgPSAzO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ25lYXJlc3QnOlxuICAgICAgICBmaWxsTW9kZUlkID0gNDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBmaWxsTW9kZUlkID0gMTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICAgICAgICBmbG9hdCBtYXBDb29yZChmbG9hdCBvdXRDb29yZCwgZmxvYXQgbGVuKSB7XG4gICAgICAgICAgICAgIGZsb2F0IGluQ29vcmQgPSBvdXRDb29yZDtcbiAgICAgICAgICAgICAgaWYoJHtmaWxsTW9kZUlkfSA9PSAyKSB7XG4gICAgICAgICAgICAgICAgaWYgKGluQ29vcmQgPCAwLjApIHtcbiAgICAgICAgICAgICAgICAgIGlmIChsZW4gPD0gMS4wKSB7XG4gICAgICAgICAgICAgICAgICAgIGluQ29vcmQgPSAwLjA7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmbG9hdCBzejIgPSAyLjAgKiBsZW47XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbkNvb3JkIDwgc3oyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgaW5Db29yZCA9IHN6MiAqIGZsb2F0KGludChmbG9hdCgtaW5Db29yZCAvIHN6MikpKSArXG4gICAgICAgICAgICAgICAgICAgICAgaW5Db29yZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpbkNvb3JkID0gaW5Db29yZCA8IC1sZW4gPyBpbkNvb3JkICsgc3oyIDogLWluQ29vcmQgLSAxLjA7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbkNvb3JkID4gbGVuIC0gMS4wKSB7XG4gICAgICAgICAgICAgICAgICBpZiAobGVuIDw9IDEuMCkge1xuICAgICAgICAgICAgICAgICAgICBpbkNvb3JkID0gMC4wO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZmxvYXQgc3oyID0gMi4wICogbGVuO1xuICAgICAgICAgICAgICAgICAgICBpbkNvb3JkIC09IHN6MiAqIGZsb2F0KGludChmbG9hdChpbkNvb3JkIC8gc3oyKSkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5Db29yZCA+PSBsZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICBpbkNvb3JkID0gc3oyIC0gaW5Db29yZCAtIDEuMDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gY2xhbXAoaW5Db29yZCwgMC4wLCBsZW4gLSAxLjApO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKCR7ZmlsbE1vZGVJZH0gPT0gMykge1xuICAgICAgICAgICAgICAgIGlmIChpbkNvb3JkIDwgMC4wKSB7XG4gICAgICAgICAgICAgICAgICBpZiAobGVuIDw9IDEuMCkge1xuICAgICAgICAgICAgICAgICAgICBpbkNvb3JkID0gMC4wO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZmxvYXQgc3ogPSBsZW4gLSAxLjA7XG4gICAgICAgICAgICAgICAgICAgIGluQ29vcmQgKz0gbGVuICogKGZsb2F0KGludChmbG9hdCgtaW5Db29yZCAvIHN6KSkpICsgMS4wKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGluQ29vcmQgPiBsZW4gLSAxLjApIHtcbiAgICAgICAgICAgICAgICAgIGlmIChsZW4gPD0gMS4wKSB7XG4gICAgICAgICAgICAgICAgICAgIGluQ29vcmQgPSAwLjA7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmbG9hdCBzeiA9IGxlbiAtIDEuMDtcbiAgICAgICAgICAgICAgICAgICAgaW5Db29yZCAtPSBsZW4gKiBmbG9hdChpbnQoZmxvYXQoaW5Db29yZCAvIHN6KSkpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gY2xhbXAoaW5Db29yZCwgMC4wLCBsZW4gLSAxLjApO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKCR7ZmlsbE1vZGVJZH0gPT0gNCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjbGFtcChvdXRDb29yZCwgMC4wLCBsZW4gLSAxLjApO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBvdXRDb29yZDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmbG9hdCByZWFkV2l0aEZpbGxWYWx1ZShpbnQgYmF0Y2gsIGludCBjb29yZFksIGludCBjb29yZFgsXG4gICAgICAgICAgICAgIGludCBjaGFubmVsKSB7XG4gICAgICAgICAgICAgIGZsb2F0IG91dHB1dFZhbHVlO1xuICAgICAgICAgICAgICBpZiAoMCA8PSBjb29yZFkgJiYgY29vcmRZIDwgJHtcbiAgICAgICAgaW1hZ2VIZWlnaHR9ICYmIDAgPD0gY29vcmRYICYmIGNvb3JkWCA8ICR7aW1hZ2VXaWR0aH0pIHtcbiAgICAgICAgICAgICAgICAgIG91dHB1dFZhbHVlID0gZ2V0SW1hZ2UoYmF0Y2gsIGNvb3JkWSwgY29vcmRYLCBjaGFubmVsKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBvdXRwdXRWYWx1ZSA9IGZsb2F0KCR7ZmlsbFZhbHVlfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIG91dHB1dFZhbHVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICAgICAgIGl2ZWM0IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICAgICAgICBmbG9hdCBvdXRwdXRWYWx1ZTtcbiAgICAgICAgICAgICAgaW50IGJhdGNoID0gY29vcmRzWzBdO1xuICAgICAgICAgICAgICBpbnQgeCA9IGNvb3Jkc1syXTtcbiAgICAgICAgICAgICAgaW50IHkgPSBjb29yZHNbMV07XG4gICAgICAgICAgICAgIGludCBjaGFubmVsID0gY29vcmRzWzNdO1xuICAgICAgICAgICAgICBmbG9hdCB4ZiA9IGZsb2F0KHgpO1xuICAgICAgICAgICAgICBmbG9hdCB5ZiA9IGZsb2F0KHkpO1xuICAgICAgICAgICAgICBmbG9hdCBhMSA9IGdldFRyYW5zZm9ybXMoYmF0Y2gsIDApO1xuICAgICAgICAgICAgICBmbG9hdCBhMiA9IGdldFRyYW5zZm9ybXMoYmF0Y2gsIDEpO1xuICAgICAgICAgICAgICBmbG9hdCBhMyA9IGdldFRyYW5zZm9ybXMoYmF0Y2gsIDIpO1xuICAgICAgICAgICAgICBmbG9hdCBiMSA9IGdldFRyYW5zZm9ybXMoYmF0Y2gsIDMpO1xuICAgICAgICAgICAgICBmbG9hdCBiMiA9IGdldFRyYW5zZm9ybXMoYmF0Y2gsIDQpO1xuICAgICAgICAgICAgICBmbG9hdCBiMyA9IGdldFRyYW5zZm9ybXMoYmF0Y2gsIDUpO1xuICAgICAgICAgICAgICBmbG9hdCBjMSA9IGdldFRyYW5zZm9ybXMoYmF0Y2gsIDYpO1xuICAgICAgICAgICAgICBmbG9hdCBjMiA9IGdldFRyYW5zZm9ybXMoYmF0Y2gsIDcpO1xuICAgICAgICAgICAgICBmbG9hdCBwcm9qZWN0aW9uID0gYzEgKiB4ZiArIGMyICogeWYgKyAxLjA7XG4gICAgICAgICAgICAgIGlmIChwcm9qZWN0aW9uID09IDAuMCkge1xuICAgICAgICAgICAgICAgIG91dHB1dFZhbHVlID0gZmxvYXQoJHtmaWxsVmFsdWV9KTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmbG9hdCBpblggPSAoYTEgKiB4ZiArIGEyICogeWYgKyBhMykgLyBwcm9qZWN0aW9uO1xuICAgICAgICAgICAgICAgIGZsb2F0IGluWSA9IChiMSAqIHhmICsgYjIgKiB5ZiArIGIzKSAvIHByb2plY3Rpb247XG4gICAgICAgICAgICAgICAgZmxvYXQgbWFwWCA9IG1hcENvb3JkKGluWCwgZmxvYXQoJHtpbWFnZVdpZHRofSkpO1xuICAgICAgICAgICAgICAgIGZsb2F0IG1hcFkgPSBtYXBDb29yZChpblksIGZsb2F0KCR7aW1hZ2VIZWlnaHR9KSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoJHtpbnRlcnBvbGF0aW9uTW9kZUlkfSA9PSAxKSB7XG4gICAgICAgICAgICAgICAgICBpbnQgY29vcmRZID0gaW50KHJvdW5kKG1hcFkpKTtcbiAgICAgICAgICAgICAgICAgIGludCBjb29yZFggPSBpbnQocm91bmQobWFwWCkpO1xuICAgICAgICAgICAgICAgICAgb3V0cHV0VmFsdWUgPSByZWFkV2l0aEZpbGxWYWx1ZShiYXRjaCwgY29vcmRZLCBjb29yZFgsXG4gICAgICAgICAgICAgICAgICAgIGNoYW5uZWwpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBmbG9hdCB5Rmxvb3IgPSBmbG9vcihtYXBZKTtcbiAgICAgICAgICAgICAgICAgIGZsb2F0IHhGbG9vciA9IGZsb29yKG1hcFgpO1xuICAgICAgICAgICAgICAgICAgZmxvYXQgeUNlaWwgPSB5Rmxvb3IgKyAxLjA7XG4gICAgICAgICAgICAgICAgICBmbG9hdCB4Q2VpbCA9IHhGbG9vciArIDEuMDtcbiAgICAgICAgICAgICAgICAgIGZsb2F0IHZhbHVlWUZsb29yID0gKHhDZWlsIC0gbWFwWCkgKlxuICAgICAgICAgICAgICAgICAgcmVhZFdpdGhGaWxsVmFsdWUoYmF0Y2gsIGludCh5Rmxvb3IpLCBpbnQoeEZsb29yKSwgY2hhbm5lbCkgK1xuICAgICAgICAgICAgICAgICAgKG1hcFggLSB4Rmxvb3IpICpcbiAgICAgICAgICAgICAgICAgIHJlYWRXaXRoRmlsbFZhbHVlKGJhdGNoLCBpbnQoeUZsb29yKSwgaW50KHhDZWlsKSwgY2hhbm5lbCk7XG4gICAgICAgICAgICAgICAgICBmbG9hdCB2YWx1ZVlDZWlsID0gKHhDZWlsIC0gbWFwWCkgKlxuICAgICAgICAgICAgICAgICAgcmVhZFdpdGhGaWxsVmFsdWUoYmF0Y2gsIGludCh5Q2VpbCksIGludCh4Rmxvb3IpLCBjaGFubmVsKSArXG4gICAgICAgICAgICAgICAgICAobWFwWCAtIHhGbG9vcikgKlxuICAgICAgICAgICAgICAgICAgcmVhZFdpdGhGaWxsVmFsdWUoYmF0Y2gsIGludCh5Q2VpbCksIGludCh4Q2VpbCksIGNoYW5uZWwpO1xuICAgICAgICAgICAgICAgICAgb3V0cHV0VmFsdWUgPSAoeUNlaWwgLSBtYXBZKSAqIHZhbHVlWUZsb29yICtcbiAgICAgICAgICAgICAgICAgIChtYXBZIC0geUZsb29yKSAqIHZhbHVlWUNlaWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHNldE91dHB1dChvdXRwdXRWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIGA7XG4gIH1cbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5pbXBvcnQge2dldENvb3Jkc0RhdGFUeXBlfSBmcm9tICcuL3NoYWRlcl9jb21waWxlcic7XG5cbmV4cG9ydCBjbGFzcyBUcmFuc3Bvc2VQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnQSddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIHJhbms6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihhU2hhcGU6IG51bWJlcltdLCBuZXdEaW06IG51bWJlcltdKSB7XG4gICAgY29uc3Qgb3V0cHV0U2hhcGU6IG51bWJlcltdID0gbmV3IEFycmF5KGFTaGFwZS5sZW5ndGgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3V0cHV0U2hhcGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIG91dHB1dFNoYXBlW2ldID0gYVNoYXBlW25ld0RpbVtpXV07XG4gICAgfVxuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBvdXRwdXRTaGFwZTtcbiAgICB0aGlzLnJhbmsgPSBvdXRwdXRTaGFwZS5sZW5ndGg7XG4gICAgY29uc3QgZHR5cGUgPSBnZXRDb29yZHNEYXRhVHlwZSh0aGlzLnJhbmspO1xuICAgIGNvbnN0IHN3aXRjaGVkID0gZ2V0U3dpdGNoZWRDb29yZHMobmV3RGltKTtcblxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgdm9pZCBtYWluKCkge1xuICAgICAgJHtkdHlwZX0gcmVzUkMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgIHNldE91dHB1dChnZXRBKCR7c3dpdGNoZWR9KSk7XG4gICAgfVxuICAgIGA7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0U3dpdGNoZWRDb29yZHMobmV3RGltOiBudW1iZXJbXSk6IHN0cmluZyB7XG4gIGNvbnN0IHJhbmsgPSBuZXdEaW0ubGVuZ3RoO1xuICBpZiAocmFuayA+IDYpIHtcbiAgICB0aHJvdyBFcnJvcihgVHJhbnNwb3NlIGZvciByYW5rICR7cmFua30gaXMgbm90IHlldCBzdXBwb3J0ZWRgKTtcbiAgfVxuICBjb25zdCBvcmlnaW5hbE9yZGVyID1cbiAgICAgIFsncmVzUkMueCcsICdyZXNSQy55JywgJ3Jlc1JDLnonLCAncmVzUkMudycsICdyZXNSQy51JywgJ3Jlc1JDLnYnXTtcbiAgY29uc3Qgc3dpdGNoZWRDb29yZHMgPSBuZXcgQXJyYXkocmFuayk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3RGltLmxlbmd0aDsgaSsrKSB7XG4gICAgc3dpdGNoZWRDb29yZHNbbmV3RGltW2ldXSA9IG9yaWdpbmFsT3JkZXJbaV07XG4gIH1cbiAgcmV0dXJuIHN3aXRjaGVkQ29vcmRzLmpvaW4oKTtcbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5pbXBvcnQge2dldFZlY0NoYW5uZWxzfSBmcm9tICcuL3BhY2tpbmdfdXRpbCc7XG5pbXBvcnQge2dldENvb3Jkc0RhdGFUeXBlfSBmcm9tICcuL3NoYWRlcl9jb21waWxlcic7XG5cbmV4cG9ydCBjbGFzcyBUcmFuc3Bvc2VQYWNrZWRQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnQSddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIHJhbms6IG51bWJlcjtcbiAgcGFja2VkSW5wdXRzID0gdHJ1ZTtcbiAgcGFja2VkT3V0cHV0ID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3RvcihhU2hhcGU6IG51bWJlcltdLCBuZXdEaW06IG51bWJlcltdKSB7XG4gICAgY29uc3Qgb3V0cHV0U2hhcGU6IG51bWJlcltdID0gbmV3IEFycmF5KGFTaGFwZS5sZW5ndGgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3V0cHV0U2hhcGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIG91dHB1dFNoYXBlW2ldID0gYVNoYXBlW25ld0RpbVtpXV07XG4gICAgfVxuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBvdXRwdXRTaGFwZTtcbiAgICB0aGlzLnJhbmsgPSBvdXRwdXRTaGFwZS5sZW5ndGg7XG4gICAgaWYgKHRoaXMucmFuayA+IDYpIHtcbiAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgIGBQYWNrZWQgdHJhbnNwb3NlIGZvciByYW5rICR7dGhpcy5yYW5rfSBpcyBub3QgeWV0IHN1cHBvcnRlZC5gKTtcbiAgICB9XG4gICAgY29uc3QgZHR5cGUgPSBnZXRDb29yZHNEYXRhVHlwZSh0aGlzLnJhbmspO1xuXG4gICAgY29uc3Qgb3V0cHV0T3JkZXIgPSBnZXRWZWNDaGFubmVscygncmMnLCB0aGlzLnJhbmspO1xuICAgIGNvbnN0IHN3aXRjaGVkT3JkZXIgPSBuZXcgQXJyYXkodGhpcy5yYW5rKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld0RpbS5sZW5ndGg7IGkrKykge1xuICAgICAgc3dpdGNoZWRPcmRlcltuZXdEaW1baV1dID0gb3V0cHV0T3JkZXJbaV07XG4gICAgfVxuICAgIGNvbnN0IGlubmVyRGltcyA9IGB2ZWMyKCR7c3dpdGNoZWRPcmRlci5zbGljZSgtMikuam9pbigpfSlgO1xuICAgIGNvbnN0IG5leHRDb2x1bW4gPVxuICAgICAgICBgKyske291dHB1dE9yZGVyW3RoaXMucmFuayAtIDFdfSA8ICR7b3V0cHV0U2hhcGVbdGhpcy5yYW5rIC0gMV19YDtcbiAgICBjb25zdCBnZXRjID0gYGdldENoYW5uZWwoZ2V0QSgke3N3aXRjaGVkT3JkZXIuam9pbigpfSksICR7aW5uZXJEaW1zfSlgO1xuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICB2b2lkIG1haW4oKSB7XG4gICAgICAke2R0eXBlfSByYyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgdmVjNCByZXN1bHQgPSB2ZWM0KDAuKTtcbiAgICAgIHJlc3VsdFswXSA9ICR7Z2V0Y307XG4gICAgICBpZigke25leHRDb2x1bW59KSB7XG4gICAgICAgIHJlc3VsdFsxXSA9ICR7Z2V0Y307XG4gICAgICB9XG4gICAgICAtLSR7b3V0cHV0T3JkZXJbdGhpcy5yYW5rIC0gMV19O1xuICAgICAgaWYoKyske291dHB1dE9yZGVyW3RoaXMucmFuayAtIDJdfSA8ICR7b3V0cHV0U2hhcGVbdGhpcy5yYW5rIC0gMl19KSB7XG4gICAgICAgIHJlc3VsdFsyXSA9ICR7Z2V0Y307XG4gICAgICAgIGlmKCR7bmV4dENvbHVtbn0pIHtcbiAgICAgICAgICByZXN1bHRbM10gPSAke2dldGN9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzZXRPdXRwdXQocmVzdWx0KTtcbiAgICB9XG4gICAgYDtcbiAgfVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0dQR1BVUHJvZ3JhbSwgdXNlU2hhcGVVbmlmb3Jtc30gZnJvbSAnLi9ncGdwdV9tYXRoJztcblxuZXhwb3J0IGNsYXNzIFVuYXJ5T3BQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnQSddO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIGVuYWJsZVNoYXBlVW5pZm9ybXM6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IoYVNoYXBlOiBudW1iZXJbXSwgb3BTbmlwcGV0OiBzdHJpbmcpIHtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gYVNoYXBlO1xuICAgIHRoaXMuZW5hYmxlU2hhcGVVbmlmb3JtcyA9IHVzZVNoYXBlVW5pZm9ybXModGhpcy5vdXRwdXRTaGFwZS5sZW5ndGgpO1xuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICBmbG9hdCB1bmFyeU9wZXJhdGlvbihmbG9hdCB4KSB7XG4gICAgICAgICR7b3BTbmlwcGV0fVxuICAgICAgfVxuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGZsb2F0IHggPSBnZXRBQXRPdXRDb29yZHMoKTtcbiAgICAgICAgZmxvYXQgeSA9IHVuYXJ5T3BlcmF0aW9uKHgpO1xuXG4gICAgICAgIHNldE91dHB1dCh5KTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBDSEVDS19OQU5fU05JUFBFVCA9IGBpZiAoaXNuYW4oeCkpIHJldHVybiB4O2A7XG5cbmV4cG9ydCBjb25zdCBMSU5FQVIgPSBgcmV0dXJuIHg7YDtcblxuZXhwb3J0IGNvbnN0IEFCUyA9IGByZXR1cm4gYWJzKHgpO2A7XG5cbmV4cG9ydCBmdW5jdGlvbiBTVEVQKGFscGhhID0gMC4wKSB7XG4gIHJldHVybiBDSEVDS19OQU5fU05JUFBFVCArIGBcbiAgICByZXR1cm4geCA+IDAuMCA/IDEuMCA6IGZsb2F0KCR7YWxwaGF9KTtcbiAgYDtcbn1cblxuZXhwb3J0IGNvbnN0IEVMVSA9IGByZXR1cm4gKHggPj0gMC4wKSA/IHggOiAoZXhwKHgpIC0gMS4wKTtgO1xuZXhwb3J0IGNvbnN0IFJFTFUgPSBDSEVDS19OQU5fU05JUFBFVCArIGBcbiAgcmV0dXJuICh4IDwgMC4wKSA/IDAuMCA6IHg7XG5gO1xuXG5leHBvcnQgY29uc3QgUkVMVTYgPSBDSEVDS19OQU5fU05JUFBFVCArIGBcbiAgcmV0dXJuICh4IDwgMC4wKSA/IDAuMCA6IG1pbig2LjAsIHgpO1xuYDtcblxuZXhwb3J0IGNvbnN0IENMT05FID0gJ3JldHVybiB4Oyc7XG5cbmV4cG9ydCBjb25zdCBTSUdNT0lEID0gYHJldHVybiAxLjAgLyAoMS4wICsgZXhwKC0xLjAgKiB4KSk7YDtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtHUEdQVVByb2dyYW0sIHVzZVNoYXBlVW5pZm9ybXN9IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5cbmV4cG9ydCBjb25zdCBMSU5FQVIgPSBgcmV0dXJuIHg7YDtcblxuZXhwb3J0IGNvbnN0IEVMVSA9IGBcbiAgdmVjNCByZXN1bHQ7XG5cbiAgcmVzdWx0LnIgPSAoeC5yID49IDAuMCkgPyB4LnIgOiAoZXhwKHgucikgLSAxLjApO1xuICByZXN1bHQuZyA9ICh4LmcgPj0gMC4wKSA/IHguZyA6IChleHAoeC5nKSAtIDEuMCk7XG4gIHJlc3VsdC5iID0gKHguYiA+PSAwLjApID8geC5iIDogKGV4cCh4LmIpIC0gMS4wKTtcbiAgcmVzdWx0LmEgPSAoeC5hID49IDAuMCkgPyB4LmEgOiAoZXhwKHguYSkgLSAxLjApO1xuXG4gIHJldHVybiByZXN1bHQ7XG5gO1xuXG5leHBvcnQgY29uc3QgUkVMVSA9IGBcbiAgdmVjNCByZXN1bHQgPSB4ICogdmVjNChncmVhdGVyVGhhbkVxdWFsKHgsIHZlYzQoMC4wKSkpO1xuICBidmVjNCBpc05hTiA9IGlzbmFuKHgpO1xuXG4gIHJlc3VsdC5yID0gaXNOYU4uciA/IHguciA6IHJlc3VsdC5yO1xuICByZXN1bHQuZyA9IGlzTmFOLmcgPyB4LmcgOiByZXN1bHQuZztcbiAgcmVzdWx0LmIgPSBpc05hTi5iID8geC5iIDogcmVzdWx0LmI7XG4gIHJlc3VsdC5hID0gaXNOYU4uYSA/IHguYSA6IHJlc3VsdC5hO1xuXG4gIHJldHVybiByZXN1bHQ7XG5gO1xuXG5leHBvcnQgY29uc3QgUkVMVTYgPSBgXG4gIHZlYzQgcmVzdWx0ID0gbWluKHgsIHZlYzQoNi4pKSAqIHZlYzQoZ3JlYXRlclRoYW5FcXVhbCh4LCB2ZWM0KDAuMCkpKTtcbiAgYnZlYzQgaXNOYU4gPSBpc25hbih4KTtcblxuICByZXN1bHQuciA9IGlzTmFOLnIgPyB4LnIgOiByZXN1bHQucjtcbiAgcmVzdWx0LmcgPSBpc05hTi5nID8geC5nIDogcmVzdWx0Lmc7XG4gIHJlc3VsdC5iID0gaXNOYU4uYiA/IHguYiA6IHJlc3VsdC5iO1xuICByZXN1bHQuYSA9IGlzTmFOLmEgPyB4LmEgOiByZXN1bHQuYTtcblxuICByZXR1cm4gcmVzdWx0O1xuYDtcblxuZXhwb3J0IGNvbnN0IFNJR01PSUQgPSBgcmV0dXJuIDEuMCAvICgxLjAgKyBleHAoLTEuMCAqIHgpKTtgO1xuXG5leHBvcnQgY2xhc3MgVW5hcnlPcFBhY2tlZFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWydBJ107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIGVuYWJsZVNoYXBlVW5pZm9ybXM6IGJvb2xlYW47XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgcGFja2VkSW5wdXRzID0gdHJ1ZTtcbiAgcGFja2VkT3V0cHV0ID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3RvcihhU2hhcGU6IG51bWJlcltdLCBvcFNuaXBwZXQ6IHN0cmluZykge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBhU2hhcGU7XG4gICAgdGhpcy5lbmFibGVTaGFwZVVuaWZvcm1zID0gdXNlU2hhcGVVbmlmb3Jtcyh0aGlzLm91dHB1dFNoYXBlLmxlbmd0aCk7XG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIHZlYzQgdW5hcnlPcGVyYXRpb24odmVjNCB4KSB7XG4gICAgICAgICR7b3BTbmlwcGV0fVxuICAgICAgfVxuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIHZlYzQgeCA9IGdldEFBdE91dENvb3JkcygpO1xuICAgICAgICB2ZWM0IHkgPSB1bmFyeU9wZXJhdGlvbih4KTtcblxuICAgICAgICBzZXRPdXRwdXQoeSk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcbmltcG9ydCB7Z2V0Q2hhbm5lbHMsIGdldFNvdXJjZUNvb3Jkc30gZnJvbSAnLi9wYWNraW5nX3V0aWwnO1xuaW1wb3J0IHtnZXRDb29yZHNEYXRhVHlwZX0gZnJvbSAnLi9zaGFkZXJfY29tcGlsZXInO1xuXG5leHBvcnQgY2xhc3MgVW5wYWNrUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ0EnXTtcbiAgcGFja2VkSW5wdXRzID0gdHJ1ZTtcbiAgcGFja2VkT3V0cHV0ID0gZmFsc2U7XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihvdXRwdXRTaGFwZTogbnVtYmVyW10pIHtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gb3V0cHV0U2hhcGU7XG4gICAgY29uc3QgcmFuayA9IG91dHB1dFNoYXBlLmxlbmd0aDtcblxuICAgIGNvbnN0IGNoYW5uZWxzID0gZ2V0Q2hhbm5lbHMoJ3JjJywgcmFuayk7XG4gICAgY29uc3QgZHR5cGUgPSBnZXRDb29yZHNEYXRhVHlwZShyYW5rKTtcbiAgICBjb25zdCBzb3VyY2VDb29yZHMgPSBnZXRTb3VyY2VDb29yZHMocmFuaywgY2hhbm5lbHMpO1xuICAgIGNvbnN0IGlubmVyRGltcyA9IGNoYW5uZWxzLnNsaWNlKC0yKTtcbiAgICBjb25zdCBjb29yZHMgPSByYW5rIDw9IDEgPyAncmMnIDogYHZlYzIoJHtpbm5lckRpbXMuam9pbignLCcpfSlgO1xuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgJHtkdHlwZX0gcmMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgdmVjNCBwYWNrZWRJbnB1dCA9IGdldEEoJHtzb3VyY2VDb29yZHN9KTtcblxuICAgICAgICBzZXRPdXRwdXQoZ2V0Q2hhbm5lbChwYWNrZWRJbnB1dCwgJHtjb29yZHN9KSk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIiwiLyoqIEBsaWNlbnNlIFNlZSB0aGUgTElDRU5TRSBmaWxlLiAqL1xuXG4vLyBUaGlzIGNvZGUgaXMgYXV0by1nZW5lcmF0ZWQsIGRvIG5vdCBtb2RpZnkgdGhpcyBmaWxlIVxuY29uc3QgdmVyc2lvbiA9ICcwLjAuMCc7XG5leHBvcnQge3ZlcnNpb259O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2Vudn0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0ICogYXMgZ3BncHVfdXRpbCBmcm9tICcuL2dwZ3B1X3V0aWwnO1xuaW1wb3J0ICogYXMgd2ViZ2xfdXRpbCBmcm9tICcuL3dlYmdsX3V0aWwnO1xuXG5leHBvcnQge01hdGhCYWNrZW5kV2ViR0wsIFdlYkdMTWVtb3J5SW5mbywgV2ViR0xUaW1pbmdJbmZvfSBmcm9tICcuL2JhY2tlbmRfd2ViZ2wnO1xuZXhwb3J0IHtzZXRXZWJHTENvbnRleHR9IGZyb20gJy4vY2FudmFzX3V0aWwnO1xuZXhwb3J0IHtHUEdQVUNvbnRleHR9IGZyb20gJy4vZ3BncHVfY29udGV4dCc7XG5leHBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcbi8vIFdlYkdMIHNwZWNpZmljIHV0aWxzLlxuZXhwb3J0IHtncGdwdV91dGlsLCB3ZWJnbF91dGlsfTtcblxuLyoqXG4gKiBFbmZvcmNlIHVzZSBvZiBoYWxmIHByZWNpc2lvbiB0ZXh0dXJlcyBpZiBhdmFpbGFibGUgb24gdGhlIHBsYXRmb3JtLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdFbnZpcm9ubWVudCcsIG5hbWVzcGFjZTogJ3dlYmdsJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcmNlSGFsZkZsb2F0KCk6IHZvaWQge1xuICBlbnYoKS5zZXQoJ1dFQkdMX0ZPUkNFX0YxNl9URVhUVVJFUycsIHRydWUpO1xufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2VudiwgVGVuc29ySW5mbywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtnZXRXZWJHTENvbnRleHR9IGZyb20gJy4vY2FudmFzX3V0aWwnO1xuaW1wb3J0IHtnZXRUZXh0dXJlQ29uZmlnfSBmcm9tICcuL3RleF91dGlsJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNhbGxBbmRDaGVjazxUPihnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0LCBmdW5jOiAoKSA9PiBUKTogVCB7XG4gIGNvbnN0IHJldHVyblZhbHVlID0gZnVuYygpO1xuICBpZiAoZW52KCkuZ2V0Qm9vbCgnREVCVUcnKSkge1xuICAgIGNoZWNrV2ViR0xFcnJvcihnbCk7XG4gIH1cbiAgcmV0dXJuIHJldHVyblZhbHVlO1xufVxuXG5mdW5jdGlvbiBjaGVja1dlYkdMRXJyb3IoZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCkge1xuICBjb25zdCBlcnJvciA9IGdsLmdldEVycm9yKCk7XG4gIGlmIChlcnJvciAhPT0gZ2wuTk9fRVJST1IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1dlYkdMIEVycm9yOiAnICsgZ2V0V2ViR0xFcnJvck1lc3NhZ2UoZ2wsIGVycm9yKSk7XG4gIH1cbn1cblxuLy8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSGFsZi1wcmVjaXNpb25fZmxvYXRpbmctcG9pbnRfZm9ybWF0XG5jb25zdCBNSU5fRkxPQVQxNiA9IDUuOTZlLTg7XG5jb25zdCBNQVhfRkxPQVQxNiA9IDY1NTA0O1xuXG5leHBvcnQgZnVuY3Rpb24gY2FuQmVSZXByZXNlbnRlZChudW06IG51bWJlcik6IGJvb2xlYW4ge1xuICBpZiAoZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUkVOREVSX0ZMT0FUMzJfRU5BQkxFRCcpIHx8IG51bSA9PT0gMCB8fFxuICAgICAgKE1JTl9GTE9BVDE2IDwgTWF0aC5hYnMobnVtKSAmJiBNYXRoLmFicyhudW0pIDwgTUFYX0ZMT0FUMTYpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0V2ViR0xFcnJvck1lc3NhZ2UoXG4gICAgZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgc3RhdHVzOiBudW1iZXIpOiBzdHJpbmcge1xuICBzd2l0Y2ggKHN0YXR1cykge1xuICAgIGNhc2UgZ2wuTk9fRVJST1I6XG4gICAgICByZXR1cm4gJ05PX0VSUk9SJztcbiAgICBjYXNlIGdsLklOVkFMSURfRU5VTTpcbiAgICAgIHJldHVybiAnSU5WQUxJRF9FTlVNJztcbiAgICBjYXNlIGdsLklOVkFMSURfVkFMVUU6XG4gICAgICByZXR1cm4gJ0lOVkFMSURfVkFMVUUnO1xuICAgIGNhc2UgZ2wuSU5WQUxJRF9PUEVSQVRJT046XG4gICAgICByZXR1cm4gJ0lOVkFMSURfT1BFUkFUSU9OJztcbiAgICBjYXNlIGdsLklOVkFMSURfRlJBTUVCVUZGRVJfT1BFUkFUSU9OOlxuICAgICAgcmV0dXJuICdJTlZBTElEX0ZSQU1FQlVGRkVSX09QRVJBVElPTic7XG4gICAgY2FzZSBnbC5PVVRfT0ZfTUVNT1JZOlxuICAgICAgcmV0dXJuICdPVVRfT0ZfTUVNT1JZJztcbiAgICBjYXNlIGdsLkNPTlRFWFRfTE9TVF9XRUJHTDpcbiAgICAgIHJldHVybiAnQ09OVEVYVF9MT1NUX1dFQkdMJztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGBVbmtub3duIGVycm9yIGNvZGUgJHtzdGF0dXN9YDtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXh0ZW5zaW9uT3JUaHJvdyhcbiAgICBnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0LCBleHRlbnNpb25OYW1lOiBzdHJpbmcpOiB7fSB7XG4gIHJldHVybiB0aHJvd0lmTnVsbDx7fT4oXG4gICAgICBnbCwgKCkgPT4gZ2wuZ2V0RXh0ZW5zaW9uKGV4dGVuc2lvbk5hbWUpLFxuICAgICAgJ0V4dGVuc2lvbiBcIicgKyBleHRlbnNpb25OYW1lICsgJ1wiIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBicm93c2VyLicpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVmVydGV4U2hhZGVyKFxuICAgIGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQsIHZlcnRleFNoYWRlclNvdXJjZTogc3RyaW5nKTogV2ViR0xTaGFkZXIge1xuICBjb25zdCB2ZXJ0ZXhTaGFkZXI6IFdlYkdMU2hhZGVyID0gdGhyb3dJZk51bGw8V2ViR0xTaGFkZXI+KFxuICAgICAgZ2wsICgpID0+IGdsLmNyZWF0ZVNoYWRlcihnbC5WRVJURVhfU0hBREVSKSxcbiAgICAgICdVbmFibGUgdG8gY3JlYXRlIHZlcnRleCBXZWJHTFNoYWRlci4nKTtcbiAgY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5zaGFkZXJTb3VyY2UodmVydGV4U2hhZGVyLCB2ZXJ0ZXhTaGFkZXJTb3VyY2UpKTtcbiAgY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5jb21waWxlU2hhZGVyKHZlcnRleFNoYWRlcikpO1xuICBpZiAoZ2wuZ2V0U2hhZGVyUGFyYW1ldGVyKHZlcnRleFNoYWRlciwgZ2wuQ09NUElMRV9TVEFUVVMpID09PSBmYWxzZSkge1xuICAgIGNvbnNvbGUubG9nKGdsLmdldFNoYWRlckluZm9Mb2codmVydGV4U2hhZGVyKSk7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gY29tcGlsZSB2ZXJ0ZXggc2hhZGVyLicpO1xuICB9XG4gIHJldHVybiB2ZXJ0ZXhTaGFkZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGcmFnbWVudFNoYWRlcihcbiAgICBnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0LCBmcmFnbWVudFNoYWRlclNvdXJjZTogc3RyaW5nKTogV2ViR0xTaGFkZXIge1xuICBjb25zdCBmcmFnbWVudFNoYWRlcjogV2ViR0xTaGFkZXIgPSB0aHJvd0lmTnVsbDxXZWJHTFNoYWRlcj4oXG4gICAgICBnbCwgKCkgPT4gZ2wuY3JlYXRlU2hhZGVyKGdsLkZSQUdNRU5UX1NIQURFUiksXG4gICAgICAnVW5hYmxlIHRvIGNyZWF0ZSBmcmFnbWVudCBXZWJHTFNoYWRlci4nKTtcbiAgY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5zaGFkZXJTb3VyY2UoZnJhZ21lbnRTaGFkZXIsIGZyYWdtZW50U2hhZGVyU291cmNlKSk7XG4gIGNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuY29tcGlsZVNoYWRlcihmcmFnbWVudFNoYWRlcikpO1xuICBpZiAoZ2wuZ2V0U2hhZGVyUGFyYW1ldGVyKGZyYWdtZW50U2hhZGVyLCBnbC5DT01QSUxFX1NUQVRVUykgPT09IGZhbHNlKSB7XG4gICAgbG9nU2hhZGVyU291cmNlQW5kSW5mb0xvZyhcbiAgICAgICAgZnJhZ21lbnRTaGFkZXJTb3VyY2UsIGdsLmdldFNoYWRlckluZm9Mb2coZnJhZ21lbnRTaGFkZXIpKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBjb21waWxlIGZyYWdtZW50IHNoYWRlci4nKTtcbiAgfVxuICByZXR1cm4gZnJhZ21lbnRTaGFkZXI7XG59XG5cbmNvbnN0IGxpbmVOdW1iZXJSZWdleCA9IC9FUlJPUjogWzAtOV0rOihbMC05XSspOi9nO1xuZnVuY3Rpb24gbG9nU2hhZGVyU291cmNlQW5kSW5mb0xvZyhcbiAgICBzaGFkZXJTb3VyY2U6IHN0cmluZywgc2hhZGVySW5mb0xvZzogc3RyaW5nKSB7XG4gIGNvbnN0IGxpbmVOdW1iZXJSZWdleFJlc3VsdCA9IGxpbmVOdW1iZXJSZWdleC5leGVjKHNoYWRlckluZm9Mb2cpO1xuICBpZiAobGluZU51bWJlclJlZ2V4UmVzdWx0ID09IG51bGwpIHtcbiAgICBjb25zb2xlLmxvZyhgQ291bGRuJ3QgcGFyc2UgbGluZSBudW1iZXIgaW4gZXJyb3I6ICR7c2hhZGVySW5mb0xvZ31gKTtcbiAgICBjb25zb2xlLmxvZyhzaGFkZXJTb3VyY2UpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGxpbmVOdW1iZXIgPSArbGluZU51bWJlclJlZ2V4UmVzdWx0WzFdO1xuXG4gIGNvbnN0IHNoYWRlckxpbmVzID0gc2hhZGVyU291cmNlLnNwbGl0KCdcXG4nKTtcbiAgY29uc3QgcGFkID0gc2hhZGVyTGluZXMubGVuZ3RoLnRvU3RyaW5nKCkubGVuZ3RoICsgMjtcbiAgY29uc3QgbGluZXNXaXRoTGluZU51bWJlcnMgPSBzaGFkZXJMaW5lcy5tYXAoXG4gICAgICAobGluZSwgbGluZU51bWJlcikgPT5cbiAgICAgICAgICB1dGlsLnJpZ2h0UGFkKChsaW5lTnVtYmVyICsgMSkudG9TdHJpbmcoKSwgcGFkKSArIGxpbmUpO1xuICBsZXQgbWF4TGluZUxlbmd0aCA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXNXaXRoTGluZU51bWJlcnMubGVuZ3RoOyBpKyspIHtcbiAgICBtYXhMaW5lTGVuZ3RoID0gTWF0aC5tYXgobGluZXNXaXRoTGluZU51bWJlcnNbaV0ubGVuZ3RoLCBtYXhMaW5lTGVuZ3RoKTtcbiAgfVxuXG4gIGNvbnN0IGJlZm9yZUVycm9yTGluZXMgPSBsaW5lc1dpdGhMaW5lTnVtYmVycy5zbGljZSgwLCBsaW5lTnVtYmVyIC0gMSk7XG4gIGNvbnN0IGVycm9yTGluZSA9IGxpbmVzV2l0aExpbmVOdW1iZXJzLnNsaWNlKGxpbmVOdW1iZXIgLSAxLCBsaW5lTnVtYmVyKTtcbiAgY29uc3QgYWZ0ZXJFcnJvckxpbmVzID0gbGluZXNXaXRoTGluZU51bWJlcnMuc2xpY2UobGluZU51bWJlcik7XG5cbiAgY29uc29sZS5sb2coYmVmb3JlRXJyb3JMaW5lcy5qb2luKCdcXG4nKSk7XG4gIGNvbnNvbGUubG9nKHNoYWRlckluZm9Mb2cuc3BsaXQoJ1xcbicpWzBdKTtcbiAgY29uc29sZS5sb2coXG4gICAgICBgJWMgJHt1dGlsLnJpZ2h0UGFkKGVycm9yTGluZVswXSwgbWF4TGluZUxlbmd0aCl9YCxcbiAgICAgICdib3JkZXI6MXB4IHNvbGlkIHJlZDsgYmFja2dyb3VuZC1jb2xvcjojZTNkMmQyOyBjb2xvcjojYTYxNzE3Jyk7XG4gIGNvbnNvbGUubG9nKGFmdGVyRXJyb3JMaW5lcy5qb2luKCdcXG4nKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQcm9ncmFtKGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQpOiBXZWJHTFByb2dyYW0ge1xuICByZXR1cm4gdGhyb3dJZk51bGw8V2ViR0xQcm9ncmFtPihcbiAgICAgIGdsLCAoKSA9PiBnbC5jcmVhdGVQcm9ncmFtKCksICdVbmFibGUgdG8gY3JlYXRlIFdlYkdMUHJvZ3JhbS4nKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxpbmtQcm9ncmFtKGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQsIHByb2dyYW06IFdlYkdMUHJvZ3JhbSkge1xuICBjYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmxpbmtQcm9ncmFtKHByb2dyYW0pKTtcbiAgaWYgKGdsLmdldFByb2dyYW1QYXJhbWV0ZXIocHJvZ3JhbSwgZ2wuTElOS19TVEFUVVMpID09PSBmYWxzZSkge1xuICAgIGNvbnNvbGUubG9nKGdsLmdldFByb2dyYW1JbmZvTG9nKHByb2dyYW0pKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBsaW5rIHZlcnRleCBhbmQgZnJhZ21lbnQgc2hhZGVycy4nKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVQcm9ncmFtKFxuICAgIGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQsIHByb2dyYW06IFdlYkdMUHJvZ3JhbSkge1xuICBjYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLnZhbGlkYXRlUHJvZ3JhbShwcm9ncmFtKSk7XG4gIGlmIChnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKHByb2dyYW0sIGdsLlZBTElEQVRFX1NUQVRVUykgPT09IGZhbHNlKSB7XG4gICAgY29uc29sZS5sb2coZ2wuZ2V0UHJvZ3JhbUluZm9Mb2cocHJvZ3JhbSkpO1xuICAgIHRocm93IG5ldyBFcnJvcignU2hhZGVyIHByb2dyYW0gdmFsaWRhdGlvbiBmYWlsZWQuJyk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVN0YXRpY1ZlcnRleEJ1ZmZlcihcbiAgICBnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0LCBkYXRhOiBGbG9hdDMyQXJyYXkpOiBXZWJHTEJ1ZmZlciB7XG4gIGNvbnN0IGJ1ZmZlcjogV2ViR0xCdWZmZXIgPSB0aHJvd0lmTnVsbDxXZWJHTEJ1ZmZlcj4oXG4gICAgICBnbCwgKCkgPT4gZ2wuY3JlYXRlQnVmZmVyKCksICdVbmFibGUgdG8gY3JlYXRlIFdlYkdMQnVmZmVyJyk7XG4gIGNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIGJ1ZmZlcikpO1xuICBjYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmJ1ZmZlckRhdGEoZ2wuQVJSQVlfQlVGRkVSLCBkYXRhLCBnbC5TVEFUSUNfRFJBVykpO1xuICByZXR1cm4gYnVmZmVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU3RhdGljSW5kZXhCdWZmZXIoXG4gICAgZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgZGF0YTogVWludDE2QXJyYXkpOiBXZWJHTEJ1ZmZlciB7XG4gIGNvbnN0IGJ1ZmZlcjogV2ViR0xCdWZmZXIgPSB0aHJvd0lmTnVsbDxXZWJHTEJ1ZmZlcj4oXG4gICAgICBnbCwgKCkgPT4gZ2wuY3JlYXRlQnVmZmVyKCksICdVbmFibGUgdG8gY3JlYXRlIFdlYkdMQnVmZmVyJyk7XG4gIGNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuYmluZEJ1ZmZlcihnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgYnVmZmVyKSk7XG4gIGNhbGxBbmRDaGVjayhcbiAgICAgIGdsLCAoKSA9PiBnbC5idWZmZXJEYXRhKGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCBkYXRhLCBnbC5TVEFUSUNfRFJBVykpO1xuICByZXR1cm4gYnVmZmVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TnVtQ2hhbm5lbHMoKTogbnVtYmVyIHtcbiAgaWYgKGVudigpLmdldE51bWJlcignV0VCR0xfVkVSU0lPTicpID09PSAyKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cbiAgcmV0dXJuIDQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUZXh0dXJlKGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQpOiBXZWJHTFRleHR1cmUge1xuICByZXR1cm4gdGhyb3dJZk51bGw8V2ViR0xUZXh0dXJlPihcbiAgICAgIGdsLCAoKSA9PiBnbC5jcmVhdGVUZXh0dXJlKCksICdVbmFibGUgdG8gY3JlYXRlIFdlYkdMVGV4dHVyZS4nKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlVGV4dHVyZVNpemUod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcbiAgY29uc3QgbWF4VGV4dHVyZVNpemUgPSBlbnYoKS5nZXROdW1iZXIoJ1dFQkdMX01BWF9URVhUVVJFX1NJWkUnKTtcbiAgaWYgKCh3aWR0aCA8PSAwKSB8fCAoaGVpZ2h0IDw9IDApKSB7XG4gICAgY29uc3QgcmVxdWVzdGVkID0gYFske3dpZHRofXgke2hlaWdodH1dYDtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVlc3RlZCB0ZXh0dXJlIHNpemUgJyArIHJlcXVlc3RlZCArICcgaXMgaW52YWxpZC4nKTtcbiAgfVxuICBpZiAoKHdpZHRoID4gbWF4VGV4dHVyZVNpemUpIHx8IChoZWlnaHQgPiBtYXhUZXh0dXJlU2l6ZSkpIHtcbiAgICBjb25zdCByZXF1ZXN0ZWQgPSBgWyR7d2lkdGh9eCR7aGVpZ2h0fV1gO1xuICAgIGNvbnN0IG1heCA9IGBbJHttYXhUZXh0dXJlU2l6ZX14JHttYXhUZXh0dXJlU2l6ZX1dYDtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdSZXF1ZXN0ZWQgdGV4dHVyZSBzaXplICcgKyByZXF1ZXN0ZWQgK1xuICAgICAgICAnIGdyZWF0ZXIgdGhhbiBXZWJHTCBtYXhpbXVtIG9uIHRoaXMgYnJvd3NlciAvIEdQVSAnICsgbWF4ICsgJy4nKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRnJhbWVidWZmZXIoZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCk6IFdlYkdMRnJhbWVidWZmZXIge1xuICByZXR1cm4gdGhyb3dJZk51bGw8V2ViR0xGcmFtZWJ1ZmZlcj4oXG4gICAgICBnbCwgKCkgPT4gZ2wuY3JlYXRlRnJhbWVidWZmZXIoKSwgJ1VuYWJsZSB0byBjcmVhdGUgV2ViR0xGcmFtZWJ1ZmZlci4nKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJpbmRWZXJ0ZXhCdWZmZXJUb1Byb2dyYW1BdHRyaWJ1dGUoXG4gICAgZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgcHJvZ3JhbTogV2ViR0xQcm9ncmFtLCBhdHRyaWJ1dGU6IHN0cmluZyxcbiAgICBidWZmZXI6IFdlYkdMQnVmZmVyLCBhcnJheUVudHJpZXNQZXJJdGVtOiBudW1iZXIsIGl0ZW1TdHJpZGVJbkJ5dGVzOiBudW1iZXIsXG4gICAgaXRlbU9mZnNldEluQnl0ZXM6IG51bWJlcik6IGJvb2xlYW4ge1xuICBjb25zdCBsb2MgPSBnbC5nZXRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCBhdHRyaWJ1dGUpO1xuICBpZiAobG9jID09PSAtMSkge1xuICAgIC8vIFRoZSBHUFUgY29tcGlsZXIgZGVjaWRlZCB0byBzdHJpcCBvdXQgdGhpcyBhdHRyaWJ1dGUgYmVjYXVzZSBpdCdzIHVudXNlZCxcbiAgICAvLyB0aHVzIG5vIG5lZWQgdG8gYmluZC5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgYnVmZmVyKSk7XG4gIGNhbGxBbmRDaGVjayhcbiAgICAgIGdsLFxuICAgICAgKCkgPT4gZ2wudmVydGV4QXR0cmliUG9pbnRlcihcbiAgICAgICAgICBsb2MsIGFycmF5RW50cmllc1Blckl0ZW0sIGdsLkZMT0FULCBmYWxzZSwgaXRlbVN0cmlkZUluQnl0ZXMsXG4gICAgICAgICAgaXRlbU9mZnNldEluQnl0ZXMpKTtcbiAgY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShsb2MpKTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBiaW5kVGV4dHVyZVVuaXQoXG4gICAgZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgdGV4dHVyZTogV2ViR0xUZXh0dXJlLCB0ZXh0dXJlVW5pdDogbnVtYmVyKSB7XG4gIHZhbGlkYXRlVGV4dHVyZVVuaXQoZ2wsIHRleHR1cmVVbml0KTtcbiAgY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5hY3RpdmVUZXh0dXJlKGdsLlRFWFRVUkUwICsgdGV4dHVyZVVuaXQpKTtcbiAgY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCB0ZXh0dXJlKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1bmJpbmRUZXh0dXJlVW5pdChcbiAgICBnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0LCB0ZXh0dXJlVW5pdDogbnVtYmVyKSB7XG4gIHZhbGlkYXRlVGV4dHVyZVVuaXQoZ2wsIHRleHR1cmVVbml0KTtcbiAgY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5hY3RpdmVUZXh0dXJlKGdsLlRFWFRVUkUwICsgdGV4dHVyZVVuaXQpKTtcbiAgY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBudWxsKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQcm9ncmFtVW5pZm9ybUxvY2F0aW9uT3JUaHJvdyhcbiAgICBnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0LCBwcm9ncmFtOiBXZWJHTFByb2dyYW0sXG4gICAgdW5pZm9ybU5hbWU6IHN0cmluZyk6IFdlYkdMVW5pZm9ybUxvY2F0aW9uIHtcbiAgcmV0dXJuIHRocm93SWZOdWxsPFdlYkdMVW5pZm9ybUxvY2F0aW9uPihcbiAgICAgIGdsLCAoKSA9PiBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgdW5pZm9ybU5hbWUpLFxuICAgICAgJ3VuaWZvcm0gXCInICsgdW5pZm9ybU5hbWUgKyAnXCIgbm90IHByZXNlbnQgaW4gcHJvZ3JhbS4nKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFByb2dyYW1Vbmlmb3JtTG9jYXRpb24oXG4gICAgZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgcHJvZ3JhbTogV2ViR0xQcm9ncmFtLFxuICAgIHVuaWZvcm1OYW1lOiBzdHJpbmcpOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbiB7XG4gIHJldHVybiBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgdW5pZm9ybU5hbWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYmluZFRleHR1cmVUb1Byb2dyYW1Vbmlmb3JtU2FtcGxlcihcbiAgICBnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0LCB0ZXh0dXJlOiBXZWJHTFRleHR1cmUsXG4gICAgdW5pZm9ybVNhbXBsZXJMb2NhdGlvbjogV2ViR0xVbmlmb3JtTG9jYXRpb24sIHRleHR1cmVVbml0OiBudW1iZXIpIHtcbiAgY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBiaW5kVGV4dHVyZVVuaXQoZ2wsIHRleHR1cmUsIHRleHR1cmVVbml0KSk7XG4gIGNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wudW5pZm9ybTFpKHVuaWZvcm1TYW1wbGVyTG9jYXRpb24sIHRleHR1cmVVbml0KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBiaW5kQ2FudmFzVG9GcmFtZWJ1ZmZlcihnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0KSB7XG4gIGNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBudWxsKSk7XG4gIGNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wudmlld3BvcnQoMCwgMCwgZ2wuY2FudmFzLndpZHRoLCBnbC5jYW52YXMuaGVpZ2h0KSk7XG4gIGNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuc2Npc3NvcigwLCAwLCBnbC5jYW52YXMud2lkdGgsIGdsLmNhbnZhcy5oZWlnaHQpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJpbmRDb2xvclRleHR1cmVUb0ZyYW1lYnVmZmVyKFxuICAgIGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQsIHRleHR1cmU6IFdlYkdMVGV4dHVyZSxcbiAgICBmcmFtZWJ1ZmZlcjogV2ViR0xGcmFtZWJ1ZmZlcikge1xuICBjYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgZnJhbWVidWZmZXIpKTtcbiAgY2FsbEFuZENoZWNrKFxuICAgICAgZ2wsXG4gICAgICAoKSA9PiBnbC5mcmFtZWJ1ZmZlclRleHR1cmUyRChcbiAgICAgICAgICBnbC5GUkFNRUJVRkZFUiwgZ2wuQ09MT1JfQVRUQUNITUVOVDAsIGdsLlRFWFRVUkVfMkQsIHRleHR1cmUsIDApKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVuYmluZENvbG9yVGV4dHVyZUZyb21GcmFtZWJ1ZmZlcihcbiAgICBnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0LCBmcmFtZWJ1ZmZlcjogV2ViR0xGcmFtZWJ1ZmZlcikge1xuICBjYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgZnJhbWVidWZmZXIpKTtcbiAgY2FsbEFuZENoZWNrKFxuICAgICAgZ2wsXG4gICAgICAoKSA9PiBnbC5mcmFtZWJ1ZmZlclRleHR1cmUyRChcbiAgICAgICAgICBnbC5GUkFNRUJVRkZFUiwgZ2wuQ09MT1JfQVRUQUNITUVOVDAsIGdsLlRFWFRVUkVfMkQsIG51bGwsIDApKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlRnJhbWVidWZmZXIoZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCkge1xuICBjb25zdCBzdGF0dXMgPSBnbC5jaGVja0ZyYW1lYnVmZmVyU3RhdHVzKGdsLkZSQU1FQlVGRkVSKTtcbiAgaWYgKHN0YXR1cyAhPT0gZ2wuRlJBTUVCVUZGRVJfQ09NUExFVEUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdFcnJvciBiaW5kaW5nIGZyYW1lYnVmZmVyOiAnICsgZ2V0RnJhbWVidWZmZXJFcnJvck1lc3NhZ2UoZ2wsIHN0YXR1cykpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGcmFtZWJ1ZmZlckVycm9yTWVzc2FnZShcbiAgICBnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0LCBzdGF0dXM6IG51bWJlcik6IHN0cmluZyB7XG4gIHN3aXRjaCAoc3RhdHVzKSB7XG4gICAgY2FzZSBnbC5GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0FUVEFDSE1FTlQ6XG4gICAgICByZXR1cm4gJ0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfQVRUQUNITUVOVCc7XG4gICAgY2FzZSBnbC5GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX01JU1NJTkdfQVRUQUNITUVOVDpcbiAgICAgIHJldHVybiAnRlJBTUVCVUZGRVJfSU5DT01QTEVURV9NSVNTSU5HX0FUVEFDSE1FTlQnO1xuICAgIGNhc2UgZ2wuRlJBTUVCVUZGRVJfSU5DT01QTEVURV9ESU1FTlNJT05TOlxuICAgICAgcmV0dXJuICdGUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0RJTUVOU0lPTlMnO1xuICAgIGNhc2UgZ2wuRlJBTUVCVUZGRVJfVU5TVVBQT1JURUQ6XG4gICAgICByZXR1cm4gJ0ZSQU1FQlVGRkVSX1VOU1VQUE9SVEVEJztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGB1bmtub3duIGVycm9yICR7c3RhdHVzfWA7XG4gIH1cbn1cblxuZnVuY3Rpb24gdGhyb3dJZk51bGw8VD4oXG4gICAgZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgcmV0dXJuVE9yTnVsbDogKCkgPT4gVCB8IG51bGwsXG4gICAgZmFpbHVyZU1lc3NhZ2U6IHN0cmluZyk6IFQge1xuICBjb25zdCB0T3JOdWxsOiBUfG51bGwgPSBjYWxsQW5kQ2hlY2soZ2wsICgpID0+IHJldHVyblRPck51bGwoKSk7XG4gIGlmICh0T3JOdWxsID09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoZmFpbHVyZU1lc3NhZ2UpO1xuICB9XG4gIHJldHVybiB0T3JOdWxsO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVRleHR1cmVVbml0KGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQsIHRleHR1cmVVbml0OiBudW1iZXIpIHtcbiAgY29uc3QgbWF4VGV4dHVyZVVuaXQgPSBnbC5NQVhfQ09NQklORURfVEVYVFVSRV9JTUFHRV9VTklUUyAtIDE7XG4gIGNvbnN0IGdsVGV4dHVyZVVuaXQgPSB0ZXh0dXJlVW5pdCArIGdsLlRFWFRVUkUwO1xuICBpZiAoZ2xUZXh0dXJlVW5pdCA8IGdsLlRFWFRVUkUwIHx8IGdsVGV4dHVyZVVuaXQgPiBtYXhUZXh0dXJlVW5pdCkge1xuICAgIGNvbnN0IHRleHR1cmVVbml0UmFuZ2UgPSBgW2dsLlRFWFRVUkUwLCBnbC5URVhUVVJFJHttYXhUZXh0dXJlVW5pdH1dYDtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHRleHR1cmVVbml0IG11c3QgYmUgaW4gJHt0ZXh0dXJlVW5pdFJhbmdlfS5gKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QmF0Y2hEaW0oc2hhcGU6IG51bWJlcltdLCBkaW1zVG9Ta2lwID0gMik6IG51bWJlciB7XG4gIHJldHVybiB1dGlsLnNpemVGcm9tU2hhcGUoc2hhcGUuc2xpY2UoMCwgc2hhcGUubGVuZ3RoIC0gZGltc1RvU2tpcCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Um93c0NvbHMoc2hhcGU6IG51bWJlcltdKTogW251bWJlciwgbnVtYmVyXSB7XG4gIGlmIChzaGFwZS5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBFcnJvcignQ2Fubm90IGdldCByb3dzIGFuZCBjb2x1bW5zIG9mIGFuIGVtcHR5IHNoYXBlIGFycmF5LicpO1xuICB9XG5cbiAgcmV0dXJuIFtcbiAgICBzaGFwZS5sZW5ndGggPiAxID8gc2hhcGVbc2hhcGUubGVuZ3RoIC0gMl0gOiAxLCBzaGFwZVtzaGFwZS5sZW5ndGggLSAxXVxuICBdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2hhcGVBczNEKHNoYXBlOiBudW1iZXJbXSk6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSB7XG4gIGxldCBzaGFwZUFzM0Q6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9IFsxLCAxLCAxXTtcbiAgY29uc3QgaXNTY2FsYXIgPSBzaGFwZS5sZW5ndGggPT09IDAgfHwgKHNoYXBlLmxlbmd0aCA9PT0gMSAmJiBzaGFwZVswXSA9PT0gMSk7XG4gIGlmICghaXNTY2FsYXIpIHtcbiAgICBzaGFwZUFzM0QgPVxuICAgICAgICBbZ2V0QmF0Y2hEaW0oc2hhcGUpLCAuLi5nZXRSb3dzQ29scyhzaGFwZSldIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcbiAgfVxuICByZXR1cm4gc2hhcGVBczNEO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGV4dHVyZVNoYXBlRnJvbUxvZ2ljYWxTaGFwZShcbiAgICBsb2dTaGFwZTogbnVtYmVyW10sIGlzUGFja2VkID0gZmFsc2UpOiBbbnVtYmVyLCBudW1iZXJdIHtcbiAgbGV0IG1heFRleFNpemUgPSBlbnYoKS5nZXROdW1iZXIoJ1dFQkdMX01BWF9URVhUVVJFX1NJWkUnKTtcbiAgaWYgKGlzUGFja2VkKSB7XG4gICAgbWF4VGV4U2l6ZSA9IG1heFRleFNpemUgKiAyO1xuXG4gICAgLy8gVGhpcyBsb2dpYyBlbnN1cmVzIHdlIGFjY3VyYXRlbHkgY291bnQgdGhlIG51bWJlciBvZiBwYWNrZWQgdGV4ZWxzIG5lZWRlZFxuICAgIC8vIHRvIGFjY29tbW9kYXRlIHRoZSB0ZW5zb3IuIFdlIGNhbiBvbmx5IHBhY2sgdmFsdWVzIGluIHRoZSBzYW1lIHRleGVsIGlmXG4gICAgLy8gdGhleSBhcmUgZnJvbSBhZGphY2VudCBwYWlycyBvZiByb3dzL2NvbHMgd2l0aGluIHRoZSBzYW1lIGJhdGNoLiBTbyBpZiBhXG4gICAgLy8gdGVuc29yIGhhcyAzIHJvd3MsIHdlIHByZXRlbmQgaXQgaGFzIDQgcm93cyBpbiBvcmRlciB0byBhY2NvdW50IGZvciB0aGVcbiAgICAvLyBmYWN0IHRoYXQgdGhlIHRleGVscyBjb250YWluaW5nIHRoZSB0aGlyZCByb3cgYXJlIGhhbGYgZW1wdHkuXG4gICAgbG9nU2hhcGUgPSBsb2dTaGFwZS5tYXAoXG4gICAgICAgIChkLCBpKSA9PiBpID49IGxvZ1NoYXBlLmxlbmd0aCAtIDIgP1xuICAgICAgICAgICAgdXRpbC5uZWFyZXN0TGFyZ2VyRXZlbihsb2dTaGFwZVtpXSkgOlxuICAgICAgICAgICAgbG9nU2hhcGVbaV0pO1xuXG4gICAgLy8gUGFja2VkIHRleHR1cmUgaGVpZ2h0IGlzIGF0IGxlYXN0IDIgKHRoZSBjaGFubmVsIGhlaWdodCBvZiBhIHNpbmdsZVxuICAgIC8vIHRleGVsKS5cbiAgICBpZiAobG9nU2hhcGUubGVuZ3RoID09PSAxKSB7XG4gICAgICBsb2dTaGFwZSA9IFsyLCBsb2dTaGFwZVswXV07XG4gICAgfVxuICB9XG5cbiAgLy8gSWYgbG9naWNhbCBzaGFwZSBpcyAyLCB3ZSBkb24ndCBzcXVlZXplLCBzaW5jZSB3ZSB3YW50IHRvIG1hdGNoIHBoeXNpY2FsLlxuICBpZiAobG9nU2hhcGUubGVuZ3RoICE9PSAyKSB7XG4gICAgY29uc3Qgc3F1ZWV6ZVJlc3VsdCA9IHV0aWwuc3F1ZWV6ZVNoYXBlKGxvZ1NoYXBlKTtcbiAgICBsb2dTaGFwZSA9IHNxdWVlemVSZXN1bHQubmV3U2hhcGU7XG4gIH1cblxuICBsZXQgc2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShsb2dTaGFwZSk7XG4gIGlmIChsb2dTaGFwZS5sZW5ndGggPD0gMSAmJiBzaXplIDw9IG1heFRleFNpemUpIHtcbiAgICByZXR1cm4gWzEsIHNpemVdO1xuICB9IGVsc2UgaWYgKFxuICAgICAgbG9nU2hhcGUubGVuZ3RoID09PSAyICYmIGxvZ1NoYXBlWzBdIDw9IG1heFRleFNpemUgJiZcbiAgICAgIGxvZ1NoYXBlWzFdIDw9IG1heFRleFNpemUpIHtcbiAgICByZXR1cm4gbG9nU2hhcGUgYXMgW251bWJlciwgbnVtYmVyXTtcbiAgfSBlbHNlIGlmIChcbiAgICAgIGxvZ1NoYXBlLmxlbmd0aCA9PT0gMyAmJiBsb2dTaGFwZVswXSAqIGxvZ1NoYXBlWzFdIDw9IG1heFRleFNpemUgJiZcbiAgICAgIGxvZ1NoYXBlWzJdIDw9IG1heFRleFNpemUpIHtcbiAgICByZXR1cm4gW2xvZ1NoYXBlWzBdICogbG9nU2hhcGVbMV0sIGxvZ1NoYXBlWzJdXTtcbiAgfSBlbHNlIGlmIChcbiAgICAgIGxvZ1NoYXBlLmxlbmd0aCA9PT0gMyAmJiBsb2dTaGFwZVswXSA8PSBtYXhUZXhTaXplICYmXG4gICAgICBsb2dTaGFwZVsxXSAqIGxvZ1NoYXBlWzJdIDw9IG1heFRleFNpemUpIHtcbiAgICByZXR1cm4gW2xvZ1NoYXBlWzBdLCBsb2dTaGFwZVsxXSAqIGxvZ1NoYXBlWzJdXTtcbiAgfSBlbHNlIGlmIChcbiAgICAgIGxvZ1NoYXBlLmxlbmd0aCA9PT0gNCAmJlxuICAgICAgbG9nU2hhcGVbMF0gKiBsb2dTaGFwZVsxXSAqIGxvZ1NoYXBlWzJdIDw9IG1heFRleFNpemUgJiZcbiAgICAgIGxvZ1NoYXBlWzNdIDw9IG1heFRleFNpemUpIHtcbiAgICByZXR1cm4gW2xvZ1NoYXBlWzBdICogbG9nU2hhcGVbMV0gKiBsb2dTaGFwZVsyXSwgbG9nU2hhcGVbM11dO1xuICB9IGVsc2UgaWYgKFxuICAgICAgbG9nU2hhcGUubGVuZ3RoID09PSA0ICYmIGxvZ1NoYXBlWzBdIDw9IG1heFRleFNpemUgJiZcbiAgICAgIGxvZ1NoYXBlWzFdICogbG9nU2hhcGVbMl0gKiBsb2dTaGFwZVszXSA8PSBtYXhUZXhTaXplKSB7XG4gICAgcmV0dXJuIFtsb2dTaGFwZVswXSwgbG9nU2hhcGVbMV0gKiBsb2dTaGFwZVsyXSAqIGxvZ1NoYXBlWzNdXTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoaXNQYWNrZWQpIHtcbiAgICAgIC8vIEZvciBwYWNrZWQgdGV4dHVyZXMgc2l6ZSBlcXVhbHMgdGhlIG51bWJlciBvZiBjaGFubmVscyByZXF1aXJlZCB0b1xuICAgICAgLy8gYWNjb21tb2RhdGUgdGhlIHRleHR1cmUgZGF0YS4gSG93ZXZlciBpbiBvcmRlciB0byBzcXVhcmlmeSBzdWNoIHRoYXRcbiAgICAgIC8vIGlubmVyIGRpbWVuc2lvbnMgc3RheSBldmVuLCB3ZSByZXdyaXRlIHNpemUgdG8gZXF1YWwgdGhlIG51bWJlciBvZlxuICAgICAgLy8gdGV4ZWxzLiBUaGVuIGluIHRoZSByZXR1cm4gc3RhdGVtZW50IHdlIHJlaHlkcmF0ZSB0aGUgc3F1YXJpZmllZFxuICAgICAgLy8gZGltZW5zaW9ucyB0byBjaGFubmVsIHVuaXRzLlxuXG4gICAgICBjb25zdCBiYXRjaERpbSA9IGdldEJhdGNoRGltKGxvZ1NoYXBlKTtcbiAgICAgIGxldCByb3dzID0gMiwgY29scyA9IDI7XG4gICAgICBpZiAobG9nU2hhcGUubGVuZ3RoKSB7XG4gICAgICAgIFtyb3dzLCBjb2xzXSA9IGdldFJvd3NDb2xzKGxvZ1NoYXBlKTtcbiAgICAgIH1cbiAgICAgIHNpemUgPSBiYXRjaERpbSAqIChyb3dzIC8gMikgKiAoY29scyAvIDIpO1xuICAgICAgcmV0dXJuIHV0aWwuc2l6ZVRvU3F1YXJpc2hTaGFwZShzaXplKS5tYXAoZCA9PiBkICogMikgYXMgW251bWJlciwgbnVtYmVyXTtcbiAgICB9XG4gICAgcmV0dXJuIHV0aWwuc2l6ZVRvU3F1YXJpc2hTaGFwZShzaXplKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0V2ZW4objogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHJldHVybiBuICUgMiA9PT0gMDtcbn1cblxuLyoqXG4gKiBUaGlzIGRldGVybWluZXMgd2hldGhlciByZXNoYXBpbmcgYSBwYWNrZWQgdGV4dHVyZSByZXF1aXJlcyByZWFycmFuZ2luZ1xuICogdGhlIGRhdGEgd2l0aGluIHRoZSB0ZXh0dXJlLCBhc3N1bWluZyAyeDIgcGFja2luZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUmVzaGFwZUZyZWUoc2hhcGUxOiBudW1iZXJbXSwgc2hhcGUyOiBudW1iZXJbXSk6IGJvb2xlYW4ge1xuICBzaGFwZTEgPSBzaGFwZTEuc2xpY2UoLTIpO1xuICBzaGFwZTIgPSBzaGFwZTIuc2xpY2UoLTIpO1xuXG4gIGlmICh1dGlsLmFycmF5c0VxdWFsKHNoYXBlMSwgc2hhcGUyKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKCFzaGFwZTEubGVuZ3RoIHx8ICFzaGFwZTIubGVuZ3RoKSB7ICAvLyBPbmUgb2YgdGhlIHNoYXBlcyBpcyBhIHNjYWxhci5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChzaGFwZTFbMF0gPT09IDAgfHwgc2hhcGUxWzFdID09PSAwIHx8IHNoYXBlMlswXSA9PT0gMCB8fFxuICAgICAgc2hhcGUyWzFdID09PSAwKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoc2hhcGUxLmxlbmd0aCAhPT0gc2hhcGUyLmxlbmd0aCkgeyAgLy8gT25lIG9mIHRoZSBzaGFwZXMgaXMgYSB2ZWN0b3IuXG4gICAgY29uc3Qgc2hhcGUxQ29scyA9IHNoYXBlMS5zbGljZSgtMSlbMF07XG4gICAgY29uc3Qgc2hhcGUyQ29scyA9IHNoYXBlMi5zbGljZSgtMSlbMF07XG4gICAgaWYgKHNoYXBlMUNvbHMgPT09IHNoYXBlMkNvbHMpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChpc0V2ZW4oc2hhcGUxQ29scykgJiYgaXNFdmVuKHNoYXBlMkNvbHMpICYmXG4gICAgICAgIChzaGFwZTFbMF0gPT09IDEgfHwgc2hhcGUyWzBdID09PSAxKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBzaGFwZTFbMV0gPT09IHNoYXBlMlsxXSAmJiBpc0V2ZW4oc2hhcGUxWzBdKSAmJiBpc0V2ZW4oc2hhcGUyWzBdKTtcbn1cblxuLy8gV2UgY2FjaGUgd2ViZ2wgcGFyYW1zIGJlY2F1c2UgdGhlIGVudmlyb25tZW50IGdldHMgcmVzZXQgYmV0d2VlblxuLy8gdW5pdCB0ZXN0cyBhbmQgd2UgZG9uJ3Qgd2FudCB0byBjb25zdGFudGx5IHF1ZXJ5IHRoZSBXZWJHTENvbnRleHQgZm9yXG4vLyBNQVhfVEVYVFVSRV9TSVpFLlxubGV0IE1BWF9URVhUVVJFX1NJWkU6IG51bWJlcjtcbmxldCBNQVhfVEVYVFVSRVNfSU5fU0hBREVSOiBudW1iZXI7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRXZWJHTE1heFRleHR1cmVTaXplKHdlYkdMVmVyc2lvbjogbnVtYmVyKTogbnVtYmVyIHtcbiAgaWYgKE1BWF9URVhUVVJFX1NJWkUgPT0gbnVsbCkge1xuICAgIGNvbnN0IGdsID0gZ2V0V2ViR0xDb250ZXh0KHdlYkdMVmVyc2lvbik7XG4gICAgTUFYX1RFWFRVUkVfU0laRSA9IGdsLmdldFBhcmFtZXRlcihnbC5NQVhfVEVYVFVSRV9TSVpFKTtcbiAgfVxuICByZXR1cm4gTUFYX1RFWFRVUkVfU0laRTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc2V0TWF4VGV4dHVyZVNpemUoKSB7XG4gIE1BWF9URVhUVVJFX1NJWkUgPSBudWxsO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlc2V0TWF4VGV4dHVyZXNJblNoYWRlcigpIHtcbiAgTUFYX1RFWFRVUkVTX0lOX1NIQURFUiA9IG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRNYXhUZXh0dXJlc0luU2hhZGVyKHdlYkdMVmVyc2lvbjogbnVtYmVyKTogbnVtYmVyIHtcbiAgaWYgKE1BWF9URVhUVVJFU19JTl9TSEFERVIgPT0gbnVsbCkge1xuICAgIGNvbnN0IGdsID0gZ2V0V2ViR0xDb250ZXh0KHdlYkdMVmVyc2lvbik7XG4gICAgTUFYX1RFWFRVUkVTX0lOX1NIQURFUiA9IGdsLmdldFBhcmFtZXRlcihnbC5NQVhfVEVYVFVSRV9JTUFHRV9VTklUUyk7XG4gIH1cbiAgLy8gV2UgY2FwIGF0IDE2IHRvIGF2b2lkIHNwdXJpb3VzIHJ1bnRpbWUgXCJtZW1vcnkgZXhoYXVzdGVkXCIgZXJyb3IuXG4gIHJldHVybiBNYXRoLm1pbigxNiwgTUFYX1RFWFRVUkVTX0lOX1NIQURFUik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRXZWJHTERpc2pvaW50UXVlcnlUaW1lclZlcnNpb24od2ViR0xWZXJzaW9uOiBudW1iZXIpOlxuICAgIG51bWJlciB7XG4gIGlmICh3ZWJHTFZlcnNpb24gPT09IDApIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGxldCBxdWVyeVRpbWVyVmVyc2lvbjogbnVtYmVyO1xuICBjb25zdCBnbCA9IGdldFdlYkdMQ29udGV4dCh3ZWJHTFZlcnNpb24pO1xuXG4gIGlmIChoYXNFeHRlbnNpb24oZ2wsICdFWFRfZGlzam9pbnRfdGltZXJfcXVlcnlfd2ViZ2wyJykgJiZcbiAgICAgIHdlYkdMVmVyc2lvbiA9PT0gMikge1xuICAgIHF1ZXJ5VGltZXJWZXJzaW9uID0gMjtcbiAgfSBlbHNlIGlmIChoYXNFeHRlbnNpb24oZ2wsICdFWFRfZGlzam9pbnRfdGltZXJfcXVlcnknKSkge1xuICAgIHF1ZXJ5VGltZXJWZXJzaW9uID0gMTtcbiAgfSBlbHNlIHtcbiAgICBxdWVyeVRpbWVyVmVyc2lvbiA9IDA7XG4gIH1cbiAgcmV0dXJuIHF1ZXJ5VGltZXJWZXJzaW9uO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzRXh0ZW5zaW9uKGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQsIGV4dGVuc2lvbk5hbWU6IHN0cmluZykge1xuICBjb25zdCBleHQgPSBnbC5nZXRFeHRlbnNpb24oZXh0ZW5zaW9uTmFtZSk7XG4gIHJldHVybiBleHQgIT0gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzV2ViR0xWZXJzaW9uRW5hYmxlZCh3ZWJHTFZlcnNpb246IDF8Mikge1xuICB0cnkge1xuICAgIGNvbnN0IGdsID0gZ2V0V2ViR0xDb250ZXh0KHdlYkdMVmVyc2lvbik7XG4gICAgaWYgKGdsICE9IG51bGwpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUubG9nKCdFcnJvciB3aGVuIGdldHRpbmcgV2ViR0wgY29udGV4dDogJywgZSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQ2FwYWJsZU9mUmVuZGVyaW5nVG9GbG9hdFRleHR1cmUod2ViR0xWZXJzaW9uOiBudW1iZXIpOlxuICAgIGJvb2xlYW4ge1xuICBpZiAod2ViR0xWZXJzaW9uID09PSAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgZ2wgPSBnZXRXZWJHTENvbnRleHQod2ViR0xWZXJzaW9uKTtcblxuICBpZiAod2ViR0xWZXJzaW9uID09PSAxKSB7XG4gICAgaWYgKCFoYXNFeHRlbnNpb24oZ2wsICdPRVNfdGV4dHVyZV9mbG9hdCcpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmICghaGFzRXh0ZW5zaW9uKGdsLCAnRVhUX2NvbG9yX2J1ZmZlcl9mbG9hdCcpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgaXNGcmFtZUJ1ZmZlckNvbXBsZXRlID0gY3JlYXRlRmxvYXRUZXh0dXJlQW5kQmluZFRvRnJhbWVidWZmZXIoZ2wpO1xuICByZXR1cm4gaXNGcmFtZUJ1ZmZlckNvbXBsZXRlO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIHdlIGNhbiBkb3dubG9hZCB2YWx1ZXMgZnJvbSBhIGZsb2F0L2hhbGYtZmxvYXQgdGV4dHVyZS5cbiAqXG4gKiBOb3RlIHRoYXQgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMgd2UgdXNlIGJpbmRpbmcgYSB0ZXh0dXJlIHRvIGEgZnJhbWVidWZmZXJcbiAqIGFzIGEgcHJveHkgZm9yIGFiaWxpdHkgdG8gZG93bmxvYWQgZmxvYXQgdmFsdWVzIGxhdGVyIHVzaW5nIHJlYWRQaXhlbHMuIFRoZVxuICogdGV4dHVyZSBwYXJhbXMgb2YgdGhpcyB0ZXh0dXJlIHdpbGwgbm90IG1hdGNoIHRob3NlIGluIHJlYWRQaXhlbHMgZXhhY3RseVxuICogYnV0IGlmIHdlIGFyZSB1bmFibGUgdG8gYmluZCBzb21lIGtpbmQgb2YgZmxvYXQgdGV4dHVyZSB0byB0aGUgZnJhbWVCdWZmZXJcbiAqIHRoZW4gd2UgZGVmaW5pdGVseSB3aWxsIG5vdCBiZSBhYmxlIHRvIHJlYWQgZmxvYXQgdmFsdWVzIGZyb20gaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0Rvd25sb2FkRmxvYXRUZXh0dXJlRW5hYmxlZCh3ZWJHTFZlcnNpb246IG51bWJlcik6IGJvb2xlYW4ge1xuICBpZiAod2ViR0xWZXJzaW9uID09PSAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgZ2wgPSBnZXRXZWJHTENvbnRleHQod2ViR0xWZXJzaW9uKTtcblxuICBpZiAod2ViR0xWZXJzaW9uID09PSAxKSB7XG4gICAgaWYgKCFoYXNFeHRlbnNpb24oZ2wsICdPRVNfdGV4dHVyZV9mbG9hdCcpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghaGFzRXh0ZW5zaW9uKGdsLCAnV0VCR0xfY29sb3JfYnVmZmVyX2Zsb2F0JykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGhhc0V4dGVuc2lvbihnbCwgJ0VYVF9jb2xvcl9idWZmZXJfZmxvYXQnKSkge1xuICAgICAgcmV0dXJuIGNyZWF0ZUZsb2F0VGV4dHVyZUFuZEJpbmRUb0ZyYW1lYnVmZmVyKGdsKTtcbiAgICB9XG5cbiAgICBjb25zdCBDT0xPUl9CVUZGRVJfSEFMRl9GTE9BVCA9ICdFWFRfY29sb3JfYnVmZmVyX2hhbGZfZmxvYXQnO1xuICAgIGlmIChoYXNFeHRlbnNpb24oZ2wsIENPTE9SX0JVRkZFUl9IQUxGX0ZMT0FUKSkge1xuICAgICAgY29uc3QgdGV4dHVyZUhhbGZGbG9hdEV4dGVuc2lvbiA9XG4gICAgICAgICAgZ2wuZ2V0RXh0ZW5zaW9uKENPTE9SX0JVRkZFUl9IQUxGX0ZMT0FUKTtcbiAgICAgIHJldHVybiBjcmVhdGVIYWxmRmxvYXRUZXh0dXJlQW5kQmluZFRvRnJhbWVidWZmZXIoXG4gICAgICAgICAgZ2wsIHRleHR1cmVIYWxmRmxvYXRFeHRlbnNpb24pO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGlzRnJhbWVCdWZmZXJDb21wbGV0ZSA9IGNyZWF0ZUZsb2F0VGV4dHVyZUFuZEJpbmRUb0ZyYW1lYnVmZmVyKGdsKTtcbiAgcmV0dXJuIGlzRnJhbWVCdWZmZXJDb21wbGV0ZTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRmxvYXRUZXh0dXJlQW5kQmluZFRvRnJhbWVidWZmZXIoZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCk6XG4gICAgYm9vbGVhbiB7XG4gIGNvbnN0IHRleENvbmZpZyA9IGdldFRleHR1cmVDb25maWcoZ2wpO1xuXG4gIGNvbnN0IHRleHR1cmUgPSBnbC5jcmVhdGVUZXh0dXJlKCk7XG4gIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRleHR1cmUpO1xuXG4gIGNvbnN0IHdpZHRoID0gMTtcbiAgY29uc3QgaGVpZ2h0ID0gMTtcbiAgZ2wudGV4SW1hZ2UyRChcbiAgICAgIGdsLlRFWFRVUkVfMkQsIDAsIHRleENvbmZpZy5pbnRlcm5hbEZvcm1hdEZsb2F0LCB3aWR0aCwgaGVpZ2h0LCAwLFxuICAgICAgdGV4Q29uZmlnLnRleHR1cmVGb3JtYXRGbG9hdCwgdGV4Q29uZmlnLnRleHR1cmVUeXBlRmxvYXQsIG51bGwpO1xuXG4gIGNvbnN0IGZyYW1lQnVmZmVyID0gZ2wuY3JlYXRlRnJhbWVidWZmZXIoKTtcbiAgZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBmcmFtZUJ1ZmZlcik7XG4gIGdsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKFxuICAgICAgZ2wuRlJBTUVCVUZGRVIsIGdsLkNPTE9SX0FUVEFDSE1FTlQwLCBnbC5URVhUVVJFXzJELCB0ZXh0dXJlLCAwKTtcblxuICBjb25zdCBpc0ZyYW1lQnVmZmVyQ29tcGxldGUgPVxuICAgICAgZ2wuY2hlY2tGcmFtZWJ1ZmZlclN0YXR1cyhnbC5GUkFNRUJVRkZFUikgPT09IGdsLkZSQU1FQlVGRkVSX0NPTVBMRVRFO1xuXG4gIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIG51bGwpO1xuICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIG51bGwpO1xuICBnbC5kZWxldGVUZXh0dXJlKHRleHR1cmUpO1xuICBnbC5kZWxldGVGcmFtZWJ1ZmZlcihmcmFtZUJ1ZmZlcik7XG5cbiAgcmV0dXJuIGlzRnJhbWVCdWZmZXJDb21wbGV0ZTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlSGFsZkZsb2F0VGV4dHVyZUFuZEJpbmRUb0ZyYW1lYnVmZmVyKFxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgICBnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0LCB0ZXh0dXJlSGFsZkZsb2F0RXh0ZW5zaW9uOiBhbnkpOiBib29sZWFuIHtcbiAgY29uc3QgdGV4Q29uZmlnID0gZ2V0VGV4dHVyZUNvbmZpZyhnbCwgdGV4dHVyZUhhbGZGbG9hdEV4dGVuc2lvbik7XG4gIGNvbnN0IHRleHR1cmUgPSBnbC5jcmVhdGVUZXh0dXJlKCk7XG4gIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRleHR1cmUpO1xuXG4gIGNvbnN0IHdpZHRoID0gMTtcbiAgY29uc3QgaGVpZ2h0ID0gMTtcbiAgZ2wudGV4SW1hZ2UyRChcbiAgICAgIGdsLlRFWFRVUkVfMkQsIDAsIHRleENvbmZpZy5pbnRlcm5hbEZvcm1hdEhhbGZGbG9hdCwgd2lkdGgsIGhlaWdodCwgMCxcbiAgICAgIHRleENvbmZpZy50ZXh0dXJlRm9ybWF0RmxvYXQsIHRleENvbmZpZy50ZXh0dXJlVHlwZUhhbGZGbG9hdCwgbnVsbCk7XG5cbiAgY29uc3QgZnJhbWVCdWZmZXIgPSBnbC5jcmVhdGVGcmFtZWJ1ZmZlcigpO1xuICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIGZyYW1lQnVmZmVyKTtcbiAgZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoXG4gICAgICBnbC5GUkFNRUJVRkZFUiwgZ2wuQ09MT1JfQVRUQUNITUVOVDAsIGdsLlRFWFRVUkVfMkQsIHRleHR1cmUsIDApO1xuXG4gIGNvbnN0IGlzRnJhbWVCdWZmZXJDb21wbGV0ZSA9XG4gICAgICBnbC5jaGVja0ZyYW1lYnVmZmVyU3RhdHVzKGdsLkZSQU1FQlVGRkVSKSA9PT0gZ2wuRlJBTUVCVUZGRVJfQ09NUExFVEU7XG5cbiAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgbnVsbCk7XG4gIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgbnVsbCk7XG4gIGdsLmRlbGV0ZVRleHR1cmUodGV4dHVyZSk7XG4gIGdsLmRlbGV0ZUZyYW1lYnVmZmVyKGZyYW1lQnVmZmVyKTtcblxuICByZXR1cm4gaXNGcmFtZUJ1ZmZlckNvbXBsZXRlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNXZWJHTEZlbmNlRW5hYmxlZCh3ZWJHTFZlcnNpb246IG51bWJlcikge1xuICBpZiAod2ViR0xWZXJzaW9uICE9PSAyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IGdsID0gZ2V0V2ViR0xDb250ZXh0KHdlYkdMVmVyc2lvbik7XG5cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICBjb25zdCBpc0VuYWJsZWQgPSAoZ2wgYXMgYW55KS5mZW5jZVN5bmMgIT0gbnVsbDtcbiAgcmV0dXJuIGlzRW5hYmxlZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydE5vdENvbXBsZXgoXG4gICAgdGVuc29yOiBUZW5zb3JJbmZvfFRlbnNvckluZm9bXSwgb3BOYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHRlbnNvcikpIHtcbiAgICB0ZW5zb3IgPSBbdGVuc29yXTtcbiAgfVxuICB0ZW5zb3IuZm9yRWFjaCh0ID0+IHtcbiAgICBpZiAodCAhPSBudWxsKSB7XG4gICAgICB1dGlsLmFzc2VydChcbiAgICAgICAgICB0LmR0eXBlICE9PSAnY29tcGxleDY0JyxcbiAgICAgICAgICAoKSA9PiBgJHtvcE5hbWV9IGRvZXMgbm90IHN1cHBvcnQgY29tcGxleDY0IHRlbnNvcnMgYCArXG4gICAgICAgICAgICAgICdpbiB0aGUgV2ViR0wgYmFja2VuZC4nKTtcbiAgICB9XG4gIH0pO1xufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBidWZmZXIsIERhdGFTdG9yYWdlLCBlbmdpbmUsIGVudiwga2VybmVsX2ltcGxzLCBLZXJuZWxCYWNrZW5kLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmNvbnN0IHdoZXJlSW1wbCA9IGtlcm5lbF9pbXBscy53aGVyZUltcGw7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi9jcHVfdXRpbCc7XG5leHBvcnQgY2xhc3MgTWF0aEJhY2tlbmRDUFUgZXh0ZW5kcyBLZXJuZWxCYWNrZW5kIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5ibG9ja1NpemUgPSA0ODtcbiAgICAgICAgdGhpcy5maXJzdFVzZSA9IHRydWU7XG4gICAgICAgIHRoaXMuZGF0YSA9IG5ldyBEYXRhU3RvcmFnZSh0aGlzLCBlbmdpbmUoKSk7XG4gICAgfVxuICAgIG5leHREYXRhSWQoKSB7XG4gICAgICAgIHJldHVybiBNYXRoQmFja2VuZENQVS5uZXh0RGF0YUlkKys7XG4gICAgfVxuICAgIHdyaXRlKHZhbHVlcywgc2hhcGUsIGR0eXBlKSB7XG4gICAgICAgIGlmICh0aGlzLmZpcnN0VXNlKSB7XG4gICAgICAgICAgICB0aGlzLmZpcnN0VXNlID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAoZW52KCkuZ2V0KCdJU19OT0RFJykpIHtcbiAgICAgICAgICAgICAgICBiYWNrZW5kX3V0aWwud2FybignXFxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxcbicgK1xuICAgICAgICAgICAgICAgICAgICAnSGkgdGhlcmUg8J+Riy4gTG9va3MgbGlrZSB5b3UgYXJlIHJ1bm5pbmcgVGVuc29yRmxvdy5qcyBpbiAnICtcbiAgICAgICAgICAgICAgICAgICAgJ05vZGUuanMuIFRvIHNwZWVkIHRoaW5ncyB1cCBkcmFtYXRpY2FsbHksIGluc3RhbGwgb3VyIG5vZGUgJyArXG4gICAgICAgICAgICAgICAgICAgICdiYWNrZW5kLCB3aGljaCBiaW5kcyB0byBUZW5zb3JGbG93IEMrKywgYnkgcnVubmluZyAnICtcbiAgICAgICAgICAgICAgICAgICAgJ25wbSBpIEB0ZW5zb3JmbG93L3RmanMtbm9kZSwgJyArXG4gICAgICAgICAgICAgICAgICAgICdvciBucG0gaSBAdGVuc29yZmxvdy90ZmpzLW5vZGUtZ3B1IGlmIHlvdSBoYXZlIENVREEuICcgK1xuICAgICAgICAgICAgICAgICAgICAnVGhlbiBjYWxsIHJlcXVpcmUoXFwnQHRlbnNvcmZsb3cvdGZqcy1ub2RlXFwnKTsgKC1ncHUgJyArXG4gICAgICAgICAgICAgICAgICAgICdzdWZmaXggZm9yIENVREEpIGF0IHRoZSBzdGFydCBvZiB5b3VyIHByb2dyYW0uICcgK1xuICAgICAgICAgICAgICAgICAgICAnVmlzaXQgaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGZqcy1ub2RlIGZvciBtb3JlIGRldGFpbHMuJyArXG4gICAgICAgICAgICAgICAgICAgICdcXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGF0YUlkID0geyBpZDogdGhpcy5uZXh0RGF0YUlkKCkgfTtcbiAgICAgICAgdGhpcy5kYXRhLnNldChkYXRhSWQsIHsgdmFsdWVzLCBkdHlwZSwgcmVmQ291bnQ6IDEgfSk7XG4gICAgICAgIHJldHVybiBkYXRhSWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIGRhdGEgYnVja2V0IGluIGNwdSBiYWNrZW5kLlxuICAgICAqIEBwYXJhbSBzaGFwZSBTaGFwZSBvZiB0aGUgYFRlbnNvckluZm9gLlxuICAgICAqIEBwYXJhbSBkdHlwZSBEVHlwZSBvZiB0aGUgYFRlbnNvckluZm9gLlxuICAgICAqIEBwYXJhbSB2YWx1ZXMgVGhlIHZhbHVlIG9mIHRoZSBgVGVuc29ySW5mb2Agc3RvcmVkIGFzIGEgZmxhdHRlbmVkIGFycmF5LlxuICAgICAqL1xuICAgIG1ha2VUZW5zb3JJbmZvKHNoYXBlLCBkdHlwZSwgdmFsdWVzKSB7XG4gICAgICAgIGxldCBvdXRJZDtcbiAgICAgICAgaWYgKGR0eXBlID09PSAnc3RyaW5nJyAmJiB2YWx1ZXMgIT0gbnVsbCAmJiB2YWx1ZXMubGVuZ3RoID4gMCAmJlxuICAgICAgICAgICAgdXRpbC5pc1N0cmluZyh2YWx1ZXNbMF0pKSB7XG4gICAgICAgICAgICBjb25zdCBlbmNvZGVkVmFsdWVzID0gdmFsdWVzLm1hcChkID0+IHV0aWwuZW5jb2RlU3RyaW5nKGQpKTtcbiAgICAgICAgICAgIG91dElkID0gdGhpcy53cml0ZShlbmNvZGVkVmFsdWVzLCBzaGFwZSwgZHR5cGUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgb3V0SWQgPSB0aGlzLndyaXRlKHZhbHVlcywgc2hhcGUsIGR0eXBlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBkYXRhSWQ6IG91dElkLCBzaGFwZSwgZHR5cGUgfTtcbiAgICB9XG4gICAgLyoqIFJldHVybiByZWZDb3VudCBvZiBhIGBUZW5zb3JEYXRhYC4gKi9cbiAgICByZWZDb3VudChkYXRhSWQpIHtcbiAgICAgICAgaWYgKHRoaXMuZGF0YS5oYXMoZGF0YUlkKSkge1xuICAgICAgICAgICAgY29uc3QgdGVuc29yRGF0YSA9IHRoaXMuZGF0YS5nZXQoZGF0YUlkKTtcbiAgICAgICAgICAgIHJldHVybiB0ZW5zb3JEYXRhLnJlZkNvdW50O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICAvKiogSW5jcmVhc2UgcmVmQ291bnQgb2YgYSBgVGVuc29yRGF0YWAuICovXG4gICAgaW5jUmVmKGRhdGFJZCkge1xuICAgICAgICBjb25zdCB0ZW5zb3JEYXRhID0gdGhpcy5kYXRhLmdldChkYXRhSWQpO1xuICAgICAgICB0ZW5zb3JEYXRhLnJlZkNvdW50Kys7XG4gICAgfVxuICAgIC8qKiBEZWNyZWFzZSByZWZDb3VudCBvZiBhIGBUZW5zb3JEYXRhYC4gKi9cbiAgICBkZWNSZWYoZGF0YUlkKSB7XG4gICAgICAgIGlmICh0aGlzLmRhdGEuaGFzKGRhdGFJZCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHRlbnNvckRhdGEgPSB0aGlzLmRhdGEuZ2V0KGRhdGFJZCk7XG4gICAgICAgICAgICB0ZW5zb3JEYXRhLnJlZkNvdW50LS07XG4gICAgICAgIH1cbiAgICB9XG4gICAgbW92ZShkYXRhSWQsIHZhbHVlcywgc2hhcGUsIGR0eXBlLCByZWZDb3VudCkge1xuICAgICAgICB0aGlzLmRhdGEuc2V0KGRhdGFJZCwgeyB2YWx1ZXMsIGR0eXBlLCByZWZDb3VudCB9KTtcbiAgICB9XG4gICAgbnVtRGF0YUlkcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5udW1EYXRhSWRzKCk7XG4gICAgfVxuICAgIGFzeW5jIHJlYWQoZGF0YUlkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWRTeW5jKGRhdGFJZCk7XG4gICAgfVxuICAgIHJlYWRTeW5jKGRhdGFJZCkge1xuICAgICAgICBjb25zdCB7IGR0eXBlLCBjb21wbGV4VGVuc29ySW5mb3MgfSA9IHRoaXMuZGF0YS5nZXQoZGF0YUlkKTtcbiAgICAgICAgaWYgKGR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgICAgICAgICAgY29uc3QgcmVhbFZhbHVlcyA9IHRoaXMucmVhZFN5bmMoY29tcGxleFRlbnNvckluZm9zLnJlYWwuZGF0YUlkKTtcbiAgICAgICAgICAgIGNvbnN0IGltYWdWYWx1ZXMgPSB0aGlzLnJlYWRTeW5jKGNvbXBsZXhUZW5zb3JJbmZvcy5pbWFnLmRhdGFJZCk7XG4gICAgICAgICAgICByZXR1cm4gYmFja2VuZF91dGlsLm1lcmdlUmVhbEFuZEltYWdBcnJheXMocmVhbFZhbHVlcywgaW1hZ1ZhbHVlcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5nZXQoZGF0YUlkKS52YWx1ZXM7XG4gICAgfVxuICAgIGJ1ZmZlclN5bmModCkge1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5yZWFkU3luYyh0LmRhdGFJZCk7XG4gICAgICAgIGxldCBkZWNvZGVkRGF0YSA9IGRhdGE7XG4gICAgICAgIGlmICh0LmR0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAvLyBEZWNvZGUgdGhlIGJ5dGVzIGludG8gc3RyaW5nLlxuICAgICAgICAgICAgICAgIGRlY29kZWREYXRhID0gZGF0YS5tYXAoZCA9PiB1dGlsLmRlY29kZVN0cmluZyhkKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoX2EpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBkZWNvZGUgZW5jb2RlZCBzdHJpbmcgYnl0ZXMgaW50byB1dGYtOCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWZmZXIodC5zaGFwZSwgdC5kdHlwZSwgZGVjb2RlZERhdGEpO1xuICAgIH1cbiAgICBtYWtlT3V0cHV0KHZhbHVlcywgc2hhcGUsIGR0eXBlKSB7XG4gICAgICAgIGNvbnN0IGRhdGFJZCA9IHRoaXMud3JpdGUodmFsdWVzLCBzaGFwZSwgZHR5cGUpO1xuICAgICAgICByZXR1cm4gZW5naW5lKCkubWFrZVRlbnNvckZyb21EYXRhSWQoZGF0YUlkLCBzaGFwZSwgZHR5cGUsIHRoaXMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEaXNwb3NlIHRoZSBtZW1vcnkgaWYgdGhlIGRhdGFJZCBoYXMgMCByZWZDb3VudC4gUmV0dXJuIHRydWUgaWYgdGhlIG1lbW9yeVxuICAgICAqIGlzIHJlbGVhc2VkIG9yIG1lbW9yeSBpcyBub3QgbWFuYWdlZCBpbiB0aGlzIGJhY2tlbmQsIGZhbHNlIGlmIG1lbW9yeSBpc1xuICAgICAqIG5vdCBjbGVhcmVkLlxuICAgICAqIEBwYXJhbSBkYXRhSWRcbiAgICAgKiBAb2FyYW0gZm9yY2UgT3B0aW9uYWwsIHJlbW92ZSB0aGUgZGF0YSByZWdhcmRsZXNzIG9mIHJlZkNvdW50XG4gICAgICovXG4gICAgZGlzcG9zZURhdGEoZGF0YUlkLCBmb3JjZSA9IGZhbHNlKSB7XG4gICAgICAgIGlmICh0aGlzLmRhdGEuaGFzKGRhdGFJZCkpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YS5nZXQoZGF0YUlkKS5yZWZDb3VudC0tO1xuICAgICAgICAgICAgaWYgKCFmb3JjZSAmJiB0aGlzLmRhdGEuZ2V0KGRhdGFJZCkucmVmQ291bnQgPiAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgeyBjb21wbGV4VGVuc29ySW5mb3MgfSA9IHRoaXMuZGF0YS5nZXQoZGF0YUlkKTtcbiAgICAgICAgICAgIGlmIChjb21wbGV4VGVuc29ySW5mb3MgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGlzcG9zZURhdGEoY29tcGxleFRlbnNvckluZm9zLnJlYWwuZGF0YUlkLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3Bvc2VEYXRhKGNvbXBsZXhUZW5zb3JJbmZvcy5pbWFnLmRhdGFJZCwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmRhdGEuZGVsZXRlKGRhdGFJZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHRlbnNvckluZm8pIHtcbiAgICAgICAgdGhpcy5kaXNwb3NlRGF0YSh0ZW5zb3JJbmZvLmRhdGFJZCk7XG4gICAgfVxuICAgIGFzeW5jIHRpbWUoZikge1xuICAgICAgICBjb25zdCBzdGFydCA9IHV0aWwubm93KCk7XG4gICAgICAgIGYoKTtcbiAgICAgICAgY29uc3Qga2VybmVsTXMgPSB1dGlsLm5vdygpIC0gc3RhcnQ7XG4gICAgICAgIHJldHVybiB7IGtlcm5lbE1zIH07XG4gICAgfVxuICAgIG1lbW9yeSgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC8vIFVucmVsaWFibGUgZHVlIHRvIGF1dG9tYXRpYyBnYy4gVGhlIG51bWJlcnMgYWJvdmUgYXJlIGN1bXVsYXRpdmUuXG4gICAgICAgICAgICB1bnJlbGlhYmxlOiB0cnVlLFxuICAgICAgICAgICAgcmVhc29uczogWydUaGUgcmVwb3J0ZWQgbWVtb3J5IGlzIGFuIHVwcGVyIGJvdW5kLiBEdWUgdG8gYXV0b21hdGljIGdhcmJhZ2UgJyArXG4gICAgICAgICAgICAgICAgICAgICdjb2xsZWN0aW9uLCB0aGUgdHJ1ZSBhbGxvY2F0ZWQgbWVtb3J5IG1heSBiZSBsZXNzLiddXG4gICAgICAgIH07XG4gICAgfVxuICAgIHdoZXJlKGNvbmRpdGlvbikge1xuICAgICAgICBhc3NlcnROb3RDb21wbGV4KFtjb25kaXRpb25dLCAnd2hlcmUnKTtcbiAgICAgICAgY29uc3QgY29uZFZhbHMgPSB0aGlzLnJlYWRTeW5jKGNvbmRpdGlvbi5kYXRhSWQpO1xuICAgICAgICByZXR1cm4gd2hlcmVJbXBsKGNvbmRpdGlvbi5zaGFwZSwgY29uZFZhbHMpO1xuICAgIH1cbiAgICBkaXNwb3NlKCkgeyB9XG4gICAgZmxvYXRQcmVjaXNpb24oKSB7XG4gICAgICAgIHJldHVybiAzMjtcbiAgICB9XG4gICAgLyoqIFJldHVybnMgdGhlIHNtYWxsZXN0IHJlcHJlc2VudGFibGUgbnVtYmVyLiAgKi9cbiAgICBlcHNpbG9uKCkge1xuICAgICAgICByZXR1cm4gc3VwZXIuZXBzaWxvbigpO1xuICAgIH1cbn1cbk1hdGhCYWNrZW5kQ1BVLm5leHREYXRhSWQgPSAwO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmFja2VuZF9jcHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuLypcbiAqIGJhc2UudHMgY29udGFpbnMgYWxsIHRoZSBleHBvcnRzIGZyb20gdGZqcy1iYWNrZW5kLWNwdVxuICogd2l0aG91dCBhdXRvLWtlcm5lbCByZWdpc3RyYXRpb25cbiAqL1xuaW1wb3J0IHsgcmVnaXN0ZXJCYWNrZW5kIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IE1hdGhCYWNrZW5kQ1BVIH0gZnJvbSAnLi9iYWNrZW5kX2NwdSc7XG5pbXBvcnQgKiBhcyBzaGFyZWQgZnJvbSAnLi9zaGFyZWQnO1xuZXhwb3J0IHsgTWF0aEJhY2tlbmRDUFUgfSBmcm9tICcuL2JhY2tlbmRfY3B1JztcbmV4cG9ydCB7IHZlcnNpb24gYXMgdmVyc2lvbl9jcHUgfSBmcm9tICcuL3ZlcnNpb24nO1xuZXhwb3J0IHsgc2hhcmVkIH07XG4vLyBTaWRlIGVmZmVjdHMgZm9yIGRlZmF1bHQgaW5pdGlhbGl6YXRpb24gb2YgTWF0aEJhY2tlbmRDUFVcbnJlZ2lzdGVyQmFja2VuZCgnY3B1JywgKCkgPT4gbmV3IE1hdGhCYWNrZW5kQ1BVKCksIDEgLyogcHJpb3JpdHkgKi8pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmFzZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnROb3RDb21wbGV4KHRlbnNvciwgb3BOYW1lKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHRlbnNvcikpIHtcbiAgICAgICAgdGVuc29yID0gW3RlbnNvcl07XG4gICAgfVxuICAgIHRlbnNvci5mb3JFYWNoKHQgPT4ge1xuICAgICAgICBpZiAodCAhPSBudWxsKSB7XG4gICAgICAgICAgICB1dGlsLmFzc2VydCh0LmR0eXBlICE9PSAnY29tcGxleDY0JywgKCkgPT4gYCR7b3BOYW1lfSBkb2VzIG5vdCBzdXBwb3J0IGNvbXBsZXg2NCB0ZW5zb3JzIGluIHRoZSBDUFUgYmFja2VuZC5gKTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y3B1X3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuLy8gQWxsIGV4cG9ydHMgZnJvbSB0aGlzIHBhY2thZ2Ugc2hvdWxkIGJlIGluIGJhc2UuXG5leHBvcnQgKiBmcm9tICcuL2Jhc2UnO1xuaW1wb3J0ICcuL3JlZ2lzdGVyX2FsbF9rZXJuZWxzJztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBBYnMsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmV4cG9ydCBmdW5jdGlvbiBzaW1wbGVBYnNJbXBsKHZhbHMpIHtcbiAgICBjb25zdCByZXN1bHRWYWx1ZXMgPSBuZXcgRmxvYXQzMkFycmF5KHZhbHMubGVuZ3RoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgcmVzdWx0VmFsdWVzW2ldID0gTWF0aC5hYnModmFsc1tpXSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRWYWx1ZXM7XG59XG5leHBvcnQgY29uc3QgYWJzID0gKGFyZ3MpID0+IHtcbiAgICBjb25zdCB7IHggfSA9IGFyZ3MuaW5wdXRzO1xuICAgIGNvbnN0IGNwdUJhY2tlbmQgPSBhcmdzLmJhY2tlbmQ7XG4gICAgYXNzZXJ0Tm90Q29tcGxleCh4LCAnYWJzJyk7XG4gICAgbGV0IHJlc3VsdFZhbHVlcyA9IG5ldyBGbG9hdDMyQXJyYXkodXRpbC5zaXplRnJvbVNoYXBlKHguc2hhcGUpKTtcbiAgICBjb25zdCB2YWx1ZXMgPSBjcHVCYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXM7XG4gICAgcmVzdWx0VmFsdWVzID0gc2ltcGxlQWJzSW1wbCh2YWx1ZXMpO1xuICAgIHJldHVybiBjcHVCYWNrZW5kLm1ha2VPdXRwdXQocmVzdWx0VmFsdWVzLCB4LnNoYXBlLCAnZmxvYXQzMicpO1xufTtcbmV4cG9ydCBjb25zdCBhYnNDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQWJzLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBhYnMsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QWJzLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBBY29zIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHVuYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCBhY29zID0gdW5hcnlLZXJuZWxGdW5jKEFjb3MsICh4aSkgPT4gTWF0aC5hY29zKHhpKSk7XG5leHBvcnQgY29uc3QgYWNvc0NvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBBY29zLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBhY29zLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFjb3MuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEFjb3NoIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHVuYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCBhY29zaCA9IHVuYXJ5S2VybmVsRnVuYyhBY29zaCwgKHhpKSA9PiBNYXRoLmFjb3NoKHhpKSk7XG5leHBvcnQgY29uc3QgYWNvc2hDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQWNvc2gsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGFjb3NoLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFjb3NoLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEFkZCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsIH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X2ltcGwnO1xuaW1wb3J0IHsgYmluYXJ5S2VybmVsRnVuYywgY3JlYXRlQ29tcGxleEJpbmFyeUtlcm5lbEltcGwgfSBmcm9tICcuLi91dGlscy9iaW5hcnlfdXRpbHMnO1xuZXhwb3J0IGNvbnN0IGFkZEltcGwgPSBjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsKCgoYSwgYikgPT4gYSArIGIpKTtcbmV4cG9ydCBjb25zdCBhZGRDb21wbGV4SW1wbCA9IGNyZWF0ZUNvbXBsZXhCaW5hcnlLZXJuZWxJbXBsKCgoYVJlYWwsIGFJbWFnLCBiUmVhbCwgYkltYWcpID0+IHtcbiAgICByZXR1cm4geyByZWFsOiBhUmVhbCArIGJSZWFsLCBpbWFnOiBhSW1hZyArIGJJbWFnIH07XG59KSk7XG5leHBvcnQgY29uc3QgYWRkID0gYmluYXJ5S2VybmVsRnVuYyhBZGQsIGFkZEltcGwsIGFkZENvbXBsZXhJbXBsKTtcbmV4cG9ydCBjb25zdCBhZGRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQWRkLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBhZGRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BZGQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQWRkTiwgYnVmZmVyIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5leHBvcnQgZnVuY3Rpb24gYWRkTihhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQgfSA9IGFyZ3M7XG4gICAgY29uc3QgdGVuc29ycyA9IGlucHV0cztcbiAgICBhc3NlcnROb3RDb21wbGV4KGlucHV0cywgJ2FkZE4nKTtcbiAgICBjb25zdCB2YWxzID0gdGVuc29ycy5tYXAodCA9PiBiYWNrZW5kLmRhdGEuZ2V0KHQuZGF0YUlkKS52YWx1ZXMpO1xuICAgIGNvbnN0IG91dEJ1ZiA9IGJ1ZmZlcih0ZW5zb3JzWzBdLnNoYXBlLCB0ZW5zb3JzWzBdLmR0eXBlKTtcbiAgICBjb25zdCBvdXRWYWxzID0gb3V0QnVmLnZhbHVlcztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRlbnNvcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgY3VyclZhbHMgPSB2YWxzW2ldO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG91dFZhbHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIG91dFZhbHNbal0gKz0gY3VyclZhbHNbal07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0QnVmLnNoYXBlLCBvdXRCdWYuZHR5cGUsIG91dEJ1Zi52YWx1ZXMpO1xufVxuZXhwb3J0IGNvbnN0IGFkZE5Db25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQWRkTixcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogYWRkTlxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFkZE4uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQWxsLCBiYWNrZW5kX3V0aWwsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL1Jlc2hhcGUnO1xuaW1wb3J0IHsgdHJhbnNwb3NlIH0gZnJvbSAnLi9UcmFuc3Bvc2UnO1xuZXhwb3J0IGZ1bmN0aW9uIGFsbChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgYXhpcywga2VlcERpbXMgfSA9IGF0dHJzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoeCwgJ2FsbCcpO1xuICAgIGNvbnN0IG9yaWdBeGVzID0gdXRpbC5wYXJzZUF4aXNQYXJhbShheGlzLCB4LnNoYXBlKTtcbiAgICBsZXQgYXhlcyA9IG9yaWdBeGVzO1xuICAgIGNvbnN0IHBlcm11dGVkQXhlcyA9IGJhY2tlbmRfdXRpbC5nZXRBeGVzUGVybXV0YXRpb24oYXhlcywgeC5zaGFwZS5sZW5ndGgpO1xuICAgIGxldCAkeCA9IHg7XG4gICAgaWYgKHBlcm11dGVkQXhlcyAhPSBudWxsKSB7XG4gICAgICAgICR4ID0gdHJhbnNwb3NlKHsgaW5wdXRzOiB7IHggfSwgYmFja2VuZCwgYXR0cnM6IHsgcGVybTogcGVybXV0ZWRBeGVzIH0gfSk7XG4gICAgICAgIGF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0SW5uZXJNb3N0QXhlcyhheGVzLmxlbmd0aCwgeC5zaGFwZS5sZW5ndGgpO1xuICAgIH1cbiAgICBiYWNrZW5kX3V0aWwuYXNzZXJ0QXhlc0FyZUlubmVyTW9zdERpbXMoJ2FsbCcsIGF4ZXMsICR4LnNoYXBlLmxlbmd0aCk7XG4gICAgY29uc3QgW291dFNoYXBlLCByZWR1Y2VTaGFwZV0gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZU91dEFuZFJlZHVjZVNoYXBlcygkeC5zaGFwZSwgYXhlcyk7XG4gICAgY29uc3QgcmVkdWNlU2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShyZWR1Y2VTaGFwZSk7XG4gICAgY29uc3QgdmFscyA9IHV0aWwubWFrZVplcm9zVHlwZWRBcnJheSh1dGlsLnNpemVGcm9tU2hhcGUob3V0U2hhcGUpLCAkeC5kdHlwZSk7XG4gICAgY29uc3QgYVZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KCR4LmRhdGFJZCkudmFsdWVzO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFscy5sZW5ndGg7ICsraSkge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBpICogcmVkdWNlU2l6ZTtcbiAgICAgICAgbGV0IGFsbCA9IGFWYWxzW29mZnNldF07XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcmVkdWNlU2l6ZTsgKytqKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGFWYWxzW29mZnNldCArIGpdO1xuICAgICAgICAgICAgYWxsID0gYWxsICYmIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHZhbHNbaV0gPSBhbGw7XG4gICAgfVxuICAgIGlmIChwZXJtdXRlZEF4ZXMgIT0gbnVsbCkge1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKCR4KTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRTaGFwZSwgJHguZHR5cGUsIHZhbHMpO1xuICAgIGlmIChrZWVwRGltcykge1xuICAgICAgICBjb25zdCBleHBhbmRlZFNoYXBlID0gYmFja2VuZF91dGlsLmV4cGFuZFNoYXBlVG9LZWVwRGltKG91dFNoYXBlLCBvcmlnQXhlcyk7XG4gICAgICAgIGNvbnN0IHJlc2hhcGVkUmVzdWx0ID0gcmVzaGFwZSh7IGlucHV0czogeyB4OiByZXN1bHQgfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IGV4cGFuZGVkU2hhcGUgfSB9KTtcbiAgICAgICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZXN1bHQpO1xuICAgICAgICByZXR1cm4gcmVzaGFwZWRSZXN1bHQ7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5leHBvcnQgY29uc3QgYWxsQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEFsbCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogYWxsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QWxsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEFueSwgYmFja2VuZF91dGlsLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9SZXNoYXBlJztcbmltcG9ydCB7IHRyYW5zcG9zZSB9IGZyb20gJy4vVHJhbnNwb3NlJztcbmV4cG9ydCBmdW5jdGlvbiBhbnkoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGF4aXMsIGtlZXBEaW1zIH0gPSBhdHRycztcbiAgICBhc3NlcnROb3RDb21wbGV4KHgsICdhbnknKTtcbiAgICBjb25zdCBvcmlnQXhlcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oYXhpcywgeC5zaGFwZSk7XG4gICAgbGV0IGF4ZXMgPSBvcmlnQXhlcztcbiAgICBjb25zdCBwZXJtdXRlZEF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0QXhlc1Blcm11dGF0aW9uKGF4ZXMsIHguc2hhcGUubGVuZ3RoKTtcbiAgICBsZXQgJHggPSB4O1xuICAgIGlmIChwZXJtdXRlZEF4ZXMgIT0gbnVsbCkge1xuICAgICAgICAkeCA9IHRyYW5zcG9zZSh7IGlucHV0czogeyB4IH0sIGJhY2tlbmQsIGF0dHJzOiB7IHBlcm06IHBlcm11dGVkQXhlcyB9IH0pO1xuICAgICAgICBheGVzID0gYmFja2VuZF91dGlsLmdldElubmVyTW9zdEF4ZXMoYXhlcy5sZW5ndGgsIHguc2hhcGUubGVuZ3RoKTtcbiAgICB9XG4gICAgYmFja2VuZF91dGlsLmFzc2VydEF4ZXNBcmVJbm5lck1vc3REaW1zKCdhbnknLCBheGVzLCAkeC5zaGFwZS5sZW5ndGgpO1xuICAgIGNvbnN0IFtvdXRTaGFwZSwgcmVkdWNlU2hhcGVdID0gYmFja2VuZF91dGlsLmNvbXB1dGVPdXRBbmRSZWR1Y2VTaGFwZXMoJHguc2hhcGUsIGF4ZXMpO1xuICAgIGNvbnN0IHJlZHVjZVNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUocmVkdWNlU2hhcGUpO1xuICAgIGNvbnN0IHZhbHMgPSB1dGlsLm1ha2VaZXJvc1R5cGVkQXJyYXkodXRpbC5zaXplRnJvbVNoYXBlKG91dFNoYXBlKSwgJHguZHR5cGUpO1xuICAgIGNvbnN0IGFWYWxzID0gYmFja2VuZC5kYXRhLmdldCgkeC5kYXRhSWQpLnZhbHVlcztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gaSAqIHJlZHVjZVNpemU7XG4gICAgICAgIGxldCBhbnlWYWwgPSBhVmFsc1tvZmZzZXRdO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHJlZHVjZVNpemU7ICsraikge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBhVmFsc1tvZmZzZXQgKyBqXTtcbiAgICAgICAgICAgIGFueVZhbCA9IGFueVZhbCB8fCB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICB2YWxzW2ldID0gYW55VmFsO1xuICAgIH1cbiAgICBpZiAocGVybXV0ZWRBeGVzICE9IG51bGwpIHtcbiAgICAgICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbygkeCk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0U2hhcGUsICR4LmR0eXBlLCB2YWxzKTtcbiAgICBpZiAoa2VlcERpbXMpIHtcbiAgICAgICAgY29uc3QgZXhwYW5kZWRTaGFwZSA9IGJhY2tlbmRfdXRpbC5leHBhbmRTaGFwZVRvS2VlcERpbShvdXRTaGFwZSwgb3JpZ0F4ZXMpO1xuICAgICAgICBjb25zdCByZXNoYXBlZFJlc3VsdCA9IHJlc2hhcGUoeyBpbnB1dHM6IHsgeDogcmVzdWx0IH0sIGJhY2tlbmQsIGF0dHJzOiB7IHNoYXBlOiBleHBhbmRlZFNoYXBlIH0gfSk7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVzdWx0KTtcbiAgICAgICAgcmV0dXJuIHJlc2hhcGVkUmVzdWx0O1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0IGNvbnN0IGFueUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBBbnksXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGFueVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFueS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBBcmdNYXgsIGJhY2tlbmRfdXRpbCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuaW1wb3J0IHsgdHJhbnNwb3NlIH0gZnJvbSAnLi9UcmFuc3Bvc2UnO1xuZXhwb3J0IGZ1bmN0aW9uIGFyZ01heChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgYXhpcyB9ID0gYXR0cnM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleCh4LCAnYXJnTWF4Jyk7XG4gICAgbGV0IGF4ZXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKGF4aXMsIHguc2hhcGUpO1xuICAgIGNvbnN0IHBlcm11dGVkQXhlcyA9IGJhY2tlbmRfdXRpbC5nZXRBeGVzUGVybXV0YXRpb24oYXhlcywgeC5zaGFwZS5sZW5ndGgpO1xuICAgIGxldCAkeCA9IHg7XG4gICAgY29uc3QgaW50ZXJtZWRpYXRlVGVuc29ySW5mb3MgPSBbXTtcbiAgICBpZiAocGVybXV0ZWRBeGVzICE9IG51bGwpIHtcbiAgICAgICAgJHggPSB0cmFuc3Bvc2UoeyBpbnB1dHM6IHsgeCB9LCBiYWNrZW5kLCBhdHRyczogeyBwZXJtOiBwZXJtdXRlZEF4ZXMgfSB9KTtcbiAgICAgICAgaW50ZXJtZWRpYXRlVGVuc29ySW5mb3MucHVzaCgkeCk7XG4gICAgICAgIGF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0SW5uZXJNb3N0QXhlcyhheGVzLmxlbmd0aCwgJHguc2hhcGUubGVuZ3RoKTtcbiAgICB9XG4gICAgYXhlcyA9IFtheGVzWzBdXTtcbiAgICBiYWNrZW5kX3V0aWwuYXNzZXJ0QXhlc0FyZUlubmVyTW9zdERpbXMoJ2FyZ01heCcsIGF4ZXMsICR4LnNoYXBlLmxlbmd0aCk7XG4gICAgY29uc3QgW291dFNoYXBlLCByZWR1Y2VTaGFwZV0gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZU91dEFuZFJlZHVjZVNoYXBlcygkeC5zaGFwZSwgYXhlcyk7XG4gICAgY29uc3Qgb3V0U2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShvdXRTaGFwZSk7XG4gICAgY29uc3QgdmFscyA9IHV0aWwubWFrZVplcm9zVHlwZWRBcnJheShvdXRTaXplLCAnaW50MzInKTtcbiAgICBjb25zdCByZWR1Y2VTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHJlZHVjZVNoYXBlKTtcbiAgICBjb25zdCBhVmFscyA9IGJhY2tlbmQuZGF0YS5nZXQoJHguZGF0YUlkKS52YWx1ZXM7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWxzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IGkgKiByZWR1Y2VTaXplO1xuICAgICAgICBsZXQgbWF4ID0gYVZhbHNbb2Zmc2V0XTtcbiAgICAgICAgbGV0IG1heEluZGV4ID0gMDtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByZWR1Y2VTaXplOyArK2opIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gYVZhbHNbb2Zmc2V0ICsgal07XG4gICAgICAgICAgICBpZiAodmFsdWUgPiBtYXgpIHtcbiAgICAgICAgICAgICAgICBtYXggPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICBtYXhJbmRleCA9IGo7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFsc1tpXSA9IG1heEluZGV4O1xuICAgIH1cbiAgICBpbnRlcm1lZGlhdGVUZW5zb3JJbmZvcy5mb3JFYWNoKHQgPT4gYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh0KSk7XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0U2hhcGUsICdpbnQzMicsIHZhbHMpO1xufVxuZXhwb3J0IGNvbnN0IGFyZ01heENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBBcmdNYXgsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGFyZ01heFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFyZ01heC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBBcmdNaW4sIGJhY2tlbmRfdXRpbCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuaW1wb3J0IHsgdHJhbnNwb3NlIH0gZnJvbSAnLi9UcmFuc3Bvc2UnO1xuZXhwb3J0IGZ1bmN0aW9uIGFyZ01pbihhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgYXhpcyB9ID0gYXR0cnM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleCh4LCAnYXJnTWluJyk7XG4gICAgbGV0IGF4ZXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKGF4aXMsIHguc2hhcGUpO1xuICAgIGNvbnN0IHBlcm11dGVkQXhlcyA9IGJhY2tlbmRfdXRpbC5nZXRBeGVzUGVybXV0YXRpb24oYXhlcywgeC5zaGFwZS5sZW5ndGgpO1xuICAgIGxldCAkeCA9IHg7XG4gICAgY29uc3QgaW50ZXJtZWRpYXRlVGVuc29ySW5mb3MgPSBbXTtcbiAgICBpZiAocGVybXV0ZWRBeGVzICE9IG51bGwpIHtcbiAgICAgICAgJHggPSB0cmFuc3Bvc2UoeyBpbnB1dHM6IHsgeCB9LCBiYWNrZW5kLCBhdHRyczogeyBwZXJtOiBwZXJtdXRlZEF4ZXMgfSB9KTtcbiAgICAgICAgaW50ZXJtZWRpYXRlVGVuc29ySW5mb3MucHVzaCgkeCk7XG4gICAgICAgIGF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0SW5uZXJNb3N0QXhlcyhheGVzLmxlbmd0aCwgJHguc2hhcGUubGVuZ3RoKTtcbiAgICB9XG4gICAgYXhlcyA9IFtheGVzWzBdXTtcbiAgICBiYWNrZW5kX3V0aWwuYXNzZXJ0QXhlc0FyZUlubmVyTW9zdERpbXMoJ2FyZ01pbicsIGF4ZXMsICR4LnNoYXBlLmxlbmd0aCk7XG4gICAgY29uc3QgW291dFNoYXBlLCByZWR1Y2VTaGFwZV0gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZU91dEFuZFJlZHVjZVNoYXBlcygkeC5zaGFwZSwgYXhlcyk7XG4gICAgY29uc3Qgb3V0U2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShvdXRTaGFwZSk7XG4gICAgY29uc3QgdmFscyA9IHV0aWwubWFrZVplcm9zVHlwZWRBcnJheShvdXRTaXplLCAnaW50MzInKTtcbiAgICBjb25zdCByZWR1Y2VTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHJlZHVjZVNoYXBlKTtcbiAgICBjb25zdCBhVmFscyA9IGJhY2tlbmQuZGF0YS5nZXQoJHguZGF0YUlkKS52YWx1ZXM7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWxzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IGkgKiByZWR1Y2VTaXplO1xuICAgICAgICBsZXQgbWluID0gYVZhbHNbb2Zmc2V0XTtcbiAgICAgICAgbGV0IG1pbkluZGV4ID0gMDtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByZWR1Y2VTaXplOyArK2opIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gYVZhbHNbb2Zmc2V0ICsgal07XG4gICAgICAgICAgICBpZiAodmFsdWUgPCBtaW4pIHtcbiAgICAgICAgICAgICAgICBtaW4gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICBtaW5JbmRleCA9IGo7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFsc1tpXSA9IG1pbkluZGV4O1xuICAgIH1cbiAgICBpbnRlcm1lZGlhdGVUZW5zb3JJbmZvcy5mb3JFYWNoKHQgPT4gYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh0KSk7XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0U2hhcGUsICdpbnQzMicsIHZhbHMpO1xufVxuZXhwb3J0IGNvbnN0IGFyZ01pbkNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBBcmdNaW4sXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGFyZ01pblxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFyZ01pbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQXNpbiB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5leHBvcnQgY29uc3QgYXNpbiA9IHVuYXJ5S2VybmVsRnVuYyhBc2luLCAoeGkpID0+IE1hdGguYXNpbih4aSkpO1xuZXhwb3J0IGNvbnN0IGFzaW5Db25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQXNpbixcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogYXNpbixcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Bc2luLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBBc2luaCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5leHBvcnQgY29uc3QgYXNpbmggPSB1bmFyeUtlcm5lbEZ1bmMoQXNpbmgsICh4aSkgPT4gTWF0aC5hc2luaCh4aSkpO1xuZXhwb3J0IGNvbnN0IGFzaW5oQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEFzaW5oLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBhc2luaCxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Bc2luaC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQXRhbiB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5leHBvcnQgY29uc3QgYXRhbiA9IHVuYXJ5S2VybmVsRnVuYyhBdGFuLCAoeGkpID0+IE1hdGguYXRhbih4aSkpO1xuZXhwb3J0IGNvbnN0IGF0YW5Db25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQXRhbixcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogYXRhbixcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BdGFuLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBBdGFuMiB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsIH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X2ltcGwnO1xuaW1wb3J0IHsgYmluYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV91dGlscyc7XG5leHBvcnQgY29uc3QgYXRhbjJJbXBsID0gY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCgoYVZhbHVlLCBiVmFsdWUpID0+IE1hdGguYXRhbjIoYVZhbHVlLCBiVmFsdWUpKTtcbmV4cG9ydCBjb25zdCBhdGFuMiA9IGJpbmFyeUtlcm5lbEZ1bmMoQXRhbjIsIGF0YW4ySW1wbCk7XG5leHBvcnQgY29uc3QgYXRhbjJDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQXRhbjIsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGF0YW4yLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUF0YW4yLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBBdGFuaCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5leHBvcnQgY29uc3QgYXRhbmggPSB1bmFyeUtlcm5lbEZ1bmMoQXRhbmgsICh4aSkgPT4gTWF0aC5hdGFuaCh4aSkpO1xuZXhwb3J0IGNvbnN0IGF0YW5oQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEF0YW5oLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBhdGFuaCxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BdGFuaC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBBdmdQb29sLCBiYWNrZW5kX3V0aWwsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmltcG9ydCB7IHBvb2wgfSBmcm9tICcuLi91dGlscy9wb29sX3V0aWxzJztcbmltcG9ydCB7IGlkZW50aXR5IH0gZnJvbSAnLi9JZGVudGl0eSc7XG5leHBvcnQgZnVuY3Rpb24gYXZnUG9vbChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoeCwgJ2F2Z1Bvb2wnKTtcbiAgICBjb25zdCB7IGZpbHRlclNpemUsIHN0cmlkZXMsIHBhZCwgZGltUm91bmRpbmdNb2RlIH0gPSBhdHRycztcbiAgICBjb25zdCBkaWxhdGlvbnMgPSAxO1xuICAgIHV0aWwuYXNzZXJ0KGJhY2tlbmRfdXRpbC5laXRoZXJTdHJpZGVzT3JEaWxhdGlvbnNBcmVPbmUoc3RyaWRlcywgZGlsYXRpb25zKSwgKCkgPT4gJ0Vycm9yIGluIGF2Z1Bvb2w6IEVpdGhlciBzdHJpZGVzIG9yIGRpbGF0aW9ucyBtdXN0IGJlIDEuICcgK1xuICAgICAgICBgR290IHN0cmlkZXMgJHtzdHJpZGVzfSBhbmQgZGlsYXRpb25zICcke2RpbGF0aW9uc30nYCk7XG4gICAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZVBvb2wyREluZm8oeC5zaGFwZSwgZmlsdGVyU2l6ZSwgc3RyaWRlcywgZGlsYXRpb25zLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSk7XG4gICAgbGV0IHJlcztcbiAgICBpZiAoY29udkluZm8uZmlsdGVyV2lkdGggPT09IDEgJiYgY29udkluZm8uZmlsdGVySGVpZ2h0ID09PSAxICYmXG4gICAgICAgIHV0aWwuYXJyYXlzRXF1YWwoY29udkluZm8uaW5TaGFwZSwgY29udkluZm8ub3V0U2hhcGUpKSB7XG4gICAgICAgIHJlcyA9IGlkZW50aXR5KHsgaW5wdXRzOiB7IHggfSwgYmFja2VuZCB9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IHhWYWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXM7XG4gICAgICAgIGNvbnN0IHN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKHguc2hhcGUpO1xuICAgICAgICBjb25zdCBidWZmZXIgPSBwb29sKHhWYWx1ZXMsIHguc2hhcGUsIHguZHR5cGUsIHN0cmlkZXMsIGNvbnZJbmZvLCAnYXZnJyk7XG4gICAgICAgIHJlcyA9IGJhY2tlbmQubWFrZVRlbnNvckluZm8oY29udkluZm8ub3V0U2hhcGUsIHguZHR5cGUsIGJ1ZmZlci52YWx1ZXMpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufVxuZXhwb3J0IGNvbnN0IGF2Z1Bvb2xDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQXZnUG9vbCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogYXZnUG9vbFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUF2Z1Bvb2wuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQXZnUG9vbDNELCBiYWNrZW5kX3V0aWwsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmltcG9ydCB7IHBvb2wzZCB9IGZyb20gJy4uL3V0aWxzL3Bvb2xfdXRpbHMnO1xuZXhwb3J0IGZ1bmN0aW9uIGF2Z1Bvb2wzRChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgZmlsdGVyU2l6ZSwgc3RyaWRlcywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIGRhdGFGb3JtYXQgfSA9IGF0dHJzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoeCwgJ2F2Z1Bvb2wzZCcpO1xuICAgIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVQb29sM0RJbmZvKHguc2hhcGUsIGZpbHRlclNpemUsIHN0cmlkZXMsIDEgLyogZGlsYXRpb25zICovLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSwgZGF0YUZvcm1hdCk7XG4gICAgY29uc3QgeFZhbHVlcyA9IGJhY2tlbmQuZGF0YS5nZXQoeC5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCBvdXRCdWYgPSBwb29sM2QoeFZhbHVlcywgeC5zaGFwZSwgeC5kdHlwZSwgdXRpbC5jb21wdXRlU3RyaWRlcyh4LnNoYXBlKSwgY29udkluZm8sICdhdmcnKTtcbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRCdWYuc2hhcGUsICdmbG9hdDMyJywgb3V0QnVmLnZhbHVlcyk7XG59XG5leHBvcnQgY29uc3QgYXZnUG9vbDNEQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEF2Z1Bvb2wzRCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogYXZnUG9vbDNEXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QXZnUG9vbDNELmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEF2Z1Bvb2wzREdyYWQsIGJhY2tlbmRfdXRpbCwgYnVmZmVyIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5leHBvcnQgZnVuY3Rpb24gYXZnUG9vbDNER3JhZChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgZHksIGlucHV0IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSB9ID0gYXR0cnM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleChbZHksIGlucHV0XSwgJ2F2Z1Bvb2wzREdyYWQnKTtcbiAgICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlUG9vbDNESW5mbyhpbnB1dC5zaGFwZSwgZmlsdGVyU2l6ZSwgc3RyaWRlcywgMSAvKiBkaWxhdGlvbnMgKi8sIHBhZCwgZGltUm91bmRpbmdNb2RlKTtcbiAgICBjb25zdCBzdHJpZGVEZXB0aCA9IGNvbnZJbmZvLnN0cmlkZURlcHRoO1xuICAgIGNvbnN0IHN0cmlkZUhlaWdodCA9IGNvbnZJbmZvLnN0cmlkZUhlaWdodDtcbiAgICBjb25zdCBzdHJpZGVXaWR0aCA9IGNvbnZJbmZvLnN0cmlkZVdpZHRoO1xuICAgIGNvbnN0IGZpbHRlckRlcHRoID0gY29udkluZm8uZmlsdGVyRGVwdGg7XG4gICAgY29uc3QgZmlsdGVySGVpZ2h0ID0gY29udkluZm8uZmlsdGVySGVpZ2h0O1xuICAgIGNvbnN0IGZpbHRlcldpZHRoID0gY29udkluZm8uZmlsdGVyV2lkdGg7XG4gICAgY29uc3QgZGlsYXRpb25EZXB0aCA9IGNvbnZJbmZvLmRpbGF0aW9uRGVwdGg7XG4gICAgY29uc3QgZGlsYXRpb25IZWlnaHQgPSBjb252SW5mby5kaWxhdGlvbkhlaWdodDtcbiAgICBjb25zdCBkaWxhdGlvbldpZHRoID0gY29udkluZm8uZGlsYXRpb25XaWR0aDtcbiAgICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJEZXB0aCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlckRlcHRoO1xuICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlckhlaWdodCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlckhlaWdodDtcbiAgICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlcldpZHRoO1xuICAgIGNvbnN0IHBhZEZyb250ID0gZWZmZWN0aXZlRmlsdGVyRGVwdGggLSAxIC0gY29udkluZm8ucGFkSW5mby5mcm9udDtcbiAgICBjb25zdCBwYWRMZWZ0ID0gZWZmZWN0aXZlRmlsdGVyV2lkdGggLSAxIC0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuICAgIGNvbnN0IHBhZFRvcCA9IGVmZmVjdGl2ZUZpbHRlckhlaWdodCAtIDEgLSBjb252SW5mby5wYWRJbmZvLnRvcDtcbiAgICBjb25zdCBkeCA9IGJ1ZmZlcihpbnB1dC5zaGFwZSwgJ2Zsb2F0MzInKTtcbiAgICBjb25zdCBhdmdNdWx0aXBsaWVyID0gMSAvIChmaWx0ZXJEZXB0aCAqIGZpbHRlckhlaWdodCAqIGZpbHRlcldpZHRoKTtcbiAgICBjb25zdCBkeUJ1ZiA9IGJhY2tlbmQuYnVmZmVyU3luYyhkeSk7XG4gICAgZm9yIChsZXQgYmF0Y2ggPSAwOyBiYXRjaCA8IGNvbnZJbmZvLmJhdGNoU2l6ZTsgKytiYXRjaCkge1xuICAgICAgICBmb3IgKGxldCBjaGFubmVsID0gMDsgY2hhbm5lbCA8IGNvbnZJbmZvLmluQ2hhbm5lbHM7ICsrY2hhbm5lbCkge1xuICAgICAgICAgICAgZm9yIChsZXQgZHhEZXB0aCA9IDA7IGR4RGVwdGggPCBjb252SW5mby5pbkRlcHRoOyArK2R4RGVwdGgpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBkeFJvdyA9IDA7IGR4Um93IDwgY29udkluZm8uaW5IZWlnaHQ7ICsrZHhSb3cpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgZHhDb2wgPSAwOyBkeENvbCA8IGNvbnZJbmZvLmluV2lkdGg7ICsrZHhDb2wpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNoYWRlciBjb2RlIGJlZ2lucy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGR5RGVwdGhDb3JuZXIgPSBkeERlcHRoIC0gcGFkRnJvbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkeVJvd0Nvcm5lciA9IGR4Um93IC0gcGFkVG9wO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZHlDb2xDb3JuZXIgPSBkeENvbCAtIHBhZExlZnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZG90UHJvZCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB3RGVwdGggPSAwOyB3RGVwdGggPCBlZmZlY3RpdmVGaWx0ZXJEZXB0aDsgd0RlcHRoICs9IGRpbGF0aW9uRGVwdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkeURlcHRoID0gKGR5RGVwdGhDb3JuZXIgKyB3RGVwdGgpIC8gc3RyaWRlRGVwdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR5RGVwdGggPCAwIHx8IGR5RGVwdGggPj0gY29udkluZm8ub3V0RGVwdGggfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5mbG9vcihkeURlcHRoKSAhPT0gZHlEZXB0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgd1JvdyA9IDA7IHdSb3cgPCBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQ7IHdSb3cgKz0gZGlsYXRpb25IZWlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZHlSb3cgPSAoZHlSb3dDb3JuZXIgKyB3Um93KSAvIHN0cmlkZUhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR5Um93IDwgMCB8fCBkeVJvdyA+PSBjb252SW5mby5vdXRIZWlnaHQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3IoZHlSb3cpICE9PSBkeVJvdykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgd0NvbCA9IDA7IHdDb2wgPCBlZmZlY3RpdmVGaWx0ZXJXaWR0aDsgd0NvbCArPSBkaWxhdGlvbldpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkeUNvbCA9IChkeUNvbENvcm5lciArIHdDb2wpIC8gc3RyaWRlV2lkdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHlDb2wgPCAwIHx8IGR5Q29sID49IGNvbnZJbmZvLm91dFdpZHRoIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5mbG9vcihkeUNvbCkgIT09IGR5Q29sKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwaXhlbCA9IGR5QnVmLmdldChiYXRjaCwgZHlEZXB0aCwgZHlSb3csIGR5Q29sLCBjaGFubmVsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdFByb2QgKz0gcGl4ZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBkeC5zZXQoZG90UHJvZCAqIGF2Z011bHRpcGxpZXIsIGJhdGNoLCBkeERlcHRoLCBkeFJvdywgZHhDb2wsIGNoYW5uZWwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKGR4LnNoYXBlLCBkeC5kdHlwZSwgZHgudmFsdWVzKTtcbn1cbmV4cG9ydCBjb25zdCBhdmdQb29sM0RHcmFkQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEF2Z1Bvb2wzREdyYWQsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGF2Z1Bvb2wzREdyYWRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BdmdQb29sM0RHcmFkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEF2Z1Bvb2xHcmFkLCBiYWNrZW5kX3V0aWwsIGJ1ZmZlciB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIGF2Z1Bvb2xHcmFkKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBkeSwgaW5wdXQgfSA9IGlucHV0cztcbiAgICBjb25zdCB4ID0gaW5wdXQ7XG4gICAgYXNzZXJ0Tm90Q29tcGxleChbZHksIGlucHV0XSwgJ2F2Z1Bvb2xHcmFkJyk7XG4gICAgY29uc3QgeyBmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWQgfSA9IGF0dHJzO1xuICAgIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVQb29sMkRJbmZvKHguc2hhcGUsIGZpbHRlclNpemUsIHN0cmlkZXMsIDEgLyogZGlsYXRpb25zICovLCBwYWQpO1xuICAgIGNvbnN0IHN0cmlkZUhlaWdodCA9IGNvbnZJbmZvLnN0cmlkZUhlaWdodDtcbiAgICBjb25zdCBzdHJpZGVXaWR0aCA9IGNvbnZJbmZvLnN0cmlkZVdpZHRoO1xuICAgIGNvbnN0IGZpbHRlckhlaWdodCA9IGNvbnZJbmZvLmZpbHRlckhlaWdodDtcbiAgICBjb25zdCBmaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmZpbHRlcldpZHRoO1xuICAgIGNvbnN0IGRpbGF0aW9uSGVpZ2h0ID0gY29udkluZm8uZGlsYXRpb25IZWlnaHQ7XG4gICAgY29uc3QgZGlsYXRpb25XaWR0aCA9IGNvbnZJbmZvLmRpbGF0aW9uV2lkdGg7XG4gICAgY29uc3QgZWZmZWN0aXZlRmlsdGVySGVpZ2h0ID0gY29udkluZm8uZWZmZWN0aXZlRmlsdGVySGVpZ2h0O1xuICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlcldpZHRoID0gY29udkluZm8uZWZmZWN0aXZlRmlsdGVyV2lkdGg7XG4gICAgY29uc3QgcGFkTGVmdCA9IGVmZmVjdGl2ZUZpbHRlcldpZHRoIC0gMSAtIGNvbnZJbmZvLnBhZEluZm8ubGVmdDtcbiAgICBjb25zdCBwYWRUb3AgPSBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgLSAxIC0gY29udkluZm8ucGFkSW5mby50b3A7XG4gICAgY29uc3QgZHggPSBidWZmZXIoeC5zaGFwZSwgJ2Zsb2F0MzInKTtcbiAgICBjb25zdCBhdmdNdWx0aXBsaWVyID0gMSAvIChmaWx0ZXJIZWlnaHQgKiBmaWx0ZXJXaWR0aCk7XG4gICAgY29uc3QgZHlEYXRhID0gYmFja2VuZC5kYXRhLmdldChkeS5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCBkeUJ1ZiA9IGJ1ZmZlcihkeS5zaGFwZSwgJ2Zsb2F0MzInLCBkeURhdGEpO1xuICAgIGZvciAobGV0IGIgPSAwOyBiIDwgY29udkluZm8uYmF0Y2hTaXplOyArK2IpIHtcbiAgICAgICAgZm9yIChsZXQgZCA9IDA7IGQgPCBjb252SW5mby5pbkNoYW5uZWxzOyArK2QpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGR4UiA9IDA7IGR4UiA8IGNvbnZJbmZvLmluSGVpZ2h0OyArK2R4Uikge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGR4QyA9IDA7IGR4QyA8IGNvbnZJbmZvLmluV2lkdGg7ICsrZHhDKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNoYWRlciBjb2RlIGJlZ2lucy5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZHlSQ29ybmVyID0gZHhSIC0gcGFkVG9wO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkeUNDb3JuZXIgPSBkeEMgLSBwYWRMZWZ0O1xuICAgICAgICAgICAgICAgICAgICBsZXQgZG90UHJvZCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHdSID0gMDsgd1IgPCBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQ7IHdSICs9IGRpbGF0aW9uSGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkeVIgPSAoZHlSQ29ybmVyICsgd1IpIC8gc3RyaWRlSGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR5UiA8IDAgfHwgZHlSID49IGNvbnZJbmZvLm91dEhlaWdodCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3IoZHlSKSAhPT0gZHlSKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB3QyA9IDA7IHdDIDwgZWZmZWN0aXZlRmlsdGVyV2lkdGg7IHdDICs9IGRpbGF0aW9uV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkeUMgPSAoZHlDQ29ybmVyICsgd0MpIC8gc3RyaWRlV2lkdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR5QyA8IDAgfHwgZHlDID49IGNvbnZJbmZvLm91dFdpZHRoIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3IoZHlDKSAhPT0gZHlDKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwaXhlbCA9IGR5QnVmLmdldChiLCBkeVIsIGR5QywgZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG90UHJvZCArPSBwaXhlbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBkeC5zZXQoZG90UHJvZCAqIGF2Z011bHRpcGxpZXIsIGIsIGR4UiwgZHhDLCBkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oZHguc2hhcGUsIGR4LmR0eXBlLCBkeC52YWx1ZXMpO1xufVxuZXhwb3J0IGNvbnN0IGF2Z1Bvb2xHcmFkQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEF2Z1Bvb2xHcmFkLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBhdmdQb29sR3JhZFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUF2Z1Bvb2xHcmFkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBCYXRjaE1hdE11bCwgYnVmZmVyLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9SZXNoYXBlJztcbmV4cG9ydCBmdW5jdGlvbiBiYXRjaE1hdE11bChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgYSwgYiB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgdHJhbnNwb3NlQSwgdHJhbnNwb3NlQiB9ID0gYXR0cnM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleChbYSwgYl0sICdtYXRNdWwnKTtcbiAgICBjb25zdCBhUmFuayA9IGEuc2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IGJSYW5rID0gYi5zaGFwZS5sZW5ndGg7XG4gICAgY29uc3QgaW5uZXJTaGFwZUEgPSB0cmFuc3Bvc2VBID8gYS5zaGFwZVthUmFuayAtIDJdIDogYS5zaGFwZVthUmFuayAtIDFdO1xuICAgIGNvbnN0IGlubmVyU2hhcGVCID0gdHJhbnNwb3NlQiA/IGIuc2hhcGVbYlJhbmsgLSAxXSA6IGIuc2hhcGVbYlJhbmsgLSAyXTtcbiAgICBjb25zdCBvdXRlclNoYXBlQSA9IHRyYW5zcG9zZUEgPyBhLnNoYXBlW2FSYW5rIC0gMV0gOiBhLnNoYXBlW2FSYW5rIC0gMl07XG4gICAgY29uc3Qgb3V0ZXJTaGFwZUIgPSB0cmFuc3Bvc2VCID8gYi5zaGFwZVtiUmFuayAtIDJdIDogYi5zaGFwZVtiUmFuayAtIDFdO1xuICAgIGNvbnN0IG91dGVyRGltc0EgPSBhLnNoYXBlLnNsaWNlKDAsIC0yKTtcbiAgICBjb25zdCBvdXRlckRpbXNCID0gYi5zaGFwZS5zbGljZSgwLCAtMik7XG4gICAgY29uc3QgYmF0Y2hEaW1BID0gdXRpbC5zaXplRnJvbVNoYXBlKG91dGVyRGltc0EpO1xuICAgIGNvbnN0IGJhdGNoRGltQiA9IHV0aWwuc2l6ZUZyb21TaGFwZShvdXRlckRpbXNCKTtcbiAgICBjb25zdCBiYXRjaERpbXNDb21wYXRpYmxlID0gYmF0Y2hEaW1BID09PSBiYXRjaERpbUIgfHwgYmF0Y2hEaW1BID09PSAxIHx8IGJhdGNoRGltQiA9PT0gMTtcbiAgICB1dGlsLmFzc2VydChhUmFuayA+PSAyICYmIGJSYW5rID49IDIgJiYgYmF0Y2hEaW1zQ29tcGF0aWJsZSwgKCkgPT4gYEVycm9yIGluIG1hdE11bDogdGhlIGlucHV0IGJhdGNoIGRpbWVuc2lvbnMgbXVzdCBlaXRoZXIgYmUgdGhlIGAgK1xuICAgICAgICBgc2FtZSBvciBhdCBsZWFzdCBvbmUgaW5wdXQgYmF0Y2ggZGltZW5zaW9uIG11c3QgYmUgMS4gR290IGlucHV0IGAgK1xuICAgICAgICBgYmF0Y2ggZGltZW5zaW9ucyBvZiAoJHtvdXRlckRpbXNBfSkgYW5kICgke291dGVyRGltc0J9KS5gKTtcbiAgICBjb25zdCBvdXRTaGFwZU91dGVyRGltcyA9IGJhdGNoRGltQSA+IGJhdGNoRGltQiA/IGEuc2hhcGUuc2xpY2UoMCwgLTIpIDogYi5zaGFwZS5zbGljZSgwLCAtMik7XG4gICAgY29uc3Qgb3V0U2hhcGUgPSBvdXRTaGFwZU91dGVyRGltcy5jb25jYXQoW291dGVyU2hhcGVBLCBvdXRlclNoYXBlQl0pO1xuICAgIHV0aWwuYXNzZXJ0KGlubmVyU2hhcGVBID09PSBpbm5lclNoYXBlQiwgKCkgPT4gYEVycm9yIGluIG1hdE11bDogaW5uZXIgc2hhcGVzICgke2lubmVyU2hhcGVBfSkgYW5kIChgICtcbiAgICAgICAgYCR7aW5uZXJTaGFwZUJ9KSBvZiBUZW5zb3JzIHdpdGggc2hhcGVzICR7YS5zaGFwZX0gYW5kIGAgK1xuICAgICAgICBgJHtiLnNoYXBlfSBhbmQgdHJhbnNwb3NlQT0ke3RyYW5zcG9zZUF9YCArXG4gICAgICAgIGAgYW5kIHRyYW5zcG9zZUI9JHt0cmFuc3Bvc2VCfSBtdXN0IG1hdGNoLmApO1xuICAgIGNvbnN0IGEzZFNoYXBlID0gdHJhbnNwb3NlQSA/IFtiYXRjaERpbUEsIGlubmVyU2hhcGVBLCBvdXRlclNoYXBlQV0gOlxuICAgICAgICBbYmF0Y2hEaW1BLCBvdXRlclNoYXBlQSwgaW5uZXJTaGFwZUFdO1xuICAgIGNvbnN0IGIzZFNoYXBlID0gdHJhbnNwb3NlQiA/IFtiYXRjaERpbUIsIG91dGVyU2hhcGVCLCBpbm5lclNoYXBlQl0gOlxuICAgICAgICBbYmF0Y2hEaW1CLCBpbm5lclNoYXBlQiwgb3V0ZXJTaGFwZUJdO1xuICAgIC8vIFRoZSByZXN0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBpcyBkZXNpZ25lZCB0byBvcGVyYXRlIG9uIHJhbmstMyB0ZW5zb3JzXG4gICAgY29uc3QgYTNkID0gcmVzaGFwZSh7IGlucHV0czogeyB4OiBhIH0sIGJhY2tlbmQsIGF0dHJzOiB7IHNoYXBlOiBhM2RTaGFwZSB9IH0pO1xuICAgIGNvbnN0IGIzZCA9IHJlc2hhcGUoeyBpbnB1dHM6IHsgeDogYiB9LCBiYWNrZW5kLCBhdHRyczogeyBzaGFwZTogYjNkU2hhcGUgfSB9KTtcbiAgICBjb25zdCBzaGFyZWREaW0gPSB0cmFuc3Bvc2VBID8gYTNkLnNoYXBlWzFdIDogYTNkLnNoYXBlWzJdO1xuICAgIGNvbnN0IGxlZnREaW0gPSB0cmFuc3Bvc2VBID8gYTNkLnNoYXBlWzJdIDogYTNkLnNoYXBlWzFdO1xuICAgIGNvbnN0IHJpZ2h0RGltID0gdHJhbnNwb3NlQiA/IGIzZC5zaGFwZVsxXSA6IGIzZC5zaGFwZVsyXTtcbiAgICBjb25zdCBiYXRjaERpbSA9IE1hdGgubWF4KGJhdGNoRGltQSwgYmF0Y2hEaW1CKTtcbiAgICBjb25zdCBhM2RWYWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KGEzZC5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCBiM2RWYWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KGIzZC5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCBhM2RTdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyhhM2Quc2hhcGUpO1xuICAgIGNvbnN0IGIzZFN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKGIzZC5zaGFwZSk7XG4gICAgY29uc3QgW2FCYXRjaCwgYU91dGVyU3RlcCwgYUlubmVyU3RlcF0gPSB0cmFuc3Bvc2VBID9cbiAgICAgICAgW2EzZFN0cmlkZXNbMF0sIDEsIGEzZFN0cmlkZXNbMV1dIDpcbiAgICAgICAgW2EzZFN0cmlkZXNbMF0sIGEzZFN0cmlkZXNbMV0sIDFdO1xuICAgIGNvbnN0IFtiSW5uZXJTdGVwLCBiT3V0ZXJTdGVwLCBiQmF0Y2hdID0gdHJhbnNwb3NlQiA/XG4gICAgICAgIFsxLCBiM2RTdHJpZGVzWzFdLCBiM2RTdHJpZGVzWzBdXSA6XG4gICAgICAgIFtiM2RTdHJpZGVzWzFdLCAxLCBiM2RTdHJpZGVzWzBdXTtcbiAgICBjb25zdCBzaXplID0gbGVmdERpbSAqIHJpZ2h0RGltO1xuICAgIGNvbnN0IHJlc3VsdCA9IGJ1ZmZlcihbYmF0Y2hEaW0sIGxlZnREaW0sIHJpZ2h0RGltXSwgYTNkLmR0eXBlKTtcbiAgICBjb25zdCByZXNWYWxzID0gcmVzdWx0LnZhbHVlcztcbiAgICBjb25zdCBibG9ja1NpemUgPSBiYWNrZW5kLmJsb2NrU2l6ZTtcbiAgICBmb3IgKGxldCBiaSA9IDA7IGJpIDwgYmF0Y2hEaW07IGJpKyspIHtcbiAgICAgICAgZm9yIChsZXQgaTAgPSAwOyBpMCA8IGxlZnREaW07IGkwICs9IGJsb2NrU2l6ZSkge1xuICAgICAgICAgICAgZm9yIChsZXQgajAgPSAwOyBqMCA8IHJpZ2h0RGltOyBqMCArPSBibG9ja1NpemUpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBrMCA9IDA7IGswIDwgc2hhcmVkRGltOyBrMCArPSBibG9ja1NpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHdoZW4gYmxvY2tTaXplIGRvZXNuJ3QgZXZlbmx5IGRpdmlkZSB0aGUgaW5wdXRcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaUJsb2NrID0gTWF0aC5taW4oaTAgKyBibG9ja1NpemUsIGxlZnREaW0pO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBqQmxvY2sgPSBNYXRoLm1pbihqMCArIGJsb2NrU2l6ZSwgcmlnaHREaW0pO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBrQmxvY2sgPSBNYXRoLm1pbihrMCArIGJsb2NrU2l6ZSwgc2hhcmVkRGltKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IGkwOyBpIDwgaUJsb2NrOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSBqMDsgaiA8IGpCbG9jazsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN1bSA9IDAuMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gazA7IGsgPCBrQmxvY2s7IGsrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXRjaE9mZnNldEEgPSBNYXRoLm1pbihiaSwgYmF0Y2hEaW1BIC0gMSkgKiBhQmF0Y2g7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhdGNoT2Zmc2V0QiA9IE1hdGgubWluKGJpLCBiYXRjaERpbUIgLSAxKSAqIGJCYXRjaDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYVZhbCA9IGEzZFZhbHVlc1tiYXRjaE9mZnNldEEgKyBpICogYU91dGVyU3RlcCArIGsgKiBhSW5uZXJTdGVwXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYlZhbCA9IGIzZFZhbHVlc1trICogYklubmVyU3RlcCArIGogKiBiT3V0ZXJTdGVwICsgYmF0Y2hPZmZzZXRCXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtICs9IGFWYWwgKiBiVmFsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNWYWxzW2JpICogc2l6ZSArIChpICogcmlnaHREaW0gKyBqKV0gKz0gc3VtO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oYTNkKTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGIzZCk7XG4gICAgLy8gc2V0IGNvcnJlY3Qgc2hhcGUgb24gb3V0cHV0LlxuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dFNoYXBlLCByZXN1bHQuZHR5cGUsIHJlc3VsdC52YWx1ZXMpO1xufVxuZXhwb3J0IGNvbnN0IGJhdGNoTWF0TXVsQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEJhdGNoTWF0TXVsLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBiYXRjaE1hdE11bCxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1CYXRjaE1hdE11bC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBGdXNlZEJhdGNoTm9ybSwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIGJhdGNoTm9ybShhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCwgc2NhbGUsIG9mZnNldCwgbWVhbiwgdmFyaWFuY2UgfSA9IGlucHV0cztcbiAgICB1dGlsLmFzc2VydChtZWFuLnNoYXBlLmxlbmd0aCA9PT0gdmFyaWFuY2Uuc2hhcGUubGVuZ3RoLCAoKSA9PiAnQmF0Y2ggbm9ybWFsaXphdGlvbiBncmFkaWVudCByZXF1aXJlcyBtZWFuIGFuZCB2YXJpYW5jZSB0byBoYXZlICcgK1xuICAgICAgICAnZXF1YWwgcmFua3MuJyk7XG4gICAgdXRpbC5hc3NlcnQob2Zmc2V0ID09IG51bGwgfHwgbWVhbi5zaGFwZS5sZW5ndGggPT09IG9mZnNldC5zaGFwZS5sZW5ndGgsICgpID0+ICdCYXRjaCBub3JtYWxpemF0aW9uIGdyYWRpZW50IHJlcXVpcmVzIG1lYW4gYW5kIG9mZnNldCB0byBoYXZlICcgK1xuICAgICAgICAnZXF1YWwgcmFua3MuJyk7XG4gICAgdXRpbC5hc3NlcnQoc2NhbGUgPT0gbnVsbCB8fCBtZWFuLnNoYXBlLmxlbmd0aCA9PT0gc2NhbGUuc2hhcGUubGVuZ3RoLCAoKSA9PiAnQmF0Y2ggbm9ybWFsaXphdGlvbiBncmFkaWVudCByZXF1aXJlcyBtZWFuIGFuZCBzY2FsZSB0byBoYXZlICcgK1xuICAgICAgICAnZXF1YWwgcmFua3MuJyk7XG4gICAgYXNzZXJ0Tm90Q29tcGxleChbeCwgbWVhbiwgdmFyaWFuY2UsIHNjYWxlLCBvZmZzZXRdLCAnYmF0Y2hOb3JtJyk7XG4gICAgbGV0IHsgdmFyaWFuY2VFcHNpbG9uIH0gPSBhdHRycztcbiAgICBpZiAodmFyaWFuY2VFcHNpbG9uID09IG51bGwpIHtcbiAgICAgICAgdmFyaWFuY2VFcHNpbG9uID0gMC4wMDE7XG4gICAgfVxuICAgIGNvbnN0IHhWYWxzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IG1WYWxzID0gYmFja2VuZC5kYXRhLmdldChtZWFuLmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IHZhclZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KHZhcmlhbmNlLmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IHNWYWxzID0gc2NhbGUgPyBiYWNrZW5kLmRhdGEuZ2V0KHNjYWxlLmRhdGFJZCkudmFsdWVzIDpcbiAgICAgICAgbmV3IEZsb2F0MzJBcnJheShbMV0pO1xuICAgIGNvbnN0IG9mZlZhbHMgPSBvZmZzZXQgP1xuICAgICAgICBiYWNrZW5kLmRhdGEuZ2V0KG9mZnNldC5kYXRhSWQpLnZhbHVlcyA6XG4gICAgICAgIG5ldyBGbG9hdDMyQXJyYXkoWzBdKTtcbiAgICBjb25zdCBvdXRWYWxzID0gbmV3IEZsb2F0MzJBcnJheSh4VmFscy5sZW5ndGgpO1xuICAgIGNvbnN0IG9mZlZhbHNMZW5ndGggPSBvZmZWYWxzLmxlbmd0aDtcbiAgICBjb25zdCBzVmFsc0xlbmd0aCA9IHNWYWxzLmxlbmd0aDtcbiAgICBjb25zdCB2YXJWYWxzTGVuZ3RoID0gdmFyVmFscy5sZW5ndGg7XG4gICAgY29uc3QgbVZhbHNMZW5ndGggPSBtVmFscy5sZW5ndGg7XG4gICAgbGV0IG9mZmkgPSAwO1xuICAgIGxldCBtaSA9IDA7XG4gICAgbGV0IHNpID0gMDtcbiAgICBsZXQgdmkgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgeFZhbHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgb3V0VmFsc1tpXSA9IG9mZlZhbHNbb2ZmaSsrXSArXG4gICAgICAgICAgICAoeFZhbHNbaV0gLSBtVmFsc1ttaSsrXSkgKiBzVmFsc1tzaSsrXSAvXG4gICAgICAgICAgICAgICAgTWF0aC5zcXJ0KHZhclZhbHNbdmkrK10gKyB2YXJpYW5jZUVwc2lsb24pO1xuICAgICAgICBpZiAob2ZmaSA+PSBvZmZWYWxzTGVuZ3RoKSB7XG4gICAgICAgICAgICBvZmZpID0gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWkgPj0gbVZhbHNMZW5ndGgpIHtcbiAgICAgICAgICAgIG1pID0gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2kgPj0gc1ZhbHNMZW5ndGgpIHtcbiAgICAgICAgICAgIHNpID0gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmkgPj0gdmFyVmFsc0xlbmd0aCkge1xuICAgICAgICAgICAgdmkgPSAwO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHguc2hhcGUsIHguZHR5cGUsIG91dFZhbHMpO1xufVxuZXhwb3J0IGNvbnN0IGJhdGNoTm9ybUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBGdXNlZEJhdGNoTm9ybSxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogYmF0Y2hOb3JtLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJhdGNoTm9ybS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIEJhdGNoVG9TcGFjZU5EIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9SZXNoYXBlJztcbmltcG9ydCB7IHNsaWNlIH0gZnJvbSAnLi9TbGljZSc7XG5pbXBvcnQgeyB0cmFuc3Bvc2UgfSBmcm9tICcuL1RyYW5zcG9zZSc7XG5leHBvcnQgZnVuY3Rpb24gYmF0Y2hUb1NwYWNlTkQoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGJsb2NrU2hhcGUsIGNyb3BzIH0gPSBhdHRycztcbiAgICBhc3NlcnROb3RDb21wbGV4KFt4XSwgJ2JhdGNoVG9TcGFjZU5EJyk7XG4gICAgY29uc3QgcHJvZCA9IGJsb2NrU2hhcGUucmVkdWNlKChhLCBiKSA9PiBhICogYik7XG4gICAgY29uc3QgcmVzaGFwZWQgPSBiYWNrZW5kX3V0aWwuZ2V0UmVzaGFwZWQoeC5zaGFwZSwgYmxvY2tTaGFwZSwgcHJvZCk7XG4gICAgY29uc3QgcGVybXV0ZWQgPSBiYWNrZW5kX3V0aWwuZ2V0UGVybXV0ZWQocmVzaGFwZWQubGVuZ3RoLCBibG9ja1NoYXBlLmxlbmd0aCk7XG4gICAgY29uc3QgcmVzaGFwZWRQZXJtdXRlZCA9IGJhY2tlbmRfdXRpbC5nZXRSZXNoYXBlZFBlcm11dGVkKHguc2hhcGUsIGJsb2NrU2hhcGUsIHByb2QpO1xuICAgIGNvbnN0IHNsaWNlQmVnaW5Db29yZHMgPSBiYWNrZW5kX3V0aWwuZ2V0U2xpY2VCZWdpbkNvb3Jkcyhjcm9wcywgYmxvY2tTaGFwZS5sZW5ndGgpO1xuICAgIGNvbnN0IHNsaWNlU2l6ZSA9IGJhY2tlbmRfdXRpbC5nZXRTbGljZVNpemUocmVzaGFwZWRQZXJtdXRlZCwgY3JvcHMsIGJsb2NrU2hhcGUubGVuZ3RoKTtcbiAgICBjb25zdCB4UmVzaGFwZWQgPSByZXNoYXBlKHsgaW5wdXRzOiB7IHggfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IHJlc2hhcGVkIH0gfSk7XG4gICAgY29uc3QgeFRyYW5zcG9zZWQgPSB0cmFuc3Bvc2UoeyBpbnB1dHM6IHsgeDogeFJlc2hhcGVkIH0sIGJhY2tlbmQsIGF0dHJzOiB7IHBlcm06IHBlcm11dGVkIH0gfSk7XG4gICAgY29uc3QgeFRyYW5zcG9zZWRSZXNoYXBlZCA9IHJlc2hhcGUoeyBpbnB1dHM6IHsgeDogeFRyYW5zcG9zZWQgfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IHJlc2hhcGVkUGVybXV0ZWQgfSB9KTtcbiAgICBjb25zdCByZXN1bHQgPSBzbGljZSh7XG4gICAgICAgIGlucHV0czogeyB4OiB4VHJhbnNwb3NlZFJlc2hhcGVkIH0sXG4gICAgICAgIGJhY2tlbmQsXG4gICAgICAgIGF0dHJzOiB7IGJlZ2luOiBzbGljZUJlZ2luQ29vcmRzLCBzaXplOiBzbGljZVNpemUgfVxuICAgIH0pO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oeFJlc2hhcGVkKTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHhUcmFuc3Bvc2VkKTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHhUcmFuc3Bvc2VkUmVzaGFwZWQpO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5leHBvcnQgY29uc3QgYmF0Y2hUb1NwYWNlTkRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQmF0Y2hUb1NwYWNlTkQsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGJhdGNoVG9TcGFjZU5EXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QmF0Y2hUb1NwYWNlTkQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQmluY291bnQgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYmluY291bnRJbXBsIH0gZnJvbSAnLi9CaW5jb3VudF9pbXBsJztcbmV4cG9ydCBmdW5jdGlvbiBiaW5jb3VudChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCwgd2VpZ2h0cyB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgc2l6ZSB9ID0gYXR0cnM7XG4gICAgY29uc3QgeFZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3Qgd2VpZ2h0c1ZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KHdlaWdodHMuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3Qgb3V0VmFscyA9IGJpbmNvdW50SW1wbCh4VmFscywgd2VpZ2h0c1ZhbHMsIHdlaWdodHMuZHR5cGUsIHdlaWdodHMuc2hhcGUsIHNpemUpO1xuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtzaXplXSwgd2VpZ2h0cy5kdHlwZSwgb3V0VmFscyk7XG59XG5leHBvcnQgY29uc3QgYmluY291bnRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQmluY291bnQsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGJpbmNvdW50XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QmluY291bnQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYnVmZmVyLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmV4cG9ydCBmdW5jdGlvbiBiaW5jb3VudEltcGwoeFZhbHMsIHdlaWdodHNWYWxzLCB3ZWlnaHRzRHR5cGUsIHdlaWdodHNTaGFwZSwgc2l6ZSkge1xuICAgIGNvbnN0IHdlaWdodHNTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHdlaWdodHNTaGFwZSk7XG4gICAgY29uc3Qgb3V0VmFscyA9IHV0aWwubWFrZVplcm9zVHlwZWRBcnJheShzaXplLCB3ZWlnaHRzRHR5cGUpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgeFZhbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB4VmFsc1tpXTtcbiAgICAgICAgaWYgKHZhbHVlIDwgMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnB1dCB4IG11c3QgYmUgbm9uLW5lZ2F0aXZlIScpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSA+PSBzaXplKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAod2VpZ2h0c1NpemUgPiAwKSB7XG4gICAgICAgICAgICBvdXRWYWxzW3ZhbHVlXSArPSB3ZWlnaHRzVmFsc1tpXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG91dFZhbHNbdmFsdWVdICs9IDE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dFZhbHM7XG59XG5leHBvcnQgZnVuY3Rpb24gYmluY291bnRSZWR1Y2VJbXBsKHhCdWYsIHdlaWdodHNCdWYsIHNpemUsIGJpbmFyeU91dHB1dCA9IGZhbHNlKSB7XG4gICAgY29uc3QgbnVtUm93cyA9IHhCdWYuc2hhcGVbMF07XG4gICAgY29uc3QgbnVtQ29scyA9IHhCdWYuc2hhcGVbMV07XG4gICAgY29uc3Qgb3V0QnVmID0gYnVmZmVyKFtudW1Sb3dzLCBzaXplXSwgd2VpZ2h0c0J1Zi5kdHlwZSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1Sb3dzOyBpKyspIHtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBudW1Db2xzOyBqKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0geEJ1Zi5nZXQoaSwgaik7XG4gICAgICAgICAgICBpZiAodmFsdWUgPCAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnB1dCB4IG11c3QgYmUgbm9uLW5lZ2F0aXZlIScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZhbHVlID49IHNpemUpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChiaW5hcnlPdXRwdXQpIHtcbiAgICAgICAgICAgICAgICBvdXRCdWYuc2V0KDEsIGksIHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICh3ZWlnaHRzQnVmLnNpemUgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIG91dEJ1Zi5zZXQob3V0QnVmLmdldChpLCB2YWx1ZSkgKyB3ZWlnaHRzQnVmLmdldChpLCBqKSwgaSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0QnVmLnNldChvdXRCdWYuZ2V0KGksIHZhbHVlKSArIDEsIGksIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dEJ1Zjtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJpbmNvdW50X2ltcGwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQ2FzdCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsIH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X2ltcGwnO1xuaW1wb3J0IHsgemVyb3MgfSBmcm9tICcuLi91dGlscy96ZXJvc19pbXBsJztcbmltcG9ydCB7IGNvbXBsZXggfSBmcm9tICcuL0NvbXBsZXgnO1xuaW1wb3J0IHsgaWRlbnRpdHkgfSBmcm9tICcuL0lkZW50aXR5JztcbmltcG9ydCB7IHJlYWwgfSBmcm9tICcuL1JlYWwnO1xuZXhwb3J0IGZ1bmN0aW9uIGNhc3QoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGR0eXBlIH0gPSBhdHRycztcbiAgICAvLyBDYXN0aW5nIHRvIGNvbXBsZXg2NC5cbiAgICBpZiAoZHR5cGUgPT09ICdjb21wbGV4NjQnKSB7XG4gICAgICAgIGlmICh4LmR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgICAgICAgICAgcmV0dXJuIGlkZW50aXR5KHsgaW5wdXRzOiB7IHggfSwgYmFja2VuZCB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB6ZXJvc1RlbnNvckluZm8gPSB6ZXJvcyhiYWNrZW5kLCB4LnNoYXBlLCB4LmR0eXBlKTtcbiAgICAgICAgY29uc3QgZmxvYXRYID0gY2FzdCh7IGlucHV0czogeyB4IH0sIGJhY2tlbmQsIGF0dHJzOiB7IGR0eXBlOiAnZmxvYXQzMicgfSB9KTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gY29tcGxleCh7IGlucHV0czogeyByZWFsOiBmbG9hdFgsIGltYWc6IHplcm9zVGVuc29ySW5mbyB9LCBiYWNrZW5kIH0pO1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHplcm9zVGVuc29ySW5mbyk7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oZmxvYXRYKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLy8gQ2FzdGluZyBmcm9tIGNvbXBsZXg2NFxuICAgIGlmICh4LmR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgICAgICBjb25zdCByZWFsUGFydCA9IHJlYWwoeyBpbnB1dHM6IHsgaW5wdXQ6IHggfSwgYmFja2VuZCB9KTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gY2FzdCh7IGlucHV0czogeyB4OiByZWFsUGFydCB9LCBiYWNrZW5kLCBhdHRyczogeyBkdHlwZSB9IH0pO1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlYWxQYXJ0KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgaWYgKCF1dGlsLmhhc0VuY29kaW5nTG9zcyh4LmR0eXBlLCBkdHlwZSkpIHtcbiAgICAgICAgLy8gV2UgZG9uJ3QgY2hhbmdlIHRoZSB1bmRlcmx5aW5nIGRhdGEsIHNpbmNlIHdlIGNhc3QgdG8gaGlnaGVyXG4gICAgICAgIC8vIHByZWNpc2lvbi5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gaWRlbnRpdHkoeyBpbnB1dHM6IHsgeCB9LCBiYWNrZW5kIH0pO1xuICAgICAgICByZXR1cm4geyBkYXRhSWQ6IHJlc3VsdC5kYXRhSWQsIHNoYXBlOiByZXN1bHQuc2hhcGUsIGR0eXBlIH07XG4gICAgfVxuICAgIGlmIChkdHlwZSA9PT0gJ2ludDMyJykge1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXM7XG4gICAgICAgIGNvbnN0IHJlc3VsdFZhbHVlcyA9IEludDMyQXJyYXkuZnJvbSh2YWx1ZXMpO1xuICAgICAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyh4LnNoYXBlLCAnaW50MzInLCByZXN1bHRWYWx1ZXMpO1xuICAgIH1cbiAgICBpZiAoZHR5cGUgPT09ICdib29sJykge1xuICAgICAgICAvLyBUaGlzIGlzIGVzc2VudGlhbGx5IHRoZSByZXN1bHQgb2Ygbm90RXF1YWwoeCwgMCkuIFdlIGF2b2lkIHVzaW5nXG4gICAgICAgIC8vIGtlcm5lbCBub3RFcXVhbCB0byBhdm9pZCBjaXJjdWxhciBkZXBlbmRlbmN5LCBpLmUuIGJpbmFyeV91dGlscyAtPlxuICAgICAgICAvLyBjYXN0IC0+IG5vdEVxdWFsIC0+IGJpbmFyeV91dGlscy5cbiAgICAgICAgY29uc3QgeFZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXM7XG4gICAgICAgIGNvbnN0IHplcm8gPSB1dGlsLnRvVHlwZWRBcnJheShbMF0sIHguZHR5cGUpO1xuICAgICAgICBjb25zdCBbcmVzdWx0RGF0YSwgcmVzdWx0U2hhcGVdID0gY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCgoYSwgYikgPT4gKGEgIT09IGIpID8gMSA6IDApKHguc2hhcGUsIFtdLCB4VmFscywgemVybywgJ2Jvb2wnKTtcbiAgICAgICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ocmVzdWx0U2hhcGUsICdib29sJywgcmVzdWx0RGF0YSk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgaW4gQ2FzdDogZmFpbGVkIHRvIGNhc3QgJHt4LmR0eXBlfSB0byAke2R0eXBlfWApO1xufVxuZXhwb3J0IGNvbnN0IGNhc3RDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQ2FzdCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogY2FzdFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNhc3QuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IENlaWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlU2ltcGxlVW5hcnlJbXBsIH0gZnJvbSAnLi4vdXRpbHMvdW5hcnlfaW1wbCc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmNGcm9tSW1wbCB9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCBjZWlsSW1wbCA9IGNyZWF0ZVNpbXBsZVVuYXJ5SW1wbCgoeGkpID0+IE1hdGguY2VpbCh4aSkpO1xuZXhwb3J0IGNvbnN0IGNlaWwgPSB1bmFyeUtlcm5lbEZ1bmNGcm9tSW1wbChDZWlsLCBjZWlsSW1wbCk7XG5leHBvcnQgY29uc3QgY2VpbENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBDZWlsLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBjZWlsLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNlaWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IENsaXBCeVZhbHVlIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHVuYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCBjbGlwID0gdW5hcnlLZXJuZWxGdW5jKENsaXBCeVZhbHVlLCAoeGksIGF0dHJzKSA9PiB7XG4gICAgY29uc3QgY2xpcEF0dHJzID0gYXR0cnM7XG4gICAgaWYgKHhpID4gY2xpcEF0dHJzLmNsaXBWYWx1ZU1heCkge1xuICAgICAgICByZXR1cm4gY2xpcEF0dHJzLmNsaXBWYWx1ZU1heDtcbiAgICB9XG4gICAgcmV0dXJuIHhpIDwgY2xpcEF0dHJzLmNsaXBWYWx1ZU1pbiA/IGNsaXBBdHRycy5jbGlwVmFsdWVNaW4gOiB4aTtcbn0pO1xuZXhwb3J0IGNvbnN0IGNsaXBDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQ2xpcEJ5VmFsdWUsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGNsaXAsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q2xpcC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBDb21wbGV4IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmV4cG9ydCBmdW5jdGlvbiBjb21wbGV4KGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCB7IHJlYWwsIGltYWcgfSA9IGlucHV0cztcbiAgICBjb25zdCByZWFsVmFscyA9IGJhY2tlbmQuZGF0YS5nZXQocmVhbC5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCBpbWFnVmFscyA9IGJhY2tlbmQuZGF0YS5nZXQoaW1hZy5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCBjb21wbGV4SW5mbyA9IGJhY2tlbmQubWFrZVRlbnNvckluZm8ocmVhbC5zaGFwZSwgJ2NvbXBsZXg2NCcpO1xuICAgIGNvbnN0IGNvbXBsZXggPSBiYWNrZW5kLmRhdGEuZ2V0KGNvbXBsZXhJbmZvLmRhdGFJZCk7XG4gICAgLy8gVGhlIGNvbXBsZXggdGVuc29yIG93bnMgdGhlIHVuZGVybHlpbmcgcmVhbCBhbmQgaW1hZyB0ZW5zb3JJbmZvcywgb25seSB0aGVcbiAgICAvLyBjb21wbGV4IHRlbnNvciB0cmFja3MgcmVmQ291bnQsIHdoZW4gY29tcGxleERhdGEgaXMgZGlzcG9zZWQgdGhlXG4gICAgLy8gdW5kZXJseWluZyB0ZW5zb3JEYXRhIHdpbGwgYmUgZGlzcG9zZWQuXG4gICAgY29tcGxleC5jb21wbGV4VGVuc29ySW5mb3MgPSB7XG4gICAgICAgIHJlYWw6IGJhY2tlbmQubWFrZVRlbnNvckluZm8ocmVhbC5zaGFwZSwgJ2Zsb2F0MzInLCByZWFsVmFscyksXG4gICAgICAgIGltYWc6IGJhY2tlbmQubWFrZVRlbnNvckluZm8oaW1hZy5zaGFwZSwgJ2Zsb2F0MzInLCBpbWFnVmFscylcbiAgICB9O1xuICAgIHJldHVybiBjb21wbGV4SW5mbztcbn1cbmV4cG9ydCBjb25zdCBjb21wbGV4Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IENvbXBsZXgsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGNvbXBsZXhcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Db21wbGV4LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBDb21wbGV4QWJzLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmV4cG9ydCBjb25zdCBjb21wbGV4QWJzID0gKGFyZ3MpID0+IHtcbiAgICBjb25zdCB7IHggfSA9IGFyZ3MuaW5wdXRzO1xuICAgIGNvbnN0IGNwdUJhY2tlbmQgPSBhcmdzLmJhY2tlbmQ7XG4gICAgY29uc3QgcmVzdWx0VmFsdWVzID0gbmV3IEZsb2F0MzJBcnJheSh1dGlsLnNpemVGcm9tU2hhcGUoeC5zaGFwZSkpO1xuICAgIGNvbnN0IGNvbXBsZXhWYWxzID0gY3B1QmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCk7XG4gICAgY29uc3QgcmVhbCA9IGNvbXBsZXhWYWxzLmNvbXBsZXhUZW5zb3JJbmZvcy5yZWFsO1xuICAgIGNvbnN0IGltYWcgPSBjb21wbGV4VmFscy5jb21wbGV4VGVuc29ySW5mb3MuaW1hZztcbiAgICBjb25zdCByZWFsVmFscyA9IGNwdUJhY2tlbmQuZGF0YS5nZXQocmVhbC5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCBpbWFnVmFscyA9IGNwdUJhY2tlbmQuZGF0YS5nZXQoaW1hZy5kYXRhSWQpLnZhbHVlcztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlYWxWYWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHJlYWwgPSByZWFsVmFsc1tpXTtcbiAgICAgICAgY29uc3QgaW1hZyA9IGltYWdWYWxzW2ldO1xuICAgICAgICByZXN1bHRWYWx1ZXNbaV0gPSBNYXRoLmh5cG90KHJlYWwsIGltYWcpO1xuICAgIH1cbiAgICByZXR1cm4gY3B1QmFja2VuZC5tYWtlT3V0cHV0KHJlc3VsdFZhbHVlcywgeC5zaGFwZSwgJ2Zsb2F0MzInKTtcbn07XG5leHBvcnQgY29uc3QgY29tcGxleEFic0NvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBDb21wbGV4QWJzLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBjb21wbGV4QWJzLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNvbXBsZXhBYnMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBDb25jYXQsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY29tcGxleCB9IGZyb20gJy4vQ29tcGxleCc7XG5pbXBvcnQgeyBjb25jYXRJbXBsIH0gZnJvbSAnLi9Db25jYXRfaW1wbCc7XG5pbXBvcnQgeyBpZGVudGl0eSB9IGZyb20gJy4vSWRlbnRpdHknO1xuaW1wb3J0IHsgaW1hZyB9IGZyb20gJy4vSW1hZyc7XG5pbXBvcnQgeyByZWFsIH0gZnJvbSAnLi9SZWFsJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL1Jlc2hhcGUnO1xuZXhwb3J0IGZ1bmN0aW9uIGNvbmNhdChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgYXhpcyB9ID0gYXR0cnM7XG4gICAgY29uc3QgJGF4aXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKGF4aXMsIGlucHV0c1swXS5zaGFwZSlbMF07XG4gICAgbGV0IG91dFNoYXBlID0gYmFja2VuZF91dGlsLmNvbXB1dGVPdXRTaGFwZShpbnB1dHMubWFwKHQgPT4gdC5zaGFwZSksICRheGlzKTtcbiAgICBpZiAodXRpbC5zaXplRnJvbVNoYXBlKG91dFNoYXBlKSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRTaGFwZSwgaW5wdXRzWzBdLmR0eXBlLCBbXSk7XG4gICAgfVxuICAgIC8vIEtlZXAgb25seSBub24tZW1wdHkgdGVuc29ycyAoaWdub3JlIHRlbnNvcnMgd2l0aCAwIGluIHRoZWlyIHNoYXBlKS5cbiAgICBjb25zdCAkaW5wdXRzID0gaW5wdXRzLmZpbHRlcih0ID0+IHV0aWwuc2l6ZUZyb21TaGFwZSh0LnNoYXBlKSA+IDApO1xuICAgIGlmICgkaW5wdXRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gaWRlbnRpdHkoeyBpbnB1dHM6IHsgeDogJGlucHV0c1swXSB9LCBiYWNrZW5kIH0pO1xuICAgIH1cbiAgICBjb25zdCBzaGFwZXMgPSAkaW5wdXRzLm1hcCh0ID0+IHQuc2hhcGUpO1xuICAgIGJhY2tlbmRfdXRpbC5hc3NlcnRQYXJhbXNDb25zaXN0ZW50KHNoYXBlcywgJGF4aXMpO1xuICAgIGlmICgkaW5wdXRzWzBdLmR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgICAgICBjb25zdCByZWFscyA9ICRpbnB1dHMubWFwKCh0KSA9PiByZWFsKHsgaW5wdXRzOiB7IGlucHV0OiB0IH0sIGJhY2tlbmQgfSkpO1xuICAgICAgICBjb25zdCBpbWFncyA9ICRpbnB1dHMubWFwKCh0KSA9PiBpbWFnKHsgaW5wdXRzOiB7IGlucHV0OiB0IH0sIGJhY2tlbmQgfSkpO1xuICAgICAgICBjb25zdCByZWFsQ29uY2F0ZWQgPSBjb25jYXQoeyBpbnB1dHM6IHJlYWxzLCBiYWNrZW5kLCBhdHRyczogeyBheGlzOiAkYXhpcyB9IH0pO1xuICAgICAgICBjb25zdCBpbWFnQ29uY2F0ZWQgPSBjb25jYXQoeyBpbnB1dHM6IGltYWdzLCBiYWNrZW5kLCBhdHRyczogeyBheGlzOiAkYXhpcyB9IH0pO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBjb21wbGV4KHsgaW5wdXRzOiB7IHJlYWw6IHJlYWxDb25jYXRlZCwgaW1hZzogaW1hZ0NvbmNhdGVkIH0sIGJhY2tlbmQgfSk7XG4gICAgICAgIHJlYWxzLmZvckVhY2gociA9PiBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHIpKTtcbiAgICAgICAgaW1hZ3MuZm9yRWFjaChpID0+IGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oaSkpO1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlYWxDb25jYXRlZCk7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oaW1hZ0NvbmNhdGVkKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLy8gQW55IGNvbmNhdCBvZiBuLWRpbWVuc2lvbmFsIHRlbnNvcnMgYWNyb3NzIGFueSBheGlzIGNhbiBiZSByZWR1Y2VkIHRvXG4gICAgLy8gYSBjb25jYXRlbmF0aW9uIG9mIHR3by1kaW1lbnNpb25hbCB0ZW5zb3JzIGFjcm9zcyB0aGUgYXhpcyAxIGJ5IGZpcnN0XG4gICAgLy8gcGFydGl0aW9uaW5nIHRoZSBheGVzIG9mIHRoZSBvcmlnaW5hbCB0ZW5zb3JzIGludG8gdGhvc2UgbGVzcyB0aGFuIHRoZVxuICAgIC8vIGF4aXMgdG8gYmUgY29uY2F0ZW5hdGVkIGFuZCB0aGUgcmVzdC4gVGhlbiByZXNoYXBlIHRoZSB0ZW5zb3JzXG4gICAgLy8gaW50byBhIHR3by1kaW1lbnNpb25hbCB0ZW5zb3IgYnkgY29sbGFwc2luZyB0aGVzZSB0d28gc2V0cyBvZiBheGVzIGFuZFxuICAgIC8vIGNvbmNhdGVuYXRlIHRoZSByZXN1bHRpbmcgbWF0cmljZXMgYWNyb3NzIHRoZSBheGlzIDEsIGZpbmFsbHkgcmVzaGFwaW5nXG4gICAgLy8gdGhlIHJlc3VsdCB0byBoYXZlIHRoZSBwcm9wZXIgc2hhcGUuXG4gICAgY29uc3QgaW5wdXRzMkQgPSAkaW5wdXRzLm1hcCh0ID0+IHtcbiAgICAgICAgY29uc3QgaW5uZXJTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHQuc2hhcGUuc2xpY2UoJGF4aXMpKTtcbiAgICAgICAgY29uc3Qgc2hhcGUgPSBbLTEsIGlubmVyU2l6ZV07XG4gICAgICAgIHJldHVybiByZXNoYXBlKHsgaW5wdXRzOiB7IHg6IHQgfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGUgfSB9KTtcbiAgICB9KTtcbiAgICBjb25zdCBpbnB1dHNWYWxTaGFwZXMgPSBpbnB1dHMyRC5tYXAodCA9PiB7XG4gICAgICAgIHJldHVybiB7IHZhbHM6IGJhY2tlbmQuZGF0YS5nZXQodC5kYXRhSWQpLnZhbHVlcywgc2hhcGU6IHQuc2hhcGUgfTtcbiAgICB9KTtcbiAgICAvLyBDb25jYXRzIDJkIHRlbnNvcnMgYWxvbmcgYXhpcz0xLlxuICAgIG91dFNoYXBlID1cbiAgICAgICAgYmFja2VuZF91dGlsLmNvbXB1dGVPdXRTaGFwZShpbnB1dHMyRC5tYXAodCA9PiB0LnNoYXBlKSwgMSAvKiBheGlzICovKTtcbiAgICBjb25zdCBzaW1wbHlDb25jYXQgPSBpbnB1dHMyRFswXS5zaGFwZVswXSA9PT0gMTtcbiAgICBjb25zdCBvdXRWYWxzID0gY29uY2F0SW1wbChpbnB1dHNWYWxTaGFwZXMsIG91dFNoYXBlLCBpbnB1dHNbMF0uZHR5cGUsIHNpbXBseUNvbmNhdCk7XG4gICAgY29uc3QgZmluYWxPdXRTaGFwZSA9IGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0U2hhcGUoJGlucHV0cy5tYXAodCA9PiB0LnNoYXBlKSwgJGF4aXMpO1xuICAgIGNvbnN0IG91dEluZm8gPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKGZpbmFsT3V0U2hhcGUsIGlucHV0c1swXS5kdHlwZSwgb3V0VmFscyk7XG4gICAgaW5wdXRzMkQuZm9yRWFjaCh0ID0+IGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8odCkpO1xuICAgIHJldHVybiBvdXRJbmZvO1xufVxuZXhwb3J0IGNvbnN0IGNvbmNhdENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBDb25jYXQsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGNvbmNhdFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNvbmNhdC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuZXhwb3J0IGZ1bmN0aW9uIGNvbmNhdEltcGwoaW5wdXRzLCBvdXRTaGFwZSwgZHR5cGUsIHNpbXBseUNvbmNhdCkge1xuICAgIGNvbnN0IG91dFZhbHMgPSB1dGlsLmdldEFycmF5RnJvbURUeXBlKGR0eXBlLCB1dGlsLnNpemVGcm9tU2hhcGUob3V0U2hhcGUpKTtcbiAgICBpZiAoc2ltcGx5Q29uY2F0ICYmIGR0eXBlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAvLyBVc2UgYnVpbHQtaW4gVHlwZWRBcnJheS5zZXQoKSBtZXRob2QgZm9yIHNwZWVkLlxuICAgICAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICAgICAgaW5wdXRzLmZvckVhY2goaW5wdXQgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShpbnB1dC5zaGFwZSk7XG4gICAgICAgICAgICBvdXRWYWxzLnNldChpbnB1dC52YWxzLCBvZmZzZXQpO1xuICAgICAgICAgICAgb2Zmc2V0ICs9IHNpemU7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbGV0IGNvbE9mZnNldCA9IDA7XG4gICAgICAgIGlucHV0cy5mb3JFYWNoKGlucHV0ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRlY29kZWREYXRhID0gZHR5cGUgPT09ICdzdHJpbmcnID9cbiAgICAgICAgICAgICAgICBiYWNrZW5kX3V0aWwuZnJvbVVpbnQ4VG9TdHJpbmdBcnJheShpbnB1dC52YWxzKSA6XG4gICAgICAgICAgICAgICAgaW5wdXQudmFscztcbiAgICAgICAgICAgIGxldCB0SWR4ID0gMDtcbiAgICAgICAgICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IGlucHV0LnNoYXBlWzBdOyArK3Jvdykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc0lkeCA9IHJvdyAqIG91dFNoYXBlWzFdICsgY29sT2Zmc2V0O1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IGlucHV0LnNoYXBlWzFdOyArK2NvbCkge1xuICAgICAgICAgICAgICAgICAgICBvdXRWYWxzW3Jlc0lkeCArIGNvbF0gPSBkZWNvZGVkRGF0YVt0SWR4KytdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbE9mZnNldCArPSBpbnB1dC5zaGFwZVsxXTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBvdXRWYWxzO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q29uY2F0X2ltcGwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBDb252MkQsIFRlbnNvckJ1ZmZlciwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnYyRChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCwgZmlsdGVyIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBzdHJpZGVzLCBwYWQsIGRhdGFGb3JtYXQsIGRpbGF0aW9ucywgZGltUm91bmRpbmdNb2RlIH0gPSBhdHRycztcbiAgICBhc3NlcnROb3RDb21wbGV4KFt4LCBmaWx0ZXJdLCAnY29udjJkJyk7XG4gICAgY29uc3QgJGRhdGFGb3JtYXQgPSBiYWNrZW5kX3V0aWwuY29udmVydENvbnYyRERhdGFGb3JtYXQoZGF0YUZvcm1hdCk7XG4gICAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZUNvbnYyREluZm8oeC5zaGFwZSwgZmlsdGVyLnNoYXBlLCBzdHJpZGVzLCBkaWxhdGlvbnMsIHBhZCwgZGltUm91bmRpbmdNb2RlLCBmYWxzZSAvKiBkZXB0aHdpc2UgKi8sICRkYXRhRm9ybWF0KTtcbiAgICBjb25zdCBmaWx0ZXJIZWlnaHQgPSBjb252SW5mby5maWx0ZXJIZWlnaHQ7XG4gICAgY29uc3QgZmlsdGVyV2lkdGggPSBjb252SW5mby5maWx0ZXJXaWR0aDtcbiAgICBjb25zdCBkaWxhdGlvbkhlaWdodCA9IGNvbnZJbmZvLmRpbGF0aW9uSGVpZ2h0O1xuICAgIGNvbnN0IGRpbGF0aW9uV2lkdGggPSBjb252SW5mby5kaWxhdGlvbldpZHRoO1xuICAgIGNvbnN0IHBhZExlZnQgPSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG4gICAgY29uc3QgcGFkVG9wID0gY29udkluZm8ucGFkSW5mby50b3A7XG4gICAgY29uc3QgaXNDaGFubmVsc0xhc3QgPSBjb252SW5mby5kYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNMYXN0JztcbiAgICBjb25zdCB5ID0gbmV3IFRlbnNvckJ1ZmZlcihjb252SW5mby5vdXRTaGFwZSwgeC5kdHlwZSk7XG4gICAgY29uc3QgeFN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKHguc2hhcGUpO1xuICAgIGNvbnN0IGZpbHRlclN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKGZpbHRlci5zaGFwZSk7XG4gICAgY29uc3QgeEJhdGNoU3RyaWRlID0geFN0cmlkZXNbMF07XG4gICAgY29uc3QgeFJvd1N0cmlkZSA9IGlzQ2hhbm5lbHNMYXN0ID8geFN0cmlkZXNbMV0gOiB4U3RyaWRlc1syXTtcbiAgICBjb25zdCB4Q29sU3RyaWRlID0gaXNDaGFubmVsc0xhc3QgPyB4U3RyaWRlc1syXSA6IDE7XG4gICAgY29uc3QgeENoYW5uZWxTdHJpZGUgPSBpc0NoYW5uZWxzTGFzdCA/IDEgOiB4U3RyaWRlc1sxXTtcbiAgICBjb25zdCB5QmF0Y2hTdHJpZGUgPSB5LnN0cmlkZXNbMF07XG4gICAgY29uc3QgeVJvd1N0cmlkZSA9IGlzQ2hhbm5lbHNMYXN0ID8geS5zdHJpZGVzWzFdIDogeS5zdHJpZGVzWzJdO1xuICAgIGNvbnN0IHlDb2xTdHJpZGUgPSBpc0NoYW5uZWxzTGFzdCA/IHkuc3RyaWRlc1syXSA6IDE7XG4gICAgY29uc3QgeUNoYW5uZWxTdHJpZGUgPSBpc0NoYW5uZWxzTGFzdCA/IDEgOiB5LnN0cmlkZXNbMV07XG4gICAgY29uc3QgeFZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3Qgd1ZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KGZpbHRlci5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCB5VmFscyA9IHkudmFsdWVzO1xuICAgIGZvciAobGV0IGIgPSAwOyBiIDwgY29udkluZm8uYmF0Y2hTaXplOyArK2IpIHtcbiAgICAgICAgY29uc3QgeE9mZnNldDEgPSBiICogeEJhdGNoU3RyaWRlO1xuICAgICAgICBjb25zdCB5T2Zmc2V0MSA9IGIgKiB5QmF0Y2hTdHJpZGU7XG4gICAgICAgIGZvciAobGV0IHlSID0gMDsgeVIgPCBjb252SW5mby5vdXRIZWlnaHQ7ICsreVIpIHtcbiAgICAgICAgICAgIGNvbnN0IHlPZmZzZXQyID0geU9mZnNldDEgKyB5UiAqIHlSb3dTdHJpZGU7XG4gICAgICAgICAgICBjb25zdCB4UkNvcm5lciA9IHlSICogY29udkluZm8uc3RyaWRlSGVpZ2h0IC0gcGFkVG9wO1xuICAgICAgICAgICAgZm9yIChsZXQgd1IgPSAwOyB3UiA8IGZpbHRlckhlaWdodDsgKyt3Uikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHhSID0geFJDb3JuZXIgKyB3UiAqIGRpbGF0aW9uSGVpZ2h0O1xuICAgICAgICAgICAgICAgIGlmICh4UiA8IDAgfHwgeFIgPj0gY29udkluZm8uaW5IZWlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHdPZmZzZXQxID0gd1IgKiBmaWx0ZXJTdHJpZGVzWzBdO1xuICAgICAgICAgICAgICAgIGNvbnN0IHhPZmZzZXQyID0geE9mZnNldDEgKyB4UiAqIHhSb3dTdHJpZGU7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgeUMgPSAwOyB5QyA8IGNvbnZJbmZvLm91dFdpZHRoOyArK3lDKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHlPZmZzZXQzID0geU9mZnNldDIgKyB5QyAqIHlDb2xTdHJpZGU7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHhDQ29ybmVyID0geUMgKiBjb252SW5mby5zdHJpZGVXaWR0aCAtIHBhZExlZnQ7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHdDID0gMDsgd0MgPCBmaWx0ZXJXaWR0aDsgKyt3Qykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeEMgPSB4Q0Nvcm5lciArIHdDICogZGlsYXRpb25XaWR0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4QyA8IDAgfHwgeEMgPj0gY29udkluZm8uaW5XaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd09mZnNldDIgPSB3T2Zmc2V0MSArIHdDICogZmlsdGVyU3RyaWRlc1sxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhPZmZzZXQzID0geE9mZnNldDIgKyB4QyAqIHhDb2xTdHJpZGU7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgd09mZnNldDMgPSB3T2Zmc2V0MjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGQxID0gMDsgZDEgPCBjb252SW5mby5pbkNoYW5uZWxzOyArK2QxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeFZhbCA9IHhWYWxzW3hPZmZzZXQzICsgZDEgKiB4Q2hhbm5lbFN0cmlkZV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgZDIgPSAwOyBkMiA8IGNvbnZJbmZvLm91dENoYW5uZWxzOyArK2QyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlWYWxzW3lPZmZzZXQzICsgZDIgKiB5Q2hhbm5lbFN0cmlkZV0gKz1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWYWwgKiB3VmFsc1t3T2Zmc2V0MyArIGQyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd09mZnNldDMgKz0gY29udkluZm8ub3V0Q2hhbm5lbHM7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oeS5zaGFwZSwgeS5kdHlwZSwgeVZhbHMpO1xufVxuZXhwb3J0IGNvbnN0IGNvbnYyRENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBDb252MkQsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGNvbnYyRFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNvbnYyRC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIENvbnYyREJhY2twcm9wRmlsdGVyLCBUZW5zb3JCdWZmZXIgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmV4cG9ydCBmdW5jdGlvbiBjb252MkRCYWNrcHJvcEZpbHRlcihhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCwgZHkgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IHN0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdCwgZGltUm91bmRpbmdNb2RlLCBmaWx0ZXJTaGFwZSB9ID0gYXR0cnM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleChbeCwgZHldLCAnY29udjJkQmFja3Byb3BGaWx0ZXInKTtcbiAgICBjb25zdCAkZGF0YUZvcm1hdCA9IGJhY2tlbmRfdXRpbC5jb252ZXJ0Q29udjJERGF0YUZvcm1hdChkYXRhRm9ybWF0KTtcbiAgICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlQ29udjJESW5mbyh4LnNoYXBlLCBmaWx0ZXJTaGFwZSwgc3RyaWRlcywgMSAvKiBkaWxhdGlvbnMgKi8sIHBhZCwgZGltUm91bmRpbmdNb2RlLCBmYWxzZSAvKiBkZXB0aHdpc2UgKi8sICRkYXRhRm9ybWF0KTtcbiAgICBjb25zdCB7IHN0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGgsIGZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGggfSA9IGNvbnZJbmZvO1xuICAgIGNvbnN0IGlzQ2hhbm5lbHNMYXN0ID0gY29udkluZm8uZGF0YUZvcm1hdCA9PT0gJ2NoYW5uZWxzTGFzdCc7XG4gICAgY29uc3QgZFcgPSBuZXcgVGVuc29yQnVmZmVyKGNvbnZJbmZvLmZpbHRlclNoYXBlLCAnZmxvYXQzMicpO1xuICAgIGNvbnN0IGxlZnRQYWQgPSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG4gICAgY29uc3QgdG9wUGFkID0gY29udkluZm8ucGFkSW5mby50b3A7XG4gICAgY29uc3QgeFZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgZHlWYWxzID0gYmFja2VuZC5kYXRhLmdldChkeS5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCB4QnVmID0gbmV3IFRlbnNvckJ1ZmZlcih4LnNoYXBlLCB4LmR0eXBlLCB4VmFscyk7XG4gICAgY29uc3QgZHlCdWYgPSBuZXcgVGVuc29yQnVmZmVyKGR5LnNoYXBlLCBkeS5kdHlwZSwgZHlWYWxzKTtcbiAgICBmb3IgKGxldCB3UiA9IDA7IHdSIDwgZmlsdGVySGVpZ2h0OyArK3dSKSB7XG4gICAgICAgIGNvbnN0IHlSTWluID0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKCh0b3BQYWQgLSB3UikgLyBzdHJpZGVIZWlnaHQpKTtcbiAgICAgICAgY29uc3QgeVJNYXggPSBNYXRoLm1pbihjb252SW5mby5vdXRIZWlnaHQsIChjb252SW5mby5pbkhlaWdodCArIHRvcFBhZCAtIHdSKSAvIHN0cmlkZUhlaWdodCk7XG4gICAgICAgIGZvciAobGV0IHdDID0gMDsgd0MgPCBmaWx0ZXJXaWR0aDsgKyt3Qykge1xuICAgICAgICAgICAgY29uc3QgeUNNaW4gPSBNYXRoLm1heCgwLCBNYXRoLmNlaWwoKGxlZnRQYWQgLSB3QykgLyBzdHJpZGVXaWR0aCkpO1xuICAgICAgICAgICAgY29uc3QgeUNNYXggPSBNYXRoLm1pbihjb252SW5mby5vdXRXaWR0aCwgKGNvbnZJbmZvLmluV2lkdGggKyBsZWZ0UGFkIC0gd0MpIC8gc3RyaWRlV2lkdGgpO1xuICAgICAgICAgICAgZm9yIChsZXQgZDEgPSAwOyBkMSA8IGNvbnZJbmZvLmluQ2hhbm5lbHM7ICsrZDEpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBkMiA9IDA7IGQyIDwgY29udkluZm8ub3V0Q2hhbm5lbHM7ICsrZDIpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRvdFByb2QgPSAwO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBiID0gMDsgYiA8IGNvbnZJbmZvLmJhdGNoU2l6ZTsgKytiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB5UiA9IHlSTWluOyB5UiA8IHlSTWF4OyArK3lSKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeFIgPSB3UiArIHlSICogc3RyaWRlSGVpZ2h0IC0gdG9wUGFkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHlDID0geUNNaW47IHlDIDwgeUNNYXg7ICsreUMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeEMgPSB3QyArIHlDICogc3RyaWRlV2lkdGggLSBsZWZ0UGFkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNDaGFubmVsc0xhc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdFByb2QgKz0geEJ1Zi5nZXQoYiwgeFIsIHhDLCBkMSkgKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR5QnVmLmdldChiLCB5UiwgeUMsIGQyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdFByb2QgKz0geEJ1Zi5nZXQoYiwgZDEsIHhSLCB4QykgKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR5QnVmLmdldChiLCBkMiwgeVIsIHlDKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBkVy5zZXQoZG90UHJvZCwgd1IsIHdDLCBkMSwgZDIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhkVy5zaGFwZSwgZFcuZHR5cGUsIGRXLnZhbHVlcyk7XG59XG5leHBvcnQgY29uc3QgY29udjJEQmFja3Byb3BGaWx0ZXJDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQ29udjJEQmFja3Byb3BGaWx0ZXIsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGNvbnYyREJhY2twcm9wRmlsdGVyXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q29udjJEQmFja3Byb3BGaWx0ZXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBDb252MkRCYWNrcHJvcElucHV0LCBUZW5zb3JCdWZmZXIsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmV4cG9ydCBmdW5jdGlvbiBjb252MkRCYWNrcHJvcElucHV0KGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBkeSwgZmlsdGVyIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBpbnB1dFNoYXBlLCBzdHJpZGVzLCBwYWQsIGRhdGFGb3JtYXQsIGRpbVJvdW5kaW5nTW9kZSB9ID0gYXR0cnM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleChbZHksIGZpbHRlcl0sICdjb252MmRCYWNrcHJvcElucHV0Jyk7XG4gICAgY29uc3QgZmlsdGVyU3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoZmlsdGVyLnNoYXBlKTtcbiAgICBjb25zdCBkeVN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKGR5LnNoYXBlKTtcbiAgICBsZXQgJGRhdGFGb3JtYXQgPSBiYWNrZW5kX3V0aWwuY29udmVydENvbnYyRERhdGFGb3JtYXQoZGF0YUZvcm1hdCk7XG4gICAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZUNvbnYyREluZm8oaW5wdXRTaGFwZSwgZmlsdGVyLnNoYXBlLCBzdHJpZGVzLCAxIC8qIGRpbGF0aW9ucyAqLywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIGZhbHNlLCAkZGF0YUZvcm1hdCk7XG4gICAgY29uc3QgZHggPSBuZXcgVGVuc29yQnVmZmVyKGNvbnZJbmZvLmluU2hhcGUsICdmbG9hdDMyJyk7XG4gICAgY29uc3QgZHhWYWx1ZXMgPSBkeC52YWx1ZXM7XG4gICAgY29uc3QgZHlWYWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KGR5LmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IGZsdFZhbHVlcyA9IGJhY2tlbmQuZGF0YS5nZXQoZmlsdGVyLmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IFtmbHRTMCwgZmx0UzEsIGZsdFMyXSA9IGZpbHRlclN0cmlkZXM7XG4gICAgY29uc3QgeyBiYXRjaFNpemUsIGZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsIGluQ2hhbm5lbHMsIGluSGVpZ2h0LCBpbldpZHRoLCBvdXRDaGFubmVscywgb3V0SGVpZ2h0LCBvdXRXaWR0aCwgc3RyaWRlSGVpZ2h0LCBzdHJpZGVXaWR0aCB9ID0gY29udkluZm87XG4gICAgJGRhdGFGb3JtYXQgPSBjb252SW5mby5kYXRhRm9ybWF0O1xuICAgIGNvbnN0IHRvcFBhZCA9IGZpbHRlckhlaWdodCAtIDEgLSBjb252SW5mby5wYWRJbmZvLnRvcDtcbiAgICBjb25zdCBsZWZ0UGFkID0gZmlsdGVyV2lkdGggLSAxIC0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuICAgIGNvbnN0IGlzQ2hhbm5lbHNMYXN0ID0gJGRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0xhc3QnO1xuICAgIGNvbnN0IHhCYXRjaFN0cmlkZSA9IGR4LnN0cmlkZXNbMF07XG4gICAgY29uc3QgeFJvd1N0cmlkZSA9IGlzQ2hhbm5lbHNMYXN0ID8gZHguc3RyaWRlc1sxXSA6IGR4LnN0cmlkZXNbMl07XG4gICAgY29uc3QgeENvbFN0cmlkZSA9IGlzQ2hhbm5lbHNMYXN0ID8gZHguc3RyaWRlc1syXSA6IDE7XG4gICAgY29uc3QgeENoYW5uZWxTdHJpZGUgPSBpc0NoYW5uZWxzTGFzdCA/IDEgOiBkeC5zdHJpZGVzWzFdO1xuICAgIGNvbnN0IHlCYXRjaFN0cmlkZSA9IGR5U3RyaWRlc1swXTtcbiAgICBjb25zdCB5Um93U3RyaWRlID0gaXNDaGFubmVsc0xhc3QgPyBkeVN0cmlkZXNbMV0gOiBkeVN0cmlkZXNbMl07XG4gICAgY29uc3QgeUNvbFN0cmlkZSA9IGlzQ2hhbm5lbHNMYXN0ID8gZHlTdHJpZGVzWzJdIDogMTtcbiAgICBjb25zdCB5Q2hhbm5lbFN0cmlkZSA9IGlzQ2hhbm5lbHNMYXN0ID8gMSA6IGR5U3RyaWRlc1sxXTtcbiAgICBmb3IgKGxldCBiID0gMDsgYiA8IGJhdGNoU2l6ZTsgKytiKSB7XG4gICAgICAgIGZvciAobGV0IGQxID0gMDsgZDEgPCBpbkNoYW5uZWxzOyArK2QxKSB7XG4gICAgICAgICAgICBmb3IgKGxldCB4UiA9IDA7IHhSIDwgaW5IZWlnaHQ7ICsreFIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB4UkNvcm5lciA9IHhSIC0gdG9wUGFkO1xuICAgICAgICAgICAgICAgIGNvbnN0IHhSTWluID0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKHhSQ29ybmVyIC8gc3RyaWRlSGVpZ2h0KSk7XG4gICAgICAgICAgICAgICAgY29uc3QgeVJNYXggPSBNYXRoLm1pbihvdXRIZWlnaHQsIChmaWx0ZXJIZWlnaHQgKyB4UkNvcm5lcikgLyBzdHJpZGVIZWlnaHQpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHhDID0gMDsgeEMgPCBpbldpZHRoOyArK3hDKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHhDQ29ybmVyID0geEMgLSBsZWZ0UGFkO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB4Q01pbiA9IE1hdGgubWF4KDAsIE1hdGguY2VpbCh4Q0Nvcm5lciAvIHN0cmlkZVdpZHRoKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHlDTWF4ID0gTWF0aC5taW4ob3V0V2lkdGgsIChmaWx0ZXJXaWR0aCArIHhDQ29ybmVyKSAvIHN0cmlkZVdpZHRoKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRvdFByb2QgPSAwO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB5UiA9IHhSTWluOyB5UiA8IHlSTWF4OyArK3lSKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3UiA9IHlSICogc3RyaWRlSGVpZ2h0IC0geFJDb3JuZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB5QyA9IHhDTWluOyB5QyA8IHlDTWF4OyArK3lDKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd0MgPSB5QyAqIHN0cmlkZVdpZHRoIC0geENDb3JuZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZHlPZmZzZXQgPSB5QmF0Y2hTdHJpZGUgKiBiICsgeVJvd1N0cmlkZSAqIHlSICsgeUNvbFN0cmlkZSAqIHlDO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsdE9mZnNldCA9IGZsdFMwICogKGZpbHRlckhlaWdodCAtIDEgLSB3UikgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbHRTMSAqIChmaWx0ZXJXaWR0aCAtIDEgLSB3QykgKyBmbHRTMiAqIGQxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGQyID0gMDsgZDIgPCBvdXRDaGFubmVsczsgKytkMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwaXhlbCA9IGR5VmFsdWVzW2R5T2Zmc2V0ICsgeUNoYW5uZWxTdHJpZGUgKiBkMl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdlaWdodCA9IGZsdFZhbHVlc1tmbHRPZmZzZXQgKyBkMl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdFByb2QgKz0gcGl4ZWwgKiB3ZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGR4T2Zmc2V0ID0geEJhdGNoU3RyaWRlICogYiArIHhSb3dTdHJpZGUgKiB4UiArXG4gICAgICAgICAgICAgICAgICAgICAgICB4Q29sU3RyaWRlICogeEMgKyB4Q2hhbm5lbFN0cmlkZSAqIGQxO1xuICAgICAgICAgICAgICAgICAgICBkeFZhbHVlc1tkeE9mZnNldF0gPSBkb3RQcm9kO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhkeC5zaGFwZSwgZHguZHR5cGUsIGR4LnZhbHVlcyk7XG59XG5leHBvcnQgY29uc3QgY29udjJEQmFja3Byb3BJbnB1dENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBDb252MkRCYWNrcHJvcElucHV0LFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBjb252MkRCYWNrcHJvcElucHV0XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q29udjJEQmFja3Byb3BJbnB1dC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIENvbnYzRCwgVGVuc29yQnVmZmVyLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5leHBvcnQgZnVuY3Rpb24gY29udjNEKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4LCBmaWx0ZXIgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IHN0cmlkZXMsIHBhZCwgZGlsYXRpb25zIH0gPSBhdHRycztcbiAgICBhc3NlcnROb3RDb21wbGV4KFt4LCBmaWx0ZXJdLCAnY29udjNkJyk7XG4gICAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZUNvbnYzREluZm8oeC5zaGFwZSwgZmlsdGVyLnNoYXBlLCBzdHJpZGVzLCBkaWxhdGlvbnMsIHBhZCk7XG4gICAgY29uc3QgeyBmaWx0ZXJEZXB0aCwgZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgZGlsYXRpb25EZXB0aCwgZGlsYXRpb25IZWlnaHQsIGRpbGF0aW9uV2lkdGgsIHBhZEluZm8gfSA9IGNvbnZJbmZvO1xuICAgIGNvbnN0IHBhZEZyb250ID0gcGFkSW5mby5mcm9udDtcbiAgICBjb25zdCBwYWRMZWZ0ID0gcGFkSW5mby5sZWZ0O1xuICAgIGNvbnN0IHBhZFRvcCA9IHBhZEluZm8udG9wO1xuICAgIGNvbnN0IHkgPSBuZXcgVGVuc29yQnVmZmVyKGNvbnZJbmZvLm91dFNoYXBlLCB4LmR0eXBlKTtcbiAgICBjb25zdCB4VmFscyA9IGJhY2tlbmQuZGF0YS5nZXQoeC5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCB3VmFscyA9IGJhY2tlbmQuZGF0YS5nZXQoZmlsdGVyLmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IHlWYWxzID0geS52YWx1ZXM7XG4gICAgY29uc3QgeFN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKHguc2hhcGUpO1xuICAgIGNvbnN0IGZpbHRlclN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKGZpbHRlci5zaGFwZSk7XG4gICAgZm9yIChsZXQgYiA9IDA7IGIgPCBjb252SW5mby5iYXRjaFNpemU7ICsrYikge1xuICAgICAgICBjb25zdCB4T2Zmc2V0MSA9IGIgKiB4U3RyaWRlc1swXTtcbiAgICAgICAgY29uc3QgeU9mZnNldDEgPSBiICogeS5zdHJpZGVzWzBdO1xuICAgICAgICBmb3IgKGxldCB5RiA9IDA7IHlGIDwgY29udkluZm8ub3V0RGVwdGg7ICsreUYpIHtcbiAgICAgICAgICAgIGNvbnN0IHlPZmZzZXQyID0geU9mZnNldDEgKyB5RiAqIHkuc3RyaWRlc1sxXTtcbiAgICAgICAgICAgIGNvbnN0IHhGQ29ybmVyID0geUYgKiBjb252SW5mby5zdHJpZGVEZXB0aCAtIHBhZEZyb250O1xuICAgICAgICAgICAgZm9yIChsZXQgd0YgPSAwOyB3RiA8IGZpbHRlckRlcHRoOyArK3dGKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeEYgPSB4RkNvcm5lciArIHdGICogZGlsYXRpb25EZXB0aDtcbiAgICAgICAgICAgICAgICBpZiAoeEYgPCAwIHx8IHhGID49IGNvbnZJbmZvLmluRGVwdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHdPZmZzZXQxID0gd0YgKiBmaWx0ZXJTdHJpZGVzWzBdO1xuICAgICAgICAgICAgICAgIGNvbnN0IHhPZmZzZXQyID0geE9mZnNldDEgKyB4RiAqIHhTdHJpZGVzWzFdO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHlSID0gMDsgeVIgPCBjb252SW5mby5vdXRIZWlnaHQ7ICsreVIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeU9mZnNldDMgPSB5T2Zmc2V0MiArIHlSICogeS5zdHJpZGVzWzJdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB4UkNvcm5lciA9IHlSICogY29udkluZm8uc3RyaWRlSGVpZ2h0IC0gcGFkVG9wO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB3UiA9IDA7IHdSIDwgZmlsdGVySGVpZ2h0OyArK3dSKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4UiA9IHhSQ29ybmVyICsgd1IgKiBkaWxhdGlvbkhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4UiA8IDAgfHwgeFIgPj0gY29udkluZm8uaW5IZWlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdPZmZzZXQyID0gd09mZnNldDEgKyB3UiAqIGZpbHRlclN0cmlkZXNbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4T2Zmc2V0MyA9IHhPZmZzZXQyICsgeFIgKiB4U3RyaWRlc1syXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHlDID0gMDsgeUMgPCBjb252SW5mby5vdXRXaWR0aDsgKyt5Qykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHlPZmZzZXQ0ID0geU9mZnNldDMgKyB5QyAqIGNvbnZJbmZvLm91dENoYW5uZWxzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhDQ29ybmVyID0geUMgKiBjb252SW5mby5zdHJpZGVXaWR0aCAtIHBhZExlZnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgd0MgPSAwOyB3QyA8IGZpbHRlcldpZHRoOyArK3dDKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhDID0geENDb3JuZXIgKyB3QyAqIGRpbGF0aW9uV2lkdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4QyA8IDAgfHwgeEMgPj0gY29udkluZm8uaW5XaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd09mZnNldDMgPSB3T2Zmc2V0MiArIHdDICogZmlsdGVyU3RyaWRlc1syXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeE9mZnNldDQgPSB4T2Zmc2V0MyArIHhDICogY29udkluZm8uaW5DaGFubmVscztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHdPZmZzZXQ0ID0gd09mZnNldDM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGQxID0gMDsgZDEgPCBjb252SW5mby5pbkNoYW5uZWxzOyArK2QxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4VmFsID0geFZhbHNbeE9mZnNldDQgKyBkMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBkMiA9IDA7IGQyIDwgY29udkluZm8ub3V0Q2hhbm5lbHM7ICsrZDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5VmFsc1t5T2Zmc2V0NCArIGQyXSArPSB4VmFsICogd1ZhbHNbd09mZnNldDQgKyBkMl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3T2Zmc2V0NCArPSBjb252SW5mby5vdXRDaGFubmVscztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyh5LnNoYXBlLCB5LmR0eXBlLCB5LnZhbHVlcyk7XG59XG5leHBvcnQgY29uc3QgY29udjNEQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IENvbnYzRCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogY29udjNEXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q29udjNELmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgQ29udjNEQmFja3Byb3BGaWx0ZXJWMiwgVGVuc29yQnVmZmVyLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5leHBvcnQgZnVuY3Rpb24gY29udjNEQmFja3Byb3BGaWx0ZXJWMihhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCwgZHkgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IHN0cmlkZXMsIHBhZCwgZmlsdGVyU2hhcGUgfSA9IGF0dHJzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoW3gsIGR5XSwgJ2NvbnYzZEJhY2twcm9wRmlsdGVyVjInKTtcbiAgICBjb25zdCB4U3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoeC5zaGFwZSk7XG4gICAgY29uc3QgZHlTdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyhkeS5zaGFwZSk7XG4gICAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZUNvbnYzREluZm8oeC5zaGFwZSwgZmlsdGVyU2hhcGUsIHN0cmlkZXMsIDEgLyogZGlsYXRpb25zICovLCBwYWQpO1xuICAgIGNvbnN0IHN0cmlkZURlcHRoID0gY29udkluZm8uc3RyaWRlRGVwdGg7XG4gICAgY29uc3Qgc3RyaWRlSGVpZ2h0ID0gY29udkluZm8uc3RyaWRlSGVpZ2h0O1xuICAgIGNvbnN0IHN0cmlkZVdpZHRoID0gY29udkluZm8uc3RyaWRlV2lkdGg7XG4gICAgY29uc3QgZmlsdGVyRGVwdGggPSBjb252SW5mby5maWx0ZXJEZXB0aDtcbiAgICBjb25zdCBmaWx0ZXJIZWlnaHQgPSBjb252SW5mby5maWx0ZXJIZWlnaHQ7XG4gICAgY29uc3QgZmlsdGVyV2lkdGggPSBjb252SW5mby5maWx0ZXJXaWR0aDtcbiAgICBjb25zdCBkdyA9IG5ldyBUZW5zb3JCdWZmZXIoY29udkluZm8uZmlsdGVyU2hhcGUsICdmbG9hdDMyJyk7XG4gICAgY29uc3QgZHdWYWx1ZXMgPSBkdy52YWx1ZXM7XG4gICAgY29uc3QgW2R3UzAsIGR3UzEsIGR3UzIsIGR3UzNdID0gZHcuc3RyaWRlcztcbiAgICBjb25zdCBkeVZhbHVlcyA9IGJhY2tlbmQuZGF0YS5nZXQoZHkuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgW2R5UzAsIGR5UzEsIGR5UzIsIGR5UzNdID0gZHlTdHJpZGVzO1xuICAgIGNvbnN0IHhWYWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgW3hTMCwgeFMxLCB4UzIsIHhTM10gPSB4U3RyaWRlcztcbiAgICBjb25zdCBmcm9udFBhZCA9IGNvbnZJbmZvLnBhZEluZm8uZnJvbnQ7XG4gICAgY29uc3QgbGVmdFBhZCA9IGNvbnZJbmZvLnBhZEluZm8ubGVmdDtcbiAgICBjb25zdCB0b3BQYWQgPSBjb252SW5mby5wYWRJbmZvLnRvcDtcbiAgICBmb3IgKGxldCB3RiA9IDA7IHdGIDwgZmlsdGVyRGVwdGg7ICsrd0YpIHtcbiAgICAgICAgY29uc3QgeUZNaW4gPSBNYXRoLm1heCgwLCBNYXRoLmNlaWwoKGZyb250UGFkIC0gd0YpIC8gc3RyaWRlRGVwdGgpKTtcbiAgICAgICAgY29uc3QgeUZNYXggPSBNYXRoLm1pbihjb252SW5mby5vdXREZXB0aCwgKGNvbnZJbmZvLmluRGVwdGggKyBmcm9udFBhZCAtIHdGKSAvIHN0cmlkZURlcHRoKTtcbiAgICAgICAgY29uc3Qgd09mZnNldDEgPSB3RiAqIGR3UzA7XG4gICAgICAgIGZvciAobGV0IHdSID0gMDsgd1IgPCBmaWx0ZXJIZWlnaHQ7ICsrd1IpIHtcbiAgICAgICAgICAgIGNvbnN0IHlSTWluID0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKCh0b3BQYWQgLSB3UikgLyBzdHJpZGVIZWlnaHQpKTtcbiAgICAgICAgICAgIGNvbnN0IHlSTWF4ID0gTWF0aC5taW4oY29udkluZm8ub3V0SGVpZ2h0LCAoY29udkluZm8uaW5IZWlnaHQgKyB0b3BQYWQgLSB3UikgLyBzdHJpZGVIZWlnaHQpO1xuICAgICAgICAgICAgY29uc3Qgd09mZnNldDIgPSB3UiAqIGR3UzEgKyB3T2Zmc2V0MTtcbiAgICAgICAgICAgIGZvciAobGV0IHdDID0gMDsgd0MgPCBmaWx0ZXJXaWR0aDsgKyt3Qykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHlDTWluID0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKChsZWZ0UGFkIC0gd0MpIC8gc3RyaWRlV2lkdGgpKTtcbiAgICAgICAgICAgICAgICBjb25zdCB5Q01heCA9IE1hdGgubWluKGNvbnZJbmZvLm91dFdpZHRoLCAoY29udkluZm8uaW5XaWR0aCArIGxlZnRQYWQgLSB3QykgLyBzdHJpZGVXaWR0aCk7XG4gICAgICAgICAgICAgICAgY29uc3Qgd09mZnNldDMgPSB3QyAqIGR3UzIgKyB3T2Zmc2V0MjtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBkMSA9IDA7IGQxIDwgY29udkluZm8uaW5DaGFubmVsczsgKytkMSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB3T2Zmc2V0NCA9IGQxICogZHdTMyArIHdPZmZzZXQzO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBkMiA9IDA7IGQyIDwgY29udkluZm8ub3V0Q2hhbm5lbHM7ICsrZDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkb3RQcm9kID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGIgPSAwOyBiIDwgY29udkluZm8uYmF0Y2hTaXplOyArK2IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4T2Zmc2V0MSA9IGIgKiB4UzA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeU9mZnNldDEgPSBiICogZHlTMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB5RiA9IHlGTWluOyB5RiA8IHlGTWF4OyArK3lGKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhGID0gd0YgKyB5RiAqIHN0cmlkZURlcHRoIC0gZnJvbnRQYWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhPZmZzZXQyID0geEYgKiB4UzEgKyB4T2Zmc2V0MTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeU9mZnNldDIgPSB5RiAqIGR5UzEgKyB5T2Zmc2V0MTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgeVIgPSB5Uk1pbjsgeVIgPCB5Uk1heDsgKyt5Uikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeFIgPSB3UiArIHlSICogc3RyaWRlSGVpZ2h0IC0gdG9wUGFkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeE9mZnNldDMgPSB4UiAqIHhTMiArIHhPZmZzZXQyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeU9mZnNldDMgPSB5UiAqIGR5UzIgKyB5T2Zmc2V0MjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHlDID0geUNNaW47IHlDIDwgeUNNYXg7ICsreUMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4QyA9IHdDICsgeUMgKiBzdHJpZGVXaWR0aCAtIGxlZnRQYWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeE9mZnNldDQgPSB4QyAqIHhTMyArIHhPZmZzZXQzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHlPZmZzZXQ0ID0geUMgKiBkeVMzICsgeU9mZnNldDM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG90UHJvZCArPSB4VmFsdWVzW3hPZmZzZXQ0ICsgZDFdICogZHlWYWx1ZXNbeU9mZnNldDQgKyBkMl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBkd1ZhbHVlc1t3T2Zmc2V0NCArIGQyXSA9IGRvdFByb2Q7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oZHcuc2hhcGUsIGR3LmR0eXBlLCBkdy52YWx1ZXMpO1xufVxuZXhwb3J0IGNvbnN0IGNvbnYzREJhY2twcm9wRmlsdGVyVjJDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQ29udjNEQmFja3Byb3BGaWx0ZXJWMixcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogY29udjNEQmFja3Byb3BGaWx0ZXJWMlxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNvbnYzREJhY2twcm9wRmlsdGVyVjIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBDb252M0RCYWNrcHJvcElucHV0VjIsIFRlbnNvckJ1ZmZlciwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnYzREJhY2twcm9wSW5wdXRWMihhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgZHksIGZpbHRlciB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgcGFkLCBzdHJpZGVzLCBpbnB1dFNoYXBlIH0gPSBhdHRycztcbiAgICBhc3NlcnROb3RDb21wbGV4KFtkeV0sICdjb252M2RCYWNrcHJvcElucHV0VjInKTtcbiAgICBjb25zdCBkeVN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKGR5LnNoYXBlKTtcbiAgICBjb25zdCBmaWx0ZXJTdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyhmaWx0ZXIuc2hhcGUpO1xuICAgIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVDb252M0RJbmZvKGlucHV0U2hhcGUsIGZpbHRlci5zaGFwZSwgc3RyaWRlcywgMSAvKiBkaWxhdGlvbnMgKi8sIHBhZCk7XG4gICAgY29uc3QgZHggPSBuZXcgVGVuc29yQnVmZmVyKGNvbnZJbmZvLmluU2hhcGUsICdmbG9hdDMyJyk7XG4gICAgY29uc3QgZHhWYWx1ZXMgPSBkeC52YWx1ZXM7XG4gICAgY29uc3QgW2R4UzAsIGR4UzEsIGR4UzIsIGR4UzNdID0gZHguc3RyaWRlcztcbiAgICBjb25zdCBkeVZhbHVlcyA9IGJhY2tlbmQuZGF0YS5nZXQoZHkuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgW2R5UzAsIGR5UzEsIGR5UzIsIGR5UzNdID0gZHlTdHJpZGVzO1xuICAgIGNvbnN0IGZsdFZhbHVlcyA9IGJhY2tlbmQuZGF0YS5nZXQoZmlsdGVyLmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IFtmbHRTMCwgZmx0UzEsIGZsdFMyLCBmbHRTM10gPSBmaWx0ZXJTdHJpZGVzO1xuICAgIGNvbnN0IHsgYmF0Y2hTaXplLCBmaWx0ZXJEZXB0aCwgZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgaW5DaGFubmVscywgaW5EZXB0aCwgaW5IZWlnaHQsIGluV2lkdGgsIG91dENoYW5uZWxzLCBvdXREZXB0aCwgb3V0SGVpZ2h0LCBvdXRXaWR0aCwgc3RyaWRlRGVwdGgsIHN0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGggfSA9IGNvbnZJbmZvO1xuICAgIGNvbnN0IGZyb250UGFkID0gZmlsdGVyRGVwdGggLSAxIC0gY29udkluZm8ucGFkSW5mby5mcm9udDtcbiAgICBjb25zdCB0b3BQYWQgPSBmaWx0ZXJIZWlnaHQgLSAxIC0gY29udkluZm8ucGFkSW5mby50b3A7XG4gICAgY29uc3QgbGVmdFBhZCA9IGZpbHRlcldpZHRoIC0gMSAtIGNvbnZJbmZvLnBhZEluZm8ubGVmdDtcbiAgICBmb3IgKGxldCBiID0gMDsgYiA8IGJhdGNoU2l6ZTsgKytiKSB7XG4gICAgICAgIGZvciAobGV0IGQxID0gMDsgZDEgPCBpbkNoYW5uZWxzOyArK2QxKSB7XG4gICAgICAgICAgICAvLyBGcmFtZXMgb2YgZGVwdGhcbiAgICAgICAgICAgIGZvciAobGV0IHhGID0gMDsgeEYgPCBpbkRlcHRoOyArK3hGKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeEZDb3JuZXIgPSB4RiAtIGZyb250UGFkO1xuICAgICAgICAgICAgICAgIGNvbnN0IHhGTWluID0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKHhGQ29ybmVyIC8gc3RyaWRlRGVwdGgpKTtcbiAgICAgICAgICAgICAgICBjb25zdCB5Rk1heCA9IE1hdGgubWluKG91dERlcHRoLCAoZmlsdGVyRGVwdGggKyB4RkNvcm5lcikgLyBzdHJpZGVEZXB0aCk7XG4gICAgICAgICAgICAgICAgLy8gUm93cyBhcyBwZXIgc3RhbmRhcmQgMmQgbWF0cml4IG5vdGF0aW9uXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgeFIgPSAwOyB4UiA8IGluSGVpZ2h0OyArK3hSKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHhSQ29ybmVyID0geFIgLSB0b3BQYWQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHhSTWluID0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKHhSQ29ybmVyIC8gc3RyaWRlSGVpZ2h0KSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHlSTWF4ID0gTWF0aC5taW4ob3V0SGVpZ2h0LCAoZmlsdGVySGVpZ2h0ICsgeFJDb3JuZXIpIC8gc3RyaWRlSGVpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ29sdW1ucyBhcyBwZXIgc3RhbmRhcmQgMmQgbWF0cml4IG5vdGF0aW9uXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHhDID0gMDsgeEMgPCBpbldpZHRoOyArK3hDKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4Q0Nvcm5lciA9IHhDIC0gbGVmdFBhZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhDTWluID0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKHhDQ29ybmVyIC8gc3RyaWRlV2lkdGgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHlDTWF4ID0gTWF0aC5taW4ob3V0V2lkdGgsIChmaWx0ZXJXaWR0aCArIHhDQ29ybmVyKSAvIHN0cmlkZVdpZHRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkb3RQcm9kID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHlGID0geEZNaW47IHlGIDwgeUZNYXg7ICsreUYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3RiA9IHlGICogc3RyaWRlRGVwdGggLSB4RkNvcm5lcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB5UiA9IHhSTWluOyB5UiA8IHlSTWF4OyArK3lSKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdSID0geVIgKiBzdHJpZGVIZWlnaHQgLSB4UkNvcm5lcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgeUMgPSB4Q01pbjsgeUMgPCB5Q01heDsgKyt5Qykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd0MgPSB5QyAqIHN0cmlkZVdpZHRoIC0geENDb3JuZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkeU9mZnNldCA9IGR5UzAgKiBiICsgZHlTMSAqIHlGICsgZHlTMiAqIHlSICsgZHlTMyAqIHlDO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmx0T2Zmc2V0ID0gZmx0UzAgKiAoZmlsdGVyRGVwdGggLSAxIC0gd0YpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbHRTMSAqIChmaWx0ZXJIZWlnaHQgLSAxIC0gd1IpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbHRTMiAqIChmaWx0ZXJXaWR0aCAtIDEgLSB3QykgKyBmbHRTMyAqIGQxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgZDIgPSAwOyBkMiA8IG91dENoYW5uZWxzOyArK2QyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGl4ZWwgPSBkeVZhbHVlc1tkeU9mZnNldCArIGQyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3ZWlnaHQgPSBmbHRWYWx1ZXNbZmx0T2Zmc2V0ICsgZDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdFByb2QgKz0gcGl4ZWwgKiB3ZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBkeFZhbHVlc1tkeFMwICogYiArIGR4UzEgKiB4RiArIGR4UzIgKiB4UiArIGR4UzMgKiB4QyArIGQxXSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG90UHJvZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhkeC5zaGFwZSwgZHguZHR5cGUsIGR4LnZhbHVlcyk7XG59XG5leHBvcnQgY29uc3QgY29udjNEQmFja3Byb3BJbnB1dFYyQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IENvbnYzREJhY2twcm9wSW5wdXRWMixcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogY29udjNEQmFja3Byb3BJbnB1dFYyXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q29udjNEQmFja3Byb3BJbnB1dFYyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IENvcyB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5leHBvcnQgY29uc3QgY29zID0gdW5hcnlLZXJuZWxGdW5jKENvcywgKHhpKSA9PiBNYXRoLmNvcyh4aSkpO1xuZXhwb3J0IGNvbnN0IGNvc0NvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBDb3MsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGNvcyxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Db3MuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IENvc2ggfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgdW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4vdXRpbHMvdW5hcnlfdXRpbHMnO1xuZXhwb3J0IGNvbnN0IGNvc2ggPSB1bmFyeUtlcm5lbEZ1bmMoQ29zaCwgKHhpKSA9PiBNYXRoLmNvc2goeGkpKTtcbmV4cG9ydCBjb25zdCBjb3NoQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IENvc2gsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGNvc2gsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q29zaC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBidWZmZXIsIENyb3BBbmRSZXNpemUsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuZXhwb3J0IGZ1bmN0aW9uIGNyb3BBbmRSZXNpemUoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IGltYWdlLCBib3hlcywgYm94SW5kIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBjcm9wU2l6ZSwgbWV0aG9kLCBleHRyYXBvbGF0aW9uVmFsdWUgfSA9IGF0dHJzO1xuICAgIGNvbnN0IFtiYXRjaCwgaW1hZ2VIZWlnaHQsIGltYWdlV2lkdGgsIG51bUNoYW5uZWxzXSA9IGltYWdlLnNoYXBlO1xuICAgIGNvbnN0IG51bUJveGVzID0gYm94ZXMuc2hhcGVbMF07XG4gICAgY29uc3QgW2Nyb3BIZWlnaHQsIGNyb3BXaWR0aF0gPSBjcm9wU2l6ZTtcbiAgICBjb25zdCBvdXRwdXQgPSBidWZmZXIoW251bUJveGVzLCBjcm9wSGVpZ2h0LCBjcm9wV2lkdGgsIG51bUNoYW5uZWxzXSwgJ2Zsb2F0MzInKTtcbiAgICBjb25zdCBib3hWYWxzID0gYmFja2VuZC5kYXRhLmdldChib3hlcy5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCBib3hJbmRWYWxzID0gYmFja2VuZC5kYXRhLmdldChib3hJbmQuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgaW1hZ2VWYWxzID0gYmFja2VuZC5kYXRhLmdldChpbWFnZS5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCBpblN0cmlkZSA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoaW1hZ2Uuc2hhcGUpOyAvLyB0byBjYWxjdWxhdGUgZmxhdCBpbmRleGVzIGludG8gaW1hZ2VcbiAgICBjb25zdCBvdXRTdHJpZGUgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKG91dHB1dC5zaGFwZSk7IC8vIHRvIGNhbGN1bGF0ZSBmbGF0IGluZGV4ZXMgaW50byBvdXRwdXRcbiAgICAvLyBSZWZlcmVuY2UgaW1wbGVtZW50YXRpb25cbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yZmxvdy9ibG9iL21hc3Rlci90ZW5zb3JmbG93L2NvcmUva2VybmVscy9jcm9wX2FuZF9yZXNpemVfb3AuY2NcbiAgICBmb3IgKGxldCBiID0gMDsgYiA8IG51bUJveGVzOyBiKyspIHtcbiAgICAgICAgY29uc3Qgc3RhcnRJbmQgPSBiICogNDtcbiAgICAgICAgY29uc3QgeTEgPSBib3hWYWxzW3N0YXJ0SW5kXTtcbiAgICAgICAgY29uc3QgeDEgPSBib3hWYWxzW3N0YXJ0SW5kICsgMV07XG4gICAgICAgIGNvbnN0IHkyID0gYm94VmFsc1tzdGFydEluZCArIDJdO1xuICAgICAgICBjb25zdCB4MiA9IGJveFZhbHNbc3RhcnRJbmQgKyAzXTtcbiAgICAgICAgY29uc3QgYkluZCA9IGJveEluZFZhbHNbYl07XG4gICAgICAgIGlmIChiSW5kID49IGJhdGNoKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBoZWlnaHRTY2FsZSA9IChjcm9wSGVpZ2h0ID4gMSkgPyAoeTIgLSB5MSkgKiAoaW1hZ2VIZWlnaHQgLSAxKSAvIChjcm9wSGVpZ2h0IC0gMSkgOiAwO1xuICAgICAgICBjb25zdCB3aWR0aFNjYWxlID0gKGNyb3BXaWR0aCA+IDEpID8gKHgyIC0geDEpICogKGltYWdlV2lkdGggLSAxKSAvIChjcm9wV2lkdGggLSAxKSA6IDA7XG4gICAgICAgIGZvciAobGV0IHkgPSAwOyB5IDwgY3JvcEhlaWdodDsgeSsrKSB7XG4gICAgICAgICAgICBjb25zdCB5SW5kID0gKGNyb3BIZWlnaHQgPiAxKSA/XG4gICAgICAgICAgICAgICAgeTEgKiAoaW1hZ2VIZWlnaHQgLSAxKSArIHkgKiAoaGVpZ2h0U2NhbGUpIDpcbiAgICAgICAgICAgICAgICAwLjUgKiAoeTEgKyB5MikgKiAoaW1hZ2VIZWlnaHQgLSAxKTtcbiAgICAgICAgICAgIGlmICh5SW5kIDwgMCB8fCB5SW5kID4gaW1hZ2VIZWlnaHQgLSAxKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCBjcm9wV2lkdGg7IHgrKykge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IG51bUNoYW5uZWxzOyBjKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZCA9IGMgKyB4ICogb3V0U3RyaWRlWzJdICsgeSAqIG91dFN0cmlkZVsxXSArIGIgKiBvdXRTdHJpZGVbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQudmFsdWVzW2luZF0gPSBleHRyYXBvbGF0aW9uVmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWV0aG9kID09PSAnYmlsaW5lYXInKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdG9wSW5kID0gTWF0aC5mbG9vcih5SW5kKTtcbiAgICAgICAgICAgICAgICBjb25zdCBib3R0b21JbmQgPSBNYXRoLmNlaWwoeUluZCk7XG4gICAgICAgICAgICAgICAgY29uc3QgeUxlcnAgPSB5SW5kIC0gdG9wSW5kO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgY3JvcFdpZHRoOyB4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeEluZCA9IChjcm9wV2lkdGggPiAxKSA/XG4gICAgICAgICAgICAgICAgICAgICAgICB4MSAqIChpbWFnZVdpZHRoIC0gMSkgKyB4ICogd2lkdGhTY2FsZSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAwLjUgKiAoeDEgKyB4MikgKiAoaW1hZ2VXaWR0aCAtIDEpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoeEluZCA8IDAgfHwgeEluZCA+IGltYWdlV2lkdGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IG51bUNoYW5uZWxzOyBjKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmQgPSBjICsgeCAqIG91dFN0cmlkZVsyXSArIHkgKiBvdXRTdHJpZGVbMV0gKyBiICogb3V0U3RyaWRlWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC52YWx1ZXNbaW5kXSA9IGV4dHJhcG9sYXRpb25WYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxlZnRJbmQgPSBNYXRoLmZsb29yKHhJbmQpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByaWdodEluZCA9IE1hdGguY2VpbCh4SW5kKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeExlcnAgPSB4SW5kIC0gbGVmdEluZDtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCBudW1DaGFubmVsczsgYysrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW5kID0gYyArIGxlZnRJbmQgKiBpblN0cmlkZVsyXSArIHRvcEluZCAqIGluU3RyaWRlWzFdICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSW5kICogaW5TdHJpZGVbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0b3BMZWZ0ID0gaW1hZ2VWYWxzW2luZF07XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmQgPSBjICsgcmlnaHRJbmQgKiBpblN0cmlkZVsyXSArIHRvcEluZCAqIGluU3RyaWRlWzFdICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSW5kICogaW5TdHJpZGVbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0b3BSaWdodCA9IGltYWdlVmFsc1tpbmRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5kID0gYyArIGxlZnRJbmQgKiBpblN0cmlkZVsyXSArIGJvdHRvbUluZCAqIGluU3RyaWRlWzFdICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSW5kICogaW5TdHJpZGVbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBib3R0b21MZWZ0ID0gaW1hZ2VWYWxzW2luZF07XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmQgPSBjICsgcmlnaHRJbmQgKiBpblN0cmlkZVsyXSArIGJvdHRvbUluZCAqIGluU3RyaWRlWzFdICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSW5kICogaW5TdHJpZGVbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBib3R0b21SaWdodCA9IGltYWdlVmFsc1tpbmRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdG9wID0gdG9wTGVmdCArICh0b3BSaWdodCAtIHRvcExlZnQpICogeExlcnA7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBib3R0b20gPSBib3R0b21MZWZ0ICsgKGJvdHRvbVJpZ2h0IC0gYm90dG9tTGVmdCkgKiB4TGVycDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZCA9IGMgKyB4ICogb3V0U3RyaWRlWzJdICsgeSAqIG91dFN0cmlkZVsxXSArIGIgKiBvdXRTdHJpZGVbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQudmFsdWVzW2luZF0gPSB0b3AgKyAoKGJvdHRvbSAtIHRvcCkgKiB5TGVycCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHsgLy8gbWV0aG9kID09IFwibmVhcmVzdFwiXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCBjcm9wV2lkdGg7ICsreCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB4SW5kID0gKGNyb3BXaWR0aCA+IDEpID9cbiAgICAgICAgICAgICAgICAgICAgICAgIHgxICogKGltYWdlV2lkdGggLSAxKSArIHggKiB3aWR0aFNjYWxlIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIDAuNSAqICh4MSArIHgyKSAqIChpbWFnZVdpZHRoIC0gMSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh4SW5kIDwgMCB8fCB4SW5kID4gaW1hZ2VXaWR0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgbnVtQ2hhbm5lbHM7IGMrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZCA9IGMgKyB4ICogb3V0U3RyaWRlWzJdICsgeSAqIG91dFN0cmlkZVsxXSArIGIgKiBvdXRTdHJpZGVbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnZhbHVlc1tpbmRdID0gZXh0cmFwb2xhdGlvblZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xvc2VzdFggPSBNYXRoLnJvdW5kKHhJbmQpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjbG9zZXN0WSA9IE1hdGgucm91bmQoeUluZCk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgbnVtQ2hhbm5lbHM7IGMrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5JbmQgPSBjICsgY2xvc2VzdFggKiBpblN0cmlkZVsyXSArIGNsb3Nlc3RZICogaW5TdHJpZGVbMV0gK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJJbmQgKiBpblN0cmlkZVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG91dEluZCA9IGMgKyB4ICogb3V0U3RyaWRlWzJdICsgeSAqIG91dFN0cmlkZVsxXSArIGIgKiBvdXRTdHJpZGVbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQudmFsdWVzW291dEluZF0gPSBpbWFnZVZhbHNbaW5JbmRdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dHB1dC5zaGFwZSwgb3V0cHV0LmR0eXBlLCBvdXRwdXQudmFsdWVzKTtcbn1cbmV4cG9ydCBjb25zdCBjcm9wQW5kUmVzaXplQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IENyb3BBbmRSZXNpemUsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGNyb3BBbmRSZXNpemVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Dcm9wQW5kUmVzaXplLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgQ3Vtc3VtLCB1cGNhc3RUeXBlLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5pbXBvcnQgeyB0cmFuc3Bvc2UgfSBmcm9tICcuL1RyYW5zcG9zZSc7XG5leHBvcnQgZnVuY3Rpb24gY3Vtc3VtKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBheGlzLCBleGNsdXNpdmUsIHJldmVyc2UgfSA9IGF0dHJzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoeCwgJ2N1bXN1bScpO1xuICAgIGNvbnN0IHBlcm11dGF0aW9uID0gYmFja2VuZF91dGlsLmdldEF4ZXNQZXJtdXRhdGlvbihbYXhpc10sIHguc2hhcGUubGVuZ3RoKTtcbiAgICBsZXQgJHggPSB4O1xuICAgIGlmIChwZXJtdXRhdGlvbiAhPSBudWxsKSB7XG4gICAgICAgICR4ID0gdHJhbnNwb3NlKHsgaW5wdXRzOiB7IHggfSwgYmFja2VuZCwgYXR0cnM6IHsgcGVybTogcGVybXV0YXRpb24gfSB9KTtcbiAgICB9XG4gICAgY29uc3QgcGVybXV0ZWRBeGlzID0gYmFja2VuZF91dGlsLmdldElubmVyTW9zdEF4ZXMoMSwgeC5zaGFwZS5sZW5ndGgpWzBdO1xuICAgIGlmIChwZXJtdXRlZEF4aXMgIT09ICR4LnNoYXBlLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBiYWNrZW5kLmN1bXN1bSBpbiBDUFUgZXhwZWN0cyBhbiBpbm5lci1tb3N0IGAgK1xuICAgICAgICAgICAgYGF4aXM9JHskeC5zaGFwZS5sZW5ndGggLSAxfSBidXQgZ290IGF4aXM9JHtwZXJtdXRlZEF4aXN9YCk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdER0eXBlID0gdXBjYXN0VHlwZSgkeC5kdHlwZSwgJ2ludDMyJyk7XG4gICAgY29uc3QgdmFscyA9IHV0aWwubWFrZVplcm9zVHlwZWRBcnJheSh1dGlsLnNpemVGcm9tU2hhcGUoJHguc2hhcGUpLCByZXN1bHREdHlwZSk7XG4gICAgY29uc3QgYVZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KCR4LmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IGZpbmFsRGltID0gJHguc2hhcGVbJHguc2hhcGUubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgaW5kZXhBZGp1c3RlciA9IHJldmVyc2UgP1xuICAgICAgICAoaSwgaikgPT4gaSArIGZpbmFsRGltIC0gaiAtIDEgOlxuICAgICAgICAoaSwgaikgPT4gaSArIGo7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhVmFscy5sZW5ndGg7IGkgKz0gZmluYWxEaW0pIHtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBmaW5hbERpbTsgaisrKSB7XG4gICAgICAgICAgICBjb25zdCBpZHggPSBpbmRleEFkanVzdGVyKGksIGopO1xuICAgICAgICAgICAgaWYgKGogPT09IDApIHtcbiAgICAgICAgICAgICAgICB2YWxzW2lkeF0gPSBleGNsdXNpdmUgPyAwIDogYVZhbHNbaWR4XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZJZHggPSBpbmRleEFkanVzdGVyKGksIGogLSAxKTtcbiAgICAgICAgICAgICAgICB2YWxzW2lkeF0gPSBleGNsdXNpdmUgPyBhVmFsc1twcmV2SWR4XSArIHZhbHNbcHJldklkeF0gOlxuICAgICAgICAgICAgICAgICAgICBhVmFsc1tpZHhdICsgdmFsc1twcmV2SWR4XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKCR4LnNoYXBlLCByZXN1bHREdHlwZSwgdmFscyk7XG4gICAgaWYgKHBlcm11dGF0aW9uICE9IG51bGwpIHtcbiAgICAgICAgY29uc3QgcmV2ZXJzZVBlcm11dGF0aW9uID0gYmFja2VuZF91dGlsLmdldFVuZG9BeGVzUGVybXV0YXRpb24ocGVybXV0YXRpb24pO1xuICAgICAgICBjb25zdCByZXZlcnNlVHJhbnNwb3NlZFJlc3VsdCA9IHRyYW5zcG9zZSh7IGlucHV0czogeyB4OiByZXN1bHQgfSwgYmFja2VuZCwgYXR0cnM6IHsgcGVybTogcmV2ZXJzZVBlcm11dGF0aW9uIH0gfSk7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVzdWx0KTtcbiAgICAgICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbygkeCk7XG4gICAgICAgIHJldHVybiByZXZlcnNlVHJhbnNwb3NlZFJlc3VsdDtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydCBjb25zdCBjdW1zdW1Db25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQ3Vtc3VtLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBjdW1zdW1cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DdW1zdW0uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRGVuc2VCaW5jb3VudCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBiaW5jb3VudEltcGwsIGJpbmNvdW50UmVkdWNlSW1wbCB9IGZyb20gJy4vQmluY291bnRfaW1wbCc7XG5leHBvcnQgZnVuY3Rpb24gZGVuc2VCaW5jb3VudChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCwgd2VpZ2h0cyB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgc2l6ZSwgYmluYXJ5T3V0cHV0IH0gPSBhdHRycztcbiAgICBpZiAoeC5zaGFwZS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgY29uc3QgeFZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXM7XG4gICAgICAgIGNvbnN0IHdlaWdodHNWYWxzID0gYmFja2VuZC5kYXRhLmdldCh3ZWlnaHRzLmRhdGFJZCkudmFsdWVzO1xuICAgICAgICBjb25zdCBvdXRWYWxzID0gYmluY291bnRJbXBsKHhWYWxzLCB3ZWlnaHRzVmFscywgd2VpZ2h0cy5kdHlwZSwgd2VpZ2h0cy5zaGFwZSwgc2l6ZSk7XG4gICAgICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtzaXplXSwgd2VpZ2h0cy5kdHlwZSwgb3V0VmFscyk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHguc2hhcGUubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIGNvbnN0IHhCdWYgPSBiYWNrZW5kLmJ1ZmZlclN5bmMoeCk7XG4gICAgICAgIGNvbnN0IHdlaWdodHNCdWYgPSBiYWNrZW5kLmJ1ZmZlclN5bmMod2VpZ2h0cyk7XG4gICAgICAgIGNvbnN0IG91dEJ1ZiA9IGJpbmNvdW50UmVkdWNlSW1wbCh4QnVmLCB3ZWlnaHRzQnVmLCBzaXplLCBiaW5hcnlPdXRwdXQpO1xuICAgICAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRCdWYuc2hhcGUsIHdlaWdodHMuZHR5cGUsIG91dEJ1Zi52YWx1ZXMpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGluIGRlbnNlQmluY291bnQ6IGlucHV0IG11c3QgYmUgYXQgbW9zdCByYW5rIDIsIGJ1dCBnb3QgcmFua2AgK1xuICAgICAgICBgJHt4LnNoYXBlLmxlbmd0aH0uYCk7XG59XG5leHBvcnQgY29uc3QgZGVuc2VCaW5jb3VudENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBEZW5zZUJpbmNvdW50LFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBkZW5zZUJpbmNvdW50XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RGVuc2VCaW5jb3VudC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBEZXB0aFRvU3BhY2UsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuZXhwb3J0IGZ1bmN0aW9uIGRlcHRoVG9TcGFjZShhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgYmxvY2tTaXplLCBkYXRhRm9ybWF0IH0gPSBhdHRycztcbiAgICB1dGlsLmFzc2VydChkYXRhRm9ybWF0ID09PSAnTkhXQycsICgpID0+IGBPbmx5IE5IV0MgZGF0YUZvcm1hdCBzdXBwb3J0ZWQgb24gQ1BVIGZvciBkZXB0aFRvU3BhY2UuIEdvdCAke2RhdGFGb3JtYXR9YCk7XG4gICAgdXRpbC5hc3NlcnQoYmxvY2tTaXplID4gMSwgKCkgPT4gYGJsb2NrU2l6ZSBzaG91bGQgYmUgPiAxIGZvciBkZXB0aFRvU3BhY2UsIGJ1dCB3YXM6ICR7YmxvY2tTaXplfWApO1xuICAgIGNvbnN0IGJhdGNoU2l6ZSA9IHguc2hhcGVbMF07XG4gICAgY29uc3QgaW5wdXRIZWlnaHQgPSB4LnNoYXBlWzFdO1xuICAgIGNvbnN0IGlucHV0V2lkdGggPSB4LnNoYXBlWzJdO1xuICAgIGNvbnN0IGlucHV0RGVwdGggPSB4LnNoYXBlWzNdO1xuICAgIGNvbnN0IG91dHB1dEhlaWdodCA9IGlucHV0SGVpZ2h0ICogYmxvY2tTaXplO1xuICAgIGNvbnN0IG91dHB1dFdpZHRoID0gaW5wdXRXaWR0aCAqIGJsb2NrU2l6ZTtcbiAgICBjb25zdCBvdXRwdXREZXB0aCA9IGlucHV0RGVwdGggLyAoYmxvY2tTaXplICogYmxvY2tTaXplKTtcbiAgICBjb25zdCB4VmFsdWVzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBGbG9hdDMyQXJyYXkoYmF0Y2hTaXplICogb3V0cHV0SGVpZ2h0ICogb3V0cHV0V2lkdGggKiBvdXRwdXREZXB0aCk7XG4gICAgbGV0IG91dHB1dElkeCA9IDA7XG4gICAgZm9yIChsZXQgYiA9IDA7IGIgPCBiYXRjaFNpemU7ICsrYikge1xuICAgICAgICBmb3IgKGxldCBoID0gMDsgaCA8IG91dHB1dEhlaWdodDsgKytoKSB7XG4gICAgICAgICAgICBjb25zdCBpbkggPSBNYXRoLmZsb29yKGggLyBibG9ja1NpemUpO1xuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0SCA9IChoICUgYmxvY2tTaXplKTtcbiAgICAgICAgICAgIGZvciAobGV0IHcgPSAwOyB3IDwgb3V0cHV0V2lkdGg7ICsrdykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluVyA9IE1hdGguZmxvb3IodyAvIGJsb2NrU2l6ZSk7XG4gICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0VyA9ICh3ICUgYmxvY2tTaXplKTtcbiAgICAgICAgICAgICAgICBjb25zdCBvZmZzZXREID0gKG9mZnNldEggKiBibG9ja1NpemUgKyBvZmZzZXRXKSAqIG91dHB1dERlcHRoO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGQgPSAwOyBkIDwgb3V0cHV0RGVwdGg7ICsrZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbkQgPSBkICsgb2Zmc2V0RDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5wdXRJZHggPSBpbkQgKyBpbnB1dERlcHRoICogKGluVyArIGlucHV0V2lkdGggKiAoaW5IICsgaW5wdXRIZWlnaHQgKiBiKSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtvdXRwdXRJZHgrK10gPSB4VmFsdWVzW2lucHV0SWR4XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oW2JhdGNoU2l6ZSwgb3V0cHV0SGVpZ2h0LCBvdXRwdXRXaWR0aCwgb3V0cHV0RGVwdGhdLCB4LmR0eXBlLCByZXN1bHQpO1xufVxuZXhwb3J0IGNvbnN0IGRlcHRoVG9TcGFjZUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBEZXB0aFRvU3BhY2UsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGRlcHRoVG9TcGFjZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURlcHRoVG9TcGFjZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIERlcHRod2lzZUNvbnYyZE5hdGl2ZSwgVGVuc29yQnVmZmVyLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5leHBvcnQgZnVuY3Rpb24gZGVwdGh3aXNlQ29udjJkTmF0aXZlKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4LCBmaWx0ZXIgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IHN0cmlkZXMsIHBhZCwgZGlsYXRpb25zLCBkaW1Sb3VuZGluZ01vZGUgfSA9IGF0dHJzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoW3gsIGZpbHRlcl0sICdkZXB0aHdpc2VDb252MkROYXRpdmUnKTtcbiAgICBjb25zdCB4U3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoeC5zaGFwZSk7XG4gICAgY29uc3QgZmlsdGVyU3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoZmlsdGVyLnNoYXBlKTtcbiAgICBsZXQgJGRpbGF0aW9ucyA9IGRpbGF0aW9ucztcbiAgICBpZiAoJGRpbGF0aW9ucyA9PSBudWxsKSB7XG4gICAgICAgICRkaWxhdGlvbnMgPSBbMSwgMV07XG4gICAgfVxuICAgIHV0aWwuYXNzZXJ0KGJhY2tlbmRfdXRpbC5laXRoZXJTdHJpZGVzT3JEaWxhdGlvbnNBcmVPbmUoc3RyaWRlcywgJGRpbGF0aW9ucyksICgpID0+ICdFcnJvciBpbiBkZXB0aHdpc2VDb252MmQ6IEVpdGhlciBzdHJpZGVzIG9yIGRpbGF0aW9ucyBtdXN0IGJlICcgK1xuICAgICAgICBgMS4gR290IHN0cmlkZXMgJHtzdHJpZGVzfSBhbmQgZGlsYXRpb25zICckeyRkaWxhdGlvbnN9J2ApO1xuICAgIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVDb252MkRJbmZvKHguc2hhcGUsIGZpbHRlci5zaGFwZSwgc3RyaWRlcywgJGRpbGF0aW9ucywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIHRydWUgLyogZGVwdGh3aXNlICovKTtcbiAgICBjb25zdCB7IGZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsIGRpbGF0aW9uSGVpZ2h0LCBkaWxhdGlvbldpZHRoLCBwYWRJbmZvIH0gPSBjb252SW5mbztcbiAgICBjb25zdCBwYWRMZWZ0ID0gcGFkSW5mby5sZWZ0O1xuICAgIGNvbnN0IHBhZFRvcCA9IHBhZEluZm8udG9wO1xuICAgIGNvbnN0IGNoTXVsID0gY29udkluZm8ub3V0Q2hhbm5lbHMgLyBjb252SW5mby5pbkNoYW5uZWxzO1xuICAgIGNvbnN0IHkgPSBuZXcgVGVuc29yQnVmZmVyKGNvbnZJbmZvLm91dFNoYXBlLCB4LmR0eXBlKTtcbiAgICBjb25zdCB4VmFscyA9IGJhY2tlbmQuZGF0YS5nZXQoeC5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCB3VmFscyA9IGJhY2tlbmQuZGF0YS5nZXQoZmlsdGVyLmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IHlWYWxzID0geS52YWx1ZXM7XG4gICAgZm9yIChsZXQgYiA9IDA7IGIgPCBjb252SW5mby5iYXRjaFNpemU7ICsrYikge1xuICAgICAgICBjb25zdCB4T2Zmc2V0MSA9IGIgKiB4U3RyaWRlc1swXTtcbiAgICAgICAgY29uc3QgeU9mZnNldDEgPSBiICogeS5zdHJpZGVzWzBdO1xuICAgICAgICBmb3IgKGxldCB5UiA9IDA7IHlSIDwgY29udkluZm8ub3V0SGVpZ2h0OyArK3lSKSB7XG4gICAgICAgICAgICBjb25zdCB5T2Zmc2V0MiA9IHlPZmZzZXQxICsgeVIgKiB5LnN0cmlkZXNbMV07XG4gICAgICAgICAgICBjb25zdCB4UkNvcm5lciA9IHlSICogY29udkluZm8uc3RyaWRlSGVpZ2h0IC0gcGFkVG9wO1xuICAgICAgICAgICAgZm9yIChsZXQgd1IgPSAwOyB3UiA8IGZpbHRlckhlaWdodDsgKyt3Uikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHhSID0geFJDb3JuZXIgKyB3UiAqIGRpbGF0aW9uSGVpZ2h0O1xuICAgICAgICAgICAgICAgIGlmICh4UiA8IDAgfHwgeFIgPj0gY29udkluZm8uaW5IZWlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHdPZmZzZXQxID0gd1IgKiBmaWx0ZXJTdHJpZGVzWzBdO1xuICAgICAgICAgICAgICAgIGNvbnN0IHhPZmZzZXQyID0geE9mZnNldDEgKyB4UiAqIHhTdHJpZGVzWzFdO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHlDID0gMDsgeUMgPCBjb252SW5mby5vdXRXaWR0aDsgKyt5Qykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB5T2Zmc2V0MyA9IHlPZmZzZXQyICsgeUMgKiB5LnN0cmlkZXNbMl07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHhDQ29ybmVyID0geUMgKiBjb252SW5mby5zdHJpZGVXaWR0aCAtIHBhZExlZnQ7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHdDID0gMDsgd0MgPCBmaWx0ZXJXaWR0aDsgKyt3Qykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeEMgPSB4Q0Nvcm5lciArIHdDICogZGlsYXRpb25XaWR0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4QyA8IDAgfHwgeEMgPj0gY29udkluZm8uaW5XaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd09mZnNldDIgPSB3T2Zmc2V0MSArIHdDICogZmlsdGVyU3RyaWRlc1sxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhPZmZzZXQzID0geE9mZnNldDIgKyB4QyAqIGNvbnZJbmZvLmluQ2hhbm5lbHM7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgeU9mZnNldDQgPSB5T2Zmc2V0MztcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB3T2Zmc2V0MyA9IHdPZmZzZXQyO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgZDEgPSAwOyBkMSA8IGNvbnZJbmZvLmluQ2hhbm5lbHM7ICsrZDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4VmFsID0geFZhbHNbeE9mZnNldDMgKyBkMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgcSA9IDA7IHEgPCBjaE11bDsgKytxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlWYWxzW3lPZmZzZXQ0ICsgcV0gKz0geFZhbCAqIHdWYWxzW3dPZmZzZXQzICsgcV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlPZmZzZXQ0ICs9IGNoTXVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdPZmZzZXQzICs9IGNoTXVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHkuc2hhcGUsIHkuZHR5cGUsIHkudmFsdWVzKTtcbn1cbmV4cG9ydCBjb25zdCBkZXB0aHdpc2VDb252MmROYXRpdmVDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogRGVwdGh3aXNlQ29udjJkTmF0aXZlLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBkZXB0aHdpc2VDb252MmROYXRpdmVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1EZXB0aHdpc2VDb252MmROYXRpdmUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlciwgVGVuc29yQnVmZmVyIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5leHBvcnQgZnVuY3Rpb24gZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXIoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHgsIGR5IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBzdHJpZGVzLCBkaWxhdGlvbnMsIHBhZCwgZGltUm91bmRpbmdNb2RlLCBmaWx0ZXJTaGFwZSB9ID0gYXR0cnM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleChbeCwgZHldLCAnZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXInKTtcbiAgICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlQ29udjJESW5mbyh4LnNoYXBlLCBmaWx0ZXJTaGFwZSwgc3RyaWRlcywgZGlsYXRpb25zLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSwgdHJ1ZSAvKiBkZXB0aHdpc2UgKi8pO1xuICAgIGNvbnN0IHsgc3RyaWRlSGVpZ2h0LCBzdHJpZGVXaWR0aCwgZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCB9ID0gY29udkluZm87XG4gICAgY29uc3QgZFcgPSBuZXcgVGVuc29yQnVmZmVyKGNvbnZJbmZvLmZpbHRlclNoYXBlLCAnZmxvYXQzMicpO1xuICAgIGNvbnN0IGxlZnRQYWQgPSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG4gICAgY29uc3QgdG9wUGFkID0gY29udkluZm8ucGFkSW5mby50b3A7XG4gICAgY29uc3QgY2hNdWwgPSBjb252SW5mby5vdXRDaGFubmVscyAvIGNvbnZJbmZvLmluQ2hhbm5lbHM7XG4gICAgY29uc3QgeFZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgeEJ1ZiA9IG5ldyBUZW5zb3JCdWZmZXIoeC5zaGFwZSwgeC5kdHlwZSwgeFZhbHMpO1xuICAgIGNvbnN0IGR5VmFscyA9IGJhY2tlbmQuZGF0YS5nZXQoZHkuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgZHlCdWYgPSBuZXcgVGVuc29yQnVmZmVyKGR5LnNoYXBlLCBkeS5kdHlwZSwgZHlWYWxzKTtcbiAgICBmb3IgKGxldCB3UiA9IDA7IHdSIDwgZmlsdGVySGVpZ2h0OyArK3dSKSB7XG4gICAgICAgIGNvbnN0IHlSTWluID0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKCh0b3BQYWQgLSB3UikgLyBzdHJpZGVIZWlnaHQpKTtcbiAgICAgICAgY29uc3QgeVJNYXggPSBNYXRoLm1pbihjb252SW5mby5vdXRIZWlnaHQsIChjb252SW5mby5pbkhlaWdodCArIHRvcFBhZCAtIHdSKSAvIHN0cmlkZUhlaWdodCk7XG4gICAgICAgIGZvciAobGV0IHdDID0gMDsgd0MgPCBmaWx0ZXJXaWR0aDsgKyt3Qykge1xuICAgICAgICAgICAgY29uc3QgeUNNaW4gPSBNYXRoLm1heCgwLCBNYXRoLmNlaWwoKGxlZnRQYWQgLSB3QykgLyBzdHJpZGVXaWR0aCkpO1xuICAgICAgICAgICAgY29uc3QgeUNNYXggPSBNYXRoLm1pbihjb252SW5mby5vdXRXaWR0aCwgKGNvbnZJbmZvLmluV2lkdGggKyBsZWZ0UGFkIC0gd0MpIC8gc3RyaWRlV2lkdGgpO1xuICAgICAgICAgICAgZm9yIChsZXQgZDIgPSAwOyBkMiA8IGNvbnZJbmZvLm91dENoYW5uZWxzOyArK2QyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZDEgPSBNYXRoLnRydW5jKGQyIC8gY2hNdWwpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRtID0gZDIgJSBjaE11bDtcbiAgICAgICAgICAgICAgICBsZXQgZG90UHJvZCA9IDA7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgYiA9IDA7IGIgPCBjb252SW5mby5iYXRjaFNpemU7ICsrYikge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB5UiA9IHlSTWluOyB5UiA8IHlSTWF4OyArK3lSKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4UiA9IHdSICsgeVIgKiBzdHJpZGVIZWlnaHQgLSB0b3BQYWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB5QyA9IHlDTWluOyB5QyA8IHlDTWF4OyArK3lDKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeEMgPSB3QyArIHlDICogc3RyaWRlV2lkdGggLSBsZWZ0UGFkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdFByb2QgKz0geEJ1Zi5nZXQoYiwgeFIsIHhDLCBkMSkgKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeUJ1Zi5nZXQoYiwgeVIsIHlDLCBkMik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZFcuc2V0KGRvdFByb2QsIHdSLCB3QywgZDEsIGRtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhkVy5zaGFwZSwgZFcuZHR5cGUsIGRXLnZhbHVlcyk7XG59XG5leHBvcnQgY29uc3QgZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXJDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXIsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0LCBUZW5zb3JCdWZmZXIsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmV4cG9ydCBmdW5jdGlvbiBkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0KGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBkeSwgZmlsdGVyIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBzdHJpZGVzLCBkaWxhdGlvbnMsIHBhZCwgZGltUm91bmRpbmdNb2RlLCBpbnB1dFNoYXBlIH0gPSBhdHRycztcbiAgICBhc3NlcnROb3RDb21wbGV4KFtkeSwgZmlsdGVyXSwgJ2RlcHRod2lzZUNvbnYyRE5hdGl2ZUJhY2twcm9wSW5wdXQnKTtcbiAgICBjb25zdCBkeVN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKGR5LnNoYXBlKTtcbiAgICBjb25zdCBmaWx0ZXJTdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyhmaWx0ZXIuc2hhcGUpO1xuICAgIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVDb252MkRJbmZvKGlucHV0U2hhcGUsIGZpbHRlci5zaGFwZSwgc3RyaWRlcywgZGlsYXRpb25zLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSwgdHJ1ZSAvKiBkZXB0aHdpc2UgKi8pO1xuICAgIGNvbnN0IGR4ID0gbmV3IFRlbnNvckJ1ZmZlcihjb252SW5mby5pblNoYXBlLCAnZmxvYXQzMicpO1xuICAgIGNvbnN0IGR4VmFsdWVzID0gZHgudmFsdWVzO1xuICAgIGNvbnN0IFtkeFMwLCBkeFMxLCBkeFMyXSA9IGR4LnN0cmlkZXM7XG4gICAgY29uc3QgZHlWYWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KGR5LmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IFtkeVMwLCBkeVMxLCBkeVMyXSA9IGR5U3RyaWRlcztcbiAgICBjb25zdCBmbHRWYWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KGZpbHRlci5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCBbZmx0UzAsIGZsdFMxLCBmbHRTMl0gPSBmaWx0ZXJTdHJpZGVzO1xuICAgIGNvbnN0IHsgYmF0Y2hTaXplLCBmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoLCBpbkNoYW5uZWxzLCBpbkhlaWdodCwgaW5XaWR0aCwgb3V0Q2hhbm5lbHMsIG91dEhlaWdodCwgb3V0V2lkdGgsIHN0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGggfSA9IGNvbnZJbmZvO1xuICAgIGNvbnN0IHRvcFBhZCA9IGZpbHRlckhlaWdodCAtIDEgLSBjb252SW5mby5wYWRJbmZvLnRvcDtcbiAgICBjb25zdCBsZWZ0UGFkID0gZmlsdGVyV2lkdGggLSAxIC0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuICAgIGNvbnN0IGNoTXVsID0gb3V0Q2hhbm5lbHMgLyBpbkNoYW5uZWxzO1xuICAgIGZvciAobGV0IGIgPSAwOyBiIDwgYmF0Y2hTaXplOyArK2IpIHtcbiAgICAgICAgZm9yIChsZXQgZDEgPSAwOyBkMSA8IGluQ2hhbm5lbHM7ICsrZDEpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHhSID0gMDsgeFIgPCBpbkhlaWdodDsgKyt4Uikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHhSQ29ybmVyID0geFIgLSB0b3BQYWQ7XG4gICAgICAgICAgICAgICAgY29uc3QgeFJNaW4gPSBNYXRoLm1heCgwLCBNYXRoLmNlaWwoeFJDb3JuZXIgLyBzdHJpZGVIZWlnaHQpKTtcbiAgICAgICAgICAgICAgICBjb25zdCB5Uk1heCA9IE1hdGgubWluKG91dEhlaWdodCwgKGZpbHRlckhlaWdodCArIHhSQ29ybmVyKSAvIHN0cmlkZUhlaWdodCk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgeEMgPSAwOyB4QyA8IGluV2lkdGg7ICsreEMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeENDb3JuZXIgPSB4QyAtIGxlZnRQYWQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHhDTWluID0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKHhDQ29ybmVyIC8gc3RyaWRlV2lkdGgpKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeUNNYXggPSBNYXRoLm1pbihvdXRXaWR0aCwgKGZpbHRlcldpZHRoICsgeENDb3JuZXIpIC8gc3RyaWRlV2lkdGgpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZG90UHJvZCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHlSID0geFJNaW47IHlSIDwgeVJNYXg7ICsreVIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdSID0geVIgKiBzdHJpZGVIZWlnaHQgLSB4UkNvcm5lcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHlDID0geENNaW47IHlDIDwgeUNNYXg7ICsreUMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3QyA9IHlDICogc3RyaWRlV2lkdGggLSB4Q0Nvcm5lcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkeU9mZnNldCA9IGR5UzAgKiBiICsgZHlTMSAqIHlSICsgZHlTMiAqIHlDO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsdE9mZnNldCA9IGZsdFMwICogKGZpbHRlckhlaWdodCAtIDEgLSB3UikgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbHRTMSAqIChmaWx0ZXJXaWR0aCAtIDEgLSB3QykgKyBmbHRTMiAqIGQxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGRtID0gMDsgZG0gPCBjaE11bDsgKytkbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkMiA9IGQxICogY2hNdWwgKyBkbTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGl4ZWwgPSBkeVZhbHVlc1tkeU9mZnNldCArIGQyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2VpZ2h0ID0gZmx0VmFsdWVzW2ZsdE9mZnNldCArIGRtXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG90UHJvZCArPSBwaXhlbCAqIHdlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZHhWYWx1ZXNbZHhTMCAqIGIgKyBkeFMxICogeFIgKyBkeFMyICogeEMgKyBkMV0gPSBkb3RQcm9kO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhkeC5zaGFwZSwgZHguZHR5cGUsIGR4LnZhbHVlcyk7XG59XG5leHBvcnQgY29uc3QgZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0LFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBidWZmZXIsIERpYWcsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuZXhwb3J0IGZ1bmN0aW9uIGRpYWcoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHhTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHguc2hhcGUpO1xuICAgIGNvbnN0IHhWYWxzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IG91dEJ1ZiA9IGJ1ZmZlcihbeFNpemUsIHhTaXplXSwgeC5kdHlwZSk7XG4gICAgY29uc3QgdmFscyA9IG91dEJ1Zi52YWx1ZXM7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB4VmFscy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YWxzW2kgKiB4U2l6ZSArIGldID0geFZhbHNbaV07XG4gICAgfVxuICAgIGNvbnN0IG91dFNoYXBlID0gWy4uLnguc2hhcGUsIC4uLnguc2hhcGVdO1xuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dFNoYXBlLCBvdXRCdWYuZHR5cGUsIG91dEJ1Zi52YWx1ZXMpO1xufVxuZXhwb3J0IGNvbnN0IGRpYWdDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogRGlhZyxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogZGlhZ1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURpYWcuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBEaWxhdGlvbjJELCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmV4cG9ydCBjb25zdCBkaWxhdGlvbjJkQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IERpbGF0aW9uMkQsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6ICh7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSkgPT4ge1xuICAgICAgICBjb25zdCB7IHgsIGZpbHRlciB9ID0gaW5wdXRzO1xuICAgICAgICBjb25zdCB7IHN0cmlkZXMsIHBhZCwgZGlsYXRpb25zIH0gPSBhdHRycztcbiAgICAgICAgY29uc3QgY3B1QmFja2VuZCA9IGJhY2tlbmQ7XG4gICAgICAgIGNvbnN0IHhWYWxzID0gY3B1QmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzO1xuICAgICAgICBjb25zdCB4UmFuayA9IHguc2hhcGUubGVuZ3RoO1xuICAgICAgICBjb25zdCBmaWx0ZXJWYWxzID0gY3B1QmFja2VuZC5kYXRhLmdldChmaWx0ZXIuZGF0YUlkKS52YWx1ZXM7XG4gICAgICAgIGNvbnN0IGZpbHRlclJhbmsgPSBmaWx0ZXIuc2hhcGUubGVuZ3RoO1xuICAgICAgICBjb25zdCB7IGJhdGNoU2l6ZSwgaW5IZWlnaHQsIGluV2lkdGgsIGluQ2hhbm5lbHMsIG91dEhlaWdodCwgb3V0V2lkdGgsIHBhZEluZm8sIHN0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGgsIGZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsIGRpbGF0aW9uSGVpZ2h0LCBkaWxhdGlvbldpZHRoLCBvdXRTaGFwZSB9ID0gYmFja2VuZF91dGlsLmNvbXB1dGVEaWxhdGlvbjJESW5mbyh4LnNoYXBlLCBmaWx0ZXIuc2hhcGUsIHN0cmlkZXMsIHBhZCwgJ05IV0MnIC8qIGRhdGFGb3JtYXQgKi8sIGRpbGF0aW9ucyk7XG4gICAgICAgIGNvbnN0IG91dFNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUob3V0U2hhcGUpO1xuICAgICAgICBjb25zdCBvdXRSYW5rID0gb3V0U2hhcGUubGVuZ3RoO1xuICAgICAgICBjb25zdCBvdXRwdXRWYWxzID0gdXRpbC5nZXRBcnJheUZyb21EVHlwZSh4LmR0eXBlLCBvdXRTaXplKTtcbiAgICAgICAgLy8gVXBzYW1wbGluZyB0aGUgaW5wdXQgYnkgZmlsbCBpbiBgZGlsYXRpb24gc2l6ZSAtIDFgIHZhbHVlcyBiZXR3ZWVuIGVhY2hcbiAgICAgICAgLy8gaW5wdXQgdmFsdWUuXG4gICAgICAgIC8vIFRoaXMgaW1wbGVtZW50YXRpb24gZm9sbG93cyB0aGUgVEYgYysrIGltcGxlbWVudGF0aW9uOlxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3JmbG93L2Jsb2IvZDlhM2E4NDllZGMxOThlOTAxNzJiYzU4ZWIyOTNkZTQ1N2Y5ZDk4Ni90ZW5zb3JmbG93L2NvcmUva2VybmVscy9kaWxhdGlvbl9vcHMuY2NcbiAgICAgICAgZm9yIChsZXQgYiA9IDA7IGIgPCBiYXRjaFNpemU7ICsrYikge1xuICAgICAgICAgICAgZm9yIChsZXQgaE91dCA9IDA7IGhPdXQgPCBvdXRIZWlnaHQ7ICsraE91dCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhCZWcgPSBoT3V0ICogc3RyaWRlSGVpZ2h0IC0gcGFkSW5mby50b3A7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgd091dCA9IDA7IHdPdXQgPCBvdXRXaWR0aDsgKyt3T3V0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHdCZWcgPSB3T3V0ICogc3RyaWRlV2lkdGggLSBwYWRJbmZvLmxlZnQ7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGQgPSAwOyBkIDwgaW5DaGFubmVsczsgKytkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY3VyVmFsID0gTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVI7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBoID0gMDsgaCA8IGZpbHRlckhlaWdodDsgKytoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaEluID0gaEJlZyArIGggKiBkaWxhdGlvbkhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaEluID49IDAgJiYgaEluIDwgaW5IZWlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgdyA9IDA7IHcgPCBmaWx0ZXJXaWR0aDsgKyt3KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3SW4gPSB3QmVnICsgdyAqIGRpbGF0aW9uV2lkdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod0luID49IDAgJiYgd0luIDwgaW5XaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhJbmRleCA9IHV0aWwubG9jVG9JbmRleChbYiwgaEluLCB3SW4sIGRdLCB4UmFuaywgdXRpbC5jb21wdXRlU3RyaWRlcyh4LnNoYXBlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsdGVySW5kZXggPSB1dGlsLmxvY1RvSW5kZXgoW2gsIHcsIGRdLCBmaWx0ZXJSYW5rLCB1dGlsLmNvbXB1dGVTdHJpZGVzKGZpbHRlci5zaGFwZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IHhWYWxzW3hJbmRleF0gKyBmaWx0ZXJWYWxzW2ZpbHRlckluZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsID4gY3VyVmFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1clZhbCA9IHZhbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvdXRwdXRJbmRleCA9IHV0aWwubG9jVG9JbmRleChbYiwgaE91dCwgd091dCwgZF0sIG91dFJhbmssIHV0aWwuY29tcHV0ZVN0cmlkZXMob3V0U2hhcGUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFZhbHNbb3V0cHV0SW5kZXhdID0gY3VyVmFsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRhdGFJZCA9IGNwdUJhY2tlbmQud3JpdGUodXRpbC50b1R5cGVkQXJyYXkob3V0cHV0VmFscywgeC5kdHlwZSksIG91dFNoYXBlLCB4LmR0eXBlKTtcbiAgICAgICAgcmV0dXJuIHsgZGF0YUlkLCBzaGFwZTogb3V0U2hhcGUsIGR0eXBlOiB4LmR0eXBlIH07XG4gICAgfVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURpbGF0aW9uMkQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBEaWxhdGlvbjJEQmFja3Byb3BGaWx0ZXIsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuZXhwb3J0IGNvbnN0IGRpbGF0aW9uMmRCYWNrcHJvcEZpbHRlckNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBEaWxhdGlvbjJEQmFja3Byb3BGaWx0ZXIsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6ICh7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSkgPT4ge1xuICAgICAgICBjb25zdCB7IHgsIGZpbHRlciwgZHkgfSA9IGlucHV0cztcbiAgICAgICAgY29uc3QgeyBzdHJpZGVzLCBwYWQsIGRpbGF0aW9ucyB9ID0gYXR0cnM7XG4gICAgICAgIGNvbnN0IGNwdUJhY2tlbmQgPSBiYWNrZW5kO1xuICAgICAgICBjb25zdCAkeCA9IHV0aWwudG9OZXN0ZWRBcnJheSh4LnNoYXBlLCBjcHVCYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXMpO1xuICAgICAgICBjb25zdCAkZmlsdGVyID0gdXRpbC50b05lc3RlZEFycmF5KGZpbHRlci5zaGFwZSwgY3B1QmFja2VuZC5kYXRhLmdldChmaWx0ZXIuZGF0YUlkKS52YWx1ZXMpO1xuICAgICAgICBjb25zdCB7IGJhdGNoU2l6ZSwgaW5IZWlnaHQsIGluV2lkdGgsIGluQ2hhbm5lbHMsIG91dEhlaWdodCwgb3V0V2lkdGgsIHBhZEluZm8sIHN0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGgsIGZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsIGRpbGF0aW9uSGVpZ2h0LCBkaWxhdGlvbldpZHRoLCBvdXRTaGFwZSB9ID0gYmFja2VuZF91dGlsLmNvbXB1dGVEaWxhdGlvbjJESW5mbyh4LnNoYXBlLCBmaWx0ZXIuc2hhcGUsIHN0cmlkZXMsIHBhZCwgJ05IV0MnIC8qIGRhdGFGb3JtYXQgKi8sIGRpbGF0aW9ucyk7XG4gICAgICAgIHV0aWwuYXNzZXJ0KGR5LnJhbmsgPT09IG91dFNoYXBlLmxlbmd0aCwgKCkgPT4gYEVycm9yIGluICR7RGlsYXRpb24yREJhY2twcm9wRmlsdGVyfSwgZHkgYCArXG4gICAgICAgICAgICBgbXVzdCBoYXZlIHRoZSBzYW1lIHJhbmsgYXMgb3V0cHV0ICR7b3V0U2hhcGUubGVuZ3RofSwgYnV0IGdvdCBgICtcbiAgICAgICAgICAgIGAke2R5LnJhbmt9YCk7XG4gICAgICAgIGNvbnN0ICRkeSA9IHV0aWwudG9OZXN0ZWRBcnJheShvdXRTaGFwZSwgY3B1QmFja2VuZC5kYXRhLmdldChkeS5kYXRhSWQpLnZhbHVlcyk7XG4gICAgICAgIC8vIFRoZSBjb21wdXRlZCBmaWx0ZXIgZ3JhZGllbnRzIGhhcyB0aGUgc2FtZSBkaW1lbnNpb25zIGFzIHRoZSBmaWx0ZXI6XG4gICAgICAgIC8vIFtmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoLCBkZXB0aF1cbiAgICAgICAgY29uc3QgZ3JhZGllbnRzID0gdXRpbC5tYWtlWmVyb3NOZXN0ZWRUeXBlZEFycmF5KGZpbHRlci5zaGFwZSwgZmlsdGVyLmR0eXBlKTtcbiAgICAgICAgLy8gSW4gdGhlIGNhc2Ugb2YgbXVsdGlwbGUgYXJnbWF4IGJyYW5jaGVzLCB3ZSBvbmx5IGJhY2stcHJvcGFnYXRlIGFsb25nIHRoZVxuICAgICAgICAvLyBsYXN0IGJyYW5jaCwgaS5lLiwgdGhlIG9uZSB3aXRoIGxhcmdlc3QgdmFsdWUgb2YgYGggKiBmaWx0ZXJfY29scyArIHdgLFxuICAgICAgICAvLyBzaW1pbGFybHkgdG8gdGhlIG1heC1wb29saW5nIGJhY2t3YXJkIHJvdXRpbmVzLlxuICAgICAgICAvLyBUaGlzIGltcGxlbWVudGF0aW9uIGZvbGxvd3MgdGhlIFRGIGMrKyBpbXBsZW1lbnRhdGlvbjpcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yZmxvdy9ibG9iL2Q5YTNhODQ5ZWRjMTk4ZTkwMTcyYmM1OGViMjkzZGU0NTdmOWQ5ODYvdGVuc29yZmxvdy9jb3JlL2tlcm5lbHMvZGlsYXRpb25fb3BzLmNjXG4gICAgICAgIGZvciAobGV0IGIgPSAwOyBiIDwgYmF0Y2hTaXplOyArK2IpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGhPdXQgPSAwOyBoT3V0IDwgb3V0SGVpZ2h0OyArK2hPdXQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBoQmVnID0gaE91dCAqIHN0cmlkZUhlaWdodCAtIHBhZEluZm8udG9wO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHdPdXQgPSAwOyB3T3V0IDwgb3V0V2lkdGg7ICsrd091dCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB3QmVnID0gd091dCAqIHN0cmlkZVdpZHRoIC0gcGFkSW5mby5sZWZ0O1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBkID0gMDsgZCA8IGluQ2hhbm5lbHM7ICsrZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGN1clZhbCA9IE51bWJlci5NSU5fU0FGRV9JTlRFR0VSO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhNYXggPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHdNYXggPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaCA9IDA7IGggPCBmaWx0ZXJIZWlnaHQ7ICsraCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhJbiA9IGhCZWcgKyBoICogZGlsYXRpb25IZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhJbiA+PSAwICYmIGhJbiA8IGluSGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHcgPSAwOyB3IDwgZmlsdGVyV2lkdGg7ICsrdykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd0luID0gd0JlZyArIHcgKiBkaWxhdGlvbldpZHRoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdJbiA+PSAwICYmIHdJbiA8IGluV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSAkeFtiXVtoSW5dW3dJbl1bZF0gKyAkZmlsdGVyW2hdW3ddW2RdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWwgPiBjdXJWYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyVmFsID0gdmFsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoTWF4ID0gaDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd01heCA9IHc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZ3JhZGllbnRzW2hNYXhdW3dNYXhdW2RdICs9ICRkeVtiXVtoT3V0XVt3T3V0XVtkXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkYXRhSWQgPSBjcHVCYWNrZW5kLndyaXRlKHV0aWwudG9UeXBlZEFycmF5KGdyYWRpZW50cywgeC5kdHlwZSksIGZpbHRlci5zaGFwZSwgZmlsdGVyLmR0eXBlKTtcbiAgICAgICAgcmV0dXJuIHsgZGF0YUlkLCBzaGFwZTogZmlsdGVyLnNoYXBlLCBkdHlwZTogZmlsdGVyLmR0eXBlIH07XG4gICAgfVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURpbGF0aW9uMkRCYWNrcHJvcEZpbHRlci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIERpbGF0aW9uMkRCYWNrcHJvcElucHV0LCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmV4cG9ydCBjb25zdCBkaWxhdGlvbjJkQmFja3Byb3BJbnB1dENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBEaWxhdGlvbjJEQmFja3Byb3BJbnB1dCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogKHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgeCwgZmlsdGVyLCBkeSB9ID0gaW5wdXRzO1xuICAgICAgICBjb25zdCB7IHN0cmlkZXMsIHBhZCwgZGlsYXRpb25zIH0gPSBhdHRycztcbiAgICAgICAgY29uc3QgY3B1QmFja2VuZCA9IGJhY2tlbmQ7XG4gICAgICAgIGNvbnN0ICR4ID0gdXRpbC50b05lc3RlZEFycmF5KHguc2hhcGUsIGNwdUJhY2tlbmQuZGF0YS5nZXQoeC5kYXRhSWQpLnZhbHVlcyk7XG4gICAgICAgIGNvbnN0ICRmaWx0ZXIgPSB1dGlsLnRvTmVzdGVkQXJyYXkoZmlsdGVyLnNoYXBlLCBjcHVCYWNrZW5kLmRhdGEuZ2V0KGZpbHRlci5kYXRhSWQpLnZhbHVlcyk7XG4gICAgICAgIGNvbnN0IHsgYmF0Y2hTaXplLCBpbkhlaWdodCwgaW5XaWR0aCwgaW5DaGFubmVscywgb3V0SGVpZ2h0LCBvdXRXaWR0aCwgcGFkSW5mbywgc3RyaWRlSGVpZ2h0LCBzdHJpZGVXaWR0aCwgZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgZGlsYXRpb25IZWlnaHQsIGRpbGF0aW9uV2lkdGgsIG91dFNoYXBlIH0gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZURpbGF0aW9uMkRJbmZvKHguc2hhcGUsIGZpbHRlci5zaGFwZSwgc3RyaWRlcywgcGFkLCAnTkhXQycgLyogZGF0YUZvcm1hdCAqLywgZGlsYXRpb25zKTtcbiAgICAgICAgdXRpbC5hc3NlcnQoZHkucmFuayA9PT0gb3V0U2hhcGUubGVuZ3RoLCAoKSA9PiBgRXJyb3IgaW4gJHtEaWxhdGlvbjJEQmFja3Byb3BJbnB1dH0sIGR5IGAgK1xuICAgICAgICAgICAgYG11c3QgaGF2ZSB0aGUgc2FtZSByYW5rIGFzIG91dHB1dCAke291dFNoYXBlLmxlbmd0aH0sIGJ1dCBnb3QgYCArXG4gICAgICAgICAgICBgJHtkeS5yYW5rfWApO1xuICAgICAgICBjb25zdCAkZHkgPSB1dGlsLnRvTmVzdGVkQXJyYXkob3V0U2hhcGUsIGNwdUJhY2tlbmQuZGF0YS5nZXQoZHkuZGF0YUlkKS52YWx1ZXMpO1xuICAgICAgICAvLyBUaGUgY29tcHV0ZWQgZ3JhZGllbnRzIGhhcyB0aGUgc2FtZSBkaW1lbnNpb25zIGFzIHRoZSBpbnB1dDpcbiAgICAgICAgLy8gW2JhdGNoLCBpbnB1dEhlaWdodCwgaW5wdXRDb2xzLCBpbkNoYW5uZWxdXG4gICAgICAgIGNvbnN0IGdyYWRpZW50cyA9IHV0aWwubWFrZVplcm9zTmVzdGVkVHlwZWRBcnJheSh4LnNoYXBlLCB4LmR0eXBlKTtcbiAgICAgICAgLy8gSW4gdGhlIGNhc2Ugb2YgbXVsdGlwbGUgYXJnbWF4IGJyYW5jaGVzLCB3ZSBvbmx5IGJhY2stcHJvcGFnYXRlIGFsb25nIHRoZVxuICAgICAgICAvLyBsYXN0IGJyYW5jaCwgaS5lLiwgdGhlIG9uZSB3aXRoIGxhcmdlc3QgdmFsdWUgb2YgYGggKiBmaWx0ZXJfY29scyArIHdgLFxuICAgICAgICAvLyBzaW1pbGFybHkgdG8gdGhlIG1heC1wb29saW5nIGJhY2t3YXJkIHJvdXRpbmVzLlxuICAgICAgICAvLyBUaGlzIGltcGxlbWVudGF0aW9uIGZvbGxvd3MgdGhlIFRGIGMrKyBpbXBsZW1lbnRhdGlvbjpcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yZmxvdy9ibG9iL2Q5YTNhODQ5ZWRjMTk4ZTkwMTcyYmM1OGViMjkzZGU0NTdmOWQ5ODYvdGVuc29yZmxvdy9jb3JlL2tlcm5lbHMvZGlsYXRpb25fb3BzLmNjXG4gICAgICAgIGZvciAobGV0IGIgPSAwOyBiIDwgYmF0Y2hTaXplOyArK2IpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGhPdXQgPSAwOyBoT3V0IDwgb3V0SGVpZ2h0OyArK2hPdXQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBoQmVnID0gaE91dCAqIHN0cmlkZUhlaWdodCAtIHBhZEluZm8udG9wO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHdPdXQgPSAwOyB3T3V0IDwgb3V0V2lkdGg7ICsrd091dCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB3QmVnID0gd091dCAqIHN0cmlkZVdpZHRoIC0gcGFkSW5mby5sZWZ0O1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBkID0gMDsgZCA8IGluQ2hhbm5lbHM7ICsrZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGN1clZhbCA9IE51bWJlci5NSU5fU0FGRV9JTlRFR0VSO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhJbk1heCA9IChoQmVnIDwgMCkgPyAwIDogaEJlZztcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB3SW5NYXggPSAod0JlZyA8IDApID8gMCA6IHdCZWc7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBoID0gMDsgaCA8IGZpbHRlckhlaWdodDsgKytoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaEluID0gaEJlZyArIGggKiBkaWxhdGlvbkhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaEluID49IDAgJiYgaEluIDwgaW5IZWlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgdyA9IDA7IHcgPCBmaWx0ZXJXaWR0aDsgKyt3KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3SW4gPSB3QmVnICsgdyAqIGRpbGF0aW9uV2lkdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod0luID49IDAgJiYgd0luIDwgaW5XaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9ICR4W2JdW2hJbl1bd0luXVtkXSArICRmaWx0ZXJbaF1bd11bZF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCA+IGN1clZhbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJWYWwgPSB2YWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhJbk1heCA9IGhJbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd0luTWF4ID0gd0luO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGdyYWRpZW50c1tiXVtoSW5NYXhdW3dJbk1heF1bZF0gKz0gJGR5W2JdW2hPdXRdW3dPdXRdW2RdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRhdGFJZCA9IGNwdUJhY2tlbmQud3JpdGUodXRpbC50b1R5cGVkQXJyYXkoZ3JhZGllbnRzLCB4LmR0eXBlKSwgeC5zaGFwZSwgeC5kdHlwZSk7XG4gICAgICAgIHJldHVybiB7IGRhdGFJZCwgc2hhcGU6IHguc2hhcGUsIGR0eXBlOiB4LmR0eXBlIH07XG4gICAgfVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURpbGF0aW9uMkRCYWNrcHJvcElucHV0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgRWluc3VtLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IG11bHRpcGx5IH0gZnJvbSAnLi9NdWx0aXBseSc7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9SZXNoYXBlJztcbmltcG9ydCB7IHN1bSB9IGZyb20gJy4vU3VtJztcbmltcG9ydCB7IHRyYW5zcG9zZSB9IGZyb20gJy4vVHJhbnNwb3NlJztcbmV4cG9ydCBmdW5jdGlvbiBlaW5zdW0oYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IGVxdWF0aW9uIH0gPSBhdHRycztcbiAgICBjb25zdCB0ZW5zb3JzID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgYWxsRGltcywgc3VtbWVkRGltcywgaWREaW1zIH0gPSBiYWNrZW5kX3V0aWwuZGVjb2RlRWluc3VtRXF1YXRpb24oZXF1YXRpb24sIHRlbnNvcnMubGVuZ3RoKTtcbiAgICBiYWNrZW5kX3V0aWwuY2hlY2tFaW5zdW1EaW1TaXplcyhhbGxEaW1zLmxlbmd0aCwgaWREaW1zLCB0ZW5zb3JzKTtcbiAgICBjb25zdCB7IHBhdGgsIHN0ZXBzIH0gPSBiYWNrZW5kX3V0aWwuZ2V0RWluc3VtQ29tcHV0ZVBhdGgoc3VtbWVkRGltcywgaWREaW1zKTtcbiAgICBjb25zdCBuU3RlcHMgPSBzdGVwcy5sZW5ndGg7XG4gICAgbGV0IG91dCA9IG51bGw7XG4gICAgbGV0IG51bURpbXNSZW1haW5pbmcgPSBhbGxEaW1zLmxlbmd0aDtcbiAgICBjb25zdCB0ZW5zb3JzVG9EaXNwb3NlID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuU3RlcHM7ICsraSkge1xuICAgICAgICBmb3IgKGNvbnN0IGlkVGVybSBvZiBzdGVwc1tpXSkge1xuICAgICAgICAgICAgY29uc3QgeyBwZXJtdXRhdGlvbkluZGljZXM6IHBlcm0sIGV4cGFuZERpbXM6IGRpbXNUb0V4cGFuZCB9ID0gYmFja2VuZF91dGlsLmdldEVpbnN1bVBlcm11dGF0aW9uKG51bURpbXNSZW1haW5pbmcsIGlkRGltc1tpZFRlcm1dKTtcbiAgICAgICAgICAgIGxldCB4O1xuICAgICAgICAgICAgaWYgKGJhY2tlbmRfdXRpbC5pc0lkZW50aXR5UGVybXV0YXRpb24ocGVybSkpIHtcbiAgICAgICAgICAgICAgICB4ID0gdGVuc29yc1tpZFRlcm1dO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgeCA9IHRyYW5zcG9zZSh7IGlucHV0czogeyB4OiB0ZW5zb3JzW2lkVGVybV0gfSwgYmFja2VuZCwgYXR0cnM6IHsgcGVybSB9IH0pO1xuICAgICAgICAgICAgICAgIHRlbnNvcnNUb0Rpc3Bvc2UucHVzaCh4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHRhcmdldFNoYXBlID0geC5zaGFwZS5zbGljZSgpO1xuICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBkaW1zVG9FeHBhbmQubGVuZ3RoOyArK2spIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRTaGFwZS5zcGxpY2UoZGltc1RvRXhwYW5kW2tdLCAwLCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdXRpbC5hcnJheXNFcXVhbCh4LnNoYXBlLCB0YXJnZXRTaGFwZSkpIHtcbiAgICAgICAgICAgICAgICB4ID0gcmVzaGFwZSh7IGlucHV0czogeyB4IH0sIGJhY2tlbmQsIGF0dHJzOiB7IHNoYXBlOiB0YXJnZXRTaGFwZSB9IH0pO1xuICAgICAgICAgICAgICAgIHRlbnNvcnNUb0Rpc3Bvc2UucHVzaCh4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvdXQgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBvdXQgPSB4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICAgICAgICAgICAgICAgIG91dCA9IG11bHRpcGx5KHsgaW5wdXRzOiB7IGE6IHgsIGI6IG91dCB9LCBiYWNrZW5kIH0pO1xuICAgICAgICAgICAgICAgIHRlbnNvcnNUb0Rpc3Bvc2UucHVzaChvdXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpIDwgblN0ZXBzIC0gMSkge1xuICAgICAgICAgICAgaWYgKHBhdGhbaV0gPj0gMCkge1xuICAgICAgICAgICAgICAgIG91dCA9IHN1bSh7XG4gICAgICAgICAgICAgICAgICAgIGlucHV0czogeyB4OiBvdXQgfSxcbiAgICAgICAgICAgICAgICAgICAgYmFja2VuZCxcbiAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF4aXM6IHBhdGhbaV0gLSAoYWxsRGltcy5sZW5ndGggLSBudW1EaW1zUmVtYWluaW5nKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGtlZXBEaW1zOiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGVuc29yc1RvRGlzcG9zZS5wdXNoKG91dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBudW1EaW1zUmVtYWluaW5nLS07XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gQ2xlYW4gdXAgaW50ZXJtZWRpYXRlIHRlbnNvcnMuXG4gICAgZm9yIChjb25zdCB0ZW5zb3JJbmZvIG9mIHRlbnNvcnNUb0Rpc3Bvc2UpIHtcbiAgICAgICAgaWYgKHRlbnNvckluZm8gPT09IG91dCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh0ZW5zb3JJbmZvKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbn1cbmV4cG9ydCBjb25zdCBlaW5zdW1Db25maWcgPSB7XG4gICAga2VybmVsTmFtZTogRWluc3VtLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBlaW5zdW1cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1FaW5zdW0uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVsdSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5leHBvcnQgY29uc3QgZWx1ID0gdW5hcnlLZXJuZWxGdW5jKEVsdSwgKHhpKSA9PiB4aSA+PSAwID8geGkgOiAoTWF0aC5leHAoeGkpIC0gMSkpO1xuZXhwb3J0IGNvbnN0IGVsdUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBFbHUsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGVsdSxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1FbHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRWx1R3JhZCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIGVsdUdyYWQoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgZHksIHkgfSA9IGlucHV0cztcbiAgICBhc3NlcnROb3RDb21wbGV4KFtkeSwgeV0sICdlbHVHcmFkJyk7XG4gICAgY29uc3QgcmVzdWx0VmFsdWVzID0gbmV3IEZsb2F0MzJBcnJheSh1dGlsLnNpemVGcm9tU2hhcGUoeS5zaGFwZSkpO1xuICAgIGNvbnN0IHZhbHVlcyA9IGJhY2tlbmQuZGF0YS5nZXQoeS5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCBkeVZhbHVlcyA9IGJhY2tlbmQuZGF0YS5nZXQoZHkuZGF0YUlkKS52YWx1ZXM7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY29uc3QgdiA9IHZhbHVlc1tpXTtcbiAgICAgICAgaWYgKHYgPj0gMSkge1xuICAgICAgICAgICAgcmVzdWx0VmFsdWVzW2ldID0gZHlWYWx1ZXNbaV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXN1bHRWYWx1ZXNbaV0gPSBkeVZhbHVlc1tpXSAqICh2ICsgMSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oeS5zaGFwZSwgJ2Zsb2F0MzInLCByZXN1bHRWYWx1ZXMpO1xufVxuZXhwb3J0IGNvbnN0IGVsdUdyYWRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogRWx1R3JhZCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogZWx1R3JhZFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUVsdUdyYWQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRXF1YWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCB9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV9pbXBsJztcbmltcG9ydCB7IGJpbmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy9iaW5hcnlfdXRpbHMnO1xuZXhwb3J0IGNvbnN0IGVxdWFsSW1wbCA9IGNyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGwoKGEsIGIpID0+IChhID09PSBiKSA/IDEgOiAwKTtcbmV4cG9ydCBjb25zdCBlcXVhbCA9IGJpbmFyeUtlcm5lbEZ1bmMoRXF1YWwsIGVxdWFsSW1wbCwgbnVsbCAvKiBjb21wbGV4SW1wbCAqLywgJ2Jvb2wnKTtcbmV4cG9ydCBjb25zdCBlcXVhbENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBFcXVhbCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogZXF1YWxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1FcXVhbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBFcmYgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgdW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4vdXRpbHMvdW5hcnlfdXRpbHMnO1xuY29uc3QgcCA9IGJhY2tlbmRfdXRpbC5FUkZfUDtcbmNvbnN0IGExID0gYmFja2VuZF91dGlsLkVSRl9BMTtcbmNvbnN0IGEyID0gYmFja2VuZF91dGlsLkVSRl9BMjtcbmNvbnN0IGEzID0gYmFja2VuZF91dGlsLkVSRl9BMztcbmNvbnN0IGE0ID0gYmFja2VuZF91dGlsLkVSRl9BNDtcbmNvbnN0IGE1ID0gYmFja2VuZF91dGlsLkVSRl9BNTtcbmV4cG9ydCBjb25zdCBlcmYgPSB1bmFyeUtlcm5lbEZ1bmMoRXJmLCAoeGkpID0+IHtcbiAgICBjb25zdCBzaWduID0gTWF0aC5zaWduKHhpKTtcbiAgICBjb25zdCB2ID0gTWF0aC5hYnMoeGkpO1xuICAgIGNvbnN0IHQgPSAxLjAgLyAoMS4wICsgcCAqIHYpO1xuICAgIHJldHVybiBzaWduICpcbiAgICAgICAgKDEuMCAtXG4gICAgICAgICAgICAoKCgoKGE1ICogdCArIGE0KSAqIHQpICsgYTMpICogdCArIGEyKSAqIHQgKyBhMSkgKiB0ICpcbiAgICAgICAgICAgICAgICBNYXRoLmV4cCgtdiAqIHYpKTtcbn0pO1xuZXhwb3J0IGNvbnN0IGVyZkNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBFcmYsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGVyZixcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1FcmYuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEV4cCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVTaW1wbGVVbmFyeUltcGwgfSBmcm9tICcuLi91dGlscy91bmFyeV9pbXBsJztcbmltcG9ydCB7IHVuYXJ5S2VybmVsRnVuY0Zyb21JbXBsIH0gZnJvbSAnLi4vdXRpbHMvdW5hcnlfdXRpbHMnO1xuZXhwb3J0IGNvbnN0IGV4cEltcGwgPSBjcmVhdGVTaW1wbGVVbmFyeUltcGwoKHhpKSA9PiBNYXRoLmV4cCh4aSkpO1xuZXhwb3J0IGNvbnN0IGV4cCA9IHVuYXJ5S2VybmVsRnVuY0Zyb21JbXBsKEV4cCwgZXhwSW1wbCk7XG5leHBvcnQgY29uc3QgZXhwQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEV4cCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogZXhwLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUV4cC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFeHBhbmREaW1zLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL1Jlc2hhcGUnO1xuZXhwb3J0IGZ1bmN0aW9uIGV4cGFuZERpbXMoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IGlucHV0IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBkaW0gfSA9IGF0dHJzO1xuICAgIGNvbnN0IGlucHV0UmFuayA9IGlucHV0LnNoYXBlLmxlbmd0aDtcbiAgICBjb25zdCBuZXdTaGFwZSA9IGlucHV0LnNoYXBlLnNsaWNlKCk7XG4gICAgbGV0ICRkaW0gPSBkaW07XG4gICAgaWYgKGRpbSA8IDApIHtcbiAgICAgICAgLy8gTmVnYXRpdmUgdmFsdWUgaXMgY291bnRlZCBmcm9tIHRoZSB0YWlsIG9mIHJhbmsuXG4gICAgICAgIHV0aWwuYXNzZXJ0KC0oaW5wdXRSYW5rICsgMSkgPD0gZGltLCAoKSA9PiBgQXhpcyBtdXN0IGJlIGluIHRoZSBpbnRlcnZhbCBbJHstKGlucHV0UmFuayArIDEpfSwgJHtpbnB1dFJhbmt9XWApO1xuICAgICAgICAkZGltID0gaW5wdXRSYW5rICsgZGltICsgMTtcbiAgICB9XG4gICAgbmV3U2hhcGUuc3BsaWNlKCRkaW0sIDAsIDEpO1xuICAgIHJldHVybiByZXNoYXBlKHsgaW5wdXRzOiB7IHg6IGlucHV0IH0sIGJhY2tlbmQsIGF0dHJzOiB7IHNoYXBlOiBuZXdTaGFwZSB9IH0pO1xufVxuZXhwb3J0IGNvbnN0IGV4cGFuZERpbXNDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogRXhwYW5kRGltcyxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogZXhwYW5kRGltc1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUV4cGFuZERpbXMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEV4cG0xIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVNpbXBsZVVuYXJ5SW1wbCB9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X2ltcGwnO1xuaW1wb3J0IHsgdW5hcnlLZXJuZWxGdW5jRnJvbUltcGwgfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5leHBvcnQgY29uc3QgZXhwbTFJbXBsID0gY3JlYXRlU2ltcGxlVW5hcnlJbXBsKCh4aSkgPT4gTWF0aC5leHBtMSh4aSkpO1xuZXhwb3J0IGNvbnN0IGV4cG0xID0gdW5hcnlLZXJuZWxGdW5jRnJvbUltcGwoRXhwbTEsIGV4cG0xSW1wbCk7XG5leHBvcnQgY29uc3QgZXhwbTFDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogRXhwbTEsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGV4cG0xLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUV4cG0xLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEZGVCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBmZnRCYXRjaCB9IGZyb20gJy4uL3V0aWxzL2ZmdF91dGlscyc7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9SZXNoYXBlJztcbmV4cG9ydCBmdW5jdGlvbiBmZnQoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgaW5wdXQgfSA9IGlucHV0cztcbiAgICBjb25zdCBpbnB1dFNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoaW5wdXQuc2hhcGUpO1xuICAgIC8vIENvbGxhcHNlIGFsbCBvdXRlciBkaW1lbnNpb25zIHRvIGEgc2luZ2xlIGJhdGNoIGRpbWVuc2lvbi5cbiAgICBjb25zdCBpbm5lckRpbWVuc2lvblNpemUgPSBpbnB1dC5zaGFwZVtpbnB1dC5zaGFwZS5sZW5ndGggLSAxXTtcbiAgICBjb25zdCBiYXRjaCA9IGlucHV0U2l6ZSAvIGlubmVyRGltZW5zaW9uU2l6ZTtcbiAgICBjb25zdCBpbnB1dDJEID0gcmVzaGFwZSh7XG4gICAgICAgIGlucHV0czogeyB4OiBpbnB1dCB9LFxuICAgICAgICBiYWNrZW5kLFxuICAgICAgICBhdHRyczogeyBzaGFwZTogW2JhdGNoLCBpbm5lckRpbWVuc2lvblNpemVdIH1cbiAgICB9KTtcbiAgICBjb25zdCByZXN1bHQgPSBmZnRCYXRjaChpbnB1dDJELCBmYWxzZSwgYmFja2VuZCk7XG4gICAgY29uc3QgcmVzdWx0UmVzaGFwZWQgPSByZXNoYXBlKHsgaW5wdXRzOiB7IHg6IHJlc3VsdCB9LCBiYWNrZW5kLCBhdHRyczogeyBzaGFwZTogaW5wdXQuc2hhcGUgfSB9KTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGlucHV0MkQpO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVzdWx0KTtcbiAgICByZXR1cm4gcmVzdWx0UmVzaGFwZWQ7XG59XG5leHBvcnQgY29uc3QgZmZ0Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEZGVCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogZmZ0XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RkZULmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEZpbGwsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuZXhwb3J0IGZ1bmN0aW9uIGZpbGwoYXJncykge1xuICAgIGNvbnN0IHsgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBzaGFwZSwgdmFsdWUsIGR0eXBlIH0gPSBhdHRycztcbiAgICBjb25zdCAkZHR5cGUgPSBkdHlwZSB8fCB1dGlsLmluZmVyRHR5cGUodmFsdWUpO1xuICAgIGNvbnN0IHZhbHVlcyA9IHV0aWwuZ2V0QXJyYXlGcm9tRFR5cGUoJGR0eXBlLCB1dGlsLnNpemVGcm9tU2hhcGUoc2hhcGUpKTtcbiAgICBmaWxsVmFsdWVzKHZhbHVlcywgdmFsdWUsICRkdHlwZSk7XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oc2hhcGUsICRkdHlwZSwgdmFsdWVzKTtcbn1cbmV4cG9ydCBjb25zdCBmaWxsQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEZpbGwsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGZpbGxcbn07XG5mdW5jdGlvbiBmaWxsVmFsdWVzKHZhbHVlcywgdmFsdWUsIGR0eXBlKSB7XG4gICAgaWYgKGR0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICB2YWx1ZXMuZmlsbCh2YWx1ZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB2YWx1ZXMuZmlsbCh2YWx1ZSk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RmlsbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBGbGlwTGVmdFJpZ2h0LCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmV4cG9ydCBjb25zdCBmbGlwTGVmdFJpZ2h0Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEZsaXBMZWZ0UmlnaHQsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6ICh7IGlucHV0cywgYXR0cnMsIGJhY2tlbmQgfSkgPT4ge1xuICAgICAgICBjb25zdCB7IGltYWdlIH0gPSBpbnB1dHM7XG4gICAgICAgIGNvbnN0IGNwdUJhY2tlbmQgPSBiYWNrZW5kO1xuICAgICAgICBjb25zdCBvdXRwdXQgPSB1dGlsLmdldFR5cGVkQXJyYXlGcm9tRFR5cGUoaW1hZ2UuZHR5cGUsIHV0aWwuc2l6ZUZyb21TaGFwZShpbWFnZS5zaGFwZSkpO1xuICAgICAgICBjb25zdCBbYmF0Y2gsIGltYWdlSGVpZ2h0LCBpbWFnZVdpZHRoLCBudW1DaGFubmVsc10gPSBpbWFnZS5zaGFwZTtcbiAgICAgICAgY29uc3QgaW1hZ2VWYWxzID0gY3B1QmFja2VuZC5kYXRhLmdldChpbWFnZS5kYXRhSWQpLnZhbHVlcztcbiAgICAgICAgZm9yIChsZXQgYmF0Y2hJZHggPSAwOyBiYXRjaElkeCA8IGJhdGNoOyBiYXRjaElkeCsrKSB7XG4gICAgICAgICAgICBjb25zdCBiYXRjaE9mZnNldCA9IGJhdGNoSWR4ICogaW1hZ2VXaWR0aCAqIGltYWdlSGVpZ2h0ICogbnVtQ2hhbm5lbHM7XG4gICAgICAgICAgICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBpbWFnZUhlaWdodDsgcm93KyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCByb3dPZmZzZXQgPSByb3cgKiAoaW1hZ2VXaWR0aCAqIG51bUNoYW5uZWxzKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBjb2wgPSAwOyBjb2wgPCBpbWFnZVdpZHRoOyBjb2wrKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb2xPZmZzZXQgPSBjb2wgKiBudW1DaGFubmVscztcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBudW1DaGFubmVsczsgY2hhbm5lbCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb29yZFggPSBNYXRoLnJvdW5kKGltYWdlV2lkdGggLSBjb2wgLSAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG91dElkeCA9IGJhdGNoT2Zmc2V0ICsgcm93T2Zmc2V0ICsgY29sT2Zmc2V0ICsgY2hhbm5lbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvdXRwdXRWYWx1ZSA9IGltYWdlVmFsc1tvdXRJZHhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGNvb3JkaW5hdGUgcG9zaXRpb24gZmFsbHMgd2l0aGluIHRoZSBpbWFnZSBib3VuZGFyaWVzLi4uXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29vcmRYID49IDAgJiYgY29vcmRYIDwgaW1hZ2VXaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCB0aGUgb3V0cHV0IHRvIHRoZSBpbWFnZSB2YWx1ZSBhdCB0aGUgY29vcmRpbmF0ZSBwb3NpdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByb3RhdGVkQ29sT2Zmc2V0ID0gY29vcmRYICogbnVtQ2hhbm5lbHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW1hZ2VJZHggPSBiYXRjaE9mZnNldCArIHJvd09mZnNldCArIHJvdGF0ZWRDb2xPZmZzZXQgKyBjaGFubmVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFZhbHVlID0gaW1hZ2VWYWxzW2ltYWdlSWR4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFtvdXRJZHhdID0gb3V0cHV0VmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGF0YUlkID0gY3B1QmFja2VuZC53cml0ZShvdXRwdXQsIGltYWdlLnNoYXBlLCBpbWFnZS5kdHlwZSk7XG4gICAgICAgIHJldHVybiB7IGRhdGFJZCwgc2hhcGU6IGltYWdlLnNoYXBlLCBkdHlwZTogaW1hZ2UuZHR5cGUgfTtcbiAgICB9XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RmxpcExlZnRSaWdodC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRmxvb3IgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlU2ltcGxlVW5hcnlJbXBsIH0gZnJvbSAnLi4vdXRpbHMvdW5hcnlfaW1wbCc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmNGcm9tSW1wbCB9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCBmbG9vckltcGwgPSBjcmVhdGVTaW1wbGVVbmFyeUltcGwoKHhpKSA9PiBNYXRoLmZsb29yKHhpKSk7XG5leHBvcnQgY29uc3QgZmxvb3IgPSB1bmFyeUtlcm5lbEZ1bmNGcm9tSW1wbChGbG9vciwgZmxvb3JJbXBsKTtcbmV4cG9ydCBjb25zdCBmbG9vckNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBGbG9vcixcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogZmxvb3IsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Rmxvb3IuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRmxvb3JEaXYgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCB9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV9pbXBsJztcbmltcG9ydCB7IGJpbmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy9iaW5hcnlfdXRpbHMnO1xuZXhwb3J0IGNvbnN0IGZsb29yRGl2SW1wbCA9IGNyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGwoKGEsIGIpID0+IE1hdGguZmxvb3IoYSAvIGIpKTtcbmV4cG9ydCBjb25zdCBmbG9vckRpdiA9IGJpbmFyeUtlcm5lbEZ1bmMoRmxvb3JEaXYsIGZsb29yRGl2SW1wbCwgbnVsbCAvKiBjb21wbGV4SW1wbCAqLywgJ2ludDMyJyk7XG5leHBvcnQgY29uc3QgZmxvb3JEaXZDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogRmxvb3JEaXYsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGZsb29yRGl2XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Rmxvb3JEaXYuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRnVzZWRDb252MkQgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXBwbHlBY3RpdmF0aW9uIH0gZnJvbSAnLi4vdXRpbHMvZnVzZWRfdXRpbHMnO1xuaW1wb3J0IHsgYWRkIH0gZnJvbSAnLi9BZGQnO1xuaW1wb3J0IHsgY29udjJEIH0gZnJvbSAnLi9Db252MkQnO1xuZXhwb3J0IGZ1bmN0aW9uIGZ1c2VkQ29udjJEKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4LCBmaWx0ZXIsIGJpYXMsIHByZWx1QWN0aXZhdGlvbldlaWdodHMgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IHN0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdCwgZGlsYXRpb25zLCBkaW1Sb3VuZGluZ01vZGUsIGFjdGl2YXRpb24sIGxlYWt5cmVsdUFscGhhIH0gPSBhdHRycztcbiAgICBsZXQgcmVzdWx0ID0gY29udjJEKHtcbiAgICAgICAgaW5wdXRzOiB7IHgsIGZpbHRlciB9LFxuICAgICAgICBiYWNrZW5kLFxuICAgICAgICBhdHRyczogeyBzdHJpZGVzLCBwYWQsIGRhdGFGb3JtYXQsIGRpbGF0aW9ucywgZGltUm91bmRpbmdNb2RlIH1cbiAgICB9KTtcbiAgICBpZiAoYmlhcykge1xuICAgICAgICBjb25zdCByZXN1bHRPbGQgPSByZXN1bHQ7XG4gICAgICAgIHJlc3VsdCA9IGFkZCh7IGlucHV0czogeyBhOiByZXN1bHQsIGI6IGJpYXMgfSwgYmFja2VuZCB9KTtcbiAgICAgICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZXN1bHRPbGQpO1xuICAgIH1cbiAgICBpZiAoYWN0aXZhdGlvbikge1xuICAgICAgICBjb25zdCByZXN1bHRPbGQgPSByZXN1bHQ7XG4gICAgICAgIHJlc3VsdCA9IGFwcGx5QWN0aXZhdGlvbihiYWNrZW5kLCByZXN1bHQsIGFjdGl2YXRpb24sIHByZWx1QWN0aXZhdGlvbldlaWdodHMsIGxlYWt5cmVsdUFscGhhKTtcbiAgICAgICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZXN1bHRPbGQpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0IGNvbnN0IGZ1c2VkQ29udjJEQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEZ1c2VkQ29udjJELFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBmdXNlZENvbnYyRFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUZ1c2VkQ29udjJELmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEZ1c2VkRGVwdGh3aXNlQ29udjJEIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFwcGx5QWN0aXZhdGlvbiB9IGZyb20gJy4uL3V0aWxzL2Z1c2VkX3V0aWxzJztcbmltcG9ydCB7IGFkZCB9IGZyb20gJy4vQWRkJztcbmltcG9ydCB7IGRlcHRod2lzZUNvbnYyZE5hdGl2ZSB9IGZyb20gJy4vRGVwdGh3aXNlQ29udjJkTmF0aXZlJztcbmV4cG9ydCBmdW5jdGlvbiBmdXNlZERlcHRod2lzZUNvbnYyRChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCwgZmlsdGVyLCBiaWFzLCBwcmVsdUFjdGl2YXRpb25XZWlnaHRzIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBzdHJpZGVzLCBwYWQsIGRhdGFGb3JtYXQsIGRpbGF0aW9ucywgZGltUm91bmRpbmdNb2RlLCBhY3RpdmF0aW9uLCBsZWFreXJlbHVBbHBoYSB9ID0gYXR0cnM7XG4gICAgbGV0IHJlc3VsdCA9IGRlcHRod2lzZUNvbnYyZE5hdGl2ZSh7XG4gICAgICAgIGlucHV0czogeyB4LCBmaWx0ZXIgfSxcbiAgICAgICAgYmFja2VuZCxcbiAgICAgICAgYXR0cnM6IHsgc3RyaWRlcywgcGFkLCBkYXRhRm9ybWF0LCBkaWxhdGlvbnMsIGRpbVJvdW5kaW5nTW9kZSB9XG4gICAgfSk7XG4gICAgaWYgKGJpYXMpIHtcbiAgICAgICAgY29uc3Qgb2xkUmVzdWx0ID0gcmVzdWx0O1xuICAgICAgICByZXN1bHQgPSBhZGQoeyBpbnB1dHM6IHsgYTogcmVzdWx0LCBiOiBiaWFzIH0sIGJhY2tlbmQgfSk7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ob2xkUmVzdWx0KTtcbiAgICB9XG4gICAgaWYgKGFjdGl2YXRpb24pIHtcbiAgICAgICAgY29uc3Qgb2xkUmVzdWx0ID0gcmVzdWx0O1xuICAgICAgICByZXN1bHQgPSBhcHBseUFjdGl2YXRpb24oYmFja2VuZCwgcmVzdWx0LCBhY3RpdmF0aW9uLCBwcmVsdUFjdGl2YXRpb25XZWlnaHRzLCBsZWFreXJlbHVBbHBoYSk7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ob2xkUmVzdWx0KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydCBjb25zdCBmdXNlZERlcHRod2lzZUNvbnYyRENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBGdXNlZERlcHRod2lzZUNvbnYyRCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogZnVzZWREZXB0aHdpc2VDb252MkRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1GdXNlZERlcHRod2lzZUNvbnYyRC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIEdhdGhlck5kLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGdhdGhlck5kSW1wbCB9IGZyb20gJy4vR2F0aGVyTmRfSW1wbCc7XG5leHBvcnQgZnVuY3Rpb24gZ2F0aGVyTmQoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgcGFyYW1zLCBpbmRpY2VzIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgcGFyYW1zU2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShwYXJhbXMuc2hhcGUpO1xuICAgIGNvbnN0IGluZGljZXNTaGFwZSA9IGluZGljZXMuc2hhcGU7XG4gICAgY29uc3Qgc2xpY2VSYW5rID0gaW5kaWNlc1NoYXBlW2luZGljZXNTaGFwZS5sZW5ndGggLSAxXTtcbiAgICBjb25zdCBbcmVzdWx0U2hhcGUsIG51bVNsaWNlcywgc2xpY2VTaXplLCBzdHJpZGVzXSA9IGJhY2tlbmRfdXRpbC5wcmVwYXJlQW5kVmFsaWRhdGUocGFyYW1zLCBpbmRpY2VzKTtcbiAgICBpZiAobnVtU2xpY2VzID09PSAwKSB7XG4gICAgICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHJlc3VsdFNoYXBlLCBwYXJhbXMuZHR5cGUsIFtdKTtcbiAgICB9XG4gICAgY29uc3QgaW5kaWNlc0RhdGEgPSBiYWNrZW5kLmRhdGEuZ2V0KGluZGljZXMuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgcGFyYW1zQnVmID0gYmFja2VuZC5idWZmZXJTeW5jKHBhcmFtcyk7XG4gICAgY29uc3Qgb3V0QnVmID0gZ2F0aGVyTmRJbXBsKGluZGljZXNEYXRhLCBwYXJhbXNCdWYsIHBhcmFtcy5kdHlwZSwgbnVtU2xpY2VzLCBzbGljZVJhbmssIHNsaWNlU2l6ZSwgc3RyaWRlcywgcGFyYW1zLnNoYXBlLCBwYXJhbXNTaXplKTtcbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhyZXN1bHRTaGFwZSwgcGFyYW1zLmR0eXBlLCBvdXRCdWYudmFsdWVzKTtcbn1cbmV4cG9ydCBjb25zdCBnYXRoZXJOZENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBHYXRoZXJOZCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogZ2F0aGVyTmRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1HYXRoZXJOZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBidWZmZXIgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuZXhwb3J0IGZ1bmN0aW9uIGdhdGhlck5kSW1wbChpbmRpY2VzRGF0YSwgcGFyYW1zQnVmLCBkdHlwZSwgbnVtU2xpY2VzLCBzbGljZVJhbmssIHNsaWNlU2l6ZSwgc3RyaWRlcywgcGFyYW1zU2hhcGUsIHBhcmFtc1NpemUpIHtcbiAgICBjb25zdCBvdXRCdWYgPSBidWZmZXIoW251bVNsaWNlcywgc2xpY2VTaXplXSwgZHR5cGUpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtU2xpY2VzOyBpKyspIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBbXTtcbiAgICAgICAgbGV0IGZsYXR0ZW5JbmRleCA9IDA7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgc2xpY2VSYW5rOyBqKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGRpbSA9IGluZGljZXNEYXRhW2kgKiBzbGljZVJhbmsgKyBqXTtcbiAgICAgICAgICAgIGZsYXR0ZW5JbmRleCArPSBkaW0gKiBzdHJpZGVzW2pdO1xuICAgICAgICAgICAgaW5kZXgucHVzaChkaW0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmbGF0dGVuSW5kZXggPCAwIHx8IGZsYXR0ZW5JbmRleCA+PSBwYXJhbXNTaXplIC8gc2xpY2VTaXplKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgaW5kaWNlczogJHtpbmRleH0gZG9lcyBub3QgaW5kZXggaW50byAke3BhcmFtc1NoYXBlfWApO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgc2xpY2VTaXplOyBrKyspIHtcbiAgICAgICAgICAgIG91dEJ1Zi52YWx1ZXNbaSAqIHNsaWNlU2l6ZSArIGtdID1cbiAgICAgICAgICAgICAgICBwYXJhbXNCdWYuZ2V0KC4uLnBhcmFtc0J1Zi5pbmRleFRvTG9jKGZsYXR0ZW5JbmRleCAqIHNsaWNlU2l6ZSArIGspKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3V0QnVmO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9R2F0aGVyTmRfSW1wbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIEdhdGhlclYyLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5pbXBvcnQgeyBnYXRoZXJWMkltcGwgfSBmcm9tICcuL0dhdGhlclYyX2ltcGwnO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vUmVzaGFwZSc7XG5leHBvcnQgZnVuY3Rpb24gZ2F0aGVyVjIoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHgsIGluZGljZXMgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGF4aXMsIGJhdGNoRGltcyB9ID0gYXR0cnM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleChbeCwgaW5kaWNlc10sICdnYXRoZXJWMicpO1xuICAgIGxldCAkYmF0Y2hEaW1zID0gYmF0Y2hEaW1zO1xuICAgIGlmIChiYXRjaERpbXMgPT0gbnVsbCkge1xuICAgICAgICAkYmF0Y2hEaW1zID0gMDtcbiAgICB9XG4gICAgY29uc3QgaW5kaWNlc1NpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoaW5kaWNlcy5zaGFwZSk7XG4gICAgY29uc3QgcGFyc2VkQXhpcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oYXhpcywgeC5zaGFwZSlbMF07XG4gICAgY29uc3Qgc2hhcGVJbmZvID0gYmFja2VuZF91dGlsLnNlZ21lbnRfdXRpbC5jb2xsZWN0R2F0aGVyT3BTaGFwZUluZm8oeCwgaW5kaWNlcywgcGFyc2VkQXhpcywgJGJhdGNoRGltcyk7XG4gICAgY29uc3QgZmxhdHRlblggPSByZXNoYXBlKHtcbiAgICAgICAgaW5wdXRzOiB7IHggfSxcbiAgICAgICAgYmFja2VuZCxcbiAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgIHNoYXBlOiBbXG4gICAgICAgICAgICAgICAgc2hhcGVJbmZvLmJhdGNoU2l6ZSwgc2hhcGVJbmZvLm91dGVyU2l6ZSwgc2hhcGVJbmZvLmRpbVNpemUsXG4gICAgICAgICAgICAgICAgc2hhcGVJbmZvLnNsaWNlU2l6ZVxuICAgICAgICAgICAgXVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgZmxhdHRlbkluZGV4ID0gcmVzaGFwZSh7XG4gICAgICAgIGlucHV0czogeyB4OiBpbmRpY2VzIH0sXG4gICAgICAgIGJhY2tlbmQsXG4gICAgICAgIGF0dHJzOiB7IHNoYXBlOiBbc2hhcGVJbmZvLmJhdGNoU2l6ZSwgaW5kaWNlc1NpemUgLyBzaGFwZUluZm8uYmF0Y2hTaXplXSB9XG4gICAgfSk7XG4gICAgY29uc3QgZmxhdHRlbk91dHB1dFNoYXBlID0gW1xuICAgICAgICBzaGFwZUluZm8uYmF0Y2hTaXplLCBzaGFwZUluZm8ub3V0ZXJTaXplLCBpbmRpY2VzU2l6ZSAvIHNoYXBlSW5mby5iYXRjaFNpemUsXG4gICAgICAgIHNoYXBlSW5mby5zbGljZVNpemVcbiAgICBdO1xuICAgIGNvbnN0IGluZGljZXNCdWYgPSBiYWNrZW5kLmJ1ZmZlclN5bmMoZmxhdHRlbkluZGV4KTtcbiAgICBjb25zdCB4QnVmID0gYmFja2VuZC5idWZmZXJTeW5jKGZsYXR0ZW5YKTtcbiAgICBjb25zdCBvdXRCdWYgPSBnYXRoZXJWMkltcGwoeEJ1ZiwgaW5kaWNlc0J1ZiwgZmxhdHRlbk91dHB1dFNoYXBlKTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGZsYXR0ZW5YKTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGZsYXR0ZW5JbmRleCk7XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oc2hhcGVJbmZvLm91dHB1dFNoYXBlLCBvdXRCdWYuZHR5cGUsIG91dEJ1Zi52YWx1ZXMpO1xufVxuZXhwb3J0IGNvbnN0IGdhdGhlclYyQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEdhdGhlclYyLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBnYXRoZXJWMlxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUdhdGhlclYyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJ1ZmZlciB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5leHBvcnQgZnVuY3Rpb24gZ2F0aGVyVjJJbXBsKHhCdWYsIGluZGljZXNCdWYsIGZsYXR0ZW5PdXRwdXRTaGFwZSkge1xuICAgIGNvbnN0IG91dEJ1ZiA9IGJ1ZmZlcihmbGF0dGVuT3V0cHV0U2hhcGUsIHhCdWYuZHR5cGUpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3V0QnVmLnNpemU7ICsraSkge1xuICAgICAgICBjb25zdCBuZXdMb2MgPSBvdXRCdWYuaW5kZXhUb0xvYyhpKTtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxMb2MgPSBuZXdMb2Muc2xpY2UoKTtcbiAgICAgICAgY29uc3QgYmF0Y2hJZHggPSBvcmlnaW5hbExvY1swXTtcbiAgICAgICAgY29uc3QgaW5kaWNlc0lkeCA9IG9yaWdpbmFsTG9jWzJdO1xuICAgICAgICBjb25zdCBpbmRpY2VzSW5kZXggPSBpbmRpY2VzQnVmLmxvY1RvSW5kZXgoW2JhdGNoSWR4LCBpbmRpY2VzSWR4XSk7XG4gICAgICAgIG9yaWdpbmFsTG9jWzJdID0gaW5kaWNlc0J1Zi52YWx1ZXNbaW5kaWNlc0luZGV4XTtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxJbmRleCA9IHhCdWYubG9jVG9JbmRleChvcmlnaW5hbExvYyk7XG4gICAgICAgIG91dEJ1Zi52YWx1ZXNbaV0gPSB4QnVmLnZhbHVlc1tvcmlnaW5hbEluZGV4XTtcbiAgICB9XG4gICAgcmV0dXJuIG91dEJ1Zjtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUdhdGhlclYyX2ltcGwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgR3JlYXRlciB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsIH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X2ltcGwnO1xuaW1wb3J0IHsgYmluYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV91dGlscyc7XG5leHBvcnQgY29uc3QgZ3JlYXRlckltcGwgPSBjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsKChhLCBiKSA9PiAoYSA+IGIpID8gMSA6IDApO1xuZXhwb3J0IGNvbnN0IGdyZWF0ZXIgPSBiaW5hcnlLZXJuZWxGdW5jKEdyZWF0ZXIsIGdyZWF0ZXJJbXBsLCBudWxsIC8qIGNvbXBsZXhJbXBsICovLCAnYm9vbCcpO1xuZXhwb3J0IGNvbnN0IGdyZWF0ZXJDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogR3JlYXRlcixcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogZ3JlYXRlclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUdyZWF0ZXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgR3JlYXRlckVxdWFsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGwgfSBmcm9tICcuLi91dGlscy9iaW5hcnlfaW1wbCc7XG5pbXBvcnQgeyBiaW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCBncmVhdGVyRXF1YWxJbXBsID0gY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCgoYSwgYikgPT4gKGEgPj0gYikgPyAxIDogMCk7XG5leHBvcnQgY29uc3QgZ3JlYXRlckVxdWFsID0gYmluYXJ5S2VybmVsRnVuYyhHcmVhdGVyRXF1YWwsIGdyZWF0ZXJFcXVhbEltcGwsIG51bGwgLyogY29tcGxleEltcGwgKi8sICdib29sJyk7XG5leHBvcnQgY29uc3QgZ3JlYXRlckVxdWFsQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEdyZWF0ZXJFcXVhbCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogZ3JlYXRlckVxdWFsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9R3JlYXRlckVxdWFsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IElGRlQsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgZmZ0QmF0Y2ggfSBmcm9tICcuLi91dGlscy9mZnRfdXRpbHMnO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vUmVzaGFwZSc7XG5leHBvcnQgZnVuY3Rpb24gaWZmdChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBpbnB1dCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IGlucHV0U2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShpbnB1dC5zaGFwZSk7XG4gICAgLy8gQ29sbGFwc2UgYWxsIG91dGVyIGRpbWVuc2lvbnMgdG8gYSBzaW5nbGUgYmF0Y2ggZGltZW5zaW9uLlxuICAgIGNvbnN0IGlubmVyRGltZW5zaW9uU2l6ZSA9IGlucHV0LnNoYXBlW2lucHV0LnNoYXBlLmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IGJhdGNoID0gaW5wdXRTaXplIC8gaW5uZXJEaW1lbnNpb25TaXplO1xuICAgIGNvbnN0IGlucHV0MkQgPSByZXNoYXBlKHtcbiAgICAgICAgaW5wdXRzOiB7IHg6IGlucHV0IH0sXG4gICAgICAgIGJhY2tlbmQsXG4gICAgICAgIGF0dHJzOiB7IHNoYXBlOiBbYmF0Y2gsIGlubmVyRGltZW5zaW9uU2l6ZV0gfVxuICAgIH0pO1xuICAgIGNvbnN0IHJlc3VsdCA9IGZmdEJhdGNoKGlucHV0MkQsIHRydWUsIGJhY2tlbmQpO1xuICAgIGNvbnN0IHJlc3VsdFJlc2hhcGVkID0gcmVzaGFwZSh7IGlucHV0czogeyB4OiByZXN1bHQgfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IGlucHV0LnNoYXBlIH0gfSk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhpbnB1dDJEKTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlc3VsdCk7XG4gICAgcmV0dXJuIHJlc3VsdFJlc2hhcGVkO1xufVxuZXhwb3J0IGNvbnN0IGlmZnRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogSUZGVCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogaWZmdFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUlGRlQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgSWRlbnRpdHkgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuZXhwb3J0IGZ1bmN0aW9uIGlkZW50aXR5KGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBiYWNrZW5kLmluY1JlZih4LmRhdGFJZCk7XG4gICAgcmV0dXJuIHsgZGF0YUlkOiB4LmRhdGFJZCwgc2hhcGU6IHguc2hhcGUsIGR0eXBlOiB4LmR0eXBlIH07XG59XG5leHBvcnQgY29uc3QgaWRlbnRpdHlDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogSWRlbnRpdHksXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGlkZW50aXR5XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SWRlbnRpdHkuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgSW1hZyB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5leHBvcnQgZnVuY3Rpb24gaW1hZyhhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBpbnB1dCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IGltYWcgPSBiYWNrZW5kLmRhdGEuZ2V0KGlucHV0LmRhdGFJZCkuY29tcGxleFRlbnNvckluZm9zLmltYWc7XG4gICAgY29uc3QgaW1hZ1ZhbCA9IGJhY2tlbmQuZGF0YS5nZXQoaW1hZy5kYXRhSWQpLnZhbHVlcztcbiAgICAvLyBXaGVuIGNvbXBsZXggdGVuc29yIGlzIGRpc3Bvc2VkLCBpdHMgdW5kZXJseWluZyBwYXJ0cyB3aWxsIGJlIGRpc3Bvc2VkIHRvby5cbiAgICAvLyBNYWtlIG5ldyB0ZW5zb3Igb3V0IG9mIHRoZSBpbWFnIHZhbHVlIG9mIHRoZSBjb21wbGV4LiBUaGlzIG1ha2VzIHN1cmUgdGhlXG4gICAgLy8gdmFsdWUgaXMgc3RpbGwgYWNjZXNzaWJsZSBldmVuIGlmIGNvbXBsZXggdGVuc29yIGlzIGRpc3Bvc2VkLlxuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKGltYWcuc2hhcGUsIGltYWcuZHR5cGUsIGltYWdWYWwpO1xufVxuZXhwb3J0IGNvbnN0IGltYWdDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogSW1hZyxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogaW1hZ1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUltYWcuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IElzRmluaXRlIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHVuYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCBpc0Zpbml0ZSA9IHVuYXJ5S2VybmVsRnVuYyhJc0Zpbml0ZSwgKHhpKSA9PiBOdW1iZXIuaXNGaW5pdGUoeGkpID8gMSA6IDAsICdib29sJyk7XG5leHBvcnQgY29uc3QgaXNGaW5pdGVDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogSXNGaW5pdGUsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGlzRmluaXRlLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUlzRmluaXRlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBJc0luZiB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5leHBvcnQgY29uc3QgaXNJbmYgPSB1bmFyeUtlcm5lbEZ1bmMoSXNJbmYsICh4aSkgPT4gTWF0aC5hYnMoeGkpID09PSBJbmZpbml0eSA/IDEgOiAwLCAnYm9vbCcpO1xuZXhwb3J0IGNvbnN0IGlzSW5mQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IElzSW5mLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBpc0luZixcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Jc0luZi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgSXNOYW4gfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgdW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4vdXRpbHMvdW5hcnlfdXRpbHMnO1xuZXhwb3J0IGNvbnN0IGlzTmFOID0gdW5hcnlLZXJuZWxGdW5jKElzTmFuLCAoeGkpID0+IE51bWJlci5pc05hTih4aSkgPyAxIDogMCwgJ2Jvb2wnKTtcbmV4cG9ydCBjb25zdCBpc05hTkNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBJc05hbixcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogaXNOYU4sXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SXNOYU4uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgTFJOLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5leHBvcnQgZnVuY3Rpb24gbFJOKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBkZXB0aFJhZGl1cywgYmlhcywgYWxwaGEsIGJldGEgfSA9IGF0dHJzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoeCwgJ0xSTicpO1xuICAgIGNvbnN0IGNoYW5uZWxzID0geC5zaGFwZVszXTtcbiAgICBjb25zdCBtYXhEID0gY2hhbm5lbHMgLSAxO1xuICAgIGNvbnN0IHhWYWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3Qgc2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZSh4LnNoYXBlKTtcbiAgICBjb25zdCByZXN1bHQgPSBuZXcgRmxvYXQzMkFycmF5KHNpemUpO1xuICAgIGZ1bmN0aW9uIHN1bUFjcm9zc0NoYW5uZWxzKG9mZnNldCkge1xuICAgICAgICBjb25zdCBjdXJyZW50Q2hhbm5lbCA9IG9mZnNldCAlIGNoYW5uZWxzO1xuICAgICAgICBsZXQgYmVnaW5TdW1PZmZzZXQgPSBvZmZzZXQgLSBjdXJyZW50Q2hhbm5lbCArIE1hdGgubWF4KDAsIGN1cnJlbnRDaGFubmVsIC0gZGVwdGhSYWRpdXMpO1xuICAgICAgICBjb25zdCBlbmRTdW1PZmZzZXQgPSBvZmZzZXQgLSBjdXJyZW50Q2hhbm5lbCArIE1hdGgubWluKGN1cnJlbnRDaGFubmVsICsgZGVwdGhSYWRpdXMsIG1heEQpO1xuICAgICAgICBsZXQgc3VtID0gMC4wO1xuICAgICAgICBmb3IgKDsgYmVnaW5TdW1PZmZzZXQgPD0gZW5kU3VtT2Zmc2V0OyBiZWdpblN1bU9mZnNldCsrKSB7XG4gICAgICAgICAgICBjb25zdCB6ID0geFZhbHVlc1tiZWdpblN1bU9mZnNldF07XG4gICAgICAgICAgICBzdW0gKz0geiAqIHo7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1bTtcbiAgICB9XG4gICAgZm9yIChsZXQgb2Zmc2V0ID0gMDsgb2Zmc2V0IDwgc2l6ZTsgb2Zmc2V0KyspIHtcbiAgICAgICAgY29uc3Qgc3VtID0gc3VtQWNyb3NzQ2hhbm5lbHMob2Zmc2V0KTtcbiAgICAgICAgY29uc3QgdmFsID0geFZhbHVlc1tvZmZzZXRdICogTWF0aC5wb3coYmlhcyArIGFscGhhICogc3VtLCAtYmV0YSk7XG4gICAgICAgIHJlc3VsdFtvZmZzZXRdID0gdmFsO1xuICAgIH1cbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyh4LnNoYXBlLCB4LmR0eXBlLCByZXN1bHQpO1xufVxuZXhwb3J0IGNvbnN0IGxSTkNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBMUk4sXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGxSTlxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUxSTi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBMUk5HcmFkLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5leHBvcnQgZnVuY3Rpb24gbFJOR3JhZChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCwgeSwgZHkgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGRlcHRoUmFkaXVzLCBiaWFzLCBhbHBoYSwgYmV0YSB9ID0gYXR0cnM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleChkeSwgJ0xSTkdyYWQnKTtcbiAgICBjb25zdCBkeVNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoZHkuc2hhcGUpO1xuICAgIGNvbnN0IGNoYW5uZWxzID0gZHkuc2hhcGVbM107XG4gICAgY29uc3QgZHlWYWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KGR5LmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IHhWYWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgeVZhbHVlcyA9IGJhY2tlbmQuZGF0YS5nZXQoeS5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCByZXN1bHQgPSBuZXcgRmxvYXQzMkFycmF5KGR5U2l6ZSk7XG4gICAgY29uc3Qgc2l6ZSA9IGR5U2l6ZTtcbiAgICBmb3IgKGxldCBvZmZzZXQgPSAwOyBvZmZzZXQgPCBzaXplOyBvZmZzZXQrKykge1xuICAgICAgICBjb25zdCBjdXJyZW50Q2hhbm5lbCA9IG9mZnNldCAlIGNoYW5uZWxzO1xuICAgICAgICBjb25zdCBkZXB0aEJlZ2luID0gKG9mZnNldCAtIGN1cnJlbnRDaGFubmVsKSArIE1hdGgubWF4KDAsIGN1cnJlbnRDaGFubmVsIC0gZGVwdGhSYWRpdXMpO1xuICAgICAgICBjb25zdCBkZXB0aEVuZCA9IChvZmZzZXQgLSBjdXJyZW50Q2hhbm5lbCkgK1xuICAgICAgICAgICAgTWF0aC5taW4oY2hhbm5lbHMsIGN1cnJlbnRDaGFubmVsICsgZGVwdGhSYWRpdXMgKyAxKTtcbiAgICAgICAgbGV0IG5vcm0gPSAwO1xuICAgICAgICBmb3IgKGxldCBrID0gZGVwdGhCZWdpbjsgayA8IGRlcHRoRW5kOyBrKyspIHtcbiAgICAgICAgICAgIG5vcm0gKz0gTWF0aC5wb3coeFZhbHVlc1trXSwgMik7XG4gICAgICAgIH1cbiAgICAgICAgbm9ybSA9IGFscGhhICogbm9ybSArIGJpYXM7XG4gICAgICAgIGZvciAobGV0IGsgPSBkZXB0aEJlZ2luOyBrIDwgZGVwdGhFbmQ7IGsrKykge1xuICAgICAgICAgICAgbGV0IGR5aSA9IC0yICogYWxwaGEgKiBiZXRhICogeFZhbHVlc1trXSAqIHlWYWx1ZXNbb2Zmc2V0XSAvIG5vcm07XG4gICAgICAgICAgICBpZiAob2Zmc2V0ID09PSBrKSB7XG4gICAgICAgICAgICAgICAgZHlpICs9IE1hdGgucG93KG5vcm0sIC1iZXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGR5aSAqPSBkeVZhbHVlc1tvZmZzZXRdO1xuICAgICAgICAgICAgcmVzdWx0W2tdICs9IGR5aTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhkeS5zaGFwZSwgeC5kdHlwZSwgcmVzdWx0KTtcbn1cbmV4cG9ydCBjb25zdCBsUk5HcmFkQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IExSTkdyYWQsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGxSTkdyYWRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1MUk5HcmFkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IExlYWt5UmVsdSwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIGxlYWt5UmVsdShhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgYWxwaGEgfSA9IGF0dHJzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoW3hdLCAnbGVha3lSZWx1Jyk7XG4gICAgY29uc3QgeFNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoeC5zaGFwZSk7XG4gICAgY29uc3QgeFZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3Qgb3V0VmFscyA9IHV0aWwuZ2V0VHlwZWRBcnJheUZyb21EVHlwZSgnZmxvYXQzMicsIHhTaXplKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHhWYWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG91dFZhbHNbaV0gPSB4VmFsc1tpXSA8IDAgPyBhbHBoYSAqIHhWYWxzW2ldIDogeFZhbHNbaV07XG4gICAgfVxuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHguc2hhcGUsICdmbG9hdDMyJywgb3V0VmFscyk7XG59XG5leHBvcnQgY29uc3QgbGVha3lSZWx1Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IExlYWt5UmVsdSxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogbGVha3lSZWx1XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TGVha3lSZWx1LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IExlc3MgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCB9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV9pbXBsJztcbmltcG9ydCB7IGJpbmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy9iaW5hcnlfdXRpbHMnO1xuZXhwb3J0IGNvbnN0IGxlc3NJbXBsID0gY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCgoYSwgYikgPT4gKGEgPCBiKSA/IDEgOiAwKTtcbmV4cG9ydCBjb25zdCBsZXNzID0gYmluYXJ5S2VybmVsRnVuYyhMZXNzLCBsZXNzSW1wbCwgbnVsbCAvKiBjb21wbGV4SW1wbCAqLywgJ2Jvb2wnKTtcbmV4cG9ydCBjb25zdCBsZXNzQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IExlc3MsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGxlc3Ncbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1MZXNzLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IExlc3NFcXVhbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsIH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X2ltcGwnO1xuaW1wb3J0IHsgYmluYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV91dGlscyc7XG5leHBvcnQgY29uc3QgbGVzc0VxdWFsSW1wbCA9IGNyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGwoKGEsIGIpID0+IChhIDw9IGIpID8gMSA6IDApO1xuZXhwb3J0IGNvbnN0IGxlc3NFcXVhbCA9IGJpbmFyeUtlcm5lbEZ1bmMoTGVzc0VxdWFsLCBsZXNzRXF1YWxJbXBsLCBudWxsIC8qIGNvbXBsZXhJbXBsICovLCAnYm9vbCcpO1xuZXhwb3J0IGNvbnN0IGxlc3NFcXVhbENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBMZXNzRXF1YWwsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGxlc3NFcXVhbFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUxlc3NFcXVhbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBMaW5TcGFjZSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBsaW5TcGFjZUltcGwgfSBmcm9tICcuL0xpblNwYWNlX2ltcGwnO1xuZXhwb3J0IGZ1bmN0aW9uIGxpblNwYWNlKGFyZ3MpIHtcbiAgICBjb25zdCB7IGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgc3RhcnQsIHN0b3AsIG51bSB9ID0gYXR0cnM7XG4gICAgY29uc3Qgb3V0VmFscyA9IGxpblNwYWNlSW1wbChzdGFydCwgc3RvcCwgbnVtKTtcbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhbb3V0VmFscy5sZW5ndGhdLCAnZmxvYXQzMicsIG91dFZhbHMpO1xufVxuZXhwb3J0IGNvbnN0IGxpblNwYWNlQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IExpblNwYWNlLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBsaW5TcGFjZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUxpblNwYWNlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuZXhwb3J0IGZ1bmN0aW9uIGxpblNwYWNlSW1wbChzdGFydCwgc3RvcCwgbnVtKSB7XG4gICAgY29uc3Qgc3RlcCA9IChzdG9wIC0gc3RhcnQpIC8gKG51bSAtIDEpO1xuICAgIGNvbnN0IHZhbHVlcyA9IHV0aWwubWFrZVplcm9zVHlwZWRBcnJheShudW0sICdmbG9hdDMyJyk7XG4gICAgdmFsdWVzWzBdID0gc3RhcnQ7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFsdWVzW2ldID0gdmFsdWVzW2kgLSAxXSArIHN0ZXA7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZXM7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1MaW5TcGFjZV9pbXBsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBMb2cgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlU2ltcGxlVW5hcnlJbXBsIH0gZnJvbSAnLi4vdXRpbHMvdW5hcnlfaW1wbCc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmNGcm9tSW1wbCB9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCBsb2dJbXBsID0gY3JlYXRlU2ltcGxlVW5hcnlJbXBsKCh4aSkgPT4gTWF0aC5sb2coeGkpKTtcbmV4cG9ydCBjb25zdCBsb2cgPSB1bmFyeUtlcm5lbEZ1bmNGcm9tSW1wbChMb2csIGxvZ0ltcGwpO1xuZXhwb3J0IGNvbnN0IGxvZ0NvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBMb2csXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGxvZyxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Mb2cuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IExvZzFwIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHVuYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCBsb2cxcCA9IHVuYXJ5S2VybmVsRnVuYyhMb2cxcCwgKHhpKSA9PiBNYXRoLmxvZzFwKHhpKSk7XG5leHBvcnQgY29uc3QgbG9nMXBDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTG9nMXAsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGxvZzFwLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUxvZzFwLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IExvZ2ljYWxBbmQgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCB9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV9pbXBsJztcbmltcG9ydCB7IGJpbmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy9iaW5hcnlfdXRpbHMnO1xuZXhwb3J0IGNvbnN0IGxvZ2ljYWxBbmRJbXBsID0gY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCgoYSwgYikgPT4gYSAmJiBiKTtcbmV4cG9ydCBjb25zdCBsb2dpY2FsQW5kID0gYmluYXJ5S2VybmVsRnVuYyhMb2dpY2FsQW5kLCBsb2dpY2FsQW5kSW1wbCwgbnVsbCAvKiBjb21wbGV4SW1wbCAqLywgJ2Jvb2wnKTtcbmV4cG9ydCBjb25zdCBsb2dpY2FsQW5kQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IExvZ2ljYWxBbmQsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGxvZ2ljYWxBbmRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Mb2dpY2FsQW5kLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBMb2dpY2FsTm90IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHVuYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCBsb2dpY2FsTm90ID0gdW5hcnlLZXJuZWxGdW5jKExvZ2ljYWxOb3QsICh4aSkgPT4geGkgPyAwIDogMSwgJ2Jvb2wnKTtcbmV4cG9ydCBjb25zdCBsb2dpY2FsTm90Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IExvZ2ljYWxOb3QsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGxvZ2ljYWxOb3QsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TG9naWNhbE5vdC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBMb2dpY2FsT3IgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCB9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV9pbXBsJztcbmltcG9ydCB7IGJpbmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy9iaW5hcnlfdXRpbHMnO1xuZXhwb3J0IGNvbnN0IGxvZ2ljYWxPckltcGwgPSBjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsKChhLCBiKSA9PiBhIHx8IGIpO1xuZXhwb3J0IGNvbnN0IGxvZ2ljYWxPciA9IGJpbmFyeUtlcm5lbEZ1bmMoTG9naWNhbE9yLCBsb2dpY2FsT3JJbXBsLCBudWxsIC8qIGNvbXBsZXhJbXBsICovLCAnYm9vbCcpO1xuZXhwb3J0IGNvbnN0IGxvZ2ljYWxPckNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBMb2dpY2FsT3IsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGxvZ2ljYWxPclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUxvZ2ljYWxPci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBNYXggfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYmFja2VuZF91dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmltcG9ydCB7IG1heEltcGwgfSBmcm9tICcuL01heF9pbXBsJztcbmltcG9ydCB7IHRyYW5zcG9zZUltcGwgfSBmcm9tICcuL1RyYW5zcG9zZV9pbXBsJztcbmV4cG9ydCBmdW5jdGlvbiBtYXgoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IHJlZHVjdGlvbkluZGljZXMsIGtlZXBEaW1zIH0gPSBhdHRycztcbiAgICBjb25zdCBjcHVCYWNrZW5kID0gYmFja2VuZDtcbiAgICBsZXQgeFNoYXBlID0geC5zaGFwZTtcbiAgICBjb25zdCB4UmFuayA9IHhTaGFwZS5sZW5ndGg7XG4gICAgY29uc3Qgb3JpZ0F4ZXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKHJlZHVjdGlvbkluZGljZXMsIHhTaGFwZSk7XG4gICAgbGV0IGF4ZXMgPSBvcmlnQXhlcztcbiAgICBjb25zdCBwZXJtdXRlZEF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0QXhlc1Blcm11dGF0aW9uKGF4ZXMsIHhSYW5rKTtcbiAgICBsZXQgeFZhbHMgPSBjcHVCYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXM7XG4gICAgaWYgKHBlcm11dGVkQXhlcyAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IG5ld1NoYXBlID0gbmV3IEFycmF5KHhSYW5rKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXdTaGFwZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbmV3U2hhcGVbaV0gPSB4U2hhcGVbcGVybXV0ZWRBeGVzW2ldXTtcbiAgICAgICAgfVxuICAgICAgICB4VmFscyA9IHRyYW5zcG9zZUltcGwoeFZhbHMsIHhTaGFwZSwgeC5kdHlwZSwgcGVybXV0ZWRBeGVzLCBuZXdTaGFwZSk7XG4gICAgICAgIGF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0SW5uZXJNb3N0QXhlcyhheGVzLmxlbmd0aCwgeFJhbmspO1xuICAgICAgICB4U2hhcGUgPSBuZXdTaGFwZTtcbiAgICB9XG4gICAgYXNzZXJ0Tm90Q29tcGxleCh4LCAnbWF4Jyk7XG4gICAgYmFja2VuZF91dGlsLmFzc2VydEF4ZXNBcmVJbm5lck1vc3REaW1zKCdtYXgnLCBheGVzLCB4UmFuayk7XG4gICAgY29uc3QgW21heE91dFNoYXBlLCByZWR1Y2VTaGFwZV0gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZU91dEFuZFJlZHVjZVNoYXBlcyh4U2hhcGUsIGF4ZXMpO1xuICAgIGNvbnN0IHJlZHVjZVNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUocmVkdWNlU2hhcGUpO1xuICAgIGNvbnN0IHJlc3VsdCA9IG1heEltcGwoeFZhbHMsIHJlZHVjZVNpemUsIG1heE91dFNoYXBlLCB4LmR0eXBlKTtcbiAgICBjb25zdCBkYXRhSWQgPSBjcHVCYWNrZW5kLndyaXRlKHJlc3VsdCwgbWF4T3V0U2hhcGUsIHguZHR5cGUpO1xuICAgIGxldCBvdXRTaGFwZSA9IG1heE91dFNoYXBlO1xuICAgIGlmIChrZWVwRGltcykge1xuICAgICAgICAvLyByZXNoYXBlXG4gICAgICAgIGNvbnN0IG5ld1NoYXBlID0gYmFja2VuZF91dGlsLmV4cGFuZFNoYXBlVG9LZWVwRGltKG1heE91dFNoYXBlLCBvcmlnQXhlcyk7XG4gICAgICAgIG91dFNoYXBlID0gbmV3U2hhcGU7XG4gICAgfVxuICAgIHJldHVybiB7IGRhdGFJZCwgc2hhcGU6IG91dFNoYXBlLCBkdHlwZTogeC5kdHlwZSB9O1xufVxuZXhwb3J0IGNvbnN0IG1heENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBNYXgsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IG1heFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1heC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIE1heFBvb2wsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmltcG9ydCB7IHBvb2wgfSBmcm9tICcuLi91dGlscy9wb29sX3V0aWxzJztcbmltcG9ydCB7IGlkZW50aXR5IH0gZnJvbSAnLi9JZGVudGl0eSc7XG5leHBvcnQgZnVuY3Rpb24gbWF4UG9vbChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoeCwgJ21heFBvb2wnKTtcbiAgICBjb25zdCB7IGZpbHRlclNpemUsIHN0cmlkZXMsIHBhZCwgZGltUm91bmRpbmdNb2RlIH0gPSBhdHRycztcbiAgICBjb25zdCBkaWxhdGlvbnMgPSAxO1xuICAgIHV0aWwuYXNzZXJ0KGJhY2tlbmRfdXRpbC5laXRoZXJTdHJpZGVzT3JEaWxhdGlvbnNBcmVPbmUoc3RyaWRlcywgZGlsYXRpb25zKSwgKCkgPT4gJ0Vycm9yIGluIG1heFBvb2w6IEVpdGhlciBzdHJpZGVzIG9yIGRpbGF0aW9ucyBtdXN0IGJlIDEuICcgK1xuICAgICAgICBgR290IHN0cmlkZXMgJHtzdHJpZGVzfSBhbmQgZGlsYXRpb25zICcke2RpbGF0aW9uc30nYCk7XG4gICAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZVBvb2wyREluZm8oeC5zaGFwZSwgZmlsdGVyU2l6ZSwgc3RyaWRlcywgZGlsYXRpb25zLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSk7XG4gICAgbGV0IHJlcztcbiAgICBpZiAoY29udkluZm8uZmlsdGVyV2lkdGggPT09IDEgJiYgY29udkluZm8uZmlsdGVySGVpZ2h0ID09PSAxICYmXG4gICAgICAgIHV0aWwuYXJyYXlzRXF1YWwoY29udkluZm8uaW5TaGFwZSwgY29udkluZm8ub3V0U2hhcGUpKSB7XG4gICAgICAgIHJlcyA9IGlkZW50aXR5KHsgaW5wdXRzOiB7IHggfSwgYmFja2VuZCB9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IHhWYWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXM7XG4gICAgICAgIGNvbnN0IHN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKHguc2hhcGUpO1xuICAgICAgICBjb25zdCBidWZmZXIgPSBwb29sKHhWYWx1ZXMsIHguc2hhcGUsIHguZHR5cGUsIHN0cmlkZXMsIGNvbnZJbmZvLCAnbWF4Jyk7XG4gICAgICAgIHJlcyA9IGJhY2tlbmQubWFrZVRlbnNvckluZm8oY29udkluZm8ub3V0U2hhcGUsIHguZHR5cGUsIGJ1ZmZlci52YWx1ZXMpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufVxuZXhwb3J0IGNvbnN0IG1heFBvb2xDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTWF4UG9vbCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogbWF4UG9vbFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1heFBvb2wuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBNYXhQb29sM0QsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmltcG9ydCB7IHBvb2wzZCB9IGZyb20gJy4uL3V0aWxzL3Bvb2xfdXRpbHMnO1xuZXhwb3J0IGZ1bmN0aW9uIG1heFBvb2wzRChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgZmlsdGVyU2l6ZSwgc3RyaWRlcywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIGRhdGFGb3JtYXQgfSA9IGF0dHJzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoeCwgJ21heFBvb2wzZCcpO1xuICAgIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVQb29sM0RJbmZvKHguc2hhcGUsIGZpbHRlclNpemUsIHN0cmlkZXMsIDEgLyogZGlsYXRpb25zICovLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSwgZGF0YUZvcm1hdCk7XG4gICAgY29uc3QgeFZhbHVlcyA9IGJhY2tlbmQuZGF0YS5nZXQoeC5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCBvdXRCdWYgPSBwb29sM2QoeFZhbHVlcywgeC5zaGFwZSwgeC5kdHlwZSwgdXRpbC5jb21wdXRlU3RyaWRlcyh4LnNoYXBlKSwgY29udkluZm8sICdtYXgnKTtcbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRCdWYuc2hhcGUsICdmbG9hdDMyJywgb3V0QnVmLnZhbHVlcyk7XG59XG5leHBvcnQgY29uc3QgbWF4UG9vbDNEQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IE1heFBvb2wzRCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogbWF4UG9vbDNEXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TWF4UG9vbDNELmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgYnVmZmVyLCBNYXhQb29sM0RHcmFkIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5pbXBvcnQgeyBtYXhQb29sM2RQb3NpdGlvbnMgfSBmcm9tICcuLi91dGlscy9wb29sX3V0aWxzJztcbmV4cG9ydCBmdW5jdGlvbiBtYXhQb29sM0RHcmFkKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBkeSwgaW5wdXQgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGZpbHRlclNpemUsIHN0cmlkZXMsIHBhZCwgZGltUm91bmRpbmdNb2RlIH0gPSBhdHRycztcbiAgICBhc3NlcnROb3RDb21wbGV4KFtkeSwgaW5wdXRdLCAnbWF4UG9vbDNER3JhZCcpO1xuICAgIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVQb29sM0RJbmZvKGlucHV0LnNoYXBlLCBmaWx0ZXJTaXplLCBzdHJpZGVzLCAxIC8qIGRpbGF0aW9ucyAqLywgcGFkLCBkaW1Sb3VuZGluZ01vZGUpO1xuICAgIGNvbnN0IGlucHV0QnVmID0gYmFja2VuZC5idWZmZXJTeW5jKGlucHV0KTtcbiAgICBjb25zdCBtYXhQb3NCdWYgPSBtYXhQb29sM2RQb3NpdGlvbnMoaW5wdXRCdWYsIGNvbnZJbmZvKTtcbiAgICBjb25zdCBzdHJpZGVEZXB0aCA9IGNvbnZJbmZvLnN0cmlkZURlcHRoO1xuICAgIGNvbnN0IHN0cmlkZUhlaWdodCA9IGNvbnZJbmZvLnN0cmlkZUhlaWdodDtcbiAgICBjb25zdCBzdHJpZGVXaWR0aCA9IGNvbnZJbmZvLnN0cmlkZVdpZHRoO1xuICAgIGNvbnN0IGRpbGF0aW9uRGVwdGggPSBjb252SW5mby5kaWxhdGlvbkRlcHRoO1xuICAgIGNvbnN0IGRpbGF0aW9uSGVpZ2h0ID0gY29udkluZm8uZGlsYXRpb25IZWlnaHQ7XG4gICAgY29uc3QgZGlsYXRpb25XaWR0aCA9IGNvbnZJbmZvLmRpbGF0aW9uV2lkdGg7XG4gICAgY29uc3QgZWZmZWN0aXZlRmlsdGVyRGVwdGggPSBjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJEZXB0aDtcbiAgICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgPSBjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJIZWlnaHQ7XG4gICAgY29uc3QgZWZmZWN0aXZlRmlsdGVyV2lkdGggPSBjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJXaWR0aDtcbiAgICBjb25zdCBwYWRGcm9udCA9IGVmZmVjdGl2ZUZpbHRlckRlcHRoIC0gMSAtIGNvbnZJbmZvLnBhZEluZm8uZnJvbnQ7XG4gICAgY29uc3QgcGFkTGVmdCA9IGVmZmVjdGl2ZUZpbHRlcldpZHRoIC0gMSAtIGNvbnZJbmZvLnBhZEluZm8ubGVmdDtcbiAgICBjb25zdCBwYWRUb3AgPSBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgLSAxIC0gY29udkluZm8ucGFkSW5mby50b3A7XG4gICAgY29uc3QgZHggPSBidWZmZXIoaW5wdXQuc2hhcGUsICdmbG9hdDMyJyk7XG4gICAgY29uc3QgZHlCdWYgPSBiYWNrZW5kLmJ1ZmZlclN5bmMoZHkpO1xuICAgIGZvciAobGV0IGJhdGNoID0gMDsgYmF0Y2ggPCBjb252SW5mby5iYXRjaFNpemU7ICsrYmF0Y2gpIHtcbiAgICAgICAgZm9yIChsZXQgY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBjb252SW5mby5pbkNoYW5uZWxzOyArK2NoYW5uZWwpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGR4RGVwdGggPSAwOyBkeERlcHRoIDwgY29udkluZm8uaW5EZXB0aDsgKytkeERlcHRoKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgZHhSb3cgPSAwOyBkeFJvdyA8IGNvbnZJbmZvLmluSGVpZ2h0OyArK2R4Um93KSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGR4Q29sID0gMDsgZHhDb2wgPCBjb252SW5mby5pbldpZHRoOyArK2R4Q29sKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTaGFkZXIgY29kZSBiZWdpbnNcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGR5RGVwdGhDb3JuZXIgPSBkeERlcHRoIC0gcGFkRnJvbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkeVJvd0Nvcm5lciA9IGR4Um93IC0gcGFkVG9wO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZHlDb2xDb3JuZXIgPSBkeENvbCAtIHBhZExlZnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZG90UHJvZCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB3RGVwdGggPSAwOyB3RGVwdGggPCBlZmZlY3RpdmVGaWx0ZXJEZXB0aDsgd0RlcHRoICs9IGRpbGF0aW9uRGVwdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkeURlcHRoID0gKGR5RGVwdGhDb3JuZXIgKyB3RGVwdGgpIC8gc3RyaWRlRGVwdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR5RGVwdGggPCAwIHx8IGR5RGVwdGggPj0gY29udkluZm8ub3V0RGVwdGggfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5mbG9vcihkeURlcHRoKSAhPT0gZHlEZXB0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgd1JvdyA9IDA7IHdSb3cgPCBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQ7IHdSb3cgKz0gZGlsYXRpb25IZWlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZHlSb3cgPSAoZHlSb3dDb3JuZXIgKyB3Um93KSAvIHN0cmlkZUhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR5Um93IDwgMCB8fCBkeVJvdyA+PSBjb252SW5mby5vdXRIZWlnaHQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3IoZHlSb3cpICE9PSBkeVJvdykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgd0NvbCA9IDA7IHdDb2wgPCBlZmZlY3RpdmVGaWx0ZXJXaWR0aDsgd0NvbCArPSBkaWxhdGlvbldpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkeUNvbCA9IChkeUNvbENvcm5lciArIHdDb2wpIC8gc3RyaWRlV2lkdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHlDb2wgPCAwIHx8IGR5Q29sID49IGNvbnZJbmZvLm91dFdpZHRoIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5mbG9vcihkeUNvbCkgIT09IGR5Q29sKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXhQb3MgPSBlZmZlY3RpdmVGaWx0ZXJEZXB0aCAqIGVmZmVjdGl2ZUZpbHRlckhlaWdodCAqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0aXZlRmlsdGVyV2lkdGggLVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgLVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFBvc0J1Zi5nZXQoYmF0Y2gsIGR5RGVwdGgsIGR5Um93LCBkeUNvbCwgY2hhbm5lbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJQb3MgPSB3RGVwdGggKiBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgKiBlZmZlY3RpdmVGaWx0ZXJXaWR0aCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd1JvdyAqIGVmZmVjdGl2ZUZpbHRlcldpZHRoICsgd0NvbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hc2sgPSBtYXhQb3MgPT09IGN1clBvcyA/IDEgOiAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hc2sgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBpeGVsID0gZHlCdWYuZ2V0KGJhdGNoLCBkeURlcHRoLCBkeVJvdywgZHlDb2wsIGNoYW5uZWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG90UHJvZCArPSBwaXhlbCAqIG1hc2s7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBkeC5zZXQoZG90UHJvZCwgYmF0Y2gsIGR4RGVwdGgsIGR4Um93LCBkeENvbCwgY2hhbm5lbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oZHguc2hhcGUsIGR4LmR0eXBlLCBkeC52YWx1ZXMpO1xufVxuZXhwb3J0IGNvbnN0IG1heFBvb2wzREdyYWRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTWF4UG9vbDNER3JhZCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogbWF4UG9vbDNER3JhZFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1heFBvb2wzREdyYWQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBidWZmZXIsIE1heFBvb2xHcmFkIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5pbXBvcnQgeyBtYXhQb29sUG9zaXRpb25zIH0gZnJvbSAnLi4vdXRpbHMvcG9vbF91dGlscyc7XG5leHBvcnQgZnVuY3Rpb24gbWF4UG9vbEdyYWQoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IGR5LCBpbnB1dCwgb3V0cHV0IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeCA9IGlucHV0O1xuICAgIGFzc2VydE5vdENvbXBsZXgoW2lucHV0LCBvdXRwdXRdLCAnbWF4UG9vbEdyYWQnKTtcbiAgICBjb25zdCB7IGZpbHRlclNpemUsIHN0cmlkZXMsIHBhZCwgZGltUm91bmRpbmdNb2RlIH0gPSBhdHRycztcbiAgICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlUG9vbDJESW5mbyh4LnNoYXBlLCBmaWx0ZXJTaXplLCBzdHJpZGVzLCAxIC8qIGRpbGF0aW9ucyAqLywgcGFkLCBkaW1Sb3VuZGluZ01vZGUpO1xuICAgIGNvbnN0IHhWYWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgbWF4UG9zQnVmID0gYnVmZmVyKGNvbnZJbmZvLm91dFNoYXBlLCB4LmR0eXBlLCBtYXhQb29sUG9zaXRpb25zKHhWYWx1ZXMsIHguc2hhcGUsIHguZHR5cGUsIGNvbnZJbmZvKS52YWx1ZXMpO1xuICAgIGNvbnN0IHN0cmlkZUhlaWdodCA9IGNvbnZJbmZvLnN0cmlkZUhlaWdodDtcbiAgICBjb25zdCBzdHJpZGVXaWR0aCA9IGNvbnZJbmZvLnN0cmlkZVdpZHRoO1xuICAgIGNvbnN0IGRpbGF0aW9uSGVpZ2h0ID0gY29udkluZm8uZGlsYXRpb25IZWlnaHQ7XG4gICAgY29uc3QgZGlsYXRpb25XaWR0aCA9IGNvbnZJbmZvLmRpbGF0aW9uV2lkdGg7XG4gICAgY29uc3QgZWZmZWN0aXZlRmlsdGVySGVpZ2h0ID0gY29udkluZm8uZWZmZWN0aXZlRmlsdGVySGVpZ2h0O1xuICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlcldpZHRoID0gY29udkluZm8uZWZmZWN0aXZlRmlsdGVyV2lkdGg7XG4gICAgY29uc3QgcGFkTGVmdCA9IGVmZmVjdGl2ZUZpbHRlcldpZHRoIC0gMSAtIGNvbnZJbmZvLnBhZEluZm8ubGVmdDtcbiAgICBjb25zdCBwYWRUb3AgPSBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgLSAxIC0gY29udkluZm8ucGFkSW5mby50b3A7XG4gICAgY29uc3QgZHggPSBidWZmZXIoeC5zaGFwZSwgJ2Zsb2F0MzInKTtcbiAgICBjb25zdCBkeURhdGEgPSBiYWNrZW5kLmRhdGEuZ2V0KGR5LmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IGR5QnVmID0gYnVmZmVyKGR5LnNoYXBlLCAnZmxvYXQzMicsIGR5RGF0YSk7XG4gICAgZm9yIChsZXQgYiA9IDA7IGIgPCBjb252SW5mby5iYXRjaFNpemU7ICsrYikge1xuICAgICAgICBmb3IgKGxldCBkID0gMDsgZCA8IGNvbnZJbmZvLmluQ2hhbm5lbHM7ICsrZCkge1xuICAgICAgICAgICAgZm9yIChsZXQgZHhSID0gMDsgZHhSIDwgY29udkluZm8uaW5IZWlnaHQ7ICsrZHhSKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgZHhDID0gMDsgZHhDIDwgY29udkluZm8uaW5XaWR0aDsgKytkeEMpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2hhZGVyIGNvZGUgYmVnaW5zLlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkeVJDb3JuZXIgPSBkeFIgLSBwYWRUb3A7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGR5Q0Nvcm5lciA9IGR4QyAtIHBhZExlZnQ7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkb3RQcm9kID0gMDtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgd1IgPSAwOyB3UiA8IGVmZmVjdGl2ZUZpbHRlckhlaWdodDsgd1IgKz0gZGlsYXRpb25IZWlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGR5UiA9IChkeVJDb3JuZXIgKyB3UikgLyBzdHJpZGVIZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHlSIDwgMCB8fCBkeVIgPj0gY29udkluZm8ub3V0SGVpZ2h0IHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5mbG9vcihkeVIpICE9PSBkeVIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHdDID0gMDsgd0MgPCBlZmZlY3RpdmVGaWx0ZXJXaWR0aDsgd0MgKz0gZGlsYXRpb25XaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGR5QyA9IChkeUNDb3JuZXIgKyB3QykgLyBzdHJpZGVXaWR0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHlDIDwgMCB8fCBkeUMgPj0gY29udkluZm8ub3V0V2lkdGggfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5mbG9vcihkeUMpICE9PSBkeUMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1heFBvcyA9IGVmZmVjdGl2ZUZpbHRlckhlaWdodCAqIGVmZmVjdGl2ZUZpbHRlcldpZHRoIC0gMSAtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFBvc0J1Zi5nZXQoYiwgZHlSLCBkeUMsIGQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1clBvcyA9IHdSICogZWZmZWN0aXZlRmlsdGVyV2lkdGggKyB3QztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXNrID0gbWF4UG9zID09PSBjdXJQb3MgPyAxIDogMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFzayA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGl4ZWwgPSBkeUJ1Zi5nZXQoYiwgZHlSLCBkeUMsIGQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdFByb2QgKz0gcGl4ZWwgKiBtYXNrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGR4LnNldChkb3RQcm9kLCBiLCBkeFIsIGR4QywgZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKGR4LnNoYXBlLCBkeC5kdHlwZSwgZHgudmFsdWVzKTtcbn1cbmV4cG9ydCBjb25zdCBtYXhQb29sR3JhZENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBNYXhQb29sR3JhZCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogbWF4UG9vbEdyYWRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1NYXhQb29sR3JhZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBNYXhQb29sV2l0aEFyZ21heCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmltcG9ydCB7IG1heFBvb2xXaXRoQXJnbWF4SW1wbCB9IGZyb20gJy4vTWF4UG9vbFdpdGhBcmdtYXhfaW1wbCc7XG5leHBvcnQgY29uc3QgbWF4UG9vbFdpdGhBcmdtYXhDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTWF4UG9vbFdpdGhBcmdtYXgsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6ICh7IGlucHV0cywgYXR0cnMsIGJhY2tlbmQgfSkgPT4ge1xuICAgICAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICAgICAgY29uc3QgeyBmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWQsIGluY2x1ZGVCYXRjaEluSW5kZXggfSA9IGF0dHJzO1xuICAgICAgICBjb25zdCBjcHVCYWNrZW5kID0gYmFja2VuZDtcbiAgICAgICAgYXNzZXJ0Tm90Q29tcGxleCh4LCAnTWF4UG9vbFdpdGhBcmdtYXgnKTtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gY3B1QmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzO1xuICAgICAgICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlUG9vbDJESW5mbyh4LnNoYXBlLCBmaWx0ZXJTaXplLCBzdHJpZGVzLCBbMSwgMV0sIHBhZCk7XG4gICAgICAgIGNvbnN0IFtwb29sZWQsIGluZGV4ZXNdID0gbWF4UG9vbFdpdGhBcmdtYXhJbXBsKHZhbHVlcywgeC5zaGFwZSwgeC5kdHlwZSwgaW5jbHVkZUJhdGNoSW5JbmRleCwgY29udkluZm8pO1xuICAgICAgICBjb25zdCBwb29sZWREYXRhSWQgPSBjcHVCYWNrZW5kLndyaXRlKHBvb2xlZCwgY29udkluZm8ub3V0U2hhcGUsIHguZHR5cGUpO1xuICAgICAgICBjb25zdCBpbmRleGVzRGF0YUlkID0gY3B1QmFja2VuZC53cml0ZShpbmRleGVzLCBjb252SW5mby5vdXRTaGFwZSwgeC5kdHlwZSk7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICB7IGRhdGFJZDogcG9vbGVkRGF0YUlkLCBzaGFwZTogY29udkluZm8ub3V0U2hhcGUsIGR0eXBlOiB4LmR0eXBlIH0sXG4gICAgICAgICAgICB7IGRhdGFJZDogaW5kZXhlc0RhdGFJZCwgc2hhcGU6IGNvbnZJbmZvLm91dFNoYXBlLCBkdHlwZTogJ2ludDMyJyB9XG4gICAgICAgIF07XG4gICAgfVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1heFBvb2xXaXRoQXJnbWF4LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgbWF4UG9vbFBvc2l0aW9ucywgcG9vbCB9IGZyb20gJy4uL3V0aWxzL3Bvb2xfdXRpbHMnO1xuZXhwb3J0IGZ1bmN0aW9uIG1heFBvb2xXaXRoQXJnbWF4SW1wbCh4VmFsdWVzLCB4U2hhcGUsIGR0eXBlLCBpbmNsdWRlQmF0Y2hJbkluZGV4LCBjb252SW5mbykge1xuICAgIGNvbnN0IHN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKHhTaGFwZSk7XG4gICAgY29uc3QgbWF4UG9vbHMgPSBwb29sKHhWYWx1ZXMsIHhTaGFwZSwgZHR5cGUsIHN0cmlkZXMsIGNvbnZJbmZvLCAnbWF4Jyk7XG4gICAgY29uc3QgbWF4UG9zaXRpb25zID0gbWF4UG9vbFBvc2l0aW9ucyh4VmFsdWVzLCB4U2hhcGUsIGR0eXBlLCBjb252SW5mbywgdHJ1ZSwgaW5jbHVkZUJhdGNoSW5JbmRleCk7XG4gICAgcmV0dXJuIFttYXhQb29scy52YWx1ZXMsIG1heFBvc2l0aW9ucy52YWx1ZXNdO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TWF4UG9vbFdpdGhBcmdtYXhfaW1wbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmV4cG9ydCBmdW5jdGlvbiBtYXhJbXBsKGFWYWxzLCByZWR1Y2VTaXplLCBvdXRTaGFwZSwgZHR5cGUpIHtcbiAgICBjb25zdCB2YWxzID0gdXRpbC5nZXRUeXBlZEFycmF5RnJvbURUeXBlKGR0eXBlLCB1dGlsLnNpemVGcm9tU2hhcGUob3V0U2hhcGUpKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gaSAqIHJlZHVjZVNpemU7XG4gICAgICAgIGxldCBtYXggPSBhVmFsc1tvZmZzZXRdO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHJlZHVjZVNpemU7ICsraikge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBhVmFsc1tvZmZzZXQgKyBqXTtcbiAgICAgICAgICAgIGlmIChOdW1iZXIuaXNOYU4odmFsdWUpIHx8XG4gICAgICAgICAgICAgICAgdmFsdWUgPiBtYXgpIHsgLy8gY29tcGFyaXNvbiB3aXRoIE5hTiBhbHdheXMgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICAgICAgbWF4ID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFsc1tpXSA9IG1heDtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHM7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1NYXhfaW1wbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBNYXhpbXVtIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGwgfSBmcm9tICcuLi91dGlscy9iaW5hcnlfaW1wbCc7XG5pbXBvcnQgeyBiaW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCBtYXhpbXVtSW1wbCA9IGNyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGwoKChhVmFsdWUsIGJWYWx1ZSkgPT4gTWF0aC5tYXgoYVZhbHVlLCBiVmFsdWUpKSk7XG5leHBvcnQgY29uc3QgbWF4aW11bSA9IGJpbmFyeUtlcm5lbEZ1bmMoTWF4aW11bSwgbWF4aW11bUltcGwpO1xuZXhwb3J0IGNvbnN0IG1heGltdW1Db25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTWF4aW11bSxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogbWF4aW11bVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1heGltdW0uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBNZWFuLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNhc3QgfSBmcm9tICcuL0Nhc3QnO1xuaW1wb3J0IHsgZGl2IH0gZnJvbSAnLi9SZWFsRGl2JztcbmltcG9ydCB7IHN1bSB9IGZyb20gJy4vU3VtJztcbmV4cG9ydCBmdW5jdGlvbiBtZWFuKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBheGlzLCBrZWVwRGltcyB9ID0gYXR0cnM7XG4gICAgY29uc3QgYXhlcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oYXhpcywgeC5zaGFwZSk7XG4gICAgY29uc3Qgc2hhcGVzID0gYmFja2VuZF91dGlsLmNvbXB1dGVPdXRBbmRSZWR1Y2VTaGFwZXMoeC5zaGFwZSwgYXhlcyk7XG4gICAgY29uc3QgcmVkdWNlU2hhcGUgPSBzaGFwZXNbMV07XG4gICAgY29uc3QgcmVkdWNlU2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShyZWR1Y2VTaGFwZSk7XG4gICAgY29uc3QgdG9EaXNwb3NlID0gW107XG4gICAgY29uc3QgcmVkdWNlU2l6ZVNjYWxhciA9IGJhY2tlbmQubWFrZVRlbnNvckluZm8oW10sICdmbG9hdDMyJywgbmV3IEZsb2F0MzJBcnJheShbcmVkdWNlU2l6ZV0pKTtcbiAgICB0b0Rpc3Bvc2UucHVzaChyZWR1Y2VTaXplU2NhbGFyKTtcbiAgICBjb25zdCAkeCA9IGNhc3QoeyBpbnB1dHM6IHsgeCB9LCBiYWNrZW5kLCBhdHRyczogeyBkdHlwZTogJ2Zsb2F0MzInIH0gfSk7XG4gICAgdG9EaXNwb3NlLnB1c2goJHgpO1xuICAgIGNvbnN0IHJlcyA9IGRpdih7IGlucHV0czogeyBhOiAkeCwgYjogcmVkdWNlU2l6ZVNjYWxhciB9LCBiYWNrZW5kIH0pO1xuICAgIHRvRGlzcG9zZS5wdXNoKHJlcyk7XG4gICAgY29uc3QgcmVzdWx0ID0gc3VtKHsgaW5wdXRzOiB7IHg6IHJlcyB9LCBiYWNrZW5kLCBhdHRyczogeyBheGlzLCBrZWVwRGltcyB9IH0pO1xuICAgIHRvRGlzcG9zZS5mb3JFYWNoKHQgPT4gYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh0KSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydCBjb25zdCBtZWFuQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IE1lYW4sXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IG1lYW5cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1NZWFuLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgTWluLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9SZXNoYXBlJztcbmltcG9ydCB7IHRyYW5zcG9zZSB9IGZyb20gJy4vVHJhbnNwb3NlJztcbmV4cG9ydCBmdW5jdGlvbiBtaW4oYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGF4aXMsIGtlZXBEaW1zIH0gPSBhdHRycztcbiAgICBhc3NlcnROb3RDb21wbGV4KHgsICdtaW4nKTtcbiAgICBjb25zdCBvcmlnQXhlcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oYXhpcywgeC5zaGFwZSk7XG4gICAgbGV0IGF4ZXMgPSBvcmlnQXhlcztcbiAgICBjb25zdCBwZXJtdXRlZEF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0QXhlc1Blcm11dGF0aW9uKGF4ZXMsIHguc2hhcGUubGVuZ3RoKTtcbiAgICBsZXQgJHggPSB4O1xuICAgIGlmIChwZXJtdXRlZEF4ZXMgIT0gbnVsbCkge1xuICAgICAgICAkeCA9IHRyYW5zcG9zZSh7IGlucHV0czogeyB4IH0sIGJhY2tlbmQsIGF0dHJzOiB7IHBlcm06IHBlcm11dGVkQXhlcyB9IH0pO1xuICAgICAgICBheGVzID0gYmFja2VuZF91dGlsLmdldElubmVyTW9zdEF4ZXMoYXhlcy5sZW5ndGgsIHguc2hhcGUubGVuZ3RoKTtcbiAgICB9XG4gICAgYmFja2VuZF91dGlsLmFzc2VydEF4ZXNBcmVJbm5lck1vc3REaW1zKCdtaW4nLCBheGVzLCAkeC5zaGFwZS5sZW5ndGgpO1xuICAgIGNvbnN0IFtvdXRTaGFwZSwgcmVkdWNlU2hhcGVdID0gYmFja2VuZF91dGlsLmNvbXB1dGVPdXRBbmRSZWR1Y2VTaGFwZXMoJHguc2hhcGUsIGF4ZXMpO1xuICAgIGNvbnN0IHJlZHVjZVNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUocmVkdWNlU2hhcGUpO1xuICAgIGNvbnN0IHZhbHMgPSB1dGlsLm1ha2VaZXJvc1R5cGVkQXJyYXkodXRpbC5zaXplRnJvbVNoYXBlKG91dFNoYXBlKSwgJHguZHR5cGUpO1xuICAgIGNvbnN0IGFWYWxzID0gYmFja2VuZC5kYXRhLmdldCgkeC5kYXRhSWQpLnZhbHVlcztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gaSAqIHJlZHVjZVNpemU7XG4gICAgICAgIGxldCBtaW4gPSBhVmFsc1tvZmZzZXRdO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHJlZHVjZVNpemU7ICsraikge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBhVmFsc1tvZmZzZXQgKyBqXTtcbiAgICAgICAgICAgIGlmIChOdW1iZXIuaXNOYU4odmFsdWUpIHx8XG4gICAgICAgICAgICAgICAgdmFsdWUgPCBtaW4pIHsgLy8gY29tcGFyaXNvbiB3aXRoIE5hTiBhbHdheXMgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICAgICAgbWluID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFsc1tpXSA9IG1pbjtcbiAgICB9XG4gICAgaWYgKHBlcm11dGVkQXhlcyAhPSBudWxsKSB7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oJHgpO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dFNoYXBlLCAkeC5kdHlwZSwgdmFscyk7XG4gICAgaWYgKGtlZXBEaW1zKSB7XG4gICAgICAgIGNvbnN0IGV4cGFuZGVkU2hhcGUgPSBiYWNrZW5kX3V0aWwuZXhwYW5kU2hhcGVUb0tlZXBEaW0ob3V0U2hhcGUsIG9yaWdBeGVzKTtcbiAgICAgICAgY29uc3QgcmVzaGFwZWRSZXN1bHQgPSByZXNoYXBlKHsgaW5wdXRzOiB7IHg6IHJlc3VsdCB9LCBiYWNrZW5kLCBhdHRyczogeyBzaGFwZTogZXhwYW5kZWRTaGFwZSB9IH0pO1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlc3VsdCk7XG4gICAgICAgIHJldHVybiByZXNoYXBlZFJlc3VsdDtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydCBjb25zdCBtaW5Db25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTWluLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBtaW5cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1NaW4uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgTWluaW11bSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsIH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X2ltcGwnO1xuaW1wb3J0IHsgYmluYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV91dGlscyc7XG5leHBvcnQgY29uc3QgbWluaW11bUltcGwgPSBjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsKCgoYVZhbHVlLCBiVmFsdWUpID0+IE1hdGgubWluKGFWYWx1ZSwgYlZhbHVlKSkpO1xuZXhwb3J0IGNvbnN0IG1pbmltdW0gPSBiaW5hcnlLZXJuZWxGdW5jKE1pbmltdW0sIG1pbmltdW1JbXBsKTtcbmV4cG9ydCBjb25zdCBtaW5pbXVtQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IE1pbmltdW0sXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IG1pbmltdW1cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1NaW5pbXVtLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IE1pcnJvclBhZCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIG1pcnJvclBhZChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgcGFkZGluZ3MsIG1vZGUgfSA9IGF0dHJzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoeCwgJ21pcnJvclBhZCcpO1xuICAgIGNvbnN0IG91dFNoYXBlID0gcGFkZGluZ3MubWFwKChwLCBpKSA9PiBwWzBdIC8qIGJlZm9yZVBhZCAqLyArIHguc2hhcGVbaV0gKyBwWzFdIC8qIGFmdGVyUGFkICovKTtcbiAgICBjb25zdCBzdGFydCA9IHBhZGRpbmdzLm1hcChwID0+IHBbMF0pO1xuICAgIGNvbnN0IGVuZCA9IHBhZGRpbmdzLm1hcCgocCwgaSkgPT4gcFswXSArIHguc2hhcGVbaV0pO1xuICAgIGNvbnN0IG9mZnNldCA9IG1vZGUgPT09ICdyZWZsZWN0JyA/IDAgOiAxO1xuICAgIGNvbnN0IHhWYWxzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IHhSYW5rID0geC5zaGFwZS5sZW5ndGg7XG4gICAgY29uc3QgeFN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKHguc2hhcGUpO1xuICAgIGNvbnN0IHJlc3VsdFNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUob3V0U2hhcGUpO1xuICAgIGNvbnN0IHJlc3VsdFJhbmsgPSBvdXRTaGFwZS5sZW5ndGg7XG4gICAgY29uc3QgcmVzdWx0U3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMob3V0U2hhcGUpO1xuICAgIGNvbnN0IHJlc1ZhbHMgPSB1dGlsLmdldFR5cGVkQXJyYXlGcm9tRFR5cGUoeC5kdHlwZSwgcmVzdWx0U2l6ZSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHRTaXplOyBpKyspIHtcbiAgICAgICAgbGV0IGNvb3JkcyA9IHV0aWwuaW5kZXhUb0xvYyhpLCByZXN1bHRSYW5rLCByZXN1bHRTdHJpZGVzKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHRSYW5rOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChjb29yZHNbaV0gPCBzdGFydFtpXSkge1xuICAgICAgICAgICAgICAgIGNvb3Jkc1tpXSA9IHN0YXJ0W2ldICogMiAtIGNvb3Jkc1tpXSAtIG9mZnNldDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNvb3Jkc1tpXSA+PSBlbmRbaV0pIHtcbiAgICAgICAgICAgICAgICBjb29yZHNbaV0gPSAoZW5kW2ldIC0gMSkgKiAyIC0gY29vcmRzW2ldICsgb2Zmc2V0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvb3JkcyA9IGNvb3Jkcy5tYXAoKGMsIGkpID0+IGMgLSBzdGFydFtpXSk7XG4gICAgICAgIGNvbnN0IGluSW5kZXggPSB1dGlsLmxvY1RvSW5kZXgoY29vcmRzLCB4UmFuaywgeFN0cmlkZXMpO1xuICAgICAgICByZXNWYWxzW2ldID0geFZhbHNbaW5JbmRleF07XG4gICAgfVxuICAgIGNvbnN0IG91dElkID0gYmFja2VuZC53cml0ZShyZXNWYWxzLCBvdXRTaGFwZSwgeC5kdHlwZSk7XG4gICAgcmV0dXJuIHsgZGF0YUlkOiBvdXRJZCwgc2hhcGU6IG91dFNoYXBlLCBkdHlwZTogeC5kdHlwZSB9O1xufVxuZXhwb3J0IGNvbnN0IG1pcnJvclBhZENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBNaXJyb3JQYWQsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IG1pcnJvclBhZFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1pcnJvclBhZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBNb2QgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCB9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV9pbXBsJztcbmltcG9ydCB7IGJpbmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy9iaW5hcnlfdXRpbHMnO1xuZXhwb3J0IGNvbnN0IG1vZEltcGwgPSBjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsKCgoYVZhbHVlLCBiVmFsdWUpID0+IHtcbiAgICBjb25zdCByZW0gPSBhVmFsdWUgJSBiVmFsdWU7XG4gICAgaWYgKChhVmFsdWUgPCAwICYmIGJWYWx1ZSA8IDApIHx8IChhVmFsdWUgPj0gMCAmJiBiVmFsdWUgPj0gMCkpIHtcbiAgICAgICAgcmV0dXJuIHJlbTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiAocmVtICsgYlZhbHVlKSAlIGJWYWx1ZTtcbiAgICB9XG59KSk7XG5leHBvcnQgY29uc3QgbW9kID0gYmluYXJ5S2VybmVsRnVuYyhNb2QsIG1vZEltcGwpO1xuZXhwb3J0IGNvbnN0IG1vZENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBNb2QsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IG1vZFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1vZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBNdWx0aW5vbWlhbCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgKiBhcyBzZWVkcmFuZG9tIGZyb20gJ3NlZWRyYW5kb20nO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmltcG9ydCB7IHNvZnRtYXggfSBmcm9tICcuL1NvZnRtYXgnO1xuZXhwb3J0IGZ1bmN0aW9uIG11bHRpbm9taWFsKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBsb2dpdHMgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IG51bVNhbXBsZXMsIHNlZWQsIG5vcm1hbGl6ZWQgfSA9IGF0dHJzO1xuICAgIGFzc2VydE5vdENvbXBsZXgobG9naXRzLCAnbXVsdGlub21pYWwnKTtcbiAgICBjb25zdCBwcm9iYWJpbGl0aWVzID0gbm9ybWFsaXplZCA/XG4gICAgICAgIGxvZ2l0cyA6XG4gICAgICAgIHNvZnRtYXgoeyBpbnB1dHM6IHsgbG9naXRzIH0sIGJhY2tlbmQsIGF0dHJzOiB7IGRpbTogLTEgfSB9KTtcbiAgICBjb25zdCBiYXRjaFNpemUgPSBwcm9iYWJpbGl0aWVzLnNoYXBlWzBdO1xuICAgIGNvbnN0IG51bUV2ZW50cyA9IHByb2JhYmlsaXRpZXMuc2hhcGVbMV07XG4gICAgY29uc3QgcHJvYlZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KHByb2JhYmlsaXRpZXMuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgcmVzU2hhcGUgPSBbYmF0Y2hTaXplLCBudW1TYW1wbGVzXTtcbiAgICBjb25zdCByZXNWYWxzID0gdXRpbC5tYWtlWmVyb3NUeXBlZEFycmF5KHV0aWwuc2l6ZUZyb21TaGFwZShyZXNTaGFwZSksICdpbnQzMicpO1xuICAgIGZvciAobGV0IGIgPSAwOyBiIDwgYmF0Y2hTaXplOyArK2IpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gYiAqIG51bUV2ZW50cztcbiAgICAgICAgLy8gVGhlIGNkZiB3b24ndCBpbmNsdWRlIHRoZSBsYXN0IGV2ZW50LiBJdCB3aWxsIGJlIGltcGxpY2l0IGlmIG5vIG90aGVyXG4gICAgICAgIC8vIGV2ZW50IGhhcHBlbmVkLlxuICAgICAgICBjb25zdCBjZGYgPSBuZXcgRmxvYXQzMkFycmF5KG51bUV2ZW50cyAtIDEpO1xuICAgICAgICBjZGZbMF0gPSBwcm9iVmFsc1tvZmZzZXRdO1xuICAgICAgICBmb3IgKGxldCBldmVudCA9IDE7IGV2ZW50IDwgY2RmLmxlbmd0aDsgKytldmVudCkge1xuICAgICAgICAgICAgY2RmW2V2ZW50XSA9IGNkZltldmVudCAtIDFdICsgcHJvYlZhbHNbb2Zmc2V0ICsgZXZlbnRdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJhbmRvbSA9IHNlZWRyYW5kb20uYWxlYShzZWVkLnRvU3RyaW5nKCkpO1xuICAgICAgICBjb25zdCBvdXRPZmZzZXQgPSBiICogbnVtU2FtcGxlcztcbiAgICAgICAgZm9yIChsZXQgc2FtcGxlSWQgPSAwOyBzYW1wbGVJZCA8IG51bVNhbXBsZXM7ICsrc2FtcGxlSWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHIgPSByYW5kb20oKTtcbiAgICAgICAgICAgIC8vIEFzc3VtZSBsYXN0IGV2ZW50IGhhcHBlbmVkIGJ5IGRlZmF1bHQuXG4gICAgICAgICAgICByZXNWYWxzW291dE9mZnNldCArIHNhbXBsZUlkXSA9IGNkZi5sZW5ndGg7XG4gICAgICAgICAgICBmb3IgKGxldCBldmVudCA9IDA7IGV2ZW50IDwgY2RmLmxlbmd0aDsgZXZlbnQrKykge1xuICAgICAgICAgICAgICAgIGlmIChyIDwgY2RmW2V2ZW50XSkge1xuICAgICAgICAgICAgICAgICAgICByZXNWYWxzW291dE9mZnNldCArIHNhbXBsZUlkXSA9IGV2ZW50O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFub3JtYWxpemVkKSB7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocHJvYmFiaWxpdGllcyk7XG4gICAgfVxuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHJlc1NoYXBlLCAnaW50MzInLCByZXNWYWxzKTtcbn1cbmV4cG9ydCBjb25zdCBtdWx0aW5vbWlhbENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBNdWx0aW5vbWlhbCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogbXVsdGlub21pYWxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1NdWx0aW5vbWlhbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBNdWx0aXBseSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsIH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X2ltcGwnO1xuaW1wb3J0IHsgYmluYXJ5S2VybmVsRnVuYywgY3JlYXRlQ29tcGxleEJpbmFyeUtlcm5lbEltcGwgfSBmcm9tICcuLi91dGlscy9iaW5hcnlfdXRpbHMnO1xuZXhwb3J0IGNvbnN0IG11bHRpcGx5SW1wbCA9IGNyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGwoKChhVmFsdWUsIGJWYWx1ZSkgPT4gYVZhbHVlICogYlZhbHVlKSk7XG5leHBvcnQgY29uc3QgbXVsdGlwbHlDb21wbGV4SW1wbCA9IGNyZWF0ZUNvbXBsZXhCaW5hcnlLZXJuZWxJbXBsKCgoYVJlYWwsIGFJbWFnLCBiUmVhbCwgYkltYWcpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgICByZWFsOiBhUmVhbCAqIGJSZWFsIC0gYUltYWcgKiBiSW1hZyxcbiAgICAgICAgaW1hZzogYVJlYWwgKiBiSW1hZyArIGFJbWFnICogYlJlYWxcbiAgICB9O1xufSkpO1xuZXhwb3J0IGNvbnN0IG11bHRpcGx5ID0gYmluYXJ5S2VybmVsRnVuYyhNdWx0aXBseSwgbXVsdGlwbHlJbXBsLCBtdWx0aXBseUNvbXBsZXhJbXBsKTtcbmV4cG9ydCBjb25zdCBtdWx0aXBseUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBNdWx0aXBseSxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogbXVsdGlwbHlcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1NdWx0aXBseS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBOZWcsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmltcG9ydCB7IG11bHRpcGx5SW1wbCB9IGZyb20gJy4vTXVsdGlwbHknO1xuZXhwb3J0IGZ1bmN0aW9uIG5lZ0ltcGwoeFZhbHMsIHhTaGFwZSwgeER0eXBlKSB7XG4gICAgY29uc3QgbWludXNPbmUgPSB1dGlsLmNyZWF0ZVNjYWxhclZhbHVlKC0xLCB4RHR5cGUpO1xuICAgIHJldHVybiBtdWx0aXBseUltcGwoW10sIHhTaGFwZSwgbWludXNPbmUsIHhWYWxzLCB4RHR5cGUpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG5lZyhhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleCh4LCAnbmVnJyk7XG4gICAgY29uc3QgeFZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgW3JlcywgbmV3U2hhcGVdID0gbmVnSW1wbCh4VmFscywgeC5zaGFwZSwgeC5kdHlwZSk7XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8obmV3U2hhcGUsIHguZHR5cGUsIHJlcyk7XG59XG5leHBvcnQgY29uc3QgbmVnQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IE5lZyxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogbmVnXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TmVnLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGtlcm5lbF9pbXBscywgTm9uTWF4U3VwcHJlc3Npb25WMyB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5jb25zdCBub25NYXhTdXBwcmVzc2lvblYzSW1wbCA9IGtlcm5lbF9pbXBscy5ub25NYXhTdXBwcmVzc2lvblYzSW1wbDtcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5leHBvcnQgZnVuY3Rpb24gbm9uTWF4U3VwcHJlc3Npb25WMyhhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgYm94ZXMsIHNjb3JlcyB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgbWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLCBzY29yZVRocmVzaG9sZCB9ID0gYXR0cnM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleChib3hlcywgJ05vbk1heFN1cHByZXNzaW9uJyk7XG4gICAgY29uc3QgYm94ZXNWYWxzID0gYmFja2VuZC5kYXRhLmdldChib3hlcy5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCBzY29yZXNWYWxzID0gYmFja2VuZC5kYXRhLmdldChzY29yZXMuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgeyBzZWxlY3RlZEluZGljZXMgfSA9IG5vbk1heFN1cHByZXNzaW9uVjNJbXBsKGJveGVzVmFscywgc2NvcmVzVmFscywgbWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLCBzY29yZVRocmVzaG9sZCk7XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oW3NlbGVjdGVkSW5kaWNlcy5sZW5ndGhdLCAnaW50MzInLCBuZXcgSW50MzJBcnJheShzZWxlY3RlZEluZGljZXMpKTtcbn1cbmV4cG9ydCBjb25zdCBub25NYXhTdXBwcmVzc2lvblYzQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IE5vbk1heFN1cHByZXNzaW9uVjMsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IG5vbk1heFN1cHByZXNzaW9uVjNcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Ob25NYXhTdXBwcmVzc2lvblYzLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGtlcm5lbF9pbXBscywgTm9uTWF4U3VwcHJlc3Npb25WNCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5jb25zdCBub25NYXhTdXBwcmVzc2lvblY0SW1wbCA9IGtlcm5lbF9pbXBscy5ub25NYXhTdXBwcmVzc2lvblY0SW1wbDtcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5leHBvcnQgZnVuY3Rpb24gbm9uTWF4U3VwcHJlc3Npb25WNChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgYm94ZXMsIHNjb3JlcyB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgbWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLCBzY29yZVRocmVzaG9sZCwgcGFkVG9NYXhPdXRwdXRTaXplIH0gPSBhdHRycztcbiAgICBhc3NlcnROb3RDb21wbGV4KGJveGVzLCAnTm9uTWF4U3VwcHJlc3Npb25QYWRkZWQnKTtcbiAgICBjb25zdCBib3hlc1ZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KGJveGVzLmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IHNjb3Jlc1ZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KHNjb3Jlcy5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCB7IHNlbGVjdGVkSW5kaWNlcywgdmFsaWRPdXRwdXRzIH0gPSBub25NYXhTdXBwcmVzc2lvblY0SW1wbChib3hlc1ZhbHMsIHNjb3Jlc1ZhbHMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQsIHBhZFRvTWF4T3V0cHV0U2l6ZSk7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhbc2VsZWN0ZWRJbmRpY2VzLmxlbmd0aF0sICdpbnQzMicsIG5ldyBJbnQzMkFycmF5KHNlbGVjdGVkSW5kaWNlcykpLFxuICAgICAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtdLCAnaW50MzInLCBuZXcgSW50MzJBcnJheShbdmFsaWRPdXRwdXRzXSkpXG4gICAgXTtcbn1cbmV4cG9ydCBjb25zdCBub25NYXhTdXBwcmVzc2lvblY0Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IE5vbk1heFN1cHByZXNzaW9uVjQsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IG5vbk1heFN1cHByZXNzaW9uVjRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Ob25NYXhTdXBwcmVzc2lvblY0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGtlcm5lbF9pbXBscywgTm9uTWF4U3VwcHJlc3Npb25WNSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5jb25zdCBub25NYXhTdXBwcmVzc2lvblY1SW1wbCA9IGtlcm5lbF9pbXBscy5ub25NYXhTdXBwcmVzc2lvblY1SW1wbDtcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5leHBvcnQgZnVuY3Rpb24gbm9uTWF4U3VwcHJlc3Npb25WNShhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgYm94ZXMsIHNjb3JlcyB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgbWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLCBzY29yZVRocmVzaG9sZCwgc29mdE5tc1NpZ21hIH0gPSBhdHRycztcbiAgICBhc3NlcnROb3RDb21wbGV4KGJveGVzLCAnTm9uTWF4U3VwcHJlc3Npb25XaXRoU2NvcmUnKTtcbiAgICBjb25zdCBib3hlc1ZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KGJveGVzLmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IHNjb3Jlc1ZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KHNjb3Jlcy5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCBtYXhPdXRwdXRTaXplVmFsID0gbWF4T3V0cHV0U2l6ZTtcbiAgICBjb25zdCBpb3VUaHJlc2hvbGRWYWwgPSBpb3VUaHJlc2hvbGQ7XG4gICAgY29uc3Qgc2NvcmVUaHJlc2hvbGRWYWwgPSBzY29yZVRocmVzaG9sZDtcbiAgICBjb25zdCBzb2Z0Tm1zU2lnbWFWYWwgPSBzb2Z0Tm1zU2lnbWE7XG4gICAgY29uc3QgeyBzZWxlY3RlZEluZGljZXMsIHNlbGVjdGVkU2NvcmVzIH0gPSBub25NYXhTdXBwcmVzc2lvblY1SW1wbChib3hlc1ZhbHMsIHNjb3Jlc1ZhbHMsIG1heE91dHB1dFNpemVWYWwsIGlvdVRocmVzaG9sZFZhbCwgc2NvcmVUaHJlc2hvbGRWYWwsIHNvZnRObXNTaWdtYVZhbCk7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhbc2VsZWN0ZWRJbmRpY2VzLmxlbmd0aF0sICdpbnQzMicsIG5ldyBJbnQzMkFycmF5KHNlbGVjdGVkSW5kaWNlcykpLFxuICAgICAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtzZWxlY3RlZFNjb3Jlcy5sZW5ndGhdLCAnZmxvYXQzMicsIG5ldyBGbG9hdDMyQXJyYXkoc2VsZWN0ZWRTY29yZXMpKVxuICAgIF07XG59XG5leHBvcnQgY29uc3Qgbm9uTWF4U3VwcHJlc3Npb25WNUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBOb25NYXhTdXBwcmVzc2lvblY1LFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBub25NYXhTdXBwcmVzc2lvblY1XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Tm9uTWF4U3VwcHJlc3Npb25WNS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBOb3RFcXVhbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsIH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X2ltcGwnO1xuaW1wb3J0IHsgYmluYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV91dGlscyc7XG5leHBvcnQgY29uc3Qgbm90RXF1YWxJbXBsID0gY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCgoKGEsIGIpID0+IChhICE9PSBiKSA/IDEgOiAwKSk7XG5leHBvcnQgY29uc3Qgbm90RXF1YWwgPSBiaW5hcnlLZXJuZWxGdW5jKE5vdEVxdWFsLCBub3RFcXVhbEltcGwsIG51bGwgLyogY29tcGxleE9wICovLCAnYm9vbCcpO1xuZXhwb3J0IGNvbnN0IG5vdEVxdWFsQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IE5vdEVxdWFsLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBub3RFcXVhbFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU5vdEVxdWFsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IE9uZUhvdCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIG9uZUhvdChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgaW5kaWNlcyB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgZGVwdGgsIG9uVmFsdWUsIG9mZlZhbHVlIH0gPSBhdHRycztcbiAgICBhc3NlcnROb3RDb21wbGV4KGluZGljZXMsICdvbmVIb3QnKTtcbiAgICBjb25zdCBpbmRpY2VzU2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShpbmRpY2VzLnNoYXBlKTtcbiAgICBjb25zdCByZXMgPSBuZXcgRmxvYXQzMkFycmF5KGluZGljZXNTaXplICogZGVwdGgpO1xuICAgIHJlcy5maWxsKG9mZlZhbHVlKTtcbiAgICBjb25zdCBpbmRpY2VzVmFsID0gYmFja2VuZC5kYXRhLmdldChpbmRpY2VzLmRhdGFJZCkudmFsdWVzO1xuICAgIGZvciAobGV0IGV2ZW50ID0gMDsgZXZlbnQgPCBpbmRpY2VzU2l6ZTsgKytldmVudCkge1xuICAgICAgICBpZiAoaW5kaWNlc1ZhbFtldmVudF0gPj0gMCAmJiBpbmRpY2VzVmFsW2V2ZW50XSA8IGRlcHRoKSB7XG4gICAgICAgICAgICByZXNbZXZlbnQgKiBkZXB0aCArIGluZGljZXNWYWxbZXZlbnRdXSA9IG9uVmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oWy4uLmluZGljZXMuc2hhcGUsIGRlcHRoXSwgJ2ludDMyJywgcmVzKTtcbn1cbmV4cG9ydCBjb25zdCBvbmVIb3RDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogT25lSG90LFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBvbmVIb3Rcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1PbmVIb3QuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgT25lc0xpa2UgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY29tcGxleCB9IGZyb20gJy4vQ29tcGxleCc7XG5pbXBvcnQgeyBmaWxsIH0gZnJvbSAnLi9GaWxsJztcbmltcG9ydCB7IGltYWcgfSBmcm9tICcuL0ltYWcnO1xuaW1wb3J0IHsgcmVhbCB9IGZyb20gJy4vUmVhbCc7XG5pbXBvcnQgeyB6ZXJvc0xpa2UgfSBmcm9tICcuL1plcm9zTGlrZSc7XG5leHBvcnQgZnVuY3Rpb24gb25lc0xpa2UoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGlmICh4LmR0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ29uZXNMaWtlIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHN0cmluZyB0ZW5zb3JzJyk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHguZHR5cGUgPT09ICdjb21wbGV4NjQnKSB7XG4gICAgICAgIGNvbnN0IHJlYWxQYXJ0ID0gcmVhbCh7IGlucHV0czogeyBpbnB1dDogeCB9LCBiYWNrZW5kIH0pO1xuICAgICAgICBjb25zdCByID0gb25lc0xpa2UoeyBpbnB1dHM6IHsgeDogcmVhbFBhcnQgfSwgYmFja2VuZCB9KTtcbiAgICAgICAgY29uc3QgaW1hZ1BhcnQgPSBpbWFnKHsgaW5wdXRzOiB7IGlucHV0OiB4IH0sIGJhY2tlbmQgfSk7XG4gICAgICAgIGNvbnN0IGkgPSB6ZXJvc0xpa2UoeyBpbnB1dHM6IHsgeDogaW1hZ1BhcnQgfSwgYmFja2VuZCB9KTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gY29tcGxleCh7IGlucHV0czogeyByZWFsOiByLCBpbWFnOiBpIH0sIGJhY2tlbmQgfSk7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVhbFBhcnQpO1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHIpO1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGltYWdQYXJ0KTtcbiAgICAgICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhpKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBmaWxsKHsgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IHguc2hhcGUsIHZhbHVlOiAxLCBkdHlwZTogeC5kdHlwZSB9IH0pO1xuICAgIH1cbn1cbmV4cG9ydCBjb25zdCBvbmVzTGlrZUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBPbmVzTGlrZSxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogb25lc0xpa2Vcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1PbmVzTGlrZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBQYWNrLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNvbmNhdCB9IGZyb20gJy4vQ29uY2F0JztcbmltcG9ydCB7IGV4cGFuZERpbXMgfSBmcm9tICcuL0V4cGFuZERpbXMnO1xuZXhwb3J0IGZ1bmN0aW9uIHBhY2soYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IGF4aXMgfSA9IGF0dHJzO1xuICAgIGlmIChpbnB1dHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJldHVybiBleHBhbmREaW1zKHsgaW5wdXRzOiB7IGlucHV0OiBpbnB1dHNbMF0gfSwgYmFja2VuZCwgYXR0cnM6IHsgZGltOiBheGlzIH0gfSk7XG4gICAgfVxuICAgIGNvbnN0IHNoYXBlID0gaW5wdXRzWzBdLnNoYXBlO1xuICAgIGNvbnN0IGR0eXBlID0gaW5wdXRzWzBdLmR0eXBlO1xuICAgIGlucHV0cy5mb3JFYWNoKHQgPT4ge1xuICAgICAgICB1dGlsLmFzc2VydFNoYXBlc01hdGNoKHNoYXBlLCB0LnNoYXBlLCAnQWxsIHRlbnNvcnMgcGFzc2VkIHRvIHN0YWNrIG11c3QgaGF2ZSBtYXRjaGluZyBzaGFwZXMnKTtcbiAgICAgICAgdXRpbC5hc3NlcnQoZHR5cGUgPT09IHQuZHR5cGUsICgpID0+ICdBbGwgdGVuc29ycyBwYXNzZWQgdG8gc3RhY2sgbXVzdCBoYXZlIG1hdGNoaW5nIGR0eXBlcycpO1xuICAgIH0pO1xuICAgIGNvbnN0IGludGVybWVkaWF0ZVRlbnNvckluZm9zID0gW107XG4gICAgY29uc3QgZXhwYW5kZWRUZW5zb3JzID0gaW5wdXRzLm1hcCh0ID0+IHtcbiAgICAgICAgY29uc3QgZXhwYW5kZWRUID0gZXhwYW5kRGltcyh7IGlucHV0czogeyBpbnB1dDogdCB9LCBiYWNrZW5kLCBhdHRyczogeyBkaW06IGF4aXMgfSB9KTtcbiAgICAgICAgaW50ZXJtZWRpYXRlVGVuc29ySW5mb3MucHVzaChleHBhbmRlZFQpO1xuICAgICAgICByZXR1cm4gZXhwYW5kZWRUO1xuICAgIH0pO1xuICAgIGNvbnN0IHJlc3VsdCA9IGNvbmNhdCh7IGlucHV0czogZXhwYW5kZWRUZW5zb3JzLCBiYWNrZW5kLCBhdHRyczogeyBheGlzIH0gfSk7XG4gICAgaW50ZXJtZWRpYXRlVGVuc29ySW5mb3MuZm9yRWFjaCh0ID0+IGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8odCkpO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5leHBvcnQgY29uc3QgcGFja0NvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBQYWNrLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBwYWNrXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UGFjay5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBQYWRWMiwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIHBhZFYyKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBwYWRkaW5ncywgY29uc3RhbnRWYWx1ZSB9ID0gYXR0cnM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleCh4LCAncGFkJyk7XG4gICAgY29uc3Qgb3V0U2hhcGUgPSBwYWRkaW5ncy5tYXAoKHAsIGkpID0+IHBbMF0gLyogYmVmb3JlUGFkICovICsgeC5zaGFwZVtpXSArIHBbMV0gLyogYWZ0ZXJQYWQgKi8pO1xuICAgIGNvbnN0IHN0YXJ0ID0gcGFkZGluZ3MubWFwKHAgPT4gcFswXSk7XG4gICAgY29uc3QgeFZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgeFNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoeC5zaGFwZSk7XG4gICAgY29uc3QgeFJhbmsgPSB4LnNoYXBlLmxlbmd0aDtcbiAgICBjb25zdCB4U3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoeC5zaGFwZSk7XG4gICAgY29uc3QgcmVzdWx0U2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShvdXRTaGFwZSk7XG4gICAgY29uc3QgcmVzdWx0UmFuayA9IG91dFNoYXBlLmxlbmd0aDtcbiAgICBjb25zdCByZXN1bHRTdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyhvdXRTaGFwZSk7XG4gICAgY29uc3QgcmVzVmFscyA9IHV0aWwuZ2V0VHlwZWRBcnJheUZyb21EVHlwZSh4LmR0eXBlLCByZXN1bHRTaXplKTtcbiAgICBpZiAoY29uc3RhbnRWYWx1ZSAhPT0gMCkge1xuICAgICAgICByZXNWYWxzLmZpbGwoY29uc3RhbnRWYWx1ZSk7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgeFNpemU7IGkrKykge1xuICAgICAgICBjb25zdCBjb29yZHMgPSB1dGlsLmluZGV4VG9Mb2MoaSwgeFJhbmssIHhTdHJpZGVzKTtcbiAgICAgICAgY29uc3Qgb3V0Q29vcmRzID0gY29vcmRzLm1hcCgoYywgaSkgPT4gYyArIHN0YXJ0W2ldKTtcbiAgICAgICAgY29uc3Qgb3V0SW5kZXggPSB1dGlsLmxvY1RvSW5kZXgob3V0Q29vcmRzLCByZXN1bHRSYW5rLCByZXN1bHRTdHJpZGVzKTtcbiAgICAgICAgcmVzVmFsc1tvdXRJbmRleF0gPSB4VmFsc1tpXTtcbiAgICB9XG4gICAgY29uc3Qgb3V0SWQgPSBiYWNrZW5kLndyaXRlKHJlc1ZhbHMsIG91dFNoYXBlLCB4LmR0eXBlKTtcbiAgICByZXR1cm4geyBkYXRhSWQ6IG91dElkLCBzaGFwZTogb3V0U2hhcGUsIGR0eXBlOiB4LmR0eXBlIH07XG59XG5leHBvcnQgY29uc3QgcGFkVjJDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogUGFkVjIsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHBhZFYyXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UGFkVjIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgUG93IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGwgfSBmcm9tICcuLi91dGlscy9iaW5hcnlfaW1wbCc7XG5pbXBvcnQgeyBiaW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCBwb3dJbXBsID0gY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCgoYSwgYikgPT4gTWF0aC5wb3coYSwgYikpO1xuZXhwb3J0IGNvbnN0IHBvdyA9IGJpbmFyeUtlcm5lbEZ1bmMoUG93LCBwb3dJbXBsKTtcbmV4cG9ydCBjb25zdCBwb3dDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogUG93LFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBwb3dcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Qb3cuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFByZWx1IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5pbXBvcnQgeyBjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsIH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X2ltcGwnO1xuY29uc3QgcHJlbHVJbXBsID0gY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCgoeFZhbHVlLCBhVmFsdWUpID0+IHhWYWx1ZSA8IDAgPyBhVmFsdWUgKiB4VmFsdWUgOiB4VmFsdWUpO1xuZXhwb3J0IGZ1bmN0aW9uIHByZWx1KGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCB7IHgsIGFscGhhIH0gPSBpbnB1dHM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleChbeCwgYWxwaGFdLCAncHJlbHUnKTtcbiAgICBjb25zdCBhVmFscyA9IGJhY2tlbmQuZGF0YS5nZXQoeC5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCBiVmFscyA9IGJhY2tlbmQuZGF0YS5nZXQoYWxwaGEuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgW3Jlc3VsdERhdGEsIHJlc3VsdFNoYXBlXSA9IHByZWx1SW1wbCh4LnNoYXBlLCBhbHBoYS5zaGFwZSwgYVZhbHMsIGJWYWxzLCB4LmR0eXBlKTtcbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhyZXN1bHRTaGFwZSwgeC5kdHlwZSwgcmVzdWx0RGF0YSk7XG59XG5leHBvcnQgY29uc3QgcHJlbHVDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogUHJlbHUsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHByZWx1LFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVByZWx1LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgUHJvZCwgdXBjYXN0VHlwZSwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuaW1wb3J0IHsgdHJhbnNwb3NlIH0gZnJvbSAnLi9UcmFuc3Bvc2UnO1xuZXhwb3J0IGZ1bmN0aW9uIHByb2RJbXBsKHhTaGFwZSwgeER0eXBlLCB4VmFscywgcmVkdWN0aW9uQXhlcykge1xuICAgIGNvbnN0IFtvdXRTaGFwZSwgcmVkdWNlU2hhcGVdID0gYmFja2VuZF91dGlsLmNvbXB1dGVPdXRBbmRSZWR1Y2VTaGFwZXMoeFNoYXBlLCByZWR1Y3Rpb25BeGVzKTtcbiAgICBjb25zdCBvdXREdHlwZSA9IHVwY2FzdFR5cGUoeER0eXBlLCAnaW50MzInKTtcbiAgICBjb25zdCBvdXRWYWxzID0gdXRpbC5tYWtlWmVyb3NUeXBlZEFycmF5KHV0aWwuc2l6ZUZyb21TaGFwZShvdXRTaGFwZSksIG91dER0eXBlKTtcbiAgICBjb25zdCByZWR1Y2VTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHJlZHVjZVNoYXBlKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG91dFZhbHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gaSAqIHJlZHVjZVNpemU7XG4gICAgICAgIGxldCBwcm9kID0gMTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByZWR1Y2VTaXplOyArK2opIHtcbiAgICAgICAgICAgIHByb2QgKj0geFZhbHNbb2Zmc2V0ICsgal07XG4gICAgICAgIH1cbiAgICAgICAgb3V0VmFsc1tpXSA9IHByb2Q7XG4gICAgfVxuICAgIHJldHVybiB7IG91dFZhbHMsIG91dFNoYXBlLCBvdXREdHlwZSB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIHByb2QoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGF4aXMsIGtlZXBEaW1zIH0gPSBhdHRycztcbiAgICBhc3NlcnROb3RDb21wbGV4KHgsICdwcm9kJyk7XG4gICAgY29uc3QgeFJhbmsgPSB4LnNoYXBlLmxlbmd0aDtcbiAgICBjb25zdCBheGVzID0gdXRpbC5wYXJzZUF4aXNQYXJhbShheGlzLCB4LnNoYXBlKTtcbiAgICBjb25zdCBwZXJtdXRhdGlvbiA9IGJhY2tlbmRfdXRpbC5nZXRBeGVzUGVybXV0YXRpb24oYXhlcywgeFJhbmspO1xuICAgIGxldCByZWR1Y3Rpb25BeGVzID0gYXhlcztcbiAgICBsZXQgcGVybXV0ZWRYID0geDtcbiAgICBjb25zdCBpbnRlcm1lZGlhdGVUZW5zb3JJbmZvcyA9IFtdO1xuICAgIGlmIChwZXJtdXRhdGlvbiAhPSBudWxsKSB7XG4gICAgICAgIHBlcm11dGVkWCA9IHRyYW5zcG9zZSh7IGlucHV0czogeyB4IH0sIGJhY2tlbmQsIGF0dHJzOiB7IHBlcm06IHBlcm11dGF0aW9uIH0gfSk7XG4gICAgICAgIGludGVybWVkaWF0ZVRlbnNvckluZm9zLnB1c2gocGVybXV0ZWRYKTtcbiAgICAgICAgcmVkdWN0aW9uQXhlcyA9IGJhY2tlbmRfdXRpbC5nZXRJbm5lck1vc3RBeGVzKHJlZHVjdGlvbkF4ZXMubGVuZ3RoLCB4UmFuayk7XG4gICAgfVxuICAgIGNvbnN0IHhWYWxzID0gYmFja2VuZC5kYXRhLmdldChwZXJtdXRlZFguZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgeyBvdXRWYWxzLCBvdXRTaGFwZSwgb3V0RHR5cGUgfSA9IHByb2RJbXBsKHBlcm11dGVkWC5zaGFwZSwgcGVybXV0ZWRYLmR0eXBlLCB4VmFscywgcmVkdWN0aW9uQXhlcyk7XG4gICAgbGV0IHJlc3VsdFNoYXBlID0gb3V0U2hhcGU7XG4gICAgaWYgKGtlZXBEaW1zKSB7XG4gICAgICAgIHJlc3VsdFNoYXBlID0gYmFja2VuZF91dGlsLmV4cGFuZFNoYXBlVG9LZWVwRGltKG91dFNoYXBlLCBheGVzKTtcbiAgICB9XG4gICAgaW50ZXJtZWRpYXRlVGVuc29ySW5mb3MuZm9yRWFjaCh0ID0+IGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8odCkpO1xuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHJlc3VsdFNoYXBlLCBvdXREdHlwZSwgb3V0VmFscyk7XG59XG5leHBvcnQgY29uc3QgcHJvZENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBQcm9kLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBwcm9kXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UHJvZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBSYW5nZSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyByYW5nZUltcGwgfSBmcm9tICcuL1JhbmdlX2ltcGwnO1xuZXhwb3J0IGZ1bmN0aW9uIHJhbmdlKGFyZ3MpIHtcbiAgICBjb25zdCB7IGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgc3RhcnQsIHN0b3AsIGR0eXBlLCBzdGVwIH0gPSBhdHRycztcbiAgICBjb25zdCB2YWx1ZXMgPSByYW5nZUltcGwoc3RhcnQsIHN0b3AsIHN0ZXAsIGR0eXBlKTtcbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhbdmFsdWVzLmxlbmd0aF0sIGR0eXBlLCB2YWx1ZXMpO1xufVxuZXhwb3J0IGNvbnN0IHJhbmdlQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFJhbmdlLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiByYW5nZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJhbmdlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuZXhwb3J0IGZ1bmN0aW9uIHJhbmdlSW1wbChzdGFydCwgc3RvcCwgc3RlcCwgZHR5cGUpIHtcbiAgICBjb25zdCBzYW1lU3RhcnRTdG9wID0gc3RhcnQgPT09IHN0b3A7XG4gICAgY29uc3QgaW5jcmVhc2luZ1JhbmdlTmVnYXRpdmVTdGVwID0gc3RhcnQgPCBzdG9wICYmIHN0ZXAgPCAwO1xuICAgIGNvbnN0IGRlY3JlYXNpbmdSYW5nZVBvc2l0aXZlU3RlcCA9IHN0b3AgPCBzdGFydCAmJiBzdGVwID4gMTtcbiAgICBpZiAoc2FtZVN0YXJ0U3RvcCB8fCBpbmNyZWFzaW5nUmFuZ2VOZWdhdGl2ZVN0ZXAgfHxcbiAgICAgICAgZGVjcmVhc2luZ1JhbmdlUG9zaXRpdmVTdGVwKSB7XG4gICAgICAgIHJldHVybiB1dGlsLm1ha2VaZXJvc1R5cGVkQXJyYXkoMCwgZHR5cGUpO1xuICAgIH1cbiAgICBjb25zdCBudW1FbGVtZW50cyA9IE1hdGguYWJzKE1hdGguY2VpbCgoc3RvcCAtIHN0YXJ0KSAvIHN0ZXApKTtcbiAgICBjb25zdCB2YWx1ZXMgPSB1dGlsLm1ha2VaZXJvc1R5cGVkQXJyYXkobnVtRWxlbWVudHMsIGR0eXBlKTtcbiAgICBpZiAoc3RvcCA8IHN0YXJ0ICYmIHN0ZXAgPT09IDEpIHtcbiAgICAgICAgLy8gQXV0byBhZGp1c3QgdGhlIHN0ZXAncyBzaWduIGlmIGl0IGhhc24ndCBiZWVuIHNldFxuICAgICAgICAvLyAob3Igd2FzIHNldCB0byAxKVxuICAgICAgICBzdGVwID0gLTE7XG4gICAgfVxuICAgIHZhbHVlc1swXSA9IHN0YXJ0O1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhbHVlc1tpXSA9IHZhbHVlc1tpIC0gMV0gKyBzdGVwO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWVzO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmFuZ2VfaW1wbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBSZWFsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmV4cG9ydCBmdW5jdGlvbiByZWFsKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCB7IGlucHV0IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgcmVhbCA9IGJhY2tlbmQuZGF0YS5nZXQoaW5wdXQuZGF0YUlkKS5jb21wbGV4VGVuc29ySW5mb3MucmVhbDtcbiAgICBjb25zdCByZWFsVmFsID0gYmFja2VuZC5kYXRhLmdldChyZWFsLmRhdGFJZCkudmFsdWVzO1xuICAgIC8vIFdoZW4gY29tcGxleCB0ZW5zb3IgaXMgZGlzcG9zZWQsIGl0cyB1bmRlcmx5aW5nIHBhcnRzIHdpbGwgYmUgZGlzcG9zZWQgdG9vLlxuICAgIC8vIE1ha2UgbmV3IHRlbnNvciBvdXQgb2YgdGhlIHJlYWwgdmFsdWUgb2YgdGhlIGNvbXBsZXguIFRoaXMgbWFrZXMgc3VyZSB0aGVcbiAgICAvLyB2YWx1ZSBpcyBzdGlsbCBhY2Nlc3NpYmxlIGV2ZW4gaWYgY29tcGxleCB0ZW5zb3IgaXMgZGlzcG9zZWQuXG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ocmVhbC5zaGFwZSwgcmVhbC5kdHlwZSwgcmVhbFZhbCk7XG59XG5leHBvcnQgY29uc3QgcmVhbENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBSZWFsLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiByZWFsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmVhbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBSZWFsRGl2IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGwgfSBmcm9tICcuLi91dGlscy9iaW5hcnlfaW1wbCc7XG5pbXBvcnQgeyBiaW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCByZWFsRGl2SW1wbCA9IGNyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGwoKGEsIGIpID0+IGEgLyBiKTtcbmV4cG9ydCBjb25zdCBkaXYgPSBiaW5hcnlLZXJuZWxGdW5jKFJlYWxEaXYsIHJlYWxEaXZJbXBsKTtcbmV4cG9ydCBjb25zdCByZWFsRGl2Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFJlYWxEaXYsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IGRpdlxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlYWxEaXYuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFJlY2lwcm9jYWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgdW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4vdXRpbHMvdW5hcnlfdXRpbHMnO1xuZXhwb3J0IGNvbnN0IHJlY2lwcm9jYWwgPSB1bmFyeUtlcm5lbEZ1bmMoUmVjaXByb2NhbCwgKHhpKSA9PiAxIC8geGkpO1xuZXhwb3J0IGNvbnN0IHJlY2lwcm9jYWxDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogUmVjaXByb2NhbCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogcmVjaXByb2NhbCxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1SZWNpcHJvY2FsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBSZWx1IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHVuYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCByZWx1ID0gdW5hcnlLZXJuZWxGdW5jKFJlbHUsICh4aSkgPT4gTWF0aC5tYXgoMCwgeGkpKTtcbmV4cG9ydCBjb25zdCByZWx1Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFJlbHUsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHJlbHUsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmVsdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgUmVsdTYgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgdW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4vdXRpbHMvdW5hcnlfdXRpbHMnO1xuZXhwb3J0IGNvbnN0IHJlbHU2ID0gdW5hcnlLZXJuZWxGdW5jKFJlbHU2LCAoeGkpID0+IE1hdGgubWluKE1hdGgubWF4KDAsIHhpKSwgNikpO1xuZXhwb3J0IGNvbnN0IHJlbHU2Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFJlbHU2LFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiByZWx1Nixcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1SZWx1Ni5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBSZXNoYXBlLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmV4cG9ydCBmdW5jdGlvbiByZXNoYXBlKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBzaGFwZSB9ID0gYXR0cnM7XG4gICAgY29uc3QgeFNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoeC5zaGFwZSk7XG4gICAgY29uc3QgJHNoYXBlID0gdXRpbC5pbmZlckZyb21JbXBsaWNpdFNoYXBlKHNoYXBlLCB4U2l6ZSk7XG4gICAgY29uc3QgJHhTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKCRzaGFwZSk7XG4gICAgdXRpbC5hc3NlcnQoeFNpemUgPT09ICR4U2l6ZSwgKCkgPT4gYFRoZSBuZXcgc2hhcGUgKCR7JHNoYXBlfSkgaGFzICR7JHhTaXplfSBlbGVtZW50cyBhbmQgdGhlIG9sZCBgICtcbiAgICAgICAgYHNoYXBlICgke3guc2hhcGV9KSBoYXMgJHt4U2l6ZX0gZWxlbWVudHMuIFRoZSBuZXcgc2hhcGUgYW5kIG9sZCBgICtcbiAgICAgICAgYHNoYXBlIG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgZWxlbWVudHMuYCk7XG4gICAgYmFja2VuZC5pbmNSZWYoeC5kYXRhSWQpO1xuICAgIGNvbnN0IHhEYXRhID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCk7XG4gICAgaWYgKHhEYXRhLmNvbXBsZXhUZW5zb3JJbmZvcyAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHJlYWwgPSB4RGF0YS5jb21wbGV4VGVuc29ySW5mb3MucmVhbDtcbiAgICAgICAgY29uc3QgaW1hZyA9IHhEYXRhLmNvbXBsZXhUZW5zb3JJbmZvcy5pbWFnO1xuICAgICAgICByZWFsLnNoYXBlID0gJHNoYXBlO1xuICAgICAgICBpbWFnLnNoYXBlID0gJHNoYXBlO1xuICAgIH1cbiAgICByZXR1cm4geyBkYXRhSWQ6IHguZGF0YUlkLCBzaGFwZTogJHNoYXBlLCBkdHlwZTogeC5kdHlwZSB9O1xufVxuZXhwb3J0IGNvbnN0IHJlc2hhcGVDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogUmVzaGFwZSxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogcmVzaGFwZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlc2hhcGUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgUmVzaXplQmlsaW5lYXIsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmV4cG9ydCBmdW5jdGlvbiByZXNpemVCaWxpbmVhcihhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgaW1hZ2VzIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBhbGlnbkNvcm5lcnMsIGhhbGZQaXhlbENlbnRlcnMsIHNpemUgfSA9IGF0dHJzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoaW1hZ2VzLCAncmVzaXplQmlsaW5lYXInKTtcbiAgICBjb25zdCBpbWFnZXNTdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyhpbWFnZXMuc2hhcGUpO1xuICAgIGNvbnN0IFtuZXdIZWlnaHQsIG5ld1dpZHRoXSA9IHNpemU7XG4gICAgY29uc3QgW2JhdGNoLCBvbGRIZWlnaHQsIG9sZFdpZHRoLCBudW1DaGFubmVsc10gPSBpbWFnZXMuc2hhcGU7XG4gICAgY29uc3QgeFZhbHVlcyA9IGJhY2tlbmQuZGF0YS5nZXQoaW1hZ2VzLmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBGbG9hdDMyQXJyYXkodXRpbC5zaXplRnJvbVNoYXBlKFtiYXRjaCwgbmV3SGVpZ2h0LCBuZXdXaWR0aCwgbnVtQ2hhbm5lbHNdKSk7XG4gICAgY29uc3QgZWZmZWN0aXZlSW5wdXRTaXplID0gW1xuICAgICAgICAoYWxpZ25Db3JuZXJzICYmIG5ld0hlaWdodCA+IDEpID8gb2xkSGVpZ2h0IC0gMSA6IG9sZEhlaWdodCxcbiAgICAgICAgKGFsaWduQ29ybmVycyAmJiBuZXdXaWR0aCA+IDEpID8gb2xkV2lkdGggLSAxIDogb2xkV2lkdGhcbiAgICBdO1xuICAgIGNvbnN0IGVmZmVjdGl2ZU91dHB1dFNpemUgPSBbXG4gICAgICAgIChhbGlnbkNvcm5lcnMgJiYgbmV3SGVpZ2h0ID4gMSkgPyBuZXdIZWlnaHQgLSAxIDogbmV3SGVpZ2h0LFxuICAgICAgICAoYWxpZ25Db3JuZXJzICYmIG5ld1dpZHRoID4gMSkgPyBuZXdXaWR0aCAtIDEgOiBuZXdXaWR0aFxuICAgIF07XG4gICAgbGV0IG91dHB1dElkeCA9IDA7XG4gICAgY29uc3QgZWZmZWN0aXZlUm93U2l6ZVJhdGlvID0gZWZmZWN0aXZlSW5wdXRTaXplWzBdIC8gZWZmZWN0aXZlT3V0cHV0U2l6ZVswXTtcbiAgICBjb25zdCBlZmZlY3RpdmVDb2xTaXplUmF0aW8gPSBlZmZlY3RpdmVJbnB1dFNpemVbMV0gLyBlZmZlY3RpdmVPdXRwdXRTaXplWzFdO1xuICAgIGZvciAobGV0IGIgPSAwOyBiIDwgYmF0Y2g7IGIrKykge1xuICAgICAgICBmb3IgKGxldCByID0gMDsgciA8IG5ld0hlaWdodDsgcisrKSB7XG4gICAgICAgICAgICBsZXQgc291cmNlRnJhY1JvdztcbiAgICAgICAgICAgIGlmIChoYWxmUGl4ZWxDZW50ZXJzKSB7XG4gICAgICAgICAgICAgICAgc291cmNlRnJhY1JvdyA9IGVmZmVjdGl2ZVJvd1NpemVSYXRpbyAqIChyICsgMC41KSAtIDAuNTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHNvdXJjZUZyYWNSb3cgPSBlZmZlY3RpdmVSb3dTaXplUmF0aW8gKiByO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgc291cmNlUm93Rmxvb3IgPSBNYXRoLm1heCgwLCBNYXRoLmZsb29yKHNvdXJjZUZyYWNSb3cpKTtcbiAgICAgICAgICAgIGNvbnN0IHJvd0ZyYWMgPSBzb3VyY2VGcmFjUm93IC0gc291cmNlUm93Rmxvb3I7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VSb3dDZWlsID0gTWF0aC5taW4ob2xkSGVpZ2h0IC0gMSwgTWF0aC5jZWlsKHNvdXJjZUZyYWNSb3cpKTtcbiAgICAgICAgICAgIGNvbnN0IHRvcFJvd09mZnNldCA9IGIgKiBpbWFnZXNTdHJpZGVzWzBdICsgc291cmNlUm93Rmxvb3IgKiBpbWFnZXNTdHJpZGVzWzFdO1xuICAgICAgICAgICAgY29uc3QgYm90Um93T2Zmc2V0ID0gYiAqIGltYWdlc1N0cmlkZXNbMF0gKyBzb3VyY2VSb3dDZWlsICogaW1hZ2VzU3RyaWRlc1sxXTtcbiAgICAgICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgbmV3V2lkdGg7IGMrKykge1xuICAgICAgICAgICAgICAgIGxldCBzb3VyY2VGcmFjQ29sO1xuICAgICAgICAgICAgICAgIGlmIChoYWxmUGl4ZWxDZW50ZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZUZyYWNDb2wgPSBlZmZlY3RpdmVDb2xTaXplUmF0aW8gKiAoYyArIDAuNSkgLSAwLjU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzb3VyY2VGcmFjQ29sID0gZWZmZWN0aXZlQ29sU2l6ZVJhdGlvICogYztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3Qgc291cmNlQ29sRmxvb3IgPSBNYXRoLm1heCgwLCBNYXRoLmZsb29yKHNvdXJjZUZyYWNDb2wpKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb2xGcmFjID0gc291cmNlRnJhY0NvbCAtIHNvdXJjZUNvbEZsb29yO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZUNvbENlaWwgPSBNYXRoLm1pbihvbGRXaWR0aCAtIDEsIE1hdGguY2VpbChzb3VyY2VGcmFjQ29sKSk7XG4gICAgICAgICAgICAgICAgY29uc3QgdG9wTGVmdE9mZmVzdCA9IHRvcFJvd09mZnNldCArIHNvdXJjZUNvbEZsb29yICogaW1hZ2VzU3RyaWRlc1syXTtcbiAgICAgICAgICAgICAgICBjb25zdCBib3RMZWZ0T2Zmc2V0ID0gYm90Um93T2Zmc2V0ICsgc291cmNlQ29sRmxvb3IgKiBpbWFnZXNTdHJpZGVzWzJdO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvcFJpZ2h0T2Zmc2V0ID0gdG9wUm93T2Zmc2V0ICsgc291cmNlQ29sQ2VpbCAqIGltYWdlc1N0cmlkZXNbMl07XG4gICAgICAgICAgICAgICAgY29uc3QgYm90UmlnaHRPZmZlc3QgPSBib3RSb3dPZmZzZXQgKyBzb3VyY2VDb2xDZWlsICogaW1hZ2VzU3RyaWRlc1syXTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBkID0gMDsgZCA8IG51bUNoYW5uZWxzOyBkKyspIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQmVnaW4gc2hhZGVyLlxuICAgICAgICAgICAgICAgICAgICAvLyBDb21wdXRlIHRoZSBmcmFjdGlvbmFsIGluZGV4IG9mIHRoZSBzb3VyY2UuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRvcExlZnQgPSB4VmFsdWVzW3RvcExlZnRPZmZlc3QgKyBkXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYm90dG9tTGVmdCA9IHhWYWx1ZXNbYm90TGVmdE9mZnNldCArIGRdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0b3BSaWdodCA9IHhWYWx1ZXNbdG9wUmlnaHRPZmZzZXQgKyBkXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYm90dG9tUmlnaHQgPSB4VmFsdWVzW2JvdFJpZ2h0T2ZmZXN0ICsgZF07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRvcCA9IHRvcExlZnQgKyAodG9wUmlnaHQgLSB0b3BMZWZ0KSAqIGNvbEZyYWM7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvdHRvbSA9IGJvdHRvbUxlZnQgKyAoYm90dG9tUmlnaHQgLSBib3R0b21MZWZ0KSAqIGNvbEZyYWM7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gdG9wICsgKGJvdHRvbSAtIHRvcCkgKiByb3dGcmFjO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRbb3V0cHV0SWR4KytdID0gbmV3VmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtiYXRjaCwgbmV3SGVpZ2h0LCBuZXdXaWR0aCwgbnVtQ2hhbm5lbHNdLCAnZmxvYXQzMicsIHJlc3VsdCk7XG59XG5leHBvcnQgY29uc3QgcmVzaXplQmlsaW5lYXJDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogUmVzaXplQmlsaW5lYXIsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHJlc2l6ZUJpbGluZWFyXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmVzaXplQmlsaW5lYXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgUmVzaXplQmlsaW5lYXJHcmFkLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5leHBvcnQgZnVuY3Rpb24gcmVzaXplQmlsaW5lYXJHcmFkKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBpbWFnZXMsIGR5IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBhbGlnbkNvcm5lcnMgfSA9IGF0dHJzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoW2R5LCBpbWFnZXNdLCAncmVzaXplQmlsaW5lYXJHcmFkJyk7XG4gICAgY29uc3QgaW1hZ2VzU3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoaW1hZ2VzLnNoYXBlKTtcbiAgICBjb25zdCBbYmF0Y2gsIHhIZWlnaHQsIHhXaWR0aCwgZGVwdGhdID0gaW1hZ2VzLnNoYXBlO1xuICAgIGNvbnN0IFssIHlIZWlnaHQsIHlXaWR0aF0gPSBkeS5zaGFwZTtcbiAgICBjb25zdCBvdXRwdXQgPSBuZXcgRmxvYXQzMkFycmF5KGJhdGNoICogeEhlaWdodCAqIHhXaWR0aCAqIGRlcHRoKTtcbiAgICAvLyBJbiB0aGUgYmFja3dhcmRzIHBhc3MsIHdlIHdhbnQgdG8gZmluZCB0aGUgcGl4ZWxzIHRoYXQgd2VyZSBnZW5lcmF0ZWRcbiAgICAvLyBmb3IgZWFjaCBwaXhlbCBpbiB0aGUgaW5wdXQgaW1hZ2UgdGhlIGZvcndhcmQgcGFzcyBhbmQgYWRkIHRoZVxuICAgIC8vIGNvcnJlc3BvbmRpbmcgY29lZmZpY2llbnQgZnJvbSBkeSB0byB0aGUgZ3JhZGllbnQgKHdpdGggc29tZVxuICAgIC8vIGludGVycG9sYXRpb24pLlxuICAgIGNvbnN0IGVmZmVjdGl2ZVhTaXplID0gW1xuICAgICAgICAoYWxpZ25Db3JuZXJzICYmIHlIZWlnaHQgPiAxKSA/IHhIZWlnaHQgLSAxIDogeEhlaWdodCxcbiAgICAgICAgKGFsaWduQ29ybmVycyAmJiB5V2lkdGggPiAxKSA/IHhXaWR0aCAtIDEgOiB4V2lkdGhcbiAgICBdO1xuICAgIGNvbnN0IGVmZmVjdGl2ZVlTaXplID0gW1xuICAgICAgICAoYWxpZ25Db3JuZXJzICYmIHlIZWlnaHQgPiAxKSA/IHlIZWlnaHQgLSAxIDogeUhlaWdodCxcbiAgICAgICAgKGFsaWduQ29ybmVycyAmJiB5V2lkdGggPiAxKSA/IHlXaWR0aCAtIDEgOiB5V2lkdGhcbiAgICBdO1xuICAgIGNvbnN0IGhlaWdodFNjYWxlID0gZWZmZWN0aXZlWFNpemVbMF0gLyBlZmZlY3RpdmVZU2l6ZVswXTtcbiAgICBjb25zdCB3aWR0aFNjYWxlID0gZWZmZWN0aXZlWFNpemVbMV0gLyBlZmZlY3RpdmVZU2l6ZVsxXTtcbiAgICAvLyBSZWZlcmVuY2UgaW1wbGVtZW50YXRpb25cbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yZmxvdy9ibG9iLzMwMzkzNzVjODZhNWJiYzk2MTBjNzcyNWRjYWE5NWQ2MzVmODdiYTIvdGVuc29yZmxvdy9jb3JlL2tlcm5lbHMvcmVzaXplX2JpbGluZWFyX29wLmNjI0wyNzVcbiAgICBjb25zdCBkeVZhbHVlcyA9IGJhY2tlbmQuZGF0YS5nZXQoZHkuZGF0YUlkKS52YWx1ZXM7XG4gICAgbGV0IG9mZnNldCA9IDA7XG4gICAgZm9yIChsZXQgYiA9IDA7IGIgPCBiYXRjaDsgYisrKSB7XG4gICAgICAgIGNvbnN0IGJPZmZzZXQgPSBiICogaW1hZ2VzU3RyaWRlc1swXTtcbiAgICAgICAgZm9yIChsZXQgciA9IDA7IHIgPCB5SGVpZ2h0OyByKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGR4UiA9IHIgKiBoZWlnaHRTY2FsZTtcbiAgICAgICAgICAgIGNvbnN0IHRvcER4UkluZGV4ID0gTWF0aC5mbG9vcihkeFIpO1xuICAgICAgICAgICAgY29uc3QgYm90dG9tRHhSSW5kZXggPSBNYXRoLm1pbihNYXRoLmNlaWwoZHhSKSwgeEhlaWdodCAtIDEpO1xuICAgICAgICAgICAgY29uc3QgdG9wRHhST2Zmc2V0ID0gYk9mZnNldCArIHRvcER4UkluZGV4ICogaW1hZ2VzU3RyaWRlc1sxXTtcbiAgICAgICAgICAgIGNvbnN0IGJvdHRvbUR4Uk9mZnNldCA9IGJPZmZzZXQgKyBib3R0b21EeFJJbmRleCAqIGltYWdlc1N0cmlkZXNbMV07XG4gICAgICAgICAgICBjb25zdCBkeFJMZXJwID0gZHhSIC0gdG9wRHhSSW5kZXg7XG4gICAgICAgICAgICBjb25zdCBpbnZlcnNlRHhSTGVycCA9IDEuMCAtIGR4UkxlcnA7XG4gICAgICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IHlXaWR0aDsgYysrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZHhDID0gYyAqIHdpZHRoU2NhbGU7XG4gICAgICAgICAgICAgICAgY29uc3QgbGVmdER4Q0luZGV4ID0gTWF0aC5mbG9vcihkeEMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJpZ2h0RHhDSW5kZXggPSBNYXRoLm1pbihNYXRoLmNlaWwoZHhDKSwgeFdpZHRoIC0gMSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZHhDTGVycCA9IGR4QyAtIGxlZnREeENJbmRleDtcbiAgICAgICAgICAgICAgICBjb25zdCBpbnZlcnNlRHhDTGVycCA9IDEuMCAtIGR4Q0xlcnA7XG4gICAgICAgICAgICAgICAgY29uc3QgdG9wTGVmdFJDT2Zmc2V0ID0gdG9wRHhST2Zmc2V0ICsgbGVmdER4Q0luZGV4ICogaW1hZ2VzU3RyaWRlc1syXTtcbiAgICAgICAgICAgICAgICBjb25zdCB0b3BSaWdodFJDT2Zmc2V0ID0gdG9wRHhST2Zmc2V0ICsgcmlnaHREeENJbmRleCAqIGltYWdlc1N0cmlkZXNbMl07XG4gICAgICAgICAgICAgICAgY29uc3QgYm90dG9tTGVmdFJDT2Zmc2V0ID0gYm90dG9tRHhST2Zmc2V0ICsgbGVmdER4Q0luZGV4ICogaW1hZ2VzU3RyaWRlc1syXTtcbiAgICAgICAgICAgICAgICBjb25zdCBib3R0b21SaWdodFJDT2Zmc2V0ID0gYm90dG9tRHhST2Zmc2V0ICsgcmlnaHREeENJbmRleCAqIGltYWdlc1N0cmlkZXNbMl07XG4gICAgICAgICAgICAgICAgY29uc3QgaW52ZXJzZUR4UkxlcnBUaW1lc0ludmVyc2VEeENMZXJwID0gaW52ZXJzZUR4UkxlcnAgKiBpbnZlcnNlRHhDTGVycDtcbiAgICAgICAgICAgICAgICBjb25zdCBpbnZlcnNlRHhSTGVycFRpbWVzRHhDTGVycCA9IGludmVyc2VEeFJMZXJwICogZHhDTGVycDtcbiAgICAgICAgICAgICAgICBjb25zdCBkeFJMZXJwVGltZXNJbnZlcnNlRHhDTGVycCA9IGR4UkxlcnAgKiBpbnZlcnNlRHhDTGVycDtcbiAgICAgICAgICAgICAgICBjb25zdCBkeFJMZXJwVGltZXNEeENMZXJwID0gZHhSTGVycCAqIGR4Q0xlcnA7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgZCA9IDA7IGQgPCBkZXB0aDsgZCsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGR5VmFsID0gZHlWYWx1ZXNbb2Zmc2V0KytdO1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXRbdG9wTGVmdFJDT2Zmc2V0ICsgZF0gKz1cbiAgICAgICAgICAgICAgICAgICAgICAgIGR5VmFsICogaW52ZXJzZUR4UkxlcnBUaW1lc0ludmVyc2VEeENMZXJwO1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXRbdG9wUmlnaHRSQ09mZnNldCArIGRdICs9IGR5VmFsICogaW52ZXJzZUR4UkxlcnBUaW1lc0R4Q0xlcnA7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dFtib3R0b21MZWZ0UkNPZmZzZXQgKyBkXSArPSBkeVZhbCAqIGR4UkxlcnBUaW1lc0ludmVyc2VEeENMZXJwO1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXRbYm90dG9tUmlnaHRSQ09mZnNldCArIGRdICs9IGR5VmFsICogZHhSTGVycFRpbWVzRHhDTGVycDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oW2JhdGNoLCB4V2lkdGgsIHhIZWlnaHQsIGRlcHRoXSwgJ2Zsb2F0MzInLCBvdXRwdXQpO1xufVxuZXhwb3J0IGNvbnN0IHJlc2l6ZUJpbGluZWFyR3JhZENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBSZXNpemVCaWxpbmVhckdyYWQsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHJlc2l6ZUJpbGluZWFyR3JhZFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlc2l6ZUJpbGluZWFyR3JhZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBSZXNpemVOZWFyZXN0TmVpZ2hib3IsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmV4cG9ydCBmdW5jdGlvbiByZXNpemVOZWFyZXN0TmVpZ2hib3IoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IGltYWdlcyB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgYWxpZ25Db3JuZXJzLCBoYWxmUGl4ZWxDZW50ZXJzLCBzaXplIH0gPSBhdHRycztcbiAgICBhc3NlcnROb3RDb21wbGV4KGltYWdlcywgJ3Jlc2l6ZU5lYXJlc3ROZWlnaGJvcicpO1xuICAgIGNvbnN0IGltYWdlc1N0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKGltYWdlcy5zaGFwZSk7XG4gICAgY29uc3QgW25ld0hlaWdodCwgbmV3V2lkdGhdID0gc2l6ZTtcbiAgICBjb25zdCBbYmF0Y2gsIG9sZEhlaWdodCwgb2xkV2lkdGgsIG51bUNoYW5uZWxzXSA9IGltYWdlcy5zaGFwZTtcbiAgICBjb25zdCB4VmFsdWVzID0gYmFja2VuZC5kYXRhLmdldChpbWFnZXMuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3Qgb3V0cHV0ID0gbmV3IEZsb2F0MzJBcnJheShiYXRjaCAqIG5ld0hlaWdodCAqIG5ld1dpZHRoICogbnVtQ2hhbm5lbHMpO1xuICAgIGNvbnN0IGVmZmVjdGl2ZUlucHV0U2l6ZSA9IFtcbiAgICAgICAgKGFsaWduQ29ybmVycyAmJiBuZXdIZWlnaHQgPiAxKSA/IG9sZEhlaWdodCAtIDEgOiBvbGRIZWlnaHQsXG4gICAgICAgIChhbGlnbkNvcm5lcnMgJiYgbmV3V2lkdGggPiAxKSA/IG9sZFdpZHRoIC0gMSA6IG9sZFdpZHRoXG4gICAgXTtcbiAgICBjb25zdCBlZmZlY3RpdmVPdXRwdXRTaXplID0gW1xuICAgICAgICAoYWxpZ25Db3JuZXJzICYmIG5ld0hlaWdodCA+IDEpID8gbmV3SGVpZ2h0IC0gMSA6IG5ld0hlaWdodCxcbiAgICAgICAgKGFsaWduQ29ybmVycyAmJiBuZXdXaWR0aCA+IDEpID8gbmV3V2lkdGggLSAxIDogbmV3V2lkdGhcbiAgICBdO1xuICAgIGNvbnN0IGVmZmVjdGl2ZVJvd1NpemVSYXRpbyA9IGVmZmVjdGl2ZUlucHV0U2l6ZVswXSAvIGVmZmVjdGl2ZU91dHB1dFNpemVbMF07XG4gICAgY29uc3QgZWZmZWN0aXZlQ29sU2l6ZVJhdGlvID0gZWZmZWN0aXZlSW5wdXRTaXplWzFdIC8gZWZmZWN0aXZlT3V0cHV0U2l6ZVsxXTtcbiAgICBsZXQgb3V0cHV0T2Zmc2V0ID0gMDtcbiAgICBmb3IgKGxldCBiID0gMDsgYiA8IGJhdGNoOyBiKyspIHtcbiAgICAgICAgY29uc3QgYmF0Y2hPZmZzZXQgPSBiICogaW1hZ2VzU3RyaWRlc1swXTtcbiAgICAgICAgZm9yIChsZXQgciA9IDA7IHIgPCBuZXdIZWlnaHQ7IHIrKykge1xuICAgICAgICAgICAgY29uc3Qgc291cmNlRnJhY1JvdyA9IGhhbGZQaXhlbENlbnRlcnMgP1xuICAgICAgICAgICAgICAgIGVmZmVjdGl2ZVJvd1NpemVSYXRpbyAqIChyICsgMC41KSA6XG4gICAgICAgICAgICAgICAgZWZmZWN0aXZlUm93U2l6ZVJhdGlvICogcjtcbiAgICAgICAgICAgIGxldCBzb3VyY2VOZWFyZXN0Um93ID0gTWF0aC5taW4ob2xkSGVpZ2h0IC0gMSwgYWxpZ25Db3JuZXJzID8gTWF0aC5yb3VuZChzb3VyY2VGcmFjUm93KSA6IE1hdGguZmxvb3Ioc291cmNlRnJhY1JvdykpO1xuICAgICAgICAgICAgaWYgKGhhbGZQaXhlbENlbnRlcnMpIHtcbiAgICAgICAgICAgICAgICBzb3VyY2VOZWFyZXN0Um93ID0gTWF0aC5tYXgoMCwgc291cmNlTmVhcmVzdFJvdyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByb3dPZmZzZXQgPSBiYXRjaE9mZnNldCArIHNvdXJjZU5lYXJlc3RSb3cgKiBpbWFnZXNTdHJpZGVzWzFdO1xuICAgICAgICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCBuZXdXaWR0aDsgYysrKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc291cmNlRnJhY0NvbCA9IGhhbGZQaXhlbENlbnRlcnMgP1xuICAgICAgICAgICAgICAgICAgICBlZmZlY3RpdmVDb2xTaXplUmF0aW8gKiAoYyArIDAuNSkgOlxuICAgICAgICAgICAgICAgICAgICBlZmZlY3RpdmVDb2xTaXplUmF0aW8gKiBjO1xuICAgICAgICAgICAgICAgIGxldCBzb3VyY2VOZWFyZXN0Q29sID0gTWF0aC5taW4ob2xkV2lkdGggLSAxLCBhbGlnbkNvcm5lcnMgPyBNYXRoLnJvdW5kKHNvdXJjZUZyYWNDb2wpIDpcbiAgICAgICAgICAgICAgICAgICAgTWF0aC5mbG9vcihzb3VyY2VGcmFjQ29sKSk7XG4gICAgICAgICAgICAgICAgaWYgKGhhbGZQaXhlbENlbnRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgc291cmNlTmVhcmVzdENvbCA9IE1hdGgubWF4KDAsIHNvdXJjZU5lYXJlc3RDb2wpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBjb2xPZmZzZXQgPSByb3dPZmZzZXQgKyBzb3VyY2VOZWFyZXN0Q29sICogaW1hZ2VzU3RyaWRlc1syXTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBkID0gMDsgZCA8IG51bUNoYW5uZWxzOyBkKyspIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQmVnaW4gc2hhZGVyLlxuICAgICAgICAgICAgICAgICAgICAvLyBDb21wdXRlIHRoZSBmcmFjdGlvbmFsIGluZGV4IG9mIHRoZSBzb3VyY2UuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld1ZhbCA9IHhWYWx1ZXNbY29sT2Zmc2V0ICsgZF07XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dFtvdXRwdXRPZmZzZXQrK10gPSBuZXdWYWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtiYXRjaCwgbmV3SGVpZ2h0LCBuZXdXaWR0aCwgbnVtQ2hhbm5lbHNdLCBpbWFnZXMuZHR5cGUsIG91dHB1dCk7XG59XG5leHBvcnQgY29uc3QgcmVzaXplTmVhcmVzdE5laWdoYm9yQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFJlc2l6ZU5lYXJlc3ROZWlnaGJvcixcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogcmVzaXplTmVhcmVzdE5laWdoYm9yXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmVzaXplTmVhcmVzdE5laWdoYm9yLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFJlc2l6ZU5lYXJlc3ROZWlnaGJvckdyYWQsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmV4cG9ydCBmdW5jdGlvbiByZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBpbWFnZXMsIGR5IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBhbGlnbkNvcm5lcnMgfSA9IGF0dHJzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoW2R5LCBpbWFnZXNdLCAncmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZCcpO1xuICAgIGNvbnN0IGltYWdlc1N0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKGltYWdlcy5zaGFwZSk7XG4gICAgY29uc3QgZHlTdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyhkeS5zaGFwZSk7XG4gICAgY29uc3QgW2JhdGNoLCB4SGVpZ2h0LCB4V2lkdGgsIGRlcHRoXSA9IGltYWdlcy5zaGFwZTtcbiAgICBjb25zdCBbLCB5SGVpZ2h0LCB5V2lkdGhdID0gZHkuc2hhcGU7XG4gICAgY29uc3Qgb3V0cHV0ID0gbmV3IEZsb2F0MzJBcnJheShiYXRjaCAqIHhIZWlnaHQgKiB4V2lkdGggKiBkZXB0aCk7XG4gICAgY29uc3QgZHlWYWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KGR5LmRhdGFJZCkudmFsdWVzO1xuICAgIC8vIEluIHRoZSBiYWNrd2FyZHMgcGFzcywgd2Ugd2FudCB0byBmaW5kIHRoZSBwaXhlbHMgdGhhdCB3ZXJlIGdlbmVyYXRlZFxuICAgIC8vIGZvciBlYWNoIHBpeGVsIGluIHRoZSBpbnB1dCBpbWFnZSB0aGUgZm9yd2FyZCBwYXNzXG4gICAgY29uc3QgZWZmZWN0aXZlWFNpemUgPSBbXG4gICAgICAgIChhbGlnbkNvcm5lcnMgJiYgeUhlaWdodCA+IDEpID8geEhlaWdodCAtIDEgOiB4SGVpZ2h0LFxuICAgICAgICAoYWxpZ25Db3JuZXJzICYmIHlXaWR0aCA+IDEpID8geFdpZHRoIC0gMSA6IHhXaWR0aFxuICAgIF07XG4gICAgY29uc3QgZWZmZWN0aXZlWVNpemUgPSBbXG4gICAgICAgIChhbGlnbkNvcm5lcnMgJiYgeUhlaWdodCA+IDEpID8geUhlaWdodCAtIDEgOiB5SGVpZ2h0LFxuICAgICAgICAoYWxpZ25Db3JuZXJzICYmIHlXaWR0aCA+IDEpID8geVdpZHRoIC0gMSA6IHlXaWR0aFxuICAgIF07XG4gICAgY29uc3QgaGVpZ2h0U2NhbGUgPSBlZmZlY3RpdmVYU2l6ZVswXSAvIGVmZmVjdGl2ZVlTaXplWzBdO1xuICAgIGNvbnN0IHdpZHRoU2NhbGUgPSBlZmZlY3RpdmVYU2l6ZVsxXSAvIGVmZmVjdGl2ZVlTaXplWzFdO1xuICAgIGNvbnN0IGludkhlaWdodFNjYWxlID0gMSAvIGhlaWdodFNjYWxlO1xuICAgIGNvbnN0IGludldpZHRoU2NhbGUgPSAxIC8gd2lkdGhTY2FsZTtcbiAgICAvLyBUaGlzIGRlZmluZXMgdGhlIHNpemUgb2YgdGhlIHdpbmRvdyBvZiB2YWx1ZXMgYXJvdW5kIGEgcGFydGljdWxhclxuICAgIC8vIGluZGV4IGluIGR5IHRoYXQgd2Ugd2FudCB0byBzZWFyY2ggZm9yIGNvbnRyaWJ1dGlvbnMgdG8gZHguXG4gICAgY29uc3Qgd2luSGVpZ2h0ID0gKE1hdGguY2VpbChpbnZIZWlnaHRTY2FsZSkgKiAyKSArIDI7XG4gICAgY29uc3Qgd2luV2lkdGggPSAoTWF0aC5jZWlsKGludldpZHRoU2NhbGUpICogMikgKyAyO1xuICAgIC8vIExvb3Agb3ZlciB0aGUgb3V0cHV0IHNwYWNlLlxuICAgIGZvciAobGV0IGIgPSAwOyBiIDwgYmF0Y2g7IGIrKykge1xuICAgICAgICBjb25zdCBiYXRjaE9mZnNldCA9IGIgKiBpbWFnZXNTdHJpZGVzWzBdO1xuICAgICAgICBmb3IgKGxldCByID0gMDsgciA8IHhIZWlnaHQ7IHIrKykge1xuICAgICAgICAgICAgY29uc3Qgcm93T2Zmc2V0ID0gYmF0Y2hPZmZzZXQgKyByICogaW1hZ2VzU3RyaWRlc1sxXTtcbiAgICAgICAgICAgIC8vIENvbXB1dGUgYm91bmRzIGZvciB3aGVyZSBpbiBkeSB3ZSB3aWxsIGxvb2tcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0UkxlcnAgPSBNYXRoLmZsb29yKHIgKiBpbnZIZWlnaHRTY2FsZSk7XG4gICAgICAgICAgICBjb25zdCBzdGFydER5UiA9IE1hdGguZmxvb3Ioc3RhcnRSTGVycCAtICh3aW5IZWlnaHQgLyAyKSk7XG4gICAgICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IHhXaWR0aDsgYysrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29sT2Zmc2V0ID0gcm93T2Zmc2V0ICsgYyAqIGltYWdlc1N0cmlkZXNbMl07XG4gICAgICAgICAgICAgICAgLy8gQ29tcHV0ZSBib3VuZHMgZm9yIHdoZXJlIGluIGR5IHdlIHdpbGwgbG9va1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0Q0xlcnAgPSBNYXRoLmZsb29yKGMgKiBpbnZXaWR0aFNjYWxlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydER5QyA9IE1hdGguZmxvb3Ioc3RhcnRDTGVycCAtICh3aW5XaWR0aCAvIDIpKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBkID0gMDsgZCA8IGRlcHRoOyBkKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFjY3VtID0gMDtcbiAgICAgICAgICAgICAgICAgICAgLy8gbG9vcCBvdmVyIGR5XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGR5UkluZGV4ID0gMDsgZHlSSW5kZXggPCB3aW5IZWlnaHQ7IGR5UkluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGR5UiA9IGR5UkluZGV4ICsgc3RhcnREeVI7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBHdWFyZCBhZ2FpbnN0IHRoZSB3aW5kb3cgZXhjZWVkaW5nIHRoZSBib3VuZHMgb2YgZHlcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkeVIgPCAwIHx8IGR5UiA+PSB5SGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkeVJPZmZzZXQgPSBiYXRjaE9mZnNldCArIGR5UiAqIGR5U3RyaWRlc1sxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZUZyYWNSb3cgPSBkeVIgKiBoZWlnaHRTY2FsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZU5lYXJlc3RSb3cgPSBNYXRoLm1pbih4SGVpZ2h0IC0gMSwgYWxpZ25Db3JuZXJzID8gTWF0aC5yb3VuZChzb3VyY2VGcmFjUm93KSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5mbG9vcihzb3VyY2VGcmFjUm93KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAociAhPT0gc291cmNlTmVhcmVzdFJvdykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgZHlDSW5kZXggPSAwOyBkeUNJbmRleCA8IHdpbldpZHRoOyBkeUNJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZHlDID0gZHlDSW5kZXggKyBzdGFydER5QztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHdWFyZCBhZ2FpbnN0IHRoZSB3aW5kb3cgZXhjZWVkaW5nIHRoZSBib3VuZHMgb2YgZHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHlDIDwgMCB8fCBkeUMgPj0geVdpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkeUNPZmZzZXQgPSBkeVJPZmZzZXQgKyBkeUMgKiBkeVN0cmlkZXNbMl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc291cmNlRnJhY0NvbCA9IGR5QyAqIHdpZHRoU2NhbGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc291cmNlTmVhcmVzdENvbCA9IE1hdGgubWluKHhXaWR0aCAtIDEsIGFsaWduQ29ybmVycyA/IE1hdGgucm91bmQoc291cmNlRnJhY0NvbCkgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLmZsb29yKHNvdXJjZUZyYWNDb2wpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PT0gc291cmNlTmVhcmVzdENvbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2N1bSArPSBkeVZhbHVlc1tkeUNPZmZzZXQgKyBkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0W2NvbE9mZnNldCArIGRdID0gYWNjdW07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKGltYWdlcy5zaGFwZSwgaW1hZ2VzLmR0eXBlLCBvdXRwdXQpO1xufVxuZXhwb3J0IGNvbnN0IHJlc2l6ZU5lYXJlc3ROZWlnaGJvckdyYWRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogUmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogcmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlc2l6ZU5lYXJlc3ROZWlnaGJvckdyYWQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgUmV2ZXJzZSwgVGVuc29yQnVmZmVyLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5pbXBvcnQgeyBpZGVudGl0eSB9IGZyb20gJy4vSWRlbnRpdHknO1xuZXhwb3J0IGZ1bmN0aW9uIHJldmVyc2UoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGRpbXMgfSA9IGF0dHJzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoeCwgJ3JldmVyc2UnKTtcbiAgICBjb25zdCB4UmFuayA9IHguc2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0ICRkaW1zID0gdXRpbC5wYXJzZUF4aXNQYXJhbShkaW1zLCB4LnNoYXBlKTtcbiAgICBpZiAoeFJhbmsgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGlkZW50aXR5KHsgaW5wdXRzOiB7IHggfSwgYmFja2VuZCB9KTtcbiAgICB9XG4gICAgY29uc3Qgb3V0QnVmID0gbmV3IFRlbnNvckJ1ZmZlcih4LnNoYXBlLCB4LmR0eXBlKTtcbiAgICBjb25zdCB4QnVmID0gYmFja2VuZC5idWZmZXJTeW5jKHgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3V0QnVmLnNpemU7IGkrKykge1xuICAgICAgICBjb25zdCBvdXRMb2MgPSBvdXRCdWYuaW5kZXhUb0xvYyhpKTtcbiAgICAgICAgY29uc3QgaW5Mb2MgPSBvdXRMb2Muc2xpY2UoKTtcbiAgICAgICAgJGRpbXMuZm9yRWFjaChkID0+IGluTG9jW2RdID0geC5zaGFwZVtkXSAtIDEgLSBpbkxvY1tkXSk7XG4gICAgICAgIG91dEJ1Zi5zZXQoeEJ1Zi5nZXQoLi4uaW5Mb2MpLCAuLi5vdXRMb2MpO1xuICAgIH1cbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRCdWYuc2hhcGUsIG91dEJ1Zi5kdHlwZSwgb3V0QnVmLnZhbHVlcyk7XG59XG5leHBvcnQgY29uc3QgcmV2ZXJzZUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBSZXZlcnNlLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiByZXZlcnNlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmV2ZXJzZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIFJvdGF0ZVdpdGhPZmZzZXQsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuZXhwb3J0IGNvbnN0IHJvdGF0ZVdpdGhPZmZzZXRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogUm90YXRlV2l0aE9mZnNldCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogKHsgaW5wdXRzLCBhdHRycywgYmFja2VuZCB9KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgaW1hZ2UgfSA9IGlucHV0cztcbiAgICAgICAgY29uc3QgeyByYWRpYW5zLCBmaWxsVmFsdWUsIGNlbnRlciB9ID0gYXR0cnM7XG4gICAgICAgIGNvbnN0IGNwdUJhY2tlbmQgPSBiYWNrZW5kO1xuICAgICAgICBjb25zdCBvdXRwdXQgPSB1dGlsLmdldFR5cGVkQXJyYXlGcm9tRFR5cGUoaW1hZ2UuZHR5cGUsIHV0aWwuc2l6ZUZyb21TaGFwZShpbWFnZS5zaGFwZSkpO1xuICAgICAgICBjb25zdCBbYmF0Y2gsIGltYWdlSGVpZ2h0LCBpbWFnZVdpZHRoLCBudW1DaGFubmVsc10gPSBpbWFnZS5zaGFwZTtcbiAgICAgICAgY29uc3QgW2NlbnRlclgsIGNlbnRlclldID0gYmFja2VuZF91dGlsLmdldEltYWdlQ2VudGVyKGNlbnRlciwgaW1hZ2VIZWlnaHQsIGltYWdlV2lkdGgpO1xuICAgICAgICBjb25zdCBmdWxsT3BhY2l0eVZhbHVlID0gMjU1O1xuICAgICAgICBjb25zdCBzaW5GYWN0b3IgPSBNYXRoLnNpbihyYWRpYW5zKTtcbiAgICAgICAgY29uc3QgY29zRmFjdG9yID0gTWF0aC5jb3MocmFkaWFucyk7XG4gICAgICAgIGNvbnN0IGltYWdlVmFscyA9IGNwdUJhY2tlbmQuZGF0YS5nZXQoaW1hZ2UuZGF0YUlkKS52YWx1ZXM7XG4gICAgICAgIGZvciAobGV0IGJhdGNoSWR4ID0gMDsgYmF0Y2hJZHggPCBiYXRjaDsgYmF0Y2hJZHgrKykge1xuICAgICAgICAgICAgY29uc3QgYmF0Y2hPZmZzZXQgPSBiYXRjaElkeCAqIGltYWdlV2lkdGggKiBpbWFnZUhlaWdodCAqIG51bUNoYW5uZWxzO1xuICAgICAgICAgICAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgaW1hZ2VIZWlnaHQ7IHJvdysrKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm93T2Zmc2V0ID0gcm93ICogKGltYWdlV2lkdGggKiBudW1DaGFubmVscyk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgY29sID0gMDsgY29sIDwgaW1hZ2VXaWR0aDsgY29sKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29sT2Zmc2V0ID0gY29sICogbnVtQ2hhbm5lbHM7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgbnVtQ2hhbm5lbHM7IGNoYW5uZWwrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29vcmRzID0gW2JhdGNoLCByb3csIGNvbCwgY2hhbm5lbF07XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4ID0gY29vcmRzWzJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeSA9IGNvb3Jkc1sxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvb3JkWC9jb29yZFkgYXJlIHRoZSByZXN1bHQgb2Ygcm90YXRpbmcgYW5kIHRyYW5zbGF0aW5nIHgveS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb29yZFggPSAoeCAtIGNlbnRlclgpICogY29zRmFjdG9yIC0gKHkgLSBjZW50ZXJZKSAqIHNpbkZhY3RvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb29yZFkgPSAoeCAtIGNlbnRlclgpICogc2luRmFjdG9yICsgKHkgLSBjZW50ZXJZKSAqIGNvc0ZhY3RvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvb3JkWCA9IE1hdGgucm91bmQoY29vcmRYICsgY2VudGVyWCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb29yZFkgPSBNYXRoLnJvdW5kKGNvb3JkWSArIGNlbnRlclkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG91dHB1dFZhbHVlID0gZmlsbFZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmaWxsVmFsdWUgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoYW5uZWwgPT09IDMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0VmFsdWUgPSBmdWxsT3BhY2l0eVZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0VmFsdWUgPSBmaWxsVmFsdWVbY2hhbm5lbF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGNvb3JkaW5hdGUgcG9zaXRpb24gZmFsbHMgd2l0aGluIHRoZSBpbWFnZSBib3VuZGFyaWVzLi4uXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29vcmRYID49IDAgJiYgY29vcmRYIDwgaW1hZ2VXaWR0aCAmJiBjb29yZFkgPj0gMCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb3JkWSA8IGltYWdlSGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHRoZSBvdXRwdXQgdG8gdGhlIGltYWdlIHZhbHVlIGF0IHRoZSBjb29yZGluYXRlIHBvc2l0aW9uLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJvdGF0ZWRSb3dPZmZzZXQgPSBjb29yZFkgKiAoaW1hZ2VXaWR0aCAqIG51bUNoYW5uZWxzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByb3RhdGVkQ29sT2Zmc2V0ID0gY29vcmRYICogbnVtQ2hhbm5lbHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW1hZ2VJZHggPSBiYXRjaE9mZnNldCArIHJvdGF0ZWRSb3dPZmZzZXQgKyByb3RhdGVkQ29sT2Zmc2V0ICsgY2hhbm5lbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRWYWx1ZSA9IGltYWdlVmFsc1tpbWFnZUlkeF07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvdXRJZHggPSBiYXRjaE9mZnNldCArIHJvd09mZnNldCArIGNvbE9mZnNldCArIGNoYW5uZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRbb3V0SWR4XSA9IG91dHB1dFZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRhdGFJZCA9IGNwdUJhY2tlbmQud3JpdGUob3V0cHV0LCBpbWFnZS5zaGFwZSwgaW1hZ2UuZHR5cGUpO1xuICAgICAgICByZXR1cm4geyBkYXRhSWQsIHNoYXBlOiBpbWFnZS5zaGFwZSwgZHR5cGU6IGltYWdlLmR0eXBlIH07XG4gICAgfVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJvdGF0ZVdpdGhPZmZzZXQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFJvdW5kIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHVuYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCByb3VuZCA9IHVuYXJ5S2VybmVsRnVuYyhSb3VuZCwgKHhpKSA9PiB7XG4gICAgLy8gVGhlIGFsZ29yaXRobSBpcyBiYXNlZCBvbiBiYW5rZXIncyByb3VuZGluZy5cbiAgICBjb25zdCBiYXNlID0gTWF0aC5mbG9vcih4aSk7XG4gICAgaWYgKHhpIC0gYmFzZSA8IDAuNSkge1xuICAgICAgICByZXR1cm4gTWF0aC5mbG9vcih4aSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHhpIC0gYmFzZSA+IDAuNSkge1xuICAgICAgICByZXR1cm4gTWF0aC5jZWlsKHhpKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmIChiYXNlICUgMi4wID09PSAwLjApIHtcbiAgICAgICAgICAgIHJldHVybiBiYXNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGJhc2UgKyAxLjA7XG4gICAgICAgIH1cbiAgICB9XG59KTtcbmV4cG9ydCBjb25zdCByb3VuZENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBSb3VuZCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogcm91bmQsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Um91bmQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFJzcXJ0IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVNpbXBsZVVuYXJ5SW1wbCB9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X2ltcGwnO1xuaW1wb3J0IHsgdW5hcnlLZXJuZWxGdW5jRnJvbUltcGwgfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5leHBvcnQgY29uc3QgcnNxcnRJbXBsID0gY3JlYXRlU2ltcGxlVW5hcnlJbXBsKCh4aSkgPT4gMSAvIE1hdGguc3FydCh4aSkpO1xuZXhwb3J0IGNvbnN0IHJzcXJ0ID0gdW5hcnlLZXJuZWxGdW5jRnJvbUltcGwoUnNxcnQsIHJzcXJ0SW1wbCk7XG5leHBvcnQgY29uc3QgcnNxcnRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogUnNxcnQsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHJzcXJ0LFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJzcXJ0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgU2NhdHRlck5kIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHNjYXR0ZXJJbXBsIH0gZnJvbSAnLi9TY2F0dGVyX2ltcGwnO1xuZXhwb3J0IGZ1bmN0aW9uIHNjYXR0ZXJOZChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgaW5kaWNlcywgdXBkYXRlcyB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgc2hhcGUgfSA9IGF0dHJzO1xuICAgIGNvbnN0IHsgc2xpY2VSYW5rLCBudW1VcGRhdGVzLCBzbGljZVNpemUsIHN0cmlkZXMsIG91dHB1dFNpemUgfSA9IGJhY2tlbmRfdXRpbC5jYWxjdWxhdGVTaGFwZXModXBkYXRlcywgaW5kaWNlcywgc2hhcGUpO1xuICAgIGNvbnN0IHN1bUR1cGVJbmRpY2VzID0gdHJ1ZTtcbiAgICBjb25zdCBpbmRpY2VzQnVmID0gYmFja2VuZC5idWZmZXJTeW5jKGluZGljZXMpO1xuICAgIGNvbnN0IHVwZGF0ZXNCdWYgPSBiYWNrZW5kLmJ1ZmZlclN5bmModXBkYXRlcyk7XG4gICAgY29uc3Qgb3V0QnVmID0gc2NhdHRlckltcGwoaW5kaWNlc0J1ZiwgdXBkYXRlc0J1Ziwgc2hhcGUsIG91dHB1dFNpemUsIHNsaWNlU2l6ZSwgbnVtVXBkYXRlcywgc2xpY2VSYW5rLCBzdHJpZGVzLCAwIC8qIGRlZmF1bHRWYWx1ZSAqLywgc3VtRHVwZUluZGljZXMpO1xuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHNoYXBlLCBvdXRCdWYuZHR5cGUsIG91dEJ1Zi52YWx1ZXMpO1xufVxuZXhwb3J0IGNvbnN0IHNjYXR0ZXJOZENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBTY2F0dGVyTmQsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHNjYXR0ZXJOZFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNjYXR0ZXJOZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBidWZmZXIgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuZXhwb3J0IGZ1bmN0aW9uIHNjYXR0ZXJJbXBsKGluZGljZXMsIHVwZGF0ZXMsIHNoYXBlLCBvdXRwdXRTaXplLCBzbGljZVNpemUsIG51bVVwZGF0ZXMsIHNsaWNlUmFuaywgc3RyaWRlcywgZGVmYXVsdFZhbHVlLCBzdW1EdXBlSW5kaWNlcykge1xuICAgIGNvbnN0IGZsYXR0ZW5TaGFwZSA9IFtvdXRwdXRTaXplIC8gc2xpY2VTaXplLCBzbGljZVNpemVdO1xuICAgIGNvbnN0IGluZGljZXNEYXRhID0gaW5kaWNlcy52YWx1ZXM7XG4gICAgY29uc3QgdXBkYXRlc0RhdGEgPSB1cGRhdGVzLnZhbHVlcztcbiAgICBpZiAob3V0cHV0U2l6ZSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gYnVmZmVyKHNoYXBlLCB1cGRhdGVzLmR0eXBlKTtcbiAgICB9XG4gICAgY29uc3Qgb3V0QnVmID0gYnVmZmVyKGZsYXR0ZW5TaGFwZSwgdXBkYXRlcy5kdHlwZSk7XG4gICAgb3V0QnVmLnZhbHVlcy5maWxsKGRlZmF1bHRWYWx1ZSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1VcGRhdGVzOyBpKyspIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBbXTtcbiAgICAgICAgbGV0IGZsYXR0ZW5JbmRleCA9IDA7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgc2xpY2VSYW5rOyBqKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGRpbSA9IGluZGljZXNEYXRhW2kgKiBzbGljZVJhbmsgKyBqXTtcbiAgICAgICAgICAgIGluZGV4LnB1c2goZGltKTtcbiAgICAgICAgICAgIGZsYXR0ZW5JbmRleCArPSBkaW0gKiBzdHJpZGVzW2pdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmbGF0dGVuSW5kZXggPCAwIHx8IGZsYXR0ZW5JbmRleCA+PSBvdXRwdXRTaXplIC8gc2xpY2VTaXplKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgaW5kaWNlczogJHtpbmRleH0gZG9lcyBub3QgaW5kZXggaW50byAke3NoYXBlfWApO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgc2xpY2VTaXplOyBrKyspIHtcbiAgICAgICAgICAgIGlmIChzdW1EdXBlSW5kaWNlcykge1xuICAgICAgICAgICAgICAgIG91dEJ1Zi52YWx1ZXNbZmxhdHRlbkluZGV4ICogc2xpY2VTaXplICsga10gKz1cbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlc0RhdGFbaSAqIHNsaWNlU2l6ZSArIGtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgb3V0QnVmLnZhbHVlc1tmbGF0dGVuSW5kZXggKiBzbGljZVNpemUgKyBrXSA9IHVwZGF0ZXMucmFuayA9PT0gMCA/XG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZXNEYXRhWzBdIDpcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlc0RhdGFbaSAqIHNsaWNlU2l6ZSArIGtdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXRCdWY7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TY2F0dGVyX2ltcGwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgU2VsZWN0LCB1cGNhc3RUeXBlLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0KGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCB7IGNvbmRpdGlvbiwgdCwgZSB9ID0gaW5wdXRzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoW2NvbmRpdGlvbiwgdCwgZV0sICdzZWxlY3QnKTtcbiAgICBjb25zdCBjb25kaXRpb25SYW5rID0gY29uZGl0aW9uLnNoYXBlLmxlbmd0aDtcbiAgICBjb25zdCB2YWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KGNvbmRpdGlvbi5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCB0VmFsdWVzID0gYmFja2VuZC5kYXRhLmdldCh0LmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IGVWYWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KGUuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgcmVzdWx0RHR5cGUgPSB1cGNhc3RUeXBlKHQuZHR5cGUsIGUuZHR5cGUpO1xuICAgIGNvbnN0IG5ld1ZhbHVlcyA9IHV0aWwubWFrZVplcm9zVHlwZWRBcnJheSh1dGlsLnNpemVGcm9tU2hhcGUodC5zaGFwZSksIHJlc3VsdER0eXBlKTtcbiAgICBsZXQgaW5kZXggPSAwO1xuICAgIGNvbnN0IG9mZnNldCA9IGNvbmRpdGlvblJhbmsgPT09IDAgfHwgY29uZGl0aW9uUmFuayA+IDEgfHwgdC5zaGFwZS5sZW5ndGggPT09IDEgP1xuICAgICAgICAxIDpcbiAgICAgICAgdXRpbC5zaXplRnJvbVNoYXBlKHQuc2hhcGUuc2xpY2UoMSkpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgb2Zmc2V0OyBqKyspIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZXNbaV0gPT09IDEpIHtcbiAgICAgICAgICAgICAgICBuZXdWYWx1ZXNbaW5kZXgrK10gPSB0VmFsdWVzW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbmV3VmFsdWVzW2luZGV4KytdID0gZVZhbHVlc1tpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyh0LnNoYXBlLCByZXN1bHREdHlwZSwgbmV3VmFsdWVzKTtcbn1cbmV4cG9ydCBjb25zdCBzZWxlY3RDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogU2VsZWN0LFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBzZWxlY3Rcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TZWxlY3QuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgU2VsdSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5jb25zdCBzY2FsZUFscGhhID0gYmFja2VuZF91dGlsLlNFTFVfU0NBTEVBTFBIQTtcbmNvbnN0IHNjYWxlID0gYmFja2VuZF91dGlsLlNFTFVfU0NBTEU7XG5leHBvcnQgY29uc3Qgc2VsdSA9IHVuYXJ5S2VybmVsRnVuYyhTZWx1LCAoeGkpID0+IHtcbiAgICBpZiAoeGkgPj0gMCkge1xuICAgICAgICByZXR1cm4gc2NhbGUgKiB4aTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBzY2FsZUFscGhhICogKE1hdGguZXhwKHhpKSAtIDEpO1xuICAgIH1cbn0pO1xuZXhwb3J0IGNvbnN0IHNlbHVDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogU2VsdSxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogc2VsdSxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TZWx1LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBTaWdtb2lkIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHVuYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCBzaWdtb2lkID0gdW5hcnlLZXJuZWxGdW5jKFNpZ21vaWQsICh4aSkgPT4gMSAvICgxICsgTWF0aC5leHAoLXhpKSkpO1xuZXhwb3J0IGNvbnN0IHNpZ21vaWRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogU2lnbW9pZCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogc2lnbW9pZCxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TaWdtb2lkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBTaWduIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHVuYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCBzaWduID0gdW5hcnlLZXJuZWxGdW5jKFNpZ24sICh4aSkgPT4ge1xuICAgIGlmICh4aSA8IDApIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgIH1cbiAgICBlbHNlIGlmICh4aSA+IDApIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG59KTtcbmV4cG9ydCBjb25zdCBzaWduQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFNpZ24sXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHNpZ24sXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2lnbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgU2luIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHVuYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCBzaW4gPSB1bmFyeUtlcm5lbEZ1bmMoU2luLCAoeGkpID0+IE1hdGguc2luKHhpKSk7XG5leHBvcnQgY29uc3Qgc2luQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFNpbixcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogc2luLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNpbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgU2luaCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5leHBvcnQgY29uc3Qgc2luaCA9IHVuYXJ5S2VybmVsRnVuYyhTaW5oLCAoeGkpID0+IE1hdGguc2luaCh4aSkpO1xuZXhwb3J0IGNvbnN0IHNpbmhDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogU2luaCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogc2luaCxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TaW5oLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgYnVmZmVyLCBTbGljZSwgc2xpY2VfdXRpbCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIHNsaWNlSW1wbCh2YWxzLCBiZWdpbiwgc2l6ZSwgc2hhcGUsIGR0eXBlKSB7XG4gICAgY29uc3QgaXNDb250aW5vdXMgPSBzbGljZV91dGlsLmlzU2xpY2VDb250aW5vdXMoc2hhcGUsIGJlZ2luLCBzaXplKTtcbiAgICBjb25zdCBsZW5ndGggPSB1dGlsLnNpemVGcm9tU2hhcGUoc2l6ZSk7XG4gICAgY29uc3QgeFN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKHNoYXBlKTtcbiAgICBpZiAoaXNDb250aW5vdXMpIHtcbiAgICAgICAgY29uc3QgZmxhdE9mZnNldCA9IHNsaWNlX3V0aWwuY29tcHV0ZUZsYXRPZmZzZXQoYmVnaW4sIHhTdHJpZGVzKTtcbiAgICAgICAgaWYgKGR0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHMuc2xpY2UoZmxhdE9mZnNldCwgZmxhdE9mZnNldCArIGxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHMuc3ViYXJyYXkoZmxhdE9mZnNldCwgZmxhdE9mZnNldCArIGxlbmd0aCk7XG4gICAgfVxuICAgIGNvbnN0IGRlY29kZWREYXRhID0gZHR5cGUgPT09ICdzdHJpbmcnID9cbiAgICAgICAgYmFja2VuZF91dGlsLmZyb21VaW50OFRvU3RyaW5nQXJyYXkodmFscykgOlxuICAgICAgICB2YWxzO1xuICAgIGNvbnN0IGluQnVmID0gYnVmZmVyKHNoYXBlLCBkdHlwZSwgZGVjb2RlZERhdGEpO1xuICAgIGNvbnN0IG91dEJ1ZiA9IGJ1ZmZlcihzaXplLCBkdHlwZSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvdXRCdWYuc2l6ZTsgKytpKSB7XG4gICAgICAgIGNvbnN0IG91dExvYyA9IG91dEJ1Zi5pbmRleFRvTG9jKGkpO1xuICAgICAgICBjb25zdCBpbkxvYyA9IG91dExvYy5tYXAoKGlkeCwgaikgPT4gaWR4ICsgYmVnaW5bal0pO1xuICAgICAgICBvdXRCdWYuc2V0KGluQnVmLmdldCguLi5pbkxvYyksIC4uLm91dExvYyk7XG4gICAgfVxuICAgIGlmIChkdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIGJhY2tlbmRfdXRpbC5mcm9tU3RyaW5nQXJyYXlUb1VpbnQ4KG91dEJ1Zi52YWx1ZXMpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0QnVmLnZhbHVlcztcbn1cbmV4cG9ydCBmdW5jdGlvbiBzbGljZShhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgYmVnaW4sIHNpemUgfSA9IGF0dHJzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoeCwgJ3NsaWNlJyk7XG4gICAgY29uc3QgWyRiZWdpbiwgJHNpemVdID0gc2xpY2VfdXRpbC5wYXJzZVNsaWNlUGFyYW1zKHgsIGJlZ2luLCBzaXplKTtcbiAgICBzbGljZV91dGlsLmFzc2VydFBhcmFtc1ZhbGlkKHgsICRiZWdpbiwgJHNpemUpO1xuICAgIGNvbnN0IHZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3Qgb3V0VmFscyA9IHNsaWNlSW1wbCh2YWxzLCAkYmVnaW4sICRzaXplLCB4LnNoYXBlLCB4LmR0eXBlKTtcbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbygkc2l6ZSwgeC5kdHlwZSwgb3V0VmFscyk7XG59XG5leHBvcnQgY29uc3Qgc2xpY2VDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogU2xpY2UsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHNsaWNlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2xpY2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBTb2Z0bWF4LCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGV4cCB9IGZyb20gJy4vRXhwJztcbmltcG9ydCB7IG1heCB9IGZyb20gJy4vTWF4JztcbmltcG9ydCB7IGRpdiB9IGZyb20gJy4vUmVhbERpdic7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9SZXNoYXBlJztcbmltcG9ydCB7IHN1YiB9IGZyb20gJy4vU3ViJztcbmltcG9ydCB7IHN1bSB9IGZyb20gJy4vU3VtJztcbmV4cG9ydCBmdW5jdGlvbiBzb2Z0bWF4KGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBsb2dpdHMgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGRpbSB9ID0gYXR0cnM7XG4gICAgY29uc3QgbG9naXRzUmFuayA9IGxvZ2l0cy5zaGFwZS5sZW5ndGg7XG4gICAgbGV0ICRkaW0gPSBkaW07XG4gICAgaWYgKCRkaW0gPT09IC0xKSB7XG4gICAgICAgICRkaW0gPSBsb2dpdHNSYW5rIC0gMTtcbiAgICB9XG4gICAgaWYgKCRkaW0gIT09IGxvZ2l0c1JhbmsgLSAxKSB7XG4gICAgICAgIHRocm93IEVycm9yKCdTb2Z0bWF4IGFsb25nIGEgbm9uLWxhc3QgZGltZW5zaW9uIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLiAnICtcbiAgICAgICAgICAgIGBMb2dpdHMgd2FzIHJhbmsgJHtsb2dpdHNSYW5rfSBhbmQgZGltIHdhcyAkeyRkaW19YCk7XG4gICAgfVxuICAgIGNvbnN0IGF4ZXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKFskZGltXSwgbG9naXRzLnNoYXBlKTtcbiAgICBjb25zdCBtYXhMb2dpdCA9IG1heCh7XG4gICAgICAgIGlucHV0czogeyB4OiBsb2dpdHMgfSxcbiAgICAgICAgYmFja2VuZCxcbiAgICAgICAgYXR0cnM6IHsgcmVkdWN0aW9uSW5kaWNlczogYXhlcywga2VlcERpbXM6IGZhbHNlIH1cbiAgICB9KTtcbiAgICBjb25zdCBleHBhbmRlZFNoYXBlID0gYmFja2VuZF91dGlsLmV4cGFuZFNoYXBlVG9LZWVwRGltKG1heExvZ2l0LnNoYXBlLCBheGVzKTtcbiAgICBjb25zdCBtYXhMb2dpdFJlc2hhcGVkID0gcmVzaGFwZSh7IGlucHV0czogeyB4OiBtYXhMb2dpdCB9LCBiYWNrZW5kLCBhdHRyczogeyBzaGFwZTogZXhwYW5kZWRTaGFwZSB9IH0pO1xuICAgIGNvbnN0IGEgPSBzdWIoeyBpbnB1dHM6IHsgYTogbG9naXRzLCBiOiBtYXhMb2dpdFJlc2hhcGVkIH0sIGJhY2tlbmQgfSk7XG4gICAgY29uc3QgYiA9IGV4cCh7IGlucHV0czogeyB4OiBhIH0sIGJhY2tlbmQgfSk7XG4gICAgY29uc3Qgc3VtRXhwID0gc3VtKHsgaW5wdXRzOiB7IHg6IGIgfSwgYmFja2VuZCwgYXR0cnM6IHsgYXhpczogYXhlcywga2VlcERpbXM6IGZhbHNlIH0gfSk7XG4gICAgY29uc3Qgc3VtUmVzaGFwZWQgPSByZXNoYXBlKHsgaW5wdXRzOiB7IHg6IHN1bUV4cCB9LCBiYWNrZW5kLCBhdHRyczogeyBzaGFwZTogZXhwYW5kZWRTaGFwZSB9IH0pO1xuICAgIGNvbnN0IHJlc3VsdCA9IGRpdih7IGlucHV0czogeyBhOiBiLCBiOiBzdW1SZXNoYXBlZCB9LCBiYWNrZW5kIH0pO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8obWF4TG9naXQpO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8obWF4TG9naXRSZXNoYXBlZCk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhhKTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGIpO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oc3VtRXhwKTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHN1bVJlc2hhcGVkKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0IGNvbnN0IHNvZnRtYXhDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogU29mdG1heCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogc29mdG1heFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNvZnRtYXguanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFNvZnRwbHVzIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHVuYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X3V0aWxzJztcbi8vIG1pcnJvcnMgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRmLm5uLnNvZnRwbHVzOiBodHRwczovL2dvby5nbC92a2N2d1hcbi8vIGVwc2lsb24gaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiAxLjAgYW5kIHRoZSBuZXh0IHJlcHJlc2VudGFibGUgZmxvYXQuXG4vLyBGb3IgYSBzaW5nbGUgcHJlY2lzaW9uIDMyIGJpdCBmbG9hdCB0aGlzIHNob3VsZCBiZSAyXi0yMywgc2VlOlxuLy8gaHR0cHM6Ly9tYXRoLmJ5dS5lZHUvfnNjaG93L3dvcmsvSUVFRUZsb2F0aW5nUG9pbnQuaHRtXG5jb25zdCBlcHNpbG9uID0gMS4xOTIwOTI4OTU1MDc4MTI1ZS03O1xuY29uc3QgdGhyZXNob2xkID0gTWF0aC5sb2coZXBzaWxvbikgKyAyLjA7XG5leHBvcnQgY29uc3Qgc29mdHBsdXMgPSB1bmFyeUtlcm5lbEZ1bmMoU29mdHBsdXMsICh4aSkgPT4ge1xuICAgIC8vIFZhbHVlIGFib3ZlIHdoaWNoIGV4cCh4KSBtYXkgb3ZlcmZsb3csIGJ1dCBzb2Z0cGx1cyh4KSA9PSB4XG4gICAgLy8gaXMgd2l0aGluIG1hY2hpbmUgZXBzaWxvbi5cbiAgICBjb25zdCB0b29MYXJnZSA9IHhpID4gLXRocmVzaG9sZDtcbiAgICAvLyBWYWx1ZSBiZWxvdyB3aGljaCBleHAoeCkgbWF5IHVuZGVyZmxvdywgYnV0IHNvZnRwbHVzKHgpID09IGV4cCh4KVxuICAgIC8vIGlzIHdpdGhpbiBtYWNoaW5lIGVwc2lsb24uXG4gICAgY29uc3QgdG9vU21hbGwgPSB4aSA8IHRocmVzaG9sZDtcbiAgICBjb25zdCBleHBYID0gTWF0aC5leHAoeGkpO1xuICAgIGxldCByZXN1bHQ7XG4gICAgaWYgKHRvb1NtYWxsKSB7XG4gICAgICAgIHJlc3VsdCA9IGV4cFg7XG4gICAgfVxuICAgIGVsc2UgaWYgKHRvb0xhcmdlKSB7XG4gICAgICAgIHJlc3VsdCA9IHhpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID0gTWF0aC5sb2coMS4wICsgZXhwWCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59KTtcbmV4cG9ydCBjb25zdCBzb2Z0cGx1c0NvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBTb2Z0cGx1cyxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogc29mdHBsdXMsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U29mdHBsdXMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBTcGFjZVRvQmF0Y2hORCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuaW1wb3J0IHsgcGFkVjJDb25maWcgfSBmcm9tICcuL1BhZFYyJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL1Jlc2hhcGUnO1xuaW1wb3J0IHsgdHJhbnNwb3NlIH0gZnJvbSAnLi9UcmFuc3Bvc2UnO1xuZXhwb3J0IGZ1bmN0aW9uIHNwYWNlVG9CYXRjaE5EKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBibG9ja1NoYXBlLCBwYWRkaW5ncyB9ID0gYXR0cnM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleChbeF0sICdzcGFjZVRvQmF0Y2hORCcpO1xuICAgIGNvbnN0IHByb2QgPSB1dGlsLnNpemVGcm9tU2hhcGUoYmxvY2tTaGFwZSk7XG4gICAgY29uc3QgY29tcGxldGVQYWRkaW5ncyA9IFtbMCwgMF1dO1xuICAgIGNvbXBsZXRlUGFkZGluZ3MucHVzaCguLi5wYWRkaW5ncyk7XG4gICAgZm9yIChsZXQgaSA9IDEgKyBibG9ja1NoYXBlLmxlbmd0aDsgaSA8IHguc2hhcGUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY29tcGxldGVQYWRkaW5ncy5wdXNoKFswLCAwXSk7XG4gICAgfVxuICAgIGNvbnN0IHBhZGRlZFggPSBwYWRWMkNvbmZpZy5rZXJuZWxGdW5jKHtcbiAgICAgICAgaW5wdXRzOiB7IHggfSxcbiAgICAgICAgYmFja2VuZCxcbiAgICAgICAgYXR0cnM6IHsgcGFkZGluZ3M6IGNvbXBsZXRlUGFkZGluZ3MsIGNvbnN0YW50VmFsdWU6IDAgfVxuICAgIH0pO1xuICAgIGNvbnN0IHJlc2hhcGVkUGFkZGVkU2hhcGUgPSBiYWNrZW5kX3V0aWwuZ2V0UmVzaGFwZWQocGFkZGVkWC5zaGFwZSwgYmxvY2tTaGFwZSwgcHJvZCwgZmFsc2UpO1xuICAgIGNvbnN0IHBlcm11dGVkUmVzaGFwZWRQYWRkZWRQZXJtdXRhdGlvbiA9IGJhY2tlbmRfdXRpbC5nZXRQZXJtdXRlZChyZXNoYXBlZFBhZGRlZFNoYXBlLmxlbmd0aCwgYmxvY2tTaGFwZS5sZW5ndGgsIGZhbHNlKTtcbiAgICBjb25zdCBmbGF0dGVuU2hhcGUgPSBiYWNrZW5kX3V0aWwuZ2V0UmVzaGFwZWRQZXJtdXRlZChwYWRkZWRYLnNoYXBlLCBibG9ja1NoYXBlLCBwcm9kLCBmYWxzZSk7XG4gICAgY29uc3QgcmVzaGFwZUlucHV0cyA9IHsgeDogcGFkZGVkWCB9O1xuICAgIGNvbnN0IHJlc2hhcGVBdHRycyA9IHsgc2hhcGU6IHJlc2hhcGVkUGFkZGVkU2hhcGUgfTtcbiAgICBjb25zdCBwYWRkZWRYUmVzaGFwZWQgPSByZXNoYXBlKHsgaW5wdXRzOiByZXNoYXBlSW5wdXRzLCBiYWNrZW5kLCBhdHRyczogcmVzaGFwZUF0dHJzIH0pO1xuICAgIGNvbnN0IHRyYW5zcG9zZUlucHV0cyA9IHsgeDogcGFkZGVkWFJlc2hhcGVkIH07XG4gICAgY29uc3QgdHJhbnNwb3NlQXR0cnMgPSB7IHBlcm06IHBlcm11dGVkUmVzaGFwZWRQYWRkZWRQZXJtdXRhdGlvbiB9O1xuICAgIGNvbnN0IHBhZGRlZFhUID0gdHJhbnNwb3NlKHsgaW5wdXRzOiB0cmFuc3Bvc2VJbnB1dHMsIGJhY2tlbmQsIGF0dHJzOiB0cmFuc3Bvc2VBdHRycyB9KTtcbiAgICBjb25zdCByZXN1bHRSZXNoYXBlSW5wdXRzID0geyB4OiBwYWRkZWRYVCB9O1xuICAgIGNvbnN0IHJlc3VsdFJlc2hhcGVBdHRycyA9IHsgc2hhcGU6IGZsYXR0ZW5TaGFwZSB9O1xuICAgIGNvbnN0IHJlc3VsdCA9IHJlc2hhcGUoeyBpbnB1dHM6IHJlc3VsdFJlc2hhcGVJbnB1dHMsIGJhY2tlbmQsIGF0dHJzOiByZXN1bHRSZXNoYXBlQXR0cnMgfSk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhwYWRkZWRYKTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHBhZGRlZFhSZXNoYXBlZCk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhwYWRkZWRYVCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydCBjb25zdCBzcGFjZVRvQmF0Y2hORENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBTcGFjZVRvQmF0Y2hORCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogc3BhY2VUb0JhdGNoTkRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TcGFjZVRvQmF0Y2hORC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBTcGFyc2VGaWxsRW1wdHlSb3dzIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHNwYXJzZUZpbGxFbXB0eVJvd3NJbXBsIH0gZnJvbSAnLi9TcGFyc2VGaWxsRW1wdHlSb3dzX2ltcGwnO1xuZXhwb3J0IGZ1bmN0aW9uIHNwYXJzZUZpbGxFbXB0eVJvd3MoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgaW5kaWNlcywgdmFsdWVzLCBkZW5zZVNoYXBlLCBkZWZhdWx0VmFsdWUgfSA9IGlucHV0cztcbiAgICBpZiAoZGVuc2VTaGFwZS5zaGFwZS5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEZW5zZSBzaGFwZSBtdXN0IGJlIGEgdmVjdG9yLCBzYXc6XG4gICAgICAgICR7ZGVuc2VTaGFwZS5zaGFwZX1gKTtcbiAgICB9XG4gICAgaWYgKGluZGljZXMuc2hhcGUubGVuZ3RoICE9PSAyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW5kaWNlcyBtdXN0IGJlIGEgbWF0cml4LCBzYXc6XG4gICAgICAgICR7aW5kaWNlcy5zaGFwZX1gKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlcy5zaGFwZS5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBWYWx1ZXMgbXVzdCBiZSBhIHZlY3Rvciwgc2F3OlxuICAgICAgICAke3ZhbHVlcy5zaGFwZX1gKTtcbiAgICB9XG4gICAgaWYgKGRlZmF1bHRWYWx1ZS5zaGFwZS5sZW5ndGggIT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEZWZhdWx0IHZhbHVlIG11c3QgYmUgYSBzY2FsYXIsIHNhdzpcbiAgICAgICAgJHtkZWZhdWx0VmFsdWUuc2hhcGV9YCk7XG4gICAgfVxuICAgIGNvbnN0ICRpbmRpY2VzID0gYmFja2VuZC5kYXRhLmdldChpbmRpY2VzLmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0ICR2YWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KHZhbHVlcy5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCAkZGVuc2VTaGFwZSA9IGJhY2tlbmQuZGF0YS5nZXQoZGVuc2VTaGFwZS5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCAkZGVmYXVsdFZhbHVlID0gYmFja2VuZC5kYXRhLmdldChkZWZhdWx0VmFsdWUuZGF0YUlkKS52YWx1ZXNbMF07XG4gICAgY29uc3QgW291dHB1dEluZGljZXMsIG91dHB1dEluZGljZXNTaGFwZSwgb3V0cHV0VmFsdWVzLCBlbXB0eVJvd0luZGljYXRvciwgcmV2ZXJzZUluZGV4TWFwXSA9IHNwYXJzZUZpbGxFbXB0eVJvd3NJbXBsKCRpbmRpY2VzLCBpbmRpY2VzLnNoYXBlLCBpbmRpY2VzLmR0eXBlLCAkdmFsdWVzLCB2YWx1ZXMuZHR5cGUsICRkZW5zZVNoYXBlLCAkZGVmYXVsdFZhbHVlKTtcbiAgICByZXR1cm4gW1xuICAgICAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dHB1dEluZGljZXNTaGFwZSwgaW5kaWNlcy5kdHlwZSwgb3V0cHV0SW5kaWNlcyksXG4gICAgICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oW291dHB1dEluZGljZXNTaGFwZVswXV0sIHZhbHVlcy5kdHlwZSwgb3V0cHV0VmFsdWVzKSxcbiAgICAgICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhbZW1wdHlSb3dJbmRpY2F0b3IubGVuZ3RoXSwgJ2Jvb2wnLCBuZXcgVWludDhBcnJheShlbXB0eVJvd0luZGljYXRvci5tYXAoKHZhbHVlKSA9PiBOdW1iZXIodmFsdWUpKSkpLFxuICAgICAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtyZXZlcnNlSW5kZXhNYXAubGVuZ3RoXSwgaW5kaWNlcy5kdHlwZSwgbmV3IEludDMyQXJyYXkocmV2ZXJzZUluZGV4TWFwKSksXG4gICAgXTtcbn1cbmV4cG9ydCBjb25zdCBzcGFyc2VGaWxsRW1wdHlSb3dzQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFNwYXJzZUZpbGxFbXB0eVJvd3MsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHNwYXJzZUZpbGxFbXB0eVJvd3MsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3BhcnNlRmlsbEVtcHR5Um93cy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmV4cG9ydCBmdW5jdGlvbiBzcGFyc2VGaWxsRW1wdHlSb3dzSW1wbChpbmRpY2VzLCBpbmRpY2VzU2hhcGUsIGluZGljZXNEVHlwZSwgdmFsdWVzLCB2YWx1ZXNEVHlwZSwgZGVuc2VTaGFwZSwgZGVmYXVsdFZhbHVlKSB7XG4gICAgY29uc3QgaW5kaWNlc0NvdW50ID0gaW5kaWNlc1NoYXBlWzBdO1xuICAgIGNvbnN0IGRlbnNlUm93cyA9IGRlbnNlU2hhcGVbMF07XG4gICAgY29uc3QgZW1wdHlSb3dJbmRpY2F0b3IgPSBuZXcgQXJyYXkoZGVuc2VSb3dzKTtcbiAgICBjb25zdCByZXZlcnNlSW5kZXhNYXAgPSBuZXcgQXJyYXkoaW5kaWNlc0NvdW50KTtcbiAgICBjb25zdCByYW5rID0gaW5kaWNlc1NoYXBlWzFdO1xuICAgIGlmIChkZW5zZVJvd3MgPT09IDApIHtcbiAgICAgICAgaWYgKGluZGljZXNDb3VudCAhPT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZWNlaXZlZCBTcGFyc2VUZW5zb3Igd2l0aCBkZW5zZVNoYXBlWzBdID0gMCBidXRcbiAgICAgICAgIGluZGljZXMuc2hhcGVbMF0gPSAke2luZGljZXNDb3VudH1gKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvdXRwdXRJbmRpY2VzID0gdXRpbC5nZXRBcnJheUZyb21EVHlwZShpbmRpY2VzRFR5cGUsIDApO1xuICAgICAgICBjb25zdCBvdXRwdXRWYWx1ZXMgPSB1dGlsLmdldEFycmF5RnJvbURUeXBlKHZhbHVlc0RUeXBlLCAwKTtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIG91dHB1dEluZGljZXMsIFswLCByYW5rXSwgb3V0cHV0VmFsdWVzLCBlbXB0eVJvd0luZGljYXRvciwgcmV2ZXJzZUluZGV4TWFwXG4gICAgICAgIF07XG4gICAgfVxuICAgIGxldCByb3dzQXJlT3JkZXJlZCA9IHRydWU7XG4gICAgbGV0IGxhc3RJbmRpY2VzUm93ID0gMDtcbiAgICBjb25zdCBjc3JPZmZzZXQgPSBuZXcgQXJyYXkoZGVuc2VSb3dzKS5maWxsKDApO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5kaWNlc0NvdW50OyArK2kpIHtcbiAgICAgICAgLy8gaW5kaWNlcyBpcyBhIDJkIHRlbnNvciB3aXRoIHNoYXBlIG9mIFtOLCByYW5rXVxuICAgICAgICBjb25zdCByb3cgPSBpbmRpY2VzW2kgKiByYW5rXTtcbiAgICAgICAgaWYgKHJvdyA8IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgaW5kaWNlcygke2l9LCAwKSBpcyBpbnZhbGlkOiAke3Jvd30gPCAwYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJvdyA+PSBkZW5zZVJvd3MpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgaW5kaWNlcygke2l9LCAwKSBpcyBpbnZhbGlkOiAke3Jvd30gPj0gJHtkZW5zZVJvd3N9YCk7XG4gICAgICAgIH1cbiAgICAgICAgKytjc3JPZmZzZXRbcm93XTtcbiAgICAgICAgcm93c0FyZU9yZGVyZWQgPSByb3dzQXJlT3JkZXJlZCAmJiAocm93ID49IGxhc3RJbmRpY2VzUm93KTtcbiAgICAgICAgbGFzdEluZGljZXNSb3cgPSByb3c7XG4gICAgfVxuICAgIGxldCBhbGxSb3dzRnVsbCA9IHRydWU7XG4gICAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgZGVuc2VSb3dzOyArK3Jvdykge1xuICAgICAgICAvLyBjc3JPZmZzZXQgaGVyZSBkZXNjcmliZXMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGlzIGRlbnNlIHJvd1xuICAgICAgICBjb25zdCByb3dFbXB0eSA9IChjc3JPZmZzZXRbcm93XSA9PT0gMCk7XG4gICAgICAgIGVtcHR5Um93SW5kaWNhdG9yW3Jvd10gPSByb3dFbXB0eTtcbiAgICAgICAgYWxsUm93c0Z1bGwgPSBhbGxSb3dzRnVsbCAmJiAhcm93RW1wdHk7XG4gICAgICAgIC8vIEluIGZpbGxlZCB2ZXJzaW9uLCBlYWNoIHJvdyBoYXMgYXQgbGVhc3Qgb25lIGVsZW1lbnQuXG4gICAgICAgIGNzck9mZnNldFtyb3ddID0gTWF0aC5tYXgoY3NyT2Zmc2V0W3Jvd10sIDEpO1xuICAgICAgICAvLyBVcGRhdGUgY3NyT2Zmc2V0IHRvIHJlcHJlc2VudCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHVwIHRvIGFuZFxuICAgICAgICAvLyBpbmNsdWRpbmcgZGVuc2VSb3dzICsgMTpcbiAgICAgICAgLy8gIGNzck9mZnNldFswXSA9PSAje2VsZW1lbnRzIG9mIHJvdyAwfVxuICAgICAgICAvLyAgY3NyT2Zmc2V0WzFdID09ICN7ZWxlbWVudHMgb2Ygcm93IDF9ICsgI3tlbGVtZW50cyBvZiByb3cgMH1cbiAgICAgICAgLy8gIC4uXG4gICAgICAgIC8vICBjc3JPZmZzZXRbaV0gPT0gc3RhcnRpbmcgaW5kZXggZm9yIGVsZW1lbnRzIGluIHJvdyBpICsgMS5cbiAgICAgICAgaWYgKHJvdyA+IDApIHtcbiAgICAgICAgICAgIGNzck9mZnNldFtyb3ddICs9IGNzck9mZnNldFtyb3cgLSAxXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoYWxsUm93c0Z1bGwgJiYgcm93c0FyZU9yZGVyZWQpIHtcbiAgICAgICAgY29uc3Qgb3V0cHV0SW5kaWNlcyA9IGluZGljZXM7XG4gICAgICAgIGNvbnN0IG91dHB1dFZhbHVlcyA9IHZhbHVlcztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmRpY2VzQ291bnQ7ICsraSkge1xuICAgICAgICAgICAgcmV2ZXJzZUluZGV4TWFwW2ldID0gaTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgb3V0cHV0SW5kaWNlcywgW2luZGljZXNDb3VudCwgcmFua10sIG91dHB1dFZhbHVlcywgZW1wdHlSb3dJbmRpY2F0b3IsXG4gICAgICAgICAgICByZXZlcnNlSW5kZXhNYXBcbiAgICAgICAgXTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IGZ1bGxJbmRpY2VzQ291bnQgPSBjc3JPZmZzZXRbZGVuc2VSb3dzIC0gMV07XG4gICAgICAgIGNvbnN0IG91dHB1dEluZGljZXMgPSB1dGlsLmdldEFycmF5RnJvbURUeXBlKGluZGljZXNEVHlwZSwgZnVsbEluZGljZXNDb3VudCAqIHJhbmspO1xuICAgICAgICBjb25zdCBvdXRwdXRWYWx1ZXMgPSB1dGlsLmdldEFycmF5RnJvbURUeXBlKHZhbHVlc0RUeXBlLCBmdWxsSW5kaWNlc0NvdW50KTtcbiAgICAgICAgY29uc3QgZmlsbGVkQ291bnQgPSBuZXcgQXJyYXkoZGVuc2VSb3dzKS5maWxsKDApO1xuICAgICAgICAvLyBGaWxsIGluIHZhbHVlcyBmb3Igcm93cyB0aGF0IGFyZSBub3QgbWlzc2luZ1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluZGljZXNDb3VudDsgKytpKSB7XG4gICAgICAgICAgICAvLyBpbmRpY2VzIGlzIGEgMmQgdGVuc29yIHdpdGggc2hhcGUgb2YgW04sIHJhbmtdXG4gICAgICAgICAgICBjb25zdCByb3cgPSBpbmRpY2VzW2kgKiByYW5rXTtcbiAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IGZpbGxlZENvdW50W3Jvd107XG4gICAgICAgICAgICBjb25zdCBvdXRwdXRJID0gKChyb3cgPT09IDApID8gMCA6IGNzck9mZnNldFtyb3cgLSAxXSkgKyBvZmZzZXQ7XG4gICAgICAgICAgICBmaWxsZWRDb3VudFtyb3ddKys7IC8vIEluY3JlbWVudCB0aGUgZmlsbGVkIGNvdW50IGZvciB0aGlzIHJvdy5cbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcmFuazsgKytqKSB7XG4gICAgICAgICAgICAgICAgLy8gaW5kaWNlcyBhbmQgb3V0cHV0SW5kaWNlcyBhcmUgMmQgdGVuc29ycyB3aXRoIHNoYXBlIG9mIFtOLCByYW5rXVxuICAgICAgICAgICAgICAgIG91dHB1dEluZGljZXNbb3V0cHV0SSAqIHJhbmsgKyBqXSA9IGluZGljZXNbaSAqIHJhbmsgKyBqXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG91dHB1dFZhbHVlc1tvdXRwdXRJXSA9IHZhbHVlc1tpXTtcbiAgICAgICAgICAgIC8vIFdlJ2xsIG5lZWQgdGhpcyByZXZlcnNlIGluZGV4IG1hcCB0byBiYWNrcHJvcCBjb3JyZWN0bHkuXG4gICAgICAgICAgICByZXZlcnNlSW5kZXhNYXBbaV0gPSBvdXRwdXRJO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZpbGwgaW4gdmFsdWVzIGZvciByb3dzIHRoYXQgYXJlIG1pc3NpbmdcbiAgICAgICAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgZGVuc2VSb3dzOyArK3Jvdykge1xuICAgICAgICAgICAgY29uc3Qgcm93Q291bnQgPSBmaWxsZWRDb3VudFtyb3ddO1xuICAgICAgICAgICAgaWYgKHJvd0NvdW50ID09PSAwKSB7IC8vIFdlIGhhdmVuJ3QgZmlsbGVkIHRoaXMgcm93XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnRpbmdJbmRleCA9IChyb3cgPT09IDApID8gMCA6IGNzck9mZnNldFtyb3cgLSAxXTtcbiAgICAgICAgICAgICAgICAvLyBSZW1haW5pbmcgaW5kZXggdmFsdWVzIHdlcmUgc2V0IHRvIHplcm8gYWxyZWFkeS5cbiAgICAgICAgICAgICAgICAvLyBKdXN0IG5lZWQgdG8gc2V0IHRoZSByb3cgaW5kZXggaW4gdGhlIHJpZ2h0IGxvY2F0aW9uLlxuICAgICAgICAgICAgICAgIC8vIG91dHB1dEluZGljZXMgaXMgYSAyZCB0ZW5zb3Igd2l0aCBzaGFwZSBvZiBbTiwgcmFua11cbiAgICAgICAgICAgICAgICBvdXRwdXRJbmRpY2VzW3N0YXJ0aW5nSW5kZXggKiByYW5rICsgMF0gPSByb3c7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgY29sID0gMTsgY29sIDwgcmFuazsgKytjb2wpIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0SW5kaWNlc1tzdGFydGluZ0luZGV4ICogcmFuayArIGNvbF0gPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBvdXRwdXRWYWx1ZXNbc3RhcnRpbmdJbmRleF0gPSBkZWZhdWx0VmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIG91dHB1dEluZGljZXMsIFtmdWxsSW5kaWNlc0NvdW50LCByYW5rXSwgb3V0cHV0VmFsdWVzLCBlbXB0eVJvd0luZGljYXRvcixcbiAgICAgICAgICAgIHJldmVyc2VJbmRleE1hcFxuICAgICAgICBdO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNwYXJzZUZpbGxFbXB0eVJvd3NfaW1wbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBTcGFyc2VSZXNoYXBlIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHNwYXJzZVJlc2hhcGVJbXBsIH0gZnJvbSAnLi9TcGFyc2VSZXNoYXBlX2ltcGwnO1xuZXhwb3J0IGZ1bmN0aW9uIHNwYXJzZVJlc2hhcGUoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgaW5wdXRJbmRpY2VzLCBpbnB1dFNoYXBlLCBuZXdTaGFwZSB9ID0gaW5wdXRzO1xuICAgIGlmIChpbnB1dEluZGljZXMuc2hhcGUubGVuZ3RoICE9PSAyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW5wdXQgaW5kaWNlcyBzaG91bGQgYmUgYSBtYXRyaXggYnV0IHJlY2VpdmVkIHNoYXBlXG4gICAgICAgICR7aW5wdXRJbmRpY2VzLnNoYXBlfWApO1xuICAgIH1cbiAgICBpZiAoaW5wdXRTaGFwZS5zaGFwZS5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnB1dCBzaGFwZSBzaG91bGQgYmUgYSB2ZWN0b3IgYnV0IHJlY2VpdmVkIHNoYXBlXG4gICAgICAgICR7aW5wdXRTaGFwZS5zaGFwZX1gKTtcbiAgICB9XG4gICAgaWYgKG5ld1NoYXBlLnNoYXBlLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRhcmdldCBzaGFwZSBzaG91bGQgYmUgYSB2ZWN0b3IgYnV0IHJlY2VpdmVkIHNoYXBlICR7bmV3U2hhcGUuc2hhcGV9YCk7XG4gICAgfVxuICAgIGNvbnN0ICRpbnB1dFNoYXBlID0gQXJyYXkuZnJvbShiYWNrZW5kLmRhdGEuZ2V0KGlucHV0U2hhcGUuZGF0YUlkKS52YWx1ZXMpO1xuICAgIGNvbnN0ICRpbnB1dEluZGljZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KGlucHV0SW5kaWNlcy5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCB0YXJnZXRTaGFwZSA9IEFycmF5LmZyb20oYmFja2VuZC5kYXRhLmdldChuZXdTaGFwZS5kYXRhSWQpLnZhbHVlcyk7XG4gICAgY29uc3QgW25ld0luZGljZXMsIGluZGljZXNTaGFwZSwgb3V0cHV0U2hhcGVdID0gc3BhcnNlUmVzaGFwZUltcGwoJGlucHV0SW5kaWNlcywgaW5wdXRJbmRpY2VzLnNoYXBlLCBpbnB1dEluZGljZXMuZHR5cGUsICRpbnB1dFNoYXBlLCB0YXJnZXRTaGFwZSk7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhpbmRpY2VzU2hhcGUsIGlucHV0SW5kaWNlcy5kdHlwZSwgbmV3SW5kaWNlcyksXG4gICAgICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oW291dHB1dFNoYXBlLmxlbmd0aF0sIG5ld1NoYXBlLmR0eXBlLCBuZXcgSW50MzJBcnJheShvdXRwdXRTaGFwZSkpLFxuICAgIF07XG59XG5leHBvcnQgY29uc3Qgc3BhcnNlUmVzaGFwZUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBTcGFyc2VSZXNoYXBlLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBzcGFyc2VSZXNoYXBlLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNwYXJzZVJlc2hhcGUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5leHBvcnQgZnVuY3Rpb24gc3BhcnNlUmVzaGFwZUltcGwoaW5wdXRJbmRpY2VzLCBpbnB1dEluZGljZXNTaGFwZSwgaW5wdXREVHlwZSwgaW5wdXRTaGFwZSwgdGFyZ2V0U2hhcGUpIHtcbiAgICBjb25zdCBkZW5zZVNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoaW5wdXRTaGFwZSk7XG4gICAgY29uc3Qgbm56ID0gaW5wdXRJbmRpY2VzU2hhcGVbMF07XG4gICAgY29uc3Qgb3V0cHV0UmFuayA9IHRhcmdldFNoYXBlLmxlbmd0aDtcbiAgICAvLyBDb21wdXRlIHRoZSBvdXRwdXQgc2hhcGUuIERldGVybWluZSBwcm9kdWN0IG9mIHNwZWNpZmllZCBkaW1lbnNpb25zLCBhbmRcbiAgICAvLyBmaW5kIHRoZSBpbmRleCBvZiB0aGUgdW5zcGVjaWZpZWQgb25lLlxuICAgIGNvbnN0IG91dHB1dFNoYXBlID0gW107XG4gICAgbGV0IHByb2R1Y3QgPSAxO1xuICAgIGxldCB1bmtub3duSW5kZXggPSAtMTtcbiAgICBmb3IgKGxldCBkID0gMDsgZCA8IG91dHB1dFJhbms7ICsrZCkge1xuICAgICAgICBjb25zdCBzaXplID0gdGFyZ2V0U2hhcGVbZF07XG4gICAgICAgIGlmIChzaXplID09PSAtMSkge1xuICAgICAgICAgICAgaWYgKHVua25vd25JbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYG9ubHkgb25lIG91dHB1dCBkaW1lbnNpb24gbWF5IGJlIC0xLCBub3QgYm90aCAke3Vua25vd25JbmRleH0gYW5kICR7ZH1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHVua25vd25JbmRleCA9IGQ7XG4gICAgICAgICAgICBvdXRwdXRTaGFwZS5wdXNoKDEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHNpemUgPCAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBzaXplICR7ZH0gbXVzdCBiZSBub24tbmVnYXRpdmUsIG5vdCAke3NpemV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcm9kdWN0ICo9IHNpemU7XG4gICAgICAgICAgICBvdXRwdXRTaGFwZS5wdXNoKHNpemUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICh1bmtub3duSW5kZXggIT09IC0xKSB7XG4gICAgICAgIGlmIChwcm9kdWN0IDw9IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigncmVzaGFwZSBjYW5ub3QgaW5mZXIgdGhlIG1pc3NpbmcgJyArXG4gICAgICAgICAgICAgICAgJ2lucHV0IHNpemUgZm9yIGFuIGVtcHR5IHRlbnNvciB1bmxlc3MgYWxsICcgK1xuICAgICAgICAgICAgICAgICdzcGVjaWZpZWQgaW5wdXQgc2l6ZXMgYXJlIG5vbi16ZXJvJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWlzc2luZyA9IE1hdGgudHJ1bmMoZGVuc2VTaXplIC8gcHJvZHVjdCk7XG4gICAgICAgIGlmIChwcm9kdWN0ICogbWlzc2luZyAhPT0gZGVuc2VTaXplKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYElucHV0IHRvIHJlc2hhcGUgaXMgYSBTcGFyc2VUZW5zb3Igd2l0aCAke2RlbnNlU2l6ZX1cbiAgICAgICAgICBkZW5zZSB2YWx1ZXMsIGJ1dCB0aGUgcmVxdWVzdGVkIHNoYXBlIHJlcXVpcmVzIGEgbXVsdGlwbGUgb2YgJHtwcm9kdWN0fS4gaW5wdXRTaGFwZT0ke2lucHV0U2hhcGV9IG91dHB1dFNoYXBlPSAke291dHB1dFNoYXBlfWApO1xuICAgICAgICB9XG4gICAgICAgIG91dHB1dFNoYXBlW3Vua25vd25JbmRleF0gPSBtaXNzaW5nO1xuICAgIH1cbiAgICBjb25zdCBvdXRwdXRTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKG91dHB1dFNoYXBlKTtcbiAgICBpZiAob3V0cHV0U2l6ZSAhPT0gZGVuc2VTaXplKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW5wdXQgdG8gcmVzaGFwZSBpcyBhIHRlbnNvciB3aXRoICR7ZGVuc2VTaXplfSBkZW5zZSB2YWx1ZXMsIGJ1dCB0aGUgcmVxdWVzdGVkIHNoYXBlIGhhcyAke291dHB1dFNpemV9LiBpbnB1dFNoYXBlPSR7aW5wdXRTaGFwZX0gb3V0cHV0U2hhcGU9JHtvdXRwdXRTaGFwZX1gKTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRSYW5rID0gaW5wdXRTaGFwZS5sZW5ndGg7XG4gICAgY29uc3QgaW5wdXRTdHJpZGVzID0gW107XG4gICAgaWYgKGlucHV0UmFuayA+IDApIHtcbiAgICAgICAgaW5wdXRTdHJpZGVzW2lucHV0UmFuayAtIDFdID0gMTtcbiAgICAgICAgZm9yIChsZXQgZCA9IGlucHV0UmFuayAtIDI7IGQgPj0gMDsgLS1kKSB7XG4gICAgICAgICAgICBpbnB1dFN0cmlkZXNbZF0gPSBpbnB1dFN0cmlkZXNbZCArIDFdICogaW5wdXRTaGFwZVtkICsgMV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgb3V0cHV0U3RyaWRlcyA9IFtdO1xuICAgIGlmIChvdXRwdXRSYW5rID4gMCkge1xuICAgICAgICBvdXRwdXRTdHJpZGVzW291dHB1dFJhbmsgLSAxXSA9IDE7XG4gICAgICAgIGZvciAobGV0IGQgPSBvdXRwdXRSYW5rIC0gMjsgZCA+PSAwOyAtLWQpIHtcbiAgICAgICAgICAgIG91dHB1dFN0cmlkZXNbZF0gPSBvdXRwdXRTdHJpZGVzW2QgKyAxXSAqIG91dHB1dFNoYXBlW2QgKyAxXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBuZXdJbmRpY2VzID0gdXRpbC5nZXRBcnJheUZyb21EVHlwZShpbnB1dERUeXBlLCBubnogKiBvdXRwdXRSYW5rKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5uejsgKytpKSB7XG4gICAgICAgIGxldCBpZCA9IDA7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgaW5wdXRSYW5rOyArK2opIHtcbiAgICAgICAgICAgIC8vIGlucHV0SW5kaWNlcyBpcyBhIDJkIHRlbnNvciB3aXRoIHNoYXBlIG9mIFtubnosIGlucHV0UmFua11cbiAgICAgICAgICAgIGlkICs9IGlucHV0SW5kaWNlc1tpICogaW5wdXRSYW5rICsgal0gKiBpbnB1dFN0cmlkZXNbal07XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBvdXRwdXRSYW5rOyArK2opIHtcbiAgICAgICAgICAgIC8vIG5ld0luZGljZXMgaXMgYSAyZCB0ZW5zb3Igd2l0aCBzaGFwZSBvZiBbbm56LCBvdXRwdXRSYW5rXVxuICAgICAgICAgICAgbmV3SW5kaWNlc1tpICogb3V0cHV0UmFuayArIGpdID0gTWF0aC50cnVuYyhpZCAvIG91dHB1dFN0cmlkZXNbal0pO1xuICAgICAgICAgICAgaWQgJT0gb3V0cHV0U3RyaWRlc1tqXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW25ld0luZGljZXMsIFtubnosIG91dHB1dFJhbmtdLCBvdXRwdXRTaGFwZV07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TcGFyc2VSZXNoYXBlX2ltcGwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgU3BhcnNlU2VnbWVudE1lYW4gfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgc3BhcnNlU2VnbWVudFJlZHVjdGlvbkltcGwgfSBmcm9tICcuL1NwYXJzZVNlZ21lbnRSZWR1Y3Rpb25faW1wbCc7XG5leHBvcnQgZnVuY3Rpb24gc3BhcnNlU2VnbWVudE1lYW4oYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgZGF0YSwgaW5kaWNlcywgc2VnbWVudElkcyB9ID0gaW5wdXRzO1xuICAgIGlmIChkYXRhLnNoYXBlLmxlbmd0aCA8IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEYXRhIHNob3VsZCBiZSBhdCBsZWFzdCAxIGRpbWVuc2lvbmFsIGJ1dCByZWNlaXZlZCBzY2FsYXJgKTtcbiAgICB9XG4gICAgaWYgKGluZGljZXMuc2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW5kaWNlcyBzaG91bGQgYmUgYSB2ZWN0b3IgYnV0IHJlY2VpdmVkIHNoYXBlXG4gICAgICAgICAgJHtpbmRpY2VzLnNoYXBlfWApO1xuICAgIH1cbiAgICBpZiAoc2VnbWVudElkcy5zaGFwZS5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTZWdtZW50IGlkcyBzaG91bGQgYmUgYSB2ZWN0b3IgYnV0IHJlY2VpdmVkIHNoYXBlXG4gICAgICAgICAgJHtzZWdtZW50SWRzLnNoYXBlfWApO1xuICAgIH1cbiAgICBjb25zdCAkZGF0YSA9IGJhY2tlbmQuZGF0YS5nZXQoZGF0YS5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCAkaW5kaWNlcyA9IGJhY2tlbmQuZGF0YS5nZXQoaW5kaWNlcy5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCAkc2VnbWVudElkcyA9IGJhY2tlbmQuZGF0YS5nZXQoc2VnbWVudElkcy5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCBbb3V0cHV0RGF0YSwgb3V0cHV0RGF0YVNoYXBlXSA9IHNwYXJzZVNlZ21lbnRSZWR1Y3Rpb25JbXBsKCRkYXRhLCBkYXRhLnNoYXBlLCBkYXRhLmR0eXBlLCAkaW5kaWNlcywgJHNlZ21lbnRJZHMsIHRydWUpO1xuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dHB1dERhdGFTaGFwZSwgZGF0YS5kdHlwZSwgb3V0cHV0RGF0YSk7XG59XG5leHBvcnQgY29uc3Qgc3BhcnNlU2VnbWVudE1lYW5Db25maWcgPSB7XG4gICAga2VybmVsTmFtZTogU3BhcnNlU2VnbWVudE1lYW4sXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHNwYXJzZVNlZ21lbnRNZWFuLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNwYXJzZVNlZ21lbnRNZWFuLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuZXhwb3J0IGZ1bmN0aW9uIHNwYXJzZVNlZ21lbnRSZWR1Y3Rpb25JbXBsKGlucHV0LCBpbnB1dFNoYXBlLCBpbnB1dERUeXBlLCBpbmRpY2VzLCBzZWdtZW50SWRzLCBpc01lYW4gPSBmYWxzZSwgZGVmYXVsdFZhbHVlID0gMCkge1xuICAgIGNvbnN0IG51bUluZGljZXMgPSBpbmRpY2VzLmxlbmd0aDtcbiAgICBpZiAobnVtSW5kaWNlcyAhPT0gc2VnbWVudElkcy5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBzZWdtZW50SWRzIGFuZCBpbmRpY2VzIHNob3VsZCBoYXZlIHNhbWUgc2l6ZS5gKTtcbiAgICB9XG4gICAgLy8gRmxhdHRlbiB0aGUgYXJyYXkgdG8gdHdvIGRpbWVuc2lvbnNcbiAgICBjb25zdCBpbnB1dEZsYXQgPSBbaW5wdXRTaGFwZVswXSwgaW5wdXQubGVuZ3RoIC8gaW5wdXRTaGFwZVswXV07XG4gICAgY29uc3QgbnVtQ29sID0gaW5wdXRGbGF0WzFdO1xuICAgIC8vIE5vdGUgdGhhdCB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBhc3N1bWVzIHRoYXQgc2VnbWVudElkcyB2YWx1ZXMgYXJlXG4gICAgLy8gc29ydGVkLlxuICAgIGNvbnN0IGxhc3RTZWdtZW50SWRQbHVzT25lID0gbnVtSW5kaWNlcyA+IDAgPyBzZWdtZW50SWRzW251bUluZGljZXMgLSAxXSArIDEgOiAwO1xuICAgIGNvbnN0IG91dHB1dFJvd3MgPSBsYXN0U2VnbWVudElkUGx1c09uZTtcbiAgICBpZiAob3V0cHV0Um93cyA8IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBzZWdtZW50IGlkcyBtdXN0IGJlID49IDBgKTtcbiAgICB9XG4gICAgY29uc3Qgb3V0cHV0U2hhcGUgPSBpbnB1dFNoYXBlLnNsaWNlKCk7XG4gICAgb3V0cHV0U2hhcGVbMF0gPSBvdXRwdXRSb3dzO1xuICAgIGNvbnN0IG91dHB1dExlbmd0aCA9IG91dHB1dFNoYXBlLnJlZHVjZSgocHJvZHVjdCwgdmFsdWUpID0+IHByb2R1Y3QgKiB2YWx1ZSwgMSk7XG4gICAgLy8gT3V0cHV0IGFycmF5IGlzIGluaXRpYWxpemVkIHdpdGggdGhlIHZhbHVlIDAgYnkgZGVmYXVsdC5cbiAgICBjb25zdCBvdXRwdXQgPSB1dGlsLmdldEFycmF5RnJvbURUeXBlKGlucHV0RFR5cGUsIG91dHB1dExlbmd0aCk7XG4gICAgLy8gTm90ZSB0aGF0IHdlIGRvIG5vdCBpbml0aWFsaXplIHRoZSBvdXRwdXQgYnVmZmVyIHdpdGggYSBkZWZhdWx0IHZhbHVlLCBzb1xuICAgIC8vIHdlIG5lZWQgdG8gZXhwbGljaXRseSBzZXQgbWlzc2luZyBpbmRpY2VzIHRvIHRoZSBkZWZhdWx0IHZhbHVlLlxuICAgIGlmIChudW1JbmRpY2VzID09PSAwKSB7XG4gICAgICAgIGlmIChvdXRwdXRSb3dzID4gMCkge1xuICAgICAgICAgICAgb3V0cHV0LmZpbGwoZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW291dHB1dCwgb3V0cHV0U2hhcGVdO1xuICAgIH1cbiAgICBpZiAob3V0cHV0Um93cyA8PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgc2VnbWVudCBpZHMgbXVzdCBiZSA+PSAwYCk7XG4gICAgfVxuICAgIGxldCBzdGFydCA9IDAsIGVuZCA9IDE7XG4gICAgLy8gSW5kZXggZnJvbSB3aGljaCB0aGUgb3V0cHV0IGlzIG5vdCBpbml0aWFsaXplZC5cbiAgICBsZXQgdW5pbml0aWFsaXplZEluZGV4ID0gMDtcbiAgICBsZXQgb3V0SW5kZXggPSBzZWdtZW50SWRzW3N0YXJ0XTtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAvLyBXZSBpbml0aWFsaXplIG5leHRJbmRleCB0byAwIHRvIGF2b2lkIG1heSBiZSB1bmluaXRpYWxpemVkIHdhcm5pbmdcbiAgICAgICAgbGV0IG5leHRJbmRleCA9IDA7XG4gICAgICAgIGlmIChlbmQgPCBudW1JbmRpY2VzKSB7XG4gICAgICAgICAgICBuZXh0SW5kZXggPSBzZWdtZW50SWRzW2VuZF07XG4gICAgICAgICAgICBpZiAob3V0SW5kZXggPT09IG5leHRJbmRleCkge1xuICAgICAgICAgICAgICAgICsrZW5kO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gV2UgaGF2ZSBhIG5ldyBzZWdtZW50IGhlcmUuICBWZXJpZnkgdGhhdCB0aGUgc2VnbWVudCBpZHMgYXJlIGdyb3dpbmcuXG4gICAgICAgICAgICBpZiAob3V0SW5kZXggPj0gbmV4dEluZGV4KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBzZWdtZW50IGlkcyBhcmUgbm90IGluY3JlYXNpbmdgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAob3V0SW5kZXggPCAwIHx8IG91dEluZGV4ID49IG91dHB1dFJvd3MpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU2VnbWVudCBpZCAke291dEluZGV4fSBvdXQgb2YgcmFuZ2UgWzAsICR7b3V0cHV0Um93c30pLCBwb3NzaWJseSBiZWNhdXNlIHNlZ21lbnRJZHMgaW5wdXQgaXMgbm90IHNvcnRlZC5gKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIGdhcCBiZXR3ZWVuIHR3byBpbmRpY2VzLCB3ZSBuZWVkIHRvIHNldCB0aGF0IGdhcCB0byB0aGVcbiAgICAgICAgLy8gZGVmYXVsdCB2YWx1ZS5cbiAgICAgICAgaWYgKG91dEluZGV4ID4gdW5pbml0aWFsaXplZEluZGV4KSB7XG4gICAgICAgICAgICBvdXRwdXQuZmlsbChkZWZhdWx0VmFsdWUsIHVuaW5pdGlhbGl6ZWRJbmRleCAqIG51bUNvbCwgb3V0SW5kZXggKiBudW1Db2wpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IGluZGljZXNbaV07XG4gICAgICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGlucHV0RmxhdFswXSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQmFkOiBpbmRpY2VzWyR7aX1dID09ICR7aW5kaWNlc1tpXX0gb3V0IG9mIHJhbmdlIFswLCAke2lucHV0RmxhdFswXX0pYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG51bUNvbDsgaisrKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0W291dEluZGV4ICogbnVtQ29sICsgal0gKz0gaW5wdXRbaW5kZXggKiBudW1Db2wgKyBqXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNNZWFuKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG51bUNvbDsgaisrKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0W291dEluZGV4ICogbnVtQ29sICsgal0gLz0gZW5kIC0gc3RhcnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3RhcnQgPSBlbmQ7XG4gICAgICAgICsrZW5kO1xuICAgICAgICB1bmluaXRpYWxpemVkSW5kZXggPSBvdXRJbmRleCArIDE7XG4gICAgICAgIG91dEluZGV4ID0gbmV4dEluZGV4O1xuICAgICAgICBpZiAoZW5kID4gbnVtSW5kaWNlcykge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gRmlsbCB0aGUgZ2FwIGF0IHRoZSBlbmQgd2l0aCB0aGUgZGVmYXVsdCB2YWx1ZS5cbiAgICBpZiAodW5pbml0aWFsaXplZEluZGV4IDwgb3V0cHV0Um93cykge1xuICAgICAgICBvdXRwdXQuZmlsbChkZWZhdWx0VmFsdWUsIHVuaW5pdGlhbGl6ZWRJbmRleCAqIG51bUNvbCwgb3V0cHV0Um93cyAqIG51bUNvbCk7XG4gICAgfVxuICAgIHJldHVybiBbb3V0cHV0LCBvdXRwdXRTaGFwZV07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TcGFyc2VTZWdtZW50UmVkdWN0aW9uX2ltcGwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgU3BhcnNlU2VnbWVudFN1bSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBzcGFyc2VTZWdtZW50UmVkdWN0aW9uSW1wbCB9IGZyb20gJy4vU3BhcnNlU2VnbWVudFJlZHVjdGlvbl9pbXBsJztcbmV4cG9ydCBmdW5jdGlvbiBzcGFyc2VTZWdtZW50U3VtKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCB7IGRhdGEsIGluZGljZXMsIHNlZ21lbnRJZHMgfSA9IGlucHV0cztcbiAgICBpZiAoZGF0YS5zaGFwZS5sZW5ndGggPCAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRGF0YSBzaG91bGQgYmUgYXQgbGVhc3QgMSBkaW1lbnNpb25hbCBidXQgcmVjZWl2ZWQgc2NhbGFyYCk7XG4gICAgfVxuICAgIGlmIChpbmRpY2VzLnNoYXBlLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEluZGljZXMgc2hvdWxkIGJlIGEgdmVjdG9yIGJ1dCByZWNlaXZlZCBzaGFwZVxuICAgICAgICAgJHtpbmRpY2VzLnNoYXBlfWApO1xuICAgIH1cbiAgICBpZiAoc2VnbWVudElkcy5zaGFwZS5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTZWdtZW50IGlkcyBzaG91bGQgYmUgYSB2ZWN0b3IgYnV0IHJlY2VpdmVkIHNoYXBlXG4gICAgICAgICAke3NlZ21lbnRJZHMuc2hhcGV9YCk7XG4gICAgfVxuICAgIGNvbnN0ICRkYXRhID0gYmFja2VuZC5kYXRhLmdldChkYXRhLmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0ICRpbmRpY2VzID0gYmFja2VuZC5kYXRhLmdldChpbmRpY2VzLmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0ICRzZWdtZW50SWRzID0gYmFja2VuZC5kYXRhLmdldChzZWdtZW50SWRzLmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IFtvdXRwdXREYXRhLCBvdXRwdXREYXRhU2hhcGVdID0gc3BhcnNlU2VnbWVudFJlZHVjdGlvbkltcGwoJGRhdGEsIGRhdGEuc2hhcGUsIGRhdGEuZHR5cGUsICRpbmRpY2VzLCAkc2VnbWVudElkcyk7XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0cHV0RGF0YVNoYXBlLCBkYXRhLmR0eXBlLCBvdXRwdXREYXRhKTtcbn1cbmV4cG9ydCBjb25zdCBzcGFyc2VTZWdtZW50U3VtQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFNwYXJzZVNlZ21lbnRTdW0sXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHNwYXJzZVNlZ21lbnRTdW0sXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3BhcnNlU2VnbWVudFN1bS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIFNwYXJzZVRvRGVuc2UgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgc2NhdHRlckltcGwgfSBmcm9tICcuL1NjYXR0ZXJfaW1wbCc7XG5leHBvcnQgZnVuY3Rpb24gc3BhcnNlVG9EZW5zZShhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgc3BhcnNlSW5kaWNlcywgc3BhcnNlVmFsdWVzLCBkZWZhdWx0VmFsdWUgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IG91dHB1dFNoYXBlIH0gPSBhdHRycztcbiAgICBjb25zdCB7IHNsaWNlUmFuaywgbnVtVXBkYXRlcywgc2xpY2VTaXplLCBzdHJpZGVzLCBvdXRwdXRTaXplIH0gPSBiYWNrZW5kX3V0aWwuY2FsY3VsYXRlU2hhcGVzKHNwYXJzZVZhbHVlcywgc3BhcnNlSW5kaWNlcywgb3V0cHV0U2hhcGUpO1xuICAgIGNvbnN0IHN1bUR1cGVJbmRpY2VzID0gZmFsc2U7XG4gICAgY29uc3QgaW5kaWNlc0J1ZiA9IGJhY2tlbmQuYnVmZmVyU3luYyhzcGFyc2VJbmRpY2VzKTtcbiAgICBjb25zdCB1cGRhdGVzQnVmID0gYmFja2VuZC5idWZmZXJTeW5jKHNwYXJzZVZhbHVlcyk7XG4gICAgY29uc3QgJGRlZmF1bHRWYWx1ZSA9IGJhY2tlbmQuZGF0YS5nZXQoZGVmYXVsdFZhbHVlLmRhdGFJZCkudmFsdWVzWzBdO1xuICAgIGNvbnN0IG91dEJ1ZiA9IHNjYXR0ZXJJbXBsKGluZGljZXNCdWYsIHVwZGF0ZXNCdWYsIG91dHB1dFNoYXBlLCBvdXRwdXRTaXplLCBzbGljZVNpemUsIG51bVVwZGF0ZXMsIHNsaWNlUmFuaywgc3RyaWRlcywgJGRlZmF1bHRWYWx1ZSwgc3VtRHVwZUluZGljZXMpO1xuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dHB1dFNoYXBlLCBvdXRCdWYuZHR5cGUsIG91dEJ1Zi52YWx1ZXMpO1xufVxuZXhwb3J0IGNvbnN0IHNwYXJzZVRvRGVuc2VDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogU3BhcnNlVG9EZW5zZSxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogc3BhcnNlVG9EZW5zZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNwYXJzZVRvRGVuc2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IFNwbGl0ViwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBzbGljZSB9IGZyb20gJy4vU2xpY2UnO1xuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0VihhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgbnVtT3JTaXplU3BsaXRzLCBheGlzIH0gPSBhdHRycztcbiAgICBjb25zdCAkYXhpcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oYXhpcywgeC5zaGFwZSlbMF07XG4gICAgY29uc3Qgc3BsaXRTaXplcyA9IGJhY2tlbmRfdXRpbC5wcmVwYXJlU3BsaXRTaXplKHgsIG51bU9yU2l6ZVNwbGl0cywgJGF4aXMpO1xuICAgIGNvbnN0IGJlZ2luID0gbmV3IEFycmF5KHguc2hhcGUubGVuZ3RoKS5maWxsKDApO1xuICAgIGNvbnN0IHNpemUgPSB4LnNoYXBlLnNsaWNlKCk7XG4gICAgcmV0dXJuIHNwbGl0U2l6ZXMubWFwKHMgPT4ge1xuICAgICAgICBjb25zdCBzbGljZVNpemUgPSBbLi4uc2l6ZV07XG4gICAgICAgIHNsaWNlU2l6ZVskYXhpc10gPSBzO1xuICAgICAgICBjb25zdCBzbGljZVQgPSBzbGljZSh7IGlucHV0czogeyB4IH0sIGJhY2tlbmQsIGF0dHJzOiB7IGJlZ2luLCBzaXplOiBzbGljZVNpemUgfSB9KTtcbiAgICAgICAgYmVnaW5bJGF4aXNdICs9IHM7XG4gICAgICAgIHJldHVybiBzbGljZVQ7XG4gICAgfSk7XG59XG5leHBvcnQgY29uc3Qgc3BsaXRWQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFNwbGl0VixcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogc3BsaXRWXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3BsaXRWLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBTcXJ0IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHVuYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCBzcXJ0ID0gdW5hcnlLZXJuZWxGdW5jKFNxcnQsICh4aSkgPT4gTWF0aC5zcXJ0KHhpKSk7XG5leHBvcnQgY29uc3Qgc3FydENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBTcXJ0LFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBzcXJ0LFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNxcnQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgU3F1YXJlIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5leHBvcnQgY29uc3Qgc3F1YXJlQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFNxdWFyZSxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogKHsgaW5wdXRzLCBiYWNrZW5kIH0pID0+IHtcbiAgICAgICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgICAgIGNvbnN0IGNwdUJhY2tlbmQgPSBiYWNrZW5kO1xuICAgICAgICBhc3NlcnROb3RDb21wbGV4KHgsICdzcXVhcmUnKTtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gY3B1QmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzO1xuICAgICAgICBjb25zdCBuZXdWYWx1ZXMgPSBuZXcgRmxvYXQzMkFycmF5KHZhbHVlcy5sZW5ndGgpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB2YWx1ZXNbaV07XG4gICAgICAgICAgICBuZXdWYWx1ZXNbaV0gPSB2YWx1ZSAqIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRhdGFJZCA9IGNwdUJhY2tlbmQud3JpdGUobmV3VmFsdWVzLCB4LnNoYXBlLCB4LmR0eXBlKTtcbiAgICAgICAgcmV0dXJuIHsgZGF0YUlkLCBzaGFwZTogeC5zaGFwZSwgZHR5cGU6IHguZHR5cGUgfTtcbiAgICB9XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3F1YXJlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFNxdWFyZWREaWZmZXJlbmNlIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGwgfSBmcm9tICcuLi91dGlscy9iaW5hcnlfaW1wbCc7XG5pbXBvcnQgeyBiaW5hcnlLZXJuZWxGdW5jIH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCBzcXVhcmVkRGlmZmVyZW5jZUltcGwgPSBjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsKCgoYSwgYikgPT4ge1xuICAgIGNvbnN0IGRpZmYgPSBhIC0gYjtcbiAgICByZXR1cm4gZGlmZiAqIGRpZmY7XG59KSk7XG5leHBvcnQgY29uc3Qgc3F1YXJlZERpZmZlcmVuY2UgPSBiaW5hcnlLZXJuZWxGdW5jKFNxdWFyZWREaWZmZXJlbmNlLCBzcXVhcmVkRGlmZmVyZW5jZUltcGwpO1xuZXhwb3J0IGNvbnN0IHNxdWFyZWREaWZmZXJlbmNlQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFNxdWFyZWREaWZmZXJlbmNlLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBzcXVhcmVkRGlmZmVyZW5jZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNxdWFyZWREaWZmZXJlbmNlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBTdGVwIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHVuYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCBzdGVwID0gdW5hcnlLZXJuZWxGdW5jKFN0ZXAsICh4aSwgYXR0cnMpID0+IHtcbiAgICBjb25zdCBzdGVwQXR0cnMgPSBhdHRycztcbiAgICBpZiAoaXNOYU4oeGkpKSB7XG4gICAgICAgIHJldHVybiBOYU47XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4geGkgPiAwID8gMSA6IHN0ZXBBdHRycy5hbHBoYTtcbiAgICB9XG59KTtcbmV4cG9ydCBjb25zdCBzdGVwQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFN0ZXAsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHN0ZXAsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3RlcC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBzbGljZV91dGlsLCBTdHJpZGVkU2xpY2UgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL1Jlc2hhcGUnO1xuaW1wb3J0IHsgc2xpY2UgfSBmcm9tICcuL1NsaWNlJztcbmltcG9ydCB7IHN0cmlkZWRTbGljZUltcGwgfSBmcm9tICcuL1N0cmlkZWRTbGljZV9pbXBsJztcbmV4cG9ydCBmdW5jdGlvbiBzdHJpZGVkU2xpY2UoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGJlZ2luLCBlbmQsIHN0cmlkZXMsIGJlZ2luTWFzaywgZW5kTWFzaywgZWxsaXBzaXNNYXNrLCBuZXdBeGlzTWFzaywgc2hyaW5rQXhpc01hc2sgfSA9IGF0dHJzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoeCwgJ3N0cmlkZWRTbGljZScpO1xuICAgIGNvbnN0IHsgbm9uU3RyaWRlZCwgJGJlZ2luLCAkc3RyaWRlcywgc2l6ZSwgbmV3U2hhcGUsIG91dFNoYXBlIH0gPSBzbGljZV91dGlsLnNsaWNlSW5mbyh4LnNoYXBlLCBiZWdpbiwgZW5kLCBzdHJpZGVzLCBiZWdpbk1hc2ssIGVuZE1hc2ssIGVsbGlwc2lzTWFzaywgbmV3QXhpc01hc2ssIHNocmlua0F4aXNNYXNrKTtcbiAgICBjb25zdCAkeCA9IHJlc2hhcGUoeyBpbnB1dHM6IHsgeCB9LCBiYWNrZW5kLCBhdHRyczogeyBzaGFwZTogbmV3U2hhcGUgfSB9KTtcbiAgICBsZXQgcmVzdWx0O1xuICAgIGlmIChub25TdHJpZGVkKSB7XG4gICAgICAgIGNvbnN0IHNsaWNlZCA9IHNsaWNlKHsgaW5wdXRzOiB7IHg6ICR4IH0sIGJhY2tlbmQsIGF0dHJzOiB7IGJlZ2luOiAkYmVnaW4sIHNpemUgfSB9KTtcbiAgICAgICAgcmVzdWx0ID0gcmVzaGFwZSh7IGlucHV0czogeyB4OiBzbGljZWQgfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IG91dFNoYXBlIH0gfSk7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oc2xpY2VkKTtcbiAgICB9XG4gICAgZWxzZSBpZiAob3V0U2hhcGUuc29tZShheGlzID0+IGF4aXMgPT09IDApKSB7XG4gICAgICAgIHJlc3VsdCA9IGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0U2hhcGUsIHguZHR5cGUsIFtdKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IHhCdWYgPSBiYWNrZW5kLmJ1ZmZlclN5bmMoJHgpO1xuICAgICAgICBjb25zdCBvdXRCdWYgPSBzdHJpZGVkU2xpY2VJbXBsKG91dFNoYXBlLCB4QnVmLCAkc3RyaWRlcywgJGJlZ2luKTtcbiAgICAgICAgcmVzdWx0ID0gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRCdWYuc2hhcGUsIG91dEJ1Zi5kdHlwZSwgb3V0QnVmLnZhbHVlcyk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdFJlc2hhcGVkID0gcmVzaGFwZSh7IGlucHV0czogeyB4OiByZXN1bHQgfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IG91dFNoYXBlIH0gfSk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbygkeCk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZXN1bHQpO1xuICAgIHJldHVybiByZXN1bHRSZXNoYXBlZDtcbn1cbmV4cG9ydCBjb25zdCBzdHJpZGVkU2xpY2VDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogU3RyaWRlZFNsaWNlLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBzdHJpZGVkU2xpY2Vcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TdHJpZGVkU2xpY2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYnVmZmVyIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmV4cG9ydCBmdW5jdGlvbiBzdHJpZGVkU2xpY2VJbXBsKG91dFNoYXBlLCB4QnVmLCBzdHJpZGVzLCBiZWdpbikge1xuICAgIGNvbnN0IG91dEJ1ZiA9IGJ1ZmZlcihvdXRTaGFwZSwgeEJ1Zi5kdHlwZSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvdXRCdWYuc2l6ZTsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGxvYyA9IG91dEJ1Zi5pbmRleFRvTG9jKGkpO1xuICAgICAgICBjb25zdCBuZXdMb2MgPSBuZXcgQXJyYXkobG9jLmxlbmd0aCk7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbmV3TG9jLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBuZXdMb2Nbal0gPSBsb2Nbal0gKiBzdHJpZGVzW2pdICsgYmVnaW5bal07XG4gICAgICAgIH1cbiAgICAgICAgb3V0QnVmLnNldCh4QnVmLmdldCguLi5uZXdMb2MpLCAuLi5sb2MpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0QnVmO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3RyaWRlZFNsaWNlX2ltcGwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgU3RyaW5nTkdyYW1zIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHN0cmluZ05HcmFtc0ltcGwgfSBmcm9tICcuL1N0cmluZ05HcmFtc19pbXBsJztcbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdOR3JhbXMoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHNlcGFyYXRvciwgbkdyYW1XaWR0aHMsIGxlZnRQYWQsIHJpZ2h0UGFkLCBwYWRXaWR0aCwgcHJlc2VydmVTaG9ydFNlcXVlbmNlcyB9ID0gYXR0cnM7XG4gICAgY29uc3QgeyBkYXRhLCBkYXRhU3BsaXRzIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgJGRhdGEgPSBiYWNrZW5kLmRhdGEuZ2V0KGRhdGEuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgJGRhdGFTcGxpdHMgPSBiYWNrZW5kLmRhdGEuZ2V0KGRhdGFTcGxpdHMuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgW25HcmFtcywgbkdyYW1zU3BsaXRzXSA9IHN0cmluZ05HcmFtc0ltcGwoJGRhdGEsICRkYXRhU3BsaXRzLCBzZXBhcmF0b3IsIG5HcmFtV2lkdGhzLCBsZWZ0UGFkLCByaWdodFBhZCwgcGFkV2lkdGgsIHByZXNlcnZlU2hvcnRTZXF1ZW5jZXMpO1xuICAgIHJldHVybiBbXG4gICAgICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oW25HcmFtcy5sZW5ndGhdLCAnc3RyaW5nJywgbkdyYW1zKSxcbiAgICAgICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhkYXRhU3BsaXRzLnNoYXBlLCAnaW50MzInLCBuR3JhbXNTcGxpdHMpLFxuICAgIF07XG59XG5leHBvcnQgY29uc3Qgc3RyaW5nTkdyYW1zQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFN0cmluZ05HcmFtcyxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogc3RyaW5nTkdyYW1zLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVN0cmluZ05HcmFtcy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbi8qKlxuICogVGhlIFN0cmluZ05HcmFtc09wIGNsYXNzIGNyZWF0ZXMgbmdyYW1zIGZyb20gcmFnZ2VkIHN0cmluZyBkYXRhLlxuICogVGhlIGNvbnN0cnVjdG9yIGNvbnRhaW5zIGFsbCBhdHRyaWJ1dGVzIHJlbGF0ZWQgdG8gdGhlIG9wZXJhdGlvbiBzdWNoIGFzXG4gKiBwYWRkaW5nIHdpZHRocyBhbmQgc3RyaW5ncywgYW5kIHRoZSBjb21wdXRlIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvXG4gKiBjb21wdXRlIHRoZSBuZ3JhbXMgZm9yIGRpZmZlcmVudCByYWdnZWQgdGVuc29yIGlucHV0cy5cbiAqL1xuY2xhc3MgU3RyaW5nTkdyYW1zT3Age1xuICAgIGNvbnN0cnVjdG9yKHNlcGFyYXRvciwgbkdyYW1XaWR0aHMsIGxlZnRQYWQsIHJpZ2h0UGFkLCBwYWRXaWR0aCwgcHJlc2VydmVTaG9ydFNlcXVlbmNlcykge1xuICAgICAgICB0aGlzLnNlcGFyYXRvciA9IHV0aWwuZW5jb2RlU3RyaW5nKHNlcGFyYXRvcik7XG4gICAgICAgIHRoaXMubkdyYW1XaWR0aHMgPSBuR3JhbVdpZHRocztcbiAgICAgICAgdGhpcy5sZWZ0UGFkID0gdXRpbC5lbmNvZGVTdHJpbmcobGVmdFBhZCk7XG4gICAgICAgIHRoaXMucmlnaHRQYWQgPSB1dGlsLmVuY29kZVN0cmluZyhyaWdodFBhZCk7XG4gICAgICAgIHRoaXMucGFkV2lkdGggPSBwYWRXaWR0aDtcbiAgICAgICAgdGhpcy5wcmVzZXJ2ZVNob3J0ID0gcHJlc2VydmVTaG9ydFNlcXVlbmNlcztcbiAgICB9XG4gICAgZ2V0UGFkV2lkdGgobkdyYW1XaWR0aCkge1xuICAgICAgICAvLyBOZ3JhbXMgY2FuIGJlIHBhZGRlZCB3aXRoIGVpdGhlciBhIGZpeGVkIHBhZCB3aWR0aCBvciBhIGR5bmFtaWMgcGFkXG4gICAgICAgIC8vIHdpZHRoIGRlcGVuZGluZyBvbiB0aGUgJ3BhZFdpZHRoJyBhcmcsIGJ1dCBpbiBubyBjYXNlIHNob3VsZCB0aGUgcGFkZGluZ1xuICAgICAgICAvLyBldmVyIGJlIHdpZGVyIHRoYW4gJ25HcmFtV2lkdGgnIC0gMS5cbiAgICAgICAgcmV0dXJuIE1hdGgubWluKHRoaXMucGFkV2lkdGggPCAwID8gbkdyYW1XaWR0aCAtIDEgOiB0aGlzLnBhZFdpZHRoLCBuR3JhbVdpZHRoIC0gMSk7XG4gICAgfVxuICAgIGdldE51bU5HcmFtcyhsZW5ndGgsIG5HcmFtV2lkdGgpIHtcbiAgICAgICAgY29uc3QgcGFkV2lkdGggPSB0aGlzLmdldFBhZFdpZHRoKG5HcmFtV2lkdGgpO1xuICAgICAgICByZXR1cm4gTWF0aC5tYXgoMCwgKChsZW5ndGggKyAyICogcGFkV2lkdGgpIC0gbkdyYW1XaWR0aCkgKyAxKTtcbiAgICB9XG4gICAgY3JlYXRlTkdyYW1zKGRhdGEsIHNwbGl0SW5kZXgsIG91dHB1dCwgb3V0cHV0U3RhcnRJbmRleCwgbnVtTkdyYW1zLCBuR3JhbVdpZHRoKSB7XG4gICAgICAgIGZvciAobGV0IG5HcmFtSW5kZXggPSAwOyBuR3JhbUluZGV4IDwgbnVtTkdyYW1zOyArK25HcmFtSW5kZXgpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhZFdpZHRoID0gdGhpcy5nZXRQYWRXaWR0aChuR3JhbVdpZHRoKTtcbiAgICAgICAgICAgIGNvbnN0IGxlZnRQYWRkaW5nID0gTWF0aC5tYXgoMCwgcGFkV2lkdGggLSBuR3JhbUluZGV4KTtcbiAgICAgICAgICAgIGNvbnN0IHJpZ2h0UGFkZGluZyA9IE1hdGgubWF4KDAsIHBhZFdpZHRoIC0gKG51bU5HcmFtcyAtIChuR3JhbUluZGV4ICsgMSkpKTtcbiAgICAgICAgICAgIGNvbnN0IG51bVRva2VucyA9IG5HcmFtV2lkdGggLSAobGVmdFBhZGRpbmcgKyByaWdodFBhZGRpbmcpO1xuICAgICAgICAgICAgY29uc3QgZGF0YVN0YXJ0SW5kZXggPSBzcGxpdEluZGV4ICsgKGxlZnRQYWRkaW5nID4gMCA/IDAgOiBuR3JhbUluZGV4IC0gcGFkV2lkdGgpO1xuICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSB0b3RhbCBleHBlY3RlZCBzaXplIG9mIHRoZSBuR3JhbSBzbyB3ZSBjYW4gcmVzZXJ2ZSB0aGVcbiAgICAgICAgICAgIC8vIGNvcnJlY3QgYW1vdW50IG9mIHNwYWNlIGluIHRoZSBzdHJpbmcuXG4gICAgICAgICAgICBsZXQgbkdyYW1TaXplID0gMDtcbiAgICAgICAgICAgIC8vIFNpemUgb2YgdGhlIGxlZnQgcGFkZGluZy5cbiAgICAgICAgICAgIG5HcmFtU2l6ZSArPSBsZWZ0UGFkZGluZyAqIHRoaXMubGVmdFBhZC5sZW5ndGg7XG4gICAgICAgICAgICAvLyBTaXplIG9mIHRoZSB0b2tlbnMuXG4gICAgICAgICAgICBmb3IgKGxldCBuID0gMDsgbiA8IG51bVRva2VuczsgKytuKSB7XG4gICAgICAgICAgICAgICAgbkdyYW1TaXplICs9IGRhdGFbZGF0YVN0YXJ0SW5kZXggKyBuXS5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBTaXplIG9mIHRoZSByaWdodCBwYWRkaW5nLlxuICAgICAgICAgICAgbkdyYW1TaXplICs9IHJpZ2h0UGFkZGluZyAqIHRoaXMucmlnaHRQYWQubGVuZ3RoO1xuICAgICAgICAgICAgLy8gU2l6ZSBvZiB0aGUgc2VwYXJhdG9ycy5cbiAgICAgICAgICAgIGNvbnN0IG51bVNlcGFyYXRvcnMgPSBsZWZ0UGFkZGluZyArIHJpZ2h0UGFkZGluZyArIG51bVRva2VucyAtIDE7XG4gICAgICAgICAgICBuR3JhbVNpemUgKz0gbnVtU2VwYXJhdG9ycyAqIHRoaXMuc2VwYXJhdG9yLmxlbmd0aDtcbiAgICAgICAgICAgIC8vIEJ1aWxkIHRoZSBuR3JhbS5cbiAgICAgICAgICAgIG91dHB1dFtvdXRwdXRTdGFydEluZGV4ICsgbkdyYW1JbmRleF0gPSBuZXcgVWludDhBcnJheShuR3JhbVNpemUpO1xuICAgICAgICAgICAgY29uc3QgbkdyYW0gPSBvdXRwdXRbb3V0cHV0U3RhcnRJbmRleCArIG5HcmFtSW5kZXhdO1xuICAgICAgICAgICAgbGV0IG5leHROR3JhbUluZGV4ID0gMDtcbiAgICAgICAgICAgIGNvbnN0IGFwcGVuZFRvTkdyYW0gPSAoc3RyKSA9PiBzdHIuZm9yRWFjaCgodmFsdWUpID0+IG5HcmFtW25leHROR3JhbUluZGV4KytdID0gdmFsdWUpO1xuICAgICAgICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCBsZWZ0UGFkZGluZzsgKytuKSB7XG4gICAgICAgICAgICAgICAgYXBwZW5kVG9OR3JhbSh0aGlzLmxlZnRQYWQpO1xuICAgICAgICAgICAgICAgIGFwcGVuZFRvTkdyYW0odGhpcy5zZXBhcmF0b3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gT25seSBvdXRwdXQgZmlyc3QgbnVtVG9rZW5zIC0gMSBwYWlycyBvZiBkYXRhIGFuZCBzZXBhcmF0b3JcbiAgICAgICAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgbnVtVG9rZW5zIC0gMTsgKytuKSB7XG4gICAgICAgICAgICAgICAgYXBwZW5kVG9OR3JhbShkYXRhW2RhdGFTdGFydEluZGV4ICsgbl0pO1xuICAgICAgICAgICAgICAgIGFwcGVuZFRvTkdyYW0odGhpcy5zZXBhcmF0b3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSGFuZGxlIGNhc2Ugd2hlbiB0aGVyZSBhcmUgbm8gdG9rZW5zIG9yIG5vIHJpZ2h0IHBhZGRpbmcgYXMgdGhlc2VcbiAgICAgICAgICAgIC8vIGNhbiByZXN1bHQgaW4gY29uc2VjdXRpdmUgc2VwYXJhdG9ycy5cbiAgICAgICAgICAgIGlmIChudW1Ub2tlbnMgPiAwKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSB0b2tlbnMsIHRoZW4gb3V0cHV0IGxhc3QgYW5kIHRoZW4gcGFpciBlYWNoIHNlcGFyYXRvclxuICAgICAgICAgICAgICAgIC8vIHdpdGggdGhlIHJpZ2h0IHBhZGRpbmcgdGhhdCBmb2xsb3dzLCB0byBlbnN1cmUgbkdyYW0gZW5kcyBlaXRoZXIgd2l0aFxuICAgICAgICAgICAgICAgIC8vIHRoZSB0b2tlbiBvciB3aXRoIHRoZSByaWdodCBwYWQuXG4gICAgICAgICAgICAgICAgYXBwZW5kVG9OR3JhbShkYXRhW2RhdGFTdGFydEluZGV4ICsgbnVtVG9rZW5zIC0gMV0pO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgcmlnaHRQYWRkaW5nOyArK24pIHtcbiAgICAgICAgICAgICAgICAgICAgYXBwZW5kVG9OR3JhbSh0aGlzLnNlcGFyYXRvcik7XG4gICAgICAgICAgICAgICAgICAgIGFwcGVuZFRvTkdyYW0odGhpcy5yaWdodFBhZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSB0b2tlbnMsIHRoZW4gdGhlIGxhc3QgaXRlbSBpbnNlcnRlZCBpbnRvIHRoZSBuR3JhbVxuICAgICAgICAgICAgICAgIC8vIGhhcyBiZWVuIHRoZSBzZXBhcmF0b3IgZnJvbSB0aGUgbGVmdCBwYWRkaW5nIGxvb3AgYWJvdmUuIEhlbmNlLFxuICAgICAgICAgICAgICAgIC8vIG91dHB1dCByaWdodCBwYWQgYW5kIHNlcGFyYXRvciBhbmQgbWFrZSBzdXJlIHRvIGZpbmlzaCB3aXRoIGFcbiAgICAgICAgICAgICAgICAvLyBwYWRkaW5nLCBub3QgYSBzZXBhcmF0b3IuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCByaWdodFBhZGRpbmcgLSAxOyArK24pIHtcbiAgICAgICAgICAgICAgICAgICAgYXBwZW5kVG9OR3JhbSh0aGlzLnJpZ2h0UGFkKTtcbiAgICAgICAgICAgICAgICAgICAgYXBwZW5kVG9OR3JhbSh0aGlzLnNlcGFyYXRvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGFwcGVuZFRvTkdyYW0odGhpcy5yaWdodFBhZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gRGF0YSBhbmQgc3BsaXRzIHRvZ2V0aGVyIGZvcm0gdGhlIGRlZmluaXRpb24gb2YgdGhlIHJhZ2dlZCB0ZW5zb3IsXG4gICAgLy8gd2hlcmUgZGF0YSBpcyAxIGRpbWVuc2lvbmFsIGFuZCBjb250YWlucyB0aGUgdmFsdWVzIG9mIHRoZSB0ZW5zb3JcbiAgICAvLyBhbmQgc3BsaXRzIGRlbm90ZXMgdGhlIGluZGljZXMgYXQgd2hpY2ggZWFjaCByb3cgc3RhcnRzLlxuICAgIGNvbXB1dGUoZGF0YSwgc3BsaXRzKSB7XG4gICAgICAgIC8vIFZhbGlkYXRlIHRoYXQgdGhlIHNwbGl0cyBhcmUgdmFsaWQgaW5kaWNlcyBpbnRvIGRhdGEsIG9ubHkgaWYgdGhlcmUgYXJlXG4gICAgICAgIC8vIHNwbGl0cyBzcGVjaWZpZWQuXG4gICAgICAgIGNvbnN0IGlucHV0RGF0YVNpemUgPSBkYXRhLmxlbmd0aDtcbiAgICAgICAgY29uc3Qgc3BsaXRzU2l6ZSA9IHNwbGl0cy5sZW5ndGg7XG4gICAgICAgIGlmIChzcGxpdHNTaXplID4gMCkge1xuICAgICAgICAgICAgbGV0IHByZXZTcGxpdCA9IHNwbGl0c1swXTtcbiAgICAgICAgICAgIGlmIChwcmV2U3BsaXQgIT09IDApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpcnN0IHNwbGl0IHZhbHVlIG11c3QgYmUgMCwgZ290ICR7cHJldlNwbGl0fWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzcGxpdHNTaXplOyArK2kpIHtcbiAgICAgICAgICAgICAgICBsZXQgdmFsaWRTcGxpdHMgPSBzcGxpdHNbaV0gPj0gcHJldlNwbGl0O1xuICAgICAgICAgICAgICAgIHZhbGlkU3BsaXRzID0gdmFsaWRTcGxpdHMgJiYgKHNwbGl0c1tpXSA8PSBpbnB1dERhdGFTaXplKTtcbiAgICAgICAgICAgICAgICBpZiAoIXZhbGlkU3BsaXRzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzcGxpdCB2YWx1ZSAke3NwbGl0c1tpXX0sIG11c3QgYmUgaW4gWyR7cHJldlNwbGl0fSwgJHtpbnB1dERhdGFTaXplfV1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcHJldlNwbGl0ID0gc3BsaXRzW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHByZXZTcGxpdCAhPT0gaW5wdXREYXRhU2l6ZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTGFzdCBzcGxpdCB2YWx1ZSBtdXN0IGJlIGRhdGEgc2l6ZS4gRXhwZWN0ZWQgJHtpbnB1dERhdGFTaXplfSwgZ290ICR7cHJldlNwbGl0fWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG51bUJhdGNoSXRlbXMgPSBzcGxpdHNTaXplIC0gMTtcbiAgICAgICAgY29uc3QgbkdyYW1zU3BsaXRzID0gdXRpbC5nZXRBcnJheUZyb21EVHlwZSgnaW50MzInLCBzcGxpdHNTaXplKTtcbiAgICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gZGF0YSBvciBzaXplLCByZXR1cm4gYW4gZW1wdHkgcmFnZ2VkIHRlbnNvci5cbiAgICAgICAgaWYgKGlucHV0RGF0YVNpemUgPT09IDAgfHwgc3BsaXRzU2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgY29uc3QgZW1wdHkgPSBuZXcgQXJyYXkoaW5wdXREYXRhU2l6ZSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBudW1CYXRjaEl0ZW1zOyArK2kpIHtcbiAgICAgICAgICAgICAgICBuR3JhbXNTcGxpdHNbaV0gPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFtlbXB0eSwgbkdyYW1zU3BsaXRzXTtcbiAgICAgICAgfVxuICAgICAgICBuR3JhbXNTcGxpdHNbMF0gPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSBudW1CYXRjaEl0ZW1zOyArK2kpIHtcbiAgICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IHNwbGl0c1tpXSAtIHNwbGl0c1tpIC0gMV07XG4gICAgICAgICAgICBsZXQgbnVtTkdyYW1zID0gMDtcbiAgICAgICAgICAgIHRoaXMubkdyYW1XaWR0aHMuZm9yRWFjaCgobkdyYW1XaWR0aCkgPT4ge1xuICAgICAgICAgICAgICAgIG51bU5HcmFtcyArPSB0aGlzLmdldE51bU5HcmFtcyhsZW5ndGgsIG5HcmFtV2lkdGgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmVzZXJ2ZVNob3J0ICYmIGxlbmd0aCA+IDAgJiYgbnVtTkdyYW1zID09PSAwKSB7XG4gICAgICAgICAgICAgICAgbnVtTkdyYW1zID0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5HcmFtc1NwbGl0c1tpXSA9IG5HcmFtc1NwbGl0c1tpIC0gMV0gKyBudW1OR3JhbXM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbkdyYW1zID0gbmV3IEFycmF5KG5HcmFtc1NwbGl0c1tudW1CYXRjaEl0ZW1zXSk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtQmF0Y2hJdGVtczsgKytpKSB7XG4gICAgICAgICAgICBjb25zdCBzcGxpdEluZGV4ID0gc3BsaXRzW2ldO1xuICAgICAgICAgICAgbGV0IG91dHB1dFN0YXJ0SWR4ID0gbkdyYW1zU3BsaXRzW2ldO1xuICAgICAgICAgICAgdGhpcy5uR3JhbVdpZHRocy5mb3JFYWNoKChuR3JhbVdpZHRoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGVuZ3RoID0gc3BsaXRzW2kgKyAxXSAtIHNwbGl0c1tpXTtcbiAgICAgICAgICAgICAgICBjb25zdCBudW1OR3JhbXMgPSB0aGlzLmdldE51bU5HcmFtcyhsZW5ndGgsIG5HcmFtV2lkdGgpO1xuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlTkdyYW1zKGRhdGEsIHNwbGl0SW5kZXgsIG5HcmFtcywgb3V0cHV0U3RhcnRJZHgsIG51bU5HcmFtcywgbkdyYW1XaWR0aCk7XG4gICAgICAgICAgICAgICAgb3V0cHV0U3RhcnRJZHggKz0gbnVtTkdyYW1zO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBJZiB3ZSdyZSBwcmVzZXJ2aW5nIHNob3J0IHNlcXVlbmNlcywgY2hlY2sgdG8gc2VlIGlmIG5vIHNlcXVlbmNlIHdhc1xuICAgICAgICAgICAgLy8gZ2VuZXJhdGVkIGJ5IGNvbXBhcmluZyB0aGUgY3VycmVudCBvdXRwdXQgc3RhcnQgaWR4IHRvIHRoZSBvcmlnaW5hbFxuICAgICAgICAgICAgLy8gb25lIChuR3JhbVNwbGl0c2RhdGEpLiBJZiBubyBuZ3JhbXMgd2VyZSBnZW5lcmF0ZWQsIHRoZW4gdGhleSB3aWxsXG4gICAgICAgICAgICAvLyBiZSBlcXVhbCAoc2luY2Ugd2UgaW5jcmVtZW50IG91dHB1dFN0YXJ0SWR4IGJ5IG51bU5HcmFtcyBldmVyeVxuICAgICAgICAgICAgLy8gdGltZSB3ZSBjcmVhdGUgYSBzZXQgb2YgbmdyYW1zLilcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXNlcnZlU2hvcnQgJiYgb3V0cHV0U3RhcnRJZHggPT09IG5HcmFtc1NwbGl0c1tpXSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFMZW5ndGggPSBzcGxpdHNbaSArIDFdIC0gc3BsaXRzW2ldO1xuICAgICAgICAgICAgICAgIC8vIE9uZSBsZWdpdGltYXRlIHJlYXNvbiB0byBub3QgaGF2ZSBhbnkgbmdyYW1zIHdoZW4gdGhpcy5wcmVzZXJ2ZVNob3J0XG4gICAgICAgICAgICAgICAgLy8gaXMgdHJ1ZSBpcyBpZiB0aGUgc2VxdWVuY2UgaXRzZWxmIGlzIGVtcHR5LiBJbiB0aGF0IGNhc2UsIG1vdmUgb24uXG4gICAgICAgICAgICAgICAgaWYgKGRhdGFMZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgZHluYW1pYyBwYWRkaW5nIHNpemVzIGhlcmU6IGlmIHBhZGRpbmdcbiAgICAgICAgICAgICAgICAvLyB3YXMgZHluYW1pYywgZXZlcnkgc2VxdWVuY2Ugd291bGQgaGF2ZSBoYWQgc3VmZmljaWVudCBwYWRkaW5nIHRvXG4gICAgICAgICAgICAgICAgLy8gZ2VuZXJhdGUgYXQgbGVhc3Qgb25lIG5HcmFtLlxuICAgICAgICAgICAgICAgIGNvbnN0IG5HcmFtV2lkdGggPSBkYXRhTGVuZ3RoICsgMiAqIHRoaXMucGFkV2lkdGg7XG4gICAgICAgICAgICAgICAgY29uc3QgbnVtTkdyYW1zID0gMTtcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZU5HcmFtcyhkYXRhLCBzcGxpdEluZGV4LCBuR3JhbXMsIG91dHB1dFN0YXJ0SWR4LCBudW1OR3JhbXMsIG5HcmFtV2lkdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbbkdyYW1zLCBuR3JhbXNTcGxpdHNdO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdOR3JhbXNJbXBsKGRhdGEsIGRhdGFTcGxpdHMsIHNlcGFyYXRvciwgbkdyYW1XaWR0aHMsIGxlZnRQYWQsIHJpZ2h0UGFkLCBwYWRXaWR0aCwgcHJlc2VydmVTaG9ydFNlcXVlbmNlcykge1xuICAgIHJldHVybiBuZXcgU3RyaW5nTkdyYW1zT3Aoc2VwYXJhdG9yLCBuR3JhbVdpZHRocywgbGVmdFBhZCwgcmlnaHRQYWQsIHBhZFdpZHRoLCBwcmVzZXJ2ZVNob3J0U2VxdWVuY2VzKVxuICAgICAgICAuY29tcHV0ZShkYXRhLCBkYXRhU3BsaXRzKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVN0cmluZ05HcmFtc19pbXBsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFN0cmluZ1NwbGl0IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHN0cmluZ1NwbGl0SW1wbCB9IGZyb20gJy4vU3RyaW5nU3BsaXRfaW1wbCc7XG5leHBvcnQgZnVuY3Rpb24gc3RyaW5nU3BsaXQoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHNraXBFbXB0eSB9ID0gYXR0cnM7XG4gICAgY29uc3QgeyBpbnB1dCwgZGVsaW1pdGVyIH0gPSBpbnB1dHM7XG4gICAgaWYgKGlucHV0LmR0eXBlICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0lucHV0IG11c3QgYmUgb2YgZGF0YXR5cGUgc3RyaW5nJyk7XG4gICAgfVxuICAgIGlmIChpbnB1dC5zaGFwZS5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnB1dCBtdXN0IGJlIGEgdmVjdG9yLCBnb3Qgc2hhcGU6ICR7aW5wdXQuc2hhcGV9YCk7XG4gICAgfVxuICAgIGlmIChkZWxpbWl0ZXIuc2hhcGUubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRGVsaW1pdGVyIG11c3QgYmUgYSBzY2FsYXIsIGdvdCBzaGFwZTogJHtkZWxpbWl0ZXIuc2hhcGV9YCk7XG4gICAgfVxuICAgIGNvbnN0ICRpbnB1dCA9IGJhY2tlbmQuZGF0YS5nZXQoaW5wdXQuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgJGRlbGltaXRlciA9IGJhY2tlbmQuZGF0YS5nZXQoZGVsaW1pdGVyLmRhdGFJZCkudmFsdWVzWzBdO1xuICAgIGNvbnN0IFtpbmRpY2VzLCB2YWx1ZXMsIHNoYXBlXSA9IHN0cmluZ1NwbGl0SW1wbCgkaW5wdXQsICRkZWxpbWl0ZXIsIHNraXBFbXB0eSk7XG4gICAgY29uc3Qgb3V0cHV0U2l6ZSA9IHZhbHVlcy5sZW5ndGg7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhbb3V0cHV0U2l6ZSwgMl0sICdpbnQzMicsIGluZGljZXMpLFxuICAgICAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtvdXRwdXRTaXplXSwgJ3N0cmluZycsIHZhbHVlcyksXG4gICAgICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oWzJdLCAnaW50MzInLCBuZXcgSW50MzJBcnJheShzaGFwZSkpXG4gICAgXTtcbn1cbmV4cG9ydCBjb25zdCBzdHJpbmdTcGxpdENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBTdHJpbmdTcGxpdCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogc3RyaW5nU3BsaXQsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3RyaW5nU3BsaXQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5mdW5jdGlvbiBzcGxpdChzdHIsIGRlbGltaXRlcnMsIHNraXBFbXB0eSkge1xuICAgIGlmICghc3RyLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIC8vIFdoZW4gdGhlIGRlbGltaXRlciBpcyBlbXB0eSwgdGhlIGlucHV0IGlzIHNwbGl0IGludG8gaW5kaXZpZHVhbCBjaGFyYWN0ZXJzLlxuICAgIGlmIChkZWxpbWl0ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXkoc3RyLmxlbmd0aCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICByZXN1bHRbaV0gPSBzdHIuc3ViYXJyYXkoaSwgaSArIDEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8vIFdoZW4gdGhlcmUgaXMgb25lIGRlbGltaXRlciwgdGhlIGlucHV0IGlzIHNwbGl0IG9ubHkgYXQgdGhhdCBkZWxpbWl0ZXIuXG4gICAgaWYgKGRlbGltaXRlcnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGNvbnN0IGRlbGltaXRlciA9IGRlbGltaXRlcnNbMF07XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgICAgICBsZXQgZiA9IHN0ci5pbmRleE9mKGRlbGltaXRlcik7XG4gICAgICAgIHdoaWxlIChmICE9PSAtMSkge1xuICAgICAgICAgICAgY29uc3QgdG9rZW4gPSBzdHIuc3ViYXJyYXkoMCwgZik7XG4gICAgICAgICAgICBpZiAoIXNraXBFbXB0eSB8fCB0b2tlbi5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0b2tlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdHIgPSBzdHIuc3ViYXJyYXkoZiArIDEpO1xuICAgICAgICAgICAgZiA9IHN0ci5pbmRleE9mKGRlbGltaXRlcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFza2lwRW1wdHkgfHwgc3RyLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goc3RyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvLyBXaGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBkZWxpbWl0ZXJzLCB0aGUgaW5wdXQgaXMgc3BsaXQgYXQgZXZlcnkgaW5zdGFuY2VcbiAgICAvLyBvbmUgb2YgdGhlIGRlbGltaXRlcnMgYXBwZWFycy5cbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBsZXQgdG9rZW5TdGFydCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoICsgMTsgaSsrKSB7XG4gICAgICAgIGlmICgoaSA9PT0gc3RyLmxlbmd0aCkgfHwgKGRlbGltaXRlcnMuaW5kZXhPZihzdHJbaV0pICE9PSAtMSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHRva2VuID0gc3RyLnN1YmFycmF5KHRva2VuU3RhcnQsIGkpO1xuICAgICAgICAgICAgaWYgKCFza2lwRW1wdHkgfHwgdG9rZW4ubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godG9rZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdG9rZW5TdGFydCA9IGkgKyAxO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5leHBvcnQgZnVuY3Rpb24gc3RyaW5nU3BsaXRJbXBsKGlucHV0LCBkZWxpbWl0ZXIsIHNraXBFbXB0eSkge1xuICAgIGNvbnN0IGJhdGNoU2l6ZSA9IGlucHV0Lmxlbmd0aDtcbiAgICAvLyBFbXB0eSBkZWxpbWl0ZXIgbWVhbnMgc3BsaXQgdGhlIGlucHV0IGNoYXJhY3RlciBieSBjaGFyYWN0ZXIuXG4gICAgY29uc3QgdG9rZW5zID0gW107XG4gICAgbGV0IG91dHB1dFNpemUgPSAwO1xuICAgIGxldCBtYXhOdW1FbnRyaWVzID0gMDtcbiAgICBjb25zdCBudW1JbmRpY2VzID0gbmV3IEFycmF5KGJhdGNoU2l6ZSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBiYXRjaFNpemU7ICsraSkge1xuICAgICAgICBjb25zdCBwYXJ0cyA9IHNwbGl0KGlucHV0W2ldLCBkZWxpbWl0ZXIsIHNraXBFbXB0eSk7XG4gICAgICAgIGNvbnN0IG5FbnRyaWVzID0gcGFydHMubGVuZ3RoO1xuICAgICAgICBudW1JbmRpY2VzW2ldID0gbkVudHJpZXM7XG4gICAgICAgIG91dHB1dFNpemUgKz0gbkVudHJpZXM7XG4gICAgICAgIG1heE51bUVudHJpZXMgPSBNYXRoLm1heChtYXhOdW1FbnRyaWVzLCBuRW50cmllcyk7XG4gICAgICAgIHRva2Vucy5wdXNoKC4uLnBhcnRzKTtcbiAgICB9XG4gICAgY29uc3QgaW5kaWNlcyA9IHV0aWwuZ2V0QXJyYXlGcm9tRFR5cGUoJ2ludDMyJywgb3V0cHV0U2l6ZSAqIDIpO1xuICAgIGNvbnN0IHZhbHVlcyA9IG5ldyBBcnJheShvdXRwdXRTaXplKTtcbiAgICBjb25zdCBzaGFwZSA9IFtiYXRjaFNpemUsIG1heE51bUVudHJpZXNdO1xuICAgIGxldCBjID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJhdGNoU2l6ZTsgKytpKSB7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbnVtSW5kaWNlc1tpXTsgKytqKSB7XG4gICAgICAgICAgICAvLyBpbmRpY2VzIGlzIGEgMmQgdGVuc29yIHdpdGggc2hhcGUgb2YgW291dHB1dFNpemUsIDJdXG4gICAgICAgICAgICBpbmRpY2VzW2MgKiAyXSA9IGk7XG4gICAgICAgICAgICBpbmRpY2VzW2MgKiAyICsgMV0gPSBqO1xuICAgICAgICAgICAgdmFsdWVzW2NdID0gdG9rZW5zW2NdO1xuICAgICAgICAgICAgKytjO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBbaW5kaWNlcywgdmFsdWVzLCBzaGFwZV07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TdHJpbmdTcGxpdF9pbXBsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFN0cmluZ1RvSGFzaEJ1Y2tldEZhc3QgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgc3RyaW5nVG9IYXNoQnVja2V0RmFzdEltcGwgfSBmcm9tICcuL1N0cmluZ1RvSGFzaEJ1Y2tldEZhc3RfaW1wbCc7XG5leHBvcnQgZnVuY3Rpb24gc3RyaW5nVG9IYXNoQnVja2V0RmFzdChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgbnVtQnVja2V0cyB9ID0gYXR0cnM7XG4gICAgY29uc3QgeyBpbnB1dCB9ID0gaW5wdXRzO1xuICAgIGlmIChpbnB1dC5kdHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnB1dCBtdXN0IGJlIG9mIGRhdGF0eXBlIHN0cmluZycpO1xuICAgIH1cbiAgICBpZiAobnVtQnVja2V0cyA8PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTnVtYmVyIG9mIGJ1Y2tldHMgbXVzdCBiZSBhdCBsZWFzdCAxYCk7XG4gICAgfVxuICAgIGNvbnN0ICRpbnB1dCA9IGJhY2tlbmQuZGF0YS5nZXQoaW5wdXQuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3Qgb3V0cHV0ID0gc3RyaW5nVG9IYXNoQnVja2V0RmFzdEltcGwoJGlucHV0LCBudW1CdWNrZXRzKTtcbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhpbnB1dC5zaGFwZSwgJ2ludDMyJywgb3V0cHV0KTtcbn1cbmV4cG9ydCBjb25zdCBzdHJpbmdUb0hhc2hCdWNrZXRGYXN0Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFN0cmluZ1RvSGFzaEJ1Y2tldEZhc3QsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHN0cmluZ1RvSGFzaEJ1Y2tldEZhc3QsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3RyaW5nVG9IYXNoQnVja2V0RmFzdC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdUb0hhc2hCdWNrZXRGYXN0SW1wbChpbnB1dCwgbnVtQnVja2V0cykge1xuICAgIGNvbnN0IG91dHB1dCA9IHV0aWwuZ2V0QXJyYXlGcm9tRFR5cGUoJ2ludDMyJywgaW5wdXQubGVuZ3RoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0Lmxlbmd0aDsgKytpKSB7XG4gICAgICAgIG91dHB1dFtpXSA9XG4gICAgICAgICAgICB1dGlsLmZpbmdlclByaW50NjQoaW5wdXRbaV0pLm1vZHVsbyhudW1CdWNrZXRzKS5nZXRMb3dCaXRzVW5zaWduZWQoKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVN0cmluZ1RvSGFzaEJ1Y2tldEZhc3RfaW1wbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBTdWIgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCB9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV9pbXBsJztcbmltcG9ydCB7IGJpbmFyeUtlcm5lbEZ1bmMsIGNyZWF0ZUNvbXBsZXhCaW5hcnlLZXJuZWxJbXBsIH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCBzdWJJbXBsID0gY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCgoKGFWYWx1ZSwgYlZhbHVlKSA9PiBhVmFsdWUgLSBiVmFsdWUpKTtcbmV4cG9ydCBjb25zdCBzdWJDb21wbGV4SW1wbCA9IGNyZWF0ZUNvbXBsZXhCaW5hcnlLZXJuZWxJbXBsKCgoYVJlYWwsIGFJbWFnLCBiUmVhbCwgYkltYWcpID0+IHtcbiAgICByZXR1cm4geyByZWFsOiBhUmVhbCAtIGJSZWFsLCBpbWFnOiBhSW1hZyAtIGJJbWFnIH07XG59KSk7XG5leHBvcnQgY29uc3Qgc3ViID0gYmluYXJ5S2VybmVsRnVuYyhTdWIsIHN1YkltcGwsIHN1YkNvbXBsZXhJbXBsKTtcbmV4cG9ydCBjb25zdCBzdWJDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogU3ViLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBzdWJcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TdWIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBTdW0sIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmltcG9ydCB7IHplcm9zIH0gZnJvbSAnLi4vdXRpbHMvemVyb3NfaW1wbCc7XG5pbXBvcnQgeyBjYXN0IH0gZnJvbSAnLi9DYXN0JztcbmltcG9ydCB7IGlkZW50aXR5IH0gZnJvbSAnLi9JZGVudGl0eSc7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9SZXNoYXBlJztcbmltcG9ydCB7IHRyYW5zcG9zZSB9IGZyb20gJy4vVHJhbnNwb3NlJztcbmV4cG9ydCBmdW5jdGlvbiBzdW0oYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGF4aXMsIGtlZXBEaW1zIH0gPSBhdHRycztcbiAgICBhc3NlcnROb3RDb21wbGV4KHgsICdzdW0nKTtcbiAgICBsZXQgJHg7XG4gICAgaWYgKHguZHR5cGUgPT09ICdib29sJykge1xuICAgICAgICAkeCA9IGNhc3QoeyBpbnB1dHM6IHsgeCB9LCBiYWNrZW5kLCBhdHRyczogeyBkdHlwZTogJ2ludDMyJyB9IH0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgJHggPSBpZGVudGl0eSh7IGlucHV0czogeyB4IH0sIGJhY2tlbmQgfSk7XG4gICAgfVxuICAgIGNvbnN0IHhSYW5rID0gJHguc2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IGF4ZXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKGF4aXMsICR4LnNoYXBlKTtcbiAgICBjb25zdCBwZXJtdXRhdGlvbiA9IGJhY2tlbmRfdXRpbC5nZXRBeGVzUGVybXV0YXRpb24oYXhlcywgeFJhbmspO1xuICAgIGxldCByZWR1Y3Rpb25BeGVzID0gYXhlcztcbiAgICBsZXQgcGVybXV0ZWRYID0gJHg7XG4gICAgaWYgKHBlcm11dGF0aW9uICE9IG51bGwpIHtcbiAgICAgICAgcGVybXV0ZWRYID1cbiAgICAgICAgICAgIHRyYW5zcG9zZSh7IGlucHV0czogeyB4OiAkeCB9LCBiYWNrZW5kLCBhdHRyczogeyBwZXJtOiBwZXJtdXRhdGlvbiB9IH0pO1xuICAgICAgICByZWR1Y3Rpb25BeGVzID0gYmFja2VuZF91dGlsLmdldElubmVyTW9zdEF4ZXMocmVkdWN0aW9uQXhlcy5sZW5ndGgsIHhSYW5rKTtcbiAgICB9XG4gICAgYmFja2VuZF91dGlsLmFzc2VydEF4ZXNBcmVJbm5lck1vc3REaW1zKCdzdW0nLCByZWR1Y3Rpb25BeGVzLCBwZXJtdXRlZFguc2hhcGUubGVuZ3RoKTtcbiAgICBjb25zdCBbb3V0U2hhcGUsIHJlZHVjZVNoYXBlXSA9IGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0QW5kUmVkdWNlU2hhcGVzKHBlcm11dGVkWC5zaGFwZSwgcmVkdWN0aW9uQXhlcyk7XG4gICAgY29uc3QgcmVzdWx0RHR5cGUgPSBiYWNrZW5kX3V0aWwudXBjYXN0VHlwZShwZXJtdXRlZFguZHR5cGUsICdpbnQzMicpO1xuICAgIGxldCByZXN1bHQgPSB6ZXJvcyhiYWNrZW5kLCBvdXRTaGFwZSwgcmVzdWx0RHR5cGUpO1xuICAgIGNvbnN0IHJlZHVjZVNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUocmVkdWNlU2hhcGUpO1xuICAgIGNvbnN0IHZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KHJlc3VsdC5kYXRhSWQpLnZhbHVlcztcbiAgICBjb25zdCBhVmFscyA9IGJhY2tlbmQuZGF0YS5nZXQocGVybXV0ZWRYLmRhdGFJZCkudmFsdWVzO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFscy5sZW5ndGg7ICsraSkge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBpICogcmVkdWNlU2l6ZTtcbiAgICAgICAgbGV0IHN1bSA9IDA7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcmVkdWNlU2l6ZTsgKytqKSB7XG4gICAgICAgICAgICBzdW0gKz0gYVZhbHNbb2Zmc2V0ICsgal07XG4gICAgICAgIH1cbiAgICAgICAgdmFsc1tpXSA9IHN1bTtcbiAgICB9XG4gICAgaWYgKGtlZXBEaW1zKSB7XG4gICAgICAgIGNvbnN0IG5ld1NoYXBlID0gYmFja2VuZF91dGlsLmV4cGFuZFNoYXBlVG9LZWVwRGltKHJlc3VsdC5zaGFwZSwgYXhlcyk7XG4gICAgICAgIGNvbnN0IG9sZFJlc3VsdCA9IHJlc3VsdDtcbiAgICAgICAgcmVzdWx0ID0gcmVzaGFwZSh7IGlucHV0czogeyB4OiByZXN1bHQgfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IG5ld1NoYXBlIH0gfSk7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ob2xkUmVzdWx0KTtcbiAgICB9XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbygkeCk7XG4gICAgaWYgKHBlcm11dGF0aW9uICE9IG51bGwpIHtcbiAgICAgICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhwZXJtdXRlZFgpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0IGNvbnN0IHN1bUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBTdW0sXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHN1bVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVN1bS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgVGFuIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHVuYXJ5S2VybmVsRnVuYyB9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X3V0aWxzJztcbmV4cG9ydCBjb25zdCB0YW4gPSB1bmFyeUtlcm5lbEZ1bmMoVGFuLCAoeGkpID0+IE1hdGgudGFuKHhpKSk7XG5leHBvcnQgY29uc3QgdGFuQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFRhbixcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogdGFuLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRhbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgVGFuaCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB1bmFyeUtlcm5lbEZ1bmMgfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5leHBvcnQgY29uc3QgdGFuaCA9IHVuYXJ5S2VybmVsRnVuYyhUYW5oLCAoeGkpID0+IE1hdGgudGFuaCh4aSkpO1xuZXhwb3J0IGNvbnN0IHRhbmhDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogVGFuaCxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogdGFuaCxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1UYW5oLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFRpbGUgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmltcG9ydCB7IHRpbGVJbXBsIH0gZnJvbSAnLi9UaWxlX2ltcGwnO1xuZXhwb3J0IGZ1bmN0aW9uIHRpbGUoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IHJlcHMgfSA9IGF0dHJzO1xuICAgIGFzc2VydE5vdENvbXBsZXgoeCwgJ3RpbGUnKTtcbiAgICBjb25zdCBvdXRCdWYgPSB0aWxlSW1wbChiYWNrZW5kLmJ1ZmZlclN5bmMoeCksIHJlcHMpO1xuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dEJ1Zi5zaGFwZSwgb3V0QnVmLmR0eXBlLCBvdXRCdWYudmFsdWVzKTtcbn1cbmV4cG9ydCBjb25zdCB0aWxlQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFRpbGUsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHRpbGVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1UaWxlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJ1ZmZlciB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG4vKipcbiAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSB0aWxlIGtlcm5lbCBzaGFyZWQgYmV0d2VlbiB3ZWJnbCBhbmQgY3B1IGZvciBzdHJpbmdcbiAqIHRlbnNvcnMgb25seS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRpbGVJbXBsKHhCdWYsIHJlcHMpIHtcbiAgICBjb25zdCBuZXdTaGFwZSA9IG5ldyBBcnJheSh4QnVmLnJhbmspO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3U2hhcGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbmV3U2hhcGVbaV0gPSB4QnVmLnNoYXBlW2ldICogcmVwc1tpXTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gYnVmZmVyKG5ld1NoYXBlLCB4QnVmLmR0eXBlKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdC52YWx1ZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY29uc3QgbmV3TG9jID0gcmVzdWx0LmluZGV4VG9Mb2MoaSk7XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsTG9jID0gbmV3IEFycmF5KHhCdWYucmFuayk7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgb3JpZ2luYWxMb2MubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIG9yaWdpbmFsTG9jW2pdID0gbmV3TG9jW2pdICUgeEJ1Zi5zaGFwZVtqXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcmlnaW5hbEluZGV4ID0geEJ1Zi5sb2NUb0luZGV4KG9yaWdpbmFsTG9jKTtcbiAgICAgICAgcmVzdWx0LnZhbHVlc1tpXSA9IHhCdWYudmFsdWVzW29yaWdpbmFsSW5kZXhdO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VGlsZV9pbXBsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFRvcEsgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90Q29tcGxleCB9IGZyb20gJy4uL2NwdV91dGlsJztcbmltcG9ydCB7IHRvcEtJbXBsIH0gZnJvbSAnLi9Ub3BLX2ltcGwnO1xuZXhwb3J0IGZ1bmN0aW9uIHRvcEsoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGssIHNvcnRlZCB9ID0gYXR0cnM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleCh4LCAndG9waycpO1xuICAgIGNvbnN0IHhWYWxzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IFthbGxUb3BLVmFscywgYWxsVG9wS0luZGljZXNdID0gdG9wS0ltcGwoeFZhbHMsIHguc2hhcGUsIHguZHR5cGUsIGssIHNvcnRlZCk7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhhbGxUb3BLVmFscy5zaGFwZSwgYWxsVG9wS1ZhbHMuZHR5cGUsIGFsbFRvcEtWYWxzLnZhbHVlcyksXG4gICAgICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oYWxsVG9wS0luZGljZXMuc2hhcGUsIGFsbFRvcEtJbmRpY2VzLmR0eXBlLCBhbGxUb3BLSW5kaWNlcy52YWx1ZXMpXG4gICAgXTtcbn1cbmV4cG9ydCBjb25zdCB0b3BLQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFRvcEssXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHRvcEtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Ub3BLLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbi8qKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVG9wSyBrZXJuZWwgc2hhcmVkIGJldHdlZW4gd2ViZ2wgYW5kIGNwdS4gKi9cbmltcG9ydCB7IGJ1ZmZlciwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5jb25zdCBjb21wYXJlUGFpciA9IChhLCBiKSA9PiB7XG4gICAgY29uc3QgdmFsdWVEaWZmID0gYi52YWx1ZSAtIGEudmFsdWU7XG4gICAgcmV0dXJuIHZhbHVlRGlmZiA9PT0gMCA/IGEuaW5kZXggLSBiLmluZGV4IDogdmFsdWVEaWZmO1xufTtcbi8qKlxuICogUGFydGl0aW9ucyBhcnJheSB3aGVyZSBhbGwgZWxlbWVudHMgc21hbGxlciB0aGFuIHRoZSAoaysxKSBzbWFsbGVzdCBlbGVtZW50XG4gKiBhcmUgZm91bmQgdG8gdGhlIGxlZnQgb2YgaXQsIGFuZCBhbGwgbGFyZ2VyIHRvIHRoZSByaWdodCBvZiBpdC5cbiAqIEJhc2VkIG9uIHRoZSBGbG95ZC1SaXZlc3QgQWxnb3JpdGhtLCByZWY6XG4gKiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9GbG95ZCVFMiU4MCU5M1JpdmVzdF9hbGdvcml0aG1cbiAqIEBwYXJhbSBhcnJheTogQXJyYXkgdG8gcGFydGl0aW9uXG4gKiBAcGFyYW0gbGVmdDogTGVmdCBpbmRleCBmb3IgdGhlIGludGVydmFsXG4gKiBAcGFyYW0gcmlnaHQ6IFJpZ2h0IGluZGV4IGZvciB0aGUgaW50ZXJ2YWxcbiAqIEBwYXJhbSBrOiBEZXNpcmVkIGluZGV4IHZhbHVlLCB3aGVyZSBhcnJheVtrXSBpcyB0aGUgKGsrMSl0aCBzbWFsbGVzdCBlbGVtZW50XG4gKiAgICAgICAgICAgd2hlbiBsZWZ0ID0gMFxuICovXG5mdW5jdGlvbiBzZWxlY3QoYXJyYXksIGssIGxlZnQgPSAwLCByaWdodCA9IGFycmF5Lmxlbmd0aCAtIDEpIHtcbiAgICB3aGlsZSAocmlnaHQgPiBsZWZ0KSB7XG4gICAgICAgIC8vIFVzZSBzZWxlY3QgcmVjdXJzaXZlbHkgdG8gc2FtcGxlIGEgc21hbGxlciBzZXQgb2Ygc2l6ZSBzXG4gICAgICAgIC8vIHRoZSBhcmJpdHJhcnkgY29uc3RhbnRzIDYwMCBhbmQgMC41IGFyZSB1c2VkIGluIHRoZSBvcmlnaW5hbFxuICAgICAgICAvLyB2ZXJzaW9uIHRvIG1pbmltaXplIGV4ZWN1dGlvbiB0aW1lLlxuICAgICAgICBpZiAocmlnaHQgLSBsZWZ0ID4gNjAwKSB7XG4gICAgICAgICAgICBjb25zdCBuID0gcmlnaHQgLSBsZWZ0ICsgMTtcbiAgICAgICAgICAgIGNvbnN0IGkgPSBrIC0gbGVmdCArIDE7XG4gICAgICAgICAgICBjb25zdCB6ID0gTWF0aC5sb2cobik7XG4gICAgICAgICAgICBjb25zdCBzID0gMC41ICogTWF0aC5leHAoMiAqIHogLyAzKTtcbiAgICAgICAgICAgIGNvbnN0IHNkID0gMC41ICogTWF0aC5zcXJ0KHogKiBzICogKG4gLSBzKSAvIG4pICogTWF0aC5zaWduKGkgLSBuIC8gMik7XG4gICAgICAgICAgICBjb25zdCBuZXdMZWZ0ID0gTWF0aC5tYXgobGVmdCwgTWF0aC5mbG9vcihrIC0gaSAqIHMgLyBuICsgc2QpKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld1JpZ2h0ID0gTWF0aC5taW4ocmlnaHQsIE1hdGguZmxvb3IoayArIChuIC0gaSkgKiBzIC8gbiArIHNkKSk7XG4gICAgICAgICAgICBzZWxlY3QoYXJyYXksIGssIG5ld0xlZnQsIG5ld1JpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBwYXJ0aXRpb24gdGhlIGVsZW1lbnRzIGJldHdlZW4gbGVmdCBhbmQgcmlnaHQgYXJvdW5kIHRcbiAgICAgICAgY29uc3QgdCA9IGFycmF5W2tdO1xuICAgICAgICBsZXQgaSA9IGxlZnQ7XG4gICAgICAgIGxldCBqID0gcmlnaHQ7XG4gICAgICAgIHV0aWwuc3dhcChhcnJheSwgbGVmdCwgayk7XG4gICAgICAgIGlmIChjb21wYXJlUGFpcihhcnJheVtyaWdodF0sIHQpID4gMCkge1xuICAgICAgICAgICAgdXRpbC5zd2FwKGFycmF5LCBsZWZ0LCByaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKGkgPCBqKSB7XG4gICAgICAgICAgICB1dGlsLnN3YXAoYXJyYXksIGksIGopO1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgai0tO1xuICAgICAgICAgICAgd2hpbGUgKGNvbXBhcmVQYWlyKGFycmF5W2ldLCB0KSA8IDApIHtcbiAgICAgICAgICAgICAgICBpID0gaSArIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3aGlsZSAoY29tcGFyZVBhaXIoYXJyYXlbal0sIHQpID4gMCkge1xuICAgICAgICAgICAgICAgIGogPSBqIC0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoY29tcGFyZVBhaXIoYXJyYXlbbGVmdF0sIHQpID09PSAwKSB7XG4gICAgICAgICAgICB1dGlsLnN3YXAoYXJyYXksIGxlZnQsIGopO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaiA9IGogKyAxO1xuICAgICAgICAgICAgdXRpbC5zd2FwKGFycmF5LCBqLCByaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQWRqdXN0IGxlZnQgYW5kIHJpZ2h0IHRvd2FyZHMgdGhlIGJvdW5kYXJpZXMgb2YgdGhlIHN1YnNldFxuICAgICAgICAvLyBjb250YWluaW5nIHRoZSAoayAtIGxlZnQgKyAxKXRoIHNtYWxsZXN0IGVsZW1lbnQuXG4gICAgICAgIGlmIChqIDw9IGspIHtcbiAgICAgICAgICAgIGxlZnQgPSBqICsgMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoayA8PSBqKSB7XG4gICAgICAgICAgICByaWdodCA9IGogLSAxO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIHRvcEtJbXBsKHgsIHhTaGFwZSwgeER0eXBlLCBrLCBzb3J0ZWQpIHtcbiAgICAvLyBSZXNoYXBlIGludG8gYSAyZCB0ZW5zb3IgW2JhdGNoLCBsYXN0RGltXSBhbmQgY29tcHV0ZSB0b3BrIGFsb25nIGxhc3REaW0uXG4gICAgY29uc3QgbGFzdERpbSA9IHhTaGFwZVt4U2hhcGUubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgW2JhdGNoLCBzaXplXSA9IFt4Lmxlbmd0aCAvIGxhc3REaW0sIGxhc3REaW1dO1xuICAgIGNvbnN0IGFsbFRvcEtWYWxzID0gdXRpbC5nZXRUeXBlZEFycmF5RnJvbURUeXBlKHhEdHlwZSwgYmF0Y2ggKiBrKTtcbiAgICBjb25zdCBhbGxUb3BLSW5kaWNlcyA9IHV0aWwuZ2V0VHlwZWRBcnJheUZyb21EVHlwZSgnaW50MzInLCBiYXRjaCAqIGspO1xuICAgIGZvciAobGV0IGIgPSAwOyBiIDwgYmF0Y2g7IGIrKykge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBiICogc2l6ZTtcbiAgICAgICAgY29uc3QgdmFscyA9IHguc3ViYXJyYXkob2Zmc2V0LCBvZmZzZXQgKyBzaXplKTtcbiAgICAgICAgbGV0IHZhbEFuZEluZCA9IG5ldyBBcnJheSh2YWxzLmxlbmd0aCk7XG4gICAgICAgIHZhbHMuZm9yRWFjaCgodmFsdWUsIGluZGV4KSA9PiB2YWxBbmRJbmRbaW5kZXhdID0geyB2YWx1ZSwgaW5kZXggfSk7XG4gICAgICAgIGlmIChrIDwgdmFsQW5kSW5kLmxlbmd0aCkge1xuICAgICAgICAgICAgc2VsZWN0KHZhbEFuZEluZCwgayk7XG4gICAgICAgICAgICB2YWxBbmRJbmQgPSB2YWxBbmRJbmQuc2xpY2UoMCwgayk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNvcnRlZCkge1xuICAgICAgICAgICAgdmFsQW5kSW5kLnNvcnQoY29tcGFyZVBhaXIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG91dE9mZnNldCA9IGIgKiBrO1xuICAgICAgICBjb25zdCB0b3BLVmFscyA9IGFsbFRvcEtWYWxzLnN1YmFycmF5KG91dE9mZnNldCwgb3V0T2Zmc2V0ICsgayk7XG4gICAgICAgIGNvbnN0IHRvcEtJbmRpY2VzID0gYWxsVG9wS0luZGljZXMuc3ViYXJyYXkob3V0T2Zmc2V0LCBvdXRPZmZzZXQgKyBrKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrOyBpKyspIHtcbiAgICAgICAgICAgIHRvcEtWYWxzW2ldID0gdmFsQW5kSW5kW2ldLnZhbHVlO1xuICAgICAgICAgICAgdG9wS0luZGljZXNbaV0gPSB2YWxBbmRJbmRbaV0uaW5kZXg7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gUmVzaGFwZSBiYWNrIHRvIHRoZSBvcmlnaW5hbCBpbnB1dCBzaGFwZSwgZXhjZXB0IHRoYXQgdGhlIGxhc3RcbiAgICAvLyBkaW1lbnNpb24gaXMgay5cbiAgICBjb25zdCBvdXRwdXRTaGFwZSA9IHhTaGFwZS5zbGljZSgpO1xuICAgIG91dHB1dFNoYXBlW291dHB1dFNoYXBlLmxlbmd0aCAtIDFdID0gaztcbiAgICByZXR1cm4gW1xuICAgICAgICBidWZmZXIob3V0cHV0U2hhcGUsIHhEdHlwZSwgYWxsVG9wS1ZhbHMpLFxuICAgICAgICBidWZmZXIob3V0cHV0U2hhcGUsICdpbnQzMicsIGFsbFRvcEtJbmRpY2VzKVxuICAgIF07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Ub3BLX2ltcGwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgVHJhbnNmb3JtLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm0oYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBhdHRycywgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCB7IGltYWdlLCB0cmFuc2Zvcm1zIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBpbnRlcnBvbGF0aW9uLCBmaWxsTW9kZSwgZmlsbFZhbHVlLCBvdXRwdXRTaGFwZSB9ID0gYXR0cnM7XG4gICAgY29uc3QgW2JhdGNoLCBpbWFnZUhlaWdodCwgaW1hZ2VXaWR0aCwgbnVtQ2hhbm5lbHNdID0gaW1hZ2Uuc2hhcGU7XG4gICAgY29uc3QgW291dEhlaWdodCwgb3V0V2lkdGhdID0gb3V0cHV0U2hhcGUgIT0gbnVsbCA/IG91dHB1dFNoYXBlIDogW2ltYWdlSGVpZ2h0LCBpbWFnZVdpZHRoXTtcbiAgICBjb25zdCBvdXRTaGFwZSA9IFtiYXRjaCwgb3V0SGVpZ2h0LCBvdXRXaWR0aCwgbnVtQ2hhbm5lbHNdO1xuICAgIGNvbnN0IHN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKGltYWdlLnNoYXBlKTtcbiAgICBjb25zdCBiYXRjaFN0cmlkZSA9IHN0cmlkZXNbMF07XG4gICAgY29uc3Qgcm93U3RyaWRlID0gc3RyaWRlc1sxXTtcbiAgICBjb25zdCBjb2xTdHJpZGUgPSBzdHJpZGVzWzJdO1xuICAgIGNvbnN0IG91dFZhbHMgPSB1dGlsLmdldFR5cGVkQXJyYXlGcm9tRFR5cGUoaW1hZ2UuZHR5cGUsIHV0aWwuc2l6ZUZyb21TaGFwZShvdXRTaGFwZSkpO1xuICAgIG91dFZhbHMuZmlsbChmaWxsVmFsdWUpO1xuICAgIGNvbnN0IGltYWdlVmFscyA9IGJhY2tlbmQuZGF0YS5nZXQoaW1hZ2UuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgdHJhbnNmb3JtVmFscyA9IGJhY2tlbmQuZGF0YS5nZXQodHJhbnNmb3Jtcy5kYXRhSWQpLnZhbHVlcztcbiAgICAvLyBSZWYgVEYgaW1wbGVtZW50YXRpb246XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yZmxvdy9ibG9iL21hc3Rlci90ZW5zb3JmbG93L2NvcmUva2VybmVscy9pbWFnZS9pbWFnZV9vcHMuaFxuICAgIGZvciAobGV0IGIgPSAwOyBiIDwgYmF0Y2g7ICsrYikge1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm0gPSB0cmFuc2Zvcm1zLnNoYXBlWzBdID09PSAxID9cbiAgICAgICAgICAgIHRyYW5zZm9ybVZhbHMgOlxuICAgICAgICAgICAgdHJhbnNmb3JtVmFscy5zdWJhcnJheShiICogOCwgYiAqIDggKyA4KTtcbiAgICAgICAgZm9yIChsZXQgb3V0WSA9IDA7IG91dFkgPCBvdXRIZWlnaHQ7ICsrb3V0WSkge1xuICAgICAgICAgICAgZm9yIChsZXQgb3V0WCA9IDA7IG91dFggPCBvdXRXaWR0aDsgKytvdXRYKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBudW1DaGFubmVsczsgKytjaGFubmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB2YWw7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb2plY3Rpb24gPSB0cmFuc2Zvcm1bNl0gKiBvdXRYICsgdHJhbnNmb3JtWzddICogb3V0WSArIDE7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9qZWN0aW9uID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXR1cm4gdGhlIGZpbGwgdmFsdWUgZm9yIGluZmluaXRlIGNvb3JkaW5hdGVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggYXJlIG91dHNpZGUgdGhlIGlucHV0IGltYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpblggPSAodHJhbnNmb3JtWzBdICogb3V0WCArIHRyYW5zZm9ybVsxXSAqIG91dFkgKyB0cmFuc2Zvcm1bMl0pIC9cbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3Rpb247XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGluWSA9ICh0cmFuc2Zvcm1bM10gKiBvdXRYICsgdHJhbnNmb3JtWzRdICogb3V0WSArIHRyYW5zZm9ybVs1XSkgL1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeCA9IG1hcENvb3JkKGluWCwgaW1hZ2VXaWR0aCwgZmlsbE1vZGUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB5ID0gbWFwQ29vcmQoaW5ZLCBpbWFnZUhlaWdodCwgZmlsbE1vZGUpO1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGludGVycG9sYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ25lYXJlc3QnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IG5lYXJlc3RJbnRlcnBvbGF0aW9uKGltYWdlVmFscywgaW1hZ2VIZWlnaHQsIGltYWdlV2lkdGgsIGJhdGNoU3RyaWRlLCByb3dTdHJpZGUsIGNvbFN0cmlkZSwgYiwgeSwgeCwgY2hhbm5lbCwgZmlsbFZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2JpbGluZWFyJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBiaWxpbmVhckludGVycG9sYXRpb24oaW1hZ2VWYWxzLCBpbWFnZUhlaWdodCwgaW1hZ2VXaWR0aCwgYmF0Y2hTdHJpZGUsIHJvd1N0cmlkZSwgY29sU3RyaWRlLCBiLCB5LCB4LCBjaGFubmVsLCBmaWxsVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGluIFRyYW5zZm9ybTogRXhwZWN0ICduZWFyZXN0JyBvciBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYCdiaWxpbmVhcicsIGJ1dCBnb3QgJHtpbnRlcnBvbGF0aW9ufWApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZCA9IGIgKiBiYXRjaFN0cmlkZSArIG91dFkgKiByb3dTdHJpZGUgKyBvdXRYICogY29sU3RyaWRlICsgY2hhbm5lbDtcbiAgICAgICAgICAgICAgICAgICAgb3V0VmFsc1tpbmRdID0gdmFsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRTaGFwZSwgaW1hZ2UuZHR5cGUsIG91dFZhbHMpO1xuICAgIH1cbiAgICBjb25zdCBkYXRhSWQgPSBiYWNrZW5kLndyaXRlKG91dFZhbHMsIG91dFNoYXBlLCBpbWFnZS5kdHlwZSk7XG4gICAgcmV0dXJuIHsgZGF0YUlkLCBzaGFwZTogaW1hZ2Uuc2hhcGUsIGR0eXBlOiBpbWFnZS5kdHlwZSB9O1xufVxuZXhwb3J0IGNvbnN0IHRyYW5zZm9ybUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBUcmFuc2Zvcm0sXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHRyYW5zZm9ybVxufTtcbmZ1bmN0aW9uIG1hcENvb3JkKG91dENvb3JkLCBsZW4sIG1vZGUpIHtcbiAgICBzd2l0Y2ggKG1vZGUpIHtcbiAgICAgICAgY2FzZSAncmVmbGVjdCc6XG4gICAgICAgICAgICByZXR1cm4gbWFwQ29vcmRSZWZsZWN0KG91dENvb3JkLCBsZW4pO1xuICAgICAgICBjYXNlICd3cmFwJzpcbiAgICAgICAgICAgIHJldHVybiBtYXBDb29yZFdyYXAob3V0Q29vcmQsIGxlbik7XG4gICAgICAgIGNhc2UgJ25lYXJlc3QnOlxuICAgICAgICAgICAgcmV0dXJuIG1hcENvb3JkTmVhcmVzdChvdXRDb29yZCwgbGVuKTtcbiAgICAgICAgY2FzZSAnY29uc3RhbnQnOlxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIG1hcENvb3JkQ29uc3RhbnQob3V0Q29vcmQsIGxlbik7XG4gICAgfVxufVxuZnVuY3Rpb24gbWFwQ29vcmRSZWZsZWN0KG91dENvb3JkLCBsZW4pIHtcbiAgICAvLyBSZWZsZWN0IFthYmNkXSB0byBbZGNiYXxhYmNkfGRjYmFdLlxuICAgIGxldCBpbkNvb3JkID0gb3V0Q29vcmQ7XG4gICAgaWYgKGluQ29vcmQgPCAwKSB7XG4gICAgICAgIGlmIChsZW4gPD0gMSkge1xuICAgICAgICAgICAgaW5Db29yZCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBzejIgPSAyICogbGVuO1xuICAgICAgICAgICAgaWYgKGluQ29vcmQgPCBzejIpIHtcbiAgICAgICAgICAgICAgICBpbkNvb3JkID0gc3oyICogTWF0aC50cnVuYygtaW5Db29yZCAvIHN6MikgKyBpbkNvb3JkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW5Db29yZCA9IGluQ29vcmQgPCAtbGVuID8gaW5Db29yZCArIHN6MiA6IC1pbkNvb3JkIC0gMTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChpbkNvb3JkID4gbGVuIC0gMSkge1xuICAgICAgICBpZiAobGVuIDw9IDEpIHtcbiAgICAgICAgICAgIGluQ29vcmQgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgc3oyID0gMiAqIGxlbjtcbiAgICAgICAgICAgIGluQ29vcmQgLT0gc3oyICogTWF0aC50cnVuYyhpbkNvb3JkIC8gc3oyKTtcbiAgICAgICAgICAgIGlmIChpbkNvb3JkID49IGxlbikge1xuICAgICAgICAgICAgICAgIGluQ29vcmQgPSBzejIgLSBpbkNvb3JkIC0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBjbGFtcCBpcyBuZWNlc3NhcnkgYmVjYXVzZSB3aGVuIG91dENvb3JkID0gMy41IGFuZCBsZW4gPSA0LFxuICAgIC8vIGluQ29vcmQgPSAzLjUgYW5kIHdpbGwgYmUgcm91bmRlZCB0byA0IGluIG5lYXJlc3QgaW50ZXJwb2xhdGlvbi5cbiAgICByZXR1cm4gdXRpbC5jbGFtcCgwLCBpbkNvb3JkLCBsZW4gLSAxKTtcbn1cbmZ1bmN0aW9uIG1hcENvb3JkV3JhcChvdXRDb29yZCwgbGVuKSB7XG4gICAgLy8gV3JhcCBbYWJjZF0gdG8gW2FiY2R8YWJjZHxhYmNkXS5cbiAgICBsZXQgaW5Db29yZCA9IG91dENvb3JkO1xuICAgIGlmIChpbkNvb3JkIDwgMCkge1xuICAgICAgICBpZiAobGVuIDw9IDEpIHtcbiAgICAgICAgICAgIGluQ29vcmQgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgc3ogPSBsZW4gLSAxO1xuICAgICAgICAgICAgaW5Db29yZCArPSBsZW4gKiAoTWF0aC50cnVuYygtaW5Db29yZCAvIHN6KSArIDEpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKGluQ29vcmQgPiBsZW4gLSAxKSB7XG4gICAgICAgIGlmIChsZW4gPD0gMSkge1xuICAgICAgICAgICAgaW5Db29yZCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBzeiA9IGxlbiAtIDE7XG4gICAgICAgICAgICBpbkNvb3JkIC09IGxlbiAqIE1hdGgudHJ1bmMoaW5Db29yZCAvIHN6KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBjbGFtcCBpcyBuZWNlc3NhcnkgYmVjYXVzZSB3aGVuIG91dENvb3JkID0gLTAuNSBhbmQgbGVuID0gNCxcbiAgICAvLyBpbkNvb3JkID0gMy41IGFuZCB3aWxsIGJlIHJvdW5kZWQgdG8gNCBpbiBuZWFyZXN0IGludGVycG9sYXRpb24uXG4gICAgcmV0dXJuIHV0aWwuY2xhbXAoMCwgaW5Db29yZCwgbGVuIC0gMSk7XG59XG5mdW5jdGlvbiBtYXBDb29yZENvbnN0YW50KG91dENvb3JkLCBsZW4pIHtcbiAgICByZXR1cm4gb3V0Q29vcmQ7XG59XG5mdW5jdGlvbiBtYXBDb29yZE5lYXJlc3Qob3V0Q29vcmQsIGxlbikge1xuICAgIHJldHVybiB1dGlsLmNsYW1wKDAsIG91dENvb3JkLCBsZW4gLSAxKTtcbn1cbmZ1bmN0aW9uIHJlYWRXaXRoRmlsbFZhbHVlKGltYWdlVmFscywgaW1hZ2VIZWlnaHQsIGltYWdlV2lkdGgsIGJhdGNoU3RyaWRlLCByb3dTdHJpZGUsIGNvbFN0cmlkZSwgYmF0Y2gsIHksIHgsIGNoYW5uZWwsIGZpbGxWYWx1ZSkge1xuICAgIGNvbnN0IGluZCA9IGJhdGNoICogYmF0Y2hTdHJpZGUgKyB5ICogcm93U3RyaWRlICsgeCAqIGNvbFN0cmlkZSArIGNoYW5uZWw7XG4gICAgaWYgKDAgPD0geSAmJiB5IDwgaW1hZ2VIZWlnaHQgJiYgMCA8PSB4ICYmIHggPCBpbWFnZVdpZHRoKSB7XG4gICAgICAgIHJldHVybiBpbWFnZVZhbHNbaW5kXTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBmaWxsVmFsdWU7XG4gICAgfVxufVxuZnVuY3Rpb24gbmVhcmVzdEludGVycG9sYXRpb24oaW1hZ2VWYWxzLCBpbWFnZUhlaWdodCwgaW1hZ2VXaWR0aCwgYmF0Y2hTdHJpZGUsIHJvd1N0cmlkZSwgY29sU3RyaWRlLCBiYXRjaCwgeSwgeCwgY2hhbm5lbCwgZmlsbFZhbHVlKSB7XG4gICAgY29uc3QgJHkgPSBNYXRoLnJvdW5kKHkpO1xuICAgIGNvbnN0ICR4ID0gTWF0aC5yb3VuZCh4KTtcbiAgICByZXR1cm4gcmVhZFdpdGhGaWxsVmFsdWUoaW1hZ2VWYWxzLCBpbWFnZUhlaWdodCwgaW1hZ2VXaWR0aCwgYmF0Y2hTdHJpZGUsIHJvd1N0cmlkZSwgY29sU3RyaWRlLCBiYXRjaCwgJHksICR4LCBjaGFubmVsLCBmaWxsVmFsdWUpO1xufVxuZnVuY3Rpb24gYmlsaW5lYXJJbnRlcnBvbGF0aW9uKGltYWdlVmFscywgaW1hZ2VIZWlnaHQsIGltYWdlV2lkdGgsIGJhdGNoU3RyaWRlLCByb3dTdHJpZGUsIGNvbFN0cmlkZSwgYmF0Y2gsIHksIHgsIGNoYW5uZWwsIGZpbGxWYWx1ZSkge1xuICAgIGNvbnN0IHlGbG9vciA9IE1hdGguZmxvb3IoeSk7XG4gICAgY29uc3QgeEZsb29yID0gTWF0aC5mbG9vcih4KTtcbiAgICBjb25zdCB5Q2VpbCA9IHlGbG9vciArIDE7XG4gICAgY29uc3QgeENlaWwgPSB4Rmxvb3IgKyAxO1xuICAgIC8vIGYoeCwgeUZsb29yKSA9ICh4Q2VpbCAtIHgpIC8gKHhDZWlsIC0geEZsb29yKSAqIGYoeEZsb29yLCB5Rmxvb3IpXG4gICAgLy8gICAgICAgICAgICAgICArICh4IC0geEZsb29yKSAvICh4Q2VpbCAtIHhGbG9vcikgKiBmKHhDZWlsLCB5Rmxvb3IpXG4gICAgY29uc3QgdmFsdWVZRmxvb3IgPSAoeENlaWwgLSB4KSAqXG4gICAgICAgIHJlYWRXaXRoRmlsbFZhbHVlKGltYWdlVmFscywgaW1hZ2VIZWlnaHQsIGltYWdlV2lkdGgsIGJhdGNoU3RyaWRlLCByb3dTdHJpZGUsIGNvbFN0cmlkZSwgYmF0Y2gsIHlGbG9vciwgeEZsb29yLCBjaGFubmVsLCBmaWxsVmFsdWUpICtcbiAgICAgICAgKHggLSB4Rmxvb3IpICpcbiAgICAgICAgICAgIHJlYWRXaXRoRmlsbFZhbHVlKGltYWdlVmFscywgaW1hZ2VIZWlnaHQsIGltYWdlV2lkdGgsIGJhdGNoU3RyaWRlLCByb3dTdHJpZGUsIGNvbFN0cmlkZSwgYmF0Y2gsIHlGbG9vciwgeENlaWwsIGNoYW5uZWwsIGZpbGxWYWx1ZSk7XG4gICAgLy8gZih4LCB5Q2VpbCkgPSAoeENlaWwgLSB4KSAvICh4Q2VpbCAtIHhGbG9vcikgKiBmKHhGbG9vciwgeUNlaWwpXG4gICAgLy8gICAgICAgICAgICAgKyAoeCAtIHhGbG9vcikgLyAoeENlaWwgLSB4Rmxvb3IpICogZih4Q2VpbCwgeUNlaWwpXG4gICAgY29uc3QgdmFsdWVZQ2VpbCA9ICh4Q2VpbCAtIHgpICpcbiAgICAgICAgcmVhZFdpdGhGaWxsVmFsdWUoaW1hZ2VWYWxzLCBpbWFnZUhlaWdodCwgaW1hZ2VXaWR0aCwgYmF0Y2hTdHJpZGUsIHJvd1N0cmlkZSwgY29sU3RyaWRlLCBiYXRjaCwgeUNlaWwsIHhGbG9vciwgY2hhbm5lbCwgZmlsbFZhbHVlKSArXG4gICAgICAgICh4IC0geEZsb29yKSAqXG4gICAgICAgICAgICByZWFkV2l0aEZpbGxWYWx1ZShpbWFnZVZhbHMsIGltYWdlSGVpZ2h0LCBpbWFnZVdpZHRoLCBiYXRjaFN0cmlkZSwgcm93U3RyaWRlLCBjb2xTdHJpZGUsIGJhdGNoLCB5Q2VpbCwgeENlaWwsIGNoYW5uZWwsIGZpbGxWYWx1ZSk7XG4gICAgLy8gZih4LCB5KSA9ICh5Q2VpbCAtIHkpIC8gKHlDZWlsIC0geUZsb29yKSAqIGYoeCwgeUZsb29yKVxuICAgIC8vICAgICAgICAgKyAoeSAtIHlGbG9vcikgLyAoeUNlaWwgLSB5Rmxvb3IpICogZih4LCB5Q2VpbClcbiAgICByZXR1cm4gKHlDZWlsIC0geSkgKiB2YWx1ZVlGbG9vciArICh5IC0geUZsb29yKSAqIHZhbHVlWUNlaWw7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1UcmFuc2Zvcm0uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgVHJhbnNwb3NlIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5pbXBvcnQgeyB0cmFuc3Bvc2VJbXBsIH0gZnJvbSAnLi9UcmFuc3Bvc2VfaW1wbCc7XG5leHBvcnQgZnVuY3Rpb24gdHJhbnNwb3NlKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYXR0cnMsIGJhY2tlbmQgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBwZXJtIH0gPSBhdHRycztcbiAgICBhc3NlcnROb3RDb21wbGV4KHgsICd0cmFuc3Bvc2UnKTtcbiAgICBjb25zdCB4UmFuayA9IHguc2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IG5ld1NoYXBlID0gbmV3IEFycmF5KHhSYW5rKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld1NoYXBlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG5ld1NoYXBlW2ldID0geC5zaGFwZVtwZXJtW2ldXTtcbiAgICB9XG4gICAgY29uc3QgdmFsdWVzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IHJlc3VsdCA9IHRyYW5zcG9zZUltcGwodmFsdWVzLCB4LnNoYXBlLCB4LmR0eXBlLCBwZXJtLCBuZXdTaGFwZSk7XG4gICAgY29uc3QgZGF0YUlkID0gYmFja2VuZC53cml0ZShyZXN1bHQsIG5ld1NoYXBlLCB4LmR0eXBlKTtcbiAgICByZXR1cm4geyBkYXRhSWQsIHNoYXBlOiBuZXdTaGFwZSwgZHR5cGU6IHguZHR5cGUgfTtcbn1cbmV4cG9ydCBjb25zdCB0cmFuc3Bvc2VDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogVHJhbnNwb3NlLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiB0cmFuc3Bvc2Vcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1UcmFuc3Bvc2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5leHBvcnQgZnVuY3Rpb24gdHJhbnNwb3NlSW1wbCh4VmFscywgeFNoYXBlLCBkdHlwZSwgcGVybSwgbmV3U2hhcGUpIHtcbiAgICBjb25zdCB4UmFuayA9IHhTaGFwZS5sZW5ndGg7XG4gICAgY29uc3QgeFNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoeFNoYXBlKTtcbiAgICBjb25zdCB4U3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoeFNoYXBlKTtcbiAgICBjb25zdCBuZXdTdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyhuZXdTaGFwZSk7XG4gICAgY29uc3QgcmVzdWx0ID0gdXRpbC5nZXRUeXBlZEFycmF5RnJvbURUeXBlKGR0eXBlLCB1dGlsLnNpemVGcm9tU2hhcGUobmV3U2hhcGUpKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHhTaXplOyArK2kpIHtcbiAgICAgICAgY29uc3QgbG9jID0gdXRpbC5pbmRleFRvTG9jKGksIHhSYW5rLCB4U3RyaWRlcyk7XG4gICAgICAgIC8vIFBlcm11dGUgbG9jYXRpb24uXG4gICAgICAgIGNvbnN0IG5ld0xvYyA9IG5ldyBBcnJheShsb2MubGVuZ3RoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXdMb2MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIG5ld0xvY1tpXSA9IGxvY1twZXJtW2ldXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXdJbmRleCA9IHV0aWwubG9jVG9JbmRleChuZXdMb2MsIHhSYW5rLCBuZXdTdHJpZGVzKTtcbiAgICAgICAgcmVzdWx0W25ld0luZGV4XSA9IHhWYWxzW2ldO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VHJhbnNwb3NlX2ltcGwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFVuaXF1ZSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuaW1wb3J0IHsgdW5pcXVlSW1wbCB9IGZyb20gJy4vVW5pcXVlX2ltcGwnO1xuZXhwb3J0IGZ1bmN0aW9uIHVuaXF1ZShhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGF0dHJzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgYXhpcyB9ID0gYXR0cnM7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleCh4LCAndW5pcXVlJyk7XG4gICAgY29uc3QgdmFsdWVzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzO1xuICAgIGNvbnN0IHsgb3V0cHV0VmFsdWVzLCBvdXRwdXRTaGFwZSwgaW5kaWNlcyB9ID0gdW5pcXVlSW1wbCh2YWx1ZXMsIGF4aXMsIHguc2hhcGUsIHguZHR5cGUpO1xuICAgIHJldHVybiBbXG4gICAgICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0cHV0U2hhcGUsIHguZHR5cGUsIG91dHB1dFZhbHVlcyksXG4gICAgICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oW2luZGljZXMubGVuZ3RoXSwgJ2ludDMyJywgaW5kaWNlcyksXG4gICAgXTtcbn1cbmV4cG9ydCBjb25zdCB1bmlxdWVDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogVW5pcXVlLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiB1bmlxdWUsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VW5pcXVlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFRlbnNvckJ1ZmZlciwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5leHBvcnQgZnVuY3Rpb24gdW5pcXVlSW1wbCh2YWx1ZXMsIGF4aXMsIHNoYXBlLCBkdHlwZSkge1xuICAgIC8vIE5vcm1hbGl6ZSBhbmQgdmFsaWRhdGUgYXhpcy5cbiAgICBjb25zdCAkYXhpcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oYXhpcywgc2hhcGUpWzBdO1xuICAgIC8vIENhbGN1bGF0ZSB0aGUgbmV3IHNoYXBlIHRoYXQgaXMgc3VpdGFibGUgZm9yIGV4dHJhY3RpbmcgZGF0YSBhbG9uZyB0aGVcbiAgICAvLyBnaXZlbiBheGlzLlxuICAgIC8vXG4gICAgLy8gVGhlIHJhbmsgaXMgMy5cbiAgICAvLyBUaGUgc2l6ZSBvZiB0aGUgMXN0IGRpbWVuc2lvbiBpcyB0aGUgc2l6ZSBvZiBhbGwgdGhlIGF4ZXMgPCB0aGUgZ2l2ZW4gYXhpcy5cbiAgICAvLyBUaGUgc2l6ZSBvZiB0aGUgMm5kIGRpbWVuc2lvbiBpcyB0aGUgc2FtZSBhcyB0aGUgc2l6ZSBvZiB0aGUgZ2l2ZW4gYXhpcy5cbiAgICAvLyBUaGUgc2l6ZSBvZiB0aGUgM3JkIGRpbWVuc2lvbiBpcyB0aGUgc2l6ZSBvZiBhbGwgdGhlIGF4ZXMgPiB0aGUgZ2l2ZW4gYXhpcy5cbiAgICAvL1xuICAgIC8vIEZvciBleGFtcGxlLCBmb3IgYSA0RCB0ZW5zb3Igd2l0aCBzaGFwZT1bMiwgMywgNSwgNF0gYW5kIGF4aXM9MiwgdGhlXG4gICAgLy8gbmV3U2hhcGUgd291bGQgYmU6IFsyKjMsIDUsIDRdLlxuICAgIC8vXG4gICAgLy8gTm90ZSB0aGF0IHRoaXMgaXMgbm90IHRoZSBmaW5hbCBvdXRwdXQgc2hhcGUuIFRoaXMgd2lsbCBiZSB0aGUgc2hhcGUgZm9yIGFuXG4gICAgLy8gaW50ZXJtZWRpYXRlIFRlbnNvckJ1ZmZlciAoc2VlIGlucHV0QnVmZmVyIGJlbG93KSB0byBhbGxvdyB1cyB0byBleHRyYWN0XG4gICAgLy8gdmFsdWVzIGFsb25nIHRoZSBnaXZlbiBheGlzLiBUbyBkZW1vbnN0cmF0ZSBob3cgaXQgd29ya3MsIGNvbnNpZGVyIHRoZVxuICAgIC8vIGZvbGxvd2luZyBleGFtcGxlOlxuICAgIC8vXG4gICAgLy8gSW5wdXQ6IGEgM0QgdGVuc29yLCB3aXRoIHNoYXBlIFsxLCAyLCAzXVxuICAgIC8vIFtcbiAgICAvLyAgIFtcbiAgICAvLyAgICAgIFsxLDIsM10sXG4gICAgLy8gICAgICBbNCw1LDZdXG4gICAgLy8gICBdXG4gICAgLy8gXVxuICAgIC8vIEF4aXM6IDIgKHRoZSBsYXN0IGF4aXMpLlxuICAgIC8vIEFsb25nIGF4aXMgMiwgd2UgZXhwZWN0IHRvIGV4dHJhY3QgMyB0ZW5zb3JzOiBbMSw0XSwgWzIsNV0sIFszLDZdLlxuICAgIC8vXG4gICAgLy8gRm9yIHRoaXMgZXhhbXBsZSwgbmV3U2hhcGUgd291bGQgYmU6IFsyLCAzLCAxXSwgd2hlcmUgMiBpcyBjYWxjdWxhdGVkIGZyb21cbiAgICAvLyAxKjIuIFRoZSByZS1zaGFwZWQgZGF0YSB3b3VsZCBsb29rIGxpa2U6XG4gICAgLy9cbiAgICAvLyBbXG4gICAgLy8gICBbXG4gICAgLy8gICAgIFsxXSwgWzJdLCBbM11cbiAgICAvLyAgIF0sXG4gICAgLy8gICBbXG4gICAgLy8gICAgIFs0XSwgWzVdLCBbNl1cbiAgICAvLyAgIF1cbiAgICAvLyBdXG4gICAgLy9cbiAgICAvLyBUaGVuLCB3ZSBjYW4gY29uc3RydWN0IGEgMy1sZXZlbCBuZXN0ZWQgbG9vcCBieSB0aGUgZm9sbG93aW5nIGRpbWVuc2lvblxuICAgIC8vIG9yZGVyIHRvIGV4dHJhY3QgdGhlIHZhbHVlcyBhbG9uZyB0aGUgYXhpcyAoZGltZW5zaW9uMSk6XG4gICAgLy8gaTogZGltZW5zaW9uMSAgICAgICAvLyAwLDEsMiAobmV3U2hhcGVbMV0pXG4gICAgLy8gICBtOiBkaW1lbnNpb24wICAgICAvLyAwLDEgICAobmV3U2hhcGVbMF0pXG4gICAgLy8gICAgIG46IGRpbWVuc2lvbjIgICAvLyAwICAgICAobmV3U2hhcGVbMl0pXG4gICAgLy9cbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgbSwgaSwgblxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLVxuICAgIC8vIEl0ZXJhdGlvbiAwOiBkYXRhIGF0IFswLCAwLCAwXSA9PiBcIjFcIlxuICAgIC8vIEl0ZXJhdGlvbiAxOiBkYXRhIGF0IFsxLCAwLCAwXSA9PiBcIjRcIlxuICAgIC8vIFdlIGdvdCBbMSw0XS5cbiAgICAvLyBJdGVyYXRpb24gMjogZGF0YSBhdCBbMCwgMSwgMF0gPT4gXCIyXCJcbiAgICAvLyBJdGVyYXRpb24gMzogZGF0YSBhdCBbMSwgMSwgMF0gPT4gXCI1XCJcbiAgICAvLyBXZSBnb3QgWzIsNV0uXG4gICAgLy8gSXRlcmF0aW9uIDQ6IGRhdGEgYXQgWzAsIDIsIDBdID0+IFwiM1wiXG4gICAgLy8gSXRlcmF0aW9uIDU6IGRhdGEgYXQgWzEsIDIsIDBdID0+IFwiNlwiXG4gICAgLy8gV2UgZ290IFszLDZdLlxuICAgIGNvbnN0IG5ld1NoYXBlID0gWzEsIHNoYXBlWzBdLCAxXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8ICRheGlzOyBpKyspIHtcbiAgICAgICAgbmV3U2hhcGVbMF0gKj0gc2hhcGVbaV07XG4gICAgfVxuICAgIG5ld1NoYXBlWzFdID0gc2hhcGVbJGF4aXNdO1xuICAgIGZvciAobGV0IGkgPSAkYXhpcyArIDE7IGkgPCBzaGFwZS5sZW5ndGg7IGkrKykge1xuICAgICAgICBuZXdTaGFwZVsyXSAqPSBzaGFwZVtpXTtcbiAgICB9XG4gICAgLy8gQSBtYXAgZnJvbSB1bmlxdWUgZWxlbWVudHMgKHRoZWlyIHN0cmluZyByZXByZXNlbnRhdGlvbnMpIHRvIHRoZWlyIHZhbHVlc1xuICAgIC8vIGluIFwiaW5kaWNlc1wiIChiZWxvdykuXG4gICAgY29uc3QgdW5pcXVlRWxlbWVudHMgPSB7fTtcbiAgICAvLyBUaGUgaW5kaWNlcyBvZiBlYWNoIHVuaXF1ZSBlbGVtZW50IGluIHRoZSBvcmlnaW5hbCB0ZW5zb3IgYWxvbmcgdGhlIGdpdmVuXG4gICAgLy8gYXhpcy4gSXQgaXMgMUQgYW5kIGhhcyB0aGUgc2FtZSBzaXplIGFzIHRoZSBnaXZlbiBheGlzLlxuICAgIGNvbnN0IGluZGljZXMgPSBuZXcgSW50MzJBcnJheShzaGFwZVskYXhpc10pO1xuICAgIC8vIENyZWF0ZSBhIGJ1ZmZlciBzbyB3ZSBjYW4gZWFzaWx5IGV4dHJhY3QgdmFsdWUgYXQgYSBnaXZlbiBsb2NhdGlvbi5cbiAgICBjb25zdCBpbnB1dEJ1ZmZlciA9IG5ldyBUZW5zb3JCdWZmZXIobmV3U2hhcGUsIGR0eXBlLCB2YWx1ZXMpO1xuICAgIC8vIFRoZSBpbmRpY2VzIGFsb25nIHRoZSBnaXZlbiBheGlzIHRoYXQgaGF2ZSB1bmlxdWUgZWxlbWVudHMuIFRoaXMgaXMgYVxuICAgIC8vIGRlLWR1cGVkIHZlcnNpb24gb2YgXCJpbmRpY2VzXCIgYWJvdmUuXG4gICAgY29uc3QgdW5pcXVlSW5kaWNlcyA9IFtdO1xuICAgIGNvbnN0IGlzMURUZW5zb3IgPSBuZXdTaGFwZVswXSA9PT0gMSAmJiBuZXdTaGFwZVsyXSA9PT0gMTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNoYXBlWyRheGlzXTsgaSsrKSB7XG4gICAgICAgIC8vIEV4dHJhY3QgdmFsdWVzIGFsb25nIHRoZSBheGlzLlxuICAgICAgICBsZXQgZWxlbWVudDtcbiAgICAgICAgaWYgKGlzMURUZW5zb3IpIHtcbiAgICAgICAgICAgIC8vIEZhc3QgcGF0aCBmb3IgMUQgdGVuc29yIGlucHV0LlxuICAgICAgICAgICAgZWxlbWVudCA9IHZhbHVlc1tpXS50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgYXhpc1ZhbHVlcyA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgbSA9IDA7IG0gPCBuZXdTaGFwZVswXTsgbSsrKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCBuZXdTaGFwZVsyXTsgbisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGF4aXNWYWx1ZXMucHVzaChpbnB1dEJ1ZmZlci5nZXQobSwgaSwgbikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsZW1lbnQgPSBheGlzVmFsdWVzLmpvaW4oJywnKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBEZWR1cCBhbmQgdXBkYXRlIHZhcmlvdXMgaW5kaWNlcy5cbiAgICAgICAgaWYgKHVuaXF1ZUVsZW1lbnRzW2VsZW1lbnRdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGluZGljZXNbaV0gPSB1bmlxdWVFbGVtZW50c1tlbGVtZW50XTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHVuaXF1ZUluZGV4ID0gT2JqZWN0LmtleXModW5pcXVlRWxlbWVudHMpLmxlbmd0aDtcbiAgICAgICAgICAgIHVuaXF1ZUVsZW1lbnRzW2VsZW1lbnRdID0gdW5pcXVlSW5kZXg7XG4gICAgICAgICAgICBpbmRpY2VzW2ldID0gdW5pcXVlSW5kZXg7XG4gICAgICAgICAgICB1bmlxdWVJbmRpY2VzLnB1c2goaSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gTm93IHdlIGtub3cgd2hlcmUgZWFjaCBvZiB0aGUgdW5pcXVlIGVsZW1lbnRzIGFyZSBsb2NhdGVkIGFsb25nIHRoZSBheGlzXG4gICAgLy8gKHVuaXF1ZUluZGljZXMpLiBFeHRyYWN0IHRoZW0gZnJvbSBpbnB1dCBidWZmZXIgYW5kIHN0b3JlIHRoZW0gaW4gdGhlXG4gICAgLy8gb3V0cHV0IGJ1ZmZlci5cbiAgICBjb25zdCBvdXRwdXRUbXBTaGFwZSA9IG5ld1NoYXBlLnNsaWNlKCk7XG4gICAgb3V0cHV0VG1wU2hhcGVbMV0gPSBPYmplY3Qua2V5cyh1bmlxdWVFbGVtZW50cykubGVuZ3RoO1xuICAgIGNvbnN0IG91dHB1dEJ1ZmZlciA9IG5ldyBUZW5zb3JCdWZmZXIob3V0cHV0VG1wU2hhcGUsIGR0eXBlKTtcbiAgICB1bmlxdWVJbmRpY2VzLmZvckVhY2goKHVuaXF1ZUVsZW1lbnRJbmRleCwgaSkgPT4ge1xuICAgICAgICBmb3IgKGxldCBtID0gMDsgbSA8IG5ld1NoYXBlWzBdOyBtKyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgbmV3U2hhcGVbMl07IG4rKykge1xuICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlci5zZXQoaW5wdXRCdWZmZXIuZ2V0KG0sIHVuaXF1ZUVsZW1lbnRJbmRleCwgbiksIG0sIGksIG4pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgLy8gVGhlIG91dHB1dCBzaGFwZSBjYW4gYmUgY2FsY3VsYXRlZCBmcm9tIHRoZSBpbnB1dCBzaGFwZSB3aXRoIHRoZSBzaXplIG9mXG4gICAgLy8gdGhlIGdpdmVuIGF4aXMgcmVwbGFjZWQgYnkgdGhlIG51bWJlciBvZiB1bmlxdWUgZWxlbWVudHMgYWxvbmcgdGhhdCBheGlzLlxuICAgIGNvbnN0IG91dHB1dFNoYXBlID0gc2hhcGUuc2xpY2UoKTtcbiAgICBvdXRwdXRTaGFwZVskYXhpc10gPSBvdXRwdXRUbXBTaGFwZVsxXTtcbiAgICByZXR1cm4ge1xuICAgICAgICBvdXRwdXRWYWx1ZXM6IG91dHB1dEJ1ZmZlci52YWx1ZXMsXG4gICAgICAgIG91dHB1dFNoYXBlLFxuICAgICAgICBpbmRpY2VzLFxuICAgIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1VbmlxdWVfaW1wbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBVbnBhY2sgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vUmVzaGFwZSc7XG5pbXBvcnQgeyBzbGljZSB9IGZyb20gJy4vU2xpY2UnO1xuZXhwb3J0IGZ1bmN0aW9uIHVucGFjayhhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgdmFsdWUgfSA9IGlucHV0cztcbiAgICBsZXQgeyBheGlzIH0gPSBhdHRycztcbiAgICBpZiAoYXhpcyA8IDApIHtcbiAgICAgICAgYXhpcyArPSB2YWx1ZS5zaGFwZS5sZW5ndGg7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlUmFuayA9IHZhbHVlLnNoYXBlLmxlbmd0aDtcbiAgICBjb25zdCBudW0gPSB2YWx1ZS5zaGFwZVtheGlzXTtcbiAgICBjb25zdCBvdXRTaGFwZSA9IG5ldyBBcnJheSh2YWx1ZVJhbmsgLSAxKTtcbiAgICBsZXQgb3V0SW5kZXggPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVSYW5rOyBpKyspIHtcbiAgICAgICAgaWYgKGkgIT09IGF4aXMpIHtcbiAgICAgICAgICAgIG91dFNoYXBlW291dEluZGV4KytdID0gdmFsdWUuc2hhcGVbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgYmVnaW4gPSBuZXcgQXJyYXkodmFsdWVSYW5rKS5maWxsKDApO1xuICAgIGNvbnN0IHNpemUgPSB2YWx1ZS5zaGFwZS5zbGljZSgpO1xuICAgIHNpemVbYXhpc10gPSAxO1xuICAgIGNvbnN0IHJlcyA9IG5ldyBBcnJheShudW0pO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGJlZ2luW2F4aXNdID0gaTtcbiAgICAgICAgY29uc3QgdGVtcFJlcyA9IHNsaWNlKHsgaW5wdXRzOiB7IHg6IHZhbHVlIH0sIGJhY2tlbmQsIGF0dHJzOiB7IGJlZ2luLCBzaXplIH0gfSk7XG4gICAgICAgIHJlc1tpXSA9IHJlc2hhcGUoeyBpbnB1dHM6IHsgeDogdGVtcFJlcyB9LCBiYWNrZW5kLCBhdHRyczogeyBzaGFwZTogb3V0U2hhcGUgfSB9KTtcbiAgICAgICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh0ZW1wUmVzKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydCBjb25zdCB1bnBhY2tDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogVW5wYWNrLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiB1bnBhY2tcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1VbnBhY2suanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgVW5zb3J0ZWRTZWdtZW50U3VtLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFzc2VydE5vdENvbXBsZXggfSBmcm9tICcuLi9jcHVfdXRpbCc7XG5pbXBvcnQgeyBjYXN0IH0gZnJvbSAnLi9DYXN0JztcbmltcG9ydCB7IGVxdWFsIH0gZnJvbSAnLi9FcXVhbCc7XG5pbXBvcnQgeyBleHBhbmREaW1zIH0gZnJvbSAnLi9FeHBhbmREaW1zJztcbmltcG9ydCB7IG11bHRpcGx5IH0gZnJvbSAnLi9NdWx0aXBseSc7XG5pbXBvcnQgeyBwYWNrIH0gZnJvbSAnLi9QYWNrJztcbmltcG9ydCB7IHN1bSB9IGZyb20gJy4vU3VtJztcbmV4cG9ydCBmdW5jdGlvbiB1bnNvcnRlZFNlZ21lbnRTdW0oYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHgsIHNlZ21lbnRJZHMgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IG51bVNlZ21lbnRzIH0gPSBhdHRycztcbiAgICBhc3NlcnROb3RDb21wbGV4KHgsICd1bnNvcnRlZFNlZ21lbnRTdW0nKTtcbiAgICBjb25zdCB4UmFuayA9IHguc2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IHNlZ21lbnRJZHNSYW5rID0gc2VnbWVudElkcy5zaGFwZS5sZW5ndGg7XG4gICAgY29uc3QgcmVzID0gW107XG4gICAgY29uc3QgaW50ZXJtZWRpYXRlcyA9IFtdO1xuICAgIC8vIFJlc2hhcGUgdGhlIHNlZ21lbnQgaWQncyBzbyB0aGF0IHRoZXkgY2FuIGJlIGJyb2FkY2FzdCB3aXRoXG4gICAgLy8geC4gVGhlIG5ldyBzaGFwZSBzaG91bGQgYmUgW3NlZ21lbnRJZHMuc2hhcGUsIDEsIC4uLiwgMV1cbiAgICBjb25zdCBudW1JdGVycyA9IHhSYW5rIC0gc2VnbWVudElkc1Jhbms7XG4gICAgbGV0ICRzZWdtZW50SWRzID0gc2VnbWVudElkcztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUl0ZXJzOyArK2kpIHtcbiAgICAgICAgY29uc3QgZXhwYW5kZWQgPSBleHBhbmREaW1zKHsgaW5wdXRzOiB7IGlucHV0OiAkc2VnbWVudElkcyB9LCBiYWNrZW5kLCBhdHRyczogeyBkaW06IGkgKyAxIH0gfSk7XG4gICAgICAgICRzZWdtZW50SWRzID0gZXhwYW5kZWQ7XG4gICAgICAgIGludGVybWVkaWF0ZXMucHVzaChleHBhbmRlZCk7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtU2VnbWVudHM7ICsraSkge1xuICAgICAgICBjb25zdCBzY2FsYXJWYWx1ZSA9IHV0aWwuY3JlYXRlU2NhbGFyVmFsdWUoaSwgJ2ludDMyJyk7XG4gICAgICAgIGNvbnN0IHNlZ21lbnRJZCA9IGJhY2tlbmQubWFrZVRlbnNvckluZm8oW10sICdpbnQzMicsIHNjYWxhclZhbHVlKTtcbiAgICAgICAgY29uc3QgbWFzayA9IGVxdWFsKHsgaW5wdXRzOiB7IGE6IHNlZ21lbnRJZCwgYjogJHNlZ21lbnRJZHMgfSwgYmFja2VuZCB9KTtcbiAgICAgICAgY29uc3QgbWFza0Nhc3RlZCA9IGNhc3QoeyBpbnB1dHM6IHsgeDogbWFzayB9LCBiYWNrZW5kLCBhdHRyczogeyBkdHlwZTogJ2Zsb2F0MzInIH0gfSk7XG4gICAgICAgIGNvbnN0IG11bCA9IG11bHRpcGx5KHsgaW5wdXRzOiB7IGE6IG1hc2tDYXN0ZWQsIGI6IHggfSwgYmFja2VuZCB9KTtcbiAgICAgICAgY29uc3Qgc3VtVGVuc29ySW5mbyA9IHN1bSh7IGlucHV0czogeyB4OiBtdWwgfSwgYmFja2VuZCwgYXR0cnM6IHsgYXhpczogMCwga2VlcERpbXM6IGZhbHNlIH0gfSk7XG4gICAgICAgIHJlcy5wdXNoKHN1bVRlbnNvckluZm8pO1xuICAgICAgICBpbnRlcm1lZGlhdGVzLnB1c2goc2VnbWVudElkKTtcbiAgICAgICAgaW50ZXJtZWRpYXRlcy5wdXNoKG1hc2spO1xuICAgICAgICBpbnRlcm1lZGlhdGVzLnB1c2gobWFza0Nhc3RlZCk7XG4gICAgICAgIGludGVybWVkaWF0ZXMucHVzaChtdWwpO1xuICAgICAgICBpbnRlcm1lZGlhdGVzLnB1c2goc3VtVGVuc29ySW5mbyk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IHBhY2soeyBpbnB1dHM6IHJlcywgYmFja2VuZCwgYXR0cnM6IHsgYXhpczogMCB9IH0pO1xuICAgIGludGVybWVkaWF0ZXMuZm9yRWFjaCh0ID0+IGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8odCkpO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5leHBvcnQgY29uc3QgdW5zb3J0ZWRTZWdtZW50U3VtQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFVuc29ydGVkU2VnbWVudFN1bSxcbiAgICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gICAga2VybmVsRnVuYzogdW5zb3J0ZWRTZWdtZW50U3VtXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VW5zb3J0ZWRTZWdtZW50U3VtLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFplcm9zTGlrZSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjb21wbGV4IH0gZnJvbSAnLi9Db21wbGV4JztcbmltcG9ydCB7IGZpbGwgfSBmcm9tICcuL0ZpbGwnO1xuaW1wb3J0IHsgaW1hZyB9IGZyb20gJy4vSW1hZyc7XG5pbXBvcnQgeyByZWFsIH0gZnJvbSAnLi9SZWFsJztcbmV4cG9ydCBmdW5jdGlvbiB6ZXJvc0xpa2UoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGlmICh4LmR0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3plcm9zTGlrZSBpcyBub3Qgc3VwcG9ydGVkIGZvciBzdHJpbmcgdGVuc29ycycpO1xuICAgIH1cbiAgICBlbHNlIGlmICh4LmR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgICAgICBjb25zdCByZWFsUGFydCA9IHJlYWwoeyBpbnB1dHM6IHsgaW5wdXQ6IHggfSwgYmFja2VuZCB9KTtcbiAgICAgICAgY29uc3QgciA9IHplcm9zTGlrZSh7IGlucHV0czogeyB4OiByZWFsUGFydCB9LCBiYWNrZW5kIH0pO1xuICAgICAgICBjb25zdCBpbWFnUGFydCA9IGltYWcoeyBpbnB1dHM6IHsgaW5wdXQ6IHggfSwgYmFja2VuZCB9KTtcbiAgICAgICAgY29uc3QgaSA9IHplcm9zTGlrZSh7IGlucHV0czogeyB4OiBpbWFnUGFydCB9LCBiYWNrZW5kIH0pO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBjb21wbGV4KHsgaW5wdXRzOiB7IHJlYWw6IHIsIGltYWc6IGkgfSwgYmFja2VuZCB9KTtcbiAgICAgICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZWFsUGFydCk7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocik7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oaW1hZ1BhcnQpO1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGkpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZpbGwoeyBiYWNrZW5kLCBhdHRyczogeyBzaGFwZTogeC5zaGFwZSwgdmFsdWU6IDAsIGR0eXBlOiB4LmR0eXBlIH0gfSk7XG4gICAgfVxufVxuZXhwb3J0IGNvbnN0IHplcm9zTGlrZUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBaZXJvc0xpa2UsXG4gICAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICAgIGtlcm5lbEZ1bmM6IHplcm9zTGlrZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVplcm9zTGlrZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgX0Z1c2VkTWF0TXVsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFwcGx5QWN0aXZhdGlvbiB9IGZyb20gJy4uL3V0aWxzL2Z1c2VkX3V0aWxzJztcbmltcG9ydCB7IGFkZCB9IGZyb20gJy4vQWRkJztcbmltcG9ydCB7IGJhdGNoTWF0TXVsIH0gZnJvbSAnLi9CYXRjaE1hdE11bCc7XG5leHBvcnQgZnVuY3Rpb24gX2Z1c2VkTWF0TXVsKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBhLCBiLCBiaWFzLCBwcmVsdUFjdGl2YXRpb25XZWlnaHRzIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyB0cmFuc3Bvc2VBLCB0cmFuc3Bvc2VCLCBhY3RpdmF0aW9uLCBsZWFreXJlbHVBbHBoYSB9ID0gYXR0cnM7XG4gICAgbGV0IGN1cnJlbnQ7XG4gICAgbGV0IGFkZFJlcztcbiAgICBsZXQgYWN0aXZhdGlvblJlcztcbiAgICBjb25zdCBpbnRlcm1lZGlhdGVzID0gW107XG4gICAgY29uc3QgbWF0TXVsUmVzID0gYmF0Y2hNYXRNdWwoeyBpbnB1dHM6IHsgYSwgYiB9LCBhdHRyczogeyB0cmFuc3Bvc2VBLCB0cmFuc3Bvc2VCIH0sIGJhY2tlbmQgfSk7XG4gICAgY3VycmVudCA9IG1hdE11bFJlcztcbiAgICBpZiAoYmlhcykge1xuICAgICAgICBhZGRSZXMgPSBhZGQoeyBpbnB1dHM6IHsgYTogY3VycmVudCwgYjogYmlhcyB9LCBiYWNrZW5kIH0pO1xuICAgICAgICBpbnRlcm1lZGlhdGVzLnB1c2goY3VycmVudCk7XG4gICAgICAgIGN1cnJlbnQgPSBhZGRSZXM7XG4gICAgfVxuICAgIGlmIChhY3RpdmF0aW9uKSB7XG4gICAgICAgIGFjdGl2YXRpb25SZXMgPSBhcHBseUFjdGl2YXRpb24oYmFja2VuZCwgY3VycmVudCwgYWN0aXZhdGlvbiwgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cywgbGVha3lyZWx1QWxwaGEpO1xuICAgICAgICBpbnRlcm1lZGlhdGVzLnB1c2goY3VycmVudCk7XG4gICAgICAgIGN1cnJlbnQgPSBhY3RpdmF0aW9uUmVzO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGkgb2YgaW50ZXJtZWRpYXRlcykge1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGkpO1xuICAgIH1cbiAgICByZXR1cm4gY3VycmVudDtcbn1cbmV4cG9ydCBjb25zdCBfZnVzZWRNYXRNdWxDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogX0Z1c2VkTWF0TXVsLFxuICAgIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAgICBrZXJuZWxGdW5jOiBfZnVzZWRNYXRNdWwsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9X0Z1c2VkTWF0TXVsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbi8vIFdlIGV4cGxpY2l0bHkgaW1wb3J0IHRoZSBtb2R1bGFyIGtlcm5lbHMgc28gdGhleSBnZXQgcmVnaXN0ZXJlZCBpbiB0aGVcbi8vIGdsb2JhbCByZWdpc3RyeSB3aGVuIHdlIGNvbXBpbGUgdGhlIGxpYnJhcnkuIEEgbW9kdWxhciBidWlsZCB3b3VsZCByZXBsYWNlXG4vLyB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFuZCBpbXBvcnQgb25seSB0aGUga2VybmVscyB0aGF0IGFyZSBuZWVkZWQuXG5pbXBvcnQgeyByZWdpc3Rlcktlcm5lbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBfZnVzZWRNYXRNdWxDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvX0Z1c2VkTWF0TXVsJztcbmltcG9ydCB7IGFic0NvbmZpZyB9IGZyb20gJy4va2VybmVscy9BYnMnO1xuaW1wb3J0IHsgYWNvc0NvbmZpZyB9IGZyb20gJy4va2VybmVscy9BY29zJztcbmltcG9ydCB7IGFjb3NoQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0Fjb3NoJztcbmltcG9ydCB7IGFkZENvbmZpZyB9IGZyb20gJy4va2VybmVscy9BZGQnO1xuaW1wb3J0IHsgYWRkTkNvbmZpZyB9IGZyb20gJy4va2VybmVscy9BZGROJztcbmltcG9ydCB7IGFsbENvbmZpZyB9IGZyb20gJy4va2VybmVscy9BbGwnO1xuaW1wb3J0IHsgYW55Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0FueSc7XG5pbXBvcnQgeyBhcmdNYXhDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQXJnTWF4JztcbmltcG9ydCB7IGFyZ01pbkNvbmZpZyB9IGZyb20gJy4va2VybmVscy9BcmdNaW4nO1xuaW1wb3J0IHsgYXNpbkNvbmZpZyB9IGZyb20gJy4va2VybmVscy9Bc2luJztcbmltcG9ydCB7IGFzaW5oQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0FzaW5oJztcbmltcG9ydCB7IGF0YW5Db25maWcgfSBmcm9tICcuL2tlcm5lbHMvQXRhbic7XG5pbXBvcnQgeyBhdGFuMkNvbmZpZyB9IGZyb20gJy4va2VybmVscy9BdGFuMic7XG5pbXBvcnQgeyBhdGFuaENvbmZpZyB9IGZyb20gJy4va2VybmVscy9BdGFuaCc7XG5pbXBvcnQgeyBhdmdQb29sQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0F2Z1Bvb2wnO1xuaW1wb3J0IHsgYXZnUG9vbDNEQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0F2Z1Bvb2wzRCc7XG5pbXBvcnQgeyBhdmdQb29sM0RHcmFkQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0F2Z1Bvb2wzREdyYWQnO1xuaW1wb3J0IHsgYXZnUG9vbEdyYWRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQXZnUG9vbEdyYWQnO1xuaW1wb3J0IHsgYmF0Y2hNYXRNdWxDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQmF0Y2hNYXRNdWwnO1xuaW1wb3J0IHsgYmF0Y2hOb3JtQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0JhdGNoTm9ybSc7XG5pbXBvcnQgeyBiYXRjaFRvU3BhY2VORENvbmZpZyB9IGZyb20gJy4va2VybmVscy9CYXRjaFRvU3BhY2VORCc7XG5pbXBvcnQgeyBiaW5jb3VudENvbmZpZyB9IGZyb20gJy4va2VybmVscy9CaW5jb3VudCc7XG5pbXBvcnQgeyBjYXN0Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0Nhc3QnO1xuaW1wb3J0IHsgY2VpbENvbmZpZyB9IGZyb20gJy4va2VybmVscy9DZWlsJztcbmltcG9ydCB7IGNsaXBDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQ2xpcCc7XG5pbXBvcnQgeyBjb21wbGV4Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0NvbXBsZXgnO1xuaW1wb3J0IHsgY29tcGxleEFic0NvbmZpZyB9IGZyb20gJy4va2VybmVscy9Db21wbGV4QWJzJztcbmltcG9ydCB7IGNvbmNhdENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Db25jYXQnO1xuaW1wb3J0IHsgY29udjJEQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0NvbnYyRCc7XG5pbXBvcnQgeyBjb252MkRCYWNrcHJvcEZpbHRlckNvbmZpZyB9IGZyb20gJy4va2VybmVscy9Db252MkRCYWNrcHJvcEZpbHRlcic7XG5pbXBvcnQgeyBjb252MkRCYWNrcHJvcElucHV0Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0NvbnYyREJhY2twcm9wSW5wdXQnO1xuaW1wb3J0IHsgY29udjNEQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0NvbnYzRCc7XG5pbXBvcnQgeyBjb252M0RCYWNrcHJvcEZpbHRlclYyQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0NvbnYzREJhY2twcm9wRmlsdGVyVjInO1xuaW1wb3J0IHsgY29udjNEQmFja3Byb3BJbnB1dFYyQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0NvbnYzREJhY2twcm9wSW5wdXRWMic7XG5pbXBvcnQgeyBjb3NDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQ29zJztcbmltcG9ydCB7IGNvc2hDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQ29zaCc7XG5pbXBvcnQgeyBjcm9wQW5kUmVzaXplQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0Nyb3BBbmRSZXNpemUnO1xuaW1wb3J0IHsgY3Vtc3VtQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0N1bXN1bSc7XG5pbXBvcnQgeyBkZW5zZUJpbmNvdW50Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0RlbnNlQmluY291bnQnO1xuaW1wb3J0IHsgZGVwdGhUb1NwYWNlQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0RlcHRoVG9TcGFjZSc7XG5pbXBvcnQgeyBkZXB0aHdpc2VDb252MmROYXRpdmVDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvRGVwdGh3aXNlQ29udjJkTmF0aXZlJztcbmltcG9ydCB7IGRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0RlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyJztcbmltcG9ydCB7IGRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dCc7XG5pbXBvcnQgeyBkaWFnQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0RpYWcnO1xuaW1wb3J0IHsgZGlsYXRpb24yZENvbmZpZyB9IGZyb20gJy4va2VybmVscy9EaWxhdGlvbjJEJztcbmltcG9ydCB7IGRpbGF0aW9uMmRCYWNrcHJvcEZpbHRlckNvbmZpZyB9IGZyb20gJy4va2VybmVscy9EaWxhdGlvbjJEQmFja3Byb3BGaWx0ZXInO1xuaW1wb3J0IHsgZGlsYXRpb24yZEJhY2twcm9wSW5wdXRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvRGlsYXRpb24yREJhY2twcm9wSW5wdXQnO1xuaW1wb3J0IHsgZWluc3VtQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0VpbnN1bSc7XG5pbXBvcnQgeyBlbHVDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvRWx1JztcbmltcG9ydCB7IGVsdUdyYWRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvRWx1R3JhZCc7XG5pbXBvcnQgeyBlcXVhbENvbmZpZyB9IGZyb20gJy4va2VybmVscy9FcXVhbCc7XG5pbXBvcnQgeyBlcmZDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvRXJmJztcbmltcG9ydCB7IGV4cENvbmZpZyB9IGZyb20gJy4va2VybmVscy9FeHAnO1xuaW1wb3J0IHsgZXhwYW5kRGltc0NvbmZpZyB9IGZyb20gJy4va2VybmVscy9FeHBhbmREaW1zJztcbmltcG9ydCB7IGV4cG0xQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0V4cG0xJztcbmltcG9ydCB7IGZmdENvbmZpZyB9IGZyb20gJy4va2VybmVscy9GRlQnO1xuaW1wb3J0IHsgZmlsbENvbmZpZyB9IGZyb20gJy4va2VybmVscy9GaWxsJztcbmltcG9ydCB7IGZsaXBMZWZ0UmlnaHRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvRmxpcExlZnRSaWdodCc7XG5pbXBvcnQgeyBmbG9vckNvbmZpZyB9IGZyb20gJy4va2VybmVscy9GbG9vcic7XG5pbXBvcnQgeyBmbG9vckRpdkNvbmZpZyB9IGZyb20gJy4va2VybmVscy9GbG9vckRpdic7XG5pbXBvcnQgeyBmdXNlZENvbnYyRENvbmZpZyB9IGZyb20gJy4va2VybmVscy9GdXNlZENvbnYyRCc7XG5pbXBvcnQgeyBmdXNlZERlcHRod2lzZUNvbnYyRENvbmZpZyB9IGZyb20gJy4va2VybmVscy9GdXNlZERlcHRod2lzZUNvbnYyRCc7XG5pbXBvcnQgeyBnYXRoZXJOZENvbmZpZyB9IGZyb20gJy4va2VybmVscy9HYXRoZXJOZCc7XG5pbXBvcnQgeyBnYXRoZXJWMkNvbmZpZyB9IGZyb20gJy4va2VybmVscy9HYXRoZXJWMic7XG5pbXBvcnQgeyBncmVhdGVyQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0dyZWF0ZXInO1xuaW1wb3J0IHsgZ3JlYXRlckVxdWFsQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0dyZWF0ZXJFcXVhbCc7XG5pbXBvcnQgeyBpZGVudGl0eUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9JZGVudGl0eSc7XG5pbXBvcnQgeyBpZmZ0Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0lGRlQnO1xuaW1wb3J0IHsgaW1hZ0NvbmZpZyB9IGZyb20gJy4va2VybmVscy9JbWFnJztcbmltcG9ydCB7IGlzRmluaXRlQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0lzRmluaXRlJztcbmltcG9ydCB7IGlzSW5mQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0lzSW5mJztcbmltcG9ydCB7IGlzTmFOQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0lzTmFOJztcbmltcG9ydCB7IGxlYWt5UmVsdUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9MZWFreVJlbHUnO1xuaW1wb3J0IHsgbGVzc0NvbmZpZyB9IGZyb20gJy4va2VybmVscy9MZXNzJztcbmltcG9ydCB7IGxlc3NFcXVhbENvbmZpZyB9IGZyb20gJy4va2VybmVscy9MZXNzRXF1YWwnO1xuaW1wb3J0IHsgbGluU3BhY2VDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvTGluU3BhY2UnO1xuaW1wb3J0IHsgbG9nQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0xvZyc7XG5pbXBvcnQgeyBsb2cxcENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Mb2cxcCc7XG5pbXBvcnQgeyBsb2dpY2FsQW5kQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0xvZ2ljYWxBbmQnO1xuaW1wb3J0IHsgbG9naWNhbE5vdENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Mb2dpY2FsTm90JztcbmltcG9ydCB7IGxvZ2ljYWxPckNvbmZpZyB9IGZyb20gJy4va2VybmVscy9Mb2dpY2FsT3InO1xuaW1wb3J0IHsgbFJOQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0xSTic7XG5pbXBvcnQgeyBsUk5HcmFkQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0xSTkdyYWQnO1xuaW1wb3J0IHsgbWF4Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL01heCc7XG5pbXBvcnQgeyBtYXhpbXVtQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL01heGltdW0nO1xuaW1wb3J0IHsgbWF4UG9vbENvbmZpZyB9IGZyb20gJy4va2VybmVscy9NYXhQb29sJztcbmltcG9ydCB7IG1heFBvb2wzRENvbmZpZyB9IGZyb20gJy4va2VybmVscy9NYXhQb29sM0QnO1xuaW1wb3J0IHsgbWF4UG9vbDNER3JhZENvbmZpZyB9IGZyb20gJy4va2VybmVscy9NYXhQb29sM0RHcmFkJztcbmltcG9ydCB7IG1heFBvb2xHcmFkQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL01heFBvb2xHcmFkJztcbmltcG9ydCB7IG1heFBvb2xXaXRoQXJnbWF4Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL01heFBvb2xXaXRoQXJnbWF4JztcbmltcG9ydCB7IG1lYW5Db25maWcgfSBmcm9tICcuL2tlcm5lbHMvTWVhbic7XG5pbXBvcnQgeyBtaW5Db25maWcgfSBmcm9tICcuL2tlcm5lbHMvTWluJztcbmltcG9ydCB7IG1pbmltdW1Db25maWcgfSBmcm9tICcuL2tlcm5lbHMvTWluaW11bSc7XG5pbXBvcnQgeyBtaXJyb3JQYWRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvTWlycm9yUGFkJztcbmltcG9ydCB7IG1vZENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Nb2QnO1xuaW1wb3J0IHsgbXVsdGlub21pYWxDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvTXVsdGlub21pYWwnO1xuaW1wb3J0IHsgbXVsdGlwbHlDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvTXVsdGlwbHknO1xuaW1wb3J0IHsgbmVnQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL05lZyc7XG5pbXBvcnQgeyBub25NYXhTdXBwcmVzc2lvblYzQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL05vbk1heFN1cHByZXNzaW9uVjMnO1xuaW1wb3J0IHsgbm9uTWF4U3VwcHJlc3Npb25WNENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Ob25NYXhTdXBwcmVzc2lvblY0JztcbmltcG9ydCB7IG5vbk1heFN1cHByZXNzaW9uVjVDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvTm9uTWF4U3VwcHJlc3Npb25WNSc7XG5pbXBvcnQgeyBub3RFcXVhbENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Ob3RFcXVhbCc7XG5pbXBvcnQgeyBvbmVIb3RDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvT25lSG90JztcbmltcG9ydCB7IG9uZXNMaWtlQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL09uZXNMaWtlJztcbmltcG9ydCB7IHBhY2tDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvUGFjayc7XG5pbXBvcnQgeyBwYWRWMkNvbmZpZyB9IGZyb20gJy4va2VybmVscy9QYWRWMic7XG5pbXBvcnQgeyBwb3dDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvUG93JztcbmltcG9ydCB7IHByZWx1Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1ByZWx1JztcbmltcG9ydCB7IHByb2RDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvUHJvZCc7XG5pbXBvcnQgeyByYW5nZUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9SYW5nZSc7XG5pbXBvcnQgeyByZWFsQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1JlYWwnO1xuaW1wb3J0IHsgcmVhbERpdkNvbmZpZyB9IGZyb20gJy4va2VybmVscy9SZWFsRGl2JztcbmltcG9ydCB7IHJlY2lwcm9jYWxDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvUmVjaXByb2NhbCc7XG5pbXBvcnQgeyByZWx1Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1JlbHUnO1xuaW1wb3J0IHsgcmVsdTZDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvUmVsdTYnO1xuaW1wb3J0IHsgcmVzaGFwZUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9SZXNoYXBlJztcbmltcG9ydCB7IHJlc2l6ZUJpbGluZWFyQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1Jlc2l6ZUJpbGluZWFyJztcbmltcG9ydCB7IHJlc2l6ZUJpbGluZWFyR3JhZENvbmZpZyB9IGZyb20gJy4va2VybmVscy9SZXNpemVCaWxpbmVhckdyYWQnO1xuaW1wb3J0IHsgcmVzaXplTmVhcmVzdE5laWdoYm9yQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1Jlc2l6ZU5lYXJlc3ROZWlnaGJvcic7XG5pbXBvcnQgeyByZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1Jlc2l6ZU5lYXJlc3ROZWlnaGJvckdyYWQnO1xuaW1wb3J0IHsgcmV2ZXJzZUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9SZXZlcnNlJztcbmltcG9ydCB7IHJvdGF0ZVdpdGhPZmZzZXRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvUm90YXRlV2l0aE9mZnNldCc7XG5pbXBvcnQgeyByb3VuZENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Sb3VuZCc7XG5pbXBvcnQgeyByc3FydENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Sc3FydCc7XG5pbXBvcnQgeyBzY2F0dGVyTmRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU2NhdHRlck5kJztcbmltcG9ydCB7IHNlbGVjdENvbmZpZyB9IGZyb20gJy4va2VybmVscy9TZWxlY3QnO1xuaW1wb3J0IHsgc2VsdUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9TZWx1JztcbmltcG9ydCB7IHNpZ21vaWRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU2lnbW9pZCc7XG5pbXBvcnQgeyBzaWduQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1NpZ24nO1xuaW1wb3J0IHsgc2luQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1Npbic7XG5pbXBvcnQgeyBzaW5oQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1NpbmgnO1xuaW1wb3J0IHsgc2xpY2VDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU2xpY2UnO1xuaW1wb3J0IHsgc29mdG1heENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Tb2Z0bWF4JztcbmltcG9ydCB7IHNvZnRwbHVzQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1NvZnRwbHVzJztcbmltcG9ydCB7IHNwYWNlVG9CYXRjaE5EQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1NwYWNlVG9CYXRjaE5EJztcbmltcG9ydCB7IHNwYXJzZUZpbGxFbXB0eVJvd3NDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU3BhcnNlRmlsbEVtcHR5Um93cyc7XG5pbXBvcnQgeyBzcGFyc2VSZXNoYXBlQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1NwYXJzZVJlc2hhcGUnO1xuaW1wb3J0IHsgc3BhcnNlU2VnbWVudE1lYW5Db25maWcgfSBmcm9tICcuL2tlcm5lbHMvU3BhcnNlU2VnbWVudE1lYW4nO1xuaW1wb3J0IHsgc3BhcnNlU2VnbWVudFN1bUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9TcGFyc2VTZWdtZW50U3VtJztcbmltcG9ydCB7IHNwYXJzZVRvRGVuc2VDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU3BhcnNlVG9EZW5zZSc7XG5pbXBvcnQgeyBzcGxpdFZDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU3BsaXRWJztcbmltcG9ydCB7IHNxcnRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU3FydCc7XG5pbXBvcnQgeyBzcXVhcmVDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU3F1YXJlJztcbmltcG9ydCB7IHNxdWFyZWREaWZmZXJlbmNlQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1NxdWFyZWREaWZmZXJlbmNlJztcbmltcG9ydCB7IHN0ZXBDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU3RlcCc7XG5pbXBvcnQgeyBzdHJpZGVkU2xpY2VDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU3RyaWRlZFNsaWNlJztcbmltcG9ydCB7IHN0cmluZ05HcmFtc0NvbmZpZyB9IGZyb20gJy4va2VybmVscy9TdHJpbmdOR3JhbXMnO1xuaW1wb3J0IHsgc3RyaW5nU3BsaXRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU3RyaW5nU3BsaXQnO1xuaW1wb3J0IHsgc3RyaW5nVG9IYXNoQnVja2V0RmFzdENvbmZpZyB9IGZyb20gJy4va2VybmVscy9TdHJpbmdUb0hhc2hCdWNrZXRGYXN0JztcbmltcG9ydCB7IHN1YkNvbmZpZyB9IGZyb20gJy4va2VybmVscy9TdWInO1xuaW1wb3J0IHsgc3VtQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1N1bSc7XG5pbXBvcnQgeyB0YW5Db25maWcgfSBmcm9tICcuL2tlcm5lbHMvVGFuJztcbmltcG9ydCB7IHRhbmhDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvVGFuaCc7XG5pbXBvcnQgeyB0aWxlQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1RpbGUnO1xuaW1wb3J0IHsgdG9wS0NvbmZpZyB9IGZyb20gJy4va2VybmVscy9Ub3BLJztcbmltcG9ydCB7IHRyYW5zZm9ybUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9UcmFuc2Zvcm0nO1xuaW1wb3J0IHsgdHJhbnNwb3NlQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1RyYW5zcG9zZSc7XG5pbXBvcnQgeyB1bmlxdWVDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvVW5pcXVlJztcbmltcG9ydCB7IHVucGFja0NvbmZpZyB9IGZyb20gJy4va2VybmVscy9VbnBhY2snO1xuaW1wb3J0IHsgdW5zb3J0ZWRTZWdtZW50U3VtQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1Vuc29ydGVkU2VnbWVudFN1bSc7XG5pbXBvcnQgeyB6ZXJvc0xpa2VDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvWmVyb3NMaWtlJztcbi8vIExpc3QgYWxsIGtlcm5lbCBjb25maWdzIGhlcmVcbmNvbnN0IGtlcm5lbENvbmZpZ3MgPSBbXG4gICAgX2Z1c2VkTWF0TXVsQ29uZmlnLFxuICAgIGFic0NvbmZpZyxcbiAgICBhY29zQ29uZmlnLFxuICAgIGFjb3NoQ29uZmlnLFxuICAgIGFkZENvbmZpZyxcbiAgICBhZGROQ29uZmlnLFxuICAgIGFsbENvbmZpZyxcbiAgICBhbnlDb25maWcsXG4gICAgYXJnTWF4Q29uZmlnLFxuICAgIGFyZ01pbkNvbmZpZyxcbiAgICBhc2luQ29uZmlnLFxuICAgIGFzaW5oQ29uZmlnLFxuICAgIGF0YW5Db25maWcsXG4gICAgYXRhbjJDb25maWcsXG4gICAgYXRhbmhDb25maWcsXG4gICAgYXZnUG9vbENvbmZpZyxcbiAgICBhdmdQb29sM0RDb25maWcsXG4gICAgYXZnUG9vbDNER3JhZENvbmZpZyxcbiAgICBhdmdQb29sR3JhZENvbmZpZyxcbiAgICBiYXRjaE1hdE11bENvbmZpZyxcbiAgICBiYXRjaE5vcm1Db25maWcsXG4gICAgYmF0Y2hUb1NwYWNlTkRDb25maWcsXG4gICAgYmluY291bnRDb25maWcsXG4gICAgY2FzdENvbmZpZyxcbiAgICBjZWlsQ29uZmlnLFxuICAgIGNsaXBDb25maWcsXG4gICAgY29tcGxleENvbmZpZyxcbiAgICBjb21wbGV4QWJzQ29uZmlnLFxuICAgIGNvbmNhdENvbmZpZyxcbiAgICBjb252MkRCYWNrcHJvcEZpbHRlckNvbmZpZyxcbiAgICBjb252MkRCYWNrcHJvcElucHV0Q29uZmlnLFxuICAgIGNvbnYyRENvbmZpZyxcbiAgICBjb252M0RCYWNrcHJvcEZpbHRlclYyQ29uZmlnLFxuICAgIGNvbnYzREJhY2twcm9wSW5wdXRWMkNvbmZpZyxcbiAgICBjb252M0RDb25maWcsXG4gICAgY29zQ29uZmlnLFxuICAgIGNvc2hDb25maWcsXG4gICAgY3JvcEFuZFJlc2l6ZUNvbmZpZyxcbiAgICBjdW1zdW1Db25maWcsXG4gICAgZGVuc2VCaW5jb3VudENvbmZpZyxcbiAgICBkZXB0aFRvU3BhY2VDb25maWcsXG4gICAgZGVwdGh3aXNlQ29udjJkTmF0aXZlQ29uZmlnLFxuICAgIGRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyQ29uZmlnLFxuICAgIGRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXRDb25maWcsXG4gICAgZGlhZ0NvbmZpZyxcbiAgICBkaWxhdGlvbjJkQ29uZmlnLFxuICAgIGRpbGF0aW9uMmRCYWNrcHJvcElucHV0Q29uZmlnLFxuICAgIGRpbGF0aW9uMmRCYWNrcHJvcEZpbHRlckNvbmZpZyxcbiAgICByZWFsRGl2Q29uZmlnLFxuICAgIGVpbnN1bUNvbmZpZyxcbiAgICBlbHVDb25maWcsXG4gICAgZWx1R3JhZENvbmZpZyxcbiAgICBlcXVhbENvbmZpZyxcbiAgICBlcmZDb25maWcsXG4gICAgZXhwQ29uZmlnLFxuICAgIGV4cGFuZERpbXNDb25maWcsXG4gICAgZXhwbTFDb25maWcsXG4gICAgZmZ0Q29uZmlnLFxuICAgIGZpbGxDb25maWcsXG4gICAgZmxpcExlZnRSaWdodENvbmZpZyxcbiAgICBmbG9vckNvbmZpZyxcbiAgICBmbG9vckRpdkNvbmZpZyxcbiAgICBmdXNlZENvbnYyRENvbmZpZyxcbiAgICBmdXNlZERlcHRod2lzZUNvbnYyRENvbmZpZyxcbiAgICBnYXRoZXJOZENvbmZpZyxcbiAgICBnYXRoZXJWMkNvbmZpZyxcbiAgICBncmVhdGVyQ29uZmlnLFxuICAgIGdyZWF0ZXJFcXVhbENvbmZpZyxcbiAgICBpZGVudGl0eUNvbmZpZyxcbiAgICBpZmZ0Q29uZmlnLFxuICAgIGltYWdDb25maWcsXG4gICAgaXNGaW5pdGVDb25maWcsXG4gICAgaXNJbmZDb25maWcsXG4gICAgaXNOYU5Db25maWcsXG4gICAgbGVha3lSZWx1Q29uZmlnLFxuICAgIGxlc3NDb25maWcsXG4gICAgbGVzc0VxdWFsQ29uZmlnLFxuICAgIGxpblNwYWNlQ29uZmlnLFxuICAgIGxvZ0NvbmZpZyxcbiAgICBsb2cxcENvbmZpZyxcbiAgICBsb2dpY2FsQW5kQ29uZmlnLFxuICAgIGxvZ2ljYWxOb3RDb25maWcsXG4gICAgbG9naWNhbE9yQ29uZmlnLFxuICAgIGxSTkNvbmZpZyxcbiAgICBsUk5HcmFkQ29uZmlnLFxuICAgIG1heGltdW1Db25maWcsXG4gICAgbWF4UG9vbENvbmZpZyxcbiAgICBtYXhQb29sM0RDb25maWcsXG4gICAgbWF4UG9vbDNER3JhZENvbmZpZyxcbiAgICBtYXhQb29sR3JhZENvbmZpZyxcbiAgICBtYXhQb29sV2l0aEFyZ21heENvbmZpZyxcbiAgICBtYXhDb25maWcsXG4gICAgbWVhbkNvbmZpZyxcbiAgICBtaW5Db25maWcsXG4gICAgbWluaW11bUNvbmZpZyxcbiAgICBtaXJyb3JQYWRDb25maWcsXG4gICAgbW9kQ29uZmlnLFxuICAgIG11bHRpbm9taWFsQ29uZmlnLFxuICAgIG11bHRpcGx5Q29uZmlnLFxuICAgIG5lZ0NvbmZpZyxcbiAgICBub25NYXhTdXBwcmVzc2lvblYzQ29uZmlnLFxuICAgIG5vbk1heFN1cHByZXNzaW9uVjRDb25maWcsXG4gICAgbm9uTWF4U3VwcHJlc3Npb25WNUNvbmZpZyxcbiAgICBub3RFcXVhbENvbmZpZyxcbiAgICBvbmVIb3RDb25maWcsXG4gICAgb25lc0xpa2VDb25maWcsXG4gICAgcGFja0NvbmZpZyxcbiAgICBwYWRWMkNvbmZpZyxcbiAgICBwb3dDb25maWcsXG4gICAgcHJlbHVDb25maWcsXG4gICAgcHJvZENvbmZpZyxcbiAgICByYW5nZUNvbmZpZyxcbiAgICByZWFsQ29uZmlnLFxuICAgIHJlY2lwcm9jYWxDb25maWcsXG4gICAgcmVsdUNvbmZpZyxcbiAgICByZWx1NkNvbmZpZyxcbiAgICByZXNoYXBlQ29uZmlnLFxuICAgIHJlc2l6ZUJpbGluZWFyQ29uZmlnLFxuICAgIHJlc2l6ZUJpbGluZWFyR3JhZENvbmZpZyxcbiAgICByZXNpemVOZWFyZXN0TmVpZ2hib3JDb25maWcsXG4gICAgcmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZENvbmZpZyxcbiAgICByZXZlcnNlQ29uZmlnLFxuICAgIHJvdGF0ZVdpdGhPZmZzZXRDb25maWcsXG4gICAgcm91bmRDb25maWcsXG4gICAgcnNxcnRDb25maWcsXG4gICAgc2NhdHRlck5kQ29uZmlnLFxuICAgIHNlbGVjdENvbmZpZyxcbiAgICBzZWx1Q29uZmlnLFxuICAgIHNpZ21vaWRDb25maWcsXG4gICAgc2lnbkNvbmZpZyxcbiAgICBzaW5Db25maWcsXG4gICAgc2luaENvbmZpZyxcbiAgICBzbGljZUNvbmZpZyxcbiAgICBzb2Z0bWF4Q29uZmlnLFxuICAgIHNvZnRwbHVzQ29uZmlnLFxuICAgIHNwYWNlVG9CYXRjaE5EQ29uZmlnLFxuICAgIHNwYXJzZUZpbGxFbXB0eVJvd3NDb25maWcsXG4gICAgc3BhcnNlUmVzaGFwZUNvbmZpZyxcbiAgICBzcGFyc2VTZWdtZW50TWVhbkNvbmZpZyxcbiAgICBzcGFyc2VTZWdtZW50U3VtQ29uZmlnLFxuICAgIHNwYXJzZVRvRGVuc2VDb25maWcsXG4gICAgc3BsaXRWQ29uZmlnLFxuICAgIHNxcnRDb25maWcsXG4gICAgc3F1YXJlQ29uZmlnLFxuICAgIHNxdWFyZWREaWZmZXJlbmNlQ29uZmlnLFxuICAgIHN0ZXBDb25maWcsXG4gICAgc3RyaWRlZFNsaWNlQ29uZmlnLFxuICAgIHN0cmluZ05HcmFtc0NvbmZpZyxcbiAgICBzdHJpbmdTcGxpdENvbmZpZyxcbiAgICBzdHJpbmdUb0hhc2hCdWNrZXRGYXN0Q29uZmlnLFxuICAgIHN1YkNvbmZpZyxcbiAgICBzdW1Db25maWcsXG4gICAgdGFuQ29uZmlnLFxuICAgIHRhbmhDb25maWcsXG4gICAgdGlsZUNvbmZpZyxcbiAgICB0b3BLQ29uZmlnLFxuICAgIHRyYW5zcG9zZUNvbmZpZyxcbiAgICB0cmFuc2Zvcm1Db25maWcsXG4gICAgdW5pcXVlQ29uZmlnLFxuICAgIHVucGFja0NvbmZpZyxcbiAgICB1bnNvcnRlZFNlZ21lbnRTdW1Db25maWcsXG4gICAgemVyb3NMaWtlQ29uZmlnXG5dO1xuZm9yIChjb25zdCBrZXJuZWxDb25maWcgb2Yga2VybmVsQ29uZmlncykge1xuICAgIHJlZ2lzdGVyS2VybmVsKGtlcm5lbENvbmZpZyk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZWdpc3Rlcl9hbGxfa2VybmVscy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG4vLyBTaGFyZWQgZnVuY3Rpb25hbGl0eSBhbW9uZyBiYWNrZW5kcy5cbmV4cG9ydCB7IHNpbXBsZUFic0ltcGwgfSBmcm9tICcuL2tlcm5lbHMvQWJzJztcbmV4cG9ydCB7IGFkZEltcGwgfSBmcm9tICcuL2tlcm5lbHMvQWRkJztcbmV4cG9ydCB7IGJpbmNvdW50SW1wbCwgYmluY291bnRSZWR1Y2VJbXBsIH0gZnJvbSAnLi9rZXJuZWxzL0JpbmNvdW50X2ltcGwnO1xuZXhwb3J0IHsgY2VpbEltcGwgfSBmcm9tICcuL2tlcm5lbHMvQ2VpbCc7XG5leHBvcnQgeyBjb25jYXRJbXBsIH0gZnJvbSAnLi9rZXJuZWxzL0NvbmNhdF9pbXBsJztcbmV4cG9ydCB7IGVxdWFsSW1wbCB9IGZyb20gJy4va2VybmVscy9FcXVhbCc7XG5leHBvcnQgeyBleHBJbXBsIH0gZnJvbSAnLi9rZXJuZWxzL0V4cCc7XG5leHBvcnQgeyBleHBtMUltcGwgfSBmcm9tICcuL2tlcm5lbHMvRXhwbTEnO1xuZXhwb3J0IHsgZmxvb3JJbXBsIH0gZnJvbSAnLi9rZXJuZWxzL0Zsb29yJztcbmV4cG9ydCB7IGdhdGhlck5kSW1wbCB9IGZyb20gJy4va2VybmVscy9HYXRoZXJOZF9JbXBsJztcbmV4cG9ydCB7IGdhdGhlclYySW1wbCB9IGZyb20gJy4va2VybmVscy9HYXRoZXJWMl9pbXBsJztcbmV4cG9ydCB7IGdyZWF0ZXJJbXBsIH0gZnJvbSAnLi9rZXJuZWxzL0dyZWF0ZXInO1xuZXhwb3J0IHsgZ3JlYXRlckVxdWFsSW1wbCB9IGZyb20gJy4va2VybmVscy9HcmVhdGVyRXF1YWwnO1xuZXhwb3J0IHsgbGVzc0ltcGwgfSBmcm9tICcuL2tlcm5lbHMvTGVzcyc7XG5leHBvcnQgeyBsZXNzRXF1YWxJbXBsIH0gZnJvbSAnLi9rZXJuZWxzL0xlc3NFcXVhbCc7XG5leHBvcnQgeyBsaW5TcGFjZUltcGwgfSBmcm9tICcuL2tlcm5lbHMvTGluU3BhY2VfaW1wbCc7XG5leHBvcnQgeyBsb2dJbXBsIH0gZnJvbSAnLi9rZXJuZWxzL0xvZyc7XG5leHBvcnQgeyBtYXhJbXBsIH0gZnJvbSAnLi9rZXJuZWxzL01heF9pbXBsJztcbmV4cG9ydCB7IG1heGltdW1JbXBsIH0gZnJvbSAnLi9rZXJuZWxzL01heGltdW0nO1xuZXhwb3J0IHsgbWluaW11bUltcGwgfSBmcm9tICcuL2tlcm5lbHMvTWluaW11bSc7XG5leHBvcnQgeyBtdWx0aXBseUltcGwgfSBmcm9tICcuL2tlcm5lbHMvTXVsdGlwbHknO1xuZXhwb3J0IHsgbmVnSW1wbCB9IGZyb20gJy4va2VybmVscy9OZWcnO1xuZXhwb3J0IHsgbm90RXF1YWxJbXBsIH0gZnJvbSAnLi9rZXJuZWxzL05vdEVxdWFsJztcbmV4cG9ydCB7IHByb2RJbXBsIH0gZnJvbSAnLi9rZXJuZWxzL1Byb2QnO1xuZXhwb3J0IHsgcmFuZ2VJbXBsIH0gZnJvbSAnLi9rZXJuZWxzL1JhbmdlX2ltcGwnO1xuZXhwb3J0IHsgcnNxcnRJbXBsIH0gZnJvbSAnLi9rZXJuZWxzL1JzcXJ0JztcbmV4cG9ydCB7IHNsaWNlSW1wbCB9IGZyb20gJy4va2VybmVscy9TbGljZSc7XG5leHBvcnQgeyBzcGFyc2VGaWxsRW1wdHlSb3dzSW1wbCB9IGZyb20gJy4va2VybmVscy9TcGFyc2VGaWxsRW1wdHlSb3dzX2ltcGwnO1xuZXhwb3J0IHsgc3BhcnNlUmVzaGFwZUltcGwgfSBmcm9tICcuL2tlcm5lbHMvU3BhcnNlUmVzaGFwZV9pbXBsJztcbmV4cG9ydCB7IHNwYXJzZVNlZ21lbnRSZWR1Y3Rpb25JbXBsIH0gZnJvbSAnLi9rZXJuZWxzL1NwYXJzZVNlZ21lbnRSZWR1Y3Rpb25faW1wbCc7XG5leHBvcnQgeyBzcXVhcmVkRGlmZmVyZW5jZUltcGwgfSBmcm9tICcuL2tlcm5lbHMvU3F1YXJlZERpZmZlcmVuY2UnO1xuZXhwb3J0IHsgc3RyaWRlZFNsaWNlSW1wbCB9IGZyb20gJy4va2VybmVscy9TdHJpZGVkU2xpY2VfaW1wbCc7XG5leHBvcnQgeyBzdHJpbmdOR3JhbXNJbXBsIH0gZnJvbSAnLi9rZXJuZWxzL1N0cmluZ05HcmFtc19pbXBsJztcbmV4cG9ydCB7IHN0cmluZ1NwbGl0SW1wbCB9IGZyb20gJy4va2VybmVscy9TdHJpbmdTcGxpdF9pbXBsJztcbmV4cG9ydCB7IHN0cmluZ1RvSGFzaEJ1Y2tldEZhc3RJbXBsIH0gZnJvbSAnLi9rZXJuZWxzL1N0cmluZ1RvSGFzaEJ1Y2tldEZhc3RfaW1wbCc7XG5leHBvcnQgeyBzdWJJbXBsIH0gZnJvbSAnLi9rZXJuZWxzL1N1Yic7XG5leHBvcnQgeyB0aWxlSW1wbCB9IGZyb20gJy4va2VybmVscy9UaWxlX2ltcGwnO1xuZXhwb3J0IHsgdG9wS0ltcGwgfSBmcm9tICcuL2tlcm5lbHMvVG9wS19pbXBsJztcbmV4cG9ydCB7IHRyYW5zcG9zZUltcGwgfSBmcm9tICcuL2tlcm5lbHMvVHJhbnNwb3NlX2ltcGwnO1xuZXhwb3J0IHsgdW5pcXVlSW1wbCB9IGZyb20gJy4va2VybmVscy9VbmlxdWVfaW1wbCc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zaGFyZWQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbi8qKlxuICogVGVtcGxhdGUgdGhhdCBjcmVhdGVzIGltcGxlbWVudGF0aW9uIGZvciBiaW5hcnkgb3BzLiBTdXBwb3J0cyBicm9hZGNhc3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsKG9wKSB7XG4gICAgcmV0dXJuIChhU2hhcGUsIGJTaGFwZSwgYVZhbHMsIGJWYWxzLCBkdHlwZSkgPT4ge1xuICAgICAgICBjb25zdCBuZXdTaGFwZSA9IGJhY2tlbmRfdXRpbC5hc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZShhU2hhcGUsIGJTaGFwZSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdFJhbmsgPSBuZXdTaGFwZS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IHJlc3VsdFN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKG5ld1NoYXBlKTtcbiAgICAgICAgY29uc3QgcmVzdWx0U2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShuZXdTaGFwZSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHV0aWwuZ2V0VHlwZWRBcnJheUZyb21EVHlwZShkdHlwZSwgcmVzdWx0U2l6ZSk7XG4gICAgICAgIGNvbnN0IGFSYW5rID0gYVNoYXBlLmxlbmd0aDtcbiAgICAgICAgY29uc3QgYlJhbmsgPSBiU2hhcGUubGVuZ3RoO1xuICAgICAgICBjb25zdCBhU3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoYVNoYXBlKTtcbiAgICAgICAgY29uc3QgYlN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKGJTaGFwZSk7XG4gICAgICAgIGNvbnN0IGFCcm9hZGNhc3REaW1zID0gYmFja2VuZF91dGlsLmdldEJyb2FkY2FzdERpbXMoYVNoYXBlLCBuZXdTaGFwZSk7XG4gICAgICAgIGNvbnN0IGJCcm9hZGNhc3REaW1zID0gYmFja2VuZF91dGlsLmdldEJyb2FkY2FzdERpbXMoYlNoYXBlLCBuZXdTaGFwZSk7XG4gICAgICAgIGlmIChhQnJvYWRjYXN0RGltcy5sZW5ndGggKyBiQnJvYWRjYXN0RGltcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0W2ldID0gb3AoYVZhbHNbaSAlIGFWYWxzLmxlbmd0aF0sIGJWYWxzW2kgJSBiVmFscy5sZW5ndGhdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbG9jID0gdXRpbC5pbmRleFRvTG9jKGksIHJlc3VsdFJhbmssIHJlc3VsdFN0cmlkZXMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFMb2MgPSBsb2Muc2xpY2UoLWFSYW5rKTtcbiAgICAgICAgICAgICAgICBhQnJvYWRjYXN0RGltcy5mb3JFYWNoKGQgPT4gYUxvY1tkXSA9IDApO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFJbmRleCA9IHV0aWwubG9jVG9JbmRleChhTG9jLCBhUmFuaywgYVN0cmlkZXMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJMb2MgPSBsb2Muc2xpY2UoLWJSYW5rKTtcbiAgICAgICAgICAgICAgICBiQnJvYWRjYXN0RGltcy5mb3JFYWNoKGQgPT4gYkxvY1tkXSA9IDApO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJJbmRleCA9IHV0aWwubG9jVG9JbmRleChiTG9jLCBiUmFuaywgYlN0cmlkZXMpO1xuICAgICAgICAgICAgICAgIHJlc3VsdFtpXSA9IG9wKGFWYWxzW2FJbmRleF0sIGJWYWxzW2JJbmRleF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbcmVzdWx0LCBuZXdTaGFwZV07XG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJpbmFyeV9pbXBsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuaW1wb3J0IHsgY2FzdCB9IGZyb20gJy4uL2tlcm5lbHMvQ2FzdCc7XG5pbXBvcnQgeyBjb21wbGV4IH0gZnJvbSAnLi4va2VybmVscy9Db21wbGV4Jztcbi8qKlxuICogVGVtcGxhdGUgdGhhdCBjcmVhdGVzIGEgYEtlcm5lbEZ1bmNgIGZvciBiaW5hcnkgb3BzLlxuICogQHBhcmFtIG5hbWUgS2VybmVsIG5hbWUuXG4gKiBAcGFyYW0gYmluYXJ5S2VybmVsSW1wbCBBIGBTaW1wbGVCaW5hcnlLZXJuZWxJbXBsYCBmb3IgdGhlIGtlcm5lbC5cbiAqIEBwYXJhbSBiaW5hcnlLZXJuZWxDb21wbGV4SW1wbCBPcHRpb25hbC4gSWYgZXhpc3RzLCByZXByZXNlbnRzIGFcbiAqICAgICBgQ29tcGxleEJpbmFyeUtlcm5lbEltcGxgIGZvciB0aGUga2VybmVsLCB3aWxsIGJlIHVzZWQgd2hlbiBpbnB1dCBkdHlwZVxuICogICAgIGlzIGBjb21wbGV4NjRgLlxuICogQHBhcmFtIGR0eXBlIE9wdGlvbmFsLiBJZiBzZXQsIHRoZSByZXN1bHQgaGFzIHRoaXMgZHR5cGUuIE90aGVyd2lzZSwgdGhlXG4gKiAgICAgcmVzdWx0IGhhcyB0aGUgc2FtZSBkdHlwZSBhcyB0aGUgZmlyc3QgaW5wdXQuIFRoaXMgaXMgbWFpbmx5IHVzZWQgaW5cbiAqICAgICBjb21wYXJpc29uIGtlcm5lbHMsIHN1Y2ggYXMgRXF1YWwsIExlc3MsIEdyZWF0ZXIsIGV0Yy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJpbmFyeUtlcm5lbEZ1bmMobmFtZSwgc2ltcGxlSW1wbCwgY29tcGxleEltcGwsIGR0eXBlKSB7XG4gICAgaWYgKGNvbXBsZXhJbXBsID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuICh7IGlucHV0cywgYmFja2VuZCB9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IGEsIGIgfSA9IGlucHV0cztcbiAgICAgICAgICAgIGNvbnN0IGNwdUJhY2tlbmQgPSBiYWNrZW5kO1xuICAgICAgICAgICAgYXNzZXJ0Tm90Q29tcGxleChbYSwgYl0sIG5hbWUpO1xuICAgICAgICAgICAgY29uc3QgYVZhbHMgPSBjcHVCYWNrZW5kLmRhdGEuZ2V0KGEuZGF0YUlkKS52YWx1ZXM7XG4gICAgICAgICAgICBjb25zdCBiVmFscyA9IGNwdUJhY2tlbmQuZGF0YS5nZXQoYi5kYXRhSWQpLnZhbHVlcztcbiAgICAgICAgICAgIGNvbnN0IGRlY29kZWRBVmFscyA9IGEuZHR5cGUgPT09ICdzdHJpbmcnID9cbiAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWFueVxuICAgICAgICAgICAgICAgIGJhY2tlbmRfdXRpbC5mcm9tVWludDhUb1N0cmluZ0FycmF5KGFWYWxzKSA6XG4gICAgICAgICAgICAgICAgYVZhbHM7XG4gICAgICAgICAgICBjb25zdCBkZWNvZGVkQlZhbHMgPSBhLmR0eXBlID09PSAnc3RyaW5nJyA/XG4gICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1hbnlcbiAgICAgICAgICAgICAgICBiYWNrZW5kX3V0aWwuZnJvbVVpbnQ4VG9TdHJpbmdBcnJheShiVmFscykgOlxuICAgICAgICAgICAgICAgIGJWYWxzO1xuICAgICAgICAgICAgY29uc3QgJGR0eXBlID0gZHR5cGUgfHwgYS5kdHlwZTtcbiAgICAgICAgICAgIGNvbnN0IFtyZXN1bHREYXRhLCByZXN1bHRTaGFwZV0gPSBzaW1wbGVJbXBsKGEuc2hhcGUsIGIuc2hhcGUsIGRlY29kZWRBVmFscywgZGVjb2RlZEJWYWxzLCAkZHR5cGUpO1xuICAgICAgICAgICAgcmV0dXJuIGNwdUJhY2tlbmQubWFrZVRlbnNvckluZm8ocmVzdWx0U2hhcGUsICRkdHlwZSwgcmVzdWx0RGF0YSk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiAoeyBpbnB1dHMsIGJhY2tlbmQgfSkgPT4ge1xuICAgICAgICBjb25zdCB7IGEsIGIgfSA9IGlucHV0cztcbiAgICAgICAgY29uc3QgY3B1QmFja2VuZCA9IGJhY2tlbmQ7XG4gICAgICAgIGlmIChhLmR0eXBlID09PSAnY29tcGxleDY0JyB8fCBiLmR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgICAgICAgICAgY29uc3QgJGFDb21wbGV4ID0gY2FzdCh7IGlucHV0czogeyB4OiBhIH0sIGJhY2tlbmQ6IGNwdUJhY2tlbmQsIGF0dHJzOiB7IGR0eXBlOiAnY29tcGxleDY0JyB9IH0pO1xuICAgICAgICAgICAgY29uc3QgJGFDb21wbGV4VmFscyA9IGNwdUJhY2tlbmQuZGF0YS5nZXQoJGFDb21wbGV4LmRhdGFJZCk7XG4gICAgICAgICAgICBjb25zdCBhUmVhbCA9ICRhQ29tcGxleFZhbHMuY29tcGxleFRlbnNvckluZm9zLnJlYWw7XG4gICAgICAgICAgICBjb25zdCBhSW1hZyA9ICRhQ29tcGxleFZhbHMuY29tcGxleFRlbnNvckluZm9zLmltYWc7XG4gICAgICAgICAgICBjb25zdCBhUmVhbFZhbHMgPSBjcHVCYWNrZW5kLmRhdGEuZ2V0KGFSZWFsLmRhdGFJZCkudmFsdWVzO1xuICAgICAgICAgICAgY29uc3QgYUltYWdWYWxzID0gY3B1QmFja2VuZC5kYXRhLmdldChhSW1hZy5kYXRhSWQpLnZhbHVlcztcbiAgICAgICAgICAgIGNvbnN0ICRiQ29tcGxleCA9IGNhc3QoeyBpbnB1dHM6IHsgeDogYiB9LCBiYWNrZW5kOiBjcHVCYWNrZW5kLCBhdHRyczogeyBkdHlwZTogJ2NvbXBsZXg2NCcgfSB9KTtcbiAgICAgICAgICAgIGNvbnN0ICRiQ29tcGxleFZhbHMgPSBjcHVCYWNrZW5kLmRhdGEuZ2V0KCRiQ29tcGxleC5kYXRhSWQpO1xuICAgICAgICAgICAgY29uc3QgYlJlYWwgPSAkYkNvbXBsZXhWYWxzLmNvbXBsZXhUZW5zb3JJbmZvcy5yZWFsO1xuICAgICAgICAgICAgY29uc3QgYkltYWcgPSAkYkNvbXBsZXhWYWxzLmNvbXBsZXhUZW5zb3JJbmZvcy5pbWFnO1xuICAgICAgICAgICAgY29uc3QgYlJlYWxWYWxzID0gY3B1QmFja2VuZC5kYXRhLmdldChiUmVhbC5kYXRhSWQpLnZhbHVlcztcbiAgICAgICAgICAgIGNvbnN0IGJJbWFnVmFscyA9IGNwdUJhY2tlbmQuZGF0YS5nZXQoYkltYWcuZGF0YUlkKS52YWx1ZXM7XG4gICAgICAgICAgICBjb25zdCBbcmVzdWx0UmVhbERhdGEsIHJlc3VsdEltYWdEYXRhLCByZXN1bHRTaGFwZV0gPSBjb21wbGV4SW1wbChhLnNoYXBlLCBiLnNoYXBlLCBhUmVhbFZhbHMsIGFJbWFnVmFscywgYlJlYWxWYWxzLCBiSW1hZ1ZhbHMpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0UmVhbCA9IGNwdUJhY2tlbmQubWFrZVRlbnNvckluZm8ocmVzdWx0U2hhcGUsICdmbG9hdDMyJywgcmVzdWx0UmVhbERhdGEpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0SW1hZyA9IGNwdUJhY2tlbmQubWFrZVRlbnNvckluZm8ocmVzdWx0U2hhcGUsICdmbG9hdDMyJywgcmVzdWx0SW1hZ0RhdGEpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gY29tcGxleCh7IGlucHV0czogeyByZWFsOiByZXN1bHRSZWFsLCBpbWFnOiByZXN1bHRJbWFnIH0sIGJhY2tlbmQ6IGNwdUJhY2tlbmQgfSk7XG4gICAgICAgICAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKCRhQ29tcGxleCk7XG4gICAgICAgICAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKCRiQ29tcGxleCk7XG4gICAgICAgICAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlc3VsdFJlYWwpO1xuICAgICAgICAgICAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZXN1bHRJbWFnKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBhVmFscyA9IGNwdUJhY2tlbmQuZGF0YS5nZXQoYS5kYXRhSWQpLnZhbHVlcztcbiAgICAgICAgICAgIGNvbnN0IGJWYWxzID0gY3B1QmFja2VuZC5kYXRhLmdldChiLmRhdGFJZCkudmFsdWVzO1xuICAgICAgICAgICAgY29uc3QgJGR0eXBlID0gZHR5cGUgfHwgYS5kdHlwZTtcbiAgICAgICAgICAgIGNvbnN0IFtyZXN1bHREYXRhLCByZXN1bHRTaGFwZV0gPSBzaW1wbGVJbXBsKGEuc2hhcGUsIGIuc2hhcGUsIGFWYWxzLCBiVmFscywgJGR0eXBlKTtcbiAgICAgICAgICAgIHJldHVybiBjcHVCYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHJlc3VsdFNoYXBlLCAkZHR5cGUsIHJlc3VsdERhdGEpO1xuICAgICAgICB9XG4gICAgfTtcbn1cbi8qKlxuICogVGVtcGxhdGUgdGhhdCBjcmVhdGVzIHRoZSBjb21wbGV4IHR5cGUgaW1wbGVtZW50YXRpb24gZm9yIGJpbmFyeSBvcHMuXG4gKiBTdXBwb3J0cyBicm9hZGNhc3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb21wbGV4QmluYXJ5S2VybmVsSW1wbChvcCkge1xuICAgIHJldHVybiAoYVNoYXBlLCBiU2hhcGUsIGFSZWFsVmFscywgYUltYWdWYWxzLCBiUmVhbFZhbHMsIGJJbWFnVmFscykgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHRTaGFwZSA9IGJhY2tlbmRfdXRpbC5hc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZShhU2hhcGUsIGJTaGFwZSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdFNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUocmVzdWx0U2hhcGUpO1xuICAgICAgICBjb25zdCByZXN1bHRSYW5rID0gcmVzdWx0U2hhcGUubGVuZ3RoO1xuICAgICAgICBjb25zdCByZXN1bHRTdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyhyZXN1bHRTaGFwZSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdFJlYWxWYWxzID0gdXRpbC5nZXRUeXBlZEFycmF5RnJvbURUeXBlKCdmbG9hdDMyJywgcmVzdWx0U2l6ZSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdEltYWdWYWxzID0gdXRpbC5nZXRUeXBlZEFycmF5RnJvbURUeXBlKCdmbG9hdDMyJywgcmVzdWx0U2l6ZSk7XG4gICAgICAgIGNvbnN0IGFCcm9hZGNhc3REaW1zID0gYmFja2VuZF91dGlsLmdldEJyb2FkY2FzdERpbXMoYVNoYXBlLCByZXN1bHRTaGFwZSk7XG4gICAgICAgIGNvbnN0IGJCcm9hZGNhc3REaW1zID0gYmFja2VuZF91dGlsLmdldEJyb2FkY2FzdERpbXMoYlNoYXBlLCByZXN1bHRTaGFwZSk7XG4gICAgICAgIGNvbnN0IGFWYWxzID0gYmFja2VuZF91dGlsLm1lcmdlUmVhbEFuZEltYWdBcnJheXMoYVJlYWxWYWxzLCBhSW1hZ1ZhbHMpO1xuICAgICAgICBjb25zdCBiVmFscyA9IGJhY2tlbmRfdXRpbC5tZXJnZVJlYWxBbmRJbWFnQXJyYXlzKGJSZWFsVmFscywgYkltYWdWYWxzKTtcbiAgICAgICAgY29uc3QgYVJhbmsgPSBhU2hhcGUubGVuZ3RoO1xuICAgICAgICBjb25zdCBhU3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoYVNoYXBlKTtcbiAgICAgICAgY29uc3QgYlJhbmsgPSBiU2hhcGUubGVuZ3RoO1xuICAgICAgICBjb25zdCBiU3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoYlNoYXBlKTtcbiAgICAgICAgaWYgKGFCcm9hZGNhc3REaW1zLmxlbmd0aCArIGJCcm9hZGNhc3REaW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHRSZWFsVmFscy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFJZHggPSBpICUgYVZhbHMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJJZHggPSBpICUgYlZhbHMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9wKGFWYWxzW2FJZHggKiAyXSwgYVZhbHNbYUlkeCAqIDIgKyAxXSwgYlZhbHNbYklkeCAqIDJdLCBiVmFsc1tiSWR4ICogMiArIDFdKTtcbiAgICAgICAgICAgICAgICByZXN1bHRSZWFsVmFsc1tpXSA9IHJlc3VsdC5yZWFsO1xuICAgICAgICAgICAgICAgIHJlc3VsdEltYWdWYWxzW2ldID0gcmVzdWx0LmltYWc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdFJlYWxWYWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbG9jID0gdXRpbC5pbmRleFRvTG9jKGksIHJlc3VsdFJhbmssIHJlc3VsdFN0cmlkZXMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFMb2MgPSBsb2Muc2xpY2UoLWFSYW5rKTtcbiAgICAgICAgICAgICAgICBhQnJvYWRjYXN0RGltcy5mb3JFYWNoKGQgPT4gYUxvY1tkXSA9IDApO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFJbmRleCA9IHV0aWwubG9jVG9JbmRleChhTG9jLCBhUmFuaywgYVN0cmlkZXMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJMb2MgPSBsb2Muc2xpY2UoLWJSYW5rKTtcbiAgICAgICAgICAgICAgICBiQnJvYWRjYXN0RGltcy5mb3JFYWNoKGQgPT4gYkxvY1tkXSA9IDApO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJJbmRleCA9IHV0aWwubG9jVG9JbmRleChiTG9jLCBiUmFuaywgYlN0cmlkZXMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG9wUmVzdWx0ID0gb3AoYVZhbHNbYUluZGV4ICogMl0sIGFWYWxzW2FJbmRleCAqIDIgKyAxXSwgYlZhbHNbYkluZGV4ICogMl0sIGJWYWxzW2JJbmRleCAqIDIgKyAxXSk7XG4gICAgICAgICAgICAgICAgcmVzdWx0UmVhbFZhbHNbaV0gPSBvcFJlc3VsdC5yZWFsO1xuICAgICAgICAgICAgICAgIHJlc3VsdEltYWdWYWxzW2ldID0gb3BSZXN1bHQuaW1hZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW3Jlc3VsdFJlYWxWYWxzLCByZXN1bHRJbWFnVmFscywgcmVzdWx0U2hhcGVdO1xuICAgIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1iaW5hcnlfdXRpbHMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGFkZCB9IGZyb20gJy4uL2tlcm5lbHMvQWRkJztcbmltcG9ydCB7IGNvbXBsZXggfSBmcm9tICcuLi9rZXJuZWxzL0NvbXBsZXgnO1xuaW1wb3J0IHsgY29uY2F0IH0gZnJvbSAnLi4va2VybmVscy9Db25jYXQnO1xuaW1wb3J0IHsgaWRlbnRpdHkgfSBmcm9tICcuLi9rZXJuZWxzL0lkZW50aXR5JztcbmltcG9ydCB7IGltYWcgfSBmcm9tICcuLi9rZXJuZWxzL0ltYWcnO1xuaW1wb3J0IHsgbXVsdGlwbHkgfSBmcm9tICcuLi9rZXJuZWxzL011bHRpcGx5JztcbmltcG9ydCB7IHJlYWwgfSBmcm9tICcuLi9rZXJuZWxzL1JlYWwnO1xuaW1wb3J0IHsgcmVhbERpdkNvbmZpZyB9IGZyb20gJy4uL2tlcm5lbHMvUmVhbERpdic7XG5pbXBvcnQgeyBzbGljZSB9IGZyb20gJy4uL2tlcm5lbHMvU2xpY2UnO1xuaW1wb3J0IHsgc3ViIH0gZnJvbSAnLi4va2VybmVscy9TdWInO1xuLyoqXG4gKiBDYWxjdWxhdGUgRkZUIG9mIGlubmVyIG1vc3QgZWxlbWVudHMgb2YgYmF0Y2ggdGVuc29yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmZ0QmF0Y2goaW5wdXQsIGludmVyc2UsIGNwdUJhY2tlbmQpIHtcbiAgICBjb25zdCBpbnB1dFNoYXBlID0gaW5wdXQuc2hhcGU7XG4gICAgY29uc3QgYmF0Y2ggPSBpbnB1dFNoYXBlWzBdO1xuICAgIGNvbnN0IGlubmVyRGltID0gaW5wdXRTaGFwZVsxXTtcbiAgICBjb25zdCBpbnB1dFZhbHMgPSBjcHVCYWNrZW5kLmRhdGEuZ2V0KGlucHV0LmRhdGFJZCk7XG4gICAgY29uc3QgcmVhbDJEID0gaW5wdXRWYWxzLmNvbXBsZXhUZW5zb3JJbmZvcy5yZWFsO1xuICAgIGNvbnN0IGltYWcyRCA9IGlucHV0VmFscy5jb21wbGV4VGVuc29ySW5mb3MuaW1hZztcbiAgICAvLyBDb2xsZWN0cyByZWFsIGFuZCBpbWFnaW5hcnkgdmFsdWVzIHNlcGFyYXRlbHkuXG4gICAgY29uc3QgcmVzdWx0U2hhcGUgPSBbYmF0Y2gsIGlubmVyRGltXTtcbiAgICBjb25zdCByZXN1bHRTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHJlc3VsdFNoYXBlKTtcbiAgICBjb25zdCByZXN1bHRSZWFsID0gdXRpbC5nZXRUeXBlZEFycmF5RnJvbURUeXBlKCdmbG9hdDMyJywgcmVzdWx0U2l6ZSk7XG4gICAgY29uc3QgcmVzdWx0SW1hZyA9IHV0aWwuZ2V0VHlwZWRBcnJheUZyb21EVHlwZSgnZmxvYXQzMicsIHJlc3VsdFNpemUpO1xuICAgIGZvciAobGV0IGIgPSAwOyBiIDwgYmF0Y2g7IGIrKykge1xuICAgICAgICAvLyBUT0RPOiBTdXBwb3J0IHNsaWNlIG9wcyBmb3IgY29tcGxleCB0eXBlLlxuICAgICAgICBjb25zdCByID0gc2xpY2Uoe1xuICAgICAgICAgICAgaW5wdXRzOiB7IHg6IHJlYWwyRCB9LFxuICAgICAgICAgICAgYmFja2VuZDogY3B1QmFja2VuZCxcbiAgICAgICAgICAgIGF0dHJzOiB7IGJlZ2luOiBbYiwgMF0sIHNpemU6IFsxLCBpbm5lckRpbV0gfVxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgaSA9IHNsaWNlKHtcbiAgICAgICAgICAgIGlucHV0czogeyB4OiBpbWFnMkQgfSxcbiAgICAgICAgICAgIGJhY2tlbmQ6IGNwdUJhY2tlbmQsXG4gICAgICAgICAgICBhdHRyczogeyBiZWdpbjogW2IsIDBdLCBzaXplOiBbMSwgaW5uZXJEaW1dIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gY29tcGxleCh7IGlucHV0czogeyByZWFsOiByLCBpbWFnOiBpIH0sIGJhY2tlbmQ6IGNwdUJhY2tlbmQgfSk7XG4gICAgICAgIC8vIFJ1biBGRlQgYnkgYmF0Y2ggZWxlbWVudC5cbiAgICAgICAgY29uc3QgeyByZWFsLCBpbWFnIH0gPSBmZnRJbXBsKGlucHV0LCBpbnZlcnNlLCBjcHVCYWNrZW5kKTtcbiAgICAgICAgY29uc3QgcmVzID0gYmFja2VuZF91dGlsLm1lcmdlUmVhbEFuZEltYWdBcnJheXMocmVhbCwgaW1hZyk7XG4gICAgICAgIGZvciAobGV0IGQgPSAwOyBkIDwgaW5uZXJEaW07IGQrKykge1xuICAgICAgICAgICAgY29uc3QgYyA9IGJhY2tlbmRfdXRpbC5nZXRDb21wbGV4V2l0aEluZGV4KHJlcywgZCk7XG4gICAgICAgICAgICByZXN1bHRSZWFsW2IgKiBpbm5lckRpbSArIGRdID0gYy5yZWFsO1xuICAgICAgICAgICAgcmVzdWx0SW1hZ1tiICogaW5uZXJEaW0gKyBkXSA9IGMuaW1hZztcbiAgICAgICAgfVxuICAgICAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHIpO1xuICAgICAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGkpO1xuICAgICAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGlucHV0KTtcbiAgICB9XG4gICAgY29uc3QgJHJlYWxJbmZvID0gY3B1QmFja2VuZC5tYWtlVGVuc29ySW5mbyhyZXN1bHRTaGFwZSwgJ2Zsb2F0MzInLCByZXN1bHRSZWFsKTtcbiAgICBjb25zdCAkaW1hZ0luZm8gPSBjcHVCYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHJlc3VsdFNoYXBlLCAnZmxvYXQzMicsIHJlc3VsdEltYWcpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGNvbXBsZXgoeyBpbnB1dHM6IHsgcmVhbDogJHJlYWxJbmZvLCBpbWFnOiAkaW1hZ0luZm8gfSwgYmFja2VuZDogY3B1QmFja2VuZCB9KTtcbiAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKCRyZWFsSW5mbyk7XG4gICAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbygkaW1hZ0luZm8pO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5leHBvcnQgZnVuY3Rpb24gZmZ0SW1wbChpbnB1dCwgaW52ZXJzZSwgY3B1QmFja2VuZCkge1xuICAgIGNvbnN0IGlucHV0U2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShpbnB1dC5zaGFwZSk7XG4gICAgY29uc3QgaW5wdXRWYWxzID0gY3B1QmFja2VuZC5kYXRhLmdldChpbnB1dC5kYXRhSWQpO1xuICAgIGNvbnN0IHJlYWxWYWxzID0gY3B1QmFja2VuZC5kYXRhLmdldChpbnB1dFZhbHMuY29tcGxleFRlbnNvckluZm9zLnJlYWwuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgaW1hZ1ZhbHMgPSBjcHVCYWNrZW5kLmRhdGEuZ2V0KGlucHV0VmFscy5jb21wbGV4VGVuc29ySW5mb3MuaW1hZy5kYXRhSWQpLnZhbHVlcztcbiAgICBpZiAoaXNFeHBvbmVudE9mMihpbnB1dFNpemUpKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGZmdFJhZGl4MihyZWFsVmFscywgaW1hZ1ZhbHMsIGlucHV0U2l6ZSwgaW52ZXJzZSwgY3B1QmFja2VuZCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdFNoYXBlID0gW2lucHV0LnNoYXBlWzBdLCBpbnB1dC5zaGFwZVsxXV07XG4gICAgICAgIGlmIChpbnZlcnNlKSB7XG4gICAgICAgICAgICBjb25zdCByZWFsSW5mbyA9IGNwdUJhY2tlbmQubWFrZVRlbnNvckluZm8ocmVzdWx0U2hhcGUsICdmbG9hdDMyJywgcmVzdWx0LnJlYWwpO1xuICAgICAgICAgICAgY29uc3QgaW1hZ0luZm8gPSBjcHVCYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHJlc3VsdFNoYXBlLCAnZmxvYXQzMicsIHJlc3VsdC5pbWFnKTtcbiAgICAgICAgICAgIGNvbnN0IHNpemVJbmZvID0gY3B1QmFja2VuZC5tYWtlVGVuc29ySW5mbyhbXSwgJ2Zsb2F0MzInLCB1dGlsLmNyZWF0ZVNjYWxhclZhbHVlKGlucHV0U2l6ZSwgJ2Zsb2F0MzInKSk7XG4gICAgICAgICAgICBjb25zdCBzaXplSW5mb0NvcHkgPSBpZGVudGl0eSh7IGlucHV0czogeyB4OiBzaXplSW5mbyB9LCBiYWNrZW5kOiBjcHVCYWNrZW5kIH0pO1xuICAgICAgICAgICAgY29uc3QgZGl2UmVhbEluZm8gPSByZWFsRGl2Q29uZmlnLmtlcm5lbEZ1bmMoeyBpbnB1dHM6IHsgYTogcmVhbEluZm8sIGI6IHNpemVJbmZvIH0sIGJhY2tlbmQ6IGNwdUJhY2tlbmQgfSk7XG4gICAgICAgICAgICBjb25zdCBkaXZJbWFnSW5mbyA9IHJlYWxEaXZDb25maWcua2VybmVsRnVuYyh7IGlucHV0czogeyBhOiBpbWFnSW5mbywgYjogc2l6ZUluZm9Db3B5IH0sIGJhY2tlbmQ6IGNwdUJhY2tlbmQgfSk7XG4gICAgICAgICAgICBjb25zdCBkaXZSZWFsVmFscyA9IGNwdUJhY2tlbmQuZGF0YS5nZXQoZGl2UmVhbEluZm8uZGF0YUlkKS52YWx1ZXM7XG4gICAgICAgICAgICBjb25zdCBkaXZJbWFnVmFscyA9IGNwdUJhY2tlbmQuZGF0YS5nZXQoZGl2SW1hZ0luZm8uZGF0YUlkKS52YWx1ZXM7XG4gICAgICAgICAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlYWxJbmZvKTtcbiAgICAgICAgICAgIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oaW1hZ0luZm8pO1xuICAgICAgICAgICAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhzaXplSW5mbyk7XG4gICAgICAgICAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHNpemVJbmZvQ29weSk7XG4gICAgICAgICAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGRpdlJlYWxJbmZvKTtcbiAgICAgICAgICAgIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oZGl2SW1hZ0luZm8pO1xuICAgICAgICAgICAgcmV0dXJuIHsgcmVhbDogZGl2UmVhbFZhbHMsIGltYWc6IGRpdkltYWdWYWxzIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBiYWNrZW5kX3V0aWwubWVyZ2VSZWFsQW5kSW1hZ0FycmF5cyhyZWFsVmFscywgaW1hZ1ZhbHMpO1xuICAgICAgICBjb25zdCByYXdPdXRwdXQgPSBmb3VyaWVyVHJhbnNmb3JtQnlNYXRtdWwoZGF0YSwgaW5wdXRTaXplLCBpbnZlcnNlKTtcbiAgICAgICAgcmV0dXJuIGJhY2tlbmRfdXRpbC5zcGxpdFJlYWxBbmRJbWFnQXJyYXlzKHJhd091dHB1dCk7XG4gICAgfVxufVxuZnVuY3Rpb24gaXNFeHBvbmVudE9mMihzaXplKSB7XG4gICAgcmV0dXJuIChzaXplICYgc2l6ZSAtIDEpID09PSAwO1xufVxuLy8gRkZUIHVzaW5nIENvb2xleS1UdWtleSBhbGdvcml0aG0gb24gcmFkaXggMiBkaW1lbnNpb25hbCBpbnB1dC5cbmZ1bmN0aW9uIGZmdFJhZGl4MihyZWFsVmFscywgaW1hZ1ZhbHMsIHNpemUsIGludmVyc2UsIGNwdUJhY2tlbmQpIHtcbiAgICBpZiAoc2l6ZSA9PT0gMSkge1xuICAgICAgICByZXR1cm4geyByZWFsOiByZWFsVmFscywgaW1hZzogaW1hZ1ZhbHMgfTtcbiAgICB9XG4gICAgY29uc3QgZGF0YSA9IGJhY2tlbmRfdXRpbC5tZXJnZVJlYWxBbmRJbWFnQXJyYXlzKHJlYWxWYWxzLCBpbWFnVmFscyk7XG4gICAgY29uc3QgaGFsZiA9IHNpemUgLyAyO1xuICAgIGNvbnN0IGV2ZW5Db21wbGV4ID0gYmFja2VuZF91dGlsLmNvbXBsZXhXaXRoRXZlbkluZGV4KGRhdGEpO1xuICAgIGNvbnN0IGV2ZW5SZWFsVmFscyA9IGV2ZW5Db21wbGV4LnJlYWw7XG4gICAgY29uc3QgZXZlbkltYWdWYWxzID0gZXZlbkNvbXBsZXguaW1hZztcbiAgICBjb25zdCBldmVuU2hhcGUgPSBbZXZlblJlYWxWYWxzLmxlbmd0aF07XG4gICAgY29uc3QgZXZlblJlYWxJbmZvID0gY3B1QmFja2VuZC5tYWtlVGVuc29ySW5mbyhldmVuU2hhcGUsICdmbG9hdDMyJywgZXZlblJlYWxWYWxzKTtcbiAgICBjb25zdCBldmVuSW1hZ0luZm8gPSBjcHVCYWNrZW5kLm1ha2VUZW5zb3JJbmZvKGV2ZW5TaGFwZSwgJ2Zsb2F0MzInLCBldmVuSW1hZ1ZhbHMpO1xuICAgIGNvbnN0IGV2ZW5UZW5zb3JJbmZvID0gY29tcGxleCh7IGlucHV0czogeyByZWFsOiBldmVuUmVhbEluZm8sIGltYWc6IGV2ZW5JbWFnSW5mbyB9LCBiYWNrZW5kOiBjcHVCYWNrZW5kIH0pO1xuICAgIGNvbnN0IG9kZENvbXBsZXggPSBiYWNrZW5kX3V0aWwuY29tcGxleFdpdGhPZGRJbmRleChkYXRhKTtcbiAgICBjb25zdCBvZGRSZWFsVmFscyA9IG9kZENvbXBsZXgucmVhbDtcbiAgICBjb25zdCBvZGRJbWFnVmFscyA9IG9kZENvbXBsZXguaW1hZztcbiAgICBjb25zdCBvZGRTaGFwZSA9IFtvZGRSZWFsVmFscy5sZW5ndGhdO1xuICAgIGNvbnN0IG9kZFJlYWxJbmZvID0gY3B1QmFja2VuZC5tYWtlVGVuc29ySW5mbyhvZGRTaGFwZSwgJ2Zsb2F0MzInLCBvZGRSZWFsVmFscyk7XG4gICAgY29uc3Qgb2RkSW1hZ0luZm8gPSBjcHVCYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG9kZFNoYXBlLCAnZmxvYXQzMicsIG9kZEltYWdWYWxzKTtcbiAgICBjb25zdCBvZGRUZW5zb3JJbmZvID0gY29tcGxleCh7IGlucHV0czogeyByZWFsOiBvZGRSZWFsSW5mbywgaW1hZzogb2RkSW1hZ0luZm8gfSwgYmFja2VuZDogY3B1QmFja2VuZCB9KTtcbiAgICAvLyBSZWN1cnNpdmUgY2FsbCBmb3IgaGFsZiBwYXJ0IG9mIG9yaWdpbmFsIGlucHV0LlxuICAgIGNvbnN0ICRldmVuQ29tcGxleCA9IGZmdFJhZGl4MihldmVuUmVhbFZhbHMsIGV2ZW5JbWFnVmFscywgaGFsZiwgaW52ZXJzZSwgY3B1QmFja2VuZCk7XG4gICAgY29uc3QgJGV2ZW5SZWFsVmFscyA9ICRldmVuQ29tcGxleC5yZWFsO1xuICAgIGNvbnN0ICRldmVuSW1hZ1ZhbHMgPSAkZXZlbkNvbXBsZXguaW1hZztcbiAgICBjb25zdCAkZXZlblNoYXBlID0gWyRldmVuUmVhbFZhbHMubGVuZ3RoXTtcbiAgICBjb25zdCAkZXZlblJlYWxJbmZvID0gY3B1QmFja2VuZC5tYWtlVGVuc29ySW5mbygkZXZlblNoYXBlLCAnZmxvYXQzMicsICRldmVuUmVhbFZhbHMpO1xuICAgIGNvbnN0ICRldmVuSW1hZ0luZm8gPSBjcHVCYWNrZW5kLm1ha2VUZW5zb3JJbmZvKCRldmVuU2hhcGUsICdmbG9hdDMyJywgJGV2ZW5JbWFnVmFscyk7XG4gICAgY29uc3QgJGV2ZW5UZW5zb3JJbmZvID0gY29tcGxleCh7XG4gICAgICAgIGlucHV0czogeyByZWFsOiAkZXZlblJlYWxJbmZvLCBpbWFnOiAkZXZlbkltYWdJbmZvIH0sXG4gICAgICAgIGJhY2tlbmQ6IGNwdUJhY2tlbmRcbiAgICB9KTtcbiAgICBjb25zdCAkb2RkQ29tcGxleCA9IGZmdFJhZGl4MihvZGRSZWFsVmFscywgb2RkSW1hZ1ZhbHMsIGhhbGYsIGludmVyc2UsIGNwdUJhY2tlbmQpO1xuICAgIGNvbnN0ICRvZGRSZWFsVmFscyA9ICRvZGRDb21wbGV4LnJlYWw7XG4gICAgY29uc3QgJG9kZEltYWdWYWxzID0gJG9kZENvbXBsZXguaW1hZztcbiAgICBjb25zdCAkb2RkU2hhcGUgPSBbJG9kZFJlYWxWYWxzLmxlbmd0aF07XG4gICAgY29uc3QgJG9kZFJlYWxJbmZvID0gY3B1QmFja2VuZC5tYWtlVGVuc29ySW5mbygkb2RkU2hhcGUsICdmbG9hdDMyJywgJG9kZFJlYWxWYWxzKTtcbiAgICBjb25zdCAkb2RkSW1hZ0luZm8gPSBjcHVCYWNrZW5kLm1ha2VUZW5zb3JJbmZvKCRvZGRTaGFwZSwgJ2Zsb2F0MzInLCAkb2RkSW1hZ1ZhbHMpO1xuICAgIGNvbnN0ICRvZGRUZW5zb3JJbmZvID0gY29tcGxleCh7IGlucHV0czogeyByZWFsOiAkb2RkUmVhbEluZm8sIGltYWc6ICRvZGRJbWFnSW5mbyB9LCBiYWNrZW5kOiBjcHVCYWNrZW5kIH0pO1xuICAgIGNvbnN0IGUgPSBiYWNrZW5kX3V0aWwuZXhwb25lbnRzKHNpemUsIGludmVyc2UpO1xuICAgIGNvbnN0IGVTaGFwZSA9IFtlLnJlYWwubGVuZ3RoXTtcbiAgICBjb25zdCBlUmVhbEluZm8gPSBjcHVCYWNrZW5kLm1ha2VUZW5zb3JJbmZvKGVTaGFwZSwgJ2Zsb2F0MzInLCBlLnJlYWwpO1xuICAgIGNvbnN0IGVJbWFnSW5mbyA9IGNwdUJhY2tlbmQubWFrZVRlbnNvckluZm8oZVNoYXBlLCAnZmxvYXQzMicsIGUuaW1hZyk7XG4gICAgY29uc3QgY29tcGxleEluZm8gPSBjb21wbGV4KHsgaW5wdXRzOiB7IHJlYWw6IGVSZWFsSW5mbywgaW1hZzogZUltYWdJbmZvIH0sIGJhY2tlbmQ6IGNwdUJhY2tlbmQgfSk7XG4gICAgY29uc3QgZXhwb25lbnRJbmZvID0gbXVsdGlwbHkoeyBpbnB1dHM6IHsgYTogY29tcGxleEluZm8sIGI6ICRvZGRUZW5zb3JJbmZvIH0sIGJhY2tlbmQ6IGNwdUJhY2tlbmQgfSk7XG4gICAgY29uc3QgYWRkUGFydCA9IGFkZCh7XG4gICAgICAgIGlucHV0czogeyBhOiAkZXZlblRlbnNvckluZm8sIGI6IGV4cG9uZW50SW5mbyB9LFxuICAgICAgICBiYWNrZW5kOiBjcHVCYWNrZW5kXG4gICAgfSk7XG4gICAgY29uc3Qgc3ViUGFydCA9IHN1Yih7XG4gICAgICAgIGlucHV0czogeyBhOiAkZXZlblRlbnNvckluZm8sIGI6IGV4cG9uZW50SW5mbyB9LFxuICAgICAgICBiYWNrZW5kOiBjcHVCYWNrZW5kXG4gICAgfSk7XG4gICAgY29uc3QgYWRkUGFydFJlYWwgPSByZWFsKHsgaW5wdXRzOiB7IGlucHV0OiBhZGRQYXJ0IH0sIGJhY2tlbmQ6IGNwdUJhY2tlbmQgfSk7XG4gICAgY29uc3Qgc3ViUGFydFJlYWwgPSByZWFsKHsgaW5wdXRzOiB7IGlucHV0OiBzdWJQYXJ0IH0sIGJhY2tlbmQ6IGNwdUJhY2tlbmQgfSk7XG4gICAgY29uc3QgYWRkUGFydEltYWcgPSBpbWFnKHsgaW5wdXRzOiB7IGlucHV0OiBhZGRQYXJ0IH0sIGJhY2tlbmQ6IGNwdUJhY2tlbmQgfSk7XG4gICAgY29uc3Qgc3ViUGFydEltYWcgPSBpbWFnKHsgaW5wdXRzOiB7IGlucHV0OiBzdWJQYXJ0IH0sIGJhY2tlbmQ6IGNwdUJhY2tlbmQgfSk7XG4gICAgY29uc3QgJHJlYWwgPSBjb25jYXQoe1xuICAgICAgICBpbnB1dHM6IFthZGRQYXJ0UmVhbCwgc3ViUGFydFJlYWxdLFxuICAgICAgICBiYWNrZW5kOiBjcHVCYWNrZW5kLFxuICAgICAgICBhdHRyczogeyBheGlzOiAwIH1cbiAgICB9KTtcbiAgICBjb25zdCAkaW1hZyA9IGNvbmNhdCh7XG4gICAgICAgIGlucHV0czogW2FkZFBhcnRJbWFnLCBzdWJQYXJ0SW1hZ10sXG4gICAgICAgIGJhY2tlbmQ6IGNwdUJhY2tlbmQsXG4gICAgICAgIGF0dHJzOiB7IGF4aXM6IDAgfVxuICAgIH0pO1xuICAgIGNvbnN0ICRyZWFsVmFscyA9IGNwdUJhY2tlbmQuZGF0YS5nZXQoJHJlYWwuZGF0YUlkKS52YWx1ZXM7XG4gICAgY29uc3QgJGltYWdWYWxzID0gY3B1QmFja2VuZC5kYXRhLmdldCgkaW1hZy5kYXRhSWQpLnZhbHVlcztcbiAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGV2ZW5SZWFsSW5mbyk7XG4gICAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhldmVuSW1hZ0luZm8pO1xuICAgIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oZXZlblRlbnNvckluZm8pO1xuICAgIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ob2RkUmVhbEluZm8pO1xuICAgIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ob2RkSW1hZ0luZm8pO1xuICAgIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ob2RkVGVuc29ySW5mbyk7XG4gICAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbygkZXZlblJlYWxJbmZvKTtcbiAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKCRldmVuSW1hZ0luZm8pO1xuICAgIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oJGV2ZW5UZW5zb3JJbmZvKTtcbiAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKCRvZGRSZWFsSW5mbyk7XG4gICAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbygkb2RkSW1hZ0luZm8pO1xuICAgIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oJG9kZFRlbnNvckluZm8pO1xuICAgIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oZVJlYWxJbmZvKTtcbiAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGVJbWFnSW5mbyk7XG4gICAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhjb21wbGV4SW5mbyk7XG4gICAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhleHBvbmVudEluZm8pO1xuICAgIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oYWRkUGFydCk7XG4gICAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhzdWJQYXJ0KTtcbiAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGFkZFBhcnRSZWFsKTtcbiAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGFkZFBhcnRJbWFnKTtcbiAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHN1YlBhcnRSZWFsKTtcbiAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHN1YlBhcnRJbWFnKTtcbiAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKCRyZWFsKTtcbiAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKCRpbWFnKTtcbiAgICByZXR1cm4geyByZWFsOiAkcmVhbFZhbHMsIGltYWc6ICRpbWFnVmFscyB9O1xufVxuLy8gQ2FsY3VsYXRlIGZvdXJpZXIgdHJhbnNmb3JtIGJ5IG11bHRwbHlpbmcgc2ludXNvaWQgbWF0cml4LlxuZnVuY3Rpb24gZm91cmllclRyYW5zZm9ybUJ5TWF0bXVsKGRhdGEsIHNpemUsIGludmVyc2UpIHtcbiAgICBjb25zdCByZXQgPSBuZXcgRmxvYXQzMkFycmF5KHNpemUgKiAyKTtcbiAgICAvLyBUT0RPOiBVc2UgbWF0bXVsIGluc3RlYWQgb25jZSBpdCBzdXBwb3J0cyBjb21wbGV4NjQgdHlwZS5cbiAgICBmb3IgKGxldCByID0gMDsgciA8IHNpemU7IHIrKykge1xuICAgICAgICBsZXQgcmVhbCA9IDAuMDtcbiAgICAgICAgbGV0IGltYWcgPSAwLjA7XG4gICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgc2l6ZTsgYysrKSB7XG4gICAgICAgICAgICBjb25zdCBlID0gYmFja2VuZF91dGlsLmV4cG9uZW50KHIgKiBjLCBzaXplLCBpbnZlcnNlKTtcbiAgICAgICAgICAgIGNvbnN0IHRlcm0gPSBiYWNrZW5kX3V0aWwuZ2V0Q29tcGxleFdpdGhJbmRleChkYXRhLCBjKTtcbiAgICAgICAgICAgIHJlYWwgKz0gdGVybS5yZWFsICogZS5yZWFsIC0gdGVybS5pbWFnICogZS5pbWFnO1xuICAgICAgICAgICAgaW1hZyArPSB0ZXJtLnJlYWwgKiBlLmltYWcgKyB0ZXJtLmltYWcgKiBlLnJlYWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGludmVyc2UpIHtcbiAgICAgICAgICAgIHJlYWwgLz0gc2l6ZTtcbiAgICAgICAgICAgIGltYWcgLz0gc2l6ZTtcbiAgICAgICAgfVxuICAgICAgICBiYWNrZW5kX3V0aWwuYXNzaWduVG9UeXBlZEFycmF5KHJldCwgcmVhbCwgaW1hZywgcik7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mZnRfdXRpbHMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgZWx1IH0gZnJvbSAnLi4va2VybmVscy9FbHUnO1xuaW1wb3J0IHsgaWRlbnRpdHkgfSBmcm9tICcuLi9rZXJuZWxzL0lkZW50aXR5JztcbmltcG9ydCB7IGxlYWt5UmVsdSB9IGZyb20gJy4uL2tlcm5lbHMvTGVha3lSZWx1JztcbmltcG9ydCB7IHByZWx1IH0gZnJvbSAnLi4va2VybmVscy9QcmVsdSc7XG5pbXBvcnQgeyByZWx1IH0gZnJvbSAnLi4va2VybmVscy9SZWx1JztcbmltcG9ydCB7IHJlbHU2IH0gZnJvbSAnLi4va2VybmVscy9SZWx1Nic7XG5pbXBvcnQgeyBzaWdtb2lkIH0gZnJvbSAnLi4va2VybmVscy9TaWdtb2lkJztcbmV4cG9ydCBmdW5jdGlvbiBhcHBseUFjdGl2YXRpb24oYmFja2VuZCwgeCwgYWN0aXZhdGlvbiwgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cywgbGVha3lyZWx1QWxwaGEpIHtcbiAgICBpZiAoYWN0aXZhdGlvbiA9PT0gJ2xpbmVhcicpIHtcbiAgICAgICAgcmV0dXJuIGlkZW50aXR5KHsgaW5wdXRzOiB7IHggfSwgYmFja2VuZCB9KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYWN0aXZhdGlvbiA9PT0gJ3JlbHUnKSB7XG4gICAgICAgIHJldHVybiByZWx1KHsgaW5wdXRzOiB7IHggfSwgYmFja2VuZCB9KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYWN0aXZhdGlvbiA9PT0gJ2VsdScpIHtcbiAgICAgICAgcmV0dXJuIGVsdSh7IGlucHV0czogeyB4IH0sIGJhY2tlbmQgfSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFjdGl2YXRpb24gPT09ICdyZWx1NicpIHtcbiAgICAgICAgcmV0dXJuIHJlbHU2KHsgaW5wdXRzOiB7IHggfSwgYmFja2VuZCB9KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYWN0aXZhdGlvbiA9PT0gJ3ByZWx1Jykge1xuICAgICAgICByZXR1cm4gcHJlbHUoeyBpbnB1dHM6IHsgeCwgYWxwaGE6IHByZWx1QWN0aXZhdGlvbldlaWdodHMgfSwgYmFja2VuZCB9KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYWN0aXZhdGlvbiA9PT0gJ2xlYWt5cmVsdScpIHtcbiAgICAgICAgcmV0dXJuIGxlYWt5UmVsdSh7IGlucHV0czogeyB4IH0sIGJhY2tlbmQsIGF0dHJzOiB7IGFscGhhOiBsZWFreXJlbHVBbHBoYSB9IH0pO1xuICAgIH1cbiAgICBlbHNlIGlmIChhY3RpdmF0aW9uID09PSAnc2lnbW9pZCcpIHtcbiAgICAgICAgcmV0dXJuIHNpZ21vaWQoeyBpbnB1dHM6IHsgeCB9LCBiYWNrZW5kIH0pO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYEFjdGl2YXRpb24gJHthY3RpdmF0aW9ufSBoYXMgbm90IGJlZW4gaW1wbGVtZW50ZWQgZm9yIHRoZSBDUFUgYmFja2VuZC5gKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZ1c2VkX3V0aWxzLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJ1ZmZlciB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5leHBvcnQgZnVuY3Rpb24gcG9vbCh4VmFsdWVzLCB4U2hhcGUsIGR0eXBlLCBzdHJpZGVzLCBjb252SW5mbywgcG9vbFR5cGUpIHtcbiAgICBjb25zdCBzdHJpZGVIZWlnaHQgPSBjb252SW5mby5zdHJpZGVIZWlnaHQ7XG4gICAgY29uc3Qgc3RyaWRlV2lkdGggPSBjb252SW5mby5zdHJpZGVXaWR0aDtcbiAgICBjb25zdCBkaWxhdGlvbkhlaWdodCA9IGNvbnZJbmZvLmRpbGF0aW9uSGVpZ2h0O1xuICAgIGNvbnN0IGRpbGF0aW9uV2lkdGggPSBjb252SW5mby5kaWxhdGlvbldpZHRoO1xuICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlckhlaWdodCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlckhlaWdodDtcbiAgICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlcldpZHRoO1xuICAgIGNvbnN0IHBhZFRvcCA9IGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICAgIGNvbnN0IHBhZExlZnQgPSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG4gICAgY29uc3QgaW5pdGlhbFZhbHVlID0gKHBvb2xUeXBlID09PSAnbWF4JyA/IE51bWJlci5ORUdBVElWRV9JTkZJTklUWSA6XG4gICAgICAgIE51bWJlci5QT1NJVElWRV9JTkZJTklUWSk7XG4gICAgY29uc3Qgb3V0cHV0ID0gYnVmZmVyKGNvbnZJbmZvLm91dFNoYXBlLCBkdHlwZSk7XG4gICAgY29uc3Qgb3V0cHV0VmFscyA9IG91dHB1dC52YWx1ZXM7XG4gICAgY29uc3Qgb3V0cHV0QmF0Y2hTdHJpZGVzID0gY29udkluZm8ub3V0U2hhcGVbMV0gKiBjb252SW5mby5vdXRTaGFwZVsyXSAqIGNvbnZJbmZvLm91dFNoYXBlWzNdO1xuICAgIGNvbnN0IG91dHB1dFJvd1N0cmlkZXMgPSBjb252SW5mby5vdXRTaGFwZVsyXSAqIGNvbnZJbmZvLm91dFNoYXBlWzNdO1xuICAgIGNvbnN0IG91dHB1dENvbFN0cmlkZXMgPSBjb252SW5mby5vdXRTaGFwZVszXTtcbiAgICBmb3IgKGxldCBiID0gMDsgYiA8IGNvbnZJbmZvLmJhdGNoU2l6ZTsgKytiKSB7XG4gICAgICAgIGNvbnN0IG91dHB1dEJhdGNoT2Zmc2V0ID0gYiAqIG91dHB1dEJhdGNoU3RyaWRlcztcbiAgICAgICAgY29uc3QgaW5wdXRCYXRjaE9mZnNldCA9IGIgKiBzdHJpZGVzWzBdO1xuICAgICAgICBmb3IgKGxldCBkID0gMDsgZCA8IGNvbnZJbmZvLmluQ2hhbm5lbHM7ICsrZCkge1xuICAgICAgICAgICAgZm9yIChsZXQgeVIgPSAwOyB5UiA8IGNvbnZJbmZvLm91dEhlaWdodDsgKyt5Uikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHhSQ29ybmVyID0geVIgKiBzdHJpZGVIZWlnaHQgLSBwYWRUb3A7XG4gICAgICAgICAgICAgICAgY29uc3QgeFJNaW4gPSBNYXRoLm1heCgwLCB4UkNvcm5lcik7XG4gICAgICAgICAgICAgICAgY29uc3QgeFJNYXggPSBNYXRoLm1pbihjb252SW5mby5pbkhlaWdodCwgZWZmZWN0aXZlRmlsdGVySGVpZ2h0ICsgeFJDb3JuZXIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG91dHB1dFJvd09mZnNldCA9IG91dHB1dEJhdGNoT2Zmc2V0ICsgeVIgKiBvdXRwdXRSb3dTdHJpZGVzO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHlDID0gMDsgeUMgPCBjb252SW5mby5vdXRXaWR0aDsgKyt5Qykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB4Q0Nvcm5lciA9IHlDICogc3RyaWRlV2lkdGggLSBwYWRMZWZ0O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB4Q01pbiA9IE1hdGgubWF4KDAsIHhDQ29ybmVyKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeENNYXggPSBNYXRoLm1pbihjb252SW5mby5pbldpZHRoLCBlZmZlY3RpdmVGaWx0ZXJXaWR0aCArIHhDQ29ybmVyKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1pbk1heFZhbHVlID0gaW5pdGlhbFZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBsZXQgYXZnVmFsdWUgPSAwO1xuICAgICAgICAgICAgICAgICAgICBsZXQgY291bnQgPSAwO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB4UiA9IHhSTWluOyB4UiA8IHhSTWF4OyB4UiArPSBkaWxhdGlvbkhlaWdodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeFJPZmZzZXQgPSBpbnB1dEJhdGNoT2Zmc2V0ICsgeFIgKiBzdHJpZGVzWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgeEMgPSB4Q01pbjsgeEMgPCB4Q01heDsgeEMgKz0gZGlsYXRpb25XaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhDT2Zmc2V0ID0geFJPZmZzZXQgKyB4QyAqIHN0cmlkZXNbMl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGl4ZWwgPSB4VmFsdWVzW3hDT2Zmc2V0ICsgZF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwb29sVHlwZSA9PT0gJ21heCcgJiYgcGl4ZWwgPiBtaW5NYXhWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluTWF4VmFsdWUgPSBwaXhlbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocG9vbFR5cGUgPT09ICdhdmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Z1ZhbHVlICs9IHBpeGVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc05hTihtaW5NYXhWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBvdXRwdXRPZmZzZXQgPSBvdXRwdXRSb3dPZmZzZXQgKyB5QyAqIG91dHB1dENvbFN0cmlkZXMgKyBkO1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXRWYWxzW291dHB1dE9mZnNldF0gPVxuICAgICAgICAgICAgICAgICAgICAgICAgcG9vbFR5cGUgPT09ICdhdmcnID8gYXZnVmFsdWUgLyBjb3VudCA6IG1pbk1heFZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0O1xufVxuZXhwb3J0IGZ1bmN0aW9uIG1heFBvb2xQb3NpdGlvbnMoeFZhbHVlcywgeFNoYXBlLCBkdHlwZSwgY29udkluZm8sIGZsYXR0ZW5Qb3NpdGlvbnMgPSBmYWxzZSwgaW5jbHVkZUJhdGNoSW5JbmRleCA9IGZhbHNlKSB7XG4gICAgY29uc3QgbWF4UG9zaXRpb25zID0gYnVmZmVyKGNvbnZJbmZvLm91dFNoYXBlLCAnaW50MzInKTtcbiAgICBjb25zdCBzdHJpZGVIZWlnaHQgPSBjb252SW5mby5zdHJpZGVIZWlnaHQ7XG4gICAgY29uc3Qgc3RyaWRlV2lkdGggPSBjb252SW5mby5zdHJpZGVXaWR0aDtcbiAgICBjb25zdCBkaWxhdGlvbkhlaWdodCA9IGNvbnZJbmZvLmRpbGF0aW9uSGVpZ2h0O1xuICAgIGNvbnN0IGRpbGF0aW9uV2lkdGggPSBjb252SW5mby5kaWxhdGlvbldpZHRoO1xuICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlckhlaWdodCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlckhlaWdodDtcbiAgICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlcldpZHRoO1xuICAgIGNvbnN0IHBhZFRvcCA9IGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICAgIGNvbnN0IHBhZExlZnQgPSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG4gICAgY29uc3QgeEJ1ZiA9IGJ1ZmZlcih4U2hhcGUsIGR0eXBlLCB4VmFsdWVzKTtcbiAgICBmb3IgKGxldCBiID0gMDsgYiA8IGNvbnZJbmZvLmJhdGNoU2l6ZTsgKytiKSB7XG4gICAgICAgIGZvciAobGV0IGQgPSAwOyBkIDwgY29udkluZm8uaW5DaGFubmVsczsgKytkKSB7XG4gICAgICAgICAgICBmb3IgKGxldCB5UiA9IDA7IHlSIDwgY29udkluZm8ub3V0SGVpZ2h0OyArK3lSKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeFJDb3JuZXIgPSB5UiAqIHN0cmlkZUhlaWdodCAtIHBhZFRvcDtcbiAgICAgICAgICAgICAgICBsZXQgeFJNaW4gPSB4UkNvcm5lcjtcbiAgICAgICAgICAgICAgICB3aGlsZSAoeFJNaW4gPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHhSTWluICs9IGRpbGF0aW9uSGVpZ2h0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBjb25zdCB4Uk1pbiA9IE1hdGgubWF4KDAsIHhSQ29ybmVyKTtcbiAgICAgICAgICAgICAgICBjb25zdCB4Uk1heCA9IE1hdGgubWluKGNvbnZJbmZvLmluSGVpZ2h0LCBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgKyB4UkNvcm5lcik7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgeUMgPSAwOyB5QyA8IGNvbnZJbmZvLm91dFdpZHRoOyArK3lDKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHhDQ29ybmVyID0geUMgKiBzdHJpZGVXaWR0aCAtIHBhZExlZnQ7XG4gICAgICAgICAgICAgICAgICAgIGxldCB4Q01pbiA9IHhDQ29ybmVyO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeENNaW4gPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB4Q01pbiArPSBkaWxhdGlvbldpZHRoO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHhDTWF4ID0gTWF0aC5taW4oY29udkluZm8uaW5XaWR0aCwgZWZmZWN0aXZlRmlsdGVyV2lkdGggKyB4Q0Nvcm5lcik7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtYXhWYWx1ZSA9IE51bWJlci5ORUdBVElWRV9JTkZJTklUWTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1heFBvc2l0aW9uID0gLTE7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHhSID0geFJNaW47IHhSIDwgeFJNYXg7IHhSICs9IGRpbGF0aW9uSGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3UiA9IHhSIC0geFJDb3JuZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB4QyA9IHhDTWluOyB4QyA8IHhDTWF4OyB4QyArPSBkaWxhdGlvbldpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd0MgPSB4QyAtIHhDQ29ybmVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBpeGVsID0geEJ1Zi5nZXQoYiwgeFIsIHhDLCBkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGl4ZWwgPiBtYXhWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhWYWx1ZSA9IHBpeGVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmxhdHRlblBvc2l0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4UG9zaXRpb24gPSBpbmNsdWRlQmF0Y2hJbkluZGV4ID9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGIgKiBjb252SW5mby5pbkhlaWdodCArIHhSKSAqIGNvbnZJbmZvLmluV2lkdGggKyB4QykgKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252SW5mby5pbkNoYW5uZWxzICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZCA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHhSICogY29udkluZm8uaW5XaWR0aCArIHhDKSAqIGNvbnZJbmZvLmluQ2hhbm5lbHMgKyBkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4UG9zaXRpb24gPSB3UiAqIGVmZmVjdGl2ZUZpbHRlcldpZHRoICsgd0M7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWF4UG9zaXRpb25zLnNldChtYXhQb3NpdGlvbiwgYiwgeVIsIHlDLCBkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1heFBvc2l0aW9ucztcbn1cbmV4cG9ydCBmdW5jdGlvbiBwb29sM2QoeFZhbHVlcywgeFNoYXBlLCBkdHlwZSwgc3RyaWRlcywgY29udkluZm8sIHBvb2xUeXBlKSB7XG4gICAgY29uc3Qgc3RyaWRlRGVwdGggPSBjb252SW5mby5zdHJpZGVEZXB0aDtcbiAgICBjb25zdCBzdHJpZGVIZWlnaHQgPSBjb252SW5mby5zdHJpZGVIZWlnaHQ7XG4gICAgY29uc3Qgc3RyaWRlV2lkdGggPSBjb252SW5mby5zdHJpZGVXaWR0aDtcbiAgICBjb25zdCBkaWxhdGlvbkRlcHRoID0gY29udkluZm8uZGlsYXRpb25EZXB0aDtcbiAgICBjb25zdCBkaWxhdGlvbkhlaWdodCA9IGNvbnZJbmZvLmRpbGF0aW9uSGVpZ2h0O1xuICAgIGNvbnN0IGRpbGF0aW9uV2lkdGggPSBjb252SW5mby5kaWxhdGlvbldpZHRoO1xuICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlckRlcHRoID0gY29udkluZm8uZWZmZWN0aXZlRmlsdGVyRGVwdGg7XG4gICAgY29uc3QgZWZmZWN0aXZlRmlsdGVySGVpZ2h0ID0gY29udkluZm8uZWZmZWN0aXZlRmlsdGVySGVpZ2h0O1xuICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlcldpZHRoID0gY29udkluZm8uZWZmZWN0aXZlRmlsdGVyV2lkdGg7XG4gICAgY29uc3QgcGFkRnJvbnQgPSBjb252SW5mby5wYWRJbmZvLmZyb250O1xuICAgIGNvbnN0IHBhZFRvcCA9IGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICAgIGNvbnN0IHBhZExlZnQgPSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG4gICAgY29uc3QgaW5pdGlhbFZhbHVlID0gKHBvb2xUeXBlID09PSAnbWF4JyA/IE51bWJlci5ORUdBVElWRV9JTkZJTklUWSA6XG4gICAgICAgIE51bWJlci5QT1NJVElWRV9JTkZJTklUWSk7XG4gICAgY29uc3Qgb3V0cHV0ID0gYnVmZmVyKGNvbnZJbmZvLm91dFNoYXBlLCBkdHlwZSk7XG4gICAgY29uc3Qgb3V0cHV0VmFscyA9IG91dHB1dC52YWx1ZXM7XG4gICAgY29uc3Qgb3V0cHV0QmF0Y2hTdHJpZGVzID0gY29udkluZm8ub3V0U2hhcGVbMV0gKiBjb252SW5mby5vdXRTaGFwZVsyXSAqXG4gICAgICAgIGNvbnZJbmZvLm91dFNoYXBlWzNdICogY29udkluZm8ub3V0U2hhcGVbNF07XG4gICAgY29uc3Qgb3V0cHV0RGVwdGhTdHJpZGVzID0gY29udkluZm8ub3V0U2hhcGVbMl0gKiBjb252SW5mby5vdXRTaGFwZVszXSAqIGNvbnZJbmZvLm91dFNoYXBlWzRdO1xuICAgIGNvbnN0IG91dHB1dFJvd1N0cmlkZXMgPSBjb252SW5mby5vdXRTaGFwZVszXSAqIGNvbnZJbmZvLm91dFNoYXBlWzRdO1xuICAgIGNvbnN0IG91dHB1dENvbFN0cmlkZXMgPSBjb252SW5mby5vdXRTaGFwZVs0XTtcbiAgICBmb3IgKGxldCBiYXRjaCA9IDA7IGJhdGNoIDwgY29udkluZm8uYmF0Y2hTaXplOyArK2JhdGNoKSB7XG4gICAgICAgIGNvbnN0IG91dHB1dEJhdGNoT2Zmc2V0ID0gYmF0Y2ggKiBvdXRwdXRCYXRjaFN0cmlkZXM7XG4gICAgICAgIGNvbnN0IGlucHV0QmF0Y2hPZmZzZXQgPSBiYXRjaCAqIHN0cmlkZXNbMF07XG4gICAgICAgIGZvciAobGV0IGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgY29udkluZm8uaW5DaGFubmVsczsgKytjaGFubmVsKSB7XG4gICAgICAgICAgICBmb3IgKGxldCB5RGVwdGggPSAwOyB5RGVwdGggPCBjb252SW5mby5vdXREZXB0aDsgKyt5RGVwdGgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB4RGVwdGhDb3JuZXIgPSB5RGVwdGggKiBzdHJpZGVEZXB0aCAtIHBhZEZyb250O1xuICAgICAgICAgICAgICAgIGxldCB4RGVwdGhNaW4gPSB4RGVwdGhDb3JuZXI7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHhEZXB0aE1pbiA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgeERlcHRoTWluICs9IGRpbGF0aW9uRGVwdGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHhEZXB0aE1heCA9IE1hdGgubWluKGNvbnZJbmZvLmluRGVwdGgsIGVmZmVjdGl2ZUZpbHRlckRlcHRoICsgeERlcHRoQ29ybmVyKTtcbiAgICAgICAgICAgICAgICBjb25zdCBvdXRwdXREZXB0aE9mZnNldCA9IG91dHB1dEJhdGNoT2Zmc2V0ICsgeURlcHRoICogb3V0cHV0RGVwdGhTdHJpZGVzO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHlSb3cgPSAwOyB5Um93IDwgY29udkluZm8ub3V0SGVpZ2h0OyArK3lSb3cpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeFJvd0Nvcm5lciA9IHlSb3cgKiBzdHJpZGVIZWlnaHQgLSBwYWRUb3A7XG4gICAgICAgICAgICAgICAgICAgIGxldCB4Um93TWluID0geFJvd0Nvcm5lcjtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhSb3dNaW4gPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB4Um93TWluICs9IGRpbGF0aW9uSGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHhSb3dNYXggPSBNYXRoLm1pbihjb252SW5mby5pbkhlaWdodCwgZWZmZWN0aXZlRmlsdGVySGVpZ2h0ICsgeFJvd0Nvcm5lcik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG91dHB1dFJvd09mZnNldCA9IG91dHB1dERlcHRoT2Zmc2V0ICsgeVJvdyAqIG91dHB1dFJvd1N0cmlkZXM7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHlDb2wgPSAwOyB5Q29sIDwgY29udkluZm8ub3V0V2lkdGg7ICsreUNvbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeENvbENvcm5lciA9IHlDb2wgKiBzdHJpZGVXaWR0aCAtIHBhZExlZnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgeENvbE1pbiA9IHhDb2xDb3JuZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeENvbE1pbiA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Q29sTWluICs9IGRpbGF0aW9uV2lkdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4Q29sTWF4ID0gTWF0aC5taW4oY29udkluZm8uaW5XaWR0aCwgZWZmZWN0aXZlRmlsdGVyV2lkdGggKyB4Q29sQ29ybmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNoYWRlciBjb2RlIGJlZ2luc1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3V0cHV0Q29sT2Zmc2V0ID0gb3V0cHV0Um93T2Zmc2V0ICsgeUNvbCAqIG91dHB1dENvbFN0cmlkZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbWluTWF4VmFsdWUgPSBpbml0aWFsVmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXZnVmFsdWUgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvdW50ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHhEZXB0aCA9IHhEZXB0aE1pbjsgeERlcHRoIDwgeERlcHRoTWF4OyB4RGVwdGggKz0gZGlsYXRpb25EZXB0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhEZXB0aE9mZnNldCA9IGlucHV0QmF0Y2hPZmZzZXQgKyB4RGVwdGggKiBzdHJpZGVzWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHhSb3cgPSB4Um93TWluOyB4Um93IDwgeFJvd01heDsgeFJvdyArPSBkaWxhdGlvbkhlaWdodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4Um93T2Zmc2V0ID0geERlcHRoT2Zmc2V0ICsgeFJvdyAqIHN0cmlkZXNbMl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHhDb2wgPSB4Q29sTWluOyB4Q29sIDwgeENvbE1heDsgeENvbCArPSBkaWxhdGlvbldpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4Q29sT2Zmc2V0ID0geFJvd09mZnNldCArIHhDb2wgKiBzdHJpZGVzWzNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGl4ZWwgPSB4VmFsdWVzW3hDb2xPZmZzZXQgKyBjaGFubmVsXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocG9vbFR5cGUgPT09ICdtYXgnICYmIHBpeGVsID4gbWluTWF4VmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluTWF4VmFsdWUgPSBwaXhlbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBvb2xUeXBlID09PSAnYXZnJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Z1ZhbHVlICs9IHBpeGVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNOYU4obWluTWF4VmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzTmFOKG1pbk1heFZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzTmFOKG1pbk1heFZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvdXRwdXRPZmZzZXQgPSBvdXRwdXRDb2xPZmZzZXQgKyBjaGFubmVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0VmFsc1tvdXRwdXRPZmZzZXRdID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb29sVHlwZSA9PT0gJ2F2ZycgPyBhdmdWYWx1ZSAvIGNvdW50IDogbWluTWF4VmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBtYXhQb29sM2RQb3NpdGlvbnMoeEJ1ZiwgY29udkluZm8pIHtcbiAgICBjb25zdCBtYXhQb3NpdGlvbnMgPSBidWZmZXIoY29udkluZm8ub3V0U2hhcGUsICdpbnQzMicpO1xuICAgIGNvbnN0IHN0cmlkZURlcHRoID0gY29udkluZm8uc3RyaWRlRGVwdGg7XG4gICAgY29uc3Qgc3RyaWRlSGVpZ2h0ID0gY29udkluZm8uc3RyaWRlSGVpZ2h0O1xuICAgIGNvbnN0IHN0cmlkZVdpZHRoID0gY29udkluZm8uc3RyaWRlV2lkdGg7XG4gICAgY29uc3QgZGlsYXRpb25EZXB0aCA9IGNvbnZJbmZvLmRpbGF0aW9uRGVwdGg7XG4gICAgY29uc3QgZGlsYXRpb25IZWlnaHQgPSBjb252SW5mby5kaWxhdGlvbkhlaWdodDtcbiAgICBjb25zdCBkaWxhdGlvbldpZHRoID0gY29udkluZm8uZGlsYXRpb25XaWR0aDtcbiAgICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJEZXB0aCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlckRlcHRoO1xuICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlckhlaWdodCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlckhlaWdodDtcbiAgICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlcldpZHRoO1xuICAgIGNvbnN0IHBhZEZyb250ID0gY29udkluZm8ucGFkSW5mby5mcm9udDtcbiAgICBjb25zdCBwYWRUb3AgPSBjb252SW5mby5wYWRJbmZvLnRvcDtcbiAgICBjb25zdCBwYWRMZWZ0ID0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuICAgIGZvciAobGV0IGJhdGNoID0gMDsgYmF0Y2ggPCBjb252SW5mby5iYXRjaFNpemU7ICsrYmF0Y2gpIHtcbiAgICAgICAgZm9yIChsZXQgY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBjb252SW5mby5pbkNoYW5uZWxzOyArK2NoYW5uZWwpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHlEZXB0aCA9IDA7IHlEZXB0aCA8IGNvbnZJbmZvLm91dERlcHRoOyArK3lEZXB0aCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHhEZXB0aENvcm5lciA9IHlEZXB0aCAqIHN0cmlkZURlcHRoIC0gcGFkRnJvbnQ7XG4gICAgICAgICAgICAgICAgbGV0IHhEZXB0aE1pbiA9IHhEZXB0aENvcm5lcjtcbiAgICAgICAgICAgICAgICB3aGlsZSAoeERlcHRoTWluIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICB4RGVwdGhNaW4gKz0gZGlsYXRpb25EZXB0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgeERlcHRoTWF4ID0gTWF0aC5taW4oY29udkluZm8uaW5EZXB0aCwgZWZmZWN0aXZlRmlsdGVyRGVwdGggKyB4RGVwdGhDb3JuZXIpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHlSb3cgPSAwOyB5Um93IDwgY29udkluZm8ub3V0SGVpZ2h0OyArK3lSb3cpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeFJvd0Nvcm5lciA9IHlSb3cgKiBzdHJpZGVIZWlnaHQgLSBwYWRUb3A7XG4gICAgICAgICAgICAgICAgICAgIGxldCB4Um93TWluID0geFJvd0Nvcm5lcjtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhSb3dNaW4gPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB4Um93TWluICs9IGRpbGF0aW9uSGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHhSb3dNYXggPSBNYXRoLm1pbihjb252SW5mby5pbkhlaWdodCwgZWZmZWN0aXZlRmlsdGVySGVpZ2h0ICsgeFJvd0Nvcm5lcik7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHlDb2wgPSAwOyB5Q29sIDwgY29udkluZm8ub3V0V2lkdGg7ICsreUNvbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeENvbENvcm5lciA9IHlDb2wgKiBzdHJpZGVXaWR0aCAtIHBhZExlZnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgeENvbE1pbiA9IHhDb2xDb3JuZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeENvbE1pbiA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Q29sTWluICs9IGRpbGF0aW9uV2lkdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4Q29sTWF4ID0gTWF0aC5taW4oY29udkluZm8uaW5XaWR0aCwgZWZmZWN0aXZlRmlsdGVyV2lkdGggKyB4Q29sQ29ybmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNoYWRlciBjb2RlIGJlZ2luc1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1heFZhbHVlID0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1heFBvc2l0aW9uID0gLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB4RGVwdGggPSB4RGVwdGhNaW47IHhEZXB0aCA8IHhEZXB0aE1heDsgeERlcHRoICs9IGRpbGF0aW9uRGVwdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3RGVwdGggPSB4RGVwdGggLSB4RGVwdGhDb3JuZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgeFJvdyA9IHhSb3dNaW47IHhSb3cgPCB4Um93TWF4OyB4Um93ICs9IGRpbGF0aW9uSGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdSb3cgPSB4Um93IC0geFJvd0Nvcm5lcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgeENvbCA9IHhDb2xNaW47IHhDb2wgPCB4Q29sTWF4OyB4Q29sICs9IGRpbGF0aW9uV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdDb2wgPSB4Q29sIC0geENvbENvcm5lcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBpeGVsID0geEJ1Zi5nZXQoYmF0Y2gsIHhEZXB0aCwgeFJvdywgeENvbCwgY2hhbm5lbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGl4ZWwgPj0gbWF4VmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhWYWx1ZSA9IHBpeGVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFBvc2l0aW9uID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd0RlcHRoICogZWZmZWN0aXZlRmlsdGVySGVpZ2h0ICogZWZmZWN0aXZlRmlsdGVyV2lkdGggK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd1JvdyAqIGVmZmVjdGl2ZUZpbHRlckhlaWdodCArIHdDb2w7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhQb3NpdGlvbnMuc2V0KG1heFBvc2l0aW9uLCBiYXRjaCwgeURlcHRoLCB5Um93LCB5Q29sLCBjaGFubmVsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWF4UG9zaXRpb25zO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cG9vbF91dGlscy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbi8qKlxuICogVGVtcGxhdGUgdGhhdCBjcmVhdGVzIGltcGxlbWVudGF0aW9uIGZvciB1bmFyeSBvcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNpbXBsZVVuYXJ5SW1wbChvcCkge1xuICAgIHJldHVybiAodmFsdWVzLCBkdHlwZSwgYXR0cnMpID0+IHtcbiAgICAgICAgY29uc3QgbmV3VmFsdWVzID0gdXRpbC5nZXRUeXBlZEFycmF5RnJvbURUeXBlKGR0eXBlLCB2YWx1ZXMubGVuZ3RoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlc1tpXSA9IG9wKHZhbHVlc1tpXSwgYXR0cnMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXdWYWx1ZXM7XG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXVuYXJ5X2ltcGwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBhc3NlcnROb3RDb21wbGV4IH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuLyoqXG4gKiBUZW1wbGF0ZSB0aGF0IGNyZWF0ZXMgYSBgS2VybmVsRnVuY2AgZm9yIHVuYXJ5IG9wcy5cbiAqIEBwYXJhbSBuYW1lIEtlcm5lbCBuYW1lLlxuICogQHBhcmFtIG9wIEEgYFNpbXBsZVVuYXJ5T3BlcmF0aW9uYCBmb3IgdGhlIGtlcm5lbC5cbiAqIEBwYXJhbSBkdHlwZSBPcHRpb25hbC4gSWYgc2V0LCB0aGUgcmVzdWx0IGhhcyB0aGlzIGR0eXBlLiBPdGhlcndpc2UsIHRoZVxuICogICAgIHJlc3VsdCBoYXMgdGhlIHNhbWUgZHR5cGUgYXMgdGhlIGlucHV0LiBUaGlzIGlzIG1haW5seSB1c2VkIGluIGNlcnRhaW5cbiAqICAgICBrZXJuZWxzIHRoYXQgcmV0dXJuIGJvb2wgdHlwZSwgc3VjaCBhcyBpc0Zpbml0ZSwgaXNJbmYsIGV0Yy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVuYXJ5S2VybmVsRnVuYyhuYW1lLCBvcCwgZHR5cGUpIHtcbiAgICByZXR1cm4gKHsgaW5wdXRzLCBhdHRycywgYmFja2VuZCB9KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgICAgICBhc3NlcnROb3RDb21wbGV4KHgsIG5hbWUpO1xuICAgICAgICBpZiAoeC5kdHlwZSA9PT0gJ3N0cmluZycgfHwgZHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VuYXJ5S2VybmVsRnVuYyBkb2VzIG5vdCBzdXBwb3J0IHN0cmluZyBpbnB1dC9vdXRwdXQnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjcHVCYWNrZW5kID0gYmFja2VuZDtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gY3B1QmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzO1xuICAgICAgICBjb25zdCB4U2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZSh4LnNoYXBlKTtcbiAgICAgICAgY29uc3QgJGR0eXBlID0gZHR5cGUgfHwgeC5kdHlwZTtcbiAgICAgICAgY29uc3QgbmV3VmFsdWVzID0gdXRpbC5nZXRBcnJheUZyb21EVHlwZSgkZHR5cGUsIHhTaXplKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB4U2l6ZTsgKytpKSB7XG4gICAgICAgICAgICBuZXdWYWx1ZXNbaV0gPSBvcCh2YWx1ZXNbaV0sIGF0dHJzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY3B1QmFja2VuZC5tYWtlVGVuc29ySW5mbyh4LnNoYXBlLCAkZHR5cGUsIG5ld1ZhbHVlcyk7XG4gICAgfTtcbn1cbi8qKlxuICogVGVtcGxhdGUgdGhhdCBjcmVhdGVzIGEgYEtlcm5lbEZ1bmNgIGZvciB1bmFyeSBvcHMgZnJvbSB0aGUgZ2l2ZW5cbiAqIGBTaW1wbGVVbmFyeUltcGxgLi5cbiAqIEBwYXJhbSBuYW1lIEtlcm5lbCBuYW1lLlxuICogQHBhcmFtIHVuYXJ5SW1wbCBBIGBTaW1wbGVVbmFyeUltcGxgIHRoYXQgaW1wbGVtZW50cyB0aGUgb3AuXG4gKiBAcGFyYW0gZHR5cGUgT3B0aW9uYWwuIElmIHNldCwgdGhlIHJlc3VsdCBoYXMgdGhpcyBkdHlwZS4gT3RoZXJ3aXNlLCB0aGVcbiAqICAgICByZXN1bHQgaGFzIHRoZSBzYW1lIGR0eXBlIGFzIHRoZSBpbnB1dC4gVGhpcyBpcyBtYWlubHkgdXNlZCBpbiBjZXJ0YWluXG4gKiAgICAga2VybmVscyB0aGF0IHJldHVybiBib29sIHR5cGUsIHN1Y2ggYXMgaXNGaW5pdGUsIGlzSW5mLCBldGMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmFyeUtlcm5lbEZ1bmNGcm9tSW1wbChuYW1lLCB1bmFyeUltcGwsIGR0eXBlKSB7XG4gICAgcmV0dXJuICh7IGlucHV0cywgYXR0cnMsIGJhY2tlbmQgfSkgPT4ge1xuICAgICAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICAgICAgYXNzZXJ0Tm90Q29tcGxleCh4LCBuYW1lKTtcbiAgICAgICAgaWYgKHguZHR5cGUgPT09ICdzdHJpbmcnIHx8IGR0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmFyeUtlcm5lbEZ1bmMgZG9lcyBub3Qgc3VwcG9ydCBzdHJpbmcgaW5wdXQvb3V0cHV0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY3B1QmFja2VuZCA9IGJhY2tlbmQ7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IGNwdUJhY2tlbmQuZGF0YS5nZXQoeC5kYXRhSWQpLnZhbHVlcztcbiAgICAgICAgY29uc3QgJGR0eXBlID0gZHR5cGUgfHwgeC5kdHlwZTtcbiAgICAgICAgY29uc3QgbmV3VmFsdWVzID0gdW5hcnlJbXBsKHZhbHVlcywgJGR0eXBlLCBhdHRycyk7XG4gICAgICAgIHJldHVybiBjcHVCYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHguc2hhcGUsICRkdHlwZSwgbmV3VmFsdWVzKTtcbiAgICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dW5hcnlfdXRpbHMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjb21wbGV4IH0gZnJvbSAnLi4va2VybmVscy9Db21wbGV4Jztcbi8qKlxuICogR2VuZXJhdGVzIGEgdGVuc29ySW5mbyB3aXRoIGFsbCB6ZXJvcyB2YWx1ZS5cbiAqIEBwYXJhbSBiYWNrZW5kIGNwdSBiYWNrZW5kLlxuICogQHBhcmFtIHNoYXBlIFNoYXBlIGZvciB0aGUgemVyb3MgdGVuc29yLlxuICogQHBhcmFtIGR0eXBlIE9wdGlvbmFsLiBJZiBzZXQsIHRoZSByZXN1bHQgaGFzIHRoaXMgZHR5cGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB6ZXJvcyhiYWNrZW5kLCBzaGFwZSwgZHR5cGUgPSAnZmxvYXQzMicpIHtcbiAgICBpZiAoZHR5cGUgPT09ICdjb21wbGV4NjQnKSB7XG4gICAgICAgIGNvbnN0IHJlYWwgPSB6ZXJvcyhiYWNrZW5kLCBzaGFwZSwgJ2Zsb2F0MzInKTtcbiAgICAgICAgY29uc3QgaW1hZyA9IHplcm9zKGJhY2tlbmQsIHNoYXBlLCAnZmxvYXQzMicpO1xuICAgICAgICByZXR1cm4gY29tcGxleCh7IGlucHV0czogeyByZWFsLCBpbWFnIH0sIGJhY2tlbmQgfSk7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlcyA9IHV0aWwubWFrZVplcm9zVHlwZWRBcnJheSh1dGlsLnNpemVGcm9tU2hhcGUoc2hhcGUpLCBkdHlwZSk7XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oc2hhcGUsIGR0eXBlLCB2YWx1ZXMpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9emVyb3NfaW1wbC5qcy5tYXAiLCIvKiogQGxpY2Vuc2UgU2VlIHRoZSBMSUNFTlNFIGZpbGUuICovXG4vLyBUaGlzIGNvZGUgaXMgYXV0by1nZW5lcmF0ZWQsIGRvIG5vdCBtb2RpZnkgdGhpcyBmaWxlIVxuY29uc3QgdmVyc2lvbiA9ICczLjguMCc7XG5leHBvcnQgeyB2ZXJzaW9uIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD12ZXJzaW9uLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCAnLi9mbGFnc193YXNtJztcbmltcG9ydCB7IERhdGFTdG9yYWdlLCBkZXByZWNhdGlvbldhcm4sIGVuZ2luZSwgZW52LCBLZXJuZWxCYWNrZW5kLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB3YXNtRmFjdG9yeVRocmVhZGVkU2ltZCBmcm9tICcuLi93YXNtLW91dC90ZmpzLWJhY2tlbmQtd2FzbS10aHJlYWRlZC1zaW1kLmpzJztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IHdhc21Xb3JrZXJDb250ZW50cyB9IGZyb20gJy4uL3dhc20tb3V0L3RmanMtYmFja2VuZC13YXNtLXRocmVhZGVkLXNpbWQud29ya2VyLmpzJztcbmltcG9ydCB3YXNtRmFjdG9yeSBmcm9tICcuLi93YXNtLW91dC90ZmpzLWJhY2tlbmQtd2FzbS5qcyc7XG5leHBvcnQgY2xhc3MgQmFja2VuZFdhc20gZXh0ZW5kcyBLZXJuZWxCYWNrZW5kIHtcbiAgICBjb25zdHJ1Y3Rvcih3YXNtKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMud2FzbSA9IHdhc207XG4gICAgICAgIC8vIDAgaXMgcmVzZXJ2ZWQgZm9yIG51bGwgZGF0YSBpZHMuXG4gICAgICAgIHRoaXMuZGF0YUlkTmV4dE51bWJlciA9IDE7XG4gICAgICAgIHRoaXMud2FzbS50ZmpzLmluaXQoKTtcbiAgICAgICAgdGhpcy5kYXRhSWRNYXAgPSBuZXcgRGF0YVN0b3JhZ2UodGhpcywgZW5naW5lKCkpO1xuICAgIH1cbiAgICB3cml0ZSh2YWx1ZXMsIHNoYXBlLCBkdHlwZSkge1xuICAgICAgICBjb25zdCBkYXRhSWQgPSB7IGlkOiB0aGlzLmRhdGFJZE5leHROdW1iZXIrKyB9O1xuICAgICAgICB0aGlzLm1vdmUoZGF0YUlkLCB2YWx1ZXMsIHNoYXBlLCBkdHlwZSwgMSk7XG4gICAgICAgIHJldHVybiBkYXRhSWQ7XG4gICAgfVxuICAgIG51bURhdGFJZHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFJZE1hcC5udW1EYXRhSWRzKCk7XG4gICAgfVxuICAgIGFzeW5jIHRpbWUoZikge1xuICAgICAgICBjb25zdCBzdGFydCA9IHV0aWwubm93KCk7XG4gICAgICAgIGYoKTtcbiAgICAgICAgY29uc3Qga2VybmVsTXMgPSB1dGlsLm5vdygpIC0gc3RhcnQ7XG4gICAgICAgIHJldHVybiB7IGtlcm5lbE1zIH07XG4gICAgfVxuICAgIG1vdmUoZGF0YUlkLCB2YWx1ZXMsIHNoYXBlLCBkdHlwZSwgcmVmQ291bnQpIHtcbiAgICAgICAgY29uc3QgaWQgPSB0aGlzLmRhdGFJZE5leHROdW1iZXIrKztcbiAgICAgICAgaWYgKGR0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uc3Qgc3RyaW5nQnl0ZXMgPSB2YWx1ZXM7XG4gICAgICAgICAgICB0aGlzLmRhdGFJZE1hcC5zZXQoZGF0YUlkLCB7IGlkLCBzdHJpbmdCeXRlcywgc2hhcGUsIGR0eXBlLCBtZW1vcnlPZmZzZXQ6IG51bGwsIHJlZkNvdW50IH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoc2hhcGUpO1xuICAgICAgICBjb25zdCBudW1CeXRlcyA9IHNpemUgKiB1dGlsLmJ5dGVzUGVyRWxlbWVudChkdHlwZSk7XG4gICAgICAgIGNvbnN0IG1lbW9yeU9mZnNldCA9IHRoaXMud2FzbS5fbWFsbG9jKG51bUJ5dGVzKTtcbiAgICAgICAgdGhpcy5kYXRhSWRNYXAuc2V0KGRhdGFJZCwgeyBpZCwgbWVtb3J5T2Zmc2V0LCBzaGFwZSwgZHR5cGUsIHJlZkNvdW50IH0pO1xuICAgICAgICB0aGlzLndhc20udGZqcy5yZWdpc3RlclRlbnNvcihpZCwgc2l6ZSwgbWVtb3J5T2Zmc2V0KTtcbiAgICAgICAgaWYgKHZhbHVlcyAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLndhc20uSEVBUFU4LnNldChuZXcgVWludDhBcnJheSh2YWx1ZXMuYnVmZmVyLCB2YWx1ZXMuYnl0ZU9mZnNldCwgbnVtQnl0ZXMpLCBtZW1vcnlPZmZzZXQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIHJlYWQoZGF0YUlkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWRTeW5jKGRhdGFJZCk7XG4gICAgfVxuICAgIHJlYWRTeW5jKGRhdGFJZCkge1xuICAgICAgICBjb25zdCB7IG1lbW9yeU9mZnNldCwgZHR5cGUsIHNoYXBlLCBzdHJpbmdCeXRlcyB9ID0gdGhpcy5kYXRhSWRNYXAuZ2V0KGRhdGFJZCk7XG4gICAgICAgIGlmIChkdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmdCeXRlcztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBieXRlcyA9IHRoaXMud2FzbS5IRUFQVTguc2xpY2UobWVtb3J5T2Zmc2V0LCBtZW1vcnlPZmZzZXQgKyB1dGlsLnNpemVGcm9tU2hhcGUoc2hhcGUpICogdXRpbC5ieXRlc1BlckVsZW1lbnQoZHR5cGUpKTtcbiAgICAgICAgcmV0dXJuIHR5cGVkQXJyYXlGcm9tQnVmZmVyKGJ5dGVzLmJ1ZmZlciwgZHR5cGUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEaXNwb3NlIHRoZSBtZW1vcnkgaWYgdGhlIGRhdGFJZCBoYXMgMCByZWZDb3VudC4gUmV0dXJuIHRydWUgaWYgdGhlIG1lbW9yeVxuICAgICAqIGlzIHJlbGVhc2VkLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICogQHBhcmFtIGRhdGFJZFxuICAgICAqIEBvYXJhbSBmb3JjZSBPcHRpb25hbCwgcmVtb3ZlIHRoZSBkYXRhIHJlZ2FyZGxlc3Mgb2YgcmVmQ291bnRcbiAgICAgKi9cbiAgICBkaXNwb3NlRGF0YShkYXRhSWQsIGZvcmNlID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKHRoaXMuZGF0YUlkTWFwLmhhcyhkYXRhSWQpKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5kYXRhSWRNYXAuZ2V0KGRhdGFJZCk7XG4gICAgICAgICAgICBkYXRhLnJlZkNvdW50LS07XG4gICAgICAgICAgICBpZiAoIWZvcmNlICYmIGRhdGEucmVmQ291bnQgPiAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy53YXNtLl9mcmVlKGRhdGEubWVtb3J5T2Zmc2V0KTtcbiAgICAgICAgICAgIHRoaXMud2FzbS50ZmpzLmRpc3Bvc2VEYXRhKGRhdGEuaWQpO1xuICAgICAgICAgICAgdGhpcy5kYXRhSWRNYXAuZGVsZXRlKGRhdGFJZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qKiBSZXR1cm4gcmVmQ291bnQgb2YgYSBgVGVuc29yRGF0YWAuICovXG4gICAgcmVmQ291bnQoZGF0YUlkKSB7XG4gICAgICAgIGlmICh0aGlzLmRhdGFJZE1hcC5oYXMoZGF0YUlkKSkge1xuICAgICAgICAgICAgY29uc3QgdGVuc29yRGF0YSA9IHRoaXMuZGF0YUlkTWFwLmdldChkYXRhSWQpO1xuICAgICAgICAgICAgcmV0dXJuIHRlbnNvckRhdGEucmVmQ291bnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIGluY1JlZihkYXRhSWQpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YUlkTWFwLmdldChkYXRhSWQpO1xuICAgICAgICBpZiAoZGF0YSAhPSBudWxsKSB7XG4gICAgICAgICAgICBkYXRhLnJlZkNvdW50Kys7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZmxvYXRQcmVjaXNpb24oKSB7XG4gICAgICAgIHJldHVybiAzMjtcbiAgICB9XG4gICAgLy8gUmV0dXJucyB0aGUgbWVtb3J5IG9mZnNldCBvZiBhIHRlbnNvci4gVXNlZnVsIGZvciBkZWJ1Z2dpbmcgYW5kIHVuaXRcbiAgICAvLyB0ZXN0aW5nLlxuICAgIGdldE1lbW9yeU9mZnNldChkYXRhSWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YUlkTWFwLmdldChkYXRhSWQpLm1lbW9yeU9mZnNldDtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgdGhpcy53YXNtLnRmanMuZGlzcG9zZSgpO1xuICAgICAgICBpZiAoJ1BUaHJlYWQnIGluIHRoaXMud2FzbSkge1xuICAgICAgICAgICAgdGhpcy53YXNtLlBUaHJlYWQudGVybWluYXRlQWxsVGhyZWFkcygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMud2FzbSA9IG51bGw7XG4gICAgfVxuICAgIG1lbW9yeSgpIHtcbiAgICAgICAgcmV0dXJuIHsgdW5yZWxpYWJsZTogZmFsc2UgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTWFrZSBhIHRlbnNvciBpbmZvIGZvciB0aGUgb3V0cHV0IG9mIGFuIG9wLiBJZiBgbWVtb3J5T2Zmc2V0YCBpcyBub3RcbiAgICAgKiBwcmVzZW50LCB0aGlzIG1ldGhvZCBhbGxvY2F0ZXMgbWVtb3J5IG9uIHRoZSBXQVNNIGhlYXAuIElmIGBtZW1vcnlPZmZzZXRgXG4gICAgICogaXMgcHJlc2VudCwgdGhlIG1lbW9yeSB3YXMgYWxsb2NhdGVkIGVsc2V3aGVyZSAoaW4gYysrKSBhbmQgd2UganVzdCByZWNvcmRcbiAgICAgKiB0aGUgcG9pbnRlciB3aGVyZSB0aGF0IG1lbW9yeSBsaXZlcy5cbiAgICAgKi9cbiAgICBtYWtlT3V0cHV0KHNoYXBlLCBkdHlwZSwgbWVtb3J5T2Zmc2V0KSB7XG4gICAgICAgIGxldCBkYXRhSWQ7XG4gICAgICAgIGlmIChtZW1vcnlPZmZzZXQgPT0gbnVsbCkge1xuICAgICAgICAgICAgZGF0YUlkID0gdGhpcy53cml0ZShudWxsIC8qIHZhbHVlcyAqLywgc2hhcGUsIGR0eXBlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gdGhpcy5kYXRhSWROZXh0TnVtYmVyKys7XG4gICAgICAgICAgICBkYXRhSWQgPSB7IGlkIH07XG4gICAgICAgICAgICB0aGlzLmRhdGFJZE1hcC5zZXQoZGF0YUlkLCB7IGlkLCBtZW1vcnlPZmZzZXQsIHNoYXBlLCBkdHlwZSwgcmVmQ291bnQ6IDEgfSk7XG4gICAgICAgICAgICBjb25zdCBzaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHNoYXBlKTtcbiAgICAgICAgICAgIHRoaXMud2FzbS50ZmpzLnJlZ2lzdGVyVGVuc29yKGlkLCBzaXplLCBtZW1vcnlPZmZzZXQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGRhdGFJZCwgc2hhcGUsIGR0eXBlIH07XG4gICAgfVxuICAgIHR5cGVkQXJyYXlGcm9tSGVhcCh7IHNoYXBlLCBkdHlwZSwgZGF0YUlkIH0pIHtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gdGhpcy53YXNtLkhFQVBVOC5idWZmZXI7XG4gICAgICAgIGNvbnN0IHsgbWVtb3J5T2Zmc2V0IH0gPSB0aGlzLmRhdGFJZE1hcC5nZXQoZGF0YUlkKTtcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShzaGFwZSk7XG4gICAgICAgIHN3aXRjaCAoZHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2Zsb2F0MzInOlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRmxvYXQzMkFycmF5KGJ1ZmZlciwgbWVtb3J5T2Zmc2V0LCBzaXplKTtcbiAgICAgICAgICAgIGNhc2UgJ2ludDMyJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEludDMyQXJyYXkoYnVmZmVyLCBtZW1vcnlPZmZzZXQsIHNpemUpO1xuICAgICAgICAgICAgY2FzZSAnYm9vbCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGJ1ZmZlciwgbWVtb3J5T2Zmc2V0LCBzaXplKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGR0eXBlICR7ZHR5cGV9YCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBjcmVhdGVJbnN0YW50aWF0ZVdhc21GdW5jKHBhdGgpIHtcbiAgICAvLyB0aGlzIHdpbGwgYmUgcmVwbGFjZSBieSByb2xsdXAgcGx1Z2luIHBhdGNoV2VjaGF0V2ViQXNzZW1ibHkgaW4gXG4gICAgLy8gbWlucHJvZ3JhbSdzIG91dHB1dC5cbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gICAgcmV0dXJuIChpbXBvcnRzLCBjYWxsYmFjaykgPT4ge1xuICAgICAgICB1dGlsLmZldGNoKHBhdGgsIHsgY3JlZGVudGlhbHM6ICdzYW1lLW9yaWdpbicgfSkudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIGlmICghcmVzcG9uc2VbJ29rJ10pIHtcbiAgICAgICAgICAgICAgICBpbXBvcnRzLmVudi5hKGBmYWlsZWQgdG8gbG9hZCB3YXNtIGJpbmFyeSBmaWxlIGF0ICcke3BhdGh9J2ApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzcG9uc2UuYXJyYXlCdWZmZXIoKS50aGVuKGJpbmFyeSA9PiB7XG4gICAgICAgICAgICAgICAgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGUoYmluYXJ5LCBpbXBvcnRzKS50aGVuKG91dHB1dCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG91dHB1dC5pbnN0YW5jZSwgb3V0cHV0Lm1vZHVsZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9O1xufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwYXRoIG9mIHRoZSBXQVNNIGJpbmFyeS5cbiAqIEBwYXJhbSBzaW1kU3VwcG9ydGVkIHdoZXRoZXIgU0lNRCBpcyBzdXBwb3J0ZWRcbiAqIEBwYXJhbSB0aHJlYWRzU3VwcG9ydGVkIHdoZXRoZXIgbXVsdGl0aHJlYWRpbmcgaXMgc3VwcG9ydGVkXG4gKiBAcGFyYW0gd2FzbU1vZHVsZUZvbGRlciB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIFdBU00gYmluYXJpZXMuXG4gKi9cbmZ1bmN0aW9uIGdldFBhdGhUb1dhc21CaW5hcnkoc2ltZFN1cHBvcnRlZCwgdGhyZWFkc1N1cHBvcnRlZCwgd2FzbU1vZHVsZUZvbGRlcikge1xuICAgIGlmICh3YXNtUGF0aCAhPSBudWxsKSB7XG4gICAgICAgIC8vIElmIHdhc21QYXRoIGlzIGRlZmluZWQsIHRoZSB1c2VyIGhhcyBzdXBwbGllZCBhIGZ1bGwgcGF0aCB0b1xuICAgICAgICAvLyB0aGUgdmFuaWxsYSAud2FzbSBiaW5hcnkuXG4gICAgICAgIHJldHVybiB3YXNtUGF0aDtcbiAgICB9XG4gICAgbGV0IHBhdGggPSAndGZqcy1iYWNrZW5kLXdhc20ud2FzbSc7XG4gICAgaWYgKHNpbWRTdXBwb3J0ZWQgJiYgdGhyZWFkc1N1cHBvcnRlZCkge1xuICAgICAgICBwYXRoID0gJ3RmanMtYmFja2VuZC13YXNtLXRocmVhZGVkLXNpbWQud2FzbSc7XG4gICAgfVxuICAgIGVsc2UgaWYgKHNpbWRTdXBwb3J0ZWQpIHtcbiAgICAgICAgcGF0aCA9ICd0ZmpzLWJhY2tlbmQtd2FzbS1zaW1kLndhc20nO1xuICAgIH1cbiAgICBpZiAod2FzbUZpbGVNYXAgIT0gbnVsbCkge1xuICAgICAgICBpZiAod2FzbUZpbGVNYXBbcGF0aF0gIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHdhc21GaWxlTWFwW3BhdGhdO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB3YXNtTW9kdWxlRm9sZGVyICsgcGF0aDtcbn1cbi8qKlxuICogSW5pdGlhbGl6ZXMgdGhlIHdhc20gbW9kdWxlIGFuZCBjcmVhdGVzIHRoZSBqcyA8LS0+IHdhc20gYnJpZGdlLlxuICpcbiAqIE5PVEU6IFdlIHdyYXAgdGhlIHdhc20gbW9kdWxlIGluIGEgb2JqZWN0IHdpdGggcHJvcGVydHkgJ3dhc20nIGluc3RlYWQgb2ZcbiAqIHJldHVybmluZyBQcm9taXNlPEJhY2tlbmRXYXNtTW9kdWxlPiB0byBhdm9pZCBmcmVlemluZyBDaHJvbWUgKGxhc3QgdGVzdGVkXG4gKiBpbiBDaHJvbWUgNzYpLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5pdCgpIHtcbiAgICBjb25zdCBbc2ltZFN1cHBvcnRlZCwgdGhyZWFkc1N1cHBvcnRlZF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIGVudigpLmdldEFzeW5jKCdXQVNNX0hBU19TSU1EX1NVUFBPUlQnKSxcbiAgICAgICAgZW52KCkuZ2V0QXN5bmMoJ1dBU01fSEFTX01VTFRJVEhSRUFEX1NVUFBPUlQnKVxuICAgIF0pO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGZhY3RvcnlDb25maWcgPSB7fTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZnVuY3Rpb24gb3ZlcnJpZGVzIHRoZSBFbXNjcmlwdGVuIG1vZHVsZSBsb2NhdGVGaWxlIHV0aWxpdHkuXG4gICAgICAgICAqIEBwYXJhbSBwYXRoIFRoZSByZWxhdGl2ZSBwYXRoIHRvIHRoZSBmaWxlIHRoYXQgbmVlZHMgdG8gYmUgbG9hZGVkLlxuICAgICAgICAgKiBAcGFyYW0gcHJlZml4IFRoZSBwYXRoIHRvIHRoZSBtYWluIEphdmFTY3JpcHQgZmlsZSdzIGRpcmVjdG9yeS5cbiAgICAgICAgICovXG4gICAgICAgIGZhY3RvcnlDb25maWcubG9jYXRlRmlsZSA9IChwYXRoLCBwcmVmaXgpID0+IHtcbiAgICAgICAgICAgIGlmIChwYXRoLmVuZHNXaXRoKCcud29ya2VyLmpzJykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHdhc21Xb3JrZXJDb250ZW50cztcbiAgICAgICAgICAgICAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW3Jlc3BvbnNlXSwgeyB0eXBlOiAnYXBwbGljYXRpb24vamF2YXNjcmlwdCcgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocGF0aC5lbmRzV2l0aCgnLndhc20nKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBnZXRQYXRoVG9XYXNtQmluYXJ5KHNpbWRTdXBwb3J0ZWQsIHRocmVhZHNTdXBwb3J0ZWQsIHdhc21QYXRoUHJlZml4ICE9IG51bGwgPyB3YXNtUGF0aFByZWZpeCA6IHByZWZpeCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcHJlZml4ICsgcGF0aDtcbiAgICAgICAgfTtcbiAgICAgICAgLy8gVXNlIHRoZSBpbnN0YW50aWF0ZVdhc20gb3ZlcnJpZGUgd2hlbiBzeXN0ZW0gZmV0Y2ggaXMgbm90IGF2YWlsYWJsZS5cbiAgICAgICAgLy8gUmVmZXJlbmNlOlxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZW1zY3JpcHRlbi1jb3JlL2Vtc2NyaXB0ZW4vYmxvYi8yYmNhMDgzY2JiZDVhNDEzM2RiNjFmYmQ3NGQwNGY3ZmVlY2ZhOTA3L3Rlc3RzL21hbnVhbF93YXNtX2luc3RhbnRpYXRlLmh0bWwjTDE3MFxuICAgICAgICBpZiAoY3VzdG9tRmV0Y2gpIHtcbiAgICAgICAgICAgIGZhY3RvcnlDb25maWcuaW5zdGFudGlhdGVXYXNtID1cbiAgICAgICAgICAgICAgICBjcmVhdGVJbnN0YW50aWF0ZVdhc21GdW5jKGdldFBhdGhUb1dhc21CaW5hcnkoc2ltZFN1cHBvcnRlZCwgdGhyZWFkc1N1cHBvcnRlZCwgd2FzbVBhdGhQcmVmaXggIT0gbnVsbCA/IHdhc21QYXRoUHJlZml4IDogJycpKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICAgICAgZmFjdG9yeUNvbmZpZy5vbkFib3J0ID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGluaXRpYWxpemVkKSB7XG4gICAgICAgICAgICAgICAgLy8gRW1zY3JpcHRlbiBhbHJlYWR5IGNhbGxlZCBjb25zb2xlLndhcm4gc28gbm8gbmVlZCB0byBkb3VibGUgbG9nLlxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpbml0QWJvcnRlZCkge1xuICAgICAgICAgICAgICAgIC8vIEVtc2NyaXB0ZW4gY2FsbHMgYG9uQWJvcnRgIHR3aWNlLCByZXN1bHRpbmcgaW4gZG91YmxlIGVycm9yXG4gICAgICAgICAgICAgICAgLy8gbWVzc2FnZXMuXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW5pdEFib3J0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgY29uc3QgcmVqZWN0TXNnID0gJ01ha2Ugc3VyZSB0aGUgc2VydmVyIGNhbiBzZXJ2ZSB0aGUgYC53YXNtYCBmaWxlIHJlbGF0aXZlIHRvIHRoZSAnICtcbiAgICAgICAgICAgICAgICAnYnVuZGxlZCBqcyBmaWxlLiBGb3IgbW9yZSBkZXRhaWxzIHNlZSBodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZmpzL2Jsb2IvbWFzdGVyL3RmanMtYmFja2VuZC13YXNtL1JFQURNRS5tZCN1c2luZy1idW5kbGVycyc7XG4gICAgICAgICAgICByZWplY3QoeyBtZXNzYWdlOiByZWplY3RNc2cgfSk7XG4gICAgICAgIH07XG4gICAgICAgIGxldCB3YXNtO1xuICAgICAgICAvLyBJZiBgd2FzbVBhdGhgIGhhcyBiZWVuIGRlZmluZWQgd2UgbXVzdCBpbml0aWFsaXplIHRoZSB2YW5pbGxhIG1vZHVsZS5cbiAgICAgICAgaWYgKHRocmVhZHNTdXBwb3J0ZWQgJiYgc2ltZFN1cHBvcnRlZCAmJiB3YXNtUGF0aCA9PSBudWxsKSB7XG4gICAgICAgICAgICBmYWN0b3J5Q29uZmlnLm1haW5TY3JpcHRVcmxPckJsb2IgPSBuZXcgQmxvYihbYHZhciBXYXNtQmFja2VuZE1vZHVsZVRocmVhZGVkU2ltZCA9IGAgK1xuICAgICAgICAgICAgICAgICAgICB3YXNtRmFjdG9yeVRocmVhZGVkU2ltZC50b1N0cmluZygpXSwgeyB0eXBlOiAndGV4dC9qYXZhc2NyaXB0JyB9KTtcbiAgICAgICAgICAgIHdhc20gPSB3YXNtRmFjdG9yeVRocmVhZGVkU2ltZChmYWN0b3J5Q29uZmlnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIFRoZSB3YXNtRmFjdG9yeSB3b3JrcyBmb3IgYm90aCB2YW5pbGxhIGFuZCBTSU1EIGJpbmFyaWVzLlxuICAgICAgICAgICAgd2FzbSA9IHdhc21GYWN0b3J5KGZhY3RvcnlDb25maWcpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRoZSBXQVNNIG1vZHVsZSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgY3JlYXRlZCBieSB0aGUgZmFjdG9yeS5cbiAgICAgICAgLy8gQW55IGVycm9yIHdpbGwgYmUgY2F1Z2h0IGJ5IHRoZSBvbkFib3J0IGNhbGxiYWNrIGRlZmluZWQgYWJvdmUuXG4gICAgICAgIHdhc20udGhlbigobW9kdWxlKSA9PiB7XG4gICAgICAgICAgICBpbml0aWFsaXplZCA9IHRydWU7XG4gICAgICAgICAgICBpbml0QWJvcnRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgY29uc3Qgdm9pZFJldHVyblR5cGUgPSBudWxsO1xuICAgICAgICAgICAgLy8gVXNpbmcgdGhlIHRmanMgbmFtZXNwYWNlIHRvIGF2b2lkIGNvbmZsaWN0IHdpdGggZW1zY3JpcHRlbidzIEFQSS5cbiAgICAgICAgICAgIG1vZHVsZS50ZmpzID0ge1xuICAgICAgICAgICAgICAgIGluaXQ6IG1vZHVsZS5jd3JhcCgnaW5pdCcsIG51bGwsIFtdKSxcbiAgICAgICAgICAgICAgICByZWdpc3RlclRlbnNvcjogbW9kdWxlLmN3cmFwKCdyZWdpc3Rlcl90ZW5zb3InLCBudWxsLCBbXG4gICAgICAgICAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAgICAgXSksXG4gICAgICAgICAgICAgICAgZGlzcG9zZURhdGE6IG1vZHVsZS5jd3JhcCgnZGlzcG9zZV9kYXRhJywgdm9pZFJldHVyblR5cGUsIFsnbnVtYmVyJ10pLFxuICAgICAgICAgICAgICAgIGRpc3Bvc2U6IG1vZHVsZS5jd3JhcCgnZGlzcG9zZScsIHZvaWRSZXR1cm5UeXBlLCBbXSksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmVzb2x2ZSh7IHdhc206IG1vZHVsZSB9KTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiB0eXBlZEFycmF5RnJvbUJ1ZmZlcihidWZmZXIsIGR0eXBlKSB7XG4gICAgc3dpdGNoIChkdHlwZSkge1xuICAgICAgICBjYXNlICdmbG9hdDMyJzpcbiAgICAgICAgICAgIHJldHVybiBuZXcgRmxvYXQzMkFycmF5KGJ1ZmZlcik7XG4gICAgICAgIGNhc2UgJ2ludDMyJzpcbiAgICAgICAgICAgIHJldHVybiBuZXcgSW50MzJBcnJheShidWZmZXIpO1xuICAgICAgICBjYXNlICdib29sJzpcbiAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShidWZmZXIpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGR0eXBlICR7ZHR5cGV9YCk7XG4gICAgfVxufVxuY29uc3Qgd2FzbUJpbmFyeU5hbWVzID0gW1xuICAgICd0ZmpzLWJhY2tlbmQtd2FzbS53YXNtJywgJ3RmanMtYmFja2VuZC13YXNtLXNpbWQud2FzbScsXG4gICAgJ3RmanMtYmFja2VuZC13YXNtLXRocmVhZGVkLXNpbWQud2FzbSdcbl07XG5sZXQgd2FzbVBhdGggPSBudWxsO1xubGV0IHdhc21QYXRoUHJlZml4ID0gbnVsbDtcbmxldCB3YXNtRmlsZU1hcCA9IHt9O1xubGV0IGluaXRBYm9ydGVkID0gZmFsc2U7XG5sZXQgY3VzdG9tRmV0Y2ggPSBmYWxzZTtcbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIGBzZXRXYXNtUGF0aHNgIGluc3RlYWQuXG4gKiBTZXRzIHRoZSBwYXRoIHRvIHRoZSBgLndhc21gIGZpbGUgd2hpY2ggd2lsbCBiZSBmZXRjaGVkIHdoZW4gdGhlIHdhc21cbiAqIGJhY2tlbmQgaXMgaW5pdGlhbGl6ZWQuIFNlZVxuICogaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGZqcy9ibG9iL21hc3Rlci90ZmpzLWJhY2tlbmQtd2FzbS9SRUFETUUubWQjdXNpbmctYnVuZGxlcnNcbiAqIGZvciBtb3JlIGRldGFpbHMuXG4gKiBAcGFyYW0gcGF0aCB3YXNtIGZpbGUgcGF0aCBvciB1cmxcbiAqIEBwYXJhbSB1c2VQbGF0Zm9ybUZldGNoIG9wdGlvbmFsIGJvb2xlYW4gdG8gdXNlIHBsYXRmb3JtIGZldGNoIHRvIGRvd25sb2FkXG4gKiAgICAgdGhlIHdhc20gZmlsZSwgZGVmYXVsdCB0byBmYWxzZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnRW52aXJvbm1lbnQnLCBuYW1lc3BhY2U6ICd3YXNtJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFdhc21QYXRoKHBhdGgsIHVzZVBsYXRmb3JtRmV0Y2ggPSBmYWxzZSkge1xuICAgIGRlcHJlY2F0aW9uV2Fybignc2V0V2FzbVBhdGggaGFzIGJlZW4gZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBzZXRXYXNtUGF0aHMgYW5kJyArXG4gICAgICAgICcgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHJlbGVhc2UuJyk7XG4gICAgaWYgKGluaXRBYm9ydGVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIFdBU00gYmFja2VuZCB3YXMgYWxyZWFkeSBpbml0aWFsaXplZC4gTWFrZSBzdXJlIHlvdSBjYWxsICcgK1xuICAgICAgICAgICAgJ2BzZXRXYXNtUGF0aCgpYCBiZWZvcmUgeW91IGNhbGwgYHRmLnNldEJhY2tlbmQoKWAgb3IgYHRmLnJlYWR5KClgJyk7XG4gICAgfVxuICAgIHdhc21QYXRoID0gcGF0aDtcbiAgICBjdXN0b21GZXRjaCA9IHVzZVBsYXRmb3JtRmV0Y2g7XG59XG4vKipcbiAqIENvbmZpZ3VyZXMgdGhlIGxvY2F0aW9ucyBvZiB0aGUgV0FTTSBiaW5hcmllcy5cbiAqXG4gKiBgYGBqc1xuICogc2V0V2FzbVBhdGhzKHtcbiAqICAndGZqcy1iYWNrZW5kLXdhc20ud2FzbSc6ICdyZW5hbWVkLndhc20nLFxuICogICd0ZmpzLWJhY2tlbmQtd2FzbS1zaW1kLndhc20nOiAncmVuYW1lZC1zaW1kLndhc20nLFxuICogICd0ZmpzLWJhY2tlbmQtd2FzbS10aHJlYWRlZC1zaW1kLndhc20nOiAncmVuYW1lZC10aHJlYWRlZC1zaW1kLndhc20nXG4gKiB9KTtcbiAqIHRmLnNldEJhY2tlbmQoJ3dhc20nKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBwcmVmaXhPckZpbGVNYXAgVGhpcyBjYW4gYmUgZWl0aGVyIGEgc3RyaW5nIG9yIG9iamVjdDpcbiAqICAtIChzdHJpbmcpIFRoZSBwYXRoIHRvIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIFdBU00gYmluYXJpZXMgYXJlIGxvY2F0ZWQuXG4gKiAgICAgTm90ZSB0aGF0IHRoaXMgcHJlZml4IHdpbGwgYmUgdXNlZCB0byBsb2FkIGVhY2ggYmluYXJ5ICh2YW5pbGxhLFxuICogICAgIFNJTUQtZW5hYmxlZCwgdGhyZWFkaW5nLWVuYWJsZWQsIGV0Yy4pLlxuICogIC0gKG9iamVjdCkgTWFwcGluZyBmcm9tIG5hbWVzIG9mIFdBU00gYmluYXJpZXMgdG8gY3VzdG9tXG4gKiAgICAgZnVsbCBwYXRocyBzcGVjaWZ5aW5nIHRoZSBsb2NhdGlvbnMgb2YgdGhvc2UgYmluYXJpZXMuIFRoaXMgaXMgdXNlZnVsIGlmXG4gKiAgICAgeW91ciBXQVNNIGJpbmFyaWVzIGFyZSBub3QgYWxsIGxvY2F0ZWQgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LCBvciBpZiB5b3VyXG4gKiAgICAgV0FTTSBiaW5hcmllcyBoYXZlIGJlZW4gcmVuYW1lZC5cbiAqIEBwYXJhbSB1c2VQbGF0Zm9ybUZldGNoIG9wdGlvbmFsIGJvb2xlYW4gdG8gdXNlIHBsYXRmb3JtIGZldGNoIHRvIGRvd25sb2FkXG4gKiAgICAgdGhlIHdhc20gZmlsZSwgZGVmYXVsdCB0byBmYWxzZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnRW52aXJvbm1lbnQnLCBuYW1lc3BhY2U6ICd3YXNtJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFdhc21QYXRocyhwcmVmaXhPckZpbGVNYXAsIHVzZVBsYXRmb3JtRmV0Y2ggPSBmYWxzZSkge1xuICAgIGlmIChpbml0QWJvcnRlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBXQVNNIGJhY2tlbmQgd2FzIGFscmVhZHkgaW5pdGlhbGl6ZWQuIE1ha2Ugc3VyZSB5b3UgY2FsbCAnICtcbiAgICAgICAgICAgICdgc2V0V2FzbVBhdGhzKClgIGJlZm9yZSB5b3UgY2FsbCBgdGYuc2V0QmFja2VuZCgpYCBvciAnICtcbiAgICAgICAgICAgICdgdGYucmVhZHkoKWAnKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBwcmVmaXhPckZpbGVNYXAgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHdhc21QYXRoUHJlZml4ID0gcHJlZml4T3JGaWxlTWFwO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgd2FzbUZpbGVNYXAgPSBwcmVmaXhPckZpbGVNYXA7XG4gICAgICAgIGNvbnN0IG1pc3NpbmdQYXRocyA9IHdhc21CaW5hcnlOYW1lcy5maWx0ZXIobmFtZSA9PiB3YXNtRmlsZU1hcFtuYW1lXSA9PSBudWxsKTtcbiAgICAgICAgaWYgKG1pc3NpbmdQYXRocy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZXJlIHdlcmUgbm8gZW50cmllcyBmb3VuZCBmb3IgdGhlIGZvbGxvd2luZyBiaW5hcmllczogYCArXG4gICAgICAgICAgICAgICAgYCR7bWlzc2luZ1BhdGhzLmpvaW4oJywnKX0uIFBsZWFzZSBlaXRoZXIgY2FsbCBzZXRXYXNtUGF0aHMgd2l0aCBhIGAgK1xuICAgICAgICAgICAgICAgIGBtYXAgcHJvdmlkaW5nIGEgcGF0aCBmb3IgZWFjaCBiaW5hcnksIG9yIHdpdGggYSBzdHJpbmcgaW5kaWNhdGluZyBgICtcbiAgICAgICAgICAgICAgICBgdGhlIGRpcmVjdG9yeSB3aGVyZSBhbGwgdGhlIGJpbmFyaWVzIGNhbiBiZSBmb3VuZC5gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjdXN0b21GZXRjaCA9IHVzZVBsYXRmb3JtRmV0Y2g7XG59XG4vKiogVXNlZCBpbiB1bml0IHRlc3RzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc2V0V2FzbVBhdGgoKSB7XG4gICAgd2FzbVBhdGggPSBudWxsO1xuICAgIHdhc21QYXRoUHJlZml4ID0gbnVsbDtcbiAgICB3YXNtRmlsZU1hcCA9IHt9O1xuICAgIGN1c3RvbUZldGNoID0gZmFsc2U7XG4gICAgaW5pdEFib3J0ZWQgPSBmYWxzZTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJhY2tlbmRfd2FzbS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgJy4vZmxhZ3Nfd2FzbSc7XG5pbXBvcnQgeyByZWdpc3RlckJhY2tlbmQgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgQmFja2VuZFdhc20sIGluaXQgfSBmcm9tICcuL2JhY2tlbmRfd2FzbSc7XG5leHBvcnQgeyBCYWNrZW5kV2FzbSwgc2V0V2FzbVBhdGgsIHNldFdhc21QYXRocyB9IGZyb20gJy4vYmFja2VuZF93YXNtJztcbmV4cG9ydCB7IHZlcnNpb24gYXMgdmVyc2lvbl93YXNtIH0gZnJvbSAnLi92ZXJzaW9uJztcbmNvbnN0IFdBU01fUFJJT1JJVFkgPSAyO1xucmVnaXN0ZXJCYWNrZW5kKCd3YXNtJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgd2FzbSB9ID0gYXdhaXQgaW5pdCgpO1xuICAgIHJldHVybiBuZXcgQmFja2VuZFdhc20od2FzbSk7XG59LCBXQVNNX1BSSU9SSVRZKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJhc2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgZW52IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmNvbnN0IEVOViA9IGVudigpO1xuLyoqXG4gKiBUcnVlIGlmIFNJTUQgaXMgc3VwcG9ydGVkLlxuICovXG4vLyBGcm9tOiBodHRwczovL2dpdGh1Yi5jb20vR29vZ2xlQ2hyb21lTGFicy93YXNtLWZlYXR1cmUtZGV0ZWN0XG5FTlYucmVnaXN0ZXJGbGFnKFxuLy8gVGhpcyB0eXBlZCBhcnJheSBwYXNzZWQgaW4gdG8gV2ViQXNzZW1ibHkudmFsaWRhdGUgaXMgV2ViQXNzZW1ibHkgYmluYXJ5XG4vLyBjb2RlLiBJbiB0aGlzIGNhc2UgaXQgaXMgYSBzbWFsbCBwcm9ncmFtIHRoYXQgY29udGFpbnMgU0lNRFxuLy8gaW5zdHJ1Y3Rpb25zLlxuJ1dBU01fSEFTX1NJTURfU1VQUE9SVCcsIGFzeW5jICgpID0+IFdlYkFzc2VtYmx5LnZhbGlkYXRlKG5ldyBVaW50OEFycmF5KFtcbiAgICAwLCA5NywgMTE1LCAxMDksIDEsIDAsIDAsIDAsIDEsIDQsIDEsIDk2LCAwLCAwLCAzLFxuICAgIDIsIDEsIDAsIDEwLCA5LCAxLCA3LCAwLCA2NSwgMCwgMjUzLCAxNSwgMjYsIDExXG5dKSkpO1xuLyoqXG4gKiBUcnVlIGlmIHRocmVhZHMgYXJlIHN1cHBvcnRlZC5cbiAqL1xuLy8gRnJvbTogaHR0cHM6Ly9naXRodWIuY29tL0dvb2dsZUNocm9tZUxhYnMvd2FzbS1mZWF0dXJlLWRldGVjdFxuRU5WLnJlZ2lzdGVyRmxhZygnV0FTTV9IQVNfTVVMVElUSFJFQURfU1VQUE9SVCcsIGFzeW5jICgpID0+IHtcbiAgICAvLyBUT0RPKGFubnhpbmd5dWFuKTogRW5hYmxlIG5vZGUgc3VwcG9ydCBvbmNlIHRoaXMgaXMgcmVzb2x2ZWQ6XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGZqcy9pc3N1ZXMvMzgzMFxuICAgIGlmIChFTlYuZ2V0KCdJU19OT0RFJykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyBUZXN0IGZvciB0cmFuc2ZlcmFiaWxpdHkgb2YgU0FCcyAobmVlZGVkIGZvciBGaXJlZm94KVxuICAgICAgICAvLyBodHRwczovL2dyb3Vwcy5nb29nbGUuY29tL2ZvcnVtLyMhbXNnL21vemlsbGEuZGV2LnBsYXRmb3JtL0lIa0JabEhFVHBBL2R3c01OY2hXRVFBSlxuICAgICAgICBuZXcgTWVzc2FnZUNoYW5uZWwoKS5wb3J0MS5wb3N0TWVzc2FnZShuZXcgU2hhcmVkQXJyYXlCdWZmZXIoMSkpO1xuICAgICAgICAvLyBUaGlzIHR5cGVkIGFycmF5IGlzIGEgV2ViQXNzZW1ibHkgcHJvZ3JhbSBjb250YWluaW5nIHRocmVhZGVkXG4gICAgICAgIC8vIGluc3RydWN0aW9ucy5cbiAgICAgICAgcmV0dXJuIFdlYkFzc2VtYmx5LnZhbGlkYXRlKG5ldyBVaW50OEFycmF5KFtcbiAgICAgICAgICAgIDAsIDk3LCAxMTUsIDEwOSwgMSwgMCwgMCwgMCwgMSwgNCwgMSwgOTYsIDAsIDAsIDMsIDIsIDEsIDAsIDUsXG4gICAgICAgICAgICA0LCAxLCAzLCAxLCAxLCAxMCwgMTEsIDEsIDksIDAsIDY1LCAwLCAyNTQsIDE2LCAyLCAwLCAyNiwgMTFcbiAgICAgICAgXSkpO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mbGFnc193YXNtLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCAnLi9yZWdpc3Rlcl9hbGxfa2VybmVscyc7XG5leHBvcnQgKiBmcm9tICcuL2Jhc2UnO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuLy8gSW1wb3J0IHNoYXJlZCBmdW5jdGlvbmFsaXR5IGZyb20gdGZqcy1iYWNrZW5kLWNwdSB3aXRob3V0IHRyaWdnZXJpbmdcbi8vIHNpZGUgZWZmZWN0cy5cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8taW1wb3J0cy1mcm9tLWRpc3RcbmltcG9ydCB7IGNvbmNhdEltcGwgYXMgY29uY2F0SW1wbENQVSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9zaGFyZWQnO1xuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1pbXBvcnRzLWZyb20tZGlzdFxuaW1wb3J0IHsgc2xpY2VJbXBsIGFzIHNsaWNlSW1wbENQVSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9zaGFyZWQnO1xuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1pbXBvcnRzLWZyb20tZGlzdFxuaW1wb3J0IHsgcmFuZ2VJbXBsIGFzIHJhbmdlSW1wbENQVSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9zaGFyZWQnO1xuZXhwb3J0IHsgY29uY2F0SW1wbENQVSwgcmFuZ2VJbXBsQ1BVLCBzbGljZUltcGxDUFUgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNoYXJlZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBBYnMgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlVW5hcnlLZXJuZWxDb25maWcgfSBmcm9tICcuL3VuYXJ5X2tlcm5lbCc7XG5leHBvcnQgY29uc3QgYWJzQ29uZmlnID0gY3JlYXRlVW5hcnlLZXJuZWxDb25maWcoQWJzKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFicy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBBZGQgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlQmluYXJ5S2VybmVsQ29uZmlnIH0gZnJvbSAnLi9iaW5hcnlfa2VybmVsJztcbmNvbnN0IHN1cHBvcnRzRnVsbEJyb2FkY2FzdCA9IHRydWU7XG5leHBvcnQgY29uc3QgYWRkQ29uZmlnID0gY3JlYXRlQmluYXJ5S2VybmVsQ29uZmlnKEFkZCwgc3VwcG9ydHNGdWxsQnJvYWRjYXN0KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFkZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBBZGROLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IENwcERUeXBlIH0gZnJvbSAnLi90eXBlcyc7XG5sZXQgd2FzbUZ1bmM7XG5mdW5jdGlvbiBzZXR1cEZ1bmMoYmFja2VuZCkge1xuICAgIHdhc21GdW5jID0gYmFja2VuZC53YXNtLmN3cmFwKEFkZE4sIG51bGwgLyogdm9pZCAqLywgW1xuICAgICAgICAnYXJyYXknLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgIF0pO1xufVxuZnVuY3Rpb24gYWRkbihhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQgfSA9IGFyZ3M7XG4gICAgY29uc3Qgb3V0ID0gYmFja2VuZC5tYWtlT3V0cHV0KGlucHV0c1swXS5zaGFwZSwgaW5wdXRzWzBdLmR0eXBlKTtcbiAgICAvLyBTaG9ydC1jaXJjdWl0IHplcm8tc2l6ZWQgdGVuc29ycy5cbiAgICBpZiAodXRpbC5zaXplRnJvbVNoYXBlKG91dC5zaGFwZSkgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRJZHMgPSBpbnB1dHMubWFwKHggPT4gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KHguZGF0YUlkKS5pZCk7XG4gICAgY29uc3QgaW5wdXRJZHNCeXRlcyA9IG5ldyBVaW50OEFycmF5KG5ldyBJbnQzMkFycmF5KGlucHV0SWRzKS5idWZmZXIpO1xuICAgIGNvbnN0IG91dElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KG91dC5kYXRhSWQpLmlkO1xuICAgIHdhc21GdW5jKGlucHV0SWRzQnl0ZXMsIGlucHV0SWRzLmxlbmd0aCwgQ3BwRFR5cGVbb3V0LmR0eXBlXSwgb3V0SWQpO1xuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3QgYWRkTkNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBBZGROLFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAgc2V0dXBGdW5jLFxuICAgIGtlcm5lbEZ1bmM6IGFkZG4sXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QWRkTi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBBbGwsIGJhY2tlbmRfdXRpbCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBwZXJtdXRlQXhlc0FuZFRyYW5zcG9zZSB9IGZyb20gJy4va2VybmVsX3V0aWxzJztcbmxldCB3YXNtQWxsO1xuZnVuY3Rpb24gc2V0dXAoYmFja2VuZCkge1xuICAgIHdhc21BbGwgPSBiYWNrZW5kLndhc20uY3dyYXAoQWxsLCBudWxsIC8qdm9pZCovLCBbJ251bWJlciwgbnVtYmVyLCBudW1iZXInXSk7XG59XG5mdW5jdGlvbiBhbGwoYXJncykge1xuICAgIGNvbnN0IHsgYmFja2VuZCwgaW5wdXRzLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IGF4aXMsIGtlZXBEaW1zIH0gPSBhdHRycztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB4SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoeC5kYXRhSWQpLmlkO1xuICAgIGxldCBpbnB1dElkID0geElkO1xuICAgIGxldCBpbnB1dCA9IHg7XG4gICAgY29uc3QgeyB0cmFuc3Bvc2VkLCBheGVzLCBvcmlnaW5hbEF4ZXMsIGlucHV0V2FzVHJhbnNwb3NlZCB9ID0gcGVybXV0ZUF4ZXNBbmRUcmFuc3Bvc2UoeCwgYXhpcywgYmFja2VuZCk7XG4gICAgaWYgKGlucHV0V2FzVHJhbnNwb3NlZCkge1xuICAgICAgICBjb25zdCB0cmFuc3Bvc2VkSWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQodHJhbnNwb3NlZC5kYXRhSWQpLmlkO1xuICAgICAgICBpbnB1dCA9IHRyYW5zcG9zZWQ7XG4gICAgICAgIGlucHV0SWQgPSB0cmFuc3Bvc2VkSWQ7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0UmFuayA9IGlucHV0LnNoYXBlLmxlbmd0aDtcbiAgICBiYWNrZW5kX3V0aWwuYXNzZXJ0QXhlc0FyZUlubmVyTW9zdERpbXMoJ2FsbCcsIGF4ZXMsIGlucHV0UmFuayk7XG4gICAgY29uc3QgW291dFNoYXBlLCByZWR1Y2VTaGFwZV0gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZU91dEFuZFJlZHVjZVNoYXBlcyhpbnB1dC5zaGFwZSwgYXhlcyk7XG4gICAgY29uc3QgcmVkdWNlU2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShyZWR1Y2VTaGFwZSk7XG4gICAgY29uc3Qgb3V0ID0gYmFja2VuZC5tYWtlT3V0cHV0KG91dFNoYXBlLCB4LmR0eXBlKTtcbiAgICBpZiAodXRpbC5zaXplRnJvbVNoYXBlKGlucHV0LnNoYXBlKSAhPT0gMCkge1xuICAgICAgICBjb25zdCBvdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXQuZGF0YUlkKS5pZDtcbiAgICAgICAgd2FzbUFsbChpbnB1dElkLCByZWR1Y2VTaXplLCBvdXRJZCk7XG4gICAgfVxuICAgIGlmIChpbnB1dFdhc1RyYW5zcG9zZWQpIHtcbiAgICAgICAgLy8gZGlzcG9zZSBvZiB0aGUgdHJhbnNwb3NlZCB0ZW5zb3IuXG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZURhdGEodHJhbnNwb3NlZC5kYXRhSWQpO1xuICAgIH1cbiAgICBpZiAoa2VlcERpbXMpIHtcbiAgICAgICAgLy8gcmVzaGFwZVxuICAgICAgICBjb25zdCBuZXdTaGFwZSA9IGJhY2tlbmRfdXRpbC5leHBhbmRTaGFwZVRvS2VlcERpbShvdXQuc2hhcGUsIG9yaWdpbmFsQXhlcyk7XG4gICAgICAgIG91dC5zaGFwZSA9IG5ld1NoYXBlO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xufVxuZXhwb3J0IGNvbnN0IGFsbENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBBbGwsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBzZXR1cEZ1bmM6IHNldHVwLFxuICAgIGtlcm5lbEZ1bmM6IGFsbFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFsbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBBbnksIGJhY2tlbmRfdXRpbCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBwZXJtdXRlQXhlc0FuZFRyYW5zcG9zZSB9IGZyb20gJy4va2VybmVsX3V0aWxzJztcbmxldCB3YXNtQW55O1xuZnVuY3Rpb24gc2V0dXAoYmFja2VuZCkge1xuICAgIHdhc21BbnkgPSBiYWNrZW5kLndhc20uY3dyYXAoQW55LCBudWxsIC8qdm9pZCovLCBbJ251bWJlciwgbnVtYmVyLCBudW1iZXInXSk7XG59XG5mdW5jdGlvbiBhbnkoYXJncykge1xuICAgIGNvbnN0IHsgYmFja2VuZCwgaW5wdXRzLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IGF4aXMsIGtlZXBEaW1zIH0gPSBhdHRycztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB4SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoeC5kYXRhSWQpLmlkO1xuICAgIGxldCBpbnB1dElkID0geElkO1xuICAgIGxldCBpbnB1dCA9IHg7XG4gICAgY29uc3QgeyB0cmFuc3Bvc2VkLCBheGVzLCBvcmlnaW5hbEF4ZXMsIGlucHV0V2FzVHJhbnNwb3NlZCB9ID0gcGVybXV0ZUF4ZXNBbmRUcmFuc3Bvc2UoeCwgYXhpcywgYmFja2VuZCk7XG4gICAgaWYgKGlucHV0V2FzVHJhbnNwb3NlZCkge1xuICAgICAgICBjb25zdCB0cmFuc3Bvc2VkSWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQodHJhbnNwb3NlZC5kYXRhSWQpLmlkO1xuICAgICAgICBpbnB1dCA9IHRyYW5zcG9zZWQ7XG4gICAgICAgIGlucHV0SWQgPSB0cmFuc3Bvc2VkSWQ7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0UmFuayA9IGlucHV0LnNoYXBlLmxlbmd0aDtcbiAgICBiYWNrZW5kX3V0aWwuYXNzZXJ0QXhlc0FyZUlubmVyTW9zdERpbXMoJ2FueScsIGF4ZXMsIGlucHV0UmFuayk7XG4gICAgY29uc3QgW291dFNoYXBlLCByZWR1Y2VTaGFwZV0gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZU91dEFuZFJlZHVjZVNoYXBlcyhpbnB1dC5zaGFwZSwgYXhlcyk7XG4gICAgY29uc3QgcmVkdWNlU2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShyZWR1Y2VTaGFwZSk7XG4gICAgY29uc3Qgb3V0ID0gYmFja2VuZC5tYWtlT3V0cHV0KG91dFNoYXBlLCB4LmR0eXBlKTtcbiAgICBpZiAodXRpbC5zaXplRnJvbVNoYXBlKGlucHV0LnNoYXBlKSAhPT0gMCkge1xuICAgICAgICBjb25zdCBvdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXQuZGF0YUlkKS5pZDtcbiAgICAgICAgd2FzbUFueShpbnB1dElkLCByZWR1Y2VTaXplLCBvdXRJZCk7XG4gICAgfVxuICAgIGlmIChpbnB1dFdhc1RyYW5zcG9zZWQpIHtcbiAgICAgICAgLy8gZGlzcG9zZSBvZiB0aGUgdHJhbnNwb3NlZCB0ZW5zb3IuXG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZURhdGEodHJhbnNwb3NlZC5kYXRhSWQpO1xuICAgIH1cbiAgICBpZiAoa2VlcERpbXMpIHtcbiAgICAgICAgLy8gcmVzaGFwZVxuICAgICAgICBjb25zdCBuZXdTaGFwZSA9IGJhY2tlbmRfdXRpbC5leHBhbmRTaGFwZVRvS2VlcERpbShvdXQuc2hhcGUsIG9yaWdpbmFsQXhlcyk7XG4gICAgICAgIG91dC5zaGFwZSA9IG5ld1NoYXBlO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xufVxuZXhwb3J0IGNvbnN0IGFueUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBBbnksXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBzZXR1cEZ1bmM6IHNldHVwLFxuICAgIGtlcm5lbEZ1bmM6IGFueVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFueS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBBcmdNYXgsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgcGVybXV0ZUF4ZXNBbmRUcmFuc3Bvc2UgfSBmcm9tICcuL2tlcm5lbF91dGlscyc7XG5pbXBvcnQgeyBDcHBEVHlwZSB9IGZyb20gJy4vdHlwZXMnO1xubGV0IHdhc21GdW5jO1xuZnVuY3Rpb24gc2V0dXAoYmFja2VuZCkge1xuICAgIHdhc21GdW5jID0gYmFja2VuZC53YXNtLmN3cmFwKEFyZ01heCwgbnVsbCAvKiB2b2lkICovLCBbXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyAvLyBvdXRfaWRcbiAgICBdKTtcbn1cbmZ1bmN0aW9uIGFyZ21heChhcmdzKSB7XG4gICAgY29uc3QgeyBiYWNrZW5kLCBpbnB1dHMsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgYXhpcyB9ID0gYXR0cnM7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KHguZGF0YUlkKS5pZDtcbiAgICBsZXQgaW5wdXRJZCA9IHhJZDtcbiAgICBsZXQgaW5wdXQgPSB4O1xuICAgIGNvbnN0IHsgdHJhbnNwb3NlZCwgYXhlcywgaW5wdXRXYXNUcmFuc3Bvc2VkIH0gPSBwZXJtdXRlQXhlc0FuZFRyYW5zcG9zZSh4LCBheGlzLCBiYWNrZW5kKTtcbiAgICBpZiAoaW5wdXRXYXNUcmFuc3Bvc2VkKSB7XG4gICAgICAgIGNvbnN0IHRyYW5zcG9zZWRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldCh0cmFuc3Bvc2VkLmRhdGFJZCkuaWQ7XG4gICAgICAgIGlmICh0cmFuc3Bvc2VkSWQgIT09IHhJZCkge1xuICAgICAgICAgICAgLy8gdHJhbnNwb3NlIHdhcyBub3QgYSBuby1vcC4gV2Ugd2lsbCBuZWVkIHRvIGRpc3Bvc2Ugb2YgdGhpc1xuICAgICAgICAgICAgLy8gb25jZSB3ZSBhcmUgZG9uZS5cbiAgICAgICAgICAgIGlucHV0ID0gdHJhbnNwb3NlZDtcbiAgICAgICAgICAgIGlucHV0SWQgPSB0cmFuc3Bvc2VkSWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgb3V0U2hhcGUgPSBpbnB1dC5zaGFwZS5zbGljZSgwLCAtMSk7XG4gICAgY29uc3Qgb3V0ID0gYmFja2VuZC5tYWtlT3V0cHV0KG91dFNoYXBlLCAnaW50MzInKTtcbiAgICBjb25zdCBvdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXQuZGF0YUlkKS5pZDtcbiAgICBjb25zdCBvdXRlclNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUob3V0LnNoYXBlKTtcbiAgICBjb25zdCBpbm5lclNpemUgPSBpbnB1dC5zaGFwZVtheGVzWzBdXTtcbiAgICB3YXNtRnVuYyhpbnB1dElkLCBDcHBEVHlwZVtpbnB1dC5kdHlwZV0sIG91dGVyU2l6ZSwgaW5uZXJTaXplLCBvdXRJZCk7XG4gICAgaWYgKGlucHV0V2FzVHJhbnNwb3NlZCkge1xuICAgICAgICAvLyBkaXNwb3NlIG9mIHRoZSB0cmFuc3Bvc2VkIHRlbnNvci5cbiAgICAgICAgYmFja2VuZC5kaXNwb3NlRGF0YSh0cmFuc3Bvc2VkLmRhdGFJZCk7XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3QgYXJnTWF4Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEFyZ01heCxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIGtlcm5lbEZ1bmM6IGFyZ21heCxcbiAgICBzZXR1cEZ1bmM6IHNldHVwXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QXJnTWF4LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEF2Z1Bvb2wsIGJhY2tlbmRfdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5sZXQgd2FzbUF2Z1Bvb2w7XG5mdW5jdGlvbiBzZXR1cChiYWNrZW5kKSB7XG4gICAgd2FzbUF2Z1Bvb2wgPSBiYWNrZW5kLndhc20uY3dyYXAoQXZnUG9vbCwgbnVsbCAvKiB2b2lkICovLCBbXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICBdKTtcbn1cbmZ1bmN0aW9uIGF2Z1Bvb2woYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBhdHRycywgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCB4ID0gaW5wdXRzLng7XG4gICAgY29uc3QgeElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KHguZGF0YUlkKS5pZDtcbiAgICBjb25zdCB7IGZpbHRlclNpemUsIHN0cmlkZXMsIHBhZCwgZGltUm91bmRpbmdNb2RlIH0gPSBhdHRycztcbiAgICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlUG9vbDJESW5mbyh4LnNoYXBlLCBmaWx0ZXJTaXplLCBzdHJpZGVzLCAxIC8qIGRpbGF0aW9ucyAqLywgcGFkLCBkaW1Sb3VuZGluZ01vZGUpO1xuICAgIGNvbnN0IGZpbHRlckhlaWdodCA9IGNvbnZJbmZvLmZpbHRlckhlaWdodDtcbiAgICBjb25zdCBmaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmZpbHRlcldpZHRoO1xuICAgIGNvbnN0IHBhZFRvcCA9IGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICAgIGNvbnN0IHBhZFJpZ2h0ID0gY29udkluZm8ucGFkSW5mby5yaWdodDtcbiAgICBjb25zdCBwYWRCb3R0b20gPSBjb252SW5mby5wYWRJbmZvLmJvdHRvbTtcbiAgICBjb25zdCBwYWRMZWZ0ID0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuICAgIGNvbnN0IHN0cmlkZUhlaWdodCA9IGNvbnZJbmZvLnN0cmlkZUhlaWdodDtcbiAgICBjb25zdCBzdHJpZGVXaWR0aCA9IGNvbnZJbmZvLnN0cmlkZVdpZHRoO1xuICAgIGNvbnN0IGNoYW5uZWxzID0gY29udkluZm8uaW5DaGFubmVscztcbiAgICBpZiAoY29udkluZm8uZGF0YUZvcm1hdCAhPT0gJ2NoYW5uZWxzTGFzdCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB3YXNtIGJhY2tlbmQgZG9lcyBub3Qgc3VwcG9ydCBkYXRhRm9ybWF0OidgICtcbiAgICAgICAgICAgIGAke2NvbnZJbmZvLmRhdGFGb3JtYXR9Jy4gUGxlYXNlIHVzZSAnY2hhbm5lbHNMYXN0Jy5gKTtcbiAgICB9XG4gICAgaWYgKGNvbnZJbmZvLmRpbGF0aW9uV2lkdGggIT09IDEgfHwgY29udkluZm8uZGlsYXRpb25IZWlnaHQgIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB3YXMgYmFja2VuZCBvbmx5IHN1cHBvcnRzIGF2ZXJhZ2UgcG9vbGluZyB3aXRoIGRpbGF0aW9uID0gWzEsIDFdLCBgICtcbiAgICAgICAgICAgIGBnb3QgWyR7Y29udkluZm8uZGlsYXRpb25IZWlnaHR9LCAke2NvbnZJbmZvLmRpbGF0aW9uV2lkdGh9XS5gKTtcbiAgICB9XG4gICAgY29uc3Qgb3V0ID0gYmFja2VuZC5tYWtlT3V0cHV0KGNvbnZJbmZvLm91dFNoYXBlLCAnZmxvYXQzMicpO1xuICAgIGNvbnN0IG91dElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KG91dC5kYXRhSWQpLmlkO1xuICAgIHdhc21BdmdQb29sKHhJZCwgeC5zaGFwZVswXSwgeC5zaGFwZVsxXSwgeC5zaGFwZVsyXSwgZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgcGFkVG9wLCBwYWRSaWdodCwgcGFkQm90dG9tLCBwYWRMZWZ0LCBzdHJpZGVIZWlnaHQsIHN0cmlkZVdpZHRoLCBjaGFubmVscywgb3V0SWQpO1xuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3QgYXZnUG9vbENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBBdmdQb29sLFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAgc2V0dXBGdW5jOiBzZXR1cCxcbiAgICBrZXJuZWxGdW5jOiBhdmdQb29sXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QXZnUG9vbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBCYXRjaE1hdE11bCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9SZXNoYXBlJztcbmxldCB3YXNtQmF0Y2hNYXRNdWw7XG5mdW5jdGlvbiBzZXR1cChiYWNrZW5kKSB7XG4gICAgd2FzbUJhdGNoTWF0TXVsID0gYmFja2VuZC53YXNtLmN3cmFwKEJhdGNoTWF0TXVsLCBudWxsIC8qIHZvaWQgKi8sIFtcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdhcnJheScsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ2FycmF5JyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicgLy8gb3V0X2lkXG4gICAgXSk7XG59XG5mdW5jdGlvbiBiYXRjaE1hdE11bChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgYSwgYiB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgdHJhbnNwb3NlQSwgdHJhbnNwb3NlQiB9ID0gYXR0cnM7XG4gICAgaWYgKGEuZHR5cGUgIT09ICdmbG9hdDMyJyB8fCBiLmR0eXBlICE9PSAnZmxvYXQzMicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCYXRjaE1hdE11bCBmb3Igbm9uIG5vbi1mbG9hdDMyIHRlbnNvcnMgbm90IHlldCBzdXBwb3J0ZWQuYCk7XG4gICAgfVxuICAgIGNvbnN0IGFSYW5rID0gYS5zaGFwZS5sZW5ndGg7XG4gICAgY29uc3QgYlJhbmsgPSBiLnNoYXBlLmxlbmd0aDtcbiAgICBjb25zdCBpbm5lclNoYXBlQSA9IHRyYW5zcG9zZUEgPyBhLnNoYXBlW2FSYW5rIC0gMl0gOiBhLnNoYXBlW2FSYW5rIC0gMV07XG4gICAgY29uc3QgaW5uZXJTaGFwZUIgPSB0cmFuc3Bvc2VCID8gYi5zaGFwZVtiUmFuayAtIDFdIDogYi5zaGFwZVtiUmFuayAtIDJdO1xuICAgIGNvbnN0IG91dGVyU2hhcGVBID0gdHJhbnNwb3NlQSA/IGEuc2hhcGVbYVJhbmsgLSAxXSA6IGEuc2hhcGVbYVJhbmsgLSAyXTtcbiAgICBjb25zdCBvdXRlclNoYXBlQiA9IHRyYW5zcG9zZUIgPyBiLnNoYXBlW2JSYW5rIC0gMl0gOiBiLnNoYXBlW2JSYW5rIC0gMV07XG4gICAgY29uc3Qgb3V0ZXJEaW1zQSA9IGEuc2hhcGUuc2xpY2UoMCwgLTIpO1xuICAgIGNvbnN0IG91dGVyRGltc0IgPSBiLnNoYXBlLnNsaWNlKDAsIC0yKTtcbiAgICBjb25zdCBiYXRjaERpbUEgPSB1dGlsLnNpemVGcm9tU2hhcGUob3V0ZXJEaW1zQSk7XG4gICAgY29uc3QgYmF0Y2hEaW1CID0gdXRpbC5zaXplRnJvbVNoYXBlKG91dGVyRGltc0IpO1xuICAgIGNvbnN0IGJhdGNoRGltc0NvbXBhdGlibGUgPSBiYXRjaERpbUEgPT09IGJhdGNoRGltQiB8fCBiYXRjaERpbUEgPT09IDEgfHwgYmF0Y2hEaW1CID09PSAxO1xuICAgIHV0aWwuYXNzZXJ0KGFSYW5rID49IDIgJiYgYlJhbmsgPj0gMiAmJiBiYXRjaERpbXNDb21wYXRpYmxlLCAoKSA9PiBgRXJyb3IgaW4gbWF0TXVsOiB0aGUgaW5wdXQgYmF0Y2ggZGltZW5zaW9ucyBtdXN0IGVpdGhlciBiZSB0aGUgYCArXG4gICAgICAgIGBzYW1lIG9yIGF0IGxlYXN0IG9uZSBpbnB1dCBiYXRjaCBkaW1lbnNpb24gbXVzdCBiZSAxLiBHb3QgaW5wdXQgYCArXG4gICAgICAgIGBiYXRjaCBkaW1lbnNpb25zIG9mICgke291dGVyRGltc0F9KSBhbmQgKCR7b3V0ZXJEaW1zQn0pLmApO1xuICAgIGNvbnN0IG91dFNoYXBlT3V0ZXJEaW1zID0gYmF0Y2hEaW1BID4gYmF0Y2hEaW1CID8gYS5zaGFwZS5zbGljZSgwLCAtMikgOiBiLnNoYXBlLnNsaWNlKDAsIC0yKTtcbiAgICBjb25zdCBvdXRTaGFwZSA9IG91dFNoYXBlT3V0ZXJEaW1zLmNvbmNhdChbb3V0ZXJTaGFwZUEsIG91dGVyU2hhcGVCXSk7XG4gICAgdXRpbC5hc3NlcnQoaW5uZXJTaGFwZUEgPT09IGlubmVyU2hhcGVCLCAoKSA9PiBgRXJyb3IgaW4gbWF0TXVsOiBpbm5lciBzaGFwZXMgKCR7aW5uZXJTaGFwZUF9KSBhbmQgKGAgK1xuICAgICAgICBgJHtpbm5lclNoYXBlQn0pIG9mIFRlbnNvcnMgd2l0aCBzaGFwZXMgJHthLnNoYXBlfSBhbmQgYCArXG4gICAgICAgIGAke2Iuc2hhcGV9IGFuZCB0cmFuc3Bvc2VBPSR7dHJhbnNwb3NlQX1gICtcbiAgICAgICAgYCBhbmQgdHJhbnNwb3NlQj0ke3RyYW5zcG9zZUJ9IG11c3QgbWF0Y2guYCk7XG4gICAgY29uc3QgYTNkU2hhcGUgPSB0cmFuc3Bvc2VBID8gW2JhdGNoRGltQSwgaW5uZXJTaGFwZUEsIG91dGVyU2hhcGVBXSA6XG4gICAgICAgIFtiYXRjaERpbUEsIG91dGVyU2hhcGVBLCBpbm5lclNoYXBlQV07XG4gICAgY29uc3QgYjNkU2hhcGUgPSB0cmFuc3Bvc2VCID8gW2JhdGNoRGltQiwgb3V0ZXJTaGFwZUIsIGlubmVyU2hhcGVCXSA6XG4gICAgICAgIFtiYXRjaERpbUIsIGlubmVyU2hhcGVCLCBvdXRlclNoYXBlQl07XG4gICAgLy8gVGhlIHJlc3Qgb2YgdGhlIGltcGxlbWVudGF0aW9uIGlzIGRlc2lnbmVkIHRvIG9wZXJhdGUgb24gcmFuay0zIHRlbnNvcnNcbiAgICBjb25zdCBhM2QgPSByZXNoYXBlKHsgaW5wdXRzOiB7IHg6IGEgfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGU6IGEzZFNoYXBlIH0gfSk7XG4gICAgY29uc3QgYjNkID0gcmVzaGFwZSh7IGlucHV0czogeyB4OiBiIH0sIGJhY2tlbmQsIGF0dHJzOiB7IHNoYXBlOiBiM2RTaGFwZSB9IH0pO1xuICAgIGNvbnN0IGEzZElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KGEzZC5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IGIzZElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KGIzZC5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IGxlZnREaW0gPSB0cmFuc3Bvc2VBID8gYTNkLnNoYXBlWzJdIDogYTNkLnNoYXBlWzFdO1xuICAgIGNvbnN0IHJpZ2h0RGltID0gdHJhbnNwb3NlQiA/IGIzZC5zaGFwZVsxXSA6IGIzZC5zaGFwZVsyXTtcbiAgICBjb25zdCBiYXRjaERpbSA9IE1hdGgubWF4KGJhdGNoRGltQSwgYmF0Y2hEaW1CKTtcbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQoW2JhdGNoRGltLCBsZWZ0RGltLCByaWdodERpbV0sIGEzZC5kdHlwZSk7XG4gICAgY29uc3Qgb3V0SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQob3V0LmRhdGFJZCkuaWQ7XG4gICAgY29uc3QgYVNoYXBlQnl0ZXMgPSBuZXcgVWludDhBcnJheShuZXcgSW50MzJBcnJheShhM2Quc2hhcGUpLmJ1ZmZlcik7XG4gICAgY29uc3QgYlNoYXBlQnl0ZXMgPSBuZXcgVWludDhBcnJheShuZXcgSW50MzJBcnJheShiM2Quc2hhcGUpLmJ1ZmZlcik7XG4gICAgd2FzbUJhdGNoTWF0TXVsKGEzZElkLCBhU2hhcGVCeXRlcywgYTNkLnNoYXBlLmxlbmd0aCwgYjNkSWQsIGJTaGFwZUJ5dGVzLCBiM2Quc2hhcGUubGVuZ3RoLCB0cmFuc3Bvc2VBLCB0cmFuc3Bvc2VCLCBvdXRJZCk7XG4gICAgYmFja2VuZC5kaXNwb3NlRGF0YShhM2QuZGF0YUlkKTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VEYXRhKGIzZC5kYXRhSWQpO1xuICAgIG91dC5zaGFwZSA9IG91dFNoYXBlO1xuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3QgYmF0Y2hNYXRNdWxDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQmF0Y2hNYXRNdWwsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBzZXR1cEZ1bmM6IHNldHVwLFxuICAgIGtlcm5lbEZ1bmM6IGJhdGNoTWF0TXVsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QmF0Y2hNYXRNdWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBCYXRjaFRvU3BhY2VORCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9SZXNoYXBlJztcbmltcG9ydCB7IHNsaWNlIH0gZnJvbSAnLi9TbGljZSc7XG5pbXBvcnQgeyB0cmFuc3Bvc2UgfSBmcm9tICcuL1RyYW5zcG9zZSc7XG5mdW5jdGlvbiBiYXRjaFRvU3BhY2VORChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgYmxvY2tTaGFwZSwgY3JvcHMgfSA9IGF0dHJzO1xuICAgIGNvbnN0IHByb2QgPSBibG9ja1NoYXBlLnJlZHVjZSgoYSwgYikgPT4gYSAqIGIpO1xuICAgIGNvbnN0IHJlc2hhcGVkID0gYmFja2VuZF91dGlsLmdldFJlc2hhcGVkKHguc2hhcGUsIGJsb2NrU2hhcGUsIHByb2QpO1xuICAgIGNvbnN0IHBlcm11dGVkID0gYmFja2VuZF91dGlsLmdldFBlcm11dGVkKHJlc2hhcGVkLmxlbmd0aCwgYmxvY2tTaGFwZS5sZW5ndGgpO1xuICAgIGNvbnN0IHJlc2hhcGVkUGVybXV0ZWQgPSBiYWNrZW5kX3V0aWwuZ2V0UmVzaGFwZWRQZXJtdXRlZCh4LnNoYXBlLCBibG9ja1NoYXBlLCBwcm9kKTtcbiAgICBjb25zdCBzbGljZUJlZ2luQ29vcmRzID0gYmFja2VuZF91dGlsLmdldFNsaWNlQmVnaW5Db29yZHMoY3JvcHMsIGJsb2NrU2hhcGUubGVuZ3RoKTtcbiAgICBjb25zdCBzbGljZVNpemUgPSBiYWNrZW5kX3V0aWwuZ2V0U2xpY2VTaXplKHJlc2hhcGVkUGVybXV0ZWQsIGNyb3BzLCBibG9ja1NoYXBlLmxlbmd0aCk7XG4gICAgY29uc3QgeFJlc2hhcGVkID0gcmVzaGFwZSh7IGlucHV0czogeyB4IH0sIGJhY2tlbmQsIGF0dHJzOiB7IHNoYXBlOiByZXNoYXBlZCB9IH0pO1xuICAgIGNvbnN0IHhUcmFuc3Bvc2VkID0gdHJhbnNwb3NlKHsgaW5wdXRzOiB7IHg6IHhSZXNoYXBlZCB9LCBiYWNrZW5kLCBhdHRyczogeyBwZXJtOiBwZXJtdXRlZCB9IH0pO1xuICAgIGNvbnN0IHhUcmFuc3Bvc2VkUmVzaGFwZWQgPSByZXNoYXBlKHsgaW5wdXRzOiB7IHg6IHhUcmFuc3Bvc2VkIH0sIGJhY2tlbmQsIGF0dHJzOiB7IHNoYXBlOiByZXNoYXBlZFBlcm11dGVkIH0gfSk7XG4gICAgY29uc3QgcmVzdWx0ID0gc2xpY2Uoe1xuICAgICAgICBpbnB1dHM6IHsgeDogeFRyYW5zcG9zZWRSZXNoYXBlZCB9LFxuICAgICAgICBiYWNrZW5kLFxuICAgICAgICBhdHRyczogeyBiZWdpbjogc2xpY2VCZWdpbkNvb3Jkcywgc2l6ZTogc2xpY2VTaXplIH1cbiAgICB9KTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VEYXRhKHhSZXNoYXBlZC5kYXRhSWQpO1xuICAgIGJhY2tlbmQuZGlzcG9zZURhdGEoeFRyYW5zcG9zZWQuZGF0YUlkKTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VEYXRhKHhSZXNoYXBlZC5kYXRhSWQpO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5leHBvcnQgY29uc3QgYmF0Y2hUb1NwYWNlTkRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQmF0Y2hUb1NwYWNlTkQsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBrZXJuZWxGdW5jOiBiYXRjaFRvU3BhY2VORFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJhdGNoVG9TcGFjZU5ELmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IENhc3QgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuZXhwb3J0IGZ1bmN0aW9uIGNhc3QoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzOiB7IHggfSwgYXR0cnM6IHsgZHR5cGUgfSwgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQoeC5zaGFwZSwgZHR5cGUpO1xuICAgIGNvbnN0IGluVmFscyA9IGJhY2tlbmQudHlwZWRBcnJheUZyb21IZWFwKHgpO1xuICAgIGNvbnN0IG91dFZhbHMgPSBiYWNrZW5kLnR5cGVkQXJyYXlGcm9tSGVhcChvdXQpO1xuICAgIG91dFZhbHMuc2V0KGluVmFscyk7XG4gICAgcmV0dXJuIG91dDtcbn1cbmV4cG9ydCBjb25zdCBjYXN0Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IENhc3QsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBrZXJuZWxGdW5jOiBjYXN0LFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNhc3QuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQ2VpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVVbmFyeUtlcm5lbENvbmZpZyB9IGZyb20gJy4vdW5hcnlfa2VybmVsJztcbmV4cG9ydCBjb25zdCBjZWlsQ29uZmlnID0gY3JlYXRlVW5hcnlLZXJuZWxDb25maWcoQ2VpbCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DZWlsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IENsaXBCeVZhbHVlIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmxldCB3YXNtQ2xpcDtcbmZ1bmN0aW9uIHNldHVwKGJhY2tlbmQpIHtcbiAgICB3YXNtQ2xpcCA9IGJhY2tlbmQud2FzbS5jd3JhcChDbGlwQnlWYWx1ZSwgbnVsbCAvKiB2b2lkICovLCBbXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInIC8vIG91dF9pZFxuICAgIF0pO1xufVxuZnVuY3Rpb24gY2xpcChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgY2xpcFZhbHVlTWluLCBjbGlwVmFsdWVNYXggfSA9IGF0dHJzO1xuICAgIGNvbnN0IHhJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldCh4LmRhdGFJZCkuaWQ7XG4gICAgY29uc3Qgb3V0ID0gYmFja2VuZC5tYWtlT3V0cHV0KHguc2hhcGUsIHguZHR5cGUpO1xuICAgIGNvbnN0IG91dElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KG91dC5kYXRhSWQpLmlkO1xuICAgIHdhc21DbGlwKHhJZCwgY2xpcFZhbHVlTWluLCBjbGlwVmFsdWVNYXgsIG91dElkKTtcbiAgICByZXR1cm4gb3V0O1xufVxuZXhwb3J0IGNvbnN0IGNsaXBCeVZhbHVlQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IENsaXBCeVZhbHVlLFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAgc2V0dXBGdW5jOiBzZXR1cCxcbiAgICBrZXJuZWxGdW5jOiBjbGlwXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q2xpcEJ5VmFsdWUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBDb25jYXQsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY29uY2F0SW1wbENQVSB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuaW1wb3J0IHsgaWRlbnRpdHkgfSBmcm9tICcuL0lkZW50aXR5JztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL1Jlc2hhcGUnO1xuZXhwb3J0IGZ1bmN0aW9uIGNvbmNhdChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQgfSA9IGFyZ3M7XG4gICAgY29uc3QgYXhpcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oYXJncy5hdHRycy5heGlzLCBpbnB1dHNbMF0uc2hhcGUpWzBdO1xuICAgIGxldCBvdXRTaGFwZSA9IGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0U2hhcGUoaW5wdXRzLm1hcCh0ID0+IHQuc2hhcGUpLCBheGlzKTtcbiAgICAvLyBLZWVwIG9ubHkgbm9uLWVtcHR5IHRlbnNvcnMgKGlnbm9yZSB0ZW5zb3JzIHdpdGggMCBpbiB0aGVpciBzaGFwZSkuXG4gICAgY29uc3QgJGlucHV0cyA9IGlucHV0cy5maWx0ZXIodCA9PiB1dGlsLnNpemVGcm9tU2hhcGUodC5zaGFwZSkgPiAwKTtcbiAgICBpZiAoJGlucHV0cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIGlkZW50aXR5KHsgaW5wdXRzOiB7IHg6ICRpbnB1dHNbMF0gfSwgYmFja2VuZCB9KTtcbiAgICB9XG4gICAgY29uc3Qgb3V0ID0gYmFja2VuZC5tYWtlT3V0cHV0KG91dFNoYXBlLCBpbnB1dHNbMF0uZHR5cGUpO1xuICAgIGlmICh1dGlsLnNpemVGcm9tU2hhcGUob3V0U2hhcGUpID09PSAwKSB7XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuICAgIGNvbnN0IHNoYXBlcyA9ICRpbnB1dHMubWFwKHQgPT4gdC5zaGFwZSk7XG4gICAgYmFja2VuZF91dGlsLmFzc2VydFBhcmFtc0NvbnNpc3RlbnQoc2hhcGVzLCBheGlzKTtcbiAgICBpZiAoJGlucHV0c1swXS5kdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgLy8gQW55IGNvbmNhdCBvZiBuLWRpbWVuc2lvbmFsIHRlbnNvcnMgYWNyb3NzIGFueSBheGlzIGNhbiBiZSByZWR1Y2VkIHRvXG4gICAgICAgIC8vIGEgY29uY2F0ZW5hdGlvbiBvZiB0d28tZGltZW5zaW9uYWwgdGVuc29ycyBhY3Jvc3MgdGhlIGF4aXMgMSBieSBmaXJzdFxuICAgICAgICAvLyBwYXJ0aXRpb25pbmcgdGhlIGF4ZXMgb2YgdGhlIG9yaWdpbmFsIHRlbnNvcnMgaW50byB0aG9zZSBsZXNzIHRoYW4gdGhlXG4gICAgICAgIC8vIGF4aXMgdG8gYmUgY29uY2F0ZW5hdGVkIGFuZCB0aGUgcmVzdC4gVGhlbiByZXNoYXBlIHRoZSB0ZW5zb3JzXG4gICAgICAgIC8vIGludG8gYSB0d28tZGltZW5zaW9uYWwgdGVuc29yIGJ5IGNvbGxhcHNpbmcgdGhlc2UgdHdvIHNldHMgb2YgYXhlcyBhbmRcbiAgICAgICAgLy8gY29uY2F0ZW5hdGUgdGhlIHJlc3VsdGluZyBtYXRyaWNlcyBhY3Jvc3MgdGhlIGF4aXMgMSwgZmluYWxseSByZXNoYXBpbmdcbiAgICAgICAgLy8gdGhlIHJlc3VsdCB0byBoYXZlIHRoZSBwcm9wZXIgc2hhcGUuXG4gICAgICAgIGNvbnN0IGlucHV0czJEID0gJGlucHV0cy5tYXAodCA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbm5lclNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUodC5zaGFwZS5zbGljZShheGlzKSk7XG4gICAgICAgICAgICBjb25zdCBzaGFwZSA9IFstMSwgaW5uZXJTaXplXTtcbiAgICAgICAgICAgIHJldHVybiByZXNoYXBlKHsgaW5wdXRzOiB7IHg6IHQgfSwgYmFja2VuZCwgYXR0cnM6IHsgc2hhcGUgfSB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGlucHV0c1ZhbFNoYXBlcyA9IGlucHV0czJELm1hcCh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHM6IGJhY2tlbmQucmVhZFN5bmModC5kYXRhSWQpLCBzaGFwZTogdC5zaGFwZSB9O1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gQ29uY2F0cyAyZCB0ZW5zb3JzIGFsb25nIGF4aXM9MS5cbiAgICAgICAgb3V0U2hhcGUgPVxuICAgICAgICAgICAgYmFja2VuZF91dGlsLmNvbXB1dGVPdXRTaGFwZShpbnB1dHMyRC5tYXAodCA9PiB0LnNoYXBlKSwgMSAvKiBheGlzICovKTtcbiAgICAgICAgY29uc3Qgc2ltcGx5Q29uY2F0ID0gaW5wdXRzMkRbMF0uc2hhcGVbMF0gPT09IDE7XG4gICAgICAgIGNvbnN0IG91dFZhbHMgPSBjb25jYXRJbXBsQ1BVKGlucHV0c1ZhbFNoYXBlcywgb3V0U2hhcGUsIGlucHV0c1swXS5kdHlwZSwgc2ltcGx5Q29uY2F0KTtcbiAgICAgICAgY29uc3QgZmluYWxPdXRTaGFwZSA9IGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0U2hhcGUoJGlucHV0cy5tYXAodCA9PiB0LnNoYXBlKSwgYXhpcyk7XG4gICAgICAgIG91dC5zaGFwZSA9IGZpbmFsT3V0U2hhcGU7XG4gICAgICAgIGNvbnN0IG91dERhdGEgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQob3V0LmRhdGFJZCk7XG4gICAgICAgIG91dERhdGEuc3RyaW5nQnl0ZXMgPSBiYWNrZW5kX3V0aWwuZnJvbVN0cmluZ0FycmF5VG9VaW50OChvdXRWYWxzKTtcbiAgICAgICAgaW5wdXRzMkQuZm9yRWFjaCh0ID0+IGJhY2tlbmQuZGlzcG9zZURhdGEodC5kYXRhSWQpKTtcbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG4gICAgY29uc3QgYmF0Y2hEaW0gPSB1dGlsLnNpemVGcm9tU2hhcGUoJGlucHV0c1swXS5zaGFwZS5zbGljZSgwLCBheGlzKSk7XG4gICAgbGV0IHN1bUlubmVyRGltcyA9IDA7XG4gICAgY29uc3QgaW5uZXJEaW1zID0gJGlucHV0cy5tYXAoaW5wdXQgPT4ge1xuICAgICAgICBjb25zdCBpbm5lckRpbSA9IHV0aWwuc2l6ZUZyb21TaGFwZShpbnB1dC5zaGFwZS5zbGljZShheGlzKSk7XG4gICAgICAgIHN1bUlubmVyRGltcyArPSBpbm5lckRpbTtcbiAgICAgICAgcmV0dXJuIGlubmVyRGltO1xuICAgIH0pO1xuICAgIGNvbnN0IGluVmFscyA9ICRpbnB1dHMubWFwKGlucHV0ID0+IGJhY2tlbmQudHlwZWRBcnJheUZyb21IZWFwKGlucHV0KSk7XG4gICAgY29uc3Qgb3V0VmFscyA9IGJhY2tlbmQudHlwZWRBcnJheUZyb21IZWFwKG91dCk7XG4gICAgZm9yIChsZXQgYiA9IDA7IGIgPCBiYXRjaERpbTsgYisrKSB7XG4gICAgICAgIGxldCBvdXRPZmZzZXQgPSBiICogc3VtSW5uZXJEaW1zO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluVmFscy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaW5uZXJEaW0gPSBpbm5lckRpbXNbaV07XG4gICAgICAgICAgICBjb25zdCBpbk9mZnNldCA9IGIgKiBpbm5lckRpbTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHMgPSBpblZhbHNbaV0uc3ViYXJyYXkoaW5PZmZzZXQsIGluT2Zmc2V0ICsgaW5uZXJEaW0pO1xuICAgICAgICAgICAgb3V0VmFscy5zZXQodmFscywgb3V0T2Zmc2V0KTtcbiAgICAgICAgICAgIG91dE9mZnNldCArPSBpbm5lckRpbTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3V0O1xufVxuZXhwb3J0IGNvbnN0IGNvbmNhdENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBDb25jYXQsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBrZXJuZWxGdW5jOiBjb25jYXQsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q29uY2F0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgQ29udjJEIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmxldCB3YXNtQ29udjJkO1xuZnVuY3Rpb24gc2V0dXAoYmFja2VuZCkge1xuICAgIHdhc21Db252MmQgPSBiYWNrZW5kLndhc20uY3dyYXAoQ29udjJELCBudWxsIC8qIHZvaWQgKi8sIFtcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgXSk7XG59XG5mdW5jdGlvbiBjb252MmQoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBhdHRycywgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCB7IHgsIGZpbHRlciB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHhJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldCh4LmRhdGFJZCkuaWQ7XG4gICAgY29uc3QgZmlsdGVySWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoZmlsdGVyLmRhdGFJZCkuaWQ7XG4gICAgY29uc3QgeyBzdHJpZGVzLCBkaWxhdGlvbnMsIHBhZCwgZGltUm91bmRpbmdNb2RlLCBkYXRhRm9ybWF0IH0gPSBhdHRycztcbiAgICBjb25zdCAkZGF0YUZvcm1hdCA9IGJhY2tlbmRfdXRpbC5jb252ZXJ0Q29udjJERGF0YUZvcm1hdChkYXRhRm9ybWF0KTtcbiAgICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlQ29udjJESW5mbyh4LnNoYXBlLCBmaWx0ZXIuc2hhcGUsIHN0cmlkZXMsIGRpbGF0aW9ucywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIGZhbHNlLCAkZGF0YUZvcm1hdCk7XG4gICAgY29uc3QgZmlsdGVySGVpZ2h0ID0gY29udkluZm8uZmlsdGVySGVpZ2h0O1xuICAgIGNvbnN0IGZpbHRlcldpZHRoID0gY29udkluZm8uZmlsdGVyV2lkdGg7XG4gICAgY29uc3QgcGFkVG9wID0gY29udkluZm8ucGFkSW5mby50b3A7XG4gICAgY29uc3QgcGFkUmlnaHQgPSBjb252SW5mby5wYWRJbmZvLnJpZ2h0O1xuICAgIGNvbnN0IHBhZEJvdHRvbSA9IGNvbnZJbmZvLnBhZEluZm8uYm90dG9tO1xuICAgIGNvbnN0IHBhZExlZnQgPSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG4gICAgY29uc3QgZGlsYXRpb25IZWlnaHQgPSBjb252SW5mby5kaWxhdGlvbkhlaWdodDtcbiAgICBjb25zdCBkaWxhdGlvbldpZHRoID0gY29udkluZm8uZGlsYXRpb25XaWR0aDtcbiAgICBjb25zdCBzdHJpZGVIZWlnaHQgPSBjb252SW5mby5zdHJpZGVIZWlnaHQ7XG4gICAgY29uc3Qgc3RyaWRlV2lkdGggPSBjb252SW5mby5zdHJpZGVXaWR0aDtcbiAgICBjb25zdCBpbnB1dENoYW5uZWxzID0gY29udkluZm8uaW5DaGFubmVscztcbiAgICBjb25zdCBvdXRwdXRDaGFubmVscyA9IGNvbnZJbmZvLm91dENoYW5uZWxzO1xuICAgIGNvbnN0IGlzU2FtZVBhZCA9IGNvbnZJbmZvLnBhZEluZm8udHlwZSA9PT0gJ1NBTUUnID8gMSA6IDA7XG4gICAgaWYgKGNvbnZJbmZvLmRhdGFGb3JtYXQgIT09ICdjaGFubmVsc0xhc3QnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgd2FzbSBiYWNrZW5kIENvbnYyRCBkb2VzIG5vdCBzdXBwb3J0IGRhdGFGb3JtYXQ6J2AgK1xuICAgICAgICAgICAgYCR7Y29udkluZm8uZGF0YUZvcm1hdH0nLiBQbGVhc2UgdXNlICdjaGFubmVsc0xhc3QnLmApO1xuICAgIH1cbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQoY29udkluZm8ub3V0U2hhcGUsICdmbG9hdDMyJyk7XG4gICAgY29uc3Qgb3V0SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQob3V0LmRhdGFJZCkuaWQ7XG4gICAgd2FzbUNvbnYyZCh4SWQsIHguc2hhcGVbMF0sIHguc2hhcGVbMV0sIHguc2hhcGVbMl0sIGZpbHRlcklkLCBmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoLCBwYWRUb3AsIHBhZFJpZ2h0LCBwYWRCb3R0b20sIHBhZExlZnQsIGlzU2FtZVBhZCwgZGlsYXRpb25IZWlnaHQsIGRpbGF0aW9uV2lkdGgsIHN0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGgsIGlucHV0Q2hhbm5lbHMsIG91dHB1dENoYW5uZWxzLCBvdXRJZCk7XG4gICAgcmV0dXJuIG91dDtcbn1cbmV4cG9ydCBjb25zdCBjb252MkRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQ29udjJELFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAgc2V0dXBGdW5jOiBzZXR1cCxcbiAgICBrZXJuZWxGdW5jOiBjb252MmRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Db252MkQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBDb252MkRCYWNrcHJvcElucHV0LCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmxldCB3YXNtQ29udjJEQmFja3Byb3BJbnB1dDtcbmZ1bmN0aW9uIHNldHVwKGJhY2tlbmQpIHtcbiAgICB3YXNtQ29udjJEQmFja3Byb3BJbnB1dCA9IGJhY2tlbmQud2FzbS5jd3JhcChDb252MkRCYWNrcHJvcElucHV0LCBudWxsLCBbXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgXSk7XG59XG5mdW5jdGlvbiBjb252MkRCYWNrcHJvcElucHV0KGFyZ3MpIHtcbiAgICBjb25zdCB7IGJhY2tlbmQsIGlucHV0cywgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBkeSwgZmlsdGVyIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBzdHJpZGVzLCBwYWQsIGRhdGFGb3JtYXQsIGRpbVJvdW5kaW5nTW9kZSwgaW5wdXRTaGFwZSB9ID0gYXR0cnM7XG4gICAgY29uc3QgZGlsYXRpb25zID0gMTtcbiAgICBjb25zdCAkZGF0YUZvcm1hdCA9IGJhY2tlbmRfdXRpbC5jb252ZXJ0Q29udjJERGF0YUZvcm1hdChkYXRhRm9ybWF0KTtcbiAgICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlQ29udjJESW5mbyhpbnB1dFNoYXBlLCBmaWx0ZXIuc2hhcGUsIHN0cmlkZXMsIGRpbGF0aW9ucywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIGZhbHNlIC8qIGRlcHRod2lzZSAqLywgJGRhdGFGb3JtYXQpO1xuICAgIGNvbnN0IHsgYmF0Y2hTaXplLCBmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoLCBpbkNoYW5uZWxzLCBpbkhlaWdodCwgaW5XaWR0aCwgb3V0Q2hhbm5lbHMsIG91dEhlaWdodCwgb3V0V2lkdGgsIHN0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGggfSA9IGNvbnZJbmZvO1xuICAgIGNvbnN0IHRvcFBhZCA9IGZpbHRlckhlaWdodCAtIDEgLSBjb252SW5mby5wYWRJbmZvLnRvcDtcbiAgICBjb25zdCBsZWZ0UGFkID0gZmlsdGVyV2lkdGggLSAxIC0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuICAgIGNvbnN0IGlzQ2hhbm5lbHNMYXN0ID0gY29udkluZm8uZGF0YUZvcm1hdCA9PT0gJ2NoYW5uZWxzTGFzdCc7XG4gICAgY29uc3QgZHhTdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyhjb252SW5mby5pblNoYXBlKTtcbiAgICBjb25zdCBkeVN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKGR5LnNoYXBlKTtcbiAgICBjb25zdCBbZmx0UzAsIGZsdFMxLCBmbHRTMl0gPSB1dGlsLmNvbXB1dGVTdHJpZGVzKGZpbHRlci5zaGFwZSk7XG4gICAgY29uc3QgeEJhdGNoU3RyaWRlID0gZHhTdHJpZGVzWzBdO1xuICAgIGNvbnN0IHhSb3dTdHJpZGUgPSBpc0NoYW5uZWxzTGFzdCA/IGR4U3RyaWRlc1sxXSA6IGR4U3RyaWRlc1syXTtcbiAgICBjb25zdCB4Q29sU3RyaWRlID0gaXNDaGFubmVsc0xhc3QgPyBkeFN0cmlkZXNbMl0gOiAxO1xuICAgIGNvbnN0IHhDaGFubmVsU3RyaWRlID0gaXNDaGFubmVsc0xhc3QgPyAxIDogZHhTdHJpZGVzWzFdO1xuICAgIGNvbnN0IHlCYXRjaFN0cmlkZSA9IGR5U3RyaWRlc1swXTtcbiAgICBjb25zdCB5Um93U3RyaWRlID0gaXNDaGFubmVsc0xhc3QgPyBkeVN0cmlkZXNbMV0gOiBkeVN0cmlkZXNbMl07XG4gICAgY29uc3QgeUNvbFN0cmlkZSA9IGlzQ2hhbm5lbHNMYXN0ID8gZHlTdHJpZGVzWzJdIDogMTtcbiAgICBjb25zdCB5Q2hhbm5lbFN0cmlkZSA9IGlzQ2hhbm5lbHNMYXN0ID8gMSA6IGR5U3RyaWRlc1sxXTtcbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQoY29udkluZm8uaW5TaGFwZSwgJ2Zsb2F0MzInKTtcbiAgICBjb25zdCBvdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXQuZGF0YUlkKS5pZDtcbiAgICBjb25zdCBkeUlkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KGR5LmRhdGFJZCkuaWQ7XG4gICAgY29uc3QgZmlsdGVySWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoZmlsdGVyLmRhdGFJZCkuaWQ7XG4gICAgd2FzbUNvbnYyREJhY2twcm9wSW5wdXQoZHlJZCwgZmlsdGVySWQsIGJhdGNoU2l6ZSwgZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgaW5IZWlnaHQsIGluV2lkdGgsIGluQ2hhbm5lbHMsIG91dEhlaWdodCwgb3V0V2lkdGgsIG91dENoYW5uZWxzLCBzdHJpZGVIZWlnaHQsIHN0cmlkZVdpZHRoLCB0b3BQYWQsIGxlZnRQYWQsIGZsdFMwLCBmbHRTMSwgZmx0UzIsIHhCYXRjaFN0cmlkZSwgeFJvd1N0cmlkZSwgeENvbFN0cmlkZSwgeENoYW5uZWxTdHJpZGUsIHlCYXRjaFN0cmlkZSwgeVJvd1N0cmlkZSwgeUNvbFN0cmlkZSwgeUNoYW5uZWxTdHJpZGUsIG91dElkKTtcbiAgICByZXR1cm4gb3V0O1xufVxuZXhwb3J0IGNvbnN0IGNvbnYyREJhY2twcm9wSW5wdXRDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogQ29udjJEQmFja3Byb3BJbnB1dCxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIHNldHVwRnVuYzogc2V0dXAsXG4gICAga2VybmVsRnVuYzogY29udjJEQmFja3Byb3BJbnB1dFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNvbnYyREJhY2twcm9wSW5wdXQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQ29zIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVVuYXJ5S2VybmVsQ29uZmlnIH0gZnJvbSAnLi91bmFyeV9rZXJuZWwnO1xuZXhwb3J0IGNvbnN0IGNvc0NvbmZpZyA9IGNyZWF0ZVVuYXJ5S2VybmVsQ29uZmlnKENvcyk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Db3MuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgQ29zaCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVVbmFyeUtlcm5lbENvbmZpZyB9IGZyb20gJy4vdW5hcnlfa2VybmVsJztcbmV4cG9ydCBjb25zdCBjb3NoQ29uZmlnID0gY3JlYXRlVW5hcnlLZXJuZWxDb25maWcoQ29zaCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Db3NoLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IENyb3BBbmRSZXNpemUgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY2FzdCB9IGZyb20gJy4vQ2FzdCc7XG4vLyBNdXN0IG1hdGNoIGVudW0gaW4gQ3JvcEFuZFJlc2l6ZS5jY1xudmFyIEludGVycG9sYXRpb25NZXRob2Q7XG4oZnVuY3Rpb24gKEludGVycG9sYXRpb25NZXRob2QpIHtcbiAgICBJbnRlcnBvbGF0aW9uTWV0aG9kW0ludGVycG9sYXRpb25NZXRob2RbXCJiaWxpbmVhclwiXSA9IDBdID0gXCJiaWxpbmVhclwiO1xuICAgIEludGVycG9sYXRpb25NZXRob2RbSW50ZXJwb2xhdGlvbk1ldGhvZFtcIm5lYXJlc3RcIl0gPSAxXSA9IFwibmVhcmVzdFwiO1xufSkoSW50ZXJwb2xhdGlvbk1ldGhvZCB8fCAoSW50ZXJwb2xhdGlvbk1ldGhvZCA9IHt9KSk7XG5sZXQgd2FzbUNyb3BBbmRSZXNpemU7XG5mdW5jdGlvbiBzZXR1cChiYWNrZW5kKSB7XG4gICAgd2FzbUNyb3BBbmRSZXNpemUgPSBiYWNrZW5kLndhc20uY3dyYXAoQ3JvcEFuZFJlc2l6ZSwgbnVsbCAvKnZvaWQqLywgW1xuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ2FycmF5JyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInIC8vIG91dCBpZFxuICAgIF0pO1xufVxuZnVuY3Rpb24gY3JvcEFuZFJlc2l6ZShhcmdzKSB7XG4gICAgY29uc3QgeyBiYWNrZW5kLCBpbnB1dHMsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgbWV0aG9kLCBleHRyYXBvbGF0aW9uVmFsdWUsIGNyb3BTaXplIH0gPSBhdHRycztcbiAgICBjb25zdCB7IGltYWdlLCBib3hlcywgYm94SW5kIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgbnVtQm94ZXMgPSBib3hlcy5zaGFwZVswXTtcbiAgICBjb25zdCBbY3JvcEhlaWdodCwgY3JvcFdpZHRoXSA9IGNyb3BTaXplO1xuICAgIGNvbnN0IG91dFNoYXBlID0gW251bUJveGVzLCBjcm9wSGVpZ2h0LCBjcm9wV2lkdGgsIGltYWdlLnNoYXBlWzNdXTtcbiAgICBsZXQgaW1hZ2VzRGF0YSA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChpbWFnZS5kYXRhSWQpO1xuICAgIGxldCBjYXN0ZWREYXRhO1xuICAgIGlmIChpbWFnZS5kdHlwZSAhPT0gJ2Zsb2F0MzInKSB7XG4gICAgICAgIGNhc3RlZERhdGEgPSBjYXN0KHsgYmFja2VuZCwgaW5wdXRzOiB7IHg6IGltYWdlIH0sIGF0dHJzOiB7IGR0eXBlOiAnZmxvYXQzMicgfSB9KTtcbiAgICAgICAgaW1hZ2VzRGF0YSA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChjYXN0ZWREYXRhLmRhdGFJZCk7XG4gICAgfVxuICAgIGNvbnN0IGltYWdlc0lkID0gaW1hZ2VzRGF0YS5pZDtcbiAgICBjb25zdCBib3hlc0lkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KGJveGVzLmRhdGFJZCkuaWQ7XG4gICAgY29uc3QgYm94SW5kSWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoYm94SW5kLmRhdGFJZCkuaWQ7XG4gICAgY29uc3Qgb3V0ID0gYmFja2VuZC5tYWtlT3V0cHV0KG91dFNoYXBlLCAnZmxvYXQzMicpO1xuICAgIGNvbnN0IG91dElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KG91dC5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IGltYWdlc1NoYXBlQnl0ZXMgPSBuZXcgVWludDhBcnJheShuZXcgSW50MzJBcnJheShpbWFnZS5zaGFwZSkuYnVmZmVyKTtcbiAgICB3YXNtQ3JvcEFuZFJlc2l6ZShpbWFnZXNJZCwgYm94ZXNJZCwgYm94SW5kSWQsIG51bUJveGVzLCBpbWFnZXNTaGFwZUJ5dGVzLCBjcm9wSGVpZ2h0LCBjcm9wV2lkdGgsIEludGVycG9sYXRpb25NZXRob2RbbWV0aG9kXSwgZXh0cmFwb2xhdGlvblZhbHVlLCBvdXRJZCk7XG4gICAgaWYgKGNhc3RlZERhdGEgIT0gbnVsbCkge1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VEYXRhKGNhc3RlZERhdGEuZGF0YUlkKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbn1cbmV4cG9ydCBjb25zdCBjcm9wQW5kUmVzaXplQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IENyb3BBbmRSZXNpemUsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBzZXR1cEZ1bmM6IHNldHVwLFxuICAgIGtlcm5lbEZ1bmM6IGNyb3BBbmRSZXNpemVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Dcm9wQW5kUmVzaXplLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgQ3Vtc3VtLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IENwcERUeXBlIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyB0cmFuc3Bvc2UgfSBmcm9tICcuL1RyYW5zcG9zZSc7XG5sZXQgd2FzbUN1bXN1bTtcbmZ1bmN0aW9uIHNldHVwKGJhY2tlbmQpIHtcbiAgICB3YXNtQ3Vtc3VtID0gYmFja2VuZC53YXNtLmN3cmFwKEN1bXN1bSwgbnVsbCAvKiB2b2lkICovLCBbXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicgLy8gZHR5cGVcbiAgICBdKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjdW1zdW0oYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGF4aXMsIGV4Y2x1c2l2ZSwgcmV2ZXJzZSB9ID0gYXR0cnM7XG4gICAgY29uc3QgeFJhbmsgPSB4LnNoYXBlLmxlbmd0aDtcbiAgICB1dGlsLmFzc2VydCh4LmR0eXBlID09PSAnZmxvYXQzMicgfHwgeC5kdHlwZSA9PT0gJ2ludDMyJywgKCkgPT4gYGN1bXN1bSBkb2VzIG5vdCBzdXBwb3J0ICR7eC5kdHlwZX0gdGVuc29ycyBpbiB0aGUgV0FTTSBiYWNrZW5kYCk7XG4gICAgLy8gcGVybXV0ZSByZXF1aXJlZCBheGlzIHRvIGlubmVyIG1vc3QgYXhpc1xuICAgIGNvbnN0IHBlcm11dGF0aW9uID0gYmFja2VuZF91dGlsLmdldEF4ZXNQZXJtdXRhdGlvbihbYXhpc10sIHhSYW5rKTtcbiAgICBsZXQgcGVybXV0ZWRYID0geDtcbiAgICBpZiAocGVybXV0YXRpb24gIT09IG51bGwpIHtcbiAgICAgICAgcGVybXV0ZWRYID0gdHJhbnNwb3NlKHsgaW5wdXRzOiB7IHggfSwgYXR0cnM6IHsgcGVybTogcGVybXV0YXRpb24gfSwgYmFja2VuZCB9KTtcbiAgICB9XG4gICAgY29uc3QgcGVybXV0ZWRBeGlzID0gYmFja2VuZF91dGlsLmdldElubmVyTW9zdEF4ZXMoMSwgeFJhbmspWzBdO1xuICAgIGJhY2tlbmRfdXRpbC5hc3NlcnRBeGVzQXJlSW5uZXJNb3N0RGltcygnY3Vtc3VtJywgW3Blcm11dGVkQXhpc10sIHhSYW5rKTtcbiAgICBjb25zdCBwZXJtdXRlZE91dCA9IGJhY2tlbmQubWFrZU91dHB1dChwZXJtdXRlZFguc2hhcGUsIHBlcm11dGVkWC5kdHlwZSk7XG4gICAgY29uc3QgZmluYWxEaW0gPSBwZXJtdXRlZFguc2hhcGVbcGVybXV0ZWRBeGlzXTtcbiAgICBjb25zdCBwZXJtdXRlZFhJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChwZXJtdXRlZFguZGF0YUlkKS5pZDtcbiAgICBjb25zdCBwZXJtdXRlZE91dElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KHBlcm11dGVkT3V0LmRhdGFJZCkuaWQ7XG4gICAgd2FzbUN1bXN1bShwZXJtdXRlZFhJZCwgZXhjbHVzaXZlID8gMSA6IDAsIHJldmVyc2UgPyAxIDogMCwgZmluYWxEaW0sIHBlcm11dGVkT3V0SWQsIENwcERUeXBlW3guZHR5cGVdKTtcbiAgICAvLyB0cmFuc3Bvc2UgZGF0YSBiYWNrIGlmIHBlcm11dGVkXG4gICAgbGV0IG91dCA9IHBlcm11dGVkT3V0O1xuICAgIGlmIChwZXJtdXRhdGlvbiAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCB1bmRvUGVybXV0YXRpb24gPSBiYWNrZW5kX3V0aWwuZ2V0VW5kb0F4ZXNQZXJtdXRhdGlvbihwZXJtdXRhdGlvbik7XG4gICAgICAgIG91dCA9IHRyYW5zcG9zZSh7IGlucHV0czogeyB4OiBwZXJtdXRlZE91dCB9LCBhdHRyczogeyBwZXJtOiB1bmRvUGVybXV0YXRpb24gfSwgYmFja2VuZCB9KTtcbiAgICAgICAgYmFja2VuZC5kaXNwb3NlRGF0YShwZXJtdXRlZFguZGF0YUlkKTtcbiAgICAgICAgYmFja2VuZC5kaXNwb3NlRGF0YShwZXJtdXRlZE91dC5kYXRhSWQpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xufVxuZXhwb3J0IGNvbnN0IGN1bXN1bUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBDdW1zdW0sXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBzZXR1cEZ1bmM6IHNldHVwLFxuICAgIGtlcm5lbEZ1bmM6IGN1bXN1bVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUN1bXN1bS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBEZXB0aFRvU3BhY2UsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xubGV0IHdhc21EZXB0aFRvU3BhY2U7XG5mdW5jdGlvbiBzZXR1cChiYWNrZW5kKSB7XG4gICAgd2FzbURlcHRoVG9TcGFjZSA9IGJhY2tlbmQud2FzbS5jd3JhcChEZXB0aFRvU3BhY2UsIG51bGwgLyp2b2lkKi8sIFtcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ2FycmF5JyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdhcnJheScsXG4gICAgICAgICdhcnJheScsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICBdKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBkZXB0aFRvU3BhY2UoYXJncykge1xuICAgIGNvbnN0IHsgYmFja2VuZCwgaW5wdXRzLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGJsb2NrU2l6ZSwgZGF0YUZvcm1hdCB9ID0gYXR0cnM7XG4gICAgdXRpbC5hc3NlcnQoYmxvY2tTaXplID4gMSwgKCkgPT4gYGJsb2NrU2l6ZSBzaG91bGQgYmUgPiAxIGZvciBkZXB0aFRvU3BhY2UsIGJ1dCB3YXM6ICR7YmxvY2tTaXplfWApO1xuICAgIGNvbnN0IGJhdGNoU2l6ZSA9IHguc2hhcGVbMF07XG4gICAgY29uc3QgaW5wdXRIZWlnaHQgPSAoZGF0YUZvcm1hdCA9PT0gJ05IV0MnKSA/IHguc2hhcGVbMV0gOiB4LnNoYXBlWzJdO1xuICAgIGNvbnN0IGlucHV0V2lkdGggPSAoZGF0YUZvcm1hdCA9PT0gJ05IV0MnKSA/IHguc2hhcGVbMl0gOiB4LnNoYXBlWzNdO1xuICAgIGNvbnN0IGlucHV0RGVwdGggPSAoZGF0YUZvcm1hdCA9PT0gJ05IV0MnKSA/IHguc2hhcGVbM10gOiB4LnNoYXBlWzFdO1xuICAgIGNvbnN0IG91dHB1dEhlaWdodCA9IGlucHV0SGVpZ2h0ICogYmxvY2tTaXplO1xuICAgIGNvbnN0IG91dHB1dFdpZHRoID0gaW5wdXRXaWR0aCAqIGJsb2NrU2l6ZTtcbiAgICBjb25zdCBvdXRwdXREZXB0aCA9IGlucHV0RGVwdGggLyAoYmxvY2tTaXplICogYmxvY2tTaXplKTtcbiAgICBjb25zdCBvdXRwdXRTaGFwZSA9IChkYXRhRm9ybWF0ID09PSAnTkhXQycpID9cbiAgICAgICAgW2JhdGNoU2l6ZSwgb3V0cHV0SGVpZ2h0LCBvdXRwdXRXaWR0aCwgb3V0cHV0RGVwdGhdIDpcbiAgICAgICAgW2JhdGNoU2l6ZSwgb3V0cHV0RGVwdGgsIG91dHB1dEhlaWdodCwgb3V0cHV0V2lkdGhdO1xuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dChvdXRwdXRTaGFwZSwgJ2Zsb2F0MzInKTtcbiAgICBjb25zdCB4RGF0YSA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldCh4LmRhdGFJZCk7XG4gICAgY29uc3QgeElkID0geERhdGEuaWQ7XG4gICAgY29uc3QgeFN0cmlkZXNCeXRlcyA9IG5ldyBVaW50OEFycmF5KG5ldyBJbnQzMkFycmF5KHV0aWwuY29tcHV0ZVN0cmlkZXMoeC5zaGFwZSkpLmJ1ZmZlcik7XG4gICAgY29uc3Qgb3V0cHV0U2hhcGVCeXRlcyA9IG5ldyBVaW50OEFycmF5KG5ldyBJbnQzMkFycmF5KG91dHB1dFNoYXBlKS5idWZmZXIpO1xuICAgIGNvbnN0IG91dFN0cmlkZXNCeXRlcyA9IG5ldyBVaW50OEFycmF5KG5ldyBJbnQzMkFycmF5KHV0aWwuY29tcHV0ZVN0cmlkZXMob3V0cHV0U2hhcGUpKS5idWZmZXIpO1xuICAgIGNvbnN0IG91dElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KG91dC5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IGNoYW5uZWxzTGFzdCA9IGRhdGFGb3JtYXQgPT09ICdOSFdDJyA/IDEgOiAwO1xuICAgIHdhc21EZXB0aFRvU3BhY2UoeElkLCBibG9ja1NpemUsIGNoYW5uZWxzTGFzdCwgeFN0cmlkZXNCeXRlcywgeC5zaGFwZS5sZW5ndGggLSAxLCBvdXRwdXRTaGFwZUJ5dGVzLCBvdXRTdHJpZGVzQnl0ZXMsIG91dHB1dFNoYXBlLmxlbmd0aCwgb3V0SWQpO1xuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3QgZGVwdGhUb1NwYWNlQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IERlcHRoVG9TcGFjZSxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIHNldHVwRnVuYzogc2V0dXAsXG4gICAga2VybmVsRnVuYzogZGVwdGhUb1NwYWNlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RGVwdGhUb1NwYWNlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgRGVwdGh3aXNlQ29udjJkTmF0aXZlIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmxldCB3YXNtRGVwdGh3aXNlQ29udjJkO1xuZnVuY3Rpb24gc2V0dXAoYmFja2VuZCkge1xuICAgIHdhc21EZXB0aHdpc2VDb252MmQgPVxuICAgICAgICBiYWNrZW5kLndhc20uY3dyYXAoRGVwdGh3aXNlQ29udjJkTmF0aXZlLCBudWxsIC8qIHZvaWQgKi8sIFtcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICBdKTtcbn1cbmZ1bmN0aW9uIGRlcHRod2lzZUNvbnYyZChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGF0dHJzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCwgZmlsdGVyIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KHguZGF0YUlkKS5pZDtcbiAgICBjb25zdCBmaWx0ZXJJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChmaWx0ZXIuZGF0YUlkKS5pZDtcbiAgICBjb25zdCB7IHN0cmlkZXMsIGRpbGF0aW9ucywgcGFkLCBkaW1Sb3VuZGluZ01vZGUgfSA9IGF0dHJzO1xuICAgIGNvbnN0ICRkaWxhdGlvbnMgPSBkaWxhdGlvbnMgPT0gbnVsbCA/IFsxLCAxXSA6IGRpbGF0aW9ucztcbiAgICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlQ29udjJESW5mbyh4LnNoYXBlLCBmaWx0ZXIuc2hhcGUsIHN0cmlkZXMsICRkaWxhdGlvbnMsIHBhZCwgZGltUm91bmRpbmdNb2RlLCB0cnVlIC8qIGRlcHRod2lzZSAqLyk7XG4gICAgY29uc3QgZmlsdGVySGVpZ2h0ID0gY29udkluZm8uZmlsdGVySGVpZ2h0O1xuICAgIGNvbnN0IGZpbHRlcldpZHRoID0gY29udkluZm8uZmlsdGVyV2lkdGg7XG4gICAgY29uc3QgcGFkVG9wID0gY29udkluZm8ucGFkSW5mby50b3A7XG4gICAgY29uc3QgcGFkUmlnaHQgPSBjb252SW5mby5wYWRJbmZvLnJpZ2h0O1xuICAgIGNvbnN0IHBhZEJvdHRvbSA9IGNvbnZJbmZvLnBhZEluZm8uYm90dG9tO1xuICAgIGNvbnN0IHBhZExlZnQgPSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG4gICAgY29uc3QgZGlsYXRpb25IZWlnaHQgPSBjb252SW5mby5kaWxhdGlvbkhlaWdodDtcbiAgICBjb25zdCBkaWxhdGlvbldpZHRoID0gY29udkluZm8uZGlsYXRpb25XaWR0aDtcbiAgICBjb25zdCBzdHJpZGVIZWlnaHQgPSBjb252SW5mby5zdHJpZGVIZWlnaHQ7XG4gICAgY29uc3Qgc3RyaWRlV2lkdGggPSBjb252SW5mby5zdHJpZGVXaWR0aDtcbiAgICBjb25zdCBpbnB1dENoYW5uZWxzID0gY29udkluZm8uaW5DaGFubmVscztcbiAgICBjb25zdCBvdXRwdXRDaGFubmVscyA9IGNvbnZJbmZvLm91dENoYW5uZWxzO1xuICAgIGNvbnN0IGlzU2FtZVBhZCA9IGNvbnZJbmZvLnBhZEluZm8udHlwZSA9PT0gJ1NBTUUnID8gMSA6IDA7XG4gICAgaWYgKGNvbnZJbmZvLmRhdGFGb3JtYXQgIT09ICdjaGFubmVsc0xhc3QnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgd2FzbSBiYWNrZW5kIERlcHRod2lzZUNvbnYyZE5hdGl2ZSBkb2VzIG5vdCBzdXBwb3J0IGRhdGFGb3JtYXQ6J2AgK1xuICAgICAgICAgICAgYCR7Y29udkluZm8uZGF0YUZvcm1hdH0nLiBQbGVhc2UgdXNlICdjaGFubmVsc0xhc3QnLmApO1xuICAgIH1cbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQoY29udkluZm8ub3V0U2hhcGUsICdmbG9hdDMyJyk7XG4gICAgY29uc3Qgb3V0SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQob3V0LmRhdGFJZCkuaWQ7XG4gICAgd2FzbURlcHRod2lzZUNvbnYyZCh4SWQsIHguc2hhcGVbMF0sIHguc2hhcGVbMV0sIHguc2hhcGVbMl0sIGZpbHRlcklkLCBmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoLCBwYWRUb3AsIHBhZFJpZ2h0LCBwYWRCb3R0b20sIHBhZExlZnQsIGlzU2FtZVBhZCwgZGlsYXRpb25IZWlnaHQsIGRpbGF0aW9uV2lkdGgsIHN0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGgsIGlucHV0Q2hhbm5lbHMsIG91dHB1dENoYW5uZWxzLCBvdXRJZCk7XG4gICAgcmV0dXJuIG91dDtcbn1cbmV4cG9ydCBjb25zdCBkZXB0aHdpc2VDb252MmROYXRpdmVDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogRGVwdGh3aXNlQ29udjJkTmF0aXZlLFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAgc2V0dXBGdW5jOiBzZXR1cCxcbiAgICBrZXJuZWxGdW5jOiBkZXB0aHdpc2VDb252MmRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1EZXB0aHdpc2VDb252MmROYXRpdmUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRXF1YWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlQmluYXJ5S2VybmVsQ29uZmlnIH0gZnJvbSAnLi9iaW5hcnlfa2VybmVsJztcbmNvbnN0IHN1cHBvcnRzRnVsbEJyb2FkY2FzdCA9IGZhbHNlO1xuZXhwb3J0IGNvbnN0IGVxdWFsQ29uZmlnID0gY3JlYXRlQmluYXJ5S2VybmVsQ29uZmlnKEVxdWFsLCBzdXBwb3J0c0Z1bGxCcm9hZGNhc3QsICdib29sJyk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1FcXVhbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFeHAgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlVW5hcnlLZXJuZWxDb25maWcgfSBmcm9tICcuL3VuYXJ5X2tlcm5lbCc7XG5leHBvcnQgY29uc3QgZXhwQ29uZmlnID0gY3JlYXRlVW5hcnlLZXJuZWxDb25maWcoRXhwKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUV4cC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFeHBhbmREaW1zLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL1Jlc2hhcGUnO1xuZXhwb3J0IGZ1bmN0aW9uIGV4cGFuZERpbXMoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBhdHRycywgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCB7IGlucHV0IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBkaW0gfSA9IGF0dHJzO1xuICAgIGNvbnN0IGlucHV0UmFuayA9IGlucHV0LnNoYXBlLmxlbmd0aDtcbiAgICBjb25zdCBuZXdTaGFwZSA9IGlucHV0LnNoYXBlLnNsaWNlKCk7XG4gICAgbGV0ICRkaW0gPSBkaW07XG4gICAgaWYgKGRpbSA8IDApIHtcbiAgICAgICAgLy8gTmVnYXRpdmUgdmFsdWUgaXMgY291bnRlZCBmcm9tIHRoZSB0YWlsIG9mIHJhbmsuXG4gICAgICAgIHV0aWwuYXNzZXJ0KC0oaW5wdXRSYW5rICsgMSkgPD0gZGltLCAoKSA9PiBgQXhpcyBtdXN0IGJlIGluIHRoZSBpbnRlcnZhbCBbJHstKGlucHV0UmFuayArIDEpfSwgJHtpbnB1dFJhbmt9XWApO1xuICAgICAgICAkZGltID0gaW5wdXRSYW5rICsgZGltICsgMTtcbiAgICB9XG4gICAgbmV3U2hhcGUuc3BsaWNlKCRkaW0sIDAsIDEpO1xuICAgIHJldHVybiByZXNoYXBlKHsgaW5wdXRzOiB7IHg6IGlucHV0IH0sIGJhY2tlbmQsIGF0dHJzOiB7IHNoYXBlOiBuZXdTaGFwZSB9IH0pO1xufVxuZXhwb3J0IGNvbnN0IGV4cGFuZERpbXNDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogRXhwYW5kRGltcyxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIGtlcm5lbEZ1bmM6IGV4cGFuZERpbXMsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RXhwYW5kRGltcy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBGaWxsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmZ1bmN0aW9uIGZpbGwoYXJncykge1xuICAgIGNvbnN0IHsgYXR0cnM6IHsgc2hhcGUsIHZhbHVlLCBkdHlwZSB9LCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dChzaGFwZSwgZHR5cGUpO1xuICAgIGNvbnN0IG91dFZhbHMgPSBiYWNrZW5kLnR5cGVkQXJyYXlGcm9tSGVhcChvdXQpO1xuICAgIG91dFZhbHMuZmlsbCh2YWx1ZSk7XG4gICAgcmV0dXJuIG91dDtcbn1cbmV4cG9ydCBjb25zdCBmaWxsQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEZpbGwsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBrZXJuZWxGdW5jOiBmaWxsLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUZpbGwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRmxpcExlZnRSaWdodCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5sZXQgd2FzbUZsaXBMZWZ0UmlnaHQ7XG5mdW5jdGlvbiBzZXR1cChiYWNrZW5kKSB7XG4gICAgd2FzbUZsaXBMZWZ0UmlnaHQgPSBiYWNrZW5kLndhc20uY3dyYXAoRmxpcExlZnRSaWdodCwgbnVsbCAvKiB2b2lkICovLCBbXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgXSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZmxpcExlZnRSaWdodChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBpbWFnZSB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dChpbWFnZS5zaGFwZSwgaW1hZ2UuZHR5cGUpO1xuICAgIGNvbnN0IGltYWdlSWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoaW1hZ2UuZGF0YUlkKS5pZDtcbiAgICBjb25zdCBvdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXQuZGF0YUlkKS5pZDtcbiAgICBjb25zdCBbYmF0Y2gsIGltYWdlSGVpZ2h0LCBpbWFnZVdpZHRoLCBudW1DaGFubmVsc10gPSBpbWFnZS5zaGFwZTtcbiAgICB3YXNtRmxpcExlZnRSaWdodChpbWFnZUlkLCBiYXRjaCwgaW1hZ2VIZWlnaHQsIGltYWdlV2lkdGgsIG51bUNoYW5uZWxzLCBvdXRJZCk7XG4gICAgcmV0dXJuIG91dDtcbn1cbmV4cG9ydCBjb25zdCBmbGlwTGVmdFJpZ2h0Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEZsaXBMZWZ0UmlnaHQsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBrZXJuZWxGdW5jOiBmbGlwTGVmdFJpZ2h0LFxuICAgIHNldHVwRnVuYzogc2V0dXBcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1GbGlwTGVmdFJpZ2h0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEZsb29yIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVVuYXJ5S2VybmVsQ29uZmlnIH0gZnJvbSAnLi91bmFyeV9rZXJuZWwnO1xuZXhwb3J0IGNvbnN0IGZsb29yQ29uZmlnID0gY3JlYXRlVW5hcnlLZXJuZWxDb25maWcoRmxvb3IpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Rmxvb3IuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRmxvb3JEaXYgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlQmluYXJ5S2VybmVsQ29uZmlnIH0gZnJvbSAnLi9iaW5hcnlfa2VybmVsJztcbmNvbnN0IHN1cHBvcnRzRnVsbEJyb2FkY2FzdCA9IGZhbHNlO1xuZXhwb3J0IGNvbnN0IGZsb29yRGl2Q29uZmlnID0gY3JlYXRlQmluYXJ5S2VybmVsQ29uZmlnKEZsb29yRGl2LCBzdXBwb3J0c0Z1bGxCcm9hZGNhc3QpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Rmxvb3JEaXYuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRnVzZWRCYXRjaE5vcm0sIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xubGV0IHdhc21CYXRjaE5vcm07XG5mdW5jdGlvbiBzZXR1cChiYWNrZW5kKSB7XG4gICAgd2FzbUJhdGNoTm9ybSA9IGJhY2tlbmQud2FzbS5jd3JhcChGdXNlZEJhdGNoTm9ybSwgbnVsbCAvKiB2b2lkICovLCBbJ251bWJlcicsICdudW1iZXInLCAnbnVtYmVyJywgJ251bWJlcicsICdudW1iZXInLCAnbnVtYmVyJywgJ251bWJlciddKTtcbn1cbmZ1bmN0aW9uIGZ1c2VkQmF0Y2hOb3JtKGFyZ3MpIHtcbiAgICBjb25zdCB7IGJhY2tlbmQsIGlucHV0cywgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB2YXJpYW5jZUVwc2lsb24gfSA9IGF0dHJzO1xuICAgIGNvbnN0IHsgeCwgbWVhbiwgdmFyaWFuY2UsIG9mZnNldCwgc2NhbGUgfSA9IGlucHV0cztcbiAgICBjb25zdCB4SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoeC5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IG1lYW5JZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChtZWFuLmRhdGFJZCkuaWQ7XG4gICAgY29uc3QgdmFyaWFuY2VJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldCh2YXJpYW5jZS5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IG9mZnNldElkID0gb2Zmc2V0ICE9IG51bGwgPyBiYWNrZW5kLmRhdGFJZE1hcC5nZXQob2Zmc2V0LmRhdGFJZCkuaWQgOiAwO1xuICAgIGNvbnN0IHNjYWxlSWQgPSBzY2FsZSAhPSBudWxsID8gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KHNjYWxlLmRhdGFJZCkuaWQgOiAwO1xuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dCh4LnNoYXBlLCB4LmR0eXBlKTtcbiAgICAvLyBTaG9ydC1jaXJjdWl0IHplcm8tc2l6ZWQgdGVuc29ycy5cbiAgICBpZiAodXRpbC5zaXplRnJvbVNoYXBlKHguc2hhcGUpID09PSAwKSB7XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuICAgIGNvbnN0IG91dElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KG91dC5kYXRhSWQpLmlkO1xuICAgIHdhc21CYXRjaE5vcm0oeElkLCBtZWFuSWQsIHZhcmlhbmNlSWQsIG9mZnNldElkLCBzY2FsZUlkLCB2YXJpYW5jZUVwc2lsb24sIG91dElkKTtcbiAgICByZXR1cm4gb3V0O1xufVxuZXhwb3J0IGNvbnN0IGZ1c2VkQmF0Y2hOb3JtQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEZ1c2VkQmF0Y2hOb3JtLFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAgc2V0dXBGdW5jOiBzZXR1cCxcbiAgICBrZXJuZWxGdW5jOiBmdXNlZEJhdGNoTm9ybVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUZ1c2VkQmF0Y2hOb3JtLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgRnVzZWRDb252MkQgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgRnVzYWJsZUFjdGl2YXRpb24gfSBmcm9tICcuL3R5cGVzJztcbmxldCB3YXNtRnVzZWRDb252MmQ7XG5mdW5jdGlvbiBzZXR1cChiYWNrZW5kKSB7XG4gICAgd2FzbUZ1c2VkQ29udjJkID0gYmFja2VuZC53YXNtLmN3cmFwKEZ1c2VkQ29udjJELCBudWxsIC8qIHZvaWQgKi8sIFtcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgIF0pO1xufVxuZnVuY3Rpb24gZnVzZWRDb252MmQoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBhdHRycywgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCB7IHgsIGZpbHRlciwgYmlhcywgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgc3RyaWRlcywgcGFkLCBkaWxhdGlvbnMsIGRhdGFGb3JtYXQsIGRpbVJvdW5kaW5nTW9kZSwgYWN0aXZhdGlvbiwgbGVha3lyZWx1QWxwaGEgfSA9IGF0dHJzO1xuICAgIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVDb252MkRJbmZvKHguc2hhcGUsIGZpbHRlci5zaGFwZSwgc3RyaWRlcywgZGlsYXRpb25zLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSk7XG4gICAgY29uc3QgZnVzZWRBY3RpdmF0aW9uID0gRnVzYWJsZUFjdGl2YXRpb25bYWN0aXZhdGlvbl07XG4gICAgaWYgKGZ1c2VkQWN0aXZhdGlvbiA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHthY3RpdmF0aW9ufSBhY3RpdmF0aW9uIG5vdCB5ZXQgc3VwcG9ydGVkIGZvciBGdXNlZENvbnYyRCBgICtcbiAgICAgICAgICAgIGBpbiB0aGUgd2FzbSBiYWNrZW5kLmApO1xuICAgIH1cbiAgICBjb25zdCB4SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoeC5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IGZpbHRlcklkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KGZpbHRlci5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IG91dHB1dENoYW5uZWxzID0gY29udkluZm8ub3V0Q2hhbm5lbHM7XG4gICAgbGV0IGJpYXNJZCA9IDA7XG4gICAgaWYgKGJpYXMgIT0gbnVsbCkge1xuICAgICAgICBjb25zdCBiaWFzRGF0YSA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChiaWFzLmRhdGFJZCk7XG4gICAgICAgIGlmIChiaWFzRGF0YS5zaGFwZS5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRnVzZWRDb252MkQgb25seSBzdXBwb3J0cyByYW5rLTEgYmlhcyBidXQgZ290IGAgK1xuICAgICAgICAgICAgICAgIGByYW5rICR7Ymlhc0RhdGEuc2hhcGUubGVuZ3RofS5gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYmlhc0RhdGEuc2hhcGVbMF0gIT09IG91dHB1dENoYW5uZWxzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZ1c2VkQ29udjJEIGJpYXMgc2hhcGUgKCR7Ymlhc0RhdGEuc2hhcGV9KSBkb2VzIG5vdCBgICtcbiAgICAgICAgICAgICAgICBgbWF0Y2ggdGhlIG51bWJlciBvZiBvdXRwdXQgY2hhbm5lbHMgKCR7b3V0cHV0Q2hhbm5lbHN9KWApO1xuICAgICAgICB9XG4gICAgICAgIGJpYXNJZCA9IGJpYXNEYXRhLmlkO1xuICAgIH1cbiAgICBjb25zdCBmaWx0ZXJIZWlnaHQgPSBjb252SW5mby5maWx0ZXJIZWlnaHQ7XG4gICAgY29uc3QgZmlsdGVyV2lkdGggPSBjb252SW5mby5maWx0ZXJXaWR0aDtcbiAgICBjb25zdCBwYWRUb3AgPSBjb252SW5mby5wYWRJbmZvLnRvcDtcbiAgICBjb25zdCBwYWRSaWdodCA9IGNvbnZJbmZvLnBhZEluZm8ucmlnaHQ7XG4gICAgY29uc3QgcGFkQm90dG9tID0gY29udkluZm8ucGFkSW5mby5ib3R0b207XG4gICAgY29uc3QgcGFkTGVmdCA9IGNvbnZJbmZvLnBhZEluZm8ubGVmdDtcbiAgICBjb25zdCBkaWxhdGlvbkhlaWdodCA9IGNvbnZJbmZvLmRpbGF0aW9uSGVpZ2h0O1xuICAgIGNvbnN0IGRpbGF0aW9uV2lkdGggPSBjb252SW5mby5kaWxhdGlvbldpZHRoO1xuICAgIGNvbnN0IHN0cmlkZUhlaWdodCA9IGNvbnZJbmZvLnN0cmlkZUhlaWdodDtcbiAgICBjb25zdCBzdHJpZGVXaWR0aCA9IGNvbnZJbmZvLnN0cmlkZVdpZHRoO1xuICAgIGNvbnN0IGlucHV0Q2hhbm5lbHMgPSBjb252SW5mby5pbkNoYW5uZWxzO1xuICAgIGNvbnN0IGlzU2FtZVBhZCA9IGNvbnZJbmZvLnBhZEluZm8udHlwZSA9PT0gJ1NBTUUnID8gMSA6IDA7XG4gICAgY29uc3QgYmF0Y2hTaXplID0gY29udkluZm8uYmF0Y2hTaXplO1xuICAgIGNvbnN0IGluSGVpZ2h0ID0gY29udkluZm8uaW5IZWlnaHQ7XG4gICAgY29uc3QgaW5XaWR0aCA9IGNvbnZJbmZvLmluV2lkdGg7XG4gICAgaWYgKGRhdGFGb3JtYXQgIT09ICdOSFdDJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHdhc20gYmFja2VuZCBGdXNlZENvbnYyRCBkb2VzIG5vdCBzdXBwb3J0IGRhdGFGb3JtYXQ6J2AgK1xuICAgICAgICAgICAgYCR7ZGF0YUZvcm1hdH0nLiBQbGVhc2UgdXNlICdOSFdDJy5gKTtcbiAgICB9XG4gICAgY29uc3Qgb3V0ID0gYmFja2VuZC5tYWtlT3V0cHV0KGNvbnZJbmZvLm91dFNoYXBlLCAnZmxvYXQzMicpO1xuICAgIGNvbnN0IG91dElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KG91dC5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IHByZWx1QWN0aXZhdGlvbldlaWdodHNJZCA9IHByZWx1QWN0aXZhdGlvbldlaWdodHMgPT0gbnVsbCA/XG4gICAgICAgIDAgOlxuICAgICAgICBiYWNrZW5kLmRhdGFJZE1hcC5nZXQocHJlbHVBY3RpdmF0aW9uV2VpZ2h0cy5kYXRhSWQpLmlkO1xuICAgIHdhc21GdXNlZENvbnYyZCh4SWQsIGJhdGNoU2l6ZSwgaW5IZWlnaHQsIGluV2lkdGgsIGZpbHRlcklkLCBmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoLCBiaWFzSWQsIHBhZFRvcCwgcGFkUmlnaHQsIHBhZEJvdHRvbSwgcGFkTGVmdCwgaXNTYW1lUGFkLCBkaWxhdGlvbkhlaWdodCwgZGlsYXRpb25XaWR0aCwgc3RyaWRlSGVpZ2h0LCBzdHJpZGVXaWR0aCwgaW5wdXRDaGFubmVscywgb3V0cHV0Q2hhbm5lbHMsIGZ1c2VkQWN0aXZhdGlvbiwgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0c0lkLCBsZWFreXJlbHVBbHBoYSB8fCAwLCBvdXRJZCk7XG4gICAgcmV0dXJuIG91dDtcbn1cbmV4cG9ydCBjb25zdCBmdXNlZENvbnYyRENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBGdXNlZENvbnYyRCxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIHNldHVwRnVuYzogc2V0dXAsXG4gICAga2VybmVsRnVuYzogZnVzZWRDb252MmRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1GdXNlZENvbnYyRC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIEZ1c2VkRGVwdGh3aXNlQ29udjJEIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IEZ1c2FibGVBY3RpdmF0aW9uIH0gZnJvbSAnLi90eXBlcyc7XG5sZXQgd2FzbUZ1c2VkRGVwdGh3aXNlQ29udjJkO1xuZnVuY3Rpb24gc2V0dXAoYmFja2VuZCkge1xuICAgIHdhc21GdXNlZERlcHRod2lzZUNvbnYyZCA9XG4gICAgICAgIGJhY2tlbmQud2FzbS5jd3JhcChGdXNlZERlcHRod2lzZUNvbnYyRCwgbnVsbCAvKiB2b2lkICovLCBbXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICBdKTtcbn1cbmZ1bmN0aW9uIGZ1c2VkRGVwdGh3aXNlQ29udjJkKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYXR0cnMsIGJhY2tlbmQgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4LCBmaWx0ZXIsIGJpYXMsIHByZWx1QWN0aXZhdGlvbldlaWdodHMgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IHN0cmlkZXMsIHBhZCwgZGlsYXRpb25zLCBkYXRhRm9ybWF0LCBkaW1Sb3VuZGluZ01vZGUsIGFjdGl2YXRpb24sIGxlYWt5cmVsdUFscGhhIH0gPSBhdHRycztcbiAgICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlQ29udjJESW5mbyh4LnNoYXBlLCBmaWx0ZXIuc2hhcGUsIHN0cmlkZXMsIGRpbGF0aW9ucywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIHRydWUgLyogZGVwdGh3aXNlICovKTtcbiAgICBjb25zdCBmdXNlZEFjdGl2YXRpb24gPSBGdXNhYmxlQWN0aXZhdGlvblthY3RpdmF0aW9uXTtcbiAgICBpZiAoZnVzZWRBY3RpdmF0aW9uID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2FjdGl2YXRpb259IGFjdGl2YXRpb24gbm90IHlldCBzdXBwb3J0ZWQgZm9yIEZ1c2VkRGVwdGh3aXNlQ29udjJEIGAgK1xuICAgICAgICAgICAgYGluIHRoZSB3YXNtIGJhY2tlbmQuYCk7XG4gICAgfVxuICAgIGNvbnN0IHhJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldCh4LmRhdGFJZCkuaWQ7XG4gICAgY29uc3QgZmlsdGVySWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoZmlsdGVyLmRhdGFJZCkuaWQ7XG4gICAgY29uc3Qgb3V0cHV0Q2hhbm5lbHMgPSBjb252SW5mby5vdXRDaGFubmVscztcbiAgICBsZXQgYmlhc0lkID0gMDtcbiAgICBpZiAoYmlhcyAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IGJpYXNEYXRhID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KGJpYXMuZGF0YUlkKTtcbiAgICAgICAgaWYgKGJpYXNEYXRhLnNoYXBlLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGdXNlZERlcHRod2lzZUNvbnYyRCBvbmx5IHN1cHBvcnRzIHJhbmstMSBiaWFzIGJ1dCBnb3QgYCArXG4gICAgICAgICAgICAgICAgYHJhbmsgJHtiaWFzRGF0YS5zaGFwZS5sZW5ndGh9LmApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiaWFzRGF0YS5zaGFwZVswXSAhPT0gb3V0cHV0Q2hhbm5lbHMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRnVzZWREZXB0aHdpc2VDb252MkQgYmlhcyBzaGFwZSAoJHtiaWFzRGF0YS5zaGFwZX0pIGRvZXMgbm90IGAgK1xuICAgICAgICAgICAgICAgIGBtYXRjaCB0aGUgbnVtYmVyIG9mIG91dHB1dCBjaGFubmVscyAoJHtvdXRwdXRDaGFubmVsc30pYCk7XG4gICAgICAgIH1cbiAgICAgICAgYmlhc0lkID0gYmlhc0RhdGEuaWQ7XG4gICAgfVxuICAgIGNvbnN0IGZpbHRlckhlaWdodCA9IGNvbnZJbmZvLmZpbHRlckhlaWdodDtcbiAgICBjb25zdCBmaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmZpbHRlcldpZHRoO1xuICAgIGNvbnN0IHBhZFRvcCA9IGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICAgIGNvbnN0IHBhZFJpZ2h0ID0gY29udkluZm8ucGFkSW5mby5yaWdodDtcbiAgICBjb25zdCBwYWRCb3R0b20gPSBjb252SW5mby5wYWRJbmZvLmJvdHRvbTtcbiAgICBjb25zdCBwYWRMZWZ0ID0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuICAgIGNvbnN0IGRpbGF0aW9uSGVpZ2h0ID0gY29udkluZm8uZGlsYXRpb25IZWlnaHQ7XG4gICAgY29uc3QgZGlsYXRpb25XaWR0aCA9IGNvbnZJbmZvLmRpbGF0aW9uV2lkdGg7XG4gICAgY29uc3Qgc3RyaWRlSGVpZ2h0ID0gY29udkluZm8uc3RyaWRlSGVpZ2h0O1xuICAgIGNvbnN0IHN0cmlkZVdpZHRoID0gY29udkluZm8uc3RyaWRlV2lkdGg7XG4gICAgY29uc3QgaW5wdXRDaGFubmVscyA9IGNvbnZJbmZvLmluQ2hhbm5lbHM7XG4gICAgY29uc3QgaXNTYW1lUGFkID0gY29udkluZm8ucGFkSW5mby50eXBlID09PSAnU0FNRScgPyAxIDogMDtcbiAgICBjb25zdCBiYXRjaFNpemUgPSBjb252SW5mby5iYXRjaFNpemU7XG4gICAgY29uc3QgaW5IZWlnaHQgPSBjb252SW5mby5pbkhlaWdodDtcbiAgICBjb25zdCBpbldpZHRoID0gY29udkluZm8uaW5XaWR0aDtcbiAgICBpZiAoZGF0YUZvcm1hdCAhPT0gJ05IV0MnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgd2FzbSBiYWNrZW5kIEZ1c2VkRGVwdGh3aXNlQ29udjJEIGRvZXMgbm90IHN1cHBvcnQgZGF0YUZvcm1hdDonYCArXG4gICAgICAgICAgICBgJHtkYXRhRm9ybWF0fScuIFBsZWFzZSB1c2UgJ05IV0MnLmApO1xuICAgIH1cbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQoY29udkluZm8ub3V0U2hhcGUsICdmbG9hdDMyJyk7XG4gICAgY29uc3Qgb3V0SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQob3V0LmRhdGFJZCkuaWQ7XG4gICAgY29uc3QgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0c0lkID0gcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyA9PSBudWxsID9cbiAgICAgICAgMCA6XG4gICAgICAgIGJhY2tlbmQuZGF0YUlkTWFwLmdldChwcmVsdUFjdGl2YXRpb25XZWlnaHRzLmRhdGFJZCkuaWQ7XG4gICAgd2FzbUZ1c2VkRGVwdGh3aXNlQ29udjJkKHhJZCwgYmF0Y2hTaXplLCBpbkhlaWdodCwgaW5XaWR0aCwgZmlsdGVySWQsIGZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsIGJpYXNJZCwgcGFkVG9wLCBwYWRSaWdodCwgcGFkQm90dG9tLCBwYWRMZWZ0LCBpc1NhbWVQYWQsIGRpbGF0aW9uSGVpZ2h0LCBkaWxhdGlvbldpZHRoLCBzdHJpZGVIZWlnaHQsIHN0cmlkZVdpZHRoLCBpbnB1dENoYW5uZWxzLCBvdXRwdXRDaGFubmVscywgZnVzZWRBY3RpdmF0aW9uLCBwcmVsdUFjdGl2YXRpb25XZWlnaHRzSWQsIGxlYWt5cmVsdUFscGhhIHx8IDAsIG91dElkKTtcbiAgICByZXR1cm4gb3V0O1xufVxuZXhwb3J0IGNvbnN0IGZ1c2VkRGVwdGh3aXNlQ29udjJEQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEZ1c2VkRGVwdGh3aXNlQ29udjJELFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAgc2V0dXBGdW5jOiBzZXR1cCxcbiAgICBrZXJuZWxGdW5jOiBmdXNlZERlcHRod2lzZUNvbnYyZFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUZ1c2VkRGVwdGh3aXNlQ29udjJELmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGdhdGhlcl91dGlsLCBHYXRoZXJOZCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBDcHBEVHlwZSB9IGZyb20gJy4vdHlwZXMnO1xubGV0IHdhc21HYXRoZXJOZDtcbmZ1bmN0aW9uIHNldHVwKGJhY2tlbmQpIHtcbiAgICB3YXNtR2F0aGVyTmQgPSBiYWNrZW5kLndhc20uY3dyYXAoR2F0aGVyTmQsIG51bGwgLyp2b2lkKi8sIFtcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ2FycmF5JyxcbiAgICAgICAgJ251bWJlcicgLy8gb3V0SWRcbiAgICBdKTtcbn1cbmZ1bmN0aW9uIGdhdGhlck5kKGFyZ3MpIHtcbiAgICBjb25zdCB7IGJhY2tlbmQsIGlucHV0cyB9ID0gYXJncztcbiAgICBjb25zdCB7IHBhcmFtcywgaW5kaWNlcyB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IFtyZXN1bHRTaGFwZSwgbnVtU2xpY2VzLCBzbGljZVNpemUsIHN0cmlkZXNdID0gZ2F0aGVyX3V0aWwucHJlcGFyZUFuZFZhbGlkYXRlKHBhcmFtcywgaW5kaWNlcyk7XG4gICAgY29uc3Qgb3V0ID0gYmFja2VuZC5tYWtlT3V0cHV0KHJlc3VsdFNoYXBlLCBwYXJhbXMuZHR5cGUpO1xuICAgIGlmIChudW1TbGljZXMgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG4gICAgY29uc3QgaW5kaWNlc1NoYXBlID0gaW5kaWNlcy5zaGFwZTtcbiAgICBjb25zdCBzbGljZVJhbmsgPSBpbmRpY2VzU2hhcGVbaW5kaWNlc1NoYXBlLmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IHhEYXRhID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KHBhcmFtcy5kYXRhSWQpO1xuICAgIGNvbnN0IHhJZCA9IHhEYXRhLmlkO1xuICAgIGNvbnN0IGluZGljZXNEYXRhID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KGluZGljZXMuZGF0YUlkKTtcbiAgICBjb25zdCBpbmRpY2VzSWQgPSBpbmRpY2VzRGF0YS5pZDtcbiAgICBjb25zdCBzdHJpZGVzQnl0ZXMgPSBuZXcgVWludDhBcnJheShuZXcgSW50MzJBcnJheShzdHJpZGVzKS5idWZmZXIpO1xuICAgIGNvbnN0IG91dElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KG91dC5kYXRhSWQpLmlkO1xuICAgIHdhc21HYXRoZXJOZCh4SWQsIENwcERUeXBlW3BhcmFtcy5kdHlwZV0sIGluZGljZXNJZCwgbnVtU2xpY2VzLCBzbGljZVJhbmssIHNsaWNlU2l6ZSwgc3RyaWRlc0J5dGVzLCBvdXRJZCk7XG4gICAgcmV0dXJuIG91dDtcbn1cbmV4cG9ydCBjb25zdCBnYXRoZXJOZENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBHYXRoZXJOZCxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIHNldHVwRnVuYzogc2V0dXAsXG4gICAga2VybmVsRnVuYzogZ2F0aGVyTmRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1HYXRoZXJOZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIEdhdGhlclYyLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL1Jlc2hhcGUnO1xuaW1wb3J0IHsgQ3BwRFR5cGUgfSBmcm9tICcuL3R5cGVzJztcbmxldCB3YXNtR2F0aGVyO1xuZnVuY3Rpb24gc2V0dXAoYmFja2VuZCkge1xuICAgIHdhc21HYXRoZXIgPSBiYWNrZW5kLndhc20uY3dyYXAoJ0dhdGhlcicsIG51bGwgLyp2b2lkKi8sIFtcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnYXJyYXknLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnYXJyYXknLFxuICAgICAgICAnbnVtYmVyJyAvLyBvdXRJZFxuICAgIF0pO1xufVxuZnVuY3Rpb24gZ2F0aGVyVjIoYXJncykge1xuICAgIGNvbnN0IHsgYmFja2VuZCwgaW5wdXRzLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHgsIGluZGljZXMgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGF4aXMsIGJhdGNoRGltcyB9ID0gYXR0cnM7XG4gICAgY29uc3QgcGFyc2VkQXhpcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oYXhpcywgeC5zaGFwZSlbMF07XG4gICAgY29uc3Qgc2hhcGVJbmZvID0gYmFja2VuZF91dGlsLnNlZ21lbnRfdXRpbC5jb2xsZWN0R2F0aGVyT3BTaGFwZUluZm8oeCwgaW5kaWNlcywgcGFyc2VkQXhpcywgYmF0Y2hEaW1zKTtcbiAgICBjb25zdCBmbGF0dGVuWCA9IHJlc2hhcGUoe1xuICAgICAgICBpbnB1dHM6IHsgeCB9LFxuICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgc2hhcGU6IFtcbiAgICAgICAgICAgICAgICBzaGFwZUluZm8uYmF0Y2hTaXplLCBzaGFwZUluZm8ub3V0ZXJTaXplLCBzaGFwZUluZm8uZGltU2l6ZSxcbiAgICAgICAgICAgICAgICBzaGFwZUluZm8uc2xpY2VTaXplXG4gICAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIGJhY2tlbmRcbiAgICB9KTtcbiAgICBjb25zdCBpbmRpY2VzU2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShpbmRpY2VzLnNoYXBlKTtcbiAgICBjb25zdCBmbGF0dGVuSW5kZXggPSByZXNoYXBlKHtcbiAgICAgICAgaW5wdXRzOiB7IHg6IGluZGljZXMgfSxcbiAgICAgICAgYXR0cnM6IHsgc2hhcGU6IFtzaGFwZUluZm8uYmF0Y2hTaXplLCBpbmRpY2VzU2l6ZSAvIHNoYXBlSW5mby5iYXRjaFNpemVdIH0sXG4gICAgICAgIGJhY2tlbmRcbiAgICB9KTtcbiAgICBjb25zdCBmbGF0dGVuT3V0cHV0U2hhcGUgPSBbXG4gICAgICAgIHNoYXBlSW5mby5iYXRjaFNpemUsIHNoYXBlSW5mby5vdXRlclNpemUsIGluZGljZXNTaXplIC8gc2hhcGVJbmZvLmJhdGNoU2l6ZSxcbiAgICAgICAgc2hhcGVJbmZvLnNsaWNlU2l6ZVxuICAgIF07XG4gICAgY29uc3Qgb3V0ID0gYmFja2VuZC5tYWtlT3V0cHV0KGZsYXR0ZW5PdXRwdXRTaGFwZSwgeC5kdHlwZSk7XG4gICAgaWYgKHV0aWwuc2l6ZUZyb21TaGFwZSh4LnNoYXBlKSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH1cbiAgICBjb25zdCBzdHJpZGVzU2l6ZSA9IGZsYXR0ZW5YLnNoYXBlLmxlbmd0aCAtIDE7XG4gICAgY29uc3QgeERhdGEgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoZmxhdHRlblguZGF0YUlkKTtcbiAgICBjb25zdCB4SWQgPSB4RGF0YS5pZDtcbiAgICBjb25zdCBpbmRpY2VzRGF0YSA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChmbGF0dGVuSW5kZXguZGF0YUlkKTtcbiAgICBjb25zdCBpbmRpY2VzSWQgPSBpbmRpY2VzRGF0YS5pZDtcbiAgICBjb25zdCBvdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXQuZGF0YUlkKS5pZDtcbiAgICBjb25zdCB4U3RyaWRlc0J5dGVzID0gbmV3IFVpbnQ4QXJyYXkobmV3IEludDMyQXJyYXkodXRpbC5jb21wdXRlU3RyaWRlcyhmbGF0dGVuWC5zaGFwZSkpLmJ1ZmZlcik7XG4gICAgY29uc3Qgb3V0U3RyaWRlc0J5dGVzID0gbmV3IFVpbnQ4QXJyYXkobmV3IEludDMyQXJyYXkodXRpbC5jb21wdXRlU3RyaWRlcyhmbGF0dGVuT3V0cHV0U2hhcGUpKS5idWZmZXIpO1xuICAgIHdhc21HYXRoZXIoeElkLCBDcHBEVHlwZVt4LmR0eXBlXSwgeFN0cmlkZXNCeXRlcywgc3RyaWRlc1NpemUsIGluZGljZXNJZCwgc2hhcGVJbmZvLmJhdGNoU2l6ZSwgb3V0U3RyaWRlc0J5dGVzLCBvdXRJZCk7XG4gICAgYmFja2VuZC5kaXNwb3NlRGF0YShmbGF0dGVuWC5kYXRhSWQpO1xuICAgIGJhY2tlbmQuZGlzcG9zZURhdGEoZmxhdHRlbkluZGV4LmRhdGFJZCk7XG4gICAgLy8gcmVzaGFwZVxuICAgIG91dC5zaGFwZSA9IHNoYXBlSW5mby5vdXRwdXRTaGFwZTtcbiAgICByZXR1cm4gb3V0O1xufVxuZXhwb3J0IGNvbnN0IGdhdGhlclYyQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IEdhdGhlclYyLFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAgc2V0dXBGdW5jOiBzZXR1cCxcbiAgICBrZXJuZWxGdW5jOiBnYXRoZXJWMlxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUdhdGhlclYyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEdyZWF0ZXIgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlQmluYXJ5S2VybmVsQ29uZmlnIH0gZnJvbSAnLi9iaW5hcnlfa2VybmVsJztcbmNvbnN0IHN1cHBvcnRzRnVsbEJyb2FkY2FzdCA9IGZhbHNlO1xuZXhwb3J0IGNvbnN0IGdyZWF0ZXJDb25maWcgPSBjcmVhdGVCaW5hcnlLZXJuZWxDb25maWcoR3JlYXRlciwgc3VwcG9ydHNGdWxsQnJvYWRjYXN0LCAnYm9vbCcpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9R3JlYXRlci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBHcmVhdGVyRXF1YWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlQmluYXJ5S2VybmVsQ29uZmlnIH0gZnJvbSAnLi9iaW5hcnlfa2VybmVsJztcbmNvbnN0IHN1cHBvcnRzRnVsbEJyb2FkY2FzdCA9IGZhbHNlO1xuZXhwb3J0IGNvbnN0IGdyZWF0ZXJFcXVhbENvbmZpZyA9IGNyZWF0ZUJpbmFyeUtlcm5lbENvbmZpZyhHcmVhdGVyRXF1YWwsIHN1cHBvcnRzRnVsbEJyb2FkY2FzdCwgJ2Jvb2wnKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUdyZWF0ZXJFcXVhbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBJZGVudGl0eSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5leHBvcnQgZnVuY3Rpb24gaWRlbnRpdHkoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzOiB7IHggfSwgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQoeC5zaGFwZSwgeC5kdHlwZSk7XG4gICAgY29uc3QgaW5WYWxzID0gYmFja2VuZC50eXBlZEFycmF5RnJvbUhlYXAoeCk7XG4gICAgY29uc3Qgb3V0VmFscyA9IGJhY2tlbmQudHlwZWRBcnJheUZyb21IZWFwKG91dCk7XG4gICAgb3V0VmFscy5zZXQoaW5WYWxzKTtcbiAgICByZXR1cm4gb3V0O1xufVxuZXhwb3J0IGNvbnN0IGlkZW50aXR5Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IElkZW50aXR5LFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAga2VybmVsRnVuYzogaWRlbnRpdHksXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SWRlbnRpdHkuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgTGVha3lSZWx1LCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmxldCB3YXNtRnVuYztcbmZ1bmN0aW9uIHNldHVwRnVuYyhiYWNrZW5kKSB7XG4gICAgd2FzbUZ1bmMgPSBiYWNrZW5kLndhc20uY3dyYXAoTGVha3lSZWx1LCBudWxsIC8qIHZvaWQgKi8sIFtcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyAvLyBvdXRfaWRcbiAgICBdKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBsZWFreVJlbHUoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzOiB7IHggfSwgYXR0cnM6IHsgYWxwaGEgfSwgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCB4SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoeC5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dCh4LnNoYXBlLCB4LmR0eXBlKTtcbiAgICBpZiAodXRpbC5zaXplRnJvbVNoYXBlKHguc2hhcGUpICE9PSAwKSB7XG4gICAgICAgIGNvbnN0IG91dElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KG91dC5kYXRhSWQpLmlkO1xuICAgICAgICB3YXNtRnVuYyh4SWQsIGFscGhhLCBvdXRJZCk7XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3QgbGVha3lSZWx1Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IExlYWt5UmVsdSxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIHNldHVwRnVuYyxcbiAgICBrZXJuZWxGdW5jOiBsZWFreVJlbHUsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TGVha3lSZWx1LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IExlc3MgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlQmluYXJ5S2VybmVsQ29uZmlnIH0gZnJvbSAnLi9iaW5hcnlfa2VybmVsJztcbmNvbnN0IHN1cHBvcnRzRnVsbEJyb2FkY2FzdCA9IGZhbHNlO1xuZXhwb3J0IGNvbnN0IGxlc3NDb25maWcgPSBjcmVhdGVCaW5hcnlLZXJuZWxDb25maWcoTGVzcywgc3VwcG9ydHNGdWxsQnJvYWRjYXN0LCAnYm9vbCcpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TGVzcy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBMZXNzRXF1YWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlQmluYXJ5S2VybmVsQ29uZmlnIH0gZnJvbSAnLi9iaW5hcnlfa2VybmVsJztcbmNvbnN0IHN1cHBvcnRzRnVsbEJyb2FkY2FzdCA9IGZhbHNlO1xuZXhwb3J0IGNvbnN0IGxlc3NFcXVhbENvbmZpZyA9IGNyZWF0ZUJpbmFyeUtlcm5lbENvbmZpZyhMZXNzRXF1YWwsIHN1cHBvcnRzRnVsbEJyb2FkY2FzdCwgJ2Jvb2wnKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUxlc3NFcXVhbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBMb2cgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlVW5hcnlLZXJuZWxDb25maWcgfSBmcm9tICcuL3VuYXJ5X2tlcm5lbCc7XG5leHBvcnQgY29uc3QgbG9nQ29uZmlnID0gY3JlYXRlVW5hcnlLZXJuZWxDb25maWcoTG9nKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUxvZy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBMb2dpY2FsQW5kIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZUJpbmFyeUtlcm5lbENvbmZpZyB9IGZyb20gJy4vYmluYXJ5X2tlcm5lbCc7XG5jb25zdCBzdXBwb3J0c0Z1bGxCcm9hZGNhc3QgPSBmYWxzZTtcbmV4cG9ydCBjb25zdCBsb2dpY2FsQW5kQ29uZmlnID0gY3JlYXRlQmluYXJ5S2VybmVsQ29uZmlnKExvZ2ljYWxBbmQsIHN1cHBvcnRzRnVsbEJyb2FkY2FzdCwgJ2Jvb2wnKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUxvZ2ljYWxBbmQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IE1heCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBwZXJtdXRlQXhlc0FuZFRyYW5zcG9zZSB9IGZyb20gJy4va2VybmVsX3V0aWxzJztcbmxldCB3YXNtTWF4O1xuZnVuY3Rpb24gc2V0dXAoYmFja2VuZCkge1xuICAgIHdhc21NYXggPSBiYWNrZW5kLndhc20uY3dyYXAoTWF4LCBudWxsIC8qdm9pZCovLCBbJ251bWJlciwgbnVtYmVyLCBudW1iZXInXSk7XG59XG5mdW5jdGlvbiBtYXgoYXJncykge1xuICAgIGNvbnN0IHsgYmFja2VuZCwgaW5wdXRzLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHJlZHVjdGlvbkluZGljZXM6IGF4aXMsIGtlZXBEaW1zIH0gPSBhdHRycztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB4SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoeC5kYXRhSWQpLmlkO1xuICAgIGxldCBpbnB1dElkID0geElkO1xuICAgIGxldCBpbnB1dCA9IHg7XG4gICAgY29uc3QgeyB0cmFuc3Bvc2VkLCBheGVzLCBvcmlnaW5hbEF4ZXMsIGlucHV0V2FzVHJhbnNwb3NlZCB9ID0gcGVybXV0ZUF4ZXNBbmRUcmFuc3Bvc2UoeCwgYXhpcywgYmFja2VuZCk7XG4gICAgaWYgKGlucHV0V2FzVHJhbnNwb3NlZCkge1xuICAgICAgICBjb25zdCB0cmFuc3Bvc2VkSWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQodHJhbnNwb3NlZC5kYXRhSWQpLmlkO1xuICAgICAgICBpbnB1dCA9IHRyYW5zcG9zZWQ7XG4gICAgICAgIGlucHV0SWQgPSB0cmFuc3Bvc2VkSWQ7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0UmFuayA9IGlucHV0LnNoYXBlLmxlbmd0aDtcbiAgICBiYWNrZW5kX3V0aWwuYXNzZXJ0QXhlc0FyZUlubmVyTW9zdERpbXMoJ21heCcsIGF4ZXMsIGlucHV0UmFuayk7XG4gICAgY29uc3QgW291dFNoYXBlLCByZWR1Y2VTaGFwZV0gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZU91dEFuZFJlZHVjZVNoYXBlcyhpbnB1dC5zaGFwZSwgYXhlcyk7XG4gICAgY29uc3QgcmVkdWNlU2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShyZWR1Y2VTaGFwZSk7XG4gICAgY29uc3Qgb3V0ID0gYmFja2VuZC5tYWtlT3V0cHV0KG91dFNoYXBlLCB4LmR0eXBlKTtcbiAgICBpZiAodXRpbC5zaXplRnJvbVNoYXBlKGlucHV0LnNoYXBlKSAhPT0gMCkge1xuICAgICAgICBjb25zdCBvdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXQuZGF0YUlkKS5pZDtcbiAgICAgICAgd2FzbU1heChpbnB1dElkLCByZWR1Y2VTaXplLCBvdXRJZCk7XG4gICAgfVxuICAgIGlmIChpbnB1dFdhc1RyYW5zcG9zZWQpIHtcbiAgICAgICAgLy8gZGlzcG9zZSBvZiB0aGUgdHJhbnNwb3NlZCB0ZW5zb3IuXG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZURhdGEodHJhbnNwb3NlZC5kYXRhSWQpO1xuICAgIH1cbiAgICBpZiAoa2VlcERpbXMpIHtcbiAgICAgICAgLy8gcmVzaGFwZVxuICAgICAgICBjb25zdCBuZXdTaGFwZSA9IGJhY2tlbmRfdXRpbC5leHBhbmRTaGFwZVRvS2VlcERpbShvdXQuc2hhcGUsIG9yaWdpbmFsQXhlcyk7XG4gICAgICAgIG91dC5zaGFwZSA9IG5ld1NoYXBlO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xufVxuZXhwb3J0IGNvbnN0IG1heENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBNYXgsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBzZXR1cEZ1bmM6IHNldHVwLFxuICAgIGtlcm5lbEZ1bmM6IG1heFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1heC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIE1heFBvb2wgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xubGV0IHdhc21NYXhQb29sO1xuZnVuY3Rpb24gc2V0dXAoYmFja2VuZCkge1xuICAgIHdhc21NYXhQb29sID0gYmFja2VuZC53YXNtLmN3cmFwKE1heFBvb2wsIG51bGwgLyogdm9pZCAqLywgW1xuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgXSk7XG59XG5mdW5jdGlvbiBtYXhQb29sKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYXR0cnMsIGJhY2tlbmQgfSA9IGFyZ3M7XG4gICAgY29uc3QgeCA9IGlucHV0cy54O1xuICAgIGNvbnN0IHhJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldCh4LmRhdGFJZCkuaWQ7XG4gICAgY29uc3QgeyBmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSB9ID0gYXR0cnM7XG4gICAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZVBvb2wyREluZm8oeC5zaGFwZSwgZmlsdGVyU2l6ZSwgc3RyaWRlcywgMSAvKiBkaWxhdGlvbnMgKi8sIHBhZCwgZGltUm91bmRpbmdNb2RlKTtcbiAgICBjb25zdCBmaWx0ZXJIZWlnaHQgPSBjb252SW5mby5maWx0ZXJIZWlnaHQ7XG4gICAgY29uc3QgZmlsdGVyV2lkdGggPSBjb252SW5mby5maWx0ZXJXaWR0aDtcbiAgICBjb25zdCBwYWRUb3AgPSBjb252SW5mby5wYWRJbmZvLnRvcDtcbiAgICBjb25zdCBwYWRSaWdodCA9IGNvbnZJbmZvLnBhZEluZm8ucmlnaHQ7XG4gICAgY29uc3QgcGFkQm90dG9tID0gY29udkluZm8ucGFkSW5mby5ib3R0b207XG4gICAgY29uc3QgcGFkTGVmdCA9IGNvbnZJbmZvLnBhZEluZm8ubGVmdDtcbiAgICBjb25zdCBkaWxhdGlvbkhlaWdodCA9IGNvbnZJbmZvLmRpbGF0aW9uSGVpZ2h0O1xuICAgIGNvbnN0IGRpbGF0aW9uV2lkdGggPSBjb252SW5mby5kaWxhdGlvbldpZHRoO1xuICAgIGNvbnN0IHN0cmlkZUhlaWdodCA9IGNvbnZJbmZvLnN0cmlkZUhlaWdodDtcbiAgICBjb25zdCBzdHJpZGVXaWR0aCA9IGNvbnZJbmZvLnN0cmlkZVdpZHRoO1xuICAgIGNvbnN0IGlucHV0Q2hhbm5lbHMgPSBjb252SW5mby5pbkNoYW5uZWxzO1xuICAgIGNvbnN0IG91dHB1dENoYW5uZWxzID0gY29udkluZm8ub3V0Q2hhbm5lbHM7XG4gICAgaWYgKGNvbnZJbmZvLmRhdGFGb3JtYXQgIT09ICdjaGFubmVsc0xhc3QnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgd2FzbSBiYWNrZW5kIGRvZXMgbm90IHN1cHBvcnQgZGF0YUZvcm1hdDonYCArXG4gICAgICAgICAgICBgJHtjb252SW5mby5kYXRhRm9ybWF0fScuIFBsZWFzZSB1c2UgJ2NoYW5uZWxzTGFzdCcuYCk7XG4gICAgfVxuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dChjb252SW5mby5vdXRTaGFwZSwgJ2Zsb2F0MzInKTtcbiAgICBjb25zdCBvdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXQuZGF0YUlkKS5pZDtcbiAgICB3YXNtTWF4UG9vbCh4SWQsIHguc2hhcGVbMF0sIHguc2hhcGVbMV0sIHguc2hhcGVbMl0sIGZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsIHBhZFRvcCwgcGFkUmlnaHQsIHBhZEJvdHRvbSwgcGFkTGVmdCwgZGlsYXRpb25IZWlnaHQsIGRpbGF0aW9uV2lkdGgsIHN0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGgsIGlucHV0Q2hhbm5lbHMsIG91dHB1dENoYW5uZWxzLCBvdXRJZCk7XG4gICAgcmV0dXJuIG91dDtcbn1cbmV4cG9ydCBjb25zdCBtYXhQb29sQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IE1heFBvb2wsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBzZXR1cEZ1bmM6IHNldHVwLFxuICAgIGtlcm5lbEZ1bmM6IG1heFBvb2xcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1NYXhQb29sLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IE1heGltdW0gfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlQmluYXJ5S2VybmVsQ29uZmlnIH0gZnJvbSAnLi9iaW5hcnlfa2VybmVsJztcbmNvbnN0IHN1cHBvcnRzRnVsbEJyb2FkY2FzdCA9IGZhbHNlO1xuZXhwb3J0IGNvbnN0IG1heGltdW1Db25maWcgPSBjcmVhdGVCaW5hcnlLZXJuZWxDb25maWcoTWF4aW11bSwgc3VwcG9ydHNGdWxsQnJvYWRjYXN0KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1heGltdW0uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBNZWFuLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNhc3QgfSBmcm9tICcuL0Nhc3QnO1xuaW1wb3J0IHsgcGVybXV0ZUF4ZXNBbmRUcmFuc3Bvc2UgfSBmcm9tICcuL2tlcm5lbF91dGlscyc7XG5sZXQgd2FzbU1lYW47XG5mdW5jdGlvbiBzZXR1cChiYWNrZW5kKSB7XG4gICAgd2FzbU1lYW4gPVxuICAgICAgICBiYWNrZW5kLndhc20uY3dyYXAoTWVhbiwgbnVsbCAvKnZvaWQqLywgWydudW1iZXIsIG51bWJlciwgbnVtYmVyJ10pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG1lYW4oYXJncykge1xuICAgIGNvbnN0IHsgYmFja2VuZCwgaW5wdXRzLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IGF4aXMsIGtlZXBEaW1zIH0gPSBhdHRycztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB4SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoeC5kYXRhSWQpLmlkO1xuICAgIGxldCBpbnB1dElkID0geElkO1xuICAgIGxldCBpbnB1dCA9IHg7XG4gICAgY29uc3QgeyB0cmFuc3Bvc2VkLCBheGVzLCBvcmlnaW5hbEF4ZXMsIGlucHV0V2FzVHJhbnNwb3NlZCB9ID0gcGVybXV0ZUF4ZXNBbmRUcmFuc3Bvc2UoeCwgYXhpcywgYmFja2VuZCk7XG4gICAgbGV0IHJlZHVjdGlvbkF4ZXMgPSBheGVzO1xuICAgIGlmIChpbnB1dFdhc1RyYW5zcG9zZWQpIHtcbiAgICAgICAgY29uc3QgdHJhbnNwb3NlZElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KHRyYW5zcG9zZWQuZGF0YUlkKS5pZDtcbiAgICAgICAgaWYgKHRyYW5zcG9zZWRJZCAhPT0geElkKSB7XG4gICAgICAgICAgICAvLyB0cmFuc3Bvc2Ugd2FzIG5vdCBhIG5vLW9wLiBXZSB3aWxsIG5lZWQgdG8gZGlzcG9zZSBvZiB0aGlzXG4gICAgICAgICAgICAvLyBvbmNlIHdlIGFyZSBkb25lLlxuICAgICAgICAgICAgaW5wdXQgPSB0cmFuc3Bvc2VkO1xuICAgICAgICAgICAgaW5wdXRJZCA9IHRyYW5zcG9zZWRJZDtcbiAgICAgICAgICAgIHJlZHVjdGlvbkF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0SW5uZXJNb3N0QXhlcyhyZWR1Y3Rpb25BeGVzLmxlbmd0aCwgaW5wdXQuc2hhcGUubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBiYWNrZW5kX3V0aWwuYXNzZXJ0QXhlc0FyZUlubmVyTW9zdERpbXMoJ21lYW4nLCByZWR1Y3Rpb25BeGVzLCBpbnB1dC5zaGFwZS5sZW5ndGgpO1xuICAgIGNvbnN0IFtvdXRTaGFwZSwgcmVkdWNlU2hhcGVdID0gYmFja2VuZF91dGlsLmNvbXB1dGVPdXRBbmRSZWR1Y2VTaGFwZXMoaW5wdXQuc2hhcGUsIHJlZHVjdGlvbkF4ZXMpO1xuICAgIGNvbnN0IHJlZHVjZVNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUocmVkdWNlU2hhcGUpO1xuICAgIGxldCBjYXN0ZWRJbnB1dCA9IGlucHV0O1xuICAgIGlmIChpbnB1dC5kdHlwZSAhPT0gJ2Zsb2F0MzInKSB7XG4gICAgICAgIGNhc3RlZElucHV0ID1cbiAgICAgICAgICAgIGNhc3QoeyBiYWNrZW5kLCBpbnB1dHM6IHsgeDogaW5wdXQgfSwgYXR0cnM6IHsgZHR5cGU6ICdmbG9hdDMyJyB9IH0pO1xuICAgICAgICBpbnB1dElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KGNhc3RlZElucHV0LmRhdGFJZCkuaWQ7XG4gICAgfVxuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dChvdXRTaGFwZSwgJ2Zsb2F0MzInKTtcbiAgICBpZiAodXRpbC5zaXplRnJvbVNoYXBlKGlucHV0LnNoYXBlKSAhPT0gMCkge1xuICAgICAgICBjb25zdCBvdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXQuZGF0YUlkKS5pZDtcbiAgICAgICAgd2FzbU1lYW4oaW5wdXRJZCwgcmVkdWNlU2l6ZSwgb3V0SWQpO1xuICAgIH1cbiAgICBpZiAoaW5wdXRXYXNUcmFuc3Bvc2VkKSB7XG4gICAgICAgIC8vIGRpc3Bvc2Ugb2YgdGhlIHRyYW5zcG9zZWQgdGVuc29yLlxuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VEYXRhKHRyYW5zcG9zZWQuZGF0YUlkKTtcbiAgICB9XG4gICAgaWYgKGtlZXBEaW1zKSB7XG4gICAgICAgIC8vIHJlc2hhcGVcbiAgICAgICAgY29uc3QgbmV3U2hhcGUgPSBiYWNrZW5kX3V0aWwuZXhwYW5kU2hhcGVUb0tlZXBEaW0ob3V0LnNoYXBlLCBvcmlnaW5hbEF4ZXMpO1xuICAgICAgICBvdXQuc2hhcGUgPSBuZXdTaGFwZTtcbiAgICB9XG4gICAgaWYgKGlucHV0LmR0eXBlICE9PSAnZmxvYXQzMicpIHtcbiAgICAgICAgYmFja2VuZC5kaXNwb3NlRGF0YShjYXN0ZWRJbnB1dC5kYXRhSWQpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xufVxuZXhwb3J0IGNvbnN0IG1lYW5Db25maWcgPSB7XG4gICAga2VybmVsTmFtZTogTWVhbixcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIHNldHVwRnVuYzogc2V0dXAsXG4gICAga2VybmVsRnVuYzogbWVhblxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1lYW4uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBNaW4sIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgcGVybXV0ZUF4ZXNBbmRUcmFuc3Bvc2UgfSBmcm9tICcuL2tlcm5lbF91dGlscyc7XG5sZXQgd2FzbU1pbjtcbmZ1bmN0aW9uIHNldHVwKGJhY2tlbmQpIHtcbiAgICB3YXNtTWluID0gYmFja2VuZC53YXNtLmN3cmFwKE1pbiwgbnVsbCAvKnZvaWQqLywgWydudW1iZXIsIG51bWJlciwgbnVtYmVyJ10pO1xufVxuZnVuY3Rpb24gbWluKGFyZ3MpIHtcbiAgICBjb25zdCB7IGJhY2tlbmQsIGlucHV0cywgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBheGlzLCBrZWVwRGltcyB9ID0gYXR0cnM7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KHguZGF0YUlkKS5pZDtcbiAgICBsZXQgaW5wdXRJZCA9IHhJZDtcbiAgICBsZXQgaW5wdXQgPSB4O1xuICAgIGNvbnN0IHsgdHJhbnNwb3NlZCwgYXhlcywgb3JpZ2luYWxBeGVzLCBpbnB1dFdhc1RyYW5zcG9zZWQgfSA9IHBlcm11dGVBeGVzQW5kVHJhbnNwb3NlKHgsIGF4aXMsIGJhY2tlbmQpO1xuICAgIGlmIChpbnB1dFdhc1RyYW5zcG9zZWQpIHtcbiAgICAgICAgY29uc3QgdHJhbnNwb3NlZElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KHRyYW5zcG9zZWQuZGF0YUlkKS5pZDtcbiAgICAgICAgaWYgKHRyYW5zcG9zZWRJZCAhPT0geElkKSB7XG4gICAgICAgICAgICAvLyB0cmFuc3Bvc2Ugd2FzIG5vdCBhIG5vLW9wLiBXZSB3aWxsIG5lZWQgdG8gZGlzcG9zZSBvZiB0aGlzXG4gICAgICAgICAgICAvLyBvbmNlIHdlIGFyZSBkb25lLlxuICAgICAgICAgICAgaW5wdXQgPSB0cmFuc3Bvc2VkO1xuICAgICAgICAgICAgaW5wdXRJZCA9IHRyYW5zcG9zZWRJZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBpbnB1dFJhbmsgPSBpbnB1dC5zaGFwZS5sZW5ndGg7XG4gICAgYmFja2VuZF91dGlsLmFzc2VydEF4ZXNBcmVJbm5lck1vc3REaW1zKCdtaW4nLCBheGVzLCBpbnB1dFJhbmspO1xuICAgIGNvbnN0IFtvdXRTaGFwZSwgcmVkdWNlU2hhcGVdID0gYmFja2VuZF91dGlsLmNvbXB1dGVPdXRBbmRSZWR1Y2VTaGFwZXMoaW5wdXQuc2hhcGUsIGF4ZXMpO1xuICAgIGNvbnN0IHJlZHVjZVNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUocmVkdWNlU2hhcGUpO1xuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dChvdXRTaGFwZSwgaW5wdXQuZHR5cGUpO1xuICAgIGlmICh1dGlsLnNpemVGcm9tU2hhcGUoaW5wdXQuc2hhcGUpICE9PSAwKSB7XG4gICAgICAgIGNvbnN0IG91dElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KG91dC5kYXRhSWQpLmlkO1xuICAgICAgICB3YXNtTWluKGlucHV0SWQsIHJlZHVjZVNpemUsIG91dElkKTtcbiAgICB9XG4gICAgaWYgKGlucHV0V2FzVHJhbnNwb3NlZCkge1xuICAgICAgICAvLyBkaXNwb3NlIG9mIHRoZSB0cmFuc3Bvc2VkIHRlbnNvci5cbiAgICAgICAgYmFja2VuZC5kaXNwb3NlRGF0YSh0cmFuc3Bvc2VkLmRhdGFJZCk7XG4gICAgfVxuICAgIGlmIChrZWVwRGltcykge1xuICAgICAgICAvLyByZXNoYXBlXG4gICAgICAgIGNvbnN0IG5ld1NoYXBlID0gYmFja2VuZF91dGlsLmV4cGFuZFNoYXBlVG9LZWVwRGltKG91dC5zaGFwZSwgb3JpZ2luYWxBeGVzKTtcbiAgICAgICAgb3V0LnNoYXBlID0gbmV3U2hhcGU7XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3QgbWluQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IE1pbixcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIHNldHVwRnVuYzogc2V0dXAsXG4gICAga2VybmVsRnVuYzogbWluXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TWluLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IE1pbmltdW0gfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlQmluYXJ5S2VybmVsQ29uZmlnIH0gZnJvbSAnLi9iaW5hcnlfa2VybmVsJztcbmNvbnN0IHN1cHBvcnRzRnVsbEJyb2FkY2FzdCA9IGZhbHNlO1xuZXhwb3J0IGNvbnN0IG1pbmltdW1Db25maWcgPSBjcmVhdGVCaW5hcnlLZXJuZWxDb25maWcoTWluaW11bSwgc3VwcG9ydHNGdWxsQnJvYWRjYXN0KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1pbmltdW0uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgTWlycm9yUGFkIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IENwcERUeXBlIH0gZnJvbSAnLi90eXBlcyc7XG4vLyBNdXN0IG1hdGNoIGVudW0gaW4gTWlycm9yUGFkLmNjXG52YXIgTWlycm9yUGFkZGluZ01vZGU7XG4oZnVuY3Rpb24gKE1pcnJvclBhZGRpbmdNb2RlKSB7XG4gICAgTWlycm9yUGFkZGluZ01vZGVbTWlycm9yUGFkZGluZ01vZGVbXCJyZWZsZWN0XCJdID0gMF0gPSBcInJlZmxlY3RcIjtcbiAgICBNaXJyb3JQYWRkaW5nTW9kZVtNaXJyb3JQYWRkaW5nTW9kZVtcInN5bW1ldHJpY1wiXSA9IDFdID0gXCJzeW1tZXRyaWNcIjtcbn0pKE1pcnJvclBhZGRpbmdNb2RlIHx8IChNaXJyb3JQYWRkaW5nTW9kZSA9IHt9KSk7XG5sZXQgd2FzbU1pcnJvclBhZDtcbmZ1bmN0aW9uIHNldHVwKGJhY2tlbmQpIHtcbiAgICB3YXNtTWlycm9yUGFkID0gYmFja2VuZC53YXNtLmN3cmFwKE1pcnJvclBhZCwgbnVsbCAvKiB2b2lkICovLCBbXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnYXJyYXknLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdhcnJheScsXG4gICAgICAgICdhcnJheScsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICBdKTtcbn1cbmZ1bmN0aW9uIG1pcnJvclBhZChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHM6IHsgeCB9LCBiYWNrZW5kLCBhdHRyczogeyBwYWRkaW5ncywgbW9kZSB9IH0gPSBhcmdzO1xuICAgIGNvbnN0IG91dFNoYXBlID0gcGFkZGluZ3MubWFwKChwLCBpKSA9PiBwWzBdIC8qIGJlZm9yZVBhZCAqLyArIHguc2hhcGVbaV0gKyBwWzFdIC8qIGFmdGVyUGFkICovKTtcbiAgICBjb25zdCB4SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoeC5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dChvdXRTaGFwZSwgeC5kdHlwZSk7XG4gICAgY29uc3Qgb3V0SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQob3V0LmRhdGFJZCkuaWQ7XG4gICAgY29uc3QgeFNoYXBlQnl0ZXMgPSBuZXcgVWludDhBcnJheShuZXcgSW50MzJBcnJheSh4LnNoYXBlKS5idWZmZXIpO1xuICAgIGNvbnN0IHByZVBhZGRpbmdzRmxhdCA9IHBhZGRpbmdzLm1hcChwYWRUdXBsZSA9PiBwYWRUdXBsZVswXSk7XG4gICAgY29uc3QgcG9zdFBhZGRpbmdzRmxhdCA9IHBhZGRpbmdzLm1hcChwYWRUdXBsZSA9PiBwYWRUdXBsZVsxXSk7XG4gICAgY29uc3QgcHJlUGFkZGluZ3NCeXRlcyA9IG5ldyBVaW50OEFycmF5KG5ldyBJbnQzMkFycmF5KHByZVBhZGRpbmdzRmxhdCkuYnVmZmVyKTtcbiAgICBjb25zdCBwb3N0UGFkZGluZ3NCeXRlcyA9IG5ldyBVaW50OEFycmF5KG5ldyBJbnQzMkFycmF5KHBvc3RQYWRkaW5nc0ZsYXQpLmJ1ZmZlcik7XG4gICAgd2FzbU1pcnJvclBhZCh4SWQsIHhTaGFwZUJ5dGVzLCB4LnNoYXBlLmxlbmd0aCwgQ3BwRFR5cGVbeC5kdHlwZV0sIHByZVBhZGRpbmdzQnl0ZXMsIHBvc3RQYWRkaW5nc0J5dGVzLCBNaXJyb3JQYWRkaW5nTW9kZVttb2RlXSwgb3V0SWQpO1xuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3QgbWlycm9yUGFkQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IE1pcnJvclBhZCxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIGtlcm5lbEZ1bmM6IG1pcnJvclBhZCxcbiAgICBzZXR1cEZ1bmM6IHNldHVwXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TWlycm9yUGFkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IE11bHRpcGx5IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZUJpbmFyeUtlcm5lbENvbmZpZyB9IGZyb20gJy4vYmluYXJ5X2tlcm5lbCc7XG5jb25zdCBzdXBwb3J0c0Z1bGxCcm9hZGNhc3QgPSB0cnVlO1xuZXhwb3J0IGNvbnN0IG11bHRpcGx5Q29uZmlnID0gY3JlYXRlQmluYXJ5S2VybmVsQ29uZmlnKE11bHRpcGx5LCBzdXBwb3J0c0Z1bGxCcm9hZGNhc3QpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TXVsdGlwbHkuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgTmVnIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVVuYXJ5S2VybmVsQ29uZmlnIH0gZnJvbSAnLi91bmFyeV9rZXJuZWwnO1xuZXhwb3J0IGNvbnN0IG5lZ0NvbmZpZyA9IGNyZWF0ZVVuYXJ5S2VybmVsQ29uZmlnKE5lZyk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1OZWcuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgTm9uTWF4U3VwcHJlc3Npb25WMyB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBwYXJzZVJlc3VsdFN0cnVjdCB9IGZyb20gJy4vTm9uTWF4U3VwcHJlc3Npb25fdXRpbCc7XG5sZXQgd2FzbUZ1bmM7XG5mdW5jdGlvbiBzZXR1cChiYWNrZW5kKSB7XG4gICAgd2FzbUZ1bmMgPSBiYWNrZW5kLndhc20uY3dyYXAoTm9uTWF4U3VwcHJlc3Npb25WMywgJ251bWJlcicsIC8vIFJlc3VsdCpcbiAgICBbXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICBdKTtcbn1cbmZ1bmN0aW9uIGtlcm5lbEZ1bmMoYXJncykge1xuICAgIGNvbnN0IHsgYmFja2VuZCwgaW5wdXRzLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IGlvdVRocmVzaG9sZCwgbWF4T3V0cHV0U2l6ZSwgc2NvcmVUaHJlc2hvbGQgfSA9IGF0dHJzO1xuICAgIGNvbnN0IHsgYm94ZXMsIHNjb3JlcyB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IGJveGVzSWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoYm94ZXMuZGF0YUlkKS5pZDtcbiAgICBjb25zdCBzY29yZXNJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChzY29yZXMuZGF0YUlkKS5pZDtcbiAgICBjb25zdCByZXNPZmZzZXQgPSB3YXNtRnVuYyhib3hlc0lkLCBzY29yZXNJZCwgbWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLCBzY29yZVRocmVzaG9sZCk7XG4gICAgY29uc3QgeyBwU2VsZWN0ZWRJbmRpY2VzLCBzZWxlY3RlZFNpemUsIHBTZWxlY3RlZFNjb3JlcywgcFZhbGlkT3V0cHV0cyB9ID0gcGFyc2VSZXN1bHRTdHJ1Y3QoYmFja2VuZCwgcmVzT2Zmc2V0KTtcbiAgICAvLyBTaW5jZSB3ZSBhcmUgbm90IHVzaW5nIHNjb3JlcyBmb3IgVjMsIHdlIGhhdmUgdG8gZGVsZXRlIGl0IGZyb20gdGhlIGhlYXAuXG4gICAgYmFja2VuZC53YXNtLl9mcmVlKHBTZWxlY3RlZFNjb3Jlcyk7XG4gICAgYmFja2VuZC53YXNtLl9mcmVlKHBWYWxpZE91dHB1dHMpO1xuICAgIGNvbnN0IHNlbGVjdGVkSW5kaWNlc1RlbnNvciA9IGJhY2tlbmQubWFrZU91dHB1dChbc2VsZWN0ZWRTaXplXSwgJ2ludDMyJywgcFNlbGVjdGVkSW5kaWNlcyk7XG4gICAgcmV0dXJuIHNlbGVjdGVkSW5kaWNlc1RlbnNvcjtcbn1cbmV4cG9ydCBjb25zdCBub25NYXhTdXBwcmVzc2lvblYzQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IE5vbk1heFN1cHByZXNzaW9uVjMsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBzZXR1cEZ1bmM6IHNldHVwLFxuICAgIGtlcm5lbEZ1bmM6IGtlcm5lbEZ1bmMsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Tm9uTWF4U3VwcHJlc3Npb25WMy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBOb25NYXhTdXBwcmVzc2lvblY0IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHBhcnNlUmVzdWx0U3RydWN0IH0gZnJvbSAnLi9Ob25NYXhTdXBwcmVzc2lvbl91dGlsJztcbmxldCB3YXNtRnVuYztcbmZ1bmN0aW9uIHNldHVwKGJhY2tlbmQpIHtcbiAgICB3YXNtRnVuYyA9IGJhY2tlbmQud2FzbS5jd3JhcChOb25NYXhTdXBwcmVzc2lvblY0LCAnbnVtYmVyJywgLy8gUmVzdWx0KlxuICAgIFtcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnYm9vbCcsXG4gICAgXSk7XG59XG5mdW5jdGlvbiBub25NYXhTdXBwcmVzc2lvblY0KGFyZ3MpIHtcbiAgICBjb25zdCB7IGJhY2tlbmQsIGlucHV0cywgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBpb3VUaHJlc2hvbGQsIG1heE91dHB1dFNpemUsIHNjb3JlVGhyZXNob2xkLCBwYWRUb01heE91dHB1dFNpemUgfSA9IGF0dHJzO1xuICAgIGNvbnN0IHsgYm94ZXMsIHNjb3JlcyB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IGJveGVzSWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoYm94ZXMuZGF0YUlkKS5pZDtcbiAgICBjb25zdCBzY29yZXNJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChzY29yZXMuZGF0YUlkKS5pZDtcbiAgICBjb25zdCByZXNPZmZzZXQgPSB3YXNtRnVuYyhib3hlc0lkLCBzY29yZXNJZCwgbWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLCBzY29yZVRocmVzaG9sZCwgcGFkVG9NYXhPdXRwdXRTaXplKTtcbiAgICBjb25zdCB7IHBTZWxlY3RlZEluZGljZXMsIHNlbGVjdGVkU2l6ZSwgcFNlbGVjdGVkU2NvcmVzLCBwVmFsaWRPdXRwdXRzIH0gPSBwYXJzZVJlc3VsdFN0cnVjdChiYWNrZW5kLCByZXNPZmZzZXQpO1xuICAgIC8vIFNpbmNlIHdlIGFyZSBub3QgdXNpbmcgc2NvcmVzIGZvciBWNCwgd2UgaGF2ZSB0byBkZWxldGUgaXQgZnJvbSB0aGUgaGVhcC5cbiAgICBiYWNrZW5kLndhc20uX2ZyZWUocFNlbGVjdGVkU2NvcmVzKTtcbiAgICBjb25zdCBzZWxlY3RlZEluZGljZXNUZW5zb3IgPSBiYWNrZW5kLm1ha2VPdXRwdXQoW3NlbGVjdGVkU2l6ZV0sICdpbnQzMicsIHBTZWxlY3RlZEluZGljZXMpO1xuICAgIGNvbnN0IHZhbGlkT3V0cHV0c1RlbnNvciA9IGJhY2tlbmQubWFrZU91dHB1dChbXSwgJ2ludDMyJywgcFZhbGlkT3V0cHV0cyk7XG4gICAgcmV0dXJuIFtzZWxlY3RlZEluZGljZXNUZW5zb3IsIHZhbGlkT3V0cHV0c1RlbnNvcl07XG59XG5leHBvcnQgY29uc3Qgbm9uTWF4U3VwcHJlc3Npb25WNENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBOb25NYXhTdXBwcmVzc2lvblY0LFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAgc2V0dXBGdW5jOiBzZXR1cCxcbiAgICBrZXJuZWxGdW5jOiBub25NYXhTdXBwcmVzc2lvblY0LFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU5vbk1heFN1cHByZXNzaW9uVjQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgTm9uTWF4U3VwcHJlc3Npb25WNSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBwYXJzZVJlc3VsdFN0cnVjdCB9IGZyb20gJy4vTm9uTWF4U3VwcHJlc3Npb25fdXRpbCc7XG5sZXQgd2FzbUZ1bmM7XG5mdW5jdGlvbiBzZXR1cChiYWNrZW5kKSB7XG4gICAgd2FzbUZ1bmMgPSBiYWNrZW5kLndhc20uY3dyYXAoTm9uTWF4U3VwcHJlc3Npb25WNSwgJ251bWJlcicsIC8vIFJlc3VsdCpcbiAgICBbXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgXSk7XG59XG5mdW5jdGlvbiBrZXJuZWxGdW5jKGFyZ3MpIHtcbiAgICBjb25zdCB7IGJhY2tlbmQsIGlucHV0cywgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBpb3VUaHJlc2hvbGQsIG1heE91dHB1dFNpemUsIHNjb3JlVGhyZXNob2xkLCBzb2Z0Tm1zU2lnbWEgfSA9IGF0dHJzO1xuICAgIGNvbnN0IHsgYm94ZXMsIHNjb3JlcyB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IGJveGVzSWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoYm94ZXMuZGF0YUlkKS5pZDtcbiAgICBjb25zdCBzY29yZXNJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChzY29yZXMuZGF0YUlkKS5pZDtcbiAgICBjb25zdCByZXNPZmZzZXQgPSB3YXNtRnVuYyhib3hlc0lkLCBzY29yZXNJZCwgbWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLCBzY29yZVRocmVzaG9sZCwgc29mdE5tc1NpZ21hKTtcbiAgICBjb25zdCB7IHBTZWxlY3RlZEluZGljZXMsIHNlbGVjdGVkU2l6ZSwgcFNlbGVjdGVkU2NvcmVzLCBwVmFsaWRPdXRwdXRzIH0gPSBwYXJzZVJlc3VsdFN0cnVjdChiYWNrZW5kLCByZXNPZmZzZXQpO1xuICAgIC8vIFNpbmNlIHdlIGFyZSBub3QgdXNpbmcgdmFsaWRPdXRwdXRzIGZvciBWNSwgd2UgaGF2ZSB0byBkZWxldGUgaXQgZnJvbSB0aGVcbiAgICAvLyBoZWFwLlxuICAgIGJhY2tlbmQud2FzbS5fZnJlZShwVmFsaWRPdXRwdXRzKTtcbiAgICBjb25zdCBzZWxlY3RlZEluZGljZXNUZW5zb3IgPSBiYWNrZW5kLm1ha2VPdXRwdXQoW3NlbGVjdGVkU2l6ZV0sICdpbnQzMicsIHBTZWxlY3RlZEluZGljZXMpO1xuICAgIGNvbnN0IHNlbGVjdGVkU2NvcmVzVGVuc29yID0gYmFja2VuZC5tYWtlT3V0cHV0KFtzZWxlY3RlZFNpemVdLCAnZmxvYXQzMicsIHBTZWxlY3RlZFNjb3Jlcyk7XG4gICAgcmV0dXJuIFtzZWxlY3RlZEluZGljZXNUZW5zb3IsIHNlbGVjdGVkU2NvcmVzVGVuc29yXTtcbn1cbmV4cG9ydCBjb25zdCBub25NYXhTdXBwcmVzc2lvblY1Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IE5vbk1heFN1cHByZXNzaW9uVjUsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBzZXR1cEZ1bmM6IHNldHVwLFxuICAgIGtlcm5lbEZ1bmM6IGtlcm5lbEZ1bmMsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Tm9uTWF4U3VwcHJlc3Npb25WNS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG4vKipcbiAqIFBhcnNlIHRoZSByZXN1bHQgb2YgdGhlIGMrKyBtZXRob2QsIHdoaWNoIGhhcyB0aGUgc2hhcGUgZXF1aXZhbGVudCB0b1xuICogYFJlc3VsdGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVJlc3VsdFN0cnVjdChiYWNrZW5kLCByZXNPZmZzZXQpIHtcbiAgICBjb25zdCByZXN1bHQgPSBuZXcgSW50MzJBcnJheShiYWNrZW5kLndhc20uSEVBUFU4LmJ1ZmZlciwgcmVzT2Zmc2V0LCA0KTtcbiAgICBjb25zdCBwU2VsZWN0ZWRJbmRpY2VzID0gcmVzdWx0WzBdO1xuICAgIGNvbnN0IHNlbGVjdGVkU2l6ZSA9IHJlc3VsdFsxXTtcbiAgICBjb25zdCBwU2VsZWN0ZWRTY29yZXMgPSByZXN1bHRbMl07XG4gICAgY29uc3QgcFZhbGlkT3V0cHV0cyA9IHJlc3VsdFszXTtcbiAgICAvLyBTaW5jZSB0aGUgcmVzdWx0IHdhcyBhbGxvY2F0ZWQgb24gdGhlIGhlYXAsIHdlIGhhdmUgdG8gZGVsZXRlIGl0LlxuICAgIGJhY2tlbmQud2FzbS5fZnJlZShyZXNPZmZzZXQpO1xuICAgIHJldHVybiB7IHBTZWxlY3RlZEluZGljZXMsIHNlbGVjdGVkU2l6ZSwgcFNlbGVjdGVkU2NvcmVzLCBwVmFsaWRPdXRwdXRzIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Ob25NYXhTdXBwcmVzc2lvbl91dGlsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IE5vdEVxdWFsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZUJpbmFyeUtlcm5lbENvbmZpZyB9IGZyb20gJy4vYmluYXJ5X2tlcm5lbCc7XG5jb25zdCBzdXBwb3J0c0Z1bGxCcm9hZGNhc3QgPSBmYWxzZTtcbmV4cG9ydCBjb25zdCBub3RFcXVhbENvbmZpZyA9IGNyZWF0ZUJpbmFyeUtlcm5lbENvbmZpZyhOb3RFcXVhbCwgc3VwcG9ydHNGdWxsQnJvYWRjYXN0LCAnYm9vbCcpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Tm90RXF1YWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgT25lSG90IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmxldCB3YXNtT25lSG90O1xuZnVuY3Rpb24gc2V0dXAoYmFja2VuZCkge1xuICAgIHdhc21PbmVIb3QgPSBiYWNrZW5kLndhc20uY3dyYXAoT25lSG90LCBudWxsIC8qIHZvaWQgKi8sIFtcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInIC8vIG91dF9pZFxuICAgIF0pO1xufVxuZnVuY3Rpb24gb25lSG90KGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBpbmRpY2VzIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBkZXB0aCwgb25WYWx1ZSwgb2ZmVmFsdWUgfSA9IGF0dHJzO1xuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dChbLi4uaW5kaWNlcy5zaGFwZSwgZGVwdGhdLCAnaW50MzInKTtcbiAgICBjb25zdCBvdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXQuZGF0YUlkKS5pZDtcbiAgICBjb25zdCBpbmRpY2VzRGF0YSA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChpbmRpY2VzLmRhdGFJZCk7XG4gICAgY29uc3QgaW5kaWNlc0lkID0gaW5kaWNlc0RhdGEuaWQ7XG4gICAgd2FzbU9uZUhvdChpbmRpY2VzSWQsIGRlcHRoLCBvblZhbHVlLCBvZmZWYWx1ZSwgb3V0SWQpO1xuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3Qgb25lSG90Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IE9uZUhvdCxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIHNldHVwRnVuYzogc2V0dXAsXG4gICAga2VybmVsRnVuYzogb25lSG90LFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU9uZUhvdC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBPbmVzTGlrZSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5mdW5jdGlvbiBvbmVzTGlrZShhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHM6IHsgeCB9LCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dCh4LnNoYXBlLCB4LmR0eXBlKTtcbiAgICBjb25zdCBvdXRWYWxzID0gYmFja2VuZC50eXBlZEFycmF5RnJvbUhlYXAob3V0KTtcbiAgICBvdXRWYWxzLmZpbGwoMSk7XG4gICAgcmV0dXJuIG91dDtcbn1cbmV4cG9ydCBjb25zdCBvbmVzTGlrZUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBPbmVzTGlrZSxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIGtlcm5lbEZ1bmM6IG9uZXNMaWtlLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU9uZXNMaWtlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFBhY2ssIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY29uY2F0IH0gZnJvbSAnLi9Db25jYXQnO1xuaW1wb3J0IHsgZXhwYW5kRGltcyB9IGZyb20gJy4vRXhwYW5kRGltcyc7XG5leHBvcnQgZnVuY3Rpb24gcGFjayhhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgYXhpcyB9ID0gYXR0cnM7XG4gICAgaWYgKGlucHV0cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIGV4cGFuZERpbXMoeyBpbnB1dHM6IHsgaW5wdXQ6IGlucHV0c1swXSB9LCBiYWNrZW5kLCBhdHRyczogeyBkaW06IGF4aXMgfSB9KTtcbiAgICB9XG4gICAgY29uc3Qgc2hhcGUgPSBpbnB1dHNbMF0uc2hhcGU7XG4gICAgY29uc3QgZHR5cGUgPSBpbnB1dHNbMF0uZHR5cGU7XG4gICAgaW5wdXRzLmZvckVhY2godCA9PiB7XG4gICAgICAgIHV0aWwuYXNzZXJ0U2hhcGVzTWF0Y2goc2hhcGUsIHQuc2hhcGUsICdBbGwgdGVuc29ycyBwYXNzZWQgdG8gc3RhY2sgbXVzdCBoYXZlIG1hdGNoaW5nIHNoYXBlcycpO1xuICAgICAgICB1dGlsLmFzc2VydChkdHlwZSA9PT0gdC5kdHlwZSwgKCkgPT4gJ0FsbCB0ZW5zb3JzIHBhc3NlZCB0byBzdGFjayBtdXN0IGhhdmUgbWF0Y2hpbmcgZHR5cGVzJyk7XG4gICAgfSk7XG4gICAgY29uc3QgaW50ZXJtZWRpYXRlVGVuc29ySW5mb3MgPSBbXTtcbiAgICBjb25zdCBleHBhbmRlZFRlbnNvcnMgPSBpbnB1dHMubWFwKHQgPT4ge1xuICAgICAgICBjb25zdCBleHBhbmRlZFQgPSBleHBhbmREaW1zKHsgaW5wdXRzOiB7IGlucHV0OiB0IH0sIGJhY2tlbmQsIGF0dHJzOiB7IGRpbTogYXhpcyB9IH0pO1xuICAgICAgICBpbnRlcm1lZGlhdGVUZW5zb3JJbmZvcy5wdXNoKGV4cGFuZGVkVCk7XG4gICAgICAgIHJldHVybiBleHBhbmRlZFQ7XG4gICAgfSk7XG4gICAgY29uc3QgcmVzdWx0ID0gY29uY2F0KHsgaW5wdXRzOiBleHBhbmRlZFRlbnNvcnMsIGJhY2tlbmQsIGF0dHJzOiB7IGF4aXMgfSB9KTtcbiAgICBpbnRlcm1lZGlhdGVUZW5zb3JJbmZvcy5mb3JFYWNoKHQgPT4gYmFja2VuZC5kaXNwb3NlRGF0YSh0LmRhdGFJZCkpO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5leHBvcnQgY29uc3QgcGFja0NvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBQYWNrLFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAga2VybmVsRnVuYzogcGFja1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBhY2suanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgUGFkVjIgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgQ3BwRFR5cGUgfSBmcm9tICcuL3R5cGVzJztcbmxldCB3YXNtUGFkVjI7XG5mdW5jdGlvbiBzZXR1cChiYWNrZW5kKSB7XG4gICAgd2FzbVBhZFYyID0gYmFja2VuZC53YXNtLmN3cmFwKFBhZFYyLCBudWxsIC8qIHZvaWQgKi8sIFtcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdhcnJheScsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ2FycmF5JyxcbiAgICAgICAgJ2FycmF5JyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgIF0pO1xufVxuZnVuY3Rpb24gcGFkKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0czogeyB4IH0sIGJhY2tlbmQsIGF0dHJzOiB7IHBhZGRpbmdzLCBjb25zdGFudFZhbHVlIH0gfSA9IGFyZ3M7XG4gICAgY29uc3Qgb3V0U2hhcGUgPSBwYWRkaW5ncy5tYXAoKHAsIGkpID0+IHBbMF0gLyogYmVmb3JlUGFkICovICsgeC5zaGFwZVtpXSArIHBbMV0gLyogYWZ0ZXJQYWQgKi8pO1xuICAgIGNvbnN0IHhJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldCh4LmRhdGFJZCkuaWQ7XG4gICAgY29uc3Qgb3V0ID0gYmFja2VuZC5tYWtlT3V0cHV0KG91dFNoYXBlLCB4LmR0eXBlKTtcbiAgICBjb25zdCBvdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXQuZGF0YUlkKS5pZDtcbiAgICBjb25zdCB4U2hhcGVCeXRlcyA9IG5ldyBVaW50OEFycmF5KG5ldyBJbnQzMkFycmF5KHguc2hhcGUpLmJ1ZmZlcik7XG4gICAgY29uc3QgcHJlUGFkZGluZ3NGbGF0ID0gcGFkZGluZ3MubWFwKHBhZFR1cGxlID0+IHBhZFR1cGxlWzBdKTtcbiAgICBjb25zdCBwb3N0UGFkZGluZ3NGbGF0ID0gcGFkZGluZ3MubWFwKHBhZFR1cGxlID0+IHBhZFR1cGxlWzFdKTtcbiAgICBjb25zdCBwcmVQYWRkaW5nc0J5dGVzID0gbmV3IFVpbnQ4QXJyYXkobmV3IEludDMyQXJyYXkocHJlUGFkZGluZ3NGbGF0KS5idWZmZXIpO1xuICAgIGNvbnN0IHBvc3RQYWRkaW5nc0J5dGVzID0gbmV3IFVpbnQ4QXJyYXkobmV3IEludDMyQXJyYXkocG9zdFBhZGRpbmdzRmxhdCkuYnVmZmVyKTtcbiAgICB3YXNtUGFkVjIoeElkLCB4U2hhcGVCeXRlcywgeC5zaGFwZS5sZW5ndGgsIENwcERUeXBlW3guZHR5cGVdLCBwcmVQYWRkaW5nc0J5dGVzLCBwb3N0UGFkZGluZ3NCeXRlcywgY29uc3RhbnRWYWx1ZSwgb3V0SWQpO1xuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3QgcGFkVjJDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogUGFkVjIsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBrZXJuZWxGdW5jOiBwYWQsXG4gICAgc2V0dXBGdW5jOiBzZXR1cFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBhZFYyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFBvdyB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVCaW5hcnlLZXJuZWxDb25maWcgfSBmcm9tICcuL2JpbmFyeV9rZXJuZWwnO1xuY29uc3Qgc3VwcG9ydHNGdWxsQnJvYWRjYXN0ID0gZmFsc2U7XG5leHBvcnQgY29uc3QgcG93Q29uZmlnID0gY3JlYXRlQmluYXJ5S2VybmVsQ29uZmlnKFBvdywgc3VwcG9ydHNGdWxsQnJvYWRjYXN0KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBvdy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBQcmVsdSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5sZXQgd2FzbVByZWx1O1xuZnVuY3Rpb24gc2V0dXAoYmFja2VuZCkge1xuICAgIHdhc21QcmVsdSA9IGJhY2tlbmQud2FzbS5jd3JhcChQcmVsdSwgbnVsbCAvKiB2b2lkICovLCBbXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicgLy8gb3V0X2lkXG4gICAgXSk7XG59XG5mdW5jdGlvbiBwcmVsdShhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyB4LCBhbHBoYSB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHhJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldCh4LmRhdGFJZCkuaWQ7XG4gICAgY29uc3Qgd2VpZ2h0c0lkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KGFscGhhLmRhdGFJZCkuaWQ7XG4gICAgY29uc3Qgb3V0ID0gYmFja2VuZC5tYWtlT3V0cHV0KHguc2hhcGUsICdmbG9hdDMyJyk7XG4gICAgY29uc3Qgb3V0SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQob3V0LmRhdGFJZCkuaWQ7XG4gICAgd2FzbVByZWx1KHhJZCwgd2VpZ2h0c0lkLCBvdXRJZCk7XG4gICAgcmV0dXJuIG91dDtcbn1cbmV4cG9ydCBjb25zdCBwcmVsdUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBQcmVsdSxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIHNldHVwRnVuYzogc2V0dXAsXG4gICAga2VybmVsRnVuYzogcHJlbHVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QcmVsdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIFByb2QsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgcGVybXV0ZUF4ZXNBbmRUcmFuc3Bvc2UgfSBmcm9tICcuL2tlcm5lbF91dGlscyc7XG5pbXBvcnQgeyBDcHBEVHlwZSB9IGZyb20gJy4vdHlwZXMnO1xubGV0IHdhc21Qcm9kO1xuZnVuY3Rpb24gc2V0dXAoYmFja2VuZCkge1xuICAgIHdhc21Qcm9kID0gYmFja2VuZC53YXNtLmN3cmFwKFByb2QsIG51bGwgLyp2b2lkKi8sIFtcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcidcbiAgICBdKTtcbn1cbmZ1bmN0aW9uIHByb2QoYXJncykge1xuICAgIGNvbnN0IHsgYmFja2VuZCwgaW5wdXRzLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IGF4aXMsIGtlZXBEaW1zIH0gPSBhdHRycztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBjb25zdCB4SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoeC5kYXRhSWQpLmlkO1xuICAgIGxldCBpbnB1dElkID0geElkO1xuICAgIGxldCBpbnB1dCA9IHg7XG4gICAgY29uc3QgeyB0cmFuc3Bvc2VkLCBheGVzLCBvcmlnaW5hbEF4ZXMsIGlucHV0V2FzVHJhbnNwb3NlZCB9ID0gcGVybXV0ZUF4ZXNBbmRUcmFuc3Bvc2UoeCwgYXhpcywgYmFja2VuZCk7XG4gICAgbGV0IHJlZHVjdGlvbkF4ZXMgPSBheGVzO1xuICAgIGlmIChpbnB1dFdhc1RyYW5zcG9zZWQpIHtcbiAgICAgICAgY29uc3QgdHJhbnNwb3NlZElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KHRyYW5zcG9zZWQuZGF0YUlkKS5pZDtcbiAgICAgICAgaWYgKHRyYW5zcG9zZWRJZCAhPT0geElkKSB7XG4gICAgICAgICAgICAvLyB0cmFuc3Bvc2Ugd2FzIG5vdCBhIG5vLW9wLiBXZSB3aWxsIG5lZWQgdG8gZGlzcG9zZSBvZiB0aGlzXG4gICAgICAgICAgICAvLyBvbmNlIHdlIGFyZSBkb25lLlxuICAgICAgICAgICAgaW5wdXQgPSB0cmFuc3Bvc2VkO1xuICAgICAgICAgICAgaW5wdXRJZCA9IHRyYW5zcG9zZWRJZDtcbiAgICAgICAgICAgIHJlZHVjdGlvbkF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0SW5uZXJNb3N0QXhlcyhyZWR1Y3Rpb25BeGVzLmxlbmd0aCwgaW5wdXQuc2hhcGUubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBiYWNrZW5kX3V0aWwuYXNzZXJ0QXhlc0FyZUlubmVyTW9zdERpbXMoJ3Byb2QnLCByZWR1Y3Rpb25BeGVzLCBpbnB1dC5zaGFwZS5sZW5ndGgpO1xuICAgIGNvbnN0IFtvdXRTaGFwZSwgcmVkdWNlU2hhcGVdID0gYmFja2VuZF91dGlsLmNvbXB1dGVPdXRBbmRSZWR1Y2VTaGFwZXMoaW5wdXQuc2hhcGUsIHJlZHVjdGlvbkF4ZXMpO1xuICAgIGNvbnN0IHJlZHVjZVNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUocmVkdWNlU2hhcGUpO1xuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dChvdXRTaGFwZSwgaW5wdXQuZHR5cGUpO1xuICAgIGlmICh1dGlsLnNpemVGcm9tU2hhcGUoaW5wdXQuc2hhcGUpICE9PSAwKSB7XG4gICAgICAgIGNvbnN0IG91dElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KG91dC5kYXRhSWQpLmlkO1xuICAgICAgICB3YXNtUHJvZChpbnB1dElkLCByZWR1Y2VTaXplLCBDcHBEVHlwZVtvdXQuZHR5cGVdLCBvdXRJZCk7XG4gICAgfVxuICAgIGlmIChpbnB1dFdhc1RyYW5zcG9zZWQpIHtcbiAgICAgICAgLy8gZGlzcG9zZSBvZiB0aGUgdHJhbnNwb3NlZCB0ZW5zb3IuXG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZURhdGEodHJhbnNwb3NlZC5kYXRhSWQpO1xuICAgIH1cbiAgICBpZiAoa2VlcERpbXMpIHtcbiAgICAgICAgLy8gcmVzaGFwZVxuICAgICAgICBjb25zdCBuZXdTaGFwZSA9IGJhY2tlbmRfdXRpbC5leHBhbmRTaGFwZVRvS2VlcERpbShvdXQuc2hhcGUsIG9yaWdpbmFsQXhlcyk7XG4gICAgICAgIG91dC5zaGFwZSA9IG5ld1NoYXBlO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xufVxuZXhwb3J0IGNvbnN0IHByb2RDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogUHJvZCxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIHNldHVwRnVuYzogc2V0dXAsXG4gICAga2VybmVsRnVuYzogcHJvZFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVByb2QuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgUmFuZ2UgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgcmFuZ2VJbXBsQ1BVIH0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5leHBvcnQgY29uc3QgcmFuZ2UgPSAoYXJncykgPT4ge1xuICAgIGNvbnN0IHsgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBzdGFydCwgc3RvcCwgc3RlcCwgZHR5cGUgfSA9IGF0dHJzO1xuICAgIGNvbnN0IHZhbHVlcyA9IHJhbmdlSW1wbENQVShzdGFydCwgc3RvcCwgc3RlcCwgZHR5cGUpO1xuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dChbdmFsdWVzLmxlbmd0aF0sIGR0eXBlKTtcbiAgICBjb25zdCBvdXRWYWxzID0gYmFja2VuZC50eXBlZEFycmF5RnJvbUhlYXAob3V0KTtcbiAgICBvdXRWYWxzLnNldCh2YWx1ZXMpO1xuICAgIHJldHVybiBvdXQ7XG59O1xuZXhwb3J0IGNvbnN0IHJhbmdlQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFJhbmdlLFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAga2VybmVsRnVuYzogcmFuZ2Vcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1SYW5nZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBSZWFsRGl2IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZUJpbmFyeUtlcm5lbENvbmZpZyB9IGZyb20gJy4vYmluYXJ5X2tlcm5lbCc7XG5jb25zdCBzdXBwb3J0c0Z1bGxCcm9hZGNhc3QgPSB0cnVlO1xuZXhwb3J0IGNvbnN0IHJlYWxEaXZDb25maWcgPSBjcmVhdGVCaW5hcnlLZXJuZWxDb25maWcoUmVhbERpdiwgc3VwcG9ydHNGdWxsQnJvYWRjYXN0KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlYWxEaXYuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgUmVsdSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVVbmFyeUtlcm5lbENvbmZpZyB9IGZyb20gJy4vdW5hcnlfa2VybmVsJztcbmV4cG9ydCBjb25zdCByZWx1Q29uZmlnID0gY3JlYXRlVW5hcnlLZXJuZWxDb25maWcoUmVsdSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1SZWx1LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFJlbHU2IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVVuYXJ5S2VybmVsQ29uZmlnIH0gZnJvbSAnLi91bmFyeV9rZXJuZWwnO1xuZXhwb3J0IGNvbnN0IHJlbHU2Q29uZmlnID0gY3JlYXRlVW5hcnlLZXJuZWxDb25maWcoUmVsdTYpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmVsdTYuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgUmVzaGFwZSwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5leHBvcnQgZnVuY3Rpb24gcmVzaGFwZShhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgc2hhcGUgfSA9IGF0dHJzO1xuICAgIGNvbnN0IHhTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHguc2hhcGUpO1xuICAgIGNvbnN0ICRzaGFwZSA9IHV0aWwuaW5mZXJGcm9tSW1wbGljaXRTaGFwZShzaGFwZSwgeFNpemUpO1xuICAgIHV0aWwuYXNzZXJ0KHhTaXplID09PSB1dGlsLnNpemVGcm9tU2hhcGUoJHNoYXBlKSwgKCkgPT4gYG5ldyBzaGFwZTogJHskc2hhcGV9LCBvbGQgc2hhcGU6ICR7eC5zaGFwZX0uIE5ldyBzaGFwZSBhbmQgb2xkIGAgK1xuICAgICAgICBgc2hhcGUgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBlbGVtZW50cy5gKTtcbiAgICAvLyBCYWNrZW5kIG5lZWRzIHRvIHRyYWNrIHJlZkNvdW50IGZvciB0aGUgZGF0YUlkIGZvciByZXNoYXBlIG9wXG4gICAgYXJncy5iYWNrZW5kLmluY1JlZih4LmRhdGFJZCk7XG4gICAgcmV0dXJuIHsgZGF0YUlkOiB4LmRhdGFJZCwgc2hhcGU6ICRzaGFwZSwgZHR5cGU6IHguZHR5cGUgfTtcbn1cbmV4cG9ydCBjb25zdCByZXNoYXBlQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFJlc2hhcGUsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBrZXJuZWxGdW5jOiByZXNoYXBlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmVzaGFwZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBSZXNpemVCaWxpbmVhciwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjYXN0IH0gZnJvbSAnLi9DYXN0JztcbmxldCB3YXNtUmVzaXplQmlsaW5lYXI7XG5mdW5jdGlvbiBzZXR1cChiYWNrZW5kKSB7XG4gICAgd2FzbVJlc2l6ZUJpbGluZWFyID0gYmFja2VuZC53YXNtLmN3cmFwKFJlc2l6ZUJpbGluZWFyLCBudWxsIC8qdm9pZCovLCBbXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInIC8vIG91dElkXG4gICAgXSk7XG59XG5mdW5jdGlvbiByZXNpemVCaWxpbmVhcihhcmdzKSB7XG4gICAgY29uc3QgeyBiYWNrZW5kLCBpbnB1dHMsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgaW1hZ2VzIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBhbGlnbkNvcm5lcnMsIGhhbGZQaXhlbENlbnRlcnMsIHNpemUgfSA9IGF0dHJzO1xuICAgIGNvbnN0IFtuZXdIZWlnaHQsIG5ld1dpZHRoXSA9IHNpemU7XG4gICAgY29uc3QgW2JhdGNoLCBvbGRIZWlnaHQsIG9sZFdpZHRoLCBudW1DaGFubmVsc10gPSBpbWFnZXMuc2hhcGU7XG4gICAgY29uc3Qgb3V0U2hhcGUgPSBbYmF0Y2gsIG5ld0hlaWdodCwgbmV3V2lkdGgsIG51bUNoYW5uZWxzXTtcbiAgICBsZXQgeERhdGEgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoaW1hZ2VzLmRhdGFJZCk7XG4gICAgbGV0IGNhc3RlZERhdGE7XG4gICAgaWYgKHhEYXRhLmR0eXBlICE9PSAnZmxvYXQzMicpIHtcbiAgICAgICAgY2FzdGVkRGF0YSA9XG4gICAgICAgICAgICBjYXN0KHsgYmFja2VuZCwgaW5wdXRzOiB7IHg6IGltYWdlcyB9LCBhdHRyczogeyBkdHlwZTogJ2Zsb2F0MzInIH0gfSk7XG4gICAgICAgIHhEYXRhID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KGNhc3RlZERhdGEuZGF0YUlkKTtcbiAgICB9XG4gICAgY29uc3QgeElkID0geERhdGEuaWQ7XG4gICAgY29uc3Qgb3V0ID0gYmFja2VuZC5tYWtlT3V0cHV0KG91dFNoYXBlLCAnZmxvYXQzMicpO1xuICAgIGlmICh1dGlsLnNpemVGcm9tU2hhcGUoaW1hZ2VzLnNoYXBlKSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH1cbiAgICBjb25zdCBvdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXQuZGF0YUlkKS5pZDtcbiAgICB3YXNtUmVzaXplQmlsaW5lYXIoeElkLCBiYXRjaCwgb2xkSGVpZ2h0LCBvbGRXaWR0aCwgbnVtQ2hhbm5lbHMsIG5ld0hlaWdodCwgbmV3V2lkdGgsIGFsaWduQ29ybmVycyA/IDEgOiAwLCBoYWxmUGl4ZWxDZW50ZXJzID8gMSA6IDAsIG91dElkKTtcbiAgICBpZiAoY2FzdGVkRGF0YSAhPSBudWxsKSB7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZURhdGEoY2FzdGVkRGF0YS5kYXRhSWQpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xufVxuZXhwb3J0IGNvbnN0IHJlc2l6ZUJpbGluZWFyQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFJlc2l6ZUJpbGluZWFyLFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAgc2V0dXBGdW5jOiBzZXR1cCxcbiAgICBrZXJuZWxGdW5jOiByZXNpemVCaWxpbmVhclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlc2l6ZUJpbGluZWFyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFJldmVyc2UsIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgaWRlbnRpdHkgfSBmcm9tICcuL0lkZW50aXR5JztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL1Jlc2hhcGUnO1xubGV0IHdhc21SZXZlcnNlO1xuZnVuY3Rpb24gc2V0dXAoYmFja2VuZCkge1xuICAgIHdhc21SZXZlcnNlID0gYmFja2VuZC53YXNtLmN3cmFwKFJldmVyc2UsIG51bGwsIFtcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdhcnJheScsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnYXJyYXknLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicgLy8gb3V0X2lkXG4gICAgXSk7XG59XG5leHBvcnQgZnVuY3Rpb24gcmV2ZXJzZShhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgZGltcyB9ID0gYXR0cnM7XG4gICAgY29uc3QgYXhlcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oZGltcywgeC5zaGFwZSk7XG4gICAgaWYgKHguc2hhcGUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBpZGVudGl0eSh7IGlucHV0czogeyB4IH0sIGJhY2tlbmQgfSk7XG4gICAgfVxuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dCh4LnNoYXBlLCB4LmR0eXBlKTtcbiAgICBjb25zdCB4SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoeC5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IG91dElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KG91dC5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IGF4ZXNCeXRlcyA9IG5ldyBVaW50OEFycmF5KG5ldyBJbnQzMkFycmF5KGF4ZXMpLmJ1ZmZlcik7XG4gICAgY29uc3Qgb3V0U2hhcGVCeXRlcyA9IG5ldyBVaW50OEFycmF5KG5ldyBJbnQzMkFycmF5KHguc2hhcGUpLmJ1ZmZlcik7XG4gICAgd2FzbVJldmVyc2UoeElkLCBheGVzQnl0ZXMsIGF4ZXMubGVuZ3RoLCBvdXRTaGFwZUJ5dGVzLCB4LnNoYXBlLmxlbmd0aCwgb3V0SWQpO1xuICAgIGNvbnN0IHJlc2hhcGVkID0gcmVzaGFwZSh7IGlucHV0czogeyB4OiBvdXQgfSwgYXR0cnM6IHsgc2hhcGU6IHguc2hhcGUgfSwgYmFja2VuZCB9KTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VEYXRhKG91dC5kYXRhSWQpO1xuICAgIHJldHVybiByZXNoYXBlZDtcbn1cbmV4cG9ydCBjb25zdCByZXZlcnNlQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFJldmVyc2UsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBrZXJuZWxGdW5jOiByZXZlcnNlLFxuICAgIHNldHVwRnVuYzogc2V0dXBcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1SZXZlcnNlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFJvdGF0ZVdpdGhPZmZzZXQgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgYmFja2VuZF91dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmxldCB3YXNtUm90YXRlO1xuZnVuY3Rpb24gc2V0dXAoYmFja2VuZCkge1xuICAgIHdhc21Sb3RhdGUgPSBiYWNrZW5kLndhc20uY3dyYXAoUm90YXRlV2l0aE9mZnNldCwgbnVsbCAvKiB2b2lkICovLCBbXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ2FycmF5JyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgIF0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZVdpdGhPZmZzZXQoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IGltYWdlIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyByYWRpYW5zLCBmaWxsVmFsdWUsIGNlbnRlciB9ID0gYXR0cnM7XG4gICAgY29uc3Qgb3V0ID0gYmFja2VuZC5tYWtlT3V0cHV0KGltYWdlLnNoYXBlLCBpbWFnZS5kdHlwZSk7XG4gICAgY29uc3QgaW1hZ2VJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChpbWFnZS5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IG91dElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KG91dC5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IFtiYXRjaCwgaW1hZ2VIZWlnaHQsIGltYWdlV2lkdGgsIG51bUNoYW5uZWxzXSA9IGltYWdlLnNoYXBlO1xuICAgIGNvbnN0IFtjZW50ZXJYLCBjZW50ZXJZXSA9IGJhY2tlbmRfdXRpbC5nZXRJbWFnZUNlbnRlcihjZW50ZXIsIGltYWdlSGVpZ2h0LCBpbWFnZVdpZHRoKTtcbiAgICBjb25zdCBmaWxsSXNCbGFjayA9IGZpbGxWYWx1ZSA9PT0gMDtcbiAgICBjb25zdCBmdWxsT3BhY2l0eVZhbHVlID0gMjU1O1xuICAgIGNvbnN0IGZpbGxWYWx1ZXMgPSB0eXBlb2YgZmlsbFZhbHVlID09PSAnbnVtYmVyJyA/XG4gICAgICAgIFtmaWxsVmFsdWUsIGZpbGxWYWx1ZSwgZmlsbFZhbHVlLCBmaWxsSXNCbGFjayA/IDAgOiBmdWxsT3BhY2l0eVZhbHVlXSA6XG4gICAgICAgIFsuLi5maWxsVmFsdWUsIGZ1bGxPcGFjaXR5VmFsdWVdO1xuICAgIGNvbnN0IGZpbGxCeXRlcyA9IG5ldyBVaW50OEFycmF5KG5ldyBJbnQzMkFycmF5KGZpbGxWYWx1ZXMpLmJ1ZmZlcik7XG4gICAgd2FzbVJvdGF0ZShpbWFnZUlkLCBiYXRjaCwgaW1hZ2VIZWlnaHQsIGltYWdlV2lkdGgsIG51bUNoYW5uZWxzLCByYWRpYW5zLCBjZW50ZXJYLCBjZW50ZXJZLCBmaWxsQnl0ZXMsIGZpbGxWYWx1ZXMubGVuZ3RoLCBvdXRJZCk7XG4gICAgcmV0dXJuIG91dDtcbn1cbmV4cG9ydCBjb25zdCByb3RhdGVXaXRoT2Zmc2V0Q29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFJvdGF0ZVdpdGhPZmZzZXQsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBrZXJuZWxGdW5jOiByb3RhdGVXaXRoT2Zmc2V0LFxuICAgIHNldHVwRnVuYzogc2V0dXBcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Sb3RhdGVXaXRoT2Zmc2V0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFJvdW5kIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVVuYXJ5S2VybmVsQ29uZmlnIH0gZnJvbSAnLi91bmFyeV9rZXJuZWwnO1xuZXhwb3J0IGNvbnN0IHJvdW5kQ29uZmlnID0gY3JlYXRlVW5hcnlLZXJuZWxDb25maWcoUm91bmQpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Um91bmQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgUnNxcnQgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlVW5hcnlLZXJuZWxDb25maWcgfSBmcm9tICcuL3VuYXJ5X2tlcm5lbCc7XG5leHBvcnQgY29uc3QgcnNxcnRDb25maWcgPSBjcmVhdGVVbmFyeUtlcm5lbENvbmZpZyhSc3FydCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Sc3FydC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBzY2F0dGVyX3V0aWwsIFNjYXR0ZXJOZCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBDcHBEVHlwZSB9IGZyb20gJy4vdHlwZXMnO1xubGV0IHdhc21TY2F0dGVyTmQ7XG5mdW5jdGlvbiBzZXR1cChiYWNrZW5kKSB7XG4gICAgd2FzbVNjYXR0ZXJOZCA9IGJhY2tlbmQud2FzbS5jd3JhcChTY2F0dGVyTmQsIG51bGwgLyp2b2lkKi8sIFtcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ2FycmF5JyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInIC8vIG91dElkXG4gICAgXSk7XG59XG5mdW5jdGlvbiBzY2F0dGVyTmQoYXJncykge1xuICAgIGNvbnN0IHsgYmFja2VuZCwgaW5wdXRzLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IGluZGljZXMsIHVwZGF0ZXMgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IHNoYXBlIH0gPSBhdHRycztcbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQoc2hhcGUsIHVwZGF0ZXMuZHR5cGUpO1xuICAgIGlmICh1dGlsLnNpemVGcm9tU2hhcGUoc2hhcGUpID09PSAwKSB7XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuICAgIGNvbnN0IHsgc2xpY2VSYW5rLCBudW1VcGRhdGVzLCBzbGljZVNpemUsIHN0cmlkZXMsIG91dHB1dFNpemUgfSA9IHNjYXR0ZXJfdXRpbC5jYWxjdWxhdGVTaGFwZXModXBkYXRlcywgaW5kaWNlcywgc2hhcGUpO1xuICAgIGNvbnN0IGluZGljZXNEYXRhID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KGluZGljZXMuZGF0YUlkKTtcbiAgICBjb25zdCBpbmRpY2VzSWQgPSBpbmRpY2VzRGF0YS5pZDtcbiAgICBjb25zdCB1cGRhdGVzRGF0YSA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldCh1cGRhdGVzLmRhdGFJZCk7XG4gICAgY29uc3QgdXBkYXRlc0lkID0gdXBkYXRlc0RhdGEuaWQ7XG4gICAgY29uc3Qgc3RyaWRlc0J5dGVzID0gbmV3IFVpbnQ4QXJyYXkobmV3IEludDMyQXJyYXkoc3RyaWRlcykuYnVmZmVyKTtcbiAgICBjb25zdCBvdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXQuZGF0YUlkKS5pZDtcbiAgICB3YXNtU2NhdHRlck5kKGluZGljZXNJZCwgdXBkYXRlc0lkLCBDcHBEVHlwZVt1cGRhdGVzLmR0eXBlXSwgc2xpY2VSYW5rLCBudW1VcGRhdGVzLCBzbGljZVNpemUsIHN0cmlkZXNCeXRlcywgb3V0cHV0U2l6ZSwgb3V0SWQpO1xuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3Qgc2NhdHRlck5kQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFNjYXR0ZXJOZCxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIHNldHVwRnVuYzogc2V0dXAsXG4gICAga2VybmVsRnVuYzogc2NhdHRlck5kXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2NhdHRlck5kLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFNlbGVjdCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5sZXQgd2FzbVNlbGVjdDtcbmZ1bmN0aW9uIHNldHVwKGJhY2tlbmQpIHtcbiAgICB3YXNtU2VsZWN0ID0gYmFja2VuZC53YXNtLmN3cmFwKCdTZWxlY3RWMicsIG51bGwsIFtcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgIF0pO1xufVxuZnVuY3Rpb24gc2VsZWN0KGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCB9ID0gYXJncztcbiAgICBjb25zdCB7IGNvbmRpdGlvbiwgdCwgZSB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IGNvbmRpdGlvbklkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KGNvbmRpdGlvbi5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IHRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldCh0LmRhdGFJZCkuaWQ7XG4gICAgY29uc3QgZUlkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KGUuZGF0YUlkKS5pZDtcbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQodC5zaGFwZSwgdC5kdHlwZSk7XG4gICAgY29uc3Qgb3V0SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQob3V0LmRhdGFJZCkuaWQ7XG4gICAgY29uc3QgY1JhbmsgPSBjb25kaXRpb24uc2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IHRSYW5rID0gdC5zaGFwZS5sZW5ndGg7XG4gICAgY29uc3Qgb2Zmc2V0ID0gY1JhbmsgPT09IDAgfHwgY1JhbmsgPiAxIHx8IHRSYW5rID09PSAxID9cbiAgICAgICAgMSA6XG4gICAgICAgIHV0aWwuc2l6ZUZyb21TaGFwZSh0LnNoYXBlLnNsaWNlKDEpKTtcbiAgICB3YXNtU2VsZWN0KGNvbmRpdGlvbklkLCB0SWQsIGVJZCwgb2Zmc2V0LCBvdXRJZCk7XG4gICAgcmV0dXJuIG91dDtcbn1cbmV4cG9ydCBjb25zdCBzZWxlY3RDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogU2VsZWN0LFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAga2VybmVsRnVuYzogc2VsZWN0LFxuICAgIHNldHVwRnVuYzogc2V0dXBcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TZWxlY3QuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgU2lnbW9pZCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5sZXQgd2FzbUZ1bmM7XG5mdW5jdGlvbiBzZXR1cChiYWNrZW5kKSB7XG4gICAgd2FzbUZ1bmMgPSBiYWNrZW5kLndhc20uY3dyYXAoU2lnbW9pZCwgbnVsbCAvKiB2b2lkICovLCBbJ251bWJlcicsICdudW1iZXInXSk7XG59XG5mdW5jdGlvbiBzaWdtb2lkKGFyZ3MpIHtcbiAgICBjb25zdCB7IGJhY2tlbmQsIGlucHV0czogeyB4IH0gfSA9IGFyZ3M7XG4gICAgY29uc3QgeElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KHguZGF0YUlkKS5pZDtcbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQoeC5zaGFwZSwgeC5kdHlwZSk7XG4gICAgY29uc3Qgb3V0SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQob3V0LmRhdGFJZCkuaWQ7XG4gICAgLy8gU2hvcnQtY2lyY3VpdCB6ZXJvLXNpemVkIHRlbnNvcnMuXG4gICAgaWYgKHV0aWwuc2l6ZUZyb21TaGFwZShvdXQuc2hhcGUpID09PSAwKSB7XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuICAgIHdhc21GdW5jKHhJZCwgb3V0SWQpO1xuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3Qgc2lnbW9pZENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiAnU2lnbW9pZCcsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBzZXR1cEZ1bmM6IHNldHVwLFxuICAgIGtlcm5lbEZ1bmM6IHNpZ21vaWRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TaWdtb2lkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFNpbiB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVVbmFyeUtlcm5lbENvbmZpZyB9IGZyb20gJy4vdW5hcnlfa2VybmVsJztcbmV4cG9ydCBjb25zdCBzaW5Db25maWcgPSBjcmVhdGVVbmFyeUtlcm5lbENvbmZpZyhTaW4pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2luLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFNsaWNlLCBzbGljZV91dGlsLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHNsaWNlSW1wbENQVSB9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuZXhwb3J0IGZ1bmN0aW9uIHNsaWNlKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0czogeyB4IH0sIGF0dHJzOiB7IGJlZ2luLCBzaXplIH0sIGJhY2tlbmQgfSA9IGFyZ3M7XG4gICAgY29uc3QgW2JlZ2luXywgc2l6ZV9dID0gc2xpY2VfdXRpbC5wYXJzZVNsaWNlUGFyYW1zKHgsIGJlZ2luLCBzaXplKTtcbiAgICBjb25zdCBpc0NvbnRpbm91cyA9IHNsaWNlX3V0aWwuaXNTbGljZUNvbnRpbm91cyh4LnNoYXBlLCBiZWdpbl8sIHNpemVfKTtcbiAgICBjb25zdCB4VmFscyA9IGJhY2tlbmQucmVhZFN5bmMoeC5kYXRhSWQpO1xuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dChzaXplXywgeC5kdHlwZSk7XG4gICAgY29uc3QgeFN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKHguc2hhcGUpO1xuICAgIGNvbnN0IG91dERhdGEgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQob3V0LmRhdGFJZCk7XG4gICAgaWYgKGlzQ29udGlub3VzKSB7XG4gICAgICAgIGNvbnN0IGZsYXRPZmZzZXQgPSBzbGljZV91dGlsLmNvbXB1dGVGbGF0T2Zmc2V0KGJlZ2luXywgeFN0cmlkZXMpO1xuICAgICAgICBpZiAoeC5kdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIG91dERhdGEuc3RyaW5nQnl0ZXMgPVxuICAgICAgICAgICAgICAgIHhWYWxzXG4gICAgICAgICAgICAgICAgICAgIC5zbGljZShmbGF0T2Zmc2V0LCBmbGF0T2Zmc2V0ICsgdXRpbC5zaXplRnJvbVNoYXBlKHNpemVfKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBvdXRWYWxzID0gYmFja2VuZC50eXBlZEFycmF5RnJvbUhlYXAob3V0KTtcbiAgICAgICAgICAgIG91dFZhbHMuc2V0KHhWYWxzXG4gICAgICAgICAgICAgICAgLnN1YmFycmF5KGZsYXRPZmZzZXQsIGZsYXRPZmZzZXQgKyB1dGlsLnNpemVGcm9tU2hhcGUoc2l6ZV8pKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG4gICAgaWYgKHguZHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IHNsaWNlSW1wbENQVSh4VmFscywgYmVnaW5fLCBzaXplXywgeC5zaGFwZSwgeC5kdHlwZSk7XG4gICAgICAgIG91dERhdGEuc3RyaW5nQnl0ZXMgPSByZXM7XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuICAgIGNvbnN0IG91dFZhbHMgPSBiYWNrZW5kLnR5cGVkQXJyYXlGcm9tSGVhcChvdXQpO1xuICAgIGNvbnN0IHJhbmsgPSB4LnNoYXBlLmxlbmd0aDtcbiAgICBpZiAocmFuayA9PT0gMikge1xuICAgICAgICBzbGljZTJkKHhWYWxzLCB4U3RyaWRlc1swXSwgb3V0VmFscywgYmVnaW5fLCBzaXplXyk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHJhbmsgPT09IDMpIHtcbiAgICAgICAgc2xpY2UzZCh4VmFscywgeFN0cmlkZXNbMF0sIHhTdHJpZGVzWzFdLCBvdXRWYWxzLCBiZWdpbl8sIHNpemVfKTtcbiAgICB9XG4gICAgZWxzZSBpZiAocmFuayA9PT0gNCkge1xuICAgICAgICBzbGljZTRkKHhWYWxzLCB4U3RyaWRlc1swXSwgeFN0cmlkZXNbMV0sIHhTdHJpZGVzWzJdLCBvdXRWYWxzLCBiZWdpbl8sIHNpemVfKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IHNsaWNlSW1wbENQVSh4VmFscywgYmVnaW5fLCBzaXplXywgeC5zaGFwZSwgeC5kdHlwZSk7XG4gICAgICAgIG91dFZhbHMuc2V0KHJlcyk7XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG59XG5mdW5jdGlvbiBzbGljZTJkKHhWYWxzLCB4U3RyaWRlLCBvdXRWYWxzLCBiZWdpbiwgc2l6ZSkge1xuICAgIGxldCBvdXRPZmZzZXQgPSAwO1xuICAgIGNvbnN0IGJlZ2luSSA9IGJlZ2luWzBdO1xuICAgIGNvbnN0IGJlZ2luSiA9IGJlZ2luWzFdO1xuICAgIGNvbnN0IGVuZEkgPSBiZWdpbkkgKyBzaXplWzBdO1xuICAgIGZvciAobGV0IGkgPSBiZWdpbkk7IGkgPCBlbmRJOyBpKyspIHtcbiAgICAgICAgY29uc3QgeE9mZnNldCA9IGkgKiB4U3RyaWRlICsgYmVnaW5KO1xuICAgICAgICBvdXRWYWxzLnNldCh4VmFscy5zdWJhcnJheSh4T2Zmc2V0LCB4T2Zmc2V0ICsgc2l6ZVsxXSksIG91dE9mZnNldCk7XG4gICAgICAgIG91dE9mZnNldCArPSBzaXplWzFdO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHNsaWNlM2QoeFZhbHMsIHhTdHJpZGUxLCB4U3RyaWRlMiwgb3V0VmFscywgYmVnaW4sIHNpemUpIHtcbiAgICBsZXQgb3V0T2Zmc2V0ID0gMDtcbiAgICBjb25zdCBiZWdpbkkgPSBiZWdpblswXTtcbiAgICBjb25zdCBiZWdpbkogPSBiZWdpblsxXTtcbiAgICBjb25zdCBiZWdpbksgPSBiZWdpblsyXTtcbiAgICBjb25zdCBlbmRJID0gYmVnaW5JICsgc2l6ZVswXTtcbiAgICBjb25zdCBlbmRKID0gYmVnaW5KICsgc2l6ZVsxXTtcbiAgICBmb3IgKGxldCBpID0gYmVnaW5JOyBpIDwgZW5kSTsgaSsrKSB7XG4gICAgICAgIGZvciAobGV0IGogPSBiZWdpbko7IGogPCBlbmRKOyBqKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHhPZmZzZXQgPSBpICogeFN0cmlkZTEgKyBqICogeFN0cmlkZTIgKyBiZWdpbks7XG4gICAgICAgICAgICBvdXRWYWxzLnNldCh4VmFscy5zdWJhcnJheSh4T2Zmc2V0LCB4T2Zmc2V0ICsgc2l6ZVsyXSksIG91dE9mZnNldCk7XG4gICAgICAgICAgICBvdXRPZmZzZXQgKz0gc2l6ZVsyXTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIHNsaWNlNGQoeFZhbHMsIHhTdHJpZGUxLCB4U3RyaWRlMiwgeFN0cmlkZTMsIG91dFZhbHMsIGJlZ2luLCBzaXplKSB7XG4gICAgbGV0IG91dE9mZnNldCA9IDA7XG4gICAgY29uc3QgYmVnaW5JID0gYmVnaW5bMF07XG4gICAgY29uc3QgYmVnaW5KID0gYmVnaW5bMV07XG4gICAgY29uc3QgYmVnaW5LID0gYmVnaW5bMl07XG4gICAgY29uc3QgZW5kSSA9IGJlZ2luSSArIHNpemVbMF07XG4gICAgY29uc3QgZW5kSiA9IGJlZ2luSiArIHNpemVbMV07XG4gICAgY29uc3QgZW5kSyA9IGJlZ2luSyArIHNpemVbMl07XG4gICAgY29uc3QgYmVnaW5MID0gYmVnaW5bM107XG4gICAgZm9yIChsZXQgaSA9IGJlZ2luSTsgaSA8IGVuZEk7IGkrKykge1xuICAgICAgICBmb3IgKGxldCBqID0gYmVnaW5KOyBqIDwgZW5kSjsgaisrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBrID0gYmVnaW5LOyBrIDwgZW5kSzsgaysrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeE9mZnNldCA9IGkgKiB4U3RyaWRlMSArIGogKiB4U3RyaWRlMiArIGsgKiB4U3RyaWRlMyArIGJlZ2luTDtcbiAgICAgICAgICAgICAgICBvdXRWYWxzLnNldCh4VmFscy5zdWJhcnJheSh4T2Zmc2V0LCB4T2Zmc2V0ICsgc2l6ZVszXSksIG91dE9mZnNldCk7XG4gICAgICAgICAgICAgICAgb3V0T2Zmc2V0ICs9IHNpemVbM107XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnQgY29uc3Qgc2xpY2VDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogU2xpY2UsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBrZXJuZWxGdW5jOiBzbGljZSxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TbGljZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBTb2Z0bWF4LCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmxldCB3YXNtRnVuYztcbmZ1bmN0aW9uIHNldHVwKGJhY2tlbmQpIHtcbiAgICB3YXNtRnVuYyA9IGJhY2tlbmQud2FzbS5jd3JhcChTb2Z0bWF4LCBudWxsIC8qIHZvaWQgKi8sIFtcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicgLy8gYmF0Y2hcbiAgICBdKTtcbn1cbmZ1bmN0aW9uIHNvZnRtYXgoYXJncykge1xuICAgIGNvbnN0IHsgYmFja2VuZCwgaW5wdXRzOiB7IGxvZ2l0cyB9LCBhdHRyczogeyBkaW0gfSB9ID0gYXJncztcbiAgICBjb25zdCB4SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQobG9naXRzLmRhdGFJZCkuaWQ7XG4gICAgY29uc3Qgb3V0ID0gYmFja2VuZC5tYWtlT3V0cHV0KGxvZ2l0cy5zaGFwZSwgbG9naXRzLmR0eXBlKTtcbiAgICBjb25zdCBvdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXQuZGF0YUlkKS5pZDtcbiAgICBjb25zdCBjaGFubmVscyA9IGxvZ2l0cy5zaGFwZVtkaW1dO1xuICAgIGNvbnN0IGJhdGNoID0gdXRpbC5zaXplRnJvbVNoYXBlKGxvZ2l0cy5zaGFwZSkgLyBjaGFubmVscztcbiAgICAvLyBTaG9ydC1jaXJjdWl0IHplcm8tc2l6ZWQgdGVuc29ycy5cbiAgICBpZiAodXRpbC5zaXplRnJvbVNoYXBlKG91dC5zaGFwZSkgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG4gICAgd2FzbUZ1bmMoeElkLCBvdXRJZCwgY2hhbm5lbHMsIGJhdGNoKTtcbiAgICByZXR1cm4gb3V0O1xufVxuZXhwb3J0IGNvbnN0IHNvZnRtYXhDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogU29mdG1heCxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIHNldHVwRnVuYzogc2V0dXAsXG4gICAga2VybmVsRnVuYzogc29mdG1heFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNvZnRtYXguanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBTcGFjZVRvQmF0Y2hORCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBwYWRWMkNvbmZpZyB9IGZyb20gJy4vUGFkVjInO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vUmVzaGFwZSc7XG5pbXBvcnQgeyB0cmFuc3Bvc2UgfSBmcm9tICcuL1RyYW5zcG9zZSc7XG5mdW5jdGlvbiBzcGFjZVRvQmF0Y2hORChhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgYmxvY2tTaGFwZSwgcGFkZGluZ3MgfSA9IGF0dHJzO1xuICAgIGNvbnN0IHByb2QgPSB1dGlsLnNpemVGcm9tU2hhcGUoYmxvY2tTaGFwZSk7XG4gICAgY29uc3QgY29tcGxldGVQYWRkaW5ncyA9IFtbMCwgMF1dO1xuICAgIGNvbXBsZXRlUGFkZGluZ3MucHVzaCguLi5wYWRkaW5ncyk7XG4gICAgZm9yIChsZXQgaSA9IDEgKyBibG9ja1NoYXBlLmxlbmd0aDsgaSA8IHguc2hhcGUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY29tcGxldGVQYWRkaW5ncy5wdXNoKFswLCAwXSk7XG4gICAgfVxuICAgIGNvbnN0IHBhZGRlZFggPSBwYWRWMkNvbmZpZy5rZXJuZWxGdW5jKHtcbiAgICAgICAgaW5wdXRzOiB7IHggfSxcbiAgICAgICAgYmFja2VuZCxcbiAgICAgICAgYXR0cnM6IHsgcGFkZGluZ3M6IGNvbXBsZXRlUGFkZGluZ3MsIGNvbnN0YW50VmFsdWU6IDAgfVxuICAgIH0pO1xuICAgIGNvbnN0IHJlc2hhcGVkUGFkZGVkU2hhcGUgPSBiYWNrZW5kX3V0aWwuZ2V0UmVzaGFwZWQocGFkZGVkWC5zaGFwZSwgYmxvY2tTaGFwZSwgcHJvZCwgZmFsc2UpO1xuICAgIGNvbnN0IHBlcm11dGVkUmVzaGFwZWRQYWRkZWRQZXJtdXRhdGlvbiA9IGJhY2tlbmRfdXRpbC5nZXRQZXJtdXRlZChyZXNoYXBlZFBhZGRlZFNoYXBlLmxlbmd0aCwgYmxvY2tTaGFwZS5sZW5ndGgsIGZhbHNlKTtcbiAgICBjb25zdCBmbGF0dGVuU2hhcGUgPSBiYWNrZW5kX3V0aWwuZ2V0UmVzaGFwZWRQZXJtdXRlZChwYWRkZWRYLnNoYXBlLCBibG9ja1NoYXBlLCBwcm9kLCBmYWxzZSk7XG4gICAgY29uc3QgcmVzaGFwZUlucHV0cyA9IHsgeDogcGFkZGVkWCB9O1xuICAgIGNvbnN0IHJlc2hhcGVBdHRycyA9IHsgc2hhcGU6IHJlc2hhcGVkUGFkZGVkU2hhcGUgfTtcbiAgICBjb25zdCBwYWRkZWRYUmVzaGFwZWQgPSByZXNoYXBlKHsgaW5wdXRzOiByZXNoYXBlSW5wdXRzLCBiYWNrZW5kLCBhdHRyczogcmVzaGFwZUF0dHJzIH0pO1xuICAgIGNvbnN0IHRyYW5zcG9zZUlucHV0cyA9IHsgeDogcGFkZGVkWFJlc2hhcGVkIH07XG4gICAgY29uc3QgdHJhbnNwb3NlQXR0cnMgPSB7IHBlcm06IHBlcm11dGVkUmVzaGFwZWRQYWRkZWRQZXJtdXRhdGlvbiB9O1xuICAgIGNvbnN0IHBhZGRlZFhUID0gdHJhbnNwb3NlKHsgaW5wdXRzOiB0cmFuc3Bvc2VJbnB1dHMsIGJhY2tlbmQsIGF0dHJzOiB0cmFuc3Bvc2VBdHRycyB9KTtcbiAgICBjb25zdCByZXN1bHRSZXNoYXBlSW5wdXRzID0geyB4OiBwYWRkZWRYVCB9O1xuICAgIGNvbnN0IHJlc3VsdFJlc2hhcGVBdHRycyA9IHsgc2hhcGU6IGZsYXR0ZW5TaGFwZSB9O1xuICAgIGNvbnN0IHJlc3VsdCA9IHJlc2hhcGUoeyBpbnB1dHM6IHJlc3VsdFJlc2hhcGVJbnB1dHMsIGJhY2tlbmQsIGF0dHJzOiByZXN1bHRSZXNoYXBlQXR0cnMgfSk7XG4gICAgYmFja2VuZC5kaXNwb3NlRGF0YShwYWRkZWRYLmRhdGFJZCk7XG4gICAgYmFja2VuZC5kaXNwb3NlRGF0YShwYWRkZWRYUmVzaGFwZWQuZGF0YUlkKTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VEYXRhKHBhZGRlZFhULmRhdGFJZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydCBjb25zdCBzcGFjZVRvQmF0Y2hORENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBTcGFjZVRvQmF0Y2hORCxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIGtlcm5lbEZ1bmM6IHNwYWNlVG9CYXRjaE5EXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3BhY2VUb0JhdGNoTkQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgU3BsaXRWLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGJhY2tlbmRfdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBzbGljZSB9IGZyb20gJy4vU2xpY2UnO1xuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0VihhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGF0dHJzLCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgbnVtT3JTaXplU3BsaXRzLCBheGlzIH0gPSBhdHRycztcbiAgICBjb25zdCAkYXhpcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oYXhpcywgeC5zaGFwZSlbMF07XG4gICAgY29uc3Qgc3BsaXRTaXplcyA9IGJhY2tlbmRfdXRpbC5wcmVwYXJlU3BsaXRTaXplKHgsIG51bU9yU2l6ZVNwbGl0cywgJGF4aXMpO1xuICAgIGNvbnN0IGJlZ2luID0gbmV3IEFycmF5KHguc2hhcGUubGVuZ3RoKS5maWxsKDApO1xuICAgIGNvbnN0IHNpemUgPSB4LnNoYXBlLnNsaWNlKCk7XG4gICAgcmV0dXJuIHNwbGl0U2l6ZXMubWFwKHMgPT4ge1xuICAgICAgICBjb25zdCB4U2xpY2VTaXplID0gWy4uLnNpemVdO1xuICAgICAgICB4U2xpY2VTaXplWyRheGlzXSA9IHM7XG4gICAgICAgIGNvbnN0IHhTbGljZSA9IHNsaWNlKHsgaW5wdXRzOiB7IHggfSwgYXR0cnM6IHsgYmVnaW4sIHNpemU6IHhTbGljZVNpemUgfSwgYmFja2VuZCB9KTtcbiAgICAgICAgYmVnaW5bJGF4aXNdICs9IHM7XG4gICAgICAgIHJldHVybiB4U2xpY2U7XG4gICAgfSk7XG59XG5leHBvcnQgY29uc3Qgc3BsaXRWQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFNwbGl0VixcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIGtlcm5lbEZ1bmM6IHNwbGl0VlxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNwbGl0Vi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBTcXJ0IH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVVuYXJ5S2VybmVsQ29uZmlnIH0gZnJvbSAnLi91bmFyeV9rZXJuZWwnO1xuZXhwb3J0IGNvbnN0IHNxcnRDb25maWcgPSBjcmVhdGVVbmFyeUtlcm5lbENvbmZpZyhTcXJ0KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNxcnQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgU3F1YXJlIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVVuYXJ5S2VybmVsQ29uZmlnIH0gZnJvbSAnLi91bmFyeV9rZXJuZWwnO1xuZXhwb3J0IGNvbnN0IHNxdWFyZUNvbmZpZyA9IGNyZWF0ZVVuYXJ5S2VybmVsQ29uZmlnKFNxdWFyZSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TcXVhcmUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgU3F1YXJlZERpZmZlcmVuY2UgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlQmluYXJ5S2VybmVsQ29uZmlnIH0gZnJvbSAnLi9iaW5hcnlfa2VybmVsJztcbmNvbnN0IHN1cHBvcnRzRnVsbEJyb2FkY2FzdCA9IHRydWU7XG5leHBvcnQgY29uc3Qgc3F1YXJlZERpZmZlcmVuY2VDb25maWcgPSBjcmVhdGVCaW5hcnlLZXJuZWxDb25maWcoU3F1YXJlZERpZmZlcmVuY2UsIHN1cHBvcnRzRnVsbEJyb2FkY2FzdCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TcXVhcmVkRGlmZmVyZW5jZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBTdGVwIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmxldCB3YXNtU3RlcDtcbmZ1bmN0aW9uIHNldHVwKGJhY2tlbmQpIHtcbiAgICB3YXNtU3RlcCA9IGJhY2tlbmQud2FzbS5jd3JhcChTdGVwLCBudWxsIC8qdm9pZCovLCBbXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgXSk7XG59XG5mdW5jdGlvbiBzdGVwKGFyZ3MpIHtcbiAgICBjb25zdCB7IGJhY2tlbmQsIGlucHV0cywgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBhbHBoYSB9ID0gYXR0cnM7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KHguZGF0YUlkKS5pZDtcbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQoeC5zaGFwZSwgeC5kdHlwZSk7XG4gICAgY29uc3Qgb3V0SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQob3V0LmRhdGFJZCkuaWQ7XG4gICAgd2FzbVN0ZXAoeElkLCBhbHBoYSwgb3V0SWQpO1xuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3Qgc3RlcENvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBTdGVwLFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAgc2V0dXBGdW5jOiBzZXR1cCxcbiAgICBrZXJuZWxGdW5jOiBzdGVwXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3RlcC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBiYWNrZW5kX3V0aWwsIFN0cmlkZWRTbGljZSwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9SZXNoYXBlJztcbmltcG9ydCB7IHNsaWNlIH0gZnJvbSAnLi9TbGljZSc7XG5sZXQgd2FzbVN0cmlkZWRTbGljZTtcbmZ1bmN0aW9uIHNldHVwKGJhY2tlbmQpIHtcbiAgICB3YXNtU3RyaWRlZFNsaWNlID0gYmFja2VuZC53YXNtLmN3cmFwKFN0cmlkZWRTbGljZSwgbnVsbCAvKnZvaWQqLywgW1xuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ2FycmF5JyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdhcnJheScsXG4gICAgICAgICdhcnJheScsXG4gICAgICAgICdhcnJheScsXG4gICAgICAgICdhcnJheScsXG4gICAgICAgICdhcnJheScsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICBdKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBzdHJpZGVkU2xpY2UoYXJncykge1xuICAgIGNvbnN0IHsgYmFja2VuZCwgaW5wdXRzLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHggfSA9IGlucHV0cztcbiAgICBsZXQgeyBiZWdpbiwgZW5kLCBzdHJpZGVzIH0gPSBhdHRycztcbiAgICBpZiAoc3RyaWRlcyA9PSBudWxsKSB7XG4gICAgICAgIHN0cmlkZXMgPSBuZXcgQXJyYXkoYmVnaW4ubGVuZ3RoKTtcbiAgICB9XG4gICAgY29uc3QgeyBiZWdpbk1hc2ssIGVuZE1hc2ssIGVsbGlwc2lzTWFzaywgbmV3QXhpc01hc2ssIHNocmlua0F4aXNNYXNrIH0gPSBhdHRycztcbiAgICBjb25zdCBlbGxpcHNpc0F4ZXMgPSBiYWNrZW5kX3V0aWwuc2xpY2VfdXRpbC5tYXNrVG9BeGVzKGVsbGlwc2lzTWFzayk7XG4gICAgaWYgKGVsbGlwc2lzQXhlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTXVsdGlwbGUgZWxsaXBzZXMgaW4gc2xpY2UgaXMgbm90IGFsbG93ZWQuJyk7XG4gICAgfVxuICAgIGlmIChlbGxpcHNpc01hc2sgIT09IDAgJiYgbmV3QXhpc01hc2sgIT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVc2luZyBib3RoIGVsbGlwc2lzTWFzayBhbmQgbmV3QXhpc01hc2sgaXMgbm90IHlldCBzdXBwb3J0ZWQuJyk7XG4gICAgfVxuICAgIGlmIChlbGxpcHNpc01hc2sgIT09IDAgJiYgc2hyaW5rQXhpc01hc2sgIT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVc2luZyBib3RoIGVsbGlwc2lzTWFzayBhbmQgc2hyaW5rQXhpc01hc2sgaXMgbm90IHlldCBzdXBwb3J0ZWQuJyk7XG4gICAgfVxuICAgIGNvbnN0IG51bUludGVycG9sYXRlZEF4ZXMgPSB4LnNoYXBlLmxlbmd0aCAtIGJlZ2luLmxlbmd0aDtcbiAgICAvLyBFeHBhbmQgdGhlIGRpbXMgb2YgeCBiYXNlZCBvbiB0aGUgbmV3QXhpc01hc2suXG4gICAgY29uc3QgZXhwYW5kQXhlcyA9IGJhY2tlbmRfdXRpbC5zbGljZV91dGlsLm1hc2tUb0F4ZXMobmV3QXhpc01hc2spO1xuICAgIGNvbnN0IG5ld1NoYXBlID0geC5zaGFwZS5zbGljZSgpO1xuICAgIGV4cGFuZEF4ZXMuZm9yRWFjaChheGlzID0+IHtcbiAgICAgICAgYmVnaW5bYXhpc10gPSAwO1xuICAgICAgICBlbmRbYXhpc10gPSAxO1xuICAgICAgICBuZXdTaGFwZS5zcGxpY2UoYXhpcywgMCwgMSk7XG4gICAgfSk7XG4gICAgY29uc3QgeFJlc2hhcGVkID0gcmVzaGFwZSh7IGlucHV0czogeyB4IH0sIGF0dHJzOiB7IHNoYXBlOiBuZXdTaGFwZSB9LCBiYWNrZW5kIH0pO1xuICAgIGNvbnN0IHsgYmVnaW46IG5vcm1hbGl6ZWRCZWdpbiwgZW5kOiBub3JtYWxpemVkRW5kLCBzdHJpZGVzOiBub3JtYWxpemVkU3RyaWRlcyB9ID0gYmFja2VuZF91dGlsLnNsaWNlX3V0aWwuZ2V0Tm9ybWFsaXplZEF4ZXMoeFJlc2hhcGVkLnNoYXBlLCBlbGxpcHNpc0F4ZXMsIG51bUludGVycG9sYXRlZEF4ZXMsIGJlZ2luLCBlbmQsIHN0cmlkZXMsIGJlZ2luTWFzaywgZW5kTWFzaywgZWxsaXBzaXNNYXNrKTtcbiAgICBiZWdpbiA9IG5vcm1hbGl6ZWRCZWdpbjtcbiAgICBlbmQgPSBub3JtYWxpemVkRW5kO1xuICAgIHN0cmlkZXMgPSBub3JtYWxpemVkU3RyaWRlcztcbiAgICBjb25zdCBzaHJpbmtBeGVzID0gYmFja2VuZF91dGlsLnNsaWNlX3V0aWwubWFza1RvQXhlcyhzaHJpbmtBeGlzTWFzayk7XG4gICAgLy8gQWRqdXN0IHRoZSBlbmRzIGJhc2VkIG9uIHRoZSBzaHJpbmsgbWFzay5cbiAgICBzaHJpbmtBeGVzLmZvckVhY2goYXhpcyA9PiB7XG4gICAgICAgIGVuZFtheGlzXSA9IGJlZ2luW2F4aXNdICsgMTtcbiAgICAgICAgc3RyaWRlc1theGlzXSA9IDE7XG4gICAgfSk7XG4gICAgLy8gRmlndXJlIG91dCB0aGUgb3V0cHV0IHNoYXBlLlxuICAgIGNvbnN0IHNpemUgPSBiYWNrZW5kX3V0aWwuc2xpY2VfdXRpbC5jb21wdXRlT3V0U2hhcGUoYmVnaW4sIGVuZCwgc3RyaWRlcyk7XG4gICAgLy8gUmVtb3ZlIHRoZSBheGVzIGJhc2VkIG9uIHNocmlua01hc2suXG4gICAgY29uc3Qgb3V0U2hhcGUgPSBzaXplLmZpbHRlcigoXywgYXhpcykgPT4gc2hyaW5rQXhlcy5pbmRleE9mKGF4aXMpID09PSAtMSk7XG4gICAgY29uc3Qgbm9uU3RyaWRlZCA9IHN0cmlkZXMuZXZlcnkodiA9PiB2ID09PSAxKTtcbiAgICBpZiAobm9uU3RyaWRlZCkge1xuICAgICAgICBjb25zdCB4U2xpY2VkID0gc2xpY2UoeyBpbnB1dHM6IHsgeDogeFJlc2hhcGVkIH0sIGF0dHJzOiB7IGJlZ2luLCBzaXplIH0sIGJhY2tlbmQgfSk7XG4gICAgICAgIGJhY2tlbmQuZGlzcG9zZURhdGEoeFJlc2hhcGVkLmRhdGFJZCk7XG4gICAgICAgIGNvbnN0IHJlc2hhcGVkID0gcmVzaGFwZSh7IGlucHV0czogeyB4OiB4U2xpY2VkIH0sIGF0dHJzOiB7IHNoYXBlOiBvdXRTaGFwZSB9LCBiYWNrZW5kIH0pO1xuICAgICAgICBiYWNrZW5kLmRpc3Bvc2VEYXRhKHhTbGljZWQuZGF0YUlkKTtcbiAgICAgICAgcmV0dXJuIHJlc2hhcGVkO1xuICAgIH1cbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQob3V0U2hhcGUsICdmbG9hdDMyJyk7XG4gICAgaWYgKCFvdXRTaGFwZS5zb21lKGF4aXMgPT4gYXhpcyA9PT0gMCkpIHtcbiAgICAgICAgY29uc3QgeElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KHhSZXNoYXBlZC5kYXRhSWQpLmlkO1xuICAgICAgICBjb25zdCB4U3RyaWRlc0J5dGVzID0gbmV3IFVpbnQ4QXJyYXkobmV3IEludDMyQXJyYXkodXRpbC5jb21wdXRlU3RyaWRlcyh4UmVzaGFwZWQuc2hhcGUpKS5idWZmZXIpO1xuICAgICAgICBjb25zdCBiZWdpbkJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkobmV3IEludDMyQXJyYXkoYmVnaW4pLmJ1ZmZlcik7XG4gICAgICAgIGNvbnN0IGVuZEJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkobmV3IEludDMyQXJyYXkoZW5kKS5idWZmZXIpO1xuICAgICAgICBjb25zdCBzdHJpZGVzQnl0ZXMgPSBuZXcgVWludDhBcnJheShuZXcgSW50MzJBcnJheShzdHJpZGVzKS5idWZmZXIpO1xuICAgICAgICBjb25zdCBvdXRwdXRTaGFwZUJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkobmV3IEludDMyQXJyYXkob3V0U2hhcGUpLmJ1ZmZlcik7XG4gICAgICAgIGNvbnN0IG91dFN0cmlkZXNCeXRlcyA9IG5ldyBVaW50OEFycmF5KG5ldyBJbnQzMkFycmF5KHV0aWwuY29tcHV0ZVN0cmlkZXMob3V0U2hhcGUpKS5idWZmZXIpO1xuICAgICAgICBjb25zdCBvdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXQuZGF0YUlkKS5pZDtcbiAgICAgICAgd2FzbVN0cmlkZWRTbGljZSh4SWQsIHhTdHJpZGVzQnl0ZXMsIHhSZXNoYXBlZC5zaGFwZS5sZW5ndGgsIGJlZ2luQnl0ZXMsIGVuZEJ5dGVzLCBzdHJpZGVzQnl0ZXMsIG91dHB1dFNoYXBlQnl0ZXMsIG91dFN0cmlkZXNCeXRlcywgb3V0U2hhcGUubGVuZ3RoLCBvdXRJZCk7XG4gICAgfVxuICAgIGJhY2tlbmQuZGlzcG9zZURhdGEoeFJlc2hhcGVkLmRhdGFJZCk7XG4gICAgY29uc3QgcmVzaGFwZWQgPSByZXNoYXBlKHsgaW5wdXRzOiB7IHg6IG91dCB9LCBhdHRyczogeyBzaGFwZTogb3V0U2hhcGUgfSwgYmFja2VuZCB9KTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VEYXRhKG91dC5kYXRhSWQpO1xuICAgIHJldHVybiByZXNoYXBlZDtcbn1cbmV4cG9ydCBjb25zdCBzdHJpZGVkU2xpY2VDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogU3RyaWRlZFNsaWNlLFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAgc2V0dXBGdW5jOiBzZXR1cCxcbiAgICBrZXJuZWxGdW5jOiBzdHJpZGVkU2xpY2Vcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TdHJpZGVkU2xpY2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgU3ViIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGNyZWF0ZUJpbmFyeUtlcm5lbENvbmZpZyB9IGZyb20gJy4vYmluYXJ5X2tlcm5lbCc7XG5jb25zdCBzdXBwb3J0c0Z1bGxCcm9hZGNhc3QgPSB0cnVlO1xuZXhwb3J0IGNvbnN0IHN1YkNvbmZpZyA9IGNyZWF0ZUJpbmFyeUtlcm5lbENvbmZpZyhTdWIsIHN1cHBvcnRzRnVsbEJyb2FkY2FzdCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TdWIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmFja2VuZF91dGlsLCBTdW0sIHV0aWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgcGVybXV0ZUF4ZXNBbmRUcmFuc3Bvc2UgfSBmcm9tICcuL2tlcm5lbF91dGlscyc7XG5sZXQgd2FzbVN1bTtcbmZ1bmN0aW9uIHNldHVwKGJhY2tlbmQpIHtcbiAgICB3YXNtU3VtID0gYmFja2VuZC53YXNtLmN3cmFwKFN1bSwgbnVsbCAvKnZvaWQqLywgWydudW1iZXIsIG51bWJlciwgbnVtYmVyJ10pO1xufVxuZnVuY3Rpb24gc3VtKGFyZ3MpIHtcbiAgICBjb25zdCB7IGJhY2tlbmQsIGlucHV0cywgYXR0cnMgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBheGlzLCBrZWVwRGltcyB9ID0gYXR0cnM7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KHguZGF0YUlkKS5pZDtcbiAgICBsZXQgaW5wdXRJZCA9IHhJZDtcbiAgICBsZXQgaW5wdXQgPSB4O1xuICAgIGNvbnN0IHsgdHJhbnNwb3NlZCwgYXhlcywgb3JpZ2luYWxBeGVzLCBpbnB1dFdhc1RyYW5zcG9zZWQgfSA9IHBlcm11dGVBeGVzQW5kVHJhbnNwb3NlKHgsIGF4aXMsIGJhY2tlbmQpO1xuICAgIGxldCByZWR1Y3Rpb25BeGVzID0gYXhlcztcbiAgICBpZiAoaW5wdXRXYXNUcmFuc3Bvc2VkKSB7XG4gICAgICAgIGNvbnN0IHRyYW5zcG9zZWRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldCh0cmFuc3Bvc2VkLmRhdGFJZCkuaWQ7XG4gICAgICAgIGlmICh0cmFuc3Bvc2VkSWQgIT09IHhJZCkge1xuICAgICAgICAgICAgLy8gdHJhbnNwb3NlIHdhcyBub3QgYSBuby1vcC4gV2Ugd2lsbCBuZWVkIHRvIGRpc3Bvc2Ugb2YgdGhpc1xuICAgICAgICAgICAgLy8gb25jZSB3ZSBhcmUgZG9uZS5cbiAgICAgICAgICAgIGlucHV0ID0gdHJhbnNwb3NlZDtcbiAgICAgICAgICAgIGlucHV0SWQgPSB0cmFuc3Bvc2VkSWQ7XG4gICAgICAgICAgICByZWR1Y3Rpb25BeGVzID0gYmFja2VuZF91dGlsLmdldElubmVyTW9zdEF4ZXMocmVkdWN0aW9uQXhlcy5sZW5ndGgsIGlucHV0LnNoYXBlLmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYmFja2VuZF91dGlsLmFzc2VydEF4ZXNBcmVJbm5lck1vc3REaW1zKCdzdW0nLCByZWR1Y3Rpb25BeGVzLCBpbnB1dC5zaGFwZS5sZW5ndGgpO1xuICAgIGNvbnN0IFtvdXRTaGFwZSwgcmVkdWNlU2hhcGVdID0gYmFja2VuZF91dGlsLmNvbXB1dGVPdXRBbmRSZWR1Y2VTaGFwZXMoaW5wdXQuc2hhcGUsIHJlZHVjdGlvbkF4ZXMpO1xuICAgIGNvbnN0IHJlZHVjZVNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUocmVkdWNlU2hhcGUpO1xuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dChvdXRTaGFwZSwgaW5wdXQuZHR5cGUpO1xuICAgIGlmICh1dGlsLnNpemVGcm9tU2hhcGUoaW5wdXQuc2hhcGUpICE9PSAwKSB7XG4gICAgICAgIGNvbnN0IG91dElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KG91dC5kYXRhSWQpLmlkO1xuICAgICAgICB3YXNtU3VtKGlucHV0SWQsIHJlZHVjZVNpemUsIG91dElkKTtcbiAgICB9XG4gICAgaWYgKGlucHV0V2FzVHJhbnNwb3NlZCkge1xuICAgICAgICAvLyBkaXNwb3NlIG9mIHRoZSB0cmFuc3Bvc2VkIHRlbnNvci5cbiAgICAgICAgYmFja2VuZC5kaXNwb3NlRGF0YSh0cmFuc3Bvc2VkLmRhdGFJZCk7XG4gICAgfVxuICAgIGlmIChrZWVwRGltcykge1xuICAgICAgICAvLyByZXNoYXBlXG4gICAgICAgIGNvbnN0IG5ld1NoYXBlID0gYmFja2VuZF91dGlsLmV4cGFuZFNoYXBlVG9LZWVwRGltKG91dC5zaGFwZSwgb3JpZ2luYWxBeGVzKTtcbiAgICAgICAgb3V0LnNoYXBlID0gbmV3U2hhcGU7XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3Qgc3VtQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFN1bSxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIHNldHVwRnVuYzogc2V0dXAsXG4gICAga2VybmVsRnVuYzogc3VtXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3VtLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFRhbiB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVVbmFyeUtlcm5lbENvbmZpZyB9IGZyb20gJy4vdW5hcnlfa2VybmVsJztcbmV4cG9ydCBjb25zdCB0YW5Db25maWcgPSBjcmVhdGVVbmFyeUtlcm5lbENvbmZpZyhUYW4pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VGFuLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFRhbmggfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlVW5hcnlLZXJuZWxDb25maWcgfSBmcm9tICcuL3VuYXJ5X2tlcm5lbCc7XG5leHBvcnQgY29uc3QgdGFuaENvbmZpZyA9IGNyZWF0ZVVuYXJ5S2VybmVsQ29uZmlnKFRhbmgpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VGFuaC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBUaWxlIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IENwcERUeXBlIH0gZnJvbSAnLi90eXBlcyc7XG5sZXQgd2FzbVRpbGU7XG5mdW5jdGlvbiBzZXR1cChiYWNrZW5kKSB7XG4gICAgd2FzbVRpbGUgPSBiYWNrZW5kLndhc20uY3dyYXAoVGlsZSwgbnVsbCAvKiB2b2lkICovLCBbXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnYXJyYXknLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ2FycmF5JyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInIC8vIG91dF9pZFxuICAgIF0pO1xufVxuZnVuY3Rpb24gdGlsZShhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHMsIGJhY2tlbmQsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgeCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHhJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldCh4LmRhdGFJZCkuaWQ7XG4gICAgY29uc3QgeyByZXBzIH0gPSBhdHRycztcbiAgICBjb25zdCBuZXdTaGFwZSA9IG5ldyBBcnJheSh4LnNoYXBlLmxlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXdTaGFwZS5sZW5ndGg7IGkrKykge1xuICAgICAgICBuZXdTaGFwZVtpXSA9IHguc2hhcGVbaV0gKiByZXBzW2ldO1xuICAgIH1cbiAgICBjb25zdCB4U2hhcGVCeXRlcyA9IG5ldyBVaW50OEFycmF5KG5ldyBJbnQzMkFycmF5KHguc2hhcGUpLmJ1ZmZlcik7XG4gICAgY29uc3QgbmV3U2hhcGVCeXRlcyA9IG5ldyBVaW50OEFycmF5KG5ldyBJbnQzMkFycmF5KG5ld1NoYXBlKS5idWZmZXIpO1xuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dChuZXdTaGFwZSwgeC5kdHlwZSk7XG4gICAgY29uc3Qgb3V0SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQob3V0LmRhdGFJZCkuaWQ7XG4gICAgd2FzbVRpbGUoeElkLCB4U2hhcGVCeXRlcywgeC5zaGFwZS5sZW5ndGgsIG5ld1NoYXBlQnl0ZXMsIG5ld1NoYXBlLmxlbmd0aCwgQ3BwRFR5cGVbb3V0LmR0eXBlXSwgb3V0SWQpO1xuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3QgdGlsZUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBUaWxlLFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAgc2V0dXBGdW5jOiBzZXR1cCxcbiAgICBrZXJuZWxGdW5jOiB0aWxlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VGlsZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBUb3BLIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IENwcERUeXBlIH0gZnJvbSAnLi90eXBlcyc7XG5sZXQgd2FzbVRvcEs7XG5mdW5jdGlvbiBzZXR1cChiYWNrZW5kKSB7XG4gICAgd2FzbVRvcEsgPSBiYWNrZW5kLndhc20uY3dyYXAoVG9wSywgbnVsbCAvKiB2b2lkICovLCBbXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnYXJyYXknLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnYm9vbCcsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICBdKTtcbn1cbmV4cG9ydCBjb25zdCB0b3BrID0gKHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9KSA9PiB7XG4gICAgY29uc3QgeyB4IH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBrLCBzb3J0ZWQgfSA9IGF0dHJzO1xuICAgIGNvbnN0IHhJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldCh4LmRhdGFJZCkuaWQ7XG4gICAgY29uc3QgeFNoYXBlQnl0ZXMgPSBuZXcgVWludDhBcnJheShuZXcgSW50MzJBcnJheSh4LnNoYXBlKS5idWZmZXIpO1xuICAgIGNvbnN0IG91dHB1dFNoYXBlID0geC5zaGFwZS5zbGljZSgpO1xuICAgIG91dHB1dFNoYXBlW291dHB1dFNoYXBlLmxlbmd0aCAtIDFdID0gaztcbiAgICBjb25zdCBvdXRWYWx1ZXMgPSBiYWNrZW5kLm1ha2VPdXRwdXQob3V0cHV0U2hhcGUsIHguZHR5cGUpO1xuICAgIGNvbnN0IG91dFZhbHVlc0lkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KG91dFZhbHVlcy5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IG91dEluZGljZXMgPSBiYWNrZW5kLm1ha2VPdXRwdXQob3V0cHV0U2hhcGUsICdpbnQzMicpO1xuICAgIGNvbnN0IG91dEluZGljZXNJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXRJbmRpY2VzLmRhdGFJZCkuaWQ7XG4gICAgd2FzbVRvcEsoeElkLCB4U2hhcGVCeXRlcywgeC5zaGFwZS5sZW5ndGgsIENwcERUeXBlW3guZHR5cGVdLCBrLCBzb3J0ZWQsIG91dFZhbHVlc0lkLCBvdXRJbmRpY2VzSWQpO1xuICAgIHJldHVybiBbb3V0VmFsdWVzLCBvdXRJbmRpY2VzXTtcbn07XG5leHBvcnQgY29uc3QgdG9wS0NvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBUb3BLLFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAgc2V0dXBGdW5jOiBzZXR1cCxcbiAgICBrZXJuZWxGdW5jOiB0b3BrLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRvcEsuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgVHJhbnNmb3JtLCB1dGlsIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmxldCB3YXNtVHJhbnNmb3JtO1xuZnVuY3Rpb24gc2V0dXAoYmFja2VuZCkge1xuICAgIHdhc21UcmFuc2Zvcm0gPSBiYWNrZW5kLndhc20uY3dyYXAoVHJhbnNmb3JtLCBudWxsIC8qdm9pZCovLCBbXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ2Jvb2wnLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnYXJyYXknLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicgLy8gb3V0SWRcbiAgICBdKTtcbn1cbmZ1bmN0aW9uIHRyYW5zZm9ybShhcmdzKSB7XG4gICAgY29uc3QgeyBiYWNrZW5kLCBpbnB1dHMsIGF0dHJzIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgaW1hZ2UsIHRyYW5zZm9ybXMgfSA9IGlucHV0cztcbiAgICBjb25zdCB7IGludGVycG9sYXRpb24sIGZpbGxNb2RlLCBmaWxsVmFsdWUsIG91dHB1dFNoYXBlIH0gPSBhdHRycztcbiAgICBjb25zdCBbYmF0Y2gsIGltYWdlSGVpZ2h0LCBpbWFnZVdpZHRoLCBudW1DaGFubmVsc10gPSBpbWFnZS5zaGFwZTtcbiAgICBjb25zdCBbb3V0SGVpZ2h0LCBvdXRXaWR0aF0gPSBvdXRwdXRTaGFwZSAhPSBudWxsID8gb3V0cHV0U2hhcGUgOiBbaW1hZ2VIZWlnaHQsIGltYWdlV2lkdGhdO1xuICAgIGNvbnN0IG91dFNoYXBlID0gW2JhdGNoLCBvdXRIZWlnaHQsIG91dFdpZHRoLFxuICAgICAgICBudW1DaGFubmVsc107XG4gICAgY29uc3Qgc3RyaWRlcyA9IG5ldyBVaW50OEFycmF5KG5ldyBJbnQzMkFycmF5KHV0aWwuY29tcHV0ZVN0cmlkZXMoaW1hZ2Uuc2hhcGUpKS5idWZmZXIpO1xuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dChvdXRTaGFwZSwgaW1hZ2UuZHR5cGUpO1xuICAgIGNvbnN0IG91dElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KG91dC5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IGltYWdlRGF0YSA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChpbWFnZS5kYXRhSWQpO1xuICAgIGNvbnN0IGltYWdlSWQgPSBpbWFnZURhdGEuaWQ7XG4gICAgY29uc3QgdHJhbnNmb3Jtc0RhdGEgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQodHJhbnNmb3Jtcy5kYXRhSWQpO1xuICAgIGNvbnN0IHRyYW5zZm9ybXNJZCA9IHRyYW5zZm9ybXNEYXRhLmlkO1xuICAgIGNvbnN0IGludGVycG9sYXRpb25Nb2RlSWQgPSBpbnRlcnBvbGF0aW9uID09PSAnbmVhcmVzdCcgPyAxIDogMjtcbiAgICBsZXQgZmlsbE1vZGVJZDtcbiAgICBzd2l0Y2ggKGZpbGxNb2RlKSB7XG4gICAgICAgIGNhc2UgJ2NvbnN0YW50JzpcbiAgICAgICAgICAgIGZpbGxNb2RlSWQgPSAxO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3JlZmxlY3QnOlxuICAgICAgICAgICAgZmlsbE1vZGVJZCA9IDI7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnd3JhcCc6XG4gICAgICAgICAgICBmaWxsTW9kZUlkID0gMztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICduZWFyZXN0JzpcbiAgICAgICAgICAgIGZpbGxNb2RlSWQgPSA0O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBmaWxsTW9kZUlkID0gMTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICB3YXNtVHJhbnNmb3JtKGltYWdlSWQsIHRyYW5zZm9ybXNJZCwgKHRyYW5zZm9ybXMuc2hhcGVbMF0gPiAxKSwgYmF0Y2gsIG91dEhlaWdodCwgb3V0V2lkdGgsIG51bUNoYW5uZWxzLCBpbWFnZVdpZHRoLCBpbWFnZUhlaWdodCwgc3RyaWRlcywgaW1hZ2Uuc2hhcGUubGVuZ3RoIC0gMSwgaW50ZXJwb2xhdGlvbk1vZGVJZCwgZmlsbE1vZGVJZCwgZmlsbFZhbHVlLCBvdXRJZCk7XG4gICAgcmV0dXJuIG91dDtcbn1cbmV4cG9ydCBjb25zdCB0cmFuc2Zvcm1Db25maWcgPSB7XG4gICAga2VybmVsTmFtZTogVHJhbnNmb3JtLFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAgc2V0dXBGdW5jOiBzZXR1cCxcbiAgICBrZXJuZWxGdW5jOiB0cmFuc2Zvcm1cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1UcmFuc2Zvcm0uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgVHJhbnNwb3NlIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IGlkZW50aXR5IH0gZnJvbSAnLi9JZGVudGl0eSc7XG5pbXBvcnQgeyBDcHBEVHlwZSB9IGZyb20gJy4vdHlwZXMnO1xubGV0IHdhc21UcmFuc3Bvc2U7XG5mdW5jdGlvbiBzZXR1cChiYWNrZW5kKSB7XG4gICAgd2FzbVRyYW5zcG9zZSA9IGJhY2tlbmQud2FzbS5jd3JhcChUcmFuc3Bvc2UsIG51bGwgLyogdm9pZCAqLywgW1xuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ2FycmF5JyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ2FycmF5JyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgXSk7XG59XG5leHBvcnQgZnVuY3Rpb24gdHJhbnNwb3NlKGFyZ3MpIHtcbiAgICBjb25zdCB7IGlucHV0cywgYmFja2VuZCwgYXR0cnMgfSA9IGFyZ3M7XG4gICAgLy8gUmVkdWNlIGFueSBkaW1lbnNpb25zIHdpdGggc2l6ZSBvbmUuIExvd2VyLXJhbmsgdHJhbnNwb3NlIGtlcm5lbCBwZXJmb3Jtc1xuICAgIC8vIGJldHRlciBkdWUgdG8gc2ltcGxlciBtZW1vcnkgYWNjZXNzIHBhdHRlcm4uXG4gICAgY29uc3QgW3JlZHVjZWRTaGFwZSwgcGVybV0gPSByZW1vdmVPbmVTaXplRGltcyhpbnB1dHMueC5zaGFwZSwgYXR0cnMucGVybSk7XG4gICAgbGV0IHBlcm1Jc05vT3AgPSB0cnVlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGVybS5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAocGVybVtpXSAhPT0gaSkge1xuICAgICAgICAgICAgcGVybUlzTm9PcCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG91dFNoYXBlID0gY29tcHV0ZU91dFNoYXBlKGlucHV0cy54LnNoYXBlLCBhdHRycy5wZXJtKTtcbiAgICBjb25zdCB4ID0ge1xuICAgICAgICBkYXRhSWQ6IGlucHV0cy54LmRhdGFJZCxcbiAgICAgICAgc2hhcGU6IHJlZHVjZWRTaGFwZSxcbiAgICAgICAgZHR5cGU6IGlucHV0cy54LmR0eXBlXG4gICAgfTtcbiAgICBpZiAocGVybUlzTm9PcCkge1xuICAgICAgICBjb25zdCBjbG9uZWQgPSBpZGVudGl0eSh7IGlucHV0cywgYmFja2VuZCB9KTtcbiAgICAgICAgY2xvbmVkLnNoYXBlID0gb3V0U2hhcGU7XG4gICAgICAgIHJldHVybiBjbG9uZWQ7XG4gICAgfVxuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dChvdXRTaGFwZSwgeC5kdHlwZSk7XG4gICAgY29uc3QgeElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KHguZGF0YUlkKS5pZDtcbiAgICBjb25zdCBvdXRJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChvdXQuZGF0YUlkKS5pZDtcbiAgICBjb25zdCBwZXJtQnl0ZXMgPSBuZXcgVWludDhBcnJheShuZXcgSW50MzJBcnJheShwZXJtKS5idWZmZXIpO1xuICAgIGNvbnN0IHhTaGFwZUJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkobmV3IEludDMyQXJyYXkoeC5zaGFwZSkuYnVmZmVyKTtcbiAgICB3YXNtVHJhbnNwb3NlKHhJZCwgeFNoYXBlQnl0ZXMsIHguc2hhcGUubGVuZ3RoLCBDcHBEVHlwZVt4LmR0eXBlXSwgb3V0SWQsIHBlcm1CeXRlcywgcGVybS5sZW5ndGgpO1xuICAgIHJldHVybiBvdXQ7XG59XG5mdW5jdGlvbiBjb21wdXRlT3V0U2hhcGUoaW5TaGFwZSwgcGVybSkge1xuICAgIGNvbnN0IG91dFNoYXBlID0gbmV3IEFycmF5KGluU2hhcGUubGVuZ3RoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG91dFNoYXBlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG91dFNoYXBlW2ldID0gaW5TaGFwZVtwZXJtW2ldXTtcbiAgICB9XG4gICAgcmV0dXJuIG91dFNoYXBlO1xufVxuZnVuY3Rpb24gcmVtb3ZlT25lU2l6ZURpbXMoc2hhcGUsIHBlcm0pIHtcbiAgICBjb25zdCBuZXdTaGFwZSA9IFtdO1xuICAgIGNvbnN0IG5ld1Blcm0gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNoYXBlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGlmIChzaGFwZVtpXSAhPT0gMSkge1xuICAgICAgICAgICAgbmV3U2hhcGUucHVzaChzaGFwZVtpXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNoYXBlW3Blcm1baV1dICE9PSAxKSB7XG4gICAgICAgICAgICBuZXdQZXJtLnB1c2gocGVybVtpXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXdQZXJtLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGxldCBtaW5WYWxJZHggPSAtMTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBuZXdQZXJtLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICBpZiAobmV3UGVybVtqXSA+PSBpICYmXG4gICAgICAgICAgICAgICAgKG1pblZhbElkeCA9PT0gLTEgfHwgbmV3UGVybVttaW5WYWxJZHhdID4gbmV3UGVybVtqXSkpIHtcbiAgICAgICAgICAgICAgICBtaW5WYWxJZHggPSBqO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG5ld1Blcm1bbWluVmFsSWR4XSA9IGk7XG4gICAgfVxuICAgIHJldHVybiBbbmV3U2hhcGUsIG5ld1Blcm1dO1xufVxuZXhwb3J0IGNvbnN0IHRyYW5zcG9zZUNvbmZpZyA9IHtcbiAgICBrZXJuZWxOYW1lOiBUcmFuc3Bvc2UsXG4gICAgYmFja2VuZE5hbWU6ICd3YXNtJyxcbiAgICBrZXJuZWxGdW5jOiB0cmFuc3Bvc2UsXG4gICAgc2V0dXBGdW5jOiBzZXR1cCxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1UcmFuc3Bvc2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgVW5wYWNrIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7IHNsaWNlIH0gZnJvbSAnLi9TbGljZSc7XG5mdW5jdGlvbiB1bnBhY2soYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IHZhbHVlIH0gPSBpbnB1dHM7XG4gICAgbGV0IHsgYXhpcyB9ID0gYXR0cnM7XG4gICAgaWYgKGF4aXMgPCAwKSB7XG4gICAgICAgIGF4aXMgKz0gdmFsdWUuc2hhcGUubGVuZ3RoO1xuICAgIH1cbiAgICBjb25zdCBudW1PdXRwdXRzID0gdmFsdWUuc2hhcGVbYXhpc107XG4gICAgY29uc3QgcmFuayA9IHZhbHVlLnNoYXBlLmxlbmd0aDtcbiAgICBjb25zdCBvdXRTaGFwZSA9IG5ldyBBcnJheShyYW5rIC0gMSk7XG4gICAgbGV0IG91dEluZGV4ID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJhbms7IGkrKykge1xuICAgICAgICBpZiAoaSAhPT0gYXhpcykge1xuICAgICAgICAgICAgb3V0U2hhcGVbb3V0SW5kZXgrK10gPSB2YWx1ZS5zaGFwZVtpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBvdXRzID0gbmV3IEFycmF5KG51bU91dHB1dHMpO1xuICAgIGNvbnN0IGJlZ2luID0gbmV3IEFycmF5KHJhbmspLmZpbGwoMCk7XG4gICAgY29uc3Qgc2l6ZSA9IHZhbHVlLnNoYXBlLnNsaWNlKCk7XG4gICAgc2l6ZVtheGlzXSA9IDE7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvdXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGJlZ2luW2F4aXNdID0gaTtcbiAgICAgICAgb3V0c1tpXSA9IHNsaWNlKHsgaW5wdXRzOiB7IHg6IHZhbHVlIH0sIGF0dHJzOiB7IGJlZ2luLCBzaXplIH0sIGJhY2tlbmQgfSk7XG4gICAgfVxuICAgIHJldHVybiBvdXRzLm1hcCgoeyBkYXRhSWQsIGR0eXBlIH0pID0+ICh7IGRhdGFJZCwgZHR5cGUsIHNoYXBlOiBvdXRTaGFwZSB9KSk7XG59XG5leHBvcnQgY29uc3QgdW5wYWNrQ29uZmlnID0ge1xuICAgIGtlcm5lbE5hbWU6IFVucGFjayxcbiAgICBiYWNrZW5kTmFtZTogJ3dhc20nLFxuICAgIGtlcm5lbEZ1bmM6IHVucGFjayxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1VbnBhY2suanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgWmVyb3NMaWtlIH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmZ1bmN0aW9uIHplcm9zTGlrZShhcmdzKSB7XG4gICAgY29uc3QgeyBpbnB1dHM6IHsgeCB9LCBiYWNrZW5kIH0gPSBhcmdzO1xuICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dCh4LnNoYXBlLCB4LmR0eXBlKTtcbiAgICBjb25zdCBvdXRWYWxzID0gYmFja2VuZC50eXBlZEFycmF5RnJvbUhlYXAob3V0KTtcbiAgICBvdXRWYWxzLmZpbGwoMCk7XG4gICAgcmV0dXJuIG91dDtcbn1cbmV4cG9ydCBjb25zdCB6ZXJvc0xpa2VDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogWmVyb3NMaWtlLFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAga2VybmVsRnVuYzogemVyb3NMaWtlLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVplcm9zTGlrZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBfRnVzZWRNYXRNdWwgfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHsgRnVzYWJsZUFjdGl2YXRpb24gfSBmcm9tICcuL3R5cGVzJztcbmxldCB3YXNtRnVzZWRNYXRNdWw7XG5mdW5jdGlvbiBzZXR1cChiYWNrZW5kKSB7XG4gICAgd2FzbUZ1c2VkTWF0TXVsID0gYmFja2VuZC53YXNtLmN3cmFwKF9GdXNlZE1hdE11bCwgbnVsbCAvKiB2b2lkICovLCBbXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnYXJyYXknLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdhcnJheScsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICAnbnVtYmVyJyAvLyBvdXRfaWRcbiAgICBdKTtcbn1cbmZ1bmN0aW9uIGZ1c2VkQmF0Y2hNYXRNdWwoYXJncykge1xuICAgIGNvbnN0IHsgaW5wdXRzLCBiYWNrZW5kLCBhdHRycyB9ID0gYXJncztcbiAgICBjb25zdCB7IGEsIGIsIGJpYXMsIHByZWx1QWN0aXZhdGlvbldlaWdodHMgfSA9IGlucHV0cztcbiAgICBpZiAoYS5kdHlwZSAhPT0gJ2Zsb2F0MzInIHx8IGIuZHR5cGUgIT09ICdmbG9hdDMyJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYF9GdXNlZE1hdE11bCBmb3Igbm9uIG5vbi1mbG9hdDMyIHRlbnNvcnMgbm90IHlldCBzdXBwb3J0ZWQuYCk7XG4gICAgfVxuICAgIGNvbnN0IHsgdHJhbnNwb3NlQSwgdHJhbnNwb3NlQiwgYWN0aXZhdGlvbiwgbGVha3lyZWx1QWxwaGEgfSA9IGF0dHJzO1xuICAgIGNvbnN0IGFJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldChhLmRhdGFJZCkuaWQ7XG4gICAgY29uc3QgYklkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KGIuZGF0YUlkKS5pZDtcbiAgICBsZXQgYmlhc0lkID0gMDtcbiAgICBpZiAoYmlhcyAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IGJpYXNEYXRhID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KGJpYXMuZGF0YUlkKTtcbiAgICAgICAgaWYgKGJpYXNEYXRhLnNoYXBlLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBfRnVzZWRNYXRNdWwgb25seSBzdXBwb3J0cyByYW5rLTEgYmlhcyBidXQgZ290IGAgK1xuICAgICAgICAgICAgICAgIGByYW5rICR7Ymlhc0RhdGEuc2hhcGUubGVuZ3RofS5gKTtcbiAgICAgICAgfVxuICAgICAgICBiaWFzSWQgPSBiaWFzRGF0YS5pZDtcbiAgICB9XG4gICAgY29uc3QgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0c0lkID0gcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyA9PSBudWxsID9cbiAgICAgICAgMCA6XG4gICAgICAgIGJhY2tlbmQuZGF0YUlkTWFwLmdldChwcmVsdUFjdGl2YXRpb25XZWlnaHRzLmRhdGFJZCkuaWQ7XG4gICAgY29uc3QgZnVzZWRBY3RpdmF0aW9uID0gRnVzYWJsZUFjdGl2YXRpb25bYWN0aXZhdGlvbl07XG4gICAgaWYgKGZ1c2VkQWN0aXZhdGlvbiA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHthY3RpdmF0aW9ufSBhY3RpdmF0aW9uIG5vdCB5ZXQgc3VwcG9ydGVkIGZvciBGdXNlZENvbnYyRCBgICtcbiAgICAgICAgICAgIGBpbiB0aGUgd2FzbSBiYWNrZW5kLmApO1xuICAgIH1cbiAgICBjb25zdCBsZWZ0RGltID0gdHJhbnNwb3NlQSA/IGEuc2hhcGVbMl0gOiBhLnNoYXBlWzFdO1xuICAgIGNvbnN0IHJpZ2h0RGltID0gdHJhbnNwb3NlQiA/IGIuc2hhcGVbMV0gOiBiLnNoYXBlWzJdO1xuICAgIGNvbnN0IGJhdGNoRGltID0gYS5zaGFwZVswXTtcbiAgICBjb25zdCBvdXQgPSBiYWNrZW5kLm1ha2VPdXRwdXQoW2JhdGNoRGltLCBsZWZ0RGltLCByaWdodERpbV0sIGEuZHR5cGUpO1xuICAgIGNvbnN0IG91dElkID0gYmFja2VuZC5kYXRhSWRNYXAuZ2V0KG91dC5kYXRhSWQpLmlkO1xuICAgIGNvbnN0IGFTaGFwZUJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkobmV3IEludDMyQXJyYXkoYS5zaGFwZSkuYnVmZmVyKTtcbiAgICBjb25zdCBiU2hhcGVCeXRlcyA9IG5ldyBVaW50OEFycmF5KG5ldyBJbnQzMkFycmF5KGIuc2hhcGUpLmJ1ZmZlcik7XG4gICAgd2FzbUZ1c2VkTWF0TXVsKGFJZCwgYVNoYXBlQnl0ZXMsIGEuc2hhcGUubGVuZ3RoLCBiSWQsIGJTaGFwZUJ5dGVzLCBiLnNoYXBlLmxlbmd0aCwgdHJhbnNwb3NlQSwgdHJhbnNwb3NlQiwgZnVzZWRBY3RpdmF0aW9uLCBiaWFzSWQsIHByZWx1QWN0aXZhdGlvbldlaWdodHNJZCwgbGVha3lyZWx1QWxwaGEgfHwgMCwgb3V0SWQpO1xuICAgIHJldHVybiBvdXQ7XG59XG5leHBvcnQgY29uc3QgZnVzZWRNYXRNdWxDb25maWcgPSB7XG4gICAga2VybmVsTmFtZTogX0Z1c2VkTWF0TXVsLFxuICAgIGJhY2tlbmROYW1lOiAnd2FzbScsXG4gICAgc2V0dXBGdW5jOiBzZXR1cCxcbiAgICBrZXJuZWxGdW5jOiBmdXNlZEJhdGNoTWF0TXVsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9X0Z1c2VkTWF0TXVsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBDcHBEVHlwZSB9IGZyb20gJy4vdHlwZXMnO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUJpbmFyeUtlcm5lbENvbmZpZyhrZXJuZWxOYW1lLCBzdXBwb3J0c0Z1bGxCcm9hZGNhc3QsIGR0eXBlKSB7XG4gICAgbGV0IHdhc21GdW5jO1xuICAgIGZ1bmN0aW9uIHNldHVwRnVuYyhiYWNrZW5kKSB7XG4gICAgICAgIHdhc21GdW5jID0gYmFja2VuZC53YXNtLmN3cmFwKGtlcm5lbE5hbWUsIG51bGwgLyogdm9pZCAqLywgW1xuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAnYXJyYXknLFxuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICdhcnJheScsXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgJ251bWJlcicgLy8gb3V0X2lkXG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBrZXJuZWxGdW5jKGFyZ3MpIHtcbiAgICAgICAgY29uc3QgeyBiYWNrZW5kLCBpbnB1dHMgfSA9IGFyZ3M7XG4gICAgICAgIGNvbnN0IHsgYSwgYiB9ID0gaW5wdXRzO1xuICAgICAgICBjb25zdCBhSWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoYS5kYXRhSWQpLmlkO1xuICAgICAgICBjb25zdCBiSWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoYi5kYXRhSWQpLmlkO1xuICAgICAgICBjb25zdCBvdXRwdXRUeXBlID0gZHR5cGUgIT0gbnVsbCA/IGR0eXBlIDogYS5kdHlwZTtcbiAgICAgICAgY29uc3QgbmV3U2hhcGUgPSBiYWNrZW5kX3V0aWwuYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoYS5zaGFwZSwgYi5zaGFwZSk7XG4gICAgICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dChuZXdTaGFwZSwgb3V0cHV0VHlwZSk7XG4gICAgICAgIC8vIFNob3J0LWNpcmN1aXQgemVyby1zaXplZCB0ZW5zb3JzLlxuICAgICAgICBpZiAodXRpbC5zaXplRnJvbVNoYXBlKG5ld1NoYXBlKSA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG91dDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhU2hhcGVCeXRlcyA9IG5ldyBVaW50OEFycmF5KG5ldyBJbnQzMkFycmF5KGEuc2hhcGUpLmJ1ZmZlcik7XG4gICAgICAgIGNvbnN0IGJTaGFwZUJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkobmV3IEludDMyQXJyYXkoYi5zaGFwZSkuYnVmZmVyKTtcbiAgICAgICAgY29uc3Qgb3V0SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQob3V0LmRhdGFJZCkuaWQ7XG4gICAgICAgIGNvbnN0IGtlcm5lbEZ1bmMgPSAoKSA9PiB3YXNtRnVuYyhhSWQsIGFTaGFwZUJ5dGVzLCBhLnNoYXBlLmxlbmd0aCwgYklkLCBiU2hhcGVCeXRlcywgYi5zaGFwZS5sZW5ndGgsIENwcERUeXBlW2EuZHR5cGVdLCBvdXRJZCk7XG4gICAgICAgIC8vIEN1cnJlbnRseSBvbmx5IHNvbWUgZmxvYXQgb3BlcmF0aW9ucyBzdXBwb3J0IGZ1bGwgYnJvYWRjYXN0LlxuICAgICAgICBpZiAoc3VwcG9ydHNGdWxsQnJvYWRjYXN0ICYmIGEuZHR5cGUgPT09ICdmbG9hdDMyJykge1xuICAgICAgICAgICAga2VybmVsRnVuYygpO1xuICAgICAgICAgICAgcmV0dXJuIG91dDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhQnJvYWRjYXN0RGltcyA9IGJhY2tlbmRfdXRpbC5nZXRCcm9hZGNhc3REaW1zKGEuc2hhcGUsIG5ld1NoYXBlKTtcbiAgICAgICAgY29uc3QgYkJyb2FkY2FzdERpbXMgPSBiYWNrZW5kX3V0aWwuZ2V0QnJvYWRjYXN0RGltcyhiLnNoYXBlLCBuZXdTaGFwZSk7XG4gICAgICAgIGNvbnN0IGxvb3BzT3ZlckFsbE9mQSA9IGFCcm9hZGNhc3REaW1zLmV2ZXJ5KCh2LCBpKSA9PiB2ID09PSBpKTtcbiAgICAgICAgY29uc3QgbG9vcHNPdmVyQWxsT2ZCID0gYkJyb2FkY2FzdERpbXMuZXZlcnkoKHYsIGkpID0+IHYgPT09IGkpO1xuICAgICAgICBpZiAobG9vcHNPdmVyQWxsT2ZBICYmIGxvb3BzT3ZlckFsbE9mQikge1xuICAgICAgICAgICAga2VybmVsRnVuYygpO1xuICAgICAgICAgICAgcmV0dXJuIG91dDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQnJvYWRjYXN0aW5nIGFsb25nIG91dGVyIGRpbXMgaXMgbm90IHlldCBgICtcbiAgICAgICAgICAgICAgICBgc3VwcG9ydGVkIGZvciAke2EuZHR5cGV9ICR7a2VybmVsTmFtZX0uYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsga2VybmVsTmFtZSwgYmFja2VuZE5hbWU6ICd3YXNtJywgc2V0dXBGdW5jLCBrZXJuZWxGdW5jIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1iaW5hcnlfa2VybmVsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJhY2tlbmRfdXRpbCwgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyB0cmFuc3Bvc2UgfSBmcm9tICcuL1RyYW5zcG9zZSc7XG4vKipcbiAqIENvbXB1dGUgcGVybXV0YXRpb24gYXhlcyBhbmQgZG8gYSB0cmFuc3Bvc2UgaWYgbmVjZXNzYXJ5LlxuICpcbiAqIFVzZWQgYnkgcmVkdWN0aW9uIG9wcy5cbiAqIEBwYXJhbSB4IGlucHV0IFRlbnNvckluZm9cbiAqIEBwYXJhbSBheGlzIHJlZHVjdGlvbiBheGVzXG4gKiBAcGFyYW0gYmFja2VuZCB3YXNtIGJhY2tlbmQgaW5zdGFuY2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBlcm11dGVBeGVzQW5kVHJhbnNwb3NlKHgsIGF4aXMsIGJhY2tlbmQpIHtcbiAgICBjb25zdCB4U2hhcGUgPSB4LnNoYXBlO1xuICAgIGNvbnN0IHhSYW5rID0geC5zaGFwZS5sZW5ndGg7XG4gICAgY29uc3Qgb3JpZ2luYWxBeGVzID0gdXRpbC5wYXJzZUF4aXNQYXJhbShheGlzLCB4U2hhcGUpO1xuICAgIGxldCBheGVzID0gb3JpZ2luYWxBeGVzO1xuICAgIGNvbnN0IHBlcm11dGVkQXhlcyA9IGJhY2tlbmRfdXRpbC5nZXRBeGVzUGVybXV0YXRpb24oYXhlcywgeFJhbmspO1xuICAgIGxldCB4VHJhbnNwb3NlZCA9IG51bGw7XG4gICAgbGV0IGlucHV0V2FzVHJhbnNwb3NlZCA9IGZhbHNlO1xuICAgIGlmIChwZXJtdXRlZEF4ZXMgIT0gbnVsbCkge1xuICAgICAgICBjb25zdCBuZXdTaGFwZSA9IG5ldyBBcnJheSh4UmFuayk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3U2hhcGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIG5ld1NoYXBlW2ldID0geFNoYXBlW3Blcm11dGVkQXhlc1tpXV07XG4gICAgICAgIH1cbiAgICAgICAgYXhlcyA9IGJhY2tlbmRfdXRpbC5nZXRJbm5lck1vc3RBeGVzKGF4ZXMubGVuZ3RoLCB4UmFuayk7XG4gICAgICAgIHhUcmFuc3Bvc2VkID1cbiAgICAgICAgICAgIHRyYW5zcG9zZSh7IGlucHV0czogeyB4IH0sIGF0dHJzOiB7IHBlcm06IHBlcm11dGVkQXhlcyB9LCBiYWNrZW5kIH0pO1xuICAgICAgICBjb25zdCB4SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoeC5kYXRhSWQpLmlkO1xuICAgICAgICBjb25zdCB0cmFuc3Bvc2VkSWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQoeFRyYW5zcG9zZWQuZGF0YUlkKS5pZDtcbiAgICAgICAgaWYgKHRyYW5zcG9zZWRJZCAhPT0geElkKSB7XG4gICAgICAgICAgICBpbnB1dFdhc1RyYW5zcG9zZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IHRyYW5zcG9zZWQ6IHhUcmFuc3Bvc2VkLCBvcmlnaW5hbEF4ZXMsIGF4ZXMsIGlucHV0V2FzVHJhbnNwb3NlZCB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9a2VybmVsX3V0aWxzLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbi8vIFRoaXMgZW51bSBtdXN0IGFsaWduIHdpdGggdGhlIGVudW0gZGVmaW5lZCBpbiBjYy9iYWNrZW5kLmguXG5leHBvcnQgdmFyIENwcERUeXBlO1xuKGZ1bmN0aW9uIChDcHBEVHlwZSkge1xuICAgIENwcERUeXBlW0NwcERUeXBlW1wiZmxvYXQzMlwiXSA9IDBdID0gXCJmbG9hdDMyXCI7XG4gICAgQ3BwRFR5cGVbQ3BwRFR5cGVbXCJpbnQzMlwiXSA9IDFdID0gXCJpbnQzMlwiO1xuICAgIENwcERUeXBlW0NwcERUeXBlW1wiYm9vbFwiXSA9IDJdID0gXCJib29sXCI7XG4gICAgQ3BwRFR5cGVbQ3BwRFR5cGVbXCJzdHJpbmdcIl0gPSAzXSA9IFwic3RyaW5nXCI7XG4gICAgQ3BwRFR5cGVbQ3BwRFR5cGVbXCJjb21wbGV4NjRcIl0gPSA0XSA9IFwiY29tcGxleDY0XCI7XG59KShDcHBEVHlwZSB8fCAoQ3BwRFR5cGUgPSB7fSkpO1xuLy8gTXVzdCBtYXRjaCBlbnVtIGluIGNjL2Z1c2FibGVfYWN0aXZhdGlvbnMuaC5cbmV4cG9ydCB2YXIgRnVzYWJsZUFjdGl2YXRpb247XG4oZnVuY3Rpb24gKEZ1c2FibGVBY3RpdmF0aW9uKSB7XG4gICAgRnVzYWJsZUFjdGl2YXRpb25bRnVzYWJsZUFjdGl2YXRpb25bXCJsaW5lYXJcIl0gPSAwXSA9IFwibGluZWFyXCI7XG4gICAgRnVzYWJsZUFjdGl2YXRpb25bRnVzYWJsZUFjdGl2YXRpb25bXCJyZWx1XCJdID0gMV0gPSBcInJlbHVcIjtcbiAgICBGdXNhYmxlQWN0aXZhdGlvbltGdXNhYmxlQWN0aXZhdGlvbltcInJlbHU2XCJdID0gMl0gPSBcInJlbHU2XCI7XG4gICAgRnVzYWJsZUFjdGl2YXRpb25bRnVzYWJsZUFjdGl2YXRpb25bXCJwcmVsdVwiXSA9IDNdID0gXCJwcmVsdVwiO1xuICAgIEZ1c2FibGVBY3RpdmF0aW9uW0Z1c2FibGVBY3RpdmF0aW9uW1wibGVha3lyZWx1XCJdID0gNF0gPSBcImxlYWt5cmVsdVwiO1xuICAgIEZ1c2FibGVBY3RpdmF0aW9uW0Z1c2FibGVBY3RpdmF0aW9uW1wic2lnbW9pZFwiXSA9IDVdID0gXCJzaWdtb2lkXCI7XG59KShGdXNhYmxlQWN0aXZhdGlvbiB8fCAoRnVzYWJsZUFjdGl2YXRpb24gPSB7fSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dHlwZXMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVW5hcnlLZXJuZWxDb25maWcoa2VybmVsTmFtZSkge1xuICAgIGxldCB3YXNtRnVuYztcbiAgICBmdW5jdGlvbiBzZXR1cEZ1bmMoYmFja2VuZCkge1xuICAgICAgICB3YXNtRnVuYyA9XG4gICAgICAgICAgICBiYWNrZW5kLndhc20uY3dyYXAoa2VybmVsTmFtZSwgbnVsbCAvKiB2b2lkICovLCBbJ251bWJlcicsICdudW1iZXInXSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGtlcm5lbEZ1bmMoYXJncykge1xuICAgICAgICBjb25zdCB7IGJhY2tlbmQsIGlucHV0czogeyB4IH0gfSA9IGFyZ3M7XG4gICAgICAgIGNvbnN0IHhJZCA9IGJhY2tlbmQuZGF0YUlkTWFwLmdldCh4LmRhdGFJZCkuaWQ7XG4gICAgICAgIGNvbnN0IG91dCA9IGJhY2tlbmQubWFrZU91dHB1dCh4LnNoYXBlLCB4LmR0eXBlKTtcbiAgICAgICAgY29uc3Qgb3V0SWQgPSBiYWNrZW5kLmRhdGFJZE1hcC5nZXQob3V0LmRhdGFJZCkuaWQ7XG4gICAgICAgIC8vIFNob3J0LWNpcmN1aXQgemVyby1zaXplZCB0ZW5zb3JzLlxuICAgICAgICBpZiAodXRpbC5zaXplRnJvbVNoYXBlKG91dC5zaGFwZSkgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBvdXQ7XG4gICAgICAgIH1cbiAgICAgICAgd2FzbUZ1bmMoeElkLCBvdXRJZCk7XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuICAgIHJldHVybiB7IGtlcm5lbE5hbWUsIGJhY2tlbmROYW1lOiAnd2FzbScsIHNldHVwRnVuYywga2VybmVsRnVuYyB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dW5hcnlfa2VybmVsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbi8vIFdlIGV4cGxpY2l0bHkgaW1wb3J0IHRoZSBtb2R1bGFyIGtlcm5lbHMgc28gdGhleSBnZXQgcmVnaXN0ZXJlZCBpbiB0aGVcbi8vIGdsb2JhbCByZWdpc3RyeSB3aGVuIHdlIGNvbXBpbGUgdGhlIGxpYnJhcnkuIEEgbW9kdWxhciBidWlsZCB3b3VsZCByZXBsYWNlXG4vLyB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFuZCBpbXBvcnQgb25seSB0aGUga2VybmVscyB0aGF0IGFyZSBuZWVkZWQuXG5pbXBvcnQgeyByZWdpc3Rlcktlcm5lbCB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBmdXNlZE1hdE11bENvbmZpZyB9IGZyb20gJy4va2VybmVscy9fRnVzZWRNYXRNdWwnO1xuaW1wb3J0IHsgYWJzQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0Ficyc7XG5pbXBvcnQgeyBhZGRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQWRkJztcbmltcG9ydCB7IGFkZE5Db25maWcgfSBmcm9tICcuL2tlcm5lbHMvQWRkTic7XG5pbXBvcnQgeyBhbGxDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQWxsJztcbmltcG9ydCB7IGFueUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9BbnknO1xuaW1wb3J0IHsgYXJnTWF4Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0FyZ01heCc7XG5pbXBvcnQgeyBhdmdQb29sQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0F2Z1Bvb2wnO1xuaW1wb3J0IHsgYmF0Y2hNYXRNdWxDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQmF0Y2hNYXRNdWwnO1xuaW1wb3J0IHsgYmF0Y2hUb1NwYWNlTkRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQmF0Y2hUb1NwYWNlTkQnO1xuaW1wb3J0IHsgY2FzdENvbmZpZyB9IGZyb20gJy4va2VybmVscy9DYXN0JztcbmltcG9ydCB7IGNlaWxDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQ2VpbCc7XG5pbXBvcnQgeyBjbGlwQnlWYWx1ZUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9DbGlwQnlWYWx1ZSc7XG5pbXBvcnQgeyBjb25jYXRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQ29uY2F0JztcbmltcG9ydCB7IGNvbnYyRENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Db252MkQnO1xuaW1wb3J0IHsgY29udjJEQmFja3Byb3BJbnB1dENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Db252MkRCYWNrcHJvcElucHV0JztcbmltcG9ydCB7IGNvc0NvbmZpZyB9IGZyb20gJy4va2VybmVscy9Db3MnO1xuaW1wb3J0IHsgY29zaENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Db3NoJztcbmltcG9ydCB7IGNyb3BBbmRSZXNpemVDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvQ3JvcEFuZFJlc2l6ZSc7XG5pbXBvcnQgeyBjdW1zdW1Db25maWcgfSBmcm9tICcuL2tlcm5lbHMvQ3Vtc3VtJztcbmltcG9ydCB7IGRlcHRoVG9TcGFjZUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9EZXB0aFRvU3BhY2UnO1xuaW1wb3J0IHsgZGVwdGh3aXNlQ29udjJkTmF0aXZlQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0RlcHRod2lzZUNvbnYyZE5hdGl2ZSc7XG5pbXBvcnQgeyBlcXVhbENvbmZpZyB9IGZyb20gJy4va2VybmVscy9FcXVhbCc7XG5pbXBvcnQgeyBleHBDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvRXhwJztcbmltcG9ydCB7IGV4cGFuZERpbXNDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvRXhwYW5kRGltcyc7XG5pbXBvcnQgeyBmaWxsQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0ZpbGwnO1xuaW1wb3J0IHsgZmxpcExlZnRSaWdodENvbmZpZyB9IGZyb20gJy4va2VybmVscy9GbGlwTGVmdFJpZ2h0JztcbmltcG9ydCB7IGZsb29yQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0Zsb29yJztcbmltcG9ydCB7IGZsb29yRGl2Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0Zsb29yRGl2JztcbmltcG9ydCB7IGZ1c2VkQmF0Y2hOb3JtQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0Z1c2VkQmF0Y2hOb3JtJztcbmltcG9ydCB7IGZ1c2VkQ29udjJEQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0Z1c2VkQ29udjJEJztcbmltcG9ydCB7IGZ1c2VkRGVwdGh3aXNlQ29udjJEQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0Z1c2VkRGVwdGh3aXNlQ29udjJEJztcbmltcG9ydCB7IGdhdGhlck5kQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0dhdGhlck5kJztcbmltcG9ydCB7IGdhdGhlclYyQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0dhdGhlclYyJztcbmltcG9ydCB7IGdyZWF0ZXJDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvR3JlYXRlcic7XG5pbXBvcnQgeyBncmVhdGVyRXF1YWxDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvR3JlYXRlckVxdWFsJztcbmltcG9ydCB7IGlkZW50aXR5Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0lkZW50aXR5JztcbmltcG9ydCB7IGxlYWt5UmVsdUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9MZWFreVJlbHUnO1xuaW1wb3J0IHsgbGVzc0NvbmZpZyB9IGZyb20gJy4va2VybmVscy9MZXNzJztcbmltcG9ydCB7IGxlc3NFcXVhbENvbmZpZyB9IGZyb20gJy4va2VybmVscy9MZXNzRXF1YWwnO1xuaW1wb3J0IHsgbG9nQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0xvZyc7XG5pbXBvcnQgeyBsb2dpY2FsQW5kQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL0xvZ2ljYWxBbmQnO1xuaW1wb3J0IHsgbWF4Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL01heCc7XG5pbXBvcnQgeyBtYXhpbXVtQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL01heGltdW0nO1xuaW1wb3J0IHsgbWF4UG9vbENvbmZpZyB9IGZyb20gJy4va2VybmVscy9NYXhQb29sJztcbmltcG9ydCB7IG1lYW5Db25maWcgfSBmcm9tICcuL2tlcm5lbHMvTWVhbic7XG5pbXBvcnQgeyBtaW5Db25maWcgfSBmcm9tICcuL2tlcm5lbHMvTWluJztcbmltcG9ydCB7IG1pbmltdW1Db25maWcgfSBmcm9tICcuL2tlcm5lbHMvTWluaW11bSc7XG5pbXBvcnQgeyBtaXJyb3JQYWRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvTWlycm9yUGFkJztcbmltcG9ydCB7IG11bHRpcGx5Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL011bHRpcGx5JztcbmltcG9ydCB7IG5lZ0NvbmZpZyB9IGZyb20gJy4va2VybmVscy9OZWcnO1xuaW1wb3J0IHsgbm9uTWF4U3VwcHJlc3Npb25WM0NvbmZpZyB9IGZyb20gJy4va2VybmVscy9Ob25NYXhTdXBwcmVzc2lvblYzJztcbmltcG9ydCB7IG5vbk1heFN1cHByZXNzaW9uVjRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvTm9uTWF4U3VwcHJlc3Npb25WNCc7XG5pbXBvcnQgeyBub25NYXhTdXBwcmVzc2lvblY1Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL05vbk1heFN1cHByZXNzaW9uVjUnO1xuaW1wb3J0IHsgbm90RXF1YWxDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvTm90RXF1YWwnO1xuaW1wb3J0IHsgb25lSG90Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL09uZUhvdCc7XG5pbXBvcnQgeyBvbmVzTGlrZUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9PbmVzTGlrZSc7XG5pbXBvcnQgeyBwYWNrQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1BhY2snO1xuaW1wb3J0IHsgcGFkVjJDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvUGFkVjInO1xuaW1wb3J0IHsgcG93Q29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1Bvdyc7XG5pbXBvcnQgeyBwcmVsdUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9QcmVsdSc7XG5pbXBvcnQgeyBwcm9kQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1Byb2QnO1xuaW1wb3J0IHsgcmFuZ2VDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvUmFuZ2UnO1xuaW1wb3J0IHsgcmVhbERpdkNvbmZpZyB9IGZyb20gJy4va2VybmVscy9SZWFsRGl2JztcbmltcG9ydCB7IHJlbHVDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvUmVsdSc7XG5pbXBvcnQgeyByZWx1NkNvbmZpZyB9IGZyb20gJy4va2VybmVscy9SZWx1Nic7XG5pbXBvcnQgeyByZXNoYXBlQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1Jlc2hhcGUnO1xuaW1wb3J0IHsgcmVzaXplQmlsaW5lYXJDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvUmVzaXplQmlsaW5lYXInO1xuaW1wb3J0IHsgcmV2ZXJzZUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9SZXZlcnNlJztcbmltcG9ydCB7IHJvdGF0ZVdpdGhPZmZzZXRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvUm90YXRlV2l0aE9mZnNldCc7XG5pbXBvcnQgeyByb3VuZENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Sb3VuZCc7XG5pbXBvcnQgeyByc3FydENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Sc3FydCc7XG5pbXBvcnQgeyBzY2F0dGVyTmRDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU2NhdHRlck5kJztcbmltcG9ydCB7IHNlbGVjdENvbmZpZyB9IGZyb20gJy4va2VybmVscy9TZWxlY3QnO1xuaW1wb3J0IHsgc2lnbW9pZENvbmZpZyB9IGZyb20gJy4va2VybmVscy9TaWdtb2lkJztcbmltcG9ydCB7IHNpbkNvbmZpZyB9IGZyb20gJy4va2VybmVscy9TaW4nO1xuaW1wb3J0IHsgc2xpY2VDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU2xpY2UnO1xuaW1wb3J0IHsgc29mdG1heENvbmZpZyB9IGZyb20gJy4va2VybmVscy9Tb2Z0bWF4JztcbmltcG9ydCB7IHNwYWNlVG9CYXRjaE5EQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1NwYWNlVG9CYXRjaE5EJztcbmltcG9ydCB7IHNwbGl0VkNvbmZpZyB9IGZyb20gJy4va2VybmVscy9TcGxpdFYnO1xuaW1wb3J0IHsgc3FydENvbmZpZyB9IGZyb20gJy4va2VybmVscy9TcXJ0JztcbmltcG9ydCB7IHNxdWFyZUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9TcXVhcmUnO1xuaW1wb3J0IHsgc3F1YXJlZERpZmZlcmVuY2VDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvU3F1YXJlZERpZmZlcmVuY2UnO1xuaW1wb3J0IHsgc3RlcENvbmZpZyB9IGZyb20gJy4va2VybmVscy9TdGVwJztcbmltcG9ydCB7IHN0cmlkZWRTbGljZUNvbmZpZyB9IGZyb20gJy4va2VybmVscy9TdHJpZGVkU2xpY2UnO1xuaW1wb3J0IHsgc3ViQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1N1Yic7XG5pbXBvcnQgeyBzdW1Db25maWcgfSBmcm9tICcuL2tlcm5lbHMvU3VtJztcbmltcG9ydCB7IHRhbkNvbmZpZyB9IGZyb20gJy4va2VybmVscy9UYW4nO1xuaW1wb3J0IHsgdGFuaENvbmZpZyB9IGZyb20gJy4va2VybmVscy9UYW5oJztcbmltcG9ydCB7IHRpbGVDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvVGlsZSc7XG5pbXBvcnQgeyB0b3BLQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1RvcEsnO1xuaW1wb3J0IHsgdHJhbnNmb3JtQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1RyYW5zZm9ybSc7XG5pbXBvcnQgeyB0cmFuc3Bvc2VDb25maWcgfSBmcm9tICcuL2tlcm5lbHMvVHJhbnNwb3NlJztcbmltcG9ydCB7IHVucGFja0NvbmZpZyB9IGZyb20gJy4va2VybmVscy9VbnBhY2snO1xuaW1wb3J0IHsgemVyb3NMaWtlQ29uZmlnIH0gZnJvbSAnLi9rZXJuZWxzL1plcm9zTGlrZSc7XG4vLyBMaXN0IGFsbCBrZXJuZWwgY29uZmlncyBoZXJlXG5jb25zdCBrZXJuZWxDb25maWdzID0gW1xuICAgIGFic0NvbmZpZyxcbiAgICBhZGRDb25maWcsXG4gICAgYWRkTkNvbmZpZyxcbiAgICBhbGxDb25maWcsXG4gICAgYW55Q29uZmlnLFxuICAgIGFyZ01heENvbmZpZyxcbiAgICBhdmdQb29sQ29uZmlnLFxuICAgIGJhdGNoTWF0TXVsQ29uZmlnLFxuICAgIGJhdGNoVG9TcGFjZU5EQ29uZmlnLFxuICAgIGNhc3RDb25maWcsXG4gICAgY2VpbENvbmZpZyxcbiAgICBjbGlwQnlWYWx1ZUNvbmZpZyxcbiAgICBjb25jYXRDb25maWcsXG4gICAgY29udjJEQ29uZmlnLFxuICAgIGNvbnYyREJhY2twcm9wSW5wdXRDb25maWcsXG4gICAgY29zQ29uZmlnLFxuICAgIGNvc2hDb25maWcsXG4gICAgY3JvcEFuZFJlc2l6ZUNvbmZpZyxcbiAgICBjdW1zdW1Db25maWcsXG4gICAgZGVwdGhUb1NwYWNlQ29uZmlnLFxuICAgIGRlcHRod2lzZUNvbnYyZE5hdGl2ZUNvbmZpZyxcbiAgICBlcXVhbENvbmZpZyxcbiAgICBleHBDb25maWcsXG4gICAgZXhwYW5kRGltc0NvbmZpZyxcbiAgICBmaWxsQ29uZmlnLFxuICAgIGZsaXBMZWZ0UmlnaHRDb25maWcsXG4gICAgZmxvb3JDb25maWcsXG4gICAgZmxvb3JEaXZDb25maWcsXG4gICAgZnVzZWRNYXRNdWxDb25maWcsXG4gICAgZnVzZWRCYXRjaE5vcm1Db25maWcsXG4gICAgZnVzZWRDb252MkRDb25maWcsXG4gICAgZnVzZWREZXB0aHdpc2VDb252MkRDb25maWcsXG4gICAgZ2F0aGVyTmRDb25maWcsXG4gICAgZ2F0aGVyVjJDb25maWcsXG4gICAgZ3JlYXRlckNvbmZpZyxcbiAgICBncmVhdGVyRXF1YWxDb25maWcsXG4gICAgaWRlbnRpdHlDb25maWcsXG4gICAgbGVha3lSZWx1Q29uZmlnLFxuICAgIGxlc3NDb25maWcsXG4gICAgbGVzc0VxdWFsQ29uZmlnLFxuICAgIGxvZ0NvbmZpZyxcbiAgICBsb2dpY2FsQW5kQ29uZmlnLFxuICAgIG1heENvbmZpZyxcbiAgICBtYXhpbXVtQ29uZmlnLFxuICAgIG1heFBvb2xDb25maWcsXG4gICAgbWVhbkNvbmZpZyxcbiAgICBtaW5Db25maWcsXG4gICAgbWluaW11bUNvbmZpZyxcbiAgICBtaXJyb3JQYWRDb25maWcsXG4gICAgbXVsdGlwbHlDb25maWcsXG4gICAgbmVnQ29uZmlnLFxuICAgIG5vbk1heFN1cHByZXNzaW9uVjNDb25maWcsXG4gICAgbm9uTWF4U3VwcHJlc3Npb25WNENvbmZpZyxcbiAgICBub25NYXhTdXBwcmVzc2lvblY1Q29uZmlnLFxuICAgIG5vdEVxdWFsQ29uZmlnLFxuICAgIG9uZUhvdENvbmZpZyxcbiAgICBvbmVzTGlrZUNvbmZpZyxcbiAgICBwYWNrQ29uZmlnLFxuICAgIHBhZFYyQ29uZmlnLFxuICAgIHBvd0NvbmZpZyxcbiAgICBwcmVsdUNvbmZpZyxcbiAgICBwcm9kQ29uZmlnLFxuICAgIHJhbmdlQ29uZmlnLFxuICAgIHJlYWxEaXZDb25maWcsXG4gICAgcmVsdUNvbmZpZyxcbiAgICByZWx1NkNvbmZpZyxcbiAgICByZXNoYXBlQ29uZmlnLFxuICAgIHJlc2l6ZUJpbGluZWFyQ29uZmlnLFxuICAgIHJldmVyc2VDb25maWcsXG4gICAgcm90YXRlV2l0aE9mZnNldENvbmZpZyxcbiAgICByc3FydENvbmZpZyxcbiAgICByb3VuZENvbmZpZyxcbiAgICBzY2F0dGVyTmRDb25maWcsXG4gICAgc2VsZWN0Q29uZmlnLFxuICAgIHNpZ21vaWRDb25maWcsXG4gICAgc2luQ29uZmlnLFxuICAgIHNsaWNlQ29uZmlnLFxuICAgIHNvZnRtYXhDb25maWcsXG4gICAgc3BhY2VUb0JhdGNoTkRDb25maWcsXG4gICAgc3BsaXRWQ29uZmlnLFxuICAgIHNxcnRDb25maWcsXG4gICAgc3F1YXJlQ29uZmlnLFxuICAgIHNxdWFyZWREaWZmZXJlbmNlQ29uZmlnLFxuICAgIHN0ZXBDb25maWcsXG4gICAgc3RyaWRlZFNsaWNlQ29uZmlnLFxuICAgIHN1YkNvbmZpZyxcbiAgICBzdW1Db25maWcsXG4gICAgdGFuQ29uZmlnLFxuICAgIHRhbmhDb25maWcsXG4gICAgdGlsZUNvbmZpZyxcbiAgICB0b3BLQ29uZmlnLFxuICAgIHRyYW5zZm9ybUNvbmZpZyxcbiAgICB0cmFuc3Bvc2VDb25maWcsXG4gICAgdW5wYWNrQ29uZmlnLFxuICAgIHplcm9zTGlrZUNvbmZpZ1xuXTtcbmZvciAoY29uc3Qga2VybmVsQ29uZmlnIG9mIGtlcm5lbENvbmZpZ3MpIHtcbiAgICByZWdpc3Rlcktlcm5lbChrZXJuZWxDb25maWcpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVnaXN0ZXJfYWxsX2tlcm5lbHMuanMubWFwIiwiLyoqIEBsaWNlbnNlIFNlZSB0aGUgTElDRU5TRSBmaWxlLiAqL1xuLy8gVGhpcyBjb2RlIGlzIGF1dG8tZ2VuZXJhdGVkLCBkbyBub3QgbW9kaWZ5IHRoaXMgZmlsZSFcbmNvbnN0IHZlcnNpb24gPSAnMy44LjAnO1xuZXhwb3J0IHsgdmVyc2lvbiB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dmVyc2lvbi5qcy5tYXAiLCJcbnZhciBXYXNtQmFja2VuZE1vZHVsZVRocmVhZGVkU2ltZCA9IChmdW5jdGlvbigpIHtcbiAgdmFyIF9zY3JpcHREaXIgPSB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGRvY3VtZW50LmN1cnJlbnRTY3JpcHQgPyBkb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyYyA6IHVuZGVmaW5lZDtcbiAgaWYgKHR5cGVvZiBfX2ZpbGVuYW1lICE9PSAndW5kZWZpbmVkJykgX3NjcmlwdERpciA9IF9zY3JpcHREaXIgfHwgX19maWxlbmFtZTtcbiAgcmV0dXJuIChcbmZ1bmN0aW9uKFdhc21CYWNrZW5kTW9kdWxlVGhyZWFkZWRTaW1kKSB7XG4gIFdhc21CYWNrZW5kTW9kdWxlVGhyZWFkZWRTaW1kID0gV2FzbUJhY2tlbmRNb2R1bGVUaHJlYWRlZFNpbWQgfHwge307XG5cbmZ1bmN0aW9uIEdST1dBQkxFX0hFQVBfSTgoKXtpZih3YXNtTWVtb3J5LmJ1ZmZlciE9YnVmZmVyKXt1cGRhdGVHbG9iYWxCdWZmZXJBbmRWaWV3cyh3YXNtTWVtb3J5LmJ1ZmZlcil9cmV0dXJuIEhFQVA4fWZ1bmN0aW9uIEdST1dBQkxFX0hFQVBfVTgoKXtpZih3YXNtTWVtb3J5LmJ1ZmZlciE9YnVmZmVyKXt1cGRhdGVHbG9iYWxCdWZmZXJBbmRWaWV3cyh3YXNtTWVtb3J5LmJ1ZmZlcil9cmV0dXJuIEhFQVBVOH1mdW5jdGlvbiBHUk9XQUJMRV9IRUFQX0kzMigpe2lmKHdhc21NZW1vcnkuYnVmZmVyIT1idWZmZXIpe3VwZGF0ZUdsb2JhbEJ1ZmZlckFuZFZpZXdzKHdhc21NZW1vcnkuYnVmZmVyKX1yZXR1cm4gSEVBUDMyfWZ1bmN0aW9uIEdST1dBQkxFX0hFQVBfVTMyKCl7aWYod2FzbU1lbW9yeS5idWZmZXIhPWJ1ZmZlcil7dXBkYXRlR2xvYmFsQnVmZmVyQW5kVmlld3Mod2FzbU1lbW9yeS5idWZmZXIpfXJldHVybiBIRUFQVTMyfWZ1bmN0aW9uIEdST1dBQkxFX0hFQVBfRjY0KCl7aWYod2FzbU1lbW9yeS5idWZmZXIhPWJ1ZmZlcil7dXBkYXRlR2xvYmFsQnVmZmVyQW5kVmlld3Mod2FzbU1lbW9yeS5idWZmZXIpfXJldHVybiBIRUFQRjY0fXZhciBNb2R1bGU9dHlwZW9mIFdhc21CYWNrZW5kTW9kdWxlVGhyZWFkZWRTaW1kIT09XCJ1bmRlZmluZWRcIj9XYXNtQmFja2VuZE1vZHVsZVRocmVhZGVkU2ltZDp7fTt2YXIgcmVhZHlQcm9taXNlUmVzb2x2ZSxyZWFkeVByb21pc2VSZWplY3Q7TW9kdWxlW1wicmVhZHlcIl09bmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSxyZWplY3Qpe3JlYWR5UHJvbWlzZVJlc29sdmU9cmVzb2x2ZTtyZWFkeVByb21pc2VSZWplY3Q9cmVqZWN0fSk7dmFyIG1vZHVsZU92ZXJyaWRlcz17fTt2YXIga2V5O2ZvcihrZXkgaW4gTW9kdWxlKXtpZihNb2R1bGUuaGFzT3duUHJvcGVydHkoa2V5KSl7bW9kdWxlT3ZlcnJpZGVzW2tleV09TW9kdWxlW2tleV19fXZhciBhcmd1bWVudHNfPVtdO3ZhciB0aGlzUHJvZ3JhbT1cIi4vdGhpcy5wcm9ncmFtXCI7dmFyIHF1aXRfPWZ1bmN0aW9uKHN0YXR1cyx0b1Rocm93KXt0aHJvdyB0b1Rocm93fTt2YXIgRU5WSVJPTk1FTlRfSVNfV0VCPWZhbHNlO3ZhciBFTlZJUk9OTUVOVF9JU19XT1JLRVI9ZmFsc2U7dmFyIEVOVklST05NRU5UX0lTX05PREU9ZmFsc2U7dmFyIEVOVklST05NRU5UX0lTX1NIRUxMPWZhbHNlO0VOVklST05NRU5UX0lTX1dFQj10eXBlb2Ygd2luZG93PT09XCJvYmplY3RcIjtFTlZJUk9OTUVOVF9JU19XT1JLRVI9dHlwZW9mIGltcG9ydFNjcmlwdHM9PT1cImZ1bmN0aW9uXCI7RU5WSVJPTk1FTlRfSVNfTk9ERT10eXBlb2YgcHJvY2Vzcz09PVwib2JqZWN0XCImJnR5cGVvZiBwcm9jZXNzLnZlcnNpb25zPT09XCJvYmplY3RcIiYmdHlwZW9mIHByb2Nlc3MudmVyc2lvbnMubm9kZT09PVwic3RyaW5nXCI7RU5WSVJPTk1FTlRfSVNfU0hFTEw9IUVOVklST05NRU5UX0lTX1dFQiYmIUVOVklST05NRU5UX0lTX05PREUmJiFFTlZJUk9OTUVOVF9JU19XT1JLRVI7dmFyIEVOVklST05NRU5UX0lTX1BUSFJFQUQ9TW9kdWxlW1wiRU5WSVJPTk1FTlRfSVNfUFRIUkVBRFwiXXx8ZmFsc2U7aWYoRU5WSVJPTk1FTlRfSVNfUFRIUkVBRCl7YnVmZmVyPU1vZHVsZVtcImJ1ZmZlclwiXX12YXIgc2NyaXB0RGlyZWN0b3J5PVwiXCI7ZnVuY3Rpb24gbG9jYXRlRmlsZShwYXRoKXtpZihNb2R1bGVbXCJsb2NhdGVGaWxlXCJdKXtyZXR1cm4gTW9kdWxlW1wibG9jYXRlRmlsZVwiXShwYXRoLHNjcmlwdERpcmVjdG9yeSl9cmV0dXJuIHNjcmlwdERpcmVjdG9yeStwYXRofXZhciByZWFkXyxyZWFkQXN5bmMscmVhZEJpbmFyeSxzZXRXaW5kb3dUaXRsZTt2YXIgbm9kZUZTO3ZhciBub2RlUGF0aDtpZihFTlZJUk9OTUVOVF9JU19OT0RFKXtpZihFTlZJUk9OTUVOVF9JU19XT1JLRVIpe3NjcmlwdERpcmVjdG9yeT1yZXF1aXJlKFwicGF0aFwiKS5kaXJuYW1lKHNjcmlwdERpcmVjdG9yeSkrXCIvXCJ9ZWxzZXtzY3JpcHREaXJlY3Rvcnk9X19kaXJuYW1lK1wiL1wifXJlYWRfPWZ1bmN0aW9uIHNoZWxsX3JlYWQoZmlsZW5hbWUsYmluYXJ5KXtpZighbm9kZUZTKW5vZGVGUz1yZXF1aXJlKFwiZnNcIik7aWYoIW5vZGVQYXRoKW5vZGVQYXRoPXJlcXVpcmUoXCJwYXRoXCIpO2ZpbGVuYW1lPW5vZGVQYXRoW1wibm9ybWFsaXplXCJdKGZpbGVuYW1lKTtyZXR1cm4gbm9kZUZTW1wicmVhZEZpbGVTeW5jXCJdKGZpbGVuYW1lLGJpbmFyeT9udWxsOlwidXRmOFwiKX07cmVhZEJpbmFyeT1mdW5jdGlvbiByZWFkQmluYXJ5KGZpbGVuYW1lKXt2YXIgcmV0PXJlYWRfKGZpbGVuYW1lLHRydWUpO2lmKCFyZXQuYnVmZmVyKXtyZXQ9bmV3IFVpbnQ4QXJyYXkocmV0KX1hc3NlcnQocmV0LmJ1ZmZlcik7cmV0dXJuIHJldH07aWYocHJvY2Vzc1tcImFyZ3ZcIl0ubGVuZ3RoPjEpe3RoaXNQcm9ncmFtPXByb2Nlc3NbXCJhcmd2XCJdWzFdLnJlcGxhY2UoL1xcXFwvZyxcIi9cIil9YXJndW1lbnRzXz1wcm9jZXNzW1wiYXJndlwiXS5zbGljZSgyKTtwcm9jZXNzW1wib25cIl0oXCJ1bmNhdWdodEV4Y2VwdGlvblwiLGZ1bmN0aW9uKGV4KXtpZighKGV4IGluc3RhbmNlb2YgRXhpdFN0YXR1cykpe3Rocm93IGV4fX0pO3Byb2Nlc3NbXCJvblwiXShcInVuaGFuZGxlZFJlamVjdGlvblwiLGFib3J0KTtxdWl0Xz1mdW5jdGlvbihzdGF0dXMpe3Byb2Nlc3NbXCJleGl0XCJdKHN0YXR1cyl9O01vZHVsZVtcImluc3BlY3RcIl09ZnVuY3Rpb24oKXtyZXR1cm5cIltFbXNjcmlwdGVuIE1vZHVsZSBvYmplY3RdXCJ9O3ZhciBub2RlV29ya2VyVGhyZWFkczt0cnl7bm9kZVdvcmtlclRocmVhZHM9cmVxdWlyZShcIndvcmtlcl90aHJlYWRzXCIpfWNhdGNoKGUpe2NvbnNvbGUuZXJyb3IoJ1RoZSBcIndvcmtlcl90aHJlYWRzXCIgbW9kdWxlIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBub2RlLmpzIGJ1aWxkIC0gcGVyaGFwcyBhIG5ld2VyIHZlcnNpb24gaXMgbmVlZGVkPycpO3Rocm93IGV9Z2xvYmFsLldvcmtlcj1ub2RlV29ya2VyVGhyZWFkcy5Xb3JrZXJ9ZWxzZSBpZihFTlZJUk9OTUVOVF9JU19TSEVMTCl7aWYodHlwZW9mIHJlYWQhPVwidW5kZWZpbmVkXCIpe3JlYWRfPWZ1bmN0aW9uIHNoZWxsX3JlYWQoZil7cmV0dXJuIHJlYWQoZil9fXJlYWRCaW5hcnk9ZnVuY3Rpb24gcmVhZEJpbmFyeShmKXt2YXIgZGF0YTtpZih0eXBlb2YgcmVhZGJ1ZmZlcj09PVwiZnVuY3Rpb25cIil7cmV0dXJuIG5ldyBVaW50OEFycmF5KHJlYWRidWZmZXIoZikpfWRhdGE9cmVhZChmLFwiYmluYXJ5XCIpO2Fzc2VydCh0eXBlb2YgZGF0YT09PVwib2JqZWN0XCIpO3JldHVybiBkYXRhfTtpZih0eXBlb2Ygc2NyaXB0QXJncyE9XCJ1bmRlZmluZWRcIil7YXJndW1lbnRzXz1zY3JpcHRBcmdzfWVsc2UgaWYodHlwZW9mIGFyZ3VtZW50cyE9XCJ1bmRlZmluZWRcIil7YXJndW1lbnRzXz1hcmd1bWVudHN9aWYodHlwZW9mIHF1aXQ9PT1cImZ1bmN0aW9uXCIpe3F1aXRfPWZ1bmN0aW9uKHN0YXR1cyl7cXVpdChzdGF0dXMpfX1pZih0eXBlb2YgcHJpbnQhPT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgY29uc29sZT09PVwidW5kZWZpbmVkXCIpY29uc29sZT17fTtjb25zb2xlLmxvZz1wcmludDtjb25zb2xlLndhcm49Y29uc29sZS5lcnJvcj10eXBlb2YgcHJpbnRFcnIhPT1cInVuZGVmaW5lZFwiP3ByaW50RXJyOnByaW50fX1lbHNlIGlmKEVOVklST05NRU5UX0lTX1dFQnx8RU5WSVJPTk1FTlRfSVNfV09SS0VSKXtpZihFTlZJUk9OTUVOVF9JU19XT1JLRVIpe3NjcmlwdERpcmVjdG9yeT1zZWxmLmxvY2F0aW9uLmhyZWZ9ZWxzZSBpZih0eXBlb2YgZG9jdW1lbnQhPT1cInVuZGVmaW5lZFwiJiZkb2N1bWVudC5jdXJyZW50U2NyaXB0KXtzY3JpcHREaXJlY3Rvcnk9ZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmN9aWYodHlwZW9mIF9zY3JpcHREaXIgIT09IFwidW5kZWZpbmVkXCIgJiYgX3NjcmlwdERpcil7c2NyaXB0RGlyZWN0b3J5PV9zY3JpcHREaXJ9aWYoc2NyaXB0RGlyZWN0b3J5LmluZGV4T2YoXCJibG9iOlwiKSE9PTApe3NjcmlwdERpcmVjdG9yeT1zY3JpcHREaXJlY3Rvcnkuc3Vic3RyKDAsc2NyaXB0RGlyZWN0b3J5Lmxhc3RJbmRleE9mKFwiL1wiKSsxKX1lbHNle3NjcmlwdERpcmVjdG9yeT1cIlwifWlmKEVOVklST05NRU5UX0lTX05PREUpe3JlYWRfPWZ1bmN0aW9uIHNoZWxsX3JlYWQoZmlsZW5hbWUsYmluYXJ5KXtpZighbm9kZUZTKW5vZGVGUz1yZXF1aXJlKFwiZnNcIik7aWYoIW5vZGVQYXRoKW5vZGVQYXRoPXJlcXVpcmUoXCJwYXRoXCIpO2ZpbGVuYW1lPW5vZGVQYXRoW1wibm9ybWFsaXplXCJdKGZpbGVuYW1lKTtyZXR1cm4gbm9kZUZTW1wicmVhZEZpbGVTeW5jXCJdKGZpbGVuYW1lLGJpbmFyeT9udWxsOlwidXRmOFwiKX07cmVhZEJpbmFyeT1mdW5jdGlvbiByZWFkQmluYXJ5KGZpbGVuYW1lKXt2YXIgcmV0PXJlYWRfKGZpbGVuYW1lLHRydWUpO2lmKCFyZXQuYnVmZmVyKXtyZXQ9bmV3IFVpbnQ4QXJyYXkocmV0KX1hc3NlcnQocmV0LmJ1ZmZlcik7cmV0dXJuIHJldH19ZWxzZXtyZWFkXz1mdW5jdGlvbih1cmwpe3ZhciB4aHI9bmV3IFhNTEh0dHBSZXF1ZXN0O3hoci5vcGVuKFwiR0VUXCIsdXJsLGZhbHNlKTt4aHIuc2VuZChudWxsKTtyZXR1cm4geGhyLnJlc3BvbnNlVGV4dH07aWYoRU5WSVJPTk1FTlRfSVNfV09SS0VSKXtyZWFkQmluYXJ5PWZ1bmN0aW9uKHVybCl7dmFyIHhocj1uZXcgWE1MSHR0cFJlcXVlc3Q7eGhyLm9wZW4oXCJHRVRcIix1cmwsZmFsc2UpO3hoci5yZXNwb25zZVR5cGU9XCJhcnJheWJ1ZmZlclwiO3hoci5zZW5kKG51bGwpO3JldHVybiBuZXcgVWludDhBcnJheSh4aHIucmVzcG9uc2UpfX1yZWFkQXN5bmM9ZnVuY3Rpb24odXJsLG9ubG9hZCxvbmVycm9yKXt2YXIgeGhyPW5ldyBYTUxIdHRwUmVxdWVzdDt4aHIub3BlbihcIkdFVFwiLHVybCx0cnVlKTt4aHIucmVzcG9uc2VUeXBlPVwiYXJyYXlidWZmZXJcIjt4aHIub25sb2FkPWZ1bmN0aW9uKCl7aWYoeGhyLnN0YXR1cz09MjAwfHx4aHIuc3RhdHVzPT0wJiZ4aHIucmVzcG9uc2Upe29ubG9hZCh4aHIucmVzcG9uc2UpO3JldHVybn1vbmVycm9yKCl9O3hoci5vbmVycm9yPW9uZXJyb3I7eGhyLnNlbmQobnVsbCl9fXNldFdpbmRvd1RpdGxlPWZ1bmN0aW9uKHRpdGxlKXtkb2N1bWVudC50aXRsZT10aXRsZX19ZWxzZXt9aWYoRU5WSVJPTk1FTlRfSVNfTk9ERSl7aWYodHlwZW9mIHBlcmZvcm1hbmNlPT09XCJ1bmRlZmluZWRcIil7Z2xvYmFsLnBlcmZvcm1hbmNlPXJlcXVpcmUoXCJwZXJmX2hvb2tzXCIpLnBlcmZvcm1hbmNlfX12YXIgb3V0PU1vZHVsZVtcInByaW50XCJdfHxjb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpO3ZhciBlcnI9TW9kdWxlW1wicHJpbnRFcnJcIl18fGNvbnNvbGUud2Fybi5iaW5kKGNvbnNvbGUpO2ZvcihrZXkgaW4gbW9kdWxlT3ZlcnJpZGVzKXtpZihtb2R1bGVPdmVycmlkZXMuaGFzT3duUHJvcGVydHkoa2V5KSl7TW9kdWxlW2tleV09bW9kdWxlT3ZlcnJpZGVzW2tleV19fW1vZHVsZU92ZXJyaWRlcz1udWxsO2lmKE1vZHVsZVtcImFyZ3VtZW50c1wiXSlhcmd1bWVudHNfPU1vZHVsZVtcImFyZ3VtZW50c1wiXTtpZihNb2R1bGVbXCJ0aGlzUHJvZ3JhbVwiXSl0aGlzUHJvZ3JhbT1Nb2R1bGVbXCJ0aGlzUHJvZ3JhbVwiXTtpZihNb2R1bGVbXCJxdWl0XCJdKXF1aXRfPU1vZHVsZVtcInF1aXRcIl07dmFyIEF0b21pY3NfbG9hZD1BdG9taWNzLmxvYWQ7dmFyIEF0b21pY3Nfc3RvcmU9QXRvbWljcy5zdG9yZTt2YXIgQXRvbWljc19jb21wYXJlRXhjaGFuZ2U9QXRvbWljcy5jb21wYXJlRXhjaGFuZ2U7dmFyIHdhc21CaW5hcnk7aWYoTW9kdWxlW1wid2FzbUJpbmFyeVwiXSl3YXNtQmluYXJ5PU1vZHVsZVtcIndhc21CaW5hcnlcIl07dmFyIG5vRXhpdFJ1bnRpbWU9TW9kdWxlW1wibm9FeGl0UnVudGltZVwiXXx8dHJ1ZTtpZih0eXBlb2YgV2ViQXNzZW1ibHkhPT1cIm9iamVjdFwiKXthYm9ydChcIm5vIG5hdGl2ZSB3YXNtIHN1cHBvcnQgZGV0ZWN0ZWRcIil9dmFyIHdhc21NZW1vcnk7dmFyIHdhc21Nb2R1bGU7dmFyIEFCT1JUPWZhbHNlO3ZhciBFWElUU1RBVFVTO2Z1bmN0aW9uIGFzc2VydChjb25kaXRpb24sdGV4dCl7aWYoIWNvbmRpdGlvbil7YWJvcnQoXCJBc3NlcnRpb24gZmFpbGVkOiBcIit0ZXh0KX19ZnVuY3Rpb24gZ2V0Q0Z1bmMoaWRlbnQpe3ZhciBmdW5jPU1vZHVsZVtcIl9cIitpZGVudF07YXNzZXJ0KGZ1bmMsXCJDYW5ub3QgY2FsbCB1bmtub3duIGZ1bmN0aW9uIFwiK2lkZW50K1wiLCBtYWtlIHN1cmUgaXQgaXMgZXhwb3J0ZWRcIik7cmV0dXJuIGZ1bmN9ZnVuY3Rpb24gY2NhbGwoaWRlbnQscmV0dXJuVHlwZSxhcmdUeXBlcyxhcmdzLG9wdHMpe3ZhciB0b0M9e1wic3RyaW5nXCI6ZnVuY3Rpb24oc3RyKXt2YXIgcmV0PTA7aWYoc3RyIT09bnVsbCYmc3RyIT09dW5kZWZpbmVkJiZzdHIhPT0wKXt2YXIgbGVuPShzdHIubGVuZ3RoPDwyKSsxO3JldD1zdGFja0FsbG9jKGxlbik7c3RyaW5nVG9VVEY4KHN0cixyZXQsbGVuKX1yZXR1cm4gcmV0fSxcImFycmF5XCI6ZnVuY3Rpb24oYXJyKXt2YXIgcmV0PXN0YWNrQWxsb2MoYXJyLmxlbmd0aCk7d3JpdGVBcnJheVRvTWVtb3J5KGFycixyZXQpO3JldHVybiByZXR9fTtmdW5jdGlvbiBjb252ZXJ0UmV0dXJuVmFsdWUocmV0KXtpZihyZXR1cm5UeXBlPT09XCJzdHJpbmdcIilyZXR1cm4gVVRGOFRvU3RyaW5nKHJldCk7aWYocmV0dXJuVHlwZT09PVwiYm9vbGVhblwiKXJldHVybiBCb29sZWFuKHJldCk7cmV0dXJuIHJldH12YXIgZnVuYz1nZXRDRnVuYyhpZGVudCk7dmFyIGNBcmdzPVtdO3ZhciBzdGFjaz0wO2lmKGFyZ3Mpe2Zvcih2YXIgaT0wO2k8YXJncy5sZW5ndGg7aSsrKXt2YXIgY29udmVydGVyPXRvQ1thcmdUeXBlc1tpXV07aWYoY29udmVydGVyKXtpZihzdGFjaz09PTApc3RhY2s9c3RhY2tTYXZlKCk7Y0FyZ3NbaV09Y29udmVydGVyKGFyZ3NbaV0pfWVsc2V7Y0FyZ3NbaV09YXJnc1tpXX19fXZhciByZXQ9ZnVuYy5hcHBseShudWxsLGNBcmdzKTtyZXQ9Y29udmVydFJldHVyblZhbHVlKHJldCk7aWYoc3RhY2shPT0wKXN0YWNrUmVzdG9yZShzdGFjayk7cmV0dXJuIHJldH1mdW5jdGlvbiBjd3JhcChpZGVudCxyZXR1cm5UeXBlLGFyZ1R5cGVzLG9wdHMpe2FyZ1R5cGVzPWFyZ1R5cGVzfHxbXTt2YXIgbnVtZXJpY0FyZ3M9YXJnVHlwZXMuZXZlcnkoZnVuY3Rpb24odHlwZSl7cmV0dXJuIHR5cGU9PT1cIm51bWJlclwifSk7dmFyIG51bWVyaWNSZXQ9cmV0dXJuVHlwZSE9PVwic3RyaW5nXCI7aWYobnVtZXJpY1JldCYmbnVtZXJpY0FyZ3MmJiFvcHRzKXtyZXR1cm4gZ2V0Q0Z1bmMoaWRlbnQpfXJldHVybiBmdW5jdGlvbigpe3JldHVybiBjY2FsbChpZGVudCxyZXR1cm5UeXBlLGFyZ1R5cGVzLGFyZ3VtZW50cyxvcHRzKX19ZnVuY3Rpb24gVVRGOEFycmF5VG9TdHJpbmcoaGVhcCxpZHgsbWF4Qnl0ZXNUb1JlYWQpe3ZhciBlbmRJZHg9aWR4K21heEJ5dGVzVG9SZWFkO3ZhciBzdHI9XCJcIjt3aGlsZSghKGlkeD49ZW5kSWR4KSl7dmFyIHUwPWhlYXBbaWR4KytdO2lmKCF1MClyZXR1cm4gc3RyO2lmKCEodTAmMTI4KSl7c3RyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHUwKTtjb250aW51ZX12YXIgdTE9aGVhcFtpZHgrK10mNjM7aWYoKHUwJjIyNCk9PTE5Mil7c3RyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCh1MCYzMSk8PDZ8dTEpO2NvbnRpbnVlfXZhciB1Mj1oZWFwW2lkeCsrXSY2MztpZigodTAmMjQwKT09MjI0KXt1MD0odTAmMTUpPDwxMnx1MTw8Nnx1Mn1lbHNle3UwPSh1MCY3KTw8MTh8dTE8PDEyfHUyPDw2fGhlYXBbaWR4KytdJjYzfWlmKHUwPDY1NTM2KXtzdHIrPVN0cmluZy5mcm9tQ2hhckNvZGUodTApfWVsc2V7dmFyIGNoPXUwLTY1NTM2O3N0cis9U3RyaW5nLmZyb21DaGFyQ29kZSg1NTI5NnxjaD4+MTAsNTYzMjB8Y2gmMTAyMyl9fXJldHVybiBzdHJ9ZnVuY3Rpb24gVVRGOFRvU3RyaW5nKHB0cixtYXhCeXRlc1RvUmVhZCl7cmV0dXJuIHB0cj9VVEY4QXJyYXlUb1N0cmluZyhHUk9XQUJMRV9IRUFQX1U4KCkscHRyLG1heEJ5dGVzVG9SZWFkKTpcIlwifWZ1bmN0aW9uIHN0cmluZ1RvVVRGOEFycmF5KHN0cixoZWFwLG91dElkeCxtYXhCeXRlc1RvV3JpdGUpe2lmKCEobWF4Qnl0ZXNUb1dyaXRlPjApKXJldHVybiAwO3ZhciBzdGFydElkeD1vdXRJZHg7dmFyIGVuZElkeD1vdXRJZHgrbWF4Qnl0ZXNUb1dyaXRlLTE7Zm9yKHZhciBpPTA7aTxzdHIubGVuZ3RoOysraSl7dmFyIHU9c3RyLmNoYXJDb2RlQXQoaSk7aWYodT49NTUyOTYmJnU8PTU3MzQzKXt2YXIgdTE9c3RyLmNoYXJDb2RlQXQoKytpKTt1PTY1NTM2KygodSYxMDIzKTw8MTApfHUxJjEwMjN9aWYodTw9MTI3KXtpZihvdXRJZHg+PWVuZElkeClicmVhaztoZWFwW291dElkeCsrXT11fWVsc2UgaWYodTw9MjA0Nyl7aWYob3V0SWR4KzE+PWVuZElkeClicmVhaztoZWFwW291dElkeCsrXT0xOTJ8dT4+NjtoZWFwW291dElkeCsrXT0xMjh8dSY2M31lbHNlIGlmKHU8PTY1NTM1KXtpZihvdXRJZHgrMj49ZW5kSWR4KWJyZWFrO2hlYXBbb3V0SWR4KytdPTIyNHx1Pj4xMjtoZWFwW291dElkeCsrXT0xMjh8dT4+NiY2MztoZWFwW291dElkeCsrXT0xMjh8dSY2M31lbHNle2lmKG91dElkeCszPj1lbmRJZHgpYnJlYWs7aGVhcFtvdXRJZHgrK109MjQwfHU+PjE4O2hlYXBbb3V0SWR4KytdPTEyOHx1Pj4xMiY2MztoZWFwW291dElkeCsrXT0xMjh8dT4+NiY2MztoZWFwW291dElkeCsrXT0xMjh8dSY2M319aGVhcFtvdXRJZHhdPTA7cmV0dXJuIG91dElkeC1zdGFydElkeH1mdW5jdGlvbiBzdHJpbmdUb1VURjgoc3RyLG91dFB0cixtYXhCeXRlc1RvV3JpdGUpe3JldHVybiBzdHJpbmdUb1VURjhBcnJheShzdHIsR1JPV0FCTEVfSEVBUF9VOCgpLG91dFB0cixtYXhCeXRlc1RvV3JpdGUpfWZ1bmN0aW9uIGxlbmd0aEJ5dGVzVVRGOChzdHIpe3ZhciBsZW49MDtmb3IodmFyIGk9MDtpPHN0ci5sZW5ndGg7KytpKXt2YXIgdT1zdHIuY2hhckNvZGVBdChpKTtpZih1Pj01NTI5NiYmdTw9NTczNDMpdT02NTUzNisoKHUmMTAyMyk8PDEwKXxzdHIuY2hhckNvZGVBdCgrK2kpJjEwMjM7aWYodTw9MTI3KSsrbGVuO2Vsc2UgaWYodTw9MjA0NylsZW4rPTI7ZWxzZSBpZih1PD02NTUzNSlsZW4rPTM7ZWxzZSBsZW4rPTR9cmV0dXJuIGxlbn1mdW5jdGlvbiB3cml0ZUFycmF5VG9NZW1vcnkoYXJyYXksYnVmZmVyKXtHUk9XQUJMRV9IRUFQX0k4KCkuc2V0KGFycmF5LGJ1ZmZlcil9ZnVuY3Rpb24gYWxpZ25VcCh4LG11bHRpcGxlKXtpZih4JW11bHRpcGxlPjApe3grPW11bHRpcGxlLXglbXVsdGlwbGV9cmV0dXJuIHh9dmFyIGJ1ZmZlcixIRUFQOCxIRUFQVTgsSEVBUDE2LEhFQVBVMTYsSEVBUDMyLEhFQVBVMzIsSEVBUEYzMixIRUFQRjY0O2Z1bmN0aW9uIHVwZGF0ZUdsb2JhbEJ1ZmZlckFuZFZpZXdzKGJ1Zil7YnVmZmVyPWJ1ZjtNb2R1bGVbXCJIRUFQOFwiXT1IRUFQOD1uZXcgSW50OEFycmF5KGJ1Zik7TW9kdWxlW1wiSEVBUDE2XCJdPUhFQVAxNj1uZXcgSW50MTZBcnJheShidWYpO01vZHVsZVtcIkhFQVAzMlwiXT1IRUFQMzI9bmV3IEludDMyQXJyYXkoYnVmKTtNb2R1bGVbXCJIRUFQVThcIl09SEVBUFU4PW5ldyBVaW50OEFycmF5KGJ1Zik7TW9kdWxlW1wiSEVBUFUxNlwiXT1IRUFQVTE2PW5ldyBVaW50MTZBcnJheShidWYpO01vZHVsZVtcIkhFQVBVMzJcIl09SEVBUFUzMj1uZXcgVWludDMyQXJyYXkoYnVmKTtNb2R1bGVbXCJIRUFQRjMyXCJdPUhFQVBGMzI9bmV3IEZsb2F0MzJBcnJheShidWYpO01vZHVsZVtcIkhFQVBGNjRcIl09SEVBUEY2ND1uZXcgRmxvYXQ2NEFycmF5KGJ1Zil9dmFyIElOSVRJQUxfTUVNT1JZPU1vZHVsZVtcIklOSVRJQUxfTUVNT1JZXCJdfHwxNjc3NzIxNjtpZihFTlZJUk9OTUVOVF9JU19QVEhSRUFEKXt3YXNtTWVtb3J5PU1vZHVsZVtcIndhc21NZW1vcnlcIl07YnVmZmVyPU1vZHVsZVtcImJ1ZmZlclwiXX1lbHNle2lmKE1vZHVsZVtcIndhc21NZW1vcnlcIl0pe3dhc21NZW1vcnk9TW9kdWxlW1wid2FzbU1lbW9yeVwiXX1lbHNle3dhc21NZW1vcnk9bmV3IFdlYkFzc2VtYmx5Lk1lbW9yeSh7XCJpbml0aWFsXCI6SU5JVElBTF9NRU1PUlkvNjU1MzYsXCJtYXhpbXVtXCI6MjE0NzQ4MzY0OC82NTUzNixcInNoYXJlZFwiOnRydWV9KTtpZighKHdhc21NZW1vcnkuYnVmZmVyIGluc3RhbmNlb2YgU2hhcmVkQXJyYXlCdWZmZXIpKXtlcnIoXCJyZXF1ZXN0ZWQgYSBzaGFyZWQgV2ViQXNzZW1ibHkuTWVtb3J5IGJ1dCB0aGUgcmV0dXJuZWQgYnVmZmVyIGlzIG5vdCBhIFNoYXJlZEFycmF5QnVmZmVyLCBpbmRpY2F0aW5nIHRoYXQgd2hpbGUgdGhlIGJyb3dzZXIgaGFzIFNoYXJlZEFycmF5QnVmZmVyIGl0IGRvZXMgbm90IGhhdmUgV2ViQXNzZW1ibHkgdGhyZWFkcyBzdXBwb3J0IC0geW91IG1heSBuZWVkIHRvIHNldCBhIGZsYWdcIik7aWYoRU5WSVJPTk1FTlRfSVNfTk9ERSl7Y29uc29sZS5sb2coXCIob24gbm9kZSB5b3UgbWF5IG5lZWQ6IC0tZXhwZXJpbWVudGFsLXdhc20tdGhyZWFkcyAtLWV4cGVyaW1lbnRhbC13YXNtLWJ1bGstbWVtb3J5IGFuZCBhbHNvIHVzZSBhIHJlY2VudCB2ZXJzaW9uKVwiKX10aHJvdyBFcnJvcihcImJhZCBtZW1vcnlcIil9fX1pZih3YXNtTWVtb3J5KXtidWZmZXI9d2FzbU1lbW9yeS5idWZmZXJ9SU5JVElBTF9NRU1PUlk9YnVmZmVyLmJ5dGVMZW5ndGg7dXBkYXRlR2xvYmFsQnVmZmVyQW5kVmlld3MoYnVmZmVyKTt2YXIgd2FzbVRhYmxlO3ZhciBfX0FUUFJFUlVOX189W107dmFyIF9fQVRJTklUX189W107dmFyIF9fQVRNQUlOX189W107dmFyIF9fQVRFWElUX189W107dmFyIF9fQVRQT1NUUlVOX189W107dmFyIHJ1bnRpbWVJbml0aWFsaXplZD1mYWxzZTt2YXIgcnVudGltZUV4aXRlZD1mYWxzZTtpZighRU5WSVJPTk1FTlRfSVNfUFRIUkVBRClfX0FUSU5JVF9fLnB1c2goe2Z1bmM6ZnVuY3Rpb24oKXtfX193YXNtX2NhbGxfY3RvcnMoKX19KTtmdW5jdGlvbiBwcmVSdW4oKXtpZihFTlZJUk9OTUVOVF9JU19QVEhSRUFEKXJldHVybjtpZihNb2R1bGVbXCJwcmVSdW5cIl0pe2lmKHR5cGVvZiBNb2R1bGVbXCJwcmVSdW5cIl09PVwiZnVuY3Rpb25cIilNb2R1bGVbXCJwcmVSdW5cIl09W01vZHVsZVtcInByZVJ1blwiXV07d2hpbGUoTW9kdWxlW1wicHJlUnVuXCJdLmxlbmd0aCl7YWRkT25QcmVSdW4oTW9kdWxlW1wicHJlUnVuXCJdLnNoaWZ0KCkpfX1jYWxsUnVudGltZUNhbGxiYWNrcyhfX0FUUFJFUlVOX18pfWZ1bmN0aW9uIGluaXRSdW50aW1lKCl7cnVudGltZUluaXRpYWxpemVkPXRydWU7aWYoRU5WSVJPTk1FTlRfSVNfUFRIUkVBRClyZXR1cm47Y2FsbFJ1bnRpbWVDYWxsYmFja3MoX19BVElOSVRfXyl9ZnVuY3Rpb24gcHJlTWFpbigpe2lmKEVOVklST05NRU5UX0lTX1BUSFJFQUQpcmV0dXJuO2NhbGxSdW50aW1lQ2FsbGJhY2tzKF9fQVRNQUlOX18pfWZ1bmN0aW9uIGV4aXRSdW50aW1lKCl7aWYoRU5WSVJPTk1FTlRfSVNfUFRIUkVBRClyZXR1cm47cnVudGltZUV4aXRlZD10cnVlfWZ1bmN0aW9uIHBvc3RSdW4oKXtpZihFTlZJUk9OTUVOVF9JU19QVEhSRUFEKXJldHVybjtpZihNb2R1bGVbXCJwb3N0UnVuXCJdKXtpZih0eXBlb2YgTW9kdWxlW1wicG9zdFJ1blwiXT09XCJmdW5jdGlvblwiKU1vZHVsZVtcInBvc3RSdW5cIl09W01vZHVsZVtcInBvc3RSdW5cIl1dO3doaWxlKE1vZHVsZVtcInBvc3RSdW5cIl0ubGVuZ3RoKXthZGRPblBvc3RSdW4oTW9kdWxlW1wicG9zdFJ1blwiXS5zaGlmdCgpKX19Y2FsbFJ1bnRpbWVDYWxsYmFja3MoX19BVFBPU1RSVU5fXyl9ZnVuY3Rpb24gYWRkT25QcmVSdW4oY2Ipe19fQVRQUkVSVU5fXy51bnNoaWZ0KGNiKX1mdW5jdGlvbiBhZGRPblBvc3RSdW4oY2Ipe19fQVRQT1NUUlVOX18udW5zaGlmdChjYil9dmFyIHJ1bkRlcGVuZGVuY2llcz0wO3ZhciBydW5EZXBlbmRlbmN5V2F0Y2hlcj1udWxsO3ZhciBkZXBlbmRlbmNpZXNGdWxmaWxsZWQ9bnVsbDtmdW5jdGlvbiBhZGRSdW5EZXBlbmRlbmN5KGlkKXthc3NlcnQoIUVOVklST05NRU5UX0lTX1BUSFJFQUQsXCJhZGRSdW5EZXBlbmRlbmN5IGNhbm5vdCBiZSB1c2VkIGluIGEgcHRocmVhZCB3b3JrZXJcIik7cnVuRGVwZW5kZW5jaWVzKys7aWYoTW9kdWxlW1wibW9uaXRvclJ1bkRlcGVuZGVuY2llc1wiXSl7TW9kdWxlW1wibW9uaXRvclJ1bkRlcGVuZGVuY2llc1wiXShydW5EZXBlbmRlbmNpZXMpfX1mdW5jdGlvbiByZW1vdmVSdW5EZXBlbmRlbmN5KGlkKXtydW5EZXBlbmRlbmNpZXMtLTtpZihNb2R1bGVbXCJtb25pdG9yUnVuRGVwZW5kZW5jaWVzXCJdKXtNb2R1bGVbXCJtb25pdG9yUnVuRGVwZW5kZW5jaWVzXCJdKHJ1bkRlcGVuZGVuY2llcyl9aWYocnVuRGVwZW5kZW5jaWVzPT0wKXtpZihydW5EZXBlbmRlbmN5V2F0Y2hlciE9PW51bGwpe2NsZWFySW50ZXJ2YWwocnVuRGVwZW5kZW5jeVdhdGNoZXIpO3J1bkRlcGVuZGVuY3lXYXRjaGVyPW51bGx9aWYoZGVwZW5kZW5jaWVzRnVsZmlsbGVkKXt2YXIgY2FsbGJhY2s9ZGVwZW5kZW5jaWVzRnVsZmlsbGVkO2RlcGVuZGVuY2llc0Z1bGZpbGxlZD1udWxsO2NhbGxiYWNrKCl9fX1Nb2R1bGVbXCJwcmVsb2FkZWRJbWFnZXNcIl09e307TW9kdWxlW1wicHJlbG9hZGVkQXVkaW9zXCJdPXt9O2Z1bmN0aW9uIGFib3J0KHdoYXQpe2lmKE1vZHVsZVtcIm9uQWJvcnRcIl0pe01vZHVsZVtcIm9uQWJvcnRcIl0od2hhdCl9aWYoRU5WSVJPTk1FTlRfSVNfUFRIUkVBRCljb25zb2xlLmVycm9yKFwiUHRocmVhZCBhYm9ydGluZyBhdCBcIisobmV3IEVycm9yKS5zdGFjayk7d2hhdCs9XCJcIjtlcnIod2hhdCk7QUJPUlQ9dHJ1ZTtFWElUU1RBVFVTPTE7d2hhdD1cImFib3J0KFwiK3doYXQrXCIpLiBCdWlsZCB3aXRoIC1zIEFTU0VSVElPTlM9MSBmb3IgbW9yZSBpbmZvLlwiO3ZhciBlPW5ldyBXZWJBc3NlbWJseS5SdW50aW1lRXJyb3Iod2hhdCk7cmVhZHlQcm9taXNlUmVqZWN0KGUpO3Rocm93IGV9ZnVuY3Rpb24gaGFzUHJlZml4KHN0cixwcmVmaXgpe3JldHVybiBTdHJpbmcucHJvdG90eXBlLnN0YXJ0c1dpdGg/c3RyLnN0YXJ0c1dpdGgocHJlZml4KTpzdHIuaW5kZXhPZihwcmVmaXgpPT09MH12YXIgZGF0YVVSSVByZWZpeD1cImRhdGE6YXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtO2Jhc2U2NCxcIjtmdW5jdGlvbiBpc0RhdGFVUkkoZmlsZW5hbWUpe3JldHVybiBoYXNQcmVmaXgoZmlsZW5hbWUsZGF0YVVSSVByZWZpeCl9dmFyIGZpbGVVUklQcmVmaXg9XCJmaWxlOi8vXCI7ZnVuY3Rpb24gaXNGaWxlVVJJKGZpbGVuYW1lKXtyZXR1cm4gaGFzUHJlZml4KGZpbGVuYW1lLGZpbGVVUklQcmVmaXgpfXZhciB3YXNtQmluYXJ5RmlsZT1cInRmanMtYmFja2VuZC13YXNtLXRocmVhZGVkLXNpbWQud2FzbVwiO2lmKCFpc0RhdGFVUkkod2FzbUJpbmFyeUZpbGUpKXt3YXNtQmluYXJ5RmlsZT1sb2NhdGVGaWxlKHdhc21CaW5hcnlGaWxlKX1mdW5jdGlvbiBnZXRCaW5hcnkoZmlsZSl7dHJ5e2lmKGZpbGU9PXdhc21CaW5hcnlGaWxlJiZ3YXNtQmluYXJ5KXtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkod2FzbUJpbmFyeSl9aWYocmVhZEJpbmFyeSl7cmV0dXJuIHJlYWRCaW5hcnkoZmlsZSl9ZWxzZXt0aHJvd1wiYm90aCBhc3luYyBhbmQgc3luYyBmZXRjaGluZyBvZiB0aGUgd2FzbSBmYWlsZWRcIn19Y2F0Y2goZXJyKXthYm9ydChlcnIpfX1mdW5jdGlvbiBnZXRCaW5hcnlQcm9taXNlKCl7aWYoIXdhc21CaW5hcnkmJihFTlZJUk9OTUVOVF9JU19XRUJ8fEVOVklST05NRU5UX0lTX1dPUktFUikpe2lmKHR5cGVvZiBmZXRjaD09PVwiZnVuY3Rpb25cIiYmIWlzRmlsZVVSSSh3YXNtQmluYXJ5RmlsZSkpe3JldHVybiBmZXRjaCh3YXNtQmluYXJ5RmlsZSx7Y3JlZGVudGlhbHM6XCJzYW1lLW9yaWdpblwifSkudGhlbihmdW5jdGlvbihyZXNwb25zZSl7aWYoIXJlc3BvbnNlW1wib2tcIl0pe3Rocm93XCJmYWlsZWQgdG8gbG9hZCB3YXNtIGJpbmFyeSBmaWxlIGF0ICdcIit3YXNtQmluYXJ5RmlsZStcIidcIn1yZXR1cm4gcmVzcG9uc2VbXCJhcnJheUJ1ZmZlclwiXSgpfSkuY2F0Y2goZnVuY3Rpb24oKXtyZXR1cm4gZ2V0QmluYXJ5KHdhc21CaW5hcnlGaWxlKX0pfWVsc2V7aWYocmVhZEFzeW5jKXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSxyZWplY3Qpe3JlYWRBc3luYyh3YXNtQmluYXJ5RmlsZSxmdW5jdGlvbihyZXNwb25zZSl7cmVzb2x2ZShuZXcgVWludDhBcnJheShyZXNwb25zZSkpfSxyZWplY3QpfSl9fX1yZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbigpe3JldHVybiBnZXRCaW5hcnkod2FzbUJpbmFyeUZpbGUpfSl9ZnVuY3Rpb24gY3JlYXRlV2FzbSgpe3ZhciBpbmZvPXtcImFcIjphc21MaWJyYXJ5QXJnfTtmdW5jdGlvbiByZWNlaXZlSW5zdGFuY2UoaW5zdGFuY2UsbW9kdWxlKXt2YXIgZXhwb3J0cz1pbnN0YW5jZS5leHBvcnRzO01vZHVsZVtcImFzbVwiXT1leHBvcnRzO3dhc21UYWJsZT1Nb2R1bGVbXCJhc21cIl1bXCJGXCJdO3dhc21Nb2R1bGU9bW9kdWxlO2lmKCFFTlZJUk9OTUVOVF9JU19QVEhSRUFEKXt2YXIgbnVtV29ya2Vyc1RvTG9hZD1QVGhyZWFkLnVudXNlZFdvcmtlcnMubGVuZ3RoO1BUaHJlYWQudW51c2VkV29ya2Vycy5mb3JFYWNoKGZ1bmN0aW9uKHcpe1BUaHJlYWQubG9hZFdhc21Nb2R1bGVUb1dvcmtlcih3LGZ1bmN0aW9uKCl7aWYoIS0tbnVtV29ya2Vyc1RvTG9hZClyZW1vdmVSdW5EZXBlbmRlbmN5KFwid2FzbS1pbnN0YW50aWF0ZVwiKX0pfSl9fWlmKCFFTlZJUk9OTUVOVF9JU19QVEhSRUFEKXthZGRSdW5EZXBlbmRlbmN5KFwid2FzbS1pbnN0YW50aWF0ZVwiKX1mdW5jdGlvbiByZWNlaXZlSW5zdGFudGlhdGVkU291cmNlKG91dHB1dCl7cmVjZWl2ZUluc3RhbmNlKG91dHB1dFtcImluc3RhbmNlXCJdLG91dHB1dFtcIm1vZHVsZVwiXSl9ZnVuY3Rpb24gaW5zdGFudGlhdGVBcnJheUJ1ZmZlcihyZWNlaXZlcil7cmV0dXJuIGdldEJpbmFyeVByb21pc2UoKS50aGVuKGZ1bmN0aW9uKGJpbmFyeSl7cmV0dXJuIFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKGJpbmFyeSxpbmZvKX0pLnRoZW4ocmVjZWl2ZXIsZnVuY3Rpb24ocmVhc29uKXtlcnIoXCJmYWlsZWQgdG8gYXN5bmNocm9ub3VzbHkgcHJlcGFyZSB3YXNtOiBcIityZWFzb24pO2Fib3J0KHJlYXNvbil9KX1mdW5jdGlvbiBpbnN0YW50aWF0ZUFzeW5jKCl7aWYoIXdhc21CaW5hcnkmJnR5cGVvZiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZz09PVwiZnVuY3Rpb25cIiYmIWlzRGF0YVVSSSh3YXNtQmluYXJ5RmlsZSkmJiFpc0ZpbGVVUkkod2FzbUJpbmFyeUZpbGUpJiZ0eXBlb2YgZmV0Y2g9PT1cImZ1bmN0aW9uXCIpe3JldHVybiBmZXRjaCh3YXNtQmluYXJ5RmlsZSx7Y3JlZGVudGlhbHM6XCJzYW1lLW9yaWdpblwifSkudGhlbihmdW5jdGlvbihyZXNwb25zZSl7dmFyIHJlc3VsdD1XZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyhyZXNwb25zZSxpbmZvKTtyZXR1cm4gcmVzdWx0LnRoZW4ocmVjZWl2ZUluc3RhbnRpYXRlZFNvdXJjZSxmdW5jdGlvbihyZWFzb24pe2VycihcIndhc20gc3RyZWFtaW5nIGNvbXBpbGUgZmFpbGVkOiBcIityZWFzb24pO2VycihcImZhbGxpbmcgYmFjayB0byBBcnJheUJ1ZmZlciBpbnN0YW50aWF0aW9uXCIpO3JldHVybiBpbnN0YW50aWF0ZUFycmF5QnVmZmVyKHJlY2VpdmVJbnN0YW50aWF0ZWRTb3VyY2UpfSl9KX1lbHNle3JldHVybiBpbnN0YW50aWF0ZUFycmF5QnVmZmVyKHJlY2VpdmVJbnN0YW50aWF0ZWRTb3VyY2UpfX1pZihNb2R1bGVbXCJpbnN0YW50aWF0ZVdhc21cIl0pe3RyeXt2YXIgZXhwb3J0cz1Nb2R1bGVbXCJpbnN0YW50aWF0ZVdhc21cIl0oaW5mbyxyZWNlaXZlSW5zdGFuY2UpO3JldHVybiBleHBvcnRzfWNhdGNoKGUpe2VycihcIk1vZHVsZS5pbnN0YW50aWF0ZVdhc20gY2FsbGJhY2sgZmFpbGVkIHdpdGggZXJyb3I6IFwiK2UpO3JldHVybiBmYWxzZX19aW5zdGFudGlhdGVBc3luYygpLmNhdGNoKHJlYWR5UHJvbWlzZVJlamVjdCk7cmV0dXJue319dmFyIEFTTV9DT05TVFM9ezk4MzI6ZnVuY3Rpb24oKXt0aHJvd1wiQ2FuY2VsZWQhXCJ9LDk4NTA6ZnVuY3Rpb24oJDAsJDEpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtfX2Vtc2NyaXB0ZW5fZG9fZGlzcGF0Y2hfdG9fdGhyZWFkKCQwLCQxKX0sMCl9fTtmdW5jdGlvbiBpbml0UHRocmVhZHNKUygpe1BUaHJlYWQuaW5pdFJ1bnRpbWUoKX1mdW5jdGlvbiBjYWxsUnVudGltZUNhbGxiYWNrcyhjYWxsYmFja3Mpe3doaWxlKGNhbGxiYWNrcy5sZW5ndGg+MCl7dmFyIGNhbGxiYWNrPWNhbGxiYWNrcy5zaGlmdCgpO2lmKHR5cGVvZiBjYWxsYmFjaz09XCJmdW5jdGlvblwiKXtjYWxsYmFjayhNb2R1bGUpO2NvbnRpbnVlfXZhciBmdW5jPWNhbGxiYWNrLmZ1bmM7aWYodHlwZW9mIGZ1bmM9PT1cIm51bWJlclwiKXtpZihjYWxsYmFjay5hcmc9PT11bmRlZmluZWQpe3dhc21UYWJsZS5nZXQoZnVuYykoKX1lbHNle3dhc21UYWJsZS5nZXQoZnVuYykoY2FsbGJhY2suYXJnKX19ZWxzZXtmdW5jKGNhbGxiYWNrLmFyZz09PXVuZGVmaW5lZD9udWxsOmNhbGxiYWNrLmFyZyl9fX1mdW5jdGlvbiBfZW1zY3JpcHRlbl9mdXRleF93YWtlKGFkZHIsY291bnQpe2lmKGFkZHI8PTB8fGFkZHI+R1JPV0FCTEVfSEVBUF9JOCgpLmxlbmd0aHx8YWRkciYzIT0wfHxjb3VudDwwKXJldHVybi0yODtpZihjb3VudD09MClyZXR1cm4gMDtpZihjb3VudD49MjE0NzQ4MzY0Nyljb3VudD1JbmZpbml0eTt2YXIgbWFpblRocmVhZFdhaXRBZGRyZXNzPUF0b21pY3MubG9hZChHUk9XQUJMRV9IRUFQX0kzMigpLF9fZW1zY3JpcHRlbl9tYWluX3RocmVhZF9mdXRleD4+Mik7dmFyIG1haW5UaHJlYWRXb2tlbj0wO2lmKG1haW5UaHJlYWRXYWl0QWRkcmVzcz09YWRkcil7dmFyIGxvYWRlZEFkZHI9QXRvbWljcy5jb21wYXJlRXhjaGFuZ2UoR1JPV0FCTEVfSEVBUF9JMzIoKSxfX2Vtc2NyaXB0ZW5fbWFpbl90aHJlYWRfZnV0ZXg+PjIsbWFpblRocmVhZFdhaXRBZGRyZXNzLDApO2lmKGxvYWRlZEFkZHI9PW1haW5UaHJlYWRXYWl0QWRkcmVzcyl7LS1jb3VudDttYWluVGhyZWFkV29rZW49MTtpZihjb3VudDw9MClyZXR1cm4gMX19dmFyIHJldD1BdG9taWNzLm5vdGlmeShHUk9XQUJMRV9IRUFQX0kzMigpLGFkZHI+PjIsY291bnQpO2lmKHJldD49MClyZXR1cm4gcmV0K21haW5UaHJlYWRXb2tlbjt0aHJvd1wiQXRvbWljcy5ub3RpZnkgcmV0dXJuZWQgYW4gdW5leHBlY3RlZCB2YWx1ZSBcIityZXR9TW9kdWxlW1wiX2Vtc2NyaXB0ZW5fZnV0ZXhfd2FrZVwiXT1fZW1zY3JpcHRlbl9mdXRleF93YWtlO2Z1bmN0aW9uIGtpbGxUaHJlYWQocHRocmVhZF9wdHIpe2lmKEVOVklST05NRU5UX0lTX1BUSFJFQUQpdGhyb3dcIkludGVybmFsIEVycm9yISBraWxsVGhyZWFkKCkgY2FuIG9ubHkgZXZlciBiZSBjYWxsZWQgZnJvbSBtYWluIGFwcGxpY2F0aW9uIHRocmVhZCFcIjtpZighcHRocmVhZF9wdHIpdGhyb3dcIkludGVybmFsIEVycm9yISBOdWxsIHB0aHJlYWRfcHRyIGluIGtpbGxUaHJlYWQhXCI7R1JPV0FCTEVfSEVBUF9JMzIoKVtwdGhyZWFkX3B0cisxMj4+Ml09MDt2YXIgcHRocmVhZD1QVGhyZWFkLnB0aHJlYWRzW3B0aHJlYWRfcHRyXTtwdGhyZWFkLndvcmtlci50ZXJtaW5hdGUoKTtQVGhyZWFkLmZyZWVUaHJlYWREYXRhKHB0aHJlYWQpO1BUaHJlYWQucnVubmluZ1dvcmtlcnMuc3BsaWNlKFBUaHJlYWQucnVubmluZ1dvcmtlcnMuaW5kZXhPZihwdGhyZWFkLndvcmtlciksMSk7cHRocmVhZC53b3JrZXIucHRocmVhZD11bmRlZmluZWR9ZnVuY3Rpb24gY2FuY2VsVGhyZWFkKHB0aHJlYWRfcHRyKXtpZihFTlZJUk9OTUVOVF9JU19QVEhSRUFEKXRocm93XCJJbnRlcm5hbCBFcnJvciEgY2FuY2VsVGhyZWFkKCkgY2FuIG9ubHkgZXZlciBiZSBjYWxsZWQgZnJvbSBtYWluIGFwcGxpY2F0aW9uIHRocmVhZCFcIjtpZighcHRocmVhZF9wdHIpdGhyb3dcIkludGVybmFsIEVycm9yISBOdWxsIHB0aHJlYWRfcHRyIGluIGNhbmNlbFRocmVhZCFcIjt2YXIgcHRocmVhZD1QVGhyZWFkLnB0aHJlYWRzW3B0aHJlYWRfcHRyXTtwdGhyZWFkLndvcmtlci5wb3N0TWVzc2FnZSh7XCJjbWRcIjpcImNhbmNlbFwifSl9ZnVuY3Rpb24gY2xlYW51cFRocmVhZChwdGhyZWFkX3B0cil7aWYoRU5WSVJPTk1FTlRfSVNfUFRIUkVBRCl0aHJvd1wiSW50ZXJuYWwgRXJyb3IhIGNsZWFudXBUaHJlYWQoKSBjYW4gb25seSBldmVyIGJlIGNhbGxlZCBmcm9tIG1haW4gYXBwbGljYXRpb24gdGhyZWFkIVwiO2lmKCFwdGhyZWFkX3B0cil0aHJvd1wiSW50ZXJuYWwgRXJyb3IhIE51bGwgcHRocmVhZF9wdHIgaW4gY2xlYW51cFRocmVhZCFcIjt2YXIgcHRocmVhZD1QVGhyZWFkLnB0aHJlYWRzW3B0aHJlYWRfcHRyXTtpZihwdGhyZWFkKXtHUk9XQUJMRV9IRUFQX0kzMigpW3B0aHJlYWRfcHRyKzEyPj4yXT0wO3ZhciB3b3JrZXI9cHRocmVhZC53b3JrZXI7UFRocmVhZC5yZXR1cm5Xb3JrZXJUb1Bvb2wod29ya2VyKX19dmFyIFBUaHJlYWQ9e3VudXNlZFdvcmtlcnM6W10scnVubmluZ1dvcmtlcnM6W10saW5pdE1haW5UaHJlYWRCbG9jazpmdW5jdGlvbigpe3ZhciBwdGhyZWFkUG9vbFNpemU9TWF0aC5taW4oNCxNYXRoLm1heCgxLChuYXZpZ2F0b3IuaGFyZHdhcmVDb25jdXJyZW5jeXx8MSkvMikpO2Zvcih2YXIgaT0wO2k8cHRocmVhZFBvb2xTaXplOysraSl7UFRocmVhZC5hbGxvY2F0ZVVudXNlZFdvcmtlcigpfX0saW5pdFJ1bnRpbWU6ZnVuY3Rpb24oKXt2YXIgdGI9X21hbGxvYygyMjgpO2Zvcih2YXIgaT0wO2k8MjI4LzQ7KytpKUdST1dBQkxFX0hFQVBfVTMyKClbdGIvNCtpXT0wO0dST1dBQkxFX0hFQVBfSTMyKClbdGIrMTI+PjJdPXRiO3ZhciBoZWFkUHRyPXRiKzE1MjtHUk9XQUJMRV9IRUFQX0kzMigpW2hlYWRQdHI+PjJdPWhlYWRQdHI7dmFyIHRsc01lbW9yeT1fbWFsbG9jKDUxMik7Zm9yKHZhciBpPTA7aTwxMjg7KytpKUdST1dBQkxFX0hFQVBfVTMyKClbdGxzTWVtb3J5LzQraV09MDtBdG9taWNzLnN0b3JlKEdST1dBQkxFX0hFQVBfVTMyKCksdGIrMTAwPj4yLHRsc01lbW9yeSk7QXRvbWljcy5zdG9yZShHUk9XQUJMRV9IRUFQX1UzMigpLHRiKzQwPj4yLHRiKTtfX2Vtc2NyaXB0ZW5fdGhyZWFkX2luaXQodGIsIUVOVklST05NRU5UX0lTX1dPUktFUiwxKTtfZW1zY3JpcHRlbl9yZWdpc3Rlcl9tYWluX2Jyb3dzZXJfdGhyZWFkX2lkKHRiKX0saW5pdFdvcmtlcjpmdW5jdGlvbigpe30scHRocmVhZHM6e30sdGhyZWFkRXhpdEhhbmRsZXJzOltdLHNldFRocmVhZFN0YXR1czpmdW5jdGlvbigpe30scnVuRXhpdEhhbmRsZXJzOmZ1bmN0aW9uKCl7d2hpbGUoUFRocmVhZC50aHJlYWRFeGl0SGFuZGxlcnMubGVuZ3RoPjApe1BUaHJlYWQudGhyZWFkRXhpdEhhbmRsZXJzLnBvcCgpKCl9aWYoRU5WSVJPTk1FTlRfSVNfUFRIUkVBRCYmX3B0aHJlYWRfc2VsZigpKV9fX3B0aHJlYWRfdHNkX3J1bl9kdG9ycygpfSxydW5FeGl0SGFuZGxlcnNBbmREZWluaXRUaHJlYWQ6ZnVuY3Rpb24odGIsZXhpdENvZGUpe0F0b21pY3Muc3RvcmUoR1JPV0FCTEVfSEVBUF9VMzIoKSx0Yis1Nj4+MiwxKTtBdG9taWNzLnN0b3JlKEdST1dBQkxFX0hFQVBfVTMyKCksdGIrNjA+PjIsMCk7UFRocmVhZC5ydW5FeGl0SGFuZGxlcnMoKTtBdG9taWNzLnN0b3JlKEdST1dBQkxFX0hFQVBfVTMyKCksdGIrND4+MixleGl0Q29kZSk7QXRvbWljcy5zdG9yZShHUk9XQUJMRV9IRUFQX1UzMigpLHRiKzA+PjIsMSk7X2Vtc2NyaXB0ZW5fZnV0ZXhfd2FrZSh0YiswLDIxNDc0ODM2NDcpO19fZW1zY3JpcHRlbl90aHJlYWRfaW5pdCgwLDAsMCl9LHRocmVhZEV4aXQ6ZnVuY3Rpb24oZXhpdENvZGUpe3ZhciB0Yj1fcHRocmVhZF9zZWxmKCk7aWYodGIpe1BUaHJlYWQucnVuRXhpdEhhbmRsZXJzQW5kRGVpbml0VGhyZWFkKHRiLGV4aXRDb2RlKTtpZihFTlZJUk9OTUVOVF9JU19QVEhSRUFEKXtwb3N0TWVzc2FnZSh7XCJjbWRcIjpcImV4aXRcIn0pfX19LHRocmVhZENhbmNlbDpmdW5jdGlvbigpe1BUaHJlYWQucnVuRXhpdEhhbmRsZXJzQW5kRGVpbml0VGhyZWFkKF9wdGhyZWFkX3NlbGYoKSwtMSk7cG9zdE1lc3NhZ2Uoe1wiY21kXCI6XCJjYW5jZWxEb25lXCJ9KX0sdGVybWluYXRlQWxsVGhyZWFkczpmdW5jdGlvbigpe2Zvcih2YXIgdCBpbiBQVGhyZWFkLnB0aHJlYWRzKXt2YXIgcHRocmVhZD1QVGhyZWFkLnB0aHJlYWRzW3RdO2lmKHB0aHJlYWQmJnB0aHJlYWQud29ya2VyKXtQVGhyZWFkLnJldHVybldvcmtlclRvUG9vbChwdGhyZWFkLndvcmtlcil9fVBUaHJlYWQucHRocmVhZHM9e307Zm9yKHZhciBpPTA7aTxQVGhyZWFkLnVudXNlZFdvcmtlcnMubGVuZ3RoOysraSl7dmFyIHdvcmtlcj1QVGhyZWFkLnVudXNlZFdvcmtlcnNbaV07d29ya2VyLnRlcm1pbmF0ZSgpfVBUaHJlYWQudW51c2VkV29ya2Vycz1bXTtmb3IodmFyIGk9MDtpPFBUaHJlYWQucnVubmluZ1dvcmtlcnMubGVuZ3RoOysraSl7dmFyIHdvcmtlcj1QVGhyZWFkLnJ1bm5pbmdXb3JrZXJzW2ldO3ZhciBwdGhyZWFkPXdvcmtlci5wdGhyZWFkO1BUaHJlYWQuZnJlZVRocmVhZERhdGEocHRocmVhZCk7d29ya2VyLnRlcm1pbmF0ZSgpfVBUaHJlYWQucnVubmluZ1dvcmtlcnM9W119LGZyZWVUaHJlYWREYXRhOmZ1bmN0aW9uKHB0aHJlYWQpe2lmKCFwdGhyZWFkKXJldHVybjtpZihwdGhyZWFkLnRocmVhZEluZm9TdHJ1Y3Qpe3ZhciB0bHNNZW1vcnk9R1JPV0FCTEVfSEVBUF9JMzIoKVtwdGhyZWFkLnRocmVhZEluZm9TdHJ1Y3QrMTAwPj4yXTtHUk9XQUJMRV9IRUFQX0kzMigpW3B0aHJlYWQudGhyZWFkSW5mb1N0cnVjdCsxMDA+PjJdPTA7X2ZyZWUodGxzTWVtb3J5KTtfZnJlZShwdGhyZWFkLnRocmVhZEluZm9TdHJ1Y3QpfXB0aHJlYWQudGhyZWFkSW5mb1N0cnVjdD0wO2lmKHB0aHJlYWQuYWxsb2NhdGVkT3duU3RhY2smJnB0aHJlYWQuc3RhY2tCYXNlKV9mcmVlKHB0aHJlYWQuc3RhY2tCYXNlKTtwdGhyZWFkLnN0YWNrQmFzZT0wO2lmKHB0aHJlYWQud29ya2VyKXB0aHJlYWQud29ya2VyLnB0aHJlYWQ9bnVsbH0scmV0dXJuV29ya2VyVG9Qb29sOmZ1bmN0aW9uKHdvcmtlcil7UFRocmVhZC5ydW5XaXRob3V0TWFpblRocmVhZFF1ZXVlZENhbGxzKGZ1bmN0aW9uKCl7ZGVsZXRlIFBUaHJlYWQucHRocmVhZHNbd29ya2VyLnB0aHJlYWQudGhyZWFkSW5mb1N0cnVjdF07UFRocmVhZC51bnVzZWRXb3JrZXJzLnB1c2god29ya2VyKTtQVGhyZWFkLnJ1bm5pbmdXb3JrZXJzLnNwbGljZShQVGhyZWFkLnJ1bm5pbmdXb3JrZXJzLmluZGV4T2Yod29ya2VyKSwxKTtQVGhyZWFkLmZyZWVUaHJlYWREYXRhKHdvcmtlci5wdGhyZWFkKTt3b3JrZXIucHRocmVhZD11bmRlZmluZWR9KX0scnVuV2l0aG91dE1haW5UaHJlYWRRdWV1ZWRDYWxsczpmdW5jdGlvbihmdW5jKXtHUk9XQUJMRV9IRUFQX0kzMigpW19fZW1zY3JpcHRlbl9hbGxvd19tYWluX3J1bnRpbWVfcXVldWVkX2NhbGxzPj4yXT0wO3RyeXtmdW5jKCl9ZmluYWxseXtHUk9XQUJMRV9IRUFQX0kzMigpW19fZW1zY3JpcHRlbl9hbGxvd19tYWluX3J1bnRpbWVfcXVldWVkX2NhbGxzPj4yXT0xfX0scmVjZWl2ZU9iamVjdFRyYW5zZmVyOmZ1bmN0aW9uKGRhdGEpe30sbG9hZFdhc21Nb2R1bGVUb1dvcmtlcjpmdW5jdGlvbih3b3JrZXIsb25GaW5pc2hlZExvYWRpbmcpe3dvcmtlci5vbm1lc3NhZ2U9ZnVuY3Rpb24oZSl7dmFyIGQ9ZVtcImRhdGFcIl07dmFyIGNtZD1kW1wiY21kXCJdO2lmKHdvcmtlci5wdGhyZWFkKVBUaHJlYWQuY3VycmVudFByb3hpZWRPcGVyYXRpb25DYWxsZXJUaHJlYWQ9d29ya2VyLnB0aHJlYWQudGhyZWFkSW5mb1N0cnVjdDtpZihkW1widGFyZ2V0VGhyZWFkXCJdJiZkW1widGFyZ2V0VGhyZWFkXCJdIT1fcHRocmVhZF9zZWxmKCkpe3ZhciB0aHJlYWQ9UFRocmVhZC5wdGhyZWFkc1tkLnRhcmdldFRocmVhZF07aWYodGhyZWFkKXt0aHJlYWQud29ya2VyLnBvc3RNZXNzYWdlKGUuZGF0YSxkW1widHJhbnNmZXJMaXN0XCJdKX1lbHNle2NvbnNvbGUuZXJyb3IoJ0ludGVybmFsIGVycm9yISBXb3JrZXIgc2VudCBhIG1lc3NhZ2UgXCInK2NtZCsnXCIgdG8gdGFyZ2V0IHB0aHJlYWQgJytkW1widGFyZ2V0VGhyZWFkXCJdK1wiLCBidXQgdGhhdCB0aHJlYWQgbm8gbG9uZ2VyIGV4aXN0cyFcIil9UFRocmVhZC5jdXJyZW50UHJveGllZE9wZXJhdGlvbkNhbGxlclRocmVhZD11bmRlZmluZWQ7cmV0dXJufWlmKGNtZD09PVwicHJvY2Vzc1F1ZXVlZE1haW5UaHJlYWRXb3JrXCIpe19lbXNjcmlwdGVuX21haW5fdGhyZWFkX3Byb2Nlc3NfcXVldWVkX2NhbGxzKCl9ZWxzZSBpZihjbWQ9PT1cInNwYXduVGhyZWFkXCIpe3NwYXduVGhyZWFkKGUuZGF0YSl9ZWxzZSBpZihjbWQ9PT1cImNsZWFudXBUaHJlYWRcIil7Y2xlYW51cFRocmVhZChkW1widGhyZWFkXCJdKX1lbHNlIGlmKGNtZD09PVwia2lsbFRocmVhZFwiKXtraWxsVGhyZWFkKGRbXCJ0aHJlYWRcIl0pfWVsc2UgaWYoY21kPT09XCJjYW5jZWxUaHJlYWRcIil7Y2FuY2VsVGhyZWFkKGRbXCJ0aHJlYWRcIl0pfWVsc2UgaWYoY21kPT09XCJsb2FkZWRcIil7d29ya2VyLmxvYWRlZD10cnVlO2lmKG9uRmluaXNoZWRMb2FkaW5nKW9uRmluaXNoZWRMb2FkaW5nKHdvcmtlcik7aWYod29ya2VyLnJ1blB0aHJlYWQpe3dvcmtlci5ydW5QdGhyZWFkKCk7ZGVsZXRlIHdvcmtlci5ydW5QdGhyZWFkfX1lbHNlIGlmKGNtZD09PVwicHJpbnRcIil7b3V0KFwiVGhyZWFkIFwiK2RbXCJ0aHJlYWRJZFwiXStcIjogXCIrZFtcInRleHRcIl0pfWVsc2UgaWYoY21kPT09XCJwcmludEVyclwiKXtlcnIoXCJUaHJlYWQgXCIrZFtcInRocmVhZElkXCJdK1wiOiBcIitkW1widGV4dFwiXSl9ZWxzZSBpZihjbWQ9PT1cImFsZXJ0XCIpe2FsZXJ0KFwiVGhyZWFkIFwiK2RbXCJ0aHJlYWRJZFwiXStcIjogXCIrZFtcInRleHRcIl0pfWVsc2UgaWYoY21kPT09XCJleGl0XCIpe3ZhciBkZXRhY2hlZD13b3JrZXIucHRocmVhZCYmQXRvbWljcy5sb2FkKEdST1dBQkxFX0hFQVBfVTMyKCksd29ya2VyLnB0aHJlYWQudGhyZWFkSW5mb1N0cnVjdCs2ND4+Mik7aWYoZGV0YWNoZWQpe1BUaHJlYWQucmV0dXJuV29ya2VyVG9Qb29sKHdvcmtlcil9fWVsc2UgaWYoY21kPT09XCJleGl0UHJvY2Vzc1wiKXt0cnl7ZXhpdChkW1wicmV0dXJuQ29kZVwiXSl9Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIEV4aXRTdGF0dXMpcmV0dXJuO3Rocm93IGV9fWVsc2UgaWYoY21kPT09XCJjYW5jZWxEb25lXCIpe1BUaHJlYWQucmV0dXJuV29ya2VyVG9Qb29sKHdvcmtlcil9ZWxzZSBpZihjbWQ9PT1cIm9iamVjdFRyYW5zZmVyXCIpe1BUaHJlYWQucmVjZWl2ZU9iamVjdFRyYW5zZmVyKGUuZGF0YSl9ZWxzZSBpZihlLmRhdGEudGFyZ2V0PT09XCJzZXRpbW1lZGlhdGVcIil7d29ya2VyLnBvc3RNZXNzYWdlKGUuZGF0YSl9ZWxzZXtlcnIoXCJ3b3JrZXIgc2VudCBhbiB1bmtub3duIGNvbW1hbmQgXCIrY21kKX1QVGhyZWFkLmN1cnJlbnRQcm94aWVkT3BlcmF0aW9uQ2FsbGVyVGhyZWFkPXVuZGVmaW5lZH07d29ya2VyLm9uZXJyb3I9ZnVuY3Rpb24oZSl7ZXJyKFwicHRocmVhZCBzZW50IGFuIGVycm9yISBcIitlLmZpbGVuYW1lK1wiOlwiK2UubGluZW5vK1wiOiBcIitlLm1lc3NhZ2UpfTtpZihFTlZJUk9OTUVOVF9JU19OT0RFKXt3b3JrZXIub24oXCJtZXNzYWdlXCIsZnVuY3Rpb24oZGF0YSl7d29ya2VyLm9ubWVzc2FnZSh7ZGF0YTpkYXRhfSl9KTt3b3JrZXIub24oXCJlcnJvclwiLGZ1bmN0aW9uKGRhdGEpe3dvcmtlci5vbmVycm9yKGRhdGEpfSk7d29ya2VyLm9uKFwiZXhpdFwiLGZ1bmN0aW9uKGRhdGEpe30pfXdvcmtlci5wb3N0TWVzc2FnZSh7XCJjbWRcIjpcImxvYWRcIixcInVybE9yQmxvYlwiOk1vZHVsZVtcIm1haW5TY3JpcHRVcmxPckJsb2JcIl18fF9zY3JpcHREaXIsXCJ3YXNtTWVtb3J5XCI6d2FzbU1lbW9yeSxcIndhc21Nb2R1bGVcIjp3YXNtTW9kdWxlfSl9LGFsbG9jYXRlVW51c2VkV29ya2VyOmZ1bmN0aW9uKCl7dmFyIHB0aHJlYWRNYWluSnM9bG9jYXRlRmlsZShcInRmanMtYmFja2VuZC13YXNtLXRocmVhZGVkLXNpbWQud29ya2VyLmpzXCIpO1BUaHJlYWQudW51c2VkV29ya2Vycy5wdXNoKG5ldyBXb3JrZXIocHRocmVhZE1haW5KcykpfSxnZXROZXdXb3JrZXI6ZnVuY3Rpb24oKXtpZihQVGhyZWFkLnVudXNlZFdvcmtlcnMubGVuZ3RoPT0wKXtQVGhyZWFkLmFsbG9jYXRlVW51c2VkV29ya2VyKCk7UFRocmVhZC5sb2FkV2FzbU1vZHVsZVRvV29ya2VyKFBUaHJlYWQudW51c2VkV29ya2Vyc1swXSl9aWYoUFRocmVhZC51bnVzZWRXb3JrZXJzLmxlbmd0aD4wKXJldHVybiBQVGhyZWFkLnVudXNlZFdvcmtlcnMucG9wKCk7ZWxzZSByZXR1cm4gbnVsbH0sYnVzeVNwaW5XYWl0OmZ1bmN0aW9uKG1zZWNzKXt2YXIgdD1wZXJmb3JtYW5jZS5ub3coKSttc2Vjczt3aGlsZShwZXJmb3JtYW5jZS5ub3coKTx0KXt9fX07ZnVuY3Rpb24gZXN0YWJsaXNoU3RhY2tTcGFjZShzdGFja1RvcCxzdGFja01heCl7X2Vtc2NyaXB0ZW5fc3RhY2tfc2V0X2xpbWl0cyhzdGFja1RvcCxzdGFja01heCk7c3RhY2tSZXN0b3JlKHN0YWNrVG9wKX1Nb2R1bGVbXCJlc3RhYmxpc2hTdGFja1NwYWNlXCJdPWVzdGFibGlzaFN0YWNrU3BhY2U7ZnVuY3Rpb24gZ2V0Tm9FeGl0UnVudGltZSgpe3JldHVybiBub0V4aXRSdW50aW1lfU1vZHVsZVtcImdldE5vRXhpdFJ1bnRpbWVcIl09Z2V0Tm9FeGl0UnVudGltZTtmdW5jdGlvbiBpbnZva2VFbnRyeVBvaW50KHB0cixhcmcpe3JldHVybiB3YXNtVGFibGUuZ2V0KHB0cikoYXJnKX1Nb2R1bGVbXCJpbnZva2VFbnRyeVBvaW50XCJdPWludm9rZUVudHJ5UG9pbnQ7ZnVuY3Rpb24gX19fYXNzZXJ0X2ZhaWwoY29uZGl0aW9uLGZpbGVuYW1lLGxpbmUsZnVuYyl7YWJvcnQoXCJBc3NlcnRpb24gZmFpbGVkOiBcIitVVEY4VG9TdHJpbmcoY29uZGl0aW9uKStcIiwgYXQ6IFwiK1tmaWxlbmFtZT9VVEY4VG9TdHJpbmcoZmlsZW5hbWUpOlwidW5rbm93biBmaWxlbmFtZVwiLGxpbmUsZnVuYz9VVEY4VG9TdHJpbmcoZnVuYyk6XCJ1bmtub3duIGZ1bmN0aW9uXCJdKX1mdW5jdGlvbiBfX19jYWxsX21haW4oYXJnYyxhcmd2KXt2YXIgcmV0dXJuQ29kZT1fbWFpbihhcmdjLGFyZ3YpfXZhciBfZW1zY3JpcHRlbl9nZXRfbm93O2lmKEVOVklST05NRU5UX0lTX05PREUpe19lbXNjcmlwdGVuX2dldF9ub3c9ZnVuY3Rpb24oKXt2YXIgdD1wcm9jZXNzW1wiaHJ0aW1lXCJdKCk7cmV0dXJuIHRbMF0qMWUzK3RbMV0vMWU2fX1lbHNlIGlmKEVOVklST05NRU5UX0lTX1BUSFJFQUQpe19lbXNjcmlwdGVuX2dldF9ub3c9ZnVuY3Rpb24oKXtyZXR1cm4gcGVyZm9ybWFuY2Uubm93KCktTW9kdWxlW1wiX19wZXJmb3JtYW5jZV9ub3dfY2xvY2tfZHJpZnRcIl19fWVsc2UgaWYodHlwZW9mIGRhdGVOb3chPT1cInVuZGVmaW5lZFwiKXtfZW1zY3JpcHRlbl9nZXRfbm93PWRhdGVOb3d9ZWxzZSBfZW1zY3JpcHRlbl9nZXRfbm93PWZ1bmN0aW9uKCl7cmV0dXJuIHBlcmZvcm1hbmNlLm5vdygpfTtmdW5jdGlvbiBzZXRFcnJObyh2YWx1ZSl7R1JPV0FCTEVfSEVBUF9JMzIoKVtfX19lcnJub19sb2NhdGlvbigpPj4yXT12YWx1ZTtyZXR1cm4gdmFsdWV9ZnVuY3Rpb24gX2F0ZXhpdChmdW5jLGFyZyl7aWYoRU5WSVJPTk1FTlRfSVNfUFRIUkVBRClyZXR1cm4gX2Vtc2NyaXB0ZW5fcHJveHlfdG9fbWFpbl90aHJlYWRfanMoMSwxLGZ1bmMsYXJnKX1mdW5jdGlvbiBfX2Vtc2NyaXB0ZW5fbm90aWZ5X3RocmVhZF9xdWV1ZSh0YXJnZXRUaHJlYWRJZCxtYWluVGhyZWFkSWQpe2lmKHRhcmdldFRocmVhZElkPT1tYWluVGhyZWFkSWQpe3Bvc3RNZXNzYWdlKHtcImNtZFwiOlwicHJvY2Vzc1F1ZXVlZE1haW5UaHJlYWRXb3JrXCJ9KX1lbHNlIGlmKEVOVklST05NRU5UX0lTX1BUSFJFQUQpe3Bvc3RNZXNzYWdlKHtcInRhcmdldFRocmVhZFwiOnRhcmdldFRocmVhZElkLFwiY21kXCI6XCJwcm9jZXNzVGhyZWFkUXVldWVcIn0pfWVsc2V7dmFyIHB0aHJlYWQ9UFRocmVhZC5wdGhyZWFkc1t0YXJnZXRUaHJlYWRJZF07dmFyIHdvcmtlcj1wdGhyZWFkJiZwdGhyZWFkLndvcmtlcjtpZighd29ya2VyKXtyZXR1cm59d29ya2VyLnBvc3RNZXNzYWdlKHtcImNtZFwiOlwicHJvY2Vzc1RocmVhZFF1ZXVlXCJ9KX1yZXR1cm4gMX1mdW5jdGlvbiBfYWJvcnQoKXthYm9ydCgpfWZ1bmN0aW9uIF9lbXNjcmlwdGVuX2FzbV9jb25zdF9pbnQoY29kZSxzaWdQdHIsYXJnYnVmKXt2YXIgYXJncz1yZWFkQXNtQ29uc3RBcmdzKHNpZ1B0cixhcmdidWYpO3JldHVybiBBU01fQ09OU1RTW2NvZGVdLmFwcGx5KG51bGwsYXJncyl9ZnVuY3Rpb24gX2Vtc2NyaXB0ZW5fY29uZGl0aW9uYWxfc2V0X2N1cnJlbnRfdGhyZWFkX3N0YXR1cyhleHBlY3RlZFN0YXR1cyxuZXdTdGF0dXMpe31mdW5jdGlvbiBfZW1zY3JpcHRlbl9mdXRleF93YWl0KGFkZHIsdmFsLHRpbWVvdXQpe2lmKGFkZHI8PTB8fGFkZHI+R1JPV0FCTEVfSEVBUF9JOCgpLmxlbmd0aHx8YWRkciYzIT0wKXJldHVybi0yODtpZighRU5WSVJPTk1FTlRfSVNfV0VCKXt2YXIgcmV0PUF0b21pY3Mud2FpdChHUk9XQUJMRV9IRUFQX0kzMigpLGFkZHI+PjIsdmFsLHRpbWVvdXQpO2lmKHJldD09PVwidGltZWQtb3V0XCIpcmV0dXJuLTczO2lmKHJldD09PVwibm90LWVxdWFsXCIpcmV0dXJuLTY7aWYocmV0PT09XCJva1wiKXJldHVybiAwO3Rocm93XCJBdG9taWNzLndhaXQgcmV0dXJuZWQgYW4gdW5leHBlY3RlZCB2YWx1ZSBcIityZXR9ZWxzZXtpZihBdG9taWNzLmxvYWQoR1JPV0FCTEVfSEVBUF9JMzIoKSxhZGRyPj4yKSE9dmFsKXtyZXR1cm4tNn12YXIgdE5vdz1wZXJmb3JtYW5jZS5ub3coKTt2YXIgdEVuZD10Tm93K3RpbWVvdXQ7dmFyIGxhc3RBZGRyPUF0b21pY3MuZXhjaGFuZ2UoR1JPV0FCTEVfSEVBUF9JMzIoKSxfX2Vtc2NyaXB0ZW5fbWFpbl90aHJlYWRfZnV0ZXg+PjIsYWRkcik7d2hpbGUoMSl7dE5vdz1wZXJmb3JtYW5jZS5ub3coKTtpZih0Tm93PnRFbmQpe2xhc3RBZGRyPUF0b21pY3MuZXhjaGFuZ2UoR1JPV0FCTEVfSEVBUF9JMzIoKSxfX2Vtc2NyaXB0ZW5fbWFpbl90aHJlYWRfZnV0ZXg+PjIsMCk7cmV0dXJuLTczfWxhc3RBZGRyPUF0b21pY3MuZXhjaGFuZ2UoR1JPV0FCTEVfSEVBUF9JMzIoKSxfX2Vtc2NyaXB0ZW5fbWFpbl90aHJlYWRfZnV0ZXg+PjIsMCk7aWYobGFzdEFkZHI9PTApe2JyZWFrfV9lbXNjcmlwdGVuX21haW5fdGhyZWFkX3Byb2Nlc3NfcXVldWVkX2NhbGxzKCk7aWYoQXRvbWljcy5sb2FkKEdST1dBQkxFX0hFQVBfSTMyKCksYWRkcj4+MikhPXZhbCl7cmV0dXJuLTZ9bGFzdEFkZHI9QXRvbWljcy5leGNoYW5nZShHUk9XQUJMRV9IRUFQX0kzMigpLF9fZW1zY3JpcHRlbl9tYWluX3RocmVhZF9mdXRleD4+MixhZGRyKX1yZXR1cm4gMH19ZnVuY3Rpb24gX2Vtc2NyaXB0ZW5fbWVtY3B5X2JpZyhkZXN0LHNyYyxudW0pe0dST1dBQkxFX0hFQVBfVTgoKS5jb3B5V2l0aGluKGRlc3Qsc3JjLHNyYytudW0pfWZ1bmN0aW9uIF9lbXNjcmlwdGVuX251bV9sb2dpY2FsX2NvcmVzKCl7aWYoRU5WSVJPTk1FTlRfSVNfTk9ERSlyZXR1cm4gcmVxdWlyZShcIm9zXCIpLmNwdXMoKS5sZW5ndGg7cmV0dXJuIG5hdmlnYXRvcltcImhhcmR3YXJlQ29uY3VycmVuY3lcIl19ZnVuY3Rpb24gX2Vtc2NyaXB0ZW5fcHJveHlfdG9fbWFpbl90aHJlYWRfanMoaW5kZXgsc3luYyl7dmFyIG51bUNhbGxBcmdzPWFyZ3VtZW50cy5sZW5ndGgtMjt2YXIgc3RhY2s9c3RhY2tTYXZlKCk7dmFyIHNlcmlhbGl6ZWROdW1DYWxsQXJncz1udW1DYWxsQXJnczt2YXIgYXJncz1zdGFja0FsbG9jKHNlcmlhbGl6ZWROdW1DYWxsQXJncyo4KTt2YXIgYj1hcmdzPj4zO2Zvcih2YXIgaT0wO2k8bnVtQ2FsbEFyZ3M7aSsrKXt2YXIgYXJnPWFyZ3VtZW50c1syK2ldO0dST1dBQkxFX0hFQVBfRjY0KClbYitpXT1hcmd9dmFyIHJldD1fZW1zY3JpcHRlbl9ydW5faW5fbWFpbl9ydW50aW1lX3RocmVhZF9qcyhpbmRleCxzZXJpYWxpemVkTnVtQ2FsbEFyZ3MsYXJncyxzeW5jKTtzdGFja1Jlc3RvcmUoc3RhY2spO3JldHVybiByZXR9dmFyIF9lbXNjcmlwdGVuX3JlY2VpdmVfb25fbWFpbl90aHJlYWRfanNfY2FsbEFyZ3M9W107dmFyIHJlYWRBc21Db25zdEFyZ3NBcnJheT1bXTtmdW5jdGlvbiByZWFkQXNtQ29uc3RBcmdzKHNpZ1B0cixidWYpe3JlYWRBc21Db25zdEFyZ3NBcnJheS5sZW5ndGg9MDt2YXIgY2g7YnVmPj49Mjt3aGlsZShjaD1HUk9XQUJMRV9IRUFQX1U4KClbc2lnUHRyKytdKXt2YXIgZG91YmxlPWNoPDEwNTtpZihkb3VibGUmJmJ1ZiYxKWJ1ZisrO3JlYWRBc21Db25zdEFyZ3NBcnJheS5wdXNoKGRvdWJsZT9HUk9XQUJMRV9IRUFQX0Y2NCgpW2J1ZisrPj4xXTpHUk9XQUJMRV9IRUFQX0kzMigpW2J1Zl0pOysrYnVmfXJldHVybiByZWFkQXNtQ29uc3RBcmdzQXJyYXl9ZnVuY3Rpb24gX2Vtc2NyaXB0ZW5fcmVjZWl2ZV9vbl9tYWluX3RocmVhZF9qcyhpbmRleCxudW1DYWxsQXJncyxhcmdzKXtfZW1zY3JpcHRlbl9yZWNlaXZlX29uX21haW5fdGhyZWFkX2pzX2NhbGxBcmdzLmxlbmd0aD1udW1DYWxsQXJnczt2YXIgYj1hcmdzPj4zO2Zvcih2YXIgaT0wO2k8bnVtQ2FsbEFyZ3M7aSsrKXtfZW1zY3JpcHRlbl9yZWNlaXZlX29uX21haW5fdGhyZWFkX2pzX2NhbGxBcmdzW2ldPUdST1dBQkxFX0hFQVBfRjY0KClbYitpXX12YXIgaXNFbUFzbUNvbnN0PWluZGV4PDA7dmFyIGZ1bmM9IWlzRW1Bc21Db25zdD9wcm94aWVkRnVuY3Rpb25UYWJsZVtpbmRleF06QVNNX0NPTlNUU1staW5kZXgtMV07cmV0dXJuIGZ1bmMuYXBwbHkobnVsbCxfZW1zY3JpcHRlbl9yZWNlaXZlX29uX21haW5fdGhyZWFkX2pzX2NhbGxBcmdzKX1mdW5jdGlvbiBfZW1zY3JpcHRlbl9nZXRfaGVhcF9zaXplKCl7cmV0dXJuIEdST1dBQkxFX0hFQVBfVTgoKS5sZW5ndGh9ZnVuY3Rpb24gZW1zY3JpcHRlbl9yZWFsbG9jX2J1ZmZlcihzaXplKXt0cnl7d2FzbU1lbW9yeS5ncm93KHNpemUtYnVmZmVyLmJ5dGVMZW5ndGgrNjU1MzU+Pj4xNik7dXBkYXRlR2xvYmFsQnVmZmVyQW5kVmlld3Mod2FzbU1lbW9yeS5idWZmZXIpO3JldHVybiAxfWNhdGNoKGUpe319ZnVuY3Rpb24gX2Vtc2NyaXB0ZW5fcmVzaXplX2hlYXAocmVxdWVzdGVkU2l6ZSl7dmFyIG9sZFNpemU9X2Vtc2NyaXB0ZW5fZ2V0X2hlYXBfc2l6ZSgpO2lmKHJlcXVlc3RlZFNpemU8PW9sZFNpemUpe3JldHVybiBmYWxzZX12YXIgbWF4SGVhcFNpemU9MjE0NzQ4MzY0ODtpZihyZXF1ZXN0ZWRTaXplPm1heEhlYXBTaXplKXtyZXR1cm4gZmFsc2V9Zm9yKHZhciBjdXREb3duPTE7Y3V0RG93bjw9NDtjdXREb3duKj0yKXt2YXIgb3Zlckdyb3duSGVhcFNpemU9b2xkU2l6ZSooMSsuMi9jdXREb3duKTtvdmVyR3Jvd25IZWFwU2l6ZT1NYXRoLm1pbihvdmVyR3Jvd25IZWFwU2l6ZSxyZXF1ZXN0ZWRTaXplKzEwMDY2MzI5Nik7dmFyIG5ld1NpemU9TWF0aC5taW4obWF4SGVhcFNpemUsYWxpZ25VcChNYXRoLm1heChyZXF1ZXN0ZWRTaXplLG92ZXJHcm93bkhlYXBTaXplKSw2NTUzNikpO3ZhciByZXBsYWNlbWVudD1lbXNjcmlwdGVuX3JlYWxsb2NfYnVmZmVyKG5ld1NpemUpO2lmKHJlcGxhY2VtZW50KXtyZXR1cm4gdHJ1ZX19cmV0dXJuIGZhbHNlfXZhciBKU0V2ZW50cz17aW5FdmVudEhhbmRsZXI6MCxyZW1vdmVBbGxFdmVudExpc3RlbmVyczpmdW5jdGlvbigpe2Zvcih2YXIgaT1KU0V2ZW50cy5ldmVudEhhbmRsZXJzLmxlbmd0aC0xO2k+PTA7LS1pKXtKU0V2ZW50cy5fcmVtb3ZlSGFuZGxlcihpKX1KU0V2ZW50cy5ldmVudEhhbmRsZXJzPVtdO0pTRXZlbnRzLmRlZmVycmVkQ2FsbHM9W119LHJlZ2lzdGVyUmVtb3ZlRXZlbnRMaXN0ZW5lcnM6ZnVuY3Rpb24oKXtpZighSlNFdmVudHMucmVtb3ZlRXZlbnRMaXN0ZW5lcnNSZWdpc3RlcmVkKXtfX0FURVhJVF9fLnB1c2goSlNFdmVudHMucmVtb3ZlQWxsRXZlbnRMaXN0ZW5lcnMpO0pTRXZlbnRzLnJlbW92ZUV2ZW50TGlzdGVuZXJzUmVnaXN0ZXJlZD10cnVlfX0sZGVmZXJyZWRDYWxsczpbXSxkZWZlckNhbGw6ZnVuY3Rpb24odGFyZ2V0RnVuY3Rpb24scHJlY2VkZW5jZSxhcmdzTGlzdCl7ZnVuY3Rpb24gYXJyYXlzSGF2ZUVxdWFsQ29udGVudChhcnJBLGFyckIpe2lmKGFyckEubGVuZ3RoIT1hcnJCLmxlbmd0aClyZXR1cm4gZmFsc2U7Zm9yKHZhciBpIGluIGFyckEpe2lmKGFyckFbaV0hPWFyckJbaV0pcmV0dXJuIGZhbHNlfXJldHVybiB0cnVlfWZvcih2YXIgaSBpbiBKU0V2ZW50cy5kZWZlcnJlZENhbGxzKXt2YXIgY2FsbD1KU0V2ZW50cy5kZWZlcnJlZENhbGxzW2ldO2lmKGNhbGwudGFyZ2V0RnVuY3Rpb249PXRhcmdldEZ1bmN0aW9uJiZhcnJheXNIYXZlRXF1YWxDb250ZW50KGNhbGwuYXJnc0xpc3QsYXJnc0xpc3QpKXtyZXR1cm59fUpTRXZlbnRzLmRlZmVycmVkQ2FsbHMucHVzaCh7dGFyZ2V0RnVuY3Rpb246dGFyZ2V0RnVuY3Rpb24scHJlY2VkZW5jZTpwcmVjZWRlbmNlLGFyZ3NMaXN0OmFyZ3NMaXN0fSk7SlNFdmVudHMuZGVmZXJyZWRDYWxscy5zb3J0KGZ1bmN0aW9uKHgseSl7cmV0dXJuIHgucHJlY2VkZW5jZTx5LnByZWNlZGVuY2V9KX0scmVtb3ZlRGVmZXJyZWRDYWxsczpmdW5jdGlvbih0YXJnZXRGdW5jdGlvbil7Zm9yKHZhciBpPTA7aTxKU0V2ZW50cy5kZWZlcnJlZENhbGxzLmxlbmd0aDsrK2kpe2lmKEpTRXZlbnRzLmRlZmVycmVkQ2FsbHNbaV0udGFyZ2V0RnVuY3Rpb249PXRhcmdldEZ1bmN0aW9uKXtKU0V2ZW50cy5kZWZlcnJlZENhbGxzLnNwbGljZShpLDEpOy0taX19fSxjYW5QZXJmb3JtRXZlbnRIYW5kbGVyUmVxdWVzdHM6ZnVuY3Rpb24oKXtyZXR1cm4gSlNFdmVudHMuaW5FdmVudEhhbmRsZXImJkpTRXZlbnRzLmN1cnJlbnRFdmVudEhhbmRsZXIuYWxsb3dzRGVmZXJyZWRDYWxsc30scnVuRGVmZXJyZWRDYWxsczpmdW5jdGlvbigpe2lmKCFKU0V2ZW50cy5jYW5QZXJmb3JtRXZlbnRIYW5kbGVyUmVxdWVzdHMoKSl7cmV0dXJufWZvcih2YXIgaT0wO2k8SlNFdmVudHMuZGVmZXJyZWRDYWxscy5sZW5ndGg7KytpKXt2YXIgY2FsbD1KU0V2ZW50cy5kZWZlcnJlZENhbGxzW2ldO0pTRXZlbnRzLmRlZmVycmVkQ2FsbHMuc3BsaWNlKGksMSk7LS1pO2NhbGwudGFyZ2V0RnVuY3Rpb24uYXBwbHkobnVsbCxjYWxsLmFyZ3NMaXN0KX19LGV2ZW50SGFuZGxlcnM6W10scmVtb3ZlQWxsSGFuZGxlcnNPblRhcmdldDpmdW5jdGlvbih0YXJnZXQsZXZlbnRUeXBlU3RyaW5nKXtmb3IodmFyIGk9MDtpPEpTRXZlbnRzLmV2ZW50SGFuZGxlcnMubGVuZ3RoOysraSl7aWYoSlNFdmVudHMuZXZlbnRIYW5kbGVyc1tpXS50YXJnZXQ9PXRhcmdldCYmKCFldmVudFR5cGVTdHJpbmd8fGV2ZW50VHlwZVN0cmluZz09SlNFdmVudHMuZXZlbnRIYW5kbGVyc1tpXS5ldmVudFR5cGVTdHJpbmcpKXtKU0V2ZW50cy5fcmVtb3ZlSGFuZGxlcihpLS0pfX19LF9yZW1vdmVIYW5kbGVyOmZ1bmN0aW9uKGkpe3ZhciBoPUpTRXZlbnRzLmV2ZW50SGFuZGxlcnNbaV07aC50YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihoLmV2ZW50VHlwZVN0cmluZyxoLmV2ZW50TGlzdGVuZXJGdW5jLGgudXNlQ2FwdHVyZSk7SlNFdmVudHMuZXZlbnRIYW5kbGVycy5zcGxpY2UoaSwxKX0scmVnaXN0ZXJPclJlbW92ZUhhbmRsZXI6ZnVuY3Rpb24oZXZlbnRIYW5kbGVyKXt2YXIganNFdmVudEhhbmRsZXI9ZnVuY3Rpb24ganNFdmVudEhhbmRsZXIoZXZlbnQpeysrSlNFdmVudHMuaW5FdmVudEhhbmRsZXI7SlNFdmVudHMuY3VycmVudEV2ZW50SGFuZGxlcj1ldmVudEhhbmRsZXI7SlNFdmVudHMucnVuRGVmZXJyZWRDYWxscygpO2V2ZW50SGFuZGxlci5oYW5kbGVyRnVuYyhldmVudCk7SlNFdmVudHMucnVuRGVmZXJyZWRDYWxscygpOy0tSlNFdmVudHMuaW5FdmVudEhhbmRsZXJ9O2lmKGV2ZW50SGFuZGxlci5jYWxsYmFja2Z1bmMpe2V2ZW50SGFuZGxlci5ldmVudExpc3RlbmVyRnVuYz1qc0V2ZW50SGFuZGxlcjtldmVudEhhbmRsZXIudGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRIYW5kbGVyLmV2ZW50VHlwZVN0cmluZyxqc0V2ZW50SGFuZGxlcixldmVudEhhbmRsZXIudXNlQ2FwdHVyZSk7SlNFdmVudHMuZXZlbnRIYW5kbGVycy5wdXNoKGV2ZW50SGFuZGxlcik7SlNFdmVudHMucmVnaXN0ZXJSZW1vdmVFdmVudExpc3RlbmVycygpfWVsc2V7Zm9yKHZhciBpPTA7aTxKU0V2ZW50cy5ldmVudEhhbmRsZXJzLmxlbmd0aDsrK2kpe2lmKEpTRXZlbnRzLmV2ZW50SGFuZGxlcnNbaV0udGFyZ2V0PT1ldmVudEhhbmRsZXIudGFyZ2V0JiZKU0V2ZW50cy5ldmVudEhhbmRsZXJzW2ldLmV2ZW50VHlwZVN0cmluZz09ZXZlbnRIYW5kbGVyLmV2ZW50VHlwZVN0cmluZyl7SlNFdmVudHMuX3JlbW92ZUhhbmRsZXIoaS0tKX19fX0scXVldWVFdmVudEhhbmRsZXJPblRocmVhZF9paWlpOmZ1bmN0aW9uKHRhcmdldFRocmVhZCxldmVudEhhbmRsZXJGdW5jLGV2ZW50VHlwZUlkLGV2ZW50RGF0YSx1c2VyRGF0YSl7dmFyIHN0YWNrVG9wPXN0YWNrU2F2ZSgpO3ZhciB2YXJhcmdzPXN0YWNrQWxsb2MoMTIpO0dST1dBQkxFX0hFQVBfSTMyKClbdmFyYXJncz4+Ml09ZXZlbnRUeXBlSWQ7R1JPV0FCTEVfSEVBUF9JMzIoKVt2YXJhcmdzKzQ+PjJdPWV2ZW50RGF0YTtHUk9XQUJMRV9IRUFQX0kzMigpW3ZhcmFyZ3MrOD4+Ml09dXNlckRhdGE7X19lbXNjcmlwdGVuX2NhbGxfb25fdGhyZWFkKDAsdGFyZ2V0VGhyZWFkLDYzNzUzNDIwOCxldmVudEhhbmRsZXJGdW5jLGV2ZW50RGF0YSx2YXJhcmdzKTtzdGFja1Jlc3RvcmUoc3RhY2tUb3ApfSxnZXRUYXJnZXRUaHJlYWRGb3JFdmVudENhbGxiYWNrOmZ1bmN0aW9uKHRhcmdldFRocmVhZCl7c3dpdGNoKHRhcmdldFRocmVhZCl7Y2FzZSAxOnJldHVybiAwO2Nhc2UgMjpyZXR1cm4gUFRocmVhZC5jdXJyZW50UHJveGllZE9wZXJhdGlvbkNhbGxlclRocmVhZDtkZWZhdWx0OnJldHVybiB0YXJnZXRUaHJlYWR9fSxnZXROb2RlTmFtZUZvclRhcmdldDpmdW5jdGlvbih0YXJnZXQpe2lmKCF0YXJnZXQpcmV0dXJuXCJcIjtpZih0YXJnZXQ9PXdpbmRvdylyZXR1cm5cIiN3aW5kb3dcIjtpZih0YXJnZXQ9PXNjcmVlbilyZXR1cm5cIiNzY3JlZW5cIjtyZXR1cm4gdGFyZ2V0JiZ0YXJnZXQubm9kZU5hbWU/dGFyZ2V0Lm5vZGVOYW1lOlwiXCJ9LGZ1bGxzY3JlZW5FbmFibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50LmZ1bGxzY3JlZW5FbmFibGVkfHxkb2N1bWVudC53ZWJraXRGdWxsc2NyZWVuRW5hYmxlZH19O2Z1bmN0aW9uIHN0cmluZ1RvTmV3VVRGOChqc1N0cmluZyl7dmFyIGxlbmd0aD1sZW5ndGhCeXRlc1VURjgoanNTdHJpbmcpKzE7dmFyIGNTdHJpbmc9X21hbGxvYyhsZW5ndGgpO3N0cmluZ1RvVVRGOChqc1N0cmluZyxjU3RyaW5nLGxlbmd0aCk7cmV0dXJuIGNTdHJpbmd9ZnVuY3Rpb24gX2Vtc2NyaXB0ZW5fc2V0X29mZnNjcmVlbmNhbnZhc19zaXplX29uX3RhcmdldF90aHJlYWRfanModGFyZ2V0VGhyZWFkLHRhcmdldENhbnZhcyx3aWR0aCxoZWlnaHQpe3ZhciBzdGFja1RvcD1zdGFja1NhdmUoKTt2YXIgdmFyYXJncz1zdGFja0FsbG9jKDEyKTt2YXIgdGFyZ2V0Q2FudmFzUHRyPTA7aWYodGFyZ2V0Q2FudmFzKXt0YXJnZXRDYW52YXNQdHI9c3RyaW5nVG9OZXdVVEY4KHRhcmdldENhbnZhcyl9R1JPV0FCTEVfSEVBUF9JMzIoKVt2YXJhcmdzPj4yXT10YXJnZXRDYW52YXNQdHI7R1JPV0FCTEVfSEVBUF9JMzIoKVt2YXJhcmdzKzQ+PjJdPXdpZHRoO0dST1dBQkxFX0hFQVBfSTMyKClbdmFyYXJncys4Pj4yXT1oZWlnaHQ7X19lbXNjcmlwdGVuX2NhbGxfb25fdGhyZWFkKDAsdGFyZ2V0VGhyZWFkLDY1NzQ1NzE1MiwwLHRhcmdldENhbnZhc1B0cix2YXJhcmdzKTtzdGFja1Jlc3RvcmUoc3RhY2tUb3ApfWZ1bmN0aW9uIF9lbXNjcmlwdGVuX3NldF9vZmZzY3JlZW5jYW52YXNfc2l6ZV9vbl90YXJnZXRfdGhyZWFkKHRhcmdldFRocmVhZCx0YXJnZXRDYW52YXMsd2lkdGgsaGVpZ2h0KXt0YXJnZXRDYW52YXM9dGFyZ2V0Q2FudmFzP1VURjhUb1N0cmluZyh0YXJnZXRDYW52YXMpOlwiXCI7X2Vtc2NyaXB0ZW5fc2V0X29mZnNjcmVlbmNhbnZhc19zaXplX29uX3RhcmdldF90aHJlYWRfanModGFyZ2V0VGhyZWFkLHRhcmdldENhbnZhcyx3aWR0aCxoZWlnaHQpfWZ1bmN0aW9uIG1heWJlQ1N0cmluZ1RvSnNTdHJpbmcoY1N0cmluZyl7cmV0dXJuIGNTdHJpbmc+Mj9VVEY4VG9TdHJpbmcoY1N0cmluZyk6Y1N0cmluZ312YXIgc3BlY2lhbEhUTUxUYXJnZXRzPVswLHR5cGVvZiBkb2N1bWVudCE9PVwidW5kZWZpbmVkXCI/ZG9jdW1lbnQ6MCx0eXBlb2Ygd2luZG93IT09XCJ1bmRlZmluZWRcIj93aW5kb3c6MF07ZnVuY3Rpb24gZmluZEV2ZW50VGFyZ2V0KHRhcmdldCl7dGFyZ2V0PW1heWJlQ1N0cmluZ1RvSnNTdHJpbmcodGFyZ2V0KTt2YXIgZG9tRWxlbWVudD1zcGVjaWFsSFRNTFRhcmdldHNbdGFyZ2V0XXx8KHR5cGVvZiBkb2N1bWVudCE9PVwidW5kZWZpbmVkXCI/ZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0YXJnZXQpOnVuZGVmaW5lZCk7cmV0dXJuIGRvbUVsZW1lbnR9ZnVuY3Rpb24gZmluZENhbnZhc0V2ZW50VGFyZ2V0KHRhcmdldCl7cmV0dXJuIGZpbmRFdmVudFRhcmdldCh0YXJnZXQpfWZ1bmN0aW9uIF9lbXNjcmlwdGVuX3NldF9jYW52YXNfZWxlbWVudF9zaXplX2NhbGxpbmdfdGhyZWFkKHRhcmdldCx3aWR0aCxoZWlnaHQpe3ZhciBjYW52YXM9ZmluZENhbnZhc0V2ZW50VGFyZ2V0KHRhcmdldCk7aWYoIWNhbnZhcylyZXR1cm4tNDtpZihjYW52YXMuY2FudmFzU2hhcmVkUHRyKXtHUk9XQUJMRV9IRUFQX0kzMigpW2NhbnZhcy5jYW52YXNTaGFyZWRQdHI+PjJdPXdpZHRoO0dST1dBQkxFX0hFQVBfSTMyKClbY2FudmFzLmNhbnZhc1NoYXJlZFB0cis0Pj4yXT1oZWlnaHR9aWYoY2FudmFzLm9mZnNjcmVlbkNhbnZhc3x8IWNhbnZhcy5jb250cm9sVHJhbnNmZXJyZWRPZmZzY3JlZW4pe2lmKGNhbnZhcy5vZmZzY3JlZW5DYW52YXMpY2FudmFzPWNhbnZhcy5vZmZzY3JlZW5DYW52YXM7dmFyIGF1dG9SZXNpemVWaWV3cG9ydD1mYWxzZTtpZihjYW52YXMuR0xjdHhPYmplY3QmJmNhbnZhcy5HTGN0eE9iamVjdC5HTGN0eCl7dmFyIHByZXZWaWV3cG9ydD1jYW52YXMuR0xjdHhPYmplY3QuR0xjdHguZ2V0UGFyYW1ldGVyKDI5NzgpO2F1dG9SZXNpemVWaWV3cG9ydD1wcmV2Vmlld3BvcnRbMF09PT0wJiZwcmV2Vmlld3BvcnRbMV09PT0wJiZwcmV2Vmlld3BvcnRbMl09PT1jYW52YXMud2lkdGgmJnByZXZWaWV3cG9ydFszXT09PWNhbnZhcy5oZWlnaHR9Y2FudmFzLndpZHRoPXdpZHRoO2NhbnZhcy5oZWlnaHQ9aGVpZ2h0O2lmKGF1dG9SZXNpemVWaWV3cG9ydCl7Y2FudmFzLkdMY3R4T2JqZWN0LkdMY3R4LnZpZXdwb3J0KDAsMCx3aWR0aCxoZWlnaHQpfX1lbHNlIGlmKGNhbnZhcy5jYW52YXNTaGFyZWRQdHIpe3ZhciB0YXJnZXRUaHJlYWQ9R1JPV0FCTEVfSEVBUF9JMzIoKVtjYW52YXMuY2FudmFzU2hhcmVkUHRyKzg+PjJdO19lbXNjcmlwdGVuX3NldF9vZmZzY3JlZW5jYW52YXNfc2l6ZV9vbl90YXJnZXRfdGhyZWFkKHRhcmdldFRocmVhZCx0YXJnZXQsd2lkdGgsaGVpZ2h0KTtyZXR1cm4gMX1lbHNle3JldHVybi00fXJldHVybiAwfWZ1bmN0aW9uIF9lbXNjcmlwdGVuX3NldF9jYW52YXNfZWxlbWVudF9zaXplX21haW5fdGhyZWFkKHRhcmdldCx3aWR0aCxoZWlnaHQpe2lmKEVOVklST05NRU5UX0lTX1BUSFJFQUQpcmV0dXJuIF9lbXNjcmlwdGVuX3Byb3h5X3RvX21haW5fdGhyZWFkX2pzKDIsMSx0YXJnZXQsd2lkdGgsaGVpZ2h0KTtyZXR1cm4gX2Vtc2NyaXB0ZW5fc2V0X2NhbnZhc19lbGVtZW50X3NpemVfY2FsbGluZ190aHJlYWQodGFyZ2V0LHdpZHRoLGhlaWdodCl9ZnVuY3Rpb24gX2Vtc2NyaXB0ZW5fc2V0X2NhbnZhc19lbGVtZW50X3NpemUodGFyZ2V0LHdpZHRoLGhlaWdodCl7dmFyIGNhbnZhcz1maW5kQ2FudmFzRXZlbnRUYXJnZXQodGFyZ2V0KTtpZihjYW52YXMpe3JldHVybiBfZW1zY3JpcHRlbl9zZXRfY2FudmFzX2VsZW1lbnRfc2l6ZV9jYWxsaW5nX3RocmVhZCh0YXJnZXQsd2lkdGgsaGVpZ2h0KX1lbHNle3JldHVybiBfZW1zY3JpcHRlbl9zZXRfY2FudmFzX2VsZW1lbnRfc2l6ZV9tYWluX3RocmVhZCh0YXJnZXQsd2lkdGgsaGVpZ2h0KX19ZnVuY3Rpb24gX2Vtc2NyaXB0ZW5fc2V0X2N1cnJlbnRfdGhyZWFkX3N0YXR1cyhuZXdTdGF0dXMpe31mdW5jdGlvbiBfZW1zY3JpcHRlbl9zZXRfdGhyZWFkX25hbWUodGhyZWFkSWQsbmFtZSl7fWZ1bmN0aW9uIF9fd2ViZ2xfZW5hYmxlX0FOR0xFX2luc3RhbmNlZF9hcnJheXMoY3R4KXt2YXIgZXh0PWN0eC5nZXRFeHRlbnNpb24oXCJBTkdMRV9pbnN0YW5jZWRfYXJyYXlzXCIpO2lmKGV4dCl7Y3R4W1widmVydGV4QXR0cmliRGl2aXNvclwiXT1mdW5jdGlvbihpbmRleCxkaXZpc29yKXtleHRbXCJ2ZXJ0ZXhBdHRyaWJEaXZpc29yQU5HTEVcIl0oaW5kZXgsZGl2aXNvcil9O2N0eFtcImRyYXdBcnJheXNJbnN0YW5jZWRcIl09ZnVuY3Rpb24obW9kZSxmaXJzdCxjb3VudCxwcmltY291bnQpe2V4dFtcImRyYXdBcnJheXNJbnN0YW5jZWRBTkdMRVwiXShtb2RlLGZpcnN0LGNvdW50LHByaW1jb3VudCl9O2N0eFtcImRyYXdFbGVtZW50c0luc3RhbmNlZFwiXT1mdW5jdGlvbihtb2RlLGNvdW50LHR5cGUsaW5kaWNlcyxwcmltY291bnQpe2V4dFtcImRyYXdFbGVtZW50c0luc3RhbmNlZEFOR0xFXCJdKG1vZGUsY291bnQsdHlwZSxpbmRpY2VzLHByaW1jb3VudCl9O3JldHVybiAxfX1mdW5jdGlvbiBfX3dlYmdsX2VuYWJsZV9PRVNfdmVydGV4X2FycmF5X29iamVjdChjdHgpe3ZhciBleHQ9Y3R4LmdldEV4dGVuc2lvbihcIk9FU192ZXJ0ZXhfYXJyYXlfb2JqZWN0XCIpO2lmKGV4dCl7Y3R4W1wiY3JlYXRlVmVydGV4QXJyYXlcIl09ZnVuY3Rpb24oKXtyZXR1cm4gZXh0W1wiY3JlYXRlVmVydGV4QXJyYXlPRVNcIl0oKX07Y3R4W1wiZGVsZXRlVmVydGV4QXJyYXlcIl09ZnVuY3Rpb24odmFvKXtleHRbXCJkZWxldGVWZXJ0ZXhBcnJheU9FU1wiXSh2YW8pfTtjdHhbXCJiaW5kVmVydGV4QXJyYXlcIl09ZnVuY3Rpb24odmFvKXtleHRbXCJiaW5kVmVydGV4QXJyYXlPRVNcIl0odmFvKX07Y3R4W1wiaXNWZXJ0ZXhBcnJheVwiXT1mdW5jdGlvbih2YW8pe3JldHVybiBleHRbXCJpc1ZlcnRleEFycmF5T0VTXCJdKHZhbyl9O3JldHVybiAxfX1mdW5jdGlvbiBfX3dlYmdsX2VuYWJsZV9XRUJHTF9kcmF3X2J1ZmZlcnMoY3R4KXt2YXIgZXh0PWN0eC5nZXRFeHRlbnNpb24oXCJXRUJHTF9kcmF3X2J1ZmZlcnNcIik7aWYoZXh0KXtjdHhbXCJkcmF3QnVmZmVyc1wiXT1mdW5jdGlvbihuLGJ1ZnMpe2V4dFtcImRyYXdCdWZmZXJzV0VCR0xcIl0obixidWZzKX07cmV0dXJuIDF9fWZ1bmN0aW9uIF9fd2ViZ2xfZW5hYmxlX1dFQkdMX211bHRpX2RyYXcoY3R4KXtyZXR1cm4hIShjdHgubXVsdGlEcmF3V2ViZ2w9Y3R4LmdldEV4dGVuc2lvbihcIldFQkdMX211bHRpX2RyYXdcIikpfXZhciBHTD17Y291bnRlcjoxLGJ1ZmZlcnM6W10scHJvZ3JhbXM6W10sZnJhbWVidWZmZXJzOltdLHJlbmRlcmJ1ZmZlcnM6W10sdGV4dHVyZXM6W10sdW5pZm9ybXM6W10sc2hhZGVyczpbXSx2YW9zOltdLGNvbnRleHRzOnt9LG9mZnNjcmVlbkNhbnZhc2VzOnt9LHRpbWVyUXVlcmllc0VYVDpbXSxwcm9ncmFtSW5mb3M6e30sc3RyaW5nQ2FjaGU6e30sdW5wYWNrQWxpZ25tZW50OjQscmVjb3JkRXJyb3I6ZnVuY3Rpb24gcmVjb3JkRXJyb3IoZXJyb3JDb2RlKXtpZighR0wubGFzdEVycm9yKXtHTC5sYXN0RXJyb3I9ZXJyb3JDb2RlfX0sZ2V0TmV3SWQ6ZnVuY3Rpb24odGFibGUpe3ZhciByZXQ9R0wuY291bnRlcisrO2Zvcih2YXIgaT10YWJsZS5sZW5ndGg7aTxyZXQ7aSsrKXt0YWJsZVtpXT1udWxsfXJldHVybiByZXR9LGdldFNvdXJjZTpmdW5jdGlvbihzaGFkZXIsY291bnQsc3RyaW5nLGxlbmd0aCl7dmFyIHNvdXJjZT1cIlwiO2Zvcih2YXIgaT0wO2k8Y291bnQ7KytpKXt2YXIgbGVuPWxlbmd0aD9HUk9XQUJMRV9IRUFQX0kzMigpW2xlbmd0aCtpKjQ+PjJdOi0xO3NvdXJjZSs9VVRGOFRvU3RyaW5nKEdST1dBQkxFX0hFQVBfSTMyKClbc3RyaW5nK2kqND4+Ml0sbGVuPDA/dW5kZWZpbmVkOmxlbil9cmV0dXJuIHNvdXJjZX0sY3JlYXRlQ29udGV4dDpmdW5jdGlvbihjYW52YXMsd2ViR0xDb250ZXh0QXR0cmlidXRlcyl7dmFyIGN0eD1jYW52YXMuZ2V0Q29udGV4dChcIndlYmdsXCIsd2ViR0xDb250ZXh0QXR0cmlidXRlcyk7aWYoIWN0eClyZXR1cm4gMDt2YXIgaGFuZGxlPUdMLnJlZ2lzdGVyQ29udGV4dChjdHgsd2ViR0xDb250ZXh0QXR0cmlidXRlcyk7cmV0dXJuIGhhbmRsZX0scmVnaXN0ZXJDb250ZXh0OmZ1bmN0aW9uKGN0eCx3ZWJHTENvbnRleHRBdHRyaWJ1dGVzKXt2YXIgaGFuZGxlPV9tYWxsb2MoOCk7R1JPV0FCTEVfSEVBUF9JMzIoKVtoYW5kbGUrND4+Ml09X3B0aHJlYWRfc2VsZigpO3ZhciBjb250ZXh0PXtoYW5kbGU6aGFuZGxlLGF0dHJpYnV0ZXM6d2ViR0xDb250ZXh0QXR0cmlidXRlcyx2ZXJzaW9uOndlYkdMQ29udGV4dEF0dHJpYnV0ZXMubWFqb3JWZXJzaW9uLEdMY3R4OmN0eH07aWYoY3R4LmNhbnZhcyljdHguY2FudmFzLkdMY3R4T2JqZWN0PWNvbnRleHQ7R0wuY29udGV4dHNbaGFuZGxlXT1jb250ZXh0O2lmKHR5cGVvZiB3ZWJHTENvbnRleHRBdHRyaWJ1dGVzLmVuYWJsZUV4dGVuc2lvbnNCeURlZmF1bHQ9PT1cInVuZGVmaW5lZFwifHx3ZWJHTENvbnRleHRBdHRyaWJ1dGVzLmVuYWJsZUV4dGVuc2lvbnNCeURlZmF1bHQpe0dMLmluaXRFeHRlbnNpb25zKGNvbnRleHQpfXJldHVybiBoYW5kbGV9LG1ha2VDb250ZXh0Q3VycmVudDpmdW5jdGlvbihjb250ZXh0SGFuZGxlKXtHTC5jdXJyZW50Q29udGV4dD1HTC5jb250ZXh0c1tjb250ZXh0SGFuZGxlXTtNb2R1bGUuY3R4PUdMY3R4PUdMLmN1cnJlbnRDb250ZXh0JiZHTC5jdXJyZW50Q29udGV4dC5HTGN0eDtyZXR1cm4hKGNvbnRleHRIYW5kbGUmJiFHTGN0eCl9LGdldENvbnRleHQ6ZnVuY3Rpb24oY29udGV4dEhhbmRsZSl7cmV0dXJuIEdMLmNvbnRleHRzW2NvbnRleHRIYW5kbGVdfSxkZWxldGVDb250ZXh0OmZ1bmN0aW9uKGNvbnRleHRIYW5kbGUpe2lmKEdMLmN1cnJlbnRDb250ZXh0PT09R0wuY29udGV4dHNbY29udGV4dEhhbmRsZV0pR0wuY3VycmVudENvbnRleHQ9bnVsbDtpZih0eXBlb2YgSlNFdmVudHM9PT1cIm9iamVjdFwiKUpTRXZlbnRzLnJlbW92ZUFsbEhhbmRsZXJzT25UYXJnZXQoR0wuY29udGV4dHNbY29udGV4dEhhbmRsZV0uR0xjdHguY2FudmFzKTtpZihHTC5jb250ZXh0c1tjb250ZXh0SGFuZGxlXSYmR0wuY29udGV4dHNbY29udGV4dEhhbmRsZV0uR0xjdHguY2FudmFzKUdMLmNvbnRleHRzW2NvbnRleHRIYW5kbGVdLkdMY3R4LmNhbnZhcy5HTGN0eE9iamVjdD11bmRlZmluZWQ7X2ZyZWUoR0wuY29udGV4dHNbY29udGV4dEhhbmRsZV0uaGFuZGxlKTtHTC5jb250ZXh0c1tjb250ZXh0SGFuZGxlXT1udWxsfSxpbml0RXh0ZW5zaW9uczpmdW5jdGlvbihjb250ZXh0KXtpZighY29udGV4dCljb250ZXh0PUdMLmN1cnJlbnRDb250ZXh0O2lmKGNvbnRleHQuaW5pdEV4dGVuc2lvbnNEb25lKXJldHVybjtjb250ZXh0LmluaXRFeHRlbnNpb25zRG9uZT10cnVlO3ZhciBHTGN0eD1jb250ZXh0LkdMY3R4O19fd2ViZ2xfZW5hYmxlX0FOR0xFX2luc3RhbmNlZF9hcnJheXMoR0xjdHgpO19fd2ViZ2xfZW5hYmxlX09FU192ZXJ0ZXhfYXJyYXlfb2JqZWN0KEdMY3R4KTtfX3dlYmdsX2VuYWJsZV9XRUJHTF9kcmF3X2J1ZmZlcnMoR0xjdHgpO0dMY3R4LmRpc2pvaW50VGltZXJRdWVyeUV4dD1HTGN0eC5nZXRFeHRlbnNpb24oXCJFWFRfZGlzam9pbnRfdGltZXJfcXVlcnlcIik7X193ZWJnbF9lbmFibGVfV0VCR0xfbXVsdGlfZHJhdyhHTGN0eCk7dmFyIGV4dHM9R0xjdHguZ2V0U3VwcG9ydGVkRXh0ZW5zaW9ucygpfHxbXTtleHRzLmZvckVhY2goZnVuY3Rpb24oZXh0KXtpZihleHQuaW5kZXhPZihcImxvc2VfY29udGV4dFwiKTwwJiZleHQuaW5kZXhPZihcImRlYnVnXCIpPDApe0dMY3R4LmdldEV4dGVuc2lvbihleHQpfX0pfSxwb3B1bGF0ZVVuaWZvcm1UYWJsZTpmdW5jdGlvbihwcm9ncmFtKXt2YXIgcD1HTC5wcm9ncmFtc1twcm9ncmFtXTt2YXIgcHRhYmxlPUdMLnByb2dyYW1JbmZvc1twcm9ncmFtXT17dW5pZm9ybXM6e30sbWF4VW5pZm9ybUxlbmd0aDowLG1heEF0dHJpYnV0ZUxlbmd0aDotMSxtYXhVbmlmb3JtQmxvY2tOYW1lTGVuZ3RoOi0xfTt2YXIgdXRhYmxlPXB0YWJsZS51bmlmb3Jtczt2YXIgbnVtVW5pZm9ybXM9R0xjdHguZ2V0UHJvZ3JhbVBhcmFtZXRlcihwLDM1NzE4KTtmb3IodmFyIGk9MDtpPG51bVVuaWZvcm1zOysraSl7dmFyIHU9R0xjdHguZ2V0QWN0aXZlVW5pZm9ybShwLGkpO3ZhciBuYW1lPXUubmFtZTtwdGFibGUubWF4VW5pZm9ybUxlbmd0aD1NYXRoLm1heChwdGFibGUubWF4VW5pZm9ybUxlbmd0aCxuYW1lLmxlbmd0aCsxKTtpZihuYW1lLnNsaWNlKC0xKT09XCJdXCIpe25hbWU9bmFtZS5zbGljZSgwLG5hbWUubGFzdEluZGV4T2YoXCJbXCIpKX12YXIgbG9jPUdMY3R4LmdldFVuaWZvcm1Mb2NhdGlvbihwLG5hbWUpO2lmKGxvYyl7dmFyIGlkPUdMLmdldE5ld0lkKEdMLnVuaWZvcm1zKTt1dGFibGVbbmFtZV09W3Uuc2l6ZSxpZF07R0wudW5pZm9ybXNbaWRdPWxvYztmb3IodmFyIGo9MTtqPHUuc2l6ZTsrK2ope3ZhciBuPW5hbWUrXCJbXCIraitcIl1cIjtsb2M9R0xjdHguZ2V0VW5pZm9ybUxvY2F0aW9uKHAsbik7aWQ9R0wuZ2V0TmV3SWQoR0wudW5pZm9ybXMpO0dMLnVuaWZvcm1zW2lkXT1sb2N9fX19fTt2YXIgX19lbXNjcmlwdGVuX3dlYmdsX3Bvd2VyX3ByZWZlcmVuY2VzPVtcImRlZmF1bHRcIixcImxvdy1wb3dlclwiLFwiaGlnaC1wZXJmb3JtYW5jZVwiXTtmdW5jdGlvbiBfZW1zY3JpcHRlbl93ZWJnbF9kb19jcmVhdGVfY29udGV4dCh0YXJnZXQsYXR0cmlidXRlcyl7dmFyIGE9YXR0cmlidXRlcz4+Mjt2YXIgcG93ZXJQcmVmZXJlbmNlPUdST1dBQkxFX0hFQVBfSTMyKClbYSsoMjQ+PjIpXTt2YXIgY29udGV4dEF0dHJpYnV0ZXM9e1wiYWxwaGFcIjohIUdST1dBQkxFX0hFQVBfSTMyKClbYSsoMD4+MildLFwiZGVwdGhcIjohIUdST1dBQkxFX0hFQVBfSTMyKClbYSsoND4+MildLFwic3RlbmNpbFwiOiEhR1JPV0FCTEVfSEVBUF9JMzIoKVthKyg4Pj4yKV0sXCJhbnRpYWxpYXNcIjohIUdST1dBQkxFX0hFQVBfSTMyKClbYSsoMTI+PjIpXSxcInByZW11bHRpcGxpZWRBbHBoYVwiOiEhR1JPV0FCTEVfSEVBUF9JMzIoKVthKygxNj4+MildLFwicHJlc2VydmVEcmF3aW5nQnVmZmVyXCI6ISFHUk9XQUJMRV9IRUFQX0kzMigpW2ErKDIwPj4yKV0sXCJwb3dlclByZWZlcmVuY2VcIjpfX2Vtc2NyaXB0ZW5fd2ViZ2xfcG93ZXJfcHJlZmVyZW5jZXNbcG93ZXJQcmVmZXJlbmNlXSxcImZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXRcIjohIUdST1dBQkxFX0hFQVBfSTMyKClbYSsoMjg+PjIpXSxtYWpvclZlcnNpb246R1JPV0FCTEVfSEVBUF9JMzIoKVthKygzMj4+MildLG1pbm9yVmVyc2lvbjpHUk9XQUJMRV9IRUFQX0kzMigpW2ErKDM2Pj4yKV0sZW5hYmxlRXh0ZW5zaW9uc0J5RGVmYXVsdDpHUk9XQUJMRV9IRUFQX0kzMigpW2ErKDQwPj4yKV0sZXhwbGljaXRTd2FwQ29udHJvbDpHUk9XQUJMRV9IRUFQX0kzMigpW2ErKDQ0Pj4yKV0scHJveHlDb250ZXh0VG9NYWluVGhyZWFkOkdST1dBQkxFX0hFQVBfSTMyKClbYSsoNDg+PjIpXSxyZW5kZXJWaWFPZmZzY3JlZW5CYWNrQnVmZmVyOkdST1dBQkxFX0hFQVBfSTMyKClbYSsoNTI+PjIpXX07dmFyIGNhbnZhcz1maW5kQ2FudmFzRXZlbnRUYXJnZXQodGFyZ2V0KTtpZighY2FudmFzKXtyZXR1cm4gMH1pZihjb250ZXh0QXR0cmlidXRlcy5leHBsaWNpdFN3YXBDb250cm9sKXtyZXR1cm4gMH12YXIgY29udGV4dEhhbmRsZT1HTC5jcmVhdGVDb250ZXh0KGNhbnZhcyxjb250ZXh0QXR0cmlidXRlcyk7cmV0dXJuIGNvbnRleHRIYW5kbGV9ZnVuY3Rpb24gX2Vtc2NyaXB0ZW5fd2ViZ2xfY3JlYXRlX2NvbnRleHQoYTAsYTEpe3JldHVybiBfZW1zY3JpcHRlbl93ZWJnbF9kb19jcmVhdGVfY29udGV4dChhMCxhMSl9dmFyIFNZU0NBTExTPXttYXBwaW5nczp7fSxidWZmZXJzOltudWxsLFtdLFtdXSxwcmludENoYXI6ZnVuY3Rpb24oc3RyZWFtLGN1cnIpe3ZhciBidWZmZXI9U1lTQ0FMTFMuYnVmZmVyc1tzdHJlYW1dO2lmKGN1cnI9PT0wfHxjdXJyPT09MTApeyhzdHJlYW09PT0xP291dDplcnIpKFVURjhBcnJheVRvU3RyaW5nKGJ1ZmZlciwwKSk7YnVmZmVyLmxlbmd0aD0wfWVsc2V7YnVmZmVyLnB1c2goY3Vycil9fSx2YXJhcmdzOnVuZGVmaW5lZCxnZXQ6ZnVuY3Rpb24oKXtTWVNDQUxMUy52YXJhcmdzKz00O3ZhciByZXQ9R1JPV0FCTEVfSEVBUF9JMzIoKVtTWVNDQUxMUy52YXJhcmdzLTQ+PjJdO3JldHVybiByZXR9LGdldFN0cjpmdW5jdGlvbihwdHIpe3ZhciByZXQ9VVRGOFRvU3RyaW5nKHB0cik7cmV0dXJuIHJldH0sZ2V0NjQ6ZnVuY3Rpb24obG93LGhpZ2gpe3JldHVybiBsb3d9fTtmdW5jdGlvbiBfZmRfY2xvc2UoZmQpe2lmKEVOVklST05NRU5UX0lTX1BUSFJFQUQpcmV0dXJuIF9lbXNjcmlwdGVuX3Byb3h5X3RvX21haW5fdGhyZWFkX2pzKDMsMSxmZCk7cmV0dXJuIDB9ZnVuY3Rpb24gX2ZkX3NlZWsoZmQsb2Zmc2V0X2xvdyxvZmZzZXRfaGlnaCx3aGVuY2UsbmV3T2Zmc2V0KXtpZihFTlZJUk9OTUVOVF9JU19QVEhSRUFEKXJldHVybiBfZW1zY3JpcHRlbl9wcm94eV90b19tYWluX3RocmVhZF9qcyg0LDEsZmQsb2Zmc2V0X2xvdyxvZmZzZXRfaGlnaCx3aGVuY2UsbmV3T2Zmc2V0KX1mdW5jdGlvbiBfZmRfd3JpdGUoZmQsaW92LGlvdmNudCxwbnVtKXtpZihFTlZJUk9OTUVOVF9JU19QVEhSRUFEKXJldHVybiBfZW1zY3JpcHRlbl9wcm94eV90b19tYWluX3RocmVhZF9qcyg1LDEsZmQsaW92LGlvdmNudCxwbnVtKTt2YXIgbnVtPTA7Zm9yKHZhciBpPTA7aTxpb3ZjbnQ7aSsrKXt2YXIgcHRyPUdST1dBQkxFX0hFQVBfSTMyKClbaW92K2kqOD4+Ml07dmFyIGxlbj1HUk9XQUJMRV9IRUFQX0kzMigpW2lvdisoaSo4KzQpPj4yXTtmb3IodmFyIGo9MDtqPGxlbjtqKyspe1NZU0NBTExTLnByaW50Q2hhcihmZCxHUk9XQUJMRV9IRUFQX1U4KClbcHRyK2pdKX1udW0rPWxlbn1HUk9XQUJMRV9IRUFQX0kzMigpW3BudW0+PjJdPW51bTtyZXR1cm4gMH1mdW5jdGlvbiBfcHRocmVhZF9jbGVhbnVwX3BvcChleGVjdXRlKXt2YXIgcm91dGluZT1QVGhyZWFkLnRocmVhZEV4aXRIYW5kbGVycy5wb3AoKTtpZihleGVjdXRlKXJvdXRpbmUoKX1mdW5jdGlvbiBfcHRocmVhZF9jbGVhbnVwX3B1c2gocm91dGluZSxhcmcpe1BUaHJlYWQudGhyZWFkRXhpdEhhbmRsZXJzLnB1c2goZnVuY3Rpb24oKXt3YXNtVGFibGUuZ2V0KHJvdXRpbmUpKGFyZyl9KX1mdW5jdGlvbiBzcGF3blRocmVhZCh0aHJlYWRQYXJhbXMpe2lmKEVOVklST05NRU5UX0lTX1BUSFJFQUQpdGhyb3dcIkludGVybmFsIEVycm9yISBzcGF3blRocmVhZCgpIGNhbiBvbmx5IGV2ZXIgYmUgY2FsbGVkIGZyb20gbWFpbiBhcHBsaWNhdGlvbiB0aHJlYWQhXCI7dmFyIHdvcmtlcj1QVGhyZWFkLmdldE5ld1dvcmtlcigpO2lmKHdvcmtlci5wdGhyZWFkIT09dW5kZWZpbmVkKXRocm93XCJJbnRlcm5hbCBlcnJvciFcIjtpZighdGhyZWFkUGFyYW1zLnB0aHJlYWRfcHRyKXRocm93XCJJbnRlcm5hbCBlcnJvciwgbm8gcHRocmVhZCBwdHIhXCI7UFRocmVhZC5ydW5uaW5nV29ya2Vycy5wdXNoKHdvcmtlcik7dmFyIHRsc01lbW9yeT1fbWFsbG9jKDEyOCo0KTtmb3IodmFyIGk9MDtpPDEyODsrK2kpe0dST1dBQkxFX0hFQVBfSTMyKClbdGxzTWVtb3J5K2kqND4+Ml09MH12YXIgc3RhY2tIaWdoPXRocmVhZFBhcmFtcy5zdGFja0Jhc2UrdGhyZWFkUGFyYW1zLnN0YWNrU2l6ZTt2YXIgcHRocmVhZD1QVGhyZWFkLnB0aHJlYWRzW3RocmVhZFBhcmFtcy5wdGhyZWFkX3B0cl09e3dvcmtlcjp3b3JrZXIsc3RhY2tCYXNlOnRocmVhZFBhcmFtcy5zdGFja0Jhc2Usc3RhY2tTaXplOnRocmVhZFBhcmFtcy5zdGFja1NpemUsYWxsb2NhdGVkT3duU3RhY2s6dGhyZWFkUGFyYW1zLmFsbG9jYXRlZE93blN0YWNrLHRocmVhZEluZm9TdHJ1Y3Q6dGhyZWFkUGFyYW1zLnB0aHJlYWRfcHRyfTt2YXIgdGlzPXB0aHJlYWQudGhyZWFkSW5mb1N0cnVjdD4+MjtBdG9taWNzLnN0b3JlKEdST1dBQkxFX0hFQVBfVTMyKCksdGlzKyg2ND4+MiksdGhyZWFkUGFyYW1zLmRldGFjaGVkKTtBdG9taWNzLnN0b3JlKEdST1dBQkxFX0hFQVBfVTMyKCksdGlzKygxMDA+PjIpLHRsc01lbW9yeSk7QXRvbWljcy5zdG9yZShHUk9XQUJMRV9IRUFQX1UzMigpLHRpcysoNDA+PjIpLHB0aHJlYWQudGhyZWFkSW5mb1N0cnVjdCk7QXRvbWljcy5zdG9yZShHUk9XQUJMRV9IRUFQX1UzMigpLHRpcysoODA+PjIpLHRocmVhZFBhcmFtcy5zdGFja1NpemUpO0F0b21pY3Muc3RvcmUoR1JPV0FCTEVfSEVBUF9VMzIoKSx0aXMrKDc2Pj4yKSxzdGFja0hpZ2gpO0F0b21pY3Muc3RvcmUoR1JPV0FCTEVfSEVBUF9VMzIoKSx0aXMrKDEwND4+MiksdGhyZWFkUGFyYW1zLnN0YWNrU2l6ZSk7QXRvbWljcy5zdG9yZShHUk9XQUJMRV9IRUFQX1UzMigpLHRpcysoMTA0Kzg+PjIpLHN0YWNrSGlnaCk7QXRvbWljcy5zdG9yZShHUk9XQUJMRV9IRUFQX1UzMigpLHRpcysoMTA0KzEyPj4yKSx0aHJlYWRQYXJhbXMuZGV0YWNoZWQpO3ZhciBnbG9iYWxfbGliYz1fZW1zY3JpcHRlbl9nZXRfZ2xvYmFsX2xpYmMoKTt2YXIgZ2xvYmFsX2xvY2FsZT1nbG9iYWxfbGliYys0MDtBdG9taWNzLnN0b3JlKEdST1dBQkxFX0hFQVBfVTMyKCksdGlzKygxNzI+PjIpLGdsb2JhbF9sb2NhbGUpO3dvcmtlci5wdGhyZWFkPXB0aHJlYWQ7dmFyIG1zZz17XCJjbWRcIjpcInJ1blwiLFwic3RhcnRfcm91dGluZVwiOnRocmVhZFBhcmFtcy5zdGFydFJvdXRpbmUsXCJhcmdcIjp0aHJlYWRQYXJhbXMuYXJnLFwidGhyZWFkSW5mb1N0cnVjdFwiOnRocmVhZFBhcmFtcy5wdGhyZWFkX3B0cixcInN0YWNrQmFzZVwiOnRocmVhZFBhcmFtcy5zdGFja0Jhc2UsXCJzdGFja1NpemVcIjp0aHJlYWRQYXJhbXMuc3RhY2tTaXplfTt3b3JrZXIucnVuUHRocmVhZD1mdW5jdGlvbigpe21zZy50aW1lPXBlcmZvcm1hbmNlLm5vdygpO3dvcmtlci5wb3N0TWVzc2FnZShtc2csdGhyZWFkUGFyYW1zLnRyYW5zZmVyTGlzdCl9O2lmKHdvcmtlci5sb2FkZWQpe3dvcmtlci5ydW5QdGhyZWFkKCk7ZGVsZXRlIHdvcmtlci5ydW5QdGhyZWFkfX1mdW5jdGlvbiBfcHRocmVhZF9jcmVhdGUocHRocmVhZF9wdHIsYXR0cixzdGFydF9yb3V0aW5lLGFyZyl7aWYodHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyPT09XCJ1bmRlZmluZWRcIil7ZXJyKFwiQ3VycmVudCBlbnZpcm9ubWVudCBkb2VzIG5vdCBzdXBwb3J0IFNoYXJlZEFycmF5QnVmZmVyLCBwdGhyZWFkcyBhcmUgbm90IGF2YWlsYWJsZSFcIik7cmV0dXJuIDZ9aWYoIXB0aHJlYWRfcHRyKXtlcnIoXCJwdGhyZWFkX2NyZWF0ZSBjYWxsZWQgd2l0aCBhIG51bGwgdGhyZWFkIHBvaW50ZXIhXCIpO3JldHVybiAyOH12YXIgdHJhbnNmZXJMaXN0PVtdO3ZhciBlcnJvcj0wO2lmKEVOVklST05NRU5UX0lTX1BUSFJFQUQmJih0cmFuc2Zlckxpc3QubGVuZ3RoPT09MHx8ZXJyb3IpKXtyZXR1cm4gX2Vtc2NyaXB0ZW5fc3luY19ydW5faW5fbWFpbl90aHJlYWRfNCg2ODc4NjU4NTYscHRocmVhZF9wdHIsYXR0cixzdGFydF9yb3V0aW5lLGFyZyl9aWYoZXJyb3IpcmV0dXJuIGVycm9yO3ZhciBzdGFja1NpemU9MDt2YXIgc3RhY2tCYXNlPTA7dmFyIGRldGFjaGVkPTA7aWYoYXR0ciYmYXR0ciE9LTEpe3N0YWNrU2l6ZT1HUk9XQUJMRV9IRUFQX0kzMigpW2F0dHI+PjJdO3N0YWNrU2l6ZSs9ODE5MjA7c3RhY2tCYXNlPUdST1dBQkxFX0hFQVBfSTMyKClbYXR0cis4Pj4yXTtkZXRhY2hlZD1HUk9XQUJMRV9IRUFQX0kzMigpW2F0dHIrMTI+PjJdIT09MH1lbHNle3N0YWNrU2l6ZT0yMDk3MTUyfXZhciBhbGxvY2F0ZWRPd25TdGFjaz1zdGFja0Jhc2U9PTA7aWYoYWxsb2NhdGVkT3duU3RhY2spe3N0YWNrQmFzZT1fbWVtYWxpZ24oMTYsc3RhY2tTaXplKX1lbHNle3N0YWNrQmFzZS09c3RhY2tTaXplO2Fzc2VydChzdGFja0Jhc2U+MCl9dmFyIHRocmVhZEluZm9TdHJ1Y3Q9X21hbGxvYygyMjgpO2Zvcih2YXIgaT0wO2k8MjI4Pj4yOysraSlHUk9XQUJMRV9IRUFQX1UzMigpWyh0aHJlYWRJbmZvU3RydWN0Pj4yKStpXT0wO0dST1dBQkxFX0hFQVBfSTMyKClbcHRocmVhZF9wdHI+PjJdPXRocmVhZEluZm9TdHJ1Y3Q7R1JPV0FCTEVfSEVBUF9JMzIoKVt0aHJlYWRJbmZvU3RydWN0KzEyPj4yXT10aHJlYWRJbmZvU3RydWN0O3ZhciBoZWFkUHRyPXRocmVhZEluZm9TdHJ1Y3QrMTUyO0dST1dBQkxFX0hFQVBfSTMyKClbaGVhZFB0cj4+Ml09aGVhZFB0cjt2YXIgdGhyZWFkUGFyYW1zPXtzdGFja0Jhc2U6c3RhY2tCYXNlLHN0YWNrU2l6ZTpzdGFja1NpemUsYWxsb2NhdGVkT3duU3RhY2s6YWxsb2NhdGVkT3duU3RhY2ssZGV0YWNoZWQ6ZGV0YWNoZWQsc3RhcnRSb3V0aW5lOnN0YXJ0X3JvdXRpbmUscHRocmVhZF9wdHI6dGhyZWFkSW5mb1N0cnVjdCxhcmc6YXJnLHRyYW5zZmVyTGlzdDp0cmFuc2Zlckxpc3R9O2lmKEVOVklST05NRU5UX0lTX1BUSFJFQUQpe3RocmVhZFBhcmFtcy5jbWQ9XCJzcGF3blRocmVhZFwiO3Bvc3RNZXNzYWdlKHRocmVhZFBhcmFtcyx0cmFuc2Zlckxpc3QpfWVsc2V7c3Bhd25UaHJlYWQodGhyZWFkUGFyYW1zKX1yZXR1cm4gMH1mdW5jdGlvbiBfc3lzY29uZihuYW1lKXtpZihFTlZJUk9OTUVOVF9JU19QVEhSRUFEKXJldHVybiBfZW1zY3JpcHRlbl9wcm94eV90b19tYWluX3RocmVhZF9qcyg2LDEsbmFtZSk7c3dpdGNoKG5hbWUpe2Nhc2UgMzA6cmV0dXJuIDE2Mzg0O2Nhc2UgODU6dmFyIG1heEhlYXBTaXplPTIxNDc0ODM2NDg7cmV0dXJuIG1heEhlYXBTaXplLzE2Mzg0O2Nhc2UgMTMyOmNhc2UgMTMzOmNhc2UgMTI6Y2FzZSAxMzc6Y2FzZSAxMzg6Y2FzZSAxNTpjYXNlIDIzNTpjYXNlIDE2OmNhc2UgMTc6Y2FzZSAxODpjYXNlIDE5OmNhc2UgMjA6Y2FzZSAxNDk6Y2FzZSAxMzpjYXNlIDEwOmNhc2UgMjM2OmNhc2UgMTUzOmNhc2UgOTpjYXNlIDIxOmNhc2UgMjI6Y2FzZSAxNTk6Y2FzZSAxNTQ6Y2FzZSAxNDpjYXNlIDc3OmNhc2UgNzg6Y2FzZSAxMzk6Y2FzZSA4MjpjYXNlIDY4OmNhc2UgNjc6Y2FzZSAxNjQ6Y2FzZSAxMTpjYXNlIDI5OmNhc2UgNDc6Y2FzZSA0ODpjYXNlIDk1OmNhc2UgNTI6Y2FzZSA1MTpjYXNlIDQ2OnJldHVybiAyMDA4MDk7Y2FzZSAyNzpjYXNlIDI0NjpjYXNlIDEyNzpjYXNlIDEyODpjYXNlIDIzOmNhc2UgMjQ6Y2FzZSAxNjA6Y2FzZSAxNjE6Y2FzZSAxODE6Y2FzZSAxODI6Y2FzZSAyNDI6Y2FzZSAxODM6Y2FzZSAxODQ6Y2FzZSAyNDM6Y2FzZSAyNDQ6Y2FzZSAyNDU6Y2FzZSAxNjU6Y2FzZSAxNzg6Y2FzZSAxNzk6Y2FzZSA0OTpjYXNlIDUwOmNhc2UgMTY4OmNhc2UgMTY5OmNhc2UgMTc1OmNhc2UgMTcwOmNhc2UgMTcxOmNhc2UgMTcyOmNhc2UgOTc6Y2FzZSA3NjpjYXNlIDMyOmNhc2UgMTczOmNhc2UgMzU6Y2FzZSA4MDpjYXNlIDgxOmNhc2UgNzk6cmV0dXJuLTE7Y2FzZSAxNzY6Y2FzZSAxNzc6Y2FzZSA3OmNhc2UgMTU1OmNhc2UgODpjYXNlIDE1NzpjYXNlIDEyNTpjYXNlIDEyNjpjYXNlIDkyOmNhc2UgOTM6Y2FzZSAxMjk6Y2FzZSAxMzA6Y2FzZSAxMzE6Y2FzZSA5NDpjYXNlIDkxOnJldHVybiAxO2Nhc2UgNzQ6Y2FzZSA2MDpjYXNlIDY5OmNhc2UgNzA6Y2FzZSA0OnJldHVybiAxMDI0O2Nhc2UgMzE6Y2FzZSA0MjpjYXNlIDcyOnJldHVybiAzMjtjYXNlIDg3OmNhc2UgMjY6Y2FzZSAzMzpyZXR1cm4gMjE0NzQ4MzY0NztjYXNlIDM0OmNhc2UgMTpyZXR1cm4gNDc4Mzk7Y2FzZSAzODpjYXNlIDM2OnJldHVybiA5OTtjYXNlIDQzOmNhc2UgMzc6cmV0dXJuIDIwNDg7Y2FzZSAwOnJldHVybiAyMDk3MTUyO2Nhc2UgMzpyZXR1cm4gNjU1MzY7Y2FzZSAyODpyZXR1cm4gMzI3Njg7Y2FzZSA0NDpyZXR1cm4gMzI3Njc7Y2FzZSA3NTpyZXR1cm4gMTYzODQ7Y2FzZSAzOTpyZXR1cm4gMWUzO2Nhc2UgODk6cmV0dXJuIDcwMDtjYXNlIDcxOnJldHVybiAyNTY7Y2FzZSA0MDpyZXR1cm4gMjU1O2Nhc2UgMjpyZXR1cm4gMTAwO2Nhc2UgMTgwOnJldHVybiA2NDtjYXNlIDI1OnJldHVybiAyMDtjYXNlIDU6cmV0dXJuIDE2O2Nhc2UgNjpyZXR1cm4gNjtjYXNlIDczOnJldHVybiA0O2Nhc2UgODQ6e2lmKHR5cGVvZiBuYXZpZ2F0b3I9PT1cIm9iamVjdFwiKXJldHVybiBuYXZpZ2F0b3JbXCJoYXJkd2FyZUNvbmN1cnJlbmN5XCJdfHwxO3JldHVybiAxfX1zZXRFcnJObygyOCk7cmV0dXJuLTF9aWYoIUVOVklST05NRU5UX0lTX1BUSFJFQUQpUFRocmVhZC5pbml0TWFpblRocmVhZEJsb2NrKCk7dmFyIEdMY3R4O3ZhciBwcm94aWVkRnVuY3Rpb25UYWJsZT1bbnVsbCxfYXRleGl0LF9lbXNjcmlwdGVuX3NldF9jYW52YXNfZWxlbWVudF9zaXplX21haW5fdGhyZWFkLF9mZF9jbG9zZSxfZmRfc2VlayxfZmRfd3JpdGUsX3N5c2NvbmZdO3ZhciBhc21MaWJyYXJ5QXJnPXtcImVcIjpfX19hc3NlcnRfZmFpbCxcInJcIjpfX19jYWxsX21haW4sXCJ4XCI6X19lbXNjcmlwdGVuX25vdGlmeV90aHJlYWRfcXVldWUsXCJiXCI6X2Fib3J0LFwieVwiOl9lbXNjcmlwdGVuX2FzbV9jb25zdF9pbnQsXCJqXCI6X2Vtc2NyaXB0ZW5fY29uZGl0aW9uYWxfc2V0X2N1cnJlbnRfdGhyZWFkX3N0YXR1cyxcImNcIjpfZW1zY3JpcHRlbl9mdXRleF93YWl0LFwiZFwiOl9lbXNjcmlwdGVuX2Z1dGV4X3dha2UsXCJmXCI6X2Vtc2NyaXB0ZW5fZ2V0X25vdyxcInBcIjpfZW1zY3JpcHRlbl9tZW1jcHlfYmlnLFwielwiOl9lbXNjcmlwdGVuX251bV9sb2dpY2FsX2NvcmVzLFwidVwiOl9lbXNjcmlwdGVuX3JlY2VpdmVfb25fbWFpbl90aHJlYWRfanMsXCJxXCI6X2Vtc2NyaXB0ZW5fcmVzaXplX2hlYXAsXCJ2XCI6X2Vtc2NyaXB0ZW5fc2V0X2NhbnZhc19lbGVtZW50X3NpemUsXCJpXCI6X2Vtc2NyaXB0ZW5fc2V0X2N1cnJlbnRfdGhyZWFkX3N0YXR1cyxcInRcIjpfZW1zY3JpcHRlbl9zZXRfdGhyZWFkX25hbWUsXCJ3XCI6X2Vtc2NyaXB0ZW5fd2ViZ2xfY3JlYXRlX2NvbnRleHQsXCJtXCI6X2ZkX2Nsb3NlLFwiblwiOl9mZF9zZWVrLFwiZ1wiOl9mZF93cml0ZSxcIm9cIjppbml0UHRocmVhZHNKUyxcImFcIjp3YXNtTWVtb3J5fHxNb2R1bGVbXCJ3YXNtTWVtb3J5XCJdLFwia1wiOl9wdGhyZWFkX2NsZWFudXBfcG9wLFwibFwiOl9wdGhyZWFkX2NsZWFudXBfcHVzaCxcImhcIjpfcHRocmVhZF9jcmVhdGUsXCJzXCI6X3N5c2NvbmZ9O3ZhciBhc209Y3JlYXRlV2FzbSgpO3ZhciBfX193YXNtX2NhbGxfY3RvcnM9TW9kdWxlW1wiX19fd2FzbV9jYWxsX2N0b3JzXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9fX3dhc21fY2FsbF9jdG9ycz1Nb2R1bGVbXCJfX193YXNtX2NhbGxfY3RvcnNcIl09TW9kdWxlW1wiYXNtXCJdW1wiQVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX2luaXQ9TW9kdWxlW1wiX2luaXRcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX2luaXQ9TW9kdWxlW1wiX2luaXRcIl09TW9kdWxlW1wiYXNtXCJdW1wiQlwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX3JlZ2lzdGVyX3RlbnNvcj1Nb2R1bGVbXCJfcmVnaXN0ZXJfdGVuc29yXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9yZWdpc3Rlcl90ZW5zb3I9TW9kdWxlW1wiX3JlZ2lzdGVyX3RlbnNvclwiXT1Nb2R1bGVbXCJhc21cIl1bXCJDXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfZGlzcG9zZV9kYXRhPU1vZHVsZVtcIl9kaXNwb3NlX2RhdGFcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX2Rpc3Bvc2VfZGF0YT1Nb2R1bGVbXCJfZGlzcG9zZV9kYXRhXCJdPU1vZHVsZVtcImFzbVwiXVtcIkRcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9kaXNwb3NlPU1vZHVsZVtcIl9kaXNwb3NlXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9kaXNwb3NlPU1vZHVsZVtcIl9kaXNwb3NlXCJdPU1vZHVsZVtcImFzbVwiXVtcIkVcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9BYnM9TW9kdWxlW1wiX0Fic1wiXT1mdW5jdGlvbigpe3JldHVybihfQWJzPU1vZHVsZVtcIl9BYnNcIl09TW9kdWxlW1wiYXNtXCJdW1wiR1wiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0FkZD1Nb2R1bGVbXCJfQWRkXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9BZGQ9TW9kdWxlW1wiX0FkZFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJIXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfQWRkTj1Nb2R1bGVbXCJfQWRkTlwiXT1mdW5jdGlvbigpe3JldHVybihfQWRkTj1Nb2R1bGVbXCJfQWRkTlwiXT1Nb2R1bGVbXCJhc21cIl1bXCJJXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfQWxsPU1vZHVsZVtcIl9BbGxcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0FsbD1Nb2R1bGVbXCJfQWxsXCJdPU1vZHVsZVtcImFzbVwiXVtcIkpcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9Bbnk9TW9kdWxlW1wiX0FueVwiXT1mdW5jdGlvbigpe3JldHVybihfQW55PU1vZHVsZVtcIl9BbnlcIl09TW9kdWxlW1wiYXNtXCJdW1wiS1wiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0FyZ01heD1Nb2R1bGVbXCJfQXJnTWF4XCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9BcmdNYXg9TW9kdWxlW1wiX0FyZ01heFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJMXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfQXZnUG9vbD1Nb2R1bGVbXCJfQXZnUG9vbFwiXT1mdW5jdGlvbigpe3JldHVybihfQXZnUG9vbD1Nb2R1bGVbXCJfQXZnUG9vbFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJNXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfQmF0Y2hNYXRNdWw9TW9kdWxlW1wiX0JhdGNoTWF0TXVsXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9CYXRjaE1hdE11bD1Nb2R1bGVbXCJfQmF0Y2hNYXRNdWxcIl09TW9kdWxlW1wiYXNtXCJdW1wiTlwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0NlaWw9TW9kdWxlW1wiX0NlaWxcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0NlaWw9TW9kdWxlW1wiX0NlaWxcIl09TW9kdWxlW1wiYXNtXCJdW1wiT1wiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0NsaXBCeVZhbHVlPU1vZHVsZVtcIl9DbGlwQnlWYWx1ZVwiXT1mdW5jdGlvbigpe3JldHVybihfQ2xpcEJ5VmFsdWU9TW9kdWxlW1wiX0NsaXBCeVZhbHVlXCJdPU1vZHVsZVtcImFzbVwiXVtcIlBcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9Db252MkQ9TW9kdWxlW1wiX0NvbnYyRFwiXT1mdW5jdGlvbigpe3JldHVybihfQ29udjJEPU1vZHVsZVtcIl9Db252MkRcIl09TW9kdWxlW1wiYXNtXCJdW1wiUVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0NvbnYyREJhY2twcm9wSW5wdXQ9TW9kdWxlW1wiX0NvbnYyREJhY2twcm9wSW5wdXRcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0NvbnYyREJhY2twcm9wSW5wdXQ9TW9kdWxlW1wiX0NvbnYyREJhY2twcm9wSW5wdXRcIl09TW9kdWxlW1wiYXNtXCJdW1wiUlwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0Nvcz1Nb2R1bGVbXCJfQ29zXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9Db3M9TW9kdWxlW1wiX0Nvc1wiXT1Nb2R1bGVbXCJhc21cIl1bXCJTXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfQ29zaD1Nb2R1bGVbXCJfQ29zaFwiXT1mdW5jdGlvbigpe3JldHVybihfQ29zaD1Nb2R1bGVbXCJfQ29zaFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJUXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfQ3JvcEFuZFJlc2l6ZT1Nb2R1bGVbXCJfQ3JvcEFuZFJlc2l6ZVwiXT1mdW5jdGlvbigpe3JldHVybihfQ3JvcEFuZFJlc2l6ZT1Nb2R1bGVbXCJfQ3JvcEFuZFJlc2l6ZVwiXT1Nb2R1bGVbXCJhc21cIl1bXCJVXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfQ3Vtc3VtPU1vZHVsZVtcIl9DdW1zdW1cIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0N1bXN1bT1Nb2R1bGVbXCJfQ3Vtc3VtXCJdPU1vZHVsZVtcImFzbVwiXVtcIlZcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9EZXB0aFRvU3BhY2U9TW9kdWxlW1wiX0RlcHRoVG9TcGFjZVwiXT1mdW5jdGlvbigpe3JldHVybihfRGVwdGhUb1NwYWNlPU1vZHVsZVtcIl9EZXB0aFRvU3BhY2VcIl09TW9kdWxlW1wiYXNtXCJdW1wiV1wiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0RlcHRod2lzZUNvbnYyZE5hdGl2ZT1Nb2R1bGVbXCJfRGVwdGh3aXNlQ29udjJkTmF0aXZlXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9EZXB0aHdpc2VDb252MmROYXRpdmU9TW9kdWxlW1wiX0RlcHRod2lzZUNvbnYyZE5hdGl2ZVwiXT1Nb2R1bGVbXCJhc21cIl1bXCJYXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfRXF1YWw9TW9kdWxlW1wiX0VxdWFsXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9FcXVhbD1Nb2R1bGVbXCJfRXF1YWxcIl09TW9kdWxlW1wiYXNtXCJdW1wiWVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0V4cD1Nb2R1bGVbXCJfRXhwXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9FeHA9TW9kdWxlW1wiX0V4cFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJaXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfRmxpcExlZnRSaWdodD1Nb2R1bGVbXCJfRmxpcExlZnRSaWdodFwiXT1mdW5jdGlvbigpe3JldHVybihfRmxpcExlZnRSaWdodD1Nb2R1bGVbXCJfRmxpcExlZnRSaWdodFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJfXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfRmxvb3I9TW9kdWxlW1wiX0Zsb29yXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9GbG9vcj1Nb2R1bGVbXCJfRmxvb3JcIl09TW9kdWxlW1wiYXNtXCJdW1wiJFwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0Zsb29yRGl2PU1vZHVsZVtcIl9GbG9vckRpdlwiXT1mdW5jdGlvbigpe3JldHVybihfRmxvb3JEaXY9TW9kdWxlW1wiX0Zsb29yRGl2XCJdPU1vZHVsZVtcImFzbVwiXVtcImFhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfRnVzZWRCYXRjaE5vcm09TW9kdWxlW1wiX0Z1c2VkQmF0Y2hOb3JtXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9GdXNlZEJhdGNoTm9ybT1Nb2R1bGVbXCJfRnVzZWRCYXRjaE5vcm1cIl09TW9kdWxlW1wiYXNtXCJdW1wiYmFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9GdXNlZENvbnYyRD1Nb2R1bGVbXCJfRnVzZWRDb252MkRcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0Z1c2VkQ29udjJEPU1vZHVsZVtcIl9GdXNlZENvbnYyRFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJjYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0Z1c2VkRGVwdGh3aXNlQ29udjJEPU1vZHVsZVtcIl9GdXNlZERlcHRod2lzZUNvbnYyRFwiXT1mdW5jdGlvbigpe3JldHVybihfRnVzZWREZXB0aHdpc2VDb252MkQ9TW9kdWxlW1wiX0Z1c2VkRGVwdGh3aXNlQ29udjJEXCJdPU1vZHVsZVtcImFzbVwiXVtcImRhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfR2F0aGVyPU1vZHVsZVtcIl9HYXRoZXJcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0dhdGhlcj1Nb2R1bGVbXCJfR2F0aGVyXCJdPU1vZHVsZVtcImFzbVwiXVtcImVhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfR2F0aGVyTmQ9TW9kdWxlW1wiX0dhdGhlck5kXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9HYXRoZXJOZD1Nb2R1bGVbXCJfR2F0aGVyTmRcIl09TW9kdWxlW1wiYXNtXCJdW1wiZmFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9HcmVhdGVyPU1vZHVsZVtcIl9HcmVhdGVyXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9HcmVhdGVyPU1vZHVsZVtcIl9HcmVhdGVyXCJdPU1vZHVsZVtcImFzbVwiXVtcImdhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfR3JlYXRlckVxdWFsPU1vZHVsZVtcIl9HcmVhdGVyRXF1YWxcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0dyZWF0ZXJFcXVhbD1Nb2R1bGVbXCJfR3JlYXRlckVxdWFsXCJdPU1vZHVsZVtcImFzbVwiXVtcImhhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfTGVha3lSZWx1PU1vZHVsZVtcIl9MZWFreVJlbHVcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0xlYWt5UmVsdT1Nb2R1bGVbXCJfTGVha3lSZWx1XCJdPU1vZHVsZVtcImFzbVwiXVtcImlhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfTGVzcz1Nb2R1bGVbXCJfTGVzc1wiXT1mdW5jdGlvbigpe3JldHVybihfTGVzcz1Nb2R1bGVbXCJfTGVzc1wiXT1Nb2R1bGVbXCJhc21cIl1bXCJqYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0xlc3NFcXVhbD1Nb2R1bGVbXCJfTGVzc0VxdWFsXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9MZXNzRXF1YWw9TW9kdWxlW1wiX0xlc3NFcXVhbFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJrYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0xvZz1Nb2R1bGVbXCJfTG9nXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9Mb2c9TW9kdWxlW1wiX0xvZ1wiXT1Nb2R1bGVbXCJhc21cIl1bXCJsYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0xvZ2ljYWxBbmQ9TW9kdWxlW1wiX0xvZ2ljYWxBbmRcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0xvZ2ljYWxBbmQ9TW9kdWxlW1wiX0xvZ2ljYWxBbmRcIl09TW9kdWxlW1wiYXNtXCJdW1wibWFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9NYXg9TW9kdWxlW1wiX01heFwiXT1mdW5jdGlvbigpe3JldHVybihfTWF4PU1vZHVsZVtcIl9NYXhcIl09TW9kdWxlW1wiYXNtXCJdW1wibmFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9NYXhQb29sPU1vZHVsZVtcIl9NYXhQb29sXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9NYXhQb29sPU1vZHVsZVtcIl9NYXhQb29sXCJdPU1vZHVsZVtcImFzbVwiXVtcIm9hXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfTWF4aW11bT1Nb2R1bGVbXCJfTWF4aW11bVwiXT1mdW5jdGlvbigpe3JldHVybihfTWF4aW11bT1Nb2R1bGVbXCJfTWF4aW11bVwiXT1Nb2R1bGVbXCJhc21cIl1bXCJwYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX01lYW49TW9kdWxlW1wiX01lYW5cIl09ZnVuY3Rpb24oKXtyZXR1cm4oX01lYW49TW9kdWxlW1wiX01lYW5cIl09TW9kdWxlW1wiYXNtXCJdW1wicWFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9NaW49TW9kdWxlW1wiX01pblwiXT1mdW5jdGlvbigpe3JldHVybihfTWluPU1vZHVsZVtcIl9NaW5cIl09TW9kdWxlW1wiYXNtXCJdW1wicmFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9NaW5pbXVtPU1vZHVsZVtcIl9NaW5pbXVtXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9NaW5pbXVtPU1vZHVsZVtcIl9NaW5pbXVtXCJdPU1vZHVsZVtcImFzbVwiXVtcInNhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfTWlycm9yUGFkPU1vZHVsZVtcIl9NaXJyb3JQYWRcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX01pcnJvclBhZD1Nb2R1bGVbXCJfTWlycm9yUGFkXCJdPU1vZHVsZVtcImFzbVwiXVtcInRhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfTXVsdGlwbHk9TW9kdWxlW1wiX011bHRpcGx5XCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9NdWx0aXBseT1Nb2R1bGVbXCJfTXVsdGlwbHlcIl09TW9kdWxlW1wiYXNtXCJdW1widWFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9OZWc9TW9kdWxlW1wiX05lZ1wiXT1mdW5jdGlvbigpe3JldHVybihfTmVnPU1vZHVsZVtcIl9OZWdcIl09TW9kdWxlW1wiYXNtXCJdW1widmFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9Ob25NYXhTdXBwcmVzc2lvblYzPU1vZHVsZVtcIl9Ob25NYXhTdXBwcmVzc2lvblYzXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9Ob25NYXhTdXBwcmVzc2lvblYzPU1vZHVsZVtcIl9Ob25NYXhTdXBwcmVzc2lvblYzXCJdPU1vZHVsZVtcImFzbVwiXVtcIndhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfTm9uTWF4U3VwcHJlc3Npb25WND1Nb2R1bGVbXCJfTm9uTWF4U3VwcHJlc3Npb25WNFwiXT1mdW5jdGlvbigpe3JldHVybihfTm9uTWF4U3VwcHJlc3Npb25WND1Nb2R1bGVbXCJfTm9uTWF4U3VwcHJlc3Npb25WNFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJ4YVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX05vbk1heFN1cHByZXNzaW9uVjU9TW9kdWxlW1wiX05vbk1heFN1cHByZXNzaW9uVjVcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX05vbk1heFN1cHByZXNzaW9uVjU9TW9kdWxlW1wiX05vbk1heFN1cHByZXNzaW9uVjVcIl09TW9kdWxlW1wiYXNtXCJdW1wieWFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9Ob3RFcXVhbD1Nb2R1bGVbXCJfTm90RXF1YWxcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX05vdEVxdWFsPU1vZHVsZVtcIl9Ob3RFcXVhbFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJ6YVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX09uZUhvdD1Nb2R1bGVbXCJfT25lSG90XCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9PbmVIb3Q9TW9kdWxlW1wiX09uZUhvdFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJBYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1BhZFYyPU1vZHVsZVtcIl9QYWRWMlwiXT1mdW5jdGlvbigpe3JldHVybihfUGFkVjI9TW9kdWxlW1wiX1BhZFYyXCJdPU1vZHVsZVtcImFzbVwiXVtcIkJhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfUG93PU1vZHVsZVtcIl9Qb3dcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1Bvdz1Nb2R1bGVbXCJfUG93XCJdPU1vZHVsZVtcImFzbVwiXVtcIkNhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfUHJlbHU9TW9kdWxlW1wiX1ByZWx1XCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9QcmVsdT1Nb2R1bGVbXCJfUHJlbHVcIl09TW9kdWxlW1wiYXNtXCJdW1wiRGFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9Qcm9kPU1vZHVsZVtcIl9Qcm9kXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9Qcm9kPU1vZHVsZVtcIl9Qcm9kXCJdPU1vZHVsZVtcImFzbVwiXVtcIkVhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfUmVhbERpdj1Nb2R1bGVbXCJfUmVhbERpdlwiXT1mdW5jdGlvbigpe3JldHVybihfUmVhbERpdj1Nb2R1bGVbXCJfUmVhbERpdlwiXT1Nb2R1bGVbXCJhc21cIl1bXCJGYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1JlbHU9TW9kdWxlW1wiX1JlbHVcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1JlbHU9TW9kdWxlW1wiX1JlbHVcIl09TW9kdWxlW1wiYXNtXCJdW1wiR2FcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9SZWx1Nj1Nb2R1bGVbXCJfUmVsdTZcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1JlbHU2PU1vZHVsZVtcIl9SZWx1NlwiXT1Nb2R1bGVbXCJhc21cIl1bXCJIYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1Jlc2l6ZUJpbGluZWFyPU1vZHVsZVtcIl9SZXNpemVCaWxpbmVhclwiXT1mdW5jdGlvbigpe3JldHVybihfUmVzaXplQmlsaW5lYXI9TW9kdWxlW1wiX1Jlc2l6ZUJpbGluZWFyXCJdPU1vZHVsZVtcImFzbVwiXVtcIklhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfUmV2ZXJzZT1Nb2R1bGVbXCJfUmV2ZXJzZVwiXT1mdW5jdGlvbigpe3JldHVybihfUmV2ZXJzZT1Nb2R1bGVbXCJfUmV2ZXJzZVwiXT1Nb2R1bGVbXCJhc21cIl1bXCJKYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1JvdGF0ZVdpdGhPZmZzZXQ9TW9kdWxlW1wiX1JvdGF0ZVdpdGhPZmZzZXRcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1JvdGF0ZVdpdGhPZmZzZXQ9TW9kdWxlW1wiX1JvdGF0ZVdpdGhPZmZzZXRcIl09TW9kdWxlW1wiYXNtXCJdW1wiS2FcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9Sb3VuZD1Nb2R1bGVbXCJfUm91bmRcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1JvdW5kPU1vZHVsZVtcIl9Sb3VuZFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJMYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1JzcXJ0PU1vZHVsZVtcIl9Sc3FydFwiXT1mdW5jdGlvbigpe3JldHVybihfUnNxcnQ9TW9kdWxlW1wiX1JzcXJ0XCJdPU1vZHVsZVtcImFzbVwiXVtcIk1hXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfU2NhdHRlck5kPU1vZHVsZVtcIl9TY2F0dGVyTmRcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1NjYXR0ZXJOZD1Nb2R1bGVbXCJfU2NhdHRlck5kXCJdPU1vZHVsZVtcImFzbVwiXVtcIk5hXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfU2VsZWN0VjI9TW9kdWxlW1wiX1NlbGVjdFYyXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9TZWxlY3RWMj1Nb2R1bGVbXCJfU2VsZWN0VjJcIl09TW9kdWxlW1wiYXNtXCJdW1wiT2FcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9TaWdtb2lkPU1vZHVsZVtcIl9TaWdtb2lkXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9TaWdtb2lkPU1vZHVsZVtcIl9TaWdtb2lkXCJdPU1vZHVsZVtcImFzbVwiXVtcIlBhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfU2luPU1vZHVsZVtcIl9TaW5cIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1Npbj1Nb2R1bGVbXCJfU2luXCJdPU1vZHVsZVtcImFzbVwiXVtcIlFhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfU29mdG1heD1Nb2R1bGVbXCJfU29mdG1heFwiXT1mdW5jdGlvbigpe3JldHVybihfU29mdG1heD1Nb2R1bGVbXCJfU29mdG1heFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJSYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1NxcnQ9TW9kdWxlW1wiX1NxcnRcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1NxcnQ9TW9kdWxlW1wiX1NxcnRcIl09TW9kdWxlW1wiYXNtXCJdW1wiU2FcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9TcXVhcmU9TW9kdWxlW1wiX1NxdWFyZVwiXT1mdW5jdGlvbigpe3JldHVybihfU3F1YXJlPU1vZHVsZVtcIl9TcXVhcmVcIl09TW9kdWxlW1wiYXNtXCJdW1wiVGFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9TcXVhcmVkRGlmZmVyZW5jZT1Nb2R1bGVbXCJfU3F1YXJlZERpZmZlcmVuY2VcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1NxdWFyZWREaWZmZXJlbmNlPU1vZHVsZVtcIl9TcXVhcmVkRGlmZmVyZW5jZVwiXT1Nb2R1bGVbXCJhc21cIl1bXCJVYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1N0ZXA9TW9kdWxlW1wiX1N0ZXBcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1N0ZXA9TW9kdWxlW1wiX1N0ZXBcIl09TW9kdWxlW1wiYXNtXCJdW1wiVmFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9TdHJpZGVkU2xpY2U9TW9kdWxlW1wiX1N0cmlkZWRTbGljZVwiXT1mdW5jdGlvbigpe3JldHVybihfU3RyaWRlZFNsaWNlPU1vZHVsZVtcIl9TdHJpZGVkU2xpY2VcIl09TW9kdWxlW1wiYXNtXCJdW1wiV2FcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9TdWI9TW9kdWxlW1wiX1N1YlwiXT1mdW5jdGlvbigpe3JldHVybihfU3ViPU1vZHVsZVtcIl9TdWJcIl09TW9kdWxlW1wiYXNtXCJdW1wiWGFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9TdW09TW9kdWxlW1wiX1N1bVwiXT1mdW5jdGlvbigpe3JldHVybihfU3VtPU1vZHVsZVtcIl9TdW1cIl09TW9kdWxlW1wiYXNtXCJdW1wiWWFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9UYW49TW9kdWxlW1wiX1RhblwiXT1mdW5jdGlvbigpe3JldHVybihfVGFuPU1vZHVsZVtcIl9UYW5cIl09TW9kdWxlW1wiYXNtXCJdW1wiWmFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9UYW5oPU1vZHVsZVtcIl9UYW5oXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9UYW5oPU1vZHVsZVtcIl9UYW5oXCJdPU1vZHVsZVtcImFzbVwiXVtcIl9hXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfVGlsZT1Nb2R1bGVbXCJfVGlsZVwiXT1mdW5jdGlvbigpe3JldHVybihfVGlsZT1Nb2R1bGVbXCJfVGlsZVwiXT1Nb2R1bGVbXCJhc21cIl1bXCIkYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1RvcEs9TW9kdWxlW1wiX1RvcEtcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1RvcEs9TW9kdWxlW1wiX1RvcEtcIl09TW9kdWxlW1wiYXNtXCJdW1wiYWJcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9UcmFuc2Zvcm09TW9kdWxlW1wiX1RyYW5zZm9ybVwiXT1mdW5jdGlvbigpe3JldHVybihfVHJhbnNmb3JtPU1vZHVsZVtcIl9UcmFuc2Zvcm1cIl09TW9kdWxlW1wiYXNtXCJdW1wiYmJcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9UcmFuc3Bvc2U9TW9kdWxlW1wiX1RyYW5zcG9zZVwiXT1mdW5jdGlvbigpe3JldHVybihfVHJhbnNwb3NlPU1vZHVsZVtcIl9UcmFuc3Bvc2VcIl09TW9kdWxlW1wiYXNtXCJdW1wiY2JcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9fRnVzZWRNYXRNdWw9TW9kdWxlW1wiX19GdXNlZE1hdE11bFwiXT1mdW5jdGlvbigpe3JldHVybihfX0Z1c2VkTWF0TXVsPU1vZHVsZVtcIl9fRnVzZWRNYXRNdWxcIl09TW9kdWxlW1wiYXNtXCJdW1wiZGJcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9tYWxsb2M9TW9kdWxlW1wiX21hbGxvY1wiXT1mdW5jdGlvbigpe3JldHVybihfbWFsbG9jPU1vZHVsZVtcIl9tYWxsb2NcIl09TW9kdWxlW1wiYXNtXCJdW1wiZWJcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9mcmVlPU1vZHVsZVtcIl9mcmVlXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9mcmVlPU1vZHVsZVtcIl9mcmVlXCJdPU1vZHVsZVtcImFzbVwiXVtcImZiXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfX19lcnJub19sb2NhdGlvbj1Nb2R1bGVbXCJfX19lcnJub19sb2NhdGlvblwiXT1mdW5jdGlvbigpe3JldHVybihfX19lcnJub19sb2NhdGlvbj1Nb2R1bGVbXCJfX19lcnJub19sb2NhdGlvblwiXT1Nb2R1bGVbXCJhc21cIl1bXCJnYlwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX2Vtc2NyaXB0ZW5fZ2V0X2dsb2JhbF9saWJjPU1vZHVsZVtcIl9lbXNjcmlwdGVuX2dldF9nbG9iYWxfbGliY1wiXT1mdW5jdGlvbigpe3JldHVybihfZW1zY3JpcHRlbl9nZXRfZ2xvYmFsX2xpYmM9TW9kdWxlW1wiX2Vtc2NyaXB0ZW5fZ2V0X2dsb2JhbF9saWJjXCJdPU1vZHVsZVtcImFzbVwiXVtcImhiXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfcHRocmVhZF9zZWxmPU1vZHVsZVtcIl9wdGhyZWFkX3NlbGZcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX3B0aHJlYWRfc2VsZj1Nb2R1bGVbXCJfcHRocmVhZF9zZWxmXCJdPU1vZHVsZVtcImFzbVwiXVtcImliXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfX19wdGhyZWFkX3RzZF9ydW5fZHRvcnM9TW9kdWxlW1wiX19fcHRocmVhZF90c2RfcnVuX2R0b3JzXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9fX3B0aHJlYWRfdHNkX3J1bl9kdG9ycz1Nb2R1bGVbXCJfX19wdGhyZWFkX3RzZF9ydW5fZHRvcnNcIl09TW9kdWxlW1wiYXNtXCJdW1wiamJcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9lbXNjcmlwdGVuX21haW5fdGhyZWFkX3Byb2Nlc3NfcXVldWVkX2NhbGxzPU1vZHVsZVtcIl9lbXNjcmlwdGVuX21haW5fdGhyZWFkX3Byb2Nlc3NfcXVldWVkX2NhbGxzXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9lbXNjcmlwdGVuX21haW5fdGhyZWFkX3Byb2Nlc3NfcXVldWVkX2NhbGxzPU1vZHVsZVtcIl9lbXNjcmlwdGVuX21haW5fdGhyZWFkX3Byb2Nlc3NfcXVldWVkX2NhbGxzXCJdPU1vZHVsZVtcImFzbVwiXVtcImtiXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfZW1zY3JpcHRlbl9jdXJyZW50X3RocmVhZF9wcm9jZXNzX3F1ZXVlZF9jYWxscz1Nb2R1bGVbXCJfZW1zY3JpcHRlbl9jdXJyZW50X3RocmVhZF9wcm9jZXNzX3F1ZXVlZF9jYWxsc1wiXT1mdW5jdGlvbigpe3JldHVybihfZW1zY3JpcHRlbl9jdXJyZW50X3RocmVhZF9wcm9jZXNzX3F1ZXVlZF9jYWxscz1Nb2R1bGVbXCJfZW1zY3JpcHRlbl9jdXJyZW50X3RocmVhZF9wcm9jZXNzX3F1ZXVlZF9jYWxsc1wiXT1Nb2R1bGVbXCJhc21cIl1bXCJsYlwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX2Vtc2NyaXB0ZW5fcmVnaXN0ZXJfbWFpbl9icm93c2VyX3RocmVhZF9pZD1Nb2R1bGVbXCJfZW1zY3JpcHRlbl9yZWdpc3Rlcl9tYWluX2Jyb3dzZXJfdGhyZWFkX2lkXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9lbXNjcmlwdGVuX3JlZ2lzdGVyX21haW5fYnJvd3Nlcl90aHJlYWRfaWQ9TW9kdWxlW1wiX2Vtc2NyaXB0ZW5fcmVnaXN0ZXJfbWFpbl9icm93c2VyX3RocmVhZF9pZFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJtYlwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX19lbXNjcmlwdGVuX2RvX2Rpc3BhdGNoX3RvX3RocmVhZD1Nb2R1bGVbXCJfX2Vtc2NyaXB0ZW5fZG9fZGlzcGF0Y2hfdG9fdGhyZWFkXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9fZW1zY3JpcHRlbl9kb19kaXNwYXRjaF90b190aHJlYWQ9TW9kdWxlW1wiX19lbXNjcmlwdGVuX2RvX2Rpc3BhdGNoX3RvX3RocmVhZFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJuYlwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX2Vtc2NyaXB0ZW5fc3luY19ydW5faW5fbWFpbl90aHJlYWRfND1Nb2R1bGVbXCJfZW1zY3JpcHRlbl9zeW5jX3J1bl9pbl9tYWluX3RocmVhZF80XCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9lbXNjcmlwdGVuX3N5bmNfcnVuX2luX21haW5fdGhyZWFkXzQ9TW9kdWxlW1wiX2Vtc2NyaXB0ZW5fc3luY19ydW5faW5fbWFpbl90aHJlYWRfNFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJvYlwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX2Vtc2NyaXB0ZW5fcnVuX2luX21haW5fcnVudGltZV90aHJlYWRfanM9TW9kdWxlW1wiX2Vtc2NyaXB0ZW5fcnVuX2luX21haW5fcnVudGltZV90aHJlYWRfanNcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX2Vtc2NyaXB0ZW5fcnVuX2luX21haW5fcnVudGltZV90aHJlYWRfanM9TW9kdWxlW1wiX2Vtc2NyaXB0ZW5fcnVuX2luX21haW5fcnVudGltZV90aHJlYWRfanNcIl09TW9kdWxlW1wiYXNtXCJdW1wicGJcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9fZW1zY3JpcHRlbl9jYWxsX29uX3RocmVhZD1Nb2R1bGVbXCJfX2Vtc2NyaXB0ZW5fY2FsbF9vbl90aHJlYWRcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX19lbXNjcmlwdGVuX2NhbGxfb25fdGhyZWFkPU1vZHVsZVtcIl9fZW1zY3JpcHRlbl9jYWxsX29uX3RocmVhZFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJxYlwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX2Vtc2NyaXB0ZW5fdGxzX2luaXQ9TW9kdWxlW1wiX2Vtc2NyaXB0ZW5fdGxzX2luaXRcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX2Vtc2NyaXB0ZW5fdGxzX2luaXQ9TW9kdWxlW1wiX2Vtc2NyaXB0ZW5fdGxzX2luaXRcIl09TW9kdWxlW1wiYXNtXCJdW1wicmJcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9fZW1zY3JpcHRlbl90aHJlYWRfaW5pdD1Nb2R1bGVbXCJfX2Vtc2NyaXB0ZW5fdGhyZWFkX2luaXRcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX19lbXNjcmlwdGVuX3RocmVhZF9pbml0PU1vZHVsZVtcIl9fZW1zY3JpcHRlbl90aHJlYWRfaW5pdFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJzYlwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgc3RhY2tTYXZlPU1vZHVsZVtcInN0YWNrU2F2ZVwiXT1mdW5jdGlvbigpe3JldHVybihzdGFja1NhdmU9TW9kdWxlW1wic3RhY2tTYXZlXCJdPU1vZHVsZVtcImFzbVwiXVtcInRiXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBzdGFja1Jlc3RvcmU9TW9kdWxlW1wic3RhY2tSZXN0b3JlXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKHN0YWNrUmVzdG9yZT1Nb2R1bGVbXCJzdGFja1Jlc3RvcmVcIl09TW9kdWxlW1wiYXNtXCJdW1widWJcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIHN0YWNrQWxsb2M9TW9kdWxlW1wic3RhY2tBbGxvY1wiXT1mdW5jdGlvbigpe3JldHVybihzdGFja0FsbG9jPU1vZHVsZVtcInN0YWNrQWxsb2NcIl09TW9kdWxlW1wiYXNtXCJdW1widmJcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9lbXNjcmlwdGVuX3N0YWNrX3NldF9saW1pdHM9TW9kdWxlW1wiX2Vtc2NyaXB0ZW5fc3RhY2tfc2V0X2xpbWl0c1wiXT1mdW5jdGlvbigpe3JldHVybihfZW1zY3JpcHRlbl9zdGFja19zZXRfbGltaXRzPU1vZHVsZVtcIl9lbXNjcmlwdGVuX3N0YWNrX3NldF9saW1pdHNcIl09TW9kdWxlW1wiYXNtXCJdW1wid2JcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9tZW1hbGlnbj1Nb2R1bGVbXCJfbWVtYWxpZ25cIl09ZnVuY3Rpb24oKXtyZXR1cm4oX21lbWFsaWduPU1vZHVsZVtcIl9tZW1hbGlnblwiXT1Nb2R1bGVbXCJhc21cIl1bXCJ4YlwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX19lbXNjcmlwdGVuX2FsbG93X21haW5fcnVudGltZV9xdWV1ZWRfY2FsbHM9TW9kdWxlW1wiX19lbXNjcmlwdGVuX2FsbG93X21haW5fcnVudGltZV9xdWV1ZWRfY2FsbHNcIl09OTgyNDt2YXIgX19lbXNjcmlwdGVuX21haW5fdGhyZWFkX2Z1dGV4PU1vZHVsZVtcIl9fZW1zY3JpcHRlbl9tYWluX3RocmVhZF9mdXRleFwiXT0xMTQ0ODtNb2R1bGVbXCJjd3JhcFwiXT1jd3JhcDtNb2R1bGVbXCJQVGhyZWFkXCJdPVBUaHJlYWQ7TW9kdWxlW1wiUFRocmVhZFwiXT1QVGhyZWFkO01vZHVsZVtcIndhc21NZW1vcnlcIl09d2FzbU1lbW9yeTtNb2R1bGVbXCJFeGl0U3RhdHVzXCJdPUV4aXRTdGF0dXM7dmFyIGNhbGxlZFJ1bjtmdW5jdGlvbiBFeGl0U3RhdHVzKHN0YXR1cyl7dGhpcy5uYW1lPVwiRXhpdFN0YXR1c1wiO3RoaXMubWVzc2FnZT1cIlByb2dyYW0gdGVybWluYXRlZCB3aXRoIGV4aXQoXCIrc3RhdHVzK1wiKVwiO3RoaXMuc3RhdHVzPXN0YXR1c31kZXBlbmRlbmNpZXNGdWxmaWxsZWQ9ZnVuY3Rpb24gcnVuQ2FsbGVyKCl7aWYoIWNhbGxlZFJ1bilydW4oKTtpZighY2FsbGVkUnVuKWRlcGVuZGVuY2llc0Z1bGZpbGxlZD1ydW5DYWxsZXJ9O2Z1bmN0aW9uIHJ1bihhcmdzKXthcmdzPWFyZ3N8fGFyZ3VtZW50c187aWYocnVuRGVwZW5kZW5jaWVzPjApe3JldHVybn1pZihFTlZJUk9OTUVOVF9JU19QVEhSRUFEKXtyZWFkeVByb21pc2VSZXNvbHZlKE1vZHVsZSk7aW5pdFJ1bnRpbWUoKTtwb3N0TWVzc2FnZSh7XCJjbWRcIjpcImxvYWRlZFwifSk7cmV0dXJufXByZVJ1bigpO2lmKHJ1bkRlcGVuZGVuY2llcz4wKXtyZXR1cm59ZnVuY3Rpb24gZG9SdW4oKXtpZihjYWxsZWRSdW4pcmV0dXJuO2NhbGxlZFJ1bj10cnVlO01vZHVsZVtcImNhbGxlZFJ1blwiXT10cnVlO2lmKEFCT1JUKXJldHVybjtpbml0UnVudGltZSgpO3ByZU1haW4oKTtyZWFkeVByb21pc2VSZXNvbHZlKE1vZHVsZSk7aWYoTW9kdWxlW1wib25SdW50aW1lSW5pdGlhbGl6ZWRcIl0pTW9kdWxlW1wib25SdW50aW1lSW5pdGlhbGl6ZWRcIl0oKTtwb3N0UnVuKCl9aWYoTW9kdWxlW1wic2V0U3RhdHVzXCJdKXtNb2R1bGVbXCJzZXRTdGF0dXNcIl0oXCJSdW5uaW5nLi4uXCIpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7TW9kdWxlW1wic2V0U3RhdHVzXCJdKFwiXCIpfSwxKTtkb1J1bigpfSwxKX1lbHNle2RvUnVuKCl9fU1vZHVsZVtcInJ1blwiXT1ydW47ZnVuY3Rpb24gZXhpdChzdGF0dXMsaW1wbGljaXQpe2lmKGltcGxpY2l0JiZub0V4aXRSdW50aW1lJiZzdGF0dXM9PT0wKXtyZXR1cm59aWYoIWltcGxpY2l0KXtpZihFTlZJUk9OTUVOVF9JU19QVEhSRUFEKXtwb3N0TWVzc2FnZSh7XCJjbWRcIjpcImV4aXRQcm9jZXNzXCIsXCJyZXR1cm5Db2RlXCI6c3RhdHVzfSk7dGhyb3cgbmV3IEV4aXRTdGF0dXMoc3RhdHVzKX1lbHNle319aWYobm9FeGl0UnVudGltZSl7fWVsc2V7UFRocmVhZC50ZXJtaW5hdGVBbGxUaHJlYWRzKCk7RVhJVFNUQVRVUz1zdGF0dXM7ZXhpdFJ1bnRpbWUoKTtpZihNb2R1bGVbXCJvbkV4aXRcIl0pTW9kdWxlW1wib25FeGl0XCJdKHN0YXR1cyk7QUJPUlQ9dHJ1ZX1xdWl0XyhzdGF0dXMsbmV3IEV4aXRTdGF0dXMoc3RhdHVzKSl9aWYoTW9kdWxlW1wicHJlSW5pdFwiXSl7aWYodHlwZW9mIE1vZHVsZVtcInByZUluaXRcIl09PVwiZnVuY3Rpb25cIilNb2R1bGVbXCJwcmVJbml0XCJdPVtNb2R1bGVbXCJwcmVJbml0XCJdXTt3aGlsZShNb2R1bGVbXCJwcmVJbml0XCJdLmxlbmd0aD4wKXtNb2R1bGVbXCJwcmVJbml0XCJdLnBvcCgpKCl9fWlmKEVOVklST05NRU5UX0lTX1BUSFJFQUQpe25vRXhpdFJ1bnRpbWU9ZmFsc2U7UFRocmVhZC5pbml0V29ya2VyKCl9cnVuKCk7XG5cblxuICByZXR1cm4gV2FzbUJhY2tlbmRNb2R1bGVUaHJlYWRlZFNpbWQucmVhZHlcbn1cbik7XG59KSgpO1xuaWYgKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0JylcbiAgbW9kdWxlLmV4cG9ydHMgPSBXYXNtQmFja2VuZE1vZHVsZVRocmVhZGVkU2ltZDtcbmVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lWydhbWQnXSlcbiAgZGVmaW5lKFtdLCBmdW5jdGlvbigpIHsgcmV0dXJuIFdhc21CYWNrZW5kTW9kdWxlVGhyZWFkZWRTaW1kOyB9KTtcbmVsc2UgaWYgKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JylcbiAgZXhwb3J0c1tcIldhc21CYWNrZW5kTW9kdWxlVGhyZWFkZWRTaW1kXCJdID0gV2FzbUJhY2tlbmRNb2R1bGVUaHJlYWRlZFNpbWQ7XG4iLCJleHBvcnQgY29uc3Qgd2FzbVdvcmtlckNvbnRlbnRzID0gJ3ZhciBNb2R1bGU9e307ZnVuY3Rpb24gdGhyZWFkUHJpbnRFcnIoKXt2YXIgdGV4dD1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLmpvaW4oXCIgXCIpO2NvbnNvbGUuZXJyb3IodGV4dCl9ZnVuY3Rpb24gdGhyZWFkQWxlcnQoKXt2YXIgdGV4dD1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLmpvaW4oXCIgXCIpO3Bvc3RNZXNzYWdlKHtjbWQ6XCJhbGVydFwiLHRleHQ6dGV4dCx0aHJlYWRJZDpNb2R1bGVbXCJfcHRocmVhZF9zZWxmXCJdKCl9KX12YXIgZXJyPXRocmVhZFByaW50RXJyO3RoaXMuYWxlcnQ9dGhyZWFkQWxlcnQ7TW9kdWxlW1wiaW5zdGFudGlhdGVXYXNtXCJdPWZ1bmN0aW9uKGluZm8scmVjZWl2ZUluc3RhbmNlKXt2YXIgaW5zdGFuY2U9bmV3IFdlYkFzc2VtYmx5Lkluc3RhbmNlKE1vZHVsZVtcIndhc21Nb2R1bGVcIl0saW5mbyk7TW9kdWxlW1wid2FzbU1vZHVsZVwiXT1udWxsO3JlY2VpdmVJbnN0YW5jZShpbnN0YW5jZSk7cmV0dXJuIGluc3RhbmNlLmV4cG9ydHN9O2Z1bmN0aW9uIG1vZHVsZUxvYWRlZCgpe310aGlzLm9ubWVzc2FnZT1mdW5jdGlvbihlKXt0cnl7aWYoZS5kYXRhLmNtZD09PVwibG9hZFwiKXtNb2R1bGVbXCJ3YXNtTW9kdWxlXCJdPWUuZGF0YS53YXNtTW9kdWxlO01vZHVsZVtcIndhc21NZW1vcnlcIl09ZS5kYXRhLndhc21NZW1vcnk7TW9kdWxlW1wiYnVmZmVyXCJdPU1vZHVsZVtcIndhc21NZW1vcnlcIl0uYnVmZmVyO01vZHVsZVtcIkVOVklST05NRU5UX0lTX1BUSFJFQURcIl09dHJ1ZTtpZih0eXBlb2YgZS5kYXRhLnVybE9yQmxvYj09PVwic3RyaW5nXCIpe2ltcG9ydFNjcmlwdHMoZS5kYXRhLnVybE9yQmxvYil9ZWxzZXt2YXIgb2JqZWN0VXJsPVVSTC5jcmVhdGVPYmplY3RVUkwoZS5kYXRhLnVybE9yQmxvYik7aW1wb3J0U2NyaXB0cyhvYmplY3RVcmwpO1VSTC5yZXZva2VPYmplY3RVUkwob2JqZWN0VXJsKX1XYXNtQmFja2VuZE1vZHVsZVRocmVhZGVkU2ltZChNb2R1bGUpLnRoZW4oZnVuY3Rpb24oaW5zdGFuY2Upe01vZHVsZT1pbnN0YW5jZTttb2R1bGVMb2FkZWQoKX0pfWVsc2UgaWYoZS5kYXRhLmNtZD09PVwib2JqZWN0VHJhbnNmZXJcIil7TW9kdWxlW1wiUFRocmVhZFwiXS5yZWNlaXZlT2JqZWN0VHJhbnNmZXIoZS5kYXRhKX1lbHNlIGlmKGUuZGF0YS5jbWQ9PT1cInJ1blwiKXtNb2R1bGVbXCJfX3BlcmZvcm1hbmNlX25vd19jbG9ja19kcmlmdFwiXT1wZXJmb3JtYW5jZS5ub3coKS1lLmRhdGEudGltZTtNb2R1bGVbXCJfX2Vtc2NyaXB0ZW5fdGhyZWFkX2luaXRcIl0oZS5kYXRhLnRocmVhZEluZm9TdHJ1Y3QsMCwwKTt2YXIgbWF4PWUuZGF0YS5zdGFja0Jhc2U7dmFyIHRvcD1lLmRhdGEuc3RhY2tCYXNlK2UuZGF0YS5zdGFja1NpemU7TW9kdWxlW1wiZXN0YWJsaXNoU3RhY2tTcGFjZVwiXSh0b3AsbWF4KTtNb2R1bGVbXCJfZW1zY3JpcHRlbl90bHNfaW5pdFwiXSgpO01vZHVsZVtcIlBUaHJlYWRcIl0ucmVjZWl2ZU9iamVjdFRyYW5zZmVyKGUuZGF0YSk7TW9kdWxlW1wiUFRocmVhZFwiXS5zZXRUaHJlYWRTdGF0dXMoTW9kdWxlW1wiX3B0aHJlYWRfc2VsZlwiXSgpLDEpO3RyeXt2YXIgcmVzdWx0PU1vZHVsZVtcImludm9rZUVudHJ5UG9pbnRcIl0oZS5kYXRhLnN0YXJ0X3JvdXRpbmUsZS5kYXRhLmFyZyk7aWYoIU1vZHVsZVtcImdldE5vRXhpdFJ1bnRpbWVcIl0oKSlNb2R1bGVbXCJQVGhyZWFkXCJdLnRocmVhZEV4aXQocmVzdWx0KX1jYXRjaChleCl7aWYoZXg9PT1cIkNhbmNlbGVkIVwiKXtNb2R1bGVbXCJQVGhyZWFkXCJdLnRocmVhZENhbmNlbCgpfWVsc2UgaWYoZXghPVwidW53aW5kXCIpe2lmKGV4IGluc3RhbmNlb2YgTW9kdWxlW1wiRXhpdFN0YXR1c1wiXSl7aWYoTW9kdWxlW1wiZ2V0Tm9FeGl0UnVudGltZVwiXSgpKXt9ZWxzZXtNb2R1bGVbXCJQVGhyZWFkXCJdLnRocmVhZEV4aXQoZXguc3RhdHVzKX19ZWxzZXtNb2R1bGVbXCJQVGhyZWFkXCJdLnRocmVhZEV4aXQoLTIpO3Rocm93IGV4fX19fWVsc2UgaWYoZS5kYXRhLmNtZD09PVwiY2FuY2VsXCIpe2lmKE1vZHVsZVtcIl9wdGhyZWFkX3NlbGZcIl0oKSl7TW9kdWxlW1wiUFRocmVhZFwiXS50aHJlYWRDYW5jZWwoKX19ZWxzZSBpZihlLmRhdGEudGFyZ2V0PT09XCJzZXRpbW1lZGlhdGVcIil7fWVsc2UgaWYoZS5kYXRhLmNtZD09PVwicHJvY2Vzc1RocmVhZFF1ZXVlXCIpe2lmKE1vZHVsZVtcIl9wdGhyZWFkX3NlbGZcIl0oKSl7TW9kdWxlW1wiX2Vtc2NyaXB0ZW5fY3VycmVudF90aHJlYWRfcHJvY2Vzc19xdWV1ZWRfY2FsbHNcIl0oKX19ZWxzZXtlcnIoXCJ3b3JrZXIuanMgcmVjZWl2ZWQgdW5rbm93biBjb21tYW5kIFwiK2UuZGF0YS5jbWQpO2VycihlLmRhdGEpfX1jYXRjaChleCl7ZXJyKFwid29ya2VyLmpzIG9ubWVzc2FnZSgpIGNhcHR1cmVkIGFuIHVuY2F1Z2h0IGV4Y2VwdGlvbjogXCIrZXgpO2lmKGV4JiZleC5zdGFjayllcnIoZXguc3RhY2spO3Rocm93IGV4fX07aWYodHlwZW9mIHByb2Nlc3M9PT1cIm9iamVjdFwiJiZ0eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucz09PVwib2JqZWN0XCImJnR5cGVvZiBwcm9jZXNzLnZlcnNpb25zLm5vZGU9PT1cInN0cmluZ1wiKXtzZWxmPXtsb2NhdGlvbjp7aHJlZjpfX2ZpbGVuYW1lfX07dmFyIG9ubWVzc2FnZT10aGlzLm9ubWVzc2FnZTt2YXIgbm9kZVdvcmtlclRocmVhZHM9cmVxdWlyZShcIndvcmtlcl90aHJlYWRzXCIpO2dsb2JhbC5Xb3JrZXI9bm9kZVdvcmtlclRocmVhZHMuV29ya2VyO3ZhciBwYXJlbnRQb3J0PW5vZGVXb3JrZXJUaHJlYWRzLnBhcmVudFBvcnQ7cGFyZW50UG9ydC5vbihcIm1lc3NhZ2VcIixmdW5jdGlvbihkYXRhKXtvbm1lc3NhZ2Uoe2RhdGE6ZGF0YX0pfSk7dmFyIG5vZGVGUz1yZXF1aXJlKFwiZnNcIik7dmFyIG5vZGVSZWFkPWZ1bmN0aW9uKGZpbGVuYW1lKXtyZXR1cm4gbm9kZUZTLnJlYWRGaWxlU3luYyhmaWxlbmFtZSxcInV0ZjhcIil9O2Z1bmN0aW9uIGdsb2JhbEV2YWwoeCl7Z2xvYmFsLnJlcXVpcmU9cmVxdWlyZTtnbG9iYWwuTW9kdWxlPU1vZHVsZTtldmFsLmNhbGwobnVsbCx4KX1pbXBvcnRTY3JpcHRzPWZ1bmN0aW9uKGYpe2dsb2JhbEV2YWwobm9kZVJlYWQoZikpfTtwb3N0TWVzc2FnZT1mdW5jdGlvbihtc2cpe3BhcmVudFBvcnQucG9zdE1lc3NhZ2UobXNnKX07aWYodHlwZW9mIHBlcmZvcm1hbmNlPT09XCJ1bmRlZmluZWRcIil7cGVyZm9ybWFuY2U9e25vdzpmdW5jdGlvbigpe3JldHVybiBEYXRlLm5vdygpfX19fSc7IiwiXG52YXIgV2FzbUJhY2tlbmRNb2R1bGUgPSAoZnVuY3Rpb24oKSB7XG4gIHZhciBfc2NyaXB0RGlyID0gdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiBkb2N1bWVudC5jdXJyZW50U2NyaXB0ID8gZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmMgOiB1bmRlZmluZWQ7XG4gIGlmICh0eXBlb2YgX19maWxlbmFtZSAhPT0gJ3VuZGVmaW5lZCcpIF9zY3JpcHREaXIgPSBfc2NyaXB0RGlyIHx8IF9fZmlsZW5hbWU7XG4gIHJldHVybiAoXG5mdW5jdGlvbihXYXNtQmFja2VuZE1vZHVsZSkge1xuICBXYXNtQmFja2VuZE1vZHVsZSA9IFdhc21CYWNrZW5kTW9kdWxlIHx8IHt9O1xuXG52YXIgTW9kdWxlPXR5cGVvZiBXYXNtQmFja2VuZE1vZHVsZSE9PVwidW5kZWZpbmVkXCI/V2FzbUJhY2tlbmRNb2R1bGU6e307dmFyIHJlYWR5UHJvbWlzZVJlc29sdmUscmVhZHlQcm9taXNlUmVqZWN0O01vZHVsZVtcInJlYWR5XCJdPW5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUscmVqZWN0KXtyZWFkeVByb21pc2VSZXNvbHZlPXJlc29sdmU7cmVhZHlQcm9taXNlUmVqZWN0PXJlamVjdH0pO3ZhciBtb2R1bGVPdmVycmlkZXM9e307dmFyIGtleTtmb3Ioa2V5IGluIE1vZHVsZSl7aWYoTW9kdWxlLmhhc093blByb3BlcnR5KGtleSkpe21vZHVsZU92ZXJyaWRlc1trZXldPU1vZHVsZVtrZXldfX12YXIgYXJndW1lbnRzXz1bXTt2YXIgdGhpc1Byb2dyYW09XCIuL3RoaXMucHJvZ3JhbVwiO3ZhciBxdWl0Xz1mdW5jdGlvbihzdGF0dXMsdG9UaHJvdyl7dGhyb3cgdG9UaHJvd307dmFyIEVOVklST05NRU5UX0lTX1dFQj1mYWxzZTt2YXIgRU5WSVJPTk1FTlRfSVNfV09SS0VSPWZhbHNlO3ZhciBFTlZJUk9OTUVOVF9JU19OT0RFPWZhbHNlO3ZhciBFTlZJUk9OTUVOVF9JU19TSEVMTD1mYWxzZTtFTlZJUk9OTUVOVF9JU19XRUI9dHlwZW9mIHdpbmRvdz09PVwib2JqZWN0XCI7RU5WSVJPTk1FTlRfSVNfV09SS0VSPXR5cGVvZiBpbXBvcnRTY3JpcHRzPT09XCJmdW5jdGlvblwiO0VOVklST05NRU5UX0lTX05PREU9dHlwZW9mIHByb2Nlc3M9PT1cIm9iamVjdFwiJiZ0eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucz09PVwib2JqZWN0XCImJnR5cGVvZiBwcm9jZXNzLnZlcnNpb25zLm5vZGU9PT1cInN0cmluZ1wiO0VOVklST05NRU5UX0lTX1NIRUxMPSFFTlZJUk9OTUVOVF9JU19XRUImJiFFTlZJUk9OTUVOVF9JU19OT0RFJiYhRU5WSVJPTk1FTlRfSVNfV09SS0VSO3ZhciBzY3JpcHREaXJlY3Rvcnk9XCJcIjtmdW5jdGlvbiBsb2NhdGVGaWxlKHBhdGgpe2lmKE1vZHVsZVtcImxvY2F0ZUZpbGVcIl0pe3JldHVybiBNb2R1bGVbXCJsb2NhdGVGaWxlXCJdKHBhdGgsc2NyaXB0RGlyZWN0b3J5KX1yZXR1cm4gc2NyaXB0RGlyZWN0b3J5K3BhdGh9dmFyIHJlYWRfLHJlYWRBc3luYyxyZWFkQmluYXJ5LHNldFdpbmRvd1RpdGxlO3ZhciBub2RlRlM7dmFyIG5vZGVQYXRoO2lmKEVOVklST05NRU5UX0lTX05PREUpe2lmKEVOVklST05NRU5UX0lTX1dPUktFUil7c2NyaXB0RGlyZWN0b3J5PXJlcXVpcmUoXCJwYXRoXCIpLmRpcm5hbWUoc2NyaXB0RGlyZWN0b3J5KStcIi9cIn1lbHNle3NjcmlwdERpcmVjdG9yeT1fX2Rpcm5hbWUrXCIvXCJ9cmVhZF89ZnVuY3Rpb24gc2hlbGxfcmVhZChmaWxlbmFtZSxiaW5hcnkpe2lmKCFub2RlRlMpbm9kZUZTPXJlcXVpcmUoXCJmc1wiKTtpZighbm9kZVBhdGgpbm9kZVBhdGg9cmVxdWlyZShcInBhdGhcIik7ZmlsZW5hbWU9bm9kZVBhdGhbXCJub3JtYWxpemVcIl0oZmlsZW5hbWUpO3JldHVybiBub2RlRlNbXCJyZWFkRmlsZVN5bmNcIl0oZmlsZW5hbWUsYmluYXJ5P251bGw6XCJ1dGY4XCIpfTtyZWFkQmluYXJ5PWZ1bmN0aW9uIHJlYWRCaW5hcnkoZmlsZW5hbWUpe3ZhciByZXQ9cmVhZF8oZmlsZW5hbWUsdHJ1ZSk7aWYoIXJldC5idWZmZXIpe3JldD1uZXcgVWludDhBcnJheShyZXQpfWFzc2VydChyZXQuYnVmZmVyKTtyZXR1cm4gcmV0fTtpZihwcm9jZXNzW1wiYXJndlwiXS5sZW5ndGg+MSl7dGhpc1Byb2dyYW09cHJvY2Vzc1tcImFyZ3ZcIl1bMV0ucmVwbGFjZSgvXFxcXC9nLFwiL1wiKX1hcmd1bWVudHNfPXByb2Nlc3NbXCJhcmd2XCJdLnNsaWNlKDIpO3Byb2Nlc3NbXCJvblwiXShcInVuY2F1Z2h0RXhjZXB0aW9uXCIsZnVuY3Rpb24oZXgpe2lmKCEoZXggaW5zdGFuY2VvZiBFeGl0U3RhdHVzKSl7dGhyb3cgZXh9fSk7cHJvY2Vzc1tcIm9uXCJdKFwidW5oYW5kbGVkUmVqZWN0aW9uXCIsYWJvcnQpO3F1aXRfPWZ1bmN0aW9uKHN0YXR1cyl7cHJvY2Vzc1tcImV4aXRcIl0oc3RhdHVzKX07TW9kdWxlW1wiaW5zcGVjdFwiXT1mdW5jdGlvbigpe3JldHVyblwiW0Vtc2NyaXB0ZW4gTW9kdWxlIG9iamVjdF1cIn19ZWxzZSBpZihFTlZJUk9OTUVOVF9JU19TSEVMTCl7aWYodHlwZW9mIHJlYWQhPVwidW5kZWZpbmVkXCIpe3JlYWRfPWZ1bmN0aW9uIHNoZWxsX3JlYWQoZil7cmV0dXJuIHJlYWQoZil9fXJlYWRCaW5hcnk9ZnVuY3Rpb24gcmVhZEJpbmFyeShmKXt2YXIgZGF0YTtpZih0eXBlb2YgcmVhZGJ1ZmZlcj09PVwiZnVuY3Rpb25cIil7cmV0dXJuIG5ldyBVaW50OEFycmF5KHJlYWRidWZmZXIoZikpfWRhdGE9cmVhZChmLFwiYmluYXJ5XCIpO2Fzc2VydCh0eXBlb2YgZGF0YT09PVwib2JqZWN0XCIpO3JldHVybiBkYXRhfTtpZih0eXBlb2Ygc2NyaXB0QXJncyE9XCJ1bmRlZmluZWRcIil7YXJndW1lbnRzXz1zY3JpcHRBcmdzfWVsc2UgaWYodHlwZW9mIGFyZ3VtZW50cyE9XCJ1bmRlZmluZWRcIil7YXJndW1lbnRzXz1hcmd1bWVudHN9aWYodHlwZW9mIHF1aXQ9PT1cImZ1bmN0aW9uXCIpe3F1aXRfPWZ1bmN0aW9uKHN0YXR1cyl7cXVpdChzdGF0dXMpfX1pZih0eXBlb2YgcHJpbnQhPT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgY29uc29sZT09PVwidW5kZWZpbmVkXCIpY29uc29sZT17fTtjb25zb2xlLmxvZz1wcmludDtjb25zb2xlLndhcm49Y29uc29sZS5lcnJvcj10eXBlb2YgcHJpbnRFcnIhPT1cInVuZGVmaW5lZFwiP3ByaW50RXJyOnByaW50fX1lbHNlIGlmKEVOVklST05NRU5UX0lTX1dFQnx8RU5WSVJPTk1FTlRfSVNfV09SS0VSKXtpZihFTlZJUk9OTUVOVF9JU19XT1JLRVIpe3NjcmlwdERpcmVjdG9yeT1zZWxmLmxvY2F0aW9uLmhyZWZ9ZWxzZSBpZih0eXBlb2YgZG9jdW1lbnQhPT1cInVuZGVmaW5lZFwiJiZkb2N1bWVudC5jdXJyZW50U2NyaXB0KXtzY3JpcHREaXJlY3Rvcnk9ZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmN9aWYoX3NjcmlwdERpcil7c2NyaXB0RGlyZWN0b3J5PV9zY3JpcHREaXJ9aWYoc2NyaXB0RGlyZWN0b3J5LmluZGV4T2YoXCJibG9iOlwiKSE9PTApe3NjcmlwdERpcmVjdG9yeT1zY3JpcHREaXJlY3Rvcnkuc3Vic3RyKDAsc2NyaXB0RGlyZWN0b3J5Lmxhc3RJbmRleE9mKFwiL1wiKSsxKX1lbHNle3NjcmlwdERpcmVjdG9yeT1cIlwifXtyZWFkXz1mdW5jdGlvbih1cmwpe3ZhciB4aHI9bmV3IFhNTEh0dHBSZXF1ZXN0O3hoci5vcGVuKFwiR0VUXCIsdXJsLGZhbHNlKTt4aHIuc2VuZChudWxsKTtyZXR1cm4geGhyLnJlc3BvbnNlVGV4dH07aWYoRU5WSVJPTk1FTlRfSVNfV09SS0VSKXtyZWFkQmluYXJ5PWZ1bmN0aW9uKHVybCl7dmFyIHhocj1uZXcgWE1MSHR0cFJlcXVlc3Q7eGhyLm9wZW4oXCJHRVRcIix1cmwsZmFsc2UpO3hoci5yZXNwb25zZVR5cGU9XCJhcnJheWJ1ZmZlclwiO3hoci5zZW5kKG51bGwpO3JldHVybiBuZXcgVWludDhBcnJheSh4aHIucmVzcG9uc2UpfX1yZWFkQXN5bmM9ZnVuY3Rpb24odXJsLG9ubG9hZCxvbmVycm9yKXt2YXIgeGhyPW5ldyBYTUxIdHRwUmVxdWVzdDt4aHIub3BlbihcIkdFVFwiLHVybCx0cnVlKTt4aHIucmVzcG9uc2VUeXBlPVwiYXJyYXlidWZmZXJcIjt4aHIub25sb2FkPWZ1bmN0aW9uKCl7aWYoeGhyLnN0YXR1cz09MjAwfHx4aHIuc3RhdHVzPT0wJiZ4aHIucmVzcG9uc2Upe29ubG9hZCh4aHIucmVzcG9uc2UpO3JldHVybn1vbmVycm9yKCl9O3hoci5vbmVycm9yPW9uZXJyb3I7eGhyLnNlbmQobnVsbCl9fXNldFdpbmRvd1RpdGxlPWZ1bmN0aW9uKHRpdGxlKXtkb2N1bWVudC50aXRsZT10aXRsZX19ZWxzZXt9dmFyIG91dD1Nb2R1bGVbXCJwcmludFwiXXx8Y29uc29sZS5sb2cuYmluZChjb25zb2xlKTt2YXIgZXJyPU1vZHVsZVtcInByaW50RXJyXCJdfHxjb25zb2xlLndhcm4uYmluZChjb25zb2xlKTtmb3Ioa2V5IGluIG1vZHVsZU92ZXJyaWRlcyl7aWYobW9kdWxlT3ZlcnJpZGVzLmhhc093blByb3BlcnR5KGtleSkpe01vZHVsZVtrZXldPW1vZHVsZU92ZXJyaWRlc1trZXldfX1tb2R1bGVPdmVycmlkZXM9bnVsbDtpZihNb2R1bGVbXCJhcmd1bWVudHNcIl0pYXJndW1lbnRzXz1Nb2R1bGVbXCJhcmd1bWVudHNcIl07aWYoTW9kdWxlW1widGhpc1Byb2dyYW1cIl0pdGhpc1Byb2dyYW09TW9kdWxlW1widGhpc1Byb2dyYW1cIl07aWYoTW9kdWxlW1wicXVpdFwiXSlxdWl0Xz1Nb2R1bGVbXCJxdWl0XCJdO3ZhciB3YXNtQmluYXJ5O2lmKE1vZHVsZVtcIndhc21CaW5hcnlcIl0pd2FzbUJpbmFyeT1Nb2R1bGVbXCJ3YXNtQmluYXJ5XCJdO3ZhciBub0V4aXRSdW50aW1lPU1vZHVsZVtcIm5vRXhpdFJ1bnRpbWVcIl18fHRydWU7aWYodHlwZW9mIFdlYkFzc2VtYmx5IT09XCJvYmplY3RcIil7YWJvcnQoXCJubyBuYXRpdmUgd2FzbSBzdXBwb3J0IGRldGVjdGVkXCIpfXZhciB3YXNtTWVtb3J5O3ZhciBBQk9SVD1mYWxzZTt2YXIgRVhJVFNUQVRVUztmdW5jdGlvbiBhc3NlcnQoY29uZGl0aW9uLHRleHQpe2lmKCFjb25kaXRpb24pe2Fib3J0KFwiQXNzZXJ0aW9uIGZhaWxlZDogXCIrdGV4dCl9fWZ1bmN0aW9uIGdldENGdW5jKGlkZW50KXt2YXIgZnVuYz1Nb2R1bGVbXCJfXCIraWRlbnRdO2Fzc2VydChmdW5jLFwiQ2Fubm90IGNhbGwgdW5rbm93biBmdW5jdGlvbiBcIitpZGVudCtcIiwgbWFrZSBzdXJlIGl0IGlzIGV4cG9ydGVkXCIpO3JldHVybiBmdW5jfWZ1bmN0aW9uIGNjYWxsKGlkZW50LHJldHVyblR5cGUsYXJnVHlwZXMsYXJncyxvcHRzKXt2YXIgdG9DPXtcInN0cmluZ1wiOmZ1bmN0aW9uKHN0cil7dmFyIHJldD0wO2lmKHN0ciE9PW51bGwmJnN0ciE9PXVuZGVmaW5lZCYmc3RyIT09MCl7dmFyIGxlbj0oc3RyLmxlbmd0aDw8MikrMTtyZXQ9c3RhY2tBbGxvYyhsZW4pO3N0cmluZ1RvVVRGOChzdHIscmV0LGxlbil9cmV0dXJuIHJldH0sXCJhcnJheVwiOmZ1bmN0aW9uKGFycil7dmFyIHJldD1zdGFja0FsbG9jKGFyci5sZW5ndGgpO3dyaXRlQXJyYXlUb01lbW9yeShhcnIscmV0KTtyZXR1cm4gcmV0fX07ZnVuY3Rpb24gY29udmVydFJldHVyblZhbHVlKHJldCl7aWYocmV0dXJuVHlwZT09PVwic3RyaW5nXCIpcmV0dXJuIFVURjhUb1N0cmluZyhyZXQpO2lmKHJldHVyblR5cGU9PT1cImJvb2xlYW5cIilyZXR1cm4gQm9vbGVhbihyZXQpO3JldHVybiByZXR9dmFyIGZ1bmM9Z2V0Q0Z1bmMoaWRlbnQpO3ZhciBjQXJncz1bXTt2YXIgc3RhY2s9MDtpZihhcmdzKXtmb3IodmFyIGk9MDtpPGFyZ3MubGVuZ3RoO2krKyl7dmFyIGNvbnZlcnRlcj10b0NbYXJnVHlwZXNbaV1dO2lmKGNvbnZlcnRlcil7aWYoc3RhY2s9PT0wKXN0YWNrPXN0YWNrU2F2ZSgpO2NBcmdzW2ldPWNvbnZlcnRlcihhcmdzW2ldKX1lbHNle2NBcmdzW2ldPWFyZ3NbaV19fX12YXIgcmV0PWZ1bmMuYXBwbHkobnVsbCxjQXJncyk7cmV0PWNvbnZlcnRSZXR1cm5WYWx1ZShyZXQpO2lmKHN0YWNrIT09MClzdGFja1Jlc3RvcmUoc3RhY2spO3JldHVybiByZXR9ZnVuY3Rpb24gY3dyYXAoaWRlbnQscmV0dXJuVHlwZSxhcmdUeXBlcyxvcHRzKXthcmdUeXBlcz1hcmdUeXBlc3x8W107dmFyIG51bWVyaWNBcmdzPWFyZ1R5cGVzLmV2ZXJ5KGZ1bmN0aW9uKHR5cGUpe3JldHVybiB0eXBlPT09XCJudW1iZXJcIn0pO3ZhciBudW1lcmljUmV0PXJldHVyblR5cGUhPT1cInN0cmluZ1wiO2lmKG51bWVyaWNSZXQmJm51bWVyaWNBcmdzJiYhb3B0cyl7cmV0dXJuIGdldENGdW5jKGlkZW50KX1yZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gY2NhbGwoaWRlbnQscmV0dXJuVHlwZSxhcmdUeXBlcyxhcmd1bWVudHMsb3B0cyl9fXZhciBVVEY4RGVjb2Rlcj10eXBlb2YgVGV4dERlY29kZXIhPT1cInVuZGVmaW5lZFwiP25ldyBUZXh0RGVjb2RlcihcInV0ZjhcIik6dW5kZWZpbmVkO2Z1bmN0aW9uIFVURjhBcnJheVRvU3RyaW5nKGhlYXAsaWR4LG1heEJ5dGVzVG9SZWFkKXt2YXIgZW5kSWR4PWlkeCttYXhCeXRlc1RvUmVhZDt2YXIgZW5kUHRyPWlkeDt3aGlsZShoZWFwW2VuZFB0cl0mJiEoZW5kUHRyPj1lbmRJZHgpKSsrZW5kUHRyO2lmKGVuZFB0ci1pZHg+MTYmJmhlYXAuc3ViYXJyYXkmJlVURjhEZWNvZGVyKXtyZXR1cm4gVVRGOERlY29kZXIuZGVjb2RlKGhlYXAuc3ViYXJyYXkoaWR4LGVuZFB0cikpfWVsc2V7dmFyIHN0cj1cIlwiO3doaWxlKGlkeDxlbmRQdHIpe3ZhciB1MD1oZWFwW2lkeCsrXTtpZighKHUwJjEyOCkpe3N0cis9U3RyaW5nLmZyb21DaGFyQ29kZSh1MCk7Y29udGludWV9dmFyIHUxPWhlYXBbaWR4KytdJjYzO2lmKCh1MCYyMjQpPT0xOTIpe3N0cis9U3RyaW5nLmZyb21DaGFyQ29kZSgodTAmMzEpPDw2fHUxKTtjb250aW51ZX12YXIgdTI9aGVhcFtpZHgrK10mNjM7aWYoKHUwJjI0MCk9PTIyNCl7dTA9KHUwJjE1KTw8MTJ8dTE8PDZ8dTJ9ZWxzZXt1MD0odTAmNyk8PDE4fHUxPDwxMnx1Mjw8NnxoZWFwW2lkeCsrXSY2M31pZih1MDw2NTUzNil7c3RyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHUwKX1lbHNle3ZhciBjaD11MC02NTUzNjtzdHIrPVN0cmluZy5mcm9tQ2hhckNvZGUoNTUyOTZ8Y2g+PjEwLDU2MzIwfGNoJjEwMjMpfX19cmV0dXJuIHN0cn1mdW5jdGlvbiBVVEY4VG9TdHJpbmcocHRyLG1heEJ5dGVzVG9SZWFkKXtyZXR1cm4gcHRyP1VURjhBcnJheVRvU3RyaW5nKEhFQVBVOCxwdHIsbWF4Qnl0ZXNUb1JlYWQpOlwiXCJ9ZnVuY3Rpb24gc3RyaW5nVG9VVEY4QXJyYXkoc3RyLGhlYXAsb3V0SWR4LG1heEJ5dGVzVG9Xcml0ZSl7aWYoIShtYXhCeXRlc1RvV3JpdGU+MCkpcmV0dXJuIDA7dmFyIHN0YXJ0SWR4PW91dElkeDt2YXIgZW5kSWR4PW91dElkeCttYXhCeXRlc1RvV3JpdGUtMTtmb3IodmFyIGk9MDtpPHN0ci5sZW5ndGg7KytpKXt2YXIgdT1zdHIuY2hhckNvZGVBdChpKTtpZih1Pj01NTI5NiYmdTw9NTczNDMpe3ZhciB1MT1zdHIuY2hhckNvZGVBdCgrK2kpO3U9NjU1MzYrKCh1JjEwMjMpPDwxMCl8dTEmMTAyM31pZih1PD0xMjcpe2lmKG91dElkeD49ZW5kSWR4KWJyZWFrO2hlYXBbb3V0SWR4KytdPXV9ZWxzZSBpZih1PD0yMDQ3KXtpZihvdXRJZHgrMT49ZW5kSWR4KWJyZWFrO2hlYXBbb3V0SWR4KytdPTE5Mnx1Pj42O2hlYXBbb3V0SWR4KytdPTEyOHx1JjYzfWVsc2UgaWYodTw9NjU1MzUpe2lmKG91dElkeCsyPj1lbmRJZHgpYnJlYWs7aGVhcFtvdXRJZHgrK109MjI0fHU+PjEyO2hlYXBbb3V0SWR4KytdPTEyOHx1Pj42JjYzO2hlYXBbb3V0SWR4KytdPTEyOHx1JjYzfWVsc2V7aWYob3V0SWR4KzM+PWVuZElkeClicmVhaztoZWFwW291dElkeCsrXT0yNDB8dT4+MTg7aGVhcFtvdXRJZHgrK109MTI4fHU+PjEyJjYzO2hlYXBbb3V0SWR4KytdPTEyOHx1Pj42JjYzO2hlYXBbb3V0SWR4KytdPTEyOHx1JjYzfX1oZWFwW291dElkeF09MDtyZXR1cm4gb3V0SWR4LXN0YXJ0SWR4fWZ1bmN0aW9uIHN0cmluZ1RvVVRGOChzdHIsb3V0UHRyLG1heEJ5dGVzVG9Xcml0ZSl7cmV0dXJuIHN0cmluZ1RvVVRGOEFycmF5KHN0cixIRUFQVTgsb3V0UHRyLG1heEJ5dGVzVG9Xcml0ZSl9ZnVuY3Rpb24gd3JpdGVBcnJheVRvTWVtb3J5KGFycmF5LGJ1ZmZlcil7SEVBUDguc2V0KGFycmF5LGJ1ZmZlcil9ZnVuY3Rpb24gYWxpZ25VcCh4LG11bHRpcGxlKXtpZih4JW11bHRpcGxlPjApe3grPW11bHRpcGxlLXglbXVsdGlwbGV9cmV0dXJuIHh9dmFyIGJ1ZmZlcixIRUFQOCxIRUFQVTgsSEVBUDE2LEhFQVBVMTYsSEVBUDMyLEhFQVBVMzIsSEVBUEYzMixIRUFQRjY0O2Z1bmN0aW9uIHVwZGF0ZUdsb2JhbEJ1ZmZlckFuZFZpZXdzKGJ1Zil7YnVmZmVyPWJ1ZjtNb2R1bGVbXCJIRUFQOFwiXT1IRUFQOD1uZXcgSW50OEFycmF5KGJ1Zik7TW9kdWxlW1wiSEVBUDE2XCJdPUhFQVAxNj1uZXcgSW50MTZBcnJheShidWYpO01vZHVsZVtcIkhFQVAzMlwiXT1IRUFQMzI9bmV3IEludDMyQXJyYXkoYnVmKTtNb2R1bGVbXCJIRUFQVThcIl09SEVBUFU4PW5ldyBVaW50OEFycmF5KGJ1Zik7TW9kdWxlW1wiSEVBUFUxNlwiXT1IRUFQVTE2PW5ldyBVaW50MTZBcnJheShidWYpO01vZHVsZVtcIkhFQVBVMzJcIl09SEVBUFUzMj1uZXcgVWludDMyQXJyYXkoYnVmKTtNb2R1bGVbXCJIRUFQRjMyXCJdPUhFQVBGMzI9bmV3IEZsb2F0MzJBcnJheShidWYpO01vZHVsZVtcIkhFQVBGNjRcIl09SEVBUEY2ND1uZXcgRmxvYXQ2NEFycmF5KGJ1Zil9dmFyIElOSVRJQUxfTUVNT1JZPU1vZHVsZVtcIklOSVRJQUxfTUVNT1JZXCJdfHwxNjc3NzIxNjt2YXIgd2FzbVRhYmxlO3ZhciBfX0FUUFJFUlVOX189W107dmFyIF9fQVRJTklUX189W107dmFyIF9fQVRNQUlOX189W107dmFyIF9fQVRQT1NUUlVOX189W107dmFyIHJ1bnRpbWVJbml0aWFsaXplZD1mYWxzZTtfX0FUSU5JVF9fLnB1c2goe2Z1bmM6ZnVuY3Rpb24oKXtfX193YXNtX2NhbGxfY3RvcnMoKX19KTtmdW5jdGlvbiBwcmVSdW4oKXtpZihNb2R1bGVbXCJwcmVSdW5cIl0pe2lmKHR5cGVvZiBNb2R1bGVbXCJwcmVSdW5cIl09PVwiZnVuY3Rpb25cIilNb2R1bGVbXCJwcmVSdW5cIl09W01vZHVsZVtcInByZVJ1blwiXV07d2hpbGUoTW9kdWxlW1wicHJlUnVuXCJdLmxlbmd0aCl7YWRkT25QcmVSdW4oTW9kdWxlW1wicHJlUnVuXCJdLnNoaWZ0KCkpfX1jYWxsUnVudGltZUNhbGxiYWNrcyhfX0FUUFJFUlVOX18pfWZ1bmN0aW9uIGluaXRSdW50aW1lKCl7cnVudGltZUluaXRpYWxpemVkPXRydWU7Y2FsbFJ1bnRpbWVDYWxsYmFja3MoX19BVElOSVRfXyl9ZnVuY3Rpb24gcHJlTWFpbigpe2NhbGxSdW50aW1lQ2FsbGJhY2tzKF9fQVRNQUlOX18pfWZ1bmN0aW9uIHBvc3RSdW4oKXtpZihNb2R1bGVbXCJwb3N0UnVuXCJdKXtpZih0eXBlb2YgTW9kdWxlW1wicG9zdFJ1blwiXT09XCJmdW5jdGlvblwiKU1vZHVsZVtcInBvc3RSdW5cIl09W01vZHVsZVtcInBvc3RSdW5cIl1dO3doaWxlKE1vZHVsZVtcInBvc3RSdW5cIl0ubGVuZ3RoKXthZGRPblBvc3RSdW4oTW9kdWxlW1wicG9zdFJ1blwiXS5zaGlmdCgpKX19Y2FsbFJ1bnRpbWVDYWxsYmFja3MoX19BVFBPU1RSVU5fXyl9ZnVuY3Rpb24gYWRkT25QcmVSdW4oY2Ipe19fQVRQUkVSVU5fXy51bnNoaWZ0KGNiKX1mdW5jdGlvbiBhZGRPblBvc3RSdW4oY2Ipe19fQVRQT1NUUlVOX18udW5zaGlmdChjYil9dmFyIHJ1bkRlcGVuZGVuY2llcz0wO3ZhciBydW5EZXBlbmRlbmN5V2F0Y2hlcj1udWxsO3ZhciBkZXBlbmRlbmNpZXNGdWxmaWxsZWQ9bnVsbDtmdW5jdGlvbiBhZGRSdW5EZXBlbmRlbmN5KGlkKXtydW5EZXBlbmRlbmNpZXMrKztpZihNb2R1bGVbXCJtb25pdG9yUnVuRGVwZW5kZW5jaWVzXCJdKXtNb2R1bGVbXCJtb25pdG9yUnVuRGVwZW5kZW5jaWVzXCJdKHJ1bkRlcGVuZGVuY2llcyl9fWZ1bmN0aW9uIHJlbW92ZVJ1bkRlcGVuZGVuY3koaWQpe3J1bkRlcGVuZGVuY2llcy0tO2lmKE1vZHVsZVtcIm1vbml0b3JSdW5EZXBlbmRlbmNpZXNcIl0pe01vZHVsZVtcIm1vbml0b3JSdW5EZXBlbmRlbmNpZXNcIl0ocnVuRGVwZW5kZW5jaWVzKX1pZihydW5EZXBlbmRlbmNpZXM9PTApe2lmKHJ1bkRlcGVuZGVuY3lXYXRjaGVyIT09bnVsbCl7Y2xlYXJJbnRlcnZhbChydW5EZXBlbmRlbmN5V2F0Y2hlcik7cnVuRGVwZW5kZW5jeVdhdGNoZXI9bnVsbH1pZihkZXBlbmRlbmNpZXNGdWxmaWxsZWQpe3ZhciBjYWxsYmFjaz1kZXBlbmRlbmNpZXNGdWxmaWxsZWQ7ZGVwZW5kZW5jaWVzRnVsZmlsbGVkPW51bGw7Y2FsbGJhY2soKX19fU1vZHVsZVtcInByZWxvYWRlZEltYWdlc1wiXT17fTtNb2R1bGVbXCJwcmVsb2FkZWRBdWRpb3NcIl09e307ZnVuY3Rpb24gYWJvcnQod2hhdCl7aWYoTW9kdWxlW1wib25BYm9ydFwiXSl7TW9kdWxlW1wib25BYm9ydFwiXSh3aGF0KX13aGF0Kz1cIlwiO2Vycih3aGF0KTtBQk9SVD10cnVlO0VYSVRTVEFUVVM9MTt3aGF0PVwiYWJvcnQoXCIrd2hhdCtcIikuIEJ1aWxkIHdpdGggLXMgQVNTRVJUSU9OUz0xIGZvciBtb3JlIGluZm8uXCI7dmFyIGU9bmV3IFdlYkFzc2VtYmx5LlJ1bnRpbWVFcnJvcih3aGF0KTtyZWFkeVByb21pc2VSZWplY3QoZSk7dGhyb3cgZX1mdW5jdGlvbiBoYXNQcmVmaXgoc3RyLHByZWZpeCl7cmV0dXJuIFN0cmluZy5wcm90b3R5cGUuc3RhcnRzV2l0aD9zdHIuc3RhcnRzV2l0aChwcmVmaXgpOnN0ci5pbmRleE9mKHByZWZpeCk9PT0wfXZhciBkYXRhVVJJUHJlZml4PVwiZGF0YTphcHBsaWNhdGlvbi9vY3RldC1zdHJlYW07YmFzZTY0LFwiO2Z1bmN0aW9uIGlzRGF0YVVSSShmaWxlbmFtZSl7cmV0dXJuIGhhc1ByZWZpeChmaWxlbmFtZSxkYXRhVVJJUHJlZml4KX12YXIgZmlsZVVSSVByZWZpeD1cImZpbGU6Ly9cIjtmdW5jdGlvbiBpc0ZpbGVVUkkoZmlsZW5hbWUpe3JldHVybiBoYXNQcmVmaXgoZmlsZW5hbWUsZmlsZVVSSVByZWZpeCl9dmFyIHdhc21CaW5hcnlGaWxlPVwidGZqcy1iYWNrZW5kLXdhc20ud2FzbVwiO2lmKCFpc0RhdGFVUkkod2FzbUJpbmFyeUZpbGUpKXt3YXNtQmluYXJ5RmlsZT1sb2NhdGVGaWxlKHdhc21CaW5hcnlGaWxlKX1mdW5jdGlvbiBnZXRCaW5hcnkoZmlsZSl7dHJ5e2lmKGZpbGU9PXdhc21CaW5hcnlGaWxlJiZ3YXNtQmluYXJ5KXtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkod2FzbUJpbmFyeSl9aWYocmVhZEJpbmFyeSl7cmV0dXJuIHJlYWRCaW5hcnkoZmlsZSl9ZWxzZXt0aHJvd1wiYm90aCBhc3luYyBhbmQgc3luYyBmZXRjaGluZyBvZiB0aGUgd2FzbSBmYWlsZWRcIn19Y2F0Y2goZXJyKXthYm9ydChlcnIpfX1mdW5jdGlvbiBnZXRCaW5hcnlQcm9taXNlKCl7aWYoIXdhc21CaW5hcnkmJihFTlZJUk9OTUVOVF9JU19XRUJ8fEVOVklST05NRU5UX0lTX1dPUktFUikpe2lmKHR5cGVvZiBmZXRjaD09PVwiZnVuY3Rpb25cIiYmIWlzRmlsZVVSSSh3YXNtQmluYXJ5RmlsZSkpe3JldHVybiBmZXRjaCh3YXNtQmluYXJ5RmlsZSx7Y3JlZGVudGlhbHM6XCJzYW1lLW9yaWdpblwifSkudGhlbihmdW5jdGlvbihyZXNwb25zZSl7aWYoIXJlc3BvbnNlW1wib2tcIl0pe3Rocm93XCJmYWlsZWQgdG8gbG9hZCB3YXNtIGJpbmFyeSBmaWxlIGF0ICdcIit3YXNtQmluYXJ5RmlsZStcIidcIn1yZXR1cm4gcmVzcG9uc2VbXCJhcnJheUJ1ZmZlclwiXSgpfSkuY2F0Y2goZnVuY3Rpb24oKXtyZXR1cm4gZ2V0QmluYXJ5KHdhc21CaW5hcnlGaWxlKX0pfWVsc2V7aWYocmVhZEFzeW5jKXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSxyZWplY3Qpe3JlYWRBc3luYyh3YXNtQmluYXJ5RmlsZSxmdW5jdGlvbihyZXNwb25zZSl7cmVzb2x2ZShuZXcgVWludDhBcnJheShyZXNwb25zZSkpfSxyZWplY3QpfSl9fX1yZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbigpe3JldHVybiBnZXRCaW5hcnkod2FzbUJpbmFyeUZpbGUpfSl9ZnVuY3Rpb24gY3JlYXRlV2FzbSgpe3ZhciBpbmZvPXtcImFcIjphc21MaWJyYXJ5QXJnfTtmdW5jdGlvbiByZWNlaXZlSW5zdGFuY2UoaW5zdGFuY2UsbW9kdWxlKXt2YXIgZXhwb3J0cz1pbnN0YW5jZS5leHBvcnRzO01vZHVsZVtcImFzbVwiXT1leHBvcnRzO3dhc21NZW1vcnk9TW9kdWxlW1wiYXNtXCJdW1wiaVwiXTt1cGRhdGVHbG9iYWxCdWZmZXJBbmRWaWV3cyh3YXNtTWVtb3J5LmJ1ZmZlcik7d2FzbVRhYmxlPU1vZHVsZVtcImFzbVwiXVtcIm9cIl07cmVtb3ZlUnVuRGVwZW5kZW5jeShcIndhc20taW5zdGFudGlhdGVcIil9YWRkUnVuRGVwZW5kZW5jeShcIndhc20taW5zdGFudGlhdGVcIik7ZnVuY3Rpb24gcmVjZWl2ZUluc3RhbnRpYXRlZFNvdXJjZShvdXRwdXQpe3JlY2VpdmVJbnN0YW5jZShvdXRwdXRbXCJpbnN0YW5jZVwiXSl9ZnVuY3Rpb24gaW5zdGFudGlhdGVBcnJheUJ1ZmZlcihyZWNlaXZlcil7cmV0dXJuIGdldEJpbmFyeVByb21pc2UoKS50aGVuKGZ1bmN0aW9uKGJpbmFyeSl7cmV0dXJuIFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKGJpbmFyeSxpbmZvKX0pLnRoZW4ocmVjZWl2ZXIsZnVuY3Rpb24ocmVhc29uKXtlcnIoXCJmYWlsZWQgdG8gYXN5bmNocm9ub3VzbHkgcHJlcGFyZSB3YXNtOiBcIityZWFzb24pO2Fib3J0KHJlYXNvbil9KX1mdW5jdGlvbiBpbnN0YW50aWF0ZUFzeW5jKCl7aWYoIXdhc21CaW5hcnkmJnR5cGVvZiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZz09PVwiZnVuY3Rpb25cIiYmIWlzRGF0YVVSSSh3YXNtQmluYXJ5RmlsZSkmJiFpc0ZpbGVVUkkod2FzbUJpbmFyeUZpbGUpJiZ0eXBlb2YgZmV0Y2g9PT1cImZ1bmN0aW9uXCIpe3JldHVybiBmZXRjaCh3YXNtQmluYXJ5RmlsZSx7Y3JlZGVudGlhbHM6XCJzYW1lLW9yaWdpblwifSkudGhlbihmdW5jdGlvbihyZXNwb25zZSl7dmFyIHJlc3VsdD1XZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyhyZXNwb25zZSxpbmZvKTtyZXR1cm4gcmVzdWx0LnRoZW4ocmVjZWl2ZUluc3RhbnRpYXRlZFNvdXJjZSxmdW5jdGlvbihyZWFzb24pe2VycihcIndhc20gc3RyZWFtaW5nIGNvbXBpbGUgZmFpbGVkOiBcIityZWFzb24pO2VycihcImZhbGxpbmcgYmFjayB0byBBcnJheUJ1ZmZlciBpbnN0YW50aWF0aW9uXCIpO3JldHVybiBpbnN0YW50aWF0ZUFycmF5QnVmZmVyKHJlY2VpdmVJbnN0YW50aWF0ZWRTb3VyY2UpfSl9KX1lbHNle3JldHVybiBpbnN0YW50aWF0ZUFycmF5QnVmZmVyKHJlY2VpdmVJbnN0YW50aWF0ZWRTb3VyY2UpfX1pZihNb2R1bGVbXCJpbnN0YW50aWF0ZVdhc21cIl0pe3RyeXt2YXIgZXhwb3J0cz1Nb2R1bGVbXCJpbnN0YW50aWF0ZVdhc21cIl0oaW5mbyxyZWNlaXZlSW5zdGFuY2UpO3JldHVybiBleHBvcnRzfWNhdGNoKGUpe2VycihcIk1vZHVsZS5pbnN0YW50aWF0ZVdhc20gY2FsbGJhY2sgZmFpbGVkIHdpdGggZXJyb3I6IFwiK2UpO3JldHVybiBmYWxzZX19aW5zdGFudGlhdGVBc3luYygpLmNhdGNoKHJlYWR5UHJvbWlzZVJlamVjdCk7cmV0dXJue319ZnVuY3Rpb24gY2FsbFJ1bnRpbWVDYWxsYmFja3MoY2FsbGJhY2tzKXt3aGlsZShjYWxsYmFja3MubGVuZ3RoPjApe3ZhciBjYWxsYmFjaz1jYWxsYmFja3Muc2hpZnQoKTtpZih0eXBlb2YgY2FsbGJhY2s9PVwiZnVuY3Rpb25cIil7Y2FsbGJhY2soTW9kdWxlKTtjb250aW51ZX12YXIgZnVuYz1jYWxsYmFjay5mdW5jO2lmKHR5cGVvZiBmdW5jPT09XCJudW1iZXJcIil7aWYoY2FsbGJhY2suYXJnPT09dW5kZWZpbmVkKXt3YXNtVGFibGUuZ2V0KGZ1bmMpKCl9ZWxzZXt3YXNtVGFibGUuZ2V0KGZ1bmMpKGNhbGxiYWNrLmFyZyl9fWVsc2V7ZnVuYyhjYWxsYmFjay5hcmc9PT11bmRlZmluZWQ/bnVsbDpjYWxsYmFjay5hcmcpfX19ZnVuY3Rpb24gX2Fib3J0KCl7YWJvcnQoKX1mdW5jdGlvbiBfZW1zY3JpcHRlbl9tZW1jcHlfYmlnKGRlc3Qsc3JjLG51bSl7SEVBUFU4LmNvcHlXaXRoaW4oZGVzdCxzcmMsc3JjK251bSl9ZnVuY3Rpb24gX2Vtc2NyaXB0ZW5fZ2V0X2hlYXBfc2l6ZSgpe3JldHVybiBIRUFQVTgubGVuZ3RofWZ1bmN0aW9uIGVtc2NyaXB0ZW5fcmVhbGxvY19idWZmZXIoc2l6ZSl7dHJ5e3dhc21NZW1vcnkuZ3JvdyhzaXplLWJ1ZmZlci5ieXRlTGVuZ3RoKzY1NTM1Pj4+MTYpO3VwZGF0ZUdsb2JhbEJ1ZmZlckFuZFZpZXdzKHdhc21NZW1vcnkuYnVmZmVyKTtyZXR1cm4gMX1jYXRjaChlKXt9fWZ1bmN0aW9uIF9lbXNjcmlwdGVuX3Jlc2l6ZV9oZWFwKHJlcXVlc3RlZFNpemUpe3ZhciBvbGRTaXplPV9lbXNjcmlwdGVuX2dldF9oZWFwX3NpemUoKTt2YXIgbWF4SGVhcFNpemU9MjE0NzQ4MzY0ODtpZihyZXF1ZXN0ZWRTaXplPm1heEhlYXBTaXplKXtyZXR1cm4gZmFsc2V9Zm9yKHZhciBjdXREb3duPTE7Y3V0RG93bjw9NDtjdXREb3duKj0yKXt2YXIgb3Zlckdyb3duSGVhcFNpemU9b2xkU2l6ZSooMSsuMi9jdXREb3duKTtvdmVyR3Jvd25IZWFwU2l6ZT1NYXRoLm1pbihvdmVyR3Jvd25IZWFwU2l6ZSxyZXF1ZXN0ZWRTaXplKzEwMDY2MzI5Nik7dmFyIG5ld1NpemU9TWF0aC5taW4obWF4SGVhcFNpemUsYWxpZ25VcChNYXRoLm1heChyZXF1ZXN0ZWRTaXplLG92ZXJHcm93bkhlYXBTaXplKSw2NTUzNikpO3ZhciByZXBsYWNlbWVudD1lbXNjcmlwdGVuX3JlYWxsb2NfYnVmZmVyKG5ld1NpemUpO2lmKHJlcGxhY2VtZW50KXtyZXR1cm4gdHJ1ZX19cmV0dXJuIGZhbHNlfXZhciBTWVNDQUxMUz17bWFwcGluZ3M6e30sYnVmZmVyczpbbnVsbCxbXSxbXV0scHJpbnRDaGFyOmZ1bmN0aW9uKHN0cmVhbSxjdXJyKXt2YXIgYnVmZmVyPVNZU0NBTExTLmJ1ZmZlcnNbc3RyZWFtXTtpZihjdXJyPT09MHx8Y3Vycj09PTEwKXsoc3RyZWFtPT09MT9vdXQ6ZXJyKShVVEY4QXJyYXlUb1N0cmluZyhidWZmZXIsMCkpO2J1ZmZlci5sZW5ndGg9MH1lbHNle2J1ZmZlci5wdXNoKGN1cnIpfX0sdmFyYXJnczp1bmRlZmluZWQsZ2V0OmZ1bmN0aW9uKCl7U1lTQ0FMTFMudmFyYXJncys9NDt2YXIgcmV0PUhFQVAzMltTWVNDQUxMUy52YXJhcmdzLTQ+PjJdO3JldHVybiByZXR9LGdldFN0cjpmdW5jdGlvbihwdHIpe3ZhciByZXQ9VVRGOFRvU3RyaW5nKHB0cik7cmV0dXJuIHJldH0sZ2V0NjQ6ZnVuY3Rpb24obG93LGhpZ2gpe3JldHVybiBsb3d9fTtmdW5jdGlvbiBfZmRfY2xvc2UoZmQpe3JldHVybiAwfWZ1bmN0aW9uIF9mZF9zZWVrKGZkLG9mZnNldF9sb3csb2Zmc2V0X2hpZ2gsd2hlbmNlLG5ld09mZnNldCl7fWZ1bmN0aW9uIF9mZF93cml0ZShmZCxpb3YsaW92Y250LHBudW0pe3ZhciBudW09MDtmb3IodmFyIGk9MDtpPGlvdmNudDtpKyspe3ZhciBwdHI9SEVBUDMyW2lvditpKjg+PjJdO3ZhciBsZW49SEVBUDMyW2lvdisoaSo4KzQpPj4yXTtmb3IodmFyIGo9MDtqPGxlbjtqKyspe1NZU0NBTExTLnByaW50Q2hhcihmZCxIRUFQVThbcHRyK2pdKX1udW0rPWxlbn1IRUFQMzJbcG51bT4+Ml09bnVtO3JldHVybiAwfWZ1bmN0aW9uIF9wdGhyZWFkX2NyZWF0ZSgpe3JldHVybiA2fWZ1bmN0aW9uIHNldEVyck5vKHZhbHVlKXtIRUFQMzJbX19fZXJybm9fbG9jYXRpb24oKT4+Ml09dmFsdWU7cmV0dXJuIHZhbHVlfWZ1bmN0aW9uIF9zeXNjb25mKG5hbWUpe3N3aXRjaChuYW1lKXtjYXNlIDMwOnJldHVybiAxNjM4NDtjYXNlIDg1OnZhciBtYXhIZWFwU2l6ZT0yMTQ3NDgzNjQ4O3JldHVybiBtYXhIZWFwU2l6ZS8xNjM4NDtjYXNlIDEzMjpjYXNlIDEzMzpjYXNlIDEyOmNhc2UgMTM3OmNhc2UgMTM4OmNhc2UgMTU6Y2FzZSAyMzU6Y2FzZSAxNjpjYXNlIDE3OmNhc2UgMTg6Y2FzZSAxOTpjYXNlIDIwOmNhc2UgMTQ5OmNhc2UgMTM6Y2FzZSAxMDpjYXNlIDIzNjpjYXNlIDE1MzpjYXNlIDk6Y2FzZSAyMTpjYXNlIDIyOmNhc2UgMTU5OmNhc2UgMTU0OmNhc2UgMTQ6Y2FzZSA3NzpjYXNlIDc4OmNhc2UgMTM5OmNhc2UgODI6Y2FzZSA2ODpjYXNlIDY3OmNhc2UgMTY0OmNhc2UgMTE6Y2FzZSAyOTpjYXNlIDQ3OmNhc2UgNDg6Y2FzZSA5NTpjYXNlIDUyOmNhc2UgNTE6Y2FzZSA0NjpyZXR1cm4gMjAwODA5O2Nhc2UgMjc6Y2FzZSAyNDY6Y2FzZSAxMjc6Y2FzZSAxMjg6Y2FzZSAyMzpjYXNlIDI0OmNhc2UgMTYwOmNhc2UgMTYxOmNhc2UgMTgxOmNhc2UgMTgyOmNhc2UgMjQyOmNhc2UgMTgzOmNhc2UgMTg0OmNhc2UgMjQzOmNhc2UgMjQ0OmNhc2UgMjQ1OmNhc2UgMTY1OmNhc2UgMTc4OmNhc2UgMTc5OmNhc2UgNDk6Y2FzZSA1MDpjYXNlIDE2ODpjYXNlIDE2OTpjYXNlIDE3NTpjYXNlIDE3MDpjYXNlIDE3MTpjYXNlIDE3MjpjYXNlIDk3OmNhc2UgNzY6Y2FzZSAzMjpjYXNlIDE3MzpjYXNlIDM1OmNhc2UgODA6Y2FzZSA4MTpjYXNlIDc5OnJldHVybi0xO2Nhc2UgMTc2OmNhc2UgMTc3OmNhc2UgNzpjYXNlIDE1NTpjYXNlIDg6Y2FzZSAxNTc6Y2FzZSAxMjU6Y2FzZSAxMjY6Y2FzZSA5MjpjYXNlIDkzOmNhc2UgMTI5OmNhc2UgMTMwOmNhc2UgMTMxOmNhc2UgOTQ6Y2FzZSA5MTpyZXR1cm4gMTtjYXNlIDc0OmNhc2UgNjA6Y2FzZSA2OTpjYXNlIDcwOmNhc2UgNDpyZXR1cm4gMTAyNDtjYXNlIDMxOmNhc2UgNDI6Y2FzZSA3MjpyZXR1cm4gMzI7Y2FzZSA4NzpjYXNlIDI2OmNhc2UgMzM6cmV0dXJuIDIxNDc0ODM2NDc7Y2FzZSAzNDpjYXNlIDE6cmV0dXJuIDQ3ODM5O2Nhc2UgMzg6Y2FzZSAzNjpyZXR1cm4gOTk7Y2FzZSA0MzpjYXNlIDM3OnJldHVybiAyMDQ4O2Nhc2UgMDpyZXR1cm4gMjA5NzE1MjtjYXNlIDM6cmV0dXJuIDY1NTM2O2Nhc2UgMjg6cmV0dXJuIDMyNzY4O2Nhc2UgNDQ6cmV0dXJuIDMyNzY3O2Nhc2UgNzU6cmV0dXJuIDE2Mzg0O2Nhc2UgMzk6cmV0dXJuIDFlMztjYXNlIDg5OnJldHVybiA3MDA7Y2FzZSA3MTpyZXR1cm4gMjU2O2Nhc2UgNDA6cmV0dXJuIDI1NTtjYXNlIDI6cmV0dXJuIDEwMDtjYXNlIDE4MDpyZXR1cm4gNjQ7Y2FzZSAyNTpyZXR1cm4gMjA7Y2FzZSA1OnJldHVybiAxNjtjYXNlIDY6cmV0dXJuIDY7Y2FzZSA3MzpyZXR1cm4gNDtjYXNlIDg0OntpZih0eXBlb2YgbmF2aWdhdG9yPT09XCJvYmplY3RcIilyZXR1cm4gbmF2aWdhdG9yW1wiaGFyZHdhcmVDb25jdXJyZW5jeVwiXXx8MTtyZXR1cm4gMX19c2V0RXJyTm8oMjgpO3JldHVybi0xfXZhciBhc21MaWJyYXJ5QXJnPXtcImFcIjpfYWJvcnQsXCJkXCI6X2Vtc2NyaXB0ZW5fbWVtY3B5X2JpZyxcImVcIjpfZW1zY3JpcHRlbl9yZXNpemVfaGVhcCxcImZcIjpfZmRfY2xvc2UsXCJjXCI6X2ZkX3NlZWssXCJiXCI6X2ZkX3dyaXRlLFwiZ1wiOl9wdGhyZWFkX2NyZWF0ZSxcImhcIjpfc3lzY29uZn07dmFyIGFzbT1jcmVhdGVXYXNtKCk7dmFyIF9fX3dhc21fY2FsbF9jdG9ycz1Nb2R1bGVbXCJfX193YXNtX2NhbGxfY3RvcnNcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX19fd2FzbV9jYWxsX2N0b3JzPU1vZHVsZVtcIl9fX3dhc21fY2FsbF9jdG9yc1wiXT1Nb2R1bGVbXCJhc21cIl1bXCJqXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfaW5pdD1Nb2R1bGVbXCJfaW5pdFwiXT1mdW5jdGlvbigpe3JldHVybihfaW5pdD1Nb2R1bGVbXCJfaW5pdFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJrXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfcmVnaXN0ZXJfdGVuc29yPU1vZHVsZVtcIl9yZWdpc3Rlcl90ZW5zb3JcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX3JlZ2lzdGVyX3RlbnNvcj1Nb2R1bGVbXCJfcmVnaXN0ZXJfdGVuc29yXCJdPU1vZHVsZVtcImFzbVwiXVtcImxcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9kaXNwb3NlX2RhdGE9TW9kdWxlW1wiX2Rpc3Bvc2VfZGF0YVwiXT1mdW5jdGlvbigpe3JldHVybihfZGlzcG9zZV9kYXRhPU1vZHVsZVtcIl9kaXNwb3NlX2RhdGFcIl09TW9kdWxlW1wiYXNtXCJdW1wibVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX2Rpc3Bvc2U9TW9kdWxlW1wiX2Rpc3Bvc2VcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX2Rpc3Bvc2U9TW9kdWxlW1wiX2Rpc3Bvc2VcIl09TW9kdWxlW1wiYXNtXCJdW1wiblwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0Ficz1Nb2R1bGVbXCJfQWJzXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9BYnM9TW9kdWxlW1wiX0Fic1wiXT1Nb2R1bGVbXCJhc21cIl1bXCJwXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfQWRkPU1vZHVsZVtcIl9BZGRcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0FkZD1Nb2R1bGVbXCJfQWRkXCJdPU1vZHVsZVtcImFzbVwiXVtcInFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9BZGROPU1vZHVsZVtcIl9BZGROXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9BZGROPU1vZHVsZVtcIl9BZGROXCJdPU1vZHVsZVtcImFzbVwiXVtcInJcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9BbGw9TW9kdWxlW1wiX0FsbFwiXT1mdW5jdGlvbigpe3JldHVybihfQWxsPU1vZHVsZVtcIl9BbGxcIl09TW9kdWxlW1wiYXNtXCJdW1wic1wiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0FueT1Nb2R1bGVbXCJfQW55XCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9Bbnk9TW9kdWxlW1wiX0FueVwiXT1Nb2R1bGVbXCJhc21cIl1bXCJ0XCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfQXJnTWF4PU1vZHVsZVtcIl9BcmdNYXhcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0FyZ01heD1Nb2R1bGVbXCJfQXJnTWF4XCJdPU1vZHVsZVtcImFzbVwiXVtcInVcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9BdmdQb29sPU1vZHVsZVtcIl9BdmdQb29sXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9BdmdQb29sPU1vZHVsZVtcIl9BdmdQb29sXCJdPU1vZHVsZVtcImFzbVwiXVtcInZcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9CYXRjaE1hdE11bD1Nb2R1bGVbXCJfQmF0Y2hNYXRNdWxcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0JhdGNoTWF0TXVsPU1vZHVsZVtcIl9CYXRjaE1hdE11bFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJ3XCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfQ2VpbD1Nb2R1bGVbXCJfQ2VpbFwiXT1mdW5jdGlvbigpe3JldHVybihfQ2VpbD1Nb2R1bGVbXCJfQ2VpbFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJ4XCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfQ2xpcEJ5VmFsdWU9TW9kdWxlW1wiX0NsaXBCeVZhbHVlXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9DbGlwQnlWYWx1ZT1Nb2R1bGVbXCJfQ2xpcEJ5VmFsdWVcIl09TW9kdWxlW1wiYXNtXCJdW1wieVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0NvbnYyRD1Nb2R1bGVbXCJfQ29udjJEXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9Db252MkQ9TW9kdWxlW1wiX0NvbnYyRFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJ6XCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfQ29udjJEQmFja3Byb3BJbnB1dD1Nb2R1bGVbXCJfQ29udjJEQmFja3Byb3BJbnB1dFwiXT1mdW5jdGlvbigpe3JldHVybihfQ29udjJEQmFja3Byb3BJbnB1dD1Nb2R1bGVbXCJfQ29udjJEQmFja3Byb3BJbnB1dFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJBXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfQ29zPU1vZHVsZVtcIl9Db3NcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0Nvcz1Nb2R1bGVbXCJfQ29zXCJdPU1vZHVsZVtcImFzbVwiXVtcIkJcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9Db3NoPU1vZHVsZVtcIl9Db3NoXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9Db3NoPU1vZHVsZVtcIl9Db3NoXCJdPU1vZHVsZVtcImFzbVwiXVtcIkNcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9Dcm9wQW5kUmVzaXplPU1vZHVsZVtcIl9Dcm9wQW5kUmVzaXplXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9Dcm9wQW5kUmVzaXplPU1vZHVsZVtcIl9Dcm9wQW5kUmVzaXplXCJdPU1vZHVsZVtcImFzbVwiXVtcIkRcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9DdW1zdW09TW9kdWxlW1wiX0N1bXN1bVwiXT1mdW5jdGlvbigpe3JldHVybihfQ3Vtc3VtPU1vZHVsZVtcIl9DdW1zdW1cIl09TW9kdWxlW1wiYXNtXCJdW1wiRVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0RlcHRoVG9TcGFjZT1Nb2R1bGVbXCJfRGVwdGhUb1NwYWNlXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9EZXB0aFRvU3BhY2U9TW9kdWxlW1wiX0RlcHRoVG9TcGFjZVwiXT1Nb2R1bGVbXCJhc21cIl1bXCJGXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfRGVwdGh3aXNlQ29udjJkTmF0aXZlPU1vZHVsZVtcIl9EZXB0aHdpc2VDb252MmROYXRpdmVcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0RlcHRod2lzZUNvbnYyZE5hdGl2ZT1Nb2R1bGVbXCJfRGVwdGh3aXNlQ29udjJkTmF0aXZlXCJdPU1vZHVsZVtcImFzbVwiXVtcIkdcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9FcXVhbD1Nb2R1bGVbXCJfRXF1YWxcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0VxdWFsPU1vZHVsZVtcIl9FcXVhbFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJIXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfRXhwPU1vZHVsZVtcIl9FeHBcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0V4cD1Nb2R1bGVbXCJfRXhwXCJdPU1vZHVsZVtcImFzbVwiXVtcIklcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9GbGlwTGVmdFJpZ2h0PU1vZHVsZVtcIl9GbGlwTGVmdFJpZ2h0XCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9GbGlwTGVmdFJpZ2h0PU1vZHVsZVtcIl9GbGlwTGVmdFJpZ2h0XCJdPU1vZHVsZVtcImFzbVwiXVtcIkpcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9GbG9vcj1Nb2R1bGVbXCJfRmxvb3JcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0Zsb29yPU1vZHVsZVtcIl9GbG9vclwiXT1Nb2R1bGVbXCJhc21cIl1bXCJLXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfRmxvb3JEaXY9TW9kdWxlW1wiX0Zsb29yRGl2XCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9GbG9vckRpdj1Nb2R1bGVbXCJfRmxvb3JEaXZcIl09TW9kdWxlW1wiYXNtXCJdW1wiTFwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0Z1c2VkQmF0Y2hOb3JtPU1vZHVsZVtcIl9GdXNlZEJhdGNoTm9ybVwiXT1mdW5jdGlvbigpe3JldHVybihfRnVzZWRCYXRjaE5vcm09TW9kdWxlW1wiX0Z1c2VkQmF0Y2hOb3JtXCJdPU1vZHVsZVtcImFzbVwiXVtcIk1cIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9GdXNlZENvbnYyRD1Nb2R1bGVbXCJfRnVzZWRDb252MkRcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0Z1c2VkQ29udjJEPU1vZHVsZVtcIl9GdXNlZENvbnYyRFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJOXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfRnVzZWREZXB0aHdpc2VDb252MkQ9TW9kdWxlW1wiX0Z1c2VkRGVwdGh3aXNlQ29udjJEXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9GdXNlZERlcHRod2lzZUNvbnYyRD1Nb2R1bGVbXCJfRnVzZWREZXB0aHdpc2VDb252MkRcIl09TW9kdWxlW1wiYXNtXCJdW1wiT1wiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0dhdGhlcj1Nb2R1bGVbXCJfR2F0aGVyXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9HYXRoZXI9TW9kdWxlW1wiX0dhdGhlclwiXT1Nb2R1bGVbXCJhc21cIl1bXCJQXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfR2F0aGVyTmQ9TW9kdWxlW1wiX0dhdGhlck5kXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9HYXRoZXJOZD1Nb2R1bGVbXCJfR2F0aGVyTmRcIl09TW9kdWxlW1wiYXNtXCJdW1wiUVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0dyZWF0ZXI9TW9kdWxlW1wiX0dyZWF0ZXJcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0dyZWF0ZXI9TW9kdWxlW1wiX0dyZWF0ZXJcIl09TW9kdWxlW1wiYXNtXCJdW1wiUlwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0dyZWF0ZXJFcXVhbD1Nb2R1bGVbXCJfR3JlYXRlckVxdWFsXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9HcmVhdGVyRXF1YWw9TW9kdWxlW1wiX0dyZWF0ZXJFcXVhbFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJTXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfTGVha3lSZWx1PU1vZHVsZVtcIl9MZWFreVJlbHVcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX0xlYWt5UmVsdT1Nb2R1bGVbXCJfTGVha3lSZWx1XCJdPU1vZHVsZVtcImFzbVwiXVtcIlRcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9MZXNzPU1vZHVsZVtcIl9MZXNzXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9MZXNzPU1vZHVsZVtcIl9MZXNzXCJdPU1vZHVsZVtcImFzbVwiXVtcIlVcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9MZXNzRXF1YWw9TW9kdWxlW1wiX0xlc3NFcXVhbFwiXT1mdW5jdGlvbigpe3JldHVybihfTGVzc0VxdWFsPU1vZHVsZVtcIl9MZXNzRXF1YWxcIl09TW9kdWxlW1wiYXNtXCJdW1wiVlwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX0xvZz1Nb2R1bGVbXCJfTG9nXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9Mb2c9TW9kdWxlW1wiX0xvZ1wiXT1Nb2R1bGVbXCJhc21cIl1bXCJXXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfTG9naWNhbEFuZD1Nb2R1bGVbXCJfTG9naWNhbEFuZFwiXT1mdW5jdGlvbigpe3JldHVybihfTG9naWNhbEFuZD1Nb2R1bGVbXCJfTG9naWNhbEFuZFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJYXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfTWF4PU1vZHVsZVtcIl9NYXhcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX01heD1Nb2R1bGVbXCJfTWF4XCJdPU1vZHVsZVtcImFzbVwiXVtcIllcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9NYXhQb29sPU1vZHVsZVtcIl9NYXhQb29sXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9NYXhQb29sPU1vZHVsZVtcIl9NYXhQb29sXCJdPU1vZHVsZVtcImFzbVwiXVtcIlpcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9NYXhpbXVtPU1vZHVsZVtcIl9NYXhpbXVtXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9NYXhpbXVtPU1vZHVsZVtcIl9NYXhpbXVtXCJdPU1vZHVsZVtcImFzbVwiXVtcIl9cIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9NZWFuPU1vZHVsZVtcIl9NZWFuXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9NZWFuPU1vZHVsZVtcIl9NZWFuXCJdPU1vZHVsZVtcImFzbVwiXVtcIiRcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9NaW49TW9kdWxlW1wiX01pblwiXT1mdW5jdGlvbigpe3JldHVybihfTWluPU1vZHVsZVtcIl9NaW5cIl09TW9kdWxlW1wiYXNtXCJdW1wiYWFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9NaW5pbXVtPU1vZHVsZVtcIl9NaW5pbXVtXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9NaW5pbXVtPU1vZHVsZVtcIl9NaW5pbXVtXCJdPU1vZHVsZVtcImFzbVwiXVtcImJhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfTWlycm9yUGFkPU1vZHVsZVtcIl9NaXJyb3JQYWRcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX01pcnJvclBhZD1Nb2R1bGVbXCJfTWlycm9yUGFkXCJdPU1vZHVsZVtcImFzbVwiXVtcImNhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfTXVsdGlwbHk9TW9kdWxlW1wiX011bHRpcGx5XCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9NdWx0aXBseT1Nb2R1bGVbXCJfTXVsdGlwbHlcIl09TW9kdWxlW1wiYXNtXCJdW1wiZGFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9OZWc9TW9kdWxlW1wiX05lZ1wiXT1mdW5jdGlvbigpe3JldHVybihfTmVnPU1vZHVsZVtcIl9OZWdcIl09TW9kdWxlW1wiYXNtXCJdW1wiZWFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9Ob25NYXhTdXBwcmVzc2lvblYzPU1vZHVsZVtcIl9Ob25NYXhTdXBwcmVzc2lvblYzXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9Ob25NYXhTdXBwcmVzc2lvblYzPU1vZHVsZVtcIl9Ob25NYXhTdXBwcmVzc2lvblYzXCJdPU1vZHVsZVtcImFzbVwiXVtcImZhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfTm9uTWF4U3VwcHJlc3Npb25WND1Nb2R1bGVbXCJfTm9uTWF4U3VwcHJlc3Npb25WNFwiXT1mdW5jdGlvbigpe3JldHVybihfTm9uTWF4U3VwcHJlc3Npb25WND1Nb2R1bGVbXCJfTm9uTWF4U3VwcHJlc3Npb25WNFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJnYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX05vbk1heFN1cHByZXNzaW9uVjU9TW9kdWxlW1wiX05vbk1heFN1cHByZXNzaW9uVjVcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX05vbk1heFN1cHByZXNzaW9uVjU9TW9kdWxlW1wiX05vbk1heFN1cHByZXNzaW9uVjVcIl09TW9kdWxlW1wiYXNtXCJdW1wiaGFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9Ob3RFcXVhbD1Nb2R1bGVbXCJfTm90RXF1YWxcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX05vdEVxdWFsPU1vZHVsZVtcIl9Ob3RFcXVhbFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJpYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX09uZUhvdD1Nb2R1bGVbXCJfT25lSG90XCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9PbmVIb3Q9TW9kdWxlW1wiX09uZUhvdFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJqYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1BhZFYyPU1vZHVsZVtcIl9QYWRWMlwiXT1mdW5jdGlvbigpe3JldHVybihfUGFkVjI9TW9kdWxlW1wiX1BhZFYyXCJdPU1vZHVsZVtcImFzbVwiXVtcImthXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfUG93PU1vZHVsZVtcIl9Qb3dcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1Bvdz1Nb2R1bGVbXCJfUG93XCJdPU1vZHVsZVtcImFzbVwiXVtcImxhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfUHJlbHU9TW9kdWxlW1wiX1ByZWx1XCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9QcmVsdT1Nb2R1bGVbXCJfUHJlbHVcIl09TW9kdWxlW1wiYXNtXCJdW1wibWFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9Qcm9kPU1vZHVsZVtcIl9Qcm9kXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9Qcm9kPU1vZHVsZVtcIl9Qcm9kXCJdPU1vZHVsZVtcImFzbVwiXVtcIm5hXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfUmVhbERpdj1Nb2R1bGVbXCJfUmVhbERpdlwiXT1mdW5jdGlvbigpe3JldHVybihfUmVhbERpdj1Nb2R1bGVbXCJfUmVhbERpdlwiXT1Nb2R1bGVbXCJhc21cIl1bXCJvYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1JlbHU9TW9kdWxlW1wiX1JlbHVcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1JlbHU9TW9kdWxlW1wiX1JlbHVcIl09TW9kdWxlW1wiYXNtXCJdW1wicGFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9SZWx1Nj1Nb2R1bGVbXCJfUmVsdTZcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1JlbHU2PU1vZHVsZVtcIl9SZWx1NlwiXT1Nb2R1bGVbXCJhc21cIl1bXCJxYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1Jlc2l6ZUJpbGluZWFyPU1vZHVsZVtcIl9SZXNpemVCaWxpbmVhclwiXT1mdW5jdGlvbigpe3JldHVybihfUmVzaXplQmlsaW5lYXI9TW9kdWxlW1wiX1Jlc2l6ZUJpbGluZWFyXCJdPU1vZHVsZVtcImFzbVwiXVtcInJhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfUmV2ZXJzZT1Nb2R1bGVbXCJfUmV2ZXJzZVwiXT1mdW5jdGlvbigpe3JldHVybihfUmV2ZXJzZT1Nb2R1bGVbXCJfUmV2ZXJzZVwiXT1Nb2R1bGVbXCJhc21cIl1bXCJzYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1JvdGF0ZVdpdGhPZmZzZXQ9TW9kdWxlW1wiX1JvdGF0ZVdpdGhPZmZzZXRcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1JvdGF0ZVdpdGhPZmZzZXQ9TW9kdWxlW1wiX1JvdGF0ZVdpdGhPZmZzZXRcIl09TW9kdWxlW1wiYXNtXCJdW1widGFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9Sb3VuZD1Nb2R1bGVbXCJfUm91bmRcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1JvdW5kPU1vZHVsZVtcIl9Sb3VuZFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJ1YVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1JzcXJ0PU1vZHVsZVtcIl9Sc3FydFwiXT1mdW5jdGlvbigpe3JldHVybihfUnNxcnQ9TW9kdWxlW1wiX1JzcXJ0XCJdPU1vZHVsZVtcImFzbVwiXVtcInZhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfU2NhdHRlck5kPU1vZHVsZVtcIl9TY2F0dGVyTmRcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1NjYXR0ZXJOZD1Nb2R1bGVbXCJfU2NhdHRlck5kXCJdPU1vZHVsZVtcImFzbVwiXVtcIndhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfU2VsZWN0VjI9TW9kdWxlW1wiX1NlbGVjdFYyXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9TZWxlY3RWMj1Nb2R1bGVbXCJfU2VsZWN0VjJcIl09TW9kdWxlW1wiYXNtXCJdW1wieGFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9TaWdtb2lkPU1vZHVsZVtcIl9TaWdtb2lkXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9TaWdtb2lkPU1vZHVsZVtcIl9TaWdtb2lkXCJdPU1vZHVsZVtcImFzbVwiXVtcInlhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfU2luPU1vZHVsZVtcIl9TaW5cIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1Npbj1Nb2R1bGVbXCJfU2luXCJdPU1vZHVsZVtcImFzbVwiXVtcInphXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfU29mdG1heD1Nb2R1bGVbXCJfU29mdG1heFwiXT1mdW5jdGlvbigpe3JldHVybihfU29mdG1heD1Nb2R1bGVbXCJfU29mdG1heFwiXT1Nb2R1bGVbXCJhc21cIl1bXCJBYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1NxcnQ9TW9kdWxlW1wiX1NxcnRcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1NxcnQ9TW9kdWxlW1wiX1NxcnRcIl09TW9kdWxlW1wiYXNtXCJdW1wiQmFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9TcXVhcmU9TW9kdWxlW1wiX1NxdWFyZVwiXT1mdW5jdGlvbigpe3JldHVybihfU3F1YXJlPU1vZHVsZVtcIl9TcXVhcmVcIl09TW9kdWxlW1wiYXNtXCJdW1wiQ2FcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9TcXVhcmVkRGlmZmVyZW5jZT1Nb2R1bGVbXCJfU3F1YXJlZERpZmZlcmVuY2VcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1NxdWFyZWREaWZmZXJlbmNlPU1vZHVsZVtcIl9TcXVhcmVkRGlmZmVyZW5jZVwiXT1Nb2R1bGVbXCJhc21cIl1bXCJEYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1N0ZXA9TW9kdWxlW1wiX1N0ZXBcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1N0ZXA9TW9kdWxlW1wiX1N0ZXBcIl09TW9kdWxlW1wiYXNtXCJdW1wiRWFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9TdHJpZGVkU2xpY2U9TW9kdWxlW1wiX1N0cmlkZWRTbGljZVwiXT1mdW5jdGlvbigpe3JldHVybihfU3RyaWRlZFNsaWNlPU1vZHVsZVtcIl9TdHJpZGVkU2xpY2VcIl09TW9kdWxlW1wiYXNtXCJdW1wiRmFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9TdWI9TW9kdWxlW1wiX1N1YlwiXT1mdW5jdGlvbigpe3JldHVybihfU3ViPU1vZHVsZVtcIl9TdWJcIl09TW9kdWxlW1wiYXNtXCJdW1wiR2FcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9TdW09TW9kdWxlW1wiX1N1bVwiXT1mdW5jdGlvbigpe3JldHVybihfU3VtPU1vZHVsZVtcIl9TdW1cIl09TW9kdWxlW1wiYXNtXCJdW1wiSGFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9UYW49TW9kdWxlW1wiX1RhblwiXT1mdW5jdGlvbigpe3JldHVybihfVGFuPU1vZHVsZVtcIl9UYW5cIl09TW9kdWxlW1wiYXNtXCJdW1wiSWFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9UYW5oPU1vZHVsZVtcIl9UYW5oXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9UYW5oPU1vZHVsZVtcIl9UYW5oXCJdPU1vZHVsZVtcImFzbVwiXVtcIkphXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfVGlsZT1Nb2R1bGVbXCJfVGlsZVwiXT1mdW5jdGlvbigpe3JldHVybihfVGlsZT1Nb2R1bGVbXCJfVGlsZVwiXT1Nb2R1bGVbXCJhc21cIl1bXCJLYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgX1RvcEs9TW9kdWxlW1wiX1RvcEtcIl09ZnVuY3Rpb24oKXtyZXR1cm4oX1RvcEs9TW9kdWxlW1wiX1RvcEtcIl09TW9kdWxlW1wiYXNtXCJdW1wiTGFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9UcmFuc2Zvcm09TW9kdWxlW1wiX1RyYW5zZm9ybVwiXT1mdW5jdGlvbigpe3JldHVybihfVHJhbnNmb3JtPU1vZHVsZVtcIl9UcmFuc2Zvcm1cIl09TW9kdWxlW1wiYXNtXCJdW1wiTWFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9UcmFuc3Bvc2U9TW9kdWxlW1wiX1RyYW5zcG9zZVwiXT1mdW5jdGlvbigpe3JldHVybihfVHJhbnNwb3NlPU1vZHVsZVtcIl9UcmFuc3Bvc2VcIl09TW9kdWxlW1wiYXNtXCJdW1wiTmFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9fRnVzZWRNYXRNdWw9TW9kdWxlW1wiX19GdXNlZE1hdE11bFwiXT1mdW5jdGlvbigpe3JldHVybihfX0Z1c2VkTWF0TXVsPU1vZHVsZVtcIl9fRnVzZWRNYXRNdWxcIl09TW9kdWxlW1wiYXNtXCJdW1wiT2FcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9tYWxsb2M9TW9kdWxlW1wiX21hbGxvY1wiXT1mdW5jdGlvbigpe3JldHVybihfbWFsbG9jPU1vZHVsZVtcIl9tYWxsb2NcIl09TW9kdWxlW1wiYXNtXCJdW1wiUGFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIF9mcmVlPU1vZHVsZVtcIl9mcmVlXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKF9mcmVlPU1vZHVsZVtcIl9mcmVlXCJdPU1vZHVsZVtcImFzbVwiXVtcIlFhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBfX19lcnJub19sb2NhdGlvbj1Nb2R1bGVbXCJfX19lcnJub19sb2NhdGlvblwiXT1mdW5jdGlvbigpe3JldHVybihfX19lcnJub19sb2NhdGlvbj1Nb2R1bGVbXCJfX19lcnJub19sb2NhdGlvblwiXT1Nb2R1bGVbXCJhc21cIl1bXCJSYVwiXSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgc3RhY2tTYXZlPU1vZHVsZVtcInN0YWNrU2F2ZVwiXT1mdW5jdGlvbigpe3JldHVybihzdGFja1NhdmU9TW9kdWxlW1wic3RhY2tTYXZlXCJdPU1vZHVsZVtcImFzbVwiXVtcIlNhXCJdKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O3ZhciBzdGFja1Jlc3RvcmU9TW9kdWxlW1wic3RhY2tSZXN0b3JlXCJdPWZ1bmN0aW9uKCl7cmV0dXJuKHN0YWNrUmVzdG9yZT1Nb2R1bGVbXCJzdGFja1Jlc3RvcmVcIl09TW9kdWxlW1wiYXNtXCJdW1wiVGFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIHN0YWNrQWxsb2M9TW9kdWxlW1wic3RhY2tBbGxvY1wiXT1mdW5jdGlvbigpe3JldHVybihzdGFja0FsbG9jPU1vZHVsZVtcInN0YWNrQWxsb2NcIl09TW9kdWxlW1wiYXNtXCJdW1wiVWFcIl0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX07TW9kdWxlW1wiY3dyYXBcIl09Y3dyYXA7dmFyIGNhbGxlZFJ1bjtmdW5jdGlvbiBFeGl0U3RhdHVzKHN0YXR1cyl7dGhpcy5uYW1lPVwiRXhpdFN0YXR1c1wiO3RoaXMubWVzc2FnZT1cIlByb2dyYW0gdGVybWluYXRlZCB3aXRoIGV4aXQoXCIrc3RhdHVzK1wiKVwiO3RoaXMuc3RhdHVzPXN0YXR1c31kZXBlbmRlbmNpZXNGdWxmaWxsZWQ9ZnVuY3Rpb24gcnVuQ2FsbGVyKCl7aWYoIWNhbGxlZFJ1bilydW4oKTtpZighY2FsbGVkUnVuKWRlcGVuZGVuY2llc0Z1bGZpbGxlZD1ydW5DYWxsZXJ9O2Z1bmN0aW9uIHJ1bihhcmdzKXthcmdzPWFyZ3N8fGFyZ3VtZW50c187aWYocnVuRGVwZW5kZW5jaWVzPjApe3JldHVybn1wcmVSdW4oKTtpZihydW5EZXBlbmRlbmNpZXM+MCl7cmV0dXJufWZ1bmN0aW9uIGRvUnVuKCl7aWYoY2FsbGVkUnVuKXJldHVybjtjYWxsZWRSdW49dHJ1ZTtNb2R1bGVbXCJjYWxsZWRSdW5cIl09dHJ1ZTtpZihBQk9SVClyZXR1cm47aW5pdFJ1bnRpbWUoKTtwcmVNYWluKCk7cmVhZHlQcm9taXNlUmVzb2x2ZShNb2R1bGUpO2lmKE1vZHVsZVtcIm9uUnVudGltZUluaXRpYWxpemVkXCJdKU1vZHVsZVtcIm9uUnVudGltZUluaXRpYWxpemVkXCJdKCk7cG9zdFJ1bigpfWlmKE1vZHVsZVtcInNldFN0YXR1c1wiXSl7TW9kdWxlW1wic2V0U3RhdHVzXCJdKFwiUnVubmluZy4uLlwiKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe01vZHVsZVtcInNldFN0YXR1c1wiXShcIlwiKX0sMSk7ZG9SdW4oKX0sMSl9ZWxzZXtkb1J1bigpfX1Nb2R1bGVbXCJydW5cIl09cnVuO2lmKE1vZHVsZVtcInByZUluaXRcIl0pe2lmKHR5cGVvZiBNb2R1bGVbXCJwcmVJbml0XCJdPT1cImZ1bmN0aW9uXCIpTW9kdWxlW1wicHJlSW5pdFwiXT1bTW9kdWxlW1wicHJlSW5pdFwiXV07d2hpbGUoTW9kdWxlW1wicHJlSW5pdFwiXS5sZW5ndGg+MCl7TW9kdWxlW1wicHJlSW5pdFwiXS5wb3AoKSgpfX1ydW4oKTtcblxuXG4gIHJldHVybiBXYXNtQmFja2VuZE1vZHVsZS5yZWFkeVxufVxuKTtcbn0pKCk7XG5pZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuICBtb2R1bGUuZXhwb3J0cyA9IFdhc21CYWNrZW5kTW9kdWxlO1xuZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmVbJ2FtZCddKVxuICBkZWZpbmUoW10sIGZ1bmN0aW9uKCkgeyByZXR1cm4gV2FzbUJhY2tlbmRNb2R1bGU7IH0pO1xuZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuICBleHBvcnRzW1wiV2FzbUJhY2tlbmRNb2R1bGVcIl0gPSBXYXNtQmFja2VuZE1vZHVsZTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmV4cG9ydCBjb25zdCBFUFNJTE9OX0ZMT0FUMzIgPSAxZS03O1xuZXhwb3J0IGNvbnN0IEVQU0lMT05fRkxPQVQxNiA9IDFlLTQ7XG4vKiogQ29udmVuaWVudCBjbGFzcyBmb3Igc3RvcmluZyB0ZW5zb3ItcmVsYXRlZCBkYXRhLiAqL1xuZXhwb3J0IGNsYXNzIERhdGFTdG9yYWdlIHtcbiAgICBjb25zdHJ1Y3RvcihiYWNrZW5kLCBkYXRhTW92ZXIpIHtcbiAgICAgICAgdGhpcy5iYWNrZW5kID0gYmFja2VuZDtcbiAgICAgICAgdGhpcy5kYXRhTW92ZXIgPSBkYXRhTW92ZXI7XG4gICAgICAgIHRoaXMuZGF0YSA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgIHRoaXMuZGF0YUlkc0NvdW50ID0gMDtcbiAgICB9XG4gICAgZ2V0KGRhdGFJZCkge1xuICAgICAgICBpZiAoIXRoaXMuZGF0YS5oYXMoZGF0YUlkKSkge1xuICAgICAgICAgICAgdGhpcy5kYXRhTW92ZXIubW92ZURhdGEodGhpcy5iYWNrZW5kLCBkYXRhSWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEuZ2V0KGRhdGFJZCk7XG4gICAgfVxuICAgIHNldChkYXRhSWQsIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuZGF0YUlkc0NvdW50Kys7XG4gICAgICAgIHRoaXMuZGF0YS5zZXQoZGF0YUlkLCB2YWx1ZSk7XG4gICAgfVxuICAgIGhhcyhkYXRhSWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5oYXMoZGF0YUlkKTtcbiAgICB9XG4gICAgZGVsZXRlKGRhdGFJZCkge1xuICAgICAgICB0aGlzLmRhdGFJZHNDb3VudC0tO1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmRlbGV0ZShkYXRhSWQpO1xuICAgIH1cbiAgICBudW1EYXRhSWRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhSWRzQ291bnQ7XG4gICAgfVxufVxuLyoqXG4gKiBUaGUgaW50ZXJmYWNlIHRoYXQgZGVmaW5lcyB0aGUga2VybmVscyB0aGF0IHNob3VsZCBiZSBpbXBsZW1lbnRlZCB3aGVuXG4gKiBhZGRpbmcgYSBuZXcgYmFja2VuZC4gTmV3IGJhY2tlbmRzIGRvbid0IG5lZWQgdG8gaW1wbGVtZW50IGV2ZXJ5IG9uZSBvZiB0aGVcbiAqIG1ldGhvZHMsIHRoaXMgY2FuIGJlIGRvbmUgZ3JhZHVhbGx5ICh0aHJvdyBhbiBlcnJvciBmb3IgdW5pbXBsZW1lbnRlZFxuICogbWV0aG9kcykuXG4gKi9cbmV4cG9ydCBjbGFzcyBLZXJuZWxCYWNrZW5kIHtcbiAgICByZWZDb3VudChkYXRhSWQpIHtcbiAgICAgICAgcmV0dXJuIG5vdFlldEltcGxlbWVudGVkKCdyZWZDb3VudCcpO1xuICAgIH1cbiAgICBpbmNSZWYoZGF0YUlkKSB7XG4gICAgICAgIHJldHVybiBub3RZZXRJbXBsZW1lbnRlZCgnaW5jUmVmJyk7XG4gICAgfVxuICAgIHRpbWVyQXZhaWxhYmxlKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgdGltZShmKSB7XG4gICAgICAgIHJldHVybiBub3RZZXRJbXBsZW1lbnRlZCgndGltZScpO1xuICAgIH1cbiAgICByZWFkKGRhdGFJZCkge1xuICAgICAgICByZXR1cm4gbm90WWV0SW1wbGVtZW50ZWQoJ3JlYWQnKTtcbiAgICB9XG4gICAgcmVhZFN5bmMoZGF0YUlkKSB7XG4gICAgICAgIHJldHVybiBub3RZZXRJbXBsZW1lbnRlZCgncmVhZFN5bmMnKTtcbiAgICB9XG4gICAgbnVtRGF0YUlkcygpIHtcbiAgICAgICAgcmV0dXJuIG5vdFlldEltcGxlbWVudGVkKCdudW1EYXRhSWRzJyk7XG4gICAgfVxuICAgIGRpc3Bvc2VEYXRhKGRhdGFJZCwgZm9yY2UpIHtcbiAgICAgICAgcmV0dXJuIG5vdFlldEltcGxlbWVudGVkKCdkaXNwb3NlRGF0YScpO1xuICAgIH1cbiAgICB3cml0ZSh2YWx1ZXMsIHNoYXBlLCBkdHlwZSkge1xuICAgICAgICByZXR1cm4gbm90WWV0SW1wbGVtZW50ZWQoJ3dyaXRlJyk7XG4gICAgfVxuICAgIG1vdmUoZGF0YUlkLCB2YWx1ZXMsIHNoYXBlLCBkdHlwZSwgcmVmQ291bnQpIHtcbiAgICAgICAgcmV0dXJuIG5vdFlldEltcGxlbWVudGVkKCdtb3ZlJyk7XG4gICAgfVxuICAgIG1lbW9yeSgpIHtcbiAgICAgICAgcmV0dXJuIG5vdFlldEltcGxlbWVudGVkKCdtZW1vcnknKTtcbiAgICB9XG4gICAgLyoqIFJldHVybnMgdGhlIGhpZ2hlc3QgcHJlY2lzaW9uIGZvciBmbG9hdHMgaW4gYml0cyAoZS5nLiAxNiBvciAzMikgKi9cbiAgICBmbG9hdFByZWNpc2lvbigpIHtcbiAgICAgICAgcmV0dXJuIG5vdFlldEltcGxlbWVudGVkKCdmbG9hdFByZWNpc2lvbicpO1xuICAgIH1cbiAgICAvKiogUmV0dXJucyB0aGUgc21hbGxlc3QgcmVwcmVzZW50YWJsZSBudW1iZXIuICAqL1xuICAgIGVwc2lsb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZsb2F0UHJlY2lzaW9uKCkgPT09IDMyID8gRVBTSUxPTl9GTE9BVDMyIDogRVBTSUxPTl9GTE9BVDE2O1xuICAgIH1cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICByZXR1cm4gbm90WWV0SW1wbGVtZW50ZWQoJ2Rpc3Bvc2UnKTtcbiAgICB9XG59XG5mdW5jdGlvbiBub3RZZXRJbXBsZW1lbnRlZChrZXJuZWxOYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAnJHtrZXJuZWxOYW1lfScgbm90IHlldCBpbXBsZW1lbnRlZCBvciBub3QgZm91bmQgaW4gdGhlIHJlZ2lzdHJ5LiBgICtcbiAgICAgICAgYFRoaXMga2VybmVsIG1heSBub3QgYmUgc3VwcG9ydGVkIGJ5IHRoZSB0ZmpzIGJhY2tlbmQgeW91IGhhdmUgY2hvc2VuYCk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1iYWNrZW5kLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGRlY29kZVN0cmluZywgZW5jb2RlU3RyaW5nIH0gZnJvbSAnLi4vdXRpbCc7XG4vLyBVdGlsaXRpZXMgbmVlZGVkIGJ5IGJhY2tlbmQgY29uc3VtZXJzIG9mIHRmLWNvcmUuXG5leHBvcnQgKiBmcm9tICcuLi9vcHMvYXhpc191dGlsJztcbmV4cG9ydCAqIGZyb20gJy4uL29wcy9icm9hZGNhc3RfdXRpbCc7XG5leHBvcnQgKiBmcm9tICcuLi9vcHMvY29uY2F0X3V0aWwnO1xuZXhwb3J0ICogZnJvbSAnLi4vb3BzL2NvbnZfdXRpbCc7XG5leHBvcnQgKiBmcm9tICcuLi9vcHMvZnVzZWRfdXRpbCc7XG5leHBvcnQgKiBmcm9tICcuLi9vcHMvcmVkdWNlX3V0aWwnO1xuaW1wb3J0ICogYXMgc2xpY2VfdXRpbCBmcm9tICcuLi9vcHMvc2xpY2VfdXRpbCc7XG5leHBvcnQgeyBzbGljZV91dGlsIH07XG5leHBvcnQgeyB1cGNhc3RUeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuZXhwb3J0ICogZnJvbSAnLi4vb3BzL3JvdGF0ZV91dGlsJztcbmV4cG9ydCAqIGZyb20gJy4uL29wcy9hcnJheV9vcHNfdXRpbCc7XG5leHBvcnQgKiBmcm9tICcuLi9vcHMvZ2F0aGVyX25kX3V0aWwnO1xuZXhwb3J0ICogZnJvbSAnLi4vb3BzL3NjYXR0ZXJfbmRfdXRpbCc7XG5leHBvcnQgKiBmcm9tICcuLi9vcHMvc2VsdV91dGlsJztcbmV4cG9ydCAqIGZyb20gJy4uL29wcy9mdXNlZF91dGlsJztcbmV4cG9ydCAqIGZyb20gJy4uL29wcy9lcmZfdXRpbCc7XG5leHBvcnQgKiBmcm9tICcuLi9sb2cnO1xuZXhwb3J0ICogZnJvbSAnLi4vYmFja2VuZHMvY29tcGxleF91dGlsJztcbmV4cG9ydCAqIGZyb20gJy4uL2JhY2tlbmRzL2VpbnN1bV91dGlsJztcbmV4cG9ydCAqIGZyb20gJy4uL29wcy9zcGxpdF91dGlsJztcbmltcG9ydCAqIGFzIHNlZ21lbnRfdXRpbCBmcm9tICcuLi9vcHMvc2VnbWVudF91dGlsJztcbmV4cG9ydCB7IHNlZ21lbnRfdXRpbCB9O1xuZXhwb3J0IGZ1bmN0aW9uIGZyb21VaW50OFRvU3RyaW5nQXJyYXkodmFscykge1xuICAgIHRyeSB7XG4gICAgICAgIC8vIERlY29kZSB0aGUgYnl0ZXMgaW50byBzdHJpbmcuXG4gICAgICAgIHJldHVybiB2YWxzLm1hcCh2YWwgPT4gZGVjb2RlU3RyaW5nKHZhbCkpO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGRlY29kZSBlbmNvZGVkIHN0cmluZyBieXRlcyBpbnRvIHV0Zi04LCBlcnJvcjogJHtlcnJ9YCk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGZyb21TdHJpbmdBcnJheVRvVWludDgoc3RyaW5ncykge1xuICAgIHJldHVybiBzdHJpbmdzLm1hcChzID0+IGVuY29kZVN0cmluZyhzKSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1iYWNrZW5kX3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuLyoqXG4gKiBNZXJnZXMgcmVhbCBhbmQgaW1hZ2luYXJ5IEZsb2F0MzJBcnJheXMgaW50byBhIHNpbmdsZSBjb21wbGV4IEZsb2F0MzJBcnJheS5cbiAqXG4gKiBUaGUgbWVtb3J5IGxheW91dCBpcyBpbnRlcmxlYXZlZCBhcyBmb2xsb3dzOlxuICogcmVhbDogW3IwLCByMSwgcjJdXG4gKiBpbWFnOiBbaTAsIGkxLCBpMl1cbiAqIGNvbXBsZXg6IFtyMCwgaTAsIHIxLCBpMSwgcjIsIGkyXVxuICpcbiAqIFRoaXMgaXMgdGhlIGludmVyc2Ugb2Ygc3BsaXRSZWFsQW5kSW1hZ0FycmF5cy5cbiAqXG4gKiBAcGFyYW0gcmVhbCBUaGUgcmVhbCB2YWx1ZXMgb2YgdGhlIGNvbXBsZXggdGVuc29yIHZhbHVlcy5cbiAqIEBwYXJhbSBpbWFnIFRoZSBpbWFnIHZhbHVlcyBvZiB0aGUgY29tcGxleCB0ZW5zb3IgdmFsdWVzLlxuICogQHJldHVybnMgQSBjb21wbGV4IHRlbnNvciBhcyBhIEZsb2F0MzJBcnJheSB3aXRoIG1lcmdlZCB2YWx1ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZVJlYWxBbmRJbWFnQXJyYXlzKHJlYWwsIGltYWcpIHtcbiAgICBpZiAocmVhbC5sZW5ndGggIT09IGltYWcubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IG1lcmdlIHJlYWwgYW5kIGltYWcgYXJyYXlzIG9mIGRpZmZlcmVudCBsZW5ndGhzLiByZWFsOmAgK1xuICAgICAgICAgICAgYCR7cmVhbC5sZW5ndGh9LCBpbWFnOiAke2ltYWcubGVuZ3RofS5gKTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IEZsb2F0MzJBcnJheShyZWFsLmxlbmd0aCAqIDIpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgIHJlc3VsdFtpXSA9IHJlYWxbaSAvIDJdO1xuICAgICAgICByZXN1bHRbaSArIDFdID0gaW1hZ1tpIC8gMl07XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4vKipcbiAqIFNwbGl0cyBhIGNvbXBsZXggRmxvYXQzMkFycmF5IGludG8gcmVhbCBhbmQgaW1hZyBwYXJ0cy5cbiAqXG4gKiBUaGUgbWVtb3J5IGxheW91dCBpcyBpbnRlcmxlYXZlZCBhcyBmb2xsb3dzOlxuICogY29tcGxleDogW3IwLCBpMCwgcjEsIGkxLCByMiwgaTJdXG4gKiByZWFsOiBbcjAsIHIxLCByMl1cbiAqIGltYWc6IFtpMCwgaTEsIGkyXVxuICpcbiAqIFRoaXMgaXMgdGhlIGludmVyc2Ugb2YgbWVyZ2VSZWFsQW5kSW1hZ0FycmF5cy5cbiAqXG4gKiBAcGFyYW0gY29tcGxleCBUaGUgY29tcGxleCB0ZW5zb3IgdmFsdWVzLlxuICogQHJldHVybnMgQW4gb2JqZWN0IHdpdGggcmVhbCBhbmQgaW1hZyBGbG9hdDMyQXJyYXkgY29tcG9uZW50cyBvZiB0aGUgY29tcGxleFxuICogICAgIHRlbnNvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0UmVhbEFuZEltYWdBcnJheXMoY29tcGxleCkge1xuICAgIGNvbnN0IHJlYWwgPSBuZXcgRmxvYXQzMkFycmF5KGNvbXBsZXgubGVuZ3RoIC8gMik7XG4gICAgY29uc3QgaW1hZyA9IG5ldyBGbG9hdDMyQXJyYXkoY29tcGxleC5sZW5ndGggLyAyKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbXBsZXgubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgcmVhbFtpIC8gMl0gPSBjb21wbGV4W2ldO1xuICAgICAgICBpbWFnW2kgLyAyXSA9IGNvbXBsZXhbaSArIDFdO1xuICAgIH1cbiAgICByZXR1cm4geyByZWFsLCBpbWFnIH07XG59XG4vKipcbiAqIEV4dHJhY3RzIGV2ZW4gaW5kZXhlZCBjb21wbGV4IHZhbHVlcyBpbiB0aGUgZ2l2ZW4gYXJyYXkuXG4gKiBAcGFyYW0gY29tcGxleCBUaGUgY29tcGxleCB0ZW5zb3IgdmFsdWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wbGV4V2l0aEV2ZW5JbmRleChjb21wbGV4KSB7XG4gICAgY29uc3QgbGVuID0gTWF0aC5jZWlsKGNvbXBsZXgubGVuZ3RoIC8gNCk7XG4gICAgY29uc3QgcmVhbCA9IG5ldyBGbG9hdDMyQXJyYXkobGVuKTtcbiAgICBjb25zdCBpbWFnID0gbmV3IEZsb2F0MzJBcnJheShsZW4pO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29tcGxleC5sZW5ndGg7IGkgKz0gNCkge1xuICAgICAgICByZWFsW01hdGguZmxvb3IoaSAvIDQpXSA9IGNvbXBsZXhbaV07XG4gICAgICAgIGltYWdbTWF0aC5mbG9vcihpIC8gNCldID0gY29tcGxleFtpICsgMV07XG4gICAgfVxuICAgIHJldHVybiB7IHJlYWwsIGltYWcgfTtcbn1cbi8qKlxuICogRXh0cmFjdHMgb2RkIGluZGV4ZWQgY29tcGxlIHZhbHVlcyBpbiB0aGUgZ2l2ZW4gYXJyYXkuXG4gKiBAcGFyYW0gY29tcGxleCBUaGUgY29tcGxleCB0ZW5zb3IgdmFsdWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wbGV4V2l0aE9kZEluZGV4KGNvbXBsZXgpIHtcbiAgICBjb25zdCBsZW4gPSBNYXRoLmZsb29yKGNvbXBsZXgubGVuZ3RoIC8gNCk7XG4gICAgY29uc3QgcmVhbCA9IG5ldyBGbG9hdDMyQXJyYXkobGVuKTtcbiAgICBjb25zdCBpbWFnID0gbmV3IEZsb2F0MzJBcnJheShsZW4pO1xuICAgIGZvciAobGV0IGkgPSAyOyBpIDwgY29tcGxleC5sZW5ndGg7IGkgKz0gNCkge1xuICAgICAgICByZWFsW01hdGguZmxvb3IoaSAvIDQpXSA9IGNvbXBsZXhbaV07XG4gICAgICAgIGltYWdbTWF0aC5mbG9vcihpIC8gNCldID0gY29tcGxleFtpICsgMV07XG4gICAgfVxuICAgIHJldHVybiB7IHJlYWwsIGltYWcgfTtcbn1cbi8qKlxuICogR2V0IHRoZSBtYXAgcmVwcmVzZW50aW5nIGEgY29tcGxleCB2YWx1ZSBpbiB0aGUgZ2l2ZW4gYXJyYXkuXG4gKiBAcGFyYW0gY29tcGxleCBUaGUgY29tcGxleCB0ZW5zb3IgdmFsdWVzLlxuICogQHBhcmFtIGluZGV4IEFuIGluZGV4IG9mIHRoZSB0YXJnZXQgY29tcGxleCB2YWx1ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENvbXBsZXhXaXRoSW5kZXgoY29tcGxleCwgaW5kZXgpIHtcbiAgICBjb25zdCByZWFsID0gY29tcGxleFtpbmRleCAqIDJdO1xuICAgIGNvbnN0IGltYWcgPSBjb21wbGV4W2luZGV4ICogMiArIDFdO1xuICAgIHJldHVybiB7IHJlYWwsIGltYWcgfTtcbn1cbi8qKlxuICogSW5zZXJ0IGEgZ2l2ZW4gY29tcGxleCB2YWx1ZSBpbnRvIHRoZSBUeXBlZEFycmF5LlxuICogQHBhcmFtIGRhdGEgVGhlIGFycmF5IGluIHdoaWNoIHRoZSBjb21wbGV4IHZhbHVlIGlzIGluc2VydGVkLlxuICogQHBhcmFtIGMgVGhlIGNvbXBsZXggdmFsdWUgdG8gYmUgaW5zZXJ0ZWQuXG4gKiBAcGFyYW0gaW5kZXggQW4gaW5kZXggb2YgdGhlIHRhcmdldCBjb21wbGV4IHZhbHVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzaWduVG9UeXBlZEFycmF5KGRhdGEsIHJlYWwsIGltYWcsIGluZGV4KSB7XG4gICAgZGF0YVtpbmRleCAqIDJdID0gcmVhbDtcbiAgICBkYXRhW2luZGV4ICogMiArIDFdID0gaW1hZztcbn1cbi8qKlxuICogTWFrZSB0aGUgbGlzdCBvZiBleHBvbmVudCB0ZXJtcyB1c2VkIGJ5IEZGVC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4cG9uZW50cyhuLCBpbnZlcnNlKSB7XG4gICAgY29uc3QgcmVhbCA9IG5ldyBGbG9hdDMyQXJyYXkobiAvIDIpO1xuICAgIGNvbnN0IGltYWcgPSBuZXcgRmxvYXQzMkFycmF5KG4gLyAyKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IE1hdGguY2VpbChuIC8gMik7IGkrKykge1xuICAgICAgICBjb25zdCB4ID0gKGludmVyc2UgPyAyIDogLTIpICogTWF0aC5QSSAqIChpIC8gbik7XG4gICAgICAgIHJlYWxbaV0gPSBNYXRoLmNvcyh4KTtcbiAgICAgICAgaW1hZ1tpXSA9IE1hdGguc2luKHgpO1xuICAgIH1cbiAgICByZXR1cm4geyByZWFsLCBpbWFnIH07XG59XG4vKipcbiAqIE1ha2UgdGhlIGV4cG9uZW50IHRlcm0gdXNlZCBieSBGRlQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHBvbmVudChrLCBuLCBpbnZlcnNlKSB7XG4gICAgY29uc3QgeCA9IChpbnZlcnNlID8gMiA6IC0yKSAqIE1hdGguUEkgKiAoayAvIG4pO1xuICAgIGNvbnN0IHJlYWwgPSBNYXRoLmNvcyh4KTtcbiAgICBjb25zdCBpbWFnID0gTWF0aC5zaW4oeCk7XG4gICAgcmV0dXJuIHsgcmVhbCwgaW1hZyB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29tcGxleF91dGlsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGFzc2VydCB9IGZyb20gJy4uL3V0aWxfYmFzZSc7XG5jb25zdCBBUlJPVyA9ICctPic7XG5jb25zdCBBUlJPV19SRUdFWCA9IC8tPi9nO1xuY29uc3QgQ09NTUEgPSAnLCc7XG5jb25zdCBFTExJUFNJUyA9ICcuLi4nO1xuLyoqXG4gKiBQYXJzZSBhbiBlcXVhdGlvbiBmb3IgZWluc3VtLlxuICpcbiAqIEBwYXJhbSBlcXVhdGlvbiBUaGUgZWluc3VtIGVxdWF0aW9uIChlLmcuLCBcImlqLGprLT5pa1wiKS5cbiAqIEBwYXJhbSBudW1UZW5zb3JzIE51bWJlciBvZiB0ZW5zb3JzIHByb3ZpZGVkIGFsb25nIHdpdGggYGVxdWF0aW9uYC4gVXNlZCB0b1xuICogICBjaGVjayBtYXRjaGluZyBudW1iZXIgb2YgaW5wdXQgdGVuc29ycy5cbiAqIEByZXR1cm5zIEFuIG9iamVjdCBjb25zaXN0aW5nIG9mIHRoZSBmb2xsb3dpbmcgZmllbGRzOlxuICogICAtIGFsbERpbXM6IGFsbCBkaW1lbnNpb24gbmFtZXMgYXMgc3RyaW5ncy5cbiAqICAgLSBzdW1tZWREaW1zOiBhIGxpc3Qgb2YgYWxsIGRpbWVuc2lvbnMgYmVpbmcgc3VtbWVkIG92ZXIsIGFzIGluZGljZXMgdG9cbiAqICAgICB0aGUgZWxlbWVudHMgb2YgYGFsbERpbXNgLlxuICogICAtIGlkRGltczogaW5kaWNlcyBvZiB0aGUgZGltZW5zaW9ucyBpbiBlYWNoIGlucHV0IHRlbnNvciwgYXMgaW5kaWNlcyB0b1xuICogICAgIHRoZSBlbGVtZW50cyBvZiBgYWxsRGltcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZUVpbnN1bUVxdWF0aW9uKGVxdWF0aW9uLCBudW1UZW5zb3JzKSB7XG4gICAgZXF1YXRpb24gPSBlcXVhdGlvbi5yZXBsYWNlKC9cXHMvZywgJycpOyAvLyBSZW1vdmUgd2l0ZXNwYWNlIGluIGVxdWF0aW9uLlxuICAgIGNvbnN0IG51bUFycm93cyA9IChlcXVhdGlvbi5sZW5ndGggLSBlcXVhdGlvbi5yZXBsYWNlKEFSUk9XX1JFR0VYLCAnJykubGVuZ3RoKSAvXG4gICAgICAgIEFSUk9XLmxlbmd0aDtcbiAgICBpZiAobnVtQXJyb3dzIDwgMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VxdWF0aW9ucyB3aXRob3V0IGFuIGFycm93IGFyZSBub3Qgc3VwcG9ydGVkLicpO1xuICAgIH1cbiAgICBlbHNlIGlmIChudW1BcnJvd3MgPiAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXF1YXRpb24gbXVzdCBjb250YWluIGV4YWN0bHkgb25lIGFycm93IChcIiR7QVJST1d9XCIpLmApO1xuICAgIH1cbiAgICBjb25zdCBbaW5wdXRTdHJpbmcsIG91dHB1dFN0cmluZ10gPSBlcXVhdGlvbi5zcGxpdChBUlJPVyk7XG4gICAgYXNzZXJ0KGlucHV0U3RyaW5nLmluZGV4T2YoRUxMSVBTSVMpID09PSAtMSwgKCkgPT4gYFRoZSBlbGxpcHNpcyBub3RhdGlvbiAoXCIke0VMTElQU0lTfVwiKSBpcyBub3Qgc3VwcG9ydGVkIHlldC5gKTtcbiAgICBjb25zdCBpbnB1dFRlcm1zID0gaW5wdXRTdHJpbmcuc3BsaXQoQ09NTUEpO1xuICAgIGNvbnN0IG51bUlucHV0cyA9IGlucHV0VGVybXMubGVuZ3RoO1xuICAgIGlmIChudW1UZW5zb3JzICE9PSBudW1JbnB1dHMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAke251bUlucHV0c30gaW5wdXQgdGVuc29ycywgcmVjZWl2ZWQgJHtudW1UZW5zb3JzfWApO1xuICAgIH1cbiAgICBpZiAobnVtSW5wdXRzID4gMikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1N1cHBvcnQgZm9yIG1vcmUgdGhhbiAyIGlucHV0IHRlbnNvcnMgaXMgbm90IGltcGxlbWVudGVkIHlldC4nKTtcbiAgICB9XG4gICAgY29uc3QgYWxsRGltcyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3V0cHV0U3RyaW5nLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbnN0IGRpbU5hbWUgPSBvdXRwdXRTdHJpbmdbaV07XG4gICAgICAgIGlmICghaW5wdXRUZXJtcy5zb21lKGlucHV0VGVybSA9PiBpbnB1dFRlcm0uaW5kZXhPZihkaW1OYW1lKSAhPT0gLTEpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE91dHB1dCBzdWJzY3JpcHRzIGNvbnRhaW4gdGhlIGxhYmVsICR7ZGltTmFtZX0gYCArXG4gICAgICAgICAgICAgICAgYG5vdCBwcmVzZW50IGluIHRoZSBpbnB1dCBzdWJzY3JpcHRzLmApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhbGxEaW1zLmluZGV4T2YoZGltTmFtZSkgPT09IC0xKSB7XG4gICAgICAgICAgICBhbGxEaW1zLnB1c2goZGltTmFtZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dFN0cmluZy5sZW5ndGg7ICsraSkge1xuICAgICAgICBjb25zdCBkaW1OYW1lID0gaW5wdXRTdHJpbmdbaV07XG4gICAgICAgIGlmIChhbGxEaW1zLmluZGV4T2YoZGltTmFtZSkgPT09IC0xICYmIGRpbU5hbWUgIT09IENPTU1BKSB7XG4gICAgICAgICAgICBhbGxEaW1zLnB1c2goZGltTmFtZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgaWREaW1zID0gbmV3IEFycmF5KGlucHV0VGVybXMubGVuZ3RoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUlucHV0czsgKytpKSB7XG4gICAgICAgIGlmIChuZXcgU2V0KGlucHV0VGVybXNbaV0uc3BsaXQoJycpKS5zaXplICE9PSBpbnB1dFRlcm1zW2ldLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGb3VuZCBkdXBsaWNhdGUgYXhlcyBpbiBpbnB1dCBjb21wb25lbnQgJHtpbnB1dFRlcm1zW2ldfS4gYCArXG4gICAgICAgICAgICAgICAgYFN1cHBvcnQgZm9yIGR1cGxpY2F0ZSBheGVzIGluIGlucHV0IGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWREaW1zW2ldID0gW107XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgaW5wdXRUZXJtc1tpXS5sZW5ndGg7ICsraikge1xuICAgICAgICAgICAgaWREaW1zW2ldLnB1c2goYWxsRGltcy5pbmRleE9mKGlucHV0VGVybXNbaV1bal0pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBudW1EaW1zID0gYWxsRGltcy5sZW5ndGg7IC8vIE51bWJlciBvZiB1bmlxdWUgZGltZW5zaW9ucy5cbiAgICBjb25zdCBudW1PdXREaW1zID0gb3V0cHV0U3RyaW5nLmxlbmd0aDsgLy8gTnVtYmVyIG9mIG91dHB1dCBkaW1lbnNpb25zLlxuICAgIGNvbnN0IHN1bW1lZERpbXMgPSBbXTsgLy8gRGltZW5zaW9ucyBiZWluZyBzdW1tZWQgb3Zlci5cbiAgICBmb3IgKGxldCBpID0gbnVtT3V0RGltczsgaSA8IG51bURpbXM7ICsraSkge1xuICAgICAgICBzdW1tZWREaW1zLnB1c2goaSk7XG4gICAgfVxuICAgIHJldHVybiB7IGFsbERpbXMsIHN1bW1lZERpbXMsIGlkRGltcyB9O1xufVxuLyoqXG4gKiBHZXQgdGhlIHBlcm11dGF0aW9uIGZvciBhIGdpdmVuIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAcGFyYW0gbkRpbXMgVG90YWwgbnVtYmVyIG9mIGRpbWVuc2lvbiBvZiBhbGwgdGVuc29ycyBpbnZvbHZlZCBpbiB0aGUgZWluc3VtXG4gKiAgIG9wZXJhdGlvbi5cbiAqIEBwYXJhbSBpZERpbXMgRGltZW5zaW9uIGluZGljZXMgaW52b2x2ZSBpbiB0aGUgdGVuc29yIGluIHF1ZXN0aW9uLlxuICogQHJldHVybnMgQW4gb2JqZWN0IGNvbnNpc3Rpbmcgb2YgdGhlIGZvbGxvd2luZyBmaWVsZHM6XG4gKiAgIC0gcGVybXV0YXRpb25JbmRpY2VzOiBJbmRpY2VzIHRvIHBlcm11dGUgdGhlIGF4ZXMgb2YgdGhlIHRlbnNvciB3aXRoLlxuICogICAtIGV4cGFuZERpbXM6IEluZGljZXMgdG8gdGhlIGRpbWVuc2lvbiB0aGF0IG5lZWQgdG8gYmUgZXhwYW5kZWQgZnJvbSB0aGVcbiAqICAgICB0ZW5zb3IgYWZ0ZXIgcGVybXV0YXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRFaW5zdW1QZXJtdXRhdGlvbihuRGltcywgaWREaW1zKSB7XG4gICAgbGV0IHBlcm11dGF0aW9uSW5kaWNlcyA9IG5ldyBBcnJheShuRGltcyk7XG4gICAgcGVybXV0YXRpb25JbmRpY2VzLmZpbGwoLTEpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaWREaW1zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHBlcm11dGF0aW9uSW5kaWNlc1tpZERpbXNbaV1dID0gaTtcbiAgICB9XG4gICAgY29uc3QgZXhwYW5kRGltcyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbkRpbXM7ICsraSkge1xuICAgICAgICBpZiAocGVybXV0YXRpb25JbmRpY2VzW2ldID09PSAtMSkge1xuICAgICAgICAgICAgZXhwYW5kRGltcy5wdXNoKGkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHBlcm11dGF0aW9uSW5kaWNlcyA9IHBlcm11dGF0aW9uSW5kaWNlcy5maWx0ZXIoZCA9PiBkICE9PSAtMSk7XG4gICAgcmV0dXJuIHsgcGVybXV0YXRpb25JbmRpY2VzLCBleHBhbmREaW1zIH07XG59XG4vKipcbiAqIENoZWNrcyB0aGF0IHRoZSBkaW1lbnNpb24gc2l6ZXMgZnJvbSBkaWZmZXJlbnQgaW5wdXQgdGVuc29ycyBtYXRjaCB0aGVcbiAqIGVxdWF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tFaW5zdW1EaW1TaXplcyhuRGltcywgaWREaW1zLCB0ZW5zb3JzKSB7XG4gICAgY29uc3QgZGltU2l6ZXMgPSBuZXcgQXJyYXkobkRpbXMpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGVuc29ycy5sZW5ndGg7ICsraSkge1xuICAgICAgICBjb25zdCBzaGFwZSA9IHRlbnNvcnNbaV0uc2hhcGU7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgaWREaW1zW2ldLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICBpZiAoZGltU2l6ZXNbaWREaW1zW2ldW2pdXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgZGltU2l6ZXNbaWREaW1zW2ldW2pdXSA9IHNoYXBlW2pdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYXNzZXJ0KGRpbVNpemVzW2lkRGltc1tpXVtqXV0gPT09IHNoYXBlW2pdLCAoKSA9PiBgRXhwZWN0ZWQgZGltZW5zaW9uICR7ZGltU2l6ZXNbaWREaW1zW2ldW2pdXX0gYXQgYXhpcyAke2p9IGAgK1xuICAgICAgICAgICAgICAgICAgICBgb2YgaW5wdXQgc2hhcGVkICR7SlNPTi5zdHJpbmdpZnkoc2hhcGUpfSwgYCArXG4gICAgICAgICAgICAgICAgICAgIGBidXQgZ290IGRpbWVuc2lvbiAke3NoYXBlW2pdfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG4gKiBHZXRzIHBhdGggb2YgY29tcHV0YXRpb24gZm9yIGVpbnN1bS5cbiAqXG4gKiBAcGFyYW0gc3VtbWVkRGltcyBpbmRpY2VzIHRvIHRoZSBkaW1lbnNpb25zIGJlaW5nIHN1bW1lZCBvdmVyLlxuICogQHBhcmFtIGlkRGltcyBBIGxvb2sgdXAgdGFibGUgZm9yIHRoZSBkaW1lbnNpb25zIHByZXNlbnQgaW4gZWFjaCBpbnB1dFxuICogICAgIHRlbnNvci4gRWFjaCBjb25zaXR1ZW50IGFycmF5IGNvbnRhaW5zIGluZGljZXMgZm9yIHRoZSBkaW1lbnNpb25zIGluIHRoZVxuICogICAgIGNvcnJlc3BvbmRpbmcgaW5wdXQgdGVuc29yLlxuICpcbiAqIEByZXR1cm4gQSBtYXAgd2l0aCB0d28gZmllbGRzOlxuICogICAtIHBhdGg6IFRoZSBwYXRoIG9mIGNvbXB1dGF0aW9uLCB3aXRoIGVhY2ggZWxlbWVudCBpbmRpY2F0aW5nIHRoZSBkaW1lbnNpb25cbiAqICAgICBiZWluZyBzdW1tZWQgb3ZlciBhZnRlciB0aGUgZWxlbWVudC13aXNlIG11bHRpcGxpY2F0aW9uIGluIHRoYXQgc3RlcC5cbiAqICAgLSBzdGVwczogV2l0aCB0aGUgc2FtZSBsZW5ndGggYXMgYHBhdGhgLiBFYWNoIGVsZW1lbnQgY29udGFpbnMgdGhlIGluZGljZXNcbiAqICAgICB0byB0aGUgaW5wdXQgdGVuc29ycyBiZWluZyB1c2VkIGZvciBlbGVtZW50LXdpc2UgbXVsdGlwbGljYXRpb24gaW4gdGhlXG4gKiAgICAgY29ycmVzcG9uZGluZyBzdGVwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RWluc3VtQ29tcHV0ZVBhdGgoc3VtbWVkRGltcywgaWREaW1zKSB7XG4gICAgY29uc3QgcGF0aCA9IHN1bW1lZERpbXM7XG4gICAgY29uc3Qgc3RlcHMgPSBbXTtcbiAgICBsZXQgblN0ZXBzID0gMDtcbiAgICBpZiAoc3VtbWVkRGltcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgLy8gRWluc3VtIHRoYXQgaW52b2xlcyBubyBzdW1taW5nOiBlLmcuLCB0cmFuc3Bvc2UgYW5kIG91dGVyIHByb2R1Y3QuXG4gICAgICAgIHBhdGgucHVzaCgtMSk7XG4gICAgfVxuICAgIG5TdGVwcyA9IHN1bW1lZERpbXMubGVuZ3RoICsgMTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5TdGVwczsgKytpKSB7XG4gICAgICAgIHN0ZXBzLnB1c2goW10pO1xuICAgIH1cbiAgICBjb25zdCBjb21wdXRlZFRlcm1JbmRpY2VzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbnN0IHN1bW1lZERpbSA9IHBhdGhbaV07XG4gICAgICAgIGNvbnN0IHRlcm1JbmRpY2VzID0gZmluZFRlcm1zV2l0aERpbShpZERpbXMsIHN1bW1lZERpbSk7XG4gICAgICAgIGZvciAoY29uc3QgdGVybUluZGV4IG9mIHRlcm1JbmRpY2VzKSB7XG4gICAgICAgICAgICBpZiAoY29tcHV0ZWRUZXJtSW5kaWNlcy5pbmRleE9mKHRlcm1JbmRleCkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgc3RlcHNbaV0ucHVzaCh0ZXJtSW5kZXgpO1xuICAgICAgICAgICAgICAgIGNvbXB1dGVkVGVybUluZGljZXMucHVzaCh0ZXJtSW5kZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IHBhdGgsIHN0ZXBzIH07XG59XG4vKiogRGV0ZXJtaW5lcyBpZiBhbiBheGVzIHBlcm11dGF0aW9uIGlzIHRoZSBpZGVudGl0eSBwZXJtdXRhdGlvbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0lkZW50aXR5UGVybXV0YXRpb24ocGVybSkge1xuICAgIHJldHVybiBwZXJtLmV2ZXJ5KChkaW0sIGluZGV4KSA9PiBkaW0gPT09IGluZGV4KTtcbn1cbmZ1bmN0aW9uIGZpbmRUZXJtc1dpdGhEaW0oaWREaW1zLCBkaW0pIHtcbiAgICBjb25zdCB0ZXJtSW5kaWNlcyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaWREaW1zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGlmIChpZERpbXNbaV0ubGVuZ3RoID09PSAwIHx8IGlkRGltc1tpXS5pbmRleE9mKGRpbSkgIT09IC0xIHx8IGRpbSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHRlcm1JbmRpY2VzLnB1c2goaSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRlcm1JbmRpY2VzO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZWluc3VtX3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuZXhwb3J0IHsgbm9uTWF4U3VwcHJlc3Npb25WM0ltcGwsIG5vbk1heFN1cHByZXNzaW9uVjRJbXBsLCBub25NYXhTdXBwcmVzc2lvblY1SW1wbCB9IGZyb20gJy4vbm9uX21heF9zdXBwcmVzc2lvbl9pbXBsJztcbmV4cG9ydCB7IHdoZXJlSW1wbCB9IGZyb20gJy4vd2hlcmVfaW1wbCc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1rZXJuZWxfaW1wbHMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYmluYXJ5SW5zZXJ0IH0gZnJvbSAnLi9ub25fbWF4X3N1cHByZXNzaW9uX3V0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIG5vbk1heFN1cHByZXNzaW9uVjNJbXBsKGJveGVzLCBzY29yZXMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQpIHtcbiAgICByZXR1cm4gbm9uTWF4U3VwcHJlc3Npb25JbXBsXyhib3hlcywgc2NvcmVzLCBtYXhPdXRwdXRTaXplLCBpb3VUaHJlc2hvbGQsIHNjb3JlVGhyZXNob2xkLCAwIC8qIHNvZnRObXNTaWdtYSAqLyk7XG59XG5leHBvcnQgZnVuY3Rpb24gbm9uTWF4U3VwcHJlc3Npb25WNEltcGwoYm94ZXMsIHNjb3JlcywgbWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLCBzY29yZVRocmVzaG9sZCwgcGFkVG9NYXhPdXRwdXRTaXplKSB7XG4gICAgcmV0dXJuIG5vbk1heFN1cHByZXNzaW9uSW1wbF8oYm94ZXMsIHNjb3JlcywgbWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLCBzY29yZVRocmVzaG9sZCwgMCAvKiBzb2Z0Tm1zU2lnbWEgKi8sIGZhbHNlIC8qIHJldHVyblNjb3Jlc1RlbnNvciAqLywgcGFkVG9NYXhPdXRwdXRTaXplIC8qIHBhZFRvTWF4T3V0cHV0U2l6ZSAqLywgdHJ1ZVxuICAgIC8qIHJldHVyblZhbGlkT3V0cHV0cyAqLyApO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG5vbk1heFN1cHByZXNzaW9uVjVJbXBsKGJveGVzLCBzY29yZXMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQsIHNvZnRObXNTaWdtYSkge1xuICAgIHJldHVybiBub25NYXhTdXBwcmVzc2lvbkltcGxfKGJveGVzLCBzY29yZXMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQsIHNvZnRObXNTaWdtYSwgdHJ1ZSAvKiByZXR1cm5TY29yZXNUZW5zb3IgKi8pO1xufVxuZnVuY3Rpb24gbm9uTWF4U3VwcHJlc3Npb25JbXBsXyhib3hlcywgc2NvcmVzLCBtYXhPdXRwdXRTaXplLCBpb3VUaHJlc2hvbGQsIHNjb3JlVGhyZXNob2xkLCBzb2Z0Tm1zU2lnbWEsIHJldHVyblNjb3Jlc1RlbnNvciA9IGZhbHNlLCBwYWRUb01heE91dHB1dFNpemUgPSBmYWxzZSwgcmV0dXJuVmFsaWRPdXRwdXRzID0gZmFsc2UpIHtcbiAgICAvLyBUaGUgbGlzdCBpcyBzb3J0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyLCBzbyB0aGF0IHdlIGNhbiBhbHdheXMgcG9wIHRoZVxuICAgIC8vIGNhbmRpZGF0ZSB3aXRoIHRoZSBsYXJnZXN0IHNjb3JlIGluIE8oMSkgdGltZS5cbiAgICBjb25zdCBjYW5kaWRhdGVzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzY29yZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHNjb3Jlc1tpXSA+IHNjb3JlVGhyZXNob2xkKSB7XG4gICAgICAgICAgICBjYW5kaWRhdGVzLnB1c2goeyBzY29yZTogc2NvcmVzW2ldLCBib3hJbmRleDogaSwgc3VwcHJlc3NCZWdpbkluZGV4OiAwIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNhbmRpZGF0ZXMuc29ydChhc2NlbmRpbmdDb21wYXJhdG9yKTtcbiAgICAvLyBJZiBzb2Z0Tm1zU2lnbWEgaXMgMCwgdGhlIG91dGNvbWUgb2YgdGhpcyBhbGdvcml0aG0gaXMgZXhhY3RseSBzYW1lIGFzXG4gICAgLy8gYmVmb3JlLlxuICAgIGNvbnN0IHNjYWxlID0gc29mdE5tc1NpZ21hID4gMCA/ICgtMC41IC8gc29mdE5tc1NpZ21hKSA6IDAuMDtcbiAgICBjb25zdCBzZWxlY3RlZEluZGljZXMgPSBbXTtcbiAgICBjb25zdCBzZWxlY3RlZFNjb3JlcyA9IFtdO1xuICAgIHdoaWxlIChzZWxlY3RlZEluZGljZXMubGVuZ3RoIDwgbWF4T3V0cHV0U2l6ZSAmJiBjYW5kaWRhdGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gY2FuZGlkYXRlcy5wb3AoKTtcbiAgICAgICAgY29uc3QgeyBzY29yZTogb3JpZ2luYWxTY29yZSwgYm94SW5kZXgsIHN1cHByZXNzQmVnaW5JbmRleCB9ID0gY2FuZGlkYXRlO1xuICAgICAgICBpZiAob3JpZ2luYWxTY29yZSA8IHNjb3JlVGhyZXNob2xkKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLyBPdmVybGFwcGluZyBib3hlcyBhcmUgbGlrZWx5IHRvIGhhdmUgc2ltaWxhciBzY29yZXMsIHRoZXJlZm9yZSB3ZVxuICAgICAgICAvLyBpdGVyYXRlIHRocm91Z2ggdGhlIHByZXZpb3VzbHkgc2VsZWN0ZWQgYm94ZXMgYmFja3dhcmRzIGluIG9yZGVyIHRvXG4gICAgICAgIC8vIHNlZSBpZiBjYW5kaWRhdGUncyBzY29yZSBzaG91bGQgYmUgc3VwcHJlc3NlZC4gV2UgdXNlXG4gICAgICAgIC8vIHN1cHByZXNzQmVnaW5JbmRleCB0byB0cmFjayBhbmQgZW5zdXJlIGEgY2FuZGlkYXRlIGNhbiBiZSBzdXBwcmVzc2VkXG4gICAgICAgIC8vIGJ5IGEgc2VsZWN0ZWQgYm94IG5vIG1vcmUgdGhhbiBvbmNlLiBBbHNvLCBpZiB0aGUgb3ZlcmxhcCBleGNlZWRzXG4gICAgICAgIC8vIGlvdVRocmVzaG9sZCwgd2Ugc2ltcGx5IGlnbm9yZSB0aGUgY2FuZGlkYXRlLlxuICAgICAgICBsZXQgaWdub3JlQ2FuZGlkYXRlID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGogPSBzZWxlY3RlZEluZGljZXMubGVuZ3RoIC0gMTsgaiA+PSBzdXBwcmVzc0JlZ2luSW5kZXg7IC0taikge1xuICAgICAgICAgICAgY29uc3QgaW91ID0gaW50ZXJzZWN0aW9uT3ZlclVuaW9uKGJveGVzLCBib3hJbmRleCwgc2VsZWN0ZWRJbmRpY2VzW2pdKTtcbiAgICAgICAgICAgIGlmIChpb3UgPj0gaW91VGhyZXNob2xkKSB7XG4gICAgICAgICAgICAgICAgaWdub3JlQ2FuZGlkYXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhbmRpZGF0ZS5zY29yZSA9XG4gICAgICAgICAgICAgICAgY2FuZGlkYXRlLnNjb3JlICogc3VwcHJlc3NXZWlnaHQoaW91VGhyZXNob2xkLCBzY2FsZSwgaW91KTtcbiAgICAgICAgICAgIGlmIChjYW5kaWRhdGUuc2NvcmUgPD0gc2NvcmVUaHJlc2hvbGQpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBBdCB0aGlzIHBvaW50LCBpZiBgY2FuZGlkYXRlLnNjb3JlYCBoYXMgbm90IGRyb3BwZWQgYmVsb3dcbiAgICAgICAgLy8gYHNjb3JlVGhyZXNob2xkYCwgdGhlbiB3ZSBrbm93IHRoYXQgd2Ugd2VudCB0aHJvdWdoIGFsbCBvZiB0aGVcbiAgICAgICAgLy8gcHJldmlvdXMgc2VsZWN0aW9ucyBhbmQgY2FuIHNhZmVseSB1cGRhdGUgYHN1cHByZXNzQmVnaW5JbmRleGAgdG8gdGhlXG4gICAgICAgIC8vIGVuZCBvZiB0aGUgc2VsZWN0ZWQgYXJyYXkuIFRoZW4gd2UgY2FuIHJlLWluc2VydCB0aGUgY2FuZGlkYXRlIHdpdGhcbiAgICAgICAgLy8gdGhlIHVwZGF0ZWQgc2NvcmUgYW5kIHN1cHByZXNzQmVnaW5JbmRleCBiYWNrIGluIHRoZSBjYW5kaWRhdGUgbGlzdC5cbiAgICAgICAgLy8gSWYgb24gdGhlIG90aGVyIGhhbmQsIGBjYW5kaWRhdGUuc2NvcmVgIGhhcyBkcm9wcGVkIGJlbG93IHRoZSBzY29yZVxuICAgICAgICAvLyB0aHJlc2hvbGQsIHdlIHdpbGwgbm90IGFkZCBpdCBiYWNrIHRvIHRoZSBjYW5kaWRhdGVzIGxpc3QuXG4gICAgICAgIGNhbmRpZGF0ZS5zdXBwcmVzc0JlZ2luSW5kZXggPSBzZWxlY3RlZEluZGljZXMubGVuZ3RoO1xuICAgICAgICBpZiAoIWlnbm9yZUNhbmRpZGF0ZSkge1xuICAgICAgICAgICAgLy8gQ2FuZGlkYXRlIGhhcyBwYXNzZWQgYWxsIHRoZSB0ZXN0cywgYW5kIGlzIG5vdCBzdXBwcmVzc2VkLCBzb1xuICAgICAgICAgICAgLy8gc2VsZWN0IHRoZSBjYW5kaWRhdGUuXG4gICAgICAgICAgICBpZiAoY2FuZGlkYXRlLnNjb3JlID09PSBvcmlnaW5hbFNjb3JlKSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRJbmRpY2VzLnB1c2goYm94SW5kZXgpO1xuICAgICAgICAgICAgICAgIHNlbGVjdGVkU2NvcmVzLnB1c2goY2FuZGlkYXRlLnNjb3JlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNhbmRpZGF0ZS5zY29yZSA+IHNjb3JlVGhyZXNob2xkKSB7XG4gICAgICAgICAgICAgICAgLy8gQ2FuZGlkYXRlJ3Mgc2NvcmUgaXMgc3VwcHJlc3NlZCBidXQgaXMgc3RpbGwgaGlnaCBlbm91Z2ggdG8gYmVcbiAgICAgICAgICAgICAgICAvLyBjb25zaWRlcmVkLCBzbyBhZGQgYmFjayB0byB0aGUgY2FuZGlkYXRlcyBsaXN0LlxuICAgICAgICAgICAgICAgIGJpbmFyeUluc2VydChjYW5kaWRhdGVzLCBjYW5kaWRhdGUsIGFzY2VuZGluZ0NvbXBhcmF0b3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIE5vbk1heFN1cHByZXNzaW9uVjQgZmVhdHVyZTogcGFkZGluZyBvdXRwdXQgdG8gbWF4T3V0cHV0U2l6ZS5cbiAgICBjb25zdCB2YWxpZE91dHB1dHMgPSBzZWxlY3RlZEluZGljZXMubGVuZ3RoO1xuICAgIGNvbnN0IGVsZW1zVG9QYWQgPSBtYXhPdXRwdXRTaXplIC0gdmFsaWRPdXRwdXRzO1xuICAgIGlmIChwYWRUb01heE91dHB1dFNpemUgJiYgZWxlbXNUb1BhZCA+IDApIHtcbiAgICAgICAgc2VsZWN0ZWRJbmRpY2VzLnB1c2goLi4ubmV3IEFycmF5KGVsZW1zVG9QYWQpLmZpbGwoMCkpO1xuICAgICAgICBzZWxlY3RlZFNjb3Jlcy5wdXNoKC4uLm5ldyBBcnJheShlbGVtc1RvUGFkKS5maWxsKDAuMCkpO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSB7IHNlbGVjdGVkSW5kaWNlcyB9O1xuICAgIGlmIChyZXR1cm5TY29yZXNUZW5zb3IpIHtcbiAgICAgICAgcmVzdWx0WydzZWxlY3RlZFNjb3JlcyddID0gc2VsZWN0ZWRTY29yZXM7XG4gICAgfVxuICAgIGlmIChyZXR1cm5WYWxpZE91dHB1dHMpIHtcbiAgICAgICAgcmVzdWx0Wyd2YWxpZE91dHB1dHMnXSA9IHZhbGlkT3V0cHV0cztcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGludGVyc2VjdGlvbk92ZXJVbmlvbihib3hlcywgaSwgaikge1xuICAgIGNvbnN0IGlDb29yZCA9IGJveGVzLnN1YmFycmF5KGkgKiA0LCBpICogNCArIDQpO1xuICAgIGNvbnN0IGpDb29yZCA9IGJveGVzLnN1YmFycmF5KGogKiA0LCBqICogNCArIDQpO1xuICAgIGNvbnN0IHltaW5JID0gTWF0aC5taW4oaUNvb3JkWzBdLCBpQ29vcmRbMl0pO1xuICAgIGNvbnN0IHhtaW5JID0gTWF0aC5taW4oaUNvb3JkWzFdLCBpQ29vcmRbM10pO1xuICAgIGNvbnN0IHltYXhJID0gTWF0aC5tYXgoaUNvb3JkWzBdLCBpQ29vcmRbMl0pO1xuICAgIGNvbnN0IHhtYXhJID0gTWF0aC5tYXgoaUNvb3JkWzFdLCBpQ29vcmRbM10pO1xuICAgIGNvbnN0IHltaW5KID0gTWF0aC5taW4oakNvb3JkWzBdLCBqQ29vcmRbMl0pO1xuICAgIGNvbnN0IHhtaW5KID0gTWF0aC5taW4oakNvb3JkWzFdLCBqQ29vcmRbM10pO1xuICAgIGNvbnN0IHltYXhKID0gTWF0aC5tYXgoakNvb3JkWzBdLCBqQ29vcmRbMl0pO1xuICAgIGNvbnN0IHhtYXhKID0gTWF0aC5tYXgoakNvb3JkWzFdLCBqQ29vcmRbM10pO1xuICAgIGNvbnN0IGFyZWFJID0gKHltYXhJIC0geW1pbkkpICogKHhtYXhJIC0geG1pbkkpO1xuICAgIGNvbnN0IGFyZWFKID0gKHltYXhKIC0geW1pbkopICogKHhtYXhKIC0geG1pbkopO1xuICAgIGlmIChhcmVhSSA8PSAwIHx8IGFyZWFKIDw9IDApIHtcbiAgICAgICAgcmV0dXJuIDAuMDtcbiAgICB9XG4gICAgY29uc3QgaW50ZXJzZWN0aW9uWW1pbiA9IE1hdGgubWF4KHltaW5JLCB5bWluSik7XG4gICAgY29uc3QgaW50ZXJzZWN0aW9uWG1pbiA9IE1hdGgubWF4KHhtaW5JLCB4bWluSik7XG4gICAgY29uc3QgaW50ZXJzZWN0aW9uWW1heCA9IE1hdGgubWluKHltYXhJLCB5bWF4Sik7XG4gICAgY29uc3QgaW50ZXJzZWN0aW9uWG1heCA9IE1hdGgubWluKHhtYXhJLCB4bWF4Sik7XG4gICAgY29uc3QgaW50ZXJzZWN0aW9uQXJlYSA9IE1hdGgubWF4KGludGVyc2VjdGlvblltYXggLSBpbnRlcnNlY3Rpb25ZbWluLCAwLjApICpcbiAgICAgICAgTWF0aC5tYXgoaW50ZXJzZWN0aW9uWG1heCAtIGludGVyc2VjdGlvblhtaW4sIDAuMCk7XG4gICAgcmV0dXJuIGludGVyc2VjdGlvbkFyZWEgLyAoYXJlYUkgKyBhcmVhSiAtIGludGVyc2VjdGlvbkFyZWEpO1xufVxuLy8gQSBHYXVzc2lhbiBwZW5hbHR5IGZ1bmN0aW9uLCB0aGlzIG1ldGhvZCBhbHdheXMgcmV0dXJucyB2YWx1ZXMgaW4gWzAsIDFdLlxuLy8gVGhlIHdlaWdodCBpcyBhIGZ1bmN0aW9uIG9mIHNpbWlsYXJpdHksIHRoZSBtb3JlIG92ZXJsYXAgdHdvIGJveGVzIGFyZSwgdGhlXG4vLyBzbWFsbGVyIHRoZSB3ZWlnaHQgaXMsIG1lYW5pbmcgaGlnaGx5IG92ZXJsYXBwaW5nIGJveGUgd2lsbCBiZSBzaWduaWZpY2FudGx5XG4vLyBwZW5hbGl6ZWQuIE9uIHRoZSBvdGhlciBoYW5kLCBhIG5vbi1vdmVybGFwcGluZyBib3ggd2lsbCBub3QgYmUgcGVuYWxpemVkLlxuZnVuY3Rpb24gc3VwcHJlc3NXZWlnaHQoaW91VGhyZXNob2xkLCBzY2FsZSwgaW91KSB7XG4gICAgY29uc3Qgd2VpZ2h0ID0gTWF0aC5leHAoc2NhbGUgKiBpb3UgKiBpb3UpO1xuICAgIHJldHVybiBpb3UgPD0gaW91VGhyZXNob2xkID8gd2VpZ2h0IDogMC4wO1xufVxuZnVuY3Rpb24gYXNjZW5kaW5nQ29tcGFyYXRvcihjMSwgYzIpIHtcbiAgICAvLyBGb3Igb2JqZWN0cyB3aXRoIHNhbWUgc2NvcmVzLCB3ZSBtYWtlIHRoZSBvYmplY3Qgd2l0aCB0aGUgbGFyZ2VyIGluZGV4IGdvXG4gICAgLy8gZmlyc3QuIEluIGFuIGFycmF5IHRoYXQgcG9wcyBmcm9tIHRoZSBlbmQsIHRoaXMgbWVhbnMgdGhhdCB0aGUgb2JqZWN0IHdpdGhcbiAgICAvLyB0aGUgc21hbGxlciBpbmRleCB3aWxsIGJlIHBvcHBlZCBmaXJzdC4gVGhpcyBlbnN1cmVzIHRoZSBzYW1lIG91dHB1dCBhc1xuICAgIC8vIHRoZSBUZW5zb3JGbG93IHB5dGhvbiB2ZXJzaW9uLlxuICAgIHJldHVybiAoYzEuc2NvcmUgLSBjMi5zY29yZSkgfHxcbiAgICAgICAgKChjMS5zY29yZSA9PT0gYzIuc2NvcmUpICYmIChjMi5ib3hJbmRleCAtIGMxLmJveEluZGV4KSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ub25fbWF4X3N1cHByZXNzaW9uX2ltcGwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuLyoqXG4gKiBJbnNlcnRzIGEgdmFsdWUgaW50byBhIHNvcnRlZCBhcnJheS4gVGhpcyBtZXRob2QgYWxsb3dzIGR1cGxpY2F0ZSwgbWVhbmluZyBpdFxuICogYWxsb3dzIGluc2VydGluZyBkdXBsaWNhdGUgdmFsdWUsIGluIHdoaWNoIGNhc2UsIHRoZSBlbGVtZW50IHdpbGwgYmUgaW5zZXJ0ZWRcbiAqIGF0IHRoZSBsb3dlc3QgaW5kZXggb2YgdGhlIHZhbHVlLlxuICogQHBhcmFtIGFyciBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICogQHBhcmFtIGVsZW1lbnQgVGhlIGVsZW1lbnQgdG8gaW5zZXJ0LlxuICogQHBhcmFtIGNvbXBhcmF0b3IgT3B0aW9uYWwuIElmIG5vIGNvbXBhcmF0b3IgaXMgc3BlY2lmaWVkLCBlbGVtZW50cyBhcmVcbiAqIGNvbXBhcmVkIHVzaW5nIGFycmF5X3V0aWwuZGVmYXVsdENvbXBhcmF0b3IsIHdoaWNoIGlzIHN1aXRhYmxlIGZvciBTdHJpbmdzXG4gKiBhbmQgTnVtYmVycyBpbiBhc2NlbmRpbmcgYXJyYXlzLiBJZiB0aGUgYXJyYXkgY29udGFpbnMgbXVsdGlwbGUgaW5zdGFuY2VzIG9mXG4gKiB0aGUgdGFyZ2V0IHZhbHVlLCB0aGUgbGVmdC1tb3N0IGluc3RhbmNlIHdpbGwgYmUgcmV0dXJuZWQuIFRvIHByb3ZpZGUgYVxuICogY29tcGFyYXRvciwgaXQgc2hvdWxkIHRha2UgMiBhcmd1bWVudHMgdG8gY29tcGFyZSBhbmQgcmV0dXJuIGEgbmVnYXRpdmUsXG4gKiB6ZXJvLCBvciBhIHBvc2l0aXZlIG51bWJlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJpbmFyeUluc2VydChhcnIsIGVsZW1lbnQsIGNvbXBhcmF0b3IpIHtcbiAgICBjb25zdCBpbmRleCA9IGJpbmFyeVNlYXJjaChhcnIsIGVsZW1lbnQsIGNvbXBhcmF0b3IpO1xuICAgIGNvbnN0IGluc2VydGlvblBvaW50ID0gaW5kZXggPCAwID8gLShpbmRleCArIDEpIDogaW5kZXg7XG4gICAgYXJyLnNwbGljZShpbnNlcnRpb25Qb2ludCwgMCwgZWxlbWVudCk7XG59XG4vKipcbiAqIFNlYXJjaGVzIHRoZSBhcnJheSBmb3IgdGhlIHRhcmdldCB1c2luZyBiaW5hcnkgc2VhcmNoLCByZXR1cm5zIHRoZSBpbmRleFxuICogb2YgdGhlIGZvdW5kIGVsZW1lbnQsIG9yIHBvc2l0aW9uIHRvIGluc2VydCBpZiBlbGVtZW50IG5vdCBmb3VuZC4gSWYgbm9cbiAqIGNvbXBhcmF0b3IgaXMgc3BlY2lmaWVkLCBlbGVtZW50cyBhcmUgY29tcGFyZWQgdXNpbmcgYXJyYXlfXG4gKiB1dGlsLmRlZmF1bHRDb21wYXJhdG9yLCB3aGljaCBpcyBzdWl0YWJsZSBmb3IgU3RyaW5ncyBhbmQgTnVtYmVycyBpblxuICogYXNjZW5kaW5nIGFycmF5cy4gSWYgdGhlIGFycmF5IGNvbnRhaW5zIG11bHRpcGxlIGluc3RhbmNlcyBvZiB0aGUgdGFyZ2V0XG4gKiB2YWx1ZSwgdGhlIGxlZnQtbW9zdCBpbnN0YW5jZSB3aWxsIGJlIHJldHVybmVkLlxuICogQHBhcmFtIGFyciBUaGUgYXJyYXkgdG8gYmUgc2VhcmNoZWQgaW4uXG4gKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgdG8gYmUgc2VhcmNoZWQgZm9yLlxuICogQHBhcmFtIGNvbXBhcmF0b3IgU2hvdWxkIHRha2UgMiBhcmd1bWVudHMgdG8gY29tcGFyZSBhbmQgcmV0dXJuIGEgbmVnYXRpdmUsXG4gKiAgICB6ZXJvLCBvciBhIHBvc2l0aXZlIG51bWJlci5cbiAqIEByZXR1cm4gTG93ZXN0IGluZGV4IG9mIHRoZSB0YXJnZXQgdmFsdWUgaWYgZm91bmQsIG90aGVyd2lzZSB0aGUgaW5zZXJ0aW9uXG4gKiAgICBwb2ludCB3aGVyZSB0aGUgdGFyZ2V0IHNob3VsZCBiZSBpbnNlcnRlZCwgaW4gdGhlIGZvcm0gb2ZcbiAqICAgICgtaW5zZXJ0aW9uUG9pbnQgLSAxKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJpbmFyeVNlYXJjaChhcnIsIHRhcmdldCwgY29tcGFyYXRvcikge1xuICAgIHJldHVybiBiaW5hcnlTZWFyY2hfKGFyciwgdGFyZ2V0LCBjb21wYXJhdG9yIHx8IGRlZmF1bHRDb21wYXJhdG9yKTtcbn1cbi8qKlxuICogQ29tcGFyZXMgaXRzIHR3byBhcmd1bWVudHMgZm9yIG9yZGVyLlxuICogQHBhcmFtIGEgVGhlIGZpcnN0IGVsZW1lbnQgdG8gYmUgY29tcGFyZWQuXG4gKiBAcGFyYW0gYiBUaGUgc2Vjb25kIGVsZW1lbnQgdG8gYmUgY29tcGFyZWQuXG4gKiBAcmV0dXJuIEEgbmVnYXRpdmUgbnVtYmVyLCB6ZXJvLCBvciBhIHBvc2l0aXZlIG51bWJlciBhcyB0aGUgZmlyc3RcbiAqICAgICBhcmd1bWVudCBpcyBsZXNzIHRoYW4sIGVxdWFsIHRvLCBvciBncmVhdGVyIHRoYW4gdGhlIHNlY29uZC5cbiAqL1xuZnVuY3Rpb24gZGVmYXVsdENvbXBhcmF0b3IoYSwgYikge1xuICAgIHJldHVybiBhID4gYiA/IDEgOiBhIDwgYiA/IC0xIDogMDtcbn1cbmZ1bmN0aW9uIGJpbmFyeVNlYXJjaF8oYXJyLCB0YXJnZXQsIGNvbXBhcmF0b3IpIHtcbiAgICBsZXQgbGVmdCA9IDA7XG4gICAgbGV0IHJpZ2h0ID0gYXJyLmxlbmd0aDtcbiAgICBsZXQgbWlkZGxlID0gMDtcbiAgICBsZXQgZm91bmQgPSBmYWxzZTtcbiAgICB3aGlsZSAobGVmdCA8IHJpZ2h0KSB7XG4gICAgICAgIG1pZGRsZSA9IGxlZnQgKyAoKHJpZ2h0IC0gbGVmdCkgPj4+IDEpO1xuICAgICAgICBjb25zdCBjb21wYXJlUmVzdWx0ID0gY29tcGFyYXRvcih0YXJnZXQsIGFyclttaWRkbGVdKTtcbiAgICAgICAgaWYgKGNvbXBhcmVSZXN1bHQgPiAwKSB7XG4gICAgICAgICAgICBsZWZ0ID0gbWlkZGxlICsgMTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJpZ2h0ID0gbWlkZGxlO1xuICAgICAgICAgICAgLy8gSWYgY29tcGFyZVJlc3VsdCBpcyAwLCB0aGUgdmFsdWUgaXMgZm91bmQuIFdlIHJlY29yZCBpdCBpcyBmb3VuZCxcbiAgICAgICAgICAgIC8vIGFuZCB0aGVuIGtlZXAgbG9va2luZyBiZWNhdXNlIHRoZXJlIG1heSBiZSBkdXBsaWNhdGUuXG4gICAgICAgICAgICBmb3VuZCA9ICFjb21wYXJlUmVzdWx0O1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmb3VuZCA/IGxlZnQgOiAtbGVmdCAtIDE7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ub25fbWF4X3N1cHByZXNzaW9uX3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuLyoqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBXaGVyZSBrZXJuZWwgc2hhcmVkIGJldHdlZW4gY3B1IGFuZCB3ZWJnbCAqL1xuaW1wb3J0IHsgYnVmZmVyIH0gZnJvbSAnLi4vb3BzL2J1ZmZlcic7XG5leHBvcnQgZnVuY3Rpb24gd2hlcmVJbXBsKGNvbmRTaGFwZSwgY29uZFZhbHMpIHtcbiAgICBjb25zdCBpbmRpY2VzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb25kVmFscy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoY29uZFZhbHNbaV0pIHtcbiAgICAgICAgICAgIGluZGljZXMucHVzaChpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBpbkJ1ZmZlciA9IGJ1ZmZlcihjb25kU2hhcGUsICdpbnQzMicpO1xuICAgIGNvbnN0IG91dCA9IGJ1ZmZlcihbaW5kaWNlcy5sZW5ndGgsIGNvbmRTaGFwZS5sZW5ndGhdLCAnaW50MzInKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluZGljZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgbG9jID0gaW5CdWZmZXIuaW5kZXhUb0xvYyhpbmRpY2VzW2ldKTtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gaSAqIGNvbmRTaGFwZS5sZW5ndGg7XG4gICAgICAgIG91dC52YWx1ZXMuc2V0KGxvYywgb2Zmc2V0KTtcbiAgICB9XG4gICAgcmV0dXJuIG91dC50b1RlbnNvcigpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9d2hlcmVfaW1wbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG4vLyBiYXNlLnRzIGlzIHRmanMtY29yZSB3aXRob3V0IGF1dG8gcmVnaXN0cmF0aW9uIG9mIHRoaW5ncyBsaWtlIGZsYWdzLFxuLy8gZ3JhZGllbnRzLCBjaGFpbmVkIG9wcyBvciB0aGUgb3BIYW5kbGVyLiBTZWUgYmFzZV9zaWRlX2VmZmVjdHMudHMgZm9yIHBhcnRzXG4vLyB0ZmpzIGNvcmUgdGhhdCBhcmUgcmVxdWlyZWQgc2lkZSBlZmZlY3RzLlxuLyoqXG4gKiBAZmlsZW92ZXJ2aWV3XG4gKiBAc3VwcHJlc3Mge3BhcnRpYWxBbGlhc30gT3B0aW1pemF0aW9uIGRpc2FibGVkIGR1ZSB0byBwYXNzaW5nIHRoZSBtb2R1bGVcbiAqIG9iamVjdCBpbnRvIGEgZnVuY3Rpb24gYmVsb3c6XG4gKlxuICogICBpbXBvcnQgKiBhcyBvcHMgZnJvbSAnLi9vcHMvb3BzJztcbiAqICAgc2V0T3BIYW5kbGVyKG9wcyk7XG4gKi9cbi8vIFNlcmlhbGl6YXRpb24uXG5pbXBvcnQgKiBhcyBpbyBmcm9tICcuL2lvL2lvJztcbmltcG9ydCAqIGFzIG1hdGggZnJvbSAnLi9tYXRoJztcbmltcG9ydCAqIGFzIGJyb3dzZXIgZnJvbSAnLi9vcHMvYnJvd3Nlcic7XG5pbXBvcnQgKiBhcyBnYXRoZXJfdXRpbCBmcm9tICcuL29wcy9nYXRoZXJfbmRfdXRpbCc7XG5pbXBvcnQgKiBhcyBzY2F0dGVyX3V0aWwgZnJvbSAnLi9vcHMvc2NhdHRlcl9uZF91dGlsJztcbmltcG9ydCAqIGFzIHNsaWNlX3V0aWwgZnJvbSAnLi9vcHMvc2xpY2VfdXRpbCc7XG5pbXBvcnQgKiBhcyBzZXJpYWxpemF0aW9uIGZyb20gJy4vc2VyaWFsaXphdGlvbic7XG5pbXBvcnQgKiBhcyB0ZW5zb3JfdXRpbCBmcm9tICcuL3RlbnNvcl91dGlsJztcbmltcG9ydCAqIGFzIHRlc3RfdXRpbCBmcm9tICcuL3Rlc3RfdXRpbCc7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4vdXRpbCc7XG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSAnLi92ZXJzaW9uJztcbi8vIE9wdGltaXplcnMuXG5leHBvcnQgeyBBZGFkZWx0YU9wdGltaXplciB9IGZyb20gJy4vb3B0aW1pemVycy9hZGFkZWx0YV9vcHRpbWl6ZXInO1xuZXhwb3J0IHsgQWRhZ3JhZE9wdGltaXplciB9IGZyb20gJy4vb3B0aW1pemVycy9hZGFncmFkX29wdGltaXplcic7XG5leHBvcnQgeyBBZGFtT3B0aW1pemVyIH0gZnJvbSAnLi9vcHRpbWl6ZXJzL2FkYW1fb3B0aW1pemVyJztcbmV4cG9ydCB7IEFkYW1heE9wdGltaXplciB9IGZyb20gJy4vb3B0aW1pemVycy9hZGFtYXhfb3B0aW1pemVyJztcbmV4cG9ydCB7IE1vbWVudHVtT3B0aW1pemVyIH0gZnJvbSAnLi9vcHRpbWl6ZXJzL21vbWVudHVtX29wdGltaXplcic7XG5leHBvcnQgeyBPcHRpbWl6ZXIgfSBmcm9tICcuL29wdGltaXplcnMvb3B0aW1pemVyJztcbmV4cG9ydCB7IFJNU1Byb3BPcHRpbWl6ZXIgfSBmcm9tICcuL29wdGltaXplcnMvcm1zcHJvcF9vcHRpbWl6ZXInO1xuZXhwb3J0IHsgU0dET3B0aW1pemVyIH0gZnJvbSAnLi9vcHRpbWl6ZXJzL3NnZF9vcHRpbWl6ZXInO1xuZXhwb3J0IHsgVGVuc29yLCBUZW5zb3JCdWZmZXIsIFZhcmlhYmxlIH0gZnJvbSAnLi90ZW5zb3InO1xuZXhwb3J0IHsgUmFuaywgc3VtT3V0VHlwZSwgdXBjYXN0VHlwZSB9IGZyb20gJy4vdHlwZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9vcHMvb3BzJztcbmV4cG9ydCB7IFJlZHVjdGlvbiB9IGZyb20gJy4vb3BzL2xvc3Nfb3BzX3V0aWxzJztcbmV4cG9ydCAqIGZyb20gJy4vdHJhaW4nO1xuZXhwb3J0ICogZnJvbSAnLi9nbG9iYWxzJztcbmV4cG9ydCAqIGZyb20gJy4va2VybmVsX3JlZ2lzdHJ5JztcbmV4cG9ydCB7IGN1c3RvbUdyYWQsIGdyYWQsIGdyYWRzLCB2YWx1ZUFuZEdyYWQsIHZhbHVlQW5kR3JhZHMsIHZhcmlhYmxlR3JhZHMgfSBmcm9tICcuL2dyYWRpZW50cyc7XG5leHBvcnQgeyBFbnZpcm9ubWVudCwgZW52LCBFTlYgfSBmcm9tICcuL2Vudmlyb25tZW50JztcbmV4cG9ydCB7IHZlcnNpb24gYXMgdmVyc2lvbl9jb3JlIH07XG4vLyBUb3AtbGV2ZWwgbWV0aG9kIGV4cG9ydHMuXG5leHBvcnQgeyBuZXh0RnJhbWUgfSBmcm9tICcuL2Jyb3dzZXJfdXRpbCc7XG4vLyBTZWNvbmQgbGV2ZWwgZXhwb3J0cy5cbmltcG9ydCAqIGFzIGJhY2tlbmRfdXRpbCBmcm9tICcuL2JhY2tlbmRzL2JhY2tlbmRfdXRpbCc7XG5pbXBvcnQgKiBhcyBkZXZpY2VfdXRpbCBmcm9tICcuL2RldmljZV91dGlsJztcbmV4cG9ydCB7IGJyb3dzZXIsIGlvLCBtYXRoLCBzZXJpYWxpemF0aW9uLCB0ZXN0X3V0aWwsIHV0aWwsIGJhY2tlbmRfdXRpbCwgdGVuc29yX3V0aWwsIHNsaWNlX3V0aWwsIGdhdGhlcl91dGlsLCBzY2F0dGVyX3V0aWwsIGRldmljZV91dGlsIH07XG5pbXBvcnQgKiBhcyBrZXJuZWxfaW1wbHMgZnJvbSAnLi9iYWNrZW5kcy9rZXJuZWxfaW1wbHMnO1xuZXhwb3J0IHsga2VybmVsX2ltcGxzIH07XG4vLyBCYWNrZW5kIHNwZWNpZmljLlxuZXhwb3J0IHsgS2VybmVsQmFja2VuZCwgRGF0YVN0b3JhZ2UgfSBmcm9tICcuL2JhY2tlbmRzL2JhY2tlbmQnO1xuLy8gRXhwb3J0IGFsbCBrZXJuZWwgbmFtZXMgLyBpbmZvLlxuZXhwb3J0ICogZnJvbSAnLi9rZXJuZWxfbmFtZXMnO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmFzZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG4vLyBSZXF1aXJlZCBzaWRlIGVmZmVjdGZ1bCBjb2RlIGZvciB0ZmpzLWNvcmVcbi8vIFNldCB1cCBFbmdpbmUgYW5kIEVOVlxuaW1wb3J0IHsgZ2V0T3JNYWtlRW5naW5lIH0gZnJvbSAnLi9lbmdpbmUnO1xuZ2V0T3JNYWtlRW5naW5lKCk7XG4vLyBSZWdpc3RlciBiYWNrZW5kLWFnbm9zdGljIGZsYWdzLlxuaW1wb3J0ICcuL2ZsYWdzJztcbi8vIFJlZ2lzdGVyIHBsYXRmb3Jtc1xuaW1wb3J0ICcuL3BsYXRmb3Jtcy9wbGF0Zm9ybV9icm93c2VyJztcbmltcG9ydCAnLi9wbGF0Zm9ybXMvcGxhdGZvcm1fbm9kZSc7XG4vLyBTZXQgdXAgT3BIYW5kbGVyXG5pbXBvcnQgeyBidWZmZXIgfSBmcm9tICcuL29wcy9idWZmZXInO1xuaW1wb3J0IHsgY2FzdCB9IGZyb20gJy4vb3BzL2Nhc3QnO1xuaW1wb3J0IHsgY2xvbmUgfSBmcm9tICcuL29wcy9jbG9uZSc7XG5pbXBvcnQgeyBwcmludCB9IGZyb20gJy4vb3BzL3ByaW50JztcbmltcG9ydCB7IHNldE9wSGFuZGxlciB9IGZyb20gJy4vdGVuc29yJztcbmNvbnN0IG9wSGFuZGxlciA9IHtcbiAgICBidWZmZXIsXG4gICAgY2FzdCxcbiAgICBjbG9uZSxcbiAgICBwcmludFxufTtcbnNldE9wSGFuZGxlcihvcEhhbmRsZXIpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmFzZV9zaWRlX2VmZmVjdHMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuY29uc3QgZGVsYXlDYWxsYmFjayA9ICgoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiByZXF1ZXN0QW5pbWF0aW9uRnJhbWU7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBzZXRJbW1lZGlhdGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBzZXRJbW1lZGlhdGU7XG4gICAgfVxuICAgIHJldHVybiAoZikgPT4gZigpOyAvLyBubyBkZWxheXNcbn0pKCk7XG4vKipcbiAqIFJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZSB3aGVuIGEgcmVxdWVzdEFuaW1hdGlvbkZyYW1lIGhhcyBjb21wbGV0ZWQuXG4gKlxuICogT24gTm9kZS5qcyB0aGlzIHVzZXMgc2V0SW1tZWRpYXRlIGluc3RlYWQgb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lLlxuICpcbiAqIFRoaXMgaXMgc2ltcGx5IGEgc3VnYXIgbWV0aG9kIHNvIHRoYXQgdXNlcnMgY2FuIGRvIHRoZSBmb2xsb3dpbmc6XG4gKiBgYXdhaXQgdGYubmV4dEZyYW1lKCk7YFxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdQZXJmb3JtYW5jZScsIHN1YmhlYWRpbmc6ICdUaW1pbmcnfVxuICovXG5mdW5jdGlvbiBuZXh0RnJhbWUoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gZGVsYXlDYWxsYmFjaygoKSA9PiByZXNvbHZlKCkpKTtcbn1cbmV4cG9ydCB7IG5leHRGcmFtZSB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YnJvd3Nlcl91dGlsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbmZ1bmN0aW9uIF9pc05hdmlnYXRvckRlZmluZWQoKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvciAhPSBudWxsO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzTW9iaWxlKG5hdikge1xuICAgIGlmIChuYXYgfHwgX2lzTmF2aWdhdG9yRGVmaW5lZCgpKSB7XG4gICAgICAgIGlmICghbmF2KSB7XG4gICAgICAgICAgICBuYXYgPSBuYXZpZ2F0b3I7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5hdi5wcm9kdWN0ID09PSAnUmVhY3ROYXRpdmUnKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gICAgICAgIGNvbnN0IGEgPSBuYXYudXNlckFnZW50IHx8IG5hdi52ZW5kb3IgfHwgd2luZG93Lm9wZXJhO1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gICAgICAgIHJldHVybiAvKGFuZHJvaWR8YmJcXGQrfG1lZWdvKS4rbW9iaWxlfGF2YW50Z298YmFkYVxcL3xibGFja2JlcnJ5fGJsYXplcnxjb21wYWx8ZWxhaW5lfGZlbm5lY3xoaXB0b3B8aWVtb2JpbGV8aXAoaG9uZXxvZCl8aXJpc3xraW5kbGV8bGdlIHxtYWVtb3xtaWRwfG1tcHxtb2JpbGUuK2ZpcmVmb3h8bmV0ZnJvbnR8b3BlcmEgbShvYnxpbilpfHBhbG0oIG9zKT98cGhvbmV8cChpeGl8cmUpXFwvfHBsdWNrZXJ8cG9ja2V0fHBzcHxzZXJpZXMoNHw2KTB8c3ltYmlhbnx0cmVvfHVwXFwuKGJyb3dzZXJ8bGluayl8dm9kYWZvbmV8d2FwfHdpbmRvd3MgY2V8eGRhfHhpaW5vL2lcbiAgICAgICAgICAgIC50ZXN0KGEpIHx8XG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gICAgICAgICAgICAvMTIwN3w2MzEwfDY1OTB8M2dzb3w0dGhwfDUwWzEtNl1pfDc3MHN8ODAyc3xhIHdhfGFiYWN8YWMoZXJ8b298c1xcLSl8YWkoa298cm4pfGFsKGF2fGNhfGNvKXxhbW9pfGFuKGV4fG55fHl3KXxhcHR1fGFyKGNofGdvKXxhcyh0ZXx1cyl8YXR0d3xhdShkaXxcXC1tfHIgfHMgKXxhdmFufGJlKGNrfGxsfG5xKXxiaShsYnxyZCl8YmwoYWN8YXopfGJyKGV8dil3fGJ1bWJ8YndcXC0obnx1KXxjNTVcXC98Y2FwaXxjY3dhfGNkbVxcLXxjZWxsfGNodG18Y2xkY3xjbWRcXC18Y28obXB8bmQpfGNyYXd8ZGEoaXR8bGx8bmcpfGRidGV8ZGNcXC1zfGRldml8ZGljYXxkbW9ifGRvKGN8cClvfGRzKDEyfFxcLWQpfGVsKDQ5fGFpKXxlbShsMnx1bCl8ZXIoaWN8azApfGVzbDh8ZXooWzQtN10wfG9zfHdhfHplKXxmZXRjfGZseShcXC18Xyl8ZzEgdXxnNTYwfGdlbmV8Z2ZcXC01fGdcXC1tb3xnbyhcXC53fG9kKXxncihhZHx1bil8aGFpZXxoY2l0fGhkXFwtKG18cHx0KXxoZWlcXC18aGkocHR8dGEpfGhwKCBpfGlwKXxoc1xcLWN8aHQoYyhcXC18IHxffGF8Z3xwfHN8dCl8dHApfGh1KGF3fHRjKXxpXFwtKDIwfGdvfG1hKXxpMjMwfGlhYyggfFxcLXxcXC8pfGlicm98aWRlYXxpZzAxfGlrb218aW0xa3xpbm5vfGlwYXF8aXJpc3xqYSh0fHYpYXxqYnJvfGplbXV8amlnc3xrZGRpfGtlaml8a2d0KCB8XFwvKXxrbG9ufGtwdCB8a3djXFwtfGt5byhjfGspfGxlKG5vfHhpKXxsZyggZ3xcXC8oa3xsfHUpfDUwfDU0fFxcLVthLXddKXxsaWJ3fGx5bnh8bTFcXC13fG0zZ2F8bTUwXFwvfG1hKHRlfHVpfHhvKXxtYygwMXwyMXxjYSl8bVxcLWNyfG1lKHJjfHJpKXxtaShvOHxvYXx0cyl8bW1lZnxtbygwMXwwMnxiaXxkZXxkb3x0KFxcLXwgfG98dil8enopfG10KDUwfHAxfHYgKXxtd2JwfG15d2F8bjEwWzAtMl18bjIwWzItM118bjMwKDB8Mil8bjUwKDB8Mnw1KXxuNygwKDB8MSl8MTApfG5lKChjfG0pXFwtfG9ufHRmfHdmfHdnfHd0KXxub2soNnxpKXxuenBofG8yaW18b3AodGl8d3YpfG9yYW58b3dnMXxwODAwfHBhbihhfGR8dCl8cGR4Z3xwZygxM3xcXC0oWzEtOF18YykpfHBoaWx8cGlyZXxwbChheXx1Yyl8cG5cXC0yfHBvKGNrfHJ0fHNlKXxwcm94fHBzaW98cHRcXC1nfHFhXFwtYXxxYygwN3wxMnwyMXwzMnw2MHxcXC1bMi03XXxpXFwtKXxxdGVrfHIzODB8cjYwMHxyYWtzfHJpbTl8cm8odmV8em8pfHM1NVxcL3xzYShnZXxtYXxtbXxtc3xueXx2YSl8c2MoMDF8aFxcLXxvb3xwXFwtKXxzZGtcXC98c2UoYyhcXC18MHwxKXw0N3xtY3xuZHxyaSl8c2doXFwtfHNoYXJ8c2llKFxcLXxtKXxza1xcLTB8c2woNDV8aWQpfHNtKGFsfGFyfGIzfGl0fHQ1KXxzbyhmdHxueSl8c3AoMDF8aFxcLXx2XFwtfHYgKXxzeSgwMXxtYil8dDIoMTh8NTApfHQ2KDAwfDEwfDE4KXx0YShndHxsayl8dGNsXFwtfHRkZ1xcLXx0ZWwoaXxtKXx0aW1cXC18dFxcLW1vfHRvKHBsfHNoKXx0cyg3MHxtXFwtfG0zfG01KXx0eFxcLTl8dXAoXFwuYnxnMXxzaSl8dXRzdHx2NDAwfHY3NTB8dmVyaXx2aShyZ3x0ZSl8dmsoNDB8NVswLTNdfFxcLXYpfHZtNDB8dm9kYXx2dWxjfHZ4KDUyfDUzfDYwfDYxfDcwfDgwfDgxfDgzfDg1fDk4KXx3M2MoXFwtfCApfHdlYmN8d2hpdHx3aShnIHxuY3xudyl8d21sYnx3b251fHg3MDB8eWFzXFwtfHlvdXJ8emV0b3x6dGVcXC0vaVxuICAgICAgICAgICAgICAgIC50ZXN0KGEuc3Vic3RyKDAsIDQpKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQnJvd3NlcigpIHtcbiAgICByZXR1cm4gKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5kb2N1bWVudCAhPSBudWxsKSB8fFxuICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgKHR5cGVvZiBXb3JrZXJHbG9iYWxTY29wZSAhPT0gJ3VuZGVmaW5lZCcpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGV2aWNlX3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgS2VybmVsQmFja2VuZCB9IGZyb20gJy4vYmFja2VuZHMvYmFja2VuZCc7XG5pbXBvcnQgeyBFbnZpcm9ubWVudCwgc2V0RW52aXJvbm1lbnRHbG9iYWwgfSBmcm9tICcuL2Vudmlyb25tZW50JztcbmltcG9ydCB7IGdldEdsb2JhbE5hbWVzcGFjZSB9IGZyb20gJy4vZ2xvYmFsX3V0aWwnO1xuaW1wb3J0IHsgQWRkLCBDYXN0LCBJZGVudGl0eSB9IGZyb20gJy4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGdldEdyYWRpZW50LCBnZXRLZXJuZWwsIGdldEtlcm5lbHNGb3JCYWNrZW5kIH0gZnJvbSAnLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHsgUHJvZmlsZXIgfSBmcm9tICcuL3Byb2ZpbGVyJztcbmltcG9ydCB7IGJhY2twcm9wYWdhdGVHcmFkaWVudHMsIGdldEZpbHRlcmVkTm9kZXNYVG9ZIH0gZnJvbSAnLi90YXBlJztcbmltcG9ydCB7IHNldFRlbnNvclRyYWNrZXIsIFRlbnNvciwgVmFyaWFibGUgfSBmcm9tICcuL3RlbnNvcic7XG5pbXBvcnQgeyBnZXRUZW5zb3JzSW5Db250YWluZXIgfSBmcm9tICcuL3RlbnNvcl91dGlsJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi91dGlsJztcbmltcG9ydCB7IGJ5dGVzRnJvbVN0cmluZ0FycmF5LCBtYWtlT25lc1R5cGVkQXJyYXksIG5vdywgc2l6ZUZyb21TaGFwZSB9IGZyb20gJy4vdXRpbCc7XG5mdW5jdGlvbiBpc1JlZ2lzdGVyZWRLZXJuZWxJbnZvY2F0aW9uKGtlcm5lbEludm9jYXRpb24pIHtcbiAgICByZXR1cm4ga2VybmVsSW52b2NhdGlvbi5rZXJuZWxOYW1lICE9IG51bGw7XG59XG5jbGFzcyBFbmdpbmVTdGF0ZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIC8vIFB1YmxpYyBzaW5jZSBvcHRpbWl6ZXJzIHdpbGwgdXNlIGl0LlxuICAgICAgICB0aGlzLnJlZ2lzdGVyZWRWYXJpYWJsZXMgPSB7fTtcbiAgICAgICAgdGhpcy5uZXh0VGFwZU5vZGVJZCA9IDA7XG4gICAgICAgIHRoaXMubnVtQnl0ZXMgPSAwO1xuICAgICAgICB0aGlzLm51bVRlbnNvcnMgPSAwO1xuICAgICAgICB0aGlzLm51bVN0cmluZ1RlbnNvcnMgPSAwO1xuICAgICAgICB0aGlzLm51bURhdGFCdWZmZXJzID0gMDtcbiAgICAgICAgLy8gTnVtYmVyIG9mIG5lc3RlZCB0Zi5ncmFkKCkgc3RhdGVtZW50cyB3aGVuIGNvbXB1dGluZyBoaWdoZXItb3JkZXJcbiAgICAgICAgLy8gZ3JhZGllbnRzLiBFLmcuIGAxYCBmb3IgZmlyc3Qtb3JkZXIgZ3JhZGllbnRzIGFuZCBgMmAgZm9yIHNlY29uZC1vcmRlclxuICAgICAgICAvLyBncmFkaWVudHMuIFVzZWQgdG8gdHJhY2sgaWYgdGhlIHRhcGUgc2hvdWxkIGJlIHJlbW92ZWQgYWZ0ZXIgYSBiYWNrcHJvcC5cbiAgICAgICAgdGhpcy5ncmFkaWVudERlcHRoID0gMDtcbiAgICAgICAgLy8gTnVtYmVyIG9mIG5lc3RlZCBrZXJuZWwgY2FsbHMuIFdoZW4ga2VybmVsIGRlcHRoIGlzIGdyZWF0ZXIgdGhhbiAxLCB3ZSB0dXJuXG4gICAgICAgIC8vIG9mZiB0aGUgdGFwZS5cbiAgICAgICAgdGhpcy5rZXJuZWxEZXB0aCA9IDA7XG4gICAgICAgIHRoaXMuc2NvcGVTdGFjayA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogS2VlcHMgdHJhY2sgb2YgdGhlIG51bWJlciBvZiBkYXRhIG1vdmVzIGR1cmluZyBhIGtlcm5lbCBleGVjdXRpb24uIFdlXG4gICAgICAgICAqIG1haW50YWluIGEgc3RhY2sgc2luY2Uga2VybmVscyBjYW4gY2FsbCBvdGhlciBrZXJuZWxzLCByZWN1cnNpdmVseS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubnVtRGF0YU1vdmVzU3RhY2sgPSBbXTtcbiAgICAgICAgdGhpcy5uZXh0U2NvcGVJZCA9IDA7XG4gICAgICAgIHRoaXMudGVuc29ySW5mbyA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgIHRoaXMucHJvZmlsaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYWN0aXZlUHJvZmlsZSA9IHtcbiAgICAgICAgICAgIG5ld0J5dGVzOiAwLFxuICAgICAgICAgICAgbmV3VGVuc29yczogMCxcbiAgICAgICAgICAgIHBlYWtCeXRlczogMCxcbiAgICAgICAgICAgIGtlcm5lbHM6IFtdLFxuICAgICAgICAgICAgcmVzdWx0OiBudWxsLFxuICAgICAgICAgICAgZ2V0IGtlcm5lbE5hbWVzKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQodGhpcy5rZXJuZWxzLm1hcChrID0+IGsubmFtZSkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgZm9yIChjb25zdCB2YXJpYWJsZU5hbWUgaW4gdGhpcy5yZWdpc3RlcmVkVmFyaWFibGVzKSB7XG4gICAgICAgICAgICB0aGlzLnJlZ2lzdGVyZWRWYXJpYWJsZXNbdmFyaWFibGVOYW1lXS5kaXNwb3NlKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnQgY2xhc3MgRW5naW5lIHtcbiAgICBjb25zdHJ1Y3RvcihFTlYpIHtcbiAgICAgICAgdGhpcy5FTlYgPSBFTlY7XG4gICAgICAgIHRoaXMucmVnaXN0cnkgPSB7fTtcbiAgICAgICAgdGhpcy5yZWdpc3RyeUZhY3RvcnkgPSB7fTtcbiAgICAgICAgdGhpcy5wZW5kaW5nQmFja2VuZEluaXRJZCA9IDA7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBuZXcgRW5naW5lU3RhdGUoKTtcbiAgICB9XG4gICAgYXN5bmMgcmVhZHkoKSB7XG4gICAgICAgIGlmICh0aGlzLnBlbmRpbmdCYWNrZW5kSW5pdCAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wZW5kaW5nQmFja2VuZEluaXQudGhlbigoKSA9PiB7IH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmJhY2tlbmRJbnN0YW5jZSAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc29ydGVkQmFja2VuZHMgPSB0aGlzLmdldFNvcnRlZEJhY2tlbmRzKCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc29ydGVkQmFja2VuZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGJhY2tlbmROYW1lID0gc29ydGVkQmFja2VuZHNbaV07XG4gICAgICAgICAgICBjb25zdCBzdWNjZXNzID0gYXdhaXQgdGhpcy5pbml0aWFsaXplQmFja2VuZChiYWNrZW5kTmFtZSkuc3VjY2VzcztcbiAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRCYWNrZW5kKGJhY2tlbmROYW1lKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgaW5pdGlhbGl6ZSBhbnkgYmFja2VuZHMsIGFsbCBiYWNrZW5kIGluaXRpYWxpemF0aW9ucyBgICtcbiAgICAgICAgICAgIGBmYWlsZWQuYCk7XG4gICAgfVxuICAgIGdldCBiYWNrZW5kKCkge1xuICAgICAgICBpZiAodGhpcy5wZW5kaW5nQmFja2VuZEluaXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCYWNrZW5kICcke3RoaXMuYmFja2VuZE5hbWV9JyBoYXMgbm90IHlldCBiZWVuIGluaXRpYWxpemVkLiBNYWtlIGAgK1xuICAgICAgICAgICAgICAgIGBzdXJlIHRvIGF3YWl0IHRmLnJlYWR5KCkgb3IgYXdhaXQgdGYuc2V0QmFja2VuZCgpIGJlZm9yZSBjYWxsaW5nIGAgK1xuICAgICAgICAgICAgICAgIGBvdGhlciBtZXRob2RzYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuYmFja2VuZEluc3RhbmNlID09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgbmFtZSwgYXN5bmNJbml0IH0gPSB0aGlzLmluaXRpYWxpemVCYWNrZW5kc0FuZFJldHVybkJlc3QoKTtcbiAgICAgICAgICAgIGlmIChhc3luY0luaXQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBoaWdoZXN0IHByaW9yaXR5IGJhY2tlbmQgJyR7bmFtZX0nIGhhcyBub3QgeWV0IGJlZW4gYCArXG4gICAgICAgICAgICAgICAgICAgIGBpbml0aWFsaXplZC4gTWFrZSBzdXJlIHRvIGF3YWl0IHRmLnJlYWR5KCkgb3IgYCArXG4gICAgICAgICAgICAgICAgICAgIGBhd2FpdCB0Zi5zZXRCYWNrZW5kKCkgYmVmb3JlIGNhbGxpbmcgb3RoZXIgbWV0aG9kc2ApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zZXRCYWNrZW5kKG5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmJhY2tlbmRJbnN0YW5jZTtcbiAgICB9XG4gICAgYmFja2VuZE5hbWVzKCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5yZWdpc3RyeUZhY3RvcnkpO1xuICAgIH1cbiAgICBmaW5kQmFja2VuZChiYWNrZW5kTmFtZSkge1xuICAgICAgICBpZiAoIShiYWNrZW5kTmFtZSBpbiB0aGlzLnJlZ2lzdHJ5KSkge1xuICAgICAgICAgICAgLy8gSWYgdGhlIGJhY2tlbmQgaGFzbid0IGJlZW4gaW5pdGlhbGl6ZWQgYnV0IHdlIGhhdmUgYSByZWdpc3RyeSBlbnRyeSBmb3JcbiAgICAgICAgICAgIC8vIGl0LCBpbml0aWFsaXplIGl0IGFuZCByZXR1cm4gaXQuXG4gICAgICAgICAgICBpZiAoYmFja2VuZE5hbWUgaW4gdGhpcy5yZWdpc3RyeUZhY3RvcnkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGFzeW5jSW5pdCB9ID0gdGhpcy5pbml0aWFsaXplQmFja2VuZChiYWNrZW5kTmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKGFzeW5jSW5pdCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBCYWNrZW5kIGlzIG5vdCByZWFkeSB5ZXQuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnJlZ2lzdHJ5W2JhY2tlbmROYW1lXTtcbiAgICB9XG4gICAgZmluZEJhY2tlbmRGYWN0b3J5KGJhY2tlbmROYW1lKSB7XG4gICAgICAgIGlmICghKGJhY2tlbmROYW1lIGluIHRoaXMucmVnaXN0cnlGYWN0b3J5KSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucmVnaXN0cnlGYWN0b3J5W2JhY2tlbmROYW1lXS5mYWN0b3J5O1xuICAgIH1cbiAgICByZWdpc3RlckJhY2tlbmQoYmFja2VuZE5hbWUsIGZhY3RvcnksIHByaW9yaXR5ID0gMSkge1xuICAgICAgICBpZiAoYmFja2VuZE5hbWUgaW4gdGhpcy5yZWdpc3RyeUZhY3RvcnkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgJHtiYWNrZW5kTmFtZX0gYmFja2VuZCB3YXMgYWxyZWFkeSByZWdpc3RlcmVkLiBgICtcbiAgICAgICAgICAgICAgICBgUmV1c2luZyBleGlzdGluZyBiYWNrZW5kIGZhY3RvcnkuYCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZWdpc3RyeUZhY3RvcnlbYmFja2VuZE5hbWVdID0geyBmYWN0b3J5LCBwcmlvcml0eSB9O1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgYXN5bmMgc2V0QmFja2VuZChiYWNrZW5kTmFtZSkge1xuICAgICAgICBpZiAodGhpcy5yZWdpc3RyeUZhY3RvcnlbYmFja2VuZE5hbWVdID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQmFja2VuZCBuYW1lICcke2JhY2tlbmROYW1lfScgbm90IGZvdW5kIGluIHJlZ2lzdHJ5YCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5iYWNrZW5kTmFtZSA9IGJhY2tlbmROYW1lO1xuICAgICAgICBpZiAodGhpcy5yZWdpc3RyeVtiYWNrZW5kTmFtZV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5iYWNrZW5kSW5zdGFuY2UgPSBudWxsO1xuICAgICAgICAgICAgY29uc3QgeyBzdWNjZXNzLCBhc3luY0luaXQgfSA9IHRoaXMuaW5pdGlhbGl6ZUJhY2tlbmQoYmFja2VuZE5hbWUpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXN5bmNJbml0ID8gYXdhaXQgc3VjY2VzcyA6IHN1Y2Nlc3M7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJhY2tlbmRJbnN0YW5jZSA9IHRoaXMucmVnaXN0cnlbYmFja2VuZE5hbWVdO1xuICAgICAgICB0aGlzLnNldHVwUmVnaXN0ZXJlZEtlcm5lbHMoKTtcbiAgICAgICAgLy8gUmVzZXQgdGhlIHByb2ZpbGVyLlxuICAgICAgICB0aGlzLnByb2ZpbGVyID0gbmV3IFByb2ZpbGVyKHRoaXMuYmFja2VuZEluc3RhbmNlKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHNldHVwUmVnaXN0ZXJlZEtlcm5lbHMoKSB7XG4gICAgICAgIGNvbnN0IGtlcm5lbHMgPSBnZXRLZXJuZWxzRm9yQmFja2VuZCh0aGlzLmJhY2tlbmROYW1lKTtcbiAgICAgICAga2VybmVscy5mb3JFYWNoKGtlcm5lbCA9PiB7XG4gICAgICAgICAgICBpZiAoa2VybmVsLnNldHVwRnVuYyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAga2VybmVsLnNldHVwRnVuYyh0aGlzLmJhY2tlbmRJbnN0YW5jZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBkaXNwb3NlUmVnaXN0ZXJlZEtlcm5lbHMoYmFja2VuZE5hbWUpIHtcbiAgICAgICAgY29uc3Qga2VybmVscyA9IGdldEtlcm5lbHNGb3JCYWNrZW5kKGJhY2tlbmROYW1lKTtcbiAgICAgICAga2VybmVscy5mb3JFYWNoKGtlcm5lbCA9PiB7XG4gICAgICAgICAgICBpZiAoa2VybmVsLmRpc3Bvc2VGdW5jICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBrZXJuZWwuZGlzcG9zZUZ1bmModGhpcy5yZWdpc3RyeVtiYWNrZW5kTmFtZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZXMgYSBiYWNrZW5kIGJ5IGxvb2tpbmcgdXAgdGhlIGJhY2tlbmQgbmFtZSBpbiB0aGUgZmFjdG9yeVxuICAgICAqIHJlZ2lzdHJ5IGFuZCBjYWxsaW5nIHRoZSBmYWN0b3J5IG1ldGhvZC4gUmV0dXJucyBhIGJvb2xlYW4gcmVwcmVzZW50aW5nXG4gICAgICogd2hldGhlciB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGJhY2tlbmQgc3VjZWVkZWQuIFRocm93cyBhbiBlcnJvciBpZlxuICAgICAqIHRoZXJlIGlzIG5vIGJhY2tlbmQgaW4gdGhlIGZhY3RvcnkgcmVnaXN0cnkuXG4gICAgICovXG4gICAgaW5pdGlhbGl6ZUJhY2tlbmQoYmFja2VuZE5hbWUpIHtcbiAgICAgICAgY29uc3QgcmVnaXN0cnlGYWN0b3J5RW50cnkgPSB0aGlzLnJlZ2lzdHJ5RmFjdG9yeVtiYWNrZW5kTmFtZV07XG4gICAgICAgIGlmIChyZWdpc3RyeUZhY3RvcnlFbnRyeSA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBpbml0aWFsaXplIGJhY2tlbmQgJHtiYWNrZW5kTmFtZX0sIG5vIHJlZ2lzdHJhdGlvbiBmb3VuZC5gKTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgYmFja2VuZCA9IHJlZ2lzdHJ5RmFjdG9yeUVudHJ5LmZhY3RvcnkoKTtcbiAgICAgICAgICAgIC8qIFRlc3QgaWYgdGhlIGZhY3RvcnkgcmV0dXJucyBhIHByb21pc2UuXG4gICAgICAgICAgICBEb25lIGluIGEgbW9yZSBsaWJlcmFsIHdheSB0aGFuXG4gICAgICAgICAgICBwcmV2aW91cyAnUHJvbWlzZS5yZXNvbHZlKGJhY2tlbmQpPT09YmFja2VuZCdcbiAgICAgICAgICAgIGFzIHdlIG5lZWRlZCB0byBhY2NvdW50IGZvciBjdXN0b20gUHJvbWlzZVxuICAgICAgICAgICAgaW1wbGVtZW50YXRpb25zIChlLmcuIEFuZ3VsYXIpICovXG4gICAgICAgICAgICBpZiAoYmFja2VuZCAmJiAhKGJhY2tlbmQgaW5zdGFuY2VvZiBLZXJuZWxCYWNrZW5kKSAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiBiYWNrZW5kLnRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9taXNlSWQgPSArK3RoaXMucGVuZGluZ0JhY2tlbmRJbml0SWQ7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3VjY2VzcyA9IGJhY2tlbmRcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oYmFja2VuZEluc3RhbmNlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gT3V0ZGF0ZWQgcHJvbWlzZS4gQW5vdGhlciBiYWNrZW5kIHdhcyBzZXQgaW4gdGhlIG1lYW50aW1lLlxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvbWlzZUlkIDwgdGhpcy5wZW5kaW5nQmFja2VuZEluaXRJZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVnaXN0cnlbYmFja2VuZE5hbWVdID0gYmFja2VuZEluc3RhbmNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBlbmRpbmdCYWNrZW5kSW5pdCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBPdXRkYXRlZCBwcm9taXNlLiBBbm90aGVyIGJhY2tlbmQgd2FzIHNldCBpbiB0aGUgbWVhbnRpbWUuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9taXNlSWQgPCB0aGlzLnBlbmRpbmdCYWNrZW5kSW5pdElkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wZW5kaW5nQmFja2VuZEluaXQgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYEluaXRpYWxpemF0aW9uIG9mIGJhY2tlbmQgJHtiYWNrZW5kTmFtZX0gZmFpbGVkYCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihlcnIuc3RhY2sgfHwgZXJyLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5wZW5kaW5nQmFja2VuZEluaXQgPSBzdWNjZXNzO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHN1Y2Nlc3MsIGFzeW5jSW5pdDogdHJ1ZSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWdpc3RyeVtiYWNrZW5kTmFtZV0gPSBiYWNrZW5kO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIGFzeW5jSW5pdDogZmFsc2UgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYEluaXRpYWxpemF0aW9uIG9mIGJhY2tlbmQgJHtiYWNrZW5kTmFtZX0gZmFpbGVkYCk7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oZXJyLnN0YWNrIHx8IGVyci5tZXNzYWdlKTtcbiAgICAgICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlLCBhc3luY0luaXQ6IGZhbHNlIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVtb3ZlQmFja2VuZChiYWNrZW5kTmFtZSkge1xuICAgICAgICBpZiAoIShiYWNrZW5kTmFtZSBpbiB0aGlzLnJlZ2lzdHJ5RmFjdG9yeSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtiYWNrZW5kTmFtZX0gYmFja2VuZCBub3QgZm91bmQgaW4gcmVnaXN0cnlgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5iYWNrZW5kTmFtZSA9PT0gYmFja2VuZE5hbWUgJiYgdGhpcy5wZW5kaW5nQmFja2VuZEluaXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gVGhlcmUgaXMgYSBwZW5kaW5nIHByb21pc2Ugb2YgdGhlIGJhY2tlbmQgd2Ugd2FudCB0byByZW1vdmUuIE1ha2UgaXRcbiAgICAgICAgICAgIC8vIG9ic29sZXRlLlxuICAgICAgICAgICAgdGhpcy5wZW5kaW5nQmFja2VuZEluaXRJZCsrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiYWNrZW5kTmFtZSBpbiB0aGlzLnJlZ2lzdHJ5KSB7XG4gICAgICAgICAgICB0aGlzLmRpc3Bvc2VSZWdpc3RlcmVkS2VybmVscyhiYWNrZW5kTmFtZSk7XG4gICAgICAgICAgICB0aGlzLnJlZ2lzdHJ5W2JhY2tlbmROYW1lXS5kaXNwb3NlKCk7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5yZWdpc3RyeVtiYWNrZW5kTmFtZV07XG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlIHRoaXMucmVnaXN0cnlGYWN0b3J5W2JhY2tlbmROYW1lXTtcbiAgICAgICAgLy8gVW5zZXQgdGhlIGJhY2tlbmQgaWYgaXQgaXMgYWN0aXZlLlxuICAgICAgICBpZiAodGhpcy5iYWNrZW5kTmFtZSA9PT0gYmFja2VuZE5hbWUpIHtcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ0JhY2tlbmRJbml0ID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuYmFja2VuZE5hbWUgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5iYWNrZW5kSW5zdGFuY2UgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldFNvcnRlZEJhY2tlbmRzKCkge1xuICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5yZWdpc3RyeUZhY3RvcnkpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBiYWNrZW5kIGZvdW5kIGluIHJlZ2lzdHJ5LicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLnJlZ2lzdHJ5RmFjdG9yeSkuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgICAgLy8gSGlnaGVzdCBwcmlvcml0eSBjb21lcyBmaXJzdC5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlZ2lzdHJ5RmFjdG9yeVtiXS5wcmlvcml0eSAtXG4gICAgICAgICAgICAgICAgdGhpcy5yZWdpc3RyeUZhY3RvcnlbYV0ucHJpb3JpdHk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpbml0aWFsaXplQmFja2VuZHNBbmRSZXR1cm5CZXN0KCkge1xuICAgICAgICBjb25zdCBzb3J0ZWRCYWNrZW5kcyA9IHRoaXMuZ2V0U29ydGVkQmFja2VuZHMoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3J0ZWRCYWNrZW5kcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgYmFja2VuZE5hbWUgPSBzb3J0ZWRCYWNrZW5kc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IHsgc3VjY2VzcywgYXN5bmNJbml0IH0gPSB0aGlzLmluaXRpYWxpemVCYWNrZW5kKGJhY2tlbmROYW1lKTtcbiAgICAgICAgICAgIGlmIChhc3luY0luaXQgfHwgc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IG5hbWU6IGJhY2tlbmROYW1lLCBhc3luY0luaXQgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBpbml0aWFsaXplIGFueSBiYWNrZW5kcywgYWxsIGJhY2tlbmQgaW5pdGlhbGl6YXRpb25zIGAgK1xuICAgICAgICAgICAgYGZhaWxlZC5gKTtcbiAgICB9XG4gICAgbW92ZURhdGEoYmFja2VuZCwgZGF0YUlkKSB7XG4gICAgICAgIGNvbnN0IGluZm8gPSB0aGlzLnN0YXRlLnRlbnNvckluZm8uZ2V0KGRhdGFJZCk7XG4gICAgICAgIGNvbnN0IHNyY0JhY2tlbmQgPSBpbmZvLmJhY2tlbmQ7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMucmVhZFN5bmMoZGF0YUlkKTtcbiAgICAgICAgY29uc3QgcmVmQ291bnQgPSBzcmNCYWNrZW5kLnJlZkNvdW50KGRhdGFJZCk7XG4gICAgICAgIC8vIERlbGV0ZSB0aGUgdGVuc29yIGZyb20gdGhlIG9sZCBiYWNrZW5kIGFuZCBtb3ZlIGl0IHRvIHRoZSBuZXdcbiAgICAgICAgLy8gYmFja2VuZC5cbiAgICAgICAgc3JjQmFja2VuZC5kaXNwb3NlRGF0YShkYXRhSWQsIHRydWUpO1xuICAgICAgICBpbmZvLmJhY2tlbmQgPSBiYWNrZW5kO1xuICAgICAgICBiYWNrZW5kLm1vdmUoZGF0YUlkLCB2YWx1ZXMsIGluZm8uc2hhcGUsIGluZm8uZHR5cGUsIHJlZkNvdW50KTtcbiAgICAgICAgaWYgKHRoaXMuc2hvdWxkQ2hlY2tGb3JNZW1MZWFrcygpKSB7XG4gICAgICAgICAgICAvLyBUcmFjayB0aGUgbnVtYmVyIG9mIG1vdmVzIGR1cmluZyBhIGtlcm5lbCBleGVjdXRpb24gdG8gY29ycmVjdGx5XG4gICAgICAgICAgICAvLyBkZXRlY3QgbWVtb3J5IGxlYWtzLlxuICAgICAgICAgICAgdGhpcy5zdGF0ZS5udW1EYXRhTW92ZXNTdGFja1t0aGlzLnN0YXRlLm51bURhdGFNb3Zlc1N0YWNrLmxlbmd0aCAtIDFdKys7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdGlkeShuYW1lT3JGbiwgZm4pIHtcbiAgICAgICAgbGV0IG5hbWUgPSBudWxsO1xuICAgICAgICBpZiAoZm4gPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gQ2FsbGVkIHdpdGggb25seSAxIGFyZ3VtZW50LlxuICAgICAgICAgICAgaWYgKHR5cGVvZiBuYW1lT3JGbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUGxlYXNlIHByb3ZpZGUgYSBmdW5jdGlvbiB0byB0aWR5KCknKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZuID0gbmFtZU9yRm47XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBDYWxsZWQgd2l0aCAyIGFyZ3VtZW50cy5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgbmFtZU9yRm4gIT09ICdzdHJpbmcnICYmICEobmFtZU9yRm4gaW5zdGFuY2VvZiBTdHJpbmcpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXaGVuIGNhbGxpbmcgd2l0aCB0d28gYXJndW1lbnRzLCB0aGUgZmlyc3QgYXJndW1lbnQgJyArXG4gICAgICAgICAgICAgICAgICAgICd0byB0aWR5KCkgbXVzdCBiZSBhIHN0cmluZycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV2hlbiBjYWxsaW5nIHdpdGggdHdvIGFyZ3VtZW50cywgdGhlIDJuZCBhcmd1bWVudCAnICtcbiAgICAgICAgICAgICAgICAgICAgJ3RvIHRpZHkoKSBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5hbWUgPSBuYW1lT3JGbjtcbiAgICAgICAgICAgIC8vIFRPRE8obnN0aG9yYXQsc21pbGtvdik6IERvIG9wZXJhdGlvbiBsb2dnaW5nIGFuZCBwZXJmb3JtYW5jZVxuICAgICAgICAgICAgLy8gcHJvZmlsaW5nLlxuICAgICAgICB9XG4gICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgIHJldHVybiB0aGlzLnNjb3BlZFJ1bigoKSA9PiB0aGlzLnN0YXJ0U2NvcGUobmFtZSksICgpID0+IHRoaXMuZW5kU2NvcGUocmVzdWx0KSwgKCkgPT4ge1xuICAgICAgICAgICAgcmVzdWx0ID0gZm4oKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignQ2Fubm90IHJldHVybiBhIFByb21pc2UgaW5zaWRlIG9mIHRpZHkuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc2NvcGVkUnVuKHN0YXJ0LCBlbmQsIGYpIHtcbiAgICAgICAgc3RhcnQoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlcyA9IGYoKTtcbiAgICAgICAgICAgIGVuZCgpO1xuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXgpIHtcbiAgICAgICAgICAgIGVuZCgpO1xuICAgICAgICAgICAgdGhyb3cgZXg7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbmV4dFRlbnNvcklkKCkge1xuICAgICAgICByZXR1cm4gRW5naW5lLm5leHRUZW5zb3JJZCsrO1xuICAgIH1cbiAgICBuZXh0VmFyaWFibGVJZCgpIHtcbiAgICAgICAgcmV0dXJuIEVuZ2luZS5uZXh0VmFyaWFibGVJZCsrO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgaW5zdGVhZCBvZiB0aGUgcHVibGljLWZhY2luZyB0ZW5zb3IuY2xvbmUoKSB3aGVuXG4gICAgICogc2F2aW5nIGEgdGVuc29yIGZvciBiYWNrd2FyZHMgcGFzcy4gSXQgbWFrZXMgc3VyZSB0byBhZGQgdGhlIGNsb25lXG4gICAgICogb3BlcmF0aW9uIHRvIHRoZSB0YXBlIHJlZ2FyZGxlc3Mgb2YgYmVpbmcgY2FsbGVkIGluc2lkZSBhIGtlcm5lbFxuICAgICAqIGV4ZWN1dGlvbi5cbiAgICAgKi9cbiAgICBjbG9uZSh4KSB7XG4gICAgICAgIGNvbnN0IHkgPSBFTkdJTkUucnVuS2VybmVsKElkZW50aXR5LCB7IHggfSk7XG4gICAgICAgIGNvbnN0IGlucHV0cyA9IHsgeCB9O1xuICAgICAgICBjb25zdCBncmFkID0gKGR5KSA9PiAoe1xuICAgICAgICAgICAgeDogKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGR0eXBlID0gJ2Zsb2F0MzInO1xuICAgICAgICAgICAgICAgIGNvbnN0IGdyYWRJbnB1dHMgPSB7IHg6IGR5IH07XG4gICAgICAgICAgICAgICAgY29uc3QgYXR0cnMgPSB7IGR0eXBlIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoQ2FzdCwgZ3JhZElucHV0cywgXG4gICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICAgICAgICAgICAgICAgIGF0dHJzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHNhdmVkID0gW107XG4gICAgICAgIHRoaXMuYWRkVGFwZU5vZGUodGhpcy5zdGF0ZS5hY3RpdmVTY29wZS5uYW1lLCBpbnB1dHMsIFt5XSwgZ3JhZCwgc2F2ZWQsIHt9KTtcbiAgICAgICAgcmV0dXJuIHk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGUgYSBrZXJuZWwgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhbmQgcmV0dXJuIHRoZSBvdXRwdXQgdGVuc29yLlxuICAgICAqXG4gICAgICogQHBhcmFtIGtlcm5lbE5hbWUgVGhlIG5hbWUgb2YgdGhlIGtlcm5lbCB0byBleGVjdXRlLlxuICAgICAqIEBwYXJhbSBpbnB1dHMgQSBtYXAgb2YgaW5wdXQgbmFtZXMgdG8gdGVuc29ycy5cbiAgICAgKiBAcGFyYW0gYXR0cnMgQSBtYXAgb2YgYXR0cmlidXRlIG5hbWVzIHRvIHRoZWlyIHZhbHVlcy4gQW4gYXR0cmlidXRlIGlzIGFcbiAgICAgKiAgICAgcHJpbWl0aXZlIChub24tdGVuc29yKSBpbnB1dCB0byB0aGUga2VybmVsLlxuICAgICAqIEBwYXJhbSBpbnB1dHNUb1NhdmUgQSBsaXN0IG9mIHRlbnNvcnMsIGlucHV0cyB0byBzYXZlIGZvciB0aGUgYmFja3Byb3BcbiAgICAgKiAgICAgY29tcHV0YXRpb24uXG4gICAgICogQHBhcmFtIG91dHB1dHNUb1NhdmUgQSBsaXN0IG9mIGJvb2xlYW5zLCBzcGVjaWZ5aW5nIHdoaWNoIG91dHB1dCB0byBzYXZlXG4gICAgICogICAgIGZvciB0aGUgYmFja3Byb3AgY29tcHV0YXRpb24uIFRoZXNlIGFyZSBib29sZWFucyBzaW5jZSB0aGUgb3V0cHV0XG4gICAgICogdGVuc29ycyBhcmUgbm90IHZpc2libGUgdG8gdGhlIHVzZXIuXG4gICAgICovXG4gICAgcnVuS2VybmVsKGtlcm5lbE5hbWUsIGlucHV0cywgYXR0cnMpIHtcbiAgICAgICAgaWYgKHRoaXMuYmFja2VuZE5hbWUgPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gYmFja2VuZCBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgeWV0IChiYWNrZW5kIGluaXRpYWxpemF0aW9uIGlzIGxhenlcbiAgICAgICAgICAgIC8vIGNhbiBiZSBkZWZlcnJlZCB1bnRpbCBhbiBvcC8ga2VybmVsIGlzIHJ1bikuXG4gICAgICAgICAgICAvLyBUaGUgYmVsb3cgZ2V0dGVyIGhhcyBzaWRlIGVmZmVjdHMgdGhhdCB3aWxsIHRyeSB0byBpbml0aWFsaXplIHRoZVxuICAgICAgICAgICAgLy8gYmFja2VuZCBhbmQgc2V0IHByb3BlcnRpZXMgbGlrZSB0aGlzLmJhY2tlbmROYW1lXG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVudXNlZC1leHByZXNzaW9uXG4gICAgICAgICAgICB0aGlzLmJhY2tlbmQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaGFzS2VybmVsID0gZ2V0S2VybmVsKGtlcm5lbE5hbWUsIHRoaXMuYmFja2VuZE5hbWUpICE9IG51bGw7XG4gICAgICAgIGlmICghaGFzS2VybmVsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEtlcm5lbCAnJHtrZXJuZWxOYW1lfScgbm90IHJlZ2lzdGVyZWQgZm9yIGJhY2tlbmQgJyR7dGhpcy5iYWNrZW5kTmFtZX0nYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucnVuS2VybmVsRnVuYyh7IGtlcm5lbE5hbWUsIGlucHV0cywgYXR0cnMgfSk7XG4gICAgfVxuICAgIHNob3VsZENoZWNrRm9yTWVtTGVha3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkVOVi5nZXRCb29sKCdJU19URVNUJyk7XG4gICAgfVxuICAgIGNoZWNrS2VybmVsRm9yTWVtTGVhayhrZXJuZWxOYW1lLCBudW1EYXRhSWRzQmVmb3JlLCBvdXRJbmZvcykge1xuICAgICAgICBjb25zdCBudW1EYXRhSWRzQWZ0ZXIgPSB0aGlzLmJhY2tlbmQubnVtRGF0YUlkcygpO1xuICAgICAgICAvLyBDb3VudCB0aGUgbnVtYmVyIG9mIGRhdGEgaWRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzdWx0IG9mIHRoZSBrZXJuZWwuXG4gICAgICAgIGxldCBudW1PdXRwdXREYXRhSWRzID0gMDtcbiAgICAgICAgb3V0SW5mb3MuZm9yRWFjaChpbmZvID0+IHtcbiAgICAgICAgICAgIC8vIENvbXBsZXggbnVtYmVycyBhbGxvY2F0ZSAzIGRhdGEgaWRzLCBvbmUgZm9yICdyZWFsJywgb25lIGZvclxuICAgICAgICAgICAgLy8gJ2ltYWdpbmFyeScsIGFuZCBvbmUgZm9yIHRoZSBjb250YWluZXIgdGhhdCBob2xkcyB0aGUgZm9ybWVyIHR3by5cbiAgICAgICAgICAgIG51bU91dHB1dERhdGFJZHMgKz0gKGluZm8uZHR5cGUgPT09ICdjb21wbGV4NjQnID8gMyA6IDEpO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gQWNjb3VudCBmb3IgdGhlIG51bWJlciBvZiBtb3ZlcyBkdXJpbmcga2VybmVsIGV4ZWN1dGlvbi4gQSBcImRhdGEgbW92ZVwiXG4gICAgICAgIC8vIGNhbiBoYXBwZW4gaW4gdGhlIG1pZGRsZSBvZiBhIGtlcm5lbCBleGVjdXRpb24sIHBsYWNpbmcgYSBuZXcgKGtleSx2YWx1ZSlcbiAgICAgICAgLy8gcGFpciBpbiB0aGUgZGF0YSBzdG9yYWdlLiBTaW5jZSBkYXRhIG1vdmVzIGhhdmUgbmV0IHplcm8gZWZmZWN0ICh3ZVxuICAgICAgICAvLyBhbHdheXMgcmVtb3ZlIHRoZSBkYXRhIGZyb20gdGhlIG9sZCBiYWNrZW5kKSwgd2UgaGF2ZSB0byBjYW5jZWwgdGhlbSBvdXRcbiAgICAgICAgLy8gd2hlbiBkZXRlY3RpbmcgbWVtb3J5IGxlYWtzLlxuICAgICAgICBjb25zdCBudW1Nb3ZlcyA9IHRoaXMuc3RhdGUubnVtRGF0YU1vdmVzU3RhY2tbdGhpcy5zdGF0ZS5udW1EYXRhTW92ZXNTdGFjay5sZW5ndGggLSAxXTtcbiAgICAgICAgY29uc3QgZGF0YUlkc0xlYWtlZCA9IG51bURhdGFJZHNBZnRlciAtIG51bURhdGFJZHNCZWZvcmUgLSBudW1PdXRwdXREYXRhSWRzIC0gbnVtTW92ZXM7XG4gICAgICAgIGlmIChkYXRhSWRzTGVha2VkID4gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCYWNrZW5kICcke3RoaXMuYmFja2VuZE5hbWV9JyBoYXMgYW4gaW50ZXJuYWwgbWVtb3J5IGxlYWsgYCArXG4gICAgICAgICAgICAgICAgYCgke2RhdGFJZHNMZWFrZWR9IGRhdGEgaWRzKSBhZnRlciBydW5uaW5nICcke2tlcm5lbE5hbWV9J2ApO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEludGVybmFsIGhlbHBlciBtZXRob2QgdG8gZXhlY3V0ZSBhIGtlcm5lbCBGdW5jXG4gICAgICpcbiAgICAgKiBVc2UgYHJ1bktlcm5lbGAgdG8gZXhlY3V0ZSBrZXJuZWxzIGZyb20gb3V0c2lkZSBvZiBlbmdpbmUuXG4gICAgICovXG4gICAgcnVuS2VybmVsRnVuYyhrZXJuZWxQYXJhbXMpIHtcbiAgICAgICAgbGV0IG91dHB1dHM7XG4gICAgICAgIGxldCBzYXZlZCA9IFtdO1xuICAgICAgICBjb25zdCBpc1RhcGVPbiA9IHRoaXMuaXNUYXBlT24oKTtcbiAgICAgICAgY29uc3Qgc3RhcnRpbmdCeXRlY291bnQgPSB0aGlzLnN0YXRlLm51bUJ5dGVzO1xuICAgICAgICBjb25zdCBzdGFydGluZ051bVRlbnNvcnMgPSB0aGlzLnN0YXRlLm51bVRlbnNvcnM7XG4gICAgICAgIGlmICh0aGlzLnNob3VsZENoZWNrRm9yTWVtTGVha3MoKSkge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZS5udW1EYXRhTW92ZXNTdGFjay5wdXNoKDApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBrZXJuZWxGdW5jO1xuICAgICAgICBpZiAodGhpcy5iYWNrZW5kTmFtZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBiYWNrZW5kIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCB5ZXQgKGJhY2tlbmQgaW5pdGlhbGl6YXRpb24gaXMgbGF6eVxuICAgICAgICAgICAgLy8gY2FuIGJlIGRlZmVycmVkIHVudGlsIGFuIG9wLyBrZXJuZWwgaXMgcnVuKS5cbiAgICAgICAgICAgIC8vIFRoZSBiZWxvdyBnZXR0ZXIgaGFzIHNpZGUgZWZmZWN0cyB0aGF0IHdpbGwgdHJ5IHRvIGluaXRpYWxpemUgdGhlXG4gICAgICAgICAgICAvLyBiYWNrZW5kIGFuZCBzZXQgcHJvcGVydGllcyBsaWtlIHRoaXMuYmFja2VuZE5hbWVcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW51c2VkLWV4cHJlc3Npb25cbiAgICAgICAgICAgIHRoaXMuYmFja2VuZDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgb3V0O1xuICAgICAgICBjb25zdCBrZXJuZWxPclNjb3BlTmFtZSA9IGlzUmVnaXN0ZXJlZEtlcm5lbEludm9jYXRpb24oa2VybmVsUGFyYW1zKSA/XG4gICAgICAgICAgICBrZXJuZWxQYXJhbXMua2VybmVsTmFtZSA6XG4gICAgICAgICAgICB0aGlzLnN0YXRlLmFjdGl2ZVNjb3BlICE9IG51bGwgPyB0aGlzLnN0YXRlLmFjdGl2ZVNjb3BlLm5hbWUgOiAnJztcbiAgICAgICAgLy8gQ3JlYXRlIHRoZSBrZXJuZWxGdW5jIGZyb20gZWl0aGVyIGEgcmVnaXN0ZXJlZCBrZXJuZWwgT1IgcGFzc2VkIGluXG4gICAgICAgIC8vIGZvcndhcmQvYmFja3dhcmQgZnVuY3Rpb25zICh1c2VkIGJ5IGN1c3RvbSBncmFkKS4gSW4gdGhpcyBjb250ZXh0IGFcbiAgICAgICAgLy8ga2VybmVsRnVuYyB3cmFwcyBhIGtlcm5lbCBpbXBsZW1lbnRhdGlvbiB3aXRoIHNvbWUgYm9va2tlZXBpbmcuXG4gICAgICAgIGlmIChpc1JlZ2lzdGVyZWRLZXJuZWxJbnZvY2F0aW9uKGtlcm5lbFBhcmFtcykpIHtcbiAgICAgICAgICAgIGNvbnN0IHsga2VybmVsTmFtZSwgaW5wdXRzLCBhdHRycyB9ID0ga2VybmVsUGFyYW1zO1xuICAgICAgICAgICAgaWYgKHRoaXMuYmFja2VuZE5hbWUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIGJhY2tlbmQgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkIHlldCAoYmFja2VuZCBpbml0aWFsaXphdGlvbiBpcyBsYXp5XG4gICAgICAgICAgICAgICAgLy8gY2FuIGJlIGRlZmVycmVkIHVudGlsIGFuIG9wLyBrZXJuZWwgaXMgcnVuKS5cbiAgICAgICAgICAgICAgICAvLyBUaGUgYmVsb3cgZ2V0dGVyIGhhcyBzaWRlIGVmZmVjdHMgdGhhdCB3aWxsIHRyeSB0byBpbml0aWFsaXplIHRoZVxuICAgICAgICAgICAgICAgIC8vIGJhY2tlbmQgYW5kIHNldCBwcm9wZXJ0aWVzIGxpa2UgdGhpcy5iYWNrZW5kTmFtZVxuICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW51c2VkLWV4cHJlc3Npb25cbiAgICAgICAgICAgICAgICB0aGlzLmJhY2tlbmQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBrZXJuZWwgPSBnZXRLZXJuZWwoa2VybmVsTmFtZSwgdGhpcy5iYWNrZW5kTmFtZSk7XG4gICAgICAgICAgICB1dGlsLmFzc2VydChrZXJuZWwgIT0gbnVsbCwgKCkgPT4gYENhbm5vdCBmaW5kIHJlZ2lzdGVyZWQga2VybmVsICcke2tlcm5lbE5hbWV9JyBmb3IgYmFja2VuZCAnJHt0aGlzLmJhY2tlbmROYW1lfSdgKTtcbiAgICAgICAgICAgIGtlcm5lbEZ1bmMgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbnVtRGF0YUlkc0JlZm9yZSA9IHRoaXMuYmFja2VuZC5udW1EYXRhSWRzKCk7XG4gICAgICAgICAgICAgICAgb3V0ID0ga2VybmVsLmtlcm5lbEZ1bmMoeyBpbnB1dHMsIGF0dHJzLCBiYWNrZW5kOiB0aGlzLmJhY2tlbmQgfSk7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3V0SW5mb3MgPSBBcnJheS5pc0FycmF5KG91dCkgPyBvdXQgOiBbb3V0XTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG91bGRDaGVja0Zvck1lbUxlYWtzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja0tlcm5lbEZvck1lbUxlYWsoa2VybmVsTmFtZSwgbnVtRGF0YUlkc0JlZm9yZSwgb3V0SW5mb3MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBvdXRUZW5zb3JzID0gb3V0SW5mb3MubWFwKChvdXRJbmZvKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRvZG8gKHlhc3NvZ2JhKSByZW1vdmUgdGhpcyBvcHRpb24gKFRlbnNvcikgd2hlbiBub2RlIGJhY2tlbmRcbiAgICAgICAgICAgICAgICAgICAgLy8gbWV0aG9kcyBoYXZlIGJlZW4gbW9kdWxhcml6ZWQgYW5kIHRoZXkgYWxsIHJldHVybiB0ZW5zb3JJbmZvLlxuICAgICAgICAgICAgICAgICAgICAvLyBUZW5zb3JJbmZvcyBkbyBub3QgaGF2ZSBhIHJhbmsgYXR0cmlidXRlLlxuICAgICAgICAgICAgICAgICAgICBpZiAob3V0SW5mby5yYW5rICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvdXRJbmZvO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgZGF0YUlkLCBzaGFwZSwgZHR5cGUgfSA9IG91dEluZm87XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm1ha2VUZW5zb3JGcm9tRGF0YUlkKGRhdGFJZCwgc2hhcGUsIGR0eXBlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAvLyBTYXZlIGFueSByZXF1aXJlZCBpbnB1dHMgYW5kIG91dHB1dHMuXG4gICAgICAgICAgICAgICAgLy8gRG8gbm90IHNhdmUgdW5sZXNzIHdlIGFyZSByZWNvcmRpbmcgdG8gdGhlIHRhcGUuIE90aGVyd2lzZSBpdCB3b3VsZFxuICAgICAgICAgICAgICAgIC8vIGNhdXNlIGEgbWVtIGxlYWsgc2luY2UgdGhlcmUgd291bGQgYmUgbm8gYmFja3Byb3AgZm9yIHRoZXNlIHRlbnNvcnNcbiAgICAgICAgICAgICAgICAvLyAod2hpY2ggd291bGQgb3RoZXJ3aXNlIGRpc3Bvc2UgdGhlbSkuXG4gICAgICAgICAgICAgICAgaWYgKGlzVGFwZU9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRlbnNvcnNUb1NhdmUgPSB0aGlzLmdldFRlbnNvcnNGb3JHcmFkaWVudChrZXJuZWxOYW1lLCBpbnB1dHMsIG91dFRlbnNvcnMpO1xuICAgICAgICAgICAgICAgICAgICBzYXZlZCA9IHRoaXMuc2F2ZVRlbnNvcnNGb3JCYWNrd2FyZE1vZGUodGVuc29yc1RvU2F2ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBvdXRUZW5zb3JzO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHsgZm9yd2FyZEZ1bmMgfSA9IGtlcm5lbFBhcmFtcztcbiAgICAgICAgICAgIC8vIFJ1bm5pbmcgYSBjdXN0b21HcmFkIG9wLlxuICAgICAgICAgICAgY29uc3Qgc2F2ZUZ1bmMgPSAodGVuc29ycykgPT4ge1xuICAgICAgICAgICAgICAgIC8vIERvIG5vdCBzYXZlIHVubGVzcyB3ZSBhcmUgcmVjb3JkaW5nIHRvIHRoZSB0YXBlLiBPdGhlcndpc2UgaXQgd291bGRcbiAgICAgICAgICAgICAgICAvLyBjYXVzZSBhIG1lbSBsZWFrIHNpbmNlIHdlIHdvdWxkIG5ldmVyIHJ1biBiYWNrcHJvcCwgd2hpY2ggZGlzcG9zZXNcbiAgICAgICAgICAgICAgICAvLyB0aGUga2VwdCB0ZW5zb3JzLlxuICAgICAgICAgICAgICAgIGlmICghaXNUYXBlT24pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzYXZlZCA9IHRlbnNvcnMubWFwKHRlbnNvciA9PiB0aGlzLmtlZXAodGhpcy5jbG9uZSh0ZW5zb3IpKSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAga2VybmVsRnVuYyA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBudW1EYXRhSWRzQmVmb3JlID0gdGhpcy5iYWNrZW5kLm51bURhdGFJZHMoKTtcbiAgICAgICAgICAgICAgICBvdXQgPSB0aGlzLnRpZHkoKCkgPT4gZm9yd2FyZEZ1bmModGhpcy5iYWNrZW5kLCBzYXZlRnVuYykpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG91dHMgPSAoQXJyYXkuaXNBcnJheShvdXQpID8gb3V0IDogW291dF0pO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3VsZENoZWNrRm9yTWVtTGVha3MoKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBTY29wZSBuYW1lIGlzIHVzZWQgdG8gcHJpbnQgYSBtb3JlIGhlbHBmdWwgZXJyb3IgbWVzc2FnZSBpZiBuZWVkZWQuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tLZXJuZWxGb3JNZW1MZWFrKGtlcm5lbE9yU2NvcGVOYW1lLCBudW1EYXRhSWRzQmVmb3JlLCBvdXRzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG91dHM7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIC8vXG4gICAgICAgIC8vIFJ1biB0aGUga2VybmVsRnVuYy4gT3B0aW9uYWxseSBwcm9maWxpbmcgaXQuXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IHsgaW5wdXRzLCBhdHRycyB9ID0ga2VybmVsUGFyYW1zO1xuICAgICAgICBjb25zdCBiYWNrd2FyZHNGdW5jID0gaXNSZWdpc3RlcmVkS2VybmVsSW52b2NhdGlvbihrZXJuZWxQYXJhbXMpID9cbiAgICAgICAgICAgIG51bGwgOlxuICAgICAgICAgICAga2VybmVsUGFyYW1zLmJhY2t3YXJkc0Z1bmM7XG4gICAgICAgIGxldCBrZXJuZWxQcm9maWxlO1xuICAgICAgICB0aGlzLnNjb3BlZFJ1bihcbiAgICAgICAgLy8gU3RvcCByZWNvcmRpbmcgdG8gYSB0YXBlIHdoZW4gcnVubmluZyBhIGtlcm5lbC5cbiAgICAgICAgKCkgPT4gdGhpcy5zdGF0ZS5rZXJuZWxEZXB0aCsrLCAoKSA9PiB0aGlzLnN0YXRlLmtlcm5lbERlcHRoLS0sICgpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5FTlYuZ2V0Qm9vbCgnREVCVUcnKSAmJiAhdGhpcy5zdGF0ZS5wcm9maWxpbmcpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXRzID0ga2VybmVsRnVuYygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAga2VybmVsUHJvZmlsZSA9IHRoaXMucHJvZmlsZXIucHJvZmlsZUtlcm5lbChrZXJuZWxPclNjb3BlTmFtZSwgaW5wdXRzLCAoKSA9PiBrZXJuZWxGdW5jKCkpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLkVOVi5nZXRCb29sKCdERUJVRycpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvZmlsZXIubG9nS2VybmVsUHJvZmlsZShrZXJuZWxQcm9maWxlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb3V0cHV0cyA9IGtlcm5lbFByb2ZpbGUub3V0cHV0cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChpc1RhcGVPbikge1xuICAgICAgICAgICAgdGhpcy5hZGRUYXBlTm9kZShrZXJuZWxPclNjb3BlTmFtZSwgaW5wdXRzLCBvdXRwdXRzLCBiYWNrd2FyZHNGdW5jLCBzYXZlZCwgYXR0cnMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLnByb2ZpbGluZykge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZS5hY3RpdmVQcm9maWxlLmtlcm5lbHMucHVzaCh7XG4gICAgICAgICAgICAgICAgbmFtZToga2VybmVsT3JTY29wZU5hbWUsXG4gICAgICAgICAgICAgICAgYnl0ZXNBZGRlZDogdGhpcy5zdGF0ZS5udW1CeXRlcyAtIHN0YXJ0aW5nQnl0ZWNvdW50LFxuICAgICAgICAgICAgICAgIHRvdGFsQnl0ZXNTbmFwc2hvdDogdGhpcy5zdGF0ZS5udW1CeXRlcyxcbiAgICAgICAgICAgICAgICB0ZW5zb3JzQWRkZWQ6IHRoaXMuc3RhdGUubnVtVGVuc29ycyAtIHN0YXJ0aW5nTnVtVGVuc29ycyxcbiAgICAgICAgICAgICAgICB0b3RhbFRlbnNvcnNTbmFwc2hvdDogdGhpcy5zdGF0ZS5udW1UZW5zb3JzLFxuICAgICAgICAgICAgICAgIGlucHV0U2hhcGVzOiBPYmplY3Qua2V5cyhpbnB1dHMpLm1hcChrZXkgPT4gaW5wdXRzW2tleV0gIT0gbnVsbCA/IGlucHV0c1trZXldLnNoYXBlIDogbnVsbCksXG4gICAgICAgICAgICAgICAgb3V0cHV0U2hhcGVzOiBvdXRwdXRzLm1hcChpdGVtID0+IGl0ZW0uc2hhcGUpLFxuICAgICAgICAgICAgICAgIGtlcm5lbFRpbWVNczoga2VybmVsUHJvZmlsZS50aW1lTXMsXG4gICAgICAgICAgICAgICAgZXh0cmFJbmZvOiBrZXJuZWxQcm9maWxlLmV4dHJhSW5mb1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChBcnJheS5pc0FycmF5KG91dCkgPyBvdXRwdXRzIDogb3V0cHV0c1swXSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNhdmVzIHRlbnNvcnMgdXNlZCBpbiBmb3J3YXJkIG1vZGUgZm9yIHVzZSBpbiBiYWNrd2FyZCBtb2RlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRlbnNvcnMgdGhlIGxpc3Qgb2YgdGVuc29ycyB0byBzYXZlLlxuICAgICAqL1xuICAgIHNhdmVUZW5zb3JzRm9yQmFja3dhcmRNb2RlKHRlbnNvcnMpIHtcbiAgICAgICAgY29uc3Qgc2F2ZWQgPSB0ZW5zb3JzLm1hcCh0ZW5zb3IgPT4gdGhpcy5rZWVwKHRoaXMuY2xvbmUodGVuc29yKSkpO1xuICAgICAgICByZXR1cm4gc2F2ZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBsaXN0IG9mIHRlbnNvcnMgdG8gc2F2ZSBmb3IgYSBnaXZlbiBncmFkaWVudCBjYWxjdWxhdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBrZXJuZWxOYW1lIG5hbWUgb2Yga2VybmVsIHRvIGxvb2sgdXAgZ3JhZGllbnQgZm9yLlxuICAgICAqIEBwYXJhbSBpbnB1dHMgYSBtYXAgb2YgaW5wdXQgdGVuc29ycy5cbiAgICAgKiBAcGFyYW0gb3V0cHV0cyBhbiBhcnJheSBvZiBvdXRwdXQgdGVuc29ycyBmcm9tIGZvcndhcmQgbW9kZSBvZiBrZXJuZWwuXG4gICAgICovXG4gICAgZ2V0VGVuc29yc0ZvckdyYWRpZW50KGtlcm5lbE5hbWUsIGlucHV0cywgb3V0cHV0cykge1xuICAgICAgICBjb25zdCBncmFkQ29uZmlnID0gZ2V0R3JhZGllbnQoa2VybmVsTmFtZSk7XG4gICAgICAgIGlmIChncmFkQ29uZmlnICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGlucHV0c1RvU2F2ZSA9IGdyYWRDb25maWcuaW5wdXRzVG9TYXZlIHx8IFtdO1xuICAgICAgICAgICAgY29uc3Qgb3V0cHV0c1RvU2F2ZSA9IGdyYWRDb25maWcub3V0cHV0c1RvU2F2ZSB8fCBbXTtcbiAgICAgICAgICAgIC8vIElmIHNhdmVBbGxJbnB1dHMgaXMgdHJ1ZSwgYWxsIGlucHV0cyB3aWxsIGJlIHNhdmVkLiBPdGhlcndpc2UsIGlucHV0c1xuICAgICAgICAgICAgLy8gc3BlY2lmaWVkIGluIGlucHV0c1RvU2F2ZSB3aWxsIGJlIHNhdmVkLlxuICAgICAgICAgICAgbGV0IGlucHV0VGVuc29yc1RvU2F2ZTtcbiAgICAgICAgICAgIGlmIChncmFkQ29uZmlnLnNhdmVBbGxJbnB1dHMpIHtcbiAgICAgICAgICAgICAgICB1dGlsLmFzc2VydChBcnJheS5pc0FycmF5KGlucHV0cyksICgpID0+ICdzYXZlQWxsSW5wdXRzIGlzIHRydWUsIGV4cGVjdGVkIGlucHV0cyB0byBiZSBhbiBhcnJheS4nKTtcbiAgICAgICAgICAgICAgICBpbnB1dFRlbnNvcnNUb1NhdmUgPSBPYmplY3Qua2V5cyhpbnB1dHMpLm1hcCgoa2V5KSA9PiBpbnB1dHNba2V5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpbnB1dFRlbnNvcnNUb1NhdmUgPSBpbnB1dHNUb1NhdmUubWFwKChpbnB1dE5hbWUpID0+IGlucHV0c1tpbnB1dE5hbWVdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG91dHB1dFRlbnNvcnNUb1NhdmUgPSBvdXRwdXRzLmZpbHRlcigoXywgaSkgPT4gb3V0cHV0c1RvU2F2ZVtpXSk7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXRUZW5zb3JzVG9TYXZlLmNvbmNhdChvdXRwdXRUZW5zb3JzVG9TYXZlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXZSByZXR1cm4gYW4gZW1wdHkgbGlzdCByYXRoZXIgdGhhbiB0aHJvdyBhbiBlcnJvciBiZWNhdXNlIHRoZSBrZXJuZWwgd2VcbiAgICAgICAgLy8gYXJlIGxvb2tpbmcgdXAgbWF5IG5vdCBhY3R1YWxseSBiZSByZWxldmFudCB0byBiYWNrcHJvcGluZyB0aHJvdWdoIHRoZVxuICAgICAgICAvLyBvdmVyYWxsIGZ1bmN0aW9uXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFNlZSAnZG9lcyBub3QgZXJyb3IgaWYgaXJyZWxldmFudCAocHJ1bmVkKSBvcHMgYXJlIG1pc3NpbmcgZ3JhZHMnIHRlc3RcbiAgICAgICAgLy8gaW4gZ3JhZGllbnRzX3Rlc3QudHMgZm9yIGFuIGV4YW1wbGUuXG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW50ZXJuYWwgbWV0aG9kIHVzZWQgYnkgcHVibGljIEFQSXMgZm9yIHRlbnNvciBjcmVhdGlvbi4gTWFrZXMgYSBuZXdcbiAgICAgKiB0ZW5zb3Igd2l0aCB0aGUgcHJvdmlkZWQgc2hhcGUsIGR0eXBlIGFuZCB2YWx1ZXMuIEl0IGFsd2F5c1xuICAgICAqIGNyZWF0ZXMgYSBuZXcgZGF0YSBpZCBhbmQgd3JpdGVzIHRoZSB2YWx1ZXMgdG8gdGhlIHVuZGVybHlpbmcgYmFja2VuZC5cbiAgICAgKi9cbiAgICBtYWtlVGVuc29yKHZhbHVlcywgc2hhcGUsIGR0eXBlLCBiYWNrZW5kKSB7XG4gICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdWYWx1ZXMgcGFzc2VkIHRvIGVuZ2luZS5tYWtlVGVuc29yKCkgYXJlIG51bGwnKTtcbiAgICAgICAgfVxuICAgICAgICBkdHlwZSA9IGR0eXBlIHx8ICdmbG9hdDMyJztcbiAgICAgICAgYmFja2VuZCA9IGJhY2tlbmQgfHwgdGhpcy5iYWNrZW5kO1xuICAgICAgICBsZXQgYmFja2VuZFZhbHMgPSB2YWx1ZXM7XG4gICAgICAgIGlmIChkdHlwZSA9PT0gJ3N0cmluZycgJiYgdXRpbC5pc1N0cmluZyh2YWx1ZXNbMF0pKSB7XG4gICAgICAgICAgICBiYWNrZW5kVmFscyA9IHZhbHVlcy5tYXAoZCA9PiB1dGlsLmVuY29kZVN0cmluZyhkKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGF0YUlkID0gYmFja2VuZC53cml0ZShiYWNrZW5kVmFscywgc2hhcGUsIGR0eXBlKTtcbiAgICAgICAgY29uc3QgdCA9IG5ldyBUZW5zb3Ioc2hhcGUsIGR0eXBlLCBkYXRhSWQsIHRoaXMubmV4dFRlbnNvcklkKCkpO1xuICAgICAgICB0aGlzLnRyYWNrVGVuc29yKHQsIGJhY2tlbmQpO1xuICAgICAgICAvLyBDb3VudCBieXRlcyBmb3Igc3RyaW5nIHRlbnNvcnMuXG4gICAgICAgIGlmIChkdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNvbnN0IGluZm8gPSB0aGlzLnN0YXRlLnRlbnNvckluZm8uZ2V0KGRhdGFJZCk7XG4gICAgICAgICAgICBjb25zdCBuZXdCeXRlcyA9IGJ5dGVzRnJvbVN0cmluZ0FycmF5KGJhY2tlbmRWYWxzKTtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUubnVtQnl0ZXMgKz0gbmV3Qnl0ZXMgLSBpbmZvLmJ5dGVzO1xuICAgICAgICAgICAgaW5mby5ieXRlcyA9IG5ld0J5dGVzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnRlcm5hbCBtZXRob2QgdXNlZCBieSBiYWNrZW5kcy4gTWFrZXMgYSBuZXcgdGVuc29yXG4gICAgICogdGhhdCBpcyBhIHdyYXBwZXIgYXJvdW5kIGFuIGV4aXN0aW5nIGRhdGEgaWQuIEl0IGRvZXNuJ3QgY3JlYXRlXG4gICAgICogYSBuZXcgZGF0YSBpZCwgb25seSBpbmNyZW1lbnRzIHRoZSByZWYgY291bnQgdXNlZCBpbiBtZW1vcnkgdHJhY2tpbmcuXG4gICAgICovXG4gICAgbWFrZVRlbnNvckZyb21EYXRhSWQoZGF0YUlkLCBzaGFwZSwgZHR5cGUsIGJhY2tlbmQpIHtcbiAgICAgICAgZHR5cGUgPSBkdHlwZSB8fCAnZmxvYXQzMic7XG4gICAgICAgIGNvbnN0IHQgPSBuZXcgVGVuc29yKHNoYXBlLCBkdHlwZSwgZGF0YUlkLCB0aGlzLm5leHRUZW5zb3JJZCgpKTtcbiAgICAgICAgdGhpcy50cmFja1RlbnNvcih0LCBiYWNrZW5kKTtcbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgfVxuICAgIG1ha2VWYXJpYWJsZShpbml0aWFsVmFsdWUsIHRyYWluYWJsZSA9IHRydWUsIG5hbWUsIGR0eXBlKSB7XG4gICAgICAgIG5hbWUgPSBuYW1lIHx8IHRoaXMubmV4dFZhcmlhYmxlSWQoKS50b1N0cmluZygpO1xuICAgICAgICBpZiAoZHR5cGUgIT0gbnVsbCAmJiBkdHlwZSAhPT0gaW5pdGlhbFZhbHVlLmR0eXBlKSB7XG4gICAgICAgICAgICBpbml0aWFsVmFsdWUgPSBpbml0aWFsVmFsdWUuY2FzdChkdHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdiA9IG5ldyBWYXJpYWJsZShpbml0aWFsVmFsdWUsIHRyYWluYWJsZSwgbmFtZSwgdGhpcy5uZXh0VGVuc29ySWQoKSk7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLnJlZ2lzdGVyZWRWYXJpYWJsZXNbdi5uYW1lXSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFZhcmlhYmxlIHdpdGggbmFtZSAke3YubmFtZX0gd2FzIGFscmVhZHkgcmVnaXN0ZXJlZGApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RhdGUucmVnaXN0ZXJlZFZhcmlhYmxlc1t2Lm5hbWVdID0gdjtcbiAgICAgICAgdGhpcy5pbmNSZWYodiwgdGhpcy5iYWNrZW5kKTtcbiAgICAgICAgcmV0dXJuIHY7XG4gICAgfVxuICAgIHRyYWNrVGVuc29yKGEsIGJhY2tlbmQpIHtcbiAgICAgICAgdGhpcy5zdGF0ZS5udW1UZW5zb3JzKys7XG4gICAgICAgIGlmIChhLmR0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZS5udW1TdHJpbmdUZW5zb3JzKys7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQnl0ZXMgZm9yIGNvbXBsZXggbnVtYmVycyBhcmUgY291bnRlZCBieSB0aGVpciBjb21wb25lbnRzLiBCeXRlcyBmb3JcbiAgICAgICAgLy8gc3RyaW5nIHRlbnNvcnMgYXJlIGNvdW50ZWQgd2hlbiB3cml0aW5nIHZhbHVlcy5cbiAgICAgICAgbGV0IGJ5dGVzID0gMDtcbiAgICAgICAgaWYgKGEuZHR5cGUgIT09ICdjb21wbGV4NjQnICYmIGEuZHR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBieXRlcyA9IGEuc2l6ZSAqIHV0aWwuYnl0ZXNQZXJFbGVtZW50KGEuZHR5cGUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RhdGUubnVtQnl0ZXMgKz0gYnl0ZXM7XG4gICAgICAgIGlmICghdGhpcy5zdGF0ZS50ZW5zb3JJbmZvLmhhcyhhLmRhdGFJZCkpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUubnVtRGF0YUJ1ZmZlcnMrKztcbiAgICAgICAgICAgIHRoaXMuc3RhdGUudGVuc29ySW5mby5zZXQoYS5kYXRhSWQsIHtcbiAgICAgICAgICAgICAgICBiYWNrZW5kOiBiYWNrZW5kIHx8IHRoaXMuYmFja2VuZCxcbiAgICAgICAgICAgICAgICBkdHlwZTogYS5kdHlwZSxcbiAgICAgICAgICAgICAgICBzaGFwZTogYS5zaGFwZSxcbiAgICAgICAgICAgICAgICBieXRlc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEoYSBpbnN0YW5jZW9mIFZhcmlhYmxlKSkge1xuICAgICAgICAgICAgdGhpcy50cmFjayhhKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBUcmFjayB0aGUgdGVuc29yIGJ5IGRhdGFJZCBhbmQgaW5jcmVhc2UgdGhlIHJlZkNvdW50IGZvciB0aGUgZGF0YUlkIGluIHRoZVxuICAgIC8vIGJhY2tlbmQuXG4gICAgLy8gVE9ETyhweXUxMDA1NSk6IFRoaXMgaXMgY3VycmVudGx5IHVzZWQgYnkgbWFrZVZhcmlhYmxlIG1ldGhvZCwgdG8gaW5jcmVhc2VcbiAgICAvLyByZWZDb3VudCBvbiB0aGUgYmFja2VuZCBmb3IgdGhlIGRhdGFJZC4gSXQgY2FuIHBvdGVudGlhbGx5IGJlIHJlcGxhY2VkIHdpdGhcbiAgICAvLyBJZGVudGl0eSBvcCBpbmRlYWQgb2YgY2FsbGluZyBiYWNrZW5kIGRpcmVjdGx5LlxuICAgIGluY1JlZihhLCBiYWNrZW5kKSB7XG4gICAgICAgIHRoaXMudHJhY2tUZW5zb3IoYSwgYmFja2VuZCk7XG4gICAgICAgIHRoaXMuYmFja2VuZC5pbmNSZWYoYS5kYXRhSWQpO1xuICAgIH1cbiAgICByZW1vdmVEYXRhSWQoZGF0YUlkLCBiYWNrZW5kKSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLnRlbnNvckluZm8uaGFzKGRhdGFJZCkgJiZcbiAgICAgICAgICAgIHRoaXMuc3RhdGUudGVuc29ySW5mby5nZXQoZGF0YUlkKS5iYWNrZW5kID09PSBiYWNrZW5kKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlLnRlbnNvckluZm8uZGVsZXRlKGRhdGFJZCk7XG4gICAgICAgICAgICB0aGlzLnN0YXRlLm51bURhdGFCdWZmZXJzLS07XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGlzcG9zZVRlbnNvcihhKSB7XG4gICAgICAgIGlmICghdGhpcy5zdGF0ZS50ZW5zb3JJbmZvLmhhcyhhLmRhdGFJZCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbmZvID0gdGhpcy5zdGF0ZS50ZW5zb3JJbmZvLmdldChhLmRhdGFJZCk7XG4gICAgICAgIHRoaXMuc3RhdGUubnVtVGVuc29ycy0tO1xuICAgICAgICBpZiAoYS5kdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUubnVtU3RyaW5nVGVuc29ycy0tO1xuICAgICAgICAgICAgdGhpcy5zdGF0ZS5udW1CeXRlcyAtPSBpbmZvLmJ5dGVzO1xuICAgICAgICB9XG4gICAgICAgIC8vIERvbid0IGNvdW50IGJ5dGVzIGZvciBjb21wbGV4IG51bWJlcnMgYXMgdGhleSBhcmUgY291bnRlZCBieSB0aGVpclxuICAgICAgICAvLyBjb21wb25lbnRzLlxuICAgICAgICBpZiAoYS5kdHlwZSAhPT0gJ2NvbXBsZXg2NCcgJiYgYS5kdHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNvbnN0IGJ5dGVzID0gYS5zaXplICogdXRpbC5ieXRlc1BlckVsZW1lbnQoYS5kdHlwZSk7XG4gICAgICAgICAgICB0aGlzLnN0YXRlLm51bUJ5dGVzIC09IGJ5dGVzO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlbW92ZSB0aGUgcmVmZXJlbmNlIHRvIGRhdGFJZCBpZiBiYWNrZW5kIGRpc3Bvc2UgdGhlIGRhdGEgc3VjY2Vzc2Z1bGx5XG4gICAgICAgIGlmIChpbmZvLmJhY2tlbmQuZGlzcG9zZURhdGEoYS5kYXRhSWQpKSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZURhdGFJZChhLmRhdGFJZCwgaW5mby5iYWNrZW5kKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUT0RPKG5zdGhvcmF0KTogQ29uc3RydWN0IGFuIGVycm9yIGFuZCBzYXZlIHRoZSBzdGFjayB0cmFjZSBmb3JcbiAgICAgICAgLy8gZGVidWdnaW5nIHdoZW4gaW4gZGVidWcgbW9kZS4gQ3JlYXRpbmcgYSBzdGFjayB0cmFjZSBpcyB0b28gZXhwZW5zaXZlXG4gICAgICAgIC8vIHRvIGRvIHVuY29uZGl0aW9uYWxseS5cbiAgICB9XG4gICAgZGlzcG9zZVZhcmlhYmxlcygpIHtcbiAgICAgICAgZm9yIChjb25zdCB2YXJOYW1lIGluIHRoaXMuc3RhdGUucmVnaXN0ZXJlZFZhcmlhYmxlcykge1xuICAgICAgICAgICAgY29uc3QgdiA9IHRoaXMuc3RhdGUucmVnaXN0ZXJlZFZhcmlhYmxlc1t2YXJOYW1lXTtcbiAgICAgICAgICAgIHRoaXMuZGlzcG9zZVZhcmlhYmxlKHYpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRpc3Bvc2VWYXJpYWJsZSh2KSB7XG4gICAgICAgIHRoaXMuZGlzcG9zZVRlbnNvcih2KTtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUucmVnaXN0ZXJlZFZhcmlhYmxlc1t2Lm5hbWVdICE9IG51bGwpIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnN0YXRlLnJlZ2lzdGVyZWRWYXJpYWJsZXNbdi5uYW1lXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBtZW1vcnkoKSB7XG4gICAgICAgIGNvbnN0IGluZm8gPSB0aGlzLmJhY2tlbmQubWVtb3J5KCk7XG4gICAgICAgIGluZm8ubnVtVGVuc29ycyA9IHRoaXMuc3RhdGUubnVtVGVuc29ycztcbiAgICAgICAgaW5mby5udW1EYXRhQnVmZmVycyA9IHRoaXMuc3RhdGUubnVtRGF0YUJ1ZmZlcnM7XG4gICAgICAgIGluZm8ubnVtQnl0ZXMgPSB0aGlzLnN0YXRlLm51bUJ5dGVzO1xuICAgICAgICBpZiAodGhpcy5zdGF0ZS5udW1TdHJpbmdUZW5zb3JzID4gMCkge1xuICAgICAgICAgICAgaW5mby51bnJlbGlhYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmIChpbmZvLnJlYXNvbnMgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGluZm8ucmVhc29ucyA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW5mby5yZWFzb25zLnB1c2goJ01lbW9yeSB1c2FnZSBieSBzdHJpbmcgdGVuc29ycyBpcyBhcHByb3hpbWF0ZSAnICtcbiAgICAgICAgICAgICAgICAnKDIgYnl0ZXMgcGVyIGNoYXJhY3RlciknKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5mbztcbiAgICB9XG4gICAgYXN5bmMgcHJvZmlsZShxdWVyeSkge1xuICAgICAgICB0aGlzLnN0YXRlLnByb2ZpbGluZyA9IHRydWU7XG4gICAgICAgIGNvbnN0IHN0YXJ0Qnl0ZXMgPSB0aGlzLnN0YXRlLm51bUJ5dGVzO1xuICAgICAgICBjb25zdCBzdGFydE51bVRlbnNvcnMgPSB0aGlzLnN0YXRlLm51bVRlbnNvcnM7XG4gICAgICAgIHRoaXMuc3RhdGUuYWN0aXZlUHJvZmlsZS5rZXJuZWxzID0gW107XG4gICAgICAgIHRoaXMuc3RhdGUuYWN0aXZlUHJvZmlsZS5yZXN1bHQgPSBhd2FpdCBxdWVyeSgpO1xuICAgICAgICB0aGlzLnN0YXRlLnByb2ZpbGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnN0YXRlLmFjdGl2ZVByb2ZpbGUucGVha0J5dGVzID0gTWF0aC5tYXgoLi4udGhpcy5zdGF0ZS5hY3RpdmVQcm9maWxlLmtlcm5lbHMubWFwKGQgPT4gZC50b3RhbEJ5dGVzU25hcHNob3QpKTtcbiAgICAgICAgdGhpcy5zdGF0ZS5hY3RpdmVQcm9maWxlLm5ld0J5dGVzID0gdGhpcy5zdGF0ZS5udW1CeXRlcyAtIHN0YXJ0Qnl0ZXM7XG4gICAgICAgIHRoaXMuc3RhdGUuYWN0aXZlUHJvZmlsZS5uZXdUZW5zb3JzID1cbiAgICAgICAgICAgIHRoaXMuc3RhdGUubnVtVGVuc29ycyAtIHN0YXJ0TnVtVGVuc29ycztcbiAgICAgICAgZm9yIChjb25zdCBrZXJuZWwgb2YgdGhpcy5zdGF0ZS5hY3RpdmVQcm9maWxlLmtlcm5lbHMpIHtcbiAgICAgICAgICAgIGtlcm5lbC5rZXJuZWxUaW1lTXMgPSBhd2FpdCBrZXJuZWwua2VybmVsVGltZU1zO1xuICAgICAgICAgICAga2VybmVsLmV4dHJhSW5mbyA9IGF3YWl0IGtlcm5lbC5leHRyYUluZm87XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUuYWN0aXZlUHJvZmlsZTtcbiAgICB9XG4gICAgaXNUYXBlT24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlLmdyYWRpZW50RGVwdGggPiAwICYmIHRoaXMuc3RhdGUua2VybmVsRGVwdGggPT09IDA7XG4gICAgfVxuICAgIGFkZFRhcGVOb2RlKGtlcm5lbE5hbWUsIGlucHV0cywgb3V0cHV0cywgZ3JhZGllbnRzRnVuYywgc2F2ZWQsIGF0dHJzKSB7XG4gICAgICAgIGNvbnN0IHRhcGVOb2RlID0geyBpZDogdGhpcy5zdGF0ZS5uZXh0VGFwZU5vZGVJZCsrLCBrZXJuZWxOYW1lLCBpbnB1dHMsIG91dHB1dHMsIHNhdmVkIH07XG4gICAgICAgIGNvbnN0IGdyYWRDb25maWcgPSBnZXRHcmFkaWVudChrZXJuZWxOYW1lKTtcbiAgICAgICAgaWYgKGdyYWRDb25maWcgIT0gbnVsbCkge1xuICAgICAgICAgICAgZ3JhZGllbnRzRnVuYyA9IGdyYWRDb25maWcuZ3JhZEZ1bmM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGdyYWRpZW50c0Z1bmMgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGFwZU5vZGUuZ3JhZGllbnQgPSAoZHlzKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gVE9ETyhzbWlsa292KTogVG8gb3B0aW1pemUgYmFjay1wcm9wLCBwYXNzIGR5cyB0aGF0IGFyZSBub3QgdXNlZCBpblxuICAgICAgICAgICAgICAgIC8vIHRoZSBiYWNrcHJvcCBncmFwaCB0byB0aGUgdXNlciBhcyBudWxsIGluc3RlYWQgb2YgemVyb3NcbiAgICAgICAgICAgICAgICBkeXMgPSBkeXMubWFwKChkeSwgaSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZHkgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3V0cHV0ID0gb3V0cHV0c1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHMgPSB1dGlsLm1ha2VaZXJvc1R5cGVkQXJyYXkob3V0cHV0LnNpemUsIG91dHB1dC5kdHlwZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tYWtlVGVuc29yKHZhbHMsIG91dHB1dC5zaGFwZSwgb3V0cHV0LmR0eXBlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZHk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgLy8gR3JhZCBmdW5jdGlvbnMgb2Ygb3BzIHdpdGggc2luZ2xlIG91dHB1dHMgZXhwZWN0IGEgZHksIHdoaWxlIG9wc1xuICAgICAgICAgICAgICAgIC8vIHdpdGggbXVsdGlwbGUgb3V0cHV0cyBleHBlY3QgZHlzIChhcnJheSBvZiBkeSkuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGdyYWRpZW50c0Z1bmMoZHlzLmxlbmd0aCA+IDEgPyBkeXMgOiBkeXNbMF0sIHNhdmVkLCBhdHRycyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RhdGUuYWN0aXZlVGFwZS5wdXNoKHRhcGVOb2RlKTtcbiAgICB9XG4gICAga2VlcChyZXN1bHQpIHtcbiAgICAgICAgcmVzdWx0LmtlcHQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBzdGFydFRhcGUoKSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLmdyYWRpZW50RGVwdGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUuYWN0aXZlVGFwZSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RhdGUuZ3JhZGllbnREZXB0aCsrO1xuICAgIH1cbiAgICBlbmRUYXBlKCkge1xuICAgICAgICB0aGlzLnN0YXRlLmdyYWRpZW50RGVwdGgtLTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3RhcnQgYSBzY29wZS4gVXNlIHRoaXMgd2l0aCBlbmRTY29wZSgpIHRvIGFjaGlldmUgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eVxuICAgICAqIGFzIHNjb3BlKCkgd2l0aG91dCB0aGUgbmVlZCBmb3IgYSBmdW5jdGlvbiBjbG9zdXJlLlxuICAgICAqL1xuICAgIHN0YXJ0U2NvcGUobmFtZSkge1xuICAgICAgICBjb25zdCBzY29wZUluZm8gPSB7XG4gICAgICAgICAgICB0cmFjazogW10sXG4gICAgICAgICAgICBuYW1lOiAndW5uYW1lZCBzY29wZScsXG4gICAgICAgICAgICBpZDogdGhpcy5zdGF0ZS5uZXh0U2NvcGVJZCsrXG4gICAgICAgIH07XG4gICAgICAgIGlmIChuYW1lKSB7XG4gICAgICAgICAgICBzY29wZUluZm8ubmFtZSA9IG5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdGF0ZS5zY29wZVN0YWNrLnB1c2goc2NvcGVJbmZvKTtcbiAgICAgICAgdGhpcy5zdGF0ZS5hY3RpdmVTY29wZSA9IHNjb3BlSW5mbztcbiAgICB9XG4gICAgLyoqXG4gICAgICogRW5kIGEgc2NvcGUuIFVzZSB0aGlzIHdpdGggc3RhcnRTY29wZSgpIHRvIGFjaGlldmUgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eVxuICAgICAqIGFzIHNjb3BlKCkgd2l0aG91dCB0aGUgbmVlZCBmb3IgYSBmdW5jdGlvbiBjbG9zdXJlLlxuICAgICAqL1xuICAgIGVuZFNjb3BlKHJlc3VsdCkge1xuICAgICAgICBjb25zdCB0ZW5zb3JzVG9UcmFja0luUGFyZW50ID0gZ2V0VGVuc29yc0luQ29udGFpbmVyKHJlc3VsdCk7XG4gICAgICAgIGNvbnN0IHRlbnNvcnNUb1RyYWNrSW5QYXJlbnRTZXQgPSBuZXcgU2V0KHRlbnNvcnNUb1RyYWNrSW5QYXJlbnQubWFwKHQgPT4gdC5pZCkpO1xuICAgICAgICAvLyBEaXNwb3NlIHRoZSBhcnJheXMgdHJhY2tlZCBpbiB0aGlzIHNjb3BlLlxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc3RhdGUuYWN0aXZlU2NvcGUudHJhY2subGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHRlbnNvciA9IHRoaXMuc3RhdGUuYWN0aXZlU2NvcGUudHJhY2tbaV07XG4gICAgICAgICAgICBpZiAoIXRlbnNvci5rZXB0ICYmICF0ZW5zb3JzVG9UcmFja0luUGFyZW50U2V0Lmhhcyh0ZW5zb3IuaWQpKSB7XG4gICAgICAgICAgICAgICAgdGVuc29yLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvbGRTY29wZSA9IHRoaXMuc3RhdGUuc2NvcGVTdGFjay5wb3AoKTtcbiAgICAgICAgdGhpcy5zdGF0ZS5hY3RpdmVTY29wZSA9IHRoaXMuc3RhdGUuc2NvcGVTdGFjay5sZW5ndGggPT09IDAgP1xuICAgICAgICAgICAgbnVsbCA6XG4gICAgICAgICAgICB0aGlzLnN0YXRlLnNjb3BlU3RhY2tbdGhpcy5zdGF0ZS5zY29wZVN0YWNrLmxlbmd0aCAtIDFdO1xuICAgICAgICAvLyBUcmFjayB0aGUgY3VycmVudCByZXN1bHQgaW4gdGhlIHBhcmVudCBzY29wZS5cbiAgICAgICAgdGVuc29yc1RvVHJhY2tJblBhcmVudC5mb3JFYWNoKHRlbnNvciA9PiB7XG4gICAgICAgICAgICAvLyBPbmx5IHRyYWNrIHRoZSB0ZW5zb3IgaWYgd2FzIGFsbG9jYXRlZCBpbiB0aGUgaW5uZXIgc2NvcGUgYW5kIGlzIG5vdFxuICAgICAgICAgICAgLy8gZ2xvYmFsbHkga2VwdC5cbiAgICAgICAgICAgIGlmICghdGVuc29yLmtlcHQgJiYgdGVuc29yLnNjb3BlSWQgPT09IG9sZFNjb3BlLmlkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50cmFjayh0ZW5zb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBncmFkaWVudHMgb2YgYGZgIHdpdGggcmVzcGVjdCB0byBlYWNoIG9mIHRoZSBgeHNgLiBUaGUgZ3JhZGllbnRzXG4gICAgICogcmV0dXJuZWQgYXJlIG9mIHRoZSBzYW1lIGxlbmd0aCBhcyBgeHNgLCBidXQgc29tZSBtaWdodCBiZSBudWxsIGlmIGBmYFxuICAgICAqIHdhcyBub3QgYSBmdW5jdGlvbiBvZiB0aGF0IGB4YC4gSXQgYWxzbyB0YWtlcyBvcHRpb25hbCBkeSB0byBtdWx0aXBseSB0aGVcbiAgICAgKiBncmFkaWVudCwgd2hpY2ggZGVmYXVsdHMgdG8gYDFgLlxuICAgICAqL1xuICAgIGdyYWRpZW50cyhmLCB4cywgZHksIGFsbG93Tm9HcmFkaWVudHMgPSBmYWxzZSkge1xuICAgICAgICB1dGlsLmFzc2VydCh4cy5sZW5ndGggPiAwLCAoKSA9PiAnZ3JhZGllbnRzKCkgcmVjZWl2ZWQgYW4gZW1wdHkgbGlzdCBvZiB4cy4nKTtcbiAgICAgICAgaWYgKGR5ICE9IG51bGwgJiYgZHkuZHR5cGUgIT09ICdmbG9hdDMyJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBkeSBtdXN0IGhhdmUgJ2Zsb2F0MzInIGR0eXBlLCBidXQgaGFzICcke2R5LmR0eXBlfSdgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB5ID0gdGhpcy5zY29wZWRSdW4oKCkgPT4gdGhpcy5zdGFydFRhcGUoKSwgKCkgPT4gdGhpcy5lbmRUYXBlKCksICgpID0+IHRoaXMudGlkeSgnZm9yd2FyZCcsIGYpKTtcbiAgICAgICAgdXRpbC5hc3NlcnQoeSBpbnN0YW5jZW9mIFRlbnNvciwgKCkgPT4gJ1RoZSByZXN1bHQgeSByZXR1cm5lZCBieSBmKCkgbXVzdCBiZSBhIHRlbnNvci4nKTtcbiAgICAgICAgLy8gRmlsdGVyIG91dCB0aGUgbm9kZXMgdGhhdCBkb24ndCBjb25uZWN0IHggPT4geS5cbiAgICAgICAgY29uc3QgZmlsdGVyZWRUYXBlID0gZ2V0RmlsdGVyZWROb2Rlc1hUb1kodGhpcy5zdGF0ZS5hY3RpdmVUYXBlLCB4cywgeSk7XG4gICAgICAgIGlmICghYWxsb3dOb0dyYWRpZW50cyAmJiBmaWx0ZXJlZFRhcGUubGVuZ3RoID09PSAwICYmIHhzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNvbXB1dGUgZ3JhZGllbnQgb2YgeT1mKHgpIHdpdGggcmVzcGVjdCB0byB4LiBNYWtlIHN1cmUgJyArXG4gICAgICAgICAgICAgICAgJ3RoYXQgdGhlIGYgeW91IHBhc3NlZCBlbmNsb3NlcyBhbGwgb3BlcmF0aW9ucyB0aGF0IGxlYWQgZnJvbSB4ICcgK1xuICAgICAgICAgICAgICAgICd0byB5LicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnRpZHkoJ2JhY2t3YXJkJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYWNjdW11bGF0ZWRHcmFkaWVudE1hcCA9IHt9O1xuICAgICAgICAgICAgYWNjdW11bGF0ZWRHcmFkaWVudE1hcFt5LmlkXSA9IChkeSA9PSBudWxsKSA/IG9uZXMoeS5zaGFwZSkgOiBkeTtcbiAgICAgICAgICAgIC8vIEJhY2twcm9wIGdyYWRpZW50cyB0aHJvdWdoIHRoZSBmaWx0ZXJlZCBub2Rlcy5cbiAgICAgICAgICAgIGJhY2twcm9wYWdhdGVHcmFkaWVudHMoYWNjdW11bGF0ZWRHcmFkaWVudE1hcCwgZmlsdGVyZWRUYXBlLCBcbiAgICAgICAgICAgIC8vIFBhc3MgdGhlIHRpZHkgZnVuY3Rpb24gdG8gYXZvaWQgY2lyY3VsYXIgZGVwIHdpdGggYHRhcGUudHNgLlxuICAgICAgICAgICAgZiA9PiB0aGlzLnRpZHkoZiksIFxuICAgICAgICAgICAgLy8gUGFzcyBhbiBhZGQgZnVuY3Rpb24gdG8gYXZvaWRlIGEgY2lyY3VsYXIgZGVwIHdpdGggYHRhcGUudHNgLlxuICAgICAgICAgICAgYWRkKTtcbiAgICAgICAgICAgIGNvbnN0IGdyYWRzID0geHMubWFwKHggPT4gYWNjdW11bGF0ZWRHcmFkaWVudE1hcFt4LmlkXSk7XG4gICAgICAgICAgICBpZiAodGhpcy5zdGF0ZS5ncmFkaWVudERlcHRoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBtZWFucyB0aGF0IHdlIGFyZSBub3QgY29tcHV0aW5nIGhpZ2hlci1vcmRlciBncmFkaWVudHNcbiAgICAgICAgICAgICAgICAvLyBhbmQgY2FuIGNsZWFuIHVwIHRoZSB0YXBlLlxuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUuYWN0aXZlVGFwZS5mb3JFYWNoKG5vZGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHRlbnNvciBvZiBub2RlLnNhdmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZW5zb3IuZGlzcG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZS5hY3RpdmVUYXBlID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB5LCBncmFkcyB9O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgY3VzdG9tR3JhZChmKSB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KHV0aWwuaXNGdW5jdGlvbihmKSwgKCkgPT4gJ1RoZSBmIHBhc3NlZCBpbiBjdXN0b21HcmFkKGYpIG11c3QgYmUgYSBmdW5jdGlvbi4nKTtcbiAgICAgICAgcmV0dXJuICguLi5pbnB1dHMpID0+IHtcbiAgICAgICAgICAgIHV0aWwuYXNzZXJ0KGlucHV0cy5ldmVyeSh0ID0+IHQgaW5zdGFuY2VvZiBUZW5zb3IpLCAoKSA9PiAnVGhlIGFyZ3MgcGFzc2VkIGluIGN1c3RvbUdyYWQoZikoeDEsIHgyLC4uLikgbXVzdCBhbGwgYmUgJyArXG4gICAgICAgICAgICAgICAgJ3RlbnNvcnMnKTtcbiAgICAgICAgICAgIGxldCByZXM7XG4gICAgICAgICAgICBjb25zdCBpbnB1dE1hcCA9IHt9O1xuICAgICAgICAgICAgaW5wdXRzLmZvckVhY2goKGlucHV0LCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgaW5wdXRNYXBbaV0gPSBpbnB1dDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgZm9yd2FyZEZ1bmMgPSAoXywgc2F2ZSkgPT4ge1xuICAgICAgICAgICAgICAgIHJlcyA9IGYoLi4uWy4uLmlucHV0cywgc2F2ZV0pO1xuICAgICAgICAgICAgICAgIHV0aWwuYXNzZXJ0KHJlcy52YWx1ZSBpbnN0YW5jZW9mIFRlbnNvciwgKCkgPT4gJ1RoZSBmdW5jdGlvbiBmIHBhc3NlZCBpbiBjdXN0b21HcmFkKGYpIG11c3QgcmV0dXJuIGFuICcgK1xuICAgICAgICAgICAgICAgICAgICAnb2JqZWN0IHdoZXJlIGBvYmoudmFsdWVgIGlzIGEgdGVuc29yJyk7XG4gICAgICAgICAgICAgICAgdXRpbC5hc3NlcnQodXRpbC5pc0Z1bmN0aW9uKHJlcy5ncmFkRnVuYyksICgpID0+ICdUaGUgZnVuY3Rpb24gZiBwYXNzZWQgaW4gY3VzdG9tR3JhZChmKSBtdXN0IHJldHVybiBhbiAnICtcbiAgICAgICAgICAgICAgICAgICAgJ29iamVjdCB3aGVyZSBgb2JqLmdyYWRGdW5jYCBpcyBhIGZ1bmN0aW9uLicpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXMudmFsdWU7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgYmFja3dhcmRzRnVuYyA9IChkeSwgc2F2ZWQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBncmFkUmVzID0gcmVzLmdyYWRGdW5jKGR5LCBzYXZlZCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZ3JhZHMgPSBBcnJheS5pc0FycmF5KGdyYWRSZXMpID8gZ3JhZFJlcyA6IFtncmFkUmVzXTtcbiAgICAgICAgICAgICAgICB1dGlsLmFzc2VydChncmFkcy5sZW5ndGggPT09IGlucHV0cy5sZW5ndGgsICgpID0+ICdUaGUgZnVuY3Rpb24gZiBwYXNzZWQgaW4gY3VzdG9tR3JhZChmKSBtdXN0IHJldHVybiBhbiAnICtcbiAgICAgICAgICAgICAgICAgICAgJ29iamVjdCB3aGVyZSBgb2JqLmdyYWRGdW5jYCBpcyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyAnICtcbiAgICAgICAgICAgICAgICAgICAgJ3RoZSBzYW1lIG51bWJlciBvZiB0ZW5zb3JzIGFzIGlucHV0cyBwYXNzZWQgdG8gZiguLi4pLicpO1xuICAgICAgICAgICAgICAgIHV0aWwuYXNzZXJ0KGdyYWRzLmV2ZXJ5KHQgPT4gdCBpbnN0YW5jZW9mIFRlbnNvciksICgpID0+ICdUaGUgZnVuY3Rpb24gZiBwYXNzZWQgaW4gY3VzdG9tR3JhZChmKSBtdXN0IHJldHVybiBhbiAnICtcbiAgICAgICAgICAgICAgICAgICAgJ29iamVjdCB3aGVyZSBgb2JqLmdyYWRGdW5jYCBpcyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyAnICtcbiAgICAgICAgICAgICAgICAgICAgJ2EgbGlzdCBvZiBvbmx5IHRlbnNvcnMuJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgZ3JhZE1hcCA9IHt9O1xuICAgICAgICAgICAgICAgIGdyYWRzLmZvckVhY2goKGdyYWQsIGkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZ3JhZE1hcFtpXSA9ICgpID0+IGdyYWQ7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdyYWRNYXA7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucnVuS2VybmVsRnVuYyh7XG4gICAgICAgICAgICAgICAgZm9yd2FyZEZ1bmMsXG4gICAgICAgICAgICAgICAgYmFja3dhcmRzRnVuYyxcbiAgICAgICAgICAgICAgICBpbnB1dHM6IGlucHV0TWFwLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIHJlYWRTeW5jKGRhdGFJZCkge1xuICAgICAgICAvLyBSb3V0ZSB0aGUgcmVhZCB0byB0aGUgY29ycmVjdCBiYWNrZW5kLlxuICAgICAgICBjb25zdCBpbmZvID0gdGhpcy5zdGF0ZS50ZW5zb3JJbmZvLmdldChkYXRhSWQpO1xuICAgICAgICByZXR1cm4gaW5mby5iYWNrZW5kLnJlYWRTeW5jKGRhdGFJZCk7XG4gICAgfVxuICAgIHJlYWQoZGF0YUlkKSB7XG4gICAgICAgIC8vIFJvdXRlIHRoZSByZWFkIHRvIHRoZSBjb3JyZWN0IGJhY2tlbmQuXG4gICAgICAgIGNvbnN0IGluZm8gPSB0aGlzLnN0YXRlLnRlbnNvckluZm8uZ2V0KGRhdGFJZCk7XG4gICAgICAgIHJldHVybiBpbmZvLmJhY2tlbmQucmVhZChkYXRhSWQpO1xuICAgIH1cbiAgICBhc3luYyB0aW1lKHF1ZXJ5KSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gbm93KCk7XG4gICAgICAgIGNvbnN0IHRpbWluZ0luZm8gPSBhd2FpdCB0aGlzLmJhY2tlbmQudGltZShxdWVyeSk7XG4gICAgICAgIHRpbWluZ0luZm8ud2FsbE1zID0gbm93KCkgLSBzdGFydDtcbiAgICAgICAgcmV0dXJuIHRpbWluZ0luZm87XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRyYWNrcyBhIFRlbnNvciBpbiB0aGUgY3VycmVudCBzY29wZSB0byBiZSBhdXRvbWF0aWNhbGx5IGNsZWFuZWQgdXBcbiAgICAgKiB3aGVuIHRoZSBjdXJyZW50IHNjb3BlIGVuZHMsIGFuZCByZXR1cm5zIHRoZSB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZXN1bHQgVGhlIFRlbnNvciB0byB0cmFjayBpbiB0aGUgY3VycmVudCBzY29wZS5cbiAgICAgKi9cbiAgICB0cmFjayhyZXN1bHQpIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUuYWN0aXZlU2NvcGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmVzdWx0LnNjb3BlSWQgPSB0aGlzLnN0YXRlLmFjdGl2ZVNjb3BlLmlkO1xuICAgICAgICAgICAgdGhpcy5zdGF0ZS5hY3RpdmVTY29wZS50cmFjay5wdXNoKHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgZ2V0IHJlZ2lzdGVyZWRWYXJpYWJsZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlLnJlZ2lzdGVyZWRWYXJpYWJsZXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlc2V0cyB0aGUgZW5naW5lIHN0YXRlLiBSZW1vdmVzIGFsbCBiYWNrZW5kcyBidXQgZG9lcyBub3QgcmVtb3ZlXG4gICAgICogcmVnaXN0ZXJlZCBiYWNrZW5kIGZhY3Rvcmllcy5cbiAgICAgKi9cbiAgICByZXNldCgpIHtcbiAgICAgICAgLy8gTWFrZSBhbnkgcGVuZGluZyBwcm9taXNlIG9ic29sZXRlLlxuICAgICAgICB0aGlzLnBlbmRpbmdCYWNrZW5kSW5pdElkKys7XG4gICAgICAgIHRoaXMuc3RhdGUuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLkVOVi5yZXNldCgpO1xuICAgICAgICB0aGlzLnN0YXRlID0gbmV3IEVuZ2luZVN0YXRlKCk7XG4gICAgICAgIGZvciAoY29uc3QgYmFja2VuZE5hbWUgaW4gdGhpcy5yZWdpc3RyeSkge1xuICAgICAgICAgICAgdGhpcy5kaXNwb3NlUmVnaXN0ZXJlZEtlcm5lbHMoYmFja2VuZE5hbWUpO1xuICAgICAgICAgICAgdGhpcy5yZWdpc3RyeVtiYWNrZW5kTmFtZV0uZGlzcG9zZSgpO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMucmVnaXN0cnlbYmFja2VuZE5hbWVdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYmFja2VuZE5hbWUgPSBudWxsO1xuICAgICAgICB0aGlzLmJhY2tlbmRJbnN0YW5jZSA9IG51bGw7XG4gICAgICAgIHRoaXMucGVuZGluZ0JhY2tlbmRJbml0ID0gbnVsbDtcbiAgICB9XG59XG5FbmdpbmUubmV4dFRlbnNvcklkID0gMDtcbkVuZ2luZS5uZXh0VmFyaWFibGVJZCA9IDA7XG5mdW5jdGlvbiBvbmVzKHNoYXBlKSB7XG4gICAgY29uc3QgdmFsdWVzID0gbWFrZU9uZXNUeXBlZEFycmF5KHNpemVGcm9tU2hhcGUoc2hhcGUpLCAnZmxvYXQzMicpO1xuICAgIHJldHVybiBFTkdJTkUubWFrZVRlbnNvcih2YWx1ZXMsIHNoYXBlLCAnZmxvYXQzMicpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldE9yTWFrZUVuZ2luZSgpIHtcbiAgICBjb25zdCBucyA9IGdldEdsb2JhbE5hbWVzcGFjZSgpO1xuICAgIGlmIChucy5fdGZlbmdpbmUgPT0gbnVsbCkge1xuICAgICAgICBjb25zdCBlbnZpcm9ubWVudCA9IG5ldyBFbnZpcm9ubWVudChucyk7XG4gICAgICAgIG5zLl90ZmVuZ2luZSA9IG5ldyBFbmdpbmUoZW52aXJvbm1lbnQpO1xuICAgIH1cbiAgICBzZXRFbnZpcm9ubWVudEdsb2JhbChucy5fdGZlbmdpbmUuRU5WKTtcbiAgICAvLyBUZWxsIHRoZSBjdXJyZW50IHRlbnNvciBpbnRlcmZhY2UgdGhhdCB0aGUgZ2xvYmFsIGVuZ2luZSBpcyByZXNwb25zaWJsZVxuICAgIC8vIGZvciB0cmFja2luZy5cbiAgICBzZXRUZW5zb3JUcmFja2VyKCgpID0+IG5zLl90ZmVuZ2luZSk7XG4gICAgcmV0dXJuIG5zLl90ZmVuZ2luZTtcbn1cbmV4cG9ydCBjb25zdCBFTkdJTkUgPSBnZXRPck1ha2VFbmdpbmUoKTtcbi8qKlxuICogQSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgYWRkIG9wIGZvciB1c2Ugd2l0aGluIGVuZ2luZSBhbmQgdGFwZS5cbiAqXG4gKiBUaGlzIGFsbG93cyB1cyB0byBhdm9pZCBhIGNpcmN1bGFyIGRlcGVuZGVuY3kgYmV0d2VlbiBhZGQudHMgYW5kIGVuZ2luZS5cbiAqIEl0IGlzIGV4cG9ydGVkIHRvIGJlIGF2YWlsYWJsZSBpbiB0YXBlIHRlc3RzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkKGEsIGIpIHtcbiAgICAvLyBXZSBkdXBsaWNhdGUgQWRkIGhlcmUgdG8gYXZvaWQgYSBjaXJjdWxhciBkZXBlbmRlbmN5IHdpdGggYWRkLnRzLlxuICAgIGNvbnN0IGlucHV0cyA9IHsgYSwgYiB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEFkZCwgaW5wdXRzKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWVuZ2luZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBpc1Byb21pc2UgfSBmcm9tICcuL3V0aWxfYmFzZSc7XG4vLyBFeHBlY3RzIGZsYWdzIGZyb20gVVJMIGluIHRoZSBmb3JtYXQgP3RmanNmbGFncz1GTEFHMToxLEZMQUcyOnRydWUuXG5jb25zdCBURU5TT1JGTE9XSlNfRkxBR1NfUFJFRklYID0gJ3RmanNmbGFncyc7XG4vKipcbiAqIFRoZSBlbnZpcm9ubWVudCBjb250YWlucyBldmFsdWF0ZWQgZmxhZ3MgYXMgd2VsbCBhcyB0aGUgcmVnaXN0ZXJlZCBwbGF0Zm9ybS5cbiAqIFRoaXMgaXMgYWx3YXlzIHVzZWQgYXMgYSBnbG9iYWwgc2luZ2xldG9uIGFuZCBjYW4gYmUgcmV0cmlldmVkIHdpdGhcbiAqIGB0Zi5lbnYoKWAuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ0Vudmlyb25tZW50J31cbiAqL1xuZXhwb3J0IGNsYXNzIEVudmlyb25tZW50IHtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWFueVxuICAgIGNvbnN0cnVjdG9yKGdsb2JhbCkge1xuICAgICAgICB0aGlzLmdsb2JhbCA9IGdsb2JhbDtcbiAgICAgICAgdGhpcy5mbGFncyA9IHt9O1xuICAgICAgICB0aGlzLmZsYWdSZWdpc3RyeSA9IHt9O1xuICAgICAgICB0aGlzLnVybEZsYWdzID0ge307XG4gICAgICAgIC8vIEphc21pbmUgc3BpZXMgb24gdGhpcyBpbiAnZW52aXJvbm1lbnRfdGVzdC50cydcbiAgICAgICAgdGhpcy5nZXRRdWVyeVBhcmFtcyA9IGdldFF1ZXJ5UGFyYW1zO1xuICAgICAgICB0aGlzLnBvcHVsYXRlVVJMRmxhZ3MoKTtcbiAgICB9XG4gICAgc2V0UGxhdGZvcm0ocGxhdGZvcm1OYW1lLCBwbGF0Zm9ybSkge1xuICAgICAgICBpZiAodGhpcy5wbGF0Zm9ybSAhPSBudWxsKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYFBsYXRmb3JtICR7dGhpcy5wbGF0Zm9ybU5hbWV9IGhhcyBhbHJlYWR5IGJlZW4gc2V0LiBgICtcbiAgICAgICAgICAgICAgICBgT3ZlcndyaXRpbmcgdGhlIHBsYXRmb3JtIHdpdGggJHtwbGF0Zm9ybX0uYCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wbGF0Zm9ybU5hbWUgPSBwbGF0Zm9ybU5hbWU7XG4gICAgICAgIHRoaXMucGxhdGZvcm0gPSBwbGF0Zm9ybTtcbiAgICB9XG4gICAgcmVnaXN0ZXJGbGFnKGZsYWdOYW1lLCBldmFsdWF0aW9uRm4sIHNldEhvb2spIHtcbiAgICAgICAgdGhpcy5mbGFnUmVnaXN0cnlbZmxhZ05hbWVdID0geyBldmFsdWF0aW9uRm4sIHNldEhvb2sgfTtcbiAgICAgICAgLy8gT3ZlcnJpZGUgdGhlIGZsYWcgdmFsdWUgZnJvbSB0aGUgVVJMLiBUaGlzIGhhcyB0byBoYXBwZW4gaGVyZSBiZWNhdXNlIHRoZVxuICAgICAgICAvLyBlbnZpcm9ubWVudCBpcyBpbml0aWFsaXplZCBiZWZvcmUgZmxhZ3MgZ2V0IHJlZ2lzdGVyZWQuXG4gICAgICAgIGlmICh0aGlzLnVybEZsYWdzW2ZsYWdOYW1lXSAhPSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBmbGFnVmFsdWUgPSB0aGlzLnVybEZsYWdzW2ZsYWdOYW1lXTtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgU2V0dGluZyBmZWF0dXJlIG92ZXJyaWRlIGZyb20gVVJMICR7ZmxhZ05hbWV9OiAke2ZsYWdWYWx1ZX0uYCk7XG4gICAgICAgICAgICB0aGlzLnNldChmbGFnTmFtZSwgZmxhZ1ZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBnZXRBc3luYyhmbGFnTmFtZSkge1xuICAgICAgICBpZiAoZmxhZ05hbWUgaW4gdGhpcy5mbGFncykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmxhZ3NbZmxhZ05hbWVdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmxhZ3NbZmxhZ05hbWVdID0gYXdhaXQgdGhpcy5ldmFsdWF0ZUZsYWcoZmxhZ05hbWUpO1xuICAgICAgICByZXR1cm4gdGhpcy5mbGFnc1tmbGFnTmFtZV07XG4gICAgfVxuICAgIGdldChmbGFnTmFtZSkge1xuICAgICAgICBpZiAoZmxhZ05hbWUgaW4gdGhpcy5mbGFncykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmxhZ3NbZmxhZ05hbWVdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZsYWdWYWx1ZSA9IHRoaXMuZXZhbHVhdGVGbGFnKGZsYWdOYW1lKTtcbiAgICAgICAgaWYgKGlzUHJvbWlzZShmbGFnVmFsdWUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZsYWcgJHtmbGFnTmFtZX0gY2Fubm90IGJlIHN5bmNocm9ub3VzbHkgZXZhbHVhdGVkLiBgICtcbiAgICAgICAgICAgICAgICBgUGxlYXNlIHVzZSBnZXRBc3luYygpIGluc3RlYWQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5mbGFnc1tmbGFnTmFtZV0gPSBmbGFnVmFsdWU7XG4gICAgICAgIHJldHVybiB0aGlzLmZsYWdzW2ZsYWdOYW1lXTtcbiAgICB9XG4gICAgZ2V0TnVtYmVyKGZsYWdOYW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldChmbGFnTmFtZSk7XG4gICAgfVxuICAgIGdldEJvb2woZmxhZ05hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0KGZsYWdOYW1lKTtcbiAgICB9XG4gICAgZ2V0RmxhZ3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZsYWdzO1xuICAgIH1cbiAgICAvLyBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuXG4gICAgZ2V0IGZlYXR1cmVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mbGFncztcbiAgICB9XG4gICAgc2V0KGZsYWdOYW1lLCB2YWx1ZSkge1xuICAgICAgICBpZiAodGhpcy5mbGFnUmVnaXN0cnlbZmxhZ05hbWVdID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHNldCBmbGFnICR7ZmxhZ05hbWV9IGFzIGl0IGhhcyBub3QgYmVlbiByZWdpc3RlcmVkLmApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmxhZ3NbZmxhZ05hbWVdID0gdmFsdWU7XG4gICAgICAgIGlmICh0aGlzLmZsYWdSZWdpc3RyeVtmbGFnTmFtZV0uc2V0SG9vayAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmZsYWdSZWdpc3RyeVtmbGFnTmFtZV0uc2V0SG9vayh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZXZhbHVhdGVGbGFnKGZsYWdOYW1lKSB7XG4gICAgICAgIGlmICh0aGlzLmZsYWdSZWdpc3RyeVtmbGFnTmFtZV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZXZhbHVhdGUgZmxhZyAnJHtmbGFnTmFtZX0nOiBubyBldmFsdWF0aW9uIGZ1bmN0aW9uIGZvdW5kLmApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmZsYWdSZWdpc3RyeVtmbGFnTmFtZV0uZXZhbHVhdGlvbkZuKCk7XG4gICAgfVxuICAgIHNldEZsYWdzKGZsYWdzKSB7XG4gICAgICAgIHRoaXMuZmxhZ3MgPSBPYmplY3QuYXNzaWduKHt9LCBmbGFncyk7XG4gICAgfVxuICAgIHJlc2V0KCkge1xuICAgICAgICB0aGlzLmZsYWdzID0ge307XG4gICAgICAgIHRoaXMudXJsRmxhZ3MgPSB7fTtcbiAgICAgICAgdGhpcy5wb3B1bGF0ZVVSTEZsYWdzKCk7XG4gICAgfVxuICAgIHBvcHVsYXRlVVJMRmxhZ3MoKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5nbG9iYWwgPT09ICd1bmRlZmluZWQnIHx8XG4gICAgICAgICAgICB0eXBlb2YgdGhpcy5nbG9iYWwubG9jYXRpb24gPT09ICd1bmRlZmluZWQnIHx8XG4gICAgICAgICAgICB0eXBlb2YgdGhpcy5nbG9iYWwubG9jYXRpb24uc2VhcmNoID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVybFBhcmFtcyA9IHRoaXMuZ2V0UXVlcnlQYXJhbXModGhpcy5nbG9iYWwubG9jYXRpb24uc2VhcmNoKTtcbiAgICAgICAgaWYgKFRFTlNPUkZMT1dKU19GTEFHU19QUkVGSVggaW4gdXJsUGFyYW1zKSB7XG4gICAgICAgICAgICBjb25zdCBrZXlWYWx1ZXMgPSB1cmxQYXJhbXNbVEVOU09SRkxPV0pTX0ZMQUdTX1BSRUZJWF0uc3BsaXQoJywnKTtcbiAgICAgICAgICAgIGtleVZhbHVlcy5mb3JFYWNoKGtleVZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBba2V5LCB2YWx1ZV0gPSBrZXlWYWx1ZS5zcGxpdCgnOicpO1xuICAgICAgICAgICAgICAgIHRoaXMudXJsRmxhZ3Nba2V5XSA9IHBhcnNlVmFsdWUoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRRdWVyeVBhcmFtcyhxdWVyeVN0cmluZykge1xuICAgIGNvbnN0IHBhcmFtcyA9IHt9O1xuICAgIHF1ZXJ5U3RyaW5nLnJlcGxhY2UoL1s/Jl0oW149PyZdKykoPzo9KFteJl0qKSk/L2csIChzLCAuLi50KSA9PiB7XG4gICAgICAgIGRlY29kZVBhcmFtKHBhcmFtcywgdFswXSwgdFsxXSk7XG4gICAgICAgIHJldHVybiB0LmpvaW4oJz0nKTtcbiAgICB9KTtcbiAgICByZXR1cm4gcGFyYW1zO1xufVxuZnVuY3Rpb24gZGVjb2RlUGFyYW0ocGFyYW1zLCBuYW1lLCB2YWx1ZSkge1xuICAgIHBhcmFtc1tkZWNvZGVVUklDb21wb25lbnQobmFtZSldID0gZGVjb2RlVVJJQ29tcG9uZW50KHZhbHVlIHx8ICcnKTtcbn1cbmZ1bmN0aW9uIHBhcnNlVmFsdWUoZmxhZ05hbWUsIHZhbHVlKSB7XG4gICAgdmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmICh2YWx1ZSA9PT0gJ3RydWUnIHx8IHZhbHVlID09PSAnZmFsc2UnKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gJ3RydWUnO1xuICAgIH1cbiAgICBlbHNlIGlmIChgJHsrdmFsdWV9YCA9PT0gdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuICt2YWx1ZTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgcGFyc2UgdmFsdWUgZmxhZyB2YWx1ZSAke3ZhbHVlfSBmb3IgZmxhZyAke2ZsYWdOYW1lfS5gKTtcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgY3VycmVudCBlbnZpcm9ubWVudCAoYSBnbG9iYWwgc2luZ2xldG9uKS5cbiAqXG4gKiBUaGUgZW52aXJvbm1lbnQgb2JqZWN0IGNvbnRhaW5zIHRoZSBldmFsdWF0ZWQgZmVhdHVyZSB2YWx1ZXMgYXMgd2VsbCBhcyB0aGVcbiAqIGFjdGl2ZSBwbGF0Zm9ybS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnRW52aXJvbm1lbnQnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZW52KCkge1xuICAgIHJldHVybiBFTlY7XG59XG5leHBvcnQgbGV0IEVOViA9IG51bGw7XG5leHBvcnQgZnVuY3Rpb24gc2V0RW52aXJvbm1lbnRHbG9iYWwoZW52aXJvbm1lbnQpIHtcbiAgICBFTlYgPSBlbnZpcm9ubWVudDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWVudmlyb25tZW50LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCAnLi9lbmdpbmUnO1xuaW1wb3J0ICogYXMgZGV2aWNlX3V0aWwgZnJvbSAnLi9kZXZpY2VfdXRpbCc7XG5pbXBvcnQgeyBlbnYgfSBmcm9tICcuL2Vudmlyb25tZW50JztcbmNvbnN0IEVOViA9IGVudigpO1xuLyoqXG4gKiBUaGlzIGZpbGUgY29udGFpbnMgZW52aXJvbm1lbnQtcmVsYXRlZCBmbGFnIHJlZ2lzdHJhdGlvbnMuXG4gKi9cbi8qKiBXaGV0aGVyIHRvIGVuYWJsZSBkZWJ1ZyBtb2RlLiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnREVCVUcnLCAoKSA9PiBmYWxzZSwgZGVidWdWYWx1ZSA9PiB7XG4gICAgaWYgKGRlYnVnVmFsdWUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdEZWJ1Z2dpbmcgbW9kZSBpcyBPTi4gVGhlIG91dHB1dCBvZiBldmVyeSBtYXRoIGNhbGwgd2lsbCAnICtcbiAgICAgICAgICAgICdiZSBkb3dubG9hZGVkIHRvIENQVSBhbmQgY2hlY2tlZCBmb3IgTmFOcy4gJyArXG4gICAgICAgICAgICAnVGhpcyBzaWduaWZpY2FudGx5IGltcGFjdHMgcGVyZm9ybWFuY2UuJyk7XG4gICAgfVxufSk7XG4vKiogV2hldGhlciB3ZSBhcmUgaW4gYSBicm93c2VyIChhcyB2ZXJzdXMsIHNheSwgbm9kZS5qcykgZW52aXJvbm1lbnQuICovXG5FTlYucmVnaXN0ZXJGbGFnKCdJU19CUk9XU0VSJywgKCkgPT4gZGV2aWNlX3V0aWwuaXNCcm93c2VyKCkpO1xuLyoqIFdoZXRoZXIgd2UgYXJlIGluIGEgYnJvd3NlciAoYXMgdmVyc3VzLCBzYXksIG5vZGUuanMpIGVudmlyb25tZW50LiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnSVNfTk9ERScsICgpID0+ICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcpICYmXG4gICAgKHR5cGVvZiBwcm9jZXNzLnZlcnNpb25zICE9PSAndW5kZWZpbmVkJykgJiZcbiAgICAodHlwZW9mIHByb2Nlc3MudmVyc2lvbnMubm9kZSAhPT0gJ3VuZGVmaW5lZCcpKTtcbi8qKiBXaGV0aGVyIHRoaXMgYnJvd3NlciBpcyBDaHJvbWUuICovXG5FTlYucmVnaXN0ZXJGbGFnKCdJU19DSFJPTUUnLCAoKSA9PiB0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiBuYXZpZ2F0b3IgIT0gbnVsbCAmJlxuICAgIG5hdmlnYXRvci51c2VyQWdlbnQgIT0gbnVsbCAmJiAvQ2hyb21lLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpICYmXG4gICAgL0dvb2dsZSBJbmMvLnRlc3QobmF2aWdhdG9yLnZlbmRvcikpO1xuLyoqXG4gKiBUcnVlIHdoZW4gdGhlIGVudmlyb25tZW50IGlzIFwicHJvZHVjdGlvblwiIHdoZXJlIHdlIGRpc2FibGUgc2FmZXR5IGNoZWNrc1xuICogdG8gZ2FpbiBwZXJmb3JtYW5jZS5cbiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnUFJPRCcsICgpID0+IGZhbHNlKTtcbi8qKlxuICogV2hldGhlciB0byBkbyBzYW5pdHkgY2hlY2tzIHdoZW4gaW5mZXJyaW5nIGEgc2hhcGUgZnJvbSB1c2VyLXByb3ZpZGVkXG4gKiB2YWx1ZXMsIHVzZWQgd2hlbiBjcmVhdGluZyBhIG5ldyB0ZW5zb3IuXG4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ1RFTlNPUkxJS0VfQ0hFQ0tfU0hBUEVfQ09OU0lTVEVOQ1knLCAoKSA9PiBFTlYuZ2V0Qm9vbCgnREVCVUcnKSk7XG4vKiogV2hldGhlciBkZXByZWNhdGlvbiB3YXJuaW5ncyBhcmUgZW5hYmxlZC4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ0RFUFJFQ0FUSU9OX1dBUk5JTkdTX0VOQUJMRUQnLCAoKSA9PiB0cnVlKTtcbi8qKiBUcnVlIGlmIHJ1bm5pbmcgdW5pdCB0ZXN0cy4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ0lTX1RFU1QnLCAoKSA9PiBmYWxzZSk7XG4vKiogV2hldGhlciB0byBjaGVjayBjb21wdXRhdGlvbiByZXN1bHQgZm9yIGVycm9ycy4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ0NIRUNLX0NPTVBVVEFUSU9OX0ZPUl9FUlJPUlMnLCAoKSA9PiB0cnVlKTtcbi8qKiBXaGV0aGVyIHRoZSBiYWNrZW5kIG5lZWRzIHRvIHdyYXAgaW5wdXQgdG8gaW1hZ2VCaXRtYXAuICovXG5FTlYucmVnaXN0ZXJGbGFnKCdXUkFQX1RPX0lNQUdFQklUTUFQJywgKCkgPT4gZmFsc2UpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZmxhZ3MuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuLy8gTm90ZSB0aGF0IHRoZSBpZGVudGlmaWVyIGdsb2JhbE5hbWVTcGFjZSBpcyBzY29wZWQgdG8gdGhpcyBtb2R1bGUsIGJ1dCB3aWxsXG4vLyBhbHdheXMgcmVzb2x2ZSB0byB0aGUgc2FtZSBnbG9iYWwgb2JqZWN0IHJlZ2FyZGxlc3Mgb2YgaG93IHRoZSBtb2R1bGUgaXNcbi8vIHJlc29sdmVkLlxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxubGV0IGdsb2JhbE5hbWVTcGFjZTtcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbmV4cG9ydCBmdW5jdGlvbiBnZXRHbG9iYWxOYW1lc3BhY2UoKSB7XG4gICAgaWYgKGdsb2JhbE5hbWVTcGFjZSA9PSBudWxsKSB7XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgICAgICAgbGV0IG5zO1xuICAgICAgICBpZiAodHlwZW9mICh3aW5kb3cpICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgbnMgPSB3aW5kb3c7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIChnbG9iYWwpICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgbnMgPSBnbG9iYWw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIChwcm9jZXNzKSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIG5zID0gcHJvY2VzcztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgKHNlbGYpICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgbnMgPSBzZWxmO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgZmluZCBhIGdsb2JhbCBvYmplY3QnKTtcbiAgICAgICAgfVxuICAgICAgICBnbG9iYWxOYW1lU3BhY2UgPSBucztcbiAgICB9XG4gICAgcmV0dXJuIGdsb2JhbE5hbWVTcGFjZTtcbn1cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbmZ1bmN0aW9uIGdldEdsb2JhbE1hcCgpIHtcbiAgICBjb25zdCBucyA9IGdldEdsb2JhbE5hbWVzcGFjZSgpO1xuICAgIGlmIChucy5fdGZHbG9iYWxzID09IG51bGwpIHtcbiAgICAgICAgbnMuX3RmR2xvYmFscyA9IG5ldyBNYXAoKTtcbiAgICB9XG4gICAgcmV0dXJuIG5zLl90Zkdsb2JhbHM7XG59XG4vKipcbiAqIFJldHVybnMgYSBnbG9iYWxseSBhY2Nlc3NpYmxlICdzaW5nbGV0b24nIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ga2V5IHRoZSBuYW1lIG9mIHRoZSBvYmplY3RcbiAqIEBwYXJhbSBpbml0IGEgZnVuY3Rpb24gdG8gaW5pdGlhbGl6ZSB0byBpbml0aWFsaXplIHRoaXMgb2JqZWN0XG4gKiAgICAgICAgICAgICB0aGUgZmlyc3QgdGltZSBpdCBpcyBmZXRjaGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0R2xvYmFsKGtleSwgaW5pdCkge1xuICAgIGNvbnN0IGdsb2JhbE1hcCA9IGdldEdsb2JhbE1hcCgpO1xuICAgIGlmIChnbG9iYWxNYXAuaGFzKGtleSkpIHtcbiAgICAgICAgcmV0dXJuIGdsb2JhbE1hcC5nZXQoa2V5KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IHNpbmdsZXRvbiA9IGluaXQoKTtcbiAgICAgICAgZ2xvYmFsTWFwLnNldChrZXksIHNpbmdsZXRvbik7XG4gICAgICAgIHJldHVybiBnbG9iYWxNYXAuZ2V0KGtleSk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2xvYmFsX3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi9lbmdpbmUnO1xuaW1wb3J0IHsgZW52IH0gZnJvbSAnLi9lbnZpcm9ubWVudCc7XG5pbXBvcnQgeyBzZXREZXByZWNhdGlvbldhcm5pbmdGbiB9IGZyb20gJy4vdGVuc29yJztcbmltcG9ydCB7IGdldFRlbnNvcnNJbkNvbnRhaW5lciB9IGZyb20gJy4vdGVuc29yX3V0aWwnO1xuLyoqXG4gKiBFbmFibGVzIHByb2R1Y3Rpb24gbW9kZSB3aGljaCBkaXNhYmxlcyBjb3JyZWN0bmVzcyBjaGVja3MgaW4gZmF2b3Igb2ZcbiAqIHBlcmZvcm1hbmNlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdFbnZpcm9ubWVudCd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmFibGVQcm9kTW9kZSgpIHtcbiAgICBlbnYoKS5zZXQoJ1BST0QnLCB0cnVlKTtcbn1cbi8qKlxuICogRW5hYmxlcyBkZWJ1ZyBtb2RlIHdoaWNoIHdpbGwgbG9nIGluZm9ybWF0aW9uIGFib3V0IGFsbCBleGVjdXRlZCBrZXJuZWxzOlxuICogdGhlIGVsYXBzZWQgdGltZSBvZiB0aGUga2VybmVsIGV4ZWN1dGlvbiwgYXMgd2VsbCBhcyB0aGUgcmFuaywgc2hhcGUsIGFuZFxuICogc2l6ZSBvZiB0aGUgb3V0cHV0IHRlbnNvci5cbiAqXG4gKiBEZWJ1ZyBtb2RlIHdpbGwgc2lnbmlmaWNhbnRseSBzbG93IGRvd24geW91ciBhcHBsaWNhdGlvbiBhcyBpdCB3aWxsXG4gKiBkb3dubG9hZCB0aGUgcmVzdWx0IG9mIGV2ZXJ5IG9wZXJhdGlvbiB0byB0aGUgQ1BVLiBUaGlzIHNob3VsZCBub3QgYmUgdXNlZCBpblxuICogcHJvZHVjdGlvbi4gRGVidWcgbW9kZSBkb2VzIG5vdCBhZmZlY3QgdGhlIHRpbWluZyBpbmZvcm1hdGlvbiBvZiB0aGUga2VybmVsXG4gKiBleGVjdXRpb24gYXMgd2UgZG8gbm90IG1lYXN1cmUgZG93bmxvYWQgdGltZSBpbiB0aGUga2VybmVsIGV4ZWN1dGlvbiB0aW1lLlxuICpcbiAqIFNlZSBhbHNvOiBgdGYucHJvZmlsZWAsIGB0Zi5tZW1vcnlgLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdFbnZpcm9ubWVudCd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmFibGVEZWJ1Z01vZGUoKSB7XG4gICAgZW52KCkuc2V0KCdERUJVRycsIHRydWUpO1xufVxuLyoqIEdsb2JhbGx5IGRpc2FibGVzIGRlcHJlY2F0aW9uIHdhcm5pbmdzICovXG5leHBvcnQgZnVuY3Rpb24gZGlzYWJsZURlcHJlY2F0aW9uV2FybmluZ3MoKSB7XG4gICAgZW52KCkuc2V0KCdERVBSRUNBVElPTl9XQVJOSU5HU19FTkFCTEVEJywgZmFsc2UpO1xuICAgIGNvbnNvbGUud2FybihgVGVuc29yRmxvdy5qcyBkZXByZWNhdGlvbiB3YXJuaW5ncyBoYXZlIGJlZW4gZGlzYWJsZWQuYCk7XG59XG4vKiogV2FybiB1c2VycyBhYm91dCBkZXByZWNhdGVkIGZ1bmN0aW9uYWxpdHkuICovXG5leHBvcnQgZnVuY3Rpb24gZGVwcmVjYXRpb25XYXJuKG1zZykge1xuICAgIGlmIChlbnYoKS5nZXRCb29sKCdERVBSRUNBVElPTl9XQVJOSU5HU19FTkFCTEVEJykpIHtcbiAgICAgICAgY29uc29sZS53YXJuKG1zZyArICcgWW91IGNhbiBkaXNhYmxlIGRlcHJlY2F0aW9uIHdhcm5pbmdzIHdpdGggJyArXG4gICAgICAgICAgICAndGYuZGlzYWJsZURlcHJlY2F0aW9uV2FybmluZ3MoKS4nKTtcbiAgICB9XG59XG5zZXREZXByZWNhdGlvbldhcm5pbmdGbihkZXByZWNhdGlvbldhcm4pO1xuLyoqXG4gKiBEaXNwb3NlIGFsbCB2YXJpYWJsZXMga2VwdCBpbiBiYWNrZW5kIGVuZ2luZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnRW52aXJvbm1lbnQnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlzcG9zZVZhcmlhYmxlcygpIHtcbiAgICBFTkdJTkUuZGlzcG9zZVZhcmlhYmxlcygpO1xufVxuLyoqXG4gKiBJdCByZXR1cm5zIHRoZSBnbG9iYWwgZW5naW5lIHRoYXQga2VlcHMgdHJhY2sgb2YgYWxsIHRlbnNvcnMgYW5kIGJhY2tlbmRzLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdFbnZpcm9ubWVudCd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmdpbmUoKSB7XG4gICAgcmV0dXJuIEVOR0lORTtcbn1cbi8qKlxuICogUmV0dXJucyBtZW1vcnkgaW5mbyBhdCB0aGUgY3VycmVudCB0aW1lIGluIHRoZSBwcm9ncmFtLiBUaGUgcmVzdWx0IGlzIGFuXG4gKiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogLSBgbnVtQnl0ZXNgOiBOdW1iZXIgb2YgYnl0ZXMgYWxsb2NhdGVkICh1bmRpc3Bvc2VkKSBhdCB0aGlzIHRpbWUuXG4gKiAtIGBudW1UZW5zb3JzYDogTnVtYmVyIG9mIHVuaXF1ZSB0ZW5zb3JzIGFsbG9jYXRlZC5cbiAqIC0gYG51bURhdGFCdWZmZXJzYDogTnVtYmVyIG9mIHVuaXF1ZSBkYXRhIGJ1ZmZlcnMgYWxsb2NhdGVkXG4gKiAgICh1bmRpc3Bvc2VkKSBhdCB0aGlzIHRpbWUsIHdoaWNoIGlzIOKJpCB0aGUgbnVtYmVyIG9mIHRlbnNvcnNcbiAqICAgKGUuZy4gYGEucmVzaGFwZShuZXdTaGFwZSlgIG1ha2VzIGEgbmV3IFRlbnNvciB0aGF0IHNoYXJlcyB0aGUgc2FtZVxuICogICBkYXRhIGJ1ZmZlciB3aXRoIGBhYCkuXG4gKiAtIGB1bnJlbGlhYmxlYDogVHJ1ZSBpZiB0aGUgbWVtb3J5IHVzYWdlIGlzIHVucmVsaWFibGUuIFNlZSBgcmVhc29uc2Agd2hlblxuICogICAgYHVucmVsaWFibGVgIGlzIHRydWUuXG4gKiAtIGByZWFzb25zYDogYHN0cmluZ1tdYCwgcmVhc29ucyB3aHkgdGhlIG1lbW9yeSBpcyB1bnJlbGlhYmxlLCBwcmVzZW50IGlmXG4gKiAgICBgdW5yZWxpYWJsZWAgaXMgdHJ1ZS5cbiAqXG4gKiBXZWJHTCBQcm9wZXJ0aWVzOlxuICogLSBgbnVtQnl0ZXNJbkdQVWA6IE51bWJlciBvZiBieXRlcyBhbGxvY2F0ZWQgKHVuZGlzcG9zZWQpIGluIHRoZSBHUFUgb25seSBhdFxuICogICAgIHRoaXMgdGltZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnUGVyZm9ybWFuY2UnLCBzdWJoZWFkaW5nOiAnTWVtb3J5J31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lbW9yeSgpIHtcbiAgICByZXR1cm4gRU5HSU5FLm1lbW9yeSgpO1xufVxuLyoqXG4gKiBFeGVjdXRlcyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gYGYoKWAgYW5kIHJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXNcbiAqIHdpdGggaW5mb3JtYXRpb24gYWJvdXQgdGhlIGZ1bmN0aW9uJ3MgbWVtb3J5IHVzZTpcbiAqIC0gYG5ld0J5dGVzYDogdGhlIG51bWJlciBvZiBuZXcgYnl0ZXMgYWxsb2NhdGVkXG4gKiAtIGBuZXdUZW5zb3JzYDogdGhlIG51bWJlciBvZiBuZXcgdGVuc29ycyBjcmVhdGVkXG4gKiAtIGBwZWFrQnl0ZXNgOiB0aGUgcGVhayBudW1iZXIgb2YgYnl0ZXMgYWxsb2NhdGVkXG4gKiAtIGBrZXJuZWxzYDogYW4gYXJyYXkgb2Ygb2JqZWN0cyBmb3IgZWFjaCBrZXJuZWwgaW52b2x2ZWQgdGhhdCByZXBvcnRzXG4gKiB0aGVpciBpbnB1dCBhbmQgb3V0cHV0IHNoYXBlcywgbnVtYmVyIG9mIGJ5dGVzIHVzZWQsIGFuZCBudW1iZXIgb2YgbmV3XG4gKiB0ZW5zb3JzIGNyZWF0ZWQuXG4gKiAtIGBrZXJuZWxOYW1lc2A6IGFuIGFycmF5IG9mIHVuaXF1ZSBzdHJpbmdzIHdpdGgganVzdCB0aGUgbmFtZXMgb2YgdGhlXG4gKiBrZXJuZWxzIGluIHRoZSBga2VybmVsc2AgYXJyYXkuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHByb2ZpbGUgPSBhd2FpdCB0Zi5wcm9maWxlKCgpID0+IHtcbiAqICAgY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzXSk7XG4gKiAgIGxldCB4MiA9IHguc3F1YXJlKCk7XG4gKiAgIHgyLmRpc3Bvc2UoKTtcbiAqICAgeDIgPSB4LnNxdWFyZSgpO1xuICogICB4Mi5kaXNwb3NlKCk7XG4gKiAgIHJldHVybiB4O1xuICogfSk7XG4gKlxuICogY29uc29sZS5sb2coYG5ld0J5dGVzOiAke3Byb2ZpbGUubmV3Qnl0ZXN9YCk7XG4gKiBjb25zb2xlLmxvZyhgbmV3VGVuc29yczogJHtwcm9maWxlLm5ld1RlbnNvcnN9YCk7XG4gKiBjb25zb2xlLmxvZyhgYnl0ZSB1c2FnZSBvdmVyIGFsbCBrZXJuZWxzOiAke3Byb2ZpbGUua2VybmVscy5tYXAoayA9PlxuICogay50b3RhbEJ5dGVzU25hcHNob3QpfWApO1xuICogYGBgXG4gKlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdQZXJmb3JtYW5jZScsIHN1YmhlYWRpbmc6ICdQcm9maWxlJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb2ZpbGUoZikge1xuICAgIHJldHVybiBFTkdJTkUucHJvZmlsZShmKTtcbn1cbi8qKlxuICogRXhlY3V0ZXMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIGBmbmAgYW5kIGFmdGVyIGl0IGlzIGV4ZWN1dGVkLCBjbGVhbnMgdXAgYWxsXG4gKiBpbnRlcm1lZGlhdGUgdGVuc29ycyBhbGxvY2F0ZWQgYnkgYGZuYCBleGNlcHQgdGhvc2UgcmV0dXJuZWQgYnkgYGZuYC5cbiAqIGBmbmAgbXVzdCBub3QgcmV0dXJuIGEgUHJvbWlzZSAoYXN5bmMgZnVuY3Rpb25zIG5vdCBhbGxvd2VkKS4gVGhlIHJldHVybmVkXG4gKiByZXN1bHQgY2FuIGJlIGEgY29tcGxleCBvYmplY3QuXG4gKlxuICogVXNpbmcgdGhpcyBtZXRob2QgaGVscHMgYXZvaWQgbWVtb3J5IGxlYWtzLiBJbiBnZW5lcmFsLCB3cmFwIGNhbGxzIHRvXG4gKiBvcGVyYXRpb25zIGluIGB0Zi50aWR5YCBmb3IgYXV0b21hdGljIG1lbW9yeSBjbGVhbnVwLlxuICpcbiAqIE5PVEU6IFZhcmlhYmxlcyBkbyAqbm90KiBnZXQgY2xlYW5lZCB1cCB3aGVuIGluc2lkZSBhIHRpZHkoKS4gSWYgeW91IHdhbnQgdG9cbiAqIGRpc3Bvc2UgdmFyaWFibGVzLCBwbGVhc2UgdXNlIGB0Zi5kaXNwb3NlVmFyaWFibGVzYCBvciBjYWxsIGRpc3Bvc2UoKVxuICogZGlyZWN0bHkgb24gdmFyaWFibGVzLlxuICpcbiAqIGBgYGpzXG4gKiAvLyB5ID0gMiBeIDIgKyAxXG4gKiBjb25zdCB5ID0gdGYudGlkeSgoKSA9PiB7XG4gKiAgIC8vIGEsIGIsIGFuZCBvbmUgd2lsbCBiZSBjbGVhbmVkIHVwIHdoZW4gdGhlIHRpZHkgZW5kcy5cbiAqICAgY29uc3Qgb25lID0gdGYuc2NhbGFyKDEpO1xuICogICBjb25zdCBhID0gdGYuc2NhbGFyKDIpO1xuICogICBjb25zdCBiID0gYS5zcXVhcmUoKTtcbiAqXG4gKiAgIGNvbnNvbGUubG9nKCdudW1UZW5zb3JzIChpbiB0aWR5KTogJyArIHRmLm1lbW9yeSgpLm51bVRlbnNvcnMpO1xuICpcbiAqICAgLy8gVGhlIHZhbHVlIHJldHVybmVkIGluc2lkZSB0aGUgdGlkeSBmdW5jdGlvbiB3aWxsIHJldHVyblxuICogICAvLyB0aHJvdWdoIHRoZSB0aWR5LCBpbiB0aGlzIGNhc2UgdG8gdGhlIHZhcmlhYmxlIHkuXG4gKiAgIHJldHVybiBiLmFkZChvbmUpO1xuICogfSk7XG4gKlxuICogY29uc29sZS5sb2coJ251bVRlbnNvcnMgKG91dHNpZGUgdGlkeSk6ICcgKyB0Zi5tZW1vcnkoKS5udW1UZW5zb3JzKTtcbiAqIHkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBuYW1lT3JGbiBUaGUgbmFtZSBvZiB0aGUgY2xvc3VyZSwgb3IgdGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUuXG4gKiAgICAgSWYgYSBuYW1lIGlzIHByb3ZpZGVkLCB0aGUgMm5kIGFyZ3VtZW50IHNob3VsZCBiZSB0aGUgZnVuY3Rpb24uXG4gKiAgICAgSWYgZGVidWcgbW9kZSBpcyBvbiwgdGhlIHRpbWluZyBhbmQgdGhlIG1lbW9yeSB1c2FnZSBvZiB0aGUgZnVuY3Rpb25cbiAqICAgICB3aWxsIGJlIHRyYWNrZWQgYW5kIGRpc3BsYXllZCBvbiB0aGUgY29uc29sZSB1c2luZyB0aGUgcHJvdmlkZWQgbmFtZS5cbiAqIEBwYXJhbSBmbiBUaGUgZnVuY3Rpb24gdG8gZXhlY3V0ZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnUGVyZm9ybWFuY2UnLCBzdWJoZWFkaW5nOiAnTWVtb3J5J31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRpZHkobmFtZU9yRm4sIGZuKSB7XG4gICAgcmV0dXJuIEVOR0lORS50aWR5KG5hbWVPckZuLCBmbik7XG59XG4vKipcbiAqIERpc3Bvc2VzIGFueSBgdGYuVGVuc29yYHMgZm91bmQgd2l0aGluIHRoZSBwcm92aWRlZCBvYmplY3QuXG4gKlxuICogQHBhcmFtIGNvbnRhaW5lciBhbiBvYmplY3QgdGhhdCBtYXkgYmUgYSBgdGYuVGVuc29yYCBvciBtYXkgZGlyZWN0bHlcbiAqICAgICBjb250YWluIGB0Zi5UZW5zb3Jgcywgc3VjaCBhcyBhIGBUZW5zb3JbXWAgb3IgYHtrZXk6IFRlbnNvciwgLi4ufWAuIElmXG4gKiAgICAgdGhlIG9iamVjdCBpcyBub3QgYSBgdGYuVGVuc29yYCBvciBkb2VzIG5vdCBjb250YWluIGBUZW5zb3JzYCwgbm90aGluZ1xuICogICAgIGhhcHBlbnMuIEluIGdlbmVyYWwgaXQgaXMgc2FmZSB0byBwYXNzIGFueSBvYmplY3QgaGVyZSwgZXhjZXB0IHRoYXRcbiAqICAgICBgUHJvbWlzZWBzIGFyZSBub3Qgc3VwcG9ydGVkLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdQZXJmb3JtYW5jZScsIHN1YmhlYWRpbmc6ICdNZW1vcnknfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlzcG9zZShjb250YWluZXIpIHtcbiAgICBjb25zdCB0ZW5zb3JzID0gZ2V0VGVuc29yc0luQ29udGFpbmVyKGNvbnRhaW5lcik7XG4gICAgdGVuc29ycy5mb3JFYWNoKHRlbnNvciA9PiB0ZW5zb3IuZGlzcG9zZSgpKTtcbn1cbi8qKlxuICogS2VlcHMgYSBgdGYuVGVuc29yYCBnZW5lcmF0ZWQgaW5zaWRlIGEgYHRmLnRpZHlgIGZyb20gYmVpbmcgZGlzcG9zZWRcbiAqIGF1dG9tYXRpY2FsbHkuXG4gKlxuICogYGBganNcbiAqIGxldCBiO1xuICogY29uc3QgeSA9IHRmLnRpZHkoKCkgPT4ge1xuICogICBjb25zdCBvbmUgPSB0Zi5zY2FsYXIoMSk7XG4gKiAgIGNvbnN0IGEgPSB0Zi5zY2FsYXIoMik7XG4gKlxuICogICAvLyBiIHdpbGwgbm90IGJlIGNsZWFuZWQgdXAgYnkgdGhlIHRpZHkuIGEgYW5kIG9uZSB3aWxsIGJlIGNsZWFuZWQgdXBcbiAqICAgLy8gd2hlbiB0aGUgdGlkeSBlbmRzLlxuICogICBiID0gdGYua2VlcChhLnNxdWFyZSgpKTtcbiAqXG4gKiAgIGNvbnNvbGUubG9nKCdudW1UZW5zb3JzIChpbiB0aWR5KTogJyArIHRmLm1lbW9yeSgpLm51bVRlbnNvcnMpO1xuICpcbiAqICAgLy8gVGhlIHZhbHVlIHJldHVybmVkIGluc2lkZSB0aGUgdGlkeSBmdW5jdGlvbiB3aWxsIHJldHVyblxuICogICAvLyB0aHJvdWdoIHRoZSB0aWR5LCBpbiB0aGlzIGNhc2UgdG8gdGhlIHZhcmlhYmxlIHkuXG4gKiAgIHJldHVybiBiLmFkZChvbmUpO1xuICogfSk7XG4gKlxuICogY29uc29sZS5sb2coJ251bVRlbnNvcnMgKG91dHNpZGUgdGlkeSk6ICcgKyB0Zi5tZW1vcnkoKS5udW1UZW5zb3JzKTtcbiAqIGNvbnNvbGUubG9nKCd5OicpO1xuICogeS5wcmludCgpO1xuICogY29uc29sZS5sb2coJ2I6Jyk7XG4gKiBiLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gcmVzdWx0IFRoZSB0ZW5zb3IgdG8ga2VlcCBmcm9tIGJlaW5nIGRpc3Bvc2VkLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdQZXJmb3JtYW5jZScsIHN1YmhlYWRpbmc6ICdNZW1vcnknfVxuICovXG5leHBvcnQgZnVuY3Rpb24ga2VlcChyZXN1bHQpIHtcbiAgICByZXR1cm4gRU5HSU5FLmtlZXAocmVzdWx0KTtcbn1cbi8qKlxuICogRXhlY3V0ZXMgYGYoKWAgYW5kIHJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aW1pbmdcbiAqIGluZm9ybWF0aW9uLlxuICpcbiAqIFRoZSByZXN1bHQgaXMgYW4gb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICpcbiAqIC0gYHdhbGxNc2A6IFdhbGwgZXhlY3V0aW9uIHRpbWUuXG4gKiAtIGBrZXJuZWxNc2A6IEtlcm5lbCBleGVjdXRpb24gdGltZSwgaWdub3JpbmcgZGF0YSB0cmFuc2Zlci4gSWYgdXNpbmcgdGhlXG4gKiBXZWJHTCBiYWNrZW5kIGFuZCB0aGUgcXVlcnkgdGltZXIgZXh0ZW5zaW9uIGlzIG5vdCBhdmFpbGFibGUsIHRoaXMgd2lsbFxuICogcmV0dXJuIGFuIGVycm9yIG9iamVjdC5cbiAqIC0gT24gYFdlYkdMYCBUaGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgcHJvcGVydGllcyBleGlzdDpcbiAqICAgLSBgdXBsb2FkV2FpdE1zYDogQ1BVIGJsb2NraW5nIHRpbWUgb24gdGV4dHVyZSB1cGxvYWRzLlxuICogICAtIGBkb3dubG9hZFdhaXRNc2A6IENQVSBibG9ja2luZyB0aW1lIG9uIHRleHR1cmUgZG93bmxvYWRzIChyZWFkUGl4ZWxzKS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnJhbmRvbU5vcm1hbChbMjAsIDIwXSk7XG4gKiBjb25zdCB0aW1lID0gYXdhaXQgdGYudGltZSgoKSA9PiB4Lm1hdE11bCh4KSk7XG4gKlxuICogY29uc29sZS5sb2coYGtlcm5lbE1zOiAke3RpbWUua2VybmVsTXN9LCB3YWxsVGltZU1zOiAke3RpbWUud2FsbE1zfWApO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGYgVGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgYW5kIHRpbWUuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1BlcmZvcm1hbmNlJywgc3ViaGVhZGluZzogJ1RpbWluZyd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0aW1lKGYpIHtcbiAgICByZXR1cm4gRU5HSU5FLnRpbWUoZik7XG59XG4vKipcbiAqIFNldHMgdGhlIGJhY2tlbmQgKGNwdSwgd2ViZ2wsIHdhc20sIGV0YykgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRlbnNvcnMgYW5kXG4gKiBleGVjdXRpbmcgb3BlcmF0aW9ucyBvbiB0aG9zZSB0ZW5zb3JzLiBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzXG4gKiB0byBhIGJvb2xlYW4gaWYgdGhlIGJhY2tlbmQgaW5pdGlhbGl6YXRpb24gd2FzIHN1Y2Nlc3NmdWwuXG4gKlxuICogTm90ZSB0aGlzIGRpc3Bvc2VzIHRoZSBjdXJyZW50IGJhY2tlbmQsIGlmIGFueSwgYXMgd2VsbCBhcyBhbnkgdGVuc29yc1xuICogYXNzb2NpYXRlZCB3aXRoIGl0LiBBIG5ldyBiYWNrZW5kIGlzIGluaXRpYWxpemVkLCBldmVuIGlmIGl0IGlzIG9mIHRoZVxuICogc2FtZSB0eXBlIGFzIHRoZSBwcmV2aW91cyBvbmUuXG4gKlxuICogQHBhcmFtIGJhY2tlbmROYW1lIFRoZSBuYW1lIG9mIHRoZSBiYWNrZW5kLiBDdXJyZW50bHkgc3VwcG9ydHNcbiAqICAgICBgJ3dlYmdsJ3wnY3B1J2AgaW4gdGhlIGJyb3dzZXIsIGAndGVuc29yZmxvdydgIHVuZGVyIG5vZGUuanNcbiAqICAgICAocmVxdWlyZXMgdGZqcy1ub2RlKSwgYW5kIGAnd2FzbSdgIChyZXF1aXJlcyB0ZmpzLWJhY2tlbmQtd2FzbSkuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ0JhY2tlbmRzJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldEJhY2tlbmQoYmFja2VuZE5hbWUpIHtcbiAgICByZXR1cm4gRU5HSU5FLnNldEJhY2tlbmQoYmFja2VuZE5hbWUpO1xufVxuLyoqXG4gKiBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBiYWNrZW5kIChvciB0aGVcbiAqIGhpZ2hlc3QgcHJpb3JpdHkgb25lKSBoYXMgaW5pdGlhbGl6ZWQuIEF3YWl0IHRoaXMgcHJvbWlzZSB3aGVuIHlvdSBhcmUgdXNpbmdcbiAqIGEgYmFja2VuZCB0aGF0IGhhcyBhc3luYyBpbml0aWFsaXphdGlvbi5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnQmFja2VuZHMnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZHkoKSB7XG4gICAgcmV0dXJuIEVOR0lORS5yZWFkeSgpO1xufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjdXJyZW50IGJhY2tlbmQgbmFtZSAoY3B1LCB3ZWJnbCwgZXRjKS4gVGhlIGJhY2tlbmQgaXNcbiAqIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB0ZW5zb3JzIGFuZCBleGVjdXRpbmcgb3BlcmF0aW9ucyBvbiB0aG9zZSB0ZW5zb3JzLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdCYWNrZW5kcyd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRCYWNrZW5kKCkge1xuICAgIHJldHVybiBFTkdJTkUuYmFja2VuZE5hbWU7XG59XG4vKipcbiAqIFJlbW92ZXMgYSBiYWNrZW5kIGFuZCB0aGUgcmVnaXN0ZXJlZCBmYWN0b3J5LlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdCYWNrZW5kcyd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVCYWNrZW5kKG5hbWUpIHtcbiAgICBFTkdJTkUucmVtb3ZlQmFja2VuZChuYW1lKTtcbn1cbi8qKlxuICogRmluZHMgdGhlIGJhY2tlbmQgcmVnaXN0ZXJlZCB1bmRlciB0aGUgcHJvdmlkZWQgbmFtZS4gUmV0dXJucyBudWxsIGlmIHRoZVxuICogbmFtZSBpcyBub3QgaW4gdGhlIHJlZ2lzdHJ5LCBvciB0aGUgcmVnaXN0cmF0aW9uIGhhc24ndCBmaW5pc2hlZCB5ZXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kQmFja2VuZChuYW1lKSB7XG4gICAgcmV0dXJuIEVOR0lORS5maW5kQmFja2VuZChuYW1lKTtcbn1cbi8qKlxuICogRmluZHMgdGhlIGJhY2tlbmQgZmFjdG9yeSByZWdpc3RlcmVkIHVuZGVyIHRoZSBwcm92aWRlZCBuYW1lLiBSZXR1cm5zIGFcbiAqIGZ1bmN0aW9uIHRoYXQgcHJvZHVjZXMgYSBuZXcgYmFja2VuZCB3aGVuIGNhbGxlZC4gUmV0dXJucyBudWxsIGlmIHRoZSBuYW1lXG4gKiBpcyBub3QgaW4gdGhlIHJlZ2lzdHJ5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZEJhY2tlbmRGYWN0b3J5KG5hbWUpIHtcbiAgICByZXR1cm4gRU5HSU5FLmZpbmRCYWNrZW5kRmFjdG9yeShuYW1lKTtcbn1cbi8qKlxuICogUmVnaXN0ZXJzIGEgZ2xvYmFsIGJhY2tlbmQuIFRoZSByZWdpc3RyYXRpb24gc2hvdWxkIGhhcHBlbiB3aGVuIGltcG9ydGluZ1xuICogYSBtb2R1bGUgZmlsZSAoZS5nLiB3aGVuIGltcG9ydGluZyBgYmFja2VuZF93ZWJnbC50c2ApLCBhbmQgaXMgdXNlZCBmb3JcbiAqIG1vZHVsYXIgYnVpbGRzIChlLmcuIGN1c3RvbSB0ZmpzIGJ1bmRsZSB3aXRoIG9ubHkgd2ViZ2wgc3VwcG9ydCkuXG4gKlxuICogQHBhcmFtIGZhY3RvcnkgVGhlIGJhY2tlbmQgZmFjdG9yeSBmdW5jdGlvbi4gV2hlbiBjYWxsZWQsIGl0IHNob3VsZFxuICogcmV0dXJuIGEgYmFja2VuZCBpbnN0YW5jZSwgb3IgYSBwcm9taXNlIG9mIGFuIGluc3RhbmNlLlxuICogQHBhcmFtIHByaW9yaXR5IFRoZSBwcmlvcml0eSBvZiB0aGUgYmFja2VuZCAoaGlnaGVyID0gbW9yZSBpbXBvcnRhbnQpLlxuICogICAgIEluIGNhc2UgbXVsdGlwbGUgYmFja2VuZHMgYXJlIHJlZ2lzdGVyZWQsIHRoZSBwcmlvcml0eSBpcyB1c2VkIHRvIGZpbmRcbiAqICAgICB0aGUgYmVzdCBiYWNrZW5kLiBEZWZhdWx0cyB0byAxLlxuICogQHJldHVybiBGYWxzZSBpZiB0aGVyZSBpcyBhbHJlYWR5IGEgcmVnaXN0ZXJlZCBiYWNrZW5kIHVuZGVyIHRoaXMgbmFtZSwgdHJ1ZVxuICogICAgIGlmIG5vdC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnQmFja2VuZHMnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJCYWNrZW5kKG5hbWUsIGZhY3RvcnksIHByaW9yaXR5ID0gMSkge1xuICAgIHJldHVybiBFTkdJTkUucmVnaXN0ZXJCYWNrZW5kKG5hbWUsIGZhY3RvcnksIHByaW9yaXR5KTtcbn1cbi8qKlxuICogR2V0cyB0aGUgY3VycmVudCBiYWNrZW5kLiBJZiBubyBiYWNrZW5kcyBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQsIHRoaXMgd2lsbFxuICogYXR0ZW1wdCB0byBpbml0aWFsaXplIHRoZSBiZXN0IGJhY2tlbmQuIFdpbGwgdGhyb3cgYW4gZXJyb3IgaWYgdGhlIGhpZ2hlc3RcbiAqIHByaW9yaXR5IGJhY2tlbmQgaGFzIGFzeW5jIGluaXRpYWxpemF0aW9uLCBpbiB3aGljaCBjYXNlLCB5b3Ugc2hvdWxkIGNhbGxcbiAqICdhd2FpdCB0Zi5yZWFkeSgpJyBiZWZvcmUgcnVubmluZyBvdGhlciBjb2RlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdCYWNrZW5kcyd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiYWNrZW5kKCkge1xuICAgIHJldHVybiBFTkdJTkUuYmFja2VuZDtcbn1cbi8qKlxuICogU2V0cyB0aGUgZ2xvYmFsIHBsYXRmb3JtLlxuICpcbiAqIEBwYXJhbSBwbGF0Zm9ybU5hbWUgVGhlIG5hbWUgb2YgdGhpcyBwbGF0Zm9ybS5cbiAqIEBwYXJhbSBwbGF0Zm9ybSBBIHBsYXRmb3JtIGltcGxlbWVudGF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0UGxhdGZvcm0ocGxhdGZvcm1OYW1lLCBwbGF0Zm9ybSkge1xuICAgIGVudigpLnNldFBsYXRmb3JtKHBsYXRmb3JtTmFtZSwgcGxhdGZvcm0pO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2xvYmFscy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuL2VuZ2luZSc7XG5pbXBvcnQgeyBUZW5zb3IsIFZhcmlhYmxlIH0gZnJvbSAnLi90ZW5zb3InO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yLCBjb252ZXJ0VG9UZW5zb3JBcnJheSB9IGZyb20gJy4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi91dGlsJztcbi8qKlxuICogUHJvdmlkZWQgYGYoeClgLCByZXR1cm5zIGFub3RoZXIgZnVuY3Rpb24gYGcoeCwgZHk/KWAsIHdoaWNoIGdpdmVzIHRoZVxuICogZ3JhZGllbnQgb2YgYGYoeClgIHdpdGggcmVzcGVjdCB0byBgeGAuXG4gKlxuICogSWYgYGR5YCBpcyBwcm92aWRlZCwgdGhlIGdyYWRpZW50IG9mIGBmKHgpLm11bChkeSkuc3VtKClgIHdpdGggcmVzcGVjdCB0b1xuICogYHhgIGlzIGNvbXB1dGVkIGluc3RlYWQuIGBmKHgpYCBtdXN0IHRha2UgYSBzaW5nbGUgdGVuc29yIGB4YCBhbmQgcmV0dXJuIGFcbiAqIHNpbmdsZSB0ZW5zb3IgYHlgLiBJZiBgZigpYCB0YWtlcyBtdWx0aXBsZSBpbnB1dHMsIHVzZSBgdGYuZ3JhZHNgIGluc3RlYWQuXG4gKlxuICogYGBganNcbiAqIC8vIGYoeCkgPSB4IF4gMlxuICogY29uc3QgZiA9IHggPT4geC5zcXVhcmUoKTtcbiAqIC8vIGYnKHgpID0gMnhcbiAqIGNvbnN0IGcgPSB0Zi5ncmFkKGYpO1xuICpcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMiwgM10pO1xuICogZyh4KS5wcmludCgpO1xuICogYGBgXG4gKlxuICogYGBganNcbiAqIC8vIGYoeCkgPSB4IF4gM1xuICogY29uc3QgZiA9IHggPT4geC5wb3codGYuc2NhbGFyKDMsICdpbnQzMicpKTtcbiAqIC8vIGYnKHgpID0gM3ggXiAyXG4gKiBjb25zdCBnID0gdGYuZ3JhZChmKTtcbiAqIC8vIGYnJyh4KSA9IDZ4XG4gKiBjb25zdCBnZyA9IHRmLmdyYWQoZyk7XG4gKlxuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsyLCAzXSk7XG4gKiBnZyh4KS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGYgVGhlIGZ1bmN0aW9uIGYoeCksIHRvIGNvbXB1dGUgZ3JhZGllbnQgZm9yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUcmFpbmluZycsIHN1YmhlYWRpbmc6ICdHcmFkaWVudHMnfVxuICovXG5mdW5jdGlvbiBncmFkKGYpIHtcbiAgICB1dGlsLmFzc2VydCh1dGlsLmlzRnVuY3Rpb24oZiksICgpID0+ICdUaGUgZiBwYXNzZWQgaW4gZ3JhZChmKSBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgICByZXR1cm4gKHgsIGR5KSA9PiB7XG4gICAgICAgIC8vIHggY2FuIGJlIG9mIGFueSBkdHlwZSwgdGh1cyBudWxsIGFzIHRoZSBsYXN0IGFyZ3VtZW50LlxuICAgICAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICd0Zi5ncmFkJywgJ3N0cmluZ19vcl9udW1lcmljJyk7XG4gICAgICAgIGNvbnN0ICRkeSA9IChkeSAhPSBudWxsKSA/IGNvbnZlcnRUb1RlbnNvcihkeSwgJ2R5JywgJ3RmLmdyYWQnKSA6IG51bGw7XG4gICAgICAgIHJldHVybiBFTkdJTkUudGlkeSgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IHZhbHVlLCBncmFkcyB9ID0gRU5HSU5FLmdyYWRpZW50cygoKSA9PiBmKCR4KSwgWyR4XSwgJGR5KTtcbiAgICAgICAgICAgIGlmICgkZHkgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHV0aWwuYXNzZXJ0U2hhcGVzTWF0Y2godmFsdWUuc2hhcGUsICRkeS5zaGFwZSwgJ1RoZSBzaGFwZSBvZiBkeSBwYXNzZWQgaW4gZ3JhZChmKSh4LCBkeSkgbXVzdCBtYXRjaCB0aGUgc2hhcGUgJyArXG4gICAgICAgICAgICAgICAgICAgICdyZXR1cm5lZCBieSBmKHgpJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjaGVja0dyYWRzKGdyYWRzKTtcbiAgICAgICAgICAgIHJldHVybiBncmFkc1swXTtcbiAgICAgICAgfSk7XG4gICAgfTtcbn1cbi8qKlxuICogUHJvdmlkZWQgYGYoeDEsIHgyLC4uLilgLCByZXR1cm5zIGFub3RoZXIgZnVuY3Rpb24gYGcoW3gxLCB4MiwuLi5dLCBkeT8pYCxcbiAqIHdoaWNoIGdpdmVzIGFuIGFycmF5IG9mIGdyYWRpZW50cyBvZiBgZigpYCB3aXRoIHJlc3BlY3QgdG8gZWFjaCBpbnB1dFxuICogW2B4MWAsYHgyYCwuLi5dLlxuICpcbiAqIElmIGBkeWAgaXMgcGFzc2VkIHdoZW4gY2FsbGluZyBgZygpYCwgdGhlIGdyYWRpZW50IG9mXG4gKiBgZih4MSwuLi4pLm11bChkeSkuc3VtKClgIHdpdGggcmVzcGVjdCB0byBlYWNoIGlucHV0IGlzIGNvbXB1dGVkIGluc3RlYWQuXG4gKiBUaGUgcHJvdmlkZWQgYGZgIG11c3QgdGFrZSBvbmUgb3IgbW9yZSB0ZW5zb3JzIGFuZCByZXR1cm4gYSBzaW5nbGUgdGVuc29yXG4gKiBgeWAuIElmIGBmKClgIHRha2VzIGEgc2luZ2xlIGlucHV0LCB3ZSByZWNvbW1lbmQgdXNpbmcgYHRmLmdyYWRgIGluc3RlYWQuXG4gKlxuICogYGBganNcbiAqIC8vIGYoYSwgYikgPSBhICogYlxuICogY29uc3QgZiA9IChhLCBiKSA9PiBhLm11bChiKTtcbiAqIC8vIGRmIC8gZGEgPSBiLCBkZiAvIGRiID0gYVxuICogY29uc3QgZyA9IHRmLmdyYWRzKGYpO1xuICpcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMiwgM10pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjFkKFstMiwgLTNdKTtcbiAqIGNvbnN0IFtkYSwgZGJdID0gZyhbYSwgYl0pO1xuICogY29uc29sZS5sb2coJ2RhJyk7XG4gKiBkYS5wcmludCgpO1xuICogY29uc29sZS5sb2coJ2RiJyk7XG4gKiBkYi5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGYgVGhlIGZ1bmN0aW9uIGBmKHgxLCB4MiwuLi4pYCB0byBjb21wdXRlIGdyYWRpZW50cyBmb3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ0dyYWRpZW50cyd9XG4gKi9cbmZ1bmN0aW9uIGdyYWRzKGYpIHtcbiAgICB1dGlsLmFzc2VydCh1dGlsLmlzRnVuY3Rpb24oZiksICgpID0+ICdUaGUgZiBwYXNzZWQgaW4gZ3JhZHMoZikgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gICAgcmV0dXJuIChhcmdzLCBkeSkgPT4ge1xuICAgICAgICB1dGlsLmFzc2VydChBcnJheS5pc0FycmF5KGFyZ3MpLCAoKSA9PiAnVGhlIGFyZ3MgcGFzc2VkIGluIGdyYWRzKGYpKGFyZ3MpIG11c3QgYmUgYW4gYXJyYXkgJyArXG4gICAgICAgICAgICAnb2YgYFRlbnNvcmBzIG9yIGBUZW5zb3JMaWtlYHMnKTtcbiAgICAgICAgLy8gYXJncyBjYW4gYmUgb2YgYW55IGR0eXBlLCB0aHVzIG51bGwgYXMgdGhlIGxhc3QgYXJndW1lbnQuXG4gICAgICAgIGNvbnN0ICRhcmdzID0gY29udmVydFRvVGVuc29yQXJyYXkoYXJncywgJ2FyZ3MnLCAndGYuZ3JhZHMnLCAnc3RyaW5nX29yX251bWVyaWMnKTtcbiAgICAgICAgY29uc3QgJGR5ID0gKGR5ICE9IG51bGwpID8gY29udmVydFRvVGVuc29yKGR5LCAnZHknLCAndGYuZ3JhZHMnKSA6IG51bGw7XG4gICAgICAgIHJldHVybiBFTkdJTkUudGlkeSgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IHZhbHVlLCBncmFkcyB9ID0gRU5HSU5FLmdyYWRpZW50cygoKSA9PiBmKC4uLiRhcmdzKSwgJGFyZ3MsICRkeSk7XG4gICAgICAgICAgICBpZiAoJGR5ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB1dGlsLmFzc2VydFNoYXBlc01hdGNoKHZhbHVlLnNoYXBlLCAkZHkuc2hhcGUsICdUaGUgc2hhcGUgb2YgZHkgcGFzc2VkIGluIGdyYWRzKGYpKFt4MSwuLi5dLCBkeSkgbXVzdCAnICtcbiAgICAgICAgICAgICAgICAgICAgJ21hdGNoIHRoZSBzaGFwZSByZXR1cm5lZCBieSBmKFt4MSwuLi5dKScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2hlY2tHcmFkcyhncmFkcyk7XG4gICAgICAgICAgICByZXR1cm4gZ3JhZHM7XG4gICAgICAgIH0pO1xuICAgIH07XG59XG4vKipcbiAqIExpa2UgYHRmLmdyYWRgLCBidXQgYWxzbyByZXR1cm5zIHRoZSB2YWx1ZSBvZiBgZigpYC4gVXNlZnVsIHdoZW4gYGYoKWBcbiAqIHJldHVybnMgYSBtZXRyaWMgeW91IHdhbnQgdG8gc2hvdy5cbiAqXG4gKiBUaGUgcmVzdWx0IGlzIGEgcmljaCBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKiAtIGdyYWQ6IFRoZSBncmFkaWVudCBvZiBgZih4KWAgdy5yLnQgYHhgIChyZXN1bHQgb2YgYHRmLmdyYWRgKS5cbiAqIC0gdmFsdWU6IFRoZSB2YWx1ZSByZXR1cm5lZCBieSBgZih4KWAuXG4gKlxuICogYGBganNcbiAqIC8vIGYoeCkgPSB4IF4gMlxuICogY29uc3QgZiA9IHggPT4geC5zcXVhcmUoKTtcbiAqIC8vIGYnKHgpID0gMnhcbiAqIGNvbnN0IGcgPSB0Zi52YWx1ZUFuZEdyYWQoZik7XG4gKlxuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsyLCAzXSk7XG4gKiBjb25zdCB7dmFsdWUsIGdyYWR9ID0gZyh4KTtcbiAqXG4gKiBjb25zb2xlLmxvZygndmFsdWUnKTtcbiAqIHZhbHVlLnByaW50KCk7XG4gKiBjb25zb2xlLmxvZygnZ3JhZCcpO1xuICogZ3JhZC5wcmludCgpO1xuICogYGBgXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ0dyYWRpZW50cyd9XG4gKi9cbmZ1bmN0aW9uIHZhbHVlQW5kR3JhZChmKSB7XG4gICAgdXRpbC5hc3NlcnQodXRpbC5pc0Z1bmN0aW9uKGYpLCAoKSA9PiAnVGhlIGYgcGFzc2VkIGluIHZhbHVlQW5kR3JhZChmKSBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgICByZXR1cm4gKHgsIGR5KSA9PiB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KHggaW5zdGFuY2VvZiBUZW5zb3IsICgpID0+ICdUaGUgeCBwYXNzZWQgaW4gdmFsdWVBbmRHcmFkKGYpKHgpIG11c3QgYmUgYSB0ZW5zb3InKTtcbiAgICAgICAgdXRpbC5hc3NlcnQoZHkgPT0gbnVsbCB8fCBkeSBpbnN0YW5jZW9mIFRlbnNvciwgKCkgPT4gJ1RoZSBkeSBwYXNzZWQgaW4gdmFsdWVBbmRHcmFkKGYpKHgsIGR5KSBtdXN0IGJlIGEgdGVuc29yJyk7XG4gICAgICAgIGNvbnN0IHsgZ3JhZHMsIHZhbHVlIH0gPSBFTkdJTkUuZ3JhZGllbnRzKCgpID0+IGYoeCksIFt4XSwgZHkpO1xuICAgICAgICBjaGVja0dyYWRzKGdyYWRzKTtcbiAgICAgICAgcmV0dXJuIHsgZ3JhZDogZ3JhZHNbMF0sIHZhbHVlIH07XG4gICAgfTtcbn1cbi8qKlxuICogTGlrZSBgdGYuZ3JhZHNgLCBidXQgcmV0dXJucyBhbHNvIHRoZSB2YWx1ZSBvZiBgZigpYC4gVXNlZnVsIHdoZW4gYGYoKWBcbiAqIHJldHVybnMgYSBtZXRyaWMgeW91IHdhbnQgdG8gc2hvdy5cbiAqXG4gKiBUaGUgcmVzdWx0IGlzIGEgcmljaCBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKiAtIGdyYWRzOiBUaGUgZ3JhZGllbnRzIG9mIGBmKClgIHcuci50IGVhY2ggaW5wdXQgKHJlc3VsdCBvZiBgdGYuZ3JhZHNgKS5cbiAqIC0gdmFsdWU6IFRoZSB2YWx1ZSByZXR1cm5lZCBieSBgZih4KWAuXG4gKlxuICogYGBganNcbiAqIC8vIGYoYSwgYikgPSBhICogYlxuICogY29uc3QgZiA9IChhLCBiKSA9PiBhLm11bChiKTtcbiAqIC8vIGRmL2RhID0gYiwgZGYvZGIgPSBhXG4gKiBjb25zdCBnID0gdGYudmFsdWVBbmRHcmFkcyhmKTtcbiAqXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzIsIDNdKTtcbiAqIGNvbnN0IGIgPSB0Zi50ZW5zb3IxZChbLTIsIC0zXSk7XG4gKiBjb25zdCB7dmFsdWUsIGdyYWRzfSA9IGcoW2EsIGJdKTtcbiAqXG4gKiBjb25zdCBbZGEsIGRiXSA9IGdyYWRzO1xuICpcbiAqIGNvbnNvbGUubG9nKCd2YWx1ZScpO1xuICogdmFsdWUucHJpbnQoKTtcbiAqXG4gKiBjb25zb2xlLmxvZygnZGEnKTtcbiAqIGRhLnByaW50KCk7XG4gKiBjb25zb2xlLmxvZygnZGInKTtcbiAqIGRiLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVHJhaW5pbmcnLCBzdWJoZWFkaW5nOiAnR3JhZGllbnRzJ31cbiAqL1xuZnVuY3Rpb24gdmFsdWVBbmRHcmFkcyhmKSB7XG4gICAgdXRpbC5hc3NlcnQodXRpbC5pc0Z1bmN0aW9uKGYpLCAoKSA9PiAnVGhlIGYgcGFzc2VkIGluIHZhbHVlQW5kR3JhZHMoZikgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gICAgcmV0dXJuIChhcmdzLCBkeSkgPT4ge1xuICAgICAgICB1dGlsLmFzc2VydChBcnJheS5pc0FycmF5KGFyZ3MpICYmIGFyZ3MuZXZlcnkoYXJnID0+IGFyZyBpbnN0YW5jZW9mIFRlbnNvciksICgpID0+ICdUaGUgYXJncyBwYXNzZWQgaW4gdmFsdWVBbmRHcmFkcyhmKShhcmdzKSBtdXN0IGJlIGFycmF5IG9mICcgK1xuICAgICAgICAgICAgJ3RlbnNvcnMnKTtcbiAgICAgICAgdXRpbC5hc3NlcnQoZHkgPT0gbnVsbCB8fCBkeSBpbnN0YW5jZW9mIFRlbnNvciwgKCkgPT4gJ1RoZSBkeSBwYXNzZWQgaW4gdmFsdWVBbmRHcmFkcyhmKShhcmdzLCBkeSkgbXVzdCBiZSBhIHRlbnNvcicpO1xuICAgICAgICBjb25zdCByZXMgPSBFTkdJTkUuZ3JhZGllbnRzKCgpID0+IGYoLi4uYXJncyksIGFyZ3MsIGR5KTtcbiAgICAgICAgaWYgKGR5ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHV0aWwuYXNzZXJ0U2hhcGVzTWF0Y2gocmVzLnZhbHVlLnNoYXBlLCBkeS5zaGFwZSwgJ1RoZSBzaGFwZSBvZiBkeSBwYXNzZWQgaW4gdmFsdWVBbmRHcmFkcyhmKShbeDEsLi4uXSwgZHkpIG11c3QgJyArXG4gICAgICAgICAgICAgICAgJ21hdGNoIHRoZSBzaGFwZSByZXR1cm5lZCBieSBmKFt4MSwuLi5dKScpO1xuICAgICAgICB9XG4gICAgICAgIGNoZWNrR3JhZHMocmVzLmdyYWRzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9O1xufVxuLyoqXG4gKiBDb21wdXRlcyBhbmQgcmV0dXJucyB0aGUgZ3JhZGllbnQgb2YgZih4KSB3aXRoIHJlc3BlY3QgdG8gdGhlIGxpc3Qgb2ZcbiAqIHRyYWluYWJsZSB2YXJpYWJsZXMgcHJvdmlkZWQgYnkgYHZhckxpc3RgLiBJZiBubyBsaXN0IGlzIHByb3ZpZGVkLCBpdFxuICogZGVmYXVsdHMgdG8gYWxsIHRyYWluYWJsZSB2YXJpYWJsZXMuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi52YXJpYWJsZSh0Zi50ZW5zb3IxZChbMywgNF0pKTtcbiAqIGNvbnN0IGIgPSB0Zi52YXJpYWJsZSh0Zi50ZW5zb3IxZChbNSwgNl0pKTtcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMSwgMl0pO1xuICpcbiAqIC8vIGYoYSwgYikgPSBhICogeCBeIDIgKyBiICogeFxuICogY29uc3QgZiA9ICgpID0+IGEubXVsKHguc3F1YXJlKCkpLmFkZChiLm11bCh4KSkuc3VtKCk7XG4gKiAvLyBkZi9kYSA9IHggXiAyLCBkZi9kYiA9IHhcbiAqIGNvbnN0IHt2YWx1ZSwgZ3JhZHN9ID0gdGYudmFyaWFibGVHcmFkcyhmKTtcbiAqXG4gKiBPYmplY3Qua2V5cyhncmFkcykuZm9yRWFjaCh2YXJOYW1lID0+IGdyYWRzW3Zhck5hbWVdLnByaW50KCkpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGYgVGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUuIGYoKSBzaG91bGQgcmV0dXJuIGEgc2NhbGFyLlxuICogQHBhcmFtIHZhckxpc3QgVGhlIGxpc3Qgb2YgdmFyaWFibGVzIHRvIGNvbXB1dGUgdGhlIGdyYWRpZW50cyB3aXRoIHJlc3BlY3RcbiAqICAgICB0by4gRGVmYXVsdHMgdG8gYWxsIHRyYWluYWJsZSB2YXJpYWJsZXMuXG4gKiBAcmV0dXJucyBBbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIGtleXMgYW5kIHZhbHVlczpcbiAqICAgLSBgdmFsdWVgOiBUaGUgdmFsdWUgb2YgdGhlIGZ1bmN0aW9uIGBmYC5cbiAqICAgLSBgZ3JhZHNgOiBBIG1hcCBmcm9tIHRoZSBuYW1lcyBvZiB0aGUgdmFyaWFibGVzIHRvIHRoZSBncmFkaWVudHMuXG4gKiAgICAgSWYgdGhlIGB2YXJMaXN0YCBhcmd1bWVudCBpcyBwcm92aWRlZCBleHBsaWNpdGx5IGFuZCBjb250YWlucyBhIHN1YnNldCBvZlxuICogICAgIG5vbi10cmFpbmFibGUgdmFyaWFibGVzLCB0aGlzIG1hcCBpbiB0aGUgcmV0dXJuIHZhbHVlIHdpbGwgY29udGFpbiBrZXlzXG4gKiAgICAgdGhhdCBtYXAgdGhlIG5hbWVzIG9mIHRoZSBub24tdHJhaW5hYmxlIHZhcmlhYmxlcyB0byBgbnVsbGAuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ0dyYWRpZW50cyd9XG4gKi9cbmZ1bmN0aW9uIHZhcmlhYmxlR3JhZHMoZiwgdmFyTGlzdCkge1xuICAgIHV0aWwuYXNzZXJ0KHV0aWwuaXNGdW5jdGlvbihmKSwgKCkgPT4gJ1RoZSBmIHBhc3NlZCBpbiB2YXJpYWJsZUdyYWRzKGYpIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICAgIHV0aWwuYXNzZXJ0KHZhckxpc3QgPT0gbnVsbCB8fFxuICAgICAgICBBcnJheS5pc0FycmF5KHZhckxpc3QpICYmIHZhckxpc3QuZXZlcnkodiA9PiB2IGluc3RhbmNlb2YgVmFyaWFibGUpLCAoKSA9PiAnVGhlIHZhckxpc3QgcGFzc2VkIGluIHZhcmlhYmxlR3JhZHMoZiwgdmFyTGlzdCkgbXVzdCBiZSBhbiBhcnJheSAnICtcbiAgICAgICAgJ29mIHZhcmlhYmxlcycpO1xuICAgIGNvbnN0IHNwZWNpZmllZFZhckxpc3QgPSB2YXJMaXN0ICE9IG51bGw7XG4gICAgaWYgKCFzcGVjaWZpZWRWYXJMaXN0KSB7XG4gICAgICAgIC8vIEdldCBhbGwgb2YgdGhlIHRyYWluYWJsZSB2YXJpYWJsZXMuXG4gICAgICAgIHZhckxpc3QgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCB2YXJOYW1lIGluIEVOR0lORS5yZWdpc3RlcmVkVmFyaWFibGVzKSB7XG4gICAgICAgICAgICB2YXJMaXN0LnB1c2goRU5HSU5FLnJlZ2lzdGVyZWRWYXJpYWJsZXNbdmFyTmFtZV0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHNwZWNpZmllZE5vblRyYWluYWJsZSA9IHNwZWNpZmllZFZhckxpc3QgPyB2YXJMaXN0LmZpbHRlcih2YXJpYWJsZSA9PiAhdmFyaWFibGUudHJhaW5hYmxlKSA6IG51bGw7XG4gICAgLy8gUHJ1bmUgbm9uLXRyYWluYWJsZSB2YXJpYWJsZXMuXG4gICAgY29uc3Qgb3JpZ2luYWxWYXJDb3VudCA9IHZhckxpc3QubGVuZ3RoO1xuICAgIHZhckxpc3QgPSB2YXJMaXN0LmZpbHRlcih2YXJpYWJsZSA9PiB2YXJpYWJsZS50cmFpbmFibGUpO1xuICAgIHV0aWwuYXNzZXJ0KHZhckxpc3QubGVuZ3RoID4gMCwgKCkgPT4gYHZhcmlhYmxlR3JhZHMoKSBleHBlY3RzIGF0IGxlYXN0IG9uZSBvZiB0aGUgaW5wdXQgdmFyaWFibGVzIHRvIGAgK1xuICAgICAgICBgYmUgdHJhaW5hYmxlLCBidXQgbm9uZSBvZiB0aGUgJHtvcmlnaW5hbFZhckNvdW50fSB2YXJpYWJsZXMgaXMgYCArXG4gICAgICAgIGB0cmFpbmFibGUuYCk7XG4gICAgY29uc3QgYWxsb3dOb0dyYWRpZW50cyA9IHRydWU7XG4gICAgY29uc3QgeyB2YWx1ZSwgZ3JhZHMgfSA9IEVOR0lORS5ncmFkaWVudHMoZiwgdmFyTGlzdCwgbnVsbCwgYWxsb3dOb0dyYWRpZW50cyk7XG4gICAgdXRpbC5hc3NlcnQoZ3JhZHMuc29tZShnID0+IGcgIT0gbnVsbCksICgpID0+ICdDYW5ub3QgZmluZCBhIGNvbm5lY3Rpb24gYmV0d2VlbiBhbnkgdmFyaWFibGUgYW5kIHRoZSByZXN1bHQgb2YgJyArXG4gICAgICAgICd0aGUgbG9zcyBmdW5jdGlvbiB5PWYoeCkuIFBsZWFzZSBtYWtlIHN1cmUgdGhlIG9wZXJhdGlvbnMgdGhhdCAnICtcbiAgICAgICAgJ3VzZSB2YXJpYWJsZXMgYXJlIGluc2lkZSB0aGUgZnVuY3Rpb24gZiBwYXNzZWQgdG8gbWluaW1pemUoKS4nKTtcbiAgICB1dGlsLmFzc2VydCh2YWx1ZS5yYW5rID09PSAwLCAoKSA9PiBgVGhlIGYgcGFzc2VkIGluIHZhcmlhYmxlR3JhZHMoZikgbXVzdCByZXR1cm4gYSBzY2FsYXIsIGJ1dCBpdCBgICtcbiAgICAgICAgYHJldHVybmVkIGEgcmFuay0ke3ZhbHVlLnJhbmt9IHRlbnNvcmApO1xuICAgIGNvbnN0IG5hbWVkR3JhZHMgPSB7fTtcbiAgICB2YXJMaXN0LmZvckVhY2goKHYsIGkpID0+IHtcbiAgICAgICAgaWYgKGdyYWRzW2ldICE9IG51bGwpIHtcbiAgICAgICAgICAgIG5hbWVkR3JhZHNbdi5uYW1lXSA9IGdyYWRzW2ldO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgaWYgKHNwZWNpZmllZE5vblRyYWluYWJsZSAhPSBudWxsKSB7XG4gICAgICAgIC8vIElmIHZhckxpc3QgaXMgZXhwbGljaXRseSBwcm92aWRlZCBhbmQgY29udGFpbnMgbm9uLXRyYWluYWJsZSB2YWx1ZXMsXG4gICAgICAgIC8vIGFkZCB0aGVtIHRvIHRoZSByZXR1cm5lZCBncmFkaWVudHMgd2l0aCBgbnVsbGAgdmFsdWVzLlxuICAgICAgICBzcGVjaWZpZWROb25UcmFpbmFibGUuZm9yRWFjaCh2ID0+IG5hbWVkR3JhZHNbdi5uYW1lXSA9IG51bGwpO1xuICAgIH1cbiAgICByZXR1cm4geyB2YWx1ZSwgZ3JhZHM6IG5hbWVkR3JhZHMgfTtcbn1cbi8qKlxuICogT3ZlcnJpZGVzIHRoZSBncmFkaWVudCBjb21wdXRhdGlvbiBvZiBhIGZ1bmN0aW9uIGBmYC5cbiAqXG4gKiBUYWtlcyBhIGZ1bmN0aW9uXG4gKiBgZiguLi5pbnB1dHMsIHNhdmUpID0+IHt2YWx1ZTogVGVuc29yLCBncmFkRnVuYzogKGR5LCBzYXZlZCkgPT4gVGVuc29yW119YFxuICogYW5kIHJldHVybnMgYW5vdGhlciBmdW5jdGlvbiBgZyguLi5pbnB1dHMpYCB3aGljaCB0YWtlcyB0aGUgc2FtZSBpbnB1dHMgYXNcbiAqIGBmYC4gV2hlbiBjYWxsZWQsIGBnYCByZXR1cm5zIGBmKCkudmFsdWVgLiBJbiBiYWNrd2FyZCBtb2RlLCBjdXN0b20gZ3JhZGllbnRzXG4gKiB3aXRoIHJlc3BlY3QgdG8gZWFjaCBpbnB1dCBvZiBgZmAgYXJlIGNvbXB1dGVkIHVzaW5nIGBmKCkuZ3JhZEZ1bmNgLlxuICpcbiAqIFRoZSBgc2F2ZWAgZnVuY3Rpb24gcGFzc3NlZCB0byBgZmAgc2hvdWxkIGJlIHVzZWQgZm9yIHNhdmluZyB0ZW5zb3JzIG5lZWRlZFxuICogaW4gdGhlIGdyYWRpZW50LiBBbmQgdGhlIGBzYXZlZGAgcGFzc2VkIHRvIHRoZSBgZ3JhZEZ1bmNgIGlzIGFcbiAqIGBOYW1lZFRlbnNvck1hcGAsIHdoaWNoIGNvbnRhaW5zIHRob3NlIHNhdmVkIHRlbnNvci5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgY3VzdG9tT3AgPSB0Zi5jdXN0b21HcmFkKCh4LCBzYXZlKSA9PiB7XG4gKiAgIC8vIFNhdmUgeCB0byBtYWtlIHN1cmUgaXQncyBhdmFpbGFibGUgbGF0ZXIgZm9yIHRoZSBncmFkaWVudC5cbiAqICAgc2F2ZShbeF0pO1xuICogICAvLyBPdmVycmlkZSBncmFkaWVudCBvZiBvdXIgY3VzdG9tIHggXiAyIG9wIHRvIGJlIGR5ICogYWJzKHgpO1xuICogICByZXR1cm4ge1xuICogICAgIHZhbHVlOiB4LnNxdWFyZSgpLFxuICogICAgIC8vIE5vdGUgYHNhdmVkLnhgIHdoaWNoIHBvaW50cyB0byB0aGUgYHhgIHdlIHNhdmVkIGVhcmxpZXIuXG4gKiAgICAgZ3JhZEZ1bmM6IChkeSwgc2F2ZWQpID0+IFtkeS5tdWwoc2F2ZWRbMF0uYWJzKCkpXVxuICogICB9O1xuICogfSk7XG4gKlxuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFstMSwgLTIsIDNdKTtcbiAqIGNvbnN0IGR4ID0gdGYuZ3JhZCh4ID0+IGN1c3RvbU9wKHgpKTtcbiAqXG4gKiBjb25zb2xlLmxvZyhgZih4KTpgKTtcbiAqIGN1c3RvbU9wKHgpLnByaW50KCk7XG4gKiBjb25zb2xlLmxvZyhgZicoeCk6YCk7XG4gKiBkeCh4KS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGYgVGhlIGZ1bmN0aW9uIHRvIGV2YWx1YXRlIGluIGZvcndhcmQgbW9kZSwgd2hpY2ggc2hvdWxkIHJldHVyblxuICogICAgIGB7dmFsdWU6IFRlbnNvciwgZ3JhZEZ1bmM6IChkeSwgc2F2ZWQpID0+IFRlbnNvcltdfWAsIHdoZXJlIGBncmFkRnVuY2BcbiAqICAgICByZXR1cm5zIHRoZSBjdXN0b20gZ3JhZGllbnRzIG9mIGBmYCB3aXRoIHJlc3BlY3QgdG8gaXRzIGlucHV0cy5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVHJhaW5pbmcnLCBzdWJoZWFkaW5nOiAnR3JhZGllbnRzJ31cbiAqL1xuZnVuY3Rpb24gY3VzdG9tR3JhZChmKSB7XG4gICAgcmV0dXJuIEVOR0lORS5jdXN0b21HcmFkKGYpO1xufVxuZnVuY3Rpb24gY2hlY2tHcmFkcyhncmFkcykge1xuICAgIGNvbnN0IG51bU51bGxHcmFkaWVudHMgPSBncmFkcy5maWx0ZXIoZyA9PiBnID09IG51bGwpLmxlbmd0aDtcbiAgICBpZiAobnVtTnVsbEdyYWRpZW50cyA+IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY29tcHV0ZSBncmFkaWVudCBvZiB5PWYoeCkgd2l0aCByZXNwZWN0IHRvIHguIE1ha2Ugc3VyZSB0aGF0XG4gICAgdGhlIGYgeW91IHBhc3NlZCBlbmNsb3NlcyBhbGwgb3BlcmF0aW9ucyB0aGF0IGxlYWQgZnJvbSB4IHRvIHkuYCk7XG4gICAgfVxufVxuZXhwb3J0IHsgY3VzdG9tR3JhZCwgdmFyaWFibGVHcmFkcywgdmFsdWVBbmRHcmFkLCB2YWx1ZUFuZEdyYWRzLCBncmFkLCBncmFkcywgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdyYWRpZW50cy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG4vLyBXb3JrYXJvdW5kIGZvciBhbGxvd2luZyBjanMgbW9kdWxlIHRvIGJlIGluY2x1ZGVkIGluIGJ1bmRsZSBjcmVhdGVkIGJ5XG4vLyByb2xsdXAuXG5pbXBvcnQgKiBhcyBMb25nRXhwb3J0cyBmcm9tICdsb25nJztcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZVxuY29uc3QgTG9uZyA9IFxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXG5Mb25nRXhwb3J0cy5kZWZhdWx0IHx8IExvbmdFeHBvcnRzO1xuZXhwb3J0IGZ1bmN0aW9uIGhleFRvTG9uZyhoZXgpIHtcbiAgICByZXR1cm4gTG9uZy5mcm9tU3RyaW5nKGhleCwgdHJ1ZSwgMTYpO1xufVxuLy8gU29tZSBwcmltZXMgYmV0d2VlbiAyXjYzIGFuZCAyXjY0IGZvciB2YXJpb3VzIHVzZXMuXG4vLyBIZXggMHhjM2E1Yzg1Yzk3Y2IzMTI3XG5jb25zdCBrMCA9IGhleFRvTG9uZygnYzNhNWM4NWM5N2NiMzEyNycpO1xuLy8gSGV4IDB4YjQ5MmI2NmZiZTk4ZjI3M1xuY29uc3QgazEgPSBoZXhUb0xvbmcoJ2I0OTJiNjZmYmU5OGYyNzMnKTtcbi8vIEhleCAweDlhZTE2YTNiMmY5MDQwNGZcbmNvbnN0IGsyID0gaGV4VG9Mb25nKCc5YWUxNmEzYjJmOTA0MDRmJyk7XG5mdW5jdGlvbiBzaGlmdE1peCh2YWwpIHtcbiAgICByZXR1cm4gdmFsLnhvcih2YWwuc2hydSg0NykpO1xufVxuZnVuY3Rpb24gZmV0Y2gocywgb2Zmc2V0LCBudW1CeXRlcykge1xuICAgIGNvbnN0IGJ5dGVzID0gcy5zbGljZShvZmZzZXQsIG9mZnNldCArIG51bUJ5dGVzKTtcbiAgICByZXR1cm4gTG9uZy5mcm9tQnl0ZXMoQXJyYXkuZnJvbShieXRlcyksIHRydWUsIHRydWUpO1xufVxuZnVuY3Rpb24gZmV0Y2g2NChzLCBvZmZzZXQpIHtcbiAgICByZXR1cm4gZmV0Y2gocywgb2Zmc2V0LCA4KTtcbn1cbmZ1bmN0aW9uIGZldGNoMzIocywgb2Zmc2V0KSB7XG4gICAgcmV0dXJuIGZldGNoKHMsIG9mZnNldCwgNCk7XG59XG5mdW5jdGlvbiByb3RhdGU2NCh2YWwsIHNoaWZ0KSB7XG4gICAgLy8gQXZvaWQgc2hpZnRpbmcgYnkgNjQ6IGRvaW5nIHNvIHlpZWxkcyBhbiB1bmRlZmluZWQgcmVzdWx0LlxuICAgIHJldHVybiBzaGlmdCA9PT0gMCA/IHZhbCA6IHZhbC5zaHJ1KHNoaWZ0KS5vcih2YWwuc2hsKDY0IC0gc2hpZnQpKTtcbn1cbmZ1bmN0aW9uIGhhc2hMZW4xNih1LCB2LCBtdWwgPSBoZXhUb0xvbmcoJzlkZGZlYTA4ZWIzODJkNjknKSkge1xuICAgIC8vIE11cm11ci1pbnNwaXJlZCBoYXNoaW5nLlxuICAgIGxldCBhID0gdS54b3IodikubXVsKG11bCk7XG4gICAgYSA9IGEueG9yKGEuc2hydSg0NykpO1xuICAgIGxldCBiID0gdi54b3IoYSkubXVsKG11bCk7XG4gICAgYiA9IGIueG9yKGIuc2hydSg0NykpO1xuICAgIGIgPSBiLm11bChtdWwpO1xuICAgIHJldHVybiBiO1xufVxuLy8gUmV0dXJuIGEgMTYtYnl0ZSBoYXNoIGZvciA0OCBieXRlcy4gIFF1aWNrIGFuZCBkaXJ0eS5cbi8vIENhbGxlcnMgZG8gYmVzdCB0byB1c2UgXCJyYW5kb20tbG9va2luZ1wiIHZhbHVlcyBmb3IgYSBhbmQgYi5cbmZ1bmN0aW9uIHdlYWtIYXNoTGVuMzJXaXRoU2VlZHModywgeCwgeSwgeiwgYSwgYikge1xuICAgIGEgPSBhLmFkZCh3KTtcbiAgICBiID0gcm90YXRlNjQoYi5hZGQoYSkuYWRkKHopLCAyMSk7XG4gICAgY29uc3QgYyA9IGE7XG4gICAgYSA9IGEuYWRkKHgpO1xuICAgIGEgPSBhLmFkZCh5KTtcbiAgICBiID0gYi5hZGQocm90YXRlNjQoYSwgNDQpKTtcbiAgICByZXR1cm4gW2EuYWRkKHopLCBiLmFkZChjKV07XG59XG5mdW5jdGlvbiB3ZWFrSGFzaExlbjMyV2l0aFNlZWRzU3RyKHMsIG9mZnNldCwgYSwgYikge1xuICAgIHJldHVybiB3ZWFrSGFzaExlbjMyV2l0aFNlZWRzKGZldGNoNjQocywgb2Zmc2V0KSwgZmV0Y2g2NChzLCBvZmZzZXQgKyA4KSwgZmV0Y2g2NChzLCBvZmZzZXQgKyAxNiksIGZldGNoNjQocywgb2Zmc2V0ICsgMjQpLCBhLCBiKTtcbn1cbmZ1bmN0aW9uIGhhc2hMZW4wdG8xNihzLCBsZW4gPSBzLmxlbmd0aCkge1xuICAgIGlmIChsZW4gPj0gOCkge1xuICAgICAgICBjb25zdCBtdWwgPSBrMi5hZGQobGVuICogMik7XG4gICAgICAgIGNvbnN0IGEgPSBmZXRjaDY0KHMsIDApLmFkZChrMik7XG4gICAgICAgIGNvbnN0IGIgPSBmZXRjaDY0KHMsIGxlbiAtIDgpO1xuICAgICAgICBjb25zdCBjID0gcm90YXRlNjQoYiwgMzcpLm11bChtdWwpLmFkZChhKTtcbiAgICAgICAgY29uc3QgZCA9IHJvdGF0ZTY0KGEsIDI1KS5hZGQoYikubXVsKG11bCk7XG4gICAgICAgIHJldHVybiBoYXNoTGVuMTYoYywgZCwgbXVsKTtcbiAgICB9XG4gICAgaWYgKGxlbiA+PSA0KSB7XG4gICAgICAgIGNvbnN0IG11bCA9IGsyLmFkZChsZW4gKiAyKTtcbiAgICAgICAgY29uc3QgYSA9IGZldGNoMzIocywgMCk7XG4gICAgICAgIHJldHVybiBoYXNoTGVuMTYoYS5zaGwoMykuYWRkKGxlbiksIGZldGNoMzIocywgbGVuIC0gNCksIG11bCk7XG4gICAgfVxuICAgIGlmIChsZW4gPiAwKSB7XG4gICAgICAgIGNvbnN0IGEgPSBzWzBdO1xuICAgICAgICBjb25zdCBiID0gc1tsZW4gPj4gMV07XG4gICAgICAgIGNvbnN0IGMgPSBzW2xlbiAtIDFdO1xuICAgICAgICBjb25zdCB5ID0gYSArIChiIDw8IDgpO1xuICAgICAgICBjb25zdCB6ID0gbGVuICsgKGMgPDwgMik7XG4gICAgICAgIHJldHVybiBzaGlmdE1peChrMi5tdWwoeSkueG9yKGswLm11bCh6KSkpLm11bChrMik7XG4gICAgfVxuICAgIHJldHVybiBrMjtcbn1cbmZ1bmN0aW9uIGhhc2hMZW4xN3RvMzIocywgbGVuID0gcy5sZW5ndGgpIHtcbiAgICBjb25zdCBtdWwgPSBrMi5hZGQobGVuICogMik7XG4gICAgY29uc3QgYSA9IGZldGNoNjQocywgMCkubXVsKGsxKTtcbiAgICBjb25zdCBiID0gZmV0Y2g2NChzLCA4KTtcbiAgICBjb25zdCBjID0gZmV0Y2g2NChzLCBsZW4gLSA4KS5tdWwobXVsKTtcbiAgICBjb25zdCBkID0gZmV0Y2g2NChzLCBsZW4gLSAxNikubXVsKGsyKTtcbiAgICByZXR1cm4gaGFzaExlbjE2KHJvdGF0ZTY0KGEuYWRkKGIpLCA0MykuYWRkKHJvdGF0ZTY0KGMsIDMwKSkuYWRkKGQpLCBhLmFkZChyb3RhdGU2NChiLmFkZChrMiksIDE4KSkuYWRkKGMpLCBtdWwpO1xufVxuZnVuY3Rpb24gaGFzaExlbjMzdG82NChzLCBsZW4gPSBzLmxlbmd0aCkge1xuICAgIGNvbnN0IG11bCA9IGsyLmFkZChsZW4gKiAyKTtcbiAgICBjb25zdCBhID0gZmV0Y2g2NChzLCAwKS5tdWwoazIpO1xuICAgIGNvbnN0IGIgPSBmZXRjaDY0KHMsIDgpO1xuICAgIGNvbnN0IGMgPSBmZXRjaDY0KHMsIGxlbiAtIDgpLm11bChtdWwpO1xuICAgIGNvbnN0IGQgPSBmZXRjaDY0KHMsIGxlbiAtIDE2KS5tdWwoazIpO1xuICAgIGNvbnN0IHkgPSByb3RhdGU2NChhLmFkZChiKSwgNDMpLmFkZChyb3RhdGU2NChjLCAzMCkpLmFkZChkKTtcbiAgICBjb25zdCB6ID0gaGFzaExlbjE2KHksIGEuYWRkKHJvdGF0ZTY0KGIuYWRkKGsyKSwgMTgpKS5hZGQoYyksIG11bCk7XG4gICAgY29uc3QgZSA9IGZldGNoNjQocywgMTYpLm11bChtdWwpO1xuICAgIGNvbnN0IGYgPSBmZXRjaDY0KHMsIDI0KTtcbiAgICBjb25zdCBnID0geS5hZGQoZmV0Y2g2NChzLCBsZW4gLSAzMikpLm11bChtdWwpO1xuICAgIGNvbnN0IGggPSB6LmFkZChmZXRjaDY0KHMsIGxlbiAtIDI0KSkubXVsKG11bCk7XG4gICAgcmV0dXJuIGhhc2hMZW4xNihyb3RhdGU2NChlLmFkZChmKSwgNDMpLmFkZChyb3RhdGU2NChnLCAzMCkpLmFkZChoKSwgZS5hZGQocm90YXRlNjQoZi5hZGQoYSksIDE4KSkuYWRkKGcpLCBtdWwpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGZpbmdlclByaW50NjQocywgbGVuID0gcy5sZW5ndGgpIHtcbiAgICBjb25zdCBzZWVkID0gTG9uZy5mcm9tTnVtYmVyKDgxLCB0cnVlKTtcbiAgICBpZiAobGVuIDw9IDMyKSB7XG4gICAgICAgIGlmIChsZW4gPD0gMTYpIHtcbiAgICAgICAgICAgIHJldHVybiBoYXNoTGVuMHRvMTYocywgbGVuKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBoYXNoTGVuMTd0bzMyKHMsIGxlbik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAobGVuIDw9IDY0KSB7XG4gICAgICAgIHJldHVybiBoYXNoTGVuMzN0bzY0KHMsIGxlbik7XG4gICAgfVxuICAgIC8vIEZvciBzdHJpbmdzIG92ZXIgNjQgYnl0ZXMgd2UgbG9vcC4gIEludGVybmFsIHN0YXRlIGNvbnNpc3RzIG9mXG4gICAgLy8gNTYgYnl0ZXM6IHYsIHcsIHgsIHksIGFuZCB6LlxuICAgIGxldCB4ID0gc2VlZDtcbiAgICBsZXQgeSA9IHNlZWQubXVsKGsxKS5hZGQoMTEzKTtcbiAgICBsZXQgeiA9IHNoaWZ0TWl4KHkubXVsKGsyKS5hZGQoMTEzKSkubXVsKGsyKTtcbiAgICBsZXQgdiA9IFtMb25nLlVaRVJPLCBMb25nLlVaRVJPXTtcbiAgICBsZXQgdyA9IFtMb25nLlVaRVJPLCBMb25nLlVaRVJPXTtcbiAgICB4ID0geC5tdWwoazIpLmFkZChmZXRjaDY0KHMsIDApKTtcbiAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICAvLyBTZXQgZW5kIHNvIHRoYXQgYWZ0ZXIgdGhlIGxvb3Agd2UgaGF2ZSAxIHRvIDY0IGJ5dGVzIGxlZnQgdG8gcHJvY2Vzcy5cbiAgICBjb25zdCBlbmQgPSAoKGxlbiAtIDEpID4+IDYpICogNjQ7XG4gICAgY29uc3QgbGFzdDY0ID0gZW5kICsgKChsZW4gLSAxKSAmIDYzKSAtIDYzO1xuICAgIGRvIHtcbiAgICAgICAgeCA9IHJvdGF0ZTY0KHguYWRkKHkpLmFkZCh2WzBdKS5hZGQoZmV0Y2g2NChzLCBvZmZzZXQgKyA4KSksIDM3KS5tdWwoazEpO1xuICAgICAgICB5ID0gcm90YXRlNjQoeS5hZGQodlsxXSkuYWRkKGZldGNoNjQocywgb2Zmc2V0ICsgNDgpKSwgNDIpLm11bChrMSk7XG4gICAgICAgIHggPSB4Lnhvcih3WzFdKTtcbiAgICAgICAgeSA9IHkuYWRkKHZbMF0pLmFkZChmZXRjaDY0KHMsIG9mZnNldCArIDQwKSk7XG4gICAgICAgIHogPSByb3RhdGU2NCh6LmFkZCh3WzBdKSwgMzMpLm11bChrMSk7XG4gICAgICAgIHYgPSB3ZWFrSGFzaExlbjMyV2l0aFNlZWRzU3RyKHMsIG9mZnNldCwgdlsxXS5tdWwoazEpLCB4LmFkZCh3WzBdKSk7XG4gICAgICAgIHcgPSB3ZWFrSGFzaExlbjMyV2l0aFNlZWRzU3RyKHMsIG9mZnNldCArIDMyLCB6LmFkZCh3WzFdKSwgeS5hZGQoZmV0Y2g2NChzLCBvZmZzZXQgKyAxNikpKTtcbiAgICAgICAgW3osIHhdID0gW3gsIHpdO1xuICAgICAgICBvZmZzZXQgKz0gNjQ7XG4gICAgfSB3aGlsZSAob2Zmc2V0ICE9PSBlbmQpO1xuICAgIGNvbnN0IG11bCA9IGsxLmFkZCh6LmFuZCgweGZmKS5zaGwoMSkpO1xuICAgIC8vIFBvaW50IHRvIHRoZSBsYXN0IDY0IGJ5dGVzIG9mIGlucHV0LlxuICAgIG9mZnNldCA9IGxhc3Q2NDtcbiAgICB3WzBdID0gd1swXS5hZGQoKGxlbiAtIDEpICYgNjMpO1xuICAgIHZbMF0gPSB2WzBdLmFkZCh3WzBdKTtcbiAgICB3WzBdID0gd1swXS5hZGQodlswXSk7XG4gICAgeCA9IHJvdGF0ZTY0KHguYWRkKHkpLmFkZCh2WzBdKS5hZGQoZmV0Y2g2NChzLCBvZmZzZXQgKyA4KSksIDM3KS5tdWwobXVsKTtcbiAgICB5ID0gcm90YXRlNjQoeS5hZGQodlsxXSkuYWRkKGZldGNoNjQocywgb2Zmc2V0ICsgNDgpKSwgNDIpLm11bChtdWwpO1xuICAgIHggPSB4Lnhvcih3WzFdLm11bCg5KSk7XG4gICAgeSA9IHkuYWRkKHZbMF0ubXVsKDkpLmFkZChmZXRjaDY0KHMsIG9mZnNldCArIDQwKSkpO1xuICAgIHogPSByb3RhdGU2NCh6LmFkZCh3WzBdKSwgMzMpLm11bChtdWwpO1xuICAgIHYgPSB3ZWFrSGFzaExlbjMyV2l0aFNlZWRzU3RyKHMsIG9mZnNldCwgdlsxXS5tdWwobXVsKSwgeC5hZGQod1swXSkpO1xuICAgIHcgPSB3ZWFrSGFzaExlbjMyV2l0aFNlZWRzU3RyKHMsIG9mZnNldCArIDMyLCB6LmFkZCh3WzFdKSwgeS5hZGQoZmV0Y2g2NChzLCBvZmZzZXQgKyAxNikpKTtcbiAgICBbeiwgeF0gPSBbeCwgel07XG4gICAgcmV0dXJuIGhhc2hMZW4xNihoYXNoTGVuMTYodlswXSwgd1swXSwgbXVsKS5hZGQoc2hpZnRNaXgoeSkubXVsKGswKSkuYWRkKHopLCBoYXNoTGVuMTYodlsxXSwgd1sxXSwgbXVsKS5hZGQoeCksIG11bCk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1oYXNoX3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuLy8gUmVxdWlyZWQgc2lkZSBlZmZlY3RmdWwgY29kZS5cbmltcG9ydCAnLi9iYXNlX3NpZGVfZWZmZWN0cyc7XG4vLyBBbGwgZXhwb3J0cyBmcm9tIHRoaXMgcGFja2FnZSBzaG91bGQgYmUgaW4gYmFzZS5cbmV4cG9ydCAqIGZyb20gJy4vYmFzZSc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG4vKipcbiAqIElPSGFuZGxlcnMgcmVsYXRlZCB0byBmaWxlcywgc3VjaCBhcyBicm93c2VyLXRyaWdnZXJlZCBmaWxlIGRvd25sb2FkcyxcbiAqIHVzZXItc2VsZWN0ZWQgZmlsZXMgaW4gYnJvd3Nlci5cbiAqL1xuaW1wb3J0ICcuLi9mbGFncyc7XG5pbXBvcnQgeyBlbnYgfSBmcm9tICcuLi9lbnZpcm9ubWVudCc7XG5pbXBvcnQgeyBiYXNlbmFtZSwgY29uY2F0ZW5hdGVBcnJheUJ1ZmZlcnMsIGdldE1vZGVsQXJ0aWZhY3RzRm9ySlNPTiwgZ2V0TW9kZWxBcnRpZmFjdHNJbmZvRm9ySlNPTiwgZ2V0TW9kZWxKU09ORm9yTW9kZWxBcnRpZmFjdHMgfSBmcm9tICcuL2lvX3V0aWxzJztcbmltcG9ydCB7IElPUm91dGVyUmVnaXN0cnkgfSBmcm9tICcuL3JvdXRlcl9yZWdpc3RyeSc7XG5jb25zdCBERUZBVUxUX0ZJTEVfTkFNRV9QUkVGSVggPSAnbW9kZWwnO1xuY29uc3QgREVGQVVMVF9KU09OX0VYVEVOU0lPTl9OQU1FID0gJy5qc29uJztcbmNvbnN0IERFRkFVTFRfV0VJR0hUX0RBVEFfRVhURU5TSU9OX05BTUUgPSAnLndlaWdodHMuYmluJztcbmZ1bmN0aW9uIGRlZmVyKGYpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUpKS50aGVuKGYpO1xufVxuZXhwb3J0IGNsYXNzIEJyb3dzZXJEb3dubG9hZHMge1xuICAgIGNvbnN0cnVjdG9yKGZpbGVOYW1lUHJlZml4KSB7XG4gICAgICAgIGlmICghZW52KCkuZ2V0Qm9vbCgnSVNfQlJPV1NFUicpKSB7XG4gICAgICAgICAgICAvLyBUT0RPKGNhaXMpOiBQcm92aWRlIGluZm8gb24gd2hhdCBJT0hhbmRsZXJzIGFyZSBhdmFpbGFibGUgdW5kZXIgdGhlXG4gICAgICAgICAgICAvLyAgIGN1cnJlbnQgZW52aXJvbm1lbnQuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Jyb3dzZXJEb3dubG9hZHMoKSBjYW5ub3QgcHJvY2VlZCBiZWNhdXNlIHRoZSBjdXJyZW50IGVudmlyb25tZW50ICcgK1xuICAgICAgICAgICAgICAgICdpcyBub3QgYSBicm93c2VyLicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaWxlTmFtZVByZWZpeC5zdGFydHNXaXRoKEJyb3dzZXJEb3dubG9hZHMuVVJMX1NDSEVNRSkpIHtcbiAgICAgICAgICAgIGZpbGVOYW1lUHJlZml4ID0gZmlsZU5hbWVQcmVmaXguc2xpY2UoQnJvd3NlckRvd25sb2Fkcy5VUkxfU0NIRU1FLmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbGVOYW1lUHJlZml4ID09IG51bGwgfHwgZmlsZU5hbWVQcmVmaXgubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBmaWxlTmFtZVByZWZpeCA9IERFRkFVTFRfRklMRV9OQU1FX1BSRUZJWDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1vZGVsSnNvbkZpbGVOYW1lID0gZmlsZU5hbWVQcmVmaXggKyBERUZBVUxUX0pTT05fRVhURU5TSU9OX05BTUU7XG4gICAgICAgIHRoaXMud2VpZ2h0RGF0YUZpbGVOYW1lID1cbiAgICAgICAgICAgIGZpbGVOYW1lUHJlZml4ICsgREVGQVVMVF9XRUlHSFRfREFUQV9FWFRFTlNJT05fTkFNRTtcbiAgICB9XG4gICAgYXN5bmMgc2F2ZShtb2RlbEFydGlmYWN0cykge1xuICAgICAgICBpZiAodHlwZW9mIChkb2N1bWVudCkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Jyb3dzZXIgZG93bmxvYWRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICcgK1xuICAgICAgICAgICAgICAgICd0aGlzIGVudmlyb25tZW50IHNpbmNlIGBkb2N1bWVudGAgaXMgbm90IHByZXNlbnQnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB3ZWlnaHRzVVJMID0gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW21vZGVsQXJ0aWZhY3RzLndlaWdodERhdGFdLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nIH0pKTtcbiAgICAgICAgaWYgKG1vZGVsQXJ0aWZhY3RzLm1vZGVsVG9wb2xvZ3kgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCcm93c2VyRG93bmxvYWRzLnNhdmUoKSBkb2VzIG5vdCBzdXBwb3J0IHNhdmluZyBtb2RlbCB0b3BvbG9neSAnICtcbiAgICAgICAgICAgICAgICAnaW4gYmluYXJ5IGZvcm1hdHMgeWV0LicpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgd2VpZ2h0c01hbmlmZXN0ID0gW3tcbiAgICAgICAgICAgICAgICAgICAgcGF0aHM6IFsnLi8nICsgdGhpcy53ZWlnaHREYXRhRmlsZU5hbWVdLFxuICAgICAgICAgICAgICAgICAgICB3ZWlnaHRzOiBtb2RlbEFydGlmYWN0cy53ZWlnaHRTcGVjc1xuICAgICAgICAgICAgICAgIH1dO1xuICAgICAgICAgICAgY29uc3QgbW9kZWxKU09OID0gZ2V0TW9kZWxKU09ORm9yTW9kZWxBcnRpZmFjdHMobW9kZWxBcnRpZmFjdHMsIHdlaWdodHNNYW5pZmVzdCk7XG4gICAgICAgICAgICBjb25zdCBtb2RlbEpzb25VUkwgPSB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbSlNPTi5zdHJpbmdpZnkobW9kZWxKU09OKV0sIHsgdHlwZTogJ2FwcGxpY2F0aW9uL2pzb24nIH0pKTtcbiAgICAgICAgICAgIC8vIElmIGFuY2hvciBlbGVtZW50cyBhcmUgbm90IHByb3ZpZGVkLCBjcmVhdGUgdGhlbSB3aXRob3V0IGF0dGFjaGluZyB0aGVtXG4gICAgICAgICAgICAvLyB0byBwYXJlbnRzLCBzbyB0aGF0IHRoZSBkb3dubG9hZGVkIGZpbGUgbmFtZXMgY2FuIGJlIGNvbnRyb2xsZWQuXG4gICAgICAgICAgICBjb25zdCBqc29uQW5jaG9yID0gdGhpcy5tb2RlbEpzb25BbmNob3IgPT0gbnVsbCA/XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpIDpcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsSnNvbkFuY2hvcjtcbiAgICAgICAgICAgIGpzb25BbmNob3IuZG93bmxvYWQgPSB0aGlzLm1vZGVsSnNvbkZpbGVOYW1lO1xuICAgICAgICAgICAganNvbkFuY2hvci5ocmVmID0gbW9kZWxKc29uVVJMO1xuICAgICAgICAgICAgLy8gVHJpZ2dlciBkb3dubG9hZHMgYnkgZXZva2luZyBhIGNsaWNrIGV2ZW50IG9uIHRoZSBkb3dubG9hZCBhbmNob3JzLlxuICAgICAgICAgICAgLy8gV2hlbiBtdWx0aXBsZSBkb3dubG9hZHMgYXJlIHN0YXJ0ZWQgc3luY2hyb25vdXNseSwgRmlyZWZveCB3aWxsIG9ubHlcbiAgICAgICAgICAgIC8vIHNhdmUgdGhlIGxhc3Qgb25lLlxuICAgICAgICAgICAgYXdhaXQgZGVmZXIoKCkgPT4ganNvbkFuY2hvci5kaXNwYXRjaEV2ZW50KG5ldyBNb3VzZUV2ZW50KCdjbGljaycpKSk7XG4gICAgICAgICAgICBpZiAobW9kZWxBcnRpZmFjdHMud2VpZ2h0RGF0YSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgd2VpZ2h0RGF0YUFuY2hvciA9IHRoaXMud2VpZ2h0RGF0YUFuY2hvciA9PSBudWxsID9cbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpIDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53ZWlnaHREYXRhQW5jaG9yO1xuICAgICAgICAgICAgICAgIHdlaWdodERhdGFBbmNob3IuZG93bmxvYWQgPSB0aGlzLndlaWdodERhdGFGaWxlTmFtZTtcbiAgICAgICAgICAgICAgICB3ZWlnaHREYXRhQW5jaG9yLmhyZWYgPSB3ZWlnaHRzVVJMO1xuICAgICAgICAgICAgICAgIGF3YWl0IGRlZmVyKCgpID0+IHdlaWdodERhdGFBbmNob3IuZGlzcGF0Y2hFdmVudChuZXcgTW91c2VFdmVudCgnY2xpY2snKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHsgbW9kZWxBcnRpZmFjdHNJbmZvOiBnZXRNb2RlbEFydGlmYWN0c0luZm9Gb3JKU09OKG1vZGVsQXJ0aWZhY3RzKSB9O1xuICAgICAgICB9XG4gICAgfVxufVxuQnJvd3NlckRvd25sb2Fkcy5VUkxfU0NIRU1FID0gJ2Rvd25sb2FkczovLyc7XG5jbGFzcyBCcm93c2VyRmlsZXMge1xuICAgIGNvbnN0cnVjdG9yKGZpbGVzKSB7XG4gICAgICAgIGlmIChmaWxlcyA9PSBudWxsIHx8IGZpbGVzLmxlbmd0aCA8IDEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgV2hlbiBjYWxsaW5nIGJyb3dzZXJGaWxlcywgYXQgbGVhc3QgMSBmaWxlIGlzIHJlcXVpcmVkLCBgICtcbiAgICAgICAgICAgICAgICBgYnV0IHJlY2VpdmVkICR7ZmlsZXN9YCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5qc29uRmlsZSA9IGZpbGVzWzBdO1xuICAgICAgICB0aGlzLndlaWdodHNGaWxlcyA9IGZpbGVzLnNsaWNlKDEpO1xuICAgIH1cbiAgICBhc3luYyBsb2FkKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QganNvblJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgICAgICAgICBqc29uUmVhZGVyLm9ubG9hZCA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgICAgICAgICAgICAgICBjb25zdCBtb2RlbEpTT04gPSBKU09OLnBhcnNlKGV2ZW50LnRhcmdldC5yZXN1bHQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1vZGVsVG9wb2xvZ3kgPSBtb2RlbEpTT04ubW9kZWxUb3BvbG9neTtcbiAgICAgICAgICAgICAgICBpZiAobW9kZWxUb3BvbG9neSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYG1vZGVsVG9wb2xvZ3kgZmllbGQgaXMgbWlzc2luZyBmcm9tIGZpbGUgJHt0aGlzLmpzb25GaWxlLm5hbWV9YCkpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHdlaWdodHNNYW5pZmVzdCA9IG1vZGVsSlNPTi53ZWlnaHRzTWFuaWZlc3Q7XG4gICAgICAgICAgICAgICAgaWYgKHdlaWdodHNNYW5pZmVzdCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYHdlaWdodE1hbmlmZXN0IGZpZWxkIGlzIG1pc3NpbmcgZnJvbSBmaWxlICR7dGhpcy5qc29uRmlsZS5uYW1lfWApKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcy53ZWlnaHRzRmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoeyBtb2RlbFRvcG9sb2d5IH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IG1vZGVsQXJ0aWZhY3RzUHJvbWlzZSA9IGdldE1vZGVsQXJ0aWZhY3RzRm9ySlNPTihtb2RlbEpTT04sICh3ZWlnaHRzTWFuaWZlc3QpID0+IHRoaXMubG9hZFdlaWdodHMod2VpZ2h0c01hbmlmZXN0KSk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShtb2RlbEFydGlmYWN0c1Byb21pc2UpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGpzb25SZWFkZXIub25lcnJvciA9IGVycm9yID0+IHJlamVjdChgRmFpbGVkIHRvIHJlYWQgbW9kZWwgdG9wb2xvZ3kgYW5kIHdlaWdodHMgbWFuaWZlc3QgSlNPTiBgICtcbiAgICAgICAgICAgICAgICBgZnJvbSBmaWxlICcke3RoaXMuanNvbkZpbGUubmFtZX0nLiBCcm93c2VyRmlsZXMgc3VwcG9ydHMgbG9hZGluZyBgICtcbiAgICAgICAgICAgICAgICBgS2VyYXMtc3R5bGUgdGYuTW9kZWwgYXJ0aWZhY3RzIG9ubHkuYCk7XG4gICAgICAgICAgICBqc29uUmVhZGVyLnJlYWRBc1RleHQodGhpcy5qc29uRmlsZSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBsb2FkV2VpZ2h0cyh3ZWlnaHRzTWFuaWZlc3QpIHtcbiAgICAgICAgY29uc3Qgd2VpZ2h0U3BlY3MgPSBbXTtcbiAgICAgICAgY29uc3QgcGF0aHMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiB3ZWlnaHRzTWFuaWZlc3QpIHtcbiAgICAgICAgICAgIHdlaWdodFNwZWNzLnB1c2goLi4uZW50cnkud2VpZ2h0cyk7XG4gICAgICAgICAgICBwYXRocy5wdXNoKC4uLmVudHJ5LnBhdGhzKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXRoVG9GaWxlID0gdGhpcy5jaGVja01hbmlmZXN0QW5kV2VpZ2h0RmlsZXMod2VpZ2h0c01hbmlmZXN0KTtcbiAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBwYXRocy5tYXAocGF0aCA9PiB0aGlzLmxvYWRXZWlnaHRzRmlsZShwYXRoLCBwYXRoVG9GaWxlW3BhdGhdKSk7XG4gICAgICAgIHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbihidWZmZXJzID0+IFt3ZWlnaHRTcGVjcywgY29uY2F0ZW5hdGVBcnJheUJ1ZmZlcnMoYnVmZmVycyldKTtcbiAgICB9XG4gICAgbG9hZFdlaWdodHNGaWxlKHBhdGgsIGZpbGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHdlaWdodEZpbGVSZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgICAgICAgd2VpZ2h0RmlsZVJlYWRlci5vbmxvYWQgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gICAgICAgICAgICAgICAgY29uc3Qgd2VpZ2h0RGF0YSA9IGV2ZW50LnRhcmdldC5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh3ZWlnaHREYXRhKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB3ZWlnaHRGaWxlUmVhZGVyLm9uZXJyb3IgPSBlcnJvciA9PiByZWplY3QoYEZhaWxlZCB0byB3ZWlnaHRzIGRhdGEgZnJvbSBmaWxlIG9mIHBhdGggJyR7cGF0aH0nLmApO1xuICAgICAgICAgICAgd2VpZ2h0RmlsZVJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihmaWxlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoZWNrIHRoZSBjb21wYXRpYmlsaXR5IGJldHdlZW4gd2VpZ2h0cyBtYW5pZmVzdCBhbmQgd2VpZ2h0IGZpbGVzLlxuICAgICAqL1xuICAgIGNoZWNrTWFuaWZlc3RBbmRXZWlnaHRGaWxlcyhtYW5pZmVzdCkge1xuICAgICAgICBjb25zdCBiYXNlbmFtZXMgPSBbXTtcbiAgICAgICAgY29uc3QgZmlsZU5hbWVzID0gdGhpcy53ZWlnaHRzRmlsZXMubWFwKGZpbGUgPT4gYmFzZW5hbWUoZmlsZS5uYW1lKSk7XG4gICAgICAgIGNvbnN0IHBhdGhUb0ZpbGUgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBncm91cCBvZiBtYW5pZmVzdCkge1xuICAgICAgICAgICAgZ3JvdXAucGF0aHMuZm9yRWFjaChwYXRoID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXRoQmFzZW5hbWUgPSBiYXNlbmFtZShwYXRoKTtcbiAgICAgICAgICAgICAgICBpZiAoYmFzZW5hbWVzLmluZGV4T2YocGF0aEJhc2VuYW1lKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEdXBsaWNhdGUgZmlsZSBiYXNlbmFtZSBmb3VuZCBpbiB3ZWlnaHRzIG1hbmlmZXN0OiBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGAnJHtwYXRoQmFzZW5hbWV9J2ApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBiYXNlbmFtZXMucHVzaChwYXRoQmFzZW5hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChmaWxlTmFtZXMuaW5kZXhPZihwYXRoQmFzZW5hbWUpID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFdlaWdodCBmaWxlIHdpdGggYmFzZW5hbWUgJyR7cGF0aEJhc2VuYW1lfScgaXMgbm90IHByb3ZpZGVkLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcGF0aFRvRmlsZVtwYXRoXSA9IHRoaXMud2VpZ2h0c0ZpbGVzW2ZpbGVOYW1lcy5pbmRleE9mKHBhdGhCYXNlbmFtZSldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiYXNlbmFtZXMubGVuZ3RoICE9PSB0aGlzLndlaWdodHNGaWxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzbWF0Y2ggaW4gdGhlIG51bWJlciBvZiBmaWxlcyBpbiB3ZWlnaHRzIG1hbmlmZXN0IGAgK1xuICAgICAgICAgICAgICAgIGAoJHtiYXNlbmFtZXMubGVuZ3RofSkgYW5kIHRoZSBudW1iZXIgb2Ygd2VpZ2h0IGZpbGVzIHByb3ZpZGVkIGAgK1xuICAgICAgICAgICAgICAgIGAoJHt0aGlzLndlaWdodHNGaWxlcy5sZW5ndGh9KS5gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGF0aFRvRmlsZTtcbiAgICB9XG59XG5leHBvcnQgY29uc3QgYnJvd3NlckRvd25sb2Fkc1JvdXRlciA9ICh1cmwpID0+IHtcbiAgICBpZiAoIWVudigpLmdldEJvb2woJ0lTX0JST1dTRVInKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh1cmwpICYmIHVybC5zdGFydHNXaXRoKEJyb3dzZXJEb3dubG9hZHMuVVJMX1NDSEVNRSkpIHtcbiAgICAgICAgICAgIHJldHVybiBicm93c2VyRG93bmxvYWRzKHVybC5zbGljZShCcm93c2VyRG93bmxvYWRzLlVSTF9TQ0hFTUUubGVuZ3RoKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbn07XG5JT1JvdXRlclJlZ2lzdHJ5LnJlZ2lzdGVyU2F2ZVJvdXRlcihicm93c2VyRG93bmxvYWRzUm91dGVyKTtcbi8qKlxuICogQ3JlYXRlcyBhbiBJT0hhbmRsZXIgdGhhdCB0cmlnZ2VycyBmaWxlIGRvd25sb2FkcyBmcm9tIHRoZSBicm93c2VyLlxuICpcbiAqIFRoZSByZXR1cm5lZCBgSU9IYW5kbGVyYCBpbnN0YW5jZSBjYW4gYmUgdXNlZCBhcyBtb2RlbCBleHBvcnRpbmcgbWV0aG9kcyBzdWNoXG4gKiBhcyBgdGYuTW9kZWwuc2F2ZWAgYW5kIHN1cHBvcnRzIG9ubHkgc2F2aW5nLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBtb2RlbCA9IHRmLnNlcXVlbnRpYWwoKTtcbiAqIG1vZGVsLmFkZCh0Zi5sYXllcnMuZGVuc2UoXG4gKiAgICAge3VuaXRzOiAxLCBpbnB1dFNoYXBlOiBbMTBdLCBhY3RpdmF0aW9uOiAnc2lnbW9pZCd9KSk7XG4gKiBjb25zdCBzYXZlUmVzdWx0ID0gYXdhaXQgbW9kZWwuc2F2ZSgnZG93bmxvYWRzOi8vbXltb2RlbCcpO1xuICogLy8gVGhpcyB3aWxsIHRyaWdnZXIgZG93bmxvYWRpbmcgb2YgdHdvIGZpbGVzOlxuICogLy8gICAnbXltb2RlbC5qc29uJyBhbmQgJ215bW9kZWwud2VpZ2h0cy5iaW4nLlxuICogY29uc29sZS5sb2coc2F2ZVJlc3VsdCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gZmlsZU5hbWVQcmVmaXggUHJlZml4IG5hbWUgb2YgdGhlIGZpbGVzIHRvIGJlIGRvd25sb2FkZWQuIEZvciB1c2Ugd2l0aFxuICogICBgdGYuTW9kZWxgLCBgZmlsZU5hbWVQcmVmaXhgIHNob3VsZCBmb2xsb3cgZWl0aGVyIG9mIHRoZSBmb2xsb3dpbmcgdHdvXG4gKiAgIGZvcm1hdHM6XG4gKiAgIDEuIGBudWxsYCBvciBgdW5kZWZpbmVkYCwgaW4gd2hpY2ggY2FzZSB0aGUgZGVmYXVsdCBmaWxlXG4gKiAgICAgIG5hbWVzIHdpbGwgYmUgdXNlZDpcbiAqICAgICAgLSAnbW9kZWwuanNvbicgZm9yIHRoZSBKU09OIGZpbGUgY29udGFpbmluZyB0aGUgbW9kZWwgdG9wb2xvZ3kgYW5kXG4gKiAgICAgICAgd2VpZ2h0cyBtYW5pZmVzdC5cbiAqICAgICAgLSAnbW9kZWwud2VpZ2h0cy5iaW4nIGZvciB0aGUgYmluYXJ5IGZpbGUgY29udGFpbmluZyB0aGUgYmluYXJ5IHdlaWdodFxuICogICAgICAgIHZhbHVlcy5cbiAqICAgMi4gQSBzaW5nbGUgc3RyaW5nIG9yIGFuIEFycmF5IG9mIGEgc2luZ2xlIHN0cmluZywgYXMgdGhlIGZpbGUgbmFtZSBwcmVmaXguXG4gKiAgICAgIEZvciBleGFtcGxlLCBpZiBgJ2ZvbydgIGlzIHByb3ZpZGVkLCB0aGUgZG93bmxvYWRlZCBKU09OXG4gKiAgICAgIGZpbGUgYW5kIGJpbmFyeSB3ZWlnaHRzIGZpbGUgd2lsbCBiZSBuYW1lZCAnZm9vLmpzb24nIGFuZFxuICogICAgICAnZm9vLndlaWdodHMuYmluJywgcmVzcGVjdGl2ZWx5LlxuICogQHBhcmFtIGNvbmZpZyBBZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb24gZm9yIHRyaWdnZXJpbmcgZG93bmxvYWRzLlxuICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgYEJyb3dzZXJEb3dubG9hZHNgIGBJT0hhbmRsZXJgLlxuICpcbiAqIEBkb2Mge1xuICogICBoZWFkaW5nOiAnTW9kZWxzJyxcbiAqICAgc3ViaGVhZGluZzogJ0xvYWRpbmcnLFxuICogICBuYW1lc3BhY2U6ICdpbycsXG4gKiAgIGlnbm9yZUNJOiB0cnVlXG4gKiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBicm93c2VyRG93bmxvYWRzKGZpbGVOYW1lUHJlZml4ID0gJ21vZGVsJykge1xuICAgIHJldHVybiBuZXcgQnJvd3NlckRvd25sb2FkcyhmaWxlTmFtZVByZWZpeCk7XG59XG4vKipcbiAqIENyZWF0ZXMgYW4gSU9IYW5kbGVyIHRoYXQgbG9hZHMgbW9kZWwgYXJ0aWZhY3RzIGZyb20gdXNlci1zZWxlY3RlZCBmaWxlcy5cbiAqXG4gKiBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCBmb3IgbG9hZGluZyBmcm9tIGZpbGVzIHN1Y2ggYXMgdXNlci1zZWxlY3RlZCBmaWxlc1xuICogaW4gdGhlIGJyb3dzZXIuXG4gKiBXaGVuIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBgdGYubG9hZExheWVyc01vZGVsYCwgYW4gaW5zdGFuY2Ugb2ZcbiAqIGB0Zi5MYXllcnNNb2RlbGAgKEtlcmFzLXN0eWxlKSBjYW4gYmUgY29uc3RydWN0ZWQgZnJvbSB0aGUgbG9hZGVkIGFydGlmYWN0cy5cbiAqXG4gKiBgYGBqc1xuICogLy8gTm90ZTogVGhpcyBjb2RlIHNuaXBwZXQgd29uJ3QgcnVuIHByb3Blcmx5IHdpdGhvdXQgdGhlIGFjdHVhbCBmaWxlIGlucHV0XG4gKiAvLyAgIGVsZW1lbnRzIGluIHRoZSBIVE1MIERPTS5cbiAqXG4gKiAvLyBTdXBwb3NlIHRoZXJlIGFyZSB0d28gSFRNTCBmaWxlIGlucHV0IChgPGlucHV0IHR5cGU9XCJmaWxlXCIgLi4uPmApXG4gKiAvLyBlbGVtZW50cy5cbiAqIGNvbnN0IHVwbG9hZEpTT05JbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGxvYWQtanNvbicpO1xuICogY29uc3QgdXBsb2FkV2VpZ2h0c0lucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VwbG9hZC13ZWlnaHRzJyk7XG4gKiBjb25zdCBtb2RlbCA9IGF3YWl0IHRmLmxvYWRMYXllcnNNb2RlbCh0Zi5pby5icm93c2VyRmlsZXMoXG4gKiAgICAgW3VwbG9hZEpTT05JbnB1dC5maWxlc1swXSwgdXBsb2FkV2VpZ2h0c0lucHV0LmZpbGVzWzBdXSkpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGZpbGVzIGBGaWxlYHMgdG8gbG9hZCBmcm9tLiBDdXJyZW50bHksIHRoaXMgZnVuY3Rpb24gc3VwcG9ydHMgb25seVxuICogICBsb2FkaW5nIGZyb20gZmlsZXMgdGhhdCBjb250YWluIEtlcmFzLXN0eWxlIG1vZGVscyAoaS5lLiwgYHRmLk1vZGVsYHMpLCBmb3JcbiAqICAgd2hpY2ggYW4gYEFycmF5YCBvZiBgRmlsZWBzIGlzIGV4cGVjdGVkIChpbiB0aGF0IG9yZGVyKTpcbiAqICAgLSBBIEpTT04gZmlsZSBjb250YWluaW5nIHRoZSBtb2RlbCB0b3BvbG9neSBhbmQgd2VpZ2h0IG1hbmlmZXN0LlxuICogICAtIE9wdGlvbmFsbHksIE9uZSBvciBtb3JlIGJpbmFyeSBmaWxlcyBjb250YWluaW5nIHRoZSBiaW5hcnkgd2VpZ2h0cy5cbiAqICAgICBUaGVzZSBmaWxlcyBtdXN0IGhhdmUgbmFtZXMgdGhhdCBtYXRjaCB0aGUgcGF0aHMgaW4gdGhlIGB3ZWlnaHRzTWFuaWZlc3RgXG4gKiAgICAgY29udGFpbmVkIGJ5IHRoZSBhZm9yZW1lbnRpb25lZCBKU09OIGZpbGUsIG9yIGVycm9ycyB3aWxsIGJlIHRocm93blxuICogICAgIGR1cmluZyBsb2FkaW5nLiBUaGVzZSB3ZWlnaHRzIGZpbGVzIGhhdmUgdGhlIHNhbWUgZm9ybWF0IGFzIHRoZSBvbmVzXG4gKiAgICAgZ2VuZXJhdGVkIGJ5IGB0ZW5zb3JmbG93anNfY29udmVydGVyYCB0aGF0IGNvbWVzIHdpdGggdGhlIGB0ZW5zb3JmbG93anNgXG4gKiAgICAgUHl0aG9uIFBJUCBwYWNrYWdlLiBJZiBubyB3ZWlnaHRzIGZpbGVzIGFyZSBwcm92aWRlZCwgb25seSB0aGUgbW9kZWxcbiAqICAgICB0b3BvbG9neSB3aWxsIGJlIGxvYWRlZCBmcm9tIHRoZSBKU09OIGZpbGUgYWJvdmUuXG4gKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiBgRmlsZXNgIGBJT0hhbmRsZXJgLlxuICpcbiAqIEBkb2Mge1xuICogICBoZWFkaW5nOiAnTW9kZWxzJyxcbiAqICAgc3ViaGVhZGluZzogJ0xvYWRpbmcnLFxuICogICBuYW1lc3BhY2U6ICdpbycsXG4gKiAgIGlnbm9yZUNJOiB0cnVlXG4gKiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBicm93c2VyRmlsZXMoZmlsZXMpIHtcbiAgICByZXR1cm4gbmV3IEJyb3dzZXJGaWxlcyhmaWxlcyk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1icm93c2VyX2ZpbGVzLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbi8qKlxuICogSU9IYW5kbGVyIGltcGxlbWVudGF0aW9ucyBiYXNlZCBvbiBIVFRQIHJlcXVlc3RzIGluIHRoZSB3ZWIgYnJvd3Nlci5cbiAqXG4gKiBVc2VzIFtgZmV0Y2hgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRmV0Y2hfQVBJKS5cbiAqL1xuaW1wb3J0IHsgZW52IH0gZnJvbSAnLi4vZW52aXJvbm1lbnQnO1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBjb25jYXRlbmF0ZUFycmF5QnVmZmVycywgZ2V0TW9kZWxBcnRpZmFjdHNGb3JKU09OLCBnZXRNb2RlbEFydGlmYWN0c0luZm9Gb3JKU09OLCBnZXRNb2RlbEpTT05Gb3JNb2RlbEFydGlmYWN0cyB9IGZyb20gJy4vaW9fdXRpbHMnO1xuaW1wb3J0IHsgSU9Sb3V0ZXJSZWdpc3RyeSB9IGZyb20gJy4vcm91dGVyX3JlZ2lzdHJ5JztcbmltcG9ydCB7IGxvYWRXZWlnaHRzQXNBcnJheUJ1ZmZlciB9IGZyb20gJy4vd2VpZ2h0c19sb2FkZXInO1xuY29uc3QgT0NURVRfU1RSRUFNX01JTUVfVFlQRSA9ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nO1xuY29uc3QgSlNPTl9UWVBFID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuZXhwb3J0IGNsYXNzIEhUVFBSZXF1ZXN0IHtcbiAgICBjb25zdHJ1Y3RvcihwYXRoLCBsb2FkT3B0aW9ucykge1xuICAgICAgICB0aGlzLkRFRkFVTFRfTUVUSE9EID0gJ1BPU1QnO1xuICAgICAgICBpZiAobG9hZE9wdGlvbnMgPT0gbnVsbCkge1xuICAgICAgICAgICAgbG9hZE9wdGlvbnMgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLndlaWdodFBhdGhQcmVmaXggPSBsb2FkT3B0aW9ucy53ZWlnaHRQYXRoUHJlZml4O1xuICAgICAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBsb2FkT3B0aW9ucy5vblByb2dyZXNzO1xuICAgICAgICB0aGlzLndlaWdodFVybENvbnZlcnRlciA9IGxvYWRPcHRpb25zLndlaWdodFVybENvbnZlcnRlcjtcbiAgICAgICAgaWYgKGxvYWRPcHRpb25zLmZldGNoRnVuYyAhPSBudWxsKSB7XG4gICAgICAgICAgICBhc3NlcnQodHlwZW9mIGxvYWRPcHRpb25zLmZldGNoRnVuYyA9PT0gJ2Z1bmN0aW9uJywgKCkgPT4gJ011c3QgcGFzcyBhIGZ1bmN0aW9uIHRoYXQgbWF0Y2hlcyB0aGUgc2lnbmF0dXJlIG9mICcgK1xuICAgICAgICAgICAgICAgICdgZmV0Y2hgIChzZWUgJyArXG4gICAgICAgICAgICAgICAgJ2h0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9GZXRjaF9BUEkpJyk7XG4gICAgICAgICAgICB0aGlzLmZldGNoID0gbG9hZE9wdGlvbnMuZmV0Y2hGdW5jO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5mZXRjaCA9IGVudigpLnBsYXRmb3JtLmZldGNoO1xuICAgICAgICB9XG4gICAgICAgIGFzc2VydChwYXRoICE9IG51bGwgJiYgcGF0aC5sZW5ndGggPiAwLCAoKSA9PiAnVVJMIHBhdGggZm9yIGh0dHAgbXVzdCBub3QgYmUgbnVsbCwgdW5kZWZpbmVkIG9yICcgK1xuICAgICAgICAgICAgJ2VtcHR5LicpO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXRoKSkge1xuICAgICAgICAgICAgYXNzZXJ0KHBhdGgubGVuZ3RoID09PSAyLCAoKSA9PiAnVVJMIHBhdGhzIGZvciBodHRwIG11c3QgaGF2ZSBhIGxlbmd0aCBvZiAyLCAnICtcbiAgICAgICAgICAgICAgICBgKGFjdHVhbCBsZW5ndGggaXMgJHtwYXRoLmxlbmd0aH0pLmApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucGF0aCA9IHBhdGg7XG4gICAgICAgIGlmIChsb2FkT3B0aW9ucy5yZXF1ZXN0SW5pdCAhPSBudWxsICYmXG4gICAgICAgICAgICBsb2FkT3B0aW9ucy5yZXF1ZXN0SW5pdC5ib2R5ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigncmVxdWVzdEluaXQgaXMgZXhwZWN0ZWQgdG8gaGF2ZSBubyBwcmUtZXhpc3RpbmcgYm9keSwgYnV0IGhhcyBvbmUuJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZXF1ZXN0SW5pdCA9IGxvYWRPcHRpb25zLnJlcXVlc3RJbml0IHx8IHt9O1xuICAgIH1cbiAgICBhc3luYyBzYXZlKG1vZGVsQXJ0aWZhY3RzKSB7XG4gICAgICAgIGlmIChtb2RlbEFydGlmYWN0cy5tb2RlbFRvcG9sb2d5IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQnJvd3NlckhUVFBSZXF1ZXN0LnNhdmUoKSBkb2VzIG5vdCBzdXBwb3J0IHNhdmluZyBtb2RlbCB0b3BvbG9neSAnICtcbiAgICAgICAgICAgICAgICAnaW4gYmluYXJ5IGZvcm1hdHMgeWV0LicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGluaXQgPSBPYmplY3QuYXNzaWduKHsgbWV0aG9kOiB0aGlzLkRFRkFVTFRfTUVUSE9EIH0sIHRoaXMucmVxdWVzdEluaXQpO1xuICAgICAgICBpbml0LmJvZHkgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgICAgY29uc3Qgd2VpZ2h0c01hbmlmZXN0ID0gW3tcbiAgICAgICAgICAgICAgICBwYXRoczogWycuL21vZGVsLndlaWdodHMuYmluJ10sXG4gICAgICAgICAgICAgICAgd2VpZ2h0czogbW9kZWxBcnRpZmFjdHMud2VpZ2h0U3BlY3MsXG4gICAgICAgICAgICB9XTtcbiAgICAgICAgY29uc3QgbW9kZWxUb3BvbG9neUFuZFdlaWdodE1hbmlmZXN0ID0gZ2V0TW9kZWxKU09ORm9yTW9kZWxBcnRpZmFjdHMobW9kZWxBcnRpZmFjdHMsIHdlaWdodHNNYW5pZmVzdCk7XG4gICAgICAgIGluaXQuYm9keS5hcHBlbmQoJ21vZGVsLmpzb24nLCBuZXcgQmxvYihbSlNPTi5zdHJpbmdpZnkobW9kZWxUb3BvbG9neUFuZFdlaWdodE1hbmlmZXN0KV0sIHsgdHlwZTogSlNPTl9UWVBFIH0pLCAnbW9kZWwuanNvbicpO1xuICAgICAgICBpZiAobW9kZWxBcnRpZmFjdHMud2VpZ2h0RGF0YSAhPSBudWxsKSB7XG4gICAgICAgICAgICBpbml0LmJvZHkuYXBwZW5kKCdtb2RlbC53ZWlnaHRzLmJpbicsIG5ldyBCbG9iKFttb2RlbEFydGlmYWN0cy53ZWlnaHREYXRhXSwgeyB0eXBlOiBPQ1RFVF9TVFJFQU1fTUlNRV9UWVBFIH0pLCAnbW9kZWwud2VpZ2h0cy5iaW4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZmV0Y2godGhpcy5wYXRoLCBpbml0KTtcbiAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG1vZGVsQXJ0aWZhY3RzSW5mbzogZ2V0TW9kZWxBcnRpZmFjdHNJbmZvRm9ySlNPTihtb2RlbEFydGlmYWN0cyksXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VzOiBbcmVzcG9uc2VdLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQnJvd3NlckhUVFBSZXF1ZXN0LnNhdmUoKSBmYWlsZWQgZHVlIHRvIEhUVFAgcmVzcG9uc2Ugc3RhdHVzIGAgK1xuICAgICAgICAgICAgICAgIGAke3Jlc3BvbnNlLnN0YXR1c30uYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogTG9hZCBtb2RlbCBhcnRpZmFjdHMgdmlhIEhUVFAgcmVxdWVzdChzKS5cbiAgICAgKlxuICAgICAqIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiB0byBgdGYuaW8uaHR0cGAgZm9yIGRldGFpbHMgb24gdGhlIHNhdmVkXG4gICAgICogYXJ0aWZhY3RzLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIGxvYWRlZCBtb2RlbCBhcnRpZmFjdHMgKGlmIGxvYWRpbmcgc3VjY2VlZHMpLlxuICAgICAqL1xuICAgIGFzeW5jIGxvYWQoKSB7XG4gICAgICAgIGNvbnN0IG1vZGVsQ29uZmlnUmVxdWVzdCA9IGF3YWl0IHRoaXMuZmV0Y2godGhpcy5wYXRoLCB0aGlzLnJlcXVlc3RJbml0KTtcbiAgICAgICAgaWYgKCFtb2RlbENvbmZpZ1JlcXVlc3Qub2spIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVxdWVzdCB0byAke3RoaXMucGF0aH0gZmFpbGVkIHdpdGggc3RhdHVzIGNvZGUgYCArXG4gICAgICAgICAgICAgICAgYCR7bW9kZWxDb25maWdSZXF1ZXN0LnN0YXR1c30uIFBsZWFzZSB2ZXJpZnkgdGhpcyBVUkwgcG9pbnRzIHRvIGAgK1xuICAgICAgICAgICAgICAgIGB0aGUgbW9kZWwgSlNPTiBvZiB0aGUgbW9kZWwgdG8gbG9hZC5gKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbW9kZWxKU09OO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbW9kZWxKU09OID0gYXdhaXQgbW9kZWxDb25maWdSZXF1ZXN0Lmpzb24oKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgbGV0IG1lc3NhZ2UgPSBgRmFpbGVkIHRvIHBhcnNlIG1vZGVsIEpTT04gb2YgcmVzcG9uc2UgZnJvbSAke3RoaXMucGF0aH0uYDtcbiAgICAgICAgICAgIC8vIFRPRE8obnN0aG9yYXQpOiBSZW1vdmUgdGhpcyBhZnRlciBzb21lIHRpbWUgd2hlbiB3ZSdyZSBjb21mb3J0YWJsZSB0aGF0XG4gICAgICAgICAgICAvLyAucGIgZmlsZXMgYXJlIG1vc3RseSBnb25lLlxuICAgICAgICAgICAgaWYgKHRoaXMucGF0aC5lbmRzV2l0aCgnLnBiJykpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlICs9ICcgWW91ciBwYXRoIGNvbnRhaW5zIGEgLnBiIGZpbGUgZXh0ZW5zaW9uLiAnICtcbiAgICAgICAgICAgICAgICAgICAgJ1N1cHBvcnQgZm9yIC5wYiBtb2RlbHMgaGF2ZSBiZWVuIHJlbW92ZWQgaW4gVGVuc29yRmxvdy5qcyAxLjAgJyArXG4gICAgICAgICAgICAgICAgICAgICdpbiBmYXZvciBvZiAuanNvbiBtb2RlbHMuIFlvdSBjYW4gcmUtY29udmVydCB5b3VyIFB5dGhvbiAnICtcbiAgICAgICAgICAgICAgICAgICAgJ1RlbnNvckZsb3cgbW9kZWwgdXNpbmcgdGhlIFRlbnNvckZsb3cuanMgMS4wIGNvbnZlcnNpb24gc2NyaXB0cyAnICtcbiAgICAgICAgICAgICAgICAgICAgJ29yIHlvdSBjYW4gY29udmVydCB5b3VyLnBiIG1vZGVscyB3aXRoIHRoZSBcXCdwYjJqc29uXFwnJyArXG4gICAgICAgICAgICAgICAgICAgICdOUE0gc2NyaXB0IGluIHRoZSB0ZW5zb3JmbG93L3RmanMtY29udmVydGVyIHJlcG9zaXRvcnkuJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UgKz0gJyBQbGVhc2UgbWFrZSBzdXJlIHRoZSBzZXJ2ZXIgaXMgc2VydmluZyB2YWxpZCAnICtcbiAgICAgICAgICAgICAgICAgICAgJ0pTT04gZm9yIHRoaXMgcmVxdWVzdC4nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdlIGRvIG5vdCBhbGxvdyBib3RoIG1vZGVsVG9wb2xvZ3kgYW5kIHdlaWdodHNNYW5pZmVzdCB0byBiZSBtaXNzaW5nLlxuICAgICAgICBjb25zdCBtb2RlbFRvcG9sb2d5ID0gbW9kZWxKU09OLm1vZGVsVG9wb2xvZ3k7XG4gICAgICAgIGNvbnN0IHdlaWdodHNNYW5pZmVzdCA9IG1vZGVsSlNPTi53ZWlnaHRzTWFuaWZlc3Q7XG4gICAgICAgIGlmIChtb2RlbFRvcG9sb2d5ID09IG51bGwgJiYgd2VpZ2h0c01hbmlmZXN0ID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIEpTT04gZnJvbSBIVFRQIHBhdGggJHt0aGlzLnBhdGh9IGNvbnRhaW5zIG5laXRoZXIgbW9kZWwgYCArXG4gICAgICAgICAgICAgICAgYHRvcG9sb2d5IG9yIG1hbmlmZXN0IGZvciB3ZWlnaHRzLmApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBnZXRNb2RlbEFydGlmYWN0c0ZvckpTT04obW9kZWxKU09OLCAod2VpZ2h0c01hbmlmZXN0KSA9PiB0aGlzLmxvYWRXZWlnaHRzKHdlaWdodHNNYW5pZmVzdCkpO1xuICAgIH1cbiAgICBhc3luYyBsb2FkV2VpZ2h0cyh3ZWlnaHRzTWFuaWZlc3QpIHtcbiAgICAgICAgY29uc3Qgd2VpZ2h0UGF0aCA9IEFycmF5LmlzQXJyYXkodGhpcy5wYXRoKSA/IHRoaXMucGF0aFsxXSA6IHRoaXMucGF0aDtcbiAgICAgICAgY29uc3QgW3ByZWZpeCwgc3VmZml4XSA9IHBhcnNlVXJsKHdlaWdodFBhdGgpO1xuICAgICAgICBjb25zdCBwYXRoUHJlZml4ID0gdGhpcy53ZWlnaHRQYXRoUHJlZml4IHx8IHByZWZpeDtcbiAgICAgICAgY29uc3Qgd2VpZ2h0U3BlY3MgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiB3ZWlnaHRzTWFuaWZlc3QpIHtcbiAgICAgICAgICAgIHdlaWdodFNwZWNzLnB1c2goLi4uZW50cnkud2VpZ2h0cyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmV0Y2hVUkxzID0gW107XG4gICAgICAgIGNvbnN0IHVybFByb21pc2VzID0gW107XG4gICAgICAgIGZvciAoY29uc3Qgd2VpZ2h0c0dyb3VwIG9mIHdlaWdodHNNYW5pZmVzdCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBwYXRoIG9mIHdlaWdodHNHcm91cC5wYXRocykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLndlaWdodFVybENvbnZlcnRlciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHVybFByb21pc2VzLnB1c2godGhpcy53ZWlnaHRVcmxDb252ZXJ0ZXIocGF0aCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZmV0Y2hVUkxzLnB1c2gocGF0aFByZWZpeCArIHBhdGggKyBzdWZmaXgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy53ZWlnaHRVcmxDb252ZXJ0ZXIpIHtcbiAgICAgICAgICAgIGZldGNoVVJMcy5wdXNoKC4uLmF3YWl0IFByb21pc2UuYWxsKHVybFByb21pc2VzKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYnVmZmVycyA9IGF3YWl0IGxvYWRXZWlnaHRzQXNBcnJheUJ1ZmZlcihmZXRjaFVSTHMsIHtcbiAgICAgICAgICAgIHJlcXVlc3RJbml0OiB0aGlzLnJlcXVlc3RJbml0LFxuICAgICAgICAgICAgZmV0Y2hGdW5jOiB0aGlzLmZldGNoLFxuICAgICAgICAgICAgb25Qcm9ncmVzczogdGhpcy5vblByb2dyZXNzXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gW3dlaWdodFNwZWNzLCBjb25jYXRlbmF0ZUFycmF5QnVmZmVycyhidWZmZXJzKV07XG4gICAgfVxufVxuSFRUUFJlcXVlc3QuVVJMX1NDSEVNRV9SRUdFWCA9IC9eaHR0cHM/OlxcL1xcLy87XG4vKipcbiAqIEV4dHJhY3QgdGhlIHByZWZpeCBhbmQgc3VmZml4IG9mIHRoZSB1cmwsIHdoZXJlIHRoZSBwcmVmaXggaXMgdGhlIHBhdGggYmVmb3JlXG4gKiB0aGUgbGFzdCBmaWxlLCBhbmQgc3VmZml4IGlzIHRoZSBzZWFyY2ggcGFyYW1zIGFmdGVyIHRoZSBsYXN0IGZpbGUuXG4gKiBgYGBcbiAqIGNvbnN0IHVybCA9ICdodHRwOi8vdGZodWIuZGV2L21vZGVsLzEvdGVuc29yZmxvd2pzX21vZGVsLnBiP3RmanMtZm9ybWF0PWZpbGUnXG4gKiBbcHJlZml4LCBzdWZmaXhdID0gcGFyc2VVcmwodXJsKVxuICogLy8gcHJlZml4ID0gJ2h0dHA6Ly90Zmh1Yi5kZXYvbW9kZWwvMS8nXG4gKiAvLyBzdWZmaXggPSAnP3RmanMtZm9ybWF0PWZpbGUnXG4gKiBgYGBcbiAqIEBwYXJhbSB1cmwgdGhlIG1vZGVsIHVybCB0byBiZSBwYXJzZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVVybCh1cmwpIHtcbiAgICBjb25zdCBsYXN0U2xhc2ggPSB1cmwubGFzdEluZGV4T2YoJy8nKTtcbiAgICBjb25zdCBsYXN0U2VhcmNoUGFyYW0gPSB1cmwubGFzdEluZGV4T2YoJz8nKTtcbiAgICBjb25zdCBwcmVmaXggPSB1cmwuc3Vic3RyaW5nKDAsIGxhc3RTbGFzaCk7XG4gICAgY29uc3Qgc3VmZml4ID0gbGFzdFNlYXJjaFBhcmFtID4gbGFzdFNsYXNoID8gdXJsLnN1YnN0cmluZyhsYXN0U2VhcmNoUGFyYW0pIDogJyc7XG4gICAgcmV0dXJuIFtwcmVmaXggKyAnLycsIHN1ZmZpeF07XG59XG5leHBvcnQgZnVuY3Rpb24gaXNIVFRQU2NoZW1lKHVybCkge1xuICAgIHJldHVybiB1cmwubWF0Y2goSFRUUFJlcXVlc3QuVVJMX1NDSEVNRV9SRUdFWCkgIT0gbnVsbDtcbn1cbmV4cG9ydCBjb25zdCBodHRwUm91dGVyID0gKHVybCwgbG9hZE9wdGlvbnMpID0+IHtcbiAgICBpZiAodHlwZW9mIGZldGNoID09PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAobG9hZE9wdGlvbnMgPT0gbnVsbCB8fCBsb2FkT3B0aW9ucy5mZXRjaEZ1bmMgPT0gbnVsbCkpIHtcbiAgICAgICAgLy8gYGh0dHBgIHVzZXMgYGZldGNoYCBvciBgbm9kZS1mZXRjaGAsIGlmIG9uZSB3YW50cyB0byB1c2UgaXQgaW5cbiAgICAgICAgLy8gYW4gZW52aXJvbm1lbnQgdGhhdCBpcyBub3QgdGhlIGJyb3dzZXIgb3Igbm9kZSB0aGV5IGhhdmUgdG8gc2V0dXAgYVxuICAgICAgICAvLyBnbG9iYWwgZmV0Y2ggcG9seWZpbGwuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbGV0IGlzSFRUUCA9IHRydWU7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHVybCkpIHtcbiAgICAgICAgICAgIGlzSFRUUCA9IHVybC5ldmVyeSh1cmxJdGVtID0+IGlzSFRUUFNjaGVtZSh1cmxJdGVtKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpc0hUVFAgPSBpc0hUVFBTY2hlbWUodXJsKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNIVFRQKSB7XG4gICAgICAgICAgICByZXR1cm4gaHR0cCh1cmwsIGxvYWRPcHRpb25zKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn07XG5JT1JvdXRlclJlZ2lzdHJ5LnJlZ2lzdGVyU2F2ZVJvdXRlcihodHRwUm91dGVyKTtcbklPUm91dGVyUmVnaXN0cnkucmVnaXN0ZXJMb2FkUm91dGVyKGh0dHBSb3V0ZXIpO1xuLyoqXG4gKiBDcmVhdGVzIGFuIElPSGFuZGxlciBzdWJ0eXBlIHRoYXQgc2VuZHMgbW9kZWwgYXJ0aWZhY3RzIHRvIEhUVFAgc2VydmVyLlxuICpcbiAqIEFuIEhUVFAgcmVxdWVzdCBvZiB0aGUgYG11bHRpcGFydC9mb3JtLWRhdGFgIG1pbWUgdHlwZSB3aWxsIGJlIHNlbnQgdG8gdGhlXG4gKiBgcGF0aGAgVVJMLiBUaGUgZm9ybSBkYXRhIGluY2x1ZGVzIGFydGlmYWN0cyB0aGF0IHJlcHJlc2VudCB0aGUgdG9wb2xvZ3lcbiAqIGFuZC9vciB3ZWlnaHRzIG9mIHRoZSBtb2RlbC4gSW4gdGhlIGNhc2Ugb2YgS2VyYXMtc3R5bGUgYHRmLk1vZGVsYCwgdHdvXG4gKiBibG9icyAoZmlsZXMpIGV4aXN0IGluIGZvcm0tZGF0YTpcbiAqICAgLSBBIEpTT04gZmlsZSBjb25zaXN0aW5nIG9mIGBtb2RlbFRvcG9sb2d5YCBhbmQgYHdlaWdodHNNYW5pZmVzdGAuXG4gKiAgIC0gQSBiaW5hcnkgd2VpZ2h0cyBmaWxlIGNvbnNpc3Rpbmcgb2YgdGhlIGNvbmNhdGVuYXRlZCB3ZWlnaHQgdmFsdWVzLlxuICogVGhlc2UgZmlsZXMgYXJlIGluIHRoZSBzYW1lIGZvcm1hdCBhcyB0aGUgb25lIGdlbmVyYXRlZCBieVxuICogW3RmanNfY29udmVydGVyXShodHRwczovL2pzLnRlbnNvcmZsb3cub3JnL3R1dG9yaWFscy9pbXBvcnQta2VyYXMuaHRtbCkuXG4gKlxuICogVGhlIGZvbGxvd2luZyBjb2RlIHNuaXBwZXQgZXhlbXBsaWZpZXMgdGhlIGNsaWVudC1zaWRlIGNvZGUgdGhhdCB1c2VzIHRoaXNcbiAqIGZ1bmN0aW9uOlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBtb2RlbCA9IHRmLnNlcXVlbnRpYWwoKTtcbiAqIG1vZGVsLmFkZChcbiAqICAgICB0Zi5sYXllcnMuZGVuc2Uoe3VuaXRzOiAxLCBpbnB1dFNoYXBlOiBbMTAwXSwgYWN0aXZhdGlvbjogJ3NpZ21vaWQnfSkpO1xuICpcbiAqIGNvbnN0IHNhdmVSZXN1bHQgPSBhd2FpdCBtb2RlbC5zYXZlKHRmLmlvLmh0dHAoXG4gKiAgICAgJ2h0dHA6Ly9tb2RlbC1zZXJ2ZXI6NTAwMC91cGxvYWQnLCB7cmVxdWVzdEluaXQ6IHttZXRob2Q6ICdQVVQnfX0pKTtcbiAqIGNvbnNvbGUubG9nKHNhdmVSZXN1bHQpO1xuICogYGBgXG4gKlxuICogSWYgdGhlIGRlZmF1bHQgYFBPU1RgIG1ldGhvZCBpcyB0byBiZSB1c2VkLCB3aXRob3V0IGFueSBjdXN0b20gcGFyYW1ldGVyc1xuICogc3VjaCBhcyBoZWFkZXJzLCB5b3UgY2FuIHNpbXBseSBwYXNzIGFuIEhUVFAgb3IgSFRUUFMgVVJMIHRvIGBtb2RlbC5zYXZlYDpcbiAqXG4gKiBgYGBqc1xuICogY29uc3Qgc2F2ZVJlc3VsdCA9IGF3YWl0IG1vZGVsLnNhdmUoJ2h0dHA6Ly9tb2RlbC1zZXJ2ZXI6NTAwMC91cGxvYWQnKTtcbiAqIGBgYFxuICpcbiAqIFRoZSBmb2xsb3dpbmcgR2l0SHViIEdpc3RcbiAqIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL2RzbWlsa292LzFiNjA0NmZkNjEzMmQ3NDA4ZDUyNTdiMDk3NmY3ODY0XG4gKiBpbXBsZW1lbnRzIGEgc2VydmVyIGJhc2VkIG9uIFtmbGFza10oaHR0cHM6Ly9naXRodWIuY29tL3BhbGxldHMvZmxhc2spIHRoYXRcbiAqIGNhbiByZWNlaXZlIHRoZSByZXF1ZXN0LiBVcG9uIHJlY2VpdmluZyB0aGUgbW9kZWwgYXJ0aWZhY3RzIHZpYSB0aGUgcmVxdXN0LFxuICogdGhpcyBwYXJ0aWN1bGFyIHNlcnZlciByZWNvbnNpc3R1dGVzIGluc3RhbmNlcyBvZiBbS2VyYXNcbiAqIE1vZGVsc10oaHR0cHM6Ly9rZXJhcy5pby9tb2RlbHMvbW9kZWwvKSBpbiBtZW1vcnkuXG4gKlxuICpcbiAqIEBwYXJhbSBwYXRoIEEgVVJMIHBhdGggdG8gdGhlIG1vZGVsLlxuICogICBDYW4gYmUgYW4gYWJzb2x1dGUgSFRUUCBwYXRoIChlLmcuLFxuICogICAnaHR0cDovL2xvY2FsaG9zdDo4MDAwL21vZGVsLXVwbG9hZCknKSBvciBhIHJlbGF0aXZlIHBhdGggKGUuZy4sXG4gKiAgICcuL21vZGVsLXVwbG9hZCcpLlxuICogQHBhcmFtIHJlcXVlc3RJbml0IFJlcXVlc3QgY29uZmlndXJhdGlvbnMgdG8gYmUgdXNlZCB3aGVuIHNlbmRpbmdcbiAqICAgIEhUVFAgcmVxdWVzdCB0byBzZXJ2ZXIgdXNpbmcgYGZldGNoYC4gSXQgY2FuIGNvbnRhaW4gZmllbGRzIHN1Y2ggYXNcbiAqICAgIGBtZXRob2RgLCBgY3JlZGVudGlhbHNgLCBgaGVhZGVyc2AsIGBtb2RlYCwgZXRjLiBTZWVcbiAqICAgIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9SZXF1ZXN0L1JlcXVlc3RcbiAqICAgIGZvciBtb3JlIGluZm9ybWF0aW9uLiBgcmVxdWVzdEluaXRgIG11c3Qgbm90IGhhdmUgYSBib2R5LCBiZWNhdXNlIHRoZVxuICogYm9keSB3aWxsIGJlIHNldCBieSBUZW5zb3JGbG93LmpzLiBGaWxlIGJsb2JzIHJlcHJlc2VudGluZyB0aGUgbW9kZWxcbiAqIHRvcG9sb2d5IChmaWxlbmFtZTogJ21vZGVsLmpzb24nKSBhbmQgdGhlIHdlaWdodHMgb2YgdGhlIG1vZGVsIChmaWxlbmFtZTpcbiAqICdtb2RlbC53ZWlnaHRzLmJpbicpIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIGJvZHkuIElmIGByZXF1ZXN0SW5pdGAgaGFzIGFcbiAqIGBib2R5YCwgYW4gRXJyb3Igd2lsbCBiZSB0aHJvd24uXG4gKiBAcGFyYW0gbG9hZE9wdGlvbnMgT3B0aW9uYWwgY29uZmlndXJhdGlvbiBmb3IgdGhlIGxvYWRpbmcuIEl0IGluY2x1ZGVzIHRoZVxuICogICBmb2xsb3dpbmcgZmllbGRzOlxuICogICAtIHdlaWdodFBhdGhQcmVmaXggT3B0aW9uYWwsIHRoaXMgc3BlY2lmaWVzIHRoZSBwYXRoIHByZWZpeCBmb3Igd2VpZ2h0XG4gKiAgICAgZmlsZXMsIGJ5IGRlZmF1bHQgdGhpcyBpcyBjYWxjdWxhdGVkIGZyb20gdGhlIHBhdGggcGFyYW0uXG4gKiAgIC0gZmV0Y2hGdW5jIE9wdGlvbmFsLCBjdXN0b20gYGZldGNoYCBmdW5jdGlvbi4gRS5nLiwgaW4gTm9kZS5qcyxcbiAqICAgICB0aGUgYGZldGNoYCBmcm9tIG5vZGUtZmV0Y2ggY2FuIGJlIHVzZWQgaGVyZS5cbiAqICAgLSBvblByb2dyZXNzIE9wdGlvbmFsLCBwcm9ncmVzcyBjYWxsYmFjayBmdW5jdGlvbiwgZmlyZWQgcGVyaW9kaWNhbGx5XG4gKiAgICAgYmVmb3JlIHRoZSBsb2FkIGlzIGNvbXBsZXRlZC5cbiAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIGBJT0hhbmRsZXJgLlxuICpcbiAqIEBkb2Mge1xuICogICBoZWFkaW5nOiAnTW9kZWxzJyxcbiAqICAgc3ViaGVhZGluZzogJ0xvYWRpbmcnLFxuICogICBuYW1lc3BhY2U6ICdpbycsXG4gKiAgIGlnbm9yZUNJOiB0cnVlXG4gKiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBodHRwKHBhdGgsIGxvYWRPcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBIVFRQUmVxdWVzdChwYXRoLCBsb2FkT3B0aW9ucyk7XG59XG4vKipcbiAqIERlcHJlY2F0ZWQuIFVzZSBgdGYuaW8uaHR0cGAuXG4gKiBAcGFyYW0gcGF0aFxuICogQHBhcmFtIGxvYWRPcHRpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBicm93c2VySFRUUFJlcXVlc3QocGF0aCwgbG9hZE9wdGlvbnMpIHtcbiAgICByZXR1cm4gaHR0cChwYXRoLCBsb2FkT3B0aW9ucyk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1odHRwLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCAnLi4vZmxhZ3MnO1xuaW1wb3J0IHsgZW52IH0gZnJvbSAnLi4vZW52aXJvbm1lbnQnO1xuaW1wb3J0IHsgZ2V0TW9kZWxBcnRpZmFjdHNJbmZvRm9ySlNPTiB9IGZyb20gJy4vaW9fdXRpbHMnO1xuaW1wb3J0IHsgSU9Sb3V0ZXJSZWdpc3RyeSB9IGZyb20gJy4vcm91dGVyX3JlZ2lzdHJ5JztcbmNvbnN0IERBVEFCQVNFX05BTUUgPSAndGVuc29yZmxvd2pzJztcbmNvbnN0IERBVEFCQVNFX1ZFUlNJT04gPSAxO1xuLy8gTW9kZWwgZGF0YSBhbmQgTW9kZWxBcnRpZmFjdHNJbmZvIChtZXRhZGF0YSkgYXJlIHN0b3JlZCBpbiB0d28gc2VwYXJhdGVcbi8vIHN0b3JlcyBmb3IgZWZmaWNpZW50IGFjY2VzcyBvZiB0aGUgbGlzdCBvZiBzdG9yZWQgbW9kZWxzIGFuZCB0aGVpciBtZXRhZGF0YS5cbi8vIDEuIFRoZSBvYmplY3Qgc3RvcmUgZm9yIG1vZGVsIGRhdGE6IHRvcG9sb2d5LCB3ZWlnaHRzIGFuZCB3ZWlnaHQgbWFuaWZlc3RzLlxuY29uc3QgTU9ERUxfU1RPUkVfTkFNRSA9ICdtb2RlbHNfc3RvcmUnO1xuLy8gMi4gVGhlIG9iamVjdCBzdG9yZSBmb3IgTW9kZWxBcnRpZmFjdHNJbmZvLCBpbmNsdWRpbmcgbWV0YS1pbmZvcm1hdGlvbiBzdWNoXG4vLyAgICBhcyB0aGUgdHlwZSBvZiB0b3BvbG9neSAoSlNPTiB2cyBiaW5hcnkpLCBieXRlIHNpemUgb2YgdGhlIHRvcG9sb2d5LCBieXRlXG4vLyAgICBzaXplIG9mIHRoZSB3ZWlnaHRzLCBldGMuXG5jb25zdCBJTkZPX1NUT1JFX05BTUUgPSAnbW9kZWxfaW5mb19zdG9yZSc7XG4vKipcbiAqIERlbGV0ZSB0aGUgZW50aXJlIGRhdGFiYXNlIGZvciB0ZW5zb3JmbG93LmpzLCBpbmNsdWRpbmcgdGhlIG1vZGVscyBzdG9yZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZURhdGFiYXNlKCkge1xuICAgIGNvbnN0IGlkYkZhY3RvcnkgPSBnZXRJbmRleGVkREJGYWN0b3J5KCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgZGVsZXRlUmVxdWVzdCA9IGlkYkZhY3RvcnkuZGVsZXRlRGF0YWJhc2UoREFUQUJBU0VfTkFNRSk7XG4gICAgICAgIGRlbGV0ZVJlcXVlc3Qub25zdWNjZXNzID0gKCkgPT4gcmVzb2x2ZSgpO1xuICAgICAgICBkZWxldGVSZXF1ZXN0Lm9uZXJyb3IgPSBlcnJvciA9PiByZWplY3QoZXJyb3IpO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gZ2V0SW5kZXhlZERCRmFjdG9yeSgpIHtcbiAgICBpZiAoIWVudigpLmdldEJvb2woJ0lTX0JST1dTRVInKSkge1xuICAgICAgICAvLyBUT0RPKGNhaXMpOiBBZGQgbW9yZSBpbmZvIGFib3V0IHdoYXQgSU9IYW5kbGVyIHN1YnR5cGVzIGFyZSBhdmFpbGFibGUuXG4gICAgICAgIC8vICAgTWF5YmUgcG9pbnQgdG8gYSBkb2MgcGFnZSBvbiB0aGUgd2ViIGFuZC9vciBhdXRvbWF0aWNhbGx5IGRldGVybWluZVxuICAgICAgICAvLyAgIHRoZSBhdmFpbGFibGUgSU9IYW5kbGVycyBhbmQgcHJpbnQgdGhlbSBpbiB0aGUgZXJyb3IgbWVzc2FnZS5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gb2J0YWluIEluZGV4ZWREQiBmYWN0b3J5IGJlY2F1c2UgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQnICtcbiAgICAgICAgICAgICdpcyBub3QgYSB3ZWIgYnJvd3Nlci4nKTtcbiAgICB9XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICAgIGNvbnN0IHRoZVdpbmRvdyA9IHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnID8gc2VsZiA6IHdpbmRvdztcbiAgICBjb25zdCBmYWN0b3J5ID0gdGhlV2luZG93LmluZGV4ZWREQiB8fCB0aGVXaW5kb3cubW96SW5kZXhlZERCIHx8XG4gICAgICAgIHRoZVdpbmRvdy53ZWJraXRJbmRleGVkREIgfHwgdGhlV2luZG93Lm1zSW5kZXhlZERCIHx8XG4gICAgICAgIHRoZVdpbmRvdy5zaGltSW5kZXhlZERCO1xuICAgIGlmIChmYWN0b3J5ID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgY3VycmVudCBicm93c2VyIGRvZXMgbm90IGFwcGVhciB0byBzdXBwb3J0IEluZGV4ZWREQi4nKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhY3Rvcnk7XG59XG5mdW5jdGlvbiBzZXRVcERhdGFiYXNlKG9wZW5SZXF1ZXN0KSB7XG4gICAgY29uc3QgZGIgPSBvcGVuUmVxdWVzdC5yZXN1bHQ7XG4gICAgZGIuY3JlYXRlT2JqZWN0U3RvcmUoTU9ERUxfU1RPUkVfTkFNRSwgeyBrZXlQYXRoOiAnbW9kZWxQYXRoJyB9KTtcbiAgICBkYi5jcmVhdGVPYmplY3RTdG9yZShJTkZPX1NUT1JFX05BTUUsIHsga2V5UGF0aDogJ21vZGVsUGF0aCcgfSk7XG59XG4vKipcbiAqIElPSGFuZGxlciBzdWJjbGFzczogQnJvd3NlciBJbmRleGVkREIuXG4gKlxuICogU2VlIHRoZSBkb2Mgc3RyaW5nIG9mIGBicm93c2VySW5kZXhlZERCYCBmb3IgbW9yZSBkZXRhaWxzLlxuICovXG5leHBvcnQgY2xhc3MgQnJvd3NlckluZGV4ZWREQiB7XG4gICAgY29uc3RydWN0b3IobW9kZWxQYXRoKSB7XG4gICAgICAgIHRoaXMuaW5kZXhlZERCID0gZ2V0SW5kZXhlZERCRmFjdG9yeSgpO1xuICAgICAgICBpZiAobW9kZWxQYXRoID09IG51bGwgfHwgIW1vZGVsUGF0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGb3IgSW5kZXhlZERCLCBtb2RlbFBhdGggbXVzdCBub3QgYmUgbnVsbCwgdW5kZWZpbmVkIG9yIGVtcHR5LicpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubW9kZWxQYXRoID0gbW9kZWxQYXRoO1xuICAgIH1cbiAgICBhc3luYyBzYXZlKG1vZGVsQXJ0aWZhY3RzKSB7XG4gICAgICAgIC8vIFRPRE8oY2Fpcyk6IFN1cHBvcnQgc2F2aW5nIEdyYXBoRGVmIG1vZGVscy5cbiAgICAgICAgaWYgKG1vZGVsQXJ0aWZhY3RzLm1vZGVsVG9wb2xvZ3kgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCcm93c2VyTG9jYWxTdG9yYWdlLnNhdmUoKSBkb2VzIG5vdCBzdXBwb3J0IHNhdmluZyBtb2RlbCB0b3BvbG9neSAnICtcbiAgICAgICAgICAgICAgICAnaW4gYmluYXJ5IGZvcm1hdHMgeWV0LicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlQWN0aW9uKHRoaXMubW9kZWxQYXRoLCBtb2RlbEFydGlmYWN0cyk7XG4gICAgfVxuICAgIGFzeW5jIGxvYWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlQWN0aW9uKHRoaXMubW9kZWxQYXRoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGVyZm9ybSBkYXRhYmFzZSBhY3Rpb24gdG8gcHV0IG1vZGVsIGFydGlmYWN0cyBpbnRvIG9yIHJlYWQgbW9kZWwgYXJ0aWZhY3RzXG4gICAgICogZnJvbSBJbmRleGVkREIgb2JqZWN0IHN0b3JlLlxuICAgICAqXG4gICAgICogV2hldGhlciB0aGUgYWN0aW9uIGlzIHB1dCBvciBnZXQgZGVwZW5kcyBvbiB3aGV0aGVyIGBtb2RlbEFydGlmYWN0c2AgaXNcbiAgICAgKiBzcGVjaWZpZWQuIElmIGl0IGlzIHNwZWNpZmllZCwgdGhlIGFjdGlvbiB3aWxsIGJlIHB1dDsgb3RoZXJ3aXNlIHRoZSBhY3Rpb25cbiAgICAgKiB3aWxsIGJlIGdldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBtb2RlbFBhdGggQSB1bmlxdWUgc3RyaW5nIHBhdGggZm9yIHRoZSBtb2RlbC5cbiAgICAgKiBAcGFyYW0gbW9kZWxBcnRpZmFjdHMgSWYgc3BlY2lmaWVkLCBpdCB3aWxsIGJlIHRoZSBtb2RlbCBhcnRpZmFjdHMgdG8gYmVcbiAgICAgKiAgIHN0b3JlZCBpbiBJbmRleGVkREIuXG4gICAgICogQHJldHVybnMgQSBgUHJvbWlzZWAgb2YgYFNhdmVSZXN1bHRgLCBpZiB0aGUgYWN0aW9uIGlzIHB1dCwgb3IgYSBgUHJvbWlzZWBcbiAgICAgKiAgIG9mIGBNb2RlbEFydGlmYWN0c2AsIGlmIHRoZSBhY3Rpb24gaXMgZ2V0LlxuICAgICAqL1xuICAgIGRhdGFiYXNlQWN0aW9uKG1vZGVsUGF0aCwgbW9kZWxBcnRpZmFjdHMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG9wZW5SZXF1ZXN0ID0gdGhpcy5pbmRleGVkREIub3BlbihEQVRBQkFTRV9OQU1FLCBEQVRBQkFTRV9WRVJTSU9OKTtcbiAgICAgICAgICAgIG9wZW5SZXF1ZXN0Lm9udXBncmFkZW5lZWRlZCA9ICgpID0+IHNldFVwRGF0YWJhc2Uob3BlblJlcXVlc3QpO1xuICAgICAgICAgICAgb3BlblJlcXVlc3Qub25zdWNjZXNzID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRiID0gb3BlblJlcXVlc3QucmVzdWx0O1xuICAgICAgICAgICAgICAgIGlmIChtb2RlbEFydGlmYWN0cyA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFJlYWQgbW9kZWwgb3V0IGZyb20gb2JqZWN0IHN0b3JlLlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBtb2RlbFR4ID0gZGIudHJhbnNhY3Rpb24oTU9ERUxfU1RPUkVfTkFNRSwgJ3JlYWRvbmx5Jyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1vZGVsU3RvcmUgPSBtb2RlbFR4Lm9iamVjdFN0b3JlKE1PREVMX1NUT1JFX05BTUUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBnZXRSZXF1ZXN0ID0gbW9kZWxTdG9yZS5nZXQodGhpcy5tb2RlbFBhdGgpO1xuICAgICAgICAgICAgICAgICAgICBnZXRSZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZXRSZXF1ZXN0LnJlc3VsdCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGIuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcihgQ2Fubm90IGZpbmQgbW9kZWwgd2l0aCBwYXRoICcke3RoaXMubW9kZWxQYXRofScgYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBpbiBJbmRleGVkREIuYCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShnZXRSZXF1ZXN0LnJlc3VsdC5tb2RlbEFydGlmYWN0cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGdldFJlcXVlc3Qub25lcnJvciA9IGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRiLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KGdldFJlcXVlc3QuZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBtb2RlbFR4Lm9uY29tcGxldGUgPSAoKSA9PiBkYi5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUHV0IG1vZGVsIGludG8gb2JqZWN0IHN0b3JlLlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBtb2RlbEFydGlmYWN0c0luZm8gPSBnZXRNb2RlbEFydGlmYWN0c0luZm9Gb3JKU09OKG1vZGVsQXJ0aWZhY3RzKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gRmlyc3QsIHB1dCBNb2RlbEFydGlmYWN0c0luZm8gaW50byBpbmZvIHN0b3JlLlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmZvVHggPSBkYi50cmFuc2FjdGlvbihJTkZPX1NUT1JFX05BTUUsICdyZWFkd3JpdGUnKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGluZm9TdG9yZSA9IGluZm9UeC5vYmplY3RTdG9yZShJTkZPX1NUT1JFX05BTUUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwdXRJbmZvUmVxdWVzdCA9IGluZm9TdG9yZS5wdXQoeyBtb2RlbFBhdGg6IHRoaXMubW9kZWxQYXRoLCBtb2RlbEFydGlmYWN0c0luZm8gfSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtb2RlbFR4O1xuICAgICAgICAgICAgICAgICAgICBwdXRJbmZvUmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTZWNvbmQsIHB1dCBtb2RlbCBkYXRhIGludG8gbW9kZWwgc3RvcmUuXG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbFR4ID0gZGIudHJhbnNhY3Rpb24oTU9ERUxfU1RPUkVfTkFNRSwgJ3JlYWR3cml0ZScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbW9kZWxTdG9yZSA9IG1vZGVsVHgub2JqZWN0U3RvcmUoTU9ERUxfU1RPUkVfTkFNRSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwdXRNb2RlbFJlcXVlc3QgPSBtb2RlbFN0b3JlLnB1dCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxQYXRoOiB0aGlzLm1vZGVsUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbEFydGlmYWN0cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbEFydGlmYWN0c0luZm9cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHV0TW9kZWxSZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpID0+IHJlc29sdmUoeyBtb2RlbEFydGlmYWN0c0luZm8gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwdXRNb2RlbFJlcXVlc3Qub25lcnJvciA9IGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgcHV0LW1vZGVsIHJlcXVlc3QgZmFpbHMsIHJvbGwgYmFjayB0aGUgaW5mbyBlbnRyeSBhc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlbGwuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb1N0b3JlID0gaW5mb1R4Lm9iamVjdFN0b3JlKElORk9fU1RPUkVfTkFNRSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVsZXRlSW5mb1JlcXVlc3QgPSBpbmZvU3RvcmUuZGVsZXRlKHRoaXMubW9kZWxQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVJbmZvUmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QocHV0TW9kZWxSZXF1ZXN0LmVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZUluZm9SZXF1ZXN0Lm9uZXJyb3IgPSBlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QocHV0TW9kZWxSZXF1ZXN0LmVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgcHV0SW5mb1JlcXVlc3Qub25lcnJvciA9IGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRiLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KHB1dEluZm9SZXF1ZXN0LmVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgaW5mb1R4Lm9uY29tcGxldGUgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9kZWxUeCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGIuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsVHgub25jb21wbGV0ZSA9ICgpID0+IGRiLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIG9wZW5SZXF1ZXN0Lm9uZXJyb3IgPSBlcnJvciA9PiByZWplY3Qob3BlblJlcXVlc3QuZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5Ccm93c2VySW5kZXhlZERCLlVSTF9TQ0hFTUUgPSAnaW5kZXhlZGRiOi8vJztcbmV4cG9ydCBjb25zdCBpbmRleGVkREJSb3V0ZXIgPSAodXJsKSA9PiB7XG4gICAgaWYgKCFlbnYoKS5nZXRCb29sKCdJU19CUk9XU0VSJykpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodXJsKSAmJiB1cmwuc3RhcnRzV2l0aChCcm93c2VySW5kZXhlZERCLlVSTF9TQ0hFTUUpKSB7XG4gICAgICAgICAgICByZXR1cm4gYnJvd3NlckluZGV4ZWREQih1cmwuc2xpY2UoQnJvd3NlckluZGV4ZWREQi5VUkxfU0NIRU1FLmxlbmd0aCkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG59O1xuSU9Sb3V0ZXJSZWdpc3RyeS5yZWdpc3RlclNhdmVSb3V0ZXIoaW5kZXhlZERCUm91dGVyKTtcbklPUm91dGVyUmVnaXN0cnkucmVnaXN0ZXJMb2FkUm91dGVyKGluZGV4ZWREQlJvdXRlcik7XG4vKipcbiAqIENyZWF0ZXMgYSBicm93c2VyIEluZGV4ZWREQiBJT0hhbmRsZXIgZm9yIHNhdmluZyBhbmQgbG9hZGluZyBtb2RlbHMuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IG1vZGVsID0gdGYuc2VxdWVudGlhbCgpO1xuICogbW9kZWwuYWRkKFxuICogICAgIHRmLmxheWVycy5kZW5zZSh7dW5pdHM6IDEsIGlucHV0U2hhcGU6IFsxMDBdLCBhY3RpdmF0aW9uOiAnc2lnbW9pZCd9KSk7XG4gKlxuICogY29uc3Qgc2F2ZVJlc3VsdCA9IGF3YWl0IG1vZGVsLnNhdmUoJ2luZGV4ZWRkYjovL015TW9kZWwnKSk7XG4gKiBjb25zb2xlLmxvZyhzYXZlUmVzdWx0KTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBtb2RlbFBhdGggQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIG1vZGVsIHRvIGJlIHNhdmVkLiBNdXN0IGJlIGFcbiAqICAgbm9uLWVtcHR5IHN0cmluZy5cbiAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIGBCcm93c2VySW5kZXhlZERCYCAoc3VibGNhc3Mgb2YgYElPSGFuZGxlcmApLFxuICogICB3aGljaCBjYW4gYmUgdXNlZCB3aXRoLCBlLmcuLCBgdGYuTW9kZWwuc2F2ZWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBicm93c2VySW5kZXhlZERCKG1vZGVsUGF0aCkge1xuICAgIHJldHVybiBuZXcgQnJvd3NlckluZGV4ZWREQihtb2RlbFBhdGgpO1xufVxuZnVuY3Rpb24gbWF5YmVTdHJpcFNjaGVtZShrZXkpIHtcbiAgICByZXR1cm4ga2V5LnN0YXJ0c1dpdGgoQnJvd3NlckluZGV4ZWREQi5VUkxfU0NIRU1FKSA/XG4gICAgICAgIGtleS5zbGljZShCcm93c2VySW5kZXhlZERCLlVSTF9TQ0hFTUUubGVuZ3RoKSA6XG4gICAgICAgIGtleTtcbn1cbmV4cG9ydCBjbGFzcyBCcm93c2VySW5kZXhlZERCTWFuYWdlciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuaW5kZXhlZERCID0gZ2V0SW5kZXhlZERCRmFjdG9yeSgpO1xuICAgIH1cbiAgICBhc3luYyBsaXN0TW9kZWxzKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb3BlblJlcXVlc3QgPSB0aGlzLmluZGV4ZWREQi5vcGVuKERBVEFCQVNFX05BTUUsIERBVEFCQVNFX1ZFUlNJT04pO1xuICAgICAgICAgICAgb3BlblJlcXVlc3Qub251cGdyYWRlbmVlZGVkID0gKCkgPT4gc2V0VXBEYXRhYmFzZShvcGVuUmVxdWVzdCk7XG4gICAgICAgICAgICBvcGVuUmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGIgPSBvcGVuUmVxdWVzdC5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgY29uc3QgdHggPSBkYi50cmFuc2FjdGlvbihJTkZPX1NUT1JFX05BTUUsICdyZWFkb25seScpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0b3JlID0gdHgub2JqZWN0U3RvcmUoSU5GT19TVE9SRV9OQU1FKTtcbiAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZTptYXgtbGluZS1sZW5ndGhcbiAgICAgICAgICAgICAgICAvLyBOZWVkIHRvIGNhc3QgYHN0b3JlYCBhcyBgYW55YCBoZXJlIGJlY2F1c2UgVHlwZVNjcmlwdCdzIERPTVxuICAgICAgICAgICAgICAgIC8vIGxpYnJhcnkgZG9lcyBub3QgaGF2ZSB0aGUgYGdldEFsbCgpYCBtZXRob2QgZXZlbiB0aG91Z2ggdGhlXG4gICAgICAgICAgICAgICAgLy8gbWV0aG9kIGlzIHN1cHBvcnRlZCBpbiB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgbW9zdCBtYWluc3RyZWFtXG4gICAgICAgICAgICAgICAgLy8gYnJvd3NlcnM6XG4gICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0lEQk9iamVjdFN0b3JlL2dldEFsbFxuICAgICAgICAgICAgICAgIC8vIHRzbGludDplbmFibGU6bWF4LWxpbmUtbGVuZ3RoXG4gICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICAgICAgICAgICAgICAgIGNvbnN0IGdldEFsbEluZm9SZXF1ZXN0ID0gc3RvcmUuZ2V0QWxsKCk7XG4gICAgICAgICAgICAgICAgZ2V0QWxsSW5mb1JlcXVlc3Qub25zdWNjZXNzID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvdXQgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGdldEFsbEluZm9SZXF1ZXN0LnJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3V0W2l0ZW0ubW9kZWxQYXRoXSA9IGl0ZW0ubW9kZWxBcnRpZmFjdHNJbmZvO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUob3V0KTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGdldEFsbEluZm9SZXF1ZXN0Lm9uZXJyb3IgPSBlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGRiLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QoZ2V0QWxsSW5mb1JlcXVlc3QuZXJyb3IpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdHgub25jb21wbGV0ZSA9ICgpID0+IGRiLmNsb3NlKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgb3BlblJlcXVlc3Qub25lcnJvciA9IGVycm9yID0+IHJlamVjdChvcGVuUmVxdWVzdC5lcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhc3luYyByZW1vdmVNb2RlbChwYXRoKSB7XG4gICAgICAgIHBhdGggPSBtYXliZVN0cmlwU2NoZW1lKHBhdGgpO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb3BlblJlcXVlc3QgPSB0aGlzLmluZGV4ZWREQi5vcGVuKERBVEFCQVNFX05BTUUsIERBVEFCQVNFX1ZFUlNJT04pO1xuICAgICAgICAgICAgb3BlblJlcXVlc3Qub251cGdyYWRlbmVlZGVkID0gKCkgPT4gc2V0VXBEYXRhYmFzZShvcGVuUmVxdWVzdCk7XG4gICAgICAgICAgICBvcGVuUmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGIgPSBvcGVuUmVxdWVzdC5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5mb1R4ID0gZGIudHJhbnNhY3Rpb24oSU5GT19TVE9SRV9OQU1FLCAncmVhZHdyaXRlJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5mb1N0b3JlID0gaW5mb1R4Lm9iamVjdFN0b3JlKElORk9fU1RPUkVfTkFNRSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZ2V0SW5mb1JlcXVlc3QgPSBpbmZvU3RvcmUuZ2V0KHBhdGgpO1xuICAgICAgICAgICAgICAgIGxldCBtb2RlbFR4O1xuICAgICAgICAgICAgICAgIGdldEluZm9SZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGdldEluZm9SZXF1ZXN0LnJlc3VsdCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYi5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdChuZXcgRXJyb3IoYENhbm5vdCBmaW5kIG1vZGVsIHdpdGggcGF0aCAnJHtwYXRofScgYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYGluIEluZGV4ZWREQi5gKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBGaXJzdCwgZGVsZXRlIHRoZSBlbnRyeSBpbiB0aGUgaW5mbyBzdG9yZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlbGV0ZUluZm9SZXF1ZXN0ID0gaW5mb1N0b3JlLmRlbGV0ZShwYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlbGV0ZU1vZGVsRGF0YSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZWNvbmQsIGRlbGV0ZSB0aGUgZW50cnkgaW4gdGhlIG1vZGVsIHN0b3JlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsVHggPSBkYi50cmFuc2FjdGlvbihNT0RFTF9TVE9SRV9OQU1FLCAncmVhZHdyaXRlJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbW9kZWxTdG9yZSA9IG1vZGVsVHgub2JqZWN0U3RvcmUoTU9ERUxfU1RPUkVfTkFNRSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVsZXRlTW9kZWxSZXF1ZXN0ID0gbW9kZWxTdG9yZS5kZWxldGUocGF0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlTW9kZWxSZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpID0+IHJlc29sdmUoZ2V0SW5mb1JlcXVlc3QucmVzdWx0Lm1vZGVsQXJ0aWZhY3RzSW5mbyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlTW9kZWxSZXF1ZXN0Lm9uZXJyb3IgPSBlcnJvciA9PiByZWplY3QoZ2V0SW5mb1JlcXVlc3QuZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByb2NlZWQgd2l0aCBkZWxldGluZyBtb2RlbCBkYXRhIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBkZWxldGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2YgaW5mbyBkYXRhIHN1Y2NlZWRzIG9yIG5vdC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZUluZm9SZXF1ZXN0Lm9uc3VjY2VzcyA9IGRlbGV0ZU1vZGVsRGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZUluZm9SZXF1ZXN0Lm9uZXJyb3IgPSBlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlTW9kZWxEYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGIuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KGdldEluZm9SZXF1ZXN0LmVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGdldEluZm9SZXF1ZXN0Lm9uZXJyb3IgPSBlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGRiLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QoZ2V0SW5mb1JlcXVlc3QuZXJyb3IpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgaW5mb1R4Lm9uY29tcGxldGUgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtb2RlbFR4ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRiLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbFR4Lm9uY29tcGxldGUgPSAoKSA9PiBkYi5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBvcGVuUmVxdWVzdC5vbmVycm9yID0gZXJyb3IgPT4gcmVqZWN0KG9wZW5SZXF1ZXN0LmVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXhlZF9kYi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG4vLyBJbXBvcnRpbmcgbG9jYWxfc3RvcmFnZSBhbmQgaW5kZXhlZF9kYiBpcyBuZWNlc3NhcnkgZm9yIHRoZSByb3V0ZXJzIHRvIGJlXG4vLyByZWdpc3RlcmVkLlxuaW1wb3J0ICcuL2luZGV4ZWRfZGInO1xuaW1wb3J0ICcuL2xvY2FsX3N0b3JhZ2UnO1xuaW1wb3J0IHsgYnJvd3NlckZpbGVzIH0gZnJvbSAnLi9icm93c2VyX2ZpbGVzJztcbmltcG9ydCB7IGJyb3dzZXJIVFRQUmVxdWVzdCwgaHR0cCwgaXNIVFRQU2NoZW1lIH0gZnJvbSAnLi9odHRwJztcbmltcG9ydCB7IGNvbmNhdGVuYXRlQXJyYXlCdWZmZXJzLCBkZWNvZGVXZWlnaHRzLCBlbmNvZGVXZWlnaHRzLCBnZXRNb2RlbEFydGlmYWN0c0ZvckpTT04sIGdldE1vZGVsQXJ0aWZhY3RzSW5mb0ZvckpTT04gfSBmcm9tICcuL2lvX3V0aWxzJztcbmltcG9ydCB7IGZyb21NZW1vcnksIHdpdGhTYXZlSGFuZGxlciB9IGZyb20gJy4vcGFzc3Rocm91Z2gnO1xuaW1wb3J0IHsgZ2V0TG9hZEhhbmRsZXJzLCBnZXRTYXZlSGFuZGxlcnMsIHJlZ2lzdGVyTG9hZFJvdXRlciwgcmVnaXN0ZXJTYXZlUm91dGVyIH0gZnJvbSAnLi9yb3V0ZXJfcmVnaXN0cnknO1xuaW1wb3J0IHsgbG9hZFdlaWdodHMsIHdlaWdodHNMb2FkZXJGYWN0b3J5IH0gZnJvbSAnLi93ZWlnaHRzX2xvYWRlcic7XG5leHBvcnQgeyBjb3B5TW9kZWwsIGxpc3RNb2RlbHMsIG1vdmVNb2RlbCwgcmVtb3ZlTW9kZWwgfSBmcm9tICcuL21vZGVsX21hbmFnZW1lbnQnO1xuZXhwb3J0IHsgYnJvd3NlckZpbGVzLCBicm93c2VySFRUUFJlcXVlc3QsIGNvbmNhdGVuYXRlQXJyYXlCdWZmZXJzLCBkZWNvZGVXZWlnaHRzLCBlbmNvZGVXZWlnaHRzLCBmcm9tTWVtb3J5LCBnZXRMb2FkSGFuZGxlcnMsIGdldE1vZGVsQXJ0aWZhY3RzRm9ySlNPTiwgZ2V0TW9kZWxBcnRpZmFjdHNJbmZvRm9ySlNPTiwgZ2V0U2F2ZUhhbmRsZXJzLCBodHRwLCBpc0hUVFBTY2hlbWUsIGxvYWRXZWlnaHRzLCByZWdpc3RlckxvYWRSb3V0ZXIsIHJlZ2lzdGVyU2F2ZVJvdXRlciwgd2VpZ2h0c0xvYWRlckZhY3RvcnksIHdpdGhTYXZlSGFuZGxlciB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW8uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgY29tcGxleCB9IGZyb20gJy4uL29wcy9jb21wbGV4JztcbmltcG9ydCB7IHRlbnNvciB9IGZyb20gJy4uL29wcy90ZW5zb3InO1xuaW1wb3J0IHsgc2l6ZUZyb21TaGFwZSB9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgRFRZUEVfVkFMVUVfU0laRV9NQVAgfSBmcm9tICcuL3R5cGVzJztcbi8qKiBOdW1iZXIgb2YgYnl0ZXMgcmVzZXJ2ZWQgZm9yIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZy4gKDMyYml0IGludGVnZXIpLiAqL1xuY29uc3QgTlVNX0JZVEVTX1NUUklOR19MRU5HVEggPSA0O1xuLyoqXG4gKiBFbmNvZGUgYSBtYXAgZnJvbSBuYW1lcyB0byB3ZWlnaHQgdmFsdWVzIGFzIGFuIEFycmF5QnVmZmVyLCBhbG9uZyB3aXRoIGFuXG4gKiBgQXJyYXlgIG9mIGBXZWlnaHRzTWFuaWZlc3RFbnRyeWAgYXMgc3BlY2lmaWNhdGlvbiBvZiB0aGUgZW5jb2RlZCB3ZWlnaHRzLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcGVyZm9ybSBzaGFyZGluZy5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIHRoZSByZXZlcnNlIG9mIGBkZWNvZGVXZWlnaHRzYC5cbiAqXG4gKiBAcGFyYW0gdGVuc29ycyBBIG1hcCAoXCJkaWN0XCIpIGZyb20gbmFtZXMgdG8gdGVuc29ycy5cbiAqIEBwYXJhbSBncm91cCBHcm91cCB0byB3aGljaCB0aGUgd2VpZ2h0cyBiZWxvbmcgKG9wdGlvbmFsKS5cbiAqIEByZXR1cm5zIEEgYFByb21pc2VgIG9mXG4gKiAgIC0gQSBmbGF0IGBBcnJheUJ1ZmZlcmAgd2l0aCBhbGwgdGhlIGJpbmFyeSB2YWx1ZXMgb2YgdGhlIGBUZW5zb3Jgc1xuICogICAgIGNvbmNhdGVuYXRlZC5cbiAqICAgLSBBbiBgQXJyYXlgIG9mIGBXZWlnaHRNYW5pZmVzdEVudHJ5YHMsIGNhcnJ5aW5nIGluZm9ybWF0aW9uIGluY2x1ZGluZ1xuICogICAgIHRlbnNvciBuYW1lcywgYGR0eXBlYHMgYW5kIHNoYXBlcy5cbiAqIEB0aHJvd3MgRXJyb3I6IG9uIHVuc3VwcG9ydGVkIHRlbnNvciBgZHR5cGVgLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5jb2RlV2VpZ2h0cyh0ZW5zb3JzLCBncm91cCkge1xuICAgIC8vIFRPRE8oYWRhcm9iLCBjYWlzKTogU3VwcG9ydCBxdWFudGl6YXRpb24uXG4gICAgY29uc3Qgc3BlY3MgPSBbXTtcbiAgICBjb25zdCBkYXRhUHJvbWlzZXMgPSBbXTtcbiAgICBjb25zdCBuYW1lcyA9IEFycmF5LmlzQXJyYXkodGVuc29ycykgP1xuICAgICAgICB0ZW5zb3JzLm1hcCh0ZW5zb3IgPT4gdGVuc29yLm5hbWUpIDpcbiAgICAgICAgT2JqZWN0LmtleXModGVuc29ycyk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7ICsraSkge1xuICAgICAgICBjb25zdCBuYW1lID0gbmFtZXNbaV07XG4gICAgICAgIGNvbnN0IHQgPSBBcnJheS5pc0FycmF5KHRlbnNvcnMpID8gdGVuc29yc1tpXS50ZW5zb3IgOiB0ZW5zb3JzW25hbWVdO1xuICAgICAgICBpZiAodC5kdHlwZSAhPT0gJ2Zsb2F0MzInICYmIHQuZHR5cGUgIT09ICdpbnQzMicgJiYgdC5kdHlwZSAhPT0gJ2Jvb2wnICYmXG4gICAgICAgICAgICB0LmR0eXBlICE9PSAnc3RyaW5nJyAmJiB0LmR0eXBlICE9PSAnY29tcGxleDY0Jykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBkdHlwZSBpbiB3ZWlnaHQgJyR7bmFtZX0nOiAke3QuZHR5cGV9YCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3BlYyA9IHsgbmFtZSwgc2hhcGU6IHQuc2hhcGUsIGR0eXBlOiB0LmR0eXBlIH07XG4gICAgICAgIGlmICh0LmR0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uc3QgdXRmOGJ5dGVzID0gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWxzID0gYXdhaXQgdC5ieXRlcygpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvdGFsTnVtQnl0ZXMgPSB2YWxzLnJlZHVjZSgocCwgYykgPT4gcCArIGMubGVuZ3RoLCAwKSArXG4gICAgICAgICAgICAgICAgICAgIE5VTV9CWVRFU19TVFJJTkdfTEVOR1RIICogdmFscy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheSh0b3RhbE51bUJ5dGVzKTtcbiAgICAgICAgICAgICAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsID0gdmFsc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYnl0ZXNPZkxlbmd0aCA9IG5ldyBVaW50OEFycmF5KG5ldyBVaW50MzJBcnJheShbdmFsLmxlbmd0aF0pLmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgICAgIGJ5dGVzLnNldChieXRlc09mTGVuZ3RoLCBvZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gTlVNX0JZVEVTX1NUUklOR19MRU5HVEg7XG4gICAgICAgICAgICAgICAgICAgIGJ5dGVzLnNldCh2YWwsIG9mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSB2YWwubGVuZ3RoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXNvbHZlKGJ5dGVzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZGF0YVByb21pc2VzLnB1c2godXRmOGJ5dGVzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGRhdGFQcm9taXNlcy5wdXNoKHQuZGF0YSgpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZ3JvdXAgIT0gbnVsbCkge1xuICAgICAgICAgICAgc3BlYy5ncm91cCA9IGdyb3VwO1xuICAgICAgICB9XG4gICAgICAgIHNwZWNzLnB1c2goc3BlYyk7XG4gICAgfVxuICAgIGNvbnN0IHRlbnNvclZhbHVlcyA9IGF3YWl0IFByb21pc2UuYWxsKGRhdGFQcm9taXNlcyk7XG4gICAgcmV0dXJuIHsgZGF0YTogY29uY2F0ZW5hdGVUeXBlZEFycmF5cyh0ZW5zb3JWYWx1ZXMpLCBzcGVjcyB9O1xufVxuLyoqXG4gKiBEZWNvZGUgZmxhdCBBcnJheUJ1ZmZlciBhcyB3ZWlnaHRzLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgaGFuZGxlIHNoYXJkaW5nLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gaXMgdGhlIHJldmVyc2Ugb2YgYGVuY29kZVdlaWdodHNgLlxuICpcbiAqIEBwYXJhbSBidWZmZXIgQSBmbGF0IEFycmF5QnVmZmVyIGNhcnJ5aW5nIHRoZSBiaW5hcnkgdmFsdWVzIG9mIHRoZSB0ZW5zb3JzXG4gKiAgIGNvbmNhdGVuYXRlZCBpbiB0aGUgb3JkZXIgc3BlY2lmaWVkIGluIGBzcGVjc2AuXG4gKiBAcGFyYW0gc3BlY3MgU3BlY2lmaWNhdGlvbnMgb2YgdGhlIG5hbWVzLCBkdHlwZXMgYW5kIHNoYXBlcyBvZiB0aGUgdGVuc29yc1xuICogICB3aG9zZSB2YWx1ZSBhcmUgZW5jb2RlZCBieSBgYnVmZmVyYC5cbiAqIEByZXR1cm4gQSBtYXAgZnJvbSB0ZW5zb3IgbmFtZSB0byB0ZW5zb3IgdmFsdWUsIHdpdGggdGhlIG5hbWVzIGNvcnJlc3BvbmRpbmdcbiAqICAgdG8gbmFtZXMgaW4gYHNwZWNzYC5cbiAqIEB0aHJvd3MgRXJyb3IsIGlmIGFueSBvZiB0aGUgdGVuc29ycyBoYXMgdW5zdXBwb3J0ZWQgZHR5cGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVXZWlnaHRzKGJ1ZmZlciwgc3BlY3MpIHtcbiAgICAvLyBUT0RPKGFkYXJvYiwgY2Fpcyk6IFN1cHBvcnQgcXVhbnRpemF0aW9uLlxuICAgIGNvbnN0IG91dCA9IHt9O1xuICAgIGxldCBmbG9hdDE2RGVjb2RlO1xuICAgIGxldCBvZmZzZXQgPSAwO1xuICAgIGZvciAoY29uc3Qgc3BlYyBvZiBzcGVjcykge1xuICAgICAgICBjb25zdCBuYW1lID0gc3BlYy5uYW1lO1xuICAgICAgICBjb25zdCBkdHlwZSA9IHNwZWMuZHR5cGU7XG4gICAgICAgIGNvbnN0IHNoYXBlID0gc3BlYy5zaGFwZTtcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHNpemVGcm9tU2hhcGUoc2hhcGUpO1xuICAgICAgICBsZXQgdmFsdWVzO1xuICAgICAgICBpZiAoJ3F1YW50aXphdGlvbicgaW4gc3BlYykge1xuICAgICAgICAgICAgY29uc3QgcXVhbnRpemF0aW9uID0gc3BlYy5xdWFudGl6YXRpb247XG4gICAgICAgICAgICBpZiAocXVhbnRpemF0aW9uLmR0eXBlID09PSAndWludDgnIHx8IHF1YW50aXphdGlvbi5kdHlwZSA9PT0gJ3VpbnQxNicpIHtcbiAgICAgICAgICAgICAgICBpZiAoISgnbWluJyBpbiBxdWFudGl6YXRpb24gJiYgJ3NjYWxlJyBpbiBxdWFudGl6YXRpb24pKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgV2VpZ2h0ICR7c3BlYy5uYW1lfSB3aXRoIHF1YW50aXphdGlvbiAke3F1YW50aXphdGlvbi5kdHlwZX0gYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgZG9lc24ndCBoYXZlIGNvcnJlc3BvbmRpbmcgbWV0YWRhdGEgbWluIGFuZCBzY2FsZS5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChxdWFudGl6YXRpb24uZHR5cGUgPT09ICdmbG9hdDE2Jykge1xuICAgICAgICAgICAgICAgIGlmIChkdHlwZSAhPT0gJ2Zsb2F0MzInKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgV2VpZ2h0ICR7c3BlYy5uYW1lfSBpcyBxdWFudGl6ZWQgd2l0aCAke3F1YW50aXphdGlvbi5kdHlwZX0gYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgd2hpY2ggb25seSBzdXBwb3J0cyB3ZWlnaHRzIG9mIHR5cGUgZmxvYXQzMiBub3QgJHtkdHlwZX0uYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBXZWlnaHQgJHtzcGVjLm5hbWV9IGhhcyB1bmtub3duIGAgK1xuICAgICAgICAgICAgICAgICAgICBgcXVhbnRpemF0aW9uIGR0eXBlICR7cXVhbnRpemF0aW9uLmR0eXBlfS4gYCArXG4gICAgICAgICAgICAgICAgICAgIGBTdXBwb3J0ZWQgcXVhbnRpemF0aW9uIGR0eXBlcyBhcmU6IGAgK1xuICAgICAgICAgICAgICAgICAgICBgJ3VpbnQ4JywgJ3VpbnQxNicsIGFuZCAnZmxvYXQxNicuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBxdWFudGl6YXRpb25TaXplRmFjdG9yID0gRFRZUEVfVkFMVUVfU0laRV9NQVBbcXVhbnRpemF0aW9uLmR0eXBlXTtcbiAgICAgICAgICAgIGNvbnN0IGJ5dGVCdWZmZXIgPSBidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBzaXplICogcXVhbnRpemF0aW9uU2l6ZUZhY3Rvcik7XG4gICAgICAgICAgICBjb25zdCBxdWFudGl6ZWRBcnJheSA9IChxdWFudGl6YXRpb24uZHR5cGUgPT09ICd1aW50OCcpID9cbiAgICAgICAgICAgICAgICBuZXcgVWludDhBcnJheShieXRlQnVmZmVyKSA6XG4gICAgICAgICAgICAgICAgbmV3IFVpbnQxNkFycmF5KGJ5dGVCdWZmZXIpO1xuICAgICAgICAgICAgaWYgKGR0eXBlID09PSAnZmxvYXQzMicpIHtcbiAgICAgICAgICAgICAgICBpZiAocXVhbnRpemF0aW9uLmR0eXBlID09PSAndWludDgnIHx8IHF1YW50aXphdGlvbi5kdHlwZSA9PT0gJ3VpbnQxNicpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gbmV3IEZsb2F0MzJBcnJheShxdWFudGl6ZWRBcnJheS5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHF1YW50aXplZEFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ID0gcXVhbnRpemVkQXJyYXlbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXNbaV0gPSB2ICogcXVhbnRpemF0aW9uLnNjYWxlICsgcXVhbnRpemF0aW9uLm1pbjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChxdWFudGl6YXRpb24uZHR5cGUgPT09ICdmbG9hdDE2Jykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZmxvYXQxNkRlY29kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmbG9hdDE2RGVjb2RlID0gZ2V0RmxvYXQxNkRlY29kZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBmbG9hdDE2RGVjb2RlKHF1YW50aXplZEFycmF5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgcXVhbnRpemF0aW9uIHR5cGUgJHtxdWFudGl6YXRpb24uZHR5cGV9IGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYGZvciB3ZWlnaHQgdHlwZSBmbG9hdDMyLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGR0eXBlID09PSAnaW50MzInKSB7XG4gICAgICAgICAgICAgICAgaWYgKHF1YW50aXphdGlvbi5kdHlwZSAhPT0gJ3VpbnQ4JyAmJiBxdWFudGl6YXRpb24uZHR5cGUgIT09ICd1aW50MTYnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgcXVhbnRpemF0aW9uIHR5cGUgJHtxdWFudGl6YXRpb24uZHR5cGV9IGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYGZvciB3ZWlnaHQgdHlwZSBpbnQzMi5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFsdWVzID0gbmV3IEludDMyQXJyYXkocXVhbnRpemVkQXJyYXkubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHF1YW50aXplZEFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHYgPSBxdWFudGl6ZWRBcnJheVtpXTtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzW2ldID0gTWF0aC5yb3VuZCh2ICogcXVhbnRpemF0aW9uLnNjYWxlICsgcXVhbnRpemF0aW9uLm1pbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBkdHlwZSBpbiB3ZWlnaHQgJyR7bmFtZX0nOiAke2R0eXBlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb2Zmc2V0ICs9IHNpemUgKiBxdWFudGl6YXRpb25TaXplRmFjdG9yO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGR0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uc3Qgc2l6ZSA9IHNpemVGcm9tU2hhcGUoc3BlYy5zaGFwZSk7XG4gICAgICAgICAgICB2YWx1ZXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYnl0ZUxlbmd0aCA9IG5ldyBVaW50MzJBcnJheShidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBOVU1fQllURVNfU1RSSU5HX0xFTkdUSCkpWzBdO1xuICAgICAgICAgICAgICAgIG9mZnNldCArPSBOVU1fQllURVNfU1RSSU5HX0xFTkdUSDtcbiAgICAgICAgICAgICAgICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlci5zbGljZShvZmZzZXQsIG9mZnNldCArIGJ5dGVMZW5ndGgpKTtcbiAgICAgICAgICAgICAgICB2YWx1ZXMucHVzaChieXRlcyk7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGJ5dGVMZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBkdHlwZUZhY3RvciA9IERUWVBFX1ZBTFVFX1NJWkVfTUFQW2R0eXBlXTtcbiAgICAgICAgICAgIGNvbnN0IGJ5dGVCdWZmZXIgPSBidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBzaXplICogZHR5cGVGYWN0b3IpO1xuICAgICAgICAgICAgaWYgKGR0eXBlID09PSAnZmxvYXQzMicpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZXMgPSBuZXcgRmxvYXQzMkFycmF5KGJ5dGVCdWZmZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZHR5cGUgPT09ICdpbnQzMicpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZXMgPSBuZXcgSW50MzJBcnJheShieXRlQnVmZmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGR0eXBlID09PSAnYm9vbCcpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZXMgPSBuZXcgVWludDhBcnJheShieXRlQnVmZmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgICAgICAgICAgICAgIHZhbHVlcyA9IG5ldyBGbG9hdDMyQXJyYXkoYnl0ZUJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVhbCA9IG5ldyBGbG9hdDMyQXJyYXkodmFsdWVzLmxlbmd0aCAvIDIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGltYWdlID0gbmV3IEZsb2F0MzJBcnJheSh2YWx1ZXMubGVuZ3RoIC8gMik7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZWFsLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlYWxbaV0gPSB2YWx1ZXNbaSAqIDJdO1xuICAgICAgICAgICAgICAgICAgICBpbWFnZVtpXSA9IHZhbHVlc1tpICogMiArIDFdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCByZWFsVGVuc29yID0gdGVuc29yKHJlYWwsIHNoYXBlLCAnZmxvYXQzMicpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGltYWdlVGVuc29yID0gdGVuc29yKGltYWdlLCBzaGFwZSwgJ2Zsb2F0MzInKTtcbiAgICAgICAgICAgICAgICBvdXRbbmFtZV0gPSBjb21wbGV4KHJlYWxUZW5zb3IsIGltYWdlVGVuc29yKTtcbiAgICAgICAgICAgICAgICByZWFsVGVuc29yLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgICAgICBpbWFnZVRlbnNvci5kaXNwb3NlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGR0eXBlIGluIHdlaWdodCAnJHtuYW1lfSc6ICR7ZHR5cGV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvZmZzZXQgKz0gc2l6ZSAqIGR0eXBlRmFjdG9yO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkdHlwZSAhPT0gJ2NvbXBsZXg2NCcpIHtcbiAgICAgICAgICAgIG91dFtuYW1lXSA9IHRlbnNvcih2YWx1ZXMsIHNoYXBlLCBkdHlwZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ29uY2F0ZW5hdGUgVHlwZWRBcnJheXMgaW50byBhbiBBcnJheUJ1ZmZlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbmNhdGVuYXRlVHlwZWRBcnJheXMoeHMpIHtcbiAgICAvLyBUT0RPKGFkYXJvYiwgY2Fpcyk6IFN1cHBvcnQgcXVhbnRpemF0aW9uLlxuICAgIGlmICh4cyA9PT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgaW5wdXQgdmFsdWU6ICR7SlNPTi5zdHJpbmdpZnkoeHMpfWApO1xuICAgIH1cbiAgICBsZXQgdG90YWxCeXRlTGVuZ3RoID0gMDtcbiAgICAvLyBgbm9ybWFsaXplZFhzYCBpcyBoZXJlIGZvciB0aGlzIHJlYXNvbjogYSBgVHlwZWRBcnJheWAncyBgYnVmZmVyJ1xuICAgIC8vIGNhbiBoYXZlIGEgZGlmZmVyZW50IGJ5dGUgbGVuZ3RoIGZyb20gdGhhdCBvZiB0aGUgYFR5cGVkQXJyYXlgIGl0c2VsZixcbiAgICAvLyBmb3IgZXhhbXBsZSwgd2hlbiB0aGUgYFR5cGVkQXJyYXlgIGlzIGNyZWF0ZWQgZnJvbSBhbiBvZmZzZXQgaW4gYW5cbiAgICAvLyBgQXJyYXlCdWZmZXJgLiBgbm9ybWxpYXplZFhzYCBob2xkcyBgVHlwZWRBcnJheWBzIHdob3NlIGBidWZmZXJgcyBtYXRjaFxuICAgIC8vIHRoZSBgVHlwZWRBcnJheWAgaW4gYnl0ZSBsZW5ndGguIElmIGFuIGVsZW1lbnQgb2YgYHhzYCBkb2VzIG5vdCBzaG93XG4gICAgLy8gdGhpcyBwcm9wZXJ0eSwgYSBuZXcgYFR5cGVkQXJyYXlgIHRoYXQgc2F0aXNmeSB0aGlzIHByb3BlcnR5IHdpbGwgYmVcbiAgICAvLyBjb25zdHJ1Y3RlZCBhbmQgcHVzaGVkIGludG8gYG5vcm1hbGl6ZWRYc2AuXG4gICAgY29uc3Qgbm9ybWFsaXplZFhzID0gW107XG4gICAgeHMuZm9yRWFjaCgoeCkgPT4ge1xuICAgICAgICB0b3RhbEJ5dGVMZW5ndGggKz0geC5ieXRlTGVuZ3RoO1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZTpuby1hbnlcbiAgICAgICAgbm9ybWFsaXplZFhzLnB1c2goeC5ieXRlTGVuZ3RoID09PSB4LmJ1ZmZlci5ieXRlTGVuZ3RoID8geCA6XG4gICAgICAgICAgICBuZXcgeC5jb25zdHJ1Y3Rvcih4KSk7XG4gICAgICAgIGlmICghKHggaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkgfHwgeCBpbnN0YW5jZW9mIEludDMyQXJyYXkgfHxcbiAgICAgICAgICAgIHggaW5zdGFuY2VvZiBVaW50OEFycmF5KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBUeXBlZEFycmF5IHN1YnR5cGU6ICR7eC5jb25zdHJ1Y3Rvci5uYW1lfWApO1xuICAgICAgICB9XG4gICAgICAgIC8vIHRzbGludDplbmFibGU6bm8tYW55XG4gICAgfSk7XG4gICAgY29uc3QgeSA9IG5ldyBVaW50OEFycmF5KHRvdGFsQnl0ZUxlbmd0aCk7XG4gICAgbGV0IG9mZnNldCA9IDA7XG4gICAgbm9ybWFsaXplZFhzLmZvckVhY2goKHgpID0+IHtcbiAgICAgICAgeS5zZXQobmV3IFVpbnQ4QXJyYXkoeC5idWZmZXIpLCBvZmZzZXQpO1xuICAgICAgICBvZmZzZXQgKz0geC5ieXRlTGVuZ3RoO1xuICAgIH0pO1xuICAgIHJldHVybiB5LmJ1ZmZlcjtcbn1cbi8vIFVzZSBCdWZmZXIgb24gTm9kZS5qcyBpbnN0ZWFkIG9mIEJsb2IvYXRvYi9idG9hXG5jb25zdCB1c2VOb2RlQnVmZmVyID0gdHlwZW9mIEJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAodHlwZW9mIEJsb2IgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiBhdG9iID09PSAndW5kZWZpbmVkJyB8fFxuICAgICAgICB0eXBlb2YgYnRvYSA9PT0gJ3VuZGVmaW5lZCcpO1xuLyoqXG4gKiBDYWxjdWxhdGUgdGhlIGJ5dGUgbGVuZ3RoIG9mIGEgSmF2YVNjcmlwdCBzdHJpbmcuXG4gKlxuICogTm90ZSB0aGF0IGEgSmF2YVNjcmlwdCBzdHJpbmcgY2FuIGNvbnRhaW4gd2lkZSBjaGFyYWN0ZXJzLCB0aGVyZWZvcmUgdGhlXG4gKiBsZW5ndGggb2YgdGhlIHN0cmluZyBpcyBub3QgbmVjZXNzYXJpbHkgZXF1YWwgdG8gdGhlIGJ5dGUgbGVuZ3RoLlxuICpcbiAqIEBwYXJhbSBzdHIgSW5wdXQgc3RyaW5nLlxuICogQHJldHVybnMgQnl0ZSBsZW5ndGguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdCeXRlTGVuZ3RoKHN0cikge1xuICAgIGlmICh1c2VOb2RlQnVmZmVyKSB7XG4gICAgICAgIHJldHVybiBCdWZmZXIuYnl0ZUxlbmd0aChzdHIpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEJsb2IoW3N0cl0pLnNpemU7XG59XG4vKipcbiAqIEVuY29kZSBhbiBBcnJheUJ1ZmZlciBhcyBhIGJhc2U2NCBlbmNvZGVkIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0gYnVmZmVyIGBBcnJheUJ1ZmZlcmAgdG8gYmUgY29udmVydGVkLlxuICogQHJldHVybnMgQSBzdHJpbmcgdGhhdCBiYXNlNjQtZW5jb2RlcyBgYnVmZmVyYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFycmF5QnVmZmVyVG9CYXNlNjRTdHJpbmcoYnVmZmVyKSB7XG4gICAgaWYgKHVzZU5vZGVCdWZmZXIpIHtcbiAgICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGJ1ZmZlcikudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAgIH1cbiAgICBjb25zdCBidWYgPSBuZXcgVWludDhBcnJheShidWZmZXIpO1xuICAgIGxldCBzID0gJyc7XG4gICAgZm9yIChsZXQgaSA9IDAsIGwgPSBidWYubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIHMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gYnRvYShzKTtcbn1cbi8qKlxuICogRGVjb2RlIGEgYmFzZTY0IHN0cmluZyBhcyBhbiBBcnJheUJ1ZmZlci5cbiAqXG4gKiBAcGFyYW0gc3RyIEJhc2U2NCBzdHJpbmcuXG4gKiBAcmV0dXJucyBEZWNvZGVkIGBBcnJheUJ1ZmZlcmAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiYXNlNjRTdHJpbmdUb0FycmF5QnVmZmVyKHN0cikge1xuICAgIGlmICh1c2VOb2RlQnVmZmVyKSB7XG4gICAgICAgIGNvbnN0IGJ1ZiA9IEJ1ZmZlci5mcm9tKHN0ciwgJ2Jhc2U2NCcpO1xuICAgICAgICByZXR1cm4gYnVmLmJ1ZmZlci5zbGljZShidWYuYnl0ZU9mZnNldCwgYnVmLmJ5dGVPZmZzZXQgKyBidWYuYnl0ZUxlbmd0aCk7XG4gICAgfVxuICAgIGNvbnN0IHMgPSBhdG9iKHN0cik7XG4gICAgY29uc3QgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkocy5sZW5ndGgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcy5sZW5ndGg7ICsraSkge1xuICAgICAgICBidWZmZXIuc2V0KFtzLmNoYXJDb2RlQXQoaSldLCBpKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1ZmZlci5idWZmZXI7XG59XG4vKipcbiAqIENvbmNhdGVuYXRlIGEgbnVtYmVyIG9mIEFycmF5QnVmZmVycyBpbnRvIG9uZS5cbiAqXG4gKiBAcGFyYW0gYnVmZmVycyBBIG51bWJlciBvZiBhcnJheSBidWZmZXJzIHRvIGNvbmNhdGVuYXRlLlxuICogQHJldHVybnMgUmVzdWx0IG9mIGNvbmNhdGVuYXRpbmcgYGJ1ZmZlcnNgIGluIG9yZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29uY2F0ZW5hdGVBcnJheUJ1ZmZlcnMoYnVmZmVycykge1xuICAgIGlmIChidWZmZXJzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gYnVmZmVyc1swXTtcbiAgICB9XG4gICAgbGV0IHRvdGFsQnl0ZUxlbmd0aCA9IDA7XG4gICAgYnVmZmVycy5mb3JFYWNoKChidWZmZXIpID0+IHtcbiAgICAgICAgdG90YWxCeXRlTGVuZ3RoICs9IGJ1ZmZlci5ieXRlTGVuZ3RoO1xuICAgIH0pO1xuICAgIGNvbnN0IHRlbXAgPSBuZXcgVWludDhBcnJheSh0b3RhbEJ5dGVMZW5ndGgpO1xuICAgIGxldCBvZmZzZXQgPSAwO1xuICAgIGJ1ZmZlcnMuZm9yRWFjaCgoYnVmZmVyKSA9PiB7XG4gICAgICAgIHRlbXAuc2V0KG5ldyBVaW50OEFycmF5KGJ1ZmZlciksIG9mZnNldCk7XG4gICAgICAgIG9mZnNldCArPSBidWZmZXIuYnl0ZUxlbmd0aDtcbiAgICB9KTtcbiAgICByZXR1cm4gdGVtcC5idWZmZXI7XG59XG4vKipcbiAqIEdldCB0aGUgYmFzZW5hbWUgb2YgYSBwYXRoLlxuICpcbiAqIEJlaGF2ZXMgaW4gYSB3YXkgYW5hbG9nb3VzIHRvIExpbnV4J3MgYmFzZW5hbWUgY29tbWFuZC5cbiAqXG4gKiBAcGFyYW0gcGF0aFxuICovXG5leHBvcnQgZnVuY3Rpb24gYmFzZW5hbWUocGF0aCkge1xuICAgIGNvbnN0IFNFUEFSQVRPUiA9ICcvJztcbiAgICBwYXRoID0gcGF0aC50cmltKCk7XG4gICAgd2hpbGUgKHBhdGguZW5kc1dpdGgoU0VQQVJBVE9SKSkge1xuICAgICAgICBwYXRoID0gcGF0aC5zbGljZSgwLCBwYXRoLmxlbmd0aCAtIDEpO1xuICAgIH1cbiAgICBjb25zdCBpdGVtcyA9IHBhdGguc3BsaXQoU0VQQVJBVE9SKTtcbiAgICByZXR1cm4gaXRlbXNbaXRlbXMubGVuZ3RoIC0gMV07XG59XG4vKipcbiAqIENyZWF0ZSBgTW9kZWxKU09OYCBmcm9tIGBNb2RlbEFydGlmYWN0c2AuXG4gKlxuICogQHBhcmFtIGFydGlmYWN0cyBNb2RlbCBhcnRpZmFjdHMsIGRlc2NyaWJpbmcgdGhlIG1vZGVsIGFuZCBpdHMgd2VpZ2h0cy5cbiAqIEBwYXJhbSBtYW5pZmVzdCBXZWlnaHQgbWFuaWZlc3QsIGRlc2NyaWJpbmcgd2hlcmUgdGhlIHdlaWdodHMgb2YgdGhlXG4gKiAgICAgYE1vZGVsQXJ0aWZhY3RzYCBhcmUgc3RvcmVkLCBhbmQgc29tZSBtZXRhZGF0YSBhYm91dCB0aGVtLlxuICogQHJldHVybnMgT2JqZWN0IHJlcHJlc2VudGluZyB0aGUgYG1vZGVsLmpzb25gIGZpbGUgZGVzY3JpYmluZyB0aGUgbW9kZWxcbiAqICAgICBhcnRpZmFjdHMgYW5kIHdlaWdodHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1vZGVsSlNPTkZvck1vZGVsQXJ0aWZhY3RzKGFydGlmYWN0cywgbWFuaWZlc3QpIHtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgIG1vZGVsVG9wb2xvZ3k6IGFydGlmYWN0cy5tb2RlbFRvcG9sb2d5LFxuICAgICAgICBmb3JtYXQ6IGFydGlmYWN0cy5mb3JtYXQsXG4gICAgICAgIGdlbmVyYXRlZEJ5OiBhcnRpZmFjdHMuZ2VuZXJhdGVkQnksXG4gICAgICAgIGNvbnZlcnRlZEJ5OiBhcnRpZmFjdHMuY29udmVydGVkQnksXG4gICAgICAgIHdlaWdodHNNYW5pZmVzdDogbWFuaWZlc3RcbiAgICB9O1xuICAgIGlmIChhcnRpZmFjdHMuc2lnbmF0dXJlICE9IG51bGwpIHtcbiAgICAgICAgcmVzdWx0LnNpZ25hdHVyZSA9IGFydGlmYWN0cy5zaWduYXR1cmU7XG4gICAgfVxuICAgIGlmIChhcnRpZmFjdHMudXNlckRlZmluZWRNZXRhZGF0YSAhPSBudWxsKSB7XG4gICAgICAgIHJlc3VsdC51c2VyRGVmaW5lZE1ldGFkYXRhID0gYXJ0aWZhY3RzLnVzZXJEZWZpbmVkTWV0YWRhdGE7XG4gICAgfVxuICAgIGlmIChhcnRpZmFjdHMubW9kZWxJbml0aWFsaXplciAhPSBudWxsKSB7XG4gICAgICAgIHJlc3VsdC5tb2RlbEluaXRpYWxpemVyID0gYXJ0aWZhY3RzLm1vZGVsSW5pdGlhbGl6ZXI7XG4gICAgfVxuICAgIGlmIChhcnRpZmFjdHMudHJhaW5pbmdDb25maWcgIT0gbnVsbCkge1xuICAgICAgICByZXN1bHQudHJhaW5pbmdDb25maWcgPSBhcnRpZmFjdHMudHJhaW5pbmdDb25maWc7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4vKipcbiAqIENyZWF0ZSBgTW9kZWxBcnRpZmFjdHNgIGZyb20gYSBKU09OIGZpbGUuXG4gKlxuICogQHBhcmFtIG1vZGVsSlNPTiBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyc2VkIEpTT04gb2YgYG1vZGVsLmpzb25gXG4gKiBAcGFyYW0gbG9hZFdlaWdodHMgRnVuY3Rpb24gdGhhdCB0YWtlcyB0aGUgSlNPTiBmaWxlJ3Mgd2VpZ2h0cyBtYW5pZmVzdCxcbiAqICAgICByZWFkcyB3ZWlnaHRzIGZyb20gdGhlIGxpc3RlZCBwYXRoKHMpLCBhbmQgcmV0dXJucyBhIFByb21pc2Ugb2YgdGhlXG4gKiAgICAgd2VpZ2h0IG1hbmlmZXN0IGVudHJpZXMgYWxvbmcgd2l0aCB0aGUgd2VpZ2h0cyBkYXRhLlxuICogQHJldHVybnMgQSBQcm9taXNlIG9mIHRoZSBgTW9kZWxBcnRpZmFjdHNgLCBhcyBkZXNjcmliZWQgYnkgdGhlIEpTT04gZmlsZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldE1vZGVsQXJ0aWZhY3RzRm9ySlNPTihtb2RlbEpTT04sIGxvYWRXZWlnaHRzKSB7XG4gICAgY29uc3QgbW9kZWxBcnRpZmFjdHMgPSB7XG4gICAgICAgIG1vZGVsVG9wb2xvZ3k6IG1vZGVsSlNPTi5tb2RlbFRvcG9sb2d5LFxuICAgICAgICBmb3JtYXQ6IG1vZGVsSlNPTi5mb3JtYXQsXG4gICAgICAgIGdlbmVyYXRlZEJ5OiBtb2RlbEpTT04uZ2VuZXJhdGVkQnksXG4gICAgICAgIGNvbnZlcnRlZEJ5OiBtb2RlbEpTT04uY29udmVydGVkQnlcbiAgICB9O1xuICAgIGlmIChtb2RlbEpTT04udHJhaW5pbmdDb25maWcgIT0gbnVsbCkge1xuICAgICAgICBtb2RlbEFydGlmYWN0cy50cmFpbmluZ0NvbmZpZyA9IG1vZGVsSlNPTi50cmFpbmluZ0NvbmZpZztcbiAgICB9XG4gICAgaWYgKG1vZGVsSlNPTi53ZWlnaHRzTWFuaWZlc3QgIT0gbnVsbCkge1xuICAgICAgICBjb25zdCBbd2VpZ2h0U3BlY3MsIHdlaWdodERhdGFdID0gYXdhaXQgbG9hZFdlaWdodHMobW9kZWxKU09OLndlaWdodHNNYW5pZmVzdCk7XG4gICAgICAgIG1vZGVsQXJ0aWZhY3RzLndlaWdodFNwZWNzID0gd2VpZ2h0U3BlY3M7XG4gICAgICAgIG1vZGVsQXJ0aWZhY3RzLndlaWdodERhdGEgPSB3ZWlnaHREYXRhO1xuICAgIH1cbiAgICBpZiAobW9kZWxKU09OLnNpZ25hdHVyZSAhPSBudWxsKSB7XG4gICAgICAgIG1vZGVsQXJ0aWZhY3RzLnNpZ25hdHVyZSA9IG1vZGVsSlNPTi5zaWduYXR1cmU7XG4gICAgfVxuICAgIGlmIChtb2RlbEpTT04udXNlckRlZmluZWRNZXRhZGF0YSAhPSBudWxsKSB7XG4gICAgICAgIG1vZGVsQXJ0aWZhY3RzLnVzZXJEZWZpbmVkTWV0YWRhdGEgPSBtb2RlbEpTT04udXNlckRlZmluZWRNZXRhZGF0YTtcbiAgICB9XG4gICAgaWYgKG1vZGVsSlNPTi5tb2RlbEluaXRpYWxpemVyICE9IG51bGwpIHtcbiAgICAgICAgbW9kZWxBcnRpZmFjdHMubW9kZWxJbml0aWFsaXplciA9IG1vZGVsSlNPTi5tb2RlbEluaXRpYWxpemVyO1xuICAgIH1cbiAgICByZXR1cm4gbW9kZWxBcnRpZmFjdHM7XG59XG4vKipcbiAqIFBvcHVsYXRlIE1vZGVsQXJ0aWZhY3RzSW5mbyBmaWVsZHMgZm9yIGEgbW9kZWwgd2l0aCBKU09OIHRvcG9sb2d5LlxuICogQHBhcmFtIG1vZGVsQXJ0aWZhY3RzXG4gKiBAcmV0dXJucyBBIE1vZGVsQXJ0aWZhY3RzSW5mbyBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNb2RlbEFydGlmYWN0c0luZm9Gb3JKU09OKG1vZGVsQXJ0aWZhY3RzKSB7XG4gICAgaWYgKG1vZGVsQXJ0aWZhY3RzLm1vZGVsVG9wb2xvZ3kgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIEpTT04gbW9kZWwgdG9wb2xvZ3ksIHJlY2VpdmVkIEFycmF5QnVmZmVyLicpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBkYXRlU2F2ZWQ6IG5ldyBEYXRlKCksXG4gICAgICAgIG1vZGVsVG9wb2xvZ3lUeXBlOiAnSlNPTicsXG4gICAgICAgIG1vZGVsVG9wb2xvZ3lCeXRlczogbW9kZWxBcnRpZmFjdHMubW9kZWxUb3BvbG9neSA9PSBudWxsID9cbiAgICAgICAgICAgIDAgOlxuICAgICAgICAgICAgc3RyaW5nQnl0ZUxlbmd0aChKU09OLnN0cmluZ2lmeShtb2RlbEFydGlmYWN0cy5tb2RlbFRvcG9sb2d5KSksXG4gICAgICAgIHdlaWdodFNwZWNzQnl0ZXM6IG1vZGVsQXJ0aWZhY3RzLndlaWdodFNwZWNzID09IG51bGwgP1xuICAgICAgICAgICAgMCA6XG4gICAgICAgICAgICBzdHJpbmdCeXRlTGVuZ3RoKEpTT04uc3RyaW5naWZ5KG1vZGVsQXJ0aWZhY3RzLndlaWdodFNwZWNzKSksXG4gICAgICAgIHdlaWdodERhdGFCeXRlczogbW9kZWxBcnRpZmFjdHMud2VpZ2h0RGF0YSA9PSBudWxsID9cbiAgICAgICAgICAgIDAgOlxuICAgICAgICAgICAgbW9kZWxBcnRpZmFjdHMud2VpZ2h0RGF0YS5ieXRlTGVuZ3RoLFxuICAgIH07XG59XG4vKipcbiAqIENvbXB1dGVzIG1hbnRpc2EgdGFibGUgZm9yIGNhc3RpbmcgRmxvYXQxNiB0byBGbG9hdDMyXG4gKiBTZWUgaHR0cDovL3d3dy5mb3gtdG9vbGtpdC5vcmcvZnRwL2Zhc3RoYWxmZmxvYXRjb252ZXJzaW9uLnBkZlxuICpcbiAqIEByZXR1cm5zIFVpbnQzMkFycmF5LCAyMDQ4IG1hbnRpc3NhIGxvb2t1cCB2YWx1ZXMuXG4gKi9cbmZ1bmN0aW9uIGNvbXB1dGVGbG9hdDE2TWFudGlzYVRhYmxlKCkge1xuICAgIGNvbnN0IGNvbnZlcnRNYW50aXNzYSA9IChpKSA9PiB7XG4gICAgICAgIGxldCBtID0gaSA8PCAxMztcbiAgICAgICAgbGV0IGUgPSAwO1xuICAgICAgICB3aGlsZSAoKG0gJiAweDAwODAwMDAwKSA9PT0gMCkge1xuICAgICAgICAgICAgZSAtPSAweDAwODAwMDAwO1xuICAgICAgICAgICAgbSA8PD0gMTtcbiAgICAgICAgfVxuICAgICAgICBtICY9IH4weDAwODAwMDAwO1xuICAgICAgICBlICs9IDB4Mzg4MDAwMDA7XG4gICAgICAgIHJldHVybiBtIHwgZTtcbiAgICB9O1xuICAgIGNvbnN0IG1hbnRpc2FUYWJsZSA9IG5ldyBVaW50MzJBcnJheSgyMDQ4KTtcbiAgICBtYW50aXNhVGFibGVbMF0gPSAwO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgMTAyNDsgaSsrKSB7XG4gICAgICAgIG1hbnRpc2FUYWJsZVtpXSA9IGNvbnZlcnRNYW50aXNzYShpKTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDEwMjQ7IGkgPCAyMDQ4OyBpKyspIHtcbiAgICAgICAgbWFudGlzYVRhYmxlW2ldID0gMHgzODAwMDAwMCArICgoaSAtIDEwMjQpIDw8IDEzKTtcbiAgICB9XG4gICAgcmV0dXJuIG1hbnRpc2FUYWJsZTtcbn1cbi8qKlxuICogQ29tcHV0ZXMgZXhwb25lbnQgdGFibGUgZm9yIGNhc3RpbmcgRmxvYXQxNiB0byBGbG9hdDMyXG4gKiBTZWUgaHR0cDovL3d3dy5mb3gtdG9vbGtpdC5vcmcvZnRwL2Zhc3RoYWxmZmxvYXRjb252ZXJzaW9uLnBkZlxuICpcbiAqIEByZXR1cm5zIFVpbnQzMkFycmF5LCA2NCBleHBvbmVudCBsb29rdXAgdmFsdWVzLlxuICovXG5mdW5jdGlvbiBjb21wdXRlRmxvYXQxNkV4cG9uZW50VGFibGUoKSB7XG4gICAgY29uc3QgZXhwb25lbnRUYWJsZSA9IG5ldyBVaW50MzJBcnJheSg2NCk7XG4gICAgZXhwb25lbnRUYWJsZVswXSA9IDA7XG4gICAgZXhwb25lbnRUYWJsZVszMV0gPSAweDQ3ODAwMDAwO1xuICAgIGV4cG9uZW50VGFibGVbMzJdID0gMHg4MDAwMDAwMDtcbiAgICBleHBvbmVudFRhYmxlWzYzXSA9IDB4Yzc4MDAwMDA7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCAzMTsgaSsrKSB7XG4gICAgICAgIGV4cG9uZW50VGFibGVbaV0gPSBpIDw8IDIzO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMzM7IGkgPCA2MzsgaSsrKSB7XG4gICAgICAgIGV4cG9uZW50VGFibGVbaV0gPSAweDgwMDAwMDAwICsgKChpIC0gMzIpIDw8IDIzKTtcbiAgICB9XG4gICAgcmV0dXJuIGV4cG9uZW50VGFibGU7XG59XG4vKipcbiAqIENvbXB1dGVzIG9mZnNldCB0YWJsZSBmb3IgY2FzdGluZyBGbG9hdDE2IHRvIEZsb2F0MzJcbiAqIFNlZSBodHRwOi8vd3d3LmZveC10b29sa2l0Lm9yZy9mdHAvZmFzdGhhbGZmbG9hdGNvbnZlcnNpb24ucGRmXG4gKlxuICogQHJldHVybnMgVWludDMyQXJyYXksIDZkIG9mZnNldCB2YWx1ZXMuXG4gKi9cbmZ1bmN0aW9uIGNvbXB1dGVGbG9hdDE2T2Zmc2V0VGFibGUoKSB7XG4gICAgY29uc3Qgb2Zmc2V0VGFibGUgPSBuZXcgVWludDMyQXJyYXkoNjQpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNjQ7IGkrKykge1xuICAgICAgICBvZmZzZXRUYWJsZVtpXSA9IDEwMjQ7XG4gICAgfVxuICAgIG9mZnNldFRhYmxlWzBdID0gb2Zmc2V0VGFibGVbMzJdID0gMDtcbiAgICByZXR1cm4gb2Zmc2V0VGFibGU7XG59XG4vKipcbiAqIFJldHJpZXZlIGEgRmxvYXQxNiBkZWNvZGVyIHdoaWNoIHdpbGwgZGVjb2RlIGEgQnl0ZUFycmF5IG9mIEZsb2F0MTYgdmFsdWVzXG4gKiB0byBhIEZsb2F0MzJBcnJheS5cbiAqXG4gKiBAcmV0dXJucyBGdW5jdGlvbiAoYnVmZmVyOiBVaW50MTZBcnJheSkgPT4gRmxvYXQzMkFycmF5IHdoaWNoIGRlY29kZXNcbiAqICAgICAgICAgIHRoZSBVaW50MTZBcnJheSBvZiBGbG9hdDE2IGJ5dGVzIHRvIGEgRmxvYXQzMkFycmF5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmxvYXQxNkRlY29kZXIoKSB7XG4gICAgLy8gQWxnb3JpdGhtIGlzIGJhc2VkIG9mZiBvZlxuICAgIC8vIGh0dHA6Ly93d3cuZm94LXRvb2xraXQub3JnL2Z0cC9mYXN0aGFsZmZsb2F0Y29udmVyc2lvbi5wZGZcbiAgICAvLyBDYWNoZSBsb29rdXAgdGFibGVzXG4gICAgY29uc3QgbWFudGlzYVRhYmxlID0gY29tcHV0ZUZsb2F0MTZNYW50aXNhVGFibGUoKTtcbiAgICBjb25zdCBleHBvbmVudFRhYmxlID0gY29tcHV0ZUZsb2F0MTZFeHBvbmVudFRhYmxlKCk7XG4gICAgY29uc3Qgb2Zmc2V0VGFibGUgPSBjb21wdXRlRmxvYXQxNk9mZnNldFRhYmxlKCk7XG4gICAgcmV0dXJuIChxdWFudGl6ZWRBcnJheSkgPT4ge1xuICAgICAgICBjb25zdCBidWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoNCAqIHF1YW50aXplZEFycmF5Lmxlbmd0aCk7XG4gICAgICAgIGNvbnN0IGJ1ZmZlclVpbnQzMlZpZXcgPSBuZXcgVWludDMyQXJyYXkoYnVmZmVyKTtcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHF1YW50aXplZEFycmF5Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgY29uc3QgZmxvYXQxNkJpdHMgPSBxdWFudGl6ZWRBcnJheVtpbmRleF07XG4gICAgICAgICAgICBjb25zdCBmbG9hdDMyQml0cyA9IG1hbnRpc2FUYWJsZVtvZmZzZXRUYWJsZVtmbG9hdDE2Qml0cyA+PiAxMF0gKyAoZmxvYXQxNkJpdHMgJiAweDNmZildICtcbiAgICAgICAgICAgICAgICBleHBvbmVudFRhYmxlW2Zsb2F0MTZCaXRzID4+IDEwXTtcbiAgICAgICAgICAgIGJ1ZmZlclVpbnQzMlZpZXdbaW5kZXhdID0gZmxvYXQzMkJpdHM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkoYnVmZmVyKTtcbiAgICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW9fdXRpbHMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0ICcuLi9mbGFncyc7XG5pbXBvcnQgeyBlbnYgfSBmcm9tICcuLi9lbnZpcm9ubWVudCc7XG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IGFycmF5QnVmZmVyVG9CYXNlNjRTdHJpbmcsIGJhc2U2NFN0cmluZ1RvQXJyYXlCdWZmZXIsIGdldE1vZGVsQXJ0aWZhY3RzSW5mb0ZvckpTT04gfSBmcm9tICcuL2lvX3V0aWxzJztcbmltcG9ydCB7IElPUm91dGVyUmVnaXN0cnkgfSBmcm9tICcuL3JvdXRlcl9yZWdpc3RyeSc7XG5jb25zdCBQQVRIX1NFUEFSQVRPUiA9ICcvJztcbmNvbnN0IFBBVEhfUFJFRklYID0gJ3RlbnNvcmZsb3dqc19tb2RlbHMnO1xuY29uc3QgSU5GT19TVUZGSVggPSAnaW5mbyc7XG5jb25zdCBNT0RFTF9UT1BPTE9HWV9TVUZGSVggPSAnbW9kZWxfdG9wb2xvZ3knO1xuY29uc3QgV0VJR0hUX1NQRUNTX1NVRkZJWCA9ICd3ZWlnaHRfc3BlY3MnO1xuY29uc3QgV0VJR0hUX0RBVEFfU1VGRklYID0gJ3dlaWdodF9kYXRhJztcbmNvbnN0IE1PREVMX01FVEFEQVRBX1NVRkZJWCA9ICdtb2RlbF9tZXRhZGF0YSc7XG4vKipcbiAqIFB1cmdlIGFsbCB0ZW5zb3JmbG93LmpzLXNhdmVkIG1vZGVsIGFydGlmYWN0cyBmcm9tIGxvY2FsIHN0b3JhZ2UuXG4gKlxuICogQHJldHVybnMgUGF0aHMgb2YgdGhlIG1vZGVscyBwdXJnZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwdXJnZUxvY2FsU3RvcmFnZUFydGlmYWN0cygpIHtcbiAgICBpZiAoIWVudigpLmdldEJvb2woJ0lTX0JST1dTRVInKSB8fCB0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyB8fFxuICAgICAgICB0eXBlb2Ygd2luZG93LmxvY2FsU3RvcmFnZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdwdXJnZUxvY2FsU3RvcmFnZU1vZGVscygpIGNhbm5vdCBwcm9jZWVkIGJlY2F1c2UgbG9jYWwgc3RvcmFnZSBpcyAnICtcbiAgICAgICAgICAgICd1bmF2YWlsYWJsZSBpbiB0aGUgY3VycmVudCBlbnZpcm9ubWVudC4nKTtcbiAgICB9XG4gICAgY29uc3QgTFMgPSB3aW5kb3cubG9jYWxTdG9yYWdlO1xuICAgIGNvbnN0IHB1cmdlZE1vZGVsUGF0aHMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IExTLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IExTLmtleShpKTtcbiAgICAgICAgY29uc3QgcHJlZml4ID0gUEFUSF9QUkVGSVggKyBQQVRIX1NFUEFSQVRPUjtcbiAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKHByZWZpeCkgJiYga2V5Lmxlbmd0aCA+IHByZWZpeC5sZW5ndGgpIHtcbiAgICAgICAgICAgIExTLnJlbW92ZUl0ZW0oa2V5KTtcbiAgICAgICAgICAgIGNvbnN0IG1vZGVsTmFtZSA9IGdldE1vZGVsUGF0aEZyb21LZXkoa2V5KTtcbiAgICAgICAgICAgIGlmIChwdXJnZWRNb2RlbFBhdGhzLmluZGV4T2YobW9kZWxOYW1lKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBwdXJnZWRNb2RlbFBhdGhzLnB1c2gobW9kZWxOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcHVyZ2VkTW9kZWxQYXRocztcbn1cbmZ1bmN0aW9uIGdldE1vZGVsS2V5cyhwYXRoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgaW5mbzogW1BBVEhfUFJFRklYLCBwYXRoLCBJTkZPX1NVRkZJWF0uam9pbihQQVRIX1NFUEFSQVRPUiksXG4gICAgICAgIHRvcG9sb2d5OiBbUEFUSF9QUkVGSVgsIHBhdGgsIE1PREVMX1RPUE9MT0dZX1NVRkZJWF0uam9pbihQQVRIX1NFUEFSQVRPUiksXG4gICAgICAgIHdlaWdodFNwZWNzOiBbUEFUSF9QUkVGSVgsIHBhdGgsIFdFSUdIVF9TUEVDU19TVUZGSVhdLmpvaW4oUEFUSF9TRVBBUkFUT1IpLFxuICAgICAgICB3ZWlnaHREYXRhOiBbUEFUSF9QUkVGSVgsIHBhdGgsIFdFSUdIVF9EQVRBX1NVRkZJWF0uam9pbihQQVRIX1NFUEFSQVRPUiksXG4gICAgICAgIG1vZGVsTWV0YWRhdGE6IFtQQVRIX1BSRUZJWCwgcGF0aCwgTU9ERUxfTUVUQURBVEFfU1VGRklYXS5qb2luKFBBVEhfU0VQQVJBVE9SKVxuICAgIH07XG59XG5mdW5jdGlvbiByZW1vdmVJdGVtcyhrZXlzKSB7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LnZhbHVlcyhrZXlzKSkge1xuICAgICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcbiAgICB9XG59XG4vKipcbiAqIEdldCBtb2RlbCBwYXRoIGZyb20gYSBsb2NhbC1zdG9yYWdlIGtleS5cbiAqXG4gKiBFLmcuLCAndGVuc29yZmxvd2pzX21vZGVscy9teS9tb2RlbC8xL2luZm8nIC0tPiAnbXkvbW9kZWwvMSdcbiAqXG4gKiBAcGFyYW0ga2V5XG4gKi9cbmZ1bmN0aW9uIGdldE1vZGVsUGF0aEZyb21LZXkoa2V5KSB7XG4gICAgY29uc3QgaXRlbXMgPSBrZXkuc3BsaXQoUEFUSF9TRVBBUkFUT1IpO1xuICAgIGlmIChpdGVtcy5sZW5ndGggPCAzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBrZXkgZm9ybWF0OiAke2tleX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW1zLnNsaWNlKDEsIGl0ZW1zLmxlbmd0aCAtIDEpLmpvaW4oUEFUSF9TRVBBUkFUT1IpO1xufVxuZnVuY3Rpb24gbWF5YmVTdHJpcFNjaGVtZShrZXkpIHtcbiAgICByZXR1cm4ga2V5LnN0YXJ0c1dpdGgoQnJvd3NlckxvY2FsU3RvcmFnZS5VUkxfU0NIRU1FKSA/XG4gICAgICAgIGtleS5zbGljZShCcm93c2VyTG9jYWxTdG9yYWdlLlVSTF9TQ0hFTUUubGVuZ3RoKSA6XG4gICAgICAgIGtleTtcbn1cbi8qKlxuICogSU9IYW5kbGVyIHN1YmNsYXNzOiBCcm93c2VyIExvY2FsIFN0b3JhZ2UuXG4gKlxuICogU2VlIHRoZSBkb2Mgc3RyaW5nIHRvIGBicm93c2VyTG9jYWxTdG9yYWdlYCBmb3IgbW9yZSBkZXRhaWxzLlxuICovXG5leHBvcnQgY2xhc3MgQnJvd3NlckxvY2FsU3RvcmFnZSB7XG4gICAgY29uc3RydWN0b3IobW9kZWxQYXRoKSB7XG4gICAgICAgIGlmICghZW52KCkuZ2V0Qm9vbCgnSVNfQlJPV1NFUicpIHx8IHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8XG4gICAgICAgICAgICB0eXBlb2Ygd2luZG93LmxvY2FsU3RvcmFnZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIC8vIFRPRE8oY2Fpcyk6IEFkZCBtb3JlIGluZm8gYWJvdXQgd2hhdCBJT0hhbmRsZXIgc3VidHlwZXMgYXJlXG4gICAgICAgICAgICAvLyBhdmFpbGFibGUuXG4gICAgICAgICAgICAvLyAgIE1heWJlIHBvaW50IHRvIGEgZG9jIHBhZ2Ugb24gdGhlIHdlYiBhbmQvb3IgYXV0b21hdGljYWxseSBkZXRlcm1pbmVcbiAgICAgICAgICAgIC8vICAgdGhlIGF2YWlsYWJsZSBJT0hhbmRsZXJzIGFuZCBwcmludCB0aGVtIGluIHRoZSBlcnJvciBtZXNzYWdlLlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgY3VycmVudCBlbnZpcm9ubWVudCBkb2VzIG5vdCBzdXBwb3J0IGxvY2FsIHN0b3JhZ2UuJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5MUyA9IHdpbmRvdy5sb2NhbFN0b3JhZ2U7XG4gICAgICAgIGlmIChtb2RlbFBhdGggPT0gbnVsbCB8fCAhbW9kZWxQYXRoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZvciBsb2NhbCBzdG9yYWdlLCBtb2RlbFBhdGggbXVzdCBub3QgYmUgbnVsbCwgdW5kZWZpbmVkIG9yIGVtcHR5LicpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubW9kZWxQYXRoID0gbW9kZWxQYXRoO1xuICAgICAgICB0aGlzLmtleXMgPSBnZXRNb2RlbEtleXModGhpcy5tb2RlbFBhdGgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTYXZlIG1vZGVsIGFydGlmYWN0cyB0byBicm93c2VyIGxvY2FsIHN0b3JhZ2UuXG4gICAgICpcbiAgICAgKiBTZWUgdGhlIGRvY3VtZW50YXRpb24gdG8gYGJyb3dzZXJMb2NhbFN0b3JhZ2VgIGZvciBkZXRhaWxzIG9uIHRoZSBzYXZlZFxuICAgICAqIGFydGlmYWN0cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBtb2RlbEFydGlmYWN0cyBUaGUgbW9kZWwgYXJ0aWZhY3RzIHRvIGJlIHN0b3JlZC5cbiAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiBTYXZlUmVzdWx0LlxuICAgICAqL1xuICAgIGFzeW5jIHNhdmUobW9kZWxBcnRpZmFjdHMpIHtcbiAgICAgICAgaWYgKG1vZGVsQXJ0aWZhY3RzLm1vZGVsVG9wb2xvZ3kgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCcm93c2VyTG9jYWxTdG9yYWdlLnNhdmUoKSBkb2VzIG5vdCBzdXBwb3J0IHNhdmluZyBtb2RlbCB0b3BvbG9neSAnICtcbiAgICAgICAgICAgICAgICAnaW4gYmluYXJ5IGZvcm1hdHMgeWV0LicpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgdG9wb2xvZ3kgPSBKU09OLnN0cmluZ2lmeShtb2RlbEFydGlmYWN0cy5tb2RlbFRvcG9sb2d5KTtcbiAgICAgICAgICAgIGNvbnN0IHdlaWdodFNwZWNzID0gSlNPTi5zdHJpbmdpZnkobW9kZWxBcnRpZmFjdHMud2VpZ2h0U3BlY3MpO1xuICAgICAgICAgICAgY29uc3QgbW9kZWxBcnRpZmFjdHNJbmZvID0gZ2V0TW9kZWxBcnRpZmFjdHNJbmZvRm9ySlNPTihtb2RlbEFydGlmYWN0cyk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRoaXMuTFMuc2V0SXRlbSh0aGlzLmtleXMuaW5mbywgSlNPTi5zdHJpbmdpZnkobW9kZWxBcnRpZmFjdHNJbmZvKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5MUy5zZXRJdGVtKHRoaXMua2V5cy50b3BvbG9neSwgdG9wb2xvZ3kpO1xuICAgICAgICAgICAgICAgIHRoaXMuTFMuc2V0SXRlbSh0aGlzLmtleXMud2VpZ2h0U3BlY3MsIHdlaWdodFNwZWNzKTtcbiAgICAgICAgICAgICAgICB0aGlzLkxTLnNldEl0ZW0odGhpcy5rZXlzLndlaWdodERhdGEsIGFycmF5QnVmZmVyVG9CYXNlNjRTdHJpbmcobW9kZWxBcnRpZmFjdHMud2VpZ2h0RGF0YSkpO1xuICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCBKU09OLnN0cmluZ2lmeSBkb2Vzbid0IHdyaXRlIG91dCBrZXlzIHRoYXQgaGF2ZSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAvLyB2YWx1ZXMsIHNvIGZvciBzb21lIGtleXMsIHdlIHNldCB1bmRlZmluZWQgaW5zdGVhZCBvZiBhIG51bGwtaXNoXG4gICAgICAgICAgICAgICAgLy8gdmFsdWUuXG4gICAgICAgICAgICAgICAgY29uc3QgbWV0YWRhdGEgPSB7XG4gICAgICAgICAgICAgICAgICAgIGZvcm1hdDogbW9kZWxBcnRpZmFjdHMuZm9ybWF0LFxuICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWRCeTogbW9kZWxBcnRpZmFjdHMuZ2VuZXJhdGVkQnksXG4gICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZEJ5OiBtb2RlbEFydGlmYWN0cy5jb252ZXJ0ZWRCeSxcbiAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlOiBtb2RlbEFydGlmYWN0cy5zaWduYXR1cmUgIT0gbnVsbCA/XG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbEFydGlmYWN0cy5zaWduYXR1cmUgOlxuICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICB1c2VyRGVmaW5lZE1ldGFkYXRhOiBtb2RlbEFydGlmYWN0cy51c2VyRGVmaW5lZE1ldGFkYXRhICE9IG51bGwgP1xuICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxBcnRpZmFjdHMudXNlckRlZmluZWRNZXRhZGF0YSA6XG4gICAgICAgICAgICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIG1vZGVsSW5pdGlhbGl6ZXI6IG1vZGVsQXJ0aWZhY3RzLm1vZGVsSW5pdGlhbGl6ZXIgIT0gbnVsbCA/XG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbEFydGlmYWN0cy5tb2RlbEluaXRpYWxpemVyIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgdHJhaW5pbmdDb25maWc6IG1vZGVsQXJ0aWZhY3RzLnRyYWluaW5nQ29uZmlnICE9IG51bGwgP1xuICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxBcnRpZmFjdHMudHJhaW5pbmdDb25maWcgOlxuICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0aGlzLkxTLnNldEl0ZW0odGhpcy5rZXlzLm1vZGVsTWV0YWRhdGEsIEpTT04uc3RyaW5naWZ5KG1ldGFkYXRhKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgbW9kZWxBcnRpZmFjdHNJbmZvIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgc2F2aW5nIGZhaWxlZCwgY2xlYW4gdXAgYWxsIGl0ZW1zIHNhdmVkIHNvIGZhci5cbiAgICAgICAgICAgICAgICByZW1vdmVJdGVtcyh0aGlzLmtleXMpO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHNhdmUgbW9kZWwgJyR7dGhpcy5tb2RlbFBhdGh9JyB0byBsb2NhbCBzdG9yYWdlOiBgICtcbiAgICAgICAgICAgICAgICAgICAgYHNpemUgcXVvdGEgYmVpbmcgZXhjZWVkZWQgaXMgYSBwb3NzaWJsZSBjYXVzZSBvZiB0aGlzIGZhaWx1cmU6IGAgK1xuICAgICAgICAgICAgICAgICAgICBgbW9kZWxUb3BvbG9neUJ5dGVzPSR7bW9kZWxBcnRpZmFjdHNJbmZvLm1vZGVsVG9wb2xvZ3lCeXRlc30sIGAgK1xuICAgICAgICAgICAgICAgICAgICBgd2VpZ2h0U3BlY3NCeXRlcz0ke21vZGVsQXJ0aWZhY3RzSW5mby53ZWlnaHRTcGVjc0J5dGVzfSwgYCArXG4gICAgICAgICAgICAgICAgICAgIGB3ZWlnaHREYXRhQnl0ZXM9JHttb2RlbEFydGlmYWN0c0luZm8ud2VpZ2h0RGF0YUJ5dGVzfS5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBMb2FkIGEgbW9kZWwgZnJvbSBsb2NhbCBzdG9yYWdlLlxuICAgICAqXG4gICAgICogU2VlIHRoZSBkb2N1bWVudGF0aW9uIHRvIGBicm93c2VyTG9jYWxTdG9yYWdlYCBmb3IgZGV0YWlscyBvbiB0aGUgc2F2ZWRcbiAgICAgKiBhcnRpZmFjdHMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgbG9hZGVkIG1vZGVsIChpZiBsb2FkaW5nIHN1Y2NlZWRzKS5cbiAgICAgKi9cbiAgICBhc3luYyBsb2FkKCkge1xuICAgICAgICBjb25zdCBpbmZvID0gSlNPTi5wYXJzZSh0aGlzLkxTLmdldEl0ZW0odGhpcy5rZXlzLmluZm8pKTtcbiAgICAgICAgaWYgKGluZm8gPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbiBsb2NhbCBzdG9yYWdlLCB0aGVyZSBpcyBubyBtb2RlbCB3aXRoIG5hbWUgJyR7dGhpcy5tb2RlbFBhdGh9J2ApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbmZvLm1vZGVsVG9wb2xvZ3lUeXBlICE9PSAnSlNPTicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQnJvd3NlckxvY2FsU3RvcmFnZSBkb2VzIG5vdCBzdXBwb3J0IGxvYWRpbmcgbm9uLUpTT04gbW9kZWwgJyArXG4gICAgICAgICAgICAgICAgJ3RvcG9sb2d5IHlldC4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvdXQgPSB7fTtcbiAgICAgICAgLy8gTG9hZCB0b3BvbG9neS5cbiAgICAgICAgY29uc3QgdG9wb2xvZ3kgPSBKU09OLnBhcnNlKHRoaXMuTFMuZ2V0SXRlbSh0aGlzLmtleXMudG9wb2xvZ3kpKTtcbiAgICAgICAgaWYgKHRvcG9sb2d5ID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW4gbG9jYWwgc3RvcmFnZSwgdGhlIHRvcG9sb2d5IG9mIG1vZGVsICcke3RoaXMubW9kZWxQYXRofScgYCArXG4gICAgICAgICAgICAgICAgYGlzIG1pc3NpbmcuYCk7XG4gICAgICAgIH1cbiAgICAgICAgb3V0Lm1vZGVsVG9wb2xvZ3kgPSB0b3BvbG9neTtcbiAgICAgICAgLy8gTG9hZCB3ZWlnaHQgc3BlY3MuXG4gICAgICAgIGNvbnN0IHdlaWdodFNwZWNzID0gSlNPTi5wYXJzZSh0aGlzLkxTLmdldEl0ZW0odGhpcy5rZXlzLndlaWdodFNwZWNzKSk7XG4gICAgICAgIGlmICh3ZWlnaHRTcGVjcyA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEluIGxvY2FsIHN0b3JhZ2UsIHRoZSB3ZWlnaHQgc3BlY3Mgb2YgbW9kZWwgJyR7dGhpcy5tb2RlbFBhdGh9JyBgICtcbiAgICAgICAgICAgICAgICBgYXJlIG1pc3NpbmcuYCk7XG4gICAgICAgIH1cbiAgICAgICAgb3V0LndlaWdodFNwZWNzID0gd2VpZ2h0U3BlY3M7XG4gICAgICAgIC8vIExvYWQgbWV0YS1kYXRhIGZpZWxkcy5cbiAgICAgICAgY29uc3QgbWV0YWRhdGFTdHJpbmcgPSB0aGlzLkxTLmdldEl0ZW0odGhpcy5rZXlzLm1vZGVsTWV0YWRhdGEpO1xuICAgICAgICBpZiAobWV0YWRhdGFTdHJpbmcgIT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgbWV0YWRhdGEgPSBKU09OLnBhcnNlKG1ldGFkYXRhU3RyaW5nKTtcbiAgICAgICAgICAgIG91dC5mb3JtYXQgPSBtZXRhZGF0YS5mb3JtYXQ7XG4gICAgICAgICAgICBvdXQuZ2VuZXJhdGVkQnkgPSBtZXRhZGF0YS5nZW5lcmF0ZWRCeTtcbiAgICAgICAgICAgIG91dC5jb252ZXJ0ZWRCeSA9IG1ldGFkYXRhLmNvbnZlcnRlZEJ5O1xuICAgICAgICAgICAgaWYgKG1ldGFkYXRhLnNpZ25hdHVyZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgb3V0LnNpZ25hdHVyZSA9IG1ldGFkYXRhLnNpZ25hdHVyZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtZXRhZGF0YS51c2VyRGVmaW5lZE1ldGFkYXRhICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBvdXQudXNlckRlZmluZWRNZXRhZGF0YSA9IG1ldGFkYXRhLnVzZXJEZWZpbmVkTWV0YWRhdGE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWV0YWRhdGEubW9kZWxJbml0aWFsaXplciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgb3V0Lm1vZGVsSW5pdGlhbGl6ZXIgPSBtZXRhZGF0YS5tb2RlbEluaXRpYWxpemVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1ldGFkYXRhLnRyYWluaW5nQ29uZmlnICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBvdXQudHJhaW5pbmdDb25maWcgPSBtZXRhZGF0YS50cmFpbmluZ0NvbmZpZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBMb2FkIHdlaWdodCBkYXRhLlxuICAgICAgICBjb25zdCB3ZWlnaHREYXRhQmFzZTY0ID0gdGhpcy5MUy5nZXRJdGVtKHRoaXMua2V5cy53ZWlnaHREYXRhKTtcbiAgICAgICAgaWYgKHdlaWdodERhdGFCYXNlNjQgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbiBsb2NhbCBzdG9yYWdlLCB0aGUgYmluYXJ5IHdlaWdodCB2YWx1ZXMgb2YgbW9kZWwgYCArXG4gICAgICAgICAgICAgICAgYCcke3RoaXMubW9kZWxQYXRofScgYXJlIG1pc3NpbmcuYCk7XG4gICAgICAgIH1cbiAgICAgICAgb3V0LndlaWdodERhdGEgPSBiYXNlNjRTdHJpbmdUb0FycmF5QnVmZmVyKHdlaWdodERhdGFCYXNlNjQpO1xuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH1cbn1cbkJyb3dzZXJMb2NhbFN0b3JhZ2UuVVJMX1NDSEVNRSA9ICdsb2NhbHN0b3JhZ2U6Ly8nO1xuZXhwb3J0IGNvbnN0IGxvY2FsU3RvcmFnZVJvdXRlciA9ICh1cmwpID0+IHtcbiAgICBpZiAoIWVudigpLmdldEJvb2woJ0lTX0JST1dTRVInKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh1cmwpICYmIHVybC5zdGFydHNXaXRoKEJyb3dzZXJMb2NhbFN0b3JhZ2UuVVJMX1NDSEVNRSkpIHtcbiAgICAgICAgICAgIHJldHVybiBicm93c2VyTG9jYWxTdG9yYWdlKHVybC5zbGljZShCcm93c2VyTG9jYWxTdG9yYWdlLlVSTF9TQ0hFTUUubGVuZ3RoKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbn07XG5JT1JvdXRlclJlZ2lzdHJ5LnJlZ2lzdGVyU2F2ZVJvdXRlcihsb2NhbFN0b3JhZ2VSb3V0ZXIpO1xuSU9Sb3V0ZXJSZWdpc3RyeS5yZWdpc3RlckxvYWRSb3V0ZXIobG9jYWxTdG9yYWdlUm91dGVyKTtcbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiBmb3IgbG9jYWwgc3RvcmFnZSBJT0hhbmRsZXIuXG4gKlxuICogVGhpcyBgSU9IYW5kbGVyYCBzdXBwb3J0cyBib3RoIGBzYXZlYCBhbmQgYGxvYWRgLlxuICpcbiAqIEZvciBlYWNoIG1vZGVsJ3Mgc2F2ZWQgYXJ0aWZhY3RzLCBmb3VyIGl0ZW1zIGFyZSBzYXZlZCB0byBsb2NhbCBzdG9yYWdlLlxuICogICAtIGAke1BBVEhfU0VQQVJBVE9SfS8ke21vZGVsUGF0aH0vaW5mb2A6IENvbnRhaW5zIG1ldGEtaW5mbyBhYm91dCB0aGVcbiAqICAgICBtb2RlbCwgc3VjaCBhcyBkYXRlIHNhdmVkLCB0eXBlIG9mIHRoZSB0b3BvbG9neSwgc2l6ZSBpbiBieXRlcywgZXRjLlxuICogICAtIGAke1BBVEhfU0VQQVJBVE9SfS8ke21vZGVsUGF0aH0vdG9wb2xvZ3lgOiBNb2RlbCB0b3BvbG9neS4gRm9yIEtlcmFzLVxuICogICAgIHN0eWxlIG1vZGVscywgdGhpcyBpcyBhIHN0cmluZ2l6ZWQgSlNPTi5cbiAqICAgLSBgJHtQQVRIX1NFUEFSQVRPUn0vJHttb2RlbFBhdGh9L3dlaWdodF9zcGVjc2A6IFdlaWdodCBzcGVjcyBvZiB0aGVcbiAqICAgICBtb2RlbCwgY2FuIGJlIHVzZWQgdG8gZGVjb2RlIHRoZSBzYXZlZCBiaW5hcnkgd2VpZ2h0IHZhbHVlcyAoc2VlXG4gKiAgICAgaXRlbSBiZWxvdykuXG4gKiAgIC0gYCR7UEFUSF9TRVBBUkFUT1J9LyR7bW9kZWxQYXRofS93ZWlnaHRfZGF0YWA6IENvbmNhdGVuYXRlZCBiaW5hcnlcbiAqICAgICB3ZWlnaHQgdmFsdWVzLCBzdG9yZWQgYXMgYSBiYXNlNjQtZW5jb2RlZCBzdHJpbmcuXG4gKlxuICogU2F2aW5nIG1heSB0aHJvdyBhbiBgRXJyb3JgIGlmIHRoZSB0b3RhbCBzaXplIG9mIHRoZSBhcnRpZmFjdHMgZXhjZWVkIHRoZVxuICogYnJvd3Nlci1zcGVjaWZpYyBxdW90YS5cbiAqXG4gKiBAcGFyYW0gbW9kZWxQYXRoIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBtb2RlbCB0byBiZSBzYXZlZC4gTXVzdCBiZSBhXG4gKiAgIG5vbi1lbXB0eSBzdHJpbmcuXG4gKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiBgSU9IYW5kbGVyYCwgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCwgZS5nLixcbiAqICAgYHRmLk1vZGVsLnNhdmVgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnJvd3NlckxvY2FsU3RvcmFnZShtb2RlbFBhdGgpIHtcbiAgICByZXR1cm4gbmV3IEJyb3dzZXJMb2NhbFN0b3JhZ2UobW9kZWxQYXRoKTtcbn1cbmV4cG9ydCBjbGFzcyBCcm93c2VyTG9jYWxTdG9yYWdlTWFuYWdlciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIGFzc2VydChlbnYoKS5nZXRCb29sKCdJU19CUk9XU0VSJyksICgpID0+ICdDdXJyZW50IGVudmlyb25tZW50IGlzIG5vdCBhIHdlYiBicm93c2VyJyk7XG4gICAgICAgIGFzc2VydCh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyB8fFxuICAgICAgICAgICAgdHlwZW9mIHdpbmRvdy5sb2NhbFN0b3JhZ2UgIT09ICd1bmRlZmluZWQnLCAoKSA9PiAnQ3VycmVudCBicm93c2VyIGRvZXMgbm90IGFwcGVhciB0byBzdXBwb3J0IGxvY2FsU3RvcmFnZScpO1xuICAgICAgICB0aGlzLkxTID0gd2luZG93LmxvY2FsU3RvcmFnZTtcbiAgICB9XG4gICAgYXN5bmMgbGlzdE1vZGVscygpIHtcbiAgICAgICAgY29uc3Qgb3V0ID0ge307XG4gICAgICAgIGNvbnN0IHByZWZpeCA9IFBBVEhfUFJFRklYICsgUEFUSF9TRVBBUkFUT1I7XG4gICAgICAgIGNvbnN0IHN1ZmZpeCA9IFBBVEhfU0VQQVJBVE9SICsgSU5GT19TVUZGSVg7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5MUy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5MUy5rZXkoaSk7XG4gICAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgocHJlZml4KSAmJiBrZXkuZW5kc1dpdGgoc3VmZml4KSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1vZGVsUGF0aCA9IGdldE1vZGVsUGF0aEZyb21LZXkoa2V5KTtcbiAgICAgICAgICAgICAgICBvdXRbbW9kZWxQYXRoXSA9IEpTT04ucGFyc2UodGhpcy5MUy5nZXRJdGVtKGtleSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuICAgIGFzeW5jIHJlbW92ZU1vZGVsKHBhdGgpIHtcbiAgICAgICAgcGF0aCA9IG1heWJlU3RyaXBTY2hlbWUocGF0aCk7XG4gICAgICAgIGNvbnN0IGtleXMgPSBnZXRNb2RlbEtleXMocGF0aCk7XG4gICAgICAgIGlmICh0aGlzLkxTLmdldEl0ZW0oa2V5cy5pbmZvKSA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBmaW5kIG1vZGVsIGF0IHBhdGggJyR7cGF0aH0nYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW5mbyA9IEpTT04ucGFyc2UodGhpcy5MUy5nZXRJdGVtKGtleXMuaW5mbykpO1xuICAgICAgICByZW1vdmVJdGVtcyhrZXlzKTtcbiAgICAgICAgcmV0dXJuIGluZm87XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bG9jYWxfc3RvcmFnZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG4vKipcbiAqIENsYXNzZXMgYW5kIGZ1bmN0aW9ucyBmb3IgbW9kZWwgbWFuYWdlbWVudCBhY3Jvc3MgbXVsdGlwbGUgc3RvcmFnZSBtZWRpdW1zLlxuICpcbiAqIFN1cHBvcnRlZCBjbGllbnQgYWN0aW9uczpcbiAqIC0gTGlzdGluZyBtb2RlbHMgb24gYWxsIHJlZ2lzdGVyZWQgc3RvcmFnZSBtZWRpdW1zLlxuICogLSBSZW1vdmUgbW9kZWwgYnkgVVJMIGZyb20gYW55IHJlZ2lzdGVyZWQgc3RvcmFnZSBtZWRpdW1zLCBieSB1c2luZyBVUkxcbiAqICAgc3RyaW5nLlxuICogLSBNb3Zpbmcgb3IgY29weWluZyBtb2RlbCBmcm9tIG9uZSBwYXRoIHRvIGFub3RoZXIgaW4gdGhlIHNhbWUgbWVkaXVtIG9yIGZyb21cbiAqICAgb25lIG1lZGl1bSB0byBhbm90aGVyLCBieSB1c2luZyBVUkwgc3RyaW5ncy5cbiAqL1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBJT1JvdXRlclJlZ2lzdHJ5IH0gZnJvbSAnLi9yb3V0ZXJfcmVnaXN0cnknO1xuY29uc3QgVVJMX1NDSEVNRV9TVUZGSVggPSAnOi8vJztcbmV4cG9ydCBjbGFzcyBNb2RlbFN0b3JlTWFuYWdlclJlZ2lzdHJ5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5tYW5hZ2VycyA9IHt9O1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0SW5zdGFuY2UoKSB7XG4gICAgICAgIGlmIChNb2RlbFN0b3JlTWFuYWdlclJlZ2lzdHJ5Lmluc3RhbmNlID09IG51bGwpIHtcbiAgICAgICAgICAgIE1vZGVsU3RvcmVNYW5hZ2VyUmVnaXN0cnkuaW5zdGFuY2UgPSBuZXcgTW9kZWxTdG9yZU1hbmFnZXJSZWdpc3RyeSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBNb2RlbFN0b3JlTWFuYWdlclJlZ2lzdHJ5Lmluc3RhbmNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlciBhIHNhdmUtaGFuZGxlciByb3V0ZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc2F2ZVJvdXRlciBBIGZ1bmN0aW9uIHRoYXQgbWFwcyBhIFVSTC1saWtlIHN0cmluZyBvbnRvIGFuIGluc3RhbmNlXG4gICAgICogb2YgYElPSGFuZGxlcmAgd2l0aCB0aGUgYHNhdmVgIG1ldGhvZCBkZWZpbmVkIG9yIGBudWxsYC5cbiAgICAgKi9cbiAgICBzdGF0aWMgcmVnaXN0ZXJNYW5hZ2VyKHNjaGVtZSwgbWFuYWdlcikge1xuICAgICAgICBhc3NlcnQoc2NoZW1lICE9IG51bGwsICgpID0+ICdzY2hlbWUgbXVzdCBub3QgYmUgdW5kZWZpbmVkIG9yIG51bGwuJyk7XG4gICAgICAgIGlmIChzY2hlbWUuZW5kc1dpdGgoVVJMX1NDSEVNRV9TVUZGSVgpKSB7XG4gICAgICAgICAgICBzY2hlbWUgPSBzY2hlbWUuc2xpY2UoMCwgc2NoZW1lLmluZGV4T2YoVVJMX1NDSEVNRV9TVUZGSVgpKTtcbiAgICAgICAgfVxuICAgICAgICBhc3NlcnQoc2NoZW1lLmxlbmd0aCA+IDAsICgpID0+ICdzY2hlbWUgbXVzdCBub3QgYmUgYW4gZW1wdHkgc3RyaW5nLicpO1xuICAgICAgICBjb25zdCByZWdpc3RyeSA9IE1vZGVsU3RvcmVNYW5hZ2VyUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTtcbiAgICAgICAgYXNzZXJ0KHJlZ2lzdHJ5Lm1hbmFnZXJzW3NjaGVtZV0gPT0gbnVsbCwgKCkgPT4gYEEgbW9kZWwgc3RvcmUgbWFuYWdlciBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQgZm9yIHNjaGVtZSAnJHtzY2hlbWV9Jy5gKTtcbiAgICAgICAgcmVnaXN0cnkubWFuYWdlcnNbc2NoZW1lXSA9IG1hbmFnZXI7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRNYW5hZ2VyKHNjaGVtZSkge1xuICAgICAgICBjb25zdCBtYW5hZ2VyID0gdGhpcy5nZXRJbnN0YW5jZSgpLm1hbmFnZXJzW3NjaGVtZV07XG4gICAgICAgIGlmIChtYW5hZ2VyID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGZpbmQgbW9kZWwgbWFuYWdlciBmb3Igc2NoZW1lICcke3NjaGVtZX0nYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1hbmFnZXI7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRTY2hlbWVzKCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5nZXRJbnN0YW5jZSgpLm1hbmFnZXJzKTtcbiAgICB9XG59XG4vKipcbiAqIEhlbHBlciBtZXRob2QgZm9yIHBhcnNpbmcgYSBVUkwgc3RyaW5nIGludG8gYSBzY2hlbWUgYW5kIGEgcGF0aC5cbiAqXG4gKiBAcGFyYW0gdXJsIEUuZy4sICdsb2NhbHN0b3JhZ2U6Ly9teS1tb2RlbCdcbiAqIEByZXR1cm5zIEEgZGljdGlvbmFyeSB3aXRoIHR3byBmaWVsZHM6IHNjaGVtZSBhbmQgcGF0aC5cbiAqICAgU2NoZW1lOiBlLmcuLCAnbG9jYWxzdG9yYWdlJyBpbiB0aGUgZXhhbXBsZSBhYm92ZS5cbiAqICAgUGF0aDogZS5nLiwgJ215LW1vZGVsJyBpbiB0aGUgZXhhbXBsZSBhYm92ZS5cbiAqL1xuZnVuY3Rpb24gcGFyc2VVUkwodXJsKSB7XG4gICAgaWYgKHVybC5pbmRleE9mKFVSTF9TQ0hFTUVfU1VGRklYKSA9PT0gLTEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgdXJsIHN0cmluZyBwcm92aWRlZCBkb2VzIG5vdCBjb250YWluIGEgc2NoZW1lLiBgICtcbiAgICAgICAgICAgIGBTdXBwb3J0ZWQgc2NoZW1lcyBhcmU6IGAgK1xuICAgICAgICAgICAgYCR7TW9kZWxTdG9yZU1hbmFnZXJSZWdpc3RyeS5nZXRTY2hlbWVzKCkuam9pbignLCcpfWApO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBzY2hlbWU6IHVybC5zcGxpdChVUkxfU0NIRU1FX1NVRkZJWClbMF0sXG4gICAgICAgIHBhdGg6IHVybC5zcGxpdChVUkxfU0NIRU1FX1NVRkZJWClbMV0sXG4gICAgfTtcbn1cbmFzeW5jIGZ1bmN0aW9uIGNsb25lTW9kZWxJbnRlcm5hbChzb3VyY2VVUkwsIGRlc3RVUkwsIGRlbGV0ZVNvdXJjZSA9IGZhbHNlKSB7XG4gICAgYXNzZXJ0KHNvdXJjZVVSTCAhPT0gZGVzdFVSTCwgKCkgPT4gYE9sZCBwYXRoIGFuZCBuZXcgcGF0aCBhcmUgdGhlIHNhbWU6ICcke3NvdXJjZVVSTH0nYCk7XG4gICAgY29uc3QgbG9hZEhhbmRsZXJzID0gSU9Sb3V0ZXJSZWdpc3RyeS5nZXRMb2FkSGFuZGxlcnMoc291cmNlVVJMKTtcbiAgICBhc3NlcnQobG9hZEhhbmRsZXJzLmxlbmd0aCA+IDAsICgpID0+IGBDb3B5aW5nIGZhaWxlZCBiZWNhdXNlIG5vIGxvYWQgaGFuZGxlciBpcyBmb3VuZCBmb3Igc291cmNlIFVSTCAke3NvdXJjZVVSTH0uYCk7XG4gICAgYXNzZXJ0KGxvYWRIYW5kbGVycy5sZW5ndGggPCAyLCAoKSA9PiBgQ29weWluZyBmYWlsZWQgYmVjYXVzZSBtb3JlIHRoYW4gb25lICgke2xvYWRIYW5kbGVycy5sZW5ndGh9KSBgICtcbiAgICAgICAgYGxvYWQgaGFuZGxlcnMgZm9yIHNvdXJjZSBVUkwgJHtzb3VyY2VVUkx9LmApO1xuICAgIGNvbnN0IGxvYWRIYW5kbGVyID0gbG9hZEhhbmRsZXJzWzBdO1xuICAgIGNvbnN0IHNhdmVIYW5kbGVycyA9IElPUm91dGVyUmVnaXN0cnkuZ2V0U2F2ZUhhbmRsZXJzKGRlc3RVUkwpO1xuICAgIGFzc2VydChzYXZlSGFuZGxlcnMubGVuZ3RoID4gMCwgKCkgPT4gYENvcHlpbmcgZmFpbGVkIGJlY2F1c2Ugbm8gc2F2ZSBoYW5kbGVyIGlzIGZvdW5kIGZvciBkZXN0aW5hdGlvbiBgICtcbiAgICAgICAgYFVSTCAke2Rlc3RVUkx9LmApO1xuICAgIGFzc2VydChzYXZlSGFuZGxlcnMubGVuZ3RoIDwgMiwgKCkgPT4gYENvcHlpbmcgZmFpbGVkIGJlY2F1c2UgbW9yZSB0aGFuIG9uZSAoJHtsb2FkSGFuZGxlcnMubGVuZ3RofSkgYCArXG4gICAgICAgIGBzYXZlIGhhbmRsZXJzIGZvciBkZXN0aW5hdGlvbiBVUkwgJHtkZXN0VVJMfS5gKTtcbiAgICBjb25zdCBzYXZlSGFuZGxlciA9IHNhdmVIYW5kbGVyc1swXTtcbiAgICBjb25zdCBzb3VyY2VTY2hlbWUgPSBwYXJzZVVSTChzb3VyY2VVUkwpLnNjaGVtZTtcbiAgICBjb25zdCBzb3VyY2VQYXRoID0gcGFyc2VVUkwoc291cmNlVVJMKS5wYXRoO1xuICAgIGNvbnN0IHNhbWVNZWRpdW0gPSBzb3VyY2VTY2hlbWUgPT09IHBhcnNlVVJMKHNvdXJjZVVSTCkuc2NoZW1lO1xuICAgIGNvbnN0IG1vZGVsQXJ0aWZhY3RzID0gYXdhaXQgbG9hZEhhbmRsZXIubG9hZCgpO1xuICAgIC8vIElmIG1vdmluZyB3aXRoaW4gdGhlIHNhbWUgc3RvcmFnZSBtZWRpdW0sIHJlbW92ZSB0aGUgb2xkIG1vZGVsIGFzIHNvb24gYXNcbiAgICAvLyB0aGUgbG9hZGluZyBpcyBkb25lLiBXaXRob3V0IGRvaW5nIHRoaXMsIGl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIGNvbWJpbmVkXG4gICAgLy8gc2l6ZSBvZiB0aGUgdHdvIG1vZGVscyB3aWxsIGNhdXNlIHRoZSBjbG9uaW5nIHRvIGZhaWwuXG4gICAgaWYgKGRlbGV0ZVNvdXJjZSAmJiBzYW1lTWVkaXVtKSB7XG4gICAgICAgIGF3YWl0IE1vZGVsU3RvcmVNYW5hZ2VyUmVnaXN0cnkuZ2V0TWFuYWdlcihzb3VyY2VTY2hlbWUpXG4gICAgICAgICAgICAucmVtb3ZlTW9kZWwoc291cmNlUGF0aCk7XG4gICAgfVxuICAgIGNvbnN0IHNhdmVSZXN1bHQgPSBhd2FpdCBzYXZlSGFuZGxlci5zYXZlKG1vZGVsQXJ0aWZhY3RzKTtcbiAgICAvLyBJZiBtb3ZpbmcgYmV0d2VlbiBtZWRpdW1zLCB0aGUgZGVsZXRpb24gaXMgZG9uZSBhZnRlciB0aGUgc2F2ZSBzdWNjZWVkcy5cbiAgICAvLyBUaGlzIGd1YXJkcyBhZ2FpbnN0IHRoZSBjYXNlIGluIHdoaWNoIHNhdmluZyB0byB0aGUgZGVzdGluYXRpb24gbWVkaXVtXG4gICAgLy8gZmFpbHMuXG4gICAgaWYgKGRlbGV0ZVNvdXJjZSAmJiAhc2FtZU1lZGl1bSkge1xuICAgICAgICBhd2FpdCBNb2RlbFN0b3JlTWFuYWdlclJlZ2lzdHJ5LmdldE1hbmFnZXIoc291cmNlU2NoZW1lKVxuICAgICAgICAgICAgLnJlbW92ZU1vZGVsKHNvdXJjZVBhdGgpO1xuICAgIH1cbiAgICByZXR1cm4gc2F2ZVJlc3VsdC5tb2RlbEFydGlmYWN0c0luZm87XG59XG4vKipcbiAqIExpc3QgYWxsIG1vZGVscyBzdG9yZWQgaW4gcmVnaXN0ZXJlZCBzdG9yYWdlIG1lZGl1bXMuXG4gKlxuICogRm9yIGEgd2ViIGJyb3dzZXIgZW52aXJvbm1lbnQsIHRoZSByZWdpc3RlcmVkIG1lZGl1bXMgYXJlIExvY2FsIFN0b3JhZ2UgYW5kXG4gKiBJbmRleGVkREIuXG4gKlxuICogYGBganNcbiAqIC8vIEZpcnN0IGNyZWF0ZSBhbmQgc2F2ZSBhIG1vZGVsLlxuICogY29uc3QgbW9kZWwgPSB0Zi5zZXF1ZW50aWFsKCk7XG4gKiBtb2RlbC5hZGQodGYubGF5ZXJzLmRlbnNlKFxuICogICAgIHt1bml0czogMSwgaW5wdXRTaGFwZTogWzEwXSwgYWN0aXZhdGlvbjogJ3NpZ21vaWQnfSkpO1xuICogYXdhaXQgbW9kZWwuc2F2ZSgnbG9jYWxzdG9yYWdlOi8vZGVtby9tYW5hZ2VtZW50L21vZGVsMScpO1xuICpcbiAqIC8vIFRoZW4gbGlzdCBleGlzdGluZyBtb2RlbHMuXG4gKiBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShhd2FpdCB0Zi5pby5saXN0TW9kZWxzKCkpKTtcbiAqXG4gKiAvLyBEZWxldGUgdGhlIG1vZGVsLlxuICogYXdhaXQgdGYuaW8ucmVtb3ZlTW9kZWwoJ2xvY2Fsc3RvcmFnZTovL2RlbW8vbWFuYWdlbWVudC9tb2RlbDEnKTtcbiAqXG4gKiAvLyBMaXN0IG1vZGVscyBhZ2Fpbi5cbiAqIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KGF3YWl0IHRmLmlvLmxpc3RNb2RlbHMoKSkpO1xuICogYGBgXG4gKlxuICogQHJldHVybnMgQSBgUHJvbWlzZWAgb2YgYSBkaWN0aW9uYXJ5IG1hcHBpbmcgVVJMcyBvZiBleGlzdGluZyBtb2RlbHMgdG9cbiAqIHRoZWlyIG1vZGVsIGFydGlmYWN0cyBpbmZvLiBVUkxzIGluY2x1ZGUgbWVkaXVtLXNwZWNpZmljIHNjaGVtZXMsIGUuZy4sXG4gKiAgICdpbmRleGVkZGI6Ly9teS9tb2RlbC8xJy4gTW9kZWwgYXJ0aWZhY3RzIGluZm8gaW5jbHVkZSB0eXBlIG9mIHRoZVxuICogbW9kZWwncyB0b3BvbG9neSwgYnl0ZSBzaXplcyBvZiB0aGUgdG9wb2xvZ3ksIHdlaWdodHMsIGV0Yy5cbiAqXG4gKiBAZG9jIHtcbiAqICAgaGVhZGluZzogJ01vZGVscycsXG4gKiAgIHN1YmhlYWRpbmc6ICdNYW5hZ2VtZW50JyxcbiAqICAgbmFtZXNwYWNlOiAnaW8nLFxuICogICBpZ25vcmVDSTogdHJ1ZVxuICogfVxuICovXG5hc3luYyBmdW5jdGlvbiBsaXN0TW9kZWxzKCkge1xuICAgIGNvbnN0IHNjaGVtZXMgPSBNb2RlbFN0b3JlTWFuYWdlclJlZ2lzdHJ5LmdldFNjaGVtZXMoKTtcbiAgICBjb25zdCBvdXQgPSB7fTtcbiAgICBmb3IgKGNvbnN0IHNjaGVtZSBvZiBzY2hlbWVzKSB7XG4gICAgICAgIGNvbnN0IHNjaGVtZU91dCA9IGF3YWl0IE1vZGVsU3RvcmVNYW5hZ2VyUmVnaXN0cnkuZ2V0TWFuYWdlcihzY2hlbWUpLmxpc3RNb2RlbHMoKTtcbiAgICAgICAgZm9yIChjb25zdCBwYXRoIGluIHNjaGVtZU91dCkge1xuICAgICAgICAgICAgY29uc3QgdXJsID0gc2NoZW1lICsgVVJMX1NDSEVNRV9TVUZGSVggKyBwYXRoO1xuICAgICAgICAgICAgb3V0W3VybF0gPSBzY2hlbWVPdXRbcGF0aF07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUmVtb3ZlIGEgbW9kZWwgc3BlY2lmaWVkIGJ5IFVSTCBmcm9tIGEgcmVpZ3N0ZXJlZCBzdG9yYWdlIG1lZGl1bS5cbiAqXG4gKiBgYGBqc1xuICogLy8gRmlyc3QgY3JlYXRlIGFuZCBzYXZlIGEgbW9kZWwuXG4gKiBjb25zdCBtb2RlbCA9IHRmLnNlcXVlbnRpYWwoKTtcbiAqIG1vZGVsLmFkZCh0Zi5sYXllcnMuZGVuc2UoXG4gKiAgICAge3VuaXRzOiAxLCBpbnB1dFNoYXBlOiBbMTBdLCBhY3RpdmF0aW9uOiAnc2lnbW9pZCd9KSk7XG4gKiBhd2FpdCBtb2RlbC5zYXZlKCdsb2NhbHN0b3JhZ2U6Ly9kZW1vL21hbmFnZW1lbnQvbW9kZWwxJyk7XG4gKlxuICogLy8gVGhlbiBsaXN0IGV4aXN0aW5nIG1vZGVscy5cbiAqIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KGF3YWl0IHRmLmlvLmxpc3RNb2RlbHMoKSkpO1xuICpcbiAqIC8vIERlbGV0ZSB0aGUgbW9kZWwuXG4gKiBhd2FpdCB0Zi5pby5yZW1vdmVNb2RlbCgnbG9jYWxzdG9yYWdlOi8vZGVtby9tYW5hZ2VtZW50L21vZGVsMScpO1xuICpcbiAqIC8vIExpc3QgbW9kZWxzIGFnYWluLlxuICogY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoYXdhaXQgdGYuaW8ubGlzdE1vZGVscygpKSk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gdXJsIEEgVVJMIHRvIGEgc3RvcmVkIG1vZGVsLCB3aXRoIGEgc2NoZW1lIHByZWZpeCwgZS5nLixcbiAqICAgJ2xvY2Fsc3RvcmFnZTovL215LW1vZGVsLTEnLCAnaW5kZXhlZGRiOi8vbXkvbW9kZWwvMicuXG4gKiBAcmV0dXJucyBNb2RlbEFydGlmYWN0c0luZm8gb2YgdGhlIGRlbGV0ZWQgbW9kZWwgKGlmIGFuZCBvbmx5IGlmIGRlbGV0aW9uXG4gKiAgIGlzIHN1Y2Nlc3NmdWwpLlxuICogQHRocm93cyBFcnJvciBpZiBkZWxldGlvbiBmYWlscywgZS5nLiwgaWYgbm8gbW9kZWwgZXhpc3RzIGF0IGBwYXRoYC5cbiAqXG4gKiBAZG9jIHtcbiAqICAgaGVhZGluZzogJ01vZGVscycsXG4gKiAgIHN1YmhlYWRpbmc6ICdNYW5hZ2VtZW50JyxcbiAqICAgbmFtZXNwYWNlOiAnaW8nLFxuICogICBpZ25vcmVDSTogdHJ1ZVxuICogfVxuICovXG5hc3luYyBmdW5jdGlvbiByZW1vdmVNb2RlbCh1cmwpIHtcbiAgICBjb25zdCBzY2hlbWVBbmRQYXRoID0gcGFyc2VVUkwodXJsKTtcbiAgICBjb25zdCBtYW5hZ2VyID0gTW9kZWxTdG9yZU1hbmFnZXJSZWdpc3RyeS5nZXRNYW5hZ2VyKHNjaGVtZUFuZFBhdGguc2NoZW1lKTtcbiAgICByZXR1cm4gbWFuYWdlci5yZW1vdmVNb2RlbChzY2hlbWVBbmRQYXRoLnBhdGgpO1xufVxuLyoqXG4gKiBDb3B5IGEgbW9kZWwgZnJvbSBvbmUgVVJMIHRvIGFub3RoZXIuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBzdXBwb3J0czpcbiAqXG4gKiAxLiBDb3B5aW5nIHdpdGhpbiBhIHN0b3JhZ2UgbWVkaXVtLCBlLmcuLFxuICogICAgYHRmLmlvLmNvcHlNb2RlbCgnbG9jYWxzdG9yYWdlOi8vbW9kZWwtMScsICdsb2NhbHN0b3JhZ2U6Ly9tb2RlbC0yJylgXG4gKiAyLiBDb3B5aW5nIGJldHdlZW4gdHdvIHN0b3JhZ2UgbWVkaXVtcywgZS5nLixcbiAqICAgIGB0Zi5pby5jb3B5TW9kZWwoJ2xvY2Fsc3RvcmFnZTovL21vZGVsLTEnLCAnaW5kZXhlZGRiOi8vbW9kZWwtMScpYFxuICpcbiAqIGBgYGpzXG4gKiAvLyBGaXJzdCBjcmVhdGUgYW5kIHNhdmUgYSBtb2RlbC5cbiAqIGNvbnN0IG1vZGVsID0gdGYuc2VxdWVudGlhbCgpO1xuICogbW9kZWwuYWRkKHRmLmxheWVycy5kZW5zZShcbiAqICAgICB7dW5pdHM6IDEsIGlucHV0U2hhcGU6IFsxMF0sIGFjdGl2YXRpb246ICdzaWdtb2lkJ30pKTtcbiAqIGF3YWl0IG1vZGVsLnNhdmUoJ2xvY2Fsc3RvcmFnZTovL2RlbW8vbWFuYWdlbWVudC9tb2RlbDEnKTtcbiAqXG4gKiAvLyBUaGVuIGxpc3QgZXhpc3RpbmcgbW9kZWxzLlxuICogY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoYXdhaXQgdGYuaW8ubGlzdE1vZGVscygpKSk7XG4gKlxuICogLy8gQ29weSB0aGUgbW9kZWwsIGZyb20gTG9jYWwgU3RvcmFnZSB0byBJbmRleGVkREIuXG4gKiBhd2FpdCB0Zi5pby5jb3B5TW9kZWwoXG4gKiAgICAgJ2xvY2Fsc3RvcmFnZTovL2RlbW8vbWFuYWdlbWVudC9tb2RlbDEnLFxuICogICAgICdpbmRleGVkZGI6Ly9kZW1vL21hbmFnZW1lbnQvbW9kZWwxJyk7XG4gKlxuICogLy8gTGlzdCBtb2RlbHMgYWdhaW4uXG4gKiBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShhd2FpdCB0Zi5pby5saXN0TW9kZWxzKCkpKTtcbiAqXG4gKiAvLyBSZW1vdmUgYm90aCBtb2RlbHMuXG4gKiBhd2FpdCB0Zi5pby5yZW1vdmVNb2RlbCgnbG9jYWxzdG9yYWdlOi8vZGVtby9tYW5hZ2VtZW50L21vZGVsMScpO1xuICogYXdhaXQgdGYuaW8ucmVtb3ZlTW9kZWwoJ2luZGV4ZWRkYjovL2RlbW8vbWFuYWdlbWVudC9tb2RlbDEnKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBzb3VyY2VVUkwgU291cmNlIFVSTCBvZiBjb3B5aW5nLlxuICogQHBhcmFtIGRlc3RVUkwgRGVzdGluYXRpb24gVVJMIG9mIGNvcHlpbmcuXG4gKiBAcmV0dXJucyBNb2RlbEFydGlmYWN0c0luZm8gb2YgdGhlIGNvcGllZCBtb2RlbCAoaWYgYW5kIG9ubHkgaWYgY29weWluZ1xuICogICBpcyBzdWNjZXNzZnVsKS5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgY29weWluZyBmYWlscywgZS5nLiwgaWYgbm8gbW9kZWwgZXhpc3RzIGF0IGBzb3VyY2VVUkxgLCBvclxuICogICBpZiBgb2xkUGF0aGAgYW5kIGBuZXdQYXRoYCBhcmUgaWRlbnRpY2FsLlxuICpcbiAqIEBkb2Mge1xuICogICBoZWFkaW5nOiAnTW9kZWxzJyxcbiAqICAgc3ViaGVhZGluZzogJ01hbmFnZW1lbnQnLFxuICogICBuYW1lc3BhY2U6ICdpbycsXG4gKiAgIGlnbm9yZUNJOiB0cnVlXG4gKiB9XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNvcHlNb2RlbChzb3VyY2VVUkwsIGRlc3RVUkwpIHtcbiAgICBjb25zdCBkZWxldGVTb3VyY2UgPSBmYWxzZTtcbiAgICByZXR1cm4gY2xvbmVNb2RlbEludGVybmFsKHNvdXJjZVVSTCwgZGVzdFVSTCwgZGVsZXRlU291cmNlKTtcbn1cbi8qKlxuICogTW92ZSBhIG1vZGVsIGZyb20gb25lIFVSTCB0byBhbm90aGVyLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gc3VwcG9ydHM6XG4gKlxuICogMS4gTW92aW5nIHdpdGhpbiBhIHN0b3JhZ2UgbWVkaXVtLCBlLmcuLFxuICogICAgYHRmLmlvLm1vdmVNb2RlbCgnbG9jYWxzdG9yYWdlOi8vbW9kZWwtMScsICdsb2NhbHN0b3JhZ2U6Ly9tb2RlbC0yJylgXG4gKiAyLiBNb3ZpbmcgYmV0d2VlbiB0d28gc3RvcmFnZSBtZWRpdW1zLCBlLmcuLFxuICogICAgYHRmLmlvLm1vdmVNb2RlbCgnbG9jYWxzdG9yYWdlOi8vbW9kZWwtMScsICdpbmRleGVkZGI6Ly9tb2RlbC0xJylgXG4gKlxuICogYGBganNcbiAqIC8vIEZpcnN0IGNyZWF0ZSBhbmQgc2F2ZSBhIG1vZGVsLlxuICogY29uc3QgbW9kZWwgPSB0Zi5zZXF1ZW50aWFsKCk7XG4gKiBtb2RlbC5hZGQodGYubGF5ZXJzLmRlbnNlKFxuICogICAgIHt1bml0czogMSwgaW5wdXRTaGFwZTogWzEwXSwgYWN0aXZhdGlvbjogJ3NpZ21vaWQnfSkpO1xuICogYXdhaXQgbW9kZWwuc2F2ZSgnbG9jYWxzdG9yYWdlOi8vZGVtby9tYW5hZ2VtZW50L21vZGVsMScpO1xuICpcbiAqIC8vIFRoZW4gbGlzdCBleGlzdGluZyBtb2RlbHMuXG4gKiBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShhd2FpdCB0Zi5pby5saXN0TW9kZWxzKCkpKTtcbiAqXG4gKiAvLyBNb3ZlIHRoZSBtb2RlbCwgZnJvbSBMb2NhbCBTdG9yYWdlIHRvIEluZGV4ZWREQi5cbiAqIGF3YWl0IHRmLmlvLm1vdmVNb2RlbChcbiAqICAgICAnbG9jYWxzdG9yYWdlOi8vZGVtby9tYW5hZ2VtZW50L21vZGVsMScsXG4gKiAgICAgJ2luZGV4ZWRkYjovL2RlbW8vbWFuYWdlbWVudC9tb2RlbDEnKTtcbiAqXG4gKiAvLyBMaXN0IG1vZGVscyBhZ2Fpbi5cbiAqIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KGF3YWl0IHRmLmlvLmxpc3RNb2RlbHMoKSkpO1xuICpcbiAqIC8vIFJlbW92ZSB0aGUgbW92ZWQgbW9kZWwuXG4gKiBhd2FpdCB0Zi5pby5yZW1vdmVNb2RlbCgnaW5kZXhlZGRiOi8vZGVtby9tYW5hZ2VtZW50L21vZGVsMScpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHNvdXJjZVVSTCBTb3VyY2UgVVJMIG9mIG1vdmluZy5cbiAqIEBwYXJhbSBkZXN0VVJMIERlc3RpbmF0aW9uIFVSTCBvZiBtb3ZpbmcuXG4gKiBAcmV0dXJucyBNb2RlbEFydGlmYWN0c0luZm8gb2YgdGhlIGNvcGllZCBtb2RlbCAoaWYgYW5kIG9ubHkgaWYgY29weWluZ1xuICogICBpcyBzdWNjZXNzZnVsKS5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgbW92aW5nIGZhaWxzLCBlLmcuLCBpZiBubyBtb2RlbCBleGlzdHMgYXQgYHNvdXJjZVVSTGAsIG9yXG4gKiAgIGlmIGBvbGRQYXRoYCBhbmQgYG5ld1BhdGhgIGFyZSBpZGVudGljYWwuXG4gKlxuICogQGRvYyB7XG4gKiAgIGhlYWRpbmc6ICdNb2RlbHMnLFxuICogICBzdWJoZWFkaW5nOiAnTWFuYWdlbWVudCcsXG4gKiAgIG5hbWVzcGFjZTogJ2lvJyxcbiAqICAgaWdub3JlQ0k6IHRydWVcbiAqIH1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gbW92ZU1vZGVsKHNvdXJjZVVSTCwgZGVzdFVSTCkge1xuICAgIGNvbnN0IGRlbGV0ZVNvdXJjZSA9IHRydWU7XG4gICAgcmV0dXJuIGNsb25lTW9kZWxJbnRlcm5hbChzb3VyY2VVUkwsIGRlc3RVUkwsIGRlbGV0ZVNvdXJjZSk7XG59XG5leHBvcnQgeyBtb3ZlTW9kZWwsIGNvcHlNb2RlbCwgcmVtb3ZlTW9kZWwsIGxpc3RNb2RlbHMgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1vZGVsX21hbmFnZW1lbnQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuY2xhc3MgUGFzc3Rocm91Z2hMb2FkZXIge1xuICAgIGNvbnN0cnVjdG9yKG1vZGVsQXJ0aWZhY3RzKSB7XG4gICAgICAgIHRoaXMubW9kZWxBcnRpZmFjdHMgPSBtb2RlbEFydGlmYWN0cztcbiAgICB9XG4gICAgYXN5bmMgbG9hZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW9kZWxBcnRpZmFjdHM7XG4gICAgfVxufVxuY2xhc3MgUGFzc3Rocm91Z2hTYXZlciB7XG4gICAgY29uc3RydWN0b3Ioc2F2ZUhhbmRsZXIpIHtcbiAgICAgICAgdGhpcy5zYXZlSGFuZGxlciA9IHNhdmVIYW5kbGVyO1xuICAgIH1cbiAgICBhc3luYyBzYXZlKG1vZGVsQXJ0aWZhY3RzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNhdmVIYW5kbGVyKG1vZGVsQXJ0aWZhY3RzKTtcbiAgICB9XG59XG4vKipcbiAqIENyZWF0ZXMgYW4gSU9IYW5kbGVyIHRoYXQgbG9hZHMgbW9kZWwgYXJ0aWZhY3RzIGZyb20gbWVtb3J5LlxuICpcbiAqIFdoZW4gdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGB0Zi5sb2FkTGF5ZXJzTW9kZWxgLCBhbiBpbnN0YW5jZSBvZlxuICogYHRmLkxheWVyc01vZGVsYCAoS2VyYXMtc3R5bGUpIGNhbiBiZSBjb25zdHJ1Y3RlZCBmcm9tIHRoZSBsb2FkZWQgYXJ0aWZhY3RzLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBtb2RlbCA9IGF3YWl0IHRmLmxvYWRMYXllcnNNb2RlbCh0Zi5pby5mcm9tTWVtb3J5KFxuICogICAgIG1vZGVsVG9wb2xvZ3ksIHdlaWdodFNwZWNzLCB3ZWlnaHREYXRhKSk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gbW9kZWxBcnRpZmFjdHMgYSBvYmplY3QgY29udGFpbmluZyBtb2RlbCB0b3BvbG9neSAoaS5lLiwgcGFyc2VkIGZyb21cbiAqICAgdGhlIEpTT04gZm9ybWF0KS5cbiAqIEBwYXJhbSB3ZWlnaHRTcGVjcyBBbiBhcnJheSBvZiBgV2VpZ2h0c01hbmlmZXN0RW50cnlgIG9iamVjdHMgZGVzY3JpYmluZyB0aGVcbiAqICAgbmFtZXMsIHNoYXBlcywgdHlwZXMsIGFuZCBxdWFudGl6YXRpb24gb2YgdGhlIHdlaWdodCBkYXRhLlxuICogQHBhcmFtIHdlaWdodERhdGEgQSBzaW5nbGUgYEFycmF5QnVmZmVyYCBjb250YWluaW5nIHRoZSB3ZWlnaHQgZGF0YSxcbiAqICAgY29uY2F0ZW5hdGVkIGluIHRoZSBvcmRlciBkZXNjcmliZWQgYnkgdGhlIHdlaWdodFNwZWNzLlxuICogQHBhcmFtIHRyYWluaW5nQ29uZmlnIE1vZGVsIHRyYWluaW5nIGNvbmZpZ3VyYXRpb24uIE9wdGlvbmFsLlxuICpcbiAqIEByZXR1cm5zIEEgcGFzc3Rocm91Z2ggYElPSGFuZGxlcmAgdGhhdCBzaW1wbHkgbG9hZHMgdGhlIHByb3ZpZGVkIGRhdGEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9tTWVtb3J5KG1vZGVsQXJ0aWZhY3RzLCB3ZWlnaHRTcGVjcywgd2VpZ2h0RGF0YSwgdHJhaW5pbmdDb25maWcpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBjb25zdCBpc01vZGVsQXJ0aWZhY3RzID0gbW9kZWxBcnRpZmFjdHMubW9kZWxUb3BvbG9neSAhPSBudWxsIHx8XG4gICAgICAgICAgICBtb2RlbEFydGlmYWN0cy53ZWlnaHRTcGVjcyAhPSBudWxsO1xuICAgICAgICBpZiAoaXNNb2RlbEFydGlmYWN0cykge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQYXNzdGhyb3VnaExvYWRlcihtb2RlbEFydGlmYWN0cyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBMZWdhY3kgc3VwcG9ydDogd2l0aCBvbmx5IG1vZGVsVG9wb2xvZ3kuXG4gICAgICAgICAgICAvLyBUT0RPKGNhaXMpOiBSZW1vdmUgdGhpcyBkZXByZWNhdGVkIEFQSS5cbiAgICAgICAgICAgIGNvbnNvbGUud2FybignUGxlYXNlIGNhbGwgdGYuaW8uZnJvbU1lbW9yeSgpIHdpdGggb25seSBvbmUgYXJndW1lbnQuICcgK1xuICAgICAgICAgICAgICAgICdUaGUgYXJndW1lbnQgc2hvdWxkIGJlIG9mIHR5cGUgTW9kZWxBcnRpZmFjdHMuICcgK1xuICAgICAgICAgICAgICAgICdUaGUgbXVsdGktYXJndW1lbnQgc2lnbmF0dXJlIG9mIHRmLmlvLmZyb21NZW1vcnkoKSBoYXMgYmVlbiAnICtcbiAgICAgICAgICAgICAgICAnZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHJlbGVhc2UuJyk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFBhc3N0aHJvdWdoTG9hZGVyKHsgbW9kZWxUb3BvbG9neTogbW9kZWxBcnRpZmFjdHMgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIExlZ2FjeSBzdXBwb3J0LlxuICAgICAgICAvLyBUT0RPKGNhaXMpOiBSZW1vdmUgdGhpcyBkZXByZWNhdGVkIEFQSS5cbiAgICAgICAgY29uc29sZS53YXJuKCdQbGVhc2UgY2FsbCB0Zi5pby5mcm9tTWVtb3J5KCkgd2l0aCBvbmx5IG9uZSBhcmd1bWVudC4gJyArXG4gICAgICAgICAgICAnVGhlIGFyZ3VtZW50IHNob3VsZCBiZSBvZiB0eXBlIE1vZGVsQXJ0aWZhY3RzLiAnICtcbiAgICAgICAgICAgICdUaGUgbXVsdGktYXJndW1lbnQgc2lnbmF0dXJlIG9mIHRmLmlvLmZyb21NZW1vcnkoKSBoYXMgYmVlbiAnICtcbiAgICAgICAgICAgICdkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgcmVsZWFzZS4nKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQYXNzdGhyb3VnaExvYWRlcih7XG4gICAgICAgICAgICBtb2RlbFRvcG9sb2d5OiBtb2RlbEFydGlmYWN0cyxcbiAgICAgICAgICAgIHdlaWdodFNwZWNzLFxuICAgICAgICAgICAgd2VpZ2h0RGF0YSxcbiAgICAgICAgICAgIHRyYWluaW5nQ29uZmlnXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbi8qKlxuICogQ3JlYXRlcyBhbiBJT0hhbmRsZXIgdGhhdCBwYXNzZXMgc2F2ZWQgbW9kZWwgYXJ0aWZhY3RzIHRvIGEgY2FsbGJhY2suXG4gKlxuICogYGBganNcbiAqIGZ1bmN0aW9uIGhhbmRsZVNhdmUoYXJ0aWZhY3RzKSB7XG4gKiAgIC8vIC4uLiBkbyBzb21ldGhpbmcgd2l0aCB0aGUgYXJ0aWZhY3RzIC4uLlxuICogICByZXR1cm4ge21vZGVsQXJ0aWZhY3RzSW5mbzogey4uLn0sIC4uLn07XG4gKiB9XG4gKlxuICogY29uc3Qgc2F2ZVJlc3VsdCA9IG1vZGVsLnNhdmUodGYuaW8ud2l0aFNhdmVIYW5kbGVyKGhhbmRsZVNhdmUpKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBzYXZlSGFuZGxlciBBIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyBhIGBNb2RlbEFydGlmYWN0c2AgYW5kIHJldHVybnMgYVxuICogICAgIGBTYXZlUmVzdWx0YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhTYXZlSGFuZGxlcihzYXZlSGFuZGxlcikge1xuICAgIHJldHVybiBuZXcgUGFzc3Rocm91Z2hTYXZlcihzYXZlSGFuZGxlcik7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYXNzdGhyb3VnaC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi91dGlsJztcbi8qKlxuICogTW9uaXRvciBQcm9taXNlLmFsbCBwcm9ncmVzcywgZmlyZSBvblByb2dyZXNzIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSBwcm9taXNlcyBQcm9taXNlIGxpc3QgZ29pbmcgdG8gYmUgbW9uaXRvcmVkXG4gKiBAcGFyYW0gb25Qcm9ncmVzcyBDYWxsYmFjayBmdW5jdGlvbi4gRmlyZWQgd2hlbiBhIHByb21pc2UgcmVzb2x2ZWQuXG4gKiBAcGFyYW0gc3RhcnRGcmFjdGlvbiBPcHRpb25hbCBmcmFjdGlvbiBzdGFydC4gRGVmYXVsdCB0byAwLlxuICogQHBhcmFtIGVuZEZyYWN0aW9uIE9wdGlvbmFsIGZyYWN0aW9uIGVuZC4gRGVmYXVsdCB0byAxLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbW9uaXRvclByb21pc2VzUHJvZ3Jlc3MocHJvbWlzZXMsIG9uUHJvZ3Jlc3MsIHN0YXJ0RnJhY3Rpb24sIGVuZEZyYWN0aW9uKSB7XG4gICAgY2hlY2tQcm9taXNlcyhwcm9taXNlcyk7XG4gICAgc3RhcnRGcmFjdGlvbiA9IHN0YXJ0RnJhY3Rpb24gPT0gbnVsbCA/IDAgOiBzdGFydEZyYWN0aW9uO1xuICAgIGVuZEZyYWN0aW9uID0gZW5kRnJhY3Rpb24gPT0gbnVsbCA/IDEgOiBlbmRGcmFjdGlvbjtcbiAgICBjaGVja0ZyYWN0aW9uKHN0YXJ0RnJhY3Rpb24sIGVuZEZyYWN0aW9uKTtcbiAgICBsZXQgcmVzb2x2ZWRQcm9taXNlID0gMDtcbiAgICBjb25zdCByZWdpc3Rlck1vbml0b3IgPSAocHJvbWlzZSkgPT4ge1xuICAgICAgICBwcm9taXNlLnRoZW4odmFsdWUgPT4ge1xuICAgICAgICAgICAgY29uc3QgZnJhY3Rpb24gPSBzdGFydEZyYWN0aW9uICtcbiAgICAgICAgICAgICAgICArK3Jlc29sdmVkUHJvbWlzZSAvIHByb21pc2VzLmxlbmd0aCAqIChlbmRGcmFjdGlvbiAtIHN0YXJ0RnJhY3Rpb24pO1xuICAgICAgICAgICAgLy8gcGFzcyBmcmFjdGlvbiBhcyBwYXJhbWV0ZXIgdG8gY2FsbGJhY2sgZnVuY3Rpb24uXG4gICAgICAgICAgICBvblByb2dyZXNzKGZyYWN0aW9uKTtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH07XG4gICAgZnVuY3Rpb24gY2hlY2tQcm9taXNlcyhwcm9taXNlcykge1xuICAgICAgICBhc3NlcnQocHJvbWlzZXMgIT0gbnVsbCAmJiBBcnJheS5pc0FycmF5KHByb21pc2VzKSAmJiBwcm9taXNlcy5sZW5ndGggPiAwLCAoKSA9PiAncHJvbWlzZXMgbXVzdCBiZSBhIG5vbmUgZW1wdHkgYXJyYXknKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY2hlY2tGcmFjdGlvbihzdGFydEZyYWN0aW9uLCBlbmRGcmFjdGlvbikge1xuICAgICAgICBhc3NlcnQoc3RhcnRGcmFjdGlvbiA+PSAwICYmIHN0YXJ0RnJhY3Rpb24gPD0gMSwgKCkgPT4gYFByb2dyZXNzIGZyYWN0aW9uIG11c3QgYmUgaW4gcmFuZ2UgWzAsIDFdLCBidXQgYCArXG4gICAgICAgICAgICBgZ290IHN0YXJ0RnJhY3Rpb24gJHtzdGFydEZyYWN0aW9ufWApO1xuICAgICAgICBhc3NlcnQoZW5kRnJhY3Rpb24gPj0gMCAmJiBlbmRGcmFjdGlvbiA8PSAxLCAoKSA9PiBgUHJvZ3Jlc3MgZnJhY3Rpb24gbXVzdCBiZSBpbiByYW5nZSBbMCwgMV0sIGJ1dCBgICtcbiAgICAgICAgICAgIGBnb3QgZW5kRnJhY3Rpb24gJHtlbmRGcmFjdGlvbn1gKTtcbiAgICAgICAgYXNzZXJ0KGVuZEZyYWN0aW9uID49IHN0YXJ0RnJhY3Rpb24sICgpID0+IGBzdGFydEZyYWN0aW9uIG11c3QgYmUgbm8gbW9yZSB0aGFuIGVuZEZyYWN0aW9uLCBidXQgYCArXG4gICAgICAgICAgICBgZ290IHN0YXJ0RnJhY3Rpb24gJHtzdGFydEZyYWN0aW9ufSBhbmQgZW5kRnJhY3Rpb24gYCArXG4gICAgICAgICAgICBgJHtlbmRGcmFjdGlvbn1gKTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzLm1hcChyZWdpc3Rlck1vbml0b3IpKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXByb2dyZXNzLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmV4cG9ydCBjbGFzcyBJT1JvdXRlclJlZ2lzdHJ5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5zYXZlUm91dGVycyA9IFtdO1xuICAgICAgICB0aGlzLmxvYWRSb3V0ZXJzID0gW107XG4gICAgfVxuICAgIHN0YXRpYyBnZXRJbnN0YW5jZSgpIHtcbiAgICAgICAgaWYgKElPUm91dGVyUmVnaXN0cnkuaW5zdGFuY2UgPT0gbnVsbCkge1xuICAgICAgICAgICAgSU9Sb3V0ZXJSZWdpc3RyeS5pbnN0YW5jZSA9IG5ldyBJT1JvdXRlclJlZ2lzdHJ5KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIElPUm91dGVyUmVnaXN0cnkuaW5zdGFuY2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVyIGEgc2F2ZS1oYW5kbGVyIHJvdXRlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzYXZlUm91dGVyIEEgZnVuY3Rpb24gdGhhdCBtYXBzIGEgVVJMLWxpa2Ugc3RyaW5nIG9udG8gYW4gaW5zdGFuY2VcbiAgICAgKiBvZiBgSU9IYW5kbGVyYCB3aXRoIHRoZSBgc2F2ZWAgbWV0aG9kIGRlZmluZWQgb3IgYG51bGxgLlxuICAgICAqL1xuICAgIHN0YXRpYyByZWdpc3RlclNhdmVSb3V0ZXIoc2F2ZVJvdXRlcikge1xuICAgICAgICBJT1JvdXRlclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuc2F2ZVJvdXRlcnMucHVzaChzYXZlUm91dGVyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXIgYSBsb2FkLWhhbmRsZXIgcm91dGVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIGxvYWRSb3V0ZXIgQSBmdW5jdGlvbiB0aGF0IG1hcHMgYSBVUkwtbGlrZSBzdHJpbmcgb250byBhbiBpbnN0YW5jZVxuICAgICAqIG9mIGBJT0hhbmRsZXJgIHdpdGggdGhlIGBsb2FkYCBtZXRob2QgZGVmaW5lZCBvciBgbnVsbGAuXG4gICAgICovXG4gICAgc3RhdGljIHJlZ2lzdGVyTG9hZFJvdXRlcihsb2FkUm91dGVyKSB7XG4gICAgICAgIElPUm91dGVyUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5sb2FkUm91dGVycy5wdXNoKGxvYWRSb3V0ZXIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBMb29rIHVwIElPSGFuZGxlciBmb3Igc2F2aW5nLCBnaXZlbiBhIFVSTC1saWtlIHN0cmluZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB1cmxcbiAgICAgKiBAcmV0dXJucyBJZiBvbmx5IG9uZSBtYXRjaCBpcyBmb3VuZCwgYW4gaW5zdGFuY2Ugb2YgSU9IYW5kbGVyIHdpdGggdGhlXG4gICAgICogYHNhdmVgIG1ldGhvZCBkZWZpbmVkLiBJZiBubyBtYXRjaCBpcyBmb3VuZCwgYG51bGxgLlxuICAgICAqIEB0aHJvd3MgRXJyb3IsIGlmIG1vcmUgdGhhbiBvbmUgbWF0Y2ggaXMgZm91bmQuXG4gICAgICovXG4gICAgc3RhdGljIGdldFNhdmVIYW5kbGVycyh1cmwpIHtcbiAgICAgICAgcmV0dXJuIElPUm91dGVyUmVnaXN0cnkuZ2V0SGFuZGxlcnModXJsLCAnc2F2ZScpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBMb29rIHVwIElPSGFuZGxlciBmb3IgbG9hZGluZywgZ2l2ZW4gYSBVUkwtbGlrZSBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdXJsXG4gICAgICogQHBhcmFtIGxvYWRPcHRpb25zIE9wdGlvbmFsLCBjdXN0b20gbG9hZCBvcHRpb25zLlxuICAgICAqIEByZXR1cm5zIEFsbCB2YWxpZCBoYW5kbGVycyBmb3IgYHVybGAsIGdpdmVuIHRoZSBjdXJyZW50bHkgcmVnaXN0ZXJlZFxuICAgICAqICAgaGFuZGxlciByb3V0ZXJzLlxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRMb2FkSGFuZGxlcnModXJsLCBsb2FkT3B0aW9ucykge1xuICAgICAgICByZXR1cm4gSU9Sb3V0ZXJSZWdpc3RyeS5nZXRIYW5kbGVycyh1cmwsICdsb2FkJywgbG9hZE9wdGlvbnMpO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0SGFuZGxlcnModXJsLCBoYW5kbGVyVHlwZSwgbG9hZE9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgdmFsaWRIYW5kbGVycyA9IFtdO1xuICAgICAgICBjb25zdCByb3V0ZXJzID0gaGFuZGxlclR5cGUgPT09ICdsb2FkJyA/XG4gICAgICAgICAgICBJT1JvdXRlclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkubG9hZFJvdXRlcnMgOlxuICAgICAgICAgICAgSU9Sb3V0ZXJSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLnNhdmVSb3V0ZXJzO1xuICAgICAgICByb3V0ZXJzLmZvckVhY2gocm91dGVyID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSByb3V0ZXIodXJsLCBsb2FkT3B0aW9ucyk7XG4gICAgICAgICAgICBpZiAoaGFuZGxlciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHZhbGlkSGFuZGxlcnMucHVzaChoYW5kbGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB2YWxpZEhhbmRsZXJzO1xuICAgIH1cbn1cbmV4cG9ydCBjb25zdCByZWdpc3RlclNhdmVSb3V0ZXIgPSAobG91ZFJvdXRlcikgPT4gSU9Sb3V0ZXJSZWdpc3RyeS5yZWdpc3RlclNhdmVSb3V0ZXIobG91ZFJvdXRlcik7XG5leHBvcnQgY29uc3QgcmVnaXN0ZXJMb2FkUm91dGVyID0gKGxvdWRSb3V0ZXIpID0+IElPUm91dGVyUmVnaXN0cnkucmVnaXN0ZXJMb2FkUm91dGVyKGxvdWRSb3V0ZXIpO1xuZXhwb3J0IGNvbnN0IGdldFNhdmVIYW5kbGVycyA9ICh1cmwpID0+IElPUm91dGVyUmVnaXN0cnkuZ2V0U2F2ZUhhbmRsZXJzKHVybCk7XG5leHBvcnQgY29uc3QgZ2V0TG9hZEhhbmRsZXJzID0gKHVybCwgbG9hZE9wdGlvbnMpID0+IElPUm91dGVyUmVnaXN0cnkuZ2V0TG9hZEhhbmRsZXJzKHVybCwgbG9hZE9wdGlvbnMpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cm91dGVyX3JlZ2lzdHJ5LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbi8qIFR5cGUgZGVmaW5pdGlvbnMgZm9yIGV4cG9ydGluZyBhbmQgaW1wb3J0aW5nIG9mIG1vZGVscy4gKi9cbi8qKlxuICogQSBtYXAgZnJvbSBUZW5zb3IgZHR5cGUgdG8gbnVtYmVyIG9mIGJ5dGVzIHBlciBlbGVtZW50IG9mIHRoZSBUZW5zb3IuXG4gKi9cbmV4cG9ydCBjb25zdCBEVFlQRV9WQUxVRV9TSVpFX01BUCA9IHtcbiAgICAnZmxvYXQzMic6IDQsXG4gICAgJ2Zsb2F0MTYnOiAyLFxuICAgICdpbnQzMic6IDQsXG4gICAgJ3VpbnQxNic6IDIsXG4gICAgJ3VpbnQ4JzogMSxcbiAgICAnYm9vbCc6IDEsXG4gICAgJ2NvbXBsZXg2NCc6IDhcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD10eXBlcy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBlbnYgfSBmcm9tICcuLi9lbnZpcm9ubWVudCc7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgZGVjb2RlV2VpZ2h0cyB9IGZyb20gJy4vaW9fdXRpbHMnO1xuaW1wb3J0IHsgbW9uaXRvclByb21pc2VzUHJvZ3Jlc3MgfSBmcm9tICcuL3Byb2dyZXNzJztcbmltcG9ydCB7IERUWVBFX1ZBTFVFX1NJWkVfTUFQIH0gZnJvbSAnLi90eXBlcyc7XG4vKipcbiAqIFJlYWRzIGJpbmFyeSB3ZWlnaHRzIGRhdGEgZnJvbSBhIG51bWJlciBvZiBVUkxzLlxuICpcbiAqIEBwYXJhbSBmZXRjaFVSTHMgVVJMcyB0byBzZW5kIHRoZSBIVFRQIHJlcXVlc3RzIGF0LCB1c2luZyBgZmV0Y2hgIGNhbGxzLlxuICogQHBhcmFtIHJlcXVlc3RPcHRpb25zIFJlcXVlc3RJbml0IChvcHRpb25zKSBmb3IgdGhlIEhUVFAgcmVxdWVzdHMuXG4gKiBAcGFyYW0gZmV0Y2hGdW5jIE9wdGlvbmFsIG92ZXJyaWRpbmcgdmFsdWUgZm9yIHRoZSBgd2luZG93LmZldGNoYCBmdW5jdGlvbi5cbiAqIEBwYXJhbSBvblByb2dyZXNzIE9wdGlvbmFsLCBwcm9ncmVzcyBjYWxsYmFjayBmdW5jdGlvbiwgZmlyZWQgcGVyaW9kaWNhbGx5XG4gKiAgIGJlZm9yZSB0aGUgbG9hZCBpcyBjb21wbGV0ZWQuXG4gKiBAcmV0dXJucyBBIGBQcm9taXNlYCBvZiBhbiBBcnJheSBvZiBgQXJyYXlCdWZmZXJgLiBUaGUgQXJyYXkgaGFzIHRoZSBzYW1lXG4gKiAgIGxlbmd0aCBhcyBgZmV0Y2hVUkxzYC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRXZWlnaHRzQXNBcnJheUJ1ZmZlcihmZXRjaFVSTHMsIGxvYWRPcHRpb25zKSB7XG4gICAgaWYgKGxvYWRPcHRpb25zID09IG51bGwpIHtcbiAgICAgICAgbG9hZE9wdGlvbnMgPSB7fTtcbiAgICB9XG4gICAgY29uc3QgZmV0Y2hGdW5jID0gbG9hZE9wdGlvbnMuZmV0Y2hGdW5jID09IG51bGwgPyBlbnYoKS5wbGF0Zm9ybS5mZXRjaCA6XG4gICAgICAgIGxvYWRPcHRpb25zLmZldGNoRnVuYztcbiAgICAvLyBDcmVhdGUgdGhlIHJlcXVlc3RzIGZvciBhbGwgb2YgdGhlIHdlaWdodHMgaW4gcGFyYWxsZWwuXG4gICAgY29uc3QgcmVxdWVzdHMgPSBmZXRjaFVSTHMubWFwKGZldGNoVVJMID0+IGZldGNoRnVuYyhmZXRjaFVSTCwgbG9hZE9wdGlvbnMucmVxdWVzdEluaXQsIHsgaXNCaW5hcnk6IHRydWUgfSkpO1xuICAgIGNvbnN0IGZldGNoU3RhcnRGcmFjdGlvbiA9IDA7XG4gICAgY29uc3QgZmV0Y2hFbmRGcmFjdGlvbiA9IDAuNTtcbiAgICBjb25zdCByZXNwb25zZXMgPSBsb2FkT3B0aW9ucy5vblByb2dyZXNzID09IG51bGwgP1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChyZXF1ZXN0cykgOlxuICAgICAgICBhd2FpdCBtb25pdG9yUHJvbWlzZXNQcm9ncmVzcyhyZXF1ZXN0cywgbG9hZE9wdGlvbnMub25Qcm9ncmVzcywgZmV0Y2hTdGFydEZyYWN0aW9uLCBmZXRjaEVuZEZyYWN0aW9uKTtcbiAgICBjb25zdCBidWZmZXJQcm9taXNlcyA9IHJlc3BvbnNlcy5tYXAocmVzcG9uc2UgPT4gcmVzcG9uc2UuYXJyYXlCdWZmZXIoKSk7XG4gICAgY29uc3QgYnVmZmVyU3RhcnRGcmFjdGlvbiA9IDAuNTtcbiAgICBjb25zdCBidWZmZXJFbmRGcmFjdGlvbiA9IDE7XG4gICAgY29uc3QgYnVmZmVycyA9IGxvYWRPcHRpb25zLm9uUHJvZ3Jlc3MgPT0gbnVsbCA/XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKGJ1ZmZlclByb21pc2VzKSA6XG4gICAgICAgIGF3YWl0IG1vbml0b3JQcm9taXNlc1Byb2dyZXNzKGJ1ZmZlclByb21pc2VzLCBsb2FkT3B0aW9ucy5vblByb2dyZXNzLCBidWZmZXJTdGFydEZyYWN0aW9uLCBidWZmZXJFbmRGcmFjdGlvbik7XG4gICAgcmV0dXJuIGJ1ZmZlcnM7XG59XG4vKipcbiAqIFJlYWRzIGEgd2VpZ2h0cyBtYW5pZmVzdCBKU09OIGNvbmZpZ3VyYXRpb24sIGZldGNoZXMgdGhlIHdlaWdodHMgYW5kXG4gKiByZXR1cm5zIHRoZW0gYXMgYFRlbnNvcmBzLlxuICpcbiAqIEBwYXJhbSBtYW5pZmVzdCBUaGUgd2VpZ2h0cyBtYW5pZmVzdCBKU09OLlxuICogQHBhcmFtIGZpbGVQYXRoUHJlZml4IFRoZSBwYXRoIHByZWZpeCBmb3IgZmlsZW5hbWVzIGdpdmVuIGluIHRoZSBtYW5pZmVzdC5cbiAqICAgICBEZWZhdWx0cyB0byB0aGUgZW1wdHkgc3RyaW5nLlxuICogQHBhcmFtIHdlaWdodE5hbWVzIFRoZSBuYW1lcyBvZiB0aGUgd2VpZ2h0cyB0byBiZSBmZXRjaGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZFdlaWdodHMobWFuaWZlc3QsIGZpbGVQYXRoUHJlZml4ID0gJycsIHdlaWdodE5hbWVzLCByZXF1ZXN0SW5pdCkge1xuICAgIC8vIFRPRE8obnN0aG9yYXQpOiBHcm91cHMgYXJlIGN1cnJlbnRseSBmZXRjaGVkIGF0b21pY2FsbHkuIElmIHlvdSBuZWVkIGFcbiAgICAvLyBzaW5nbGUgd2VpZ2h0IGZyb20gYSBncm91cCwgdGhlIHdob2xlIGdyb3VwIHdpbGwgYmUgZmV0Y2hlZC4gQXQgYSBmdXR1cmVcbiAgICAvLyBkYXRlLCB3ZSBzaG91bGQgc3VwcG9ydCBmZXRjaGluZyBvbmx5IHRoZSBpbmRpdmlkdWFsIHNoYXJkcyB3aXRoaW4gYVxuICAgIC8vIGdyb3VwIHRoYXQgYXJlIG5lZWRlZCB0byByZWNvbnN0cnVjdCB0aGUgcmVxdWVzdGVkIHdlaWdodC5cbiAgICAvLyBUT0RPKGNhaXMpOiBVc2UgYGRlY29kZVdlaWdodHNgIGZvciBpbXBsZW1lbnRhdGlvbi5cbiAgICBjb25zdCBmZXRjaFdlaWdodHMgPSAoZmV0Y2hVcmxzKSA9PiBsb2FkV2VpZ2h0c0FzQXJyYXlCdWZmZXIoZmV0Y2hVcmxzLCB7IHJlcXVlc3RJbml0IH0pO1xuICAgIGNvbnN0IGxvYWRXZWlnaHRzID0gd2VpZ2h0c0xvYWRlckZhY3RvcnkoZmV0Y2hXZWlnaHRzKTtcbiAgICByZXR1cm4gbG9hZFdlaWdodHMobWFuaWZlc3QsIGZpbGVQYXRoUHJlZml4LCB3ZWlnaHROYW1lcyk7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiwgd2hpY2ggcmVhZHMgYSB3ZWlnaHRzIG1hbmlmZXN0IEpTT04gY29uZmlndXJhdGlvbixcbiAqIGZldGNoZXMgdGhlIHdlaWdodCBmaWxlcyB1c2luZyB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uIGFuZCByZXR1cm5zIHRoZW0gYXNcbiAqIGBUZW5zb3Jgcy5cbiAqXG4gKiBgYGBqc1xuICogLy8gZXhhbXBsZSBmb3IgY3JlYXRpbmcgYSBub2RlanMgd2VpZ2h0IGxvYWRlciwgd2hpY2ggcmVhZHMgdGhlIHdlaWdodCBmaWxlc1xuICogLy8gZnJvbSBkaXNrIHVzaW5nIGZzLnJlYWRGaWxlU3luY1xuICpcbiAqIGltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJ1xuICpcbiAqIGNvbnN0IGZldGNoV2VpZ2h0c0Zyb21EaXNrID0gKGZpbGVQYXRoczogc3RyaW5nW10pID0+XG4gKiAgIGZpbGVQYXRocy5tYXAoZmlsZVBhdGggPT4gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoKS5idWZmZXIpXG4gKlxuICogY29uc3QgbG9hZFdlaWdodHMgPSB0Zi5pby53ZWlnaHRzTG9hZGVyRmFjdG9yeShmZXRjaFdlaWdodHNGcm9tRGlzaylcbiAqXG4gKiBjb25zdCBtYW5pZmVzdCA9IEpTT04ucGFyc2UoXG4gKiAgIGZzLnJlYWRGaWxlU3luYygnLi9teV9tb2RlbC13ZWlnaHRzX21hbmlmZXN0JykudG9TdHJpbmcoKVxuICogKVxuICogY29uc3Qgd2VpZ2h0TWFwID0gYXdhaXQgbG9hZFdlaWdodHMobWFuaWZlc3QsICcuLycpXG4gKiBgYGBcbiAqIEBwYXJhbSBmZXRjaFdlaWdodHNGdW5jdGlvbiBUaGUgZnVuY3Rpb24gdXNlZCBmb3IgZmV0Y2hpbmcgdGhlIHdlaWdodCBmaWxlcy5cbiAqIEByZXR1cm5zIFdlaWdodCBsb2FkaW5nIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2VpZ2h0c0xvYWRlckZhY3RvcnkoZmV0Y2hXZWlnaHRzRnVuY3Rpb24pIHtcbiAgICByZXR1cm4gYXN5bmMgKG1hbmlmZXN0LCBmaWxlUGF0aFByZWZpeCA9ICcnLCB3ZWlnaHROYW1lcykgPT4ge1xuICAgICAgICAvLyBDb2xsZWN0IGFsbCB0aGUgZ3JvdXBzLCB3ZWlnaHRzLCBhbmQgdGhlaXIgcmVsYXRpdmUgb2Zmc2V0cyB0byBiZVxuICAgICAgICAvLyBmZXRjaGVkLlxuICAgICAgICBjb25zdCBncm91cEluZGljZXNUb0ZldGNoTWFwID0gbWFuaWZlc3QubWFwKCgpID0+IGZhbHNlKTtcbiAgICAgICAgY29uc3QgZ3JvdXBXZWlnaHRzVG9GZXRjaCA9IHt9O1xuICAgICAgICBjb25zdCB3ZWlnaHRzRm91bmQgPSB3ZWlnaHROYW1lcyAhPSBudWxsID8gd2VpZ2h0TmFtZXMubWFwKCgpID0+IGZhbHNlKSA6IFtdO1xuICAgICAgICBjb25zdCBhbGxNYW5pZmVzdFdlaWdodE5hbWVzID0gW107XG4gICAgICAgIG1hbmlmZXN0LmZvckVhY2goKG1hbmlmZXN0R3JvdXBDb25maWcsIGdyb3VwSW5kZXgpID0+IHtcbiAgICAgICAgICAgIGxldCBncm91cE9mZnNldCA9IDA7XG4gICAgICAgICAgICBtYW5pZmVzdEdyb3VwQ29uZmlnLndlaWdodHMuZm9yRWFjaCh3ZWlnaHRzRW50cnkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJhd0R0eXBlID0gKCdxdWFudGl6YXRpb24nIGluIHdlaWdodHNFbnRyeSkgP1xuICAgICAgICAgICAgICAgICAgICB3ZWlnaHRzRW50cnkucXVhbnRpemF0aW9uLmR0eXBlIDpcbiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0c0VudHJ5LmR0eXBlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHdlaWdodHNCeXRlcyA9IERUWVBFX1ZBTFVFX1NJWkVfTUFQW3Jhd0R0eXBlXSAqXG4gICAgICAgICAgICAgICAgICAgIHV0aWwuc2l6ZUZyb21TaGFwZSh3ZWlnaHRzRW50cnkuc2hhcGUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVucXVldWVXZWlnaHRzRm9yRmV0Y2hpbmdGbiA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBJbmRpY2VzVG9GZXRjaE1hcFtncm91cEluZGV4XSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGlmIChncm91cFdlaWdodHNUb0ZldGNoW2dyb3VwSW5kZXhdID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwV2VpZ2h0c1RvRmV0Y2hbZ3JvdXBJbmRleF0gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBncm91cFdlaWdodHNUb0ZldGNoW2dyb3VwSW5kZXhdLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgbWFuaWZlc3RFbnRyeTogd2VpZ2h0c0VudHJ5LFxuICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBPZmZzZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplQnl0ZXM6IHdlaWdodHNCeXRlc1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGlmICh3ZWlnaHROYW1lcyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHdlaWdodE5hbWVzLmZvckVhY2goKHdlaWdodE5hbWUsIHdlaWdodEluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAod2VpZ2h0TmFtZSA9PT0gd2VpZ2h0c0VudHJ5Lm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnF1ZXVlV2VpZ2h0c0ZvckZldGNoaW5nRm4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRzRm91bmRbd2VpZ2h0SW5kZXhdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBlbnF1ZXVlV2VpZ2h0c0ZvckZldGNoaW5nRm4oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYWxsTWFuaWZlc3RXZWlnaHROYW1lcy5wdXNoKHdlaWdodHNFbnRyeS5uYW1lKTtcbiAgICAgICAgICAgICAgICBncm91cE9mZnNldCArPSB3ZWlnaHRzQnl0ZXM7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghd2VpZ2h0c0ZvdW5kLmV2ZXJ5KGZvdW5kID0+IGZvdW5kKSkge1xuICAgICAgICAgICAgY29uc3Qgd2VpZ2h0c05vdEZvdW5kID0gd2VpZ2h0TmFtZXMuZmlsdGVyKChfLCBpKSA9PiAhd2VpZ2h0c0ZvdW5kW2ldKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgd2VpZ2h0cyBpbiBtYW5pZmVzdCB3aXRoIG5hbWVzOiBgICtcbiAgICAgICAgICAgICAgICBgJHt3ZWlnaHRzTm90Rm91bmQuam9pbignLCAnKX0uIFxcbmAgK1xuICAgICAgICAgICAgICAgIGBNYW5pZmVzdCBKU09OIGhhcyB3ZWlnaHRzIHdpdGggbmFtZXM6IGAgK1xuICAgICAgICAgICAgICAgIGAke2FsbE1hbmlmZXN0V2VpZ2h0TmFtZXMuam9pbignLCAnKX0uYCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ29udmVydCB0aGUgb25lLWhvdCBib29sZWFuIGdyb3VwSWQgPT4gc2hvdWxkRmV0Y2ggbWFwIHRvIGEgbGlzdCBvZiBncm91cFxuICAgICAgICAvLyBJRHMuXG4gICAgICAgIGNvbnN0IGdyb3VwSW5kaWNlc1RvRmV0Y2ggPSBncm91cEluZGljZXNUb0ZldGNoTWFwLnJlZHVjZSgoYWNjdW11bGF0b3IsIHNob3VsZEZldGNoLCBpKSA9PiB7XG4gICAgICAgICAgICBpZiAoc2hvdWxkRmV0Y2gpIHtcbiAgICAgICAgICAgICAgICBhY2N1bXVsYXRvci5wdXNoKGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICAgICAgICB9LCBbXSk7XG4gICAgICAgIGNvbnN0IGZldGNoVXJscyA9IFtdO1xuICAgICAgICBncm91cEluZGljZXNUb0ZldGNoLmZvckVhY2goaSA9PiB7XG4gICAgICAgICAgICBtYW5pZmVzdFtpXS5wYXRocy5mb3JFYWNoKGZpbGVwYXRoID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBmZXRjaFVybCA9IGZpbGVQYXRoUHJlZml4ICtcbiAgICAgICAgICAgICAgICAgICAgKCFmaWxlUGF0aFByZWZpeC5lbmRzV2l0aCgnLycpID8gJy8nIDogJycpICsgZmlsZXBhdGg7XG4gICAgICAgICAgICAgICAgZmV0Y2hVcmxzLnB1c2goZmV0Y2hVcmwpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBidWZmZXJzID0gYXdhaXQgZmV0Y2hXZWlnaHRzRnVuY3Rpb24oZmV0Y2hVcmxzKTtcbiAgICAgICAgY29uc3Qgd2VpZ2h0c1RlbnNvck1hcCA9IHt9O1xuICAgICAgICBsZXQgYnVmZmVySW5kZXhPZmZzZXQgPSAwO1xuICAgICAgICBncm91cEluZGljZXNUb0ZldGNoLmZvckVhY2goaSA9PiB7XG4gICAgICAgICAgICBjb25zdCBudW1CdWZmZXJzID0gbWFuaWZlc3RbaV0ucGF0aHMubGVuZ3RoO1xuICAgICAgICAgICAgbGV0IGdyb3VwQnl0ZXMgPSAwO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1CdWZmZXJzOyBpKyspIHtcbiAgICAgICAgICAgICAgICBncm91cEJ5dGVzICs9IGJ1ZmZlcnNbYnVmZmVySW5kZXhPZmZzZXQgKyBpXS5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQ3JlYXRlIGEgYnVmZmVyIGZvciB0aGUgd2hvbGUgZ3JvdXAuXG4gICAgICAgICAgICBjb25zdCBncm91cEJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihncm91cEJ5dGVzKTtcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwQnl0ZUJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KGdyb3VwQnVmZmVyKTtcbiAgICAgICAgICAgIGxldCBncm91cEJ1ZmZlck9mZnNldCA9IDA7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUJ1ZmZlcnM7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcnNbYnVmZmVySW5kZXhPZmZzZXQgKyBpXSk7XG4gICAgICAgICAgICAgICAgZ3JvdXBCeXRlQnVmZmVyLnNldChidWZmZXIsIGdyb3VwQnVmZmVyT2Zmc2V0KTtcbiAgICAgICAgICAgICAgICBncm91cEJ1ZmZlck9mZnNldCArPSBidWZmZXIuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHdlaWdodHNFbnRyaWVzID0gZ3JvdXBXZWlnaHRzVG9GZXRjaFtpXTtcbiAgICAgICAgICAgIHdlaWdodHNFbnRyaWVzLmZvckVhY2god2VpZ2h0c0VudHJ5ID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBieXRlQnVmZmVyID0gZ3JvdXBCdWZmZXIuc2xpY2Uod2VpZ2h0c0VudHJ5Lmdyb3VwT2Zmc2V0LCB3ZWlnaHRzRW50cnkuZ3JvdXBPZmZzZXQgKyB3ZWlnaHRzRW50cnkuc2l6ZUJ5dGVzKTtcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lVG9UZW5zb3JNYXAgPSBkZWNvZGVXZWlnaHRzKGJ5dGVCdWZmZXIsIFt3ZWlnaHRzRW50cnkubWFuaWZlc3RFbnRyeV0pO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbmFtZSBpbiBuYW1lVG9UZW5zb3JNYXApIHtcbiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0c1RlbnNvck1hcFtuYW1lXSA9IG5hbWVUb1RlbnNvck1hcFtuYW1lXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGJ1ZmZlckluZGV4T2Zmc2V0ICs9IG51bUJ1ZmZlcnM7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gd2VpZ2h0c1RlbnNvck1hcDtcbiAgICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9d2VpZ2h0c19sb2FkZXIuanMubWFwIiwiZXhwb3J0IGNvbnN0IEFicyA9ICdBYnMnO1xuZXhwb3J0IGNvbnN0IEFjb3MgPSAnQWNvcyc7XG5leHBvcnQgY29uc3QgQWNvc2ggPSAnQWNvc2gnO1xuZXhwb3J0IGNvbnN0IEFkZCA9ICdBZGQnO1xuZXhwb3J0IGNvbnN0IEFkZE4gPSAnQWRkTic7XG5leHBvcnQgY29uc3QgQWxsID0gJ0FsbCc7XG5leHBvcnQgY29uc3QgQW55ID0gJ0FueSc7XG5leHBvcnQgY29uc3QgQXJnTWF4ID0gJ0FyZ01heCc7XG5leHBvcnQgY29uc3QgQXJnTWluID0gJ0FyZ01pbic7XG5leHBvcnQgY29uc3QgQXNpbiA9ICdBc2luJztcbmV4cG9ydCBjb25zdCBBc2luaCA9ICdBc2luaCc7XG5leHBvcnQgY29uc3QgQXRhbiA9ICdBdGFuJztcbmV4cG9ydCBjb25zdCBBdGFuaCA9ICdBdGFuaCc7XG5leHBvcnQgY29uc3QgQXRhbjIgPSAnQXRhbjInO1xuZXhwb3J0IGNvbnN0IEF2Z1Bvb2wgPSAnQXZnUG9vbCc7XG5leHBvcnQgY29uc3QgQXZnUG9vbEdyYWQgPSAnQXZnUG9vbEdyYWQnO1xuZXhwb3J0IGNvbnN0IEF2Z1Bvb2wzRCA9ICdBdmdQb29sM0QnO1xuZXhwb3J0IGNvbnN0IEF2Z1Bvb2wzREdyYWQgPSAnQXZnUG9vbDNER3JhZCc7XG5leHBvcnQgY29uc3QgQmF0Y2hNYXRNdWwgPSAnQmF0Y2hNYXRNdWwnO1xuZXhwb3J0IGNvbnN0IEJhdGNoVG9TcGFjZU5EID0gJ0JhdGNoVG9TcGFjZU5EJztcbmV4cG9ydCBjb25zdCBCaW5jb3VudCA9ICdCaW5jb3VudCc7XG5leHBvcnQgY29uc3QgQnJvYWRjYXN0VG8gPSAnQnJvYWRjYXN0VG8nO1xuZXhwb3J0IGNvbnN0IENhc3QgPSAnQ2FzdCc7XG5leHBvcnQgY29uc3QgQ2VpbCA9ICdDZWlsJztcbmV4cG9ydCBjb25zdCBDbGlwQnlWYWx1ZSA9ICdDbGlwQnlWYWx1ZSc7XG5leHBvcnQgY29uc3QgQ29tcGxleCA9ICdDb21wbGV4JztcbmV4cG9ydCBjb25zdCBDb21wbGV4QWJzID0gJ0NvbXBsZXhBYnMnO1xuZXhwb3J0IGNvbnN0IENvbmNhdCA9ICdDb25jYXQnO1xuZXhwb3J0IGNvbnN0IENvbnYyRCA9ICdDb252MkQnO1xuZXhwb3J0IGNvbnN0IENvbnYyREJhY2twcm9wRmlsdGVyID0gJ0NvbnYyREJhY2twcm9wRmlsdGVyJztcbmV4cG9ydCBjb25zdCBDb252MkRCYWNrcHJvcElucHV0ID0gJ0NvbnYyREJhY2twcm9wSW5wdXQnO1xuZXhwb3J0IGNvbnN0IENvbnYzRCA9ICdDb252M0QnO1xuZXhwb3J0IGNvbnN0IENvbnYzREJhY2twcm9wRmlsdGVyVjIgPSAnQ29udjNEQmFja3Byb3BGaWx0ZXJWMic7XG5leHBvcnQgY29uc3QgQ29udjNEQmFja3Byb3BJbnB1dFYyID0gJ0NvbnYzREJhY2twcm9wSW5wdXRWMic7XG5leHBvcnQgY29uc3QgQ29zID0gJ0Nvcyc7XG5leHBvcnQgY29uc3QgQ29zaCA9ICdDb3NoJztcbmV4cG9ydCBjb25zdCBDdW1zdW0gPSAnQ3Vtc3VtJztcbmV4cG9ydCBjb25zdCBDcm9wQW5kUmVzaXplID0gJ0Nyb3BBbmRSZXNpemUnO1xuZXhwb3J0IGNvbnN0IERlbnNlQmluY291bnQgPSAnRGVuc2VCaW5jb3VudCc7XG5leHBvcnQgY29uc3QgRGVwdGhUb1NwYWNlID0gJ0RlcHRoVG9TcGFjZSc7XG5leHBvcnQgY29uc3QgRGVwdGh3aXNlQ29udjJkTmF0aXZlID0gJ0RlcHRod2lzZUNvbnYyZE5hdGl2ZSc7XG5leHBvcnQgY29uc3QgRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXIgPSAnRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXInO1xuZXhwb3J0IGNvbnN0IERlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXQgPSAnRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dCc7XG5leHBvcnQgY29uc3QgRGlhZyA9ICdEaWFnJztcbmV4cG9ydCBjb25zdCBEaWxhdGlvbjJEID0gJ0RpbGF0aW9uMkQnO1xuZXhwb3J0IGNvbnN0IERpbGF0aW9uMkRCYWNrcHJvcElucHV0ID0gJ0RpbGF0aW9uMkRCYWNrcHJvcElucHV0JztcbmV4cG9ydCBjb25zdCBEaWxhdGlvbjJEQmFja3Byb3BGaWx0ZXIgPSAnRGlsYXRpb24yREJhY2twcm9wRmlsdGVyJztcbmV4cG9ydCBjb25zdCBSZWFsRGl2ID0gJ1JlYWxEaXYnO1xuZXhwb3J0IGNvbnN0IEVpbnN1bSA9ICdFaW5zdW0nO1xuZXhwb3J0IGNvbnN0IEVsdSA9ICdFbHUnO1xuZXhwb3J0IGNvbnN0IEVsdUdyYWQgPSAnRWx1R3JhZCc7XG5leHBvcnQgY29uc3QgRXJmID0gJ0VyZic7XG5leHBvcnQgY29uc3QgRXF1YWwgPSAnRXF1YWwnO1xuZXhwb3J0IGNvbnN0IEV4cCA9ICdFeHAnO1xuZXhwb3J0IGNvbnN0IEV4cGFuZERpbXMgPSAnRXhwYW5kRGltcyc7XG5leHBvcnQgY29uc3QgRXhwbTEgPSAnRXhwbTEnO1xuZXhwb3J0IGNvbnN0IEZGVCA9ICdGRlQnO1xuZXhwb3J0IGNvbnN0IEZpbGwgPSAnRmlsbCc7XG5leHBvcnQgY29uc3QgRmxpcExlZnRSaWdodCA9ICdGbGlwTGVmdFJpZ2h0JztcbmV4cG9ydCBjb25zdCBGbG9vciA9ICdGbG9vcic7XG5leHBvcnQgY29uc3QgRmxvb3JEaXYgPSAnRmxvb3JEaXYnO1xuZXhwb3J0IGNvbnN0IEZ1c2VkQmF0Y2hOb3JtID0gJ0Z1c2VkQmF0Y2hOb3JtJztcbmV4cG9ydCBjb25zdCBHYXRoZXJWMiA9ICdHYXRoZXJWMic7XG5leHBvcnQgY29uc3QgR2F0aGVyTmQgPSAnR2F0aGVyTmQnO1xuZXhwb3J0IGNvbnN0IEdyZWF0ZXIgPSAnR3JlYXRlcic7XG5leHBvcnQgY29uc3QgR3JlYXRlckVxdWFsID0gJ0dyZWF0ZXJFcXVhbCc7XG5leHBvcnQgY29uc3QgSWRlbnRpdHkgPSAnSWRlbnRpdHknO1xuZXhwb3J0IGNvbnN0IElGRlQgPSAnSUZGVCc7XG5leHBvcnQgY29uc3QgSW1hZyA9ICdJbWFnJztcbmV4cG9ydCBjb25zdCBJc0Zpbml0ZSA9ICdJc0Zpbml0ZSc7XG5leHBvcnQgY29uc3QgSXNJbmYgPSAnSXNJbmYnO1xuZXhwb3J0IGNvbnN0IElzTmFuID0gJ0lzTmFuJztcbmV4cG9ydCBjb25zdCBMZWFreVJlbHUgPSAnTGVha3lSZWx1JztcbmV4cG9ydCBjb25zdCBMZXNzID0gJ0xlc3MnO1xuZXhwb3J0IGNvbnN0IExlc3NFcXVhbCA9ICdMZXNzRXF1YWwnO1xuZXhwb3J0IGNvbnN0IExpblNwYWNlID0gJ0xpblNwYWNlJztcbmV4cG9ydCBjb25zdCBMb2cgPSAnTG9nJztcbmV4cG9ydCBjb25zdCBMb2cxcCA9ICdMb2cxcCc7XG5leHBvcnQgY29uc3QgTG9naWNhbEFuZCA9ICdMb2dpY2FsQW5kJztcbmV4cG9ydCBjb25zdCBMb2dpY2FsTm90ID0gJ0xvZ2ljYWxOb3QnO1xuZXhwb3J0IGNvbnN0IExvZ2ljYWxPciA9ICdMb2dpY2FsT3InO1xuZXhwb3J0IGNvbnN0IExvZ1NvZnRtYXggPSAnTG9nU29mdG1heCc7XG5leHBvcnQgY29uc3QgTFJOID0gJ0xSTic7XG5leHBvcnQgY29uc3QgTFJOR3JhZCA9ICdMUk5HcmFkJztcbmV4cG9ydCBjb25zdCBNYXggPSAnTWF4JztcbmV4cG9ydCBjb25zdCBNYXhpbXVtID0gJ01heGltdW0nO1xuZXhwb3J0IGNvbnN0IE1heFBvb2wgPSAnTWF4UG9vbCc7XG5leHBvcnQgY29uc3QgTWF4UG9vbEdyYWQgPSAnTWF4UG9vbEdyYWQnO1xuZXhwb3J0IGNvbnN0IE1heFBvb2wzRCA9ICdNYXhQb29sM0QnO1xuZXhwb3J0IGNvbnN0IE1heFBvb2wzREdyYWQgPSAnTWF4UG9vbDNER3JhZCc7XG5leHBvcnQgY29uc3QgTWF4UG9vbFdpdGhBcmdtYXggPSAnTWF4UG9vbFdpdGhBcmdtYXgnO1xuZXhwb3J0IGNvbnN0IE1lYW4gPSAnTWVhbic7XG5leHBvcnQgY29uc3QgTWluID0gJ01pbic7XG5leHBvcnQgY29uc3QgTWluaW11bSA9ICdNaW5pbXVtJztcbmV4cG9ydCBjb25zdCBNaXJyb3JQYWQgPSAnTWlycm9yUGFkJztcbmV4cG9ydCBjb25zdCBNb2QgPSAnTW9kJztcbmV4cG9ydCBjb25zdCBNdWx0aW5vbWlhbCA9ICdNdWx0aW5vbWlhbCc7XG5leHBvcnQgY29uc3QgTXVsdGlwbHkgPSAnTXVsdGlwbHknO1xuZXhwb3J0IGNvbnN0IE5lZyA9ICdOZWcnO1xuZXhwb3J0IGNvbnN0IE5vdEVxdWFsID0gJ05vdEVxdWFsJztcbmV4cG9ydCBjb25zdCBOb25NYXhTdXBwcmVzc2lvblYzID0gJ05vbk1heFN1cHByZXNzaW9uVjMnO1xuZXhwb3J0IGNvbnN0IE5vbk1heFN1cHByZXNzaW9uVjQgPSAnTm9uTWF4U3VwcHJlc3Npb25WNCc7XG5leHBvcnQgY29uc3QgTm9uTWF4U3VwcHJlc3Npb25WNSA9ICdOb25NYXhTdXBwcmVzc2lvblY1JztcbmV4cG9ydCBjb25zdCBPbmVzTGlrZSA9ICdPbmVzTGlrZSc7XG5leHBvcnQgY29uc3QgT25lSG90ID0gJ09uZUhvdCc7XG5leHBvcnQgY29uc3QgUGFjayA9ICdQYWNrJztcbmV4cG9ydCBjb25zdCBQYWRWMiA9ICdQYWRWMic7XG5leHBvcnQgY29uc3QgUG9vbCA9ICdQb29sJztcbmV4cG9ydCBjb25zdCBQb3cgPSAnUG93JztcbmV4cG9ydCBjb25zdCBQcmVsdSA9ICdQcmVsdSc7XG5leHBvcnQgY29uc3QgUHJvZCA9ICdQcm9kJztcbmV4cG9ydCBjb25zdCBSYW5nZSA9ICdSYW5nZSc7XG5leHBvcnQgY29uc3QgUmVhbCA9ICdSZWFsJztcbmV4cG9ydCBjb25zdCBSZWNpcHJvY2FsID0gJ1JlY2lwcm9jYWwnO1xuZXhwb3J0IGNvbnN0IFJlbHUgPSAnUmVsdSc7XG5leHBvcnQgY29uc3QgUmVzaGFwZSA9ICdSZXNoYXBlJztcbmV4cG9ydCBjb25zdCBSZXNpemVOZWFyZXN0TmVpZ2hib3IgPSAnUmVzaXplTmVhcmVzdE5laWdoYm9yJztcbmV4cG9ydCBjb25zdCBSZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkID0gJ1Jlc2l6ZU5lYXJlc3ROZWlnaGJvckdyYWQnO1xuZXhwb3J0IGNvbnN0IFJlc2l6ZUJpbGluZWFyID0gJ1Jlc2l6ZUJpbGluZWFyJztcbmV4cG9ydCBjb25zdCBSZXNpemVCaWxpbmVhckdyYWQgPSAnUmVzaXplQmlsaW5lYXJHcmFkJztcbmV4cG9ydCBjb25zdCBSZWx1NiA9ICdSZWx1Nic7XG5leHBvcnQgY29uc3QgUmV2ZXJzZSA9ICdSZXZlcnNlJztcbmV4cG9ydCBjb25zdCBSb3VuZCA9ICdSb3VuZCc7XG5leHBvcnQgY29uc3QgUnNxcnQgPSAnUnNxcnQnO1xuZXhwb3J0IGNvbnN0IFNjYXR0ZXJOZCA9ICdTY2F0dGVyTmQnO1xuZXhwb3J0IGNvbnN0IFNlbGVjdCA9ICdTZWxlY3QnO1xuZXhwb3J0IGNvbnN0IFNlbHUgPSAnU2VsdSc7XG5leHBvcnQgY29uc3QgU2xpY2UgPSAnU2xpY2UnO1xuZXhwb3J0IGNvbnN0IFNpbiA9ICdTaW4nO1xuZXhwb3J0IGNvbnN0IFNpbmggPSAnU2luaCc7XG5leHBvcnQgY29uc3QgU2lnbiA9ICdTaWduJztcbmV4cG9ydCBjb25zdCBTaWdtb2lkID0gJ1NpZ21vaWQnO1xuZXhwb3J0IGNvbnN0IFNvZnRwbHVzID0gJ1NvZnRwbHVzJztcbmV4cG9ydCBjb25zdCBTcXJ0ID0gJ1NxcnQnO1xuZXhwb3J0IGNvbnN0IFN1bSA9ICdTdW0nO1xuZXhwb3J0IGNvbnN0IFNwYWNlVG9CYXRjaE5EID0gJ1NwYWNlVG9CYXRjaE5EJztcbmV4cG9ydCBjb25zdCBTcGxpdFYgPSAnU3BsaXRWJztcbmV4cG9ydCBjb25zdCBTb2Z0bWF4ID0gJ1NvZnRtYXgnO1xuZXhwb3J0IGNvbnN0IFNwYXJzZUZpbGxFbXB0eVJvd3MgPSAnU3BhcnNlRmlsbEVtcHR5Um93cyc7XG5leHBvcnQgY29uc3QgU3BhcnNlUmVzaGFwZSA9ICdTcGFyc2VSZXNoYXBlJztcbmV4cG9ydCBjb25zdCBTcGFyc2VTZWdtZW50TWVhbiA9ICdTcGFyc2VTZWdtZW50TWVhbic7XG5leHBvcnQgY29uc3QgU3BhcnNlU2VnbWVudFN1bSA9ICdTcGFyc2VTZWdtZW50U3VtJztcbmV4cG9ydCBjb25zdCBTcGFyc2VUb0RlbnNlID0gJ1NwYXJzZVRvRGVuc2UnO1xuZXhwb3J0IGNvbnN0IFNxdWFyZWREaWZmZXJlbmNlID0gJ1NxdWFyZWREaWZmZXJlbmNlJztcbmV4cG9ydCBjb25zdCBTcXVhcmUgPSAnU3F1YXJlJztcbmV4cG9ydCBjb25zdCBTdHJpZGVkU2xpY2UgPSAnU3RyaWRlZFNsaWNlJztcbmV4cG9ydCBjb25zdCBTdHJpbmdOR3JhbXMgPSAnU3RyaW5nTkdyYW1zJztcbmV4cG9ydCBjb25zdCBTdHJpbmdTcGxpdCA9ICdTdHJpbmdTcGxpdCc7XG5leHBvcnQgY29uc3QgU3RyaW5nVG9IYXNoQnVja2V0RmFzdCA9ICdTdHJpbmdUb0hhc2hCdWNrZXRGYXN0JztcbmV4cG9ydCBjb25zdCBTdWIgPSAnU3ViJztcbmV4cG9ydCBjb25zdCBUYW4gPSAnVGFuJztcbmV4cG9ydCBjb25zdCBUYW5oID0gJ1RhbmgnO1xuZXhwb3J0IGNvbnN0IFRpbGUgPSAnVGlsZSc7XG5leHBvcnQgY29uc3QgVG9wSyA9ICdUb3BLJztcbmV4cG9ydCBjb25zdCBUcmFuc2Zvcm0gPSAnVHJhbnNmb3JtJztcbmV4cG9ydCBjb25zdCBUcmFuc3Bvc2UgPSAnVHJhbnNwb3NlJztcbmV4cG9ydCBjb25zdCBVbmlxdWUgPSAnVW5pcXVlJztcbmV4cG9ydCBjb25zdCBVbnBhY2sgPSAnVW5wYWNrJztcbmV4cG9ydCBjb25zdCBVbnNvcnRlZFNlZ21lbnRTdW0gPSAnVW5zb3J0ZWRTZWdtZW50U3VtJztcbmV4cG9ydCBjb25zdCBaZXJvc0xpa2UgPSAnWmVyb3NMaWtlJztcbi8qKlxuICogVGVuc29yRmxvdy5qcy1vbmx5IGtlcm5lbHNcbiAqL1xuZXhwb3J0IGNvbnN0IFN0ZXAgPSAnU3RlcCc7XG5leHBvcnQgY29uc3QgRnJvbVBpeGVscyA9ICdGcm9tUGl4ZWxzJztcbmV4cG9ydCBjb25zdCBSb3RhdGVXaXRoT2Zmc2V0ID0gJ1JvdGF0ZVdpdGhPZmZzZXQnO1xuZXhwb3J0IGNvbnN0IF9GdXNlZE1hdE11bCA9ICdfRnVzZWRNYXRNdWwnO1xuZXhwb3J0IGNvbnN0IEZ1c2VkQ29udjJEID0gJ0Z1c2VkQ29udjJEJztcbmV4cG9ydCBjb25zdCBGdXNlZERlcHRod2lzZUNvbnYyRCA9ICdGdXNlZERlcHRod2lzZUNvbnYyRCc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1rZXJuZWxfbmFtZXMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgZW52IH0gZnJvbSAnLi9lbnZpcm9ubWVudCc7XG5pbXBvcnQgeyBnZXRHbG9iYWwgfSBmcm9tICcuL2dsb2JhbF91dGlsJztcbmNvbnN0IGtlcm5lbFJlZ2lzdHJ5ID0gZ2V0R2xvYmFsKCdrZXJuZWxSZWdpc3RyeScsICgpID0+IG5ldyBNYXAoKSk7XG5jb25zdCBncmFkUmVnaXN0cnkgPSBnZXRHbG9iYWwoJ2dyYWRSZWdpc3RyeScsICgpID0+IG5ldyBNYXAoKSk7XG4vKipcbiAqIFJldHVybnMgdGhlIGtlcm5lbCBmdW5jdGlvbiAoY29kZSkgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm92aWRlZCBuYW1lcy5cbiAqXG4gKiBAcGFyYW0ga2VybmVsTmFtZSBUaGUgb2ZmaWNpYWwgbmFtZSBvZiB0aGUga2VybmVsLlxuICogQHBhcmFtIGJhY2tlbmROYW1lIFRoZSBvZmZpY2lhbCBuYW1lIG9mIHRoZSBiYWNrZW5kLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0S2VybmVsKGtlcm5lbE5hbWUsIGJhY2tlbmROYW1lKSB7XG4gICAgY29uc3Qga2V5ID0gbWFrZUtleShrZXJuZWxOYW1lLCBiYWNrZW5kTmFtZSk7XG4gICAgcmV0dXJuIGtlcm5lbFJlZ2lzdHJ5LmdldChrZXkpO1xufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSByZWdpc3RlcmVkIGdyYWRpZW50IGluZm8gYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm92aWRlZCBrZXJuZWwuXG4gKiBAcGFyYW0ga2VybmVsTmFtZSBUaGUgb2ZmaWNpYWwgVEYga2VybmVsIG5hbWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRHcmFkaWVudChrZXJuZWxOYW1lKSB7XG4gICAgcmV0dXJuIGdyYWRSZWdpc3RyeS5nZXQoa2VybmVsTmFtZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0S2VybmVsc0ZvckJhY2tlbmQoYmFja2VuZE5hbWUpIHtcbiAgICBjb25zdCBpdCA9IGtlcm5lbFJlZ2lzdHJ5LmVudHJpZXMoKTtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBjb25zdCB7IGRvbmUsIHZhbHVlIH0gPSBpdC5uZXh0KCk7XG4gICAgICAgIGlmIChkb25lKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBba2V5LCBjb25maWddID0gdmFsdWU7XG4gICAgICAgIGNvbnN0IFtiYWNrZW5kLF0gPSBrZXkuc3BsaXQoJ18nKTtcbiAgICAgICAgaWYgKGJhY2tlbmQgPT09IGJhY2tlbmROYW1lKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChjb25maWcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4vKipcbiAqIFJlZ2lzdGVycyB0aGUgZnVuY3Rpb24gKGZvcndhcmQgcGFzcykgZm9yIHRoZSBrZXJuZWwgaW4gYSBnbG9iYWwgcmVnaXN0cnkuXG4gKlxuICogQHBhcmFtIGNvbmZpZyBBIGNvbmZpZyBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKiAtIGBrZXJuZWxOYW1lYCBUaGUgb2ZmaWNpYWwgbmFtZSBvZiB0aGUga2VybmVsLlxuICogLSBgYmFja2VuZE5hbWVgIFRoZSBvZmZpY2lhbCBuYW1lIG9mIHRoZSBiYWNrZW5kLlxuICogLSBga2VybmVsRnVuY2AgVGhlIGZ1bmN0aW9uIHRvIHJ1biBkdXJpbmcgdGhlIGZvcndhcmQgcGFzcyBvZiB0aGUga2VybmVsLlxuICogLSBgc2V0dXBGdW5jYCBPcHRpb25hbC4gR2V0cyBjYWxsZWQgb25jZSwgYWZ0ZXIgdGhlIGJhY2tlbmQgaW5pdGlhbGl6ZXMuXG4gKiAtIGBkaXNwb3NlRnVuY2AgT3B0aW9uYWwuIEdldHMgY2FsbGVkIG9uY2UsIHJpZ2h0IGJlZm9yZSB0aGUgYmFja2VuZCBpc1xuICogZGlzcG9zZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3Rlcktlcm5lbChjb25maWcpIHtcbiAgICBjb25zdCB7IGtlcm5lbE5hbWUsIGJhY2tlbmROYW1lIH0gPSBjb25maWc7XG4gICAgY29uc3Qga2V5ID0gbWFrZUtleShrZXJuZWxOYW1lLCBiYWNrZW5kTmFtZSk7XG4gICAgaWYgKGtlcm5lbFJlZ2lzdHJ5LmhhcyhrZXkpKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgVGhlIGtlcm5lbCAnJHtrZXJuZWxOYW1lfScgZm9yIGJhY2tlbmQgYCArXG4gICAgICAgICAgICBgJyR7YmFja2VuZE5hbWV9JyBpcyBhbHJlYWR5IHJlZ2lzdGVyZWRgKTtcbiAgICB9XG4gICAga2VybmVsUmVnaXN0cnkuc2V0KGtleSwgY29uZmlnKTtcbn1cbi8qKlxuICogUmVnaXN0ZXJzIGEgZ3JhZGllbnQgZnVuY3Rpb24gZm9yIGEgZ2l2ZW4ga2VybmVsIGluIHRoZSBnbG9iYWwgcmVnaXN0cnksXG4gKiB0byBiZSB1c2VkIGR1cmluZyB0aGUgYmFjay1wcm9wYWdhdGlvbiBvZiB0aGF0IGtlcm5lbC5cbiAqXG4gKiBAcGFyYW0gY29uZmlnIEFuIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqIC0gYGtlcm5lbE5hbWVgIFRoZSBuYW1lIG9mIHRoZSBrZXJuZWwgdGhhdCB0aGUgZ3JhZGllbnQgZnVuY3Rpb24gaXMgZm9yLlxuICogLSBgZ3JhZEZ1bmNgIFRoZSBmdW5jdGlvbiB0byBydW4gZHVyaW5nIGJhY2stcHJvcGFnYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckdyYWRpZW50KGNvbmZpZykge1xuICAgIGNvbnN0IHsga2VybmVsTmFtZSB9ID0gY29uZmlnO1xuICAgIGlmIChncmFkUmVnaXN0cnkuaGFzKGtlcm5lbE5hbWUpKSB7XG4gICAgICAgIC8vIFRPRE8gKHlhc3NvZ2JhKSBhZnRlciAzLjAgYXNzZXNzIHdoZXRoZXIgd2UgbmVlZCB0byBrZWVwIHRoaXMgZ2F0ZWRcbiAgICAgICAgLy8gdG8gZGVidWcgbW9kZS5cbiAgICAgICAgaWYgKGVudigpLmdldEJvb2woJ0RFQlVHJykpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgT3ZlcnJpZGluZyB0aGUgZ3JhZGllbnQgZm9yICcke2tlcm5lbE5hbWV9J2ApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdyYWRSZWdpc3RyeS5zZXQoa2VybmVsTmFtZSwgY29uZmlnKTtcbn1cbi8qKlxuICogUmVtb3ZlcyB0aGUga2VybmVsIGZ1bmN0aW9uIGZyb20gdGhlIHJlZ2lzdHJ5LlxuICpcbiAqIEBwYXJhbSBrZXJuZWxOYW1lIFRoZSBvZmZpY2lhbCBuYW1lIG9mIHRoZSBrZXJuZWwuXG4gKiBAcGFyYW0gYmFja2VuZE5hbWUgVGhlIG9mZmljaWFsIG5hbWUgb2YgdGhlIGJhY2tlbmQuXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5yZWdpc3Rlcktlcm5lbChrZXJuZWxOYW1lLCBiYWNrZW5kTmFtZSkge1xuICAgIGNvbnN0IGtleSA9IG1ha2VLZXkoa2VybmVsTmFtZSwgYmFja2VuZE5hbWUpO1xuICAgIGlmICgha2VybmVsUmVnaXN0cnkuaGFzKGtleSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUga2VybmVsICcke2tlcm5lbE5hbWV9JyBmb3IgYmFja2VuZCBgICtcbiAgICAgICAgICAgIGAnJHtiYWNrZW5kTmFtZX0nIGlzIG5vdCByZWdpc3RlcmVkYCk7XG4gICAgfVxuICAgIGtlcm5lbFJlZ2lzdHJ5LmRlbGV0ZShrZXkpO1xufVxuLyoqIFJlbW92ZXMgdGhlIHJlZ2lzdGVyZWQgZ3JhZGllbnQgZnJvbSB0aGUgZ2xvYmFsIHJlZ2lzdHJ5LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVucmVnaXN0ZXJHcmFkaWVudChrZXJuZWxOYW1lKSB7XG4gICAgaWYgKCFncmFkUmVnaXN0cnkuaGFzKGtlcm5lbE5hbWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIGdyYWRpZW50ICcke2tlcm5lbE5hbWV9JyBmb3IgYmFja2VuZCBpcyBub3QgcmVnaXN0ZXJlZGApO1xuICAgIH1cbiAgICBncmFkUmVnaXN0cnkuZGVsZXRlKGtlcm5lbE5hbWUpO1xufVxuLyoqXG4gKiBGaW5kcyBrZXJuZWxzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCB0byBhIGJhY2tlbmQgYW5kIHJlLXJlZ2lzdGVyc1xuICogdGhlbSBmb3IgYSBuZXcgYmFja2VuZC4gVXNlZnVsIGZvciByZWdpc3RlcmluZyBjdXN0b20gYmFja2VuZHMuXG4gKiBAcGFyYW0gcmVnaXN0ZXJlZEJhY2tlbmROYW1lIEFscmVhZHkgcmVnaXN0ZXJlZCBiYWNrZW5kLlxuICogQHBhcmFtIG5ld0JhY2tlbmROYW1lIE5ldyBiYWNrZW5kLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29weVJlZ2lzdGVyZWRLZXJuZWxzKHJlZ2lzdGVyZWRCYWNrZW5kTmFtZSwgbmV3QmFja2VuZE5hbWUpIHtcbiAgICBjb25zdCBrZXJuZWxzID0gZ2V0S2VybmVsc0ZvckJhY2tlbmQocmVnaXN0ZXJlZEJhY2tlbmROYW1lKTtcbiAgICBrZXJuZWxzLmZvckVhY2goa2VybmVsQ29uZmlnID0+IHtcbiAgICAgICAgY29uc3QgbmV3S2VybmVsQ29uZmlnID0gT2JqZWN0LmFzc2lnbih7fSwga2VybmVsQ29uZmlnLCB7IGJhY2tlbmROYW1lOiBuZXdCYWNrZW5kTmFtZSB9KTtcbiAgICAgICAgcmVnaXN0ZXJLZXJuZWwobmV3S2VybmVsQ29uZmlnKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIG1ha2VLZXkoa2VybmVsTmFtZSwgYmFja2VuZE5hbWUpIHtcbiAgICByZXR1cm4gYCR7YmFja2VuZE5hbWV9XyR7a2VybmVsTmFtZX1gO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9a2VybmVsX3JlZ2lzdHJ5LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGVudiB9IGZyb20gJy4vZW52aXJvbm1lbnQnO1xuZXhwb3J0IGZ1bmN0aW9uIHdhcm4oLi4ubXNnKSB7XG4gICAgaWYgKCFlbnYoKS5nZXRCb29sKCdJU19URVNUJykpIHtcbiAgICAgICAgY29uc29sZS53YXJuKC4uLm1zZyk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGxvZyguLi5tc2cpIHtcbiAgICBpZiAoIWVudigpLmdldEJvb2woJ0lTX1RFU1QnKSkge1xuICAgICAgICBjb25zb2xlLmxvZyguLi5tc2cpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxvZy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG4vKipcbiAqIEV4cG9ydHMgdW5kZXIgdGhlIHRmLm1hdGguKiBuYW1lc3BhY2UuXG4gKi9cbmltcG9ydCB7IGNvbmZ1c2lvbk1hdHJpeCB9IGZyb20gJy4vb3BzL2NvbmZ1c2lvbl9tYXRyaXgnO1xuZXhwb3J0IHsgY29uZnVzaW9uTWF0cml4IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tYXRoLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBBYnMsIENvbXBsZXhBYnMgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyBhYnNvbHV0ZSB2YWx1ZSBlbGVtZW50LXdpc2U6IGBhYnMoeClgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbLTEsIDIsIC0zLCA0XSk7XG4gKlxuICogeC5hYnMoKS5wcmludCgpOyAgLy8gb3IgdGYuYWJzKHgpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCBgdGYuVGVuc29yYC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gYWJzXyh4KSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnYWJzJyk7XG4gICAgaWYgKCR4LmR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgICAgICBjb25zdCBpbnB1dHMgPSB7IHg6ICR4IH07XG4gICAgICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKENvbXBsZXhBYnMsIGlucHV0cyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBpbnB1dHMgPSB7IHg6ICR4IH07XG4gICAgICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEFicywgaW5wdXRzKTtcbiAgICB9XG59XG5leHBvcnQgY29uc3QgYWJzID0gb3AoeyBhYnNfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YWJzLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBBY29zIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgYWNvcyBvZiB0aGUgaW5wdXQgYHRmLlRlbnNvcmAgZWxlbWVudC13aXNlOiBgYWNvcyh4KWBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFswLCAxLCAtMSwgLjddKTtcbiAqXG4gKiB4LmFjb3MoKS5wcmludCgpOyAgLy8gb3IgdGYuYWNvcyh4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMgbWF0aCd9XG4gKi9cbmZ1bmN0aW9uIGFjb3NfKHgpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdhY29zJyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEFjb3MsIGlucHV0cyk7XG59XG5leHBvcnQgY29uc3QgYWNvcyA9IG9wKHsgYWNvc18gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hY29zLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBBY29zaCB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENvbXB1dGVzIHRoZSBpbnZlcnNlIGh5cGVyYm9saWMgY29zIG9mIHRoZSBpbnB1dCBgdGYuVGVuc29yYCBlbGVtZW50LXdpc2U6XG4gKiBgYWNvc2goeClgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMTAsIDEsIDMsIDUuN10pO1xuICpcbiAqIHguYWNvc2goKS5wcmludCgpOyAgLy8gb3IgdGYuYWNvc2goeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gYWNvc2hfKHgpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdhY29zaCcpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChBY29zaCwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBhY29zaCA9IG9wKHsgYWNvc2hfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YWNvc2guanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IEFkZCB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBtYWtlVHlwZXNNYXRjaCB9IGZyb20gJy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQWRkcyB0d28gYHRmLlRlbnNvcmBzIGVsZW1lbnQtd2lzZSwgQSArIEIuIFN1cHBvcnRzIGJyb2FkY2FzdGluZy5cbiAqXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgMiwgMywgNF0pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjFkKFsxMCwgMjAsIDMwLCA0MF0pO1xuICpcbiAqIGEuYWRkKGIpLnByaW50KCk7ICAvLyBvciB0Zi5hZGQoYSwgYilcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiAvLyBCcm9hZGNhc3QgYWRkIGEgd2l0aCBiLlxuICogY29uc3QgYSA9IHRmLnNjYWxhcig1KTtcbiAqIGNvbnN0IGIgPSB0Zi50ZW5zb3IxZChbMTAsIDIwLCAzMCwgNDBdKTtcbiAqXG4gKiBhLmFkZChiKS5wcmludCgpOyAgLy8gb3IgdGYuYWRkKGEsIGIpXG4gKiBgYGBcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCBgdGYuVGVuc29yYCB0byBhZGQuXG4gKiBAcGFyYW0gYiBUaGUgc2Vjb25kIGB0Zi5UZW5zb3JgIHRvIGFkZC4gTXVzdCBoYXZlIHRoZSBzYW1lIHR5cGUgYXMgYGFgLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0FyaXRobWV0aWMnfVxuICovXG5mdW5jdGlvbiBhZGRfKGEsIGIpIHtcbiAgICBsZXQgJGEgPSBjb252ZXJ0VG9UZW5zb3IoYSwgJ2EnLCAnYWRkJyk7XG4gICAgbGV0ICRiID0gY29udmVydFRvVGVuc29yKGIsICdiJywgJ2FkZCcpO1xuICAgIFskYSwgJGJdID0gbWFrZVR5cGVzTWF0Y2goJGEsICRiKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IGE6ICRhLCBiOiAkYiB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEFkZCwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBhZGQgPSBvcCh7IGFkZF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hZGQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IEFkZE4gfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQWRkcyBhIGxpc3Qgb2YgYHRmLlRlbnNvcmBzIGVsZW1lbnQtd2lzZSwgZWFjaCB3aXRoIHRoZSBzYW1lIHNoYXBlIGFuZCBkdHlwZS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsxLCAyXSk7XG4gKiBjb25zdCBiID0gdGYudGVuc29yMWQoWzMsIDRdKTtcbiAqIGNvbnN0IGMgPSB0Zi50ZW5zb3IxZChbNSwgNl0pO1xuICpcbiAqIHRmLmFkZE4oW2EsIGIsIGNdKS5wcmludCgpO1xuICogYGBgXG4gKiBAcGFyYW0gdGVuc29ycyBBIGxpc3Qgb2YgdGVuc29ycyB3aXRoIHRoZSBzYW1lIHNoYXBlIGFuZCBkdHlwZS5cbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0FyaXRobWV0aWMnfVxuICovXG5mdW5jdGlvbiBhZGROXyh0ZW5zb3JzKSB7XG4gICAgdXRpbC5hc3NlcnQoQXJyYXkuaXNBcnJheSh0ZW5zb3JzKSwgKCkgPT4gJ1RoZSBhcmd1bWVudCBwYXNzZWQgdG8gdGYuYWRkTigpIG11c3QgYmUgYSBsaXN0IG9mIHRlbnNvcnMnKTtcbiAgICB1dGlsLmFzc2VydCh0ZW5zb3JzLmxlbmd0aCA+PSAxLCAoKSA9PiBgTXVzdCBwYXNzIGF0IGxlYXN0IG9uZSB0ZW5zb3IgdG8gdGYuYWRkTigpLCBidXQgZ290IGAgK1xuICAgICAgICBgJHt0ZW5zb3JzLmxlbmd0aH1gKTtcbiAgICBjb25zdCAkdGVuc29ycyA9IHRlbnNvcnMubWFwKCh0LCBpKSA9PiBjb252ZXJ0VG9UZW5zb3IodCwgYHRlbnNvcnMke2l9YCwgJ2FkZE4nKSk7XG4gICAgY29uc3QgZmlyc3RUZW5zb3IgPSAkdGVuc29yc1swXTtcbiAgICAkdGVuc29ycy5mb3JFYWNoKHQgPT4ge1xuICAgICAgICBpZiAodC5kdHlwZSAhPT0gZmlyc3RUZW5zb3IuZHR5cGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQWxsIHRlbnNvcnMgcGFzc2VkIHRvIHRmLmFkZE4oKSBtdXN0IGhhdmUgdGhlIHNhbWUgZHR5cGUnKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgICR0ZW5zb3JzLmZvckVhY2godCA9PiB7XG4gICAgICAgIGlmICghdXRpbC5hcnJheXNFcXVhbCh0LnNoYXBlLCBmaXJzdFRlbnNvci5zaGFwZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQWxsIHRlbnNvcnMgcGFzc2VkIHRvIHRmLmFkZE4oKSBtdXN0IGhhdmUgdGhlIHNhbWUgc2hhcGUnKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IGlucHV0cyA9ICR0ZW5zb3JzO1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEFkZE4sIGlucHV0cyk7XG59XG5leHBvcnQgY29uc3QgYWRkTiA9IG9wKHsgYWRkTl8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hZGRfbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgQWxsIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgdGhlIGxvZ2ljYWwgYW5kIG9mIGVsZW1lbnRzIGFjcm9zcyBkaW1lbnNpb25zIG9mIGEgYHRmLlRlbnNvcmAuXG4gKlxuICogUmVkdWNlcyB0aGUgaW5wdXQgYWxvbmcgdGhlIGRpbWVuc2lvbnMgZ2l2ZW4gaW4gYGF4ZXNgLiBVbmxlc3MgYGtlZXBEaW1zYFxuICogaXMgdHJ1ZSwgdGhlIHJhbmsgb2YgdGhlIGB0Zi5UZW5zb3JgIGlzIHJlZHVjZWQgYnkgMSBmb3IgZWFjaCBlbnRyeSBpblxuICogYGF4ZXNgLiBJZiBga2VlcERpbXNgIGlzIHRydWUsIHRoZSByZWR1Y2VkIGRpbWVuc2lvbnMgYXJlIHJldGFpbmVkIHdpdGhcbiAqIGxlbmd0aCAxLiBJZiBgYXhlc2AgaGFzIG5vIGVudHJpZXMsIGFsbCBkaW1lbnNpb25zIGFyZSByZWR1Y2VkLCBhbmQgYW5cbiAqIGB0Zi5UZW5zb3JgIHdpdGggYSBzaW5nbGUgZWxlbWVudCBpcyByZXR1cm5lZC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLCAxLCAxXSwgJ2Jvb2wnKTtcbiAqXG4gKiB4LmFsbCgpLnByaW50KCk7ICAvLyBvciB0Zi5hbGwoeClcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMmQoWzEsIDEsIDAsIDBdLCBbMiwgMl0sICdib29sJyk7XG4gKlxuICogY29uc3QgYXhpcyA9IDE7XG4gKiB4LmFsbChheGlzKS5wcmludCgpOyAgLy8gb3IgdGYuYWxsKHgsIGF4aXMpXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLiBNdXN0IGJlIG9mIGR0eXBlIGJvb2wuXG4gKiBAcGFyYW0gYXhpcyBUaGUgZGltZW5zaW9uKHMpIHRvIHJlZHVjZS4gQnkgZGVmYXVsdCBpdCByZWR1Y2VzXG4gKiAgICAgYWxsIGRpbWVuc2lvbnMuXG4gKiBAcGFyYW0ga2VlcERpbXMgSWYgdHJ1ZSwgcmV0YWlucyByZWR1Y2VkIGRpbWVuc2lvbnMgd2l0aCBzaXplIDEuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnUmVkdWN0aW9uJ31cbiAqL1xuZnVuY3Rpb24gYWxsXyh4LCBheGlzID0gbnVsbCwga2VlcERpbXMgPSBmYWxzZSkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2FsbCcsICdib29sJyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBheGlzLCBrZWVwRGltcyB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEFsbCwgaW5wdXRzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3QgYWxsID0gb3AoeyBhbGxfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YWxsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBBbnkgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyB0aGUgbG9naWNhbCBvciBvZiBlbGVtZW50cyBhY3Jvc3MgZGltZW5zaW9ucyBvZiBhIGB0Zi5UZW5zb3JgLlxuICpcbiAqIFJlZHVjZXMgdGhlIGlucHV0IGFsb25nIHRoZSBkaW1lbnNpb25zIGdpdmVuIGluIGBheGVzYC4gVW5sZXNzIGBrZWVwRGltc2BcbiAqIGlzIHRydWUsIHRoZSByYW5rIG9mIHRoZSBgdGYuVGVuc29yYCBpcyByZWR1Y2VkIGJ5IDEgZm9yIGVhY2ggZW50cnkgaW5cbiAqIGBheGVzYC4gSWYgYGtlZXBEaW1zYCBpcyB0cnVlLCB0aGUgcmVkdWNlZCBkaW1lbnNpb25zIGFyZSByZXRhaW5lZCB3aXRoXG4gKiBsZW5ndGggMS4gSWYgYGF4ZXNgIGhhcyBubyBlbnRyaWVzLCBhbGwgZGltZW5zaW9ucyBhcmUgcmVkdWNlZCwgYW5kIGFuXG4gKiBgdGYuVGVuc29yYCB3aXRoIGEgc2luZ2xlIGVsZW1lbnQgaXMgcmV0dXJuZWQuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMSwgMSwgMV0sICdib29sJyk7XG4gKlxuICogeC5hbnkoKS5wcmludCgpOyAgLy8gb3IgdGYuYW55KHgpXG4gKiBgYGBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjJkKFsxLCAxLCAwLCAwXSwgWzIsIDJdLCAnYm9vbCcpO1xuICpcbiAqIGNvbnN0IGF4aXMgPSAxO1xuICogeC5hbnkoYXhpcykucHJpbnQoKTsgIC8vIG9yIHRmLmFueSh4LCBheGlzKVxuICogYGBgXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci4gTXVzdCBiZSBvZiBkdHlwZSBib29sLlxuICogQHBhcmFtIGF4aXMgVGhlIGRpbWVuc2lvbihzKSB0byByZWR1Y2UuIEJ5IGRlZmF1bHQgaXQgcmVkdWNlc1xuICogICAgIGFsbCBkaW1lbnNpb25zLlxuICogQHBhcmFtIGtlZXBEaW1zIElmIHRydWUsIHJldGFpbnMgcmVkdWNlZCBkaW1lbnNpb25zIHdpdGggc2l6ZSAxLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ1JlZHVjdGlvbid9XG4gKi9cbmZ1bmN0aW9uIGFueV8oeCwgYXhpcyA9IG51bGwsIGtlZXBEaW1zID0gZmFsc2UpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdhbnknLCAnYm9vbCcpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICBjb25zdCBhdHRycyA9IHsgYXhpcywga2VlcERpbXMgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChBbnksIGlucHV0cywgYXR0cnMpO1xufVxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnZhcmlhYmxlLW5hbWVcbmV4cG9ydCBjb25zdCBhbnkgPSBvcCh7IGFueV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hbnkuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IEFyZ01heCB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIFJldHVybnMgdGhlIGluZGljZXMgb2YgdGhlIG1heGltdW0gdmFsdWVzIGFsb25nIGFuIGBheGlzYC5cbiAqXG4gKiBUaGUgcmVzdWx0IGhhcyB0aGUgc2FtZSBzaGFwZSBhcyBgaW5wdXRgIHdpdGggdGhlIGRpbWVuc2lvbiBhbG9uZyBgYXhpc2BcbiAqIHJlbW92ZWQuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMSwgMiwgM10pO1xuICpcbiAqIHguYXJnTWF4KCkucHJpbnQoKTsgIC8vIG9yIHRmLmFyZ01heCh4KVxuICogYGBgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IyZChbMSwgMiwgNCwgM10sIFsyLCAyXSk7XG4gKlxuICogY29uc3QgYXhpcyA9IDE7XG4gKiB4LmFyZ01heChheGlzKS5wcmludCgpOyAgLy8gb3IgdGYuYXJnTWF4KHgsIGF4aXMpXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICogQHBhcmFtIGF4aXMgVGhlIGRpbWVuc2lvbiB0byByZWR1Y2UuIERlZmF1bHRzIHRvIDAgKG91dGVyLW1vc3QgZGltZW5zaW9uKS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdSZWR1Y3Rpb24nfVxuICovXG5mdW5jdGlvbiBhcmdNYXhfKHgsIGF4aXMgPSAwKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnYXJnTWF4Jyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBheGlzIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoQXJnTWF4LCBpbnB1dHMsIGF0dHJzKTtcbn1cbmV4cG9ydCBjb25zdCBhcmdNYXggPSBvcCh7IGFyZ01heF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hcmdfbWF4LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBBcmdNaW4gfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSBpbmRpY2VzIG9mIHRoZSBtaW5pbXVtIHZhbHVlcyBhbG9uZyBhbiBgYXhpc2AuXG4gKlxuICogVGhlIHJlc3VsdCBoYXMgdGhlIHNhbWUgc2hhcGUgYXMgYGlucHV0YCB3aXRoIHRoZSBkaW1lbnNpb24gYWxvbmcgYGF4aXNgXG4gKiByZW1vdmVkLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIDNdKTtcbiAqXG4gKiB4LmFyZ01pbigpLnByaW50KCk7ICAvLyBvciB0Zi5hcmdNaW4oeClcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMmQoWzEsIDIsIDQsIDNdLCBbMiwgMl0pO1xuICpcbiAqIGNvbnN0IGF4aXMgPSAxO1xuICogeC5hcmdNaW4oYXhpcykucHJpbnQoKTsgIC8vIG9yIHRmLmFyZ01pbih4LCBheGlzKVxuICogYGBgXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqIEBwYXJhbSBheGlzIFRoZSBkaW1lbnNpb24gdG8gcmVkdWNlLiBEZWZhdWx0cyB0byAwIChvdXRlci1tb3N0IGRpbWVuc2lvbikuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnUmVkdWN0aW9uJ31cbiAqL1xuZnVuY3Rpb24gYXJnTWluXyh4LCBheGlzID0gMCkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2FyZ01pbicpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICBjb25zdCBhdHRycyA9IHsgYXhpcyB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEFyZ01pbiwgaW5wdXRzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3QgYXJnTWluID0gb3AoeyBhcmdNaW5fIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXJnX21pbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG4vKipcbiAqIEdldHMgdGhlIG5ldyBzaGFwZSBvZiB0aGUgaW5wdXQgVGVuc29yIGFmdGVyIGl0J3MgYmVlbiByZXNoYXBlZFxuICogdG86XG4gKiBbYmxvY2tTaGFwZVswXSwgLi4uLCBibG9ja1NoYXBlW00tMV0sIGJhdGNoIC8gcHJvZChibG9ja1NoYXBlKSxcbiAqIGlucHV0U2hhcGVbMV0sIC4uLiwgaW5wdXRTaGFwZVtOLTFdXVxuICpcbiAqIFNlZSBzdGVwIDE6IGh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9iYXRjaF90b19zcGFjZV9uZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVzaGFwZWQoaW5wdXRTaGFwZSwgYmxvY2tTaGFwZSwgcHJvZCwgYmF0Y2hUb1NwYWNlID0gdHJ1ZSkge1xuICAgIGxldCByZXNoYXBlZCA9IFtdO1xuICAgIGlmIChiYXRjaFRvU3BhY2UpIHtcbiAgICAgICAgcmVzaGFwZWQgPSByZXNoYXBlZC5jb25jYXQoYmxvY2tTaGFwZS5zbGljZSgwKSk7XG4gICAgICAgIHJlc2hhcGVkLnB1c2goaW5wdXRTaGFwZVswXSAvIHByb2QpO1xuICAgICAgICByZXNoYXBlZCA9IHJlc2hhcGVkLmNvbmNhdChpbnB1dFNoYXBlLnNsaWNlKDEpKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJlc2hhcGVkID0gcmVzaGFwZWQuY29uY2F0KGlucHV0U2hhcGVbMF0pO1xuICAgICAgICBjb25zdCBzcGF0aWFsTGVuZ3RoID0gYmxvY2tTaGFwZS5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3BhdGlhbExlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICByZXNoYXBlZCA9XG4gICAgICAgICAgICAgICAgcmVzaGFwZWQuY29uY2F0KFtpbnB1dFNoYXBlW2kgKyAxXSAvIGJsb2NrU2hhcGVbaV0sIGJsb2NrU2hhcGVbaV1dKTtcbiAgICAgICAgfVxuICAgICAgICByZXNoYXBlZCA9IHJlc2hhcGVkLmNvbmNhdChpbnB1dFNoYXBlLnNsaWNlKHNwYXRpYWxMZW5ndGggKyAxKSk7XG4gICAgfVxuICAgIHJldHVybiByZXNoYXBlZDtcbn1cbi8qKlxuICogR2V0cyB0aGUgcGVybXV0YXRpb24gdGhhdCB3aWxsIHRyYW5zcG9zZSB0aGUgZGltZW5zaW9ucyBvZiB0aGVcbiAqIHJlc2hhcGVkIHRlbnNvciB0byBzaGFwZTpcbiAqXG4gKiBbYmF0Y2ggLyBwcm9kKGJsb2NrX3NoYXBlKSxpbnB1dFNoYXBlWzFdLCBibG9ja1NoYXBlWzBdLCAuLi4sXG4gKiBpbnB1dFNoYXBlW01dLCBibG9ja1NoYXBlW00tMV0saW5wdXRTaGFwZVtNKzFdLCAuLi4sIGlucHV0U2hhcGVbTi0xXV1cbiAqXG4gKiBzZWUgc3RlcCAyOiBodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvYmF0Y2hfdG9fc3BhY2VfbmRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBlcm11dGVkKHJlc2hhcGVkUmFuaywgYmxvY2tTaGFwZVJhbmssIGJhdGNoVG9TcGFjZSA9IHRydWUpIHtcbiAgICBjb25zdCBwZXJtdXRlZCA9IFtdO1xuICAgIGlmIChiYXRjaFRvU3BhY2UpIHtcbiAgICAgICAgcGVybXV0ZWQucHVzaChibG9ja1NoYXBlUmFuayk7XG4gICAgICAgIGZvciAobGV0IGkgPSBibG9ja1NoYXBlUmFuayArIDE7IGkgPCByZXNoYXBlZFJhbms7ICsraSkge1xuICAgICAgICAgICAgaWYgKGkgPD0gMiAqIGJsb2NrU2hhcGVSYW5rKSB7XG4gICAgICAgICAgICAgICAgcGVybXV0ZWQucHVzaChpKTtcbiAgICAgICAgICAgICAgICBwZXJtdXRlZC5wdXNoKGkgLSAoYmxvY2tTaGFwZVJhbmsgKyAxKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBwZXJtdXRlZC5wdXNoKGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBwZXJtdXRlZEJlZm9yZUJhdGNoID0gW107XG4gICAgICAgIGNvbnN0IHBlcm11dGVkQWZ0ZXJCYXRjaCA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHJlc2hhcGVkUmFuazsgKytpKSB7XG4gICAgICAgICAgICBpZiAoaSA+PSBibG9ja1NoYXBlUmFuayAqIDIgKyAxIHx8IGkgJSAyID09PSAxKSB7XG4gICAgICAgICAgICAgICAgcGVybXV0ZWRBZnRlckJhdGNoLnB1c2goaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBwZXJtdXRlZEJlZm9yZUJhdGNoLnB1c2goaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcGVybXV0ZWQucHVzaCguLi5wZXJtdXRlZEJlZm9yZUJhdGNoKTtcbiAgICAgICAgcGVybXV0ZWQucHVzaCgwKTtcbiAgICAgICAgcGVybXV0ZWQucHVzaCguLi5wZXJtdXRlZEFmdGVyQmF0Y2gpO1xuICAgIH1cbiAgICByZXR1cm4gcGVybXV0ZWQ7XG59XG4vKipcbiAqIEdldHMgdGhlIHNoYXBlIG9mIHRoZSByZXNoYXBlZCBhbmQgcGVybXV0ZWQgaW5wdXQgVGVuc29yIGJlZm9yZSBhbnkgY3JvcHBpbmdcbiAqIGlzIGFwcGxpZWQuICBUaGUgbmV3IHNoYXBlIHdpbGwgYmU6XG4gKlxuICogW2JhdGNoIC8gcHJvZChibG9ja1NoYXBlKSxpbnB1dFNoYXBlWzFdICogYmxvY2tTaGFwZVswXSwgLi4uLFxuICogaW5wdXRTaGFwZVtNXSAqIGJsb2NrU2hhcGVbTS0xXSxpbnB1dFNoYXBlW00rMV0sIC4uLiwgaW5wdXRTaGFwZVtOLTFdXVxuICpcbiAqIFNlZSBzdGVwIDM6IGh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9iYXRjaF90b19zcGFjZV9uZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVzaGFwZWRQZXJtdXRlZChpbnB1dFNoYXBlLCBibG9ja1NoYXBlLCBwcm9kLCBiYXRjaFRvU3BhY2UgPSB0cnVlKSB7XG4gICAgY29uc3QgcmVzaGFwZWRQZXJtdXRlZCA9IFtdO1xuICAgIGlmIChiYXRjaFRvU3BhY2UpIHtcbiAgICAgICAgcmVzaGFwZWRQZXJtdXRlZC5wdXNoKGlucHV0U2hhcGVbMF0gLyBwcm9kKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJlc2hhcGVkUGVybXV0ZWQucHVzaChpbnB1dFNoYXBlWzBdICogcHJvZCk7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgaW5wdXRTaGFwZS5sZW5ndGg7ICsraSkge1xuICAgICAgICBpZiAoaSA8PSBibG9ja1NoYXBlLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKGJhdGNoVG9TcGFjZSkge1xuICAgICAgICAgICAgICAgIHJlc2hhcGVkUGVybXV0ZWQucHVzaChibG9ja1NoYXBlW2kgLSAxXSAqIGlucHV0U2hhcGVbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzaGFwZWRQZXJtdXRlZC5wdXNoKGlucHV0U2hhcGVbaV0gLyBibG9ja1NoYXBlW2kgLSAxXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXNoYXBlZFBlcm11dGVkLnB1c2goaW5wdXRTaGFwZVtpXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc2hhcGVkUGVybXV0ZWQ7XG59XG4vKipcbiAqIENvbnZlcnRzIHRoZSBjcm9wcyBhcmd1bWVudCBpbnRvIHRoZSBiZWdpbm5pbmcgY29vcmRpbmF0ZXMgb2YgYSBzbGljZVxuICogb3BlcmF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2xpY2VCZWdpbkNvb3Jkcyhjcm9wcywgYmxvY2tTaGFwZSkge1xuICAgIGNvbnN0IHNsaWNlQmVnaW5Db29yZHMgPSBbMF07XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBibG9ja1NoYXBlOyArK2kpIHtcbiAgICAgICAgc2xpY2VCZWdpbkNvb3Jkcy5wdXNoKGNyb3BzW2ldWzBdKTtcbiAgICB9XG4gICAgcmV0dXJuIHNsaWNlQmVnaW5Db29yZHM7XG59XG4vKipcbiAqIENvbnZlcnRzIHRoZSBjcm9wcyBhcmd1bWVudCBpbnRvIHRoZSBzaXplIG9mIGEgc2xpY2Ugb3BlcmF0aW9uLiAgV2hlblxuICogY29tYmluZWQgd2l0aCBnZXRTbGljZUJlZ2luQ29vcmRzIHRoaXMgZnVuY3Rpb24gYWxsb3dzIHRoZSByZXNoYXBlZCBhbmRcbiAqIHBlcm11dGVkIFRlbnNvciB0byBiZSBjcm9wcGVkIHRvIGl0cyBmaW5hbCBvdXRwdXQgc2hhcGUgb2Y6XG4gKlxuICogaW5wdXRTaGFwZVsxXSAqIGJsb2NrU2hhcGVbMF0gLSBjcm9wc1swLDBdIC0gY3JvcHNbMCwxXSwgLi4uLFxuICogaW5wdXRTaGFwZVtNXSAqIGJsb2NrU2hhcGVbTS0xXSAtY3JvcHNbTS0xLDBdIC1cbiAqIGNyb3BzW00tMSwxXSxpbnB1dFNoYXBlW00rMV0sIC4uLiwgaW5wdXRTaGFwZVtOLTFdXVxuICpcbiAqIFNlZSBzdGVwIDQ6IGh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9iYXRjaF90b19zcGFjZV9uZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2xpY2VTaXplKHVuY3JvcHBlZFNoYXBlLCBjcm9wcywgYmxvY2tTaGFwZSkge1xuICAgIGNvbnN0IHNsaWNlU2l6ZSA9IHVuY3JvcHBlZFNoYXBlLnNsaWNlKDAsIDEpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmxvY2tTaGFwZTsgKytpKSB7XG4gICAgICAgIHNsaWNlU2l6ZS5wdXNoKHVuY3JvcHBlZFNoYXBlW2kgKyAxXSAtIGNyb3BzW2ldWzBdIC0gY3JvcHNbaV1bMV0pO1xuICAgIH1cbiAgICByZXR1cm4gc2xpY2VTaXplO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXJyYXlfb3BzX3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IEFzaW4gfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyBhc2luIG9mIHRoZSBpbnB1dCBgdGYuVGVuc29yYCBlbGVtZW50LXdpc2U6IGBhc2luKHgpYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzAsIDEsIC0xLCAuN10pO1xuICpcbiAqIHguYXNpbigpLnByaW50KCk7ICAvLyBvciB0Zi5hc2luKHgpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gYXNpbl8oeCkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2FzaW4nKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IHg6ICR4IH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoQXNpbiwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBhc2luID0gb3AoeyBhc2luXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFzaW4uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IEFzaW5oIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgaW52ZXJzZSBoeXBlcmJvbGljIHNpbiBvZiB0aGUgaW5wdXQgYHRmLlRlbnNvcmAgZWxlbWVudC13aXNlOlxuICogYGFzaW5oKHgpYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzAsIDEsIC0xLCAuN10pO1xuICpcbiAqIHguYXNpbmgoKS5wcmludCgpOyAgLy8gb3IgdGYuYXNpbmgoeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gYXNpbmhfKHgpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdhc2luaCcpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChBc2luaCwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBhc2luaCA9IG9wKHsgYXNpbmhfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXNpbmguanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IEF0YW4gfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyBhdGFuIG9mIHRoZSBpbnB1dCBgdGYuVGVuc29yYCBlbGVtZW50LXdpc2U6IGBhdGFuKHgpYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzAsIDEsIC0xLCAuN10pO1xuICpcbiAqIHguYXRhbigpLnByaW50KCk7ICAvLyBvciB0Zi5hdGFuKHgpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMgbWF0aCd9XG4gKi9cbmZ1bmN0aW9uIGF0YW5fKHgpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdhdGFuJyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEF0YW4sIGlucHV0cyk7XG59XG5leHBvcnQgY29uc3QgYXRhbiA9IG9wKHsgYXRhbl8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hdGFuLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBBdGFuMiB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBtYWtlVHlwZXNNYXRjaCB9IGZyb20gJy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgYXJjdGFuZ2VudCBvZiBgdGYuVGVuc29yYHMgYSAvIGIgZWxlbWVudC13aXNlOiBgYXRhbjIoYSwgYilgLlxuICogU3VwcG9ydHMgYnJvYWRjYXN0aW5nLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzEuMCwgMS4wLCAtMS4wLCAuN10pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjFkKFsyLjAsIDEzLjAsIDMuNSwgLjIxXSk7XG4gKlxuICogdGYuYXRhbjIoYSwgYikucHJpbnQoKVxuICogYGBgXG4gKlxuICogQHBhcmFtIGEgVGhlIGZpcnN0IHRlbnNvci5cbiAqIEBwYXJhbSBiIFRoZSBzZWNvbmQgdGVuc29yLiBNdXN0IGhhdmUgdGhlIHNhbWUgZHR5cGUgYXMgYGFgLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiBhdGFuMl8oYSwgYikge1xuICAgIGxldCAkYSA9IGNvbnZlcnRUb1RlbnNvcihhLCAnYScsICdhdGFuMicpO1xuICAgIGxldCAkYiA9IGNvbnZlcnRUb1RlbnNvcihiLCAnYicsICdhdGFuMicpO1xuICAgIFskYSwgJGJdID0gbWFrZVR5cGVzTWF0Y2goJGEsICRiKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IGE6ICRhLCBiOiAkYiB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEF0YW4yLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IGF0YW4yID0gb3AoeyBhdGFuMl8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hdGFuMi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgQXRhbmggfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyBpbnZlcnNlIGh5cGVyYm9saWMgdGFuIG9mIHRoZSBpbnB1dCBgdGYuVGVuc29yYCBlbGVtZW50LXdpc2U6XG4gKiBgYXRhbmgoeClgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMCwgLjEsIC0uMSwgLjddKTtcbiAqXG4gKiB4LmF0YW5oKCkucHJpbnQoKTsgIC8vIG9yIHRmLmF0YW5oKHgpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMgbWF0aCd9XG4gKi9cbmZ1bmN0aW9uIGF0YW5oXyh4KSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnYXRhbmgnKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IHg6ICR4IH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoQXRhbmgsIGlucHV0cyk7XG59XG5leHBvcnQgY29uc3QgYXRhbmggPSBvcCh7IGF0YW5oXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWF0YW5oLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBBdmdQb29sIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgY2FzdCB9IGZyb20gJy4vY2FzdCc7XG5pbXBvcnQgKiBhcyBjb252X3V0aWwgZnJvbSAnLi9jb252X3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9yZXNoYXBlJztcbi8qKlxuICogQ29tcHV0ZXMgdGhlIDJEIGF2ZXJhZ2UgcG9vbGluZyBvZiBhbiBpbWFnZS5cbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLCBvZiByYW5rIDQgb3IgcmFuayAzIG9mIHNoYXBlXG4gKiAgICAgYFtiYXRjaCwgaGVpZ2h0LCB3aWR0aCwgaW5DaGFubmVsc11gLiBJZiByYW5rIDMsIGJhdGNoIG9mIDEgaXMgYXNzdW1lZC5cbiAqIEBwYXJhbSBmaWx0ZXJTaXplIFRoZSBmaWx0ZXIgc2l6ZTogYFtmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoXWAuIElmXG4gKiAgICAgYGZpbHRlclNpemVgIGlzIGEgc2luZ2xlIG51bWJlciwgdGhlbiBgZmlsdGVySGVpZ2h0ID09IGZpbHRlcldpZHRoYC5cbiAqIEBwYXJhbSBzdHJpZGVzIFRoZSBzdHJpZGVzIG9mIHRoZSBwb29saW5nOiBgW3N0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGhdYC4gSWZcbiAqICAgICBgc3RyaWRlc2AgaXMgYSBzaW5nbGUgbnVtYmVyLCB0aGVuIGBzdHJpZGVIZWlnaHQgPT0gc3RyaWRlV2lkdGhgLlxuICogQHBhcmFtIHBhZCBUaGUgdHlwZSBvZiBwYWRkaW5nIGFsZ29yaXRobTpcbiAqICAgIC0gYHNhbWVgIGFuZCBzdHJpZGUgMTogb3V0cHV0IHdpbGwgYmUgb2Ygc2FtZSBzaXplIGFzIGlucHV0LFxuICogICAgICAgcmVnYXJkbGVzcyBvZiBmaWx0ZXIgc2l6ZS5cbiAqICAgIC0gYHZhbGlkYDogb3V0cHV0IHdpbGwgYmUgc21hbGxlciB0aGFuIGlucHV0IGlmIGZpbHRlciBpcyBsYXJnZXJcbiAqICAgICAgIHRoYW4gMXgxLlxuICogICAgLSBGb3IgbW9yZSBpbmZvLCBzZWUgdGhpcyBndWlkZTpcbiAqICAgICBbaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uXShcbiAqICAgICAgICAgaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uKVxuICogQHBhcmFtIGRpbVJvdW5kaW5nTW9kZSBBIHN0cmluZyBmcm9tOiAnY2VpbCcsICdyb3VuZCcsICdmbG9vcicuIElmIG5vbmUgaXNcbiAqICAgICBwcm92aWRlZCwgaXQgd2lsbCBkZWZhdWx0IHRvIHRydW5jYXRlLlxuICovXG5mdW5jdGlvbiBhdmdQb29sXyh4LCBmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2F2Z1Bvb2wnLCAnZmxvYXQzMicpO1xuICAgIGNvbnN0IGRpbGF0aW9ucyA9IDE7XG4gICAgdXRpbC5hc3NlcnQoY29udl91dGlsLmVpdGhlclN0cmlkZXNPckRpbGF0aW9uc0FyZU9uZShzdHJpZGVzLCBkaWxhdGlvbnMpLCAoKSA9PiAnRXJyb3IgaW4gYXZnUG9vbDogRWl0aGVyIHN0cmlkZXMgb3IgZGlsYXRpb25zIG11c3QgYmUgMS4gJyArXG4gICAgICAgIGBHb3Qgc3RyaWRlcyAke3N0cmlkZXN9IGFuZCBkaWxhdGlvbnMgJyR7ZGlsYXRpb25zfSdgKTtcbiAgICBsZXQgeDREID0gJHg7XG4gICAgbGV0IHJlc2hhcGVkVG80RCA9IGZhbHNlO1xuICAgIGlmICgkeC5yYW5rID09PSAzKSB7XG4gICAgICAgIHJlc2hhcGVkVG80RCA9IHRydWU7XG4gICAgICAgIHg0RCA9IHJlc2hhcGUoJHgsIFsxLCAkeC5zaGFwZVswXSwgJHguc2hhcGVbMV0sICR4LnNoYXBlWzJdXSk7XG4gICAgfVxuICAgIHV0aWwuYXNzZXJ0KHg0RC5yYW5rID09PSA0LCAoKSA9PiBgRXJyb3IgaW4gYXZnUG9vbDogeCBtdXN0IGJlIHJhbmsgNCBidXQgZ290IHJhbmsgJHt4NEQucmFua30uYCk7XG4gICAgaWYgKGRpbVJvdW5kaW5nTW9kZSAhPSBudWxsKSB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KHV0aWwuaXNJbnQocGFkKSwgKCkgPT4gYEVycm9yIGluIGF2Z1Bvb2w6IHBhZCBtdXN0IGJlIGFuIGludGVnZXIgd2hlbiB1c2luZywgYCArXG4gICAgICAgICAgICBgZGltUm91bmRpbmdNb2RlICR7ZGltUm91bmRpbmdNb2RlfSBidXQgZ290IHBhZCAke3BhZH0uYCk7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogeDREIH07XG4gICAgY29uc3QgYXR0cnMgPSB7IGZpbHRlclNpemUsIHN0cmlkZXMsIHBhZCwgZGltUm91bmRpbmdNb2RlIH07XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICAgIGxldCByZXMgPSBFTkdJTkUucnVuS2VybmVsKEF2Z1Bvb2wsIGlucHV0cywgYXR0cnMpO1xuICAgIHJlcyA9IGNhc3QocmVzLCAkeC5kdHlwZSk7XG4gICAgaWYgKHJlc2hhcGVkVG80RCkge1xuICAgICAgICByZXR1cm4gcmVzaGFwZShyZXMsIFtyZXMuc2hhcGVbMV0sIHJlcy5zaGFwZVsyXSwgcmVzLnNoYXBlWzNdXSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG5leHBvcnQgY29uc3QgYXZnUG9vbCA9IG9wKHsgYXZnUG9vbF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hdmdfcG9vbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgQXZnUG9vbDNEIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgY2FzdCB9IGZyb20gJy4vY2FzdCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL3Jlc2hhcGUnO1xuLyoqXG4gKiBDb21wdXRlcyB0aGUgM0QgYXZlcmFnZSBwb29saW5nLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yNWQoWzEsIDIsIDMsIDQsIDUsIDYsIDcsIDhdLCBbMSwgMiwgMiwgMiwgMV0pO1xuICogY29uc3QgcmVzdWx0ID0gdGYuYXZnUG9vbDNkKHgsIDIsIDEsICd2YWxpZCcpO1xuICogcmVzdWx0LnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLCBvZiByYW5rIDUgb3IgcmFuayA0IG9mIHNoYXBlXG4gKiAgICAgYFtiYXRjaCwgZGVwdGgsIGhlaWdodCwgd2lkdGgsIGluQ2hhbm5lbHNdYC5cbiAqIEBwYXJhbSBmaWx0ZXJTaXplIFRoZSBmaWx0ZXIgc2l6ZTpcbiAqICAgICBgW2ZpbHRlckRlcHRoLCBmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoXWAuXG4gKiAgICAgSWYgYGZpbHRlclNpemVgIGlzIGEgc2luZ2xlIG51bWJlcixcbiAqICAgICB0aGVuIGBmaWx0ZXJEZXB0aCA9PSBmaWx0ZXJIZWlnaHQgPT0gZmlsdGVyV2lkdGhgLlxuICogQHBhcmFtIHN0cmlkZXMgVGhlIHN0cmlkZXMgb2YgdGhlIHBvb2xpbmc6XG4gKiAgICAgYFtzdHJpZGVEZXB0aCwgc3RyaWRlSGVpZ2h0LCBzdHJpZGVXaWR0aF1gLlxuICogICAgIElmIGBzdHJpZGVzYCBpcyBhIHNpbmdsZSBudW1iZXIsXG4gKiAgICAgdGhlbiBgc3RyaWRlRGVwdGggPT0gc3RyaWRlSGVpZ2h0ID09IHN0cmlkZVdpZHRoYC5cbiAqIEBwYXJhbSBwYWQgVGhlIHR5cGUgb2YgcGFkZGluZyBhbGdvcml0aG0uXG4gKiAgICAtIGBzYW1lYCBhbmQgc3RyaWRlIDE6IG91dHB1dCB3aWxsIGJlIG9mIHNhbWUgc2l6ZSBhcyBpbnB1dCxcbiAqICAgICAgIHJlZ2FyZGxlc3Mgb2YgZmlsdGVyIHNpemUuXG4gKiAgICAtIGB2YWxpZGA6IG91dHB1dCB3aWxsIGJlIHNtYWxsZXIgdGhhbiBpbnB1dCBpZiBmaWx0ZXIgaXMgbGFyZ2VyXG4gKiAgICAgICB0aGFuIDEqMXgxLlxuICogICAgLSBGb3IgbW9yZSBpbmZvLCBzZWUgdGhpcyBndWlkZTpcbiAqICAgICBbaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uXShcbiAqICAgICAgICAgIGh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9jb252b2x1dGlvbilcbiAqIEBwYXJhbSBkaW1Sb3VuZGluZ01vZGUgQSBzdHJpbmcgZnJvbTogJ2NlaWwnLCAncm91bmQnLCAnZmxvb3InLiBJZiBub25lIGlzXG4gKiAgICAgcHJvdmlkZWQsIGl0IHdpbGwgZGVmYXVsdCB0byB0cnVuY2F0ZS5cbiAqIEBwYXJhbSBkYXRhRm9ybWF0IEFuIG9wdGlvbmFsIHN0cmluZyBmcm9tOiBcIk5ESFdDXCIsIFwiTkNESFdcIi4gRGVmYXVsdHMgdG9cbiAqICAgICBcIk5ESFdDXCIuIFNwZWNpZnkgdGhlIGRhdGEgZm9ybWF0IG9mIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGRhdGEuIFdpdGggdGhlXG4gKiAgICAgZGVmYXVsdCBmb3JtYXQgXCJOREhXQ1wiLCB0aGUgZGF0YSBpcyBzdG9yZWQgaW4gdGhlIG9yZGVyIG9mOiBbYmF0Y2gsXG4gKiAgICAgZGVwdGgsIGhlaWdodCwgd2lkdGgsIGNoYW5uZWxzXS4gT25seSBcIk5ESFdDXCIgaXMgY3VycmVudGx5IHN1cHBvcnRlZC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdDb252b2x1dGlvbid9XG4gKi9cbmZ1bmN0aW9uIGF2Z1Bvb2wzZF8oeCwgZmlsdGVyU2l6ZSwgc3RyaWRlcywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIGRhdGFGb3JtYXQgPSAnTkRIV0MnKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnYXZnUG9vbDNkJywgJ2Zsb2F0MzInKTtcbiAgICBsZXQgeDVEID0gJHg7XG4gICAgbGV0IHJlc2hhcGVkVG81RCA9IGZhbHNlO1xuICAgIGlmICgkeC5yYW5rID09PSA0KSB7XG4gICAgICAgIHJlc2hhcGVkVG81RCA9IHRydWU7XG4gICAgICAgIHg1RCA9IHJlc2hhcGUoJHgsIFsxLCAkeC5zaGFwZVswXSwgJHguc2hhcGVbMV0sICR4LnNoYXBlWzJdLCAkeC5zaGFwZVszXV0pO1xuICAgIH1cbiAgICB1dGlsLmFzc2VydCh4NUQucmFuayA9PT0gNSwgKCkgPT4gYEVycm9yIGluIGF2Z1Bvb2wzZDogeCBtdXN0IGJlIHJhbmsgNSBidXQgZ290IHJhbmsgJHt4NUQucmFua30uYCk7XG4gICAgdXRpbC5hc3NlcnQoZGF0YUZvcm1hdCA9PT0gJ05ESFdDJywgKCkgPT4gYEVycm9yIGluIGF2Z1Bvb2wzZDogT25seSBOREhXQyBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLCBgICtcbiAgICAgICAgYGJ1dCBnb3QgZGF0YUZvcm1hdCBvZiAke2RhdGFGb3JtYXR9YCk7XG4gICAgaWYgKGRpbVJvdW5kaW5nTW9kZSAhPSBudWxsKSB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KHV0aWwuaXNJbnQocGFkKSwgKCkgPT4gYEVycm9yIGluIGF2Z1Bvb2wzZDogcGFkIG11c3QgYmUgYW4gaW50ZWdlciB3aGVuIHVzaW5nLCBgICtcbiAgICAgICAgICAgIGBkaW1Sb3VuZGluZ01vZGUgJHtkaW1Sb3VuZGluZ01vZGV9IGJ1dCBnb3QgcGFkICR7cGFkfS5gKTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiB4NUQgfTtcbiAgICBjb25zdCBhdHRycyA9IHsgZmlsdGVyU2l6ZSwgc3RyaWRlcywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIGRhdGFGb3JtYXQgfTtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgbGV0IHJlcyA9IEVOR0lORS5ydW5LZXJuZWwoQXZnUG9vbDNELCBpbnB1dHMsIGF0dHJzKTtcbiAgICByZXMgPSBjYXN0KHJlcywgeDVELmR0eXBlKTtcbiAgICBpZiAocmVzaGFwZWRUbzVEKSB7XG4gICAgICAgIHJldHVybiByZXNoYXBlKHJlcywgW3Jlcy5zaGFwZVsxXSwgcmVzLnNoYXBlWzJdLCByZXMuc2hhcGVbM10sIHJlcy5zaGFwZVs0XV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufVxuZXhwb3J0IGNvbnN0IGF2Z1Bvb2wzZCA9IG9wKHsgYXZnUG9vbDNkXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWF2Z19wb29sXzNkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgYXhpcyBzcGVjaWZpZXMgdGhlIGlubmVyIG1vc3QgZGltZW5zaW9ucyBvZiB0aGVcbiAqIGFycmF5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXhlc0FyZUlubmVyTW9zdERpbXMoYXhlcywgcmFuaykge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXhlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICBpZiAoYXhlc1theGVzLmxlbmd0aCAtIGkgLSAxXSAhPT0gcmFuayAtIDEgLSBpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5leHBvcnQgZnVuY3Rpb24gY29tYmluZUxvY2F0aW9ucyhvdXRwdXRMb2MsIHJlZHVjZUxvYywgYXhlcykge1xuICAgIGNvbnN0IHJhbmsgPSBvdXRwdXRMb2MubGVuZ3RoICsgcmVkdWNlTG9jLmxlbmd0aDtcbiAgICBjb25zdCBsb2MgPSBbXTtcbiAgICBsZXQgb3V0SWR4ID0gMDtcbiAgICBsZXQgcmVkdWNlSWR4ID0gMDtcbiAgICBmb3IgKGxldCBkaW0gPSAwOyBkaW0gPCByYW5rOyBkaW0rKykge1xuICAgICAgICBpZiAoYXhlcy5pbmRleE9mKGRpbSkgPT09IC0xKSB7XG4gICAgICAgICAgICBsb2MucHVzaChvdXRwdXRMb2Nbb3V0SWR4KytdKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxvYy5wdXNoKHJlZHVjZUxvY1tyZWR1Y2VJZHgrK10pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBsb2M7XG59XG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZU91dEFuZFJlZHVjZVNoYXBlcyhhU2hhcGUsIGF4ZXMpIHtcbiAgICBjb25zdCBvdXRTaGFwZSA9IFtdO1xuICAgIGNvbnN0IHJhbmsgPSBhU2hhcGUubGVuZ3RoO1xuICAgIGZvciAobGV0IGRpbSA9IDA7IGRpbSA8IHJhbms7IGRpbSsrKSB7XG4gICAgICAgIGlmIChheGVzLmluZGV4T2YoZGltKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIG91dFNoYXBlLnB1c2goYVNoYXBlW2RpbV0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlZHVjZVNoYXBlID0gYXhlcy5tYXAoZGltID0+IGFTaGFwZVtkaW1dKTtcbiAgICByZXR1cm4gW291dFNoYXBlLCByZWR1Y2VTaGFwZV07XG59XG5leHBvcnQgZnVuY3Rpb24gZXhwYW5kU2hhcGVUb0tlZXBEaW0oc2hhcGUsIGF4ZXMpIHtcbiAgICBjb25zdCByZWR1Y2VTdWJTaGFwZSA9IGF4ZXMubWFwKHggPT4gMSk7XG4gICAgcmV0dXJuIGNvbWJpbmVMb2NhdGlvbnMoc2hhcGUsIHJlZHVjZVN1YlNoYXBlLCBheGVzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRBeGVzQXJlSW5uZXJNb3N0RGltcyhtc2csIGF4ZXMsIHJhbmspIHtcbiAgICB1dGlsLmFzc2VydChheGVzQXJlSW5uZXJNb3N0RGltcyhheGVzLCByYW5rKSwgKCkgPT4gYCR7bXNnfSBzdXBwb3J0cyBvbmx5IGlubmVyLW1vc3QgYXhlcyBmb3Igbm93LiBgICtcbiAgICAgICAgYEdvdCBheGVzICR7YXhlc30gYW5kIHJhbmstJHtyYW5rfSBpbnB1dC5gKTtcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgYXhlcyBwZXJtdXRhdGlvbiB0byBiZSB1c2VkIHdpdGggYHRmLnRyYW5zcG9zZWAsIGlmIHN1Y2hcbiAqIHBlcm11dGF0aW9uIGlzIG5lY2Vzc2FyeS4gT3RoZXJ3aXNlIGl0IHJldHVybnMgbnVsbC4gVGhpcyBtZXRob2QgaXMgdXNlZCBieVxuICogb3BlcmF0aW9ucyB0aGF0IG9wZXJhdGUgb25seSBvbiBpbm5lci1tb3N0IGF4ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBeGVzUGVybXV0YXRpb24oYXhlcywgcmFuaykge1xuICAgIGlmIChheGVzQXJlSW5uZXJNb3N0RGltcyhheGVzLCByYW5rKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByYW5rOyArK2kpIHtcbiAgICAgICAgaWYgKGF4ZXMuaW5kZXhPZihpKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGF4ZXMuZm9yRWFjaChheGlzID0+IHJlc3VsdC5wdXNoKGF4aXMpKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLyoqIFJldHVybnMgdGhlIGF4ZXMgcGVybXV0YXRpb24gdGhhdCB1bmRvZXMgdGhlIG9yaWdpbmFsIHBlcm11dGF0aW9uLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFVuZG9BeGVzUGVybXV0YXRpb24oYXhlcykge1xuICAgIHJldHVybiBheGVzLm1hcCgoYXhpcywgaSkgPT4gW2ksIGF4aXNdKVxuICAgICAgICAuc29ydCgoYSwgYikgPT4gYVsxXSAtIGJbMV0pXG4gICAgICAgIC5tYXAoeCA9PiB4WzBdKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbm5lck1vc3RBeGVzKG51bUF4ZXMsIHJhbmspIHtcbiAgICBjb25zdCByZXMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gcmFuayAtIG51bUF4ZXM7IGkgPCByYW5rOyArK2kpIHtcbiAgICAgICAgcmVzLnB1c2goaSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1heGlzX3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IGFkZCB9IGZyb20gJy4vYWRkJztcbmltcG9ydCB7IGNvbmNhdCB9IGZyb20gJy4vY29uY2F0JztcbmltcG9ydCB7IG1hdE11bCB9IGZyb20gJy4vbWF0X211bCc7XG5pbXBvcnQgeyBtdWwgfSBmcm9tICcuL211bCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHNpZ21vaWQgfSBmcm9tICcuL3NpZ21vaWQnO1xuaW1wb3J0IHsgc2xpY2UgfSBmcm9tICcuL3NsaWNlJztcbmltcG9ydCB7IHRhbmggfSBmcm9tICcuL3RhbmgnO1xuLyoqXG4gKiBDb21wdXRlcyB0aGUgbmV4dCBzdGF0ZSBhbmQgb3V0cHV0IG9mIGEgQmFzaWNMU1RNQ2VsbC5cbiAqXG4gKiBSZXR1cm5zIGBbbmV3QywgbmV3SF1gLlxuICpcbiAqIERlcml2ZWQgZnJvbSB0Zi5jb250cmliLnJubi5CYXNpY0xTVE1DZWxsLlxuICpcbiAqIEBwYXJhbSBmb3JnZXRCaWFzIEZvcmdldCBiaWFzIGZvciB0aGUgY2VsbC5cbiAqIEBwYXJhbSBsc3RtS2VybmVsIFRoZSB3ZWlnaHRzIGZvciB0aGUgY2VsbC5cbiAqIEBwYXJhbSBsc3RtQmlhcyBUaGUgYmlhcyBmb3IgdGhlIGNlbGwuXG4gKiBAcGFyYW0gZGF0YSBUaGUgaW5wdXQgdG8gdGhlIGNlbGwuXG4gKiBAcGFyYW0gYyBQcmV2aW91cyBjZWxsIHN0YXRlLlxuICogQHBhcmFtIGggUHJldmlvdXMgY2VsbCBvdXRwdXQuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnUk5OJ31cbiAqL1xuZnVuY3Rpb24gYmFzaWNMU1RNQ2VsbF8oZm9yZ2V0QmlhcywgbHN0bUtlcm5lbCwgbHN0bUJpYXMsIGRhdGEsIGMsIGgpIHtcbiAgICBjb25zdCAkZm9yZ2V0QmlhcyA9IGNvbnZlcnRUb1RlbnNvcihmb3JnZXRCaWFzLCAnZm9yZ2V0QmlhcycsICdiYXNpY0xTVE1DZWxsJyk7XG4gICAgY29uc3QgJGxzdG1LZXJuZWwgPSBjb252ZXJ0VG9UZW5zb3IobHN0bUtlcm5lbCwgJ2xzdG1LZXJuZWwnLCAnYmFzaWNMU1RNQ2VsbCcpO1xuICAgIGNvbnN0ICRsc3RtQmlhcyA9IGNvbnZlcnRUb1RlbnNvcihsc3RtQmlhcywgJ2xzdG1CaWFzJywgJ2Jhc2ljTFNUTUNlbGwnKTtcbiAgICBjb25zdCAkZGF0YSA9IGNvbnZlcnRUb1RlbnNvcihkYXRhLCAnZGF0YScsICdiYXNpY0xTVE1DZWxsJyk7XG4gICAgY29uc3QgJGMgPSBjb252ZXJ0VG9UZW5zb3IoYywgJ2MnLCAnYmFzaWNMU1RNQ2VsbCcpO1xuICAgIGNvbnN0ICRoID0gY29udmVydFRvVGVuc29yKGgsICdoJywgJ2Jhc2ljTFNUTUNlbGwnKTtcbiAgICBjb25zdCBjb21iaW5lZCA9IGNvbmNhdChbJGRhdGEsICRoXSwgMSk7XG4gICAgY29uc3Qgd2VpZ2h0ZWQgPSBtYXRNdWwoY29tYmluZWQsICRsc3RtS2VybmVsKTtcbiAgICBjb25zdCByZXMgPSBhZGQod2VpZ2h0ZWQsICRsc3RtQmlhcyk7XG4gICAgLy8gaSA9IGlucHV0X2dhdGUsIGogPSBuZXdfaW5wdXQsIGYgPSBmb3JnZXRfZ2F0ZSwgbyA9IG91dHB1dF9nYXRlXG4gICAgY29uc3QgYmF0Y2hTaXplID0gcmVzLnNoYXBlWzBdO1xuICAgIGNvbnN0IHNsaWNlQ29scyA9IHJlcy5zaGFwZVsxXSAvIDQ7XG4gICAgY29uc3Qgc2xpY2VTaXplID0gW2JhdGNoU2l6ZSwgc2xpY2VDb2xzXTtcbiAgICBjb25zdCBpID0gc2xpY2UocmVzLCBbMCwgMF0sIHNsaWNlU2l6ZSk7XG4gICAgY29uc3QgaiA9IHNsaWNlKHJlcywgWzAsIHNsaWNlQ29sc10sIHNsaWNlU2l6ZSk7XG4gICAgY29uc3QgZiA9IHNsaWNlKHJlcywgWzAsIHNsaWNlQ29scyAqIDJdLCBzbGljZVNpemUpO1xuICAgIGNvbnN0IG8gPSBzbGljZShyZXMsIFswLCBzbGljZUNvbHMgKiAzXSwgc2xpY2VTaXplKTtcbiAgICBjb25zdCBuZXdDID0gYWRkKG11bChzaWdtb2lkKGkpLCB0YW5oKGopKSwgbXVsKCRjLCBzaWdtb2lkKGFkZCgkZm9yZ2V0QmlhcywgZikpKSk7XG4gICAgY29uc3QgbmV3SCA9IG11bCh0YW5oKG5ld0MpLCBzaWdtb2lkKG8pKTtcbiAgICByZXR1cm4gW25ld0MsIG5ld0hdO1xufVxuZXhwb3J0IGNvbnN0IGJhc2ljTFNUTUNlbGwgPSBvcCh7IGJhc2ljTFNUTUNlbGxfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmFzaWNfbHN0bV9jZWxsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBCYXRjaFRvU3BhY2VORCB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBUaGlzIG9wZXJhdGlvbiByZXNoYXBlcyB0aGUgXCJiYXRjaFwiIGRpbWVuc2lvbiAwIGludG8gYE0gKyAxYCBkaW1lbnNpb25zIG9mXG4gKiBzaGFwZSBgYmxvY2tTaGFwZSArIFtiYXRjaF1gLCBpbnRlcmxlYXZlcyB0aGVzZSBibG9ja3MgYmFjayBpbnRvIHRoZSBncmlkXG4gKiBkZWZpbmVkIGJ5IHRoZSBzcGF0aWFsIGRpbWVuc2lvbnMgYFsxLCAuLi4sIE1dYCwgdG8gb2J0YWluIGEgcmVzdWx0IHdpdGhcbiAqIHRoZSBzYW1lIHJhbmsgYXMgdGhlIGlucHV0LiBUaGUgc3BhdGlhbCBkaW1lbnNpb25zIG9mIHRoaXMgaW50ZXJtZWRpYXRlXG4gKiByZXN1bHQgYXJlIHRoZW4gb3B0aW9uYWxseSBjcm9wcGVkIGFjY29yZGluZyB0byBgY3JvcHNgIHRvIHByb2R1Y2UgdGhlXG4gKiBvdXRwdXQuIFRoaXMgaXMgdGhlIHJldmVyc2Ugb2YgYHRmLnNwYWNlVG9CYXRjaE5EYC4gU2VlIGJlbG93IGZvciBhIHByZWNpc2VcbiAqIGRlc2NyaXB0aW9uLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yNGQoWzEsIDIsIDMsIDRdLCBbNCwgMSwgMSwgMV0pO1xuICogY29uc3QgYmxvY2tTaGFwZSA9IFsyLCAyXTtcbiAqIGNvbnN0IGNyb3BzID0gW1swLCAwXSwgWzAsIDBdXTtcbiAqXG4gKiB4LmJhdGNoVG9TcGFjZU5EKGJsb2NrU2hhcGUsIGNyb3BzKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHggQSBgdGYuVGVuc29yYC4gTi1EIHdpdGggYHguc2hhcGVgID0gYFtiYXRjaF0gKyBzcGF0aWFsU2hhcGUgK1xuICogcmVtYWluaW5nU2hhcGVgLCB3aGVyZSBzcGF0aWFsU2hhcGUgaGFzIGBNYCBkaW1lbnNpb25zLlxuICogQHBhcmFtIGJsb2NrU2hhcGUgQSAxLUQgYXJyYXkuIE11c3QgaGF2ZSBzaGFwZSBgW01dYCwgYWxsIHZhbHVlcyBtdXN0XG4gKiBiZSA+PSAxLlxuICogQHBhcmFtIGNyb3BzIEEgMi1EIGFycmF5LiAgTXVzdCBoYXZlIHNoYXBlIGBbTSwgMl1gLCBhbGwgdmFsdWVzIG11c3QgYmUgPj0gMC5cbiAqIGBjcm9wc1tpXSA9IFtjcm9wU3RhcnQsIGNyb3BFbmRdYCBzcGVjaWZpZXMgdGhlIGFtb3VudCB0byBjcm9wIGZyb20gaW5wdXRcbiAqIGRpbWVuc2lvbiBgaSArIDFgLCB3aGljaCBjb3JyZXNwb25kcyB0byBzcGF0aWFsIGRpbWVuc2lvbiBgaWAuIEl0IGlzIHJlcXVpcmVkXG4gKiB0aGF0IGBjcm9wU3RhcnRbaV0gKyBjcm9wRW5kW2ldIDw9IGJsb2NrU2hhcGVbaV0gKiBpbnB1dFNoYXBlW2kgKyAxXWBcbiAqXG4gKiBUaGlzIG9wZXJhdGlvbiBpcyBlcXVpdmFsZW50IHRvIHRoZSBmb2xsb3dpbmcgc3RlcHM6XG4gKlxuICogMS4gUmVzaGFwZSBgeGAgdG8gYHJlc2hhcGVkYCBvZiBzaGFwZTogYFtibG9ja1NoYXBlWzBdLCAuLi4sXG4gKiBibG9ja1NoYXBlW00tMV0sIGJhdGNoIC8gcHJvZChibG9ja1NoYXBlKSwgeC5zaGFwZVsxXSwgLi4uLFxuICogeC5zaGFwZVtOLTFdXWBcbiAqXG4gKiAyLiBQZXJtdXRlIGRpbWVuc2lvbnMgb2YgYHJlc2hhcGVkYHRvIHByb2R1Y2UgYHBlcm11dGVkYCBvZiBzaGFwZSBgW2JhdGNoIC9cbiAqIHByb2QoYmxvY2tTaGFwZSkseC5zaGFwZVsxXSwgYmxvY2tTaGFwZVswXSwgLi4uLCB4LnNoYXBlW01dLFxuICogYmxvY2tTaGFwZVtNLTFdLHguc2hhcGVbTSsxXSwgLi4uLCB4LnNoYXBlW04tMV1dYFxuICpcbiAqIDMuIFJlc2hhcGUgYHBlcm11dGVkYCB0byBwcm9kdWNlIGByZXNoYXBlZFBlcm11dGVkYCBvZiBzaGFwZSBgW2JhdGNoIC9cbiAqIHByb2QoYmxvY2tTaGFwZSkseC5zaGFwZVsxXSAqIGJsb2NrU2hhcGVbMF0sIC4uLiwgeC5zaGFwZVtNXSAqXG4gKiBibG9ja1NoYXBlW00tMV0seC5zaGFwZVtNKzFdLCAuLi4sIHguc2hhcGVbTi0xXV1gXG4gKlxuICogNC4gQ3JvcCB0aGUgc3RhcnQgYW5kIGVuZCBvZiBkaW1lbnNpb25zIGBbMSwgLi4uLCBNXWAgb2YgYHJlc2hhcGVkUGVybXV0ZWRgXG4gKiBhY2NvcmRpbmcgdG8gYGNyb3BzYCB0byBwcm9kdWNlIHRoZSBvdXRwdXQgb2Ygc2hhcGU6IGBbYmF0Y2ggL1xuICogcHJvZChibG9ja1NoYXBlKSx4LnNoYXBlWzFdICogYmxvY2tTaGFwZVswXSAtIGNyb3BzWzAsMF0gLSBjcm9wc1swLDFdLFxuICogLi4uLCB4LnNoYXBlW01dICogYmxvY2tTaGFwZVtNLTFdIC0gY3JvcHNbTS0xLDBdIC1cbiAqIGNyb3BzW00tMSwxXSx4LnNoYXBlW00rMV0sIC4uLiwgeC5zaGFwZVtOLTFdXWBcbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdUcmFuc2Zvcm1hdGlvbnMnfVxuICovXG5mdW5jdGlvbiBiYXRjaFRvU3BhY2VORF8oeCwgYmxvY2tTaGFwZSwgY3JvcHMpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdiYXRjaFRvU3BhY2VORCcpO1xuICAgIGNvbnN0IHByb2QgPSBibG9ja1NoYXBlLnJlZHVjZSgoYSwgYikgPT4gYSAqIGIpO1xuICAgIHV0aWwuYXNzZXJ0KCR4LnJhbmsgPj0gMSArIGJsb2NrU2hhcGUubGVuZ3RoLCAoKSA9PiBgaW5wdXQgcmFuayBpcyAkeyR4LnJhbmt9IGJ1dCBzaG91bGQgYmUgPiB0aGFuIGJsb2NrU2hhcGUubGVuZ3RoICR7YmxvY2tTaGFwZS5sZW5ndGh9YCk7XG4gICAgdXRpbC5hc3NlcnQoY3JvcHMubGVuZ3RoID09PSBibG9ja1NoYXBlLmxlbmd0aCwgKCkgPT4gYGNyb3BzLmxlbmd0aCBpcyAke2Nyb3BzLmxlbmd0aH0gYnV0IHNob3VsZCBiZSBlcXVhbCB0byBibG9ja1NoYXBlLmxlbmd0aCAgJHtibG9ja1NoYXBlLmxlbmd0aH1gKTtcbiAgICB1dGlsLmFzc2VydCgkeC5zaGFwZVswXSAlIHByb2QgPT09IDAsICgpID0+IGBpbnB1dCB0ZW5zb3IgYmF0Y2ggaXMgJHskeC5zaGFwZVswXX0gYnV0IGlzIG5vdCBkaXZpc2libGUgYnkgdGhlIHByb2R1Y3Qgb2YgYCArXG4gICAgICAgIGB0aGUgZWxlbWVudHMgb2YgYmxvY2tTaGFwZSAke2Jsb2NrU2hhcGUuam9pbignICogJyl9ID09PSAke3Byb2R9YCk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBibG9ja1NoYXBlLCBjcm9wcyB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEJhdGNoVG9TcGFjZU5ELCBpbnB1dHMsIGF0dHJzKTtcbn1cbmV4cG9ydCBjb25zdCBiYXRjaFRvU3BhY2VORCA9IG9wKHsgYmF0Y2hUb1NwYWNlTkRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmF0Y2hfdG9fc3BhY2VfbmQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IEZ1c2VkQmF0Y2hOb3JtIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgeEFzNEQgfSBmcm9tICcuL2JhdGNobm9ybV91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vcmVzaGFwZSc7XG4vKipcbiAqIEJhdGNoIG5vcm1hbGl6YXRpb24uXG4gKlxuICogQXMgZGVzY3JpYmVkIGluXG4gKiBbaHR0cDovL2FyeGl2Lm9yZy9hYnMvMTUwMi4wMzE2N10oaHR0cDovL2FyeGl2Lm9yZy9hYnMvMTUwMi4wMzE2NykuXG4gKlxuICogTWVhbiwgdmFyaWFuY2UsIHNjYWxlLCBhbmQgb2Zmc2V0IGNhbiBiZSBvZiB0d28gc2hhcGVzOlxuICogICAtIFRoZSBzYW1lIHNoYXBlIGFzIHRoZSBpbnB1dC5cbiAqICAgLSBJbiB0aGUgY29tbW9uIGNhc2UsIHRoZSBkZXB0aCBkaW1lbnNpb24gaXMgdGhlIGxhc3QgZGltZW5zaW9uIG9mIHgsIHNvXG4gKiAgICAgdGhlIHZhbHVlcyB3b3VsZCBiZSBhbiBgdGYuVGVuc29yMURgIG9mIHNoYXBlIFtkZXB0aF0uXG4gKlxuICogQWxzbyBhdmFpbGFibGUgYXJlIHN0cmljdGVyIHJhbmstc3BlY2lmaWMgbWV0aG9kcyB3aXRoIHRoZSBzYW1lIHNpZ25hdHVyZVxuICogYXMgdGhpcyBtZXRob2QgdGhhdCBhc3NlcnQgdGhhdCBwYXJhbWV0ZXJzIHBhc3NlZCBhcmUgb2YgZ2l2ZW4gcmFua1xuICogICAtIGB0Zi5iYXRjaE5vcm0yZGBcbiAqICAgLSBgdGYuYmF0Y2hOb3JtM2RgXG4gKiAgIC0gYHRmLmJhdGNoTm9ybTRkYFxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCBUZW5zb3IuXG4gKiBAcGFyYW0gbWVhbiBBIG1lYW4gVGVuc29yLlxuICogQHBhcmFtIHZhcmlhbmNlIEEgdmFyaWFuY2UgVGVuc29yLlxuICogQHBhcmFtIG9mZnNldCBBbiBvZmZzZXQgVGVuc29yLlxuICogQHBhcmFtIHNjYWxlIEEgc2NhbGUgVGVuc29yLlxuICogQHBhcmFtIHZhcmlhbmNlRXBzaWxvbiBBIHNtYWxsIGZsb2F0IG51bWJlciB0byBhdm9pZCBkaXZpZGluZyBieSAwLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ05vcm1hbGl6YXRpb24nfVxuICovXG5mdW5jdGlvbiBiYXRjaE5vcm1fKHgsIG1lYW4sIHZhcmlhbmNlLCBvZmZzZXQsIHNjYWxlLCB2YXJpYW5jZUVwc2lsb24pIHtcbiAgICBpZiAodmFyaWFuY2VFcHNpbG9uID09IG51bGwpIHtcbiAgICAgICAgdmFyaWFuY2VFcHNpbG9uID0gMC4wMDE7XG4gICAgfVxuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2JhdGNoTm9ybScpO1xuICAgIGNvbnN0ICRtZWFuID0gY29udmVydFRvVGVuc29yKG1lYW4sICdtZWFuJywgJ2JhdGNoTm9ybScpO1xuICAgIGNvbnN0ICR2YXJpYW5jZSA9IGNvbnZlcnRUb1RlbnNvcih2YXJpYW5jZSwgJ3ZhcmlhbmNlJywgJ2JhdGNoTm9ybScpO1xuICAgIGxldCAkc2NhbGU7XG4gICAgaWYgKHNjYWxlICE9IG51bGwpIHtcbiAgICAgICAgJHNjYWxlID0gY29udmVydFRvVGVuc29yKHNjYWxlLCAnc2NhbGUnLCAnYmF0Y2hOb3JtJyk7XG4gICAgfVxuICAgIGxldCAkb2Zmc2V0O1xuICAgIGlmIChvZmZzZXQgIT0gbnVsbCkge1xuICAgICAgICAkb2Zmc2V0ID0gY29udmVydFRvVGVuc29yKG9mZnNldCwgJ29mZnNldCcsICdiYXRjaE5vcm0nKTtcbiAgICB9XG4gICAgdXRpbC5hc3NlcnQoJG1lYW4ucmFuayA9PT0gJHZhcmlhbmNlLnJhbmssICgpID0+ICdCYXRjaCBub3JtYWxpemF0aW9uIGdyYWRpZW50IHJlcXVpcmVzIG1lYW4gYW5kIHZhcmlhbmNlIHRvIGhhdmUgJyArXG4gICAgICAgICdlcXVhbCByYW5rcy4nKTtcbiAgICB1dGlsLmFzc2VydCgkb2Zmc2V0ID09IG51bGwgfHwgJG1lYW4ucmFuayA9PT0gJG9mZnNldC5yYW5rLCAoKSA9PiAnQmF0Y2ggbm9ybWFsaXphdGlvbiBncmFkaWVudCByZXF1aXJlcyBtZWFuIGFuZCBvZmZzZXQgdG8gaGF2ZSAnICtcbiAgICAgICAgJ2VxdWFsIHJhbmtzLicpO1xuICAgIHV0aWwuYXNzZXJ0KCRzY2FsZSA9PSBudWxsIHx8ICRtZWFuLnJhbmsgPT09ICRzY2FsZS5yYW5rLCAoKSA9PiAnQmF0Y2ggbm9ybWFsaXphdGlvbiBncmFkaWVudCByZXF1aXJlcyBtZWFuIGFuZCBzY2FsZSB0byBoYXZlICcgK1xuICAgICAgICAnZXF1YWwgcmFua3MuJyk7XG4gICAgY29uc3QgeDREID0geEFzNEQoJHgpO1xuICAgIGNvbnN0IGlucHV0cyA9IHtcbiAgICAgICAgeDogeDRELFxuICAgICAgICBzY2FsZTogJHNjYWxlLFxuICAgICAgICBvZmZzZXQ6ICRvZmZzZXQsXG4gICAgICAgIG1lYW46ICRtZWFuLFxuICAgICAgICB2YXJpYW5jZTogJHZhcmlhbmNlXG4gICAgfTtcbiAgICBjb25zdCBhdHRycyA9IHsgdmFyaWFuY2VFcHNpbG9uIH07XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICAgIGNvbnN0IHJlcyA9IEVOR0lORS5ydW5LZXJuZWwoRnVzZWRCYXRjaE5vcm0sIGlucHV0cywgYXR0cnMpO1xuICAgIHJldHVybiByZXNoYXBlKHJlcywgJHguc2hhcGUpO1xufVxuZXhwb3J0IGNvbnN0IGJhdGNoTm9ybSA9IG9wKHsgYmF0Y2hOb3JtXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJhdGNobm9ybS5qcy5tYXAiLCJpbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IGJhdGNoTm9ybSB9IGZyb20gJy4vYmF0Y2hub3JtJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBCYXRjaCBub3JtYWxpemF0aW9uLCBzdHJpY3RseSBmb3IgMkQuIEZvciB0aGUgbW9yZSByZWxheGVkIHZlcnNpb24sIHNlZVxuICogYHRmLmJhdGNoTm9ybWAuXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IFRlbnNvci5cbiAqIEBwYXJhbSBtZWFuIEEgbWVhbiBUZW5zb3IuXG4gKiBAcGFyYW0gdmFyaWFuY2UgQSB2YXJpYW5jZSBUZW5zb3IuXG4gKiBAcGFyYW0gb2Zmc2V0IEFuIG9mZnNldCBUZW5zb3IuXG4gKiBAcGFyYW0gc2NhbGUgQSBzY2FsZSBUZW5zb3IuXG4gKiBAcGFyYW0gdmFyaWFuY2VFcHNpbG9uIEEgc21hbGwgZmxvYXQgbnVtYmVyIHRvIGF2b2lkIGRpdmlkaW5nIGJ5IDAuXG4gKi9cbmZ1bmN0aW9uIGJhdGNoTm9ybTJkXyh4LCBtZWFuLCB2YXJpYW5jZSwgb2Zmc2V0LCBzY2FsZSwgdmFyaWFuY2VFcHNpbG9uKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnYmF0Y2hOb3JtJyk7XG4gICAgY29uc3QgJG1lYW4gPSBjb252ZXJ0VG9UZW5zb3IobWVhbiwgJ21lYW4nLCAnYmF0Y2hOb3JtJyk7XG4gICAgY29uc3QgJHZhcmlhbmNlID0gY29udmVydFRvVGVuc29yKHZhcmlhbmNlLCAndmFyaWFuY2UnLCAnYmF0Y2hOb3JtJyk7XG4gICAgbGV0ICRzY2FsZTtcbiAgICBpZiAoc2NhbGUgIT0gbnVsbCkge1xuICAgICAgICAkc2NhbGUgPSBjb252ZXJ0VG9UZW5zb3Ioc2NhbGUsICdzY2FsZScsICdiYXRjaE5vcm0nKTtcbiAgICB9XG4gICAgbGV0ICRvZmZzZXQ7XG4gICAgaWYgKG9mZnNldCAhPSBudWxsKSB7XG4gICAgICAgICRvZmZzZXQgPSBjb252ZXJ0VG9UZW5zb3Iob2Zmc2V0LCAnb2Zmc2V0JywgJ2JhdGNoTm9ybScpO1xuICAgIH1cbiAgICB1dGlsLmFzc2VydCgkeC5yYW5rID09PSAyLCAoKSA9PiBgRXJyb3IgaW4gYmF0Y2hOb3JtMkQ6IHggbXVzdCBiZSByYW5rIDIgYnV0IGdvdCByYW5rIGAgK1xuICAgICAgICBgJHskeC5yYW5rfS5gKTtcbiAgICB1dGlsLmFzc2VydCgkbWVhbi5yYW5rID09PSAyIHx8ICRtZWFuLnJhbmsgPT09IDEsICgpID0+IGBFcnJvciBpbiBiYXRjaE5vcm0yRDogbWVhbiBtdXN0IGJlIHJhbmsgMiBvciByYW5rIDEgYnV0IGAgK1xuICAgICAgICBgZ290IHJhbmsgJHskbWVhbi5yYW5rfS5gKTtcbiAgICB1dGlsLmFzc2VydCgkdmFyaWFuY2UucmFuayA9PT0gMiB8fCAkdmFyaWFuY2UucmFuayA9PT0gMSwgKCkgPT4gYEVycm9yIGluIGJhdGNoTm9ybTJEOiB2YXJpYW5jZSBtdXN0IGJlIHJhbmsgMiBvciByYW5rIDEgYCArXG4gICAgICAgIGBidXQgZ290IHJhbmsgJHskdmFyaWFuY2UucmFua30uYCk7XG4gICAgaWYgKCRzY2FsZSAhPSBudWxsKSB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KCRzY2FsZS5yYW5rID09PSAyIHx8ICRzY2FsZS5yYW5rID09PSAxLCAoKSA9PiBgRXJyb3IgaW4gYmF0Y2hOb3JtMkQ6IHNjYWxlIG11c3QgYmUgcmFuayAyIG9yIHJhbmsgMSBgICtcbiAgICAgICAgICAgIGBidXQgZ290IHJhbmsgJHskc2NhbGUucmFua30uYCk7XG4gICAgfVxuICAgIGlmICgkb2Zmc2V0ICE9IG51bGwpIHtcbiAgICAgICAgdXRpbC5hc3NlcnQoJG9mZnNldC5yYW5rID09PSAyIHx8ICRvZmZzZXQucmFuayA9PT0gMSwgKCkgPT4gYEVycm9yIGluIGJhdGNoTm9ybTJEOiBvZmZzZXQgbXVzdCBiZSByYW5rIDIgb3IgcmFuayAxIGAgK1xuICAgICAgICAgICAgYGJ1dCBnb3QgcmFuayAkeyRvZmZzZXQucmFua30uYCk7XG4gICAgfVxuICAgIHJldHVybiBiYXRjaE5vcm0oJHgsICRtZWFuLCAkdmFyaWFuY2UsICRvZmZzZXQsICRzY2FsZSwgdmFyaWFuY2VFcHNpbG9uKTtcbn1cbmV4cG9ydCBjb25zdCBiYXRjaE5vcm0yZCA9IG9wKHsgYmF0Y2hOb3JtMmRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmF0Y2hub3JtMmQuanMubWFwIiwiaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBiYXRjaE5vcm0gfSBmcm9tICcuL2JhdGNobm9ybSc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQmF0Y2ggbm9ybWFsaXphdGlvbiwgc3RyaWN0bHkgZm9yIDNELiBGb3IgdGhlIG1vcmUgcmVsYXhlZCB2ZXJzaW9uLCBzZWVcbiAqIGB0Zi5iYXRjaE5vcm1gLlxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCBUZW5zb3IuXG4gKiBAcGFyYW0gbWVhbiBBIG1lYW4gVGVuc29yLlxuICogQHBhcmFtIHZhcmlhbmNlIEEgdmFyaWFuY2UgVGVuc29yLlxuICogQHBhcmFtIG9mZnNldCBBbiBvZmZzZXQgVGVuc29yLlxuICogQHBhcmFtIHNjYWxlIEEgc2NhbGUgVGVuc29yLlxuICogQHBhcmFtIHZhcmlhbmNlRXBzaWxvbiBBIHNtYWxsIGZsb2F0IG51bWJlciB0byBhdm9pZCBkaXZpZGluZyBieSAwLlxuICovXG5mdW5jdGlvbiBiYXRjaE5vcm0zZF8oeCwgbWVhbiwgdmFyaWFuY2UsIG9mZnNldCwgc2NhbGUsIHZhcmlhbmNlRXBzaWxvbikge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2JhdGNoTm9ybScpO1xuICAgIGNvbnN0ICRtZWFuID0gY29udmVydFRvVGVuc29yKG1lYW4sICdtZWFuJywgJ2JhdGNoTm9ybScpO1xuICAgIGNvbnN0ICR2YXJpYW5jZSA9IGNvbnZlcnRUb1RlbnNvcih2YXJpYW5jZSwgJ3ZhcmlhbmNlJywgJ2JhdGNoTm9ybScpO1xuICAgIGxldCAkc2NhbGU7XG4gICAgaWYgKHNjYWxlICE9IG51bGwpIHtcbiAgICAgICAgJHNjYWxlID0gY29udmVydFRvVGVuc29yKHNjYWxlLCAnc2NhbGUnLCAnYmF0Y2hOb3JtJyk7XG4gICAgfVxuICAgIGxldCAkb2Zmc2V0O1xuICAgIGlmIChvZmZzZXQgIT0gbnVsbCkge1xuICAgICAgICAkb2Zmc2V0ID0gY29udmVydFRvVGVuc29yKG9mZnNldCwgJ29mZnNldCcsICdiYXRjaE5vcm0nKTtcbiAgICB9XG4gICAgdXRpbC5hc3NlcnQoJHgucmFuayA9PT0gMywgKCkgPT4gYEVycm9yIGluIGJhdGNoTm9ybTNEOiB4IG11c3QgYmUgcmFuayAzIGJ1dCBnb3QgcmFuayBgICtcbiAgICAgICAgYCR7JHgucmFua30uYCk7XG4gICAgdXRpbC5hc3NlcnQoJG1lYW4ucmFuayA9PT0gMyB8fCAkbWVhbi5yYW5rID09PSAxLCAoKSA9PiBgRXJyb3IgaW4gYmF0Y2hOb3JtM0Q6IG1lYW4gbXVzdCBiZSByYW5rIDMgb3IgcmFuayAxIGJ1dCBgICtcbiAgICAgICAgYGdvdCByYW5rICR7JG1lYW4ucmFua30uYCk7XG4gICAgdXRpbC5hc3NlcnQoJHZhcmlhbmNlLnJhbmsgPT09IDMgfHwgJHZhcmlhbmNlLnJhbmsgPT09IDEsICgpID0+IGBFcnJvciBpbiBiYXRjaE5vcm0zRDogdmFyaWFuY2UgbXVzdCBiZSByYW5rIDMgb3IgcmFuayAxIGAgK1xuICAgICAgICBgYnV0IGdvdCByYW5rICR7JHZhcmlhbmNlLnJhbmt9LmApO1xuICAgIGlmICgkc2NhbGUgIT0gbnVsbCkge1xuICAgICAgICB1dGlsLmFzc2VydCgkc2NhbGUucmFuayA9PT0gMyB8fCAkc2NhbGUucmFuayA9PT0gMSwgKCkgPT4gYEVycm9yIGluIGJhdGNoTm9ybTNEOiBzY2FsZSBtdXN0IGJlIHJhbmsgMyBvciByYW5rIDEgYCArXG4gICAgICAgICAgICBgYnV0IGdvdCByYW5rICR7JHNjYWxlLnJhbmt9LmApO1xuICAgIH1cbiAgICBpZiAoJG9mZnNldCAhPSBudWxsKSB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KCRvZmZzZXQucmFuayA9PT0gMyB8fCAkb2Zmc2V0LnJhbmsgPT09IDEsICgpID0+IGBFcnJvciBpbiBiYXRjaE5vcm0zRDogb2Zmc2V0IG11c3QgYmUgcmFuayAzIG9yIHJhbmsgMSBgICtcbiAgICAgICAgICAgIGBidXQgZ290IHJhbmsgJHskb2Zmc2V0LnJhbmt9LmApO1xuICAgIH1cbiAgICByZXR1cm4gYmF0Y2hOb3JtKCR4LCAkbWVhbiwgJHZhcmlhbmNlLCAkb2Zmc2V0LCAkc2NhbGUsIHZhcmlhbmNlRXBzaWxvbik7XG59XG5leHBvcnQgY29uc3QgYmF0Y2hOb3JtM2QgPSBvcCh7IGJhdGNoTm9ybTNkXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJhdGNobm9ybTNkLmpzLm1hcCIsImltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgYmF0Y2hOb3JtIH0gZnJvbSAnLi9iYXRjaG5vcm0nO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIEJhdGNoIG5vcm1hbGl6YXRpb24sIHN0cmljdGx5IGZvciA0RC4gRm9yIHRoZSBtb3JlIHJlbGF4ZWQgdmVyc2lvbiwgc2VlXG4gKiBgdGYuYmF0Y2hOb3JtYC5cbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgVGVuc29yLlxuICogQHBhcmFtIG1lYW4gQSBtZWFuIFRlbnNvci5cbiAqIEBwYXJhbSB2YXJpYW5jZSBBIHZhcmlhbmNlIFRlbnNvci5cbiAqIEBwYXJhbSBvZmZzZXQgQW4gb2Zmc2V0IFRlbnNvci5cbiAqIEBwYXJhbSBzY2FsZSBBIHNjYWxlIFRlbnNvci5cbiAqIEBwYXJhbSB2YXJpYW5jZUVwc2lsb24gQSBzbWFsbCBmbG9hdCBudW1iZXIgdG8gYXZvaWQgZGl2aWRpbmcgYnkgMC5cbiAqL1xuZnVuY3Rpb24gYmF0Y2hOb3JtNGRfKHgsIG1lYW4sIHZhcmlhbmNlLCBvZmZzZXQsIHNjYWxlLCB2YXJpYW5jZUVwc2lsb24pIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdiYXRjaE5vcm0nKTtcbiAgICBjb25zdCAkbWVhbiA9IGNvbnZlcnRUb1RlbnNvcihtZWFuLCAnbWVhbicsICdiYXRjaE5vcm0nKTtcbiAgICBjb25zdCAkdmFyaWFuY2UgPSBjb252ZXJ0VG9UZW5zb3IodmFyaWFuY2UsICd2YXJpYW5jZScsICdiYXRjaE5vcm0nKTtcbiAgICBsZXQgJHNjYWxlO1xuICAgIGlmIChzY2FsZSAhPSBudWxsKSB7XG4gICAgICAgICRzY2FsZSA9IGNvbnZlcnRUb1RlbnNvcihzY2FsZSwgJ3NjYWxlJywgJ2JhdGNoTm9ybScpO1xuICAgIH1cbiAgICBsZXQgJG9mZnNldDtcbiAgICBpZiAob2Zmc2V0ICE9IG51bGwpIHtcbiAgICAgICAgJG9mZnNldCA9IGNvbnZlcnRUb1RlbnNvcihvZmZzZXQsICdvZmZzZXQnLCAnYmF0Y2hOb3JtJyk7XG4gICAgfVxuICAgIHV0aWwuYXNzZXJ0KCR4LnJhbmsgPT09IDQsICgpID0+IGBFcnJvciBpbiBiYXRjaE5vcm00RDogeCBtdXN0IGJlIHJhbmsgNCBidXQgZ290IHJhbmsgYCArXG4gICAgICAgIGAkeyR4LnJhbmt9LmApO1xuICAgIHV0aWwuYXNzZXJ0KCRtZWFuLnJhbmsgPT09IDQgfHwgJG1lYW4ucmFuayA9PT0gMSwgKCkgPT4gYEVycm9yIGluIGJhdGNoTm9ybTREOiBtZWFuIG11c3QgYmUgcmFuayA0IG9yIHJhbmsgMSBidXQgYCArXG4gICAgICAgIGBnb3QgcmFuayAkeyRtZWFuLnJhbmt9LmApO1xuICAgIHV0aWwuYXNzZXJ0KCR2YXJpYW5jZS5yYW5rID09PSA0IHx8ICR2YXJpYW5jZS5yYW5rID09PSAxLCAoKSA9PiBgRXJyb3IgaW4gYmF0Y2hOb3JtNEQ6IHZhcmlhbmNlIG11c3QgYmUgcmFuayA0IG9yIHJhbmsgMSBgICtcbiAgICAgICAgYGJ1dCBnb3QgcmFuayAkeyR2YXJpYW5jZS5yYW5rfS5gKTtcbiAgICBpZiAoJHNjYWxlICE9IG51bGwpIHtcbiAgICAgICAgdXRpbC5hc3NlcnQoJHNjYWxlLnJhbmsgPT09IDQgfHwgJHNjYWxlLnJhbmsgPT09IDEsICgpID0+IGBFcnJvciBpbiBiYXRjaE5vcm00RDogc2NhbGUgbXVzdCBiZSByYW5rIDQgb3IgcmFuayAxIGAgK1xuICAgICAgICAgICAgYGJ1dCBnb3QgcmFuayAkeyRzY2FsZS5yYW5rfS5gKTtcbiAgICB9XG4gICAgaWYgKCRvZmZzZXQgIT0gbnVsbCkge1xuICAgICAgICB1dGlsLmFzc2VydCgkb2Zmc2V0LnJhbmsgPT09IDQgfHwgJG9mZnNldC5yYW5rID09PSAxLCAoKSA9PiBgRXJyb3IgaW4gYmF0Y2hOb3JtNEQ6IG9mZnNldCBtdXN0IGJlIHJhbmsgNCBvciByYW5rIDEgYCArXG4gICAgICAgICAgICBgYnV0IGdvdCByYW5rICR7JG9mZnNldC5yYW5rfS5gKTtcbiAgICB9XG4gICAgcmV0dXJuIGJhdGNoTm9ybSgkeCwgJG1lYW4sICR2YXJpYW5jZSwgJG9mZnNldCwgJHNjYWxlLCB2YXJpYW5jZUVwc2lsb24pO1xufVxuZXhwb3J0IGNvbnN0IGJhdGNoTm9ybTRkID0gb3AoeyBiYXRjaE5vcm00ZF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1iYXRjaG5vcm00ZC5qcy5tYXAiLCJpbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9yZXNoYXBlJztcbmV4cG9ydCBmdW5jdGlvbiB4QXM0RCh4KSB7XG4gICAgbGV0IHg0RDtcbiAgICBpZiAoeC5yYW5rID09PSAwIHx8IHgucmFuayA9PT0gMSkge1xuICAgICAgICB4NEQgPSByZXNoYXBlKHgsIFsxLCAxLCAxLCB4LnNpemVdKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoeC5yYW5rID09PSAyKSB7XG4gICAgICAgIHg0RCA9IHJlc2hhcGUoeCwgWzEsIDEsIHguc2hhcGVbMF0sIHguc2hhcGVbMV1dKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoeC5yYW5rID09PSAzKSB7XG4gICAgICAgIHg0RCA9IHJlc2hhcGUoeCwgWzEsIHguc2hhcGVbMF0sIHguc2hhcGVbMV0sIHguc2hhcGVbMl1dKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHg0RCA9IHg7XG4gICAgfVxuICAgIHJldHVybiB4NEQ7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1iYXRjaG5vcm1fdXRpbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgQmluY291bnQgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogT3V0cHV0cyBhIHZlY3RvciB3aXRoIGxlbmd0aCBgc2l6ZWAgYW5kIHRoZSBzYW1lIGR0eXBlIGFzIGB3ZWlnaHRzYC5cbiAqXG4gKiBJZiBgd2VpZ2h0c2AgYXJlIGVtcHR5LCB0aGVuIGluZGV4IGBpYCBzdG9yZXMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgdmFsdWVcbiAqIGBpYCBpcyBjb3VudGVkIGluIGB4YC4gSWYgYHdlaWdodHNgIGFyZSBub24tZW1wdHksIHRoZW4gaW5kZXggYGlgIHN0b3JlcyB0aGVcbiAqIHN1bSBvZiB0aGUgdmFsdWUgaW4gYHdlaWdodHNgIGF0IGVhY2ggaW5kZXggd2hlcmUgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgaW5cbiAqIGB4YCBpcyBgaWAuXG4gKlxuICogVmFsdWVzIGluIGB4YCBvdXRzaWRlIG9mIHRoZSByYW5nZSBbMCwgc2l6ZSkgYXJlIGlnbm9yZWQuXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IGludCB0ZW5zb3IsIHJhbmsgMS5cbiAqIEBwYXJhbSB3ZWlnaHRzIFRoZSB3ZWlnaHRzIHRlbnNvciwgbXVzdCBoYXZlIHRoZSBzYW1lIHNoYXBlIGFzIHgsIG9yIGFcbiAqICAgICBsZW5ndGgtMCBUZW5zb3IsIGluIHdoaWNoIGNhc2UgaXQgYWN0cyBhcyBhbGwgd2VpZ2h0cyBlcXVhbCB0byAxLlxuICogQHBhcmFtIHNpemUgTm9uLW5lZ2F0aXZlIGludGVnZXIuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnUmVkdWN0aW9uJ31cbiAqL1xuZnVuY3Rpb24gYmluY291bnRfKHgsIHdlaWdodHMsIHNpemUpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdiaW5jb3VudCcpO1xuICAgIGNvbnN0ICR3ZWlnaHRzID0gY29udmVydFRvVGVuc29yKHdlaWdodHMsICd3ZWlnaHRzJywgJ2JpbmNvdW50Jyk7XG4gICAgdXRpbC5hc3NlcnQoJHguZHR5cGUgPT09ICdpbnQzMicsICgpID0+IGBFcnJvciBpbiBiaW5jb3VudDogaW5wdXQgYCArXG4gICAgICAgIGBkdHlwZSBtdXN0IGJlIGludDMyLCBidXQgZ290ICR7JHguZHR5cGV9YCk7XG4gICAgdXRpbC5hc3NlcnQoc2l6ZSA+PSAwLCAoKSA9PiBgc2l6ZSBtdXN0IGJlIG5vbi1uZWdhdGl2ZSwgYnV0IGdvdCAke3NpemV9LmApO1xuICAgIHV0aWwuYXNzZXJ0KCR3ZWlnaHRzLnNpemUgPT09ICR4LnNpemUgfHwgJHdlaWdodHMuc2l6ZSA9PT0gMCwgKCkgPT4gYEVycm9yIGluIGJpbmNvdW50OiB3ZWlnaHRzIG11c3QgaGF2ZSB0aGUgc2FtZSBzaXplIGFzIGlucHV0IG9yYCArXG4gICAgICAgIGAwLWxlbmd0aCwgYnV0IGdvdCBpbnB1dCBzaGFwZTogJHskeC5zaGFwZX0sIHdlaWdodHMgc2hhcGU6IGAgK1xuICAgICAgICBgJHskd2VpZ2h0cy5zaGFwZX0uYCk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCwgd2VpZ2h0czogJHdlaWdodHMgfTtcbiAgICBjb25zdCBhdHRycyA9IHsgc2l6ZSB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEJpbmNvdW50LCBpbnB1dHMsIGF0dHJzKTtcbn1cbmV4cG9ydCBjb25zdCBiaW5jb3VudCA9IG9wKHsgYmluY291bnRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmluY291bnQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBnYXRoZXIgfSBmcm9tICcuL2dhdGhlcic7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9yZXNoYXBlJztcbmltcG9ydCB7IHNxdWVlemUgfSBmcm9tICcuL3NxdWVlemUnO1xuaW1wb3J0IHsgd2hlcmVBc3luYyB9IGZyb20gJy4vd2hlcmVfYXN5bmMnO1xuLyoqXG4gKiBBcHBseSBib29sZWFuIG1hc2sgdG8gdGVuc29yLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB0ZW5zb3IgPSB0Zi50ZW5zb3IyZChbMSwgMiwgMywgNCwgNSwgNl0sIFszLCAyXSk7XG4gKiBjb25zdCBtYXNrID0gdGYudGVuc29yMWQoWzEsIDAsIDFdLCAnYm9vbCcpO1xuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgdGYuYm9vbGVhbk1hc2tBc3luYyh0ZW5zb3IsIG1hc2spO1xuICogcmVzdWx0LnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gdGVuc29yIE4tRCB0ZW5zb3IuXG4gKiBAcGFyYW0gbWFzayBLLUQgYm9vbGVhbiB0ZW5zb3IsIEsgPD0gTiBhbmQgSyBtdXN0IGJlIGtub3duIHN0YXRpY2FsbHkuXG4gKiBAcGFyYW0gYXhpcyBBIDAtRCBpbnQgVGVuc29yIHJlcHJlc2VudGluZyB0aGUgYXhpcyBpbiB0ZW5zb3IgdG8gbWFzayBmcm9tLlxuICogICAgIEJ5IGRlZmF1bHQsIGF4aXMgaXMgMCB3aGljaCB3aWxsIG1hc2sgZnJvbSB0aGUgZmlyc3QgZGltZW5zaW9uLlxuICogICAgIE90aGVyd2lzZSBLICsgYXhpcyA8PSBOLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ1NsaWNpbmcgYW5kIEpvaW5pbmcnfVxuICovXG5hc3luYyBmdW5jdGlvbiBib29sZWFuTWFza0FzeW5jXyh0ZW5zb3IsIG1hc2ssIGF4aXMpIHtcbiAgICBjb25zdCAkdGVuc29yID0gY29udmVydFRvVGVuc29yKHRlbnNvciwgJ3RlbnNvcicsICdib29sTWFzaycpO1xuICAgIGNvbnN0ICRtYXNrID0gY29udmVydFRvVGVuc29yKG1hc2ssICdtYXNrJywgJ2Jvb2xNYXNrJywgJ2Jvb2wnKTtcbiAgICBjb25zdCBheGlzRnJvbSA9IGF4aXMgPT0gbnVsbCA/IDAgOiBheGlzO1xuICAgIGNvbnN0IG1hc2tEaW0gPSAkbWFzay5yYW5rO1xuICAgIGNvbnN0IHRlbnNvclNoYXBlID0gJHRlbnNvci5zaGFwZTtcbiAgICB1dGlsLmFzc2VydChtYXNrRGltID4gMCwgKCkgPT4gJ21hc2sgY2Fubm90IGJlIHNjYWxhcicpO1xuICAgIHV0aWwuYXNzZXJ0U2hhcGVzTWF0Y2godGVuc29yU2hhcGUuc2xpY2UoYXhpc0Zyb20sIGF4aXNGcm9tICsgbWFza0RpbSksICRtYXNrLnNoYXBlLCBgbWFzaydzIHNoYXBlIG11c3QgbWF0Y2ggdGhlIGZpcnN0IEsgZGltZW5zaW9ucyBvZiB0ZW5zb3IncyBzaGFwZSxgKTtcbiAgICBsZXQgbGVhZGluZ1NpemUgPSAxO1xuICAgIGZvciAobGV0IGkgPSBheGlzRnJvbTsgaSA8IGF4aXNGcm9tICsgbWFza0RpbTsgaSsrKSB7XG4gICAgICAgIGxlYWRpbmdTaXplICo9IHRlbnNvclNoYXBlW2ldO1xuICAgIH1cbiAgICBjb25zdCB0YXJnZXRUZW5zb3JTaGFwZSA9IHRlbnNvclNoYXBlLnNsaWNlKDAsIGF4aXNGcm9tKVxuICAgICAgICAuY29uY2F0KFtsZWFkaW5nU2l6ZV0sIHRlbnNvclNoYXBlLnNsaWNlKGF4aXNGcm9tICsgbWFza0RpbSkpO1xuICAgIGNvbnN0IHJlc2hhcGVkVGVuc29yID0gcmVzaGFwZSgkdGVuc29yLCB0YXJnZXRUZW5zb3JTaGFwZSk7XG4gICAgY29uc3QgcmVzaGFwZWRNYXNrID0gcmVzaGFwZSgkbWFzaywgWy0xXSk7XG4gICAgY29uc3QgcG9zaXRpdmVQb3NpdGlvbnMgPSBhd2FpdCB3aGVyZUFzeW5jKHJlc2hhcGVkTWFzayk7XG4gICAgY29uc3QgaW5kaWNlcyA9IHNxdWVlemUocG9zaXRpdmVQb3NpdGlvbnMsIFsxXSk7XG4gICAgY29uc3QgcmVzID0gZ2F0aGVyKHJlc2hhcGVkVGVuc29yLCBpbmRpY2VzLCBheGlzRnJvbSk7XG4gICAgLy8gRW5zdXJlIG5vIG1lbW9yeSBsZWFrLlxuICAgIGlmICh0ZW5zb3IgIT09ICR0ZW5zb3IpIHtcbiAgICAgICAgJHRlbnNvci5kaXNwb3NlKCk7XG4gICAgfVxuICAgIGlmIChtYXNrICE9PSAkbWFzaykge1xuICAgICAgICAkbWFzay5kaXNwb3NlKCk7XG4gICAgfVxuICAgIGluZGljZXMuZGlzcG9zZSgpO1xuICAgIHJlc2hhcGVkVGVuc29yLmRpc3Bvc2UoKTtcbiAgICByZXNoYXBlZE1hc2suZGlzcG9zZSgpO1xuICAgIHBvc2l0aXZlUG9zaXRpb25zLmRpc3Bvc2UoKTtcbiAgICByZXR1cm4gcmVzO1xufVxuZXhwb3J0IGNvbnN0IGJvb2xlYW5NYXNrQXN5bmMgPSBib29sZWFuTWFza0FzeW5jXztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJvb2xlYW5fbWFzay5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgVGlsZSB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgY2xvbmUgfSBmcm9tICcuL2Nsb25lJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vcmVzaGFwZSc7XG4vKipcbiAqIEJyb2FkY2FzdCBhbiBhcnJheSB0byBhIGNvbXBhdGlibGUgc2hhcGUgTnVtUHktc3R5bGUuXG4gKlxuICogVGhlIHRlbnNvcidzIHNoYXBlIGlzIGNvbXBhcmVkIHRvIHRoZSBicm9hZGNhc3Qgc2hhcGUgZnJvbSBlbmQgdG8gYmVnaW5uaW5nLlxuICogT25lcyBhcmUgcHJlcGVuZGVkIHRvIHRoZSB0ZW5zb3IncyBzaGFwZSB1bnRpbCBpcyBoYXMgdGhlIHNhbWUgbGVuZ3RoIGFzXG4gKiB0aGUgYnJvYWRjYXN0IHNoYXBlLiBJZiBpbnB1dC5zaGFwZVtpXT09c2hhcGVbaV0sIHRoZSAoaSsxKS10aCBheGlzIGlzXG4gKiBhbHJlYWR5IGJyb2FkY2FzdC1jb21wYXRpYmxlLiBJZiBpbnB1dC5zaGFwZVtpXT09MSBhbmQgc2hhcGVbaV09PU4sIHRoZW5cbiAqIHRoZSBpbnB1dCB0ZW5zb3IgaXMgdGlsZWQgTiB0aW1lcyBhbG9uZyB0aGF0IGF4aXMgKHVzaW5nIHRmLnRpbGUpLlxuICpcbiAqIEBwYXJhbSBpbnB1dCBUaGUgdGVuc29yIHRoYXQgaXMgdG8gYmUgYnJvYWRjYXN0ZWQuXG4gKiBAcGFyYW0gc2hhcGUgVGhlIGlucHV0IGlzIHRvIGJlIGJyb2FkY2FzdCB0byB0aGlzIHNoYXBlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ1RyYW5zZm9ybWF0aW9ucyd9XG4gKi9cbmZ1bmN0aW9uIGJyb2FkY2FzdFRvXyh4LCBzaGFwZSkge1xuICAgIGxldCBpbnB1dCA9IGNvbnZlcnRUb1RlbnNvcih4LCAnYnJvYWRjYXN0VG8nLCAneCcpO1xuICAgIGNvbnN0IHhTaGFwZSA9IGlucHV0LnNoYXBlO1xuICAgIGlmIChzaGFwZS5zb21lKGQgPT4gIShkID4gMCkgfHwgZCAlIDEgIT09IDApKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgYnJvYWRjYXN0VG8oKTogSW52YWxpZCBicm9hZGNhc3Qgc2hhcGUgWyR7c2hhcGV9XS5gKTtcbiAgICB9XG4gICAgaWYgKHNoYXBlLmxlbmd0aCA8IGlucHV0LnJhbmspIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBicm9hZGNhc3RUbygpOiBzaGFwZS5sZW5ndGg9JHtzaGFwZS5sZW5ndGh9IDwgaW5wdXQucmFuaz0ke2lucHV0LnJhbmt9LmApO1xuICAgIH1cbiAgICBpZiAoc2hhcGUubGVuZ3RoID4gaW5wdXQucmFuaykge1xuICAgICAgICBjb25zdCBuZXdTaGFwZSA9IGlucHV0LnNoYXBlLnNsaWNlKCk7XG4gICAgICAgIHdoaWxlIChuZXdTaGFwZS5sZW5ndGggPCBzaGFwZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIG5ld1NoYXBlLnVuc2hpZnQoMSk7XG4gICAgICAgIH1cbiAgICAgICAgaW5wdXQgPSByZXNoYXBlKGlucHV0LCBuZXdTaGFwZSk7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0U2hhcGUgPSBpbnB1dC5zaGFwZTtcbiAgICBjb25zdCByZXBzID0gQXJyYXkuZnJvbShzaGFwZSk7XG4gICAgZm9yIChsZXQgaSA9IHNoYXBlLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGlmIChpbnB1dFNoYXBlW2ldID09PSBzaGFwZVtpXSkge1xuICAgICAgICAgICAgcmVwc1tpXSA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaW5wdXQuc2hhcGVbaV0gIT09IDEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgYnJvYWRjYXN0VG8oKTogWyR7eFNoYXBlfV0gY2Fubm90IGJlIGJyb2FkY2FzdCB0byBbJHtzaGFwZX1dLmApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGF4ZXMgPSByZXBzLm1hcCgobiwgaSkgPT4gbiA+IDEgPyBpIDogLTEpLmZpbHRlcihpID0+IGkgPj0gMCk7XG4gICAgaWYgKGF4ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBjbG9uZShpbnB1dCk7XG4gICAgfVxuICAgIC8vIFRPRE8gY2FsbCBicm9hZGNhc3RUbyBrZXJuZWwgZGlyZWN0bHkgb25jZSBiYWNrZW5kcyBpbXBsZW1lbnQgYnJvYWRjc3RUb1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogaW5wdXQgfTtcbiAgICBjb25zdCBhdHRycyA9IHsgcmVwcyB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFRpbGUsIGlucHV0cywgYXR0cnMpO1xufVxuZXhwb3J0IGNvbnN0IGJyb2FkY2FzdFRvID0gb3AoeyBicm9hZGNhc3RUb18gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1icm9hZGNhc3RfdG8uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuLyoqXG4gKiBSZXR1cm5zIHRoZSBkaW1lbnNpb25zIGluIHRoZSBpbnB1dCBzaGFwZSB0aGF0IGFyZSBicm9hZGNhc3RlZCB0b1xuICogcHJvZHVjZSB0aGUgcHJvdmlkZWQgb3V0cHV0IHNoYXBlLlxuICpcbiAqIFRoZSByZXR1cm5lZCBkaW1lbnNpb25zIGFyZSAwLWluZGV4ZWQgYW5kIHNvcnRlZC4gQW4gZXhhbXBsZTpcbiAqIGluU2hhcGUgPSBbNCwgMSwgM11cbiAqIG91dFNoYXBlID0gWzUsIDQsIDMsIDNdXG4gKiByZXN1bHQgPSBbMV0uIERpbWVuc2lvbiAxICgybmQgZGltZW5zaW9uIG9mIGlucHV0KSBnZXRzIGJyb2FkY2FzdGVkIDEgPT4gMy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEJyb2FkY2FzdERpbXMoaW5TaGFwZSwgb3V0U2hhcGUpIHtcbiAgICBjb25zdCBpblJhbmsgPSBpblNoYXBlLmxlbmd0aDtcbiAgICBjb25zdCBkaW1zID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpblJhbms7IGkrKykge1xuICAgICAgICBjb25zdCBkaW0gPSBpblJhbmsgLSAxIC0gaTtcbiAgICAgICAgY29uc3QgYSA9IGluU2hhcGVbZGltXSB8fCAxO1xuICAgICAgICBjb25zdCBiID0gb3V0U2hhcGVbb3V0U2hhcGUubGVuZ3RoIC0gMSAtIGldIHx8IDE7XG4gICAgICAgIGlmIChiID4gMSAmJiBhID09PSAxKSB7XG4gICAgICAgICAgICBkaW1zLnVuc2hpZnQoZGltKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGltcztcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgYXhlcyBpbiB0aGUgb3V0cHV0IHNwYWNlIHRoYXQgc2hvdWxkIGJlIHJlZHVjZWQgdG8gcHJvZHVjZVxuICogdGhlIGlucHV0IHNwYWNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVkdWN0aW9uQXhlcyhpblNoYXBlLCBvdXRTaGFwZSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3V0U2hhcGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgaW5EaW0gPSBpblNoYXBlW2luU2hhcGUubGVuZ3RoIC0gaSAtIDFdO1xuICAgICAgICBjb25zdCBvdXRBeGlzID0gb3V0U2hhcGUubGVuZ3RoIC0gaSAtIDE7XG4gICAgICAgIGNvbnN0IG91dERpbSA9IG91dFNoYXBlW291dEF4aXNdO1xuICAgICAgICBpZiAoaW5EaW0gPT0gbnVsbCB8fCAoaW5EaW0gPT09IDEgJiYgb3V0RGltID4gMSkpIHtcbiAgICAgICAgICAgIHJlc3VsdC51bnNoaWZ0KG91dEF4aXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoc2hhcGVBLCBzaGFwZUIpIHtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBjb25zdCBsID0gTWF0aC5tYXgoc2hhcGVBLmxlbmd0aCwgc2hhcGVCLmxlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgbGV0IGEgPSBzaGFwZUFbc2hhcGVBLmxlbmd0aCAtIGkgLSAxXTtcbiAgICAgICAgaWYgKGEgPT0gbnVsbCkge1xuICAgICAgICAgICAgYSA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGIgPSBzaGFwZUJbc2hhcGVCLmxlbmd0aCAtIGkgLSAxXTtcbiAgICAgICAgaWYgKGIgPT0gbnVsbCkge1xuICAgICAgICAgICAgYiA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGEgPT09IDEpIHtcbiAgICAgICAgICAgIHJlc3VsdC51bnNoaWZ0KGIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGIgPT09IDEpIHtcbiAgICAgICAgICAgIHJlc3VsdC51bnNoaWZ0KGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGEgIT09IGIpIHtcbiAgICAgICAgICAgIGNvbnN0IGVyck1zZyA9IGBPcGVyYW5kcyBjb3VsZCBub3QgYmUgYnJvYWRjYXN0IHRvZ2V0aGVyIHdpdGggc2hhcGVzIGAgK1xuICAgICAgICAgICAgICAgIGAke3NoYXBlQX0gYW5kICR7c2hhcGVCfS5gO1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoZXJyTXNnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdC51bnNoaWZ0KGEpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1icm9hZGNhc3RfdXRpbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgZW52IH0gZnJvbSAnLi4vZW52aXJvbm1lbnQnO1xuaW1wb3J0IHsgRnJvbVBpeGVscyB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBnZXRLZXJuZWwgfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHsgVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBjYXN0IH0gZnJvbSAnLi9jYXN0JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgdGVuc29yM2QgfSBmcm9tICcuL3RlbnNvcjNkJztcbmxldCBmcm9tUGl4ZWxzMkRDb250ZXh0O1xuLyoqXG4gKiBDcmVhdGVzIGEgYHRmLlRlbnNvcmAgZnJvbSBhbiBpbWFnZS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgaW1hZ2UgPSBuZXcgSW1hZ2VEYXRhKDEsIDEpO1xuICogaW1hZ2UuZGF0YVswXSA9IDEwMDtcbiAqIGltYWdlLmRhdGFbMV0gPSAxNTA7XG4gKiBpbWFnZS5kYXRhWzJdID0gMjAwO1xuICogaW1hZ2UuZGF0YVszXSA9IDI1NTtcbiAqXG4gKiB0Zi5icm93c2VyLmZyb21QaXhlbHMoaW1hZ2UpLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gcGl4ZWxzIFRoZSBpbnB1dCBpbWFnZSB0byBjb25zdHJ1Y3QgdGhlIHRlbnNvciBmcm9tLiBUaGVcbiAqIHN1cHBvcnRlZCBpbWFnZSB0eXBlcyBhcmUgYWxsIDQtY2hhbm5lbC4gWW91IGNhbiBhbHNvIHBhc3MgaW4gYW4gaW1hZ2VcbiAqIG9iamVjdCB3aXRoIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuICogYHtkYXRhOiBVaW50OEFycmF5OyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlcn1gXG4gKiBAcGFyYW0gbnVtQ2hhbm5lbHMgVGhlIG51bWJlciBvZiBjaGFubmVscyBvZiB0aGUgb3V0cHV0IHRlbnNvci4gQVxuICogbnVtQ2hhbm5lbHMgdmFsdWUgbGVzcyB0aGFuIDQgYWxsb3dzIHlvdSB0byBpZ25vcmUgY2hhbm5lbHMuIERlZmF1bHRzIHRvXG4gKiAzIChpZ25vcmVzIGFscGhhIGNoYW5uZWwgb2YgaW5wdXQgaW1hZ2UpLlxuICpcbiAqIEByZXR1cm5zIEEgVGVuc29yM0Qgd2l0aCB0aGUgc2hhcGUgYFtoZWlnaHQsIHdpZHRoLCBudW1DaGFubmVsc11gLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdCcm93c2VyJywgbmFtZXNwYWNlOiAnYnJvd3NlcicsIGlnbm9yZUNJOiB0cnVlfVxuICovXG5mdW5jdGlvbiBmcm9tUGl4ZWxzXyhwaXhlbHMsIG51bUNoYW5uZWxzID0gMykge1xuICAgIC8vIFNhbml0eSBjaGVja3MuXG4gICAgaWYgKG51bUNoYW5uZWxzID4gNCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjb25zdHJ1Y3QgVGVuc29yIHdpdGggbW9yZSB0aGFuIDQgY2hhbm5lbHMgZnJvbSBwaXhlbHMuJyk7XG4gICAgfVxuICAgIGlmIChwaXhlbHMgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3BpeGVscyBwYXNzZWQgdG8gdGYuYnJvd3Nlci5mcm9tUGl4ZWxzKCkgY2FuIG5vdCBiZSBudWxsJyk7XG4gICAgfVxuICAgIGxldCBpc1BpeGVsRGF0YSA9IGZhbHNlO1xuICAgIGxldCBpc0ltYWdlRGF0YSA9IGZhbHNlO1xuICAgIGxldCBpc1ZpZGVvID0gZmFsc2U7XG4gICAgbGV0IGlzSW1hZ2UgPSBmYWxzZTtcbiAgICBsZXQgaXNDYW52YXNMaWtlID0gZmFsc2U7XG4gICAgbGV0IGlzSW1hZ2VCaXRtYXAgPSBmYWxzZTtcbiAgICBpZiAocGl4ZWxzLmRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7XG4gICAgICAgIGlzUGl4ZWxEYXRhID0gdHJ1ZTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIChJbWFnZURhdGEpICE9PSAndW5kZWZpbmVkJyAmJiBwaXhlbHMgaW5zdGFuY2VvZiBJbWFnZURhdGEpIHtcbiAgICAgICAgaXNJbWFnZURhdGEgPSB0cnVlO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgKEhUTUxWaWRlb0VsZW1lbnQpICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICBwaXhlbHMgaW5zdGFuY2VvZiBIVE1MVmlkZW9FbGVtZW50KSB7XG4gICAgICAgIGlzVmlkZW8gPSB0cnVlO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgKEhUTUxJbWFnZUVsZW1lbnQpICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICBwaXhlbHMgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50KSB7XG4gICAgICAgIGlzSW1hZ2UgPSB0cnVlO1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWFueVxuICAgIH1cbiAgICBlbHNlIGlmIChwaXhlbHMuZ2V0Q29udGV4dCAhPSBudWxsKSB7XG4gICAgICAgIGlzQ2FudmFzTGlrZSA9IHRydWU7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiAoSW1hZ2VCaXRtYXApICE9PSAndW5kZWZpbmVkJyAmJiBwaXhlbHMgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcCkge1xuICAgICAgICBpc0ltYWdlQml0bWFwID0gdHJ1ZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigncGl4ZWxzIHBhc3NlZCB0byB0Zi5icm93c2VyLmZyb21QaXhlbHMoKSBtdXN0IGJlIGVpdGhlciBhbiAnICtcbiAgICAgICAgICAgIGBIVE1MVmlkZW9FbGVtZW50LCBIVE1MSW1hZ2VFbGVtZW50LCBIVE1MQ2FudmFzRWxlbWVudCwgSW1hZ2VEYXRhIGAgK1xuICAgICAgICAgICAgYGluIGJyb3dzZXIsIG9yIE9mZnNjcmVlbkNhbnZhcywgSW1hZ2VEYXRhIGluIHdlYndvcmtlcmAgK1xuICAgICAgICAgICAgYCBvciB7ZGF0YTogVWludDMyQXJyYXksIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyfSwgYCArXG4gICAgICAgICAgICBgYnV0IHdhcyAke3BpeGVscy5jb25zdHJ1Y3Rvci5uYW1lfWApO1xuICAgIH1cbiAgICBpZiAoaXNWaWRlbykge1xuICAgICAgICBjb25zdCBIQVZFX0NVUlJFTlRfREFUQV9SRUFEWV9TVEFURSA9IDI7XG4gICAgICAgIGlmIChpc1ZpZGVvICYmXG4gICAgICAgICAgICBwaXhlbHMucmVhZHlTdGF0ZSA8XG4gICAgICAgICAgICAgICAgSEFWRV9DVVJSRU5UX0RBVEFfUkVBRFlfU1RBVEUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIHZpZGVvIGVsZW1lbnQgaGFzIG5vdCBsb2FkZWQgZGF0YSB5ZXQuIFBsZWFzZSB3YWl0IGZvciAnICtcbiAgICAgICAgICAgICAgICAnYGxvYWRlZGRhdGFgIGV2ZW50IG9uIHRoZSA8dmlkZW8+IGVsZW1lbnQuJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gSWYgdGhlIGN1cnJlbnQgYmFja2VuZCBoYXMgJ0Zyb21QaXhlbHMnIHJlZ2lzdGVyZWQsIGl0IGhhcyBhIG1vcmVcbiAgICAvLyBlZmZpY2llbnQgd2F5IG9mIGhhbmRsaW5nIHBpeGVsIHVwbG9hZHMsIHNvIHdlIGNhbGwgdGhhdC5cbiAgICBjb25zdCBrZXJuZWwgPSBnZXRLZXJuZWwoRnJvbVBpeGVscywgRU5HSU5FLmJhY2tlbmROYW1lKTtcbiAgICBpZiAoa2VybmVsICE9IG51bGwpIHtcbiAgICAgICAgY29uc3QgaW5wdXRzID0geyBwaXhlbHMgfTtcbiAgICAgICAgY29uc3QgYXR0cnMgPSB7IG51bUNoYW5uZWxzIH07XG4gICAgICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEZyb21QaXhlbHMsIGlucHV0cywgYXR0cnMpO1xuICAgIH1cbiAgICBjb25zdCBbd2lkdGgsIGhlaWdodF0gPSBpc1ZpZGVvID9cbiAgICAgICAgW1xuICAgICAgICAgICAgcGl4ZWxzLnZpZGVvV2lkdGgsXG4gICAgICAgICAgICBwaXhlbHMudmlkZW9IZWlnaHRcbiAgICAgICAgXSA6XG4gICAgICAgIFtwaXhlbHMud2lkdGgsIHBpeGVscy5oZWlnaHRdO1xuICAgIGxldCB2YWxzO1xuICAgIGlmIChpc0NhbnZhc0xpa2UpIHtcbiAgICAgICAgdmFscyA9XG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gICAgICAgICAgICBwaXhlbHMuZ2V0Q29udGV4dCgnMmQnKS5nZXRJbWFnZURhdGEoMCwgMCwgd2lkdGgsIGhlaWdodCkuZGF0YTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNJbWFnZURhdGEgfHwgaXNQaXhlbERhdGEpIHtcbiAgICAgICAgdmFscyA9IHBpeGVscy5kYXRhO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc0ltYWdlIHx8IGlzVmlkZW8gfHwgaXNJbWFnZUJpdG1hcCkge1xuICAgICAgICBpZiAoZnJvbVBpeGVsczJEQ29udGV4dCA9PSBudWxsKSB7XG4gICAgICAgICAgICBmcm9tUGl4ZWxzMkRDb250ZXh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJykuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAgICAgfVxuICAgICAgICBmcm9tUGl4ZWxzMkRDb250ZXh0LmNhbnZhcy53aWR0aCA9IHdpZHRoO1xuICAgICAgICBmcm9tUGl4ZWxzMkRDb250ZXh0LmNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgIGZyb21QaXhlbHMyRENvbnRleHQuZHJhd0ltYWdlKHBpeGVscywgMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgIHZhbHMgPSBmcm9tUGl4ZWxzMkRDb250ZXh0LmdldEltYWdlRGF0YSgwLCAwLCB3aWR0aCwgaGVpZ2h0KS5kYXRhO1xuICAgIH1cbiAgICBsZXQgdmFsdWVzO1xuICAgIGlmIChudW1DaGFubmVscyA9PT0gNCkge1xuICAgICAgICB2YWx1ZXMgPSBuZXcgSW50MzJBcnJheSh2YWxzKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IG51bVBpeGVscyA9IHdpZHRoICogaGVpZ2h0O1xuICAgICAgICB2YWx1ZXMgPSBuZXcgSW50MzJBcnJheShudW1QaXhlbHMgKiBudW1DaGFubmVscyk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtUGl4ZWxzOyBpKyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgbnVtQ2hhbm5lbHM7ICsrY2hhbm5lbCkge1xuICAgICAgICAgICAgICAgIHZhbHVlc1tpICogbnVtQ2hhbm5lbHMgKyBjaGFubmVsXSA9IHZhbHNbaSAqIDQgKyBjaGFubmVsXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBvdXRTaGFwZSA9IFtoZWlnaHQsIHdpZHRoLCBudW1DaGFubmVsc107XG4gICAgcmV0dXJuIHRlbnNvcjNkKHZhbHVlcywgb3V0U2hhcGUsICdpbnQzMicpO1xufVxuLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgfGZyb21QaXhlbHNBc3luY3wgdG8gY2hlY2sgd2hldGhlciB0aGUgaW5wdXQgY2FuXG4vLyBiZSB3cmFwcGVkIGludG8gaW1hZ2VCaXRtYXAuXG5mdW5jdGlvbiBpc1BpeGVsRGF0YShwaXhlbHMpIHtcbiAgICByZXR1cm4gKHBpeGVscyAhPSBudWxsKSAmJiAocGl4ZWxzLmRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KTtcbn1cbmZ1bmN0aW9uIGlzSW1hZ2VCaXRtYXBGdWxseVN1cHBvcnRlZCgpIHtcbiAgICByZXR1cm4gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgdHlwZW9mIChJbWFnZUJpdG1hcCkgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgIHdpbmRvdy5oYXNPd25Qcm9wZXJ0eSgnY3JlYXRlSW1hZ2VCaXRtYXAnKTtcbn1cbmZ1bmN0aW9uIGlzTm9uRW1wdHlQaXhlbHMocGl4ZWxzKSB7XG4gICAgcmV0dXJuIHBpeGVscyAhPSBudWxsICYmIHBpeGVscy53aWR0aCAhPT0gMCAmJiBwaXhlbHMuaGVpZ2h0ICE9PSAwO1xufVxuZnVuY3Rpb24gY2FuV3JhcFBpeGVsc1RvSW1hZ2VCaXRtYXAocGl4ZWxzKSB7XG4gICAgcmV0dXJuIGlzSW1hZ2VCaXRtYXBGdWxseVN1cHBvcnRlZCgpICYmICEocGl4ZWxzIGluc3RhbmNlb2YgSW1hZ2VCaXRtYXApICYmXG4gICAgICAgIGlzTm9uRW1wdHlQaXhlbHMocGl4ZWxzKSAmJiAhaXNQaXhlbERhdGEocGl4ZWxzKTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIGB0Zi5UZW5zb3JgIGZyb20gYW4gaW1hZ2UgaW4gYXN5bmMgd2F5LlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBpbWFnZSA9IG5ldyBJbWFnZURhdGEoMSwgMSk7XG4gKiBpbWFnZS5kYXRhWzBdID0gMTAwO1xuICogaW1hZ2UuZGF0YVsxXSA9IDE1MDtcbiAqIGltYWdlLmRhdGFbMl0gPSAyMDA7XG4gKiBpbWFnZS5kYXRhWzNdID0gMjU1O1xuICpcbiAqIChhd2FpdCB0Zi5icm93c2VyLmZyb21QaXhlbHNBc3luYyhpbWFnZSkpLnByaW50KCk7XG4gKiBgYGBcbiAqIFRoaXMgQVBJIGlzIHRoZSBhc3luYyB2ZXJzaW9uIG9mIGZyb21QaXhlbHMuIFRoZSBBUEkgd2lsbCBmaXJzdFxuICogY2hlY2sgfFdSQVBfVE9fSU1BR0VCSVRNQVB8IGZsYWcsIGFuZCB0cnkgdG8gd3JhcCB0aGUgaW5wdXQgdG9cbiAqIGltYWdlQml0bWFwIGlmIHRoZSBmbGFnIGlzIHNldCB0byB0cnVlLlxuICpcbiAqIEBwYXJhbSBwaXhlbHMgVGhlIGlucHV0IGltYWdlIHRvIGNvbnN0cnVjdCB0aGUgdGVuc29yIGZyb20uIFRoZVxuICogc3VwcG9ydGVkIGltYWdlIHR5cGVzIGFyZSBhbGwgNC1jaGFubmVsLiBZb3UgY2FuIGFsc28gcGFzcyBpbiBhbiBpbWFnZVxuICogb2JqZWN0IHdpdGggZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG4gKiBge2RhdGE6IFVpbnQ4QXJyYXk7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyfWBcbiAqIEBwYXJhbSBudW1DaGFubmVscyBUaGUgbnVtYmVyIG9mIGNoYW5uZWxzIG9mIHRoZSBvdXRwdXQgdGVuc29yLiBBXG4gKiBudW1DaGFubmVscyB2YWx1ZSBsZXNzIHRoYW4gNCBhbGxvd3MgeW91IHRvIGlnbm9yZSBjaGFubmVscy4gRGVmYXVsdHMgdG9cbiAqIDMgKGlnbm9yZXMgYWxwaGEgY2hhbm5lbCBvZiBpbnB1dCBpbWFnZSkuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ0Jyb3dzZXInLCBuYW1lc3BhY2U6ICdicm93c2VyJywgaWdub3JlQ0k6IHRydWV9XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmcm9tUGl4ZWxzQXN5bmMocGl4ZWxzLCBudW1DaGFubmVscyA9IDMpIHtcbiAgICBsZXQgaW5wdXRzID0gbnVsbDtcbiAgICAvLyBDaGVjayB3aGV0aGVyIHRoZSBiYWNrZW5kIG5lZWRzIHRvIHdyYXAgfHBpeGVsc3wgdG8gaW1hZ2VCaXRtYXAgYW5kXG4gICAgLy8gd2hldGhlciB8cGl4ZWxzfCBjYW4gYmUgd3JhcHBlZCB0byBpbWFnZUJpdG1hcC5cbiAgICBpZiAoZW52KCkuZ2V0Qm9vbCgnV1JBUF9UT19JTUFHRUJJVE1BUCcpICYmXG4gICAgICAgIGNhbldyYXBQaXhlbHNUb0ltYWdlQml0bWFwKHBpeGVscykpIHtcbiAgICAgICAgLy8gRm9yY2UgdGhlIGltYWdlQml0bWFwIGNyZWF0aW9uIHRvIG5vdCBkbyBhbnkgcHJlbXVsdGlwbHkgYWxwaGFcbiAgICAgICAgLy8gb3BzLlxuICAgICAgICBsZXQgaW1hZ2VCaXRtYXA7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyB3cmFwIGluIHRyeS1jYXRjaCBibG9jaywgYmVjYXVzZSBjcmVhdGVJbWFnZUJpdG1hcCBtYXkgbm90IHdvcmtcbiAgICAgICAgICAgIC8vIHByb3Blcmx5IGluIHNvbWUgYnJvd3NlcnMsIGUuZy5cbiAgICAgICAgICAgIC8vIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTEzMzU1OTRcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tYW55XG4gICAgICAgICAgICBpbWFnZUJpdG1hcCA9IGF3YWl0IGNyZWF0ZUltYWdlQml0bWFwKHBpeGVscywgeyBwcmVtdWx0aXBseUFscGhhOiAnbm9uZScgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGltYWdlQml0bWFwID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICAvLyBjcmVhdGVJbWFnZUJpdG1hcCB3aWxsIGNsaXAgdGhlIHNvdXJjZSBzaXplLlxuICAgICAgICAvLyBJbiBzb21lIGNhc2VzLCB0aGUgaW5wdXQgd2lsbCBoYXZlIGxhcmdlciBzaXplIHRoYW4gaXRzIGNvbnRlbnQuXG4gICAgICAgIC8vIEUuZy4gbmV3IEltYWdlKDEwLCAxMCkgYnV0IHdpdGggMSB4IDEgY29udGVudC4gVXNpbmdcbiAgICAgICAgLy8gY3JlYXRlSW1hZ2VCaXRtYXAgd2lsbCBjbGlwIHRoZSBzaXplIGZyb20gMTAgeCAxMCB0byAxIHggMSwgd2hpY2hcbiAgICAgICAgLy8gaXMgbm90IGNvcnJlY3QuIFdlIHNob3VsZCBhdm9pZCB3cmFwcGluZyBzdWNoIHJlc291Y2UgdG9cbiAgICAgICAgLy8gaW1hZ2VCaXRtYXAuXG4gICAgICAgIGlmIChpbWFnZUJpdG1hcCAhPSBudWxsICYmIGltYWdlQml0bWFwLndpZHRoID09PSBwaXhlbHMud2lkdGggJiZcbiAgICAgICAgICAgIGltYWdlQml0bWFwLmhlaWdodCA9PT0gcGl4ZWxzLmhlaWdodCkge1xuICAgICAgICAgICAgaW5wdXRzID0gaW1hZ2VCaXRtYXA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpbnB1dHMgPSBwaXhlbHM7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlucHV0cyA9IHBpeGVscztcbiAgICB9XG4gICAgcmV0dXJuIGZyb21QaXhlbHNfKGlucHV0cywgbnVtQ2hhbm5lbHMpO1xufVxuLyoqXG4gKiBEcmF3cyBhIGB0Zi5UZW5zb3JgIG9mIHBpeGVsIHZhbHVlcyB0byBhIGJ5dGUgYXJyYXkgb3Igb3B0aW9uYWxseSBhXG4gKiBjYW52YXMuXG4gKlxuICogV2hlbiB0aGUgZHR5cGUgb2YgdGhlIGlucHV0IGlzICdmbG9hdDMyJywgd2UgYXNzdW1lIHZhbHVlcyBpbiB0aGUgcmFuZ2VcbiAqIFswLTFdLiBPdGhlcndpc2UsIHdoZW4gaW5wdXQgaXMgJ2ludDMyJywgd2UgYXNzdW1lIHZhbHVlcyBpbiB0aGUgcmFuZ2VcbiAqIFswLTI1NV0uXG4gKlxuICogUmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBjYW52YXMgaGFzIGJlZW4gZHJhd24gdG8uXG4gKlxuICogQHBhcmFtIGltZyBBIHJhbmstMiB0ZW5zb3Igd2l0aCBzaGFwZSBgW2hlaWdodCwgd2lkdGhdYCwgb3IgYSByYW5rLTMgdGVuc29yXG4gKiBvZiBzaGFwZSBgW2hlaWdodCwgd2lkdGgsIG51bUNoYW5uZWxzXWAuIElmIHJhbmstMiwgZHJhd3MgZ3JheXNjYWxlLiBJZlxuICogcmFuay0zLCBtdXN0IGhhdmUgZGVwdGggb2YgMSwgMyBvciA0LiBXaGVuIGRlcHRoIG9mIDEsIGRyYXdzXG4gKiBncmF5c2NhbGUuIFdoZW4gZGVwdGggb2YgMywgd2UgZHJhdyB3aXRoIHRoZSBmaXJzdCB0aHJlZSBjb21wb25lbnRzIG9mXG4gKiB0aGUgZGVwdGggZGltZW5zaW9uIGNvcnJlc3BvbmRpbmcgdG8gciwgZywgYiBhbmQgYWxwaGEgPSAxLiBXaGVuIGRlcHRoIG9mXG4gKiA0LCBhbGwgZm91ciBjb21wb25lbnRzIG9mIHRoZSBkZXB0aCBkaW1lbnNpb24gY29ycmVzcG9uZCB0byByLCBnLCBiLCBhLlxuICogQHBhcmFtIGNhbnZhcyBUaGUgY2FudmFzIHRvIGRyYXcgdG8uXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ0Jyb3dzZXInLCBuYW1lc3BhY2U6ICdicm93c2VyJ31cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRvUGl4ZWxzKGltZywgY2FudmFzKSB7XG4gICAgbGV0ICRpbWcgPSBjb252ZXJ0VG9UZW5zb3IoaW1nLCAnaW1nJywgJ3RvUGl4ZWxzJyk7XG4gICAgaWYgKCEoaW1nIGluc3RhbmNlb2YgVGVuc29yKSkge1xuICAgICAgICAvLyBBc3N1bWUgaW50MzIgaWYgdXNlciBwYXNzZWQgYSBuYXRpdmUgYXJyYXkuXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsSW1nVGVuc29yID0gJGltZztcbiAgICAgICAgJGltZyA9IGNhc3Qob3JpZ2luYWxJbWdUZW5zb3IsICdpbnQzMicpO1xuICAgICAgICBvcmlnaW5hbEltZ1RlbnNvci5kaXNwb3NlKCk7XG4gICAgfVxuICAgIGlmICgkaW1nLnJhbmsgIT09IDIgJiYgJGltZy5yYW5rICE9PSAzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgdG9QaXhlbHMgb25seSBzdXBwb3J0cyByYW5rIDIgb3IgMyB0ZW5zb3JzLCBnb3QgcmFuayAkeyRpbWcucmFua30uYCk7XG4gICAgfVxuICAgIGNvbnN0IFtoZWlnaHQsIHdpZHRoXSA9ICRpbWcuc2hhcGUuc2xpY2UoMCwgMik7XG4gICAgY29uc3QgZGVwdGggPSAkaW1nLnJhbmsgPT09IDIgPyAxIDogJGltZy5zaGFwZVsyXTtcbiAgICBpZiAoZGVwdGggPiA0IHx8IGRlcHRoID09PSAyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgdG9QaXhlbHMgb25seSBzdXBwb3J0cyBkZXB0aCBvZiBzaXplIGAgK1xuICAgICAgICAgICAgYDEsIDMgb3IgNCBidXQgZ290ICR7ZGVwdGh9YCk7XG4gICAgfVxuICAgIGlmICgkaW1nLmR0eXBlICE9PSAnZmxvYXQzMicgJiYgJGltZy5kdHlwZSAhPT0gJ2ludDMyJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHR5cGUgZm9yIHRvUGl4ZWxzOiAkeyRpbWcuZHR5cGV9LmAgK1xuICAgICAgICAgICAgYCBQbGVhc2UgdXNlIGZsb2F0MzIgb3IgaW50MzIgdGVuc29ycy5gKTtcbiAgICB9XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0ICRpbWcuZGF0YSgpO1xuICAgIGNvbnN0IG11bHRpcGxpZXIgPSAkaW1nLmR0eXBlID09PSAnZmxvYXQzMicgPyAyNTUgOiAxO1xuICAgIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHdpZHRoICogaGVpZ2h0ICogNCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWlnaHQgKiB3aWR0aDsgKytpKSB7XG4gICAgICAgIGNvbnN0IHJnYmEgPSBbMCwgMCwgMCwgMjU1XTtcbiAgICAgICAgZm9yIChsZXQgZCA9IDA7IGQgPCBkZXB0aDsgZCsrKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGRhdGFbaSAqIGRlcHRoICsgZF07XG4gICAgICAgICAgICBpZiAoJGltZy5kdHlwZSA9PT0gJ2Zsb2F0MzInKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlIDwgMCB8fCB2YWx1ZSA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUZW5zb3IgdmFsdWVzIGZvciBhIGZsb2F0MzIgVGVuc29yIG11c3QgYmUgaW4gdGhlIGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYHJhbmdlIFswIC0gMV0gYnV0IGVuY291bnRlcmVkICR7dmFsdWV9LmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCRpbWcuZHR5cGUgPT09ICdpbnQzMicpIHtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPCAwIHx8IHZhbHVlID4gMjU1KSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGVuc29yIHZhbHVlcyBmb3IgYSBpbnQzMiBUZW5zb3IgbXVzdCBiZSBpbiB0aGUgYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgcmFuZ2UgWzAgLSAyNTVdIGJ1dCBlbmNvdW50ZXJlZCAke3ZhbHVlfS5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGVwdGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICByZ2JhWzBdID0gdmFsdWUgKiBtdWx0aXBsaWVyO1xuICAgICAgICAgICAgICAgIHJnYmFbMV0gPSB2YWx1ZSAqIG11bHRpcGxpZXI7XG4gICAgICAgICAgICAgICAgcmdiYVsyXSA9IHZhbHVlICogbXVsdGlwbGllcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJnYmFbZF0gPSB2YWx1ZSAqIG11bHRpcGxpZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaiA9IGkgKiA0O1xuICAgICAgICBieXRlc1tqICsgMF0gPSBNYXRoLnJvdW5kKHJnYmFbMF0pO1xuICAgICAgICBieXRlc1tqICsgMV0gPSBNYXRoLnJvdW5kKHJnYmFbMV0pO1xuICAgICAgICBieXRlc1tqICsgMl0gPSBNYXRoLnJvdW5kKHJnYmFbMl0pO1xuICAgICAgICBieXRlc1tqICsgM10gPSBNYXRoLnJvdW5kKHJnYmFbM10pO1xuICAgIH1cbiAgICBpZiAoY2FudmFzICE9IG51bGwpIHtcbiAgICAgICAgY2FudmFzLndpZHRoID0gd2lkdGg7XG4gICAgICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgICAgICBjb25zdCBpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKGJ5dGVzLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgY3R4LnB1dEltYWdlRGF0YShpbWFnZURhdGEsIDAsIDApO1xuICAgIH1cbiAgICBpZiAoJGltZyAhPT0gaW1nKSB7XG4gICAgICAgICRpbWcuZGlzcG9zZSgpO1xuICAgIH1cbiAgICByZXR1cm4gYnl0ZXM7XG59XG5leHBvcnQgY29uc3QgZnJvbVBpeGVscyA9IG9wKHsgZnJvbVBpeGVsc18gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1icm93c2VyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFRlbnNvckJ1ZmZlciB9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuLyoqXG4gKiBDcmVhdGVzIGFuIGVtcHR5IGB0Zi5UZW5zb3JCdWZmZXJgIHdpdGggdGhlIHNwZWNpZmllZCBgc2hhcGVgIGFuZCBgZHR5cGVgLlxuICpcbiAqIFRoZSB2YWx1ZXMgYXJlIHN0b3JlZCBpbiBDUFUgYXMgYFR5cGVkQXJyYXlgLiBGaWxsIHRoZSBidWZmZXIgdXNpbmdcbiAqIGBidWZmZXIuc2V0KClgLCBvciBieSBtb2RpZnlpbmcgZGlyZWN0bHkgYGJ1ZmZlci52YWx1ZXNgLlxuICpcbiAqIFdoZW4gZG9uZSwgY2FsbCBgYnVmZmVyLnRvVGVuc29yKClgIHRvIGdldCBhbiBpbW11dGFibGUgYHRmLlRlbnNvcmAgd2l0aFxuICogdGhvc2UgdmFsdWVzLlxuICpcbiAqIGBgYGpzXG4gKiAvLyBDcmVhdGUgYSBidWZmZXIgYW5kIHNldCB2YWx1ZXMgYXQgcGFydGljdWxhciBpbmRpY2VzLlxuICogY29uc3QgYnVmZmVyID0gdGYuYnVmZmVyKFsyLCAyXSk7XG4gKiBidWZmZXIuc2V0KDMsIDAsIDApO1xuICogYnVmZmVyLnNldCg1LCAxLCAwKTtcbiAqXG4gKiAvLyBDb252ZXJ0IHRoZSBidWZmZXIgYmFjayB0byBhIHRlbnNvci5cbiAqIGJ1ZmZlci50b1RlbnNvcigpLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gc2hhcGUgQW4gYXJyYXkgb2YgaW50ZWdlcnMgZGVmaW5pbmcgdGhlIG91dHB1dCB0ZW5zb3Igc2hhcGUuXG4gKiBAcGFyYW0gZHR5cGUgVGhlIGR0eXBlIG9mIHRoZSBidWZmZXIuIERlZmF1bHRzIHRvICdmbG9hdDMyJy5cbiAqIEBwYXJhbSB2YWx1ZXMgVGhlIHZhbHVlcyBvZiB0aGUgYnVmZmVyIGFzIGBUeXBlZEFycmF5YC4gRGVmYXVsdHMgdG9cbiAqIHplcm9zLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NyZWF0aW9uJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1ZmZlcihzaGFwZSwgZHR5cGUgPSAnZmxvYXQzMicsIHZhbHVlcykge1xuICAgIGR0eXBlID0gZHR5cGUgfHwgJ2Zsb2F0MzInO1xuICAgIHV0aWwuYXNzZXJ0Tm9uTmVnYXRpdmVJbnRlZ2VyRGltZW5zaW9ucyhzaGFwZSk7XG4gICAgcmV0dXJuIG5ldyBUZW5zb3JCdWZmZXIoc2hhcGUsIGR0eXBlLCB2YWx1ZXMpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YnVmZmVyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBDYXN0IH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENhc3RzIGEgYHRmLlRlbnNvcmAgdG8gYSBuZXcgZHR5cGUuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMS41LCAyLjUsIDNdKTtcbiAqIHRmLmNhc3QoeCwgJ2ludDMyJykucHJpbnQoKTtcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvciB0byBiZSBjYXN0ZWQuXG4gKiBAcGFyYW0gZHR5cGUgVGhlIGR0eXBlIHRvIGNhc3QgdGhlIGlucHV0IHRlbnNvciB0by5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdUcmFuc2Zvcm1hdGlvbnMnfVxuICovXG5mdW5jdGlvbiBjYXN0Xyh4LCBkdHlwZSkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2Nhc3QnKTtcbiAgICAvLyBTYW5pdHkgY2hlY2tzLlxuICAgIGlmICghdXRpbC5pc1ZhbGlkRHR5cGUoZHR5cGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGNhc3QgdG8gdW5rbm93biBkdHlwZSAke2R0eXBlfWApO1xuICAgIH1cbiAgICBpZiAoZHR5cGUgPT09ICdzdHJpbmcnICYmICR4LmR0eXBlICE9PSAnc3RyaW5nJyB8fFxuICAgICAgICBkdHlwZSAhPT0gJ3N0cmluZycgJiYgJHguZHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignT25seSBzdHJpbmdzIGNhbiBiZSBjYXN0ZWQgdG8gc3RyaW5ncycpO1xuICAgIH1cbiAgICBjb25zdCBpbnB1dHMgPSB7IHg6ICR4IH07XG4gICAgY29uc3QgYXR0cnMgPSB7IGR0eXBlIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoQ2FzdCwgaW5wdXRzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3QgY2FzdCA9IG9wKHsgY2FzdF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jYXN0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBDZWlsIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgY2VpbGluZyBvZiBpbnB1dCBgdGYuVGVuc29yYCBlbGVtZW50LXdpc2U6IGBjZWlsKHgpYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWy42LCAxLjEsIC0zLjNdKTtcbiAqXG4gKiB4LmNlaWwoKS5wcmludCgpOyAgLy8gb3IgdGYuY2VpbCh4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgVGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiBjZWlsXyh4KSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnY2VpbCcpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChDZWlsLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IGNlaWwgPSBvcCh7IGNlaWxfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y2VpbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgQ2xpcEJ5VmFsdWUgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ2xpcHMgdmFsdWVzIGVsZW1lbnQtd2lzZS4gYG1heChtaW4oeCwgY2xpcFZhbHVlTWF4KSwgY2xpcFZhbHVlTWluKWBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFstMSwgMiwgLTMsIDRdKTtcbiAqXG4gKiB4LmNsaXBCeVZhbHVlKC0yLCAzKS5wcmludCgpOyAgLy8gb3IgdGYuY2xpcEJ5VmFsdWUoeCwgLTIsIDMpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKiBAcGFyYW0gY2xpcFZhbHVlTWluIExvd2VyLWJvdW5kIG9mIHJhbmdlIHRvIGJlIGNsaXBwZWQgdG8uXG4gKiBAcGFyYW0gY2xpcFZhbHVlTWF4IFVwcGVyLWJvdW5kIG9mIHJhbmdlIHRvIGJlIGNsaXBwZWQgdG8uXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMgbWF0aCd9XG4gKi9cbmZ1bmN0aW9uIGNsaXBCeVZhbHVlXyh4LCBjbGlwVmFsdWVNaW4sIGNsaXBWYWx1ZU1heCkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2NsaXBCeVZhbHVlJyk7XG4gICAgdXRpbC5hc3NlcnQoKGNsaXBWYWx1ZU1pbiA8PSBjbGlwVmFsdWVNYXgpLCAoKSA9PiBgRXJyb3IgaW4gY2xpcDogbWluICgke2NsaXBWYWx1ZU1pbn0pIG11c3QgYmUgYCArXG4gICAgICAgIGBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gbWF4ICgke2NsaXBWYWx1ZU1heH0pLmApO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICBjb25zdCBhdHRycyA9IHsgY2xpcFZhbHVlTWluLCBjbGlwVmFsdWVNYXggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChDbGlwQnlWYWx1ZSwgaW5wdXRzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3QgY2xpcEJ5VmFsdWUgPSBvcCh7IGNsaXBCeVZhbHVlXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNsaXBfYnlfdmFsdWUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IElkZW50aXR5IH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ3JlYXRlcyBhIG5ldyB0ZW5zb3Igd2l0aCB0aGUgc2FtZSB2YWx1ZXMgYW5kIHNoYXBlIGFzIHRoZSBzcGVjaWZpZWRcbiAqIHRlbnNvci5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcihbMSwgMl0pO1xuICpcbiAqIHguY2xvbmUoKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHggVGhlIHRlbnNvciB0byBjbG9uZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDcmVhdGlvbid9XG4gKi9cbmZ1bmN0aW9uIGNsb25lXyh4KSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnY2xvbmUnLCAnc3RyaW5nX29yX251bWVyaWMnKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IHg6ICR4IH07XG4gICAgLy8gTm90ZSB0aGlzIG9wIGlzIGNhbGxlZCB0Zi5pZGVudGl0eSBpbiBweXRob24uIEhlbmNlIHRoZSBrZXJuZWwgbmFtZSB1c2VkXG4gICAgLy8gaGVyZS5cbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChJZGVudGl0eSwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBjbG9uZSA9IG9wKHsgY2xvbmVfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y2xvbmUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IENvbXBsZXggfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29udmVydHMgdHdvIHJlYWwgbnVtYmVycyB0byBhIGNvbXBsZXggbnVtYmVyLlxuICpcbiAqIEdpdmVuIGEgdGVuc29yIGByZWFsYCByZXByZXNlbnRpbmcgdGhlIHJlYWwgcGFydCBvZiBhIGNvbXBsZXggbnVtYmVyLCBhbmQgYVxuICogdGVuc29yIGBpbWFnYCByZXByZXNlbnRpbmcgdGhlIGltYWdpbmFyeSBwYXJ0IG9mIGEgY29tcGxleCBudW1iZXIsIHRoaXNcbiAqIG9wZXJhdGlvbiByZXR1cm5zIGNvbXBsZXggbnVtYmVycyBlbGVtZW50d2lzZSBvZiB0aGUgZm9ybSBbcjAsIGkwLCByMSwgaTFdLFxuICogd2hlcmUgciByZXByZXNlbnRzIHRoZSByZWFsIHBhcnQgYW5kIGkgcmVwcmVzZW50cyB0aGUgaW1hZyBwYXJ0LlxuICpcbiAqIFRoZSBpbnB1dCB0ZW5zb3JzIHJlYWwgYW5kIGltYWcgbXVzdCBoYXZlIHRoZSBzYW1lIHNoYXBlLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCByZWFsID0gdGYudGVuc29yMWQoWzIuMjUsIDMuMjVdKTtcbiAqIGNvbnN0IGltYWcgPSB0Zi50ZW5zb3IxZChbNC43NSwgNS43NV0pO1xuICogY29uc3QgY29tcGxleCA9IHRmLmNvbXBsZXgocmVhbCwgaW1hZyk7XG4gKlxuICogY29tcGxleC5wcmludCgpO1xuICogYGBgXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ3JlYXRpb24nfVxuICovXG5mdW5jdGlvbiBjb21wbGV4XyhyZWFsLCBpbWFnKSB7XG4gICAgY29uc3QgJHJlYWwgPSBjb252ZXJ0VG9UZW5zb3IocmVhbCwgJ3JlYWwnLCAnY29tcGxleCcpO1xuICAgIGNvbnN0ICRpbWFnID0gY29udmVydFRvVGVuc29yKGltYWcsICdpbWFnJywgJ2NvbXBsZXgnKTtcbiAgICB1dGlsLmFzc2VydFNoYXBlc01hdGNoKCRyZWFsLnNoYXBlLCAkaW1hZy5zaGFwZSwgYHJlYWwgYW5kIGltYWcgc2hhcGVzLCAkeyRyZWFsLnNoYXBlfSBhbmQgJHskaW1hZy5zaGFwZX0sIGAgK1xuICAgICAgICBgbXVzdCBtYXRjaCBpbiBjYWxsIHRvIHRmLmNvbXBsZXgoKS5gKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IHJlYWw6ICRyZWFsLCBpbWFnOiAkaW1hZyB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKENvbXBsZXgsIGlucHV0cyk7XG59XG5leHBvcnQgY29uc3QgY29tcGxleCA9IG9wKHsgY29tcGxleF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb21wbGV4LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBDb25jYXQgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yQXJyYXkgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBjbG9uZSB9IGZyb20gJy4vY2xvbmUnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENvbmNhdGVuYXRlcyBhIGxpc3Qgb2YgYHRmLlRlbnNvcmBzIGFsb25nIGEgZ2l2ZW4gYXhpcy5cbiAqXG4gKiBUaGUgdGVuc29ycyByYW5rcyBhbmQgdHlwZXMgbXVzdCBtYXRjaCwgYW5kIHRoZWlyIHNpemVzIG11c3QgbWF0Y2ggaW4gYWxsXG4gKiBkaW1lbnNpb25zIGV4Y2VwdCBgYXhpc2AuXG4gKlxuICogQWxzbyBhdmFpbGFibGUgYXJlIHN0cmljdGVyIHJhbmstc3BlY2lmaWMgbWV0aG9kcyB0aGF0IGFzc2VydCB0aGF0XG4gKiBgdGVuc29yc2AgYXJlIG9mIHRoZSBnaXZlbiByYW5rOlxuICogICAtIGB0Zi5jb25jYXQxZGBcbiAqICAgLSBgdGYuY29uY2F0MmRgXG4gKiAgIC0gYHRmLmNvbmNhdDNkYFxuICogICAtIGB0Zi5jb25jYXQ0ZGBcbiAqXG4gKiBFeGNlcHQgYHRmLmNvbmNhdDFkYCAod2hpY2ggZG9lcyBub3QgaGF2ZSBheGlzIHBhcmFtKSwgYWxsIG1ldGhvZHMgaGF2ZVxuICogc2FtZSBzaWduYXR1cmUgYXMgdGhpcyBtZXRob2QuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgMl0pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjFkKFszLCA0XSk7XG4gKiBhLmNvbmNhdChiKS5wcmludCgpOyAgLy8gb3IgYS5jb25jYXQoYilcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzEsIDJdKTtcbiAqIGNvbnN0IGIgPSB0Zi50ZW5zb3IxZChbMywgNF0pO1xuICogY29uc3QgYyA9IHRmLnRlbnNvcjFkKFs1LCA2XSk7XG4gKiB0Zi5jb25jYXQoW2EsIGIsIGNdKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IyZChbWzEsIDJdLCBbMTAsIDIwXV0pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjJkKFtbMywgNF0sIFszMCwgNDBdXSk7XG4gKiBjb25zdCBheGlzID0gMTtcbiAqIHRmLmNvbmNhdChbYSwgYl0sIGF4aXMpLnByaW50KCk7XG4gKiBgYGBcbiAqIEBwYXJhbSB0ZW5zb3JzIEEgbGlzdCBvZiB0ZW5zb3JzIHRvIGNvbmNhdGVuYXRlLlxuICogQHBhcmFtIGF4aXMgVGhlIGF4aXMgdG8gY29uY2F0ZSBhbG9uZy4gRGVmYXVsdHMgdG8gMCAodGhlIGZpcnN0IGRpbSkuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnU2xpY2luZyBhbmQgSm9pbmluZyd9XG4gKi9cbmZ1bmN0aW9uIGNvbmNhdF8odGVuc29ycywgYXhpcyA9IDApIHtcbiAgICBhc3NlcnQodGVuc29ycy5sZW5ndGggPj0gMSwgKCkgPT4gJ1Bhc3MgYXQgbGVhc3Qgb25lIHRlbnNvciB0byBjb25jYXQnKTtcbiAgICBjb25zdCAkdGVuc29ycyA9IGNvbnZlcnRUb1RlbnNvckFycmF5KHRlbnNvcnMsICd0ZW5zb3JzJywgJ2NvbmNhdCcsICdzdHJpbmdfb3JfbnVtZXJpYycpO1xuICAgIGlmICgkdGVuc29yc1swXS5kdHlwZSA9PT0gJ2NvbXBsZXg2NCcpIHtcbiAgICAgICAgJHRlbnNvcnMuZm9yRWFjaCh0ZW5zb3IgPT4ge1xuICAgICAgICAgICAgaWYgKHRlbnNvci5kdHlwZSAhPT0gJ2NvbXBsZXg2NCcpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjb25jYXRlbmF0ZSBjb21wbGV4NjQgdGVuc29ycyB3aXRoIGEgdGVuc29yXG4gICAgICAgICAgd2l0aCBkdHlwZSAke3RlbnNvci5kdHlwZX0uIGApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgaWYgKCR0ZW5zb3JzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gY2xvbmUoJHRlbnNvcnNbMF0pO1xuICAgIH1cbiAgICBjb25zdCBpbnB1dHMgPSAkdGVuc29ycztcbiAgICBjb25zdCBhdHRyID0geyBheGlzIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoQ29uY2F0LCBpbnB1dHMsIGF0dHIpO1xufVxuZXhwb3J0IGNvbnN0IGNvbmNhdCA9IG9wKHsgY29uY2F0XyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbmNhdC5qcy5tYXAiLCJpbXBvcnQgeyBjb25jYXQgfSBmcm9tICcuL2NvbmNhdCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29uY2F0ZW5hdGVzIGEgbGlzdCBvZmB0Zi5UZW5zb3IxRGBzIGFsb25nIGFuIGF4aXMuIFNlZSBgY29uY2F0YCBmb3IgZGV0YWlscy5cbiAqXG4gKiBGb3IgZXhhbXBsZSwgaWY6XG4gKiBBOiBzaGFwZSgzKSA9IHxyMSwgZzEsIGIxfFxuICogQjogc2hhcGUoMikgPSB8cjIsIGcyfFxuICogQyA9IHRmLmNvbmNhdDFkKFtBLCBCXSkgPT0gfHIxLCBnMSwgYjEsIHIyLCBnMnxcbiAqXG4gKiBAcGFyYW0gdGVuc29ycyBBIGxpc3Qgb2ZgdGYuVGVuc29yYHMgdG8gY29uY2F0ZW5hdGUuXG4gKiBAcmV0dXJuIFRoZSBjb25jYXRlbmF0ZWQgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGNvbmNhdDFkXyh0ZW5zb3JzKSB7XG4gICAgcmV0dXJuIGNvbmNhdCh0ZW5zb3JzLCAwIC8qIGF4aXMgKi8pO1xufVxuZXhwb3J0IGNvbnN0IGNvbmNhdDFkID0gb3AoeyBjb25jYXQxZF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb25jYXRfMWQuanMubWFwIiwiaW1wb3J0IHsgY29uY2F0IH0gZnJvbSAnLi9jb25jYXQnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENvbmNhdGVuYXRlcyBhIGxpc3Qgb2ZgdGYuVGVuc29yMkRgcyBhbG9uZyBhbiBheGlzLiBTZWUgYGNvbmNhdGAgZm9yIGRldGFpbHMuXG4gKlxuICogRm9yIGV4YW1wbGUsIGlmOlxuICogQTogc2hhcGUoMiwgMykgPSB8IHIxLCBnMSwgYjEgfFxuICogICAgICAgICAgICAgICAgICB8IHIyLCBnMiwgYjIgfFxuICpcbiAqIEI6IHNoYXBlKDIsIDMpID0gfCByMywgZzMsIGIzIHxcbiAqICAgICAgICAgICAgICAgICAgfCByNCwgZzQsIGI0IHxcbiAqXG4gKiBDID0gdGYuY29uY2F0MmQoW0EsIEJdLCBheGlzKVxuICpcbiAqIGlmIGF4aXMgPSAwOlxuICogQzogc2hhcGUoNCwgMykgPSB8IHIxLCBnMSwgYjEgfFxuICogICAgICAgICAgICAgICAgICB8IHIyLCBnMiwgYjIgfFxuICogICAgICAgICAgICAgICAgICB8IHIzLCBnMywgYjMgfFxuICogICAgICAgICAgICAgICAgICB8IHI0LCBnNCwgYjQgfFxuICpcbiAqIGlmIGF4aXMgPSAxOlxuICogQyA9IHNoYXBlKDIsIDYpID0gfCByMSwgZzEsIGIxLCByMywgZzMsIGIzIHxcbiAqICAgICAgICAgICAgICAgICAgIHwgcjIsIGcyLCBiMiwgcjQsIGc0LCBiNCB8XG4gKlxuICpcbiAqIEBwYXJhbSB0ZW5zb3JzIEEgbGlzdCBvZiBgdGYuVGVuc29yYHMgdG8gY29uY2F0ZW5hdGUuXG4gKiBAcGFyYW0gYXhpcyBUaGUgYXhpcyB0byBjb25jYXRlbmF0ZSBhbG9uZy5cbiAqIEByZXR1cm4gVGhlIGNvbmNhdGVuYXRlZCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gY29uY2F0MmRfKHRlbnNvcnMsIGF4aXMpIHtcbiAgICByZXR1cm4gY29uY2F0KHRlbnNvcnMsIGF4aXMpO1xufVxuZXhwb3J0IGNvbnN0IGNvbmNhdDJkID0gb3AoeyBjb25jYXQyZF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb25jYXRfMmQuanMubWFwIiwiaW1wb3J0IHsgY29uY2F0IH0gZnJvbSAnLi9jb25jYXQnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENvbmNhdGVuYXRlcyBhIGxpc3Qgb2YgYHRmLlRlbnNvcjNEYHMgYWxvbmcgYW4gYXhpcy5cbiAqIFNlZSBgY29uY2F0YCBmb3IgZGV0YWlscy5cbiAqXG4gKiBGb3IgZXhhbXBsZSwgaWY6XG4gKiBBOiBzaGFwZSgyLCAxLCAzKSA9IHwgcjEsIGcxLCBiMSB8XG4gKiAgICAgICAgICAgICAgICAgICAgIHwgcjIsIGcyLCBiMiB8XG4gKlxuICogQjogc2hhcGUoMiwgMSwgMykgPSB8IHIzLCBnMywgYjMgfFxuICogICAgICAgICAgICAgICAgICAgICB8IHI0LCBnNCwgYjQgfFxuICpcbiAqIEMgPSB0Zi5jb25jYXQzZChbQSwgQl0sIGF4aXMpXG4gKlxuICogaWYgYXhpcyA9IDA6XG4gKiBDOiBzaGFwZSg0LCAxLCAzKSA9IHwgcjEsIGcxLCBiMSB8XG4gKiAgICAgICAgICAgICAgICAgICAgIHwgcjIsIGcyLCBiMiB8XG4gKiAgICAgICAgICAgICAgICAgICAgIHwgcjMsIGczLCBiMyB8XG4gKiAgICAgICAgICAgICAgICAgICAgIHwgcjQsIGc0LCBiNCB8XG4gKlxuICogaWYgYXhpcyA9IDE6XG4gKiBDOiBzaGFwZSgyLCAyLCAzKSA9IHwgcjEsIGcxLCBiMSwgcjMsIGczLCBiMyB8XG4gKiAgICAgICAgICAgICAgICAgICAgIHwgcjIsIGcyLCBiMiwgcjQsIGc0LCBiNCB8XG4gKlxuICogaWYgYXhpcyA9IDI6XG4gKiBDID0gc2hhcGUoMiwgMSwgNikgPSB8IHIxLCBnMSwgYjEsIHIzLCBnMywgYjMgfFxuICogICAgICAgICAgICAgICAgICAgICAgfCByMiwgZzIsIGIyLCByNCwgZzQsIGI0IHxcbiAqXG4gKiBAcGFyYW0gdGVuc29ycyBBIGxpc3Qgb2ZgdGYuVGVuc29yYHMgdG8gY29uY2F0ZW5hdGUuXG4gKiBAcGFyYW0gYXhpcyBUaGUgYXhpcyB0byBjb25jYXRlIGFsb25nLlxuICogQHJldHVybiBUaGUgY29uY2F0ZW5hdGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBjb25jYXQzZF8odGVuc29ycywgYXhpcykge1xuICAgIHJldHVybiBjb25jYXQodGVuc29ycywgYXhpcyk7XG59XG5leHBvcnQgY29uc3QgY29uY2F0M2QgPSBvcCh7IGNvbmNhdDNkXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbmNhdF8zZC5qcy5tYXAiLCJpbXBvcnQgeyBjb25jYXQgfSBmcm9tICcuL2NvbmNhdCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29uY2F0ZW5hdGVzIGEgbGlzdCBvZiBgdGYuVGVuc29yNERgcyBhbG9uZyBhbiBheGlzLlxuICogU2VlIGBjb25jYXRgIGZvciBkZXRhaWxzLlxuICpcbiAqIEBwYXJhbSB0ZW5zb3JzIEEgbGlzdCBvZiBgdGYuVGVuc29yYHMgdG8gY29uY2F0ZW5hdGUuXG4gKiBAcGFyYW0gYXhpcyBUaGUgYXhpcyB0byBjb25jYXRlIGFsb25nLlxuICogQHJldHVybiBUaGUgY29uY2F0ZW5hdGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBjb25jYXQ0ZF8odGVuc29ycywgYXhpcykge1xuICAgIHJldHVybiBjb25jYXQodGVuc29ycywgYXhpcyk7XG59XG5leHBvcnQgY29uc3QgY29uY2F0NGQgPSBvcCh7IGNvbmNhdDRkXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbmNhdF80ZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFBhcmFtc0NvbnNpc3RlbnQoc2hhcGVzLCBheGlzKSB7XG4gICAgY29uc3QgcmFuayA9IHNoYXBlc1swXS5sZW5ndGg7XG4gICAgc2hhcGVzLmZvckVhY2goKHNoYXBlLCBpKSA9PiB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KHNoYXBlLmxlbmd0aCA9PT0gcmFuaywgKCkgPT4gYEVycm9yIGluIGNvbmNhdCR7cmFua31EOiByYW5rIG9mIHRlbnNvcnNbJHtpfV0gbXVzdCBiZSB0aGUgc2FtZSBgICtcbiAgICAgICAgICAgIGBhcyB0aGUgcmFuayBvZiB0aGUgcmVzdCAoJHtyYW5rfSlgKTtcbiAgICB9KTtcbiAgICB1dGlsLmFzc2VydChheGlzID49IDAgJiYgYXhpcyA8IHJhbmssICgpID0+IGBFcnJvciBpbiBjb25jYXQke3Jhbmt9RDogYXhpcyBtdXN0IGJlIGJldHdlZW4gMCBhbmQgJHtyYW5rIC0gMX0uYCk7XG4gICAgY29uc3QgZmlyc3RTaGFwZSA9IHNoYXBlc1swXTtcbiAgICBzaGFwZXMuZm9yRWFjaCgoc2hhcGUsIGkpID0+IHtcbiAgICAgICAgZm9yIChsZXQgciA9IDA7IHIgPCByYW5rOyByKyspIHtcbiAgICAgICAgICAgIHV0aWwuYXNzZXJ0KChyID09PSBheGlzKSB8fCAoc2hhcGVbcl0gPT09IGZpcnN0U2hhcGVbcl0pLCAoKSA9PiBgRXJyb3IgaW4gY29uY2F0JHtyYW5rfUQ6IFNoYXBlIG9mIHRlbnNvcnNbJHtpfV0gKCR7c2hhcGV9KSBgICtcbiAgICAgICAgICAgICAgICBgZG9lcyBub3QgbWF0Y2ggdGhlIHNoYXBlIG9mIHRoZSByZXN0ICgke2ZpcnN0U2hhcGV9KSBgICtcbiAgICAgICAgICAgICAgICBgYWxvbmcgdGhlIG5vbi1jb25jYXRlbmF0ZWQgYXhpcyAke2l9LmApO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZU91dFNoYXBlKHNoYXBlcywgYXhpcykge1xuICAgIGNvbnN0IG91dHB1dFNoYXBlID0gc2hhcGVzWzBdLnNsaWNlKCk7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzaGFwZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgb3V0cHV0U2hhcGVbYXhpc10gKz0gc2hhcGVzW2ldW2F4aXNdO1xuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0U2hhcGU7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb25jYXRfdXRpbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IGNhc3QgfSBmcm9tICcuL2Nhc3QnO1xuaW1wb3J0IHsgbWF0TXVsIH0gZnJvbSAnLi9tYXRfbXVsJztcbmltcG9ydCB7IG9uZUhvdCB9IGZyb20gJy4vb25lX2hvdCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHRyYW5zcG9zZSB9IGZyb20gJy4vdHJhbnNwb3NlJztcbi8qKlxuICogQ29tcHV0ZXMgdGhlIGNvbmZ1c2lvbiBtYXRyaXggZnJvbSB0cnVlIGxhYmVscyBhbmQgcHJlZGljdGVkIGxhYmVscy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgbGFiZWxzID0gdGYudGVuc29yMWQoWzAsIDEsIDIsIDEsIDBdLCAnaW50MzInKTtcbiAqIGNvbnN0IHByZWRpY3Rpb25zID0gdGYudGVuc29yMWQoWzAsIDIsIDIsIDEsIDBdLCAnaW50MzInKTtcbiAqIGNvbnN0IG51bUNsYXNzZXMgPSAzO1xuICogY29uc3Qgb3V0ID0gdGYubWF0aC5jb25mdXNpb25NYXRyaXgobGFiZWxzLCBwcmVkaWN0aW9ucywgbnVtQ2xhc3Nlcyk7XG4gKiBvdXQucHJpbnQoKTtcbiAqIC8vIEV4cGVjdGVkIG91dHB1dCBtYXRyaXg6XG4gKiAvLyBbWzIsIDAsIDBdLFxuICogLy8gIFswLCAxLCAxXSxcbiAqIC8vICBbMCwgMCwgMV1dXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gbGFiZWxzIFRoZSB0YXJnZXQgbGFiZWxzLCBhc3N1bWVkIHRvIGJlIDAtYmFzZWQgaW50ZWdlcnNcbiAqICAgZm9yIHRoZSBjbGFzc2VzLiBUaGUgc2hhcGUgaXMgYFtudW1FeGFtcGxlc11gLCB3aGVyZVxuICogICBgbnVtRXhhbXBsZXNgIGlzIHRoZSBudW1iZXIgb2YgZXhhbXBsZXMgaW5jbHVkZWQuXG4gKiBAcGFyYW0gcHJlZGljdGlvbnMgVGhlIHByZWRpY3RlZCBjbGFzc2VzLCBhc3N1bWVkIHRvIGJlXG4gKiAgIDAtYmFzZWQgaW50ZWdlcnMgZm9yIHRoZSBjbGFzc2VzLiBNdXN0IGhhdmUgdGhlIHNhbWUgc2hhcGUgYXMgYGxhYmVsc2AuXG4gKiBAcGFyYW0gbnVtQ2xhc3NlcyBOdW1iZXIgb2YgYWxsIGNsYXNzZXMsIGFzIGFuIGludGVnZXIuXG4gKiAgIEl0cyB2YWx1ZSBtdXN0IGJlIGxhcmdlciB0aGFuIHRoZSBsYXJnZXN0IGVsZW1lbnQgaW4gYGxhYmVsc2AgYW5kXG4gKiAgIGBwcmVkaWN0aW9uc2AuXG4gKiBAcmV0dXJucyBUaGUgY29uZnVzaW9uIG1hdHJpeCBhcyBhIGludDMyLXR5cGUgMkQgdGVuc29yLiBUaGUgdmFsdWUgYXRcbiAqICAgcm93IGByYCBhbmQgY29sdW1uIGBjYCBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIGV4YW1wbGVzIG9mIGFjdHVhbCBjbGFzc1xuICogICBgcmAgd2VyZSBwcmVkaWN0ZWQgYXMgY2xhc3MgYGNgLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0V2YWx1YXRpb24nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gY29uZnVzaW9uTWF0cml4XyhsYWJlbHMsIHByZWRpY3Rpb25zLCBudW1DbGFzc2VzKSB7XG4gICAgY29uc3QgJGxhYmVscyA9IGNvbnZlcnRUb1RlbnNvcihsYWJlbHMsICdsYWJlbHMnLCAnY29uZnVzaW9uTWF0cml4Jyk7XG4gICAgY29uc3QgJHByZWRpY3Rpb25zID0gY29udmVydFRvVGVuc29yKHByZWRpY3Rpb25zLCAncHJlZGljdGlvbnMnLCAnY29uZnVzaW9uTWF0cml4Jyk7XG4gICAgdXRpbC5hc3NlcnQobnVtQ2xhc3NlcyA9PSBudWxsIHx8IG51bUNsYXNzZXMgPiAwICYmIE51bWJlci5pc0ludGVnZXIobnVtQ2xhc3NlcyksICgpID0+IGBJZiBwcm92aWRlZCwgbnVtQ2xhc3NlcyBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciwgYCArXG4gICAgICAgIGBidXQgZ290ICR7bnVtQ2xhc3Nlc31gKTtcbiAgICB1dGlsLmFzc2VydCgkbGFiZWxzLnJhbmsgPT09IDEsICgpID0+IGBFeHBlY3RlZCB0aGUgcmFuayBvZiBsYWJlbHMgdG8gYmUgMSwgYnV0IGdvdCAkeyRsYWJlbHMucmFua31gKTtcbiAgICB1dGlsLmFzc2VydCgkcHJlZGljdGlvbnMucmFuayA9PT0gMSwgKCkgPT4gYEV4cGVjdGVkIHRoZSByYW5rIG9mIHByZWRpY3Rpb25zIHRvIGJlIDEsIGAgK1xuICAgICAgICBgYnV0IGdvdCAkeyRwcmVkaWN0aW9ucy5yYW5rfWApO1xuICAgIHV0aWwuYXNzZXJ0KCRsYWJlbHMuc2hhcGVbMF0gPT09ICRwcmVkaWN0aW9ucy5zaGFwZVswXSwgKCkgPT4gYE1pc21hdGNoIGluIHRoZSBudW1iZXIgb2YgZXhhbXBsZXM6IGAgK1xuICAgICAgICBgJHskbGFiZWxzLnNoYXBlWzBdfSB2cy4gJHskcHJlZGljdGlvbnMuc2hhcGVbMF19LiBgICtcbiAgICAgICAgYExhYmVscyBhbmQgcHJlZGljdGlvbnMgc2hvdWxkIGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGVsZW1lbnRzLmApO1xuICAgIHV0aWwuYXNzZXJ0KG51bUNsYXNzZXMgPiAwICYmIE51bWJlci5pc0ludGVnZXIobnVtQ2xhc3NlcyksICgpID0+IGBudW1DbGFzc2VzIGlzIHJlcXVpcmVkIHRvIGJlIGEgcG9zaXRpdmUgaW50ZWdlciwgYnV0IGdvdCBgICtcbiAgICAgICAgYCR7bnVtQ2xhc3Nlc31gKTtcbiAgICAvLyBUT0RPKGNhaXMpOiBJbiB0aGUgZnV0dXJlLCBpZiBvbmVIb3Qgc3VwcG9ydHMgdGVuc29ycyBpbnB1dHMgZm9yXG4gICAgLy8gICBgbnVtQ2xhc3Nlc2AsIGBjb25mdXNpb25NYXRyaXhgIGNhbiBtYWtlIGBudW1DbGFzc2VzYCBvcHRpb25hbC5cbiAgICBjb25zdCBvbmVIb3RMYWJlbHMgPSBvbmVIb3QoY2FzdCgkbGFiZWxzLCAnaW50MzInKSwgbnVtQ2xhc3Nlcyk7XG4gICAgY29uc3Qgb25lSG90UHJlZGljdGlvbnMgPSBvbmVIb3QoY2FzdCgkcHJlZGljdGlvbnMsICdpbnQzMicpLCBudW1DbGFzc2VzKTtcbiAgICBjb25zdCBvbmVIb3RMYWJlbHNUID0gdHJhbnNwb3NlKG9uZUhvdExhYmVscyk7XG4gICAgY29uc3QgcHJvZHVjdCA9IG1hdE11bChvbmVIb3RMYWJlbHNULCBvbmVIb3RQcmVkaWN0aW9ucyk7XG4gICAgcmV0dXJuIGNhc3QocHJvZHVjdCwgJ2ludDMyJyk7XG59XG5leHBvcnQgY29uc3QgY29uZnVzaW9uTWF0cml4ID0gb3AoeyBjb25mdXNpb25NYXRyaXhfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29uZnVzaW9uX21hdHJpeC5qcy5tYXAiLCJpbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IGNvbnYyZCB9IGZyb20gJy4vY29udjJkJztcbmltcG9ydCAqIGFzIGNvbnZfdXRpbCBmcm9tICcuL2NvbnZfdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL3Jlc2hhcGUnO1xuLyoqXG4gKiBDb21wdXRlcyBhIDFEIGNvbnZvbHV0aW9uIG92ZXIgdGhlIGlucHV0IHguXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvciwgb2YgcmFuayAzIG9yIHJhbmsgMiwgb2Ygc2hhcGVcbiAqICAgICBgW2JhdGNoLCB3aWR0aCwgaW5DaGFubmVsc11gLiBJZiByYW5rIDIsIGJhdGNoIG9mIDEgaXMgYXNzdW1lZC5cbiAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlciwgcmFuayAzLCBvZiBzaGFwZVxuICogICAgIGBbZmlsdGVyV2lkdGgsIGluRGVwdGgsIG91dERlcHRoXWAuXG4gKiBAcGFyYW0gc3RyaWRlIFRoZSBudW1iZXIgb2YgZW50cmllcyBieSB3aGljaCB0aGUgZmlsdGVyIGlzIG1vdmVkIHJpZ2h0IGF0XG4gKiAgICAgZWFjaCBzdGVwLlxuICogQHBhcmFtIHBhZCBUaGUgdHlwZSBvZiBwYWRkaW5nIGFsZ29yaXRobS5cbiAqICAgIC0gYHNhbWVgIGFuZCBzdHJpZGUgMTogb3V0cHV0IHdpbGwgYmUgb2Ygc2FtZSBzaXplIGFzIGlucHV0LFxuICogICAgICAgcmVnYXJkbGVzcyBvZiBmaWx0ZXIgc2l6ZS5cbiAqICAgIC0gYHZhbGlkYDogb3V0cHV0IHdpbGwgYmUgc21hbGxlciB0aGFuIGlucHV0IGlmIGZpbHRlciBpcyBsYXJnZXJcbiAqICAgICAgIHRoYW4gMXgxLlxuICogICAtIEZvciBtb3JlIGluZm8sIHNlZSB0aGlzIGd1aWRlOlxuICogICAgIFtodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvbm4vY29udm9sdXRpb25dKFxuICogICAgICAgICAgaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uKVxuICogQHBhcmFtIGRhdGFGb3JtYXQgQW4gb3B0aW9uYWwgc3RyaW5nIGZyb20gXCJOV0NcIiwgXCJOQ1dcIi4gRGVmYXVsdHMgdG8gXCJOV0NcIixcbiAqICAgICB0aGUgZGF0YSBpcyBzdG9yZWQgaW4gdGhlIG9yZGVyIG9mIFtiYXRjaCwgaW5fd2lkdGgsIGluX2NoYW5uZWxzXS4gT25seVxuICogICAgIFwiTldDXCIgaXMgY3VycmVudGx5IHN1cHBvcnRlZC5cbiAqIEBwYXJhbSBkaWxhdGlvbiBUaGUgZGlsYXRpb24gcmF0ZSBpbiB3aGljaCB3ZSBzYW1wbGUgaW5wdXQgdmFsdWVzIGluXG4gKiAgICAgYXRyb3VzIGNvbnZvbHV0aW9uLiBEZWZhdWx0cyB0byBgMWAuIElmIGl0IGlzIGdyZWF0ZXIgdGhhbiAxLCB0aGVuXG4gKiAgICAgc3RyaWRlIG11c3QgYmUgYDFgLlxuICogQHBhcmFtIGRpbVJvdW5kaW5nTW9kZSBBIHN0cmluZyBmcm9tOiAnY2VpbCcsICdyb3VuZCcsICdmbG9vcicuIElmIG5vbmUgaXNcbiAqICAgICBwcm92aWRlZCwgaXQgd2lsbCBkZWZhdWx0IHRvIHRydW5jYXRlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0NvbnZvbHV0aW9uJ31cbiAqL1xuZnVuY3Rpb24gY29udjFkXyh4LCBmaWx0ZXIsIHN0cmlkZSwgcGFkLCBkYXRhRm9ybWF0ID0gJ05XQycsIGRpbGF0aW9uID0gMSwgZGltUm91bmRpbmdNb2RlKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnY29udjFkJyk7XG4gICAgY29uc3QgJGZpbHRlciA9IGNvbnZlcnRUb1RlbnNvcihmaWx0ZXIsICdmaWx0ZXInLCAnY29udjFkJyk7XG4gICAgbGV0IHgzRCA9ICR4O1xuICAgIGxldCByZXNoYXBlZFRvM0QgPSBmYWxzZTtcbiAgICBpZiAoJHgucmFuayA9PT0gMikge1xuICAgICAgICByZXNoYXBlZFRvM0QgPSB0cnVlO1xuICAgICAgICB4M0QgPSByZXNoYXBlKCR4LCBbMSwgJHguc2hhcGVbMF0sICR4LnNoYXBlWzFdXSk7XG4gICAgfVxuICAgIHV0aWwuYXNzZXJ0KHgzRC5yYW5rID09PSAzLCAoKSA9PiBgRXJyb3IgaW4gY29udjFkOiBpbnB1dCBtdXN0IGJlIHJhbmsgMywgYnV0IGdvdCByYW5rICR7eDNELnJhbmt9LmApO1xuICAgIHV0aWwuYXNzZXJ0KCRmaWx0ZXIucmFuayA9PT0gMywgKCkgPT4gYEVycm9yIGluIGNvbnYxZDogZmlsdGVyIG11c3QgYmUgcmFuayAzLCBidXQgZ290IHJhbmsgYCArXG4gICAgICAgIGAkeyRmaWx0ZXIucmFua30uYCk7XG4gICAgaWYgKGRpbVJvdW5kaW5nTW9kZSAhPSBudWxsKSB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KHV0aWwuaXNJbnQocGFkKSwgKCkgPT4gYEVycm9yIGluIGNvbnYxZDogcGFkIG11c3QgYmUgYW4gaW50ZWdlciB3aGVuIHVzaW5nLCBgICtcbiAgICAgICAgICAgIGBkaW1Sb3VuZGluZ01vZGUgJHtkaW1Sb3VuZGluZ01vZGV9IGJ1dCBnb3QgcGFkICR7cGFkfS5gKTtcbiAgICB9XG4gICAgdXRpbC5hc3NlcnQoeDNELnNoYXBlWzJdID09PSAkZmlsdGVyLnNoYXBlWzFdLCAoKSA9PiBgRXJyb3IgaW4gY29udjFkOiBkZXB0aCBvZiBpbnB1dCAoJHt4M0Quc2hhcGVbMl19KSBtdXN0IG1hdGNoIGAgK1xuICAgICAgICBgaW5wdXQgZGVwdGggZm9yIGZpbHRlciAkeyRmaWx0ZXIuc2hhcGVbMV19LmApO1xuICAgIHV0aWwuYXNzZXJ0KGNvbnZfdXRpbC5laXRoZXJTdHJpZGVzT3JEaWxhdGlvbnNBcmVPbmUoc3RyaWRlLCBkaWxhdGlvbiksICgpID0+ICdFcnJvciBpbiBjb252MUQ6IEVpdGhlciBzdHJpZGUgb3IgZGlsYXRpb24gbXVzdCBiZSAxLiAnICtcbiAgICAgICAgYEdvdCBzdHJpZGUgJHtzdHJpZGV9IGFuZCBkaWxhdGlvbiAnJHtkaWxhdGlvbn0nYCk7XG4gICAgdXRpbC5hc3NlcnQoZGF0YUZvcm1hdCA9PT0gJ05XQycsICgpID0+IGBFcnJvciBpbiBjb252MWQ6IGdvdCBkYXRhRm9ybWF0IG9mICR7ZGF0YUZvcm1hdH0gYnV0IG9ubHkgTldDIGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQuYCk7XG4gICAgY29uc3QgZmlsdGVyNEQgPSByZXNoYXBlKCRmaWx0ZXIsIFsxLCAkZmlsdGVyLnNoYXBlWzBdLCAkZmlsdGVyLnNoYXBlWzFdLCAkZmlsdGVyLnNoYXBlWzJdXSk7XG4gICAgY29uc3QgaW5wdXQ0RCA9IHJlc2hhcGUoeDNELCBbeDNELnNoYXBlWzBdLCAxLCB4M0Quc2hhcGVbMV0sIHgzRC5zaGFwZVsyXV0pO1xuICAgIGNvbnN0IHN0cmlkZXMgPSBbMSwgc3RyaWRlXTtcbiAgICBjb25zdCBkaWxhdGlvbnMgPSBbMSwgZGlsYXRpb25dO1xuICAgIGNvbnN0IGNvbnYyZERhdGFGb3JtYXQgPSAnTkhXQyc7XG4gICAgY29uc3QgcmVzID0gY29udjJkKGlucHV0NEQsIGZpbHRlcjRELCBzdHJpZGVzLCBwYWQsIGNvbnYyZERhdGFGb3JtYXQsIGRpbGF0aW9ucywgZGltUm91bmRpbmdNb2RlKTtcbiAgICBpZiAocmVzaGFwZWRUbzNEKSB7XG4gICAgICAgIHJldHVybiByZXNoYXBlKHJlcywgW3Jlcy5zaGFwZVsyXSwgcmVzLnNoYXBlWzNdXSk7XG4gICAgfVxuICAgIHJldHVybiByZXNoYXBlKHJlcywgW3Jlcy5zaGFwZVswXSwgcmVzLnNoYXBlWzJdLCByZXMuc2hhcGVbM11dKTtcbn1cbmV4cG9ydCBjb25zdCBjb252MWQgPSBvcCh7IGNvbnYxZF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb252MWQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IENvbnYyRCB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmltcG9ydCAqIGFzIGNvbnZfdXRpbCBmcm9tICcuL2NvbnZfdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL3Jlc2hhcGUnO1xuLyoqXG4gKiBDb21wdXRlcyBhIDJEIGNvbnZvbHV0aW9uIG92ZXIgdGhlIGlucHV0IHguXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvciwgb2YgcmFuayA0IG9yIHJhbmsgMywgb2Ygc2hhcGVcbiAqICAgICBgW2JhdGNoLCBoZWlnaHQsIHdpZHRoLCBpbkNoYW5uZWxzXWAuIElmIHJhbmsgMywgYmF0Y2ggb2YgMSBpc1xuICogYXNzdW1lZC5cbiAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlciwgcmFuayA0LCBvZiBzaGFwZVxuICogICAgIGBbZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgaW5EZXB0aCwgb3V0RGVwdGhdYC5cbiAqIEBwYXJhbSBzdHJpZGVzIFRoZSBzdHJpZGVzIG9mIHRoZSBjb252b2x1dGlvbjogYFtzdHJpZGVIZWlnaHQsXG4gKiBzdHJpZGVXaWR0aF1gLlxuICogQHBhcmFtIHBhZCBUaGUgdHlwZSBvZiBwYWRkaW5nIGFsZ29yaXRobS5cbiAqICAgIC0gYHNhbWVgIGFuZCBzdHJpZGUgMTogb3V0cHV0IHdpbGwgYmUgb2Ygc2FtZSBzaXplIGFzIGlucHV0LFxuICogICAgICAgcmVnYXJkbGVzcyBvZiBmaWx0ZXIgc2l6ZS5cbiAqICAgIC0gYHZhbGlkYDogb3V0cHV0IHdpbGwgYmUgc21hbGxlciB0aGFuIGlucHV0IGlmIGZpbHRlciBpcyBsYXJnZXJcbiAqICAgICAgIHRoYW4gMXgxLlxuICogICAtIEZvciBtb3JlIGluZm8sIHNlZSB0aGlzIGd1aWRlOlxuICogICAgIFtodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvbm4vY29udm9sdXRpb25dKFxuICogICAgICAgICAgaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uKVxuICogQHBhcmFtIGRhdGFGb3JtYXQ6IEFuIG9wdGlvbmFsIHN0cmluZyBmcm9tOiBcIk5IV0NcIiwgXCJOQ0hXXCIuIERlZmF1bHRzIHRvXG4gKiAgICAgXCJOSFdDXCIuIFNwZWNpZnkgdGhlIGRhdGEgZm9ybWF0IG9mIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGRhdGEuIFdpdGggdGhlXG4gKiAgICAgZGVmYXVsdCBmb3JtYXQgXCJOSFdDXCIsIHRoZSBkYXRhIGlzIHN0b3JlZCBpbiB0aGUgb3JkZXIgb2Y6IFtiYXRjaCxcbiAqICAgICBoZWlnaHQsIHdpZHRoLCBjaGFubmVsc10uXG4gKiBAcGFyYW0gZGlsYXRpb25zIFRoZSBkaWxhdGlvbiByYXRlczogYFtkaWxhdGlvbkhlaWdodCwgZGlsYXRpb25XaWR0aF1gXG4gKiAgICAgaW4gd2hpY2ggd2Ugc2FtcGxlIGlucHV0IHZhbHVlcyBhY3Jvc3MgdGhlIGhlaWdodCBhbmQgd2lkdGggZGltZW5zaW9uc1xuICogICAgIGluIGF0cm91cyBjb252b2x1dGlvbi4gRGVmYXVsdHMgdG8gYFsxLCAxXWAuIElmIGBkaWxhdGlvbnNgIGlzIGEgc2luZ2xlXG4gKiAgICAgbnVtYmVyLCB0aGVuIGBkaWxhdGlvbkhlaWdodCA9PSBkaWxhdGlvbldpZHRoYC4gSWYgaXQgaXMgZ3JlYXRlciB0aGFuXG4gKiAgICAgMSwgdGhlbiBhbGwgdmFsdWVzIG9mIGBzdHJpZGVzYCBtdXN0IGJlIDEuXG4gKiBAcGFyYW0gZGltUm91bmRpbmdNb2RlIEEgc3RyaW5nIGZyb206ICdjZWlsJywgJ3JvdW5kJywgJ2Zsb29yJy4gSWYgbm9uZSBpc1xuICogICAgIHByb3ZpZGVkLCBpdCB3aWxsIGRlZmF1bHQgdG8gdHJ1bmNhdGUuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQ29udm9sdXRpb24nfVxuICovXG5mdW5jdGlvbiBjb252MmRfKHgsIGZpbHRlciwgc3RyaWRlcywgcGFkLCBkYXRhRm9ybWF0ID0gJ05IV0MnLCBkaWxhdGlvbnMgPSBbMSwgMV0sIGRpbVJvdW5kaW5nTW9kZSkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2NvbnYyZCcpO1xuICAgIGNvbnN0ICRmaWx0ZXIgPSBjb252ZXJ0VG9UZW5zb3IoZmlsdGVyLCAnZmlsdGVyJywgJ2NvbnYyZCcpO1xuICAgIGxldCB4NEQgPSAkeDtcbiAgICBsZXQgcmVzaGFwZWRUbzREID0gZmFsc2U7XG4gICAgaWYgKCR4LnJhbmsgPT09IDMpIHtcbiAgICAgICAgcmVzaGFwZWRUbzREID0gdHJ1ZTtcbiAgICAgICAgeDREID0gcmVzaGFwZSgkeCwgWzEsICR4LnNoYXBlWzBdLCAkeC5zaGFwZVsxXSwgJHguc2hhcGVbMl1dKTtcbiAgICB9XG4gICAgdXRpbC5hc3NlcnQoeDRELnJhbmsgPT09IDQsICgpID0+IGBFcnJvciBpbiBjb252MmQ6IGlucHV0IG11c3QgYmUgcmFuayA0LCBidXQgZ290IHJhbmsgJHt4NEQucmFua30uYCk7XG4gICAgdXRpbC5hc3NlcnQoJGZpbHRlci5yYW5rID09PSA0LCAoKSA9PiBgRXJyb3IgaW4gY29udjJkOiBmaWx0ZXIgbXVzdCBiZSByYW5rIDQsIGJ1dCBnb3QgcmFuayBgICtcbiAgICAgICAgYCR7JGZpbHRlci5yYW5rfS5gKTtcbiAgICBpZiAoZGltUm91bmRpbmdNb2RlICE9IG51bGwpIHtcbiAgICAgICAgdXRpbC5hc3NlcnQodXRpbC5pc0ludChwYWQpLCAoKSA9PiBgRXJyb3IgaW4gY29udjJkOiBwYWQgbXVzdCBiZSBhbiBpbnRlZ2VyIHdoZW4gdXNpbmcsIGAgK1xuICAgICAgICAgICAgYGRpbVJvdW5kaW5nTW9kZSAke2RpbVJvdW5kaW5nTW9kZX0gYnV0IGdvdCBwYWQgJHtwYWR9LmApO1xuICAgIH1cbiAgICBjb25zdCBpbkRlcHRoID0gZGF0YUZvcm1hdCA9PT0gJ05IV0MnID8geDRELnNoYXBlWzNdIDogeDRELnNoYXBlWzFdO1xuICAgIHV0aWwuYXNzZXJ0KGluRGVwdGggPT09ICRmaWx0ZXIuc2hhcGVbMl0sICgpID0+IGBFcnJvciBpbiBjb252MmQ6IGRlcHRoIG9mIGlucHV0ICgke2luRGVwdGh9KSBtdXN0IG1hdGNoIGAgK1xuICAgICAgICBgaW5wdXQgZGVwdGggZm9yIGZpbHRlciAkeyRmaWx0ZXIuc2hhcGVbMl19LmApO1xuICAgIHV0aWwuYXNzZXJ0KGNvbnZfdXRpbC5laXRoZXJTdHJpZGVzT3JEaWxhdGlvbnNBcmVPbmUoc3RyaWRlcywgZGlsYXRpb25zKSwgKCkgPT4gJ0Vycm9yIGluIGNvbnYyRDogRWl0aGVyIHN0cmlkZXMgb3IgZGlsYXRpb25zIG11c3QgYmUgMS4gJyArXG4gICAgICAgIGBHb3Qgc3RyaWRlcyAke3N0cmlkZXN9IGFuZCBkaWxhdGlvbnMgJyR7ZGlsYXRpb25zfSdgKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IHg6IHg0RCwgZmlsdGVyOiAkZmlsdGVyIH07XG4gICAgY29uc3QgYXR0cnMgPSB7IHN0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdCwgZGlsYXRpb25zLCBkaW1Sb3VuZGluZ01vZGUgfTtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgY29uc3QgcmVzID0gRU5HSU5FLnJ1bktlcm5lbChDb252MkQsIGlucHV0cywgYXR0cnMpO1xuICAgIGlmIChyZXNoYXBlZFRvNEQpIHtcbiAgICAgICAgcmV0dXJuIHJlc2hhcGUocmVzLCBbcmVzLnNoYXBlWzFdLCByZXMuc2hhcGVbMl0sIHJlcy5zaGFwZVszXV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufVxuZXhwb3J0IGNvbnN0IGNvbnYyZCA9IG9wKHsgY29udjJkXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbnYyZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgQ29udjJEQmFja3Byb3BGaWx0ZXIgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vcmVzaGFwZSc7XG4vKipcbiAqIENvbXB1dGVzIHRoZSBkZXJpdmF0aXZlIG9mIHRoZSBmaWx0ZXIgb2YgYSAyRCBjb252b2x1dGlvbi5cbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLCBvZiByYW5rIDQgb3IgcmFuayAzIG9mIHNoYXBlXG4gKiAgICAgW2JhdGNoLCBoZWlnaHQsIHdpZHRoLCBpbkNoYW5uZWxzXS4gSWYgcmFuayAzLCBiYXRjaCBvZiAxIGlzIGFzc3VtZWQuXG4gKiBAcGFyYW0gZHkgVGhlIGR5IGltYWdlLCBvZiByYW5rIDQgb3IgcmFuayAzLCBvZiBzaGFwZVxuICogICAgIFtiYXRjaCwgaGVpZ2h0LCB3aWR0aCwgb3V0RGVwdGhdLiBJZiByYW5rIDMsIGJhdGNoIG9mIDEgaXMgYXNzdW1lZC5cbiAqIEBwYXJhbSBmaWx0ZXJTaGFwZSBUaGUgc2hhcGUgb2YgdGhlIGZpbHRlciwgbGVuZ3RoIDQsXG4gKiAgICAgW2ZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsIGluRGVwdGgsIG91dERlcHRoXS5cbiAqIEBwYXJhbSBzdHJpZGVzIFRoZSBzdHJpZGVzIG9mIHRoZSBjb252b2x1dGlvbjogW3N0cmlkZUhlaWdodCxcbiAqIHN0cmlkZVdpZHRoXS5cbiAqIEBwYXJhbSBwYWQgQSBzdHJpbmcgZnJvbTogJ3NhbWUnLCAndmFsaWQnLiBUaGUgdHlwZSBvZiBwYWRkaW5nIGFsZ29yaXRobVxuICogICAgIHVzZWQgaW4gdGhlIGZvcndhcmQgcHJvcCBvZiB0aGUgb3AuXG4gKiBAcGFyYW0gZGF0YUZvcm1hdDogQW4gb3B0aW9uYWwgc3RyaW5nIGZyb206IFwiTkhXQ1wiLCBcIk5DSFdcIi4gRGVmYXVsdHMgdG9cbiAqICAgICBcIk5IV0NcIi4gU3BlY2lmeSB0aGUgZGF0YSBmb3JtYXQgb2YgdGhlIGlucHV0IGFuZCBvdXRwdXQgZGF0YS4gV2l0aCB0aGVcbiAqICAgICBkZWZhdWx0IGZvcm1hdCBcIk5IV0NcIiwgdGhlIGRhdGEgaXMgc3RvcmVkIGluIHRoZSBvcmRlciBvZjogW2JhdGNoLFxuICogICAgIGhlaWdodCwgd2lkdGgsIGNoYW5uZWxzXS5cbiAqIEBwYXJhbSBkaW1Sb3VuZGluZ01vZGUgQSBzdHJpbmcgZnJvbTogJ2NlaWwnLCAncm91bmQnLCAnZmxvb3InLiBJZiBub25lIGlzXG4gKiAgICAgcHJvdmlkZWQsIGl0IHdpbGwgZGVmYXVsdCB0byB0cnVuY2F0ZS5cbiAqL1xuZnVuY3Rpb24gY29udjJEQmFja3Byb3BGaWx0ZXJfKHgsIGR5LCBmaWx0ZXJTaGFwZSwgc3RyaWRlcywgcGFkLCBkYXRhRm9ybWF0ID0gJ05IV0MnLCBkaW1Sb3VuZGluZ01vZGUpIHtcbiAgICBsZXQgeDREID0geDtcbiAgICBpZiAoeC5yYW5rID09PSAzKSB7XG4gICAgICAgIHg0RCA9IHJlc2hhcGUoeCwgWzEsIHguc2hhcGVbMF0sIHguc2hhcGVbMV0sIHguc2hhcGVbMl1dKTtcbiAgICB9XG4gICAgbGV0IGR5NEQgPSBkeTtcbiAgICBpZiAoZHk0RC5yYW5rID09PSAzKSB7XG4gICAgICAgIGR5NEQgPSByZXNoYXBlKGR5LCBbMSwgZHkuc2hhcGVbMF0sIGR5LnNoYXBlWzFdLCBkeS5zaGFwZVsyXV0pO1xuICAgIH1cbiAgICB1dGlsLmFzc2VydCh4NEQucmFuayA9PT0gNCwgKCkgPT4gYEVycm9yIGluIGNvbnYyZERlckZpbHRlcjogaW5wdXQgbXVzdCBiZSByYW5rIDQsIGJ1dCBnb3Qgc2hhcGUgYCArXG4gICAgICAgIGAke3g0RC5zaGFwZX0uYCk7XG4gICAgdXRpbC5hc3NlcnQoZHk0RC5yYW5rID09PSA0LCAoKSA9PiBgRXJyb3IgaW4gY29udjJkRGVyRmlsdGVyOiBkeSBtdXN0IGJlIHJhbmsgNCwgYnV0IGdvdCBzaGFwZSBgICtcbiAgICAgICAgYCR7ZHk0RC5zaGFwZX0uYCk7XG4gICAgdXRpbC5hc3NlcnQoZmlsdGVyU2hhcGUubGVuZ3RoID09PSA0LCAoKSA9PiBgRXJyb3IgaW4gY29udjJkRGVyRmlsdGVyOiBmaWx0ZXJTaGFwZSBtdXN0IGJlIGxlbmd0aCA0LCBidXQgZ290IGAgK1xuICAgICAgICBgJHtmaWx0ZXJTaGFwZX0uYCk7XG4gICAgY29uc3QgaW5EZXB0aCA9IGRhdGFGb3JtYXQgPT09ICdOSFdDJyA/IHg0RC5zaGFwZVszXSA6IHg0RC5zaGFwZVsxXTtcbiAgICBjb25zdCBvdXREZXB0aCA9IGRhdGFGb3JtYXQgPT09ICdOSFdDJyA/IGR5NEQuc2hhcGVbM10gOiBkeTRELnNoYXBlWzFdO1xuICAgIHV0aWwuYXNzZXJ0KGluRGVwdGggPT09IGZpbHRlclNoYXBlWzJdLCAoKSA9PiBgRXJyb3IgaW4gY29udjJkRGVyRmlsdGVyOiBkZXB0aCBvZiBpbnB1dCAke2luRGVwdGh9KSBtdXN0IGAgK1xuICAgICAgICBgbWF0Y2ggaW5wdXQgZGVwdGggaW4gZmlsdGVyICgke2ZpbHRlclNoYXBlWzJdfS5gKTtcbiAgICB1dGlsLmFzc2VydChvdXREZXB0aCA9PT0gZmlsdGVyU2hhcGVbM10sICgpID0+IGBFcnJvciBpbiBjb252MmREZXJGaWx0ZXI6IGRlcHRoIG9mIGR5ICgke291dERlcHRofSkgbXVzdCBgICtcbiAgICAgICAgYG1hdGNoIG91dHB1dCBkZXB0aCBmb3IgZmlsdGVyICgke2ZpbHRlclNoYXBlWzNdfSkuYCk7XG4gICAgaWYgKGRpbVJvdW5kaW5nTW9kZSAhPSBudWxsKSB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KHV0aWwuaXNJbnQocGFkKSwgKCkgPT4gYEVycm9yIGluIGNvbnYyZERlckZpbHRlcjogcGFkIG11c3QgYmUgYW4gaW50ZWdlciB3aGVuIHVzaW5nLCBgICtcbiAgICAgICAgICAgIGBkaW1Sb3VuZGluZ01vZGUgJHtkaW1Sb3VuZGluZ01vZGV9IGJ1dCBnb3QgcGFkICR7cGFkfS5gKTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiB4NEQsIGR5OiBkeTREIH07XG4gICAgY29uc3QgYXR0cnMgPSB7IHN0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdCwgZGltUm91bmRpbmdNb2RlLCBmaWx0ZXJTaGFwZSB9O1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChDb252MkRCYWNrcHJvcEZpbHRlciwgaW5wdXRzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3QgY29udjJEQmFja3Byb3BGaWx0ZXIgPSBvcCh7IGNvbnYyREJhY2twcm9wRmlsdGVyXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbnYyZF9iYWNrcHJvcF9maWx0ZXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IENvbnYyREJhY2twcm9wSW5wdXQgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vcmVzaGFwZSc7XG4vKipcbiAqIENvbXB1dGVzIHRoZSBkZXJpdmF0aXZlIG9mIHRoZSBpbnB1dCBvZiBhIDJEIGNvbnZvbHV0aW9uLlxuICpcbiAqIEBwYXJhbSB4U2hhcGUgVGhlIHNoYXBlIG9mIHRoZSBpbnB1dDogW2JhdGNoLCBoZWlnaHQsIHdpZHRoLCBpbkRlcHRoXS5cbiAqIElmIGxlbmd0aCBvZiAzLCBiYXRjaCBvZiAxIGlzIGFzc3VtZWQuXG4gKiBAcGFyYW0gZHkgVGhlIGRlcml2YXRpdmUgb2YgdGhlIG91dHB1dCwgb2YgcmFuayA0IG9yIHJhbmsgMyBvZiBzaGFwZVxuICogICBgW2JhdGNoLCBvdXRIZWlnaHQsIG91dFdpZHRoLCBvdXREZXB0aF1gLiBJZiByYW5rIDMsIGJhdGNoIG9mIDEgaXNcbiAqIGFzc3VtZWQuXG4gKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIsIHJhbmsgNCwgb2Ygc2hhcGVcbiAqICAgICBgW2ZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsIGluRGVwdGgsIG91dERlcHRoXWAuXG4gKiBAcGFyYW0gc3RyaWRlcyBUaGUgc3RyaWRlcyBvZiB0aGUgY29udm9sdXRpb246IGBbc3RyaWRlSGVpZ2h0LFxuICogc3RyaWRlV2lkdGhdYC5cbiAqIEBwYXJhbSBwYWQgVGhlIHR5cGUgb2YgcGFkZGluZyBhbGdvcml0aG0gdXNlZDpcbiAqICAgIC0gYHNhbWVgIGFuZCBzdHJpZGUgMTogb3V0cHV0IHdpbGwgYmUgb2Ygc2FtZSBzaXplIGFzIGlucHV0LFxuICogICAgICAgcmVnYXJkbGVzcyBvZiBmaWx0ZXIgc2l6ZS5cbiAqICAgIC0gYHZhbGlkYDogb3V0cHV0IHdpbGwgYmUgc21hbGxlciB0aGFuIGlucHV0IGlmIGZpbHRlciBpcyBsYXJnZXJcbiAqICAgICAgIHRoYW4gMXgxLlxuICogQHBhcmFtIGRhdGFGb3JtYXQ6IEFuIG9wdGlvbmFsIHN0cmluZyBmcm9tOiBcIk5IV0NcIiwgXCJOQ0hXXCIuIERlZmF1bHRzIHRvXG4gKiAgICAgXCJOSFdDXCIuIFNwZWNpZnkgdGhlIGRhdGEgZm9ybWF0IG9mIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGRhdGEuIFdpdGggdGhlXG4gKiAgICAgZGVmYXVsdCBmb3JtYXQgXCJOSFdDXCIsIHRoZSBkYXRhIGlzIHN0b3JlZCBpbiB0aGUgb3JkZXIgb2Y6IFtiYXRjaCxcbiAqICAgICBoZWlnaHQsIHdpZHRoLCBjaGFubmVsc10uXG4gKiBAcGFyYW0gZGltUm91bmRpbmdNb2RlIEEgc3RyaW5nIGZyb206ICdjZWlsJywgJ3JvdW5kJywgJ2Zsb29yJy4gSWYgbm9uZSBpc1xuICogICAgIHByb3ZpZGVkLCBpdCB3aWxsIGRlZmF1bHQgdG8gdHJ1bmNhdGUuXG4gKi9cbmZ1bmN0aW9uIGNvbnYyREJhY2twcm9wSW5wdXRfKHhTaGFwZSwgZHksIGZpbHRlciwgc3RyaWRlcywgcGFkLCBkYXRhRm9ybWF0ID0gJ05IV0MnLCBkaW1Sb3VuZGluZ01vZGUpIHtcbiAgICB1dGlsLmFzc2VydCh4U2hhcGUubGVuZ3RoID09PSBkeS5yYW5rLCAoKSA9PiBgTGVuZ3RoIG9mIGluU2hhcGUgYCArXG4gICAgICAgIGAoJHt4U2hhcGUubGVuZ3RofSkgYW5kIHJhbmsgb2YgZHkgKCR7ZHkucmFua30pIG11c3QgbWF0Y2hgKTtcbiAgICBsZXQgeFNoYXBlNEQgPSB4U2hhcGU7XG4gICAgbGV0IGR5NEQgPSBkeTtcbiAgICBsZXQgcmVzaGFwZWRUbzREID0gZmFsc2U7XG4gICAgaWYgKGR5LnJhbmsgPT09IDMpIHtcbiAgICAgICAgcmVzaGFwZWRUbzREID0gdHJ1ZTtcbiAgICAgICAgZHk0RCA9IHJlc2hhcGUoZHksIFsxLCBkeS5zaGFwZVswXSwgZHkuc2hhcGVbMV0sIGR5LnNoYXBlWzJdXSk7XG4gICAgICAgIHhTaGFwZTREID0gWzEsIHhTaGFwZVswXSwgeFNoYXBlWzFdLCB4U2hhcGVbMl1dO1xuICAgIH1cbiAgICB1dGlsLmFzc2VydCh4U2hhcGU0RC5sZW5ndGggPT09IDQsICgpID0+IGBFcnJvciBpbiBjb252MmREZXJJbnB1dDogaW5TaGFwZSBtdXN0IGJlIGxlbmd0aCA0LCBidXQgZ290IGxlbmd0aCBgICtcbiAgICAgICAgYCR7eFNoYXBlNEQubGVuZ3RofS5gKTtcbiAgICB1dGlsLmFzc2VydChkeTRELnJhbmsgPT09IDQsICgpID0+IGBFcnJvciBpbiBjb252MmREZXJJbnB1dDogZHkgbXVzdCBiZSByYW5rIDQsIGJ1dCBnb3QgYCArXG4gICAgICAgIGByYW5rICR7ZHk0RC5yYW5rfWApO1xuICAgIHV0aWwuYXNzZXJ0KGZpbHRlci5yYW5rID09PSA0LCAoKSA9PiBgRXJyb3IgaW4gY29udjJkRGVySW5wdXQ6IGZpbHRlciBtdXN0IGJlIHJhbmsgNCwgYnV0IGdvdCBgICtcbiAgICAgICAgYHJhbmsgJHtmaWx0ZXIucmFua31gKTtcbiAgICBjb25zdCBpbkRlcHRoID0gZGF0YUZvcm1hdCA9PT0gJ05IV0MnID8geFNoYXBlNERbM10gOiB4U2hhcGU0RFsxXTtcbiAgICBjb25zdCBvdXREZXB0aCA9IGRhdGFGb3JtYXQgPT09ICdOSFdDJyA/IGR5NEQuc2hhcGVbM10gOiBkeTRELnNoYXBlWzFdO1xuICAgIHV0aWwuYXNzZXJ0KGluRGVwdGggPT09IGZpbHRlci5zaGFwZVsyXSwgKCkgPT4gYEVycm9yIGluIGNvbnYyZERlcklucHV0OiBkZXB0aCBvZiBpbnB1dCAoJHtpbkRlcHRofSkgbXVzdCBgICtcbiAgICAgICAgYG1hdGNoIGlucHV0IGRlcHRoIGZvciBmaWx0ZXIgJHtmaWx0ZXIuc2hhcGVbMl19LmApO1xuICAgIHV0aWwuYXNzZXJ0KG91dERlcHRoID09PSBmaWx0ZXIuc2hhcGVbM10sICgpID0+IGBFcnJvciBpbiBjb252MmREZXJJbnB1dDogZGVwdGggb2Ygb3V0cHV0ICgke291dERlcHRofSkgbXVzdCBgICtcbiAgICAgICAgYG1hdGNoIG91dHB1dCBkZXB0aCBmb3IgZmlsdGVyICR7ZmlsdGVyLnNoYXBlWzNdfS5gKTtcbiAgICBpZiAoZGltUm91bmRpbmdNb2RlICE9IG51bGwpIHtcbiAgICAgICAgdXRpbC5hc3NlcnQodXRpbC5pc0ludChwYWQpLCAoKSA9PiBgRXJyb3IgaW4gY29udjJkRGVySW5wdXQ6IHBhZCBtdXN0IGJlIGFuIGludGVnZXIgd2hlbiB1c2luZywgYCArXG4gICAgICAgICAgICBgZGltUm91bmRpbmdNb2RlICR7ZGltUm91bmRpbmdNb2RlfSBidXQgZ290IHBhZCAke3BhZH0uYCk7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0cyA9IHsgZHk6IGR5NEQsIGZpbHRlciB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBzdHJpZGVzLCBwYWQsIGRhdGFGb3JtYXQsIGRpbVJvdW5kaW5nTW9kZSwgaW5wdXRTaGFwZTogeFNoYXBlNEQgfTtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgY29uc3QgcmVzID0gRU5HSU5FLnJ1bktlcm5lbChDb252MkRCYWNrcHJvcElucHV0LCBpbnB1dHMsIGF0dHJzKTtcbiAgICBpZiAocmVzaGFwZWRUbzREKSB7XG4gICAgICAgIHJldHVybiByZXNoYXBlKHJlcywgW3Jlcy5zaGFwZVsxXSwgcmVzLnNoYXBlWzJdLCByZXMuc2hhcGVbM11dKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydCBjb25zdCBjb252MkRCYWNrcHJvcElucHV0ID0gb3AoeyBjb252MkRCYWNrcHJvcElucHV0XyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbnYyZF9iYWNrcHJvcF9pbnB1dC5qcy5tYXAiLCJpbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgY29udjJEQmFja3Byb3BJbnB1dCB9IGZyb20gJy4vY29udjJkX2JhY2twcm9wX2lucHV0JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyB0aGUgdHJhbnNwb3NlZCAyRCBjb252b2x1dGlvbiBvZiBhbiBpbWFnZSwgYWxzbyBrbm93biBhcyBhXG4gKiBkZWNvbnZvbHV0aW9uLlxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCBpbWFnZSwgb2YgcmFuayA0IG9yIHJhbmsgMywgb2Ygc2hhcGVcbiAqICAgYFtiYXRjaCwgaGVpZ2h0LCB3aWR0aCwgaW5EZXB0aF1gLiBJZiByYW5rIDMsIGJhdGNoIG9mIDEgaXMgYXNzdW1lZC5cbiAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlciwgcmFuayA0LCBvZiBzaGFwZVxuICogICAgIGBbZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgb3V0RGVwdGgsIGluRGVwdGhdYC5cbiAqICAgICBgaW5EZXB0aGAgbXVzdCBtYXRjaCBgaW5EZXB0aGAgaW4gYHhgLlxuICogQHBhcmFtIG91dHB1dFNoYXBlIE91dHB1dCBzaGFwZSwgb2YgcmFuayA0IG9yIHJhbmsgMzpcbiAqICAgICBgW2JhdGNoLCBoZWlnaHQsIHdpZHRoLCBvdXREZXB0aF1gLiBJZiByYW5rIDMsIGJhdGNoIG9mIDEgaXMgYXNzdW1lZC5cbiAqIEBwYXJhbSBzdHJpZGVzIFRoZSBzdHJpZGVzIG9mIHRoZSBvcmlnaW5hbCBjb252b2x1dGlvbjpcbiAqICAgICBgW3N0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGhdYC5cbiAqIEBwYXJhbSBwYWQgIFRoZSB0eXBlIG9mIHBhZGRpbmcgYWxnb3JpdGhtIHVzZWQgaW4gdGhlIG5vbi10cmFuc3Bvc2UgdmVyc2lvblxuICogICAgb2YgdGhlIG9wLlxuICogQHBhcmFtIGRpbVJvdW5kaW5nTW9kZSBBIHN0cmluZyBmcm9tOiAnY2VpbCcsICdyb3VuZCcsICdmbG9vcicuIElmIG5vbmUgaXNcbiAqICAgICBwcm92aWRlZCwgaXQgd2lsbCBkZWZhdWx0IHRvIHRydW5jYXRlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0NvbnZvbHV0aW9uJ31cbiAqL1xuZnVuY3Rpb24gY29udjJkVHJhbnNwb3NlXyh4LCBmaWx0ZXIsIG91dHB1dFNoYXBlLCBzdHJpZGVzLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2NvbnYyZFRyYW5zcG9zZScpO1xuICAgIGNvbnN0ICRmaWx0ZXIgPSBjb252ZXJ0VG9UZW5zb3IoZmlsdGVyLCAnZmlsdGVyJywgJ2NvbnYyZFRyYW5zcG9zZScpO1xuICAgIHJldHVybiBjb252MkRCYWNrcHJvcElucHV0KG91dHB1dFNoYXBlLCAkeCwgJGZpbHRlciwgc3RyaWRlcywgcGFkLCAnTkhXQycsIGRpbVJvdW5kaW5nTW9kZSk7XG59XG5leHBvcnQgY29uc3QgY29udjJkVHJhbnNwb3NlID0gb3AoeyBjb252MmRUcmFuc3Bvc2VfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29udjJkX3RyYW5zcG9zZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgQ29udjNEIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgZWl0aGVyU3RyaWRlc09yRGlsYXRpb25zQXJlT25lIH0gZnJvbSAnLi9jb252X3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9yZXNoYXBlJztcbi8qKlxuICogQ29tcHV0ZXMgYSAzRCBjb252b2x1dGlvbiBvdmVyIHRoZSBpbnB1dCB4LlxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IsIG9mIHJhbmsgNSBvciByYW5rIDQsIG9mIHNoYXBlXG4gKiAgICAgYFtiYXRjaCwgZGVwdGgsIGhlaWdodCwgd2lkdGgsIGNoYW5uZWxzXWAuIElmIHJhbmsgNCxcbiAqIGJhdGNoIG9mIDEgaXMgYXNzdW1lZC5cbiAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlciwgcmFuayA1LCBvZiBzaGFwZVxuICogICAgIGBbZmlsdGVyRGVwdGgsIGZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsIGluQ2hhbm5lbHMsIG91dENoYW5uZWxzXWAuXG4gKiAgICAgIGluQ2hhbm5lbHMgbXVzdCBtYXRjaCBiZXR3ZWVuIGlucHV0IGFuZCBmaWx0ZXIuXG4gKiBAcGFyYW0gc3RyaWRlcyBUaGUgc3RyaWRlcyBvZiB0aGUgY29udm9sdXRpb246IGBbc3RyaWRlRGVwdGgsIHN0cmlkZUhlaWdodCxcbiAqIHN0cmlkZVdpZHRoXWAuXG4gKiBAcGFyYW0gcGFkIFRoZSB0eXBlIG9mIHBhZGRpbmcgYWxnb3JpdGhtLlxuICogICAgLSBgc2FtZWAgYW5kIHN0cmlkZSAxOiBvdXRwdXQgd2lsbCBiZSBvZiBzYW1lIHNpemUgYXMgaW5wdXQsXG4gKiAgICAgICByZWdhcmRsZXNzIG9mIGZpbHRlciBzaXplLlxuICogICAgLSBgdmFsaWRgOiBvdXRwdXQgd2lsbCBiZSBzbWFsbGVyIHRoYW4gaW5wdXQgaWYgZmlsdGVyIGlzIGxhcmdlclxuICogICAgICAgdGhhbiAxeDEuXG4gKiAgIC0gRm9yIG1vcmUgaW5mbywgc2VlIHRoaXMgZ3VpZGU6XG4gKiAgICAgW2h0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9jb252b2x1dGlvbl0oXG4gKiAgICAgICAgICBodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvbm4vY29udm9sdXRpb24pXG4gKiBAcGFyYW0gZGF0YUZvcm1hdDogQW4gb3B0aW9uYWwgc3RyaW5nIGZyb206IFwiTkRIV0NcIiwgXCJOQ0RIV1wiLiBEZWZhdWx0cyB0b1xuICogICAgIFwiTkRIV0NcIi4gU3BlY2lmeSB0aGUgZGF0YSBmb3JtYXQgb2YgdGhlIGlucHV0IGFuZCBvdXRwdXQgZGF0YS4gV2l0aCB0aGVcbiAqICAgICBkZWZhdWx0IGZvcm1hdCBcIk5ESFdDXCIsIHRoZSBkYXRhIGlzIHN0b3JlZCBpbiB0aGUgb3JkZXIgb2Y6IFtiYXRjaCxcbiAqICAgICBkZXB0aCwgaGVpZ2h0LCB3aWR0aCwgY2hhbm5lbHNdLiBPbmx5IFwiTkRIV0NcIiBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLlxuICogQHBhcmFtIGRpbGF0aW9ucyBUaGUgZGlsYXRpb24gcmF0ZXM6IGBbZGlsYXRpb25EZXB0aCwgZGlsYXRpb25IZWlnaHQsXG4gKiAgICAgZGlsYXRpb25XaWR0aF1gIGluIHdoaWNoIHdlIHNhbXBsZSBpbnB1dCB2YWx1ZXMgYWNyb3NzIHRoZSBoZWlnaHRcbiAqICAgICBhbmQgd2lkdGggZGltZW5zaW9ucyBpbiBhdHJvdXMgY29udm9sdXRpb24uIERlZmF1bHRzIHRvIGBbMSwgMSwgMV1gLlxuICogICAgIElmIGBkaWxhdGlvbnNgIGlzIGEgc2luZ2xlIG51bWJlciwgdGhlblxuICogICAgIGBkaWxhdGlvbkRlcHRoID09IGRpbGF0aW9uSGVpZ2h0ID09IGRpbGF0aW9uV2lkdGhgLiBJZiBpdCBpcyBncmVhdGVyXG4gKiAgICAgdGhhbiAxLCB0aGVuIGFsbCB2YWx1ZXMgb2YgYHN0cmlkZXNgIG11c3QgYmUgMS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdDb252b2x1dGlvbid9XG4gKi9cbmZ1bmN0aW9uIGNvbnYzZF8oeCwgZmlsdGVyLCBzdHJpZGVzLCBwYWQsIGRhdGFGb3JtYXQgPSAnTkRIV0MnLCBkaWxhdGlvbnMgPSBbMSwgMSwgMV0pIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdjb252M2QnKTtcbiAgICBjb25zdCAkZmlsdGVyID0gY29udmVydFRvVGVuc29yKGZpbHRlciwgJ2ZpbHRlcicsICdjb252M2QnKTtcbiAgICBsZXQgeDVEID0gJHg7XG4gICAgbGV0IHJlc2hhcGVkVG81RCA9IGZhbHNlO1xuICAgIGlmICgkeC5yYW5rID09PSA0KSB7XG4gICAgICAgIHJlc2hhcGVkVG81RCA9IHRydWU7XG4gICAgICAgIHg1RCA9IHJlc2hhcGUoJHgsIFsxLCAkeC5zaGFwZVswXSwgJHguc2hhcGVbMV0sICR4LnNoYXBlWzJdLCAkeC5zaGFwZVszXV0pO1xuICAgIH1cbiAgICB1dGlsLmFzc2VydCh4NUQucmFuayA9PT0gNSwgKCkgPT4gYEVycm9yIGluIGNvbnYzZDogaW5wdXQgbXVzdCBiZSByYW5rIDUsIGJ1dCBnb3QgcmFuayAke3g1RC5yYW5rfS5gKTtcbiAgICB1dGlsLmFzc2VydCgkZmlsdGVyLnJhbmsgPT09IDUsICgpID0+IGBFcnJvciBpbiBjb252M2Q6IGZpbHRlciBtdXN0IGJlIHJhbmsgNSwgYnV0IGdvdCByYW5rIGAgK1xuICAgICAgICBgJHskZmlsdGVyLnJhbmt9LmApO1xuICAgIHV0aWwuYXNzZXJ0KHg1RC5zaGFwZVs0XSA9PT0gJGZpbHRlci5zaGFwZVszXSwgKCkgPT4gYEVycm9yIGluIGNvbnYzZDogZGVwdGggb2YgaW5wdXQgKCR7eDVELnNoYXBlWzRdfSkgbXVzdCBtYXRjaCBgICtcbiAgICAgICAgYGlucHV0IGRlcHRoIGZvciBmaWx0ZXIgJHskZmlsdGVyLnNoYXBlWzNdfS5gKTtcbiAgICB1dGlsLmFzc2VydChlaXRoZXJTdHJpZGVzT3JEaWxhdGlvbnNBcmVPbmUoc3RyaWRlcywgZGlsYXRpb25zKSwgKCkgPT4gJ0Vycm9yIGluIGNvbnYzRDogRWl0aGVyIHN0cmlkZXMgb3IgZGlsYXRpb25zIG11c3QgYmUgMS4gJyArXG4gICAgICAgIGBHb3Qgc3RyaWRlcyAke3N0cmlkZXN9IGFuZCBkaWxhdGlvbnMgJyR7ZGlsYXRpb25zfSdgKTtcbiAgICB1dGlsLmFzc2VydChkYXRhRm9ybWF0ID09PSAnTkRIV0MnLCAoKSA9PiBgRXJyb3IgaW4gY29udjNkOiBnb3QgZGF0YUZvcm1hdCBvZiAke2RhdGFGb3JtYXR9IGJ1dCBvbmx5IE5ESFdDIGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQuYCk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiB4NUQsIGZpbHRlcjogJGZpbHRlciB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBzdHJpZGVzLCBwYWQsIGRhdGFGb3JtYXQsIGRpbGF0aW9ucyB9O1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgICBjb25zdCByZXMgPSBFTkdJTkUucnVuS2VybmVsKENvbnYzRCwgaW5wdXRzLCBhdHRycyk7XG4gICAgaWYgKHJlc2hhcGVkVG81RCkge1xuICAgICAgICByZXR1cm4gcmVzaGFwZShyZXMsIFtyZXMuc2hhcGVbMV0sIHJlcy5zaGFwZVsyXSwgcmVzLnNoYXBlWzNdLCByZXMuc2hhcGVbNF1dKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydCBjb25zdCBjb252M2QgPSBvcCh7IGNvbnYzZF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb252M2QuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IENvbnYzREJhY2twcm9wSW5wdXRWMiB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9yZXNoYXBlJztcbi8qKlxuICogQ29tcHV0ZXMgdGhlIGRlcml2YXRpdmUgb2YgdGhlIGlucHV0IG9mIGEgM0QgY29udm9sdXRpb24uXG4gKlxuICogQHBhcmFtIHhTaGFwZSBUaGUgc2hhcGUgb2YgdGhlIGlucHV0OiBbYmF0Y2gsIGRlcHRoLCBoZWlnaHQsIHdpZHRoLFxuICogaW5fY2hhbm5lbHNdLiBJZiBsZW5ndGggb2YgNCwgYmF0Y2ggb2YgMSBpcyBhc3N1bWVkLlxuICogQHBhcmFtIGR5IFRoZSBkZXJpdmF0aXZlIG9mIHRoZSBvdXRwdXQsIG9mIHJhbmsgNSBvciByYW5rIDQgb2Ygc2hhcGVcbiAqICAgYFtiYXRjaCwgb3V0RGVwdGgsIG91dEhlaWdodCwgb3V0V2lkdGgsIGluX2NoYW5uZWxzXWAuXG4gKiBJZiByYW5rIDQsIGJhdGNoIG9mIDEgaXMgYXNzdW1lZC5cbiAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlciwgcmFuayA1LCBvZiBzaGFwZVxuICogICAgIGBbZmlsdGVyRGVwdGgsIGZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsIGluRGVwdGgsIG91dERlcHRoXWAuXG4gKiBAcGFyYW0gc3RyaWRlcyBUaGUgc3RyaWRlcyBvZiB0aGUgY29udm9sdXRpb246IGBbc3RyaWRlRGVwdGgsIHN0cmlkZUhlaWdodCxcbiAqIHN0cmlkZVdpZHRoXWAuXG4gKiBAcGFyYW0gcGFkIFRoZSB0eXBlIG9mIHBhZGRpbmcgYWxnb3JpdGhtIHVzZWQ6XG4gKiAgICAtIGBzYW1lYCBhbmQgc3RyaWRlIDE6IG91dHB1dCB3aWxsIGJlIG9mIHNhbWUgc2l6ZSBhcyBpbnB1dCxcbiAqICAgICAgIHJlZ2FyZGxlc3Mgb2YgZmlsdGVyIHNpemUuXG4gKiAgICAtIGB2YWxpZGA6IG91dHB1dCB3aWxsIGJlIHNtYWxsZXIgdGhhbiBpbnB1dCBpZiBmaWx0ZXIgaXMgbGFyZ2VyXG4gKiAgICAgICB0aGFuIDF4MS5cbiAqL1xuZnVuY3Rpb24gY29udjNEQmFja3Byb3BJbnB1dF8oeFNoYXBlLCBkeSwgZmlsdGVyLCBzdHJpZGVzLCBwYWQpIHtcbiAgICB1dGlsLmFzc2VydCh4U2hhcGUubGVuZ3RoID09PSBkeS5yYW5rLCAoKSA9PiBgTGVuZ3RoIG9mIGluU2hhcGUgYCArXG4gICAgICAgIGAoJHt4U2hhcGUubGVuZ3RofSkgYW5kIHJhbmsgb2YgZHkgKCR7ZHkucmFua30pIG11c3QgbWF0Y2hgKTtcbiAgICBsZXQgeFNoYXBlNUQgPSB4U2hhcGU7XG4gICAgbGV0IGR5NUQgPSBkeTtcbiAgICBsZXQgcmVzaGFwZWRUbzVEID0gZmFsc2U7XG4gICAgaWYgKGR5LnJhbmsgPT09IDQpIHtcbiAgICAgICAgcmVzaGFwZWRUbzVEID0gdHJ1ZTtcbiAgICAgICAgZHk1RCA9IHJlc2hhcGUoZHksIFsxLCBkeS5zaGFwZVswXSwgZHkuc2hhcGVbMV0sIGR5LnNoYXBlWzJdLCBkeS5zaGFwZVszXV0pO1xuICAgICAgICB4U2hhcGU1RCA9IFsxLCB4U2hhcGVbMF0sIHhTaGFwZVsxXSwgeFNoYXBlWzJdLCB4U2hhcGVbM11dO1xuICAgIH1cbiAgICBjb25zdCBpbkRlcHRoID0geFNoYXBlNURbNF07XG4gICAgY29uc3Qgb3V0RGVwdGggPSBkeTVELnNoYXBlWzRdO1xuICAgIHV0aWwuYXNzZXJ0KHhTaGFwZTVELmxlbmd0aCA9PT0gNSwgKCkgPT4gYEVycm9yIGluIGNvbnYzZERlcklucHV0OiBpblNoYXBlIG11c3QgYmUgbGVuZ3RoIDUsIGJ1dCBnb3QgbGVuZ3RoIGAgK1xuICAgICAgICBgJHt4U2hhcGU1RC5sZW5ndGh9LmApO1xuICAgIHV0aWwuYXNzZXJ0KGR5NUQucmFuayA9PT0gNSwgKCkgPT4gYEVycm9yIGluIGNvbnYzZERlcklucHV0OiBkeSBtdXN0IGJlIHJhbmsgNSwgYnV0IGdvdCBgICtcbiAgICAgICAgYHJhbmsgJHtkeTVELnJhbmt9YCk7XG4gICAgdXRpbC5hc3NlcnQoZmlsdGVyLnJhbmsgPT09IDUsICgpID0+IGBFcnJvciBpbiBjb252M2REZXJJbnB1dDogZmlsdGVyIG11c3QgYmUgcmFuayA1LCBidXQgZ290IGAgK1xuICAgICAgICBgcmFuayAke2ZpbHRlci5yYW5rfWApO1xuICAgIHV0aWwuYXNzZXJ0KGluRGVwdGggPT09IGZpbHRlci5zaGFwZVszXSwgKCkgPT4gYEVycm9yIGluIGNvbnYzZERlcklucHV0OiBkZXB0aCBvZiBpbnB1dCAoJHtpbkRlcHRofSkgbXVzdCBgICtcbiAgICAgICAgYG1hdGNoIGlucHV0IGRlcHRoIGZvciBmaWx0ZXIgJHtmaWx0ZXIuc2hhcGVbM119LmApO1xuICAgIHV0aWwuYXNzZXJ0KG91dERlcHRoID09PSBmaWx0ZXIuc2hhcGVbNF0sICgpID0+IGBFcnJvciBpbiBjb252M2REZXJJbnB1dDogZGVwdGggb2Ygb3V0cHV0ICgke291dERlcHRofSkgbXVzdCBgICtcbiAgICAgICAgYG1hdGNoIG91dHB1dCBkZXB0aCBmb3IgZmlsdGVyICR7ZmlsdGVyLnNoYXBlWzRdfS5gKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IGR5OiBkeTVELCBmaWx0ZXIgfTtcbiAgICBjb25zdCBhdHRycyA9IHsgcGFkLCBzdHJpZGVzLCBpbnB1dFNoYXBlOiB4U2hhcGU1RCB9O1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgICBjb25zdCByZXMgPSBFTkdJTkUucnVuS2VybmVsKENvbnYzREJhY2twcm9wSW5wdXRWMiwgaW5wdXRzLCBhdHRycyk7XG4gICAgaWYgKHJlc2hhcGVkVG81RCkge1xuICAgICAgICByZXR1cm4gcmVzaGFwZShyZXMsIFtyZXMuc2hhcGVbMV0sIHJlcy5zaGFwZVsyXSwgcmVzLnNoYXBlWzNdLCByZXMuc2hhcGVbNF1dKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydCBjb25zdCBjb252M0RCYWNrcHJvcElucHV0ID0gb3AoeyBjb252M0RCYWNrcHJvcElucHV0XyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbnYzZF9iYWNrcHJvcF9pbnB1dC5qcy5tYXAiLCJpbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgY29udjNEQmFja3Byb3BJbnB1dCB9IGZyb20gJy4vY29udjNkX2JhY2twcm9wX2lucHV0JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyB0aGUgdHJhbnNwb3NlZCAzRCBjb252b2x1dGlvbiBvZiBhIHZvbHVtZSwgYWxzbyBrbm93biBhcyBhXG4gKiBkZWNvbnZvbHV0aW9uLlxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCBpbWFnZSwgb2YgcmFuayA1IG9yIHJhbmsgNCwgb2Ygc2hhcGVcbiAqICAgYFtiYXRjaCwgZGVwdGgsIGhlaWdodCwgd2lkdGgsIGluRGVwdGhdYC4gSWYgcmFuayA0LCBiYXRjaCBvZiAxIGlzIGFzc3VtZWQuXG4gKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIsIHJhbmsgNCwgb2Ygc2hhcGVcbiAqICAgICBgW2RlcHRoLCBmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoLCBvdXREZXB0aCwgaW5EZXB0aF1gLlxuICogICAgIGBpbkRlcHRoYCBtdXN0IG1hdGNoIGBpbkRlcHRoYCBpbiBgeGAuXG4gKiBAcGFyYW0gb3V0cHV0U2hhcGUgT3V0cHV0IHNoYXBlLCBvZiByYW5rIDUgb3IgcmFuayA0OlxuICogICAgIGBbYmF0Y2gsIGRlcHRoLCBoZWlnaHQsIHdpZHRoLCBvdXREZXB0aF1gLiBJZiByYW5rIDMsIGJhdGNoIG9mIDEgaXNcbiAqICAgIGFzc3VtZWQuXG4gKiBAcGFyYW0gc3RyaWRlcyBUaGUgc3RyaWRlcyBvZiB0aGUgb3JpZ2luYWwgY29udm9sdXRpb246XG4gKiAgICAgYFtzdHJpZGVEZXB0aCwgc3RyaWRlSGVpZ2h0LCBzdHJpZGVXaWR0aF1gLlxuICogQHBhcmFtIHBhZCAgVGhlIHR5cGUgb2YgcGFkZGluZyBhbGdvcml0aG0gdXNlZCBpbiB0aGUgbm9uLXRyYW5zcG9zZSB2ZXJzaW9uXG4gKiAgICBvZiB0aGUgb3AuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQ29udm9sdXRpb24nfVxuICovXG5mdW5jdGlvbiBjb252M2RUcmFuc3Bvc2VfKHgsIGZpbHRlciwgb3V0cHV0U2hhcGUsIHN0cmlkZXMsIHBhZCkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2NvbnYzZFRyYW5zcG9zZScpO1xuICAgIGNvbnN0ICRmaWx0ZXIgPSBjb252ZXJ0VG9UZW5zb3IoZmlsdGVyLCAnZmlsdGVyJywgJ2NvbnYzZFRyYW5zcG9zZScpO1xuICAgIHJldHVybiBjb252M0RCYWNrcHJvcElucHV0KG91dHB1dFNoYXBlLCAkeCwgJGZpbHRlciwgc3RyaWRlcywgcGFkKTtcbn1cbmV4cG9ydCBjb25zdCBjb252M2RUcmFuc3Bvc2UgPSBvcCh7IGNvbnYzZFRyYW5zcG9zZV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb252M2RfdHJhbnNwb3NlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbi8qKlxuICpcbiAqIEBwYXJhbSBpbnB1dFNoYXBlIElucHV0IHRlbnNvciBzaGFwZSBpcyBvZiB0aGUgZm9sbG93aW5nIGRpbWVuc2lvbnM6XG4gKiAgICAgYFtiYXRjaCwgaGVpZ2h0LCB3aWR0aCwgaW5DaGFubmVsc11gLlxuICogQHBhcmFtIGZpbHRlclNoYXBlIFRoZSBmaWx0ZXIgc2hhcGUgaXMgb2YgdGhlIGZvbGxvd2luZyBkaW1lbnNpb25zOlxuICogICAgIGBbZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgZGVwdGhdYC5cbiAqIEBwYXJhbSBzdHJpZGVzIFRoZSBzdHJpZGVzIG9mIHRoZSBzbGlkaW5nIHdpbmRvdyBmb3IgZWFjaCBkaW1lbnNpb24gb2YgdGhlXG4gKiAgICAgaW5wdXQgdGVuc29yOiBgW3N0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGhdYC5cbiAqICAgICBJZiBgc3RyaWRlc2AgaXMgYSBzaW5nbGUgbnVtYmVyLFxuICogICAgIHRoZW4gYHN0cmlkZUhlaWdodCA9PSBzdHJpZGVXaWR0aGAuXG4gKiBAcGFyYW0gcGFkIFRoZSB0eXBlIG9mIHBhZGRpbmcgYWxnb3JpdGhtLlxuICogICAgLSBgc2FtZWAgYW5kIHN0cmlkZSAxOiBvdXRwdXQgd2lsbCBiZSBvZiBzYW1lIHNpemUgYXMgaW5wdXQsXG4gKiAgICAgICByZWdhcmRsZXNzIG9mIGZpbHRlciBzaXplLlxuICogICAgLSBgdmFsaWRgOiBvdXRwdXQgd2lsbCBiZSBzbWFsbGVyIHRoYW4gaW5wdXQgaWYgZmlsdGVyIGlzIGxhcmdlclxuICogICAgICAgdGhhbiAxKjF4MS5cbiAqICAgIC0gRm9yIG1vcmUgaW5mbywgc2VlIHRoaXMgZ3VpZGU6XG4gKiAgICAgW2h0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9jb252b2x1dGlvbl0oXG4gKiAgICAgICAgICBodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvbm4vY29udm9sdXRpb24pXG4gKiBAcGFyYW0gZGF0YUZvcm1hdCBUaGUgZGF0YSBmb3JtYXQgb2YgdGhlIGlucHV0IGFuZCBvdXRwdXQgZGF0YS5cbiAqICAgICBEZWZhdWx0cyB0byAnTkhXQycuXG4gKiBAcGFyYW0gZGlsYXRpb25zIFRoZSBkaWxhdGlvbiByYXRlczogYFtkaWxhdGlvbkhlaWdodCwgZGlsYXRpb25XaWR0aF1gLlxuICogICAgIERlZmF1bHRzIHRvIGBbMSwgMV1gLiBJZiBgZGlsYXRpb25zYCBpcyBhIHNpbmdsZSBudW1iZXIsIHRoZW5cbiAqICAgICBgZGlsYXRpb25IZWlnaHQgPT0gZGlsYXRpb25XaWR0aGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlRGlsYXRpb24yREluZm8oaW5wdXRTaGFwZSwgZmlsdGVyU2hhcGUsIHN0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdCA9ICdOSFdDJywgZGlsYXRpb25zKSB7XG4gICAgLy8gYGNvbXB1dGVyQ29udjJESW5mb2AgcmVxdWlyZSBmaWx0ZXJTaGFwZSB0byBiZSBpbiB0aGUgZGltZW5zaW9uIG9mOlxuICAgIC8vIGBbZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgZGVwdGgsIG91dERlcHRoXWAsIGRpbGF0aW9uMmQgZG9lc24ndCBoYXZlXG4gICAgLy8gb3V0RGVwdGgsIGl0IHNob3VsZCBoYXZlIHRoZSBzYW1lIGRlcHRoIGFzIHRoZSBpbnB1dC5cbiAgICAvLyBJbnB1dCBzaGFwZTogW2JhdGNoLCBoZWlnaHQsIHdpZHRoLCBpbkNoYW5uZWxzXVxuICAgIGNvbnN0IGlucHV0Q2hhbm5lbHMgPSBpbnB1dFNoYXBlWzNdO1xuICAgIGNvbnN0ICRmaWx0ZXJTaGFwZSA9IFsuLi5maWx0ZXJTaGFwZSwgaW5wdXRDaGFubmVsc107XG4gICAgY29uc3QgJGRhdGFGb3JtYXQgPSBjb252ZXJ0Q29udjJERGF0YUZvcm1hdChkYXRhRm9ybWF0KTtcbiAgICByZXR1cm4gY29tcHV0ZUNvbnYyREluZm8oaW5wdXRTaGFwZSwgJGZpbHRlclNoYXBlLCBzdHJpZGVzLCBkaWxhdGlvbnMsIHBhZCwgbnVsbCAvKiByb3VuZGluZ01vZGUgKi8sIG51bGwgLyogZGVwdGhXaXNlICovLCAkZGF0YUZvcm1hdCk7XG59XG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZVBvb2wyREluZm8oaW5TaGFwZSwgZmlsdGVyU2l6ZSwgc3RyaWRlcywgZGlsYXRpb25zLCBwYWQsIHJvdW5kaW5nTW9kZSwgZGF0YUZvcm1hdCA9ICdjaGFubmVsc0xhc3QnKSB7XG4gICAgY29uc3QgW2ZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGhdID0gcGFyc2VUdXBsZVBhcmFtKGZpbHRlclNpemUpO1xuICAgIGxldCBmaWx0ZXJTaGFwZTtcbiAgICBpZiAoZGF0YUZvcm1hdCA9PT0gJ2NoYW5uZWxzTGFzdCcpIHtcbiAgICAgICAgZmlsdGVyU2hhcGUgPSBbZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgaW5TaGFwZVszXSwgaW5TaGFwZVszXV07XG4gICAgfVxuICAgIGVsc2UgaWYgKGRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0ZpcnN0Jykge1xuICAgICAgICBmaWx0ZXJTaGFwZSA9IFtmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoLCBpblNoYXBlWzFdLCBpblNoYXBlWzFdXTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBkYXRhRm9ybWF0ICR7ZGF0YUZvcm1hdH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbXB1dGVDb252MkRJbmZvKGluU2hhcGUsIGZpbHRlclNoYXBlLCBzdHJpZGVzLCBkaWxhdGlvbnMsIHBhZCwgcm91bmRpbmdNb2RlLCBmYWxzZSwgZGF0YUZvcm1hdCk7XG59XG4vKipcbiAqIENvbXB1dGVzIHRoZSBpbmZvcm1hdGlvbiBmb3IgYSBmb3J3YXJkIHBhc3Mgb2YgYSBwb29saW5nM0Qgb3BlcmF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZVBvb2wzREluZm8oaW5TaGFwZSwgZmlsdGVyU2l6ZSwgc3RyaWRlcywgZGlsYXRpb25zLCBwYWQsIHJvdW5kaW5nTW9kZSwgZGF0YUZvcm1hdCA9ICdOREhXQycpIHtcbiAgICBjb25zdCBbZmlsdGVyRGVwdGgsIGZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGhdID0gcGFyc2UzVHVwbGVQYXJhbShmaWx0ZXJTaXplKTtcbiAgICBsZXQgZmlsdGVyU2hhcGU7XG4gICAgbGV0ICRkYXRhRm9ybWF0O1xuICAgIGlmIChkYXRhRm9ybWF0ID09PSAnTkRIV0MnKSB7XG4gICAgICAgICRkYXRhRm9ybWF0ID0gJ2NoYW5uZWxzTGFzdCc7XG4gICAgICAgIGZpbHRlclNoYXBlID1cbiAgICAgICAgICAgIFtmaWx0ZXJEZXB0aCwgZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgaW5TaGFwZVs0XSwgaW5TaGFwZVs0XV07XG4gICAgfVxuICAgIGVsc2UgaWYgKGRhdGFGb3JtYXQgPT09ICdOQ0RIVycpIHtcbiAgICAgICAgJGRhdGFGb3JtYXQgPSAnY2hhbm5lbHNGaXJzdCc7XG4gICAgICAgIGZpbHRlclNoYXBlID1cbiAgICAgICAgICAgIFtmaWx0ZXJEZXB0aCwgZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgaW5TaGFwZVsxXSwgaW5TaGFwZVsxXV07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gZGF0YUZvcm1hdCAke2RhdGFGb3JtYXR9YCk7XG4gICAgfVxuICAgIHJldHVybiBjb21wdXRlQ29udjNESW5mbyhpblNoYXBlLCBmaWx0ZXJTaGFwZSwgc3RyaWRlcywgZGlsYXRpb25zLCBwYWQsIGZhbHNlLCAkZGF0YUZvcm1hdCwgcm91bmRpbmdNb2RlKTtcbn1cbi8qKlxuICogQ29tcHV0ZXMgdGhlIGluZm9ybWF0aW9uIGZvciBhIGZvcndhcmQgcGFzcyBvZiBhIGNvbnZvbHV0aW9uL3Bvb2xpbmdcbiAqIG9wZXJhdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVDb252MkRJbmZvKGluU2hhcGUsIGZpbHRlclNoYXBlLCBzdHJpZGVzLCBkaWxhdGlvbnMsIHBhZCwgcm91bmRpbmdNb2RlLCBkZXB0aHdpc2UgPSBmYWxzZSwgZGF0YUZvcm1hdCA9ICdjaGFubmVsc0xhc3QnKSB7XG4gICAgbGV0IFtiYXRjaFNpemUsIGluSGVpZ2h0LCBpbldpZHRoLCBpbkNoYW5uZWxzXSA9IFstMSwgLTEsIC0xLCAtMV07XG4gICAgaWYgKGRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0xhc3QnKSB7XG4gICAgICAgIFtiYXRjaFNpemUsIGluSGVpZ2h0LCBpbldpZHRoLCBpbkNoYW5uZWxzXSA9IGluU2hhcGU7XG4gICAgfVxuICAgIGVsc2UgaWYgKGRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0ZpcnN0Jykge1xuICAgICAgICBbYmF0Y2hTaXplLCBpbkNoYW5uZWxzLCBpbkhlaWdodCwgaW5XaWR0aF0gPSBpblNoYXBlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGRhdGFGb3JtYXQgJHtkYXRhRm9ybWF0fWApO1xuICAgIH1cbiAgICBjb25zdCBbZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgLCBmaWx0ZXJDaGFubmVsc10gPSBmaWx0ZXJTaGFwZTtcbiAgICBjb25zdCBbc3RyaWRlSGVpZ2h0LCBzdHJpZGVXaWR0aF0gPSBwYXJzZVR1cGxlUGFyYW0oc3RyaWRlcyk7XG4gICAgY29uc3QgW2RpbGF0aW9uSGVpZ2h0LCBkaWxhdGlvbldpZHRoXSA9IHBhcnNlVHVwbGVQYXJhbShkaWxhdGlvbnMpO1xuICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlckhlaWdodCA9IGdldEVmZmVjdGl2ZUZpbHRlclNpemUoZmlsdGVySGVpZ2h0LCBkaWxhdGlvbkhlaWdodCk7XG4gICAgY29uc3QgZWZmZWN0aXZlRmlsdGVyV2lkdGggPSBnZXRFZmZlY3RpdmVGaWx0ZXJTaXplKGZpbHRlcldpZHRoLCBkaWxhdGlvbldpZHRoKTtcbiAgICBjb25zdCB7IHBhZEluZm8sIG91dEhlaWdodCwgb3V0V2lkdGggfSA9IGdldFBhZEFuZE91dEluZm8ocGFkLCBpbkhlaWdodCwgaW5XaWR0aCwgc3RyaWRlSGVpZ2h0LCBzdHJpZGVXaWR0aCwgZWZmZWN0aXZlRmlsdGVySGVpZ2h0LCBlZmZlY3RpdmVGaWx0ZXJXaWR0aCwgcm91bmRpbmdNb2RlLCBkYXRhRm9ybWF0KTtcbiAgICBjb25zdCBvdXRDaGFubmVscyA9IGRlcHRod2lzZSA/IGZpbHRlckNoYW5uZWxzICogaW5DaGFubmVscyA6IGZpbHRlckNoYW5uZWxzO1xuICAgIGxldCBvdXRTaGFwZTtcbiAgICBpZiAoZGF0YUZvcm1hdCA9PT0gJ2NoYW5uZWxzRmlyc3QnKSB7XG4gICAgICAgIG91dFNoYXBlID0gW2JhdGNoU2l6ZSwgb3V0Q2hhbm5lbHMsIG91dEhlaWdodCwgb3V0V2lkdGhdO1xuICAgIH1cbiAgICBlbHNlIGlmIChkYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNMYXN0Jykge1xuICAgICAgICBvdXRTaGFwZSA9IFtiYXRjaFNpemUsIG91dEhlaWdodCwgb3V0V2lkdGgsIG91dENoYW5uZWxzXTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYmF0Y2hTaXplLFxuICAgICAgICBkYXRhRm9ybWF0LFxuICAgICAgICBpbkhlaWdodCxcbiAgICAgICAgaW5XaWR0aCxcbiAgICAgICAgaW5DaGFubmVscyxcbiAgICAgICAgb3V0SGVpZ2h0LFxuICAgICAgICBvdXRXaWR0aCxcbiAgICAgICAgb3V0Q2hhbm5lbHMsXG4gICAgICAgIHBhZEluZm8sXG4gICAgICAgIHN0cmlkZUhlaWdodCxcbiAgICAgICAgc3RyaWRlV2lkdGgsXG4gICAgICAgIGZpbHRlckhlaWdodCxcbiAgICAgICAgZmlsdGVyV2lkdGgsXG4gICAgICAgIGVmZmVjdGl2ZUZpbHRlckhlaWdodCxcbiAgICAgICAgZWZmZWN0aXZlRmlsdGVyV2lkdGgsXG4gICAgICAgIGRpbGF0aW9uSGVpZ2h0LFxuICAgICAgICBkaWxhdGlvbldpZHRoLFxuICAgICAgICBpblNoYXBlLFxuICAgICAgICBvdXRTaGFwZSxcbiAgICAgICAgZmlsdGVyU2hhcGVcbiAgICB9O1xufVxuLyoqXG4gKiBDb21wdXRlcyB0aGUgaW5mb3JtYXRpb24gZm9yIGEgZm9yd2FyZCBwYXNzIG9mIGEgM0QgY29udm9sdXRpb24vcG9vbGluZ1xuICogb3BlcmF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZUNvbnYzREluZm8oaW5TaGFwZSwgZmlsdGVyU2hhcGUsIHN0cmlkZXMsIGRpbGF0aW9ucywgcGFkLCBkZXB0aHdpc2UgPSBmYWxzZSwgZGF0YUZvcm1hdCA9ICdjaGFubmVsc0xhc3QnLCByb3VuZGluZ01vZGUpIHtcbiAgICBsZXQgW2JhdGNoU2l6ZSwgaW5EZXB0aCwgaW5IZWlnaHQsIGluV2lkdGgsIGluQ2hhbm5lbHNdID0gWy0xLCAtMSwgLTEsIC0xLCAtMV07XG4gICAgaWYgKGRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0xhc3QnKSB7XG4gICAgICAgIFtiYXRjaFNpemUsIGluRGVwdGgsIGluSGVpZ2h0LCBpbldpZHRoLCBpbkNoYW5uZWxzXSA9IGluU2hhcGU7XG4gICAgfVxuICAgIGVsc2UgaWYgKGRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0ZpcnN0Jykge1xuICAgICAgICBbYmF0Y2hTaXplLCBpbkNoYW5uZWxzLCBpbkRlcHRoLCBpbkhlaWdodCwgaW5XaWR0aF0gPSBpblNoYXBlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGRhdGFGb3JtYXQgJHtkYXRhRm9ybWF0fWApO1xuICAgIH1cbiAgICBjb25zdCBbZmlsdGVyRGVwdGgsIGZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsICwgZmlsdGVyQ2hhbm5lbHNdID0gZmlsdGVyU2hhcGU7XG4gICAgY29uc3QgW3N0cmlkZURlcHRoLCBzdHJpZGVIZWlnaHQsIHN0cmlkZVdpZHRoXSA9IHBhcnNlM1R1cGxlUGFyYW0oc3RyaWRlcyk7XG4gICAgY29uc3QgW2RpbGF0aW9uRGVwdGgsIGRpbGF0aW9uSGVpZ2h0LCBkaWxhdGlvbldpZHRoXSA9IHBhcnNlM1R1cGxlUGFyYW0oZGlsYXRpb25zKTtcbiAgICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJEZXB0aCA9IGdldEVmZmVjdGl2ZUZpbHRlclNpemUoZmlsdGVyRGVwdGgsIGRpbGF0aW9uRGVwdGgpO1xuICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlckhlaWdodCA9IGdldEVmZmVjdGl2ZUZpbHRlclNpemUoZmlsdGVySGVpZ2h0LCBkaWxhdGlvbkhlaWdodCk7XG4gICAgY29uc3QgZWZmZWN0aXZlRmlsdGVyV2lkdGggPSBnZXRFZmZlY3RpdmVGaWx0ZXJTaXplKGZpbHRlcldpZHRoLCBkaWxhdGlvbldpZHRoKTtcbiAgICBjb25zdCB7IHBhZEluZm8sIG91dERlcHRoLCBvdXRIZWlnaHQsIG91dFdpZHRoIH0gPSBnZXQzRFBhZEFuZE91dEluZm8ocGFkLCBpbkRlcHRoLCBpbkhlaWdodCwgaW5XaWR0aCwgc3RyaWRlRGVwdGgsIHN0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGgsIGVmZmVjdGl2ZUZpbHRlckRlcHRoLCBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQsIGVmZmVjdGl2ZUZpbHRlcldpZHRoLCByb3VuZGluZ01vZGUpO1xuICAgIGNvbnN0IG91dENoYW5uZWxzID0gZGVwdGh3aXNlID8gZmlsdGVyQ2hhbm5lbHMgKiBpbkNoYW5uZWxzIDogZmlsdGVyQ2hhbm5lbHM7XG4gICAgbGV0IG91dFNoYXBlO1xuICAgIGlmIChkYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNGaXJzdCcpIHtcbiAgICAgICAgb3V0U2hhcGUgPSBbYmF0Y2hTaXplLCBvdXRDaGFubmVscywgb3V0RGVwdGgsIG91dEhlaWdodCwgb3V0V2lkdGhdO1xuICAgIH1cbiAgICBlbHNlIGlmIChkYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNMYXN0Jykge1xuICAgICAgICBvdXRTaGFwZSA9IFtiYXRjaFNpemUsIG91dERlcHRoLCBvdXRIZWlnaHQsIG91dFdpZHRoLCBvdXRDaGFubmVsc107XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGJhdGNoU2l6ZSxcbiAgICAgICAgZGF0YUZvcm1hdCxcbiAgICAgICAgaW5EZXB0aCxcbiAgICAgICAgaW5IZWlnaHQsXG4gICAgICAgIGluV2lkdGgsXG4gICAgICAgIGluQ2hhbm5lbHMsXG4gICAgICAgIG91dERlcHRoLFxuICAgICAgICBvdXRIZWlnaHQsXG4gICAgICAgIG91dFdpZHRoLFxuICAgICAgICBvdXRDaGFubmVscyxcbiAgICAgICAgcGFkSW5mbyxcbiAgICAgICAgc3RyaWRlRGVwdGgsXG4gICAgICAgIHN0cmlkZUhlaWdodCxcbiAgICAgICAgc3RyaWRlV2lkdGgsXG4gICAgICAgIGZpbHRlckRlcHRoLFxuICAgICAgICBmaWx0ZXJIZWlnaHQsXG4gICAgICAgIGZpbHRlcldpZHRoLFxuICAgICAgICBlZmZlY3RpdmVGaWx0ZXJEZXB0aCxcbiAgICAgICAgZWZmZWN0aXZlRmlsdGVySGVpZ2h0LFxuICAgICAgICBlZmZlY3RpdmVGaWx0ZXJXaWR0aCxcbiAgICAgICAgZGlsYXRpb25EZXB0aCxcbiAgICAgICAgZGlsYXRpb25IZWlnaHQsXG4gICAgICAgIGRpbGF0aW9uV2lkdGgsXG4gICAgICAgIGluU2hhcGUsXG4gICAgICAgIG91dFNoYXBlLFxuICAgICAgICBmaWx0ZXJTaGFwZVxuICAgIH07XG59XG5mdW5jdGlvbiBjb21wdXRlT3V0cHV0U2hhcGUyRChpblNoYXBlLCBmaWVsZFNpemUsIHN0cmlkZSwgemVyb1BhZCwgcm91bmRpbmdNb2RlKSB7XG4gICAgaWYgKHplcm9QYWQgPT0gbnVsbCkge1xuICAgICAgICB6ZXJvUGFkID0gY29tcHV0ZURlZmF1bHRQYWQoaW5TaGFwZSwgZmllbGRTaXplLCBzdHJpZGUpO1xuICAgIH1cbiAgICBjb25zdCBpbnB1dFJvd3MgPSBpblNoYXBlWzBdO1xuICAgIGNvbnN0IGlucHV0Q29scyA9IGluU2hhcGVbMV07XG4gICAgY29uc3Qgb3V0cHV0Um93cyA9IHJvdW5kKChpbnB1dFJvd3MgLSBmaWVsZFNpemUgKyAyICogemVyb1BhZCkgLyBzdHJpZGUgKyAxLCByb3VuZGluZ01vZGUpO1xuICAgIGNvbnN0IG91dHB1dENvbHMgPSByb3VuZCgoaW5wdXRDb2xzIC0gZmllbGRTaXplICsgMiAqIHplcm9QYWQpIC8gc3RyaWRlICsgMSwgcm91bmRpbmdNb2RlKTtcbiAgICByZXR1cm4gW291dHB1dFJvd3MsIG91dHB1dENvbHNdO1xufVxuZnVuY3Rpb24gY29tcHV0ZU91dHB1dFNoYXBlNEQoaW5TaGFwZSwgZmllbGRTaXplLCBvdXRDaGFubmVscywgc3RyaWRlLCB6ZXJvUGFkLCByb3VuZGluZ01vZGUpIHtcbiAgICBpZiAoemVyb1BhZCA9PSBudWxsKSB7XG4gICAgICAgIHplcm9QYWQgPSBjb21wdXRlRGVmYXVsdFBhZChpblNoYXBlLCBmaWVsZFNpemUsIHN0cmlkZSk7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0RGVwdGggPSBpblNoYXBlWzBdO1xuICAgIGNvbnN0IGlucHV0Um93cyA9IGluU2hhcGVbMV07XG4gICAgY29uc3QgaW5wdXRDb2xzID0gaW5TaGFwZVsyXTtcbiAgICBjb25zdCBvdXRwdXREZXB0aHMgPSByb3VuZCgoaW5wdXREZXB0aCAtIGZpZWxkU2l6ZSArIDIgKiB6ZXJvUGFkKSAvIHN0cmlkZSArIDEsIHJvdW5kaW5nTW9kZSk7XG4gICAgY29uc3Qgb3V0cHV0Um93cyA9IHJvdW5kKChpbnB1dFJvd3MgLSBmaWVsZFNpemUgKyAyICogemVyb1BhZCkgLyBzdHJpZGUgKyAxLCByb3VuZGluZ01vZGUpO1xuICAgIGNvbnN0IG91dHB1dENvbHMgPSByb3VuZCgoaW5wdXRDb2xzIC0gZmllbGRTaXplICsgMiAqIHplcm9QYWQpIC8gc3RyaWRlICsgMSwgcm91bmRpbmdNb2RlKTtcbiAgICByZXR1cm4gW291dHB1dERlcHRocywgb3V0cHV0Um93cywgb3V0cHV0Q29scywgb3V0Q2hhbm5lbHNdO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVEZWZhdWx0UGFkKGlucHV0U2hhcGUsIGZpZWxkU2l6ZSwgc3RyaWRlLCBkaWxhdGlvbiA9IDEpIHtcbiAgICBjb25zdCBlZmZlY3RpdmVGaWVsZFNpemUgPSBnZXRFZmZlY3RpdmVGaWx0ZXJTaXplKGZpZWxkU2l6ZSwgZGlsYXRpb24pO1xuICAgIHJldHVybiBNYXRoLmZsb29yKChpbnB1dFNoYXBlWzBdICogKHN0cmlkZSAtIDEpIC0gc3RyaWRlICsgZWZmZWN0aXZlRmllbGRTaXplKSAvIDIpO1xufVxuZnVuY3Rpb24gcGFyc2VUdXBsZVBhcmFtKHBhcmFtKSB7XG4gICAgaWYgKHR5cGVvZiBwYXJhbSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIFtwYXJhbSwgcGFyYW0sIHBhcmFtXTtcbiAgICB9XG4gICAgaWYgKHBhcmFtLmxlbmd0aCA9PT0gMikge1xuICAgICAgICByZXR1cm4gW3BhcmFtWzBdLCBwYXJhbVsxXSwgMV07XG4gICAgfVxuICAgIHJldHVybiBwYXJhbTtcbn1cbmZ1bmN0aW9uIHBhcnNlM1R1cGxlUGFyYW0ocGFyYW0pIHtcbiAgICByZXR1cm4gdHlwZW9mIHBhcmFtID09PSAnbnVtYmVyJyA/IFtwYXJhbSwgcGFyYW0sIHBhcmFtXSA6IHBhcmFtO1xufVxuLyogU2VlIGh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9hdHJvdXNfY29udjJkXG4gKiBBdHJvdXMgY29udm9sdXRpb24gaXMgZXF1aXZhbGVudCB0byBzdGFuZGFyZCBjb252b2x1dGlvbiB3aXRoIHVwc2FtcGxlZFxuICogZmlsdGVycyB3aXRoIGVmZmVjdGl2ZV9maWx0ZXJfaGVpZ2h0ID1cbiAqIGZpbHRlcl9oZWlnaHQgKyAoZmlsdGVyX2hlaWdodCAtIDEpICogKGRpbGF0aW9uIC0gMSlcbiAqIGFuZCBlZmZlY3RpdmVfZmlsdGVyX3dpZHRoID1cbiAqIGZpbHRlcl93aWR0aCArIChmaWx0ZXJfd2lkdGggLSAxKSAqIChkaWxhdGlvbiAtIDEpLFxuICogcHJvZHVjZWQgYnkgaW5zZXJ0aW5nIGRpbGF0aW9uIC0gMSB6ZXJvcyBhbG9uZyBjb25zZWN1dGl2ZSBlbGVtZW50cyBhY3Jvc3NcbiAqIHRoZSBmaWx0ZXJzJyBzcGF0aWFsIGRpbWVuc2lvbnMuXG4gKiBXaGVuIHRoZXJlIGlzIGEgZGlsYXRpb24sIHRoaXMgY29udmVydHMgYSBmaWx0ZXIgZGltZW5zaW9uIHRvIHRoZVxuICogZWZmZWN0aXZlIGZpbHRlciBkaW1lbnNpb24sIHNvIGl0IGNhbiBiZSB1c2VkIGluIGEgc3RhbmRhcmQgY29udm9sdXRpb24uXG4gKi9cbmZ1bmN0aW9uIGdldEVmZmVjdGl2ZUZpbHRlclNpemUoZmlsdGVyU2l6ZSwgZGlsYXRpb24pIHtcbiAgICBpZiAoZGlsYXRpb24gPD0gMSkge1xuICAgICAgICByZXR1cm4gZmlsdGVyU2l6ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZpbHRlclNpemUgKyAoZmlsdGVyU2l6ZSAtIDEpICogKGRpbGF0aW9uIC0gMSk7XG59XG5mdW5jdGlvbiBnZXRQYWRBbmRPdXRJbmZvKHBhZCwgaW5IZWlnaHQsIGluV2lkdGgsIHN0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGgsIGZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsIHJvdW5kaW5nTW9kZSwgZGF0YUZvcm1hdCkge1xuICAgIGxldCBwYWRJbmZvO1xuICAgIGxldCBvdXRIZWlnaHQ7XG4gICAgbGV0IG91dFdpZHRoO1xuICAgIGlmICh0eXBlb2YgcGFkID09PSAnbnVtYmVyJykge1xuICAgICAgICBjb25zdCBwYWRUeXBlID0gKHBhZCA9PT0gMCkgPyAnVkFMSUQnIDogJ05VTUJFUic7XG4gICAgICAgIHBhZEluZm8gPSB7IHRvcDogcGFkLCBib3R0b206IHBhZCwgbGVmdDogcGFkLCByaWdodDogcGFkLCB0eXBlOiBwYWRUeXBlIH07XG4gICAgICAgIGNvbnN0IG91dFNoYXBlID0gY29tcHV0ZU91dHB1dFNoYXBlMkQoW2luSGVpZ2h0LCBpbldpZHRoXSwgZmlsdGVySGVpZ2h0LCBzdHJpZGVIZWlnaHQsIHBhZCwgcm91bmRpbmdNb2RlKTtcbiAgICAgICAgb3V0SGVpZ2h0ID0gb3V0U2hhcGVbMF07XG4gICAgICAgIG91dFdpZHRoID0gb3V0U2hhcGVbMV07XG4gICAgfVxuICAgIGVsc2UgaWYgKHBhZCA9PT0gJ3NhbWUnKSB7XG4gICAgICAgIG91dEhlaWdodCA9IE1hdGguY2VpbChpbkhlaWdodCAvIHN0cmlkZUhlaWdodCk7XG4gICAgICAgIG91dFdpZHRoID0gTWF0aC5jZWlsKGluV2lkdGggLyBzdHJpZGVXaWR0aCk7XG4gICAgICAgIGNvbnN0IHBhZEFsb25nSGVpZ2h0ID0gTWF0aC5tYXgoMCwgKG91dEhlaWdodCAtIDEpICogc3RyaWRlSGVpZ2h0ICsgZmlsdGVySGVpZ2h0IC0gaW5IZWlnaHQpO1xuICAgICAgICBjb25zdCBwYWRBbG9uZ1dpZHRoID0gTWF0aC5tYXgoMCwgKG91dFdpZHRoIC0gMSkgKiBzdHJpZGVXaWR0aCArIGZpbHRlcldpZHRoIC0gaW5XaWR0aCk7XG4gICAgICAgIGNvbnN0IHRvcCA9IE1hdGguZmxvb3IocGFkQWxvbmdIZWlnaHQgLyAyKTtcbiAgICAgICAgY29uc3QgYm90dG9tID0gcGFkQWxvbmdIZWlnaHQgLSB0b3A7XG4gICAgICAgIGNvbnN0IGxlZnQgPSBNYXRoLmZsb29yKHBhZEFsb25nV2lkdGggLyAyKTtcbiAgICAgICAgY29uc3QgcmlnaHQgPSBwYWRBbG9uZ1dpZHRoIC0gbGVmdDtcbiAgICAgICAgcGFkSW5mbyA9IHsgdG9wLCBib3R0b20sIGxlZnQsIHJpZ2h0LCB0eXBlOiAnU0FNRScgfTtcbiAgICB9XG4gICAgZWxzZSBpZiAocGFkID09PSAndmFsaWQnKSB7XG4gICAgICAgIHBhZEluZm8gPSB7IHRvcDogMCwgYm90dG9tOiAwLCBsZWZ0OiAwLCByaWdodDogMCwgdHlwZTogJ1ZBTElEJyB9O1xuICAgICAgICBvdXRIZWlnaHQgPSBNYXRoLmNlaWwoKGluSGVpZ2h0IC0gZmlsdGVySGVpZ2h0ICsgMSkgLyBzdHJpZGVIZWlnaHQpO1xuICAgICAgICBvdXRXaWR0aCA9IE1hdGguY2VpbCgoaW5XaWR0aCAtIGZpbHRlcldpZHRoICsgMSkgLyBzdHJpZGVXaWR0aCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBwYWQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGNvbnN0IHRvcCA9IGRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0xhc3QnID8gcGFkWzFdWzBdIDogcGFkWzJdWzBdO1xuICAgICAgICBjb25zdCBib3R0b20gPSBkYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNMYXN0JyA/IHBhZFsxXVsxXSA6IHBhZFsyXVsxXTtcbiAgICAgICAgY29uc3QgbGVmdCA9IGRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0xhc3QnID8gcGFkWzJdWzBdIDogcGFkWzNdWzBdO1xuICAgICAgICBjb25zdCByaWdodCA9IGRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0xhc3QnID8gcGFkWzJdWzFdIDogcGFkWzNdWzFdO1xuICAgICAgICBjb25zdCBwYWRUeXBlID0gKHRvcCA9PT0gMCAmJiBib3R0b20gPT09IDAgJiYgbGVmdCA9PT0gMCAmJiByaWdodCA9PT0gMCkgP1xuICAgICAgICAgICAgJ1ZBTElEJyA6XG4gICAgICAgICAgICAnRVhQTElDSVQnO1xuICAgICAgICBwYWRJbmZvID0geyB0b3AsIGJvdHRvbSwgbGVmdCwgcmlnaHQsIHR5cGU6IHBhZFR5cGUgfTtcbiAgICAgICAgb3V0SGVpZ2h0ID0gcm91bmQoKGluSGVpZ2h0IC0gZmlsdGVySGVpZ2h0ICsgdG9wICsgYm90dG9tKSAvIHN0cmlkZUhlaWdodCArIDEsIHJvdW5kaW5nTW9kZSk7XG4gICAgICAgIG91dFdpZHRoID0gcm91bmQoKGluV2lkdGggLSBmaWx0ZXJXaWR0aCArIGxlZnQgKyByaWdodCkgLyBzdHJpZGVXaWR0aCArIDEsIHJvdW5kaW5nTW9kZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aHJvdyBFcnJvcihgVW5rbm93biBwYWRkaW5nIHBhcmFtZXRlcjogJHtwYWR9YCk7XG4gICAgfVxuICAgIHJldHVybiB7IHBhZEluZm8sIG91dEhlaWdodCwgb3V0V2lkdGggfTtcbn1cbmZ1bmN0aW9uIGdldDNEUGFkQW5kT3V0SW5mbyhwYWQsIGluRGVwdGgsIGluSGVpZ2h0LCBpbldpZHRoLCBzdHJpZGVEZXB0aCwgc3RyaWRlSGVpZ2h0LCBzdHJpZGVXaWR0aCwgZmlsdGVyRGVwdGgsIGZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsIHJvdW5kaW5nTW9kZSkge1xuICAgIGxldCBwYWRJbmZvO1xuICAgIGxldCBvdXREZXB0aDtcbiAgICBsZXQgb3V0SGVpZ2h0O1xuICAgIGxldCBvdXRXaWR0aDtcbiAgICBpZiAodHlwZW9mIHBhZCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgY29uc3QgcGFkVHlwZSA9IChwYWQgPT09IDApID8gJ1ZBTElEJyA6ICdOVU1CRVInO1xuICAgICAgICBwYWRJbmZvID0ge1xuICAgICAgICAgICAgdG9wOiBwYWQsXG4gICAgICAgICAgICBib3R0b206IHBhZCxcbiAgICAgICAgICAgIGxlZnQ6IHBhZCxcbiAgICAgICAgICAgIHJpZ2h0OiBwYWQsXG4gICAgICAgICAgICBmcm9udDogcGFkLFxuICAgICAgICAgICAgYmFjazogcGFkLFxuICAgICAgICAgICAgdHlwZTogcGFkVHlwZVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBvdXRTaGFwZSA9IGNvbXB1dGVPdXRwdXRTaGFwZTREKFtpbkRlcHRoLCBpbkhlaWdodCwgaW5XaWR0aCwgMV0sIGZpbHRlckRlcHRoLCAxLCBzdHJpZGVEZXB0aCwgcGFkLCByb3VuZGluZ01vZGUpO1xuICAgICAgICBvdXREZXB0aCA9IG91dFNoYXBlWzBdO1xuICAgICAgICBvdXRIZWlnaHQgPSBvdXRTaGFwZVsxXTtcbiAgICAgICAgb3V0V2lkdGggPSBvdXRTaGFwZVsyXTtcbiAgICB9XG4gICAgZWxzZSBpZiAocGFkID09PSAnc2FtZScpIHtcbiAgICAgICAgb3V0RGVwdGggPSBNYXRoLmNlaWwoaW5EZXB0aCAvIHN0cmlkZURlcHRoKTtcbiAgICAgICAgb3V0SGVpZ2h0ID0gTWF0aC5jZWlsKGluSGVpZ2h0IC8gc3RyaWRlSGVpZ2h0KTtcbiAgICAgICAgb3V0V2lkdGggPSBNYXRoLmNlaWwoaW5XaWR0aCAvIHN0cmlkZVdpZHRoKTtcbiAgICAgICAgY29uc3QgcGFkQWxvbmdEZXB0aCA9IChvdXREZXB0aCAtIDEpICogc3RyaWRlRGVwdGggKyBmaWx0ZXJEZXB0aCAtIGluRGVwdGg7XG4gICAgICAgIGNvbnN0IHBhZEFsb25nSGVpZ2h0ID0gKG91dEhlaWdodCAtIDEpICogc3RyaWRlSGVpZ2h0ICsgZmlsdGVySGVpZ2h0IC0gaW5IZWlnaHQ7XG4gICAgICAgIGNvbnN0IHBhZEFsb25nV2lkdGggPSAob3V0V2lkdGggLSAxKSAqIHN0cmlkZVdpZHRoICsgZmlsdGVyV2lkdGggLSBpbldpZHRoO1xuICAgICAgICBjb25zdCBmcm9udCA9IE1hdGguZmxvb3IocGFkQWxvbmdEZXB0aCAvIDIpO1xuICAgICAgICBjb25zdCBiYWNrID0gcGFkQWxvbmdEZXB0aCAtIGZyb250O1xuICAgICAgICBjb25zdCB0b3AgPSBNYXRoLmZsb29yKHBhZEFsb25nSGVpZ2h0IC8gMik7XG4gICAgICAgIGNvbnN0IGJvdHRvbSA9IHBhZEFsb25nSGVpZ2h0IC0gdG9wO1xuICAgICAgICBjb25zdCBsZWZ0ID0gTWF0aC5mbG9vcihwYWRBbG9uZ1dpZHRoIC8gMik7XG4gICAgICAgIGNvbnN0IHJpZ2h0ID0gcGFkQWxvbmdXaWR0aCAtIGxlZnQ7XG4gICAgICAgIHBhZEluZm8gPSB7IHRvcCwgYm90dG9tLCBsZWZ0LCByaWdodCwgZnJvbnQsIGJhY2ssIHR5cGU6ICdTQU1FJyB9O1xuICAgIH1cbiAgICBlbHNlIGlmIChwYWQgPT09ICd2YWxpZCcpIHtcbiAgICAgICAgcGFkSW5mbyA9IHtcbiAgICAgICAgICAgIHRvcDogMCxcbiAgICAgICAgICAgIGJvdHRvbTogMCxcbiAgICAgICAgICAgIGxlZnQ6IDAsXG4gICAgICAgICAgICByaWdodDogMCxcbiAgICAgICAgICAgIGZyb250OiAwLFxuICAgICAgICAgICAgYmFjazogMCxcbiAgICAgICAgICAgIHR5cGU6ICdWQUxJRCdcbiAgICAgICAgfTtcbiAgICAgICAgb3V0RGVwdGggPSBNYXRoLmNlaWwoKGluRGVwdGggLSBmaWx0ZXJEZXB0aCArIDEpIC8gc3RyaWRlRGVwdGgpO1xuICAgICAgICBvdXRIZWlnaHQgPSBNYXRoLmNlaWwoKGluSGVpZ2h0IC0gZmlsdGVySGVpZ2h0ICsgMSkgLyBzdHJpZGVIZWlnaHQpO1xuICAgICAgICBvdXRXaWR0aCA9IE1hdGguY2VpbCgoaW5XaWR0aCAtIGZpbHRlcldpZHRoICsgMSkgLyBzdHJpZGVXaWR0aCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aHJvdyBFcnJvcihgVW5rbm93biBwYWRkaW5nIHBhcmFtZXRlcjogJHtwYWR9YCk7XG4gICAgfVxuICAgIHJldHVybiB7IHBhZEluZm8sIG91dERlcHRoLCBvdXRIZWlnaHQsIG91dFdpZHRoIH07XG59XG4vKipcbiAqIFJvdW5kcyBhIHZhbHVlIGRlcGVuZGluZyBvbiB0aGUgcm91bmRpbmcgbW9kZVxuICogQHBhcmFtIHZhbHVlXG4gKiBAcGFyYW0gcm91bmRpbmdNb2RlIEEgc3RyaW5nIGZyb206ICdjZWlsJywgJ3JvdW5kJywgJ2Zsb29yJy4gSWYgbm9uZSBpc1xuICogICAgIHByb3ZpZGVkLCBpdCB3aWxsIGRlZmF1bHQgdG8gdHJ1bmNhdGUuXG4gKi9cbmZ1bmN0aW9uIHJvdW5kKHZhbHVlLCByb3VuZGluZ01vZGUpIHtcbiAgICBpZiAoIXJvdW5kaW5nTW9kZSkge1xuICAgICAgICByZXR1cm4gTWF0aC50cnVuYyh2YWx1ZSk7XG4gICAgfVxuICAgIHN3aXRjaCAocm91bmRpbmdNb2RlKSB7XG4gICAgICAgIGNhc2UgJ3JvdW5kJzpcbiAgICAgICAgICAgIC8vIHVzZWQgZm9yIENhZmZlIENvbnZcbiAgICAgICAgICAgIHJldHVybiBNYXRoLnJvdW5kKHZhbHVlKTtcbiAgICAgICAgY2FzZSAnY2VpbCc6XG4gICAgICAgICAgICAvLyB1c2VkIGZvciBDYWZmZSBQb29sXG4gICAgICAgICAgICByZXR1cm4gTWF0aC5jZWlsKHZhbHVlKTtcbiAgICAgICAgY2FzZSAnZmxvb3InOlxuICAgICAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IodmFsdWUpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHJvdW5kaW5nTW9kZSAke3JvdW5kaW5nTW9kZX1gKTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gdHVwbGVWYWx1ZXNBcmVPbmUocGFyYW0pIHtcbiAgICBjb25zdCBbZGltQSwgZGltQiwgZGltQ10gPSBwYXJzZVR1cGxlUGFyYW0ocGFyYW0pO1xuICAgIHJldHVybiBkaW1BID09PSAxICYmIGRpbUIgPT09IDEgJiYgZGltQyA9PT0gMTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBlaXRoZXJTdHJpZGVzT3JEaWxhdGlvbnNBcmVPbmUoc3RyaWRlcywgZGlsYXRpb25zKSB7XG4gICAgcmV0dXJuIHR1cGxlVmFsdWVzQXJlT25lKHN0cmlkZXMpIHx8IHR1cGxlVmFsdWVzQXJlT25lKGRpbGF0aW9ucyk7XG59XG4vKipcbiAqIENvbnZlcnQgQ29udjJEIGRhdGFGb3JtYXQgZnJvbSAnTkhXQyd8J05DSFcnIHRvXG4gKiAgICAnY2hhbm5lbHNMYXN0J3wnY2hhbm5lbHNGaXJzdCdcbiAqIEBwYXJhbSBkYXRhRm9ybWF0IGluICdOSFdDJ3wnTkNIVycgbW9kZVxuICogQHJldHVybiBkYXRhRm9ybWF0IGluICdjaGFubmVsc0xhc3QnfCdjaGFubmVsc0ZpcnN0JyBtb2RlXG4gKiBAdGhyb3dzIHVua25vd24gZGF0YUZvcm1hdFxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udmVydENvbnYyRERhdGFGb3JtYXQoZGF0YUZvcm1hdCkge1xuICAgIGlmIChkYXRhRm9ybWF0ID09PSAnTkhXQycpIHtcbiAgICAgICAgcmV0dXJuICdjaGFubmVsc0xhc3QnO1xuICAgIH1cbiAgICBlbHNlIGlmIChkYXRhRm9ybWF0ID09PSAnTkNIVycpIHtcbiAgICAgICAgcmV0dXJuICdjaGFubmVsc0ZpcnN0JztcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBkYXRhRm9ybWF0ICR7ZGF0YUZvcm1hdH1gKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb252X3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IENvcyB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENvbXB1dGVzIGNvcyBvZiB0aGUgaW5wdXQgYHRmLlRlbnNvcmAgZWxlbWVudC13aXNlOiBgY29zKHgpYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzAsIE1hdGguUEkgLyAyLCBNYXRoLlBJICogMyAvIDRdKTtcbiAqXG4gKiB4LmNvcygpLnByaW50KCk7ICAvLyBvciB0Zi5jb3MoeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gY29zXyh4KSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnY29zJyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKENvcywgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBjb3MgPSBvcCh7IGNvc18gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb3MuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IENvc2ggfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyBoeXBlcmJvbGljIGNvcyBvZiB0aGUgaW5wdXQgYHRmLlRlbnNvcmAgZWxlbWVudC13aXNlOiBgY29zaCh4KWBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFswLCAxLCAtMSwgLjddKTtcbiAqXG4gKiB4LmNvc2goKS5wcmludCgpOyAgLy8gb3IgdGYuY29zaCh4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiBjb3NoXyh4KSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnY29zaCcpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChDb3NoLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IGNvc2ggPSBvcCh7IGNvc2hfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29zaC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgQ3Vtc3VtIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgdGhlIGN1bXVsYXRpdmUgc3VtIG9mIGEgYHRmLlRlbnNvcmAgYWxvbmcgYGF4aXNgLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yKFsxLCAyLCAzLCA0XSk7XG4gKiB4LmN1bXN1bSgpLnByaW50KCk7XG4gKiBgYGBcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yKFtbMSwgMl0sIFszLCA0XV0pO1xuICogeC5jdW1zdW0oKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvciB0byBiZSBzdW1tZWQuXG4gKiBAcGFyYW0gYXhpcyBUaGUgYXhpcyBhbG9uZyB3aGljaCB0byBzdW0uIE9wdGlvbmFsLiBEZWZhdWx0cyB0byAwLlxuICogQHBhcmFtIGV4Y2x1c2l2ZSBXaGV0aGVyIHRvIHBlcmZvcm0gZXhjbHVzaXZlIGN1bXVsYXRpdmUgc3VtLiBPcHRpb25hbC5cbiAqICAgICBEZWZhdWx0cyB0byBmYWxzZS4gSWYgc2V0IHRvIHRydWUgdGhlbiB0aGUgc3VtIG9mIGVhY2ggdGVuc29yIGVudHJ5XG4gKiAgICAgZG9lcyBub3QgaW5jbHVkZSBpdHMgb3duIHZhbHVlLCBidXQgb25seSB0aGUgdmFsdWVzIHByZXZpb3VzIHRvIGl0XG4gKiAgICAgYWxvbmcgdGhlIHNwZWNpZmllZCBheGlzLlxuICogQHBhcmFtIHJldmVyc2UgV2hldGhlciB0byBzdW0gaW4gdGhlIG9wcG9zaXRlIGRpcmVjdGlvbi4gT3B0aW9uYWwuXG4gKiAgICAgRGVmYXVsdHMgdG8gZmFsc2UuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnU2Nhbid9XG4gKi9cbmZ1bmN0aW9uIGN1bXN1bV8oeCwgYXhpcyA9IDAsIGV4Y2x1c2l2ZSA9IGZhbHNlLCByZXZlcnNlID0gZmFsc2UpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdjdW1zdW0nKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IHg6ICR4IH07XG4gICAgY29uc3QgYXR0cnMgPSB7IGF4aXMsIGV4Y2x1c2l2ZSwgcmV2ZXJzZSB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEN1bXN1bSwgaW5wdXRzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3QgY3Vtc3VtID0gb3AoeyBjdW1zdW1fIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y3Vtc3VtLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBEZW5zZUJpbmNvdW50IH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIE91dHB1dHMgYSB2ZWN0b3Igd2l0aCBsZW5ndGggYHNpemVgIGFuZCB0aGUgc2FtZSBkdHlwZSBhcyBgd2VpZ2h0c2AuXG4gKlxuICogSWYgYHdlaWdodHNgIGFyZSBlbXB0eSwgdGhlbiBpbmRleCBgaWAgc3RvcmVzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIHZhbHVlXG4gKiBgaWAgaXMgY291bnRlZCBpbiBgeGAuIElmIGB3ZWlnaHRzYCBhcmUgbm9uLWVtcHR5LCB0aGVuIGluZGV4IGBpYCBzdG9yZXMgdGhlXG4gKiBzdW0gb2YgdGhlIHZhbHVlIGluIGB3ZWlnaHRzYCBhdCBlYWNoIGluZGV4IHdoZXJlIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGluXG4gKiBgeGAgaXMgYGlgLlxuICpcbiAqIFZhbHVlcyBpbiBgeGAgb3V0c2lkZSBvZiB0aGUgcmFuZ2UgWzAsIHNpemUpIGFyZSBpZ25vcmVkLlxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCBpbnQgdGVuc29yLCByYW5rIDEgb3IgcmFuayAyLlxuICogQHBhcmFtIHdlaWdodHMgVGhlIHdlaWdodHMgdGVuc29yLCBtdXN0IGhhdmUgdGhlIHNhbWUgc2hhcGUgYXMgeCwgb3IgYVxuICogICAgIGxlbmd0aC0wIFRlbnNvciwgaW4gd2hpY2ggY2FzZSBpdCBhY3RzIGFzIGFsbCB3ZWlnaHRzIGVxdWFsIHRvIDEuXG4gKiBAcGFyYW0gc2l6ZSBOb24tbmVnYXRpdmUgaW50ZWdlci5cbiAqIEBwYXJhbSBiaW5hcnlPdXRwdXQgT3B0aW9uYWwuIFdoZXRoZXIgdGhlIGtlcm5lbCBzaG91bGQgY291bnQgdGhlIGFwcGVhcmFuY2VcbiAqICAgICBvciBudW1iZXIgb2Ygb2NjdXJyZW5jZXMuIERlZmF1bHRzIHRvIEZhbHNlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ1JlZHVjdGlvbid9XG4gKi9cbmZ1bmN0aW9uIGRlbnNlQmluY291bnRfKHgsIHdlaWdodHMsIHNpemUsIGJpbmFyeU91dHB1dCA9IGZhbHNlKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnZGVuc2VCaW5jb3VudCcpO1xuICAgIGNvbnN0ICR3ZWlnaHRzID0gY29udmVydFRvVGVuc29yKHdlaWdodHMsICd3ZWlnaHRzJywgJ2RlbnNlQmluY291bnQnKTtcbiAgICB1dGlsLmFzc2VydCgkeC5kdHlwZSA9PT0gJ2ludDMyJywgKCkgPT4gYEVycm9yIGluIGRlbnNlQmluY291bnQ6IGlucHV0IGAgK1xuICAgICAgICBgZHR5cGUgbXVzdCBiZSBpbnQzMiwgYnV0IGdvdCAkeyR4LmR0eXBlfWApO1xuICAgIHV0aWwuYXNzZXJ0KCR4LnJhbmsgPD0gMiwgKCkgPT4gYEVycm9yIGluIGRlbnNlQmluY291bnQ6IGlucHV0IG11c3QgYmUgYXQgbW9zdCByYW5rIDIsIGJ1dCBnb3QgYCArXG4gICAgICAgIGByYW5rICR7JHgucmFua30uYCk7XG4gICAgdXRpbC5hc3NlcnQoc2l6ZSA+PSAwLCAoKSA9PiBgc2l6ZSBtdXN0IGJlIG5vbi1uZWdhdGl2ZSwgYnV0IGdvdCAke3NpemV9LmApO1xuICAgIHV0aWwuYXNzZXJ0KCR3ZWlnaHRzLnNpemUgPT09ICR4LnNpemUgfHwgJHdlaWdodHMuc2l6ZSA9PT0gMCwgKCkgPT4gYEVycm9yIGluIGRlbnNlQmluY291bnQ6IHdlaWdodHMgbXVzdCBoYXZlIHRoZSBzYW1lIHNoYXBlIGFzIHggb3IgYCArXG4gICAgICAgIGAwLWxlbmd0aCwgYnV0IGdvdCB4IHNoYXBlOiAkeyR4LnNoYXBlfSwgd2VpZ2h0cyBzaGFwZTogYCArXG4gICAgICAgIGAkeyR3ZWlnaHRzLnNoYXBlfS5gKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IHg6ICR4LCB3ZWlnaHRzOiAkd2VpZ2h0cyB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBzaXplLCBiaW5hcnlPdXRwdXQgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChEZW5zZUJpbmNvdW50LCBpbnB1dHMsIGF0dHJzKTtcbn1cbmV4cG9ydCBjb25zdCBkZW5zZUJpbmNvdW50ID0gb3AoeyBkZW5zZUJpbmNvdW50XyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRlbnNlX2JpbmNvdW50LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBEZXB0aFRvU3BhY2UgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogUmVhcnJhbmdlcyBkYXRhIGZyb20gZGVwdGggaW50byBibG9ja3Mgb2Ygc3BhdGlhbCBkYXRhLiBNb3JlIHNwZWNpZmljYWxseSxcbiAqIHRoaXMgb3Agb3V0cHV0cyBhIGNvcHkgb2YgdGhlIGlucHV0IHRlbnNvciB3aGVyZSB2YWx1ZXMgZnJvbSB0aGUgYGRlcHRoYFxuICogZGltZW5zaW9uIGFyZSBtb3ZlZCBpbiBzcGF0aWFsIGJsb2NrcyB0byB0aGUgYGhlaWdodGAgYW5kIGB3aWR0aGAgZGltZW5zaW9ucy5cbiAqIFRoZSBhdHRyIGBibG9ja1NpemVgIGluZGljYXRlcyB0aGUgaW5wdXQgYmxvY2sgc2l6ZSBhbmQgaG93IHRoZSBkYXRhIGlzXG4gKiBtb3ZlZC5cbiAqXG4gKiAgLSBDaHVua3Mgb2YgZGF0YSBvZiBzaXplIGBibG9ja1NpemUgKiBibG9ja1NpemVgIGZyb20gZGVwdGggYXJlIHJlYXJyYW5nZWRcbiAqIGludG8gbm9uLW92ZXJsYXBwaW5nIGJsb2NrcyBvZiBzaXplIGBibG9ja1NpemUgeCBibG9ja1NpemVgXG4gKlxuICogIC0gVGhlIHdpZHRoIHRoZSBvdXRwdXQgdGVuc29yIGlzIGBpbnB1dFdpZHRoICogYmxvY2tTaXplYCwgd2hlcmVhcyB0aGVcbiAqIGhlaWdodCBpcyBgaW5wdXRIZWlnaHQgKiBibG9ja1NpemVgXG4gKlxuICogIC0gVGhlIFksIFggY29vcmRpbmF0ZXMgd2l0aGluIGVhY2ggYmxvY2sgb2YgdGhlIG91dHB1dCBpbWFnZSBhcmUgZGV0ZXJtaW5lZFxuICogYnkgdGhlIGhpZ2ggb3JkZXIgY29tcG9uZW50IG9mIHRoZSBpbnB1dCBjaGFubmVsIGluZGV4XG4gKlxuICogIC0gVGhlIGRlcHRoIG9mIHRoZSBpbnB1dCB0ZW5zb3IgbXVzdCBiZSBkaXZpc2libGUgYnkgYGJsb2NrU2l6ZSAqXG4gKiBibG9ja1NpemVgXG4gKlxuICogVGhlIGBkYXRhRm9ybWF0YCBhdHRyIHNwZWNpZmllcyB0aGUgbGF5b3V0IG9mIHRoZSBpbnB1dCBhbmQgb3V0cHV0IHRlbnNvcnNcbiAqIHdpdGggdGhlIGZvbGxvd2luZyBvcHRpb25zOiBcIk5IV0NcIjogWyBgYmF0Y2gsIGhlaWdodCwgd2lkdGgsIGNoYW5uZWxzYCBdXG4gKiBcIk5DSFdcIjogWyBgYmF0Y2gsIGNoYW5uZWxzLCBoZWlnaHQsIHdpZHRoYCBdXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3I0ZChbMSwgMiwgMywgNF0sIFsxLCAxLCAxLCA0XSk7XG4gKiBjb25zdCBibG9ja1NpemUgPSAyO1xuICogY29uc3QgZGF0YUZvcm1hdCA9IFwiTkhXQ1wiO1xuICpcbiAqIHRmLmRlcHRoVG9TcGFjZSh4LCBibG9ja1NpemUsIGRhdGFGb3JtYXQpLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yIG9mIHJhbmsgNFxuICogQHBhcmFtIGJsb2NrU0l6ZSAgQW4gYGludGAgdGhhdCBpcyBgPj0gMmAuIFRoZSBzaXplIG9mIHRoZSBzcGF0aWFsIGJsb2NrXG4gKiBAcGFyYW0gZGF0YUZvcm1hdCBBbiBvcHRpb25hbCBzdHJpbmcgZnJvbTogXCJOSFdDXCIsIFwiTkNIV1wiLiBEZWZhdWx0cyB0byBcIk5IV0NcIlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ1RyYW5zZm9ybWF0aW9ucyd9XG4gKi9cbmZ1bmN0aW9uIGRlcHRoVG9TcGFjZV8oeCwgYmxvY2tTaXplLCBkYXRhRm9ybWF0ID0gJ05IV0MnKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnZGVwdGhUb1NwYWNlJyk7XG4gICAgY29uc3QgaW5wdXRIZWlnaHQgPSAoZGF0YUZvcm1hdCA9PT0gJ05IV0MnKSA/ICR4LnNoYXBlWzFdIDogJHguc2hhcGVbMl07XG4gICAgY29uc3QgaW5wdXRXaWR0aCA9IChkYXRhRm9ybWF0ID09PSAnTkhXQycpID8gJHguc2hhcGVbMl0gOiAkeC5zaGFwZVszXTtcbiAgICBjb25zdCBpbnB1dERlcHRoID0gKGRhdGFGb3JtYXQgPT09ICdOSFdDJykgPyAkeC5zaGFwZVszXSA6ICR4LnNoYXBlWzFdO1xuICAgIHV0aWwuYXNzZXJ0KGlucHV0SGVpZ2h0ICogYmxvY2tTaXplID49IDAsICgpID0+IGBOZWdhdGl2ZSBkaW1lbnNpb24gc2l6ZSBjYXVzZWQgYnkgb3ZlcmZsb3cgd2hlbiBtdWx0aXBseWluZ1xuICAgICR7aW5wdXRIZWlnaHR9IGFuZCAke2Jsb2NrU2l6ZX0gIGZvciBkZXB0aFRvU3BhY2Ugd2l0aCBpbnB1dCBzaGFwZVxuICAgICR7JHguc2hhcGV9YCk7XG4gICAgdXRpbC5hc3NlcnQoaW5wdXRXaWR0aCAqIGJsb2NrU2l6ZSA+PSAwLCAoKSA9PiBgTmVnYXRpdmUgZGltZW5zaW9uIHNpemUgY2F1c2VkIGJ5IG92ZXJmbG93IHdoZW4gbXVsdGlwbHlpbmdcbiAgICAke2lucHV0V2lkdGh9IGFuZCAke2Jsb2NrU2l6ZX0gZm9yIGRlcHRoVG9TcGFjZSB3aXRoIGlucHV0IHNoYXBlXG4gICAgICAgICR7JHguc2hhcGV9YCk7XG4gICAgdXRpbC5hc3NlcnQoKGlucHV0RGVwdGggJSAoYmxvY2tTaXplICogYmxvY2tTaXplKSA9PT0gMCksICgpID0+IGBEaW1lbnNpb24gc2l6ZSBtdXN0IGJlIGV2ZW5seSBkaXZpc2libGUgYnkgJHtibG9ja1NpemUgKiBibG9ja1NpemV9IGJ1dCBpcyAke2lucHV0RGVwdGh9IGZvciBkZXB0aFRvU3BhY2Ugd2l0aCBpbnB1dCBzaGFwZSAkeyR4LnNoYXBlfWApO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICBjb25zdCBhdHRycyA9IHsgYmxvY2tTaXplLCBkYXRhRm9ybWF0IH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoRGVwdGhUb1NwYWNlLCBpbnB1dHMsIGF0dHJzKTtcbn1cbmV4cG9ydCBjb25zdCBkZXB0aFRvU3BhY2UgPSBvcCh7IGRlcHRoVG9TcGFjZV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZXB0aF90b19zcGFjZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgRGVwdGh3aXNlQ29udjJkTmF0aXZlIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9yZXNoYXBlJztcbi8qKlxuICogRGVwdGh3aXNlIDJEIGNvbnZvbHV0aW9uLlxuICpcbiAqIEdpdmVuIGEgNEQgYGlucHV0YCBhcnJheSBhbmQgYSBgZmlsdGVyYCBhcnJheSBvZiBzaGFwZVxuICogYFtmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoLCBpbkNoYW5uZWxzLCBjaGFubmVsTXVsdGlwbGllcl1gIGNvbnRhaW5pbmdcbiAqIGBpbkNoYW5uZWxzYCBjb252b2x1dGlvbmFsIGZpbHRlcnMgb2YgZGVwdGggMSwgdGhpcyBvcCBhcHBsaWVzIGFcbiAqIGRpZmZlcmVudCBmaWx0ZXIgdG8gZWFjaCBpbnB1dCBjaGFubmVsIChleHBhbmRpbmcgZnJvbSAxIGNoYW5uZWwgdG9cbiAqIGBjaGFubmVsTXVsdGlwbGllcmAgY2hhbm5lbHMgZm9yIGVhY2gpLCB0aGVuIGNvbmNhdGVuYXRlcyB0aGUgcmVzdWx0c1xuICogdG9nZXRoZXIuIFRoZSBvdXRwdXQgaGFzIGBpbkNoYW5uZWxzICogY2hhbm5lbE11bHRpcGxpZXJgIGNoYW5uZWxzLlxuICpcbiAqIFNlZVxuICogW2h0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9kZXB0aHdpc2VfY29udjJkXShcbiAqICAgICBodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvbm4vZGVwdGh3aXNlX2NvbnYyZClcbiAqIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvciwgb2YgcmFuayA0IG9yIHJhbmsgMywgb2Ygc2hhcGVcbiAqICAgICBgW2JhdGNoLCBoZWlnaHQsIHdpZHRoLCBpbkNoYW5uZWxzXWAuIElmIHJhbmsgMywgYmF0Y2ggb2YgMSBpc1xuICogYXNzdW1lZC5cbiAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlciB0ZW5zb3IsIHJhbmsgNCwgb2Ygc2hhcGVcbiAqICAgICBgW2ZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsIGluQ2hhbm5lbHMsIGNoYW5uZWxNdWx0aXBsaWVyXWAuXG4gKiBAcGFyYW0gc3RyaWRlcyBUaGUgc3RyaWRlcyBvZiB0aGUgY29udm9sdXRpb246IGBbc3RyaWRlSGVpZ2h0LFxuICogc3RyaWRlV2lkdGhdYC4gSWYgc3RyaWRlcyBpcyBhIHNpbmdsZSBudW1iZXIsIHRoZW4gYHN0cmlkZUhlaWdodCA9PVxuICogc3RyaWRlV2lkdGhgLlxuICogQHBhcmFtIHBhZCBUaGUgdHlwZSBvZiBwYWRkaW5nIGFsZ29yaXRobS5cbiAqICAgLSBgc2FtZWAgYW5kIHN0cmlkZSAxOiBvdXRwdXQgd2lsbCBiZSBvZiBzYW1lIHNpemUgYXMgaW5wdXQsXG4gKiAgICAgICByZWdhcmRsZXNzIG9mIGZpbHRlciBzaXplLlxuICogICAtIGB2YWxpZGA6IG91dHB1dCB3aWxsIGJlIHNtYWxsZXIgdGhhbiBpbnB1dCBpZiBmaWx0ZXIgaXMgbGFyZ2VyXG4gKiAgICAgICB0aGFuIDF4MS5cbiAqICAgLSBGb3IgbW9yZSBpbmZvLCBzZWUgdGhpcyBndWlkZTpcbiAqICAgICBbaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uXShcbiAqICAgICAgICAgIGh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9jb252b2x1dGlvbilcbiAqIEBwYXJhbSBkaWxhdGlvbnMgVGhlIGRpbGF0aW9uIHJhdGVzOiBgW2RpbGF0aW9uSGVpZ2h0LCBkaWxhdGlvbldpZHRoXWBcbiAqICAgICBpbiB3aGljaCB3ZSBzYW1wbGUgaW5wdXQgdmFsdWVzIGFjcm9zcyB0aGUgaGVpZ2h0IGFuZCB3aWR0aCBkaW1lbnNpb25zXG4gKiAgICAgaW4gYXRyb3VzIGNvbnZvbHV0aW9uLiBEZWZhdWx0cyB0byBgWzEsIDFdYC4gSWYgYHJhdGVgIGlzIGEgc2luZ2xlXG4gKiAgICAgbnVtYmVyLCB0aGVuIGBkaWxhdGlvbkhlaWdodCA9PSBkaWxhdGlvbldpZHRoYC4gSWYgaXQgaXMgZ3JlYXRlciB0aGFuXG4gKiAgICAgMSwgdGhlbiBhbGwgdmFsdWVzIG9mIGBzdHJpZGVzYCBtdXN0IGJlIDEuXG4gKiBAcGFyYW0gZGF0YUZvcm1hdDogQW4gb3B0aW9uYWwgc3RyaW5nIGZyb206IFwiTkhXQ1wiLCBcIk5DSFdcIi4gRGVmYXVsdHMgdG9cbiAqICAgICBcIk5IV0NcIi4gU3BlY2lmeSB0aGUgZGF0YSBmb3JtYXQgb2YgdGhlIGlucHV0IGFuZCBvdXRwdXQgZGF0YS4gV2l0aCB0aGVcbiAqICAgICBkZWZhdWx0IGZvcm1hdCBcIk5IV0NcIiwgdGhlIGRhdGEgaXMgc3RvcmVkIGluIHRoZSBvcmRlciBvZjogW2JhdGNoLFxuICogICAgIGhlaWdodCwgd2lkdGgsIGNoYW5uZWxzXS4gT25seSBcIk5IV0NcIiBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLlxuICogQHBhcmFtIGRpbVJvdW5kaW5nTW9kZSBBIHN0cmluZyBmcm9tOiAnY2VpbCcsICdyb3VuZCcsICdmbG9vcicuIElmIG5vbmUgaXNcbiAqICAgICBwcm92aWRlZCwgaXQgd2lsbCBkZWZhdWx0IHRvIHRydW5jYXRlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0NvbnZvbHV0aW9uJ31cbiAqL1xuZnVuY3Rpb24gZGVwdGh3aXNlQ29udjJkXyh4LCBmaWx0ZXIsIHN0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdCA9ICdOSFdDJywgZGlsYXRpb25zID0gWzEsIDFdLCBkaW1Sb3VuZGluZ01vZGUpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdkZXB0aHdpc2VDb252MmQnKTtcbiAgICBjb25zdCAkZmlsdGVyID0gY29udmVydFRvVGVuc29yKGZpbHRlciwgJ2ZpbHRlcicsICdkZXB0aHdpc2VDb252MmQnKTtcbiAgICBsZXQgeDREID0gJHg7XG4gICAgbGV0IHJlc2hhcGVkVG80RCA9IGZhbHNlO1xuICAgIGlmICgkeC5yYW5rID09PSAzKSB7XG4gICAgICAgIHJlc2hhcGVkVG80RCA9IHRydWU7XG4gICAgICAgIHg0RCA9IHJlc2hhcGUoJHgsIFsxLCAkeC5zaGFwZVswXSwgJHguc2hhcGVbMV0sICR4LnNoYXBlWzJdXSk7XG4gICAgfVxuICAgIHV0aWwuYXNzZXJ0KHg0RC5yYW5rID09PSA0LCAoKSA9PiBgRXJyb3IgaW4gZGVwdGh3aXNlQ29udjJkOiBpbnB1dCBtdXN0IGJlIHJhbmsgNCwgYnV0IGdvdCBgICtcbiAgICAgICAgYHJhbmsgJHt4NEQucmFua30uYCk7XG4gICAgdXRpbC5hc3NlcnQoJGZpbHRlci5yYW5rID09PSA0LCAoKSA9PiBgRXJyb3IgaW4gZGVwdGh3aXNlQ29udjJkOiBmaWx0ZXIgbXVzdCBiZSByYW5rIDQsIGJ1dCBnb3QgcmFuayBgICtcbiAgICAgICAgYCR7JGZpbHRlci5yYW5rfS5gKTtcbiAgICB1dGlsLmFzc2VydCh4NEQuc2hhcGVbM10gPT09ICRmaWx0ZXIuc2hhcGVbMl0sICgpID0+IGBFcnJvciBpbiBkZXB0aHdpc2VDb252MmQ6IG51bWJlciBvZiBpbnB1dCBjaGFubmVscyBgICtcbiAgICAgICAgYCgke3g0RC5zaGFwZVszXX0pIG11c3QgbWF0Y2ggdGhlIGluQ2hhbm5lbHMgZGltZW5zaW9uIGluIGAgK1xuICAgICAgICBgZmlsdGVyICR7JGZpbHRlci5zaGFwZVsyXX0uYCk7XG4gICAgaWYgKGRpbVJvdW5kaW5nTW9kZSAhPSBudWxsKSB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KHV0aWwuaXNJbnQocGFkKSwgKCkgPT4gYEVycm9yIGluIGRlcHRod2lzZUNvbnYyZDogcGFkIG11c3QgYmUgYW4gaW50ZWdlciB3aGVuIHVzaW5nLCBgICtcbiAgICAgICAgICAgIGBkaW1Sb3VuZGluZ01vZGUgJHtkaW1Sb3VuZGluZ01vZGV9IGJ1dCBnb3QgcGFkICR7cGFkfS5gKTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiB4NEQsIGZpbHRlcjogJGZpbHRlciB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBzdHJpZGVzLCBwYWQsIGRhdGFGb3JtYXQsIGRpbGF0aW9ucywgZGltUm91bmRpbmdNb2RlIH07XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICAgIGNvbnN0IHJlcyA9IEVOR0lORS5ydW5LZXJuZWwoRGVwdGh3aXNlQ29udjJkTmF0aXZlLCBpbnB1dHMsIGF0dHJzKTtcbiAgICBpZiAocmVzaGFwZWRUbzREKSB7XG4gICAgICAgIHJldHVybiByZXNoYXBlKHJlcywgW3Jlcy5zaGFwZVsxXSwgcmVzLnNoYXBlWzJdLCByZXMuc2hhcGVbM11dKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydCBjb25zdCBkZXB0aHdpc2VDb252MmQgPSBvcCh7IGRlcHRod2lzZUNvbnYyZF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZXB0aHdpc2VfY29udjJkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlciB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL3Jlc2hhcGUnO1xuZnVuY3Rpb24gZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXJfKHgsIGR5LCBmaWx0ZXJTaGFwZSwgc3RyaWRlcywgcGFkLCBkaWxhdGlvbnMgPSBbMSwgMV0sIGRpbVJvdW5kaW5nTW9kZSkge1xuICAgIGxldCB4NEQgPSB4O1xuICAgIGlmICh4LnJhbmsgPT09IDMpIHtcbiAgICAgICAgeDREID0gcmVzaGFwZSh4LCBbMSwgeC5zaGFwZVswXSwgeC5zaGFwZVsxXSwgeC5zaGFwZVsyXV0pO1xuICAgIH1cbiAgICBsZXQgZHk0RCA9IGR5O1xuICAgIGlmIChkeTRELnJhbmsgPT09IDMpIHtcbiAgICAgICAgZHk0RCA9IHJlc2hhcGUoZHksIFsxLCBkeS5zaGFwZVswXSwgZHkuc2hhcGVbMV0sIGR5LnNoYXBlWzJdXSk7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogeDRELCBkeTogZHk0RCB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBzdHJpZGVzLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSwgZGlsYXRpb25zLCBmaWx0ZXJTaGFwZSB9O1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlciwgaW5wdXRzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3QgZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXIgPSBvcCh7IGRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRlcHRod2lzZV9jb252MmRfbmF0aXZlX2JhY2twcm9wX2ZpbHRlci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dCB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL3Jlc2hhcGUnO1xuZnVuY3Rpb24gZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dF8oeFNoYXBlLCBkeSwgZmlsdGVyLCBzdHJpZGVzLCBwYWQsIGRpbGF0aW9ucyA9IFsxLCAxXSwgZGltUm91bmRpbmdNb2RlKSB7XG4gICAgbGV0IGR5NEQgPSBkeTtcbiAgICBsZXQgcmVzaGFwZWRUbzREID0gZmFsc2U7XG4gICAgaWYgKGR5LnJhbmsgPT09IDMpIHtcbiAgICAgICAgcmVzaGFwZWRUbzREID0gdHJ1ZTtcbiAgICAgICAgZHk0RCA9IHJlc2hhcGUoZHksIFsxLCBkeS5zaGFwZVswXSwgZHkuc2hhcGVbMV0sIGR5LnNoYXBlWzJdXSk7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0cyA9IHsgZHk6IGR5NEQsIGZpbHRlciB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBzdHJpZGVzLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSwgZGlsYXRpb25zLCBpbnB1dFNoYXBlOiB4U2hhcGUgfTtcbiAgICBjb25zdCByZXMgPSBcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgRU5HSU5FLnJ1bktlcm5lbChEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0LCBpbnB1dHMsIGF0dHJzKTtcbiAgICBpZiAocmVzaGFwZWRUbzREKSB7XG4gICAgICAgIHJldHVybiByZXNoYXBlKHJlcywgW3Jlcy5zaGFwZVsxXSwgcmVzLnNoYXBlWzJdLCByZXMuc2hhcGVbM11dKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydCBjb25zdCBkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0ID0gb3AoeyBkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0XyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRlcHRod2lzZV9jb252MmRfbmF0aXZlX2JhY2twcm9wX2lucHV0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBEaWFnIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogUmV0dXJucyBhIGRpYWdvbmFsIHRlbnNvciB3aXRoIGEgZ2l2ZW4gZGlhZ29uYWwgdmFsdWVzLlxuICpcbiAqIEdpdmVuIGEgZGlhZ29uYWwsIHRoaXMgb3BlcmF0aW9uIHJldHVybnMgYSB0ZW5zb3Igd2l0aCB0aGUgZGlhZ29uYWwgYW5kXG4gKiBldmVyeXRoaW5nIGVsc2UgcGFkZGVkIHdpdGggemVyb3MuXG4gKlxuICogQXNzdW1lIHRoZSBpbnB1dCBoYXMgZGltZW5zaW9ucyBgW0QxLC4uLiwgRGtdYCwgdGhlbiB0aGUgb3V0cHV0IGlzIGEgdGVuc29yXG4gKiBvZiByYW5rIDJrIHdpdGggZGltZW5zaW9ucyBgW0QxLC4uLiwgRGssIEQxLC4uLiwgRGtdYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIDMsIDRdKTtcbiAqXG4gKiB0Zi5kaWFnKHgpLnByaW50KClcbiAqIGBgYFxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMSwgMiwgMywgNCwgNSwgNiwgNiwgOF0sIFs0LCAyXSlcbiAqXG4gKiB0Zi5kaWFnKHgpLnByaW50KClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDcmVhdGlvbid9XG4gKi9cbmZ1bmN0aW9uIGRpYWdfKHgpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdkaWFnJyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKERpYWcsIGlucHV0cyk7XG59XG5leHBvcnQgY29uc3QgZGlhZyA9IG9wKHsgZGlhZ18gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kaWFnLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBEaWxhdGlvbjJEIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9yZXNoYXBlJztcbi8qKlxuICogQ29tcHV0ZXMgdGhlIGdyYXlzY2FsZSBkaWxhdGlvbiBvdmVyIHRoZSBpbnB1dCBgeGAuXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvciwgcmFuayAzIG9yIHJhbmsgNCBvZiBzaGFwZVxuICogICAgIGBbYmF0Y2gsIGhlaWdodCwgd2lkdGgsIGluQ2hhbm5lbHNdYC4gSWYgcmFuayAzLCBiYXRjaCBvZiAxIGlzIGFzc3VtZWQuXG4gKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIgdGVuc29yLCByYW5rIDMsIG9mIHNoYXBlXG4gKiAgICAgYFtmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoLCBkZXB0aF1gLlxuICogQHBhcmFtIHN0cmlkZXMgVGhlIHN0cmlkZXMgb2YgdGhlIHNsaWRpbmcgd2luZG93IGZvciBlYWNoIGRpbWVuc2lvbiBvZiB0aGVcbiAqICAgICBpbnB1dCB0ZW5zb3I6IGBbc3RyaWRlSGVpZ2h0LCBzdHJpZGVXaWR0aF1gLlxuICogICAgIElmIGBzdHJpZGVzYCBpcyBhIHNpbmdsZSBudW1iZXIsXG4gKiAgICAgdGhlbiBgc3RyaWRlSGVpZ2h0ID09IHN0cmlkZVdpZHRoYC5cbiAqIEBwYXJhbSBwYWQgVGhlIHR5cGUgb2YgcGFkZGluZyBhbGdvcml0aG0uXG4gKiAgICAtIGBzYW1lYCBhbmQgc3RyaWRlIDE6IG91dHB1dCB3aWxsIGJlIG9mIHNhbWUgc2l6ZSBhcyBpbnB1dCxcbiAqICAgICAgIHJlZ2FyZGxlc3Mgb2YgZmlsdGVyIHNpemUuXG4gKiAgICAtIGB2YWxpZGA6IG91dHB1dCB3aWxsIGJlIHNtYWxsZXIgdGhhbiBpbnB1dCBpZiBmaWx0ZXIgaXMgbGFyZ2VyXG4gKiAgICAgICB0aGFuIDEqMXgxLlxuICogICAgLSBGb3IgbW9yZSBpbmZvLCBzZWUgdGhpcyBndWlkZTpcbiAqICAgICBbaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uXShcbiAqICAgICAgICAgIGh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9jb252b2x1dGlvbilcbiAqIEBwYXJhbSBkYXRhRm9ybWF0IFNwZWNpZnkgdGhlIGRhdGEgZm9ybWF0IG9mIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGRhdGEuXG4gKiAgICAgIERlZmF1bHRzIHRvICdOSFdDJy4gT25seSAnTkhXQycgaXMgY3VycmVudGx5IHN1cHBvcnRlZC4gV2l0aCB0aGVcbiAqICAgICAgZGVmYXVsdCBmb3JtYXQgXCJOSFdDXCIsIHRoZSBkYXRhIGlzIHN0b3JlZCBpbiB0aGUgb3JkZXIgb2Y6IFtiYXRjaCxcbiAqICAgICAgaGVpZ2h0LCB3aWR0aCwgY2hhbm5lbHNdLlxuICogQHBhcmFtIGRpbGF0aW9ucyBUaGUgZGlsYXRpb24gcmF0ZXM6IGBbZGlsYXRpb25IZWlnaHQsIGRpbGF0aW9uV2lkdGhdYFxuICogICAgIGluIHdoaWNoIHdlIHNhbXBsZSBpbnB1dCB2YWx1ZXMgYWNyb3NzIHRoZSBoZWlnaHQgYW5kIHdpZHRoIGRpbWVuc2lvbnNcbiAqICAgICBmb3IgYXRyb3VzIG1vcnBob2xvZ2ljYWwgZGlsYXRpb24uIERlZmF1bHRzIHRvIGBbMSwgMV1gLiBJZiBgZGlsYXRpb25zYFxuICogICAgIGlzIGEgc2luZ2xlIG51bWJlciwgdGhlbiBgZGlsYXRpb25IZWlnaHQgPT0gZGlsYXRpb25XaWR0aGAuIElmIGl0IGlzXG4gKiAgICAgZ3JlYXRlciB0aGFuIDEsIHRoZW4gYWxsIHZhbHVlcyBvZiBgc3RyaWRlc2AgbXVzdCBiZSAxLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0NvbnZvbHV0aW9uJ31cbiAqL1xuZnVuY3Rpb24gZGlsYXRpb24yZF8oeCwgZmlsdGVyLCBzdHJpZGVzLCBwYWQsIGRpbGF0aW9ucyA9IFsxLCAxXSwgZGF0YUZvcm1hdCA9ICdOSFdDJykge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2RpbGF0aW9uMmQnKTtcbiAgICBjb25zdCAkZmlsdGVyID0gY29udmVydFRvVGVuc29yKGZpbHRlciwgJ2ZpbHRlcicsICdkaWxhdGlvbjJkJyk7XG4gICAgdXRpbC5hc3NlcnQoJHgucmFuayA9PT0gMyB8fCAkeC5yYW5rID09PSA0LCAoKSA9PiBgRXJyb3IgaW4gZGlsYXRpb24yZDogaW5wdXQgbXVzdCBiZSByYW5rIDMgb3IgNCwgYnV0IGdvdCByYW5rIGAgK1xuICAgICAgICBgJHskeC5yYW5rfS5gKTtcbiAgICB1dGlsLmFzc2VydCgkZmlsdGVyLnJhbmsgPT09IDMsICgpID0+IGBFcnJvciBpbiBkaWxhdGlvbjJkOiBmaWx0ZXIgbXVzdCBiZSByYW5rIDMsIGJ1dCBnb3QgcmFuayBgICtcbiAgICAgICAgYCR7JGZpbHRlci5yYW5rfS5gKTtcbiAgICB1dGlsLmFzc2VydChkYXRhRm9ybWF0ID09PSAnTkhXQycsICgpID0+IGBFcnJvciBpbiBkaWxhdGlvbjJkOiBPbmx5IE5IV0MgaXMgY3VycmVudGx5IHN1cHBvcnRlZCwgYCArXG4gICAgICAgIGBidXQgZ290IGRhdGFGb3JtYXQgb2YgJHtkYXRhRm9ybWF0fWApO1xuICAgIGxldCB4NEQgPSAkeDtcbiAgICBsZXQgcmVzaGFwZWRUbzREID0gZmFsc2U7XG4gICAgaWYgKCR4LnJhbmsgPT09IDMpIHtcbiAgICAgICAgeDREID0gcmVzaGFwZSgkeCwgWzEsICR4LnNoYXBlWzBdLCAkeC5zaGFwZVsxXSwgJHguc2hhcGVbMl1dKTtcbiAgICAgICAgcmVzaGFwZWRUbzREID0gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiB4NEQsIGZpbHRlcjogJGZpbHRlciB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBzdHJpZGVzLCBwYWQsIGRpbGF0aW9ucyB9O1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgICBjb25zdCByZXMgPSBFTkdJTkUucnVuS2VybmVsKERpbGF0aW9uMkQsIGlucHV0cywgYXR0cnMpO1xuICAgIGlmIChyZXNoYXBlZFRvNEQpIHtcbiAgICAgICAgcmV0dXJuIHJlc2hhcGUocmVzLCBbcmVzLnNoYXBlWzFdLCByZXMuc2hhcGVbMl0sIHJlcy5zaGFwZVszXV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufVxuZXhwb3J0IGNvbnN0IGRpbGF0aW9uMmQgPSBvcCh7IGRpbGF0aW9uMmRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGlsYXRpb24yZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgUmVhbERpdiB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBtYWtlVHlwZXNNYXRjaCB9IGZyb20gJy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBmbG9vckRpdiB9IGZyb20gJy4vZmxvb3JEaXYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIERpdmlkZXMgdHdvIGB0Zi5UZW5zb3JgcyBlbGVtZW50LXdpc2UsIEEgLyBCLiBTdXBwb3J0cyBicm9hZGNhc3RpbmcuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgNCwgOSwgMTZdKTtcbiAqIGNvbnN0IGIgPSB0Zi50ZW5zb3IxZChbMSwgMiwgMywgNF0pO1xuICpcbiAqIGEuZGl2KGIpLnByaW50KCk7ICAvLyBvciB0Zi5kaXYoYSwgYilcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiAvLyBCcm9hZGNhc3QgZGl2IGEgd2l0aCBiLlxuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsyLCA0LCA2LCA4XSk7XG4gKiBjb25zdCBiID0gdGYuc2NhbGFyKDIpO1xuICpcbiAqIGEuZGl2KGIpLnByaW50KCk7ICAvLyBvciB0Zi5kaXYoYSwgYilcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCB0ZW5zb3IgYXMgdGhlIG51bWVyYXRvci5cbiAqIEBwYXJhbSBiIFRoZSBzZWNvbmQgdGVuc29yIGFzIHRoZSBkZW5vbWluYXRvci4gTXVzdCBoYXZlIHRoZSBzYW1lIGR0eXBlIGFzXG4gKiBgYWAuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQXJpdGhtZXRpYyd9XG4gKi9cbmZ1bmN0aW9uIGRpdl8oYSwgYikge1xuICAgIGxldCAkYSA9IGNvbnZlcnRUb1RlbnNvcihhLCAnYScsICdkaXYnKTtcbiAgICBsZXQgJGIgPSBjb252ZXJ0VG9UZW5zb3IoYiwgJ2InLCAnZGl2Jyk7XG4gICAgWyRhLCAkYl0gPSBtYWtlVHlwZXNNYXRjaCgkYSwgJGIpO1xuICAgIGlmICgkYS5kdHlwZSA9PT0gJ2ludDMyJyAmJiAkYi5kdHlwZSA9PT0gJ2ludDMyJykge1xuICAgICAgICByZXR1cm4gZmxvb3JEaXYoJGEsICRiKTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRzID0geyBhOiAkYSwgYjogJGIgfTtcbiAgICBjb25zdCBhdHRycyA9IHt9O1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChSZWFsRGl2LCBpbnB1dHMsIGF0dHJzKTtcbn1cbmV4cG9ydCBjb25zdCBkaXYgPSBvcCh7IGRpdl8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kaXYuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgbWFrZVR5cGVzTWF0Y2ggfSBmcm9tICcuLi90ZW5zb3JfdXRpbCc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgZGl2IH0gZnJvbSAnLi9kaXYnO1xuaW1wb3J0IHsgZXF1YWwgfSBmcm9tICcuL2VxdWFsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgd2hlcmUgfSBmcm9tICcuL3doZXJlJztcbmltcG9ydCB7IHplcm9zTGlrZSB9IGZyb20gJy4vemVyb3NfbGlrZSc7XG4vKipcbiAqIERpdmlkZXMgdHdvIGB0Zi5UZW5zb3JgcyBlbGVtZW50LXdpc2UsIEEgLyBCLiBTdXBwb3J0cyBicm9hZGNhc3RpbmcuIFJldHVybiAwXG4gKiBpZiBkZW5vbWluYXRvciBpcyAwLlxuICpcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsxLCA0LCA5LCAxNl0pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzLCA0XSk7XG4gKiBjb25zdCBjID0gdGYudGVuc29yMWQoWzAsIDAsIDAsIDBdKTtcbiAqXG4gKiBhLmRpdk5vTmFuKGIpLnByaW50KCk7ICAvLyBvciB0Zi5kaXZOb05hbihhLCBiKVxuICogYS5kaXZOb05hbihjKS5wcmludCgpOyAgLy8gb3IgdGYuZGl2Tm9OYW4oYSwgYylcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiAvLyBCcm9hZGNhc3QgZGl2IGEgd2l0aCBiLlxuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsyLCA0LCA2LCA4XSk7XG4gKiBjb25zdCBiID0gdGYuc2NhbGFyKDIpO1xuICogY29uc3QgYyA9IHRmLnNjYWxhcigwKTtcbiAqXG4gKiBhLmRpdk5vTmFuKGIpLnByaW50KCk7ICAvLyBvciB0Zi5kaXZOb05hbihhLCBiKVxuICogYS5kaXZOb05hbihjKS5wcmludCgpOyAgLy8gb3IgdGYuZGl2Tm9OYW4oYSwgYylcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCB0ZW5zb3IgYXMgdGhlIG51bWVyYXRvci5cbiAqIEBwYXJhbSBiIFRoZSBzZWNvbmQgdGVuc29yIGFzIHRoZSBkZW5vbWluYXRvci4gTXVzdCBoYXZlIHRoZSBzYW1lIGR0eXBlIGFzXG4gKiBgYWAuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQXJpdGhtZXRpYyd9XG4gKi9cbmZ1bmN0aW9uIGRpdk5vTmFuXyhhLCBiKSB7XG4gICAgLy8gVE9ETzogTWFrZSB0aGlzIGludG8gaXRzIG93biBrZXJuZWwuXG4gICAgbGV0ICRhID0gY29udmVydFRvVGVuc29yKGEsICdhJywgJ2RpdicpO1xuICAgIGxldCAkYiA9IGNvbnZlcnRUb1RlbnNvcihiLCAnYicsICdkaXYnKTtcbiAgICBbJGEsICRiXSA9IG1ha2VUeXBlc01hdGNoKCRhLCAkYik7XG4gICAgY29uc3QgZGl2UmVzdWx0ID0gZGl2KCRhLCAkYik7XG4gICAgY29uc3QgemVyb3MgPSB6ZXJvc0xpa2UoZGl2UmVzdWx0KTtcbiAgICBjb25zdCBiRXF1YWxzWmVybyA9IGVxdWFsKCRiLCB6ZXJvcyk7XG4gICAgcmV0dXJuIHdoZXJlKGJFcXVhbHNaZXJvLCB6ZXJvcywgZGl2UmVzdWx0KTtcbn1cbmV4cG9ydCBjb25zdCBkaXZOb05hbiA9IG9wKHsgZGl2Tm9OYW5fIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGl2X25vX25hbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IG1hdE11bCB9IGZyb20gJy4vbWF0X211bCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL3Jlc2hhcGUnO1xuLyoqXG4gKiBDb21wdXRlcyB0aGUgZG90IHByb2R1Y3Qgb2YgdHdvIG1hdHJpY2VzIGFuZC9vciB2ZWN0b3JzLCBgdDFgIGFuZCBgdDJgLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzEsIDJdKTtcbiAqIGNvbnN0IGIgPSB0Zi50ZW5zb3IyZChbWzEsIDJdLCBbMywgNF1dKTtcbiAqIGNvbnN0IGMgPSB0Zi50ZW5zb3IyZChbWzEsIDIsIDNdLCBbNCwgNSwgNl1dKTtcbiAqXG4gKiBhLmRvdChiKS5wcmludCgpOyAgLy8gb3IgdGYuZG90KGEsIGIpXG4gKiBiLmRvdChhKS5wcmludCgpO1xuICogYi5kb3QoYykucHJpbnQoKTtcbiAqIGBgYFxuICogQHBhcmFtIHQxIFRoZSBmaXJzdCB0ZW5zb3IgaW4gdGhlIGRvdCBvcGVyYXRpb24uXG4gKiBAcGFyYW0gdDIgVGhlIHNlY29uZCB0ZW5zb3IgaW4gdGhlIGRvdCBvcGVyYXRpb24uXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnTWF0cmljZXMnfVxuICovXG5mdW5jdGlvbiBkb3RfKHQxLCB0Mikge1xuICAgIGNvbnN0ICR0MSA9IGNvbnZlcnRUb1RlbnNvcih0MSwgJ3QxJywgJ2RvdCcpO1xuICAgIGNvbnN0ICR0MiA9IGNvbnZlcnRUb1RlbnNvcih0MiwgJ3QyJywgJ2RvdCcpO1xuICAgIHV0aWwuYXNzZXJ0KCgkdDEucmFuayA9PT0gMSB8fCAkdDEucmFuayA9PT0gMikgJiYgKCR0Mi5yYW5rID09PSAxIHx8ICR0Mi5yYW5rID09PSAyKSwgKCkgPT4gYEVycm9yIGluIGRvdDogaW5wdXRzIG11c3QgYWxsIGJlIHJhbmsgMSBvciAyLCBidXQgZ290IHJhbmtzIGAgK1xuICAgICAgICBgJHskdDEucmFua30gYW5kICR7JHQyLnJhbmt9LmApO1xuICAgIGNvbnN0IHQxSW5uZXIgPSAoJHQxLnJhbmsgPT09IDEgPyAkdDEuc2l6ZSA6ICR0MS5zaGFwZVsxXSk7XG4gICAgY29uc3QgdDJJbm5lciA9ICgkdDIucmFuayA9PT0gMSA/ICR0Mi5zaXplIDogJHQyLnNoYXBlWzBdKTtcbiAgICB1dGlsLmFzc2VydCh0MUlubmVyID09PSB0MklubmVyLCAoKSA9PiBgRXJyb3IgaW4gZG90OiBpbm5lciBkaW1lbnNpb25zIG9mIGlucHV0cyBtdXN0IG1hdGNoLCBidXQgZ290IGAgK1xuICAgICAgICBgJHt0MUlubmVyfSBhbmQgJHt0MklubmVyfS5gKTtcbiAgICBpZiAoJHQxLnJhbmsgPT09IDEgJiYgJHQyLnJhbmsgPT09IDEpIHtcbiAgICAgICAgY29uc3QgdDEyRCA9IHJlc2hhcGUoJHQxLCBbMSwgLTFdKTtcbiAgICAgICAgY29uc3QgdDIyRCA9IHJlc2hhcGUoJHQyLCBbLTEsIDFdKTtcbiAgICAgICAgY29uc3QgdDF0MiA9IG1hdE11bCh0MTJELCB0MjJEKTtcbiAgICAgICAgcmV0dXJuIHJlc2hhcGUodDF0MiwgW10pO1xuICAgIH1cbiAgICBlbHNlIGlmICgkdDEucmFuayA9PT0gMSAmJiAkdDIucmFuayA9PT0gMikge1xuICAgICAgICBjb25zdCB0MTJEID0gcmVzaGFwZSgkdDEsIFsxLCAtMV0pO1xuICAgICAgICBjb25zdCB0MjJEID0gcmVzaGFwZSgkdDIsIFskdDIuc2hhcGVbMF0sICR0Mi5zaGFwZVsxXV0pO1xuICAgICAgICBjb25zdCB0MXQyID0gbWF0TXVsKHQxMkQsIHQyMkQpO1xuICAgICAgICByZXR1cm4gcmVzaGFwZSh0MXQyLCBbdDF0Mi5zaXplXSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKCR0MS5yYW5rID09PSAyICYmICR0Mi5yYW5rID09PSAxKSB7XG4gICAgICAgIGNvbnN0IHQyMkQgPSByZXNoYXBlKCR0MiwgWy0xLCAxXSk7XG4gICAgICAgIGNvbnN0IHQxdDIgPSBtYXRNdWwoJHQxLCB0MjJEKTtcbiAgICAgICAgcmV0dXJuIHJlc2hhcGUodDF0MiwgW3QxdDIuc2l6ZV0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgdDIyRCA9IHJlc2hhcGUoJHQyLCBbJHQyLnNoYXBlWzBdLCAkdDIuc2hhcGVbMV1dKTtcbiAgICAgICAgY29uc3QgdDF0MiA9IG1hdE11bCgkdDEsIHQyMkQpO1xuICAgICAgICByZXR1cm4gdDF0MjtcbiAgICB9XG59XG5leHBvcnQgY29uc3QgZG90ID0gb3AoeyBkb3RfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZG90LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IFRlbnNvciB9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IGFkZCB9IGZyb20gJy4vYWRkJztcbmltcG9ydCB7IGRpdiB9IGZyb20gJy4vZGl2JztcbmltcG9ydCB7IGdldE5vaXNlU2hhcGUgfSBmcm9tICcuL2Ryb3BvdXRfdXRpbCc7XG5pbXBvcnQgeyBmbG9vciB9IGZyb20gJy4vZmxvb3InO1xuaW1wb3J0IHsgbXVsIH0gZnJvbSAnLi9tdWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyByYW5kb21Vbmlmb3JtIH0gZnJvbSAnLi9yYW5kb21fdW5pZm9ybSc7XG4vKipcbiAqIENvbXB1dGVzIGRyb3BvdXQuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMSwgMiwgMiwgMV0pO1xuICogY29uc3QgcmF0ZSA9IDAuNzU7XG4gKiBjb25zdCBvdXRwdXQgPSB0Zi5kcm9wb3V0KHgsIHJhdGUpO1xuICogb3V0cHV0LnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBBIGZsb2F0aW5nIHBvaW50IFRlbnNvciBvciBUZW5zb3JMaWtlLlxuICogQHBhcmFtIHJhdGUgQSBmbG9hdCBpbiB0aGUgcmFuZ2UgWzAsIDEpLiBUaGUgcHJvYmFiaWxpdHkgdGhhdCBlYWNoIGVsZW1lbnRcbiAqICAgb2YgeCBpcyBkaXNjYXJkZWQuXG4gKiBAcGFyYW0gbm9pc2VTaGFwZSBBbiBhcnJheSBvZiBudW1iZXJzIG9mIHR5cGUgaW50MzIsIHJlcHJlc2VudGluZyB0aGVcbiAqIHNoYXBlIGZvciByYW5kb21seSBnZW5lcmF0ZWQga2VlcC9kcm9wIGZsYWdzLiBJZiB0aGUgbm9pc2VTaGFwZSBoYXMgbnVsbFxuICogdmFsdWUsIGl0IHdpbGwgYmUgYXV0b21hdGljYWxseSByZXBsYWNlZCB3aXRoIHRoZSB4J3MgcmVsYXRpdmUgZGltZW5zaW9uXG4gKiBzaXplLiBPcHRpb25hbC5cbiAqIEBwYXJhbSBzZWVkIFVzZWQgdG8gY3JlYXRlIHJhbmRvbSBzZWVkcy4gT3B0aW9uYWwuXG4gKiBAcmV0dXJucyBBIFRlbnNvciBvZiB0aGUgc2FtZSBzaGFwZSBvZiB4LlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Ryb3BvdXQnfVxuICovXG5mdW5jdGlvbiBkcm9wb3V0Xyh4LCByYXRlLCBub2lzZVNoYXBlLCBzZWVkKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnZHJvcG91dCcpO1xuICAgIHV0aWwuYXNzZXJ0KCR4LmR0eXBlID09PSAnZmxvYXQzMicsICgpID0+IGB4IGhhcyB0byBiZSBhIGZsb2F0aW5nIHBvaW50IHRlbnNvciBzaW5jZSBpdCdzIGdvaW5nIHRvIGJlIGAgK1xuICAgICAgICBgc2NhbGVkLCBidXQgZ290IGEgJHskeC5kdHlwZX0gdGVuc29yIGluc3RlYWQuYCk7XG4gICAgdXRpbC5hc3NlcnQocmF0ZSA+PSAwICYmIHJhdGUgPCAxLCAoKSA9PiBgcmF0ZSBtdXN0IGJlIGEgZmxvYXQgaW4gdGhlIHJhbmdlIFswLCAxKSwgYnV0IGdvdCAke3JhdGV9LmApO1xuICAgIGlmIChyYXRlID09PSAwKSB7XG4gICAgICAgIHJldHVybiB4IGluc3RhbmNlb2YgVGVuc29yID8gJHguY2xvbmUoKSA6ICR4O1xuICAgIH1cbiAgICBjb25zdCAkbm9pc2VTaGFwZSA9IGdldE5vaXNlU2hhcGUoJHgsIG5vaXNlU2hhcGUpO1xuICAgIGNvbnN0IGtlZXBQcm9iID0gMSAtIHJhdGU7XG4gICAgY29uc3QgbXVsdGlwbGllciA9IGRpdihmbG9vcihhZGQocmFuZG9tVW5pZm9ybSgkbm9pc2VTaGFwZSwgMCwgMSwgJ2Zsb2F0MzInLCBzZWVkKSwga2VlcFByb2IpKSwga2VlcFByb2IpO1xuICAgIHJldHVybiBtdWwoJHgsIG11bHRpcGxpZXIpO1xufVxuZXhwb3J0IGNvbnN0IGRyb3BvdXQgPSBvcCh7IGRyb3BvdXRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZHJvcG91dC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuLyoqXG4gKiBOb3JtYWxpemUgbm9pc2Ugc2hhcGUgYmFzZWQgb24gcHJvdmlkZWQgdGVuc29yIGFuZCBub2lzZSBzaGFwZS5cbiAqXG4gKiBAcGFyYW0geCBUZW5zb3IuXG4gKiBAcGFyYW0gbm9pc2VTaGFwZSBUaGUgc2hhcGUgZm9yIHRoZSByYW5kb21seSBnZW5lcmF0ZWQga2VlcC9kcm9wIGZsYWdzLCBhc1xuICogICBhbiBhcnJheSBvZiBudW1iZXJzLiBPcHRpb25hbC5cbiAqIEByZXR1cm5zIE5vcm1hbGl6ZWQgbm9pc2Ugc2hhcGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXROb2lzZVNoYXBlKHgsIG5vaXNlU2hhcGUpIHtcbiAgICBpZiAobm9pc2VTaGFwZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB4LnNoYXBlLnNsaWNlKCk7XG4gICAgfVxuICAgIGlmICh1dGlsLmFycmF5c0VxdWFsKHguc2hhcGUsIG5vaXNlU2hhcGUpKSB7XG4gICAgICAgIHJldHVybiBub2lzZVNoYXBlO1xuICAgIH1cbiAgICBpZiAoeC5zaGFwZS5sZW5ndGggPT09IG5vaXNlU2hhcGUubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IG5ld0RpbWVuc2lvbiA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHguc2hhcGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChub2lzZVNoYXBlW2ldID09IG51bGwgJiYgeC5zaGFwZVtpXSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgbmV3RGltZW5zaW9uLnB1c2goeC5zaGFwZVtpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBuZXdEaW1lbnNpb24ucHVzaChub2lzZVNoYXBlW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3RGltZW5zaW9uO1xuICAgIH1cbiAgICByZXR1cm4gbm9pc2VTaGFwZTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRyb3BvdXRfdXRpbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgRWluc3VtIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogVGVuc29yIGNvbnRyYWN0aW9uIG92ZXIgc3BlY2lmaWVkIGluZGljZXMgYW5kIG91dGVyIHByb2R1Y3QuXG4gKlxuICogYGVpbnN1bWAgYWxsb3dzIGRlZmluaW5nIFRlbnNvcnMgYnkgZGVmaW5pbmcgdGhlaXIgZWxlbWVudC13aXNlIGNvbXB1dGF0aW9uLlxuICogVGhpcyBjb21wdXRhdGlvbiBpcyBiYXNlZCBvblxuICogW0VpbnN0ZWluIHN1bW1hdGlvbl0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRWluc3RlaW5fbm90YXRpb24pLlxuICpcbiAqIFNvbWUgc3BlY2lhbCBjYXNlcyBpbmNsdWRlOlxuICpcbiAqIE1hdHJpeCBtdWx0aXBsaWNhdGlvbjpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMmQoW1sxLCAyLCAzXSwgWzQsIDUsIDZdXSk7XG4gKiBjb25zdCB5ID0gdGYudGVuc29yMmQoW1swLCAxXSwgWzIsIDNdLCBbNCwgNV1dKTtcbiAqIHgucHJpbnQoKTtcbiAqIHkucHJpbnQoKTtcbiAqIHRmLmVpbnN1bSgnaWosamstPmlrJywgeCwgeSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIERvdCBwcm9kdWN0OlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMSwgMiwgM10pO1xuICogY29uc3QgeSA9IHRmLnRlbnNvcjFkKFswLCAxLCAyXSk7XG4gKiB4LnByaW50KCk7XG4gKiB5LnByaW50KCk7XG4gKiB0Zi5laW5zdW0oJ2ksaS0+JywgeCwgeSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEJhdGNoIGRvdCBwcm9kdWN0OlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IyZChbWzEsIDIsIDNdLCBbNCwgNSwgNl1dKTtcbiAqIGNvbnN0IHkgPSB0Zi50ZW5zb3IyZChbWzAsIDEsIDJdLCBbMywgNCwgNV1dKTtcbiAqIHgucHJpbnQoKTtcbiAqIHkucHJpbnQoKTtcbiAqIHRmLmVpbnN1bSgnYmksYmktPmInLCB4LCB5KS5wcmludCgpO1xuICogYGBgXG4gKlxuICogT3V0ZXIgcHJvdWR1Y3Q6XG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLCAzLCA1XSk7XG4gKiBjb25zdCB5ID0gdGYudGVuc29yMWQoWzIsIDQsIDZdKTtcbiAqIHgucHJpbnQoKTtcbiAqIHkucHJpbnQoKTtcbiAqIHRmLmVpbnN1bSgnaSxqLT5paicsIHgsIHkpLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBNYXRyaXggdHJhbnNwb3NlOlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IyZChbWzEsIDJdLCBbMywgNF1dKTtcbiAqIHgucHJpbnQoKTtcbiAqIHRmLmVpbnN1bSgnaWotPmppJywgeCkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEJhdGNoIG1hdHJpeCB0cmFuc3Bvc2U6XG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjNkKFtbWzEsIDJdLCBbMywgNF1dLCBbWy0xLCAtMl0sIFstMywgLTRdXV0pO1xuICogeC5wcmludCgpO1xuICogdGYuZWluc3VtKCdiaWotPmJqaScsIHgpLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBMaW1pdGF0aW9uczpcbiAqXG4gKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIGVpbnN1bSBoYXMgdGhlIGZvbGxvd2luZyBsaW1pdGF0aW9uczpcbiAqXG4gKiAtIERvZXMgbm90IHN1cHBvcnQgPjIgaW5wdXQgdGVuc29ycy5cbiAqIC0gRG9lcyBub3Qgc3VwcG9ydCBkdXBsaWNhdGUgYXhlcyBmb3IgYW55IGdpdmVuIGlucHV0IHRlbnNvci4gRS5nLiwgZXF1YXRpb25cbiAqICAgJ2lpLT4nIGlzIG5vdCBzdXBwb3RlZC5cbiAqIC0gVGhlIGAuLi5gIG5vdGF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuXG4gKlxuICogQHBhcmFtIGVxdWF0aW9uIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGNvbnRyYWN0aW9uLCBpbiB0aGUgc2FtZSBmb3JtYXQgYXNcbiAqIFtudW1weS5laW5zdW1dKGh0dHBzOi8vbnVtcHkub3JnL2RvYy9zdGFibGUvcmVmZXJlbmNlL2dlbmVyYXRlZC9udW1weS5laW5zdW0uaHRtbCkuXG4gKiBAcGFyYW0gdGVuc29ycyB0aGUgaW5wdXQocykgdG8gY29udHJhY3QgKGVhY2ggb25lIGEgVGVuc29yKSwgd2hvc2Ugc2hhcGVzXG4gKiAgICAgc2hvdWxkIGJlIGNvbnNpc3RlbnQgd2l0aCBlcXVhdGlvbi5cbiAqIEByZXR1cm5zIFRoZSBvdXRwdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ01hdHJpY2VzJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVpbnN1bV8oZXF1YXRpb24sIC4uLnRlbnNvcnMpIHtcbiAgICBjb25zdCAkdGVuc29ycyA9IHRlbnNvcnMubWFwKCh0LCBpKSA9PiBjb252ZXJ0VG9UZW5zb3IodCwgYHRlbnNvcnMke2l9YCwgJ2VpbnN1bScpKTtcbiAgICBjb25zdCBhdHRycyA9IHsgZXF1YXRpb24gfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChFaW5zdW0sICR0ZW5zb3JzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3QgZWluc3VtID0gb3AoeyBlaW5zdW1fIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZWluc3VtLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBFbHUgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyBleHBvbmVudGlhbCBsaW5lYXIgZWxlbWVudC13aXNlOiBgeCA+IDAgPyBlIF4geCAtIDEgOiAwYC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFstMSwgMSwgLTMsIDJdKTtcbiAqXG4gKiB4LmVsdSgpLnByaW50KCk7ICAvLyBvciB0Zi5lbHUoeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gZWx1Xyh4KSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnZWx1Jyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEVsdSwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBlbHUgPSBvcCh7IGVsdV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1lbHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IEVxdWFsIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IG1ha2VUeXBlc01hdGNoIH0gZnJvbSAnLi4vdGVuc29yX3V0aWwnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IGFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlIH0gZnJvbSAnLi9icm9hZGNhc3RfdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogUmV0dXJucyB0aGUgdHJ1dGggdmFsdWUgb2YgKGEgPT0gYikgZWxlbWVudC13aXNlLiBTdXBwb3J0cyBicm9hZGNhc3RpbmcuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgMiwgM10pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjFkKFsyLCAyLCAyXSk7XG4gKlxuICogYS5lcXVhbChiKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGEgVGhlIGZpcnN0IGlucHV0IHRlbnNvci5cbiAqIEBwYXJhbSBiIFRoZSBzZWNvbmQgaW5wdXQgdGVuc29yLiBNdXN0IGhhdmUgdGhlIHNhbWUgZHR5cGUgYXMgYGFgLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0xvZ2ljYWwnfVxuICovXG5mdW5jdGlvbiBlcXVhbF8oYSwgYikge1xuICAgIGxldCAkYSA9IGNvbnZlcnRUb1RlbnNvcihhLCAnYScsICdlcXVhbCcsICdzdHJpbmdfb3JfbnVtZXJpYycpO1xuICAgIGxldCAkYiA9IGNvbnZlcnRUb1RlbnNvcihiLCAnYicsICdlcXVhbCcsICdzdHJpbmdfb3JfbnVtZXJpYycpO1xuICAgIFskYSwgJGJdID0gbWFrZVR5cGVzTWF0Y2goJGEsICRiKTtcbiAgICBhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSgkYS5zaGFwZSwgJGIuc2hhcGUpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgYTogJGEsIGI6ICRiIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoRXF1YWwsIGlucHV0cyk7XG59XG5leHBvcnQgY29uc3QgZXF1YWwgPSBvcCh7IGVxdWFsXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWVxdWFsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBFcmYgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBjYXN0IH0gZnJvbSAnLi9jYXN0JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyBnYXVzZSBlcnJvciBmdW5jdGlvbiBvZiB0aGUgaW5wdXQgYHRmLlRlbnNvcmAgZWxlbWVudC13aXNlOlxuICogYGVyZih4KWBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFswLCAuMSwgLS4xLCAuN10pO1xuICpcbiAqIHguZXJmKCkucHJpbnQoKTsgLy8gb3IgdGYuZXJmKHgpO1xuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiBlcmZfKHgpIHtcbiAgICBsZXQgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnZXJmJyk7XG4gICAgdXRpbC5hc3NlcnQoJHguZHR5cGUgPT09ICdpbnQzMicgfHwgJHguZHR5cGUgPT09ICdmbG9hdDMyJywgKCkgPT4gJ0lucHV0IGR0eXBlIG11c3QgYmUgYGludDMyYCBvciBgZmxvYXQzMmAuJyk7XG4gICAgaWYgKCR4LmR0eXBlID09PSAnaW50MzInKSB7XG4gICAgICAgICR4ID0gY2FzdCgkeCwgJ2Zsb2F0MzInKTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEVyZiwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBlcmYgPSBvcCh7IGVyZl8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1lcmYuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuZXhwb3J0IGNvbnN0IEVSRl9QID0gMC4zMjc1OTExO1xuZXhwb3J0IGNvbnN0IEVSRl9BMSA9IDAuMjU0ODI5NTkyO1xuZXhwb3J0IGNvbnN0IEVSRl9BMiA9IC0wLjI4NDQ5NjczNjtcbmV4cG9ydCBjb25zdCBFUkZfQTMgPSAxLjQyMTQxMzc0MTtcbmV4cG9ydCBjb25zdCBFUkZfQTQgPSAtMS40NTMxNTIwMjc7XG5leHBvcnQgY29uc3QgRVJGX0E1ID0gMS4wNjE0MDU0Mjk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1lcmZfdXRpbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgRXhwIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgZXhwb25lbnRpYWwgb2YgdGhlIGlucHV0IGB0Zi5UZW5zb3JgIGVsZW1lbnQtd2lzZS4gYGUgXiB4YFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIC0zXSk7XG4gKlxuICogeC5leHAoKS5wcmludCgpOyAgLy8gb3IgdGYuZXhwKHgpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMgbWF0aCd9XG4gKi9cbmZ1bmN0aW9uIGV4cF8oeCkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2V4cCcpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChFeHAsIGlucHV0cyk7XG59XG5leHBvcnQgY29uc3QgZXhwID0gb3AoeyBleHBfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZXhwLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBFeHBhbmREaW1zIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIFJldHVybnMgYSBgdGYuVGVuc29yYCB0aGF0IGhhcyBleHBhbmRlZCByYW5rLCBieSBpbnNlcnRpbmcgYSBkaW1lbnNpb25cbiAqIGludG8gdGhlIHRlbnNvcidzIHNoYXBlLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIDMsIDRdKTtcbiAqIGNvbnN0IGF4aXMgPSAxO1xuICogeC5leHBhbmREaW1zKGF4aXMpLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yIHdob3NlIGRpbWVuc2lvbnMgdG8gYmUgZXhwYW5kZWQuXG4gKiBAcGFyYW0gYXhpcyBUaGUgZGltZW5zaW9uIGluZGV4IGF0IHdoaWNoIHRvIGluc2VydCBzaGFwZSBvZiBgMWAuIERlZmF1bHRzXG4gKiAgICAgdG8gMCAodGhlIGZpcnN0IGRpbWVuc2lvbikuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnVHJhbnNmb3JtYXRpb25zJ31cbiAqL1xuZnVuY3Rpb24gZXhwYW5kRGltc18oeCwgYXhpcyA9IDApIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdleHBhbmREaW1zJywgJ3N0cmluZ19vcl9udW1lcmljJyk7XG4gICAgdXRpbC5hc3NlcnQoYXhpcyA8PSAkeC5yYW5rLCAoKSA9PiAnQXhpcyBtdXN0IGJlIDw9IHJhbmsgb2YgdGhlIHRlbnNvcicpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgaW5wdXQ6ICR4IH07XG4gICAgY29uc3QgYXR0cnMgPSB7IGRpbTogYXhpcyB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEV4cGFuZERpbXMsIGlucHV0cywgYXR0cnMpO1xufVxuZXhwb3J0IGNvbnN0IGV4cGFuZERpbXMgPSBvcCh7IGV4cGFuZERpbXNfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZXhwYW5kX2RpbXMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IEV4cG0xIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgZXhwb25lbnRpYWwgb2YgdGhlIGlucHV0IGB0Zi5UZW5zb3JgIG1pbnVzIG9uZSBlbGVtZW50LXdpc2UuXG4gKiBgZSBeIHggLSAxYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIC0zXSk7XG4gKlxuICogeC5leHBtMSgpLnByaW50KCk7ICAvLyBvciB0Zi5leHBtMSh4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiBleHBtMV8oeCkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2V4cG0xJyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEV4cG0xLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IGV4cG0xID0gb3AoeyBleHBtMV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1leHBtMS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBidWZmZXIgfSBmcm9tICcuL2J1ZmZlcic7XG5pbXBvcnQgeyBleHBhbmREaW1zIH0gZnJvbSAnLi9leHBhbmRfZGltcyc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL3Jlc2hhcGUnO1xuaW1wb3J0IHsgdGlsZSB9IGZyb20gJy4vdGlsZSc7XG4vKipcbiAqIENyZWF0ZSBhbiBpZGVudGl0eSBtYXRyaXguXG4gKlxuICogQHBhcmFtIG51bVJvd3MgTnVtYmVyIG9mIHJvd3MuXG4gKiBAcGFyYW0gbnVtQ29sdW1ucyBOdW1iZXIgb2YgY29sdW1ucy4gRGVmYXVsdHMgdG8gYG51bVJvd3NgLlxuICogQHBhcmFtIGJhdGNoU2hhcGUgSWYgcHJvdmlkZWQsIHdpbGwgYWRkIHRoZSBiYXRjaCBzaGFwZSB0byB0aGUgYmVnaW5uaW5nXG4gKiAgIG9mIHRoZSBzaGFwZSBvZiB0aGUgcmV0dXJuZWQgYHRmLlRlbnNvcmAgYnkgcmVwZWF0aW5nIHRoZSBpZGVudGl0eVxuICogICBtYXRyaXguXG4gKiBAcGFyYW0gZHR5cGUgRGF0YSB0eXBlLlxuICogQHJldHVybnMgSWRlbnRpdHkgbWF0cml4IG9mIHRoZSBzcGVjaWZpZWQgc2l6ZSBhbmQgZGF0YSB0eXBlLCBwb3NzaWJseVxuICogICB3aXRoIGJhdGNoIHJlcGV0aXRpb24gaWYgYGJhdGNoU2hhcGVgIGlzIHNwZWNpZmllZC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDcmVhdGlvbid9XG4gKi9cbmZ1bmN0aW9uIGV5ZV8obnVtUm93cywgbnVtQ29sdW1ucywgYmF0Y2hTaGFwZSwgZHR5cGUgPSAnZmxvYXQzMicpIHtcbiAgICBpZiAobnVtQ29sdW1ucyA9PSBudWxsKSB7XG4gICAgICAgIG51bUNvbHVtbnMgPSBudW1Sb3dzO1xuICAgIH1cbiAgICBjb25zdCBidWZmID0gYnVmZmVyKFtudW1Sb3dzLCBudW1Db2x1bW5zXSwgZHR5cGUpO1xuICAgIGNvbnN0IG4gPSBudW1Sb3dzIDw9IG51bUNvbHVtbnMgPyBudW1Sb3dzIDogbnVtQ29sdW1ucztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgICBidWZmLnNldCgxLCBpLCBpKTtcbiAgICB9XG4gICAgY29uc3Qgb3V0ID0gcmVzaGFwZShidWZmLnRvVGVuc29yKCksIFtudW1Sb3dzLCBudW1Db2x1bW5zXSk7XG4gICAgaWYgKGJhdGNoU2hhcGUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaWYgKGJhdGNoU2hhcGUubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gdGlsZShleHBhbmREaW1zKG91dCwgMCksIFtiYXRjaFNoYXBlWzBdLCAxLCAxXSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYmF0Y2hTaGFwZS5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICAgICAgICAgICAgcmV0dXJuIHRpbGUoZXhwYW5kRGltcyhleHBhbmREaW1zKG91dCwgMCksIDApLCBbYmF0Y2hTaGFwZVswXSwgYmF0Y2hTaGFwZVsxXSwgMSwgMV0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGJhdGNoU2hhcGUubGVuZ3RoID09PSAzKSB7XG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgICAgICAgICAgIHJldHVybiB0aWxlKGV4cGFuZERpbXMoZXhwYW5kRGltcyhleHBhbmREaW1zKG91dCwgMCksIDApLCAwKSwgW1xuICAgICAgICAgICAgICAgIGJhdGNoU2hhcGVbMF0sIGJhdGNoU2hhcGVbMV0sIGJhdGNoU2hhcGVbMl0sIDEsIDFcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBleWUoKSBjdXJyZW50bHkgc3VwcG9ydHMgb25seSAxRCBhbmQgMkQgYCArXG4gICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICAgICAgICAgICAgICAgIGBiYXRjaFNoYXBlcywgYnV0IHJlY2VpdmVkICR7YmF0Y2hTaGFwZS5sZW5ndGh9RC5gKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydCBjb25zdCBleWUgPSBvcCh7IGV5ZV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1leWUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IEZpbGwgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuLyoqXG4gKiBDcmVhdGVzIGEgYHRmLlRlbnNvcmAgZmlsbGVkIHdpdGggYSBzY2FsYXIgdmFsdWUuXG4gKlxuICogYGBganNcbiAqIHRmLmZpbGwoWzIsIDJdLCA0KS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHNoYXBlIEFuIGFycmF5IG9mIGludGVnZXJzIGRlZmluaW5nIHRoZSBvdXRwdXQgdGVuc29yIHNoYXBlLlxuICogQHBhcmFtIHZhbHVlIFRoZSBzY2FsYXIgdmFsdWUgdG8gZmlsbCB0aGUgdGVuc29yIHdpdGguXG4gKiBAcGFyYW0gZHR5cGUgVGhlIHR5cGUgb2YgYW4gZWxlbWVudCBpbiB0aGUgcmVzdWx0aW5nIHRlbnNvci4gRGVmYXVsdHMgdG9cbiAqICdmbG9hdCcuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ3JlYXRpb24nfVxuICovXG5mdW5jdGlvbiBmaWxsKHNoYXBlLCB2YWx1ZSwgZHR5cGUpIHtcbiAgICBjb25zdCBhdHRycyA9IHsgc2hhcGUsIHZhbHVlLCBkdHlwZSB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEZpbGwsIHt9LCBhdHRycyk7XG59XG5leHBvcnQgeyBmaWxsIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1maWxsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBGbG9vciB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENvbXB1dGVzIGZsb29yIG9mIGlucHV0IGB0Zi5UZW5zb3JgIGVsZW1lbnQtd2lzZTogYGZsb29yKHgpYC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsuNiwgMS4xLCAtMy4zXSk7XG4gKlxuICogeC5mbG9vcigpLnByaW50KCk7ICAvLyBvciB0Zi5mbG9vcih4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiBmbG9vcl8oeCkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2Zsb29yJyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEZsb29yLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IGZsb29yID0gb3AoeyBmbG9vcl8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mbG9vci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgRmxvb3JEaXYgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgbWFrZVR5cGVzTWF0Y2ggfSBmcm9tICcuLi90ZW5zb3JfdXRpbCc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIERpdmlkZXMgdHdvIGB0Zi5UZW5zb3JgcyBlbGVtZW50LXdpc2UsIEEgLyBCLiBTdXBwb3J0cyBicm9hZGNhc3RpbmcuXG4gKiBUaGUgcmVzdWx0IGlzIHJvdW5kZWQgd2l0aCBmbG9vciBmdW5jdGlvbi5cbiAqXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgNCwgOSwgMTZdKTtcbiAqIGNvbnN0IGIgPSB0Zi50ZW5zb3IxZChbMSwgMiwgMywgNF0pO1xuICpcbiAqIGEuZmxvb3JEaXYoYikucHJpbnQoKTsgIC8vIG9yIHRmLmRpdihhLCBiKVxuICogYGBgXG4gKlxuICogYGBganNcbiAqIC8vIEJyb2FkY2FzdCBkaXYgYSB3aXRoIGIuXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzIsIDQsIDYsIDhdKTtcbiAqIGNvbnN0IGIgPSB0Zi5zY2FsYXIoMik7XG4gKlxuICogYS5mbG9vckRpdihiKS5wcmludCgpOyAgLy8gb3IgdGYuZmxvb3JEaXYoYSwgYilcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCB0ZW5zb3IgYXMgdGhlIG51bWVyYXRvci5cbiAqIEBwYXJhbSBiIFRoZSBzZWNvbmQgdGVuc29yIGFzIHRoZSBkZW5vbWluYXRvci4gTXVzdCBoYXZlIHRoZSBzYW1lIGR0eXBlIGFzXG4gKiBgYWAuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQXJpdGhtZXRpYyd9XG4gKi9cbmZ1bmN0aW9uIGZsb29yRGl2XyhhLCBiKSB7XG4gICAgbGV0ICRhID0gY29udmVydFRvVGVuc29yKGEsICdhJywgJ2Zsb29yRGl2Jyk7XG4gICAgbGV0ICRiID0gY29udmVydFRvVGVuc29yKGIsICdiJywgJ2Zsb29yRGl2Jyk7XG4gICAgWyRhLCAkYl0gPSBtYWtlVHlwZXNNYXRjaCgkYSwgJGIpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgYTogJGEsIGI6ICRiIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoRmxvb3JEaXYsIGlucHV0cyk7XG59XG5leHBvcnQgY29uc3QgZmxvb3JEaXYgPSBvcCh7IGZsb29yRGl2XyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZsb29yRGl2LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBjdXN0b21HcmFkIH0gZnJvbSAnLi4vLi4vZ3JhZGllbnRzJztcbmltcG9ydCB7IEZ1c2VkQ29udjJEIH0gZnJvbSAnLi4vLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IG1ha2VUeXBlc01hdGNoIH0gZnJvbSAnLi4vLi4vdGVuc29yX3V0aWwnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQgeyBhZGQgfSBmcm9tICcuLi9hZGQnO1xuaW1wb3J0ICogYXMgYnJvYWRjYXN0X3V0aWwgZnJvbSAnLi4vYnJvYWRjYXN0X3V0aWwnO1xuaW1wb3J0IHsgY29udjJkIGFzIHVuZnVzZWRDb252MmQgfSBmcm9tICcuLi9jb252MmQnO1xuaW1wb3J0IHsgY29udjJEQmFja3Byb3BGaWx0ZXIgfSBmcm9tICcuLi9jb252MmRfYmFja3Byb3BfZmlsdGVyJztcbmltcG9ydCB7IGNvbnYyREJhY2twcm9wSW5wdXQgfSBmcm9tICcuLi9jb252MmRfYmFja3Byb3BfaW5wdXQnO1xuaW1wb3J0ICogYXMgY29udl91dGlsIGZyb20gJy4uL2NvbnZfdXRpbCc7XG5pbXBvcnQgeyBhcHBseUFjdGl2YXRpb24sIGdldEZ1c2VkQmlhc0dyYWRpZW50LCBnZXRGdXNlZER5QWN0aXZhdGlvbiwgc2hvdWxkRnVzZSB9IGZyb20gJy4uL2Z1c2VkX3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4uL3Jlc2hhcGUnO1xuLyoqXG4gKiBDb21wdXRlcyBhIDJEIGNvbnZvbHV0aW9uIG92ZXIgdGhlIGlucHV0IHgsIG9wdGlvbmFsbHkgZnVzZWQgd2l0aCBhZGRpbmcgYVxuICogYmlhcyBhbmQgYXBwbHlpbmcgYW4gYWN0aXZhdGlvbi5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgaW5wdXREZXB0aCA9IDI7XG4gKiBjb25zdCBpblNoYXBlID0gWzIsIDIsIDIsIGlucHV0RGVwdGhdO1xuICogY29uc3Qgb3V0cHV0RGVwdGggPSAyO1xuICogY29uc3QgZlNpemUgPSAxO1xuICogY29uc3QgcGFkID0gMDtcbiAqIGNvbnN0IHN0cmlkZXMgPSAxO1xuICpcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3I0ZCggWzEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsXG4gKiAxNl0sIGluU2hhcGUpO1xuICogY29uc3QgdyA9IHRmLnRlbnNvcjRkKFstMSwgMSwgLTIsIDAuNV0sIFtmU2l6ZSwgZlNpemUsIGlucHV0RGVwdGgsXG4gKiBvdXRwdXREZXB0aF0pO1xuICpcbiAqIHRmLmZ1c2VkLmNvbnYyZCh7IHgsIGZpbHRlcjogdywgc3RyaWRlcywgcGFkLCBkYXRhRm9ybWF0OiAnTkhXQycsXG4gKiBkaWxhdGlvbnM6IFsxLCAxXSwgYmlhczogdGYuc2NhbGFyKDUpLCBhY3RpdmF0aW9uOiAncmVsdScgfSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBvYmogQW4gb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvciwgb2YgcmFuayA0IG9yIHJhbmsgMywgb2Ygc2hhcGVcbiAqICAgICBgW2JhdGNoLCBoZWlnaHQsIHdpZHRoLCBpbkNoYW5uZWxzXWAuIElmIHJhbmsgMywgYmF0Y2ggb2YgMSBpc1xuICogYXNzdW1lZC5cbiAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlciwgcmFuayA0LCBvZiBzaGFwZVxuICogICAgIGBbZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgaW5EZXB0aCwgb3V0RGVwdGhdYC5cbiAqIEBwYXJhbSBzdHJpZGVzIFRoZSBzdHJpZGVzIG9mIHRoZSBjb252b2x1dGlvbjogYFtzdHJpZGVIZWlnaHQsXG4gKiBzdHJpZGVXaWR0aF1gLlxuICogQHBhcmFtIHBhZCBUaGUgdHlwZSBvZiBwYWRkaW5nIGFsZ29yaXRobS5cbiAqICAgLSBgc2FtZWAgYW5kIHN0cmlkZSAxOiBvdXRwdXQgd2lsbCBiZSBvZiBzYW1lIHNpemUgYXMgaW5wdXQsXG4gKiAgICAgICByZWdhcmRsZXNzIG9mIGZpbHRlciBzaXplLlxuICogICAtIGB2YWxpZGAgb3V0cHV0IHdpbGwgYmUgc21hbGxlciB0aGFuIGlucHV0IGlmIGZpbHRlciBpcyBsYXJnZXJcbiAqICAgICAgIHRoYW4gMXgxLlxuICogICAtIEZvciBtb3JlIGluZm8sIHNlZSB0aGlzIGd1aWRlOlxuICogICAgIFtodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvbm4vY29udm9sdXRpb25dKFxuICogICAgICAgICAgaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uKVxuICogQHBhcmFtIGRhdGFGb3JtYXQgQW4gb3B0aW9uYWwgc3RyaW5nIGZyb206IFwiTkhXQ1wiLCBcIk5DSFdcIi4gRGVmYXVsdHMgdG9cbiAqICAgICBcIk5IV0NcIi4gU3BlY2lmeSB0aGUgZGF0YSBmb3JtYXQgb2YgdGhlIGlucHV0IGFuZCBvdXRwdXQgZGF0YS4gV2l0aCB0aGVcbiAqICAgICBkZWZhdWx0IGZvcm1hdCBcIk5IV0NcIiwgdGhlIGRhdGEgaXMgc3RvcmVkIGluIHRoZSBvcmRlciBvZjogW2JhdGNoLFxuICogICAgIGhlaWdodCwgd2lkdGgsIGNoYW5uZWxzXS4gT25seSBcIk5IV0NcIiBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLlxuICogQHBhcmFtIGRpbGF0aW9ucyBUaGUgZGlsYXRpb24gcmF0ZXM6IGBbZGlsYXRpb25IZWlnaHQsIGRpbGF0aW9uV2lkdGhdYFxuICogICAgIGluIHdoaWNoIHdlIHNhbXBsZSBpbnB1dCB2YWx1ZXMgYWNyb3NzIHRoZSBoZWlnaHQgYW5kIHdpZHRoIGRpbWVuc2lvbnNcbiAqICAgICBpbiBhdHJvdXMgY29udm9sdXRpb24uIERlZmF1bHRzIHRvIGBbMSwgMV1gLiBJZiBgZGlsYXRpb25zYCBpcyBhIHNpbmdsZVxuICogICAgIG51bWJlciwgdGhlbiBgZGlsYXRpb25IZWlnaHQgPT0gZGlsYXRpb25XaWR0aGAuIElmIGl0IGlzIGdyZWF0ZXIgdGhhblxuICogICAgIDEsIHRoZW4gYWxsIHZhbHVlcyBvZiBgc3RyaWRlc2AgbXVzdCBiZSAxLlxuICogQHBhcmFtIGRpbVJvdW5kaW5nTW9kZSBBIHN0cmluZyBmcm9tOiAnY2VpbCcsICdyb3VuZCcsICdmbG9vcicuIElmIG5vbmUgaXNcbiAqICAgICBwcm92aWRlZCwgaXQgd2lsbCBkZWZhdWx0IHRvIHRydW5jYXRlLlxuICogQHBhcmFtIGJpYXMgVGVuc29yIHRvIGJlIGFkZGVkIHRvIHRoZSByZXN1bHQuXG4gKiBAcGFyYW0gYWN0aXZhdGlvbiBOYW1lIG9mIGFjdGl2YXRpb24ga2VybmVsIChkZWZhdWx0cyB0byBgbGluZWFyYCkgdG8gYmVcbiAqICAgICBhcHBsaWVkXG4gKiAgICAgIGFmdGVyIGJpYXNBZGQuXG4gKiBAcGFyYW0gcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyBUZW5zb3Igb2YgcHJlbHUgd2VpZ2h0cyB0byBiZSBhcHBsaWVkIGFzIHBhcnRcbiAqICAgICBvZiBhIGBwcmVsdWAgYWN0aXZhdGlvbiwgdHlwaWNhbGx5IHRoZSBzYW1lIHNoYXBlIGFzIGB4YC5cbiAqIEBwYXJhbSBsZWFreXJlbHVBbHBoYSBPcHRpb25hbC4gQWxwaGEgdG8gYmUgYXBwbGllZCBhcyBwYXJ0IG9mIGEgYGxlYWt5cmVsdWBcbiAqICAgICBhY3RpdmF0aW9uLlxuICovXG5mdW5jdGlvbiBmdXNlZENvbnYyZF8oeyB4LCBmaWx0ZXIsIHN0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdCA9ICdOSFdDJywgZGlsYXRpb25zID0gWzEsIDFdLCBkaW1Sb3VuZGluZ01vZGUsIGJpYXMsIGFjdGl2YXRpb24gPSAnbGluZWFyJywgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cywgbGVha3lyZWx1QWxwaGEgfSkge1xuICAgIGFjdGl2YXRpb24gPSBhY3RpdmF0aW9uIHx8ICdsaW5lYXInO1xuICAgIGlmIChzaG91bGRGdXNlKEVOR0lORS5zdGF0ZS5ncmFkaWVudERlcHRoLCBhY3RpdmF0aW9uKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHVuZnVzZWRDb252MmQoeCwgZmlsdGVyLCBzdHJpZGVzLCBwYWQsIGRhdGFGb3JtYXQsIGRpbGF0aW9ucywgZGltUm91bmRpbmdNb2RlKTtcbiAgICAgICAgaWYgKGJpYXMgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmVzdWx0ID0gYWRkKHJlc3VsdCwgYmlhcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFwcGx5QWN0aXZhdGlvbihyZXN1bHQsIGFjdGl2YXRpb24sIHByZWx1QWN0aXZhdGlvbldlaWdodHMsIGxlYWt5cmVsdUFscGhhKTtcbiAgICB9XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnY29udjJkJyk7XG4gICAgY29uc3QgJGZpbHRlciA9IGNvbnZlcnRUb1RlbnNvcihmaWx0ZXIsICdmaWx0ZXInLCAnY29udjJkJyk7XG4gICAgbGV0IHg0RCA9ICR4O1xuICAgIGxldCByZXNoYXBlZFRvNEQgPSBmYWxzZTtcbiAgICBpZiAoJHgucmFuayA9PT0gMykge1xuICAgICAgICByZXNoYXBlZFRvNEQgPSB0cnVlO1xuICAgICAgICB4NEQgPSByZXNoYXBlKCR4LCBbMSwgJHguc2hhcGVbMF0sICR4LnNoYXBlWzFdLCAkeC5zaGFwZVsyXV0pO1xuICAgIH1cbiAgICB1dGlsLmFzc2VydCh4NEQucmFuayA9PT0gNCwgKCkgPT4gYEVycm9yIGluIGZ1c2VkIGNvbnYyZDogaW5wdXQgbXVzdCBiZSByYW5rIDQsIGJ1dCBnb3QgcmFuayBgICtcbiAgICAgICAgYCR7eDRELnJhbmt9LmApO1xuICAgIHV0aWwuYXNzZXJ0KCRmaWx0ZXIucmFuayA9PT0gNCwgKCkgPT4gYEVycm9yIGluIGZ1c2VkIGNvbnYyZDogZmlsdGVyIG11c3QgYmUgcmFuayA0LCBidXQgZ290IHJhbmsgYCArXG4gICAgICAgIGAkeyRmaWx0ZXIucmFua30uYCk7XG4gICAgaWYgKGRpbVJvdW5kaW5nTW9kZSAhPSBudWxsKSB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KHV0aWwuaXNJbnQocGFkKSwgKCkgPT4gYEVycm9yIGluIGZ1c2VkIGNvbnYyZDogcGFkIG11c3QgYmUgYW4gaW50ZWdlciB3aGVuIHVzaW5nLCBgICtcbiAgICAgICAgICAgIGBkaW1Sb3VuZGluZ01vZGUgJHtkaW1Sb3VuZGluZ01vZGV9IGJ1dCBnb3QgcGFkICR7cGFkfS5gKTtcbiAgICB9XG4gICAgdXRpbC5hc3NlcnQoeDRELnNoYXBlWzNdID09PSAkZmlsdGVyLnNoYXBlWzJdLCAoKSA9PiBgRXJyb3IgaW4gY29udjJkOiBkZXB0aCBvZiBpbnB1dCAoJHt4NEQuc2hhcGVbM119KSBtdXN0IG1hdGNoIGAgK1xuICAgICAgICBgaW5wdXQgZGVwdGggZm9yIGZpbHRlciAkeyRmaWx0ZXIuc2hhcGVbMl19LmApO1xuICAgIHV0aWwuYXNzZXJ0KGNvbnZfdXRpbC5laXRoZXJTdHJpZGVzT3JEaWxhdGlvbnNBcmVPbmUoc3RyaWRlcywgZGlsYXRpb25zKSwgKCkgPT4gJ0Vycm9yIGluIGNvbnYyRDogRWl0aGVyIHN0cmlkZXMgb3IgZGlsYXRpb25zIG11c3QgYmUgMS4gJyArXG4gICAgICAgIGBHb3Qgc3RyaWRlcyAke3N0cmlkZXN9IGFuZCBkaWxhdGlvbnMgJyR7ZGlsYXRpb25zfSdgKTtcbiAgICB1dGlsLmFzc2VydChkYXRhRm9ybWF0ID09PSAnTkhXQycsICgpID0+IGBFcnJvciBpbiBjb252MmQ6IGdvdCBkYXRhRm9ybWF0IG9mICR7ZGF0YUZvcm1hdH0gYnV0IG9ubHkgTkhXQyBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLmApO1xuICAgIGNvbnN0IGNvbnZJbmZvID0gY29udl91dGlsLmNvbXB1dGVDb252MkRJbmZvKHg0RC5zaGFwZSwgJGZpbHRlci5zaGFwZSwgc3RyaWRlcywgZGlsYXRpb25zLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSk7XG4gICAgbGV0ICRiaWFzO1xuICAgIGlmIChiaWFzICE9IG51bGwpIHtcbiAgICAgICAgJGJpYXMgPSBjb252ZXJ0VG9UZW5zb3IoYmlhcywgJ2JpYXMnLCAnZnVzZWQgY29udjJkJyk7XG4gICAgICAgIFskYmlhc10gPSBtYWtlVHlwZXNNYXRjaCgkYmlhcywgJHgpO1xuICAgICAgICBicm9hZGNhc3RfdXRpbC5hc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZShjb252SW5mby5vdXRTaGFwZSwgJGJpYXMuc2hhcGUpO1xuICAgIH1cbiAgICBsZXQgJHByZWx1QWN0aXZhdGlvbldlaWdodHM7XG4gICAgaWYgKHByZWx1QWN0aXZhdGlvbldlaWdodHMgIT0gbnVsbCkge1xuICAgICAgICAkcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyA9IGNvbnZlcnRUb1RlbnNvcihwcmVsdUFjdGl2YXRpb25XZWlnaHRzLCAncHJlbHUgd2VpZ2h0cycsICdmdXNlZCBjb252MmQnKTtcbiAgICB9XG4gICAgY29uc3QgZ3JhZCA9IChkeSwgc2F2ZWQpID0+IHtcbiAgICAgICAgY29uc3QgWyRmaWx0ZXIsIHg0RCwgeSwgJGJpYXNdID0gc2F2ZWQ7XG4gICAgICAgIGNvbnN0IGR5QWN0aXZhdGlvbiA9IGdldEZ1c2VkRHlBY3RpdmF0aW9uKGR5LCB5LCBhY3RpdmF0aW9uKTtcbiAgICAgICAgdXRpbC5hc3NlcnQoY29udl91dGlsLnR1cGxlVmFsdWVzQXJlT25lKGRpbGF0aW9ucyksICgpID0+ICdFcnJvciBpbiBncmFkaWVudCBvZiBmdXNlZCBjb252MkQ6ICcgK1xuICAgICAgICAgICAgYGRpbGF0aW9uIHJhdGVzIGdyZWF0ZXIgdGhhbiAxIGAgK1xuICAgICAgICAgICAgYGFyZSBub3QgeWV0IHN1cHBvcnRlZCBpbiBncmFkaWVudHMuIEdvdCBkaWxhdGlvbnMgJyR7ZGlsYXRpb25zfSdgKTtcbiAgICAgICAgY29uc3QgeERlciA9IGNvbnYyREJhY2twcm9wSW5wdXQoeDRELnNoYXBlLCBkeUFjdGl2YXRpb24sICRmaWx0ZXIsIHN0cmlkZXMsIHBhZCk7XG4gICAgICAgIGNvbnN0IGZpbHRlckRlciA9IGNvbnYyREJhY2twcm9wRmlsdGVyKHg0RCwgZHlBY3RpdmF0aW9uLCAkZmlsdGVyLnNoYXBlLCBzdHJpZGVzLCBwYWQpO1xuICAgICAgICBjb25zdCBkZXIgPSBbeERlciwgZmlsdGVyRGVyXTtcbiAgICAgICAgaWYgKCRiaWFzICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGJpYXNEZXIgPSBnZXRGdXNlZEJpYXNHcmFkaWVudCgkYmlhcywgZHlBY3RpdmF0aW9uKTtcbiAgICAgICAgICAgIGRlci5wdXNoKGJpYXNEZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZXI7XG4gICAgfTtcbiAgICBjb25zdCBpbnB1dHMgPSB7XG4gICAgICAgIHg6IHg0RCxcbiAgICAgICAgZmlsdGVyOiAkZmlsdGVyLFxuICAgICAgICBiaWFzOiAkYmlhcyxcbiAgICAgICAgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0czogJHByZWx1QWN0aXZhdGlvbldlaWdodHNcbiAgICB9O1xuICAgIGNvbnN0IGF0dHJzID0ge1xuICAgICAgICBzdHJpZGVzLFxuICAgICAgICBwYWQsXG4gICAgICAgIGRhdGFGb3JtYXQsXG4gICAgICAgIGRpbGF0aW9ucyxcbiAgICAgICAgZGltUm91bmRpbmdNb2RlLFxuICAgICAgICBhY3RpdmF0aW9uLFxuICAgICAgICBsZWFreXJlbHVBbHBoYVxuICAgIH07XG4gICAgLy8gRGVwZW5kaW5nIG9uIHRoZSB0aGUgcGFyYW1zIHBhc3NlZCBpbiB3ZSB3aWxsIGhhdmUgZGlmZmVyZW50IG51bWJlciBvZlxuICAgIC8vIGlucHV0cyBhbmQgdGh1cyBhIGEgZGlmZmVyZW50IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgZ3JhZGllbnQuXG4gICAgaWYgKGJpYXMgPT0gbnVsbCkge1xuICAgICAgICBjb25zdCBjdXN0b21PcCA9IGN1c3RvbUdyYWQoKHg0RCwgZmlsdGVyLCBzYXZlKSA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzID0gXG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgICAgICAgICBFTkdJTkUucnVuS2VybmVsKEZ1c2VkQ29udjJELCBpbnB1dHMsIGF0dHJzKTtcbiAgICAgICAgICAgIHNhdmUoW2ZpbHRlciwgeDRELCByZXNdKTtcbiAgICAgICAgICAgIGlmIChyZXNoYXBlZFRvNEQpIHtcbiAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgICAgICAgICAgICAgcmVzID0gcmVzaGFwZShyZXMsIFtyZXMuc2hhcGVbMV0sIHJlcy5zaGFwZVsyXSwgcmVzLnNoYXBlWzNdXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogcmVzLCBncmFkRnVuYzogZ3JhZCB9O1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGN1c3RvbU9wKHg0RCwgJGZpbHRlcik7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBjdXN0b21PcFdpdGhCaWFzID0gY3VzdG9tR3JhZCgoeDRELCBmaWx0ZXIsIGJpYXMsIHNhdmUpID0+IHtcbiAgICAgICAgICAgIGxldCByZXMgPSBFTkdJTkUucnVuS2VybmVsKEZ1c2VkQ29udjJELCBpbnB1dHMsIGF0dHJzKTtcbiAgICAgICAgICAgIHNhdmUoW2ZpbHRlciwgeDRELCByZXMsIGJpYXNdKTtcbiAgICAgICAgICAgIGlmIChyZXNoYXBlZFRvNEQpIHtcbiAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgICAgICAgICAgICAgcmVzID0gcmVzaGFwZShyZXMsIFtyZXMuc2hhcGVbMV0sIHJlcy5zaGFwZVsyXSwgcmVzLnNoYXBlWzNdXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogcmVzLCBncmFkRnVuYzogZ3JhZCB9O1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGN1c3RvbU9wV2l0aEJpYXMoeDRELCAkZmlsdGVyLCAkYmlhcyk7XG4gICAgfVxufVxuZXhwb3J0IGNvbnN0IGNvbnYyZCA9IG9wKHsgZnVzZWRDb252MmRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29udjJkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBjdXN0b21HcmFkIH0gZnJvbSAnLi4vLi4vZ3JhZGllbnRzJztcbmltcG9ydCB7IEZ1c2VkRGVwdGh3aXNlQ29udjJEIH0gZnJvbSAnLi4vLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IG1ha2VUeXBlc01hdGNoIH0gZnJvbSAnLi4vLi4vdGVuc29yX3V0aWwnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQgeyBhZGQgfSBmcm9tICcuLi9hZGQnO1xuaW1wb3J0ICogYXMgYnJvYWRjYXN0X3V0aWwgZnJvbSAnLi4vYnJvYWRjYXN0X3V0aWwnO1xuaW1wb3J0ICogYXMgY29udl91dGlsIGZyb20gJy4uL2NvbnZfdXRpbCc7XG5pbXBvcnQgeyBkZXB0aHdpc2VDb252MmQgYXMgdW5mdXNlZERlcHRod2lzZUNvbnYyZCB9IGZyb20gJy4uL2RlcHRod2lzZV9jb252MmQnO1xuaW1wb3J0IHsgZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXIgfSBmcm9tICcuLi9kZXB0aHdpc2VfY29udjJkX25hdGl2ZV9iYWNrcHJvcF9maWx0ZXInO1xuaW1wb3J0IHsgZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dCB9IGZyb20gJy4uL2RlcHRod2lzZV9jb252MmRfbmF0aXZlX2JhY2twcm9wX2lucHV0JztcbmltcG9ydCB7IGFwcGx5QWN0aXZhdGlvbiwgZ2V0RnVzZWRCaWFzR3JhZGllbnQsIGdldEZ1c2VkRHlBY3RpdmF0aW9uLCBzaG91bGRGdXNlIH0gZnJvbSAnLi4vZnVzZWRfdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4uL29wZXJhdGlvbic7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi4vcmVzaGFwZSc7XG4vKipcbiAqIENvbXB1dGVzIGRlcHRod2lzZSAyRCBjb252b2x1dGlvbiwgb3B0aW9uYWxseSBmdXNlZCB3aXRoIGFkZGluZyBhXG4gKiBiaWFzIGFuZCBhcHBseWluZyBhbiBhY3RpdmF0aW9uLlxuICpcbiAqIEdpdmVuIGEgNEQgYGlucHV0YCBhcnJheSBhbmQgYSBgZmlsdGVyYCBhcnJheSBvZiBzaGFwZVxuICogYFtmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoLCBpbkNoYW5uZWxzLCBjaGFubmVsTXVsdGlwbGllcl1gIGNvbnRhaW5pbmdcbiAqIGBpbkNoYW5uZWxzYCBjb252b2x1dGlvbmFsIGZpbHRlcnMgb2YgZGVwdGggMSwgdGhpcyBvcCBhcHBsaWVzIGFcbiAqIGRpZmZlcmVudCBmaWx0ZXIgdG8gZWFjaCBpbnB1dCBjaGFubmVsIChleHBhbmRpbmcgZnJvbSAxIGNoYW5uZWwgdG9cbiAqIGBjaGFubmVsTXVsdGlwbGllcmAgY2hhbm5lbHMgZm9yIGVhY2gpLCB0aGVuIGNvbmNhdGVuYXRlcyB0aGUgcmVzdWx0c1xuICogdG9nZXRoZXIuIFRoZSBvdXRwdXQgaGFzIGBpbkNoYW5uZWxzICogY2hhbm5lbE11bHRpcGxpZXJgIGNoYW5uZWxzLlxuICpcbiAqIFNlZVxuICogW2h0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9kZXB0aHdpc2VfY29udjJkXShcbiAqICAgICBodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvbm4vZGVwdGh3aXNlX2NvbnYyZClcbiAqIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogQHBhcmFtIG9iaiBBbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLCBvZiByYW5rIDQgb3IgcmFuayAzLCBvZiBzaGFwZVxuICogICAgIGBbYmF0Y2gsIGhlaWdodCwgd2lkdGgsIGluQ2hhbm5lbHNdYC4gSWYgcmFuayAzLCBiYXRjaCBvZiAxIGlzXG4gKiBhc3N1bWVkLlxuICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyIHRlbnNvciwgcmFuayA0LCBvZiBzaGFwZVxuICogICAgIGBbZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgaW5DaGFubmVscywgY2hhbm5lbE11bHRpcGxpZXJdYC5cbiAqIEBwYXJhbSBzdHJpZGVzIFRoZSBzdHJpZGVzIG9mIHRoZSBjb252b2x1dGlvbjogYFtzdHJpZGVIZWlnaHQsXG4gKiBzdHJpZGVXaWR0aF1gLiBJZiBzdHJpZGVzIGlzIGEgc2luZ2xlIG51bWJlciwgdGhlbiBgc3RyaWRlSGVpZ2h0ID09XG4gKiBzdHJpZGVXaWR0aGAuXG4gKiBAcGFyYW0gcGFkIFRoZSB0eXBlIG9mIHBhZGRpbmcgYWxnb3JpdGhtLlxuICogICAtIGBzYW1lYCBhbmQgc3RyaWRlIDE6IG91dHB1dCB3aWxsIGJlIG9mIHNhbWUgc2l6ZSBhcyBpbnB1dCxcbiAqICAgICAgIHJlZ2FyZGxlc3Mgb2YgZmlsdGVyIHNpemUuXG4gKiAgIC0gYHZhbGlkYDogb3V0cHV0IHdpbGwgYmUgc21hbGxlciB0aGFuIGlucHV0IGlmIGZpbHRlciBpcyBsYXJnZXJcbiAqICAgICAgIHRoYW4gMXgxLlxuICogICAtIEZvciBtb3JlIGluZm8sIHNlZSB0aGlzIGd1aWRlOlxuICogICAgIFtodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvbm4vY29udm9sdXRpb25dKFxuICogICAgICAgICAgaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uKVxuICogQHBhcmFtIGRpbGF0aW9ucyBUaGUgZGlsYXRpb24gcmF0ZXM6IGBbZGlsYXRpb25IZWlnaHQsIGRpbGF0aW9uV2lkdGhdYFxuICogICAgIGluIHdoaWNoIHdlIHNhbXBsZSBpbnB1dCB2YWx1ZXMgYWNyb3NzIHRoZSBoZWlnaHQgYW5kIHdpZHRoIGRpbWVuc2lvbnNcbiAqICAgICBpbiBhdHJvdXMgY29udm9sdXRpb24uIERlZmF1bHRzIHRvIGBbMSwgMV1gLiBJZiBgcmF0ZWAgaXMgYSBzaW5nbGVcbiAqICAgICBudW1iZXIsIHRoZW4gYGRpbGF0aW9uSGVpZ2h0ID09IGRpbGF0aW9uV2lkdGhgLiBJZiBpdCBpcyBncmVhdGVyIHRoYW5cbiAqICAgICAxLCB0aGVuIGFsbCB2YWx1ZXMgb2YgYHN0cmlkZXNgIG11c3QgYmUgMS5cbiAqIEBwYXJhbSBkYXRhRm9ybWF0OiBBbiBvcHRpb25hbCBzdHJpbmcgZnJvbTogXCJOSFdDXCIsIFwiTkNIV1wiLiBEZWZhdWx0cyB0b1xuICogICAgIFwiTkhXQ1wiLiBTcGVjaWZ5IHRoZSBkYXRhIGZvcm1hdCBvZiB0aGUgaW5wdXQgYW5kIG91dHB1dCBkYXRhLiBXaXRoIHRoZVxuICogICAgIGRlZmF1bHQgZm9ybWF0IFwiTkhXQ1wiLCB0aGUgZGF0YSBpcyBzdG9yZWQgaW4gdGhlIG9yZGVyIG9mOiBbYmF0Y2gsXG4gKiAgICAgaGVpZ2h0LCB3aWR0aCwgY2hhbm5lbHNdLiBPbmx5IFwiTkhXQ1wiIGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQuXG4gKiBAcGFyYW0gZGltUm91bmRpbmdNb2RlIEEgc3RyaW5nIGZyb206ICdjZWlsJywgJ3JvdW5kJywgJ2Zsb29yJy4gSWYgbm9uZSBpc1xuICogICAgIHByb3ZpZGVkLCBpdCB3aWxsIGRlZmF1bHQgdG8gdHJ1bmNhdGUuXG4gKiBAcGFyYW0gYmlhcyBUZW5zb3IgdG8gYmUgYWRkZWQgdG8gdGhlIHJlc3VsdC5cbiAqIEBwYXJhbSBhY3RpdmF0aW9uIE5hbWUgb2YgYWN0aXZhdGlvbiBrZXJuZWwgKGRlZmF1bHRzIHRvIGBsaW5lYXJgKS5cbiAqIEBwYXJhbSBwcmVsdUFjdGl2YXRpb25XZWlnaHRzIFRlbnNvciBvZiBwcmVsdSB3ZWlnaHRzIHRvIGJlIGFwcGxpZWQgYXMgcGFydFxuICogICAgIG9mIGEgYHByZWx1YCBhY3RpdmF0aW9uLCB0eXBpY2FsbHkgdGhlIHNhbWUgc2hhcGUgYXMgYHhgLlxuICogQHBhcmFtIGxlYWt5cmVsdUFscGhhIE9wdGlvbmFsLiBBbHBoYSB0byBiZSBhcHBsaWVkIGFzIHBhcnQgb2YgYSBgbGVha3lyZWx1YFxuICogICAgIGFjdGl2YXRpb24uXG4gKi9cbmZ1bmN0aW9uIGZ1c2VkRGVwdGh3aXNlQ29udjJkXyh7IHgsIGZpbHRlciwgc3RyaWRlcywgcGFkLCBkYXRhRm9ybWF0ID0gJ05IV0MnLCBkaWxhdGlvbnMgPSBbMSwgMV0sIGRpbVJvdW5kaW5nTW9kZSwgYmlhcywgYWN0aXZhdGlvbiA9ICdsaW5lYXInLCBwcmVsdUFjdGl2YXRpb25XZWlnaHRzLCBsZWFreXJlbHVBbHBoYSB9KSB7XG4gICAgaWYgKHNob3VsZEZ1c2UoRU5HSU5FLnN0YXRlLmdyYWRpZW50RGVwdGgsIGFjdGl2YXRpb24pID09PSBmYWxzZSkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gdW5mdXNlZERlcHRod2lzZUNvbnYyZCh4LCBmaWx0ZXIsIHN0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdCwgZGlsYXRpb25zLCBkaW1Sb3VuZGluZ01vZGUpO1xuICAgICAgICBpZiAoYmlhcyAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBhZGQocmVzdWx0LCBiaWFzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXBwbHlBY3RpdmF0aW9uKHJlc3VsdCwgYWN0aXZhdGlvbiwgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cywgbGVha3lyZWx1QWxwaGEpO1xuICAgIH1cbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdkZXB0aHdpc2VDb252MmQnKTtcbiAgICBjb25zdCAkZmlsdGVyID0gY29udmVydFRvVGVuc29yKGZpbHRlciwgJ2ZpbHRlcicsICdkZXB0aHdpc2VDb252MmQnKTtcbiAgICBsZXQgeDREID0gJHg7XG4gICAgbGV0IHJlc2hhcGVkVG80RCA9IGZhbHNlO1xuICAgIGlmICgkeC5yYW5rID09PSAzKSB7XG4gICAgICAgIHJlc2hhcGVkVG80RCA9IHRydWU7XG4gICAgICAgIHg0RCA9IHJlc2hhcGUoJHgsIFsxLCAkeC5zaGFwZVswXSwgJHguc2hhcGVbMV0sICR4LnNoYXBlWzJdXSk7XG4gICAgfVxuICAgIHV0aWwuYXNzZXJ0KHg0RC5yYW5rID09PSA0LCAoKSA9PiBgRXJyb3IgaW4gZnVzZWQgZGVwdGh3aXNlQ29udjJkOiBpbnB1dCBtdXN0IGJlIHJhbmsgNCwgYnV0IGdvdCBgICtcbiAgICAgICAgYHJhbmsgJHt4NEQucmFua30uYCk7XG4gICAgdXRpbC5hc3NlcnQoJGZpbHRlci5yYW5rID09PSA0LCAoKSA9PiBgRXJyb3IgaW4gZnVzZWQgZGVwdGh3aXNlQ29udjJkOiBmaWx0ZXIgbXVzdCBiZSByYW5rIDQsIGAgK1xuICAgICAgICBgYnV0IGdvdCByYW5rICR7JGZpbHRlci5yYW5rfS5gKTtcbiAgICB1dGlsLmFzc2VydCh4NEQuc2hhcGVbM10gPT09ICRmaWx0ZXIuc2hhcGVbMl0sICgpID0+IGBFcnJvciBpbiBmdXNlZCBkZXB0aHdpc2VDb252MmQ6IG51bWJlciBvZiBpbnB1dCBjaGFubmVscyBgICtcbiAgICAgICAgYCgke3g0RC5zaGFwZVszXX0pIG11c3QgbWF0Y2ggdGhlIGluQ2hhbm5lbHMgZGltZW5zaW9uIGluIGAgK1xuICAgICAgICBgZmlsdGVyICR7JGZpbHRlci5zaGFwZVsyXX0uYCk7XG4gICAgaWYgKGRpbGF0aW9ucyA9PSBudWxsKSB7XG4gICAgICAgIGRpbGF0aW9ucyA9IFsxLCAxXTtcbiAgICB9XG4gICAgdXRpbC5hc3NlcnQoY29udl91dGlsLmVpdGhlclN0cmlkZXNPckRpbGF0aW9uc0FyZU9uZShzdHJpZGVzLCBkaWxhdGlvbnMpLCAoKSA9PiAnRXJyb3IgaW4gZnVzZWQgZGVwdGh3aXNlQ29udjJkOiBFaXRoZXIgc3RyaWRlcyBvciBkaWxhdGlvbnMgbXVzdCAnICtcbiAgICAgICAgYGJlIDEuIEdvdCBzdHJpZGVzICR7c3RyaWRlc30gYW5kIGRpbGF0aW9ucyAnJHtkaWxhdGlvbnN9J2ApO1xuICAgIGlmIChkaW1Sb3VuZGluZ01vZGUgIT0gbnVsbCkge1xuICAgICAgICB1dGlsLmFzc2VydCh1dGlsLmlzSW50KHBhZCksICgpID0+IGBFcnJvciBpbiBmdXNlZCBkZXB0aHdpc2VDb252MmQ6IHBhZCBtdXN0IGJlIGFuIGludGVnZXIgd2hlbiBgICtcbiAgICAgICAgICAgIGB1c2luZyBkaW1Sb3VuZGluZ01vZGUgJHtkaW1Sb3VuZGluZ01vZGV9IGJ1dCBnb3QgcGFkICR7cGFkfS5gKTtcbiAgICB9XG4gICAgY29uc3QgY29udkluZm8gPSBjb252X3V0aWwuY29tcHV0ZUNvbnYyREluZm8oeDRELnNoYXBlLCAkZmlsdGVyLnNoYXBlLCBzdHJpZGVzLCBkaWxhdGlvbnMsIHBhZCwgZGltUm91bmRpbmdNb2RlLCB0cnVlIC8qIGRlcHRod2lzZSAqLyk7XG4gICAgbGV0ICRiaWFzO1xuICAgIGlmIChiaWFzICE9IG51bGwpIHtcbiAgICAgICAgJGJpYXMgPSBjb252ZXJ0VG9UZW5zb3IoYmlhcywgJ2JpYXMnLCAnZnVzZWQgY29udjJkJyk7XG4gICAgICAgIFskYmlhc10gPSBtYWtlVHlwZXNNYXRjaCgkYmlhcywgJHgpO1xuICAgICAgICBicm9hZGNhc3RfdXRpbC5hc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZShjb252SW5mby5vdXRTaGFwZSwgJGJpYXMuc2hhcGUpO1xuICAgIH1cbiAgICBsZXQgJHByZWx1QWN0aXZhdGlvbldlaWdodHM7XG4gICAgaWYgKHByZWx1QWN0aXZhdGlvbldlaWdodHMgIT0gbnVsbCkge1xuICAgICAgICAkcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyA9IGNvbnZlcnRUb1RlbnNvcihwcmVsdUFjdGl2YXRpb25XZWlnaHRzLCAncHJlbHUgd2VpZ2h0cycsICdmdXNlZCBkZXB0aHdpc2VDb252MmQnKTtcbiAgICB9XG4gICAgY29uc3QgZ3JhZCA9IChkeSwgc2F2ZWQpID0+IHtcbiAgICAgICAgdXRpbC5hc3NlcnQoY29udl91dGlsLnR1cGxlVmFsdWVzQXJlT25lKGRpbGF0aW9ucyksICgpID0+ICdFcnJvciBpbiBncmFkaWVudCBvZiBmdXNlZCBkZXB0aHdpc2VDb252MmQ6IGRpbGF0aW9uIHJhdGVzICcgK1xuICAgICAgICAgICAgYGdyZWF0ZXIgdGhhbiAxIGFyZSBub3QgeWV0IHN1cHBvcnRlZC4gR290IGRpbGF0aW9ucyBgICtcbiAgICAgICAgICAgIGAnJHtkaWxhdGlvbnN9J2ApO1xuICAgICAgICBjb25zdCBbJGZpbHRlciwgeDRELCB5LCBiaWFzXSA9IHNhdmVkO1xuICAgICAgICBjb25zdCBkeUFjdGl2YXRpb24gPSBnZXRGdXNlZER5QWN0aXZhdGlvbihkeSwgeSwgYWN0aXZhdGlvbik7XG4gICAgICAgIGNvbnN0IHhEZXIgPSBkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0KHg0RC5zaGFwZSwgZHlBY3RpdmF0aW9uLCAkZmlsdGVyLCBzdHJpZGVzLCBwYWQsIGRpbGF0aW9ucywgZGltUm91bmRpbmdNb2RlKTtcbiAgICAgICAgY29uc3QgZmlsdGVyRGVyID0gZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXIoeDRELCBkeUFjdGl2YXRpb24sICRmaWx0ZXIuc2hhcGUsIHN0cmlkZXMsIHBhZCwgZGlsYXRpb25zLCBkaW1Sb3VuZGluZ01vZGUpO1xuICAgICAgICBpZiAoYmlhcyAhPSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBiaWFzRGVyID0gZ2V0RnVzZWRCaWFzR3JhZGllbnQoJGJpYXMsIGR5QWN0aXZhdGlvbik7XG4gICAgICAgICAgICByZXR1cm4gW3hEZXIsIGZpbHRlckRlciwgYmlhc0Rlcl07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFt4RGVyLCBmaWx0ZXJEZXJdO1xuICAgIH07XG4gICAgY29uc3QgaW5wdXRzID0ge1xuICAgICAgICB4OiB4NEQsXG4gICAgICAgIGZpbHRlcjogJGZpbHRlcixcbiAgICAgICAgYmlhczogJGJpYXMsXG4gICAgICAgIHByZWx1QWN0aXZhdGlvbldlaWdodHM6ICRwcmVsdUFjdGl2YXRpb25XZWlnaHRzXG4gICAgfTtcbiAgICBjb25zdCBhdHRycyA9IHtcbiAgICAgICAgc3RyaWRlcyxcbiAgICAgICAgcGFkLFxuICAgICAgICBkYXRhRm9ybWF0LFxuICAgICAgICBkaWxhdGlvbnMsXG4gICAgICAgIGRpbVJvdW5kaW5nTW9kZSxcbiAgICAgICAgYWN0aXZhdGlvbixcbiAgICAgICAgbGVha3lyZWx1QWxwaGFcbiAgICB9O1xuICAgIC8vIERlcGVuZGluZyBvbiB0aGUgdGhlIHBhcmFtcyBwYXNzZWQgaW4gd2Ugd2lsbCBoYXZlIGRpZmZlcmVudCBudW1iZXIgb2ZcbiAgICAvLyBpbnB1dHMgYW5kIHRodXMgYSBhIGRpZmZlcmVudCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGdyYWRpZW50LlxuICAgIGlmIChiaWFzID09IG51bGwpIHtcbiAgICAgICAgY29uc3QgY3VzdG9tT3AgPSBjdXN0b21HcmFkKCh4NEQsIGZpbHRlciwgc2F2ZSkgPT4ge1xuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICAgICAgICAgICAgbGV0IHJlcyA9IEVOR0lORS5ydW5LZXJuZWwoRnVzZWREZXB0aHdpc2VDb252MkQsIGlucHV0cywgYXR0cnMpO1xuICAgICAgICAgICAgc2F2ZShbZmlsdGVyLCB4NEQsIHJlc10pO1xuICAgICAgICAgICAgaWYgKHJlc2hhcGVkVG80RCkge1xuICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgICAgICAgICAgICAgICByZXMgPSByZXNoYXBlKHJlcywgW3Jlcy5zaGFwZVsxXSwgcmVzLnNoYXBlWzJdLCByZXMuc2hhcGVbM11dKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiByZXMsIGdyYWRGdW5jOiBncmFkIH07XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY3VzdG9tT3AoeDRELCAkZmlsdGVyKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IGN1c3RvbU9wV2l0aEJpYXMgPSBjdXN0b21HcmFkKCh4NEQsIGZpbHRlciwgYmlhcywgc2F2ZSkgPT4ge1xuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICAgICAgICAgICAgbGV0IHJlcyA9IEVOR0lORS5ydW5LZXJuZWwoRnVzZWREZXB0aHdpc2VDb252MkQsIGlucHV0cywgYXR0cnMpO1xuICAgICAgICAgICAgc2F2ZShbZmlsdGVyLCB4NEQsIHJlcywgYmlhc10pO1xuICAgICAgICAgICAgaWYgKHJlc2hhcGVkVG80RCkge1xuICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgICAgICAgICAgICAgICByZXMgPSByZXNoYXBlKHJlcywgW3Jlcy5zaGFwZVsxXSwgcmVzLnNoYXBlWzJdLCByZXMuc2hhcGVbM11dKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiByZXMsIGdyYWRGdW5jOiBncmFkIH07XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY3VzdG9tT3BXaXRoQmlhcyh4NEQsICRmaWx0ZXIsICRiaWFzKTtcbiAgICB9XG59XG5leHBvcnQgY29uc3QgZGVwdGh3aXNlQ29udjJkID0gb3AoeyBmdXNlZERlcHRod2lzZUNvbnYyZF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZXB0aHdpc2VfY29udjJkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBjdXN0b21HcmFkIH0gZnJvbSAnLi4vLi4vZ3JhZGllbnRzJztcbmltcG9ydCB7IF9GdXNlZE1hdE11bCB9IGZyb20gJy4uLy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBtYWtlVHlwZXNNYXRjaCB9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHsgYWRkIH0gZnJvbSAnLi4vYWRkJztcbmltcG9ydCAqIGFzIGJyb2FkY2FzdF91dGlsIGZyb20gJy4uL2Jyb2FkY2FzdF91dGlsJztcbmltcG9ydCB7IGFwcGx5QWN0aXZhdGlvbiwgZ2V0RnVzZWRCaWFzR3JhZGllbnQsIGdldEZ1c2VkRHlBY3RpdmF0aW9uLCBzaG91bGRGdXNlIH0gZnJvbSAnLi4vZnVzZWRfdXRpbCc7XG5pbXBvcnQgeyBtYXRNdWwgYXMgdW5mdXNlZE1hdE11bCB9IGZyb20gJy4uL21hdF9tdWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4uL3Jlc2hhcGUnO1xuLyoqXG4gKiBDb21wdXRlcyB0aGUgZG90IHByb2R1Y3Qgb2YgdHdvIG1hdHJpY2VzIHdpdGggb3B0aW9uYWwgYWN0aXZhdGlvbiBhbmQgYmlhcy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjJkKFstMSwgLTJdLCBbMSwgMl0pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjJkKFsxLCAyLCAzLCA0XSwgWzIsIDJdKTtcbiAqIGNvbnN0IGJpYXMgPSB0Zi50ZW5zb3IyZChbMSwgMl0sIFsxLCAyXSk7XG4gKlxuICogdGYuZnVzZWQubWF0TXVsKHthLCBiLCBiaWFzLCBhY3RpdmF0aW9uOiAncmVsdSd9KS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIG9iaiBBbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKiAtIGBhYCBGaXJzdCBtYXRyaXggaW4gZG90IHByb2R1Y3Qgb3BlcmF0aW9uLlxuICogLSBgYmAgU2Vjb25kIG1hdHJpeCBpbiBkb3QgcHJvZHVjdCBvcGVyYXRpb24uXG4gKiAtIGB0cmFuc3Bvc2VBYCBJZiB0cnVlLCBgYWAgaXMgdHJhbnNwb3NlZCBiZWZvcmUgbXVsdGlwbGljYXRpb24uXG4gKiAtIGB0cmFuc3Bvc2VCYCBJZiB0cnVlLCBgYmAgaXMgdHJhbnNwb3NlZCBiZWZvcmUgbXVsdGlwbGljYXRpb24uXG4gKiAtIGBiaWFzYCBNYXRyaXggdG8gYmUgYWRkZWQgdG8gdGhlIHJlc3VsdC5cbiAqIC0gYGFjdGl2YXRpb25gIE5hbWUgb2YgYWN0aXZhdGlvbiBrZXJuZWwgKGRlZmF1bHRzIHRvIGBsaW5lYXJgKS5cbiAqIC0gYHByZWx1QWN0aXZhdGlvbldlaWdodHNgIFRlbnNvciBvZiBwcmVsdSB3ZWlnaHRzLlxuICogLSBgbGVha3lyZWx1QWxwaGFgIEFscGhhIG9mIGxlYWt5cmVsdS5cbiAqL1xuZnVuY3Rpb24gZnVzZWRNYXRNdWxfKHsgYSwgYiwgdHJhbnNwb3NlQSA9IGZhbHNlLCB0cmFuc3Bvc2VCID0gZmFsc2UsIGJpYXMsIGFjdGl2YXRpb24gPSAnbGluZWFyJywgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cywgbGVha3lyZWx1QWxwaGEsIH0pIHtcbiAgICBpZiAoc2hvdWxkRnVzZShFTkdJTkUuc3RhdGUuZ3JhZGllbnREZXB0aCwgYWN0aXZhdGlvbikgPT09IGZhbHNlKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB1bmZ1c2VkTWF0TXVsKGEsIGIsIHRyYW5zcG9zZUEsIHRyYW5zcG9zZUIpO1xuICAgICAgICBpZiAoYmlhcyAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBhZGQocmVzdWx0LCBiaWFzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXBwbHlBY3RpdmF0aW9uKHJlc3VsdCwgYWN0aXZhdGlvbiwgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cywgbGVha3lyZWx1QWxwaGEpO1xuICAgIH1cbiAgICBsZXQgJGEgPSBjb252ZXJ0VG9UZW5zb3IoYSwgJ2EnLCAnZnVzZWQgbWF0TXVsJyk7XG4gICAgbGV0ICRiID0gY29udmVydFRvVGVuc29yKGIsICdiJywgJ2Z1c2VkIG1hdE11bCcpO1xuICAgIFskYSwgJGJdID0gbWFrZVR5cGVzTWF0Y2goJGEsICRiKTtcbiAgICBjb25zdCBpbm5lclNoYXBlQSA9IHRyYW5zcG9zZUEgPyAkYS5zaGFwZVskYS5yYW5rIC0gMl0gOiAkYS5zaGFwZVskYS5yYW5rIC0gMV07XG4gICAgY29uc3QgaW5uZXJTaGFwZUIgPSB0cmFuc3Bvc2VCID8gJGIuc2hhcGVbJGIucmFuayAtIDFdIDogJGIuc2hhcGVbJGIucmFuayAtIDJdO1xuICAgIGNvbnN0IG91dGVyU2hhcGVBID0gdHJhbnNwb3NlQSA/ICRhLnNoYXBlWyRhLnJhbmsgLSAxXSA6ICRhLnNoYXBlWyRhLnJhbmsgLSAyXTtcbiAgICBjb25zdCBvdXRlclNoYXBlQiA9IHRyYW5zcG9zZUIgPyAkYi5zaGFwZVskYi5yYW5rIC0gMl0gOiAkYi5zaGFwZVskYi5yYW5rIC0gMV07XG4gICAgY29uc3Qgb3V0ZXJEaW1zQSA9ICRhLnNoYXBlLnNsaWNlKDAsIC0yKTtcbiAgICBjb25zdCBvdXRlckRpbXNCID0gJGIuc2hhcGUuc2xpY2UoMCwgLTIpO1xuICAgIGNvbnN0IGJhdGNoRGltQSA9IHV0aWwuc2l6ZUZyb21TaGFwZShvdXRlckRpbXNBKTtcbiAgICBjb25zdCBiYXRjaERpbUIgPSB1dGlsLnNpemVGcm9tU2hhcGUob3V0ZXJEaW1zQik7XG4gICAgdXRpbC5hc3NlcnQoJGEucmFuayA+PSAyICYmICRiLnJhbmsgPj0gMiAmJiAkYS5yYW5rID09PSAkYi5yYW5rLCAoKSA9PiBgRXJyb3IgaW4gZnVzZWQgbWF0TXVsOiBpbnB1dHMgbXVzdCBoYXZlIHRoZSBzYW1lIHJhbmsgb2YgYXQgYCArXG4gICAgICAgIGBsZWFzdCAyLCBnb3QgcmFua3MgJHskYS5yYW5rfSBhbmQgJHskYi5yYW5rfS5gKTtcbiAgICB1dGlsLmFzc2VydCh1dGlsLmFycmF5c0VxdWFsKG91dGVyRGltc0EsIG91dGVyRGltc0IpLCAoKSA9PiBgRXJyb3IgaW4gZnVzZWQgbWF0TXVsOiBvdXRlciBkaW1lbnNpb25zICgke291dGVyRGltc0F9KSBhbmQgKGAgK1xuICAgICAgICBgJHtvdXRlckRpbXNCfSkgb2YgVGVuc29ycyB3aXRoIHNoYXBlcyAkeyRhLnNoYXBlfSBhbmQgYCArXG4gICAgICAgIGAkeyRiLnNoYXBlfSBtdXN0IG1hdGNoLmApO1xuICAgIHV0aWwuYXNzZXJ0KGlubmVyU2hhcGVBID09PSBpbm5lclNoYXBlQiwgKCkgPT4gYEVycm9yIGluIGZ1c2VkIG1hdE11bDogaW5uZXIgc2hhcGVzICgke2lubmVyU2hhcGVBfSkgYW5kIChgICtcbiAgICAgICAgYCR7aW5uZXJTaGFwZUJ9KSBvZiBUZW5zb3JzIHdpdGggc2hhcGVzICR7JGEuc2hhcGV9IGFuZCBgICtcbiAgICAgICAgYCR7JGIuc2hhcGV9IGFuZCB0cmFuc3Bvc2VBPSR7dHJhbnNwb3NlQX1gICtcbiAgICAgICAgYCBhbmQgdHJhbnNwb3NlQj0ke3RyYW5zcG9zZUJ9IG11c3QgbWF0Y2guYCk7XG4gICAgY29uc3Qgb3V0U2hhcGUgPSAkYS5zaGFwZS5zbGljZSgwLCAtMikuY29uY2F0KFtvdXRlclNoYXBlQSwgb3V0ZXJTaGFwZUJdKTtcbiAgICBjb25zdCBhM0QgPSB0cmFuc3Bvc2VBID9cbiAgICAgICAgcmVzaGFwZSgkYSwgW2JhdGNoRGltQSwgaW5uZXJTaGFwZUEsIG91dGVyU2hhcGVBXSkgOlxuICAgICAgICByZXNoYXBlKCRhLCBbYmF0Y2hEaW1BLCBvdXRlclNoYXBlQSwgaW5uZXJTaGFwZUFdKTtcbiAgICBjb25zdCBiM0QgPSB0cmFuc3Bvc2VCID9cbiAgICAgICAgcmVzaGFwZSgkYiwgW2JhdGNoRGltQiwgb3V0ZXJTaGFwZUIsIGlubmVyU2hhcGVCXSkgOlxuICAgICAgICByZXNoYXBlKCRiLCBbYmF0Y2hEaW1CLCBpbm5lclNoYXBlQiwgb3V0ZXJTaGFwZUJdKTtcbiAgICBsZXQgJGJpYXM7XG4gICAgaWYgKGJpYXMgIT0gbnVsbCkge1xuICAgICAgICAkYmlhcyA9IGNvbnZlcnRUb1RlbnNvcihiaWFzLCAnYmlhcycsICdmdXNlZCBtYXRNdWwnKTtcbiAgICAgICAgWyRiaWFzXSA9IG1ha2VUeXBlc01hdGNoKCRiaWFzLCAkYSk7XG4gICAgICAgIGJyb2FkY2FzdF91dGlsLmFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKG91dFNoYXBlLCAkYmlhcy5zaGFwZSk7XG4gICAgfVxuICAgIGxldCAkcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cztcbiAgICBpZiAocHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyAhPSBudWxsKSB7XG4gICAgICAgICRwcmVsdUFjdGl2YXRpb25XZWlnaHRzID0gY29udmVydFRvVGVuc29yKHByZWx1QWN0aXZhdGlvbldlaWdodHMsICdwcmVsdSB3ZWlnaHRzJywgJ2Z1c2VkIG1hdE11bCcpO1xuICAgIH1cbiAgICBjb25zdCBncmFkID0gKGR5LCBzYXZlZCkgPT4ge1xuICAgICAgICBjb25zdCBbYTNELCBiM0QsIHksICRiaWFzXSA9IHNhdmVkO1xuICAgICAgICAvLyB3ZSByZXNoYXBlIGR5IGJlY2F1c2UgdGhlIHJlc3VsdCBvZiB0aGUgZm9yd2FyZCBpcyBub3RcbiAgICAgICAgLy8gbmVjZXNzYXJpbHkgZ29pbmcgdG8gYmUgYSAzZCB0ZW5zb3IgZHVlIHRvIGEgcmVzaGFwZSBkb25lIGF0IHRoZSBlbmQgb2ZcbiAgICAgICAgLy8gdGhlIGN1c3RvbU9wLlxuICAgICAgICBjb25zdCBkeUFjdGl2YXRpb24gPSBnZXRGdXNlZER5QWN0aXZhdGlvbihyZXNoYXBlKGR5LCB5LnNoYXBlKSwgeSwgYWN0aXZhdGlvbik7XG4gICAgICAgIGxldCBhRGVyO1xuICAgICAgICBsZXQgYkRlcjtcbiAgICAgICAgaWYgKCF0cmFuc3Bvc2VBICYmICF0cmFuc3Bvc2VCKSB7XG4gICAgICAgICAgICBhRGVyID0gdW5mdXNlZE1hdE11bChkeUFjdGl2YXRpb24sIGIzRCwgZmFsc2UsIHRydWUpO1xuICAgICAgICAgICAgYkRlciA9IHVuZnVzZWRNYXRNdWwoYTNELCBkeUFjdGl2YXRpb24sIHRydWUsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghdHJhbnNwb3NlQSAmJiB0cmFuc3Bvc2VCKSB7XG4gICAgICAgICAgICBhRGVyID0gdW5mdXNlZE1hdE11bChkeUFjdGl2YXRpb24sIGIzRCwgZmFsc2UsIGZhbHNlKTtcbiAgICAgICAgICAgIGJEZXIgPSB1bmZ1c2VkTWF0TXVsKGR5QWN0aXZhdGlvbiwgYTNELCB0cnVlLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHJhbnNwb3NlQSAmJiAhdHJhbnNwb3NlQikge1xuICAgICAgICAgICAgYURlciA9IHVuZnVzZWRNYXRNdWwoYjNELCBkeUFjdGl2YXRpb24sIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgICAgIGJEZXIgPSB1bmZ1c2VkTWF0TXVsKGEzRCwgZHlBY3RpdmF0aW9uLCBmYWxzZSwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYURlciA9IHVuZnVzZWRNYXRNdWwoYjNELCBkeUFjdGl2YXRpb24sIHRydWUsIHRydWUpO1xuICAgICAgICAgICAgYkRlciA9IHVuZnVzZWRNYXRNdWwoZHlBY3RpdmF0aW9uLCBhM0QsIHRydWUsIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiaWFzICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGJpYXNEZXIgPSBnZXRGdXNlZEJpYXNHcmFkaWVudCgkYmlhcywgZHlBY3RpdmF0aW9uKTtcbiAgICAgICAgICAgIHJldHVybiBbYURlciwgYkRlciwgYmlhc0Rlcl07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gW2FEZXIsIGJEZXJdO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25zdCBpbnB1dHMgPSB7XG4gICAgICAgIGE6IGEzRCxcbiAgICAgICAgYjogYjNELFxuICAgICAgICBiaWFzOiAkYmlhcyxcbiAgICAgICAgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0czogJHByZWx1QWN0aXZhdGlvbldlaWdodHNcbiAgICB9O1xuICAgIGNvbnN0IGF0dHJzID0geyB0cmFuc3Bvc2VBLCB0cmFuc3Bvc2VCLCBhY3RpdmF0aW9uLCBsZWFreXJlbHVBbHBoYSB9O1xuICAgIC8vIERlcGVuZGluZyBvbiB0aGUgdGhlIHBhcmFtcyBwYXNzZWQgaW4gd2Ugd2lsbCBoYXZlIGRpZmZlcmVudCBudW1iZXIgb2ZcbiAgICAvLyBpbnB1dHMgYW5kIHRodXMgYSBhIGRpZmZlcmVudCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGdyYWRpZW50LlxuICAgIGlmIChiaWFzID09IG51bGwpIHtcbiAgICAgICAgY29uc3QgY3VzdG9tT3AgPSBjdXN0b21HcmFkKChhM0QsIGIzRCwgc2F2ZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzID0gXG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgICAgICAgICBFTkdJTkUucnVuS2VybmVsKF9GdXNlZE1hdE11bCwgaW5wdXRzLCBhdHRycyk7XG4gICAgICAgICAgICBzYXZlKFthM0QsIGIzRCwgcmVzXSk7XG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogcmVzaGFwZShyZXMsIG91dFNoYXBlKSwgZ3JhZEZ1bmM6IGdyYWQgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjdXN0b21PcChhM0QsIGIzRCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBjdXN0b21PcFdpdGhCaWFzID0gY3VzdG9tR3JhZCgoYTNELCBiM0QsICRiaWFzLCBzYXZlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXMgPSBcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgICAgICAgICAgIEVOR0lORS5ydW5LZXJuZWwoX0Z1c2VkTWF0TXVsLCBpbnB1dHMsIGF0dHJzKTtcbiAgICAgICAgICAgIHNhdmUoW2EzRCwgYjNELCByZXMsICRiaWFzXSk7XG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogcmVzaGFwZShyZXMsIG91dFNoYXBlKSwgZ3JhZEZ1bmM6IGdyYWQgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjdXN0b21PcFdpdGhCaWFzKGEzRCwgYjNELCAkYmlhcyk7XG4gICAgfVxufVxuZXhwb3J0IGNvbnN0IG1hdE11bCA9IG9wKHsgZnVzZWRNYXRNdWxfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWF0X211bC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBjb252MmQgfSBmcm9tICcuL2Z1c2VkL2NvbnYyZCc7XG5pbXBvcnQgeyBkZXB0aHdpc2VDb252MmQgfSBmcm9tICcuL2Z1c2VkL2RlcHRod2lzZV9jb252MmQnO1xuaW1wb3J0IHsgbWF0TXVsIH0gZnJvbSAnLi9mdXNlZC9tYXRfbXVsJztcbmV4cG9ydCB7IGNvbnYyZCwgZGVwdGh3aXNlQ29udjJkLCBtYXRNdWwgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZ1c2VkX29wcy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgKiBhcyBicm9hZGNhc3RfdXRpbCBmcm9tICcuL2Jyb2FkY2FzdF91dGlsJztcbmltcG9ydCB7IGVsdSB9IGZyb20gJy4vZWx1JztcbmltcG9ydCB7IGxlYWt5UmVsdSB9IGZyb20gJy4vbGVha3lfcmVsdSc7XG5pbXBvcnQgeyBtdWwgfSBmcm9tICcuL211bCc7XG5pbXBvcnQgeyBwcmVsdSB9IGZyb20gJy4vcHJlbHUnO1xuaW1wb3J0IHsgcmVsdSB9IGZyb20gJy4vcmVsdSc7XG5pbXBvcnQgeyByZWx1NiB9IGZyb20gJy4vcmVsdTYnO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vcmVzaGFwZSc7XG5pbXBvcnQgeyBzaWdtb2lkIH0gZnJvbSAnLi9zaWdtb2lkJztcbmltcG9ydCB7IHN0ZXAgfSBmcm9tICcuL3N0ZXAnO1xuaW1wb3J0IHsgc3VtIH0gZnJvbSAnLi9zdW0nO1xuLy8gUmV0dXJucyBncmFkaWVudCBmb3IgZnVzZWQgYWN0aXZhdGlvbi5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGdXNlZER5QWN0aXZhdGlvbihkeSwgeSwgYWN0aXZhdGlvbikge1xuICAgIGlmIChhY3RpdmF0aW9uID09IG51bGwgfHwgYWN0aXZhdGlvbiA9PT0gJ2xpbmVhcicpIHtcbiAgICAgICAgcmV0dXJuIGR5O1xuICAgIH1cbiAgICBpZiAoYWN0aXZhdGlvbiA9PT0gJ3JlbHUnKSB7XG4gICAgICAgIHJldHVybiBtdWwoZHksIHN0ZXAoeSkpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjb21wdXRlIGdyYWRpZW50IGZvciBmdXNlZCBhY3RpdmF0aW9uICR7YWN0aXZhdGlvbn0uYCk7XG59XG4vLyBSZXR1cm5zIGdyYWRpZW50IGZvciBmdXNlZCBiaWFzLlxuZXhwb3J0IGZ1bmN0aW9uIGdldEZ1c2VkQmlhc0dyYWRpZW50KGJpYXMsIGR5QWN0aXZhdGlvbikge1xuICAgIGxldCByZXMgPSBkeUFjdGl2YXRpb247XG4gICAgY29uc3QgcmVkdWNlQXhlcyA9IGJyb2FkY2FzdF91dGlsLmdldFJlZHVjdGlvbkF4ZXMoYmlhcy5zaGFwZSwgZHlBY3RpdmF0aW9uLnNoYXBlKTtcbiAgICBpZiAocmVkdWNlQXhlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlcyA9IHN1bShyZXMsIHJlZHVjZUF4ZXMpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzaGFwZShyZXMsIGJpYXMuc2hhcGUpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5QWN0aXZhdGlvbih4LCBhY3RpdmF0aW9uLCBwcmVsdUFjdGl2YXRpb25XZWlnaHRzLCBsZWFreXJlbHVBbHBoYSkge1xuICAgIGlmIChhY3RpdmF0aW9uID09PSAnbGluZWFyJykge1xuICAgICAgICByZXR1cm4geDtcbiAgICB9XG4gICAgZWxzZSBpZiAoYWN0aXZhdGlvbiA9PT0gJ3JlbHUnKSB7XG4gICAgICAgIHJldHVybiByZWx1KHgpO1xuICAgIH1cbiAgICBlbHNlIGlmIChhY3RpdmF0aW9uID09PSAnZWx1Jykge1xuICAgICAgICByZXR1cm4gZWx1KHgpO1xuICAgIH1cbiAgICBlbHNlIGlmIChhY3RpdmF0aW9uID09PSAncmVsdTYnKSB7XG4gICAgICAgIHJldHVybiByZWx1Nih4KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYWN0aXZhdGlvbiA9PT0gJ3ByZWx1Jykge1xuICAgICAgICByZXR1cm4gcHJlbHUoeCwgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFjdGl2YXRpb24gPT09ICdsZWFreXJlbHUnKSB7XG4gICAgICAgIHJldHVybiBsZWFreVJlbHUoeCwgbGVha3lyZWx1QWxwaGEpO1xuICAgIH1cbiAgICBlbHNlIGlmIChhY3RpdmF0aW9uID09PSAnc2lnbW9pZCcpIHtcbiAgICAgICAgcmV0dXJuIHNpZ21vaWQoeCk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBmdXNlZCBhY3RpdmF0aW9uICR7YWN0aXZhdGlvbn0uYCk7XG59XG4vLyBXaGV0aGVyIHdlIHNob3VsZCBjYWxsIGZ1c2VkIG9wcy5cbmV4cG9ydCBjb25zdCBzaG91bGRGdXNlID0gKGdyYWRpZW50RGVwdGgsIGFjdGl2YXRpb24pID0+IHtcbiAgICBjb25zdCBncmFkaWVudE1vZGUgPSBncmFkaWVudERlcHRoID4gMDtcbiAgICByZXR1cm4gIWdyYWRpZW50TW9kZSB8fCBhY3RpdmF0aW9uID09PSAnbGluZWFyJztcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mdXNlZF91dGlsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBHYXRoZXJWMiB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIEdhdGhlciBzbGljZXMgZnJvbSB0ZW5zb3IgYHhgJ3MgYXhpcyBgYXhpc2AgYWNjb3JkaW5nIHRvIGBpbmRpY2VzYC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzLCA0XSk7XG4gKiBjb25zdCBpbmRpY2VzID0gdGYudGVuc29yMWQoWzEsIDMsIDNdLCAnaW50MzInKTtcbiAqXG4gKiB4LmdhdGhlcihpbmRpY2VzKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IyZChbMSwgMiwgMywgNF0sIFsyLCAyXSk7XG4gKiBjb25zdCBpbmRpY2VzID0gdGYudGVuc29yMWQoWzEsIDEsIDBdLCAnaW50MzInKTtcbiAqXG4gKiB4LmdhdGhlcihpbmRpY2VzKS5wcmludCgpO1xuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yIHdob3NlIHNsaWNlcyB0byBiZSBnYXRoZXJlZC5cbiAqIEBwYXJhbSBpbmRpY2VzIFRoZSBpbmRpY2VzIG9mIHRoZSB2YWx1ZXMgdG8gZXh0cmFjdC5cbiAqIEBwYXJhbSBheGlzIFRoZSBheGlzIG92ZXIgd2hpY2ggdG8gc2VsZWN0IHZhbHVlcy4gRGVmYXVsdHMgdG8gMC5cbiAqIEBwYXJhbSBiYXRjaERpbXMgT3B0aW9uYWwuIFRoZSBudW1iZXIgb2YgYmF0Y2ggZGltZW5zaW9ucy4gSXQgbXVzdCBiZSBsZXNzXG4gKiAgICAgdGhhbiBvciBlcXVhbCB0byByYW5rKGluZGljZXMpLiBEZWZhdWx0cyB0byAwLlxuICogICAgIFRoZSBvdXRwdXQgdGVuc29yIHdpbGwgaGF2ZSBzaGFwZSBvZlxuICogICAgIGB4LnNoYXBlWzpheGlzXSArIGluZGljZXMuc2hhcGVbYmF0Y2hEaW1zOl0gKyB4LnNoYXBlW2F4aXMgKyAxOl1gXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnU2xpY2luZyBhbmQgSm9pbmluZyd9XG4gKi9cbmZ1bmN0aW9uIGdhdGhlcl8oeCwgaW5kaWNlcywgYXhpcyA9IDAsIGJhdGNoRGltcyA9IDApIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdnYXRoZXInKTtcbiAgICBjb25zdCAkaW5kaWNlcyA9IGNvbnZlcnRUb1RlbnNvcihpbmRpY2VzLCAnaW5kaWNlcycsICdnYXRoZXInLCAnaW50MzInKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IHg6ICR4LCBpbmRpY2VzOiAkaW5kaWNlcyB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBheGlzLCBiYXRjaERpbXMgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChHYXRoZXJWMiwgaW5wdXRzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3QgZ2F0aGVyID0gb3AoeyBnYXRoZXJfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2F0aGVyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBHYXRoZXJOZCB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIEdhdGhlciBzbGljZXMgZnJvbSBpbnB1dCB0ZW5zb3IgaW50byBhIFRlbnNvciB3aXRoIHNoYXBlIHNwZWNpZmllZCBieVxuICogYGluZGljZXNgLlxuICpcbiAqIGBpbmRpY2VzYCBpcyBhbiBLLWRpbWVuc2lvbmFsIGludGVnZXIgdGVuc29yLCBiZXN0IHRob3VnaHQgb2YgYXMgYVxuICogKEstMSktZGltZW5zaW9uYWwgdGVuc29yIG9mIGluZGljZXMgaW50byBpbnB1dCwgd2hlcmUgZWFjaCBlbGVtZW50IGRlZmluZXMgYVxuICogc2xpY2Ugb2YgaW5wdXQ6XG4gKiBvdXRwdXRbXFxcXChpXzAsIC4uLiwgaV97Sy0yfVxcXFwpXSA9IGlucHV0W2luZGljZXNbXFxcXChpXzAsIC4uLiwgaV97Sy0yfVxcXFwpXV1cbiAqXG4gKiBXaGVyZWFzIGluIGB0Zi5nYXRoZXJgLCBgaW5kaWNlc2AgZGVmaW5lcyBzbGljZXMgaW50byB0aGUgZmlyc3QgZGltZW5zaW9uIG9mXG4gKiBpbnB1dCwgaW4gYHRmLmdhdGhlck5EYCwgYGluZGljZXNgIGRlZmluZXMgc2xpY2VzIGludG8gdGhlIGZpcnN0IE4gZGltZW5zaW9uc1xuICogb2YgaW5wdXQsIHdoZXJlIE4gPSBpbmRpY2VzLnNoYXBlWy0xXS5cbiAqXG4gKiBUaGUgbGFzdCBkaW1lbnNpb24gb2YgaW5kaWNlcyBjYW4gYmUgYXQgbW9zdCB0aGUgcmFuayBvZiBpbnB1dDpcbiAqIGluZGljZXMuc2hhcGVbLTFdIDw9IGlucHV0LnJhbmtcbiAqXG4gKiBUaGUgbGFzdCBkaW1lbnNpb24gb2YgYGluZGljZXNgIGNvcnJlc3BvbmRzIHRvIGVsZW1lbnRzXG4gKiAoaWYgaW5kaWNlcy5zaGFwZVstMV0gPT0gaW5wdXQucmFuaykgb3Igc2xpY2VzXG4gKiAoaWYgaW5kaWNlcy5zaGFwZVstMV0gPCBpbnB1dC5yYW5rKSBhbG9uZyBkaW1lbnNpb24gaW5kaWNlcy5zaGFwZVstMV0gb2ZcbiAqIGlucHV0LlxuICogVGhlIG91dHB1dCB0ZW5zb3IgaGFzIHNoYXBlXG4gKiBpbmRpY2VzLnNoYXBlWzotMV0gKyBpbnB1dC5zaGFwZVtpbmRpY2VzLnNoYXBlWy0xXTpdXG4gKlxuICogTm90ZSB0aGF0IG9uIENQVSwgaWYgYW4gb3V0IG9mIGJvdW5kIGluZGV4IGlzIGZvdW5kLCBhbiBlcnJvciBpcyByZXR1cm5lZC4gT25cbiAqIEdQVSwgaWYgYW4gb3V0IG9mIGJvdW5kIGluZGV4IGlzIGZvdW5kLCBhIDAgaXMgc3RvcmVkIGluIHRoZSBjb3JyZXNwb25kaW5nXG4gKiBvdXRwdXQgdmFsdWUuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGluZGljZXMgPSB0Zi50ZW5zb3IyZChbMCwgMSwgMSwgMF0sIFsyLDJdLCAnaW50MzInKTtcbiAqIGNvbnN0IGlucHV0ID0gdGYudGVuc29yMmQoWzksIDEwLCAxMSwgMTJdLCBbMiwgMl0pO1xuICogdGYuZ2F0aGVyTkQoaW5wdXQsIGluZGljZXMpLnByaW50KCkgLy8gWzEwLCAxMV1cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB4IFRoZSB0ZW5zb3IgZnJvbSB3aGljaCB0byBnYXRoZXIgdmFsdWVzLlxuICogQHBhcmFtIGluZGljZXMgSW5kZXggdGVuc29yLCBtdXN0IGJlIG9mIHR5cGUgaW50MzIuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnU2xpY2luZyBhbmQgSm9pbmluZyd9XG4gKi9cbmZ1bmN0aW9uIGdhdGhlck5EXyh4LCBpbmRpY2VzKSB7XG4gICAgY29uc3QgJGluZGljZXMgPSBjb252ZXJ0VG9UZW5zb3IoaW5kaWNlcywgJ2luZGljZXMnLCAnZ2F0aGVyTkQnLCAnaW50MzInKTtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdnYXRoZXJORCcsICdzdHJpbmdfb3JfbnVtZXJpYycpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgcGFyYW1zOiAkeCwgaW5kaWNlczogJGluZGljZXMgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChHYXRoZXJOZCwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBnYXRoZXJORCA9IG9wKHsgZ2F0aGVyTkRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2F0aGVyX25kLmpzLm1hcCIsImltcG9ydCB7IGNvbXB1dGVTdHJpZGVzLCBzaXplRnJvbVNoYXBlIH0gZnJvbSAnLi4vdXRpbCc7XG4vKipcbiAqIFZhbGlkYXRlIGdhdGhlciBuZCBpbnB1dHMuXG4gKlxuICogQHBhcmFtIHRlbnNvciBUaGUgdGVuc29yIGNvbnRhaW5zIHRoZSBzb3VyY2UgdmFsdWVzLlxuICogQHBhcmFtIGluZGljZXMgVGhlIHRlbnNvciBjb250YWlucyB0aGUgaW5kaWNlcyB0byBzbGljZSB0aGUgc291cmNlLlxuICpcbiAqIEByZXR1cm5zIFtyZXN1bHRTaGFwZSwgbnVtVXBkYXRlcywgc2xpY2VTaXplLCBzdHJpZGVzXVxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZUFuZFZhbGlkYXRlKHRlbnNvciwgaW5kaWNlcykge1xuICAgIGNvbnN0IHRlbnNvclJhbmsgPSB0ZW5zb3Iuc2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IGluZGljZXNSYW5rID0gaW5kaWNlcy5zaGFwZS5sZW5ndGg7XG4gICAgaWYgKHRlbnNvclJhbmsgPCAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndGYuZ2F0aGVyTkQoKSBleHBlY3RzIHRoZSBpbnB1dCB0byBiZSByYW5rIDEgb3IgaGlnaGVyLCcgK1xuICAgICAgICAgICAgYCBidXQgdGhlIHJhbmsgd2FzICR7dGVuc29yUmFua30uYCk7XG4gICAgfVxuICAgIGlmIChpbmRpY2VzUmFuayA8IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0Zi5nYXRoZXJORCgpIGV4cGVjdHMgdGhlIGluZGljZXMgdG8gYmUgcmFuayAxIG9yIGhpZ2hlciwnICtcbiAgICAgICAgICAgIGAgYnV0IHRoZSByYW5rIHdhcyAke2luZGljZXNSYW5rfS5gKTtcbiAgICB9XG4gICAgaWYgKGluZGljZXMuZHR5cGUgIT09ICdpbnQzMicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0Zi5nYXRoZXJORCgpIGV4cGVjdHMgdGhlIGluZGljZXMgdG8gYmUgaW50MzIgdHlwZSwnICtcbiAgICAgICAgICAgIGAgYnV0IHRoZSBkdHlwZSB3YXMgJHtpbmRpY2VzLmR0eXBlfS5gKTtcbiAgICB9XG4gICAgaWYgKGluZGljZXMuc2hhcGVbaW5kaWNlc1JhbmsgLSAxXSA+IHRlbnNvclJhbmspIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbmRleCBpbm5lcm1vc3QgZGltZW5zaW9uIGxlbmd0aCBtdXN0IGJlIDw9IHRlbnNvciByYW5rOyBzYXc6ICcgK1xuICAgICAgICAgICAgYCR7aW5kaWNlcy5zaGFwZVtpbmRpY2VzUmFuayAtIDFdfSB2cy4gJHt0ZW5zb3JSYW5rfWApO1xuICAgIH1cbiAgICBpZiAoc2l6ZUZyb21TaGFwZSh0ZW5zb3Iuc2hhcGUpID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWVzdGVkIG1vcmUgdGhhbiAwIGVudHJpZXMsIGJ1dCBpbnB1dCBpcyBlbXB0eS4nICtcbiAgICAgICAgICAgIGAgSW5wdXQgc2hhcGU6ICR7dGVuc29yLnNoYXBlfS5gKTtcbiAgICB9XG4gICAgY29uc3QgaW5kaWNlc1NoYXBlID0gaW5kaWNlcy5zaGFwZTtcbiAgICBjb25zdCBzbGljZVJhbmsgPSBpbmRpY2VzU2hhcGVbaW5kaWNlc1NoYXBlLmxlbmd0aCAtIDFdO1xuICAgIC8vIFRoZSByZXN1bHQgc2hhcGUgaXNcbiAgICAvLyAgIGluZGljZXMuc2hhcGVbOi0xXSArIHBhcmFtcy5zaGFwZVtpbmRpY2VzLnNoYXBlWy0xXTpdXG4gICAgbGV0IG5SZXN1bHQgPSAxO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5kaWNlc1NoYXBlLmxlbmd0aCAtIDE7ICsraSkge1xuICAgICAgICBuUmVzdWx0ICo9IGluZGljZXNTaGFwZVtpXTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRTaGFwZSA9IHRlbnNvci5zaGFwZTtcbiAgICBjb25zdCByZXN1bHRTaGFwZSA9IGluZGljZXNTaGFwZS5zbGljZSgpO1xuICAgIHJlc3VsdFNoYXBlLnBvcCgpO1xuICAgIGxldCBzbGljZVNpemUgPSAxO1xuICAgIGZvciAobGV0IGkgPSBzbGljZVJhbms7IGkgPCB0ZW5zb3JSYW5rOyArK2kpIHtcbiAgICAgICAgc2xpY2VTaXplICo9IGlucHV0U2hhcGVbaV07XG4gICAgICAgIHJlc3VsdFNoYXBlLnB1c2goaW5wdXRTaGFwZVtpXSk7XG4gICAgfVxuICAgIGNvbnN0IHN0cmlkZXMgPSBbLi4uY29tcHV0ZVN0cmlkZXModGVuc29yLnNoYXBlKS5tYXAoc3RyaWRlID0+IHN0cmlkZSAvIHNsaWNlU2l6ZSksXG4gICAgICAgIDFdLnNsaWNlKDAsIHNsaWNlUmFuayk7XG4gICAgcmV0dXJuIFtyZXN1bHRTaGFwZSwgblJlc3VsdCwgc2xpY2VTaXplLCBzdHJpZGVzXTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdhdGhlcl9uZF91dGlsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBHcmVhdGVyIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IG1ha2VUeXBlc01hdGNoIH0gZnJvbSAnLi4vdGVuc29yX3V0aWwnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IGFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlIH0gZnJvbSAnLi9icm9hZGNhc3RfdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogUmV0dXJucyB0aGUgdHJ1dGggdmFsdWUgb2YgKGEgPiBiKSBlbGVtZW50LXdpc2UuIFN1cHBvcnRzIGJyb2FkY2FzdGluZy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzXSk7XG4gKiBjb25zdCBiID0gdGYudGVuc29yMWQoWzIsIDIsIDJdKTtcbiAqXG4gKiBhLmdyZWF0ZXIoYikucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCBpbnB1dCB0ZW5zb3IuXG4gKiBAcGFyYW0gYiBUaGUgc2Vjb25kIGlucHV0IHRlbnNvci4gTXVzdCBoYXZlIHRoZSBzYW1lIGR0eXBlIGFzIGBhYC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdMb2dpY2FsJ31cbiAqL1xuZnVuY3Rpb24gZ3JlYXRlcl8oYSwgYikge1xuICAgIGxldCAkYSA9IGNvbnZlcnRUb1RlbnNvcihhLCAnYScsICdncmVhdGVyJywgJ3N0cmluZ19vcl9udW1lcmljJyk7XG4gICAgbGV0ICRiID0gY29udmVydFRvVGVuc29yKGIsICdiJywgJ2dyZWF0ZXInLCAnc3RyaW5nX29yX251bWVyaWMnKTtcbiAgICBbJGEsICRiXSA9IG1ha2VUeXBlc01hdGNoKCRhLCAkYik7XG4gICAgYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoJGEuc2hhcGUsICRiLnNoYXBlKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IGE6ICRhLCBiOiAkYiB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEdyZWF0ZXIsIGlucHV0cyk7XG59XG5leHBvcnQgY29uc3QgZ3JlYXRlciA9IG9wKHsgZ3JlYXRlcl8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ncmVhdGVyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBHcmVhdGVyRXF1YWwgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgbWFrZVR5cGVzTWF0Y2ggfSBmcm9tICcuLi90ZW5zb3JfdXRpbCc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUgfSBmcm9tICcuL2Jyb2FkY2FzdF91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSB0cnV0aCB2YWx1ZSBvZiAoYSA+PSBiKSBlbGVtZW50LXdpc2UuIFN1cHBvcnRzIGJyb2FkY2FzdGluZy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzXSk7XG4gKiBjb25zdCBiID0gdGYudGVuc29yMWQoWzIsIDIsIDJdKTtcbiAqXG4gKiBhLmdyZWF0ZXJFcXVhbChiKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGEgVGhlIGZpcnN0IGlucHV0IHRlbnNvci5cbiAqIEBwYXJhbSBiIFRoZSBzZWNvbmQgaW5wdXQgdGVuc29yLiBNdXN0IGhhdmUgdGhlIHNhbWUgZHR5cGUgYXMgYGFgLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0xvZ2ljYWwnfVxuICovXG5mdW5jdGlvbiBncmVhdGVyRXF1YWxfKGEsIGIpIHtcbiAgICBsZXQgJGEgPSBjb252ZXJ0VG9UZW5zb3IoYSwgJ2EnLCAnZ3JlYXRlckVxdWFsJywgJ3N0cmluZ19vcl9udW1lcmljJyk7XG4gICAgbGV0ICRiID0gY29udmVydFRvVGVuc29yKGIsICdiJywgJ2dyZWF0ZXJFcXVhbCcsICdzdHJpbmdfb3JfbnVtZXJpYycpO1xuICAgIFskYSwgJGJdID0gbWFrZVR5cGVzTWF0Y2goJGEsICRiKTtcbiAgICBhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSgkYS5zaGFwZSwgJGIuc2hhcGUpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgYTogJGEsIGI6ICRiIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoR3JlYXRlckVxdWFsLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IGdyZWF0ZXJFcXVhbCA9IG9wKHsgZ3JlYXRlckVxdWFsXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdyZWF0ZXJfZXF1YWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IEltYWcgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSBpbWFnaW5hcnkgcGFydCBvZiBhIGNvbXBsZXggKG9yIHJlYWwpIHRlbnNvci5cbiAqXG4gKiBHaXZlbiBhIHRlbnNvciBpbnB1dCwgdGhpcyBvcGVyYXRpb24gcmV0dXJucyBhIHRlbnNvciBvZiB0eXBlIGZsb2F0IHRoYXQgaXNcbiAqIHRoZSBpbWFnaW5hcnkgcGFydCBvZiBlYWNoIGVsZW1lbnQgaW4gaW5wdXQgY29uc2lkZXJlZCBhcyBhIGNvbXBsZXggbnVtYmVyLlxuICogSWYgaW5wdXQgaXMgcmVhbCwgYSB0ZW5zb3Igb2YgYWxsIHplcm9zIGlzIHJldHVybmVkLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYuY29tcGxleChbLTIuMjUsIDMuMjVdLCBbNC43NSwgNS43NV0pO1xuICogdGYuaW1hZyh4KS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ3JlYXRpb24nfVxuICovXG5mdW5jdGlvbiBpbWFnXyhpbnB1dCkge1xuICAgIGNvbnN0ICRpbnB1dCA9IGNvbnZlcnRUb1RlbnNvcihpbnB1dCwgJ2lucHV0JywgJ2ltYWcnKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IGlucHV0OiAkaW5wdXQgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChJbWFnLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IGltYWcgPSBvcCh7IGltYWdfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW1hZy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi8uLi9lbmdpbmUnO1xuaW1wb3J0IHsgQ3JvcEFuZFJlc2l6ZSB9IGZyb20gJy4uLy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbi8qKlxuICogRXh0cmFjdHMgY3JvcHMgZnJvbSB0aGUgaW5wdXQgaW1hZ2UgdGVuc29yIGFuZCByZXNpemVzIHRoZW0gdXNpbmcgYmlsaW5lYXJcbiAqIHNhbXBsaW5nIG9yIG5lYXJlc3QgbmVpZ2hib3Igc2FtcGxpbmcgKHBvc3NpYmx5IHdpdGggYXNwZWN0IHJhdGlvIGNoYW5nZSlcbiAqIHRvIGEgY29tbW9uIG91dHB1dCBzaXplIHNwZWNpZmllZCBieSBjcm9wU2l6ZS5cbiAqXG4gKiBAcGFyYW0gaW1hZ2UgNGQgdGVuc29yIG9mIHNoYXBlIGBbYmF0Y2gsaW1hZ2VIZWlnaHQsaW1hZ2VXaWR0aCwgZGVwdGhdYCxcbiAqICAgICB3aGVyZSBpbWFnZUhlaWdodCBhbmQgaW1hZ2VXaWR0aCBtdXN0IGJlIHBvc2l0aXZlLCBzcGVjaWZ5aW5nIHRoZVxuICogICAgIGJhdGNoIG9mIGltYWdlcyBmcm9tIHdoaWNoIHRvIHRha2UgY3JvcHNcbiAqIEBwYXJhbSBib3hlcyAyZCBmbG9hdDMyIHRlbnNvciBvZiBzaGFwZSBgW251bUJveGVzLCA0XWAuIEVhY2ggZW50cnkgaXNcbiAqICAgICBgW3kxLCB4MSwgeTIsIHgyXWAsIHdoZXJlIGAoeTEsIHgxKWAgYW5kIGAoeTIsIHgyKWAgYXJlIHRoZSBub3JtYWxpemVkXG4gKiAgICAgY29vcmRpbmF0ZXMgb2YgdGhlIGJveCBpbiB0aGUgYm94SW5kW2ldJ3RoIGltYWdlIGluIHRoZSBiYXRjaFxuICogQHBhcmFtIGJveEluZCAxZCBpbnQzMiB0ZW5zb3Igb2Ygc2hhcGUgYFtudW1Cb3hlc11gIHdpdGggdmFsdWVzIGluIHJhbmdlXG4gKiAgICAgYFswLCBiYXRjaClgIHRoYXQgc3BlY2lmaWVzIHRoZSBpbWFnZSB0aGF0IHRoZSBgaWAtdGggYm94IHJlZmVycyB0by5cbiAqIEBwYXJhbSBjcm9wU2l6ZSAxZCBpbnQzMiB0ZW5zb3Igb2YgMiBlbGVtZW50cyBgW2Nyb3BIZWlnaCwgY3JvcFdpZHRoXWBcbiAqICAgICBzcGVjaWZ5aW5nIHRoZSBzaXplIHRvIHdoaWNoIGFsbCBjcm9wcyBhcmUgcmVzaXplZCB0by5cbiAqIEBwYXJhbSBtZXRob2QgT3B0aW9uYWwgc3RyaW5nIGZyb20gYCdiaWxpbmVhcicgfCAnbmVhcmVzdCdgLFxuICogICAgIGRlZmF1bHRzIHRvIGJpbGluZWFyLCB3aGljaCBzcGVjaWZpZXMgdGhlIHNhbXBsaW5nIG1ldGhvZCBmb3IgcmVzaXppbmdcbiAqIEBwYXJhbSBleHRyYXBvbGF0aW9uVmFsdWUgQSB0aHJlc2hvbGQgZm9yIGRlY2lkaW5nIHdoZW4gdG8gcmVtb3ZlIGJveGVzIGJhc2VkXG4gKiAgICAgb24gc2NvcmUuIERlZmF1bHRzIHRvIDAuXG4gKiBAcmV0dXJuIEEgNEQgdGVuc29yIG9mIHRoZSBzaGFwZSBgW251bUJveGVzLGNyb3BIZWlnaHQsY3JvcFdpZHRoLGRlcHRoXWBcbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdJbWFnZXMnLCBuYW1lc3BhY2U6ICdpbWFnZSd9XG4gKi9cbmZ1bmN0aW9uIGNyb3BBbmRSZXNpemVfKGltYWdlLCBib3hlcywgYm94SW5kLCBjcm9wU2l6ZSwgbWV0aG9kID0gJ2JpbGluZWFyJywgZXh0cmFwb2xhdGlvblZhbHVlID0gMCkge1xuICAgIGNvbnN0ICRpbWFnZSA9IGNvbnZlcnRUb1RlbnNvcihpbWFnZSwgJ2ltYWdlJywgJ2Nyb3BBbmRSZXNpemUnKTtcbiAgICBjb25zdCAkYm94ZXMgPSBjb252ZXJ0VG9UZW5zb3IoYm94ZXMsICdib3hlcycsICdjcm9wQW5kUmVzaXplJywgJ2Zsb2F0MzInKTtcbiAgICBjb25zdCAkYm94SW5kID0gY29udmVydFRvVGVuc29yKGJveEluZCwgJ2JveEluZCcsICdjcm9wQW5kUmVzaXplJywgJ2ludDMyJyk7XG4gICAgY29uc3QgbnVtQm94ZXMgPSAkYm94ZXMuc2hhcGVbMF07XG4gICAgdXRpbC5hc3NlcnQoJGltYWdlLnJhbmsgPT09IDQsICgpID0+ICdFcnJvciBpbiBjcm9wQW5kUmVzaXplOiBpbWFnZSBtdXN0IGJlIHJhbmsgNCwnICtcbiAgICAgICAgYGJ1dCBnb3QgcmFuayAkeyRpbWFnZS5yYW5rfS5gKTtcbiAgICB1dGlsLmFzc2VydCgkYm94ZXMucmFuayA9PT0gMiAmJiAkYm94ZXMuc2hhcGVbMV0gPT09IDQsICgpID0+IGBFcnJvciBpbiBjcm9wQW5kUmVzaXplOiBib3hlcyBtdXN0IGJlIGhhdmUgc2l6ZSBbJHtudW1Cb3hlc30sNF0gYCArXG4gICAgICAgIGBidXQgaGFkIHNoYXBlICR7JGJveGVzLnNoYXBlfS5gKTtcbiAgICB1dGlsLmFzc2VydCgkYm94SW5kLnJhbmsgPT09IDEgJiYgJGJveEluZC5zaGFwZVswXSA9PT0gbnVtQm94ZXMsICgpID0+IGBFcnJvciBpbiBjcm9wQW5kUmVzaXplOiBib3hJbmQgbXVzdCBiZSBoYXZlIHNpemUgWyR7bnVtQm94ZXN9XSBgICtcbiAgICAgICAgYGJ1dCBoYWQgc2hhcGUgJHskYm94ZXMuc2hhcGV9LmApO1xuICAgIHV0aWwuYXNzZXJ0KGNyb3BTaXplLmxlbmd0aCA9PT0gMiwgKCkgPT4gYEVycm9yIGluIGNyb3BBbmRSZXNpemU6IGNyb3BTaXplIG11c3QgYmUgb2YgbGVuZ3RoIDIsIGJ1dCBnb3QgYCArXG4gICAgICAgIGBsZW5ndGggJHtjcm9wU2l6ZS5sZW5ndGh9LmApO1xuICAgIHV0aWwuYXNzZXJ0KGNyb3BTaXplWzBdID49IDEgJiYgY3JvcFNpemVbMV0gPj0gMSwgKCkgPT4gYGNyb3BTaXplIG11c3QgYmUgYXRsZWFzdCBbMSwxXSwgYnV0IHdhcyAke2Nyb3BTaXplfWApO1xuICAgIHV0aWwuYXNzZXJ0KG1ldGhvZCA9PT0gJ2JpbGluZWFyJyB8fCBtZXRob2QgPT09ICduZWFyZXN0JywgKCkgPT4gYG1ldGhvZCBtdXN0IGJlIGJpbGluZWFyIG9yIG5lYXJlc3QsIGJ1dCB3YXMgJHttZXRob2R9YCk7XG4gICAgY29uc3QgaW5wdXRzID0geyBpbWFnZTogJGltYWdlLCBib3hlczogJGJveGVzLCBib3hJbmQ6ICRib3hJbmQgfTtcbiAgICBjb25zdCBhdHRycyA9IHsgbWV0aG9kLCBleHRyYXBvbGF0aW9uVmFsdWUsIGNyb3BTaXplIH07XG4gICAgY29uc3QgcmVzID0gRU5HSU5FLnJ1bktlcm5lbChDcm9wQW5kUmVzaXplLCBpbnB1dHMsIGF0dHJzKTtcbiAgICByZXR1cm4gcmVzO1xufVxuZXhwb3J0IGNvbnN0IGNyb3BBbmRSZXNpemUgPSBvcCh7IGNyb3BBbmRSZXNpemVfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y3JvcF9hbmRfcmVzaXplLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBGbGlwTGVmdFJpZ2h0IH0gZnJvbSAnLi4vLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBGbGlwcyB0aGUgaW1hZ2UgbGVmdCB0byByaWdodC4gQ3VycmVudGx5IGF2YWlsYWJsZSBpbiB0aGUgQ1BVLCBXZWJHTCwgYW5kXG4gKiBXQVNNIGJhY2tlbmRzLlxuICpcbiAqIEBwYXJhbSBpbWFnZSA0ZCB0ZW5zb3Igb2Ygc2hhcGUgYFtiYXRjaCwgaW1hZ2VIZWlnaHQsIGltYWdlV2lkdGgsIGRlcHRoXWAuXG4gKi9cbi8qKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdJbWFnZXMnLCBuYW1lc3BhY2U6ICdpbWFnZSd9ICovXG5mdW5jdGlvbiBmbGlwTGVmdFJpZ2h0XyhpbWFnZSkge1xuICAgIGNvbnN0ICRpbWFnZSA9IGNvbnZlcnRUb1RlbnNvcihpbWFnZSwgJ2ltYWdlJywgJ2ZsaXBMZWZ0UmlnaHQnLCAnZmxvYXQzMicpO1xuICAgIHV0aWwuYXNzZXJ0KCRpbWFnZS5yYW5rID09PSA0LCAoKSA9PiAnRXJyb3IgaW4gZmxpcExlZnRSaWdodDogaW1hZ2UgbXVzdCBiZSByYW5rIDQsJyArXG4gICAgICAgIGBidXQgZ290IHJhbmsgJHskaW1hZ2UucmFua30uYCk7XG4gICAgY29uc3QgaW5wdXRzID0geyBpbWFnZTogJGltYWdlIH07XG4gICAgY29uc3QgcmVzID0gRU5HSU5FLnJ1bktlcm5lbChGbGlwTGVmdFJpZ2h0LCBpbnB1dHMsIHt9KTtcbiAgICByZXR1cm4gcmVzO1xufVxuZXhwb3J0IGNvbnN0IGZsaXBMZWZ0UmlnaHQgPSBvcCh7IGZsaXBMZWZ0UmlnaHRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZmxpcF9sZWZ0X3JpZ2h0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBOb25NYXhTdXBwcmVzc2lvblYzIH0gZnJvbSAnLi4vLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBub25NYXhTdXBwU2FuaXR5Q2hlY2sgfSBmcm9tICcuLi9ub25tYXhfdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4uL29wZXJhdGlvbic7XG4vKipcbiAqIFBlcmZvcm1zIG5vbiBtYXhpbXVtIHN1cHByZXNzaW9uIG9mIGJvdW5kaW5nIGJveGVzIGJhc2VkIG9uXG4gKiBpb3UgKGludGVyc2VjdGlvbiBvdmVyIHVuaW9uKS5cbiAqXG4gKiBAcGFyYW0gYm94ZXMgYSAyZCB0ZW5zb3Igb2Ygc2hhcGUgYFtudW1Cb3hlcywgNF1gLiBFYWNoIGVudHJ5IGlzXG4gKiAgICAgYFt5MSwgeDEsIHkyLCB4Ml1gLCB3aGVyZSBgKHkxLCB4MSlgIGFuZCBgKHkyLCB4MilgIGFyZSB0aGUgY29ybmVycyBvZlxuICogICAgIHRoZSBib3VuZGluZyBib3guXG4gKiBAcGFyYW0gc2NvcmVzIGEgMWQgdGVuc29yIHByb3ZpZGluZyB0aGUgYm94IHNjb3JlcyBvZiBzaGFwZSBgW251bUJveGVzXWAuXG4gKiBAcGFyYW0gbWF4T3V0cHV0U2l6ZSBUaGUgbWF4aW11bSBudW1iZXIgb2YgYm94ZXMgdG8gYmUgc2VsZWN0ZWQuXG4gKiBAcGFyYW0gaW91VGhyZXNob2xkIEEgZmxvYXQgcmVwcmVzZW50aW5nIHRoZSB0aHJlc2hvbGQgZm9yIGRlY2lkaW5nIHdoZXRoZXJcbiAqICAgICBib3hlcyBvdmVybGFwIHRvbyBtdWNoIHdpdGggcmVzcGVjdCB0byBJT1UuIE11c3QgYmUgYmV0d2VlbiBbMCwgMV0uXG4gKiAgICAgRGVmYXVsdHMgdG8gMC41ICg1MCUgYm94IG92ZXJsYXApLlxuICogQHBhcmFtIHNjb3JlVGhyZXNob2xkIEEgdGhyZXNob2xkIGZvciBkZWNpZGluZyB3aGVuIHRvIHJlbW92ZSBib3hlcyBiYXNlZFxuICogICAgIG9uIHNjb3JlLiBEZWZhdWx0cyB0byAtaW5mLCB3aGljaCBtZWFucyBhbnkgc2NvcmUgaXMgYWNjZXB0ZWQuXG4gKiBAcmV0dXJuIEEgMUQgdGVuc29yIHdpdGggdGhlIHNlbGVjdGVkIGJveCBpbmRpY2VzLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0ltYWdlcycsIG5hbWVzcGFjZTogJ2ltYWdlJ31cbiAqL1xuZnVuY3Rpb24gbm9uTWF4U3VwcHJlc3Npb25fKGJveGVzLCBzY29yZXMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCA9IDAuNSwgc2NvcmVUaHJlc2hvbGQgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkpIHtcbiAgICBjb25zdCAkYm94ZXMgPSBjb252ZXJ0VG9UZW5zb3IoYm94ZXMsICdib3hlcycsICdub25NYXhTdXBwcmVzc2lvbicpO1xuICAgIGNvbnN0ICRzY29yZXMgPSBjb252ZXJ0VG9UZW5zb3Ioc2NvcmVzLCAnc2NvcmVzJywgJ25vbk1heFN1cHByZXNzaW9uJyk7XG4gICAgY29uc3QgaW5wdXRzID0gbm9uTWF4U3VwcFNhbml0eUNoZWNrKCRib3hlcywgJHNjb3JlcywgbWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLCBzY29yZVRocmVzaG9sZCk7XG4gICAgbWF4T3V0cHV0U2l6ZSA9IGlucHV0cy5tYXhPdXRwdXRTaXplO1xuICAgIGlvdVRocmVzaG9sZCA9IGlucHV0cy5pb3VUaHJlc2hvbGQ7XG4gICAgc2NvcmVUaHJlc2hvbGQgPSBpbnB1dHMuc2NvcmVUaHJlc2hvbGQ7XG4gICAgY29uc3QgYXR0cnMgPSB7IG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChOb25NYXhTdXBwcmVzc2lvblYzLCB7IGJveGVzOiAkYm94ZXMsIHNjb3JlczogJHNjb3JlcyB9LCBhdHRycyk7XG59XG5leHBvcnQgY29uc3Qgbm9uTWF4U3VwcHJlc3Npb24gPSBvcCh7IG5vbk1heFN1cHByZXNzaW9uXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW5vbl9tYXhfc3VwcHJlc3Npb24uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgbm9uTWF4U3VwcHJlc3Npb25WM0ltcGwgfSBmcm9tICcuLi8uLi9iYWNrZW5kcy9ub25fbWF4X3N1cHByZXNzaW9uX2ltcGwnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG5vbk1heFN1cHBTYW5pdHlDaGVjayB9IGZyb20gJy4uL25vbm1heF91dGlsJztcbmltcG9ydCB7IHRlbnNvcjFkIH0gZnJvbSAnLi4vdGVuc29yMWQnO1xuLyoqXG4gKiBQZXJmb3JtcyBub24gbWF4aW11bSBzdXBwcmVzc2lvbiBvZiBib3VuZGluZyBib3hlcyBiYXNlZCBvblxuICogaW91IChpbnRlcnNlY3Rpb24gb3ZlciB1bmlvbikuXG4gKlxuICogVGhpcyBpcyB0aGUgYXN5bmMgdmVyc2lvbiBvZiBgbm9uTWF4U3VwcHJlc3Npb25gXG4gKlxuICogQHBhcmFtIGJveGVzIGEgMmQgdGVuc29yIG9mIHNoYXBlIGBbbnVtQm94ZXMsIDRdYC4gRWFjaCBlbnRyeSBpc1xuICogICAgIGBbeTEsIHgxLCB5MiwgeDJdYCwgd2hlcmUgYCh5MSwgeDEpYCBhbmQgYCh5MiwgeDIpYCBhcmUgdGhlIGNvcm5lcnMgb2ZcbiAqICAgICB0aGUgYm91bmRpbmcgYm94LlxuICogQHBhcmFtIHNjb3JlcyBhIDFkIHRlbnNvciBwcm92aWRpbmcgdGhlIGJveCBzY29yZXMgb2Ygc2hhcGUgYFtudW1Cb3hlc11gLlxuICogQHBhcmFtIG1heE91dHB1dFNpemUgVGhlIG1heGltdW0gbnVtYmVyIG9mIGJveGVzIHRvIGJlIHNlbGVjdGVkLlxuICogQHBhcmFtIGlvdVRocmVzaG9sZCBBIGZsb2F0IHJlcHJlc2VudGluZyB0aGUgdGhyZXNob2xkIGZvciBkZWNpZGluZyB3aGV0aGVyXG4gKiAgICAgYm94ZXMgb3ZlcmxhcCB0b28gbXVjaCB3aXRoIHJlc3BlY3QgdG8gSU9VLiBNdXN0IGJlIGJldHdlZW4gWzAsIDFdLlxuICogICAgIERlZmF1bHRzIHRvIDAuNSAoNTAlIGJveCBvdmVybGFwKS5cbiAqIEBwYXJhbSBzY29yZVRocmVzaG9sZCBBIHRocmVzaG9sZCBmb3IgZGVjaWRpbmcgd2hlbiB0byByZW1vdmUgYm94ZXMgYmFzZWRcbiAqICAgICBvbiBzY29yZS4gRGVmYXVsdHMgdG8gLWluZiwgd2hpY2ggbWVhbnMgYW55IHNjb3JlIGlzIGFjY2VwdGVkLlxuICogQHJldHVybiBBIDFEIHRlbnNvciB3aXRoIHRoZSBzZWxlY3RlZCBib3ggaW5kaWNlcy5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdJbWFnZXMnLCBuYW1lc3BhY2U6ICdpbWFnZSd9XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIG5vbk1heFN1cHByZXNzaW9uQXN5bmNfKGJveGVzLCBzY29yZXMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCA9IDAuNSwgc2NvcmVUaHJlc2hvbGQgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkpIHtcbiAgICBjb25zdCAkYm94ZXMgPSBjb252ZXJ0VG9UZW5zb3IoYm94ZXMsICdib3hlcycsICdub25NYXhTdXBwcmVzc2lvbkFzeW5jJyk7XG4gICAgY29uc3QgJHNjb3JlcyA9IGNvbnZlcnRUb1RlbnNvcihzY29yZXMsICdzY29yZXMnLCAnbm9uTWF4U3VwcHJlc3Npb25Bc3luYycpO1xuICAgIGNvbnN0IGlucHV0cyA9IG5vbk1heFN1cHBTYW5pdHlDaGVjaygkYm94ZXMsICRzY29yZXMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQpO1xuICAgIG1heE91dHB1dFNpemUgPSBpbnB1dHMubWF4T3V0cHV0U2l6ZTtcbiAgICBpb3VUaHJlc2hvbGQgPSBpbnB1dHMuaW91VGhyZXNob2xkO1xuICAgIHNjb3JlVGhyZXNob2xkID0gaW5wdXRzLnNjb3JlVGhyZXNob2xkO1xuICAgIGNvbnN0IGJveGVzQW5kU2NvcmVzID0gYXdhaXQgUHJvbWlzZS5hbGwoWyRib3hlcy5kYXRhKCksICRzY29yZXMuZGF0YSgpXSk7XG4gICAgY29uc3QgYm94ZXNWYWxzID0gYm94ZXNBbmRTY29yZXNbMF07XG4gICAgY29uc3Qgc2NvcmVzVmFscyA9IGJveGVzQW5kU2NvcmVzWzFdO1xuICAgIC8vIFdlIGNhbGwgYSBjcHUgYmFzZWQgaW1wbCBkaXJlY3RseSB3aXRoIHRoZSB0eXBlZGFycmF5IGRhdGEgIGhlcmUgcmF0aGVyXG4gICAgLy8gdGhhbiBhIGtlcm5lbCBiZWNhdXNlIGFsbCBrZXJuZWxzIGFyZSBzeW5jaHJvbm91cyAoYW5kIHRodXMgY2Fubm90IGF3YWl0XG4gICAgLy8gLmRhdGEoKSkuXG4gICAgY29uc3QgeyBzZWxlY3RlZEluZGljZXMgfSA9IG5vbk1heFN1cHByZXNzaW9uVjNJbXBsKGJveGVzVmFscywgc2NvcmVzVmFscywgbWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLCBzY29yZVRocmVzaG9sZCk7XG4gICAgaWYgKCRib3hlcyAhPT0gYm94ZXMpIHtcbiAgICAgICAgJGJveGVzLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgaWYgKCRzY29yZXMgIT09IHNjb3Jlcykge1xuICAgICAgICAkc2NvcmVzLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRlbnNvcjFkKHNlbGVjdGVkSW5kaWNlcywgJ2ludDMyJyk7XG59XG5leHBvcnQgY29uc3Qgbm9uTWF4U3VwcHJlc3Npb25Bc3luYyA9IG5vbk1heFN1cHByZXNzaW9uQXN5bmNfO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bm9uX21heF9zdXBwcmVzc2lvbl9hc3luYy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi8uLi9lbmdpbmUnO1xuaW1wb3J0IHsgTm9uTWF4U3VwcHJlc3Npb25WNCB9IGZyb20gJy4uLy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgbm9uTWF4U3VwcFNhbml0eUNoZWNrIH0gZnJvbSAnLi4vbm9ubWF4X3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBBc3luY2hyb25vdXNseSBwZXJmb3JtcyBub24gbWF4aW11bSBzdXBwcmVzc2lvbiBvZiBib3VuZGluZyBib3hlcyBiYXNlZCBvblxuICogaW91IChpbnRlcnNlY3Rpb24gb3ZlciB1bmlvbiksIHdpdGggYW4gb3B0aW9uIHRvIHBhZCByZXN1bHRzLlxuICpcbiAqIEBwYXJhbSBib3hlcyBhIDJkIHRlbnNvciBvZiBzaGFwZSBgW251bUJveGVzLCA0XWAuIEVhY2ggZW50cnkgaXNcbiAqICAgICBgW3kxLCB4MSwgeTIsIHgyXWAsIHdoZXJlIGAoeTEsIHgxKWAgYW5kIGAoeTIsIHgyKWAgYXJlIHRoZSBjb3JuZXJzIG9mXG4gKiAgICAgdGhlIGJvdW5kaW5nIGJveC5cbiAqIEBwYXJhbSBzY29yZXMgYSAxZCB0ZW5zb3IgcHJvdmlkaW5nIHRoZSBib3ggc2NvcmVzIG9mIHNoYXBlIGBbbnVtQm94ZXNdYC5cbiAqIEBwYXJhbSBtYXhPdXRwdXRTaXplIFRoZSBtYXhpbXVtIG51bWJlciBvZiBib3hlcyB0byBiZSBzZWxlY3RlZC5cbiAqIEBwYXJhbSBpb3VUaHJlc2hvbGQgQSBmbG9hdCByZXByZXNlbnRpbmcgdGhlIHRocmVzaG9sZCBmb3IgZGVjaWRpbmcgd2hldGhlclxuICogICAgIGJveGVzIG92ZXJsYXAgdG9vIG11Y2ggd2l0aCByZXNwZWN0IHRvIElPVS4gTXVzdCBiZSBiZXR3ZWVuIFswLCAxXS5cbiAqICAgICBEZWZhdWx0cyB0byAwLjUgKDUwJSBib3ggb3ZlcmxhcCkuXG4gKiBAcGFyYW0gc2NvcmVUaHJlc2hvbGQgQSB0aHJlc2hvbGQgZm9yIGRlY2lkaW5nIHdoZW4gdG8gcmVtb3ZlIGJveGVzIGJhc2VkXG4gKiAgICAgb24gc2NvcmUuIERlZmF1bHRzIHRvIC1pbmYsIHdoaWNoIG1lYW5zIGFueSBzY29yZSBpcyBhY2NlcHRlZC5cbiAqIEBwYXJhbSBwYWRUb01heE91dHB1dFNpemUgRGVmYWx0cyB0byBmYWxzZS4gSWYgdHJ1ZSwgc2l6ZSBvZiBvdXRwdXRcbiAqICAgICBgc2VsZWN0ZWRJbmRpY2VzYCBpcyBwYWRkZWQgdG8gbWF4T3V0cHV0U2l6ZS5cbiAqIEByZXR1cm4gQSBtYXAgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKiAgICAgLSBzZWxlY3RlZEluZGljZXM6IEEgMUQgdGVuc29yIHdpdGggdGhlIHNlbGVjdGVkIGJveCBpbmRpY2VzLlxuICogICAgIC0gdmFsaWRPdXRwdXRzOiBBIHNjYWxhciBkZW5vdGluZyBob3cgbWFueSBlbGVtZW50cyBpbiBgc2VsZWN0ZWRJbmRpY2VzYFxuICogICAgICAgYXJlIHZhbGlkLiBWYWxpZCBlbGVtZW50cyBvY2N1ciBmaXJzdCwgdGhlbiBwYWRkaW5nLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0ltYWdlcycsIG5hbWVzcGFjZTogJ2ltYWdlJ31cbiAqL1xuZnVuY3Rpb24gbm9uTWF4U3VwcHJlc3Npb25QYWRkZWRfKGJveGVzLCBzY29yZXMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCA9IDAuNSwgc2NvcmVUaHJlc2hvbGQgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFksIHBhZFRvTWF4T3V0cHV0U2l6ZSA9IGZhbHNlKSB7XG4gICAgY29uc3QgJGJveGVzID0gY29udmVydFRvVGVuc29yKGJveGVzLCAnYm94ZXMnLCAnbm9uTWF4U3VwcHJlc3Npb24nKTtcbiAgICBjb25zdCAkc2NvcmVzID0gY29udmVydFRvVGVuc29yKHNjb3JlcywgJ3Njb3JlcycsICdub25NYXhTdXBwcmVzc2lvbicpO1xuICAgIGNvbnN0IHBhcmFtcyA9IG5vbk1heFN1cHBTYW5pdHlDaGVjaygkYm94ZXMsICRzY29yZXMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQsIG51bGwgLyogc29mdE5tc1NpZ21hICovKTtcbiAgICBjb25zdCAkbWF4T3V0cHV0U2l6ZSA9IHBhcmFtcy5tYXhPdXRwdXRTaXplO1xuICAgIGNvbnN0ICRpb3VUaHJlc2hvbGQgPSBwYXJhbXMuaW91VGhyZXNob2xkO1xuICAgIGNvbnN0ICRzY29yZVRocmVzaG9sZCA9IHBhcmFtcy5zY29yZVRocmVzaG9sZDtcbiAgICBjb25zdCBpbnB1dHMgPSB7IGJveGVzOiAkYm94ZXMsIHNjb3JlczogJHNjb3JlcyB9O1xuICAgIGNvbnN0IGF0dHJzID0ge1xuICAgICAgICBtYXhPdXRwdXRTaXplOiAkbWF4T3V0cHV0U2l6ZSxcbiAgICAgICAgaW91VGhyZXNob2xkOiAkaW91VGhyZXNob2xkLFxuICAgICAgICBzY29yZVRocmVzaG9sZDogJHNjb3JlVGhyZXNob2xkLFxuICAgICAgICBwYWRUb01heE91dHB1dFNpemVcbiAgICB9O1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgICBjb25zdCByZXN1bHQgPSBFTkdJTkUucnVuS2VybmVsKE5vbk1heFN1cHByZXNzaW9uVjQsIGlucHV0cywgYXR0cnMpO1xuICAgIHJldHVybiB7IHNlbGVjdGVkSW5kaWNlczogcmVzdWx0WzBdLCB2YWxpZE91dHB1dHM6IHJlc3VsdFsxXSB9O1xufVxuZXhwb3J0IGNvbnN0IG5vbk1heFN1cHByZXNzaW9uUGFkZGVkID0gb3AoeyBub25NYXhTdXBwcmVzc2lvblBhZGRlZF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ub25fbWF4X3N1cHByZXNzaW9uX3BhZGRlZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBub25NYXhTdXBwcmVzc2lvblY0SW1wbCB9IGZyb20gJy4uLy4uL2JhY2tlbmRzL25vbl9tYXhfc3VwcHJlc3Npb25faW1wbCc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgbm9uTWF4U3VwcFNhbml0eUNoZWNrIH0gZnJvbSAnLi4vbm9ubWF4X3V0aWwnO1xuaW1wb3J0IHsgc2NhbGFyIH0gZnJvbSAnLi4vc2NhbGFyJztcbmltcG9ydCB7IHRlbnNvcjFkIH0gZnJvbSAnLi4vdGVuc29yMWQnO1xuLyoqXG4gKiBBc3luY2hyb25vdXNseSBwZXJmb3JtcyBub24gbWF4aW11bSBzdXBwcmVzc2lvbiBvZiBib3VuZGluZyBib3hlcyBiYXNlZCBvblxuICogaW91IChpbnRlcnNlY3Rpb24gb3ZlciB1bmlvbiksIHdpdGggYW4gb3B0aW9uIHRvIHBhZCByZXN1bHRzLlxuICpcbiAqIEBwYXJhbSBib3hlcyBhIDJkIHRlbnNvciBvZiBzaGFwZSBgW251bUJveGVzLCA0XWAuIEVhY2ggZW50cnkgaXNcbiAqICAgICBgW3kxLCB4MSwgeTIsIHgyXWAsIHdoZXJlIGAoeTEsIHgxKWAgYW5kIGAoeTIsIHgyKWAgYXJlIHRoZSBjb3JuZXJzIG9mXG4gKiAgICAgdGhlIGJvdW5kaW5nIGJveC5cbiAqIEBwYXJhbSBzY29yZXMgYSAxZCB0ZW5zb3IgcHJvdmlkaW5nIHRoZSBib3ggc2NvcmVzIG9mIHNoYXBlIGBbbnVtQm94ZXNdYC5cbiAqIEBwYXJhbSBtYXhPdXRwdXRTaXplIFRoZSBtYXhpbXVtIG51bWJlciBvZiBib3hlcyB0byBiZSBzZWxlY3RlZC5cbiAqIEBwYXJhbSBpb3VUaHJlc2hvbGQgQSBmbG9hdCByZXByZXNlbnRpbmcgdGhlIHRocmVzaG9sZCBmb3IgZGVjaWRpbmcgd2hldGhlclxuICogICAgIGJveGVzIG92ZXJsYXAgdG9vIG11Y2ggd2l0aCByZXNwZWN0IHRvIElPVS4gTXVzdCBiZSBiZXR3ZWVuIFswLCAxXS5cbiAqICAgICBEZWZhdWx0cyB0byAwLjUgKDUwJSBib3ggb3ZlcmxhcCkuXG4gKiBAcGFyYW0gc2NvcmVUaHJlc2hvbGQgQSB0aHJlc2hvbGQgZm9yIGRlY2lkaW5nIHdoZW4gdG8gcmVtb3ZlIGJveGVzIGJhc2VkXG4gKiAgICAgb24gc2NvcmUuIERlZmF1bHRzIHRvIC1pbmYsIHdoaWNoIG1lYW5zIGFueSBzY29yZSBpcyBhY2NlcHRlZC5cbiAqIEBwYXJhbSBwYWRUb01heE91dHB1dFNpemUgRGVmYWx0cyB0byBmYWxzZS4gSWYgdHJ1ZSwgc2l6ZSBvZiBvdXRwdXRcbiAqICAgICBgc2VsZWN0ZWRJbmRpY2VzYCBpcyBwYWRkZWQgdG8gbWF4T3V0cHV0U2l6ZS5cbiAqIEByZXR1cm4gQSBtYXAgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKiAgICAgLSBzZWxlY3RlZEluZGljZXM6IEEgMUQgdGVuc29yIHdpdGggdGhlIHNlbGVjdGVkIGJveCBpbmRpY2VzLlxuICogICAgIC0gdmFsaWRPdXRwdXRzOiBBIHNjYWxhciBkZW5vdGluZyBob3cgbWFueSBlbGVtZW50cyBpbiBgc2VsZWN0ZWRJbmRpY2VzYFxuICogICAgICAgYXJlIHZhbGlkLiBWYWxpZCBlbGVtZW50cyBvY2N1ciBmaXJzdCwgdGhlbiBwYWRkaW5nLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0ltYWdlcycsIG5hbWVzcGFjZTogJ2ltYWdlJ31cbiAqL1xuYXN5bmMgZnVuY3Rpb24gbm9uTWF4U3VwcHJlc3Npb25QYWRkZWRBc3luY18oYm94ZXMsIHNjb3JlcywgbWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkID0gMC41LCBzY29yZVRocmVzaG9sZCA9IE51bWJlci5ORUdBVElWRV9JTkZJTklUWSwgcGFkVG9NYXhPdXRwdXRTaXplID0gZmFsc2UpIHtcbiAgICBjb25zdCAkYm94ZXMgPSBjb252ZXJ0VG9UZW5zb3IoYm94ZXMsICdib3hlcycsICdub25NYXhTdXBwcmVzc2lvbkFzeW5jJyk7XG4gICAgY29uc3QgJHNjb3JlcyA9IGNvbnZlcnRUb1RlbnNvcihzY29yZXMsICdzY29yZXMnLCAnbm9uTWF4U3VwcHJlc3Npb25Bc3luYycpO1xuICAgIGNvbnN0IHBhcmFtcyA9IG5vbk1heFN1cHBTYW5pdHlDaGVjaygkYm94ZXMsICRzY29yZXMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQsIG51bGwgLyogc29mdE5tc1NpZ21hICovKTtcbiAgICBjb25zdCAkbWF4T3V0cHV0U2l6ZSA9IHBhcmFtcy5tYXhPdXRwdXRTaXplO1xuICAgIGNvbnN0ICRpb3VUaHJlc2hvbGQgPSBwYXJhbXMuaW91VGhyZXNob2xkO1xuICAgIGNvbnN0ICRzY29yZVRocmVzaG9sZCA9IHBhcmFtcy5zY29yZVRocmVzaG9sZDtcbiAgICBjb25zdCBbYm94ZXNWYWxzLCBzY29yZXNWYWxzXSA9IGF3YWl0IFByb21pc2UuYWxsKFskYm94ZXMuZGF0YSgpLCAkc2NvcmVzLmRhdGEoKV0pO1xuICAgIC8vIFdlIGNhbGwgYSBjcHUgYmFzZWQgaW1wbCBkaXJlY3RseSB3aXRoIHRoZSB0eXBlZGFycmF5IGRhdGEgaGVyZSByYXRoZXJcbiAgICAvLyB0aGFuIGEga2VybmVsIGJlY2F1c2UgYWxsIGtlcm5lbHMgYXJlIHN5bmNocm9ub3VzIChhbmQgdGh1cyBjYW5ub3QgYXdhaXRcbiAgICAvLyAuZGF0YSgpKS5cbiAgICBjb25zdCB7IHNlbGVjdGVkSW5kaWNlcywgdmFsaWRPdXRwdXRzIH0gPSBub25NYXhTdXBwcmVzc2lvblY0SW1wbChib3hlc1ZhbHMsIHNjb3Jlc1ZhbHMsICRtYXhPdXRwdXRTaXplLCAkaW91VGhyZXNob2xkLCAkc2NvcmVUaHJlc2hvbGQsIHBhZFRvTWF4T3V0cHV0U2l6ZSk7XG4gICAgaWYgKCRib3hlcyAhPT0gYm94ZXMpIHtcbiAgICAgICAgJGJveGVzLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgaWYgKCRzY29yZXMgIT09IHNjb3Jlcykge1xuICAgICAgICAkc2NvcmVzLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc2VsZWN0ZWRJbmRpY2VzOiB0ZW5zb3IxZChzZWxlY3RlZEluZGljZXMsICdpbnQzMicpLFxuICAgICAgICB2YWxpZE91dHB1dHM6IHNjYWxhcih2YWxpZE91dHB1dHMsICdpbnQzMicpXG4gICAgfTtcbn1cbmV4cG9ydCBjb25zdCBub25NYXhTdXBwcmVzc2lvblBhZGRlZEFzeW5jID0gbm9uTWF4U3VwcHJlc3Npb25QYWRkZWRBc3luY187XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ub25fbWF4X3N1cHByZXNzaW9uX3BhZGRlZF9hc3luYy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi8uLi9lbmdpbmUnO1xuaW1wb3J0IHsgTm9uTWF4U3VwcHJlc3Npb25WNSB9IGZyb20gJy4uLy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgbm9uTWF4U3VwcFNhbml0eUNoZWNrIH0gZnJvbSAnLi4vbm9ubWF4X3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBQZXJmb3JtcyBub24gbWF4aW11bSBzdXBwcmVzc2lvbiBvZiBib3VuZGluZyBib3hlcyBiYXNlZCBvblxuICogaW91IChpbnRlcnNlY3Rpb24gb3ZlciB1bmlvbikuXG4gKlxuICogVGhpcyBvcCBhbHNvIHN1cHBvcnRzIGEgU29mdC1OTVMgbW9kZSAoYy5mLlxuICogQm9kbGEgZXQgYWwsIGh0dHBzOi8vYXJ4aXYub3JnL2Ficy8xNzA0LjA0NTAzKSB3aGVyZSBib3hlcyByZWR1Y2UgdGhlIHNjb3JlXG4gKiBvZiBvdGhlciBvdmVybGFwcGluZyBib3hlcywgdGhlcmVmb3JlIGZhdm9yaW5nIGRpZmZlcmVudCByZWdpb25zIG9mIHRoZSBpbWFnZVxuICogd2l0aCBoaWdoIHNjb3Jlcy4gVG8gZW5hYmxlIHRoaXMgU29mdC1OTVMgbW9kZSwgc2V0IHRoZSBgc29mdE5tc1NpZ21hYFxuICogcGFyYW1ldGVyIHRvIGJlIGxhcmdlciB0aGFuIDAuXG4gKlxuICogQHBhcmFtIGJveGVzIGEgMmQgdGVuc29yIG9mIHNoYXBlIGBbbnVtQm94ZXMsIDRdYC4gRWFjaCBlbnRyeSBpc1xuICogICAgIGBbeTEsIHgxLCB5MiwgeDJdYCwgd2hlcmUgYCh5MSwgeDEpYCBhbmQgYCh5MiwgeDIpYCBhcmUgdGhlIGNvcm5lcnMgb2ZcbiAqICAgICB0aGUgYm91bmRpbmcgYm94LlxuICogQHBhcmFtIHNjb3JlcyBhIDFkIHRlbnNvciBwcm92aWRpbmcgdGhlIGJveCBzY29yZXMgb2Ygc2hhcGUgYFtudW1Cb3hlc11gLlxuICogQHBhcmFtIG1heE91dHB1dFNpemUgVGhlIG1heGltdW0gbnVtYmVyIG9mIGJveGVzIHRvIGJlIHNlbGVjdGVkLlxuICogQHBhcmFtIGlvdVRocmVzaG9sZCBBIGZsb2F0IHJlcHJlc2VudGluZyB0aGUgdGhyZXNob2xkIGZvciBkZWNpZGluZyB3aGV0aGVyXG4gKiAgICAgYm94ZXMgb3ZlcmxhcCB0b28gbXVjaCB3aXRoIHJlc3BlY3QgdG8gSU9VLiBNdXN0IGJlIGJldHdlZW4gWzAsIDFdLlxuICogICAgIERlZmF1bHRzIHRvIDAuNSAoNTAlIGJveCBvdmVybGFwKS5cbiAqIEBwYXJhbSBzY29yZVRocmVzaG9sZCBBIHRocmVzaG9sZCBmb3IgZGVjaWRpbmcgd2hlbiB0byByZW1vdmUgYm94ZXMgYmFzZWRcbiAqICAgICBvbiBzY29yZS4gRGVmYXVsdHMgdG8gLWluZiwgd2hpY2ggbWVhbnMgYW55IHNjb3JlIGlzIGFjY2VwdGVkLlxuICogQHBhcmFtIHNvZnRObXNTaWdtYSBBIGZsb2F0IHJlcHJlc2VudGluZyB0aGUgc2lnbWEgcGFyYW1ldGVyIGZvciBTb2Z0IE5NUy5cbiAqICAgICBXaGVuIHNpZ21hIGlzIDAsIGl0IGZhbGxzIGJhY2sgdG8gbm9uTWF4U3VwcHJlc3Npb24uXG4gKiBAcmV0dXJuIEEgbWFwIHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICogICAgIC0gc2VsZWN0ZWRJbmRpY2VzOiBBIDFEIHRlbnNvciB3aXRoIHRoZSBzZWxlY3RlZCBib3ggaW5kaWNlcy5cbiAqICAgICAtIHNlbGVjdGVkU2NvcmVzOiBBIDFEIHRlbnNvciB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHNjb3JlcyBmb3IgZWFjaFxuICogICAgICAgc2VsZWN0ZWQgYm94LlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0ltYWdlcycsIG5hbWVzcGFjZTogJ2ltYWdlJ31cbiAqL1xuZnVuY3Rpb24gbm9uTWF4U3VwcHJlc3Npb25XaXRoU2NvcmVfKGJveGVzLCBzY29yZXMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCA9IDAuNSwgc2NvcmVUaHJlc2hvbGQgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFksIHNvZnRObXNTaWdtYSA9IDAuMCkge1xuICAgIGNvbnN0ICRib3hlcyA9IGNvbnZlcnRUb1RlbnNvcihib3hlcywgJ2JveGVzJywgJ25vbk1heFN1cHByZXNzaW9uJyk7XG4gICAgY29uc3QgJHNjb3JlcyA9IGNvbnZlcnRUb1RlbnNvcihzY29yZXMsICdzY29yZXMnLCAnbm9uTWF4U3VwcHJlc3Npb24nKTtcbiAgICBjb25zdCBwYXJhbXMgPSBub25NYXhTdXBwU2FuaXR5Q2hlY2soJGJveGVzLCAkc2NvcmVzLCBtYXhPdXRwdXRTaXplLCBpb3VUaHJlc2hvbGQsIHNjb3JlVGhyZXNob2xkLCBzb2Z0Tm1zU2lnbWEpO1xuICAgIG1heE91dHB1dFNpemUgPSBwYXJhbXMubWF4T3V0cHV0U2l6ZTtcbiAgICBpb3VUaHJlc2hvbGQgPSBwYXJhbXMuaW91VGhyZXNob2xkO1xuICAgIHNjb3JlVGhyZXNob2xkID0gcGFyYW1zLnNjb3JlVGhyZXNob2xkO1xuICAgIHNvZnRObXNTaWdtYSA9IHBhcmFtcy5zb2Z0Tm1zU2lnbWE7XG4gICAgY29uc3QgaW5wdXRzID0geyBib3hlczogJGJveGVzLCBzY29yZXM6ICRzY29yZXMgfTtcbiAgICBjb25zdCBhdHRycyA9IHsgbWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLCBzY29yZVRocmVzaG9sZCwgc29mdE5tc1NpZ21hIH07XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICAgIGNvbnN0IHJlc3VsdCA9IEVOR0lORS5ydW5LZXJuZWwoTm9uTWF4U3VwcHJlc3Npb25WNSwgaW5wdXRzLCBhdHRycyk7XG4gICAgcmV0dXJuIHsgc2VsZWN0ZWRJbmRpY2VzOiByZXN1bHRbMF0sIHNlbGVjdGVkU2NvcmVzOiByZXN1bHRbMV0gfTtcbn1cbmV4cG9ydCBjb25zdCBub25NYXhTdXBwcmVzc2lvbldpdGhTY29yZSA9IG9wKHsgbm9uTWF4U3VwcHJlc3Npb25XaXRoU2NvcmVfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bm9uX21heF9zdXBwcmVzc2lvbl93aXRoX3Njb3JlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IG5vbk1heFN1cHByZXNzaW9uVjVJbXBsIH0gZnJvbSAnLi4vLi4vYmFja2VuZHMvbm9uX21heF9zdXBwcmVzc2lvbl9pbXBsJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBub25NYXhTdXBwU2FuaXR5Q2hlY2sgfSBmcm9tICcuLi9ub25tYXhfdXRpbCc7XG5pbXBvcnQgeyB0ZW5zb3IxZCB9IGZyb20gJy4uL3RlbnNvcjFkJztcbi8qKlxuICogQXN5bmNocm9ub3VzbHkgcGVyZm9ybXMgbm9uIG1heGltdW0gc3VwcHJlc3Npb24gb2YgYm91bmRpbmcgYm94ZXMgYmFzZWQgb25cbiAqIGlvdSAoaW50ZXJzZWN0aW9uIG92ZXIgdW5pb24pLlxuICpcbiAqIFRoaXMgb3AgYWxzbyBzdXBwb3J0cyBhIFNvZnQtTk1TIG1vZGUgKGMuZi5cbiAqIEJvZGxhIGV0IGFsLCBodHRwczovL2FyeGl2Lm9yZy9hYnMvMTcwNC4wNDUwMykgd2hlcmUgYm94ZXMgcmVkdWNlIHRoZSBzY29yZVxuICogb2Ygb3RoZXIgb3ZlcmxhcHBpbmcgYm94ZXMsIHRoZXJlZm9yZSBmYXZvcmluZyBkaWZmZXJlbnQgcmVnaW9ucyBvZiB0aGUgaW1hZ2VcbiAqIHdpdGggaGlnaCBzY29yZXMuIFRvIGVuYWJsZSB0aGlzIFNvZnQtTk1TIG1vZGUsIHNldCB0aGUgYHNvZnRObXNTaWdtYWBcbiAqIHBhcmFtZXRlciB0byBiZSBsYXJnZXIgdGhhbiAwLlxuICpcbiAqIEBwYXJhbSBib3hlcyBhIDJkIHRlbnNvciBvZiBzaGFwZSBgW251bUJveGVzLCA0XWAuIEVhY2ggZW50cnkgaXNcbiAqICAgICBgW3kxLCB4MSwgeTIsIHgyXWAsIHdoZXJlIGAoeTEsIHgxKWAgYW5kIGAoeTIsIHgyKWAgYXJlIHRoZSBjb3JuZXJzIG9mXG4gKiAgICAgdGhlIGJvdW5kaW5nIGJveC5cbiAqIEBwYXJhbSBzY29yZXMgYSAxZCB0ZW5zb3IgcHJvdmlkaW5nIHRoZSBib3ggc2NvcmVzIG9mIHNoYXBlIGBbbnVtQm94ZXNdYC5cbiAqIEBwYXJhbSBtYXhPdXRwdXRTaXplIFRoZSBtYXhpbXVtIG51bWJlciBvZiBib3hlcyB0byBiZSBzZWxlY3RlZC5cbiAqIEBwYXJhbSBpb3VUaHJlc2hvbGQgQSBmbG9hdCByZXByZXNlbnRpbmcgdGhlIHRocmVzaG9sZCBmb3IgZGVjaWRpbmcgd2hldGhlclxuICogICAgIGJveGVzIG92ZXJsYXAgdG9vIG11Y2ggd2l0aCByZXNwZWN0IHRvIElPVS4gTXVzdCBiZSBiZXR3ZWVuIFswLCAxXS5cbiAqICAgICBEZWZhdWx0cyB0byAwLjUgKDUwJSBib3ggb3ZlcmxhcCkuXG4gKiBAcGFyYW0gc2NvcmVUaHJlc2hvbGQgQSB0aHJlc2hvbGQgZm9yIGRlY2lkaW5nIHdoZW4gdG8gcmVtb3ZlIGJveGVzIGJhc2VkXG4gKiAgICAgb24gc2NvcmUuIERlZmF1bHRzIHRvIC1pbmYsIHdoaWNoIG1lYW5zIGFueSBzY29yZSBpcyBhY2NlcHRlZC5cbiAqIEBwYXJhbSBzb2Z0Tm1zU2lnbWEgQSBmbG9hdCByZXByZXNlbnRpbmcgdGhlIHNpZ21hIHBhcmFtZXRlciBmb3IgU29mdCBOTVMuXG4gKiAgICAgV2hlbiBzaWdtYSBpcyAwLCBpdCBmYWxscyBiYWNrIHRvIG5vbk1heFN1cHByZXNzaW9uLlxuICogQHJldHVybiBBIG1hcCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqICAgICAtIHNlbGVjdGVkSW5kaWNlczogQSAxRCB0ZW5zb3Igd2l0aCB0aGUgc2VsZWN0ZWQgYm94IGluZGljZXMuXG4gKiAgICAgLSBzZWxlY3RlZFNjb3JlczogQSAxRCB0ZW5zb3Igd2l0aCB0aGUgY29ycmVzcG9uZGluZyBzY29yZXMgZm9yIGVhY2hcbiAqICAgICAgIHNlbGVjdGVkIGJveC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdJbWFnZXMnLCBuYW1lc3BhY2U6ICdpbWFnZSd9XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIG5vbk1heFN1cHByZXNzaW9uV2l0aFNjb3JlQXN5bmNfKGJveGVzLCBzY29yZXMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCA9IDAuNSwgc2NvcmVUaHJlc2hvbGQgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFksIHNvZnRObXNTaWdtYSA9IDAuMCkge1xuICAgIGNvbnN0ICRib3hlcyA9IGNvbnZlcnRUb1RlbnNvcihib3hlcywgJ2JveGVzJywgJ25vbk1heFN1cHByZXNzaW9uQXN5bmMnKTtcbiAgICBjb25zdCAkc2NvcmVzID0gY29udmVydFRvVGVuc29yKHNjb3JlcywgJ3Njb3JlcycsICdub25NYXhTdXBwcmVzc2lvbkFzeW5jJyk7XG4gICAgY29uc3QgcGFyYW1zID0gbm9uTWF4U3VwcFNhbml0eUNoZWNrKCRib3hlcywgJHNjb3JlcywgbWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLCBzY29yZVRocmVzaG9sZCwgc29mdE5tc1NpZ21hKTtcbiAgICBtYXhPdXRwdXRTaXplID0gcGFyYW1zLm1heE91dHB1dFNpemU7XG4gICAgaW91VGhyZXNob2xkID0gcGFyYW1zLmlvdVRocmVzaG9sZDtcbiAgICBzY29yZVRocmVzaG9sZCA9IHBhcmFtcy5zY29yZVRocmVzaG9sZDtcbiAgICBzb2Z0Tm1zU2lnbWEgPSBwYXJhbXMuc29mdE5tc1NpZ21hO1xuICAgIGNvbnN0IGJveGVzQW5kU2NvcmVzID0gYXdhaXQgUHJvbWlzZS5hbGwoWyRib3hlcy5kYXRhKCksICRzY29yZXMuZGF0YSgpXSk7XG4gICAgY29uc3QgYm94ZXNWYWxzID0gYm94ZXNBbmRTY29yZXNbMF07XG4gICAgY29uc3Qgc2NvcmVzVmFscyA9IGJveGVzQW5kU2NvcmVzWzFdO1xuICAgIC8vIFdlIGNhbGwgYSBjcHUgYmFzZWQgaW1wbCBkaXJlY3RseSB3aXRoIHRoZSB0eXBlZGFycmF5IGRhdGEgIGhlcmUgcmF0aGVyXG4gICAgLy8gdGhhbiBhIGtlcm5lbCBiZWNhdXNlIGFsbCBrZXJuZWxzIGFyZSBzeW5jaHJvbm91cyAoYW5kIHRodXMgY2Fubm90IGF3YWl0XG4gICAgLy8gLmRhdGEoKSkuXG4gICAgY29uc3QgeyBzZWxlY3RlZEluZGljZXMsIHNlbGVjdGVkU2NvcmVzIH0gPSBub25NYXhTdXBwcmVzc2lvblY1SW1wbChib3hlc1ZhbHMsIHNjb3Jlc1ZhbHMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQsIHNvZnRObXNTaWdtYSk7XG4gICAgaWYgKCRib3hlcyAhPT0gYm94ZXMpIHtcbiAgICAgICAgJGJveGVzLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgaWYgKCRzY29yZXMgIT09IHNjb3Jlcykge1xuICAgICAgICAkc2NvcmVzLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc2VsZWN0ZWRJbmRpY2VzOiB0ZW5zb3IxZChzZWxlY3RlZEluZGljZXMsICdpbnQzMicpLFxuICAgICAgICBzZWxlY3RlZFNjb3JlczogdGVuc29yMWQoc2VsZWN0ZWRTY29yZXMpXG4gICAgfTtcbn1cbmV4cG9ydCBjb25zdCBub25NYXhTdXBwcmVzc2lvbldpdGhTY29yZUFzeW5jID0gbm9uTWF4U3VwcHJlc3Npb25XaXRoU2NvcmVBc3luY187XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ub25fbWF4X3N1cHByZXNzaW9uX3dpdGhfc2NvcmVfYXN5bmMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vLi4vZW5naW5lJztcbmltcG9ydCB7IFJlc2l6ZUJpbGluZWFyIH0gZnJvbSAnLi4vLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4uL3Jlc2hhcGUnO1xuLyoqXG4gKiBCaWxpbmVhciByZXNpemUgYSBzaW5nbGUgM0QgaW1hZ2Ugb3IgYSBiYXRjaCBvZiAzRCBpbWFnZXMgdG8gYSBuZXcgc2hhcGUuXG4gKlxuICogQHBhcmFtIGltYWdlcyBUaGUgaW1hZ2VzLCBvZiByYW5rIDQgb3IgcmFuayAzLCBvZiBzaGFwZVxuICogICAgIGBbYmF0Y2gsIGhlaWdodCwgd2lkdGgsIGluQ2hhbm5lbHNdYC4gSWYgcmFuayAzLCBiYXRjaCBvZiAxIGlzIGFzc3VtZWQuXG4gKiBAcGFyYW0gc2l6ZSBUaGUgbmV3IHNoYXBlIGBbbmV3SGVpZ2h0LCBuZXdXaWR0aF1gIHRvIHJlc2l6ZSB0aGVcbiAqICAgICBpbWFnZXMgdG8uIEVhY2ggY2hhbm5lbCBpcyByZXNpemVkIGluZGl2aWR1YWxseS5cbiAqIEBwYXJhbSBhbGlnbkNvcm5lcnMgRGVmYXVsdHMgdG8gYGZhbHNlYC4gSWYgdHJ1ZSwgcmVzY2FsZVxuICogICAgIGlucHV0IGJ5IGAobmV3X2hlaWdodCAtIDEpIC8gKGhlaWdodCAtIDEpYCwgd2hpY2ggZXhhY3RseSBhbGlnbnMgdGhlIDRcbiAqICAgICBjb3JuZXJzIG9mIGltYWdlcyBhbmQgcmVzaXplZCBpbWFnZXMuIElmIGZhbHNlLCByZXNjYWxlIGJ5XG4gKiAgICAgYG5ld19oZWlnaHQgLyBoZWlnaHRgLiBUcmVhdCBzaW1pbGFybHkgdGhlIHdpZHRoIGRpbWVuc2lvbi5cbiAqIEBwYXJhbSBoYWxmUGl4ZWxDZW50ZXJzIERlZmF1bHRzIHRvIGBmYWxzZWAuIFdoZXRoZXIgdG8gYXNzdW1lIHBpeGVsIGNlbnRlcnNcbiAqICAgICBhcmUgYXQgMC41LCB3aGljaCB3b3VsZCBtYWtlIHRoZSBmbG9hdGluZyBwb2ludCBjb29yZGluYXRlcyBvZiB0aGUgdG9wXG4gKiAgICAgbGVmdCBwaXhlbCAwLjUsIDAuNS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdJbWFnZXMnLCBuYW1lc3BhY2U6ICdpbWFnZSd9XG4gKi9cbmZ1bmN0aW9uIHJlc2l6ZUJpbGluZWFyXyhpbWFnZXMsIHNpemUsIGFsaWduQ29ybmVycyA9IGZhbHNlLCBoYWxmUGl4ZWxDZW50ZXJzID0gZmFsc2UpIHtcbiAgICBjb25zdCAkaW1hZ2VzID0gY29udmVydFRvVGVuc29yKGltYWdlcywgJ2ltYWdlcycsICdyZXNpemVCaWxpbmVhcicpO1xuICAgIHV0aWwuYXNzZXJ0KCRpbWFnZXMucmFuayA9PT0gMyB8fCAkaW1hZ2VzLnJhbmsgPT09IDQsICgpID0+IGBFcnJvciBpbiByZXNpemVCaWxpbmVhcjogeCBtdXN0IGJlIHJhbmsgMyBvciA0LCBidXQgZ290IGAgK1xuICAgICAgICBgcmFuayAkeyRpbWFnZXMucmFua30uYCk7XG4gICAgdXRpbC5hc3NlcnQoc2l6ZS5sZW5ndGggPT09IDIsICgpID0+IGBFcnJvciBpbiByZXNpemVCaWxpbmVhcjogbmV3IHNoYXBlIG11c3QgMkQsIGJ1dCBnb3Qgc2hhcGUgYCArXG4gICAgICAgIGAke3NpemV9LmApO1xuICAgIHV0aWwuYXNzZXJ0KGhhbGZQaXhlbENlbnRlcnMgPT09IGZhbHNlIHx8IGFsaWduQ29ybmVycyA9PT0gZmFsc2UsICgpID0+IGBFcnJvciBpbiByZXNpemVCaWxpbmVhcjogSWYgaGFsZlBpeGVsQ2VudGVycyBpcyB0cnVlLCBgICtcbiAgICAgICAgYGFsaWduQ29ybmVycyBtdXN0IGJlIGZhbHNlLmApO1xuICAgIGxldCBiYXRjaEltYWdlcyA9ICRpbWFnZXM7XG4gICAgbGV0IHJlc2hhcGVkVG80RCA9IGZhbHNlO1xuICAgIGlmICgkaW1hZ2VzLnJhbmsgPT09IDMpIHtcbiAgICAgICAgcmVzaGFwZWRUbzREID0gdHJ1ZTtcbiAgICAgICAgYmF0Y2hJbWFnZXMgPSByZXNoYXBlKCRpbWFnZXMsIFsxLCAkaW1hZ2VzLnNoYXBlWzBdLCAkaW1hZ2VzLnNoYXBlWzFdLCAkaW1hZ2VzLnNoYXBlWzJdXSk7XG4gICAgfVxuICAgIGNvbnN0IFtdID0gc2l6ZTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IGltYWdlczogYmF0Y2hJbWFnZXMgfTtcbiAgICBjb25zdCBhdHRycyA9IHsgYWxpZ25Db3JuZXJzLCBoYWxmUGl4ZWxDZW50ZXJzLCBzaXplIH07XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICAgIGNvbnN0IHJlcyA9IEVOR0lORS5ydW5LZXJuZWwoUmVzaXplQmlsaW5lYXIsIGlucHV0cywgYXR0cnMpO1xuICAgIGlmIChyZXNoYXBlZFRvNEQpIHtcbiAgICAgICAgcmV0dXJuIHJlc2hhcGUocmVzLCBbcmVzLnNoYXBlWzFdLCByZXMuc2hhcGVbMl0sIHJlcy5zaGFwZVszXV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufVxuZXhwb3J0IGNvbnN0IHJlc2l6ZUJpbGluZWFyID0gb3AoeyByZXNpemVCaWxpbmVhcl8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZXNpemVfYmlsaW5lYXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vLi4vZW5naW5lJztcbmltcG9ydCB7IFJlc2l6ZU5lYXJlc3ROZWlnaGJvciB9IGZyb20gJy4uLy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuLi9yZXNoYXBlJztcbi8qKlxuICogTmVhcmVzdE5laWdoYm9yIHJlc2l6ZSBhIGJhdGNoIG9mIDNEIGltYWdlcyB0byBhIG5ldyBzaGFwZS5cbiAqXG4gKiBAcGFyYW0gaW1hZ2VzIFRoZSBpbWFnZXMsIG9mIHJhbmsgNCBvciByYW5rIDMsIG9mIHNoYXBlXG4gKiAgICAgYFtiYXRjaCwgaGVpZ2h0LCB3aWR0aCwgaW5DaGFubmVsc11gLiBJZiByYW5rIDMsIGJhdGNoIG9mIDEgaXMgYXNzdW1lZC5cbiAqIEBwYXJhbSBzaXplIFRoZSBuZXcgc2hhcGUgYFtuZXdIZWlnaHQsIG5ld1dpZHRoXWAgdG8gcmVzaXplIHRoZVxuICogICAgIGltYWdlcyB0by4gRWFjaCBjaGFubmVsIGlzIHJlc2l6ZWQgaW5kaXZpZHVhbGx5LlxuICogQHBhcmFtIGFsaWduQ29ybmVycyBEZWZhdWx0cyB0byBGYWxzZS4gSWYgdHJ1ZSwgcmVzY2FsZVxuICogICAgIGlucHV0IGJ5IGAobmV3X2hlaWdodCAtIDEpIC8gKGhlaWdodCAtIDEpYCwgd2hpY2ggZXhhY3RseSBhbGlnbnMgdGhlIDRcbiAqICAgICBjb3JuZXJzIG9mIGltYWdlcyBhbmQgcmVzaXplZCBpbWFnZXMuIElmIGZhbHNlLCByZXNjYWxlIGJ5XG4gKiAgICAgYG5ld19oZWlnaHQgLyBoZWlnaHRgLiBUcmVhdCBzaW1pbGFybHkgdGhlIHdpZHRoIGRpbWVuc2lvbi5cbiAqIEBwYXJhbSBoYWxmUGl4ZWxDZW50ZXJzIERlZmF1bHRzIHRvIGBmYWxzZWAuIFdoZXRoZXIgdG8gYXNzdW1lcyBwaXhlbHMgYXJlIG9mXG4gKiAgICAgIGhhbGYgdGhlIGFjdHVhbCBkaW1lbnNpb25zLCBhbmQgeWllbGRzIG1vcmUgYWNjdXJhdGUgcmVzaXplcy4gVGhpcyBmbGFnXG4gKiAgICAgIHdvdWxkIGFsc28gbWFrZSB0aGUgZmxvYXRpbmcgcG9pbnQgY29vcmRpbmF0ZXMgb2YgdGhlIHRvcCBsZWZ0IHBpeGVsXG4gKiAgICAgIDAuNSwgMC41LlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0ltYWdlcycsIG5hbWVzcGFjZTogJ2ltYWdlJ31cbiAqL1xuZnVuY3Rpb24gcmVzaXplTmVhcmVzdE5laWdoYm9yXyhpbWFnZXMsIHNpemUsIGFsaWduQ29ybmVycyA9IGZhbHNlLCBoYWxmUGl4ZWxDZW50ZXJzID0gZmFsc2UpIHtcbiAgICBjb25zdCAkaW1hZ2VzID0gY29udmVydFRvVGVuc29yKGltYWdlcywgJ2ltYWdlcycsICdyZXNpemVOZWFyZXN0TmVpZ2hib3InKTtcbiAgICB1dGlsLmFzc2VydCgkaW1hZ2VzLnJhbmsgPT09IDMgfHwgJGltYWdlcy5yYW5rID09PSA0LCAoKSA9PiBgRXJyb3IgaW4gcmVzaXplTmVhcmVzdE5laWdoYm9yOiB4IG11c3QgYmUgcmFuayAzIG9yIDQsIGJ1dCBnb3QgYCArXG4gICAgICAgIGByYW5rICR7JGltYWdlcy5yYW5rfS5gKTtcbiAgICB1dGlsLmFzc2VydChzaXplLmxlbmd0aCA9PT0gMiwgKCkgPT4gYEVycm9yIGluIHJlc2l6ZU5lYXJlc3ROZWlnaGJvcjogbmV3IHNoYXBlIG11c3QgMkQsIGJ1dCBnb3Qgc2hhcGUgYCArXG4gICAgICAgIGAke3NpemV9LmApO1xuICAgIHV0aWwuYXNzZXJ0KCRpbWFnZXMuZHR5cGUgPT09ICdmbG9hdDMyJyB8fCAkaW1hZ2VzLmR0eXBlID09PSAnaW50MzInLCAoKSA9PiAnYGltYWdlc2AgbXVzdCBoYXZlIGBpbnQzMmAgb3IgYGZsb2F0MzJgIGFzIGR0eXBlJyk7XG4gICAgdXRpbC5hc3NlcnQoaGFsZlBpeGVsQ2VudGVycyA9PT0gZmFsc2UgfHwgYWxpZ25Db3JuZXJzID09PSBmYWxzZSwgKCkgPT4gYEVycm9yIGluIHJlc2l6ZU5lYXJlc3ROZWlnaGJvcjogSWYgaGFsZlBpeGVsQ2VudGVycyBpcyB0cnVlLCBgICtcbiAgICAgICAgYGFsaWduQ29ybmVycyBtdXN0IGJlIGZhbHNlLmApO1xuICAgIGxldCBiYXRjaEltYWdlcyA9ICRpbWFnZXM7XG4gICAgbGV0IHJlc2hhcGVkVG80RCA9IGZhbHNlO1xuICAgIGlmICgkaW1hZ2VzLnJhbmsgPT09IDMpIHtcbiAgICAgICAgcmVzaGFwZWRUbzREID0gdHJ1ZTtcbiAgICAgICAgYmF0Y2hJbWFnZXMgPSByZXNoYXBlKCRpbWFnZXMsIFsxLCAkaW1hZ2VzLnNoYXBlWzBdLCAkaW1hZ2VzLnNoYXBlWzFdLCAkaW1hZ2VzLnNoYXBlWzJdXSk7XG4gICAgfVxuICAgIGNvbnN0IFtdID0gc2l6ZTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IGltYWdlczogYmF0Y2hJbWFnZXMgfTtcbiAgICBjb25zdCBhdHRycyA9IHsgYWxpZ25Db3JuZXJzLCBoYWxmUGl4ZWxDZW50ZXJzLCBzaXplIH07XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICAgIGNvbnN0IHJlcyA9IEVOR0lORS5ydW5LZXJuZWwoUmVzaXplTmVhcmVzdE5laWdoYm9yLCBpbnB1dHMsIGF0dHJzKTtcbiAgICBpZiAocmVzaGFwZWRUbzREKSB7XG4gICAgICAgIHJldHVybiByZXNoYXBlKHJlcywgW3Jlcy5zaGFwZVsxXSwgcmVzLnNoYXBlWzJdLCByZXMuc2hhcGVbM11dKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydCBjb25zdCByZXNpemVOZWFyZXN0TmVpZ2hib3IgPSBvcCh7IHJlc2l6ZU5lYXJlc3ROZWlnaGJvcl8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZXNpemVfbmVhcmVzdF9uZWlnaGJvci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi8uLi9lbmdpbmUnO1xuaW1wb3J0IHsgUm90YXRlV2l0aE9mZnNldCB9IGZyb20gJy4uLy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbi8qKlxuICogUm90YXRlcyB0aGUgaW5wdXQgaW1hZ2UgdGVuc29yIGNvdW50ZXItY2xvY2t3aXNlIHdpdGggYW4gb3B0aW9uYWwgb2Zmc2V0XG4gKiBjZW50ZXIgb2Ygcm90YXRpb24uIEN1cnJlbnRseSBhdmFpbGFibGUgaW4gdGhlIENQVSwgV2ViR0wsIGFuZCBXQVNNIGJhY2tlbmRzLlxuICpcbiAqIEBwYXJhbSBpbWFnZSA0ZCB0ZW5zb3Igb2Ygc2hhcGUgYFtiYXRjaCwgaW1hZ2VIZWlnaHQsIGltYWdlV2lkdGgsIGRlcHRoXWAuXG4gKiBAcGFyYW0gcmFkaWFucyBUaGUgYW1vdW50IG9mIHJvdGF0aW9uLlxuICogQHBhcmFtIGZpbGxWYWx1ZSBUaGUgdmFsdWUgdG8gZmlsbCBpbiB0aGUgZW1wdHkgc3BhY2UgbGVmdG92ZXJcbiAqICAgICBhZnRlciByb3RhdGlvbi4gQ2FuIGJlIGVpdGhlciBhIHNpbmdsZSBncmF5c2NhbGUgdmFsdWUgKDAtMjU1KSwgb3IgYW5cbiAqICAgICBhcnJheSBvZiB0aHJlZSBudW1iZXJzIGBbcmVkLCBncmVlbiwgYmx1ZV1gIHNwZWNpZnlpbmcgdGhlIHJlZCwgZ3JlZW4sXG4gKiAgICAgYW5kIGJsdWUgY2hhbm5lbHMuIERlZmF1bHRzIHRvIGAwYCAoYmxhY2spLlxuICogQHBhcmFtIGNlbnRlciBUaGUgY2VudGVyIG9mIHJvdGF0aW9uLiBDYW4gYmUgZWl0aGVyIGEgc2luZ2xlIHZhbHVlICgwLTEpLCBvclxuICogICAgIGFuIGFycmF5IG9mIHR3byBudW1iZXJzIGBbY2VudGVyWCwgY2VudGVyWV1gLiBEZWZhdWx0cyB0byBgMC41YCAocm90YXRlc1xuICogICAgIHRoZSBpbWFnZSBhcm91bmQgaXRzIGNlbnRlcikuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnSW1hZ2VzJywgbmFtZXNwYWNlOiAnaW1hZ2UnfVxuICovXG5mdW5jdGlvbiByb3RhdGVXaXRoT2Zmc2V0XyhpbWFnZSwgcmFkaWFucywgZmlsbFZhbHVlID0gMCwgY2VudGVyID0gMC41KSB7XG4gICAgY29uc3QgJGltYWdlID0gY29udmVydFRvVGVuc29yKGltYWdlLCAnaW1hZ2UnLCAncm90YXRlV2l0aE9mZnNldCcsICdmbG9hdDMyJyk7XG4gICAgdXRpbC5hc3NlcnQoJGltYWdlLnJhbmsgPT09IDQsICgpID0+ICdFcnJvciBpbiByb3RhdGVXaXRoT2Zmc2V0OiBpbWFnZSBtdXN0IGJlIHJhbmsgNCwnICtcbiAgICAgICAgYGJ1dCBnb3QgcmFuayAkeyRpbWFnZS5yYW5rfS5gKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IGltYWdlOiAkaW1hZ2UgfTtcbiAgICBjb25zdCBhdHRycyA9IHsgcmFkaWFucywgZmlsbFZhbHVlLCBjZW50ZXIgfTtcbiAgICBjb25zdCByZXMgPSBFTkdJTkUucnVuS2VybmVsKFJvdGF0ZVdpdGhPZmZzZXQsIGlucHV0cywgYXR0cnMpO1xuICAgIHJldHVybiByZXM7XG59XG5leHBvcnQgY29uc3Qgcm90YXRlV2l0aE9mZnNldCA9IG9wKHsgcm90YXRlV2l0aE9mZnNldF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yb3RhdGVfd2l0aF9vZmZzZXQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IHRlbnNvcjFkIH0gZnJvbSAnLi4vdGVuc29yMWQnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgY2FzdCB9IGZyb20gJy4uL2Nhc3QnO1xuaW1wb3J0IHsgc3BsaXQgfSBmcm9tICcuLi9zcGxpdCc7XG5pbXBvcnQgeyBiaW5jb3VudCB9IGZyb20gJy4uL2JpbmNvdW50JztcbmltcG9ydCB7IGxlc3NFcXVhbCB9IGZyb20gJy4uL2xlc3NfZXF1YWwnO1xuaW1wb3J0IHsgZ3JlYXRlciB9IGZyb20gJy4uL2dyZWF0ZXInO1xuaW1wb3J0IHsgc3VtIH0gZnJvbSAnLi4vc3VtJztcbmltcG9ydCB7IGFkZCB9IGZyb20gJy4uL2FkZCc7XG5pbXBvcnQgeyBtdWwgfSBmcm9tICcuLi9tdWwnO1xuaW1wb3J0IHsgZGl2IH0gZnJvbSAnLi4vZGl2JztcbmltcG9ydCB7IHN1YiB9IGZyb20gJy4uL3N1Yic7XG5pbXBvcnQgeyByb3VuZCB9IGZyb20gJy4uL3JvdW5kJztcbmltcG9ydCB7IHdoZXJlIH0gZnJvbSAnLi4vd2hlcmUnO1xuaW1wb3J0IHsgZmlsbCB9IGZyb20gJy4uL2ZpbGwnO1xuaW1wb3J0IHsgc2xpY2UgfSBmcm9tICcuLi9zbGljZSc7XG5pbXBvcnQgeyByYW5nZSB9IGZyb20gJy4uL3JhbmdlJztcbmltcG9ydCB7IHRlbnNvciB9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vLi4vdGVuc29yX3V0aWxfZW52Jztcbi8qKlxuICogUGVyZm9ybXMgaW1hZ2UgYmluYXJpemF0aW9uIHdpdGggY29ycmVzcG9uZGluZyB0aHJlc2hvbGRcbiAqIChkZXBlbmRzIG9uIHRoZSBtZXRob2QpdmFsdWUsIHdoaWNoIGNyZWF0ZXMgYSBiaW5hcnkgaW1hZ2UgZnJvbSBhIGdyYXlzY2FsZS5cbiAqIEBwYXJhbSBpbWFnZSAzZCB0ZW5zb3Igb2Ygc2hhcGUgW2ltYWdlSGVpZ2h0LGltYWdlV2lkdGgsIGRlcHRoXSxcbiAqIHdoZXJlIGltYWdlSGVpZ2h0IGFuZCBpbWFnZVdpZHRoIG11c3QgYmUgcG9zaXRpdmUuVGhlIGltYWdlIGNvbG9yXG4gKiByYW5nZSBzaG91bGQgYmUgWzAsIDI1NV0uXG4gKiBAcGFyYW0gbWV0aG9kIE9wdGlvbmFsIHN0cmluZyBmcm9tIGAnYmluYXJ5JyB8ICdvdHN1J2BcbiAqIHdoaWNoIHNwZWNpZmllcyB0aGUgbWV0aG9kIGZvciB0aHJlc2hvbGRpbmcuIERlZmF1bHRzIHRvICdiaW5hcnknLlxuICogQHBhcmFtIGludmVydGVkIE9wdGlvbmFsIGJvb2xlYW4gd2hpY2hzcGVjaWZpZXNcbiAqIGlmIGNvbG91cnMgc2hvdWxkIGJlIGludmVydGVkLiBEZWZhdWx0cyB0byBmYWxzZS5cbiAqIEBwYXJhbSB0aHJlc2hWYWx1ZSBPcHRpb25hbCBudW1iZXIgd2hpY2ggZGVmaW5lcyB0aHJlc2hvbGQgdmFsdWUgZnJvbSAwIHRvIDEuXG4gKiBEZWZhdWx0cyB0byAwLjUuXG4gKiBAcmV0dXJuIEEgM2QgdGVuc29yIG9mIHNoYXBlIFtpbWFnZUhlaWdodCxpbWFnZVdpZHRoLCBkZXB0aF0sIHdoaWNoXG4gKiBjb250YWlucyBiaW5hcml6ZWQgaW1hZ2UuXG4gKi9cbmZ1bmN0aW9uIHRocmVzaG9sZF8oaW1hZ2UsIG1ldGhvZCA9ICdiaW5hcnknLCBpbnZlcnRlZCA9IGZhbHNlLCB0aHJlc2hWYWx1ZSA9IDAuNSkge1xuICAgIGNvbnN0ICRpbWFnZSA9IGNvbnZlcnRUb1RlbnNvcihpbWFnZSwgJ2ltYWdlJywgJ3RocmVzaG9sZCcpO1xuICAgIC8qIDAuMjk4OSwgMC41ODcwLCAwLjExNDAgYXJlIHJlcHJlc2VudCBsdW1hIGNvZWZmaWNpZW50cyBpbiBDQ0lSNjAxLlxuICAgIFJlZmVyZW5jZSBmb3IgY29udmVydGluZyBiZXR3ZWVuIFJHQiBhbmQgZ3JheXNjYWxlOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MdW1hXyUyOHZpZGVvJTI5ICAqL1xuICAgIGNvbnN0IFJFRF9JTlRFTkNJVFlfQ09FRiA9IDAuMjk4OTtcbiAgICBjb25zdCBHUkVFTl9JTlRFTkNJVFlfQ09FRiA9IDAuNTg3MDtcbiAgICBjb25zdCBCTFVFX0lOVEVOQ0lUWV9DT0VGID0gMC4xMTQwO1xuICAgIGNvbnN0IHRvdGFsUGl4ZWxzSW5JbWFnZSA9ICRpbWFnZS5zaGFwZVswXSAqICRpbWFnZS5zaGFwZVsxXTtcbiAgICBsZXQgJHRocmVzaG9sZCA9IG11bCh0ZW5zb3IxZChbdGhyZXNoVmFsdWVdKSwgMjU1KTtcbiAgICBsZXQgciwgZywgYiwgZ3JheXNjYWxlO1xuICAgIHV0aWwuYXNzZXJ0KCRpbWFnZS5yYW5rID09PSAzLCAoKSA9PiAnRXJyb3IgaW4gdGhyZXNob2xkOiBpbWFnZSBtdXN0IGJlIHJhbmsgMywnICtcbiAgICAgICAgYGJ1dCBnb3QgcmFuayAkeyRpbWFnZS5yYW5rfS5gKTtcbiAgICB1dGlsLmFzc2VydCgkaW1hZ2Uuc2hhcGVbMl0gPT09IDMgfHwgJGltYWdlLnNoYXBlWzJdID09PSAxLCAoKSA9PiAnRXJyb3IgaW4gdGhyZXNob2xkOiAnICtcbiAgICAgICAgJ2ltYWdlIGNvbG9yIGNoYW5uZWwgbXVzdCBiZSBlcXVhbCB0byAzIG9yIDEnICtcbiAgICAgICAgYGJ1dCBnb3QgJHskaW1hZ2Uuc2hhcGVbMl19LmApO1xuICAgIHV0aWwuYXNzZXJ0KCRpbWFnZS5kdHlwZSA9PT0gJ2ludDMyJyB8fCAkaW1hZ2UuZHR5cGUgPT09ICdmbG9hdDMyJywgKCkgPT4gJ0Vycm9yIGluIGR0eXBlOiBpbWFnZSBkdHlwZSBtdXN0IGJlIGludDMyIG9yIGZsb2F0MzIsJyArXG4gICAgICAgIGBidXQgZ290IGR0eXBlICR7JGltYWdlLmR0eXBlfS5gKTtcbiAgICB1dGlsLmFzc2VydChtZXRob2QgPT09ICdvdHN1JyB8fCBtZXRob2QgPT09ICdiaW5hcnknLCAoKSA9PiBgTWV0aG9kIG11c3QgYmUgYmluYXJ5IG9yIG90c3UsIGJ1dCB3YXMgJHttZXRob2R9YCk7XG4gICAgaWYgKCRpbWFnZS5zaGFwZVsyXSA9PT0gMykge1xuICAgICAgICBbciwgZywgYl0gPSBzcGxpdCgkaW1hZ2UsIFsxLCAxLCAxXSwgLTEpO1xuICAgICAgICBjb25zdCAkciA9IG11bChyLCBSRURfSU5URU5DSVRZX0NPRUYpO1xuICAgICAgICBjb25zdCAkZyA9IG11bChnLCBHUkVFTl9JTlRFTkNJVFlfQ09FRik7XG4gICAgICAgIGNvbnN0ICRiID0gbXVsKGIsIEJMVUVfSU5URU5DSVRZX0NPRUYpO1xuICAgICAgICBncmF5c2NhbGUgPSBhZGQoYWRkKCRyLCAkZyksICRiKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGdyYXlzY2FsZSA9IGltYWdlO1xuICAgIH1cbiAgICBpZiAobWV0aG9kID09PSAnb3RzdScpIHtcbiAgICAgICAgY29uc3QgJGhpc3RvZ3JhbSA9IGJpbmNvdW50KGNhc3Qocm91bmQoZ3JheXNjYWxlKSwgJ2ludDMyJyksIHRlbnNvcihbXSksIDI1Nik7XG4gICAgICAgICR0aHJlc2hvbGQgPSBvdHN1KCRoaXN0b2dyYW0sIHRvdGFsUGl4ZWxzSW5JbWFnZSk7XG4gICAgfVxuICAgIGNvbnN0IGludkNvbmRpdGlvbiA9IGludmVydGVkID9cbiAgICAgICAgbGVzc0VxdWFsKGdyYXlzY2FsZSwgJHRocmVzaG9sZCkgOiBncmVhdGVyKGdyYXlzY2FsZSwgJHRocmVzaG9sZCk7XG4gICAgY29uc3QgcmVzdWx0ID0gY2FzdChtdWwoaW52Q29uZGl0aW9uLCAyNTUpLCAnaW50MzInKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gb3RzdShoaXN0b2dyYW0sIHRvdGFsKSB7XG4gICAgbGV0IGJlc3RUaHJlc2ggPSB0ZW5zb3IxZChbLTFdKTtcbiAgICBsZXQgYmVzdEluQmV0VmFyID0gdGVuc29yMWQoWzBdKTtcbiAgICBsZXQgY0luQmV0VmFyID0gdGVuc29yMWQoWzBdKTtcbiAgICBsZXQgY2xhc3NGaXJzdCwgY2xhc3NTZWNvbmQsIG1lYW5GaXJzdCwgbWVhblNlYywgd2VpZ2h0Rm9yZWdyb3VuZCwgd2VpZ2h0QmFjaztcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgaGlzdG9ncmFtLnNpemUgLSAxOyBpbmRleCsrKSB7XG4gICAgICAgIGNsYXNzRmlyc3QgPSBzbGljZShoaXN0b2dyYW0sIDAsIGluZGV4ICsgMSk7XG4gICAgICAgIGNsYXNzU2Vjb25kID0gc2xpY2UoaGlzdG9ncmFtLCBpbmRleCArIDEpO1xuICAgICAgICB3ZWlnaHRGb3JlZ3JvdW5kID0gZGl2KHN1bShjbGFzc0ZpcnN0KSwgdG90YWwpO1xuICAgICAgICB3ZWlnaHRCYWNrID0gZGl2KHN1bShjbGFzc1NlY29uZCksIHRvdGFsKTtcbiAgICAgICAgY29uc3QgbWVhbkZpcnN0RGl2QSA9IHN1bShtdWwoY2xhc3NGaXJzdCwgcmFuZ2UoMCwgY2xhc3NGaXJzdC5zaXplKSkpO1xuICAgICAgICBtZWFuRmlyc3QgPSBkaXYobWVhbkZpcnN0RGl2QSwgc3VtKGNsYXNzRmlyc3QpKTtcbiAgICAgICAgY29uc3QgbWVhblNlY0ZpbGwgPSBmaWxsKGNsYXNzU2Vjb25kLnNoYXBlLCBjbGFzc0ZpcnN0LnNpemUpO1xuICAgICAgICBjb25zdCBtZWFuU2VjQWRkID0gYWRkKHJhbmdlKDAsIGNsYXNzU2Vjb25kLnNpemUpLCBtZWFuU2VjRmlsbCk7XG4gICAgICAgIGNvbnN0IG1lYW5TZWNNdWwgPSBtdWwoY2xhc3NTZWNvbmQsIChtZWFuU2VjQWRkKSk7XG4gICAgICAgIG1lYW5TZWMgPSBkaXYoc3VtKG1lYW5TZWNNdWwpLCBzdW0oY2xhc3NTZWNvbmQpKTtcbiAgICAgICAgY29uc3QgY0luQmV0VmFyU3ViQSA9IHN1YihtZWFuRmlyc3QsIG1lYW5TZWMpO1xuICAgICAgICBjb25zdCBjSW5CZXRWYXJTdWJCID0gc3ViKG1lYW5GaXJzdCwgbWVhblNlYyk7XG4gICAgICAgIGNvbnN0IGNJbkJldFZhck11bCA9IG11bCh3ZWlnaHRGb3JlZ3JvdW5kLCB3ZWlnaHRCYWNrKTtcbiAgICAgICAgY0luQmV0VmFyID0gbXVsKG11bChjSW5CZXRWYXJNdWwsIGNJbkJldFZhclN1YkEpLCBjSW5CZXRWYXJTdWJCKTtcbiAgICAgICAgY29uc3QgY29uZGl0aW9uID0gZ3JlYXRlcihjSW5CZXRWYXIsIGJlc3RJbkJldFZhcik7XG4gICAgICAgIGJlc3RJbkJldFZhciA9IHdoZXJlKGNvbmRpdGlvbiwgY0luQmV0VmFyLCBiZXN0SW5CZXRWYXIpO1xuICAgICAgICBiZXN0VGhyZXNoID0gd2hlcmUoY29uZGl0aW9uLCB0ZW5zb3IxZChbaW5kZXhdKSwgYmVzdFRocmVzaCk7XG4gICAgfVxuICAgIHJldHVybiBiZXN0VGhyZXNoO1xufVxuZXhwb3J0IGNvbnN0IHRocmVzaG9sZCA9IG9wKHsgdGhyZXNob2xkXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRocmVzaG9sZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi8uLi9lbmdpbmUnO1xuaW1wb3J0IHsgVHJhbnNmb3JtIH0gZnJvbSAnLi4vLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBBcHBsaWVzIHRoZSBnaXZlbiB0cmFuc2Zvcm0ocykgdG8gdGhlIGltYWdlKHMpLlxuICpcbiAqIEBwYXJhbSBpbWFnZSA0ZCB0ZW5zb3Igb2Ygc2hhcGUgYFtiYXRjaCwgaW1hZ2VIZWlnaHQsIGltYWdlV2lkdGgsIGRlcHRoXWAuXG4gKiBAcGFyYW0gdHJhbnNmb3JtcyBQcm9qZWN0aXZlIHRyYW5zZm9ybSBtYXRyaXgvbWF0cmljZXMuIEEgdGVuc29yMWQgb2YgbGVuZ3RoXG4gKiAgICAgOCBvciB0ZW5zb3Igb2Ygc2l6ZSBOIHggOC4gSWYgb25lIHJvdyBvZiB0cmFuc2Zvcm1zIGlzIFthMCwgYTEsIGEyLCBiMFxuICogICAgIGIxLCBiMiwgYzAsIGMxXSwgdGhlbiBpdCBtYXBzIHRoZSBvdXRwdXQgcG9pbnQgKHgsIHkpIHRvIGEgdHJhbnNmb3JtZWRcbiAqICAgICBpbnB1dCBwb2ludCAoeCcsIHknKSA9ICgoYTAgeCArIGExIHkgKyBhMikgLyBrLCAoYjAgeCArIGIxIHkgKyBiMikgLyBrKSxcbiAqICAgICB3aGVyZSBrID0gYzAgeCArIGMxIHkgKyAxLiBUaGUgdHJhbnNmb3JtcyBhcmUgaW52ZXJ0ZWQgY29tcGFyZWQgdG8gdGhlXG4gKiAgICAgdHJhbnNmb3JtIG1hcHBpbmcgaW5wdXQgcG9pbnRzIHRvIG91dHB1dCBwb2ludHMuXG4gKiBAcGFyYW0gaW50ZXJwb2xhdGlvbiBJbnRlcnBvbGF0aW9uIG1vZGUuXG4gKiAgICAgU3VwcG9ydGVkIHZhbHVlczogJ25lYXJlc3QnLCAnYmlsaW5lYXInLiBEZWZhdWx0IHRvICduZWFyZXN0Jy5cbiAqIEBwYXJhbSBmaWxsTW9kZSBQb2ludHMgb3V0c2lkZSB0aGUgYm91bmRhcmllcyBvZiB0aGUgaW5wdXQgYXJlIGZpbGxlZFxuICogICAgIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gbW9kZSwgb25lIG9mICdjb25zdGFudCcsICdyZWZsZWN0JywgJ3dyYXAnLFxuICogICAgICduZWFyZXN0Jy4gRGVmYXVsdCB0byAnY29uc3RhbnQnLlxuICogICAgICdyZWZsZWN0JzogKGQgYyBiIGEgfCBhIGIgYyBkIHwgZCBjIGIgYSApIFRoZSBpbnB1dCBpcyBleHRlbmRlZCBieVxuICogICAgIHJlZmxlY3RpbmcgYWJvdXQgdGhlIGVkZ2Ugb2YgdGhlIGxhc3QgcGl4ZWwuXG4gKiAgICAgJ2NvbnN0YW50JzogKGsgayBrIGsgfCBhIGIgYyBkIHwgayBrIGsgaykgVGhlIGlucHV0IGlzIGV4dGVuZGVkIGJ5XG4gKiAgICAgZmlsbGluZyBhbGwgdmFsdWVzIGJleW9uZCB0aGUgZWRnZSB3aXRoIHRoZSBzYW1lIGNvbnN0YW50IHZhbHVlIGsuXG4gKiAgICAgJ3dyYXAnOiAoYSBiIGMgZCB8IGEgYiBjIGQgfCBhIGIgYyBkKSBUaGUgaW5wdXQgaXMgZXh0ZW5kZWQgYnlcbiAqICAgICB3cmFwcGluZyBhcm91bmQgdG8gdGhlIG9wcG9zaXRlIGVkZ2UuXG4gKiAgICAgJ25lYXJlc3QnOiAoYSBhIGEgYSB8IGEgYiBjIGQgfCBkIGQgZCBkKSBUaGUgaW5wdXQgaXMgZXh0ZW5kZWQgYnlcbiAqICAgICB0aGUgbmVhcmVzdCBwaXhlbC5cbiAqIEBwYXJhbSBmaWxsVmFsdWUgQSBmbG9hdCByZXByZXNlbnRzIHRoZSB2YWx1ZSB0byBiZSBmaWxsZWQgb3V0c2lkZSB0aGVcbiAqICAgICBib3VuZGFyaWVzIHdoZW4gZmlsbE1vZGUgaXMgJ2NvbnN0YW50Jy5cbiAqIEBwYXJhbSBPdXRwdXQgZGltZW5zaW9uIGFmdGVyIHRoZSB0cmFuc2Zvcm0sIFtoZWlnaHQsIHdpZHRoXS4gSWYgdW5kZWZpbmVkLFxuICogICAgIG91dHB1dCBpcyB0aGUgc2FtZSBzaXplIGFzIGlucHV0IGltYWdlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0ltYWdlcycsIG5hbWVzcGFjZTogJ2ltYWdlJ31cbiAqL1xuZnVuY3Rpb24gdHJhbnNmb3JtXyhpbWFnZSwgdHJhbnNmb3JtcywgaW50ZXJwb2xhdGlvbiA9ICduZWFyZXN0JywgZmlsbE1vZGUgPSAnY29uc3RhbnQnLCBmaWxsVmFsdWUgPSAwLCBvdXRwdXRTaGFwZSkge1xuICAgIGNvbnN0ICRpbWFnZSA9IGNvbnZlcnRUb1RlbnNvcihpbWFnZSwgJ2ltYWdlJywgJ3RyYW5zZm9ybScsICdmbG9hdDMyJyk7XG4gICAgY29uc3QgJHRyYW5zZm9ybXMgPSBjb252ZXJ0VG9UZW5zb3IodHJhbnNmb3JtcywgJ3RyYW5zZm9ybXMnLCAndHJhbnNmb3JtJywgJ2Zsb2F0MzInKTtcbiAgICB1dGlsLmFzc2VydCgkaW1hZ2UucmFuayA9PT0gNCwgKCkgPT4gJ0Vycm9yIGluIHRyYW5zZm9ybTogaW1hZ2UgbXVzdCBiZSByYW5rIDQsJyArXG4gICAgICAgIGBidXQgZ290IHJhbmsgJHskaW1hZ2UucmFua30uYCk7XG4gICAgdXRpbC5hc3NlcnQoJHRyYW5zZm9ybXMucmFuayA9PT0gMiAmJlxuICAgICAgICAoJHRyYW5zZm9ybXMuc2hhcGVbMF0gPT09ICRpbWFnZS5zaGFwZVswXSB8fFxuICAgICAgICAgICAgJHRyYW5zZm9ybXMuc2hhcGVbMF0gPT09IDEpICYmXG4gICAgICAgICR0cmFuc2Zvcm1zLnNoYXBlWzFdID09PSA4LCAoKSA9PiBgRXJyb3IgaW4gdHJhbnNmb3JtOiBJbnB1dCB0cmFuc2Zvcm0gc2hvdWxkIGJlIGJhdGNoIHggOCBvciAxIHggOGApO1xuICAgIHV0aWwuYXNzZXJ0KG91dHB1dFNoYXBlID09IG51bGwgfHwgb3V0cHV0U2hhcGUubGVuZ3RoID09PSAyLCAoKSA9PiAnRXJyb3IgaW4gdHJhbnNmb3JtOiBvdXRwdXRTaGFwZSBtdXN0IGJlIFtoZWlnaHQsIHdpZHRoXSBvciBudWxsLCAnICtcbiAgICAgICAgYGJ1dCBnb3QgJHtvdXRwdXRTaGFwZX0uYCk7XG4gICAgY29uc3QgaW5wdXRzID0geyBpbWFnZTogJGltYWdlLCB0cmFuc2Zvcm1zOiAkdHJhbnNmb3JtcyB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBpbnRlcnBvbGF0aW9uLCBmaWxsTW9kZSwgZmlsbFZhbHVlLCBvdXRwdXRTaGFwZSB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFRyYW5zZm9ybSwgaW5wdXRzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3QgdHJhbnNmb3JtID0gb3AoeyB0cmFuc2Zvcm1fIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dHJhbnNmb3JtLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBhc3NlcnQsIGFzc2VydFNoYXBlc01hdGNoLCBnZXRUeXBlZEFycmF5RnJvbURUeXBlIH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyB0ZW5zb3IgfSBmcm9tICcuL3RlbnNvcic7XG4vKipcbiAqIFJldHVybnMgd2hldGhlciB0aGUgdGFyZ2V0cyBhcmUgaW4gdGhlIHRvcCBLIHByZWRpY3Rpb25zLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBwcmVkaWN0aW9ucyA9IHRmLnRlbnNvcjJkKFtbMjAsIDEwLCA0MCwgMzBdLCBbMzAsIDUwLCAtMjAsIDEwXV0pO1xuICogY29uc3QgdGFyZ2V0cyA9IHRmLnRlbnNvcjFkKFsyLCAwXSk7XG4gKiBjb25zdCBwcmVjaXNpb24gPSBhd2FpdCB0Zi5pblRvcEtBc3luYyhwcmVkaWN0aW9ucywgdGFyZ2V0cyk7XG4gKiBwcmVjaXNpb24ucHJpbnQoKTtcbiAqIGBgYFxuICogQHBhcmFtIHByZWRpY3Rpb25zIDItRCBvciBoaWdoZXIgYHRmLlRlbnNvcmAgd2l0aCBsYXN0IGRpbWVuc2lvbiBiZWluZ1xuICogICAgIGF0IGxlYXN0IGBrYC5cbiAqIEBwYXJhbSB0YXJnZXRzIDEtRCBvciBoaWdoZXIgYHRmLlRlbnNvcmAuXG4gKiBAcGFyYW0gayBPcHRpb25hbCBOdW1iZXIgb2YgdG9wIGVsZW1lbnRzIHRvIGxvb2sgYXQgZm9yIGNvbXB1dGluZyBwcmVjaXNpb24sXG4gKiAgICAgZGVmYXVsdCB0byAxLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0V2YWx1YXRpb24nfVxuICovXG5hc3luYyBmdW5jdGlvbiBpblRvcEtBc3luY18ocHJlZGljdGlvbnMsIHRhcmdldHMsIGsgPSAxKSB7XG4gICAgY29uc3QgJHByZWRpY3Rpb25zID0gY29udmVydFRvVGVuc29yKHByZWRpY3Rpb25zLCAncHJlZGljdGlvbnMnLCAnaW5Ub3BLJyk7XG4gICAgY29uc3QgJHRhcmdldHMgPSBjb252ZXJ0VG9UZW5zb3IodGFyZ2V0cywgJ3RhcmdldHMnLCAnaW5Ub3BLJyk7XG4gICAgYXNzZXJ0KCRwcmVkaWN0aW9ucy5yYW5rID4gMSwgKCkgPT4gJ2luVG9wSygpIGV4cGVjdHMgdGhlIHByZWRpY3Rpb25zIHRvIGJlIG9mIHJhbmsgMiBvciBoaWdoZXIsICcgK1xuICAgICAgICBgYnV0IGdvdCAkeyRwcmVkaWN0aW9ucy5yYW5rfWApO1xuICAgIGFzc2VydCgkcHJlZGljdGlvbnMucmFuayAtIDEgPT09ICR0YXJnZXRzLnJhbmssICgpID0+IGBwcmVkaWN0aW9ucyByYW5rIHNob3VsZCBiZSAxIGxhcmdlciB0aGFuIGAgK1xuICAgICAgICBgdGFyZ2V0cyByYW5rLCBidXQgZ290IHByZWRpY3Rpb25zIHJhbmsgYCArXG4gICAgICAgIGAkeyRwcmVkaWN0aW9ucy5yYW5rfSBhbmQgdGFyZ2V0cyByYW5rICR7JHRhcmdldHMucmFua31gKTtcbiAgICBhc3NlcnRTaGFwZXNNYXRjaCgkcHJlZGljdGlvbnMuc2hhcGUuc2xpY2UoMCwgJHByZWRpY3Rpb25zLnNoYXBlLmxlbmd0aCAtIDEpLCAkdGFyZ2V0cy5zaGFwZSwgYHByZWRpY3Rpb25zJ3Mgc2hhcGUgc2hvdWxkIGJlIGFsaWduIHdpdGggdGhlIHRhcmdldHMnIHNoYXBlLCBgICtcbiAgICAgICAgJ2V4Y2VwdCB0aGUgbGFzdCBkaW1lbnNpb24uJyk7XG4gICAgY29uc3QgbGFzdERpbSA9ICRwcmVkaWN0aW9ucy5zaGFwZVskcHJlZGljdGlvbnMuc2hhcGUubGVuZ3RoIC0gMV07XG4gICAgYXNzZXJ0KGsgPiAwICYmIGsgPD0gbGFzdERpbSwgKCkgPT4gYCdrJyBwYXNzZWQgdG8gaW5Ub3BLKCkgbXVzdCBiZSA+IDAgJiYgPD0gdGhlIHByZWRpY3Rpb25zIGxhc3QgYCArXG4gICAgICAgIGBkaW1lbnNpb24gKCR7bGFzdERpbX0pLCBidXQgZ290ICR7a31gKTtcbiAgICBjb25zdCBwcmVkaWN0aW9uc1ZhbHMgPSBhd2FpdCAkcHJlZGljdGlvbnMuZGF0YSgpO1xuICAgIGNvbnN0IHRhcmdldHNWYWxzID0gYXdhaXQgJHRhcmdldHMuZGF0YSgpO1xuICAgIC8vIFJlc2hhcGUgcHJlZGljdGlvbnNWYWxzIGludG8gYSAyZCB0ZW5zb3IgW2JhdGNoLCBsYXN0RGltXVxuICAgIC8vIGFuZCBsb29rIHVwIHRvcEsgYWxvbmcgbGFzdERpbS5cbiAgICBjb25zdCBbYmF0Y2gsIHNpemVdID0gW3ByZWRpY3Rpb25zVmFscy5sZW5ndGggLyBsYXN0RGltLCBsYXN0RGltXTtcbiAgICBjb25zdCBwcmVjaXNpb24gPSBnZXRUeXBlZEFycmF5RnJvbURUeXBlKCdib29sJywgYmF0Y2gpO1xuICAgIGZvciAobGV0IGIgPSAwOyBiIDwgYmF0Y2g7IGIrKykge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBiICogc2l6ZTtcbiAgICAgICAgY29uc3QgdmFscyA9IHByZWRpY3Rpb25zVmFscy5zdWJhcnJheShvZmZzZXQsIG9mZnNldCArIHNpemUpO1xuICAgICAgICBjb25zdCB2YWxBbmRJbmQgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YWxBbmRJbmQucHVzaCh7IHZhbHVlOiB2YWxzW2ldLCBpbmRleDogaSB9KTtcbiAgICAgICAgfVxuICAgICAgICB2YWxBbmRJbmQuc29ydCgoYSwgYikgPT4gYi52YWx1ZSAtIGEudmFsdWUpO1xuICAgICAgICBwcmVjaXNpb25bYl0gPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGs7IGkrKykge1xuICAgICAgICAgICAgaWYgKHZhbEFuZEluZFtpXS5pbmRleCA9PT0gdGFyZ2V0c1ZhbHNbYl0pIHtcbiAgICAgICAgICAgICAgICBwcmVjaXNpb25bYl0gPSAxO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChwcmVkaWN0aW9ucyAhPT0gJHByZWRpY3Rpb25zKSB7XG4gICAgICAgICRwcmVkaWN0aW9ucy5kaXNwb3NlKCk7XG4gICAgfVxuICAgIGlmICh0YXJnZXRzICE9PSAkdGFyZ2V0cykge1xuICAgICAgICAkdGFyZ2V0cy5kaXNwb3NlKCk7XG4gICAgfVxuICAgIC8vIE91dHB1dCBwcmVjaXNpb24gaGFzIHRoZSBzYW1lIHNoYXBlIGFzIHRhcmdldHMuXG4gICAgcmV0dXJuIHRlbnNvcihwcmVjaXNpb24sICR0YXJnZXRzLnNoYXBlLCAnYm9vbCcpO1xufVxuZXhwb3J0IGNvbnN0IGluVG9wS0FzeW5jID0gaW5Ub3BLQXN5bmNfO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5fdG9wX2suanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IElzRmluaXRlIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogUmV0dXJucyB3aGljaCBlbGVtZW50cyBvZiB4IGFyZSBmaW5pdGUuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbTmFOLCBJbmZpbml0eSwgLUluZmluaXR5LCAwLCAxXSk7XG4gKlxuICogeC5pc0Zpbml0ZSgpLnByaW50KCk7ICAvLyBvciB0Zi5pc05hTih4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgVGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiBpc0Zpbml0ZV8oeCkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2lzRmluaXRlJyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKElzRmluaXRlLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IGlzRmluaXRlID0gb3AoeyBpc0Zpbml0ZV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pc19maW5pdGUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IElzSW5mIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogUmV0dXJucyB3aGljaCBlbGVtZW50cyBvZiB4IGFyZSBJbmZpbml0eSBvciAtSW5maW5pdHkuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbTmFOLCBJbmZpbml0eSwgLUluZmluaXR5LCAwLCAxXSk7XG4gKlxuICogeC5pc0luZigpLnByaW50KCk7ICAvLyBvciB0Zi5pc05hTih4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgVGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiBpc0luZl8oeCkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2lzSW5mJyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKElzSW5mLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IGlzSW5mID0gb3AoeyBpc0luZl8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pc19pbmYuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IElzTmFuIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogUlJldHVybnMgd2hpY2ggZWxlbWVudHMgb2YgeCBhcmUgTmFOLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoW05hTiwgSW5maW5pdHksIC1JbmZpbml0eSwgMCwgMV0pO1xuICpcbiAqIHguaXNOYU4oKS5wcmludCgpOyAgLy8gb3IgdGYuaXNOYU4oeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IFRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gaXNOYU5fKHgpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdpc05hTicpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChJc05hbiwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBpc05hTiA9IG9wKHsgaXNOYU5fIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aXNfbmFuLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBMZWFreVJlbHUgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyBsZWFreSByZWN0aWZpZWQgbGluZWFyIGVsZW1lbnQtd2lzZS5cbiAqXG4gKiBTZWVcbiAqIFtodHRwOi8vd2ViLnN0YW5mb3JkLmVkdS9+YXduaS9wYXBlcnMvcmVsdV9oeWJyaWRfaWNtbDIwMTNfZmluYWwucGRmXShcbiAqICAgICBodHRwOi8vd2ViLnN0YW5mb3JkLmVkdS9+YXduaS9wYXBlcnMvcmVsdV9oeWJyaWRfaWNtbDIwMTNfZmluYWwucGRmKVxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWy0xLCAyLCAtMywgNF0pO1xuICpcbiAqIHgubGVha3lSZWx1KDAuMSkucHJpbnQoKTsgIC8vIG9yIHRmLmxlYWt5UmVsdSh4LCAwLjEpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKiBAcGFyYW0gYWxwaGEgVGhlIHNjYWxpbmcgZmFjdG9yIGZvciBuZWdhdGl2ZSB2YWx1ZXMsIGRlZmF1bHRzIHRvIDAuMi5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gbGVha3lSZWx1Xyh4LCBhbHBoYSA9IDAuMikge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2xlYWt5UmVsdScpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICBjb25zdCBhdHRycyA9IHsgYWxwaGEgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChMZWFreVJlbHUsIGlucHV0cywgYXR0cnMpO1xufVxuZXhwb3J0IGNvbnN0IGxlYWt5UmVsdSA9IG9wKHsgbGVha3lSZWx1XyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxlYWt5X3JlbHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IExlc3MgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgbWFrZVR5cGVzTWF0Y2ggfSBmcm9tICcuLi90ZW5zb3JfdXRpbCc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUgfSBmcm9tICcuL2Jyb2FkY2FzdF91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSB0cnV0aCB2YWx1ZSBvZiAoYSA8IGIpIGVsZW1lbnQtd2lzZS4gU3VwcG9ydHMgYnJvYWRjYXN0aW5nLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzEsIDIsIDNdKTtcbiAqIGNvbnN0IGIgPSB0Zi50ZW5zb3IxZChbMiwgMiwgMl0pO1xuICpcbiAqIGEubGVzcyhiKS5wcmludCgpO1xuICogYGBgXG4gKiBAcGFyYW0gYSBUaGUgZmlyc3QgaW5wdXQgdGVuc29yLlxuICogQHBhcmFtIGIgVGhlIHNlY29uZCBpbnB1dCB0ZW5zb3IuIE11c3QgaGF2ZSB0aGUgc2FtZSBkdHlwZSBhcyBgYWAuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnTG9naWNhbCd9XG4gKi9cbmZ1bmN0aW9uIGxlc3NfKGEsIGIpIHtcbiAgICBsZXQgJGEgPSBjb252ZXJ0VG9UZW5zb3IoYSwgJ2EnLCAnbGVzcycsICdzdHJpbmdfb3JfbnVtZXJpYycpO1xuICAgIGxldCAkYiA9IGNvbnZlcnRUb1RlbnNvcihiLCAnYicsICdsZXNzJywgJ3N0cmluZ19vcl9udW1lcmljJyk7XG4gICAgWyRhLCAkYl0gPSBtYWtlVHlwZXNNYXRjaCgkYSwgJGIpO1xuICAgIGFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKCRhLnNoYXBlLCAkYi5zaGFwZSk7XG4gICAgY29uc3QgaW5wdXRzID0geyBhOiAkYSwgYjogJGIgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChMZXNzLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IGxlc3MgPSBvcCh7IGxlc3NfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bGVzcy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgTGVzc0VxdWFsIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IG1ha2VUeXBlc01hdGNoIH0gZnJvbSAnLi4vdGVuc29yX3V0aWwnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IGFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlIH0gZnJvbSAnLi9icm9hZGNhc3RfdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogUmV0dXJucyB0aGUgdHJ1dGggdmFsdWUgb2YgKGEgPD0gYikgZWxlbWVudC13aXNlLiBTdXBwb3J0cyBicm9hZGNhc3RpbmcuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgMiwgM10pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjFkKFsyLCAyLCAyXSk7XG4gKlxuICogYS5sZXNzRXF1YWwoYikucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCBpbnB1dCB0ZW5zb3IuXG4gKiBAcGFyYW0gYiBUaGUgc2Vjb25kIGlucHV0IHRlbnNvci4gTXVzdCBoYXZlIHRoZSBzYW1lIGR0eXBlIGFzIGBhYC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdMb2dpY2FsJ31cbiAqL1xuZnVuY3Rpb24gbGVzc0VxdWFsXyhhLCBiKSB7XG4gICAgbGV0ICRhID0gY29udmVydFRvVGVuc29yKGEsICdhJywgJ2xlc3NFcXVhbCcsICdzdHJpbmdfb3JfbnVtZXJpYycpO1xuICAgIGxldCAkYiA9IGNvbnZlcnRUb1RlbnNvcihiLCAnYicsICdsZXNzRXF1YWwnLCAnc3RyaW5nX29yX251bWVyaWMnKTtcbiAgICBbJGEsICRiXSA9IG1ha2VUeXBlc01hdGNoKCRhLCAkYik7XG4gICAgYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoJGEuc2hhcGUsICRiLnNoYXBlKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IGE6ICRhLCBiOiAkYiB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKExlc3NFcXVhbCwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBsZXNzRXF1YWwgPSBvcCh7IGxlc3NFcXVhbF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sZXNzX2VxdWFsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7IGdyZWF0ZXJFcXVhbCB9IGZyb20gJy4uL2dyZWF0ZXJfZXF1YWwnO1xuaW1wb3J0IHsgbGVzc0VxdWFsIH0gZnJvbSAnLi4vbGVzc19lcXVhbCc7XG5pbXBvcnQgeyBsb2dpY2FsQW5kIH0gZnJvbSAnLi4vbG9naWNhbF9hbmQnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgcmFuZ2UgfSBmcm9tICcuLi9yYW5nZSc7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi4vcmVzaGFwZSc7XG5pbXBvcnQgeyBzY2FsYXIgfSBmcm9tICcuLi9zY2FsYXInO1xuaW1wb3J0IHsgc3RhY2sgfSBmcm9tICcuLi9zdGFjayc7XG5pbXBvcnQgeyBzdWIgfSBmcm9tICcuLi9zdWInO1xuaW1wb3J0IHsgdW5zdGFjayB9IGZyb20gJy4uL3Vuc3RhY2snO1xuaW1wb3J0IHsgd2hlcmUgfSBmcm9tICcuLi93aGVyZSc7XG5pbXBvcnQgeyB6ZXJvcyB9IGZyb20gJy4uL3plcm9zJztcbi8qKlxuICogQ29weSBhIHRlbnNvciBzZXR0aW5nIGV2ZXJ5dGhpbmcgb3V0c2lkZSBhIGNlbnRyYWwgYmFuZCBpbiBlYWNoIGlubmVybW9zdFxuICogbWF0cml4IHRvIHplcm8uXG4gKlxuICogVGhlIGJhbmQgcGFydCBpcyBjb21wdXRlZCBhcyBmb2xsb3dzOiBBc3N1bWUgaW5wdXQgaGFzIGBrYCBkaW1lbnNpb25zXG4gKiBgW0ksIEosIEssIC4uLiwgTSwgTl1gLCB0aGVuIHRoZSBvdXRwdXQgaXMgYSB0ZW5zb3Igd2l0aCB0aGUgc2FtZSBzaGFwZSB3aGVyZVxuICogYGJhbmRbaSwgaiwgaywgLi4uLCBtLCBuXSA9IGluX2JhbmQobSwgbikgKiBpbnB1dFtpLCBqLCBrLCAuLi4sIG0sIG5dYC5cbiAqIFRoZSBpbmRpY2F0b3IgZnVuY3Rpb25cbiAqIGBpbl9iYW5kKG0sIG4pID0gKG51bV9sb3dlciA8IDAgfHwgKG0tbikgPD0gbnVtX2xvd2VyKSlgXG4gKiBgJiYgKG51bV91cHBlciA8IDAgfHwgKG4tbSkgPD0gbnVtX3VwcGVyKWBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjJkKFtbIDAsICAxLCAgMiwgM10sXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIFstMSwgIDAsICAxLCAyXSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgWy0yLCAtMSwgIDAsIDFdLFxuICogICAgICAgICAgICAgICAgICAgICAgICBbLTMsIC0yLCAtMSwgMF1dKTtcbiAqIGxldCB5ID0gdGYubGluYWxnLmJhbmRQYXJ0KHgsIDEsIC0xKTtcbiAqIHkucHJpbnQoKTsgLy8gW1sgMCwgIDEsICAyLCAzXSxcbiAqICAgICAgICAgICAgLy8gIFstMSwgIDAsICAxLCAyXSxcbiAqICAgICAgICAgICAgLy8gIFsgMCwgLTEsICAwLCAxXSxcbiAqICAgICAgICAgICAgLy8gIFsgMCwgMCAsIC0xLCAwXV1cbiAqIGxldCB6ID0gdGYubGluYWxnLmJhbmRQYXJ0KHgsIDIsIDEpO1xuICogei5wcmludCgpOyAvLyBbWyAwLCAgMSwgIDAsIDBdLFxuICogICAgICAgICAgICAvLyAgWy0xLCAgMCwgIDEsIDBdLFxuICogICAgICAgICAgICAvLyAgWy0yLCAtMSwgIDAsIDFdLFxuICogICAgICAgICAgICAvLyAgWyAwLCAtMiwgLTEsIDBdXVxuICogYGBgXG4gKlxuICogQHBhcmFtIHggUmFuayBga2AgdGVuc29yXG4gKiBAcGFyYW0gbnVtTG93ZXIgTnVtYmVyIG9mIHN1YmRpYWdvbmFscyB0byBrZWVwLlxuICogICBJZiBuZWdhdGl2ZSwga2VlcCBlbnRpcmUgbG93ZXIgdHJpYW5nbGUuXG4gKiBAcGFyYW0gbnVtVXBwZXIgTnVtYmVyIG9mIHN1YmRpYWdvbmFscyB0byBrZWVwLlxuICogICBJZiBuZWdhdGl2ZSwga2VlcCBlbnRpcmUgdXBwZXIgdHJpYW5nbGUuXG4gKiBAcmV0dXJucyBSYW5rIGBrYCB0ZW5zb3Igb2YgdGhlIHNhbWUgc2hhcGUgYXMgaW5wdXQuXG4gKiAgIFRoZSBleHRyYWN0ZWQgYmFuZGVkIHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOidPcGVyYXRpb25zJywgc3ViaGVhZGluZzonTGluZWFyIEFsZ2VicmEnLCBuYW1lc3BhY2U6J2xpbmFsZyd9XG4gKi9cbmZ1bmN0aW9uIGJhbmRQYXJ0XyhhLCBudW1Mb3dlciwgbnVtVXBwZXIpIHtcbiAgICBhc3NlcnQobnVtTG93ZXIgJSAxID09PSAwLCAoKSA9PiBgYmFuZFBhcnQoKTogbnVtTG93ZXIgbXVzdCBiZSBhbiBpbnRlZ2VyLCBnb3QgJHtudW1Mb3dlcn0uYCk7XG4gICAgYXNzZXJ0KG51bVVwcGVyICUgMSA9PT0gMCwgKCkgPT4gYGJhbmRQYXJ0KCk6IG51bVVwcGVyIG11c3QgYmUgYW4gaW50ZWdlciwgZ290ICR7bnVtVXBwZXJ9LmApO1xuICAgIGNvbnN0ICRhID0gY29udmVydFRvVGVuc29yKGEsICdhJywgJ2JhbmRQYXJ0Jyk7XG4gICAgYXNzZXJ0KCRhLnJhbmsgPj0gMiwgKCkgPT4gYGJhbmRQYXJ0KCk6IFJhbmsgbXVzdCBiZSBhdCBsZWFzdCAyLCBnb3QgJHskYS5yYW5rfS5gKTtcbiAgICBjb25zdCBzaGFwZSA9ICRhLnNoYXBlO1xuICAgIGNvbnN0IFtNLCBOXSA9ICRhLnNoYXBlLnNsaWNlKC0yKTtcbiAgICBpZiAoIShudW1Mb3dlciA8PSBNKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGJhbmRQYXJ0KCk6IG51bUxvd2VyICgke251bUxvd2VyfSlgICtcbiAgICAgICAgICAgIGAgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIHRoZSBudW1iZXIgb2Ygcm93cyAoJHtNfSkuYCk7XG4gICAgfVxuICAgIGlmICghKG51bVVwcGVyIDw9IE4pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgYmFuZFBhcnQoKTogbnVtVXBwZXIgKCR7bnVtVXBwZXJ9KWAgK1xuICAgICAgICAgICAgYCBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZiBjb2x1bW5zICgke059KS5gKTtcbiAgICB9XG4gICAgaWYgKG51bUxvd2VyIDwgMCkge1xuICAgICAgICBudW1Mb3dlciA9IE07XG4gICAgfVxuICAgIGlmIChudW1VcHBlciA8IDApIHtcbiAgICAgICAgbnVtVXBwZXIgPSBOO1xuICAgIH1cbiAgICBjb25zdCBpID0gcmVzaGFwZShyYW5nZSgwLCBNLCAxLCAnaW50MzInKSwgWy0xLCAxXSk7XG4gICAgY29uc3QgaiA9IHJhbmdlKDAsIE4sIDEsICdpbnQzMicpO1xuICAgIGNvbnN0IGlqID0gc3ViKGksIGopO1xuICAgIGNvbnN0IGluQmFuZCA9IGxvZ2ljYWxBbmQobGVzc0VxdWFsKGlqLCBzY2FsYXIoK251bUxvd2VyLCAnaW50MzInKSksIGdyZWF0ZXJFcXVhbChpaiwgc2NhbGFyKC1udW1VcHBlciwgJ2ludDMyJykpKTtcbiAgICBjb25zdCB6ZXJvID0gemVyb3MoW00sIE5dLCAkYS5kdHlwZSk7XG4gICAgcmV0dXJuIHJlc2hhcGUoc3RhY2sodW5zdGFjayhyZXNoYXBlKCRhLCBbLTEsIE0sIE5dKSlcbiAgICAgICAgLm1hcChtYXQgPT4gd2hlcmUoaW5CYW5kLCBtYXQsIHplcm8pKSksIHNoYXBlKTtcbn1cbmV4cG9ydCBjb25zdCBiYW5kUGFydCA9IG9wKHsgYmFuZFBhcnRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmFuZF9wYXJ0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7IGRpdiB9IGZyb20gJy4uL2Rpdic7XG5pbXBvcnQgeyBtdWwgfSBmcm9tICcuLi9tdWwnO1xuaW1wb3J0IHsgbm9ybSB9IGZyb20gJy4uL25vcm0nO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgc3BsaXQgfSBmcm9tICcuLi9zcGxpdCc7XG5pbXBvcnQgeyBzcXVlZXplIH0gZnJvbSAnLi4vc3F1ZWV6ZSc7XG5pbXBvcnQgeyBzdGFjayB9IGZyb20gJy4uL3N0YWNrJztcbmltcG9ydCB7IHN1YiB9IGZyb20gJy4uL3N1Yic7XG5pbXBvcnQgeyBzdW0gfSBmcm9tICcuLi9zdW0nO1xuLyoqXG4gKiBHcmFtLVNjaG1pZHQgb3J0aG9nb25hbGl6YXRpb24uXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IyZChbWzEsIDJdLCBbMywgNF1dKTtcbiAqIGxldCB5ID0gdGYubGluYWxnLmdyYW1TY2htaWR0KHgpO1xuICogeS5wcmludCgpO1xuICogY29uc29sZS5sb2coJ090aG9nb25hbGl6ZWQ6Jyk7XG4gKiB5LmRvdCh5LnRyYW5zcG9zZSgpKS5wcmludCgpOyAgLy8gc2hvdWxkIGJlIG5lYXJseSB0aGUgaWRlbnRpdHkgbWF0cml4LlxuICogY29uc29sZS5sb2coJ0ZpcnN0IHJvdyBkaXJlY3Rpb24gbWFpbnRhaW5lZDonKTtcbiAqIGNvbnN0IGRhdGEgPSBhd2FpdCB5LmFycmF5KCk7XG4gKiBjb25zb2xlLmxvZyhkYXRhWzBdWzFdIC8gZGF0YVswXVswXSk7ICAvLyBzaG91bGQgYmUgbmVhcmx5IDIuXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geHMgVGhlIHZlY3RvcnMgdG8gYmUgb3J0aG9nb25hbGl6ZWQsIGluIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZ1xuICogICBmb3JtYXRzOlxuICogICAtIEFuIEFycmF5IG9mIGB0Zi5UZW5zb3IxRGAuXG4gKiAgIC0gQSBgdGYuVGVuc29yMkRgLCBpLmUuLCBhIG1hdHJpeCwgaW4gd2hpY2ggY2FzZSB0aGUgdmVjdG9ycyBhcmUgdGhlIHJvd3NcbiAqICAgICBvZiBgeHNgLlxuICogICBJbiBlYWNoIGNhc2UsIGFsbCB0aGUgdmVjdG9ycyBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFuZCB0aGUgbGVuZ3RoXG4gKiAgIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgdmVjdG9ycy5cbiAqIEByZXR1cm5zIFRoZSBvcnRob2dvbmFsaXplZCBhbmQgbm9ybWFsaXplZCB2ZWN0b3JzIG9yIG1hdHJpeC5cbiAqICAgT3J0aG9nb25hbGl6YXRpb24gbWVhbnMgdGhhdCB0aGUgdmVjdG9ycyBvciB0aGUgcm93cyBvZiB0aGUgbWF0cml4XG4gKiAgIGFyZSBvcnRob2dvbmFsICh6ZXJvIGlubmVyIHByb2R1Y3RzKS4gTm9ybWFsaXphdGlvbiBtZWFucyB0aGF0IGVhY2hcbiAqICAgdmVjdG9yIG9yIGVhY2ggcm93IG9mIHRoZSBtYXRyaXggaGFzIGFuIEwyIG5vcm0gdGhhdCBlcXVhbHMgYDFgLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6J09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOidMaW5lYXIgQWxnZWJyYScsIG5hbWVzcGFjZTonbGluYWxnJ31cbiAqL1xuZnVuY3Rpb24gZ3JhbVNjaG1pZHRfKHhzKSB7XG4gICAgbGV0IGlucHV0SXNUZW5zb3IyRDtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh4cykpIHtcbiAgICAgICAgaW5wdXRJc1RlbnNvcjJEID0gZmFsc2U7XG4gICAgICAgIGFzc2VydCh4cyAhPSBudWxsICYmIHhzLmxlbmd0aCA+IDAsICgpID0+ICdHcmFtLVNjaG1pZHQgcHJvY2VzczogaW5wdXQgbXVzdCBub3QgYmUgbnVsbCwgdW5kZWZpbmVkLCBvciAnICtcbiAgICAgICAgICAgICdlbXB0eScpO1xuICAgICAgICBjb25zdCBkaW0gPSB4c1swXS5zaGFwZVswXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCB4cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgYXNzZXJ0KHhzW2ldLnNoYXBlWzBdID09PSBkaW0sICgpID0+ICdHcmFtLVNjaG1pZHQ6IE5vbi11bmlxdWUgbGVuZ3RocyBmb3VuZCBpbiB0aGUgaW5wdXQgdmVjdG9yczogJyArXG4gICAgICAgICAgICAgICAgYCgke3hzW2ldLnNoYXBlWzBdfSB2cy4gJHtkaW19KWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpbnB1dElzVGVuc29yMkQgPSB0cnVlO1xuICAgICAgICB4cyA9IHNwbGl0KHhzLCB4cy5zaGFwZVswXSwgMCkubWFwKHggPT4gc3F1ZWV6ZSh4LCBbMF0pKTtcbiAgICB9XG4gICAgYXNzZXJ0KHhzLmxlbmd0aCA8PSB4c1swXS5zaGFwZVswXSwgKCkgPT4gYEdyYW0tU2NobWlkdDogTnVtYmVyIG9mIHZlY3RvcnMgKCR7eHMubGVuZ3RofSkgZXhjZWVkcyBgICtcbiAgICAgICAgYG51bWJlciBvZiBkaW1lbnNpb25zICgke3hzWzBdLnNoYXBlWzBdfSkuYCk7XG4gICAgY29uc3QgeXMgPSBbXTtcbiAgICBjb25zdCB4czFkID0geHM7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB4cy5sZW5ndGg7ICsraSkge1xuICAgICAgICB5cy5wdXNoKEVOR0lORS50aWR5KCgpID0+IHtcbiAgICAgICAgICAgIGxldCB4ID0geHMxZFtpXTtcbiAgICAgICAgICAgIGlmIChpID4gMCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgaTsgKytqKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb2ogPSBtdWwoc3VtKG11bCh5c1tqXSwgeCkpLCB5c1tqXSk7XG4gICAgICAgICAgICAgICAgICAgIHggPSBzdWIoeCwgcHJvaik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRpdih4LCBub3JtKHgsICdldWNsaWRlYW4nKSk7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgaWYgKGlucHV0SXNUZW5zb3IyRCkge1xuICAgICAgICByZXR1cm4gc3RhY2soeXMsIDApO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHlzO1xuICAgIH1cbn1cbmV4cG9ydCBjb25zdCBncmFtU2NobWlkdCA9IG9wKHsgZ3JhbVNjaG1pZHRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z3JhbV9zY2htaWR0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBkaXNwb3NlIH0gZnJvbSAnLi4vLi4vZ2xvYmFscyc7XG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7IGNsb25lIH0gZnJvbSAnLi4vY2xvbmUnO1xuaW1wb3J0IHsgY29uY2F0IH0gZnJvbSAnLi4vY29uY2F0JztcbmltcG9ydCB7IGRpdiB9IGZyb20gJy4uL2Rpdic7XG5pbXBvcnQgeyBleWUgfSBmcm9tICcuLi9leWUnO1xuaW1wb3J0IHsgZ3JlYXRlciB9IGZyb20gJy4uL2dyZWF0ZXInO1xuaW1wb3J0IHsgbWF0TXVsIH0gZnJvbSAnLi4vbWF0X211bCc7XG5pbXBvcnQgeyBtdWwgfSBmcm9tICcuLi9tdWwnO1xuaW1wb3J0IHsgbmVnIH0gZnJvbSAnLi4vbmVnJztcbmltcG9ydCB7IG5vcm0gfSBmcm9tICcuLi9ub3JtJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuLi9yZXNoYXBlJztcbmltcG9ydCB7IHNsaWNlIH0gZnJvbSAnLi4vc2xpY2UnO1xuaW1wb3J0IHsgc3RhY2sgfSBmcm9tICcuLi9zdGFjayc7XG5pbXBvcnQgeyBzdWIgfSBmcm9tICcuLi9zdWInO1xuaW1wb3J0IHsgdGVuc29yMmQgfSBmcm9tICcuLi90ZW5zb3IyZCc7XG5pbXBvcnQgeyB0cmFuc3Bvc2UgfSBmcm9tICcuLi90cmFuc3Bvc2UnO1xuaW1wb3J0IHsgdW5zdGFjayB9IGZyb20gJy4uL3Vuc3RhY2snO1xuaW1wb3J0IHsgd2hlcmUgfSBmcm9tICcuLi93aGVyZSc7XG4vKipcbiAqIENvbXB1dGUgUVIgZGVjb21wb3NpdGlvbiBvZiBtLWJ5LW4gbWF0cml4IHVzaW5nIEhvdXNlaG9sZGVyIHRyYW5zZm9ybWF0aW9uLlxuICpcbiAqIEltcGxlbWVudGF0aW9uIGJhc2VkIG9uXG4gKiAgIFtodHRwOi8vd3d3LmNzLmNvcm5lbGwuZWR1L35iaW5kZWwvY2xhc3MvY3M2MjEwLWYwOS9sZWMxOC5wZGZdXG4gKiAoaHR0cDovL3d3dy5jcy5jb3JuZWxsLmVkdS9+YmluZGVsL2NsYXNzL2NzNjIxMC1mMDkvbGVjMTgucGRmKVxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMmQoW1sxLCAyXSwgWzMsIDRdXSk7XG4gKiBsZXQgW3EsIHJdID0gdGYubGluYWxnLnFyKGEpO1xuICogY29uc29sZS5sb2coJ1EnKTtcbiAqIHEucHJpbnQoKTtcbiAqIGNvbnNvbGUubG9nKCdSJyk7XG4gKiByLnByaW50KCk7XG4gKiBjb25zb2xlLmxvZygnT3J0aG9nb25hbGl6ZWQnKTtcbiAqIHEuZG90KHEudHJhbnNwb3NlKCkpLnByaW50KCkgIC8vIHNob3VsZCBiZSBuZWFybHkgdGhlIGlkZW50aXR5IG1hdHJpeC5cbiAqIGNvbnNvbGUubG9nKCdSZWNvbnN0cnVjdGVkJyk7XG4gKiBxLmRvdChyKS5wcmludCgpOyAvLyBzaG91bGQgYmUgbmVhcmx5IFtbMSwgMl0sIFszLCA0XV07XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBUaGUgYHRmLlRlbnNvcmAgdG8gYmUgUVItZGVjb21wb3NlZC4gTXVzdCBoYXZlIHJhbmsgPj0gMi4gU3VwcG9zZVxuICogICBpdCBoYXMgdGhlIHNoYXBlIGBbLi4uLCBNLCBOXWAuXG4gKiBAcGFyYW0gZnVsbE1hdHJpY2VzIEFuIG9wdGlvbmFsIGJvb2xlYW4gcGFyYW1ldGVyLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICogICBJZiBgdHJ1ZWAsIGNvbXB1dGUgZnVsbC1zaXplZCBgUWAuIElmIGBmYWxzZWAgKHRoZSBkZWZhdWx0KSxcbiAqICAgY29tcHV0ZSBvbmx5IHRoZSBsZWFkaW5nIE4gY29sdW1ucyBvZiBgUWAgYW5kIGBSYC5cbiAqIEByZXR1cm5zIEFuIGBBcnJheWAgb2YgdHdvIGB0Zi5UZW5zb3JgczogYFtRLCBSXWAuIGBRYCBpcyBhIHVuaXRhcnkgbWF0cml4LFxuICogICBpLmUuLCBpdHMgY29sdW1ucyBhbGwgaGF2ZSB1bml0IG5vcm0gYW5kIGFyZSBtdXR1YWxseSBvcnRob2dvbmFsLlxuICogICBJZiBgTSA+PSBOYCxcbiAqICAgICBJZiBgZnVsbE1hdHJpY2VzYCBpcyBgZmFsc2VgIChkZWZhdWx0KSxcbiAqICAgICAgIC0gYFFgIGhhcyBhIHNoYXBlIG9mIGBbLi4uLCBNLCBOXWAsXG4gKiAgICAgICAtIGBSYCBoYXMgYSBzaGFwZSBvZiBgWy4uLiwgTiwgTl1gLlxuICogICAgIElmIGBmdWxsTWF0cmljZXNgIGlzIGB0cnVlYCAoZGVmYXVsdCksXG4gKiAgICAgICAtIGBRYCBoYXMgYSBzaGFwZSBvZiBgWy4uLiwgTSwgTV1gLFxuICogICAgICAgLSBgUmAgaGFzIGEgc2hhcGUgb2YgYFsuLi4sIE0sIE5dYC5cbiAqICAgSWYgYE0gPCBOYCxcbiAqICAgICAtIGBRYCBoYXMgYSBzaGFwZSBvZiBgWy4uLiwgTSwgTV1gLFxuICogICAgIC0gYFJgIGhhcyBhIHNoYXBlIG9mIGBbLi4uLCBNLCBOXWAuXG4gKiBAdGhyb3dzIElmIHRoZSByYW5rIG9mIGB4YCBpcyBsZXNzIHRoYW4gMi5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOidPcGVyYXRpb25zJyxcbiAqICAgICAgIHN1YmhlYWRpbmc6J0xpbmVhciBBbGdlYnJhJyxcbiAqICAgICAgIG5hbWVzcGFjZTonbGluYWxnJ31cbiAqL1xuZnVuY3Rpb24gcXJfKHgsIGZ1bGxNYXRyaWNlcyA9IGZhbHNlKSB7XG4gICAgYXNzZXJ0KHgucmFuayA+PSAyLCAoKSA9PiBgcXIoKSByZXF1aXJlcyBpbnB1dCB0ZW5zb3IgdG8gaGF2ZSBhIHJhbmsgPj0gMiwgYnV0IGdvdCByYW5rICR7eC5yYW5rfWApO1xuICAgIGlmICh4LnJhbmsgPT09IDIpIHtcbiAgICAgICAgcmV0dXJuIHFyMmQoeCwgZnVsbE1hdHJpY2VzKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIFJhbmsgPiAyLlxuICAgICAgICAvLyBUT0RPKGNhaXMpOiBCZWxvdyB3ZSBzcGxpdCB0aGUgaW5wdXQgaW50byBpbmRpdmlkdWFsIDJEIHRlbnNvcnMsXG4gICAgICAgIC8vICAgcGVyZm9ybSBRUiBkZWNvbXBvc2l0aW9uIG9uIHRoZW0gYW5kIHRoZW4gc3RhY2sgdGhlIHJlc3VsdHMgYmFja1xuICAgICAgICAvLyAgIHRvZ2V0aGVyLiBXZSBzaG91bGQgZXhwbG9yZSB3aGV0aGVyIHRoaXMgY2FuIGJlIHBhcmFsbGVsaXplZC5cbiAgICAgICAgY29uc3Qgb3V0ZXJEaW1zUHJvZCA9IHguc2hhcGUuc2xpY2UoMCwgeC5zaGFwZS5sZW5ndGggLSAyKVxuICAgICAgICAgICAgLnJlZHVjZSgodmFsdWUsIHByZXYpID0+IHZhbHVlICogcHJldik7XG4gICAgICAgIGNvbnN0IHgyZHMgPSB1bnN0YWNrKHJlc2hhcGUoeCwgW1xuICAgICAgICAgICAgb3V0ZXJEaW1zUHJvZCwgeC5zaGFwZVt4LnNoYXBlLmxlbmd0aCAtIDJdLFxuICAgICAgICAgICAgeC5zaGFwZVt4LnNoYXBlLmxlbmd0aCAtIDFdXG4gICAgICAgIF0pLCAwKTtcbiAgICAgICAgY29uc3QgcTJkcyA9IFtdO1xuICAgICAgICBjb25zdCByMmRzID0gW107XG4gICAgICAgIHgyZHMuZm9yRWFjaCh4MmQgPT4ge1xuICAgICAgICAgICAgY29uc3QgW3EyZCwgcjJkXSA9IHFyMmQoeDJkLCBmdWxsTWF0cmljZXMpO1xuICAgICAgICAgICAgcTJkcy5wdXNoKHEyZCk7XG4gICAgICAgICAgICByMmRzLnB1c2gocjJkKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHEgPSByZXNoYXBlKHN0YWNrKHEyZHMsIDApLCB4LnNoYXBlKTtcbiAgICAgICAgY29uc3QgciA9IHJlc2hhcGUoc3RhY2socjJkcywgMCksIHguc2hhcGUpO1xuICAgICAgICByZXR1cm4gW3EsIHJdO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHFyMmQoeCwgZnVsbE1hdHJpY2VzID0gZmFsc2UpIHtcbiAgICByZXR1cm4gRU5HSU5FLnRpZHkoKCkgPT4ge1xuICAgICAgICBhc3NlcnQoeC5zaGFwZS5sZW5ndGggPT09IDIsICgpID0+IGBxcjJkKCkgcmVxdWlyZXMgYSAyRCBUZW5zb3IsIGJ1dCBnb3QgYSAke3guc2hhcGUubGVuZ3RofUQgVGVuc29yLmApO1xuICAgICAgICBjb25zdCBtID0geC5zaGFwZVswXTtcbiAgICAgICAgY29uc3QgbiA9IHguc2hhcGVbMV07XG4gICAgICAgIGxldCBxID0gZXllKG0pOyAvLyBPcnRob2dvbmFsIHRyYW5zZm9ybSBzbyBmYXIuXG4gICAgICAgIGxldCByID0gY2xvbmUoeCk7IC8vIFRyYW5zZm9ybWVkIG1hdHJpeCBzbyBmYXIuXG4gICAgICAgIGNvbnN0IG9uZTJEID0gdGVuc29yMmQoW1sxXV0sIFsxLCAxXSk7XG4gICAgICAgIGxldCB3ID0gY2xvbmUob25lMkQpO1xuICAgICAgICBjb25zdCBpdGVycyA9IG0gPj0gbiA/IG4gOiBtO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGl0ZXJzOyArK2opIHtcbiAgICAgICAgICAgIC8vIFRoaXMgdGlkeSB3aXRoaW4gdGhlIGZvci1sb29wIGVuc3VyZXMgd2UgY2xlYW4gdXAgdGVtcG9yYXJ5XG4gICAgICAgICAgICAvLyB0ZW5zb3JzIGFzIHNvb24gYXMgdGhleSBhcmUgbm8gbG9uZ2VyIG5lZWRlZC5cbiAgICAgICAgICAgIGNvbnN0IHJUZW1wID0gcjtcbiAgICAgICAgICAgIGNvbnN0IHdUZW1wID0gdztcbiAgICAgICAgICAgIGNvbnN0IHFUZW1wID0gcTtcbiAgICAgICAgICAgIFt3LCByLCBxXSA9IEVOR0lORS50aWR5KCgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBGaW5kIEggPSBJIC0gdGF1ICogdyAqIHcnLCB0byBwdXQgemVyb3MgYmVsb3cgUihqLCBqKS5cbiAgICAgICAgICAgICAgICBjb25zdCByakVuZDEgPSBzbGljZShyLCBbaiwgal0sIFttIC0gaiwgMV0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5vcm1YID0gbm9ybShyakVuZDEpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJqaiA9IHNsaWNlKHIsIFtqLCBqXSwgWzEsIDFdKTtcbiAgICAgICAgICAgICAgICAvLyBUaGUgc2lnbigpIGZ1bmN0aW9uIHJldHVybnMgMCBvbiAwLCB3aGljaCBjYXVzZXMgZGl2aXNpb24gYnkgemVyby5cbiAgICAgICAgICAgICAgICBjb25zdCBzID0gd2hlcmUoZ3JlYXRlcihyamosIDApLCB0ZW5zb3IyZChbWy0xXV0pLCB0ZW5zb3IyZChbWzFdXSkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHUxID0gc3ViKHJqaiwgbXVsKHMsIG5vcm1YKSk7XG4gICAgICAgICAgICAgICAgY29uc3Qgd1ByZSA9IGRpdihyakVuZDEsIHUxKTtcbiAgICAgICAgICAgICAgICBpZiAod1ByZS5zaGFwZVswXSA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICB3ID0gY2xvbmUob25lMkQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdyA9IGNvbmNhdChbXG4gICAgICAgICAgICAgICAgICAgICAgICBvbmUyRCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlKHdQcmUsIFsxLCAwXSwgW3dQcmUuc2hhcGVbMF0gLSAxLCB3UHJlLnNoYXBlWzFdXSlcbiAgICAgICAgICAgICAgICAgICAgXSwgMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHRhdSA9IG5lZyhkaXYobWF0TXVsKHMsIHUxKSwgbm9ybVgpKTtcbiAgICAgICAgICAgICAgICAvLyAtLSBSIDo9IEhSLCBRIDo9IFFILlxuICAgICAgICAgICAgICAgIGNvbnN0IHJqRW5kQWxsID0gc2xpY2UociwgW2osIDBdLCBbbSAtIGosIG5dKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0YXVUaW1lc1cgPSBtdWwodGF1LCB3KTtcbiAgICAgICAgICAgICAgICBjb25zdCB3VCA9IHRyYW5zcG9zZSh3KTtcbiAgICAgICAgICAgICAgICBpZiAoaiA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByID0gc3ViKHJqRW5kQWxsLCBtYXRNdWwodGF1VGltZXNXLCBtYXRNdWwod1QsIHJqRW5kQWxsKSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgclRpbWVzVGF1ID0gc3ViKHJqRW5kQWxsLCBtYXRNdWwodGF1VGltZXNXLCBtYXRNdWwod1QsIHJqRW5kQWxsKSkpO1xuICAgICAgICAgICAgICAgICAgICByID0gY29uY2F0KFtzbGljZShyLCBbMCwgMF0sIFtqLCBuXSksIHJUaW1lc1RhdV0sIDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCB0YXdUaW1lc1dUID0gdHJhbnNwb3NlKHRhdVRpbWVzVyk7XG4gICAgICAgICAgICAgICAgY29uc3QgcUFsbEpFbmQgPSBzbGljZShxLCBbMCwgal0sIFttLCBxLnNoYXBlWzFdIC0gal0pO1xuICAgICAgICAgICAgICAgIGlmIChqID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHEgPSBzdWIocUFsbEpFbmQsIG1hdE11bChtYXRNdWwocUFsbEpFbmQsIHcpLCB0YXdUaW1lc1dUKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBxVGltZXNUYXUgPSBzdWIocUFsbEpFbmQsIG1hdE11bChtYXRNdWwocUFsbEpFbmQsIHcpLCB0YXdUaW1lc1dUKSk7XG4gICAgICAgICAgICAgICAgICAgIHEgPSBjb25jYXQoW3NsaWNlKHEsIFswLCAwXSwgW20sIGpdKSwgcVRpbWVzVGF1XSwgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBbdywgciwgcV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGRpc3Bvc2UoW3JUZW1wLCB3VGVtcCwgcVRlbXBdKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWZ1bGxNYXRyaWNlcyAmJiBtID4gbikge1xuICAgICAgICAgICAgcSA9IHNsaWNlKHEsIFswLCAwXSwgW20sIG5dKTtcbiAgICAgICAgICAgIHIgPSBzbGljZShyLCBbMCwgMF0sIFtuLCBuXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtxLCByXTtcbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCBxciA9IG9wKHsgcXJfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IExpblNwYWNlIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbi8qKlxuICogUmV0dXJuIGFuIGV2ZW5seSBzcGFjZWQgc2VxdWVuY2Ugb2YgbnVtYmVycyBvdmVyIHRoZSBnaXZlbiBpbnRlcnZhbC5cbiAqXG4gKiBgYGBqc1xuICogdGYubGluc3BhY2UoMCwgOSwgMTApLnByaW50KCk7XG4gKiBgYGBcbiAqIEBwYXJhbSBzdGFydCBUaGUgc3RhcnQgdmFsdWUgb2YgdGhlIHNlcXVlbmNlLlxuICogQHBhcmFtIHN0b3AgVGhlIGVuZCB2YWx1ZSBvZiB0aGUgc2VxdWVuY2UuXG4gKiBAcGFyYW0gbnVtIFRoZSBudW1iZXIgb2YgdmFsdWVzIHRvIGdlbmVyYXRlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NyZWF0aW9uJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpbnNwYWNlKHN0YXJ0LCBzdG9wLCBudW0pIHtcbiAgICBpZiAobnVtIDw9IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgbnVtYmVyIG9mIHZhbHVlcyBzaG91bGQgYmUgcG9zaXRpdmUuJyk7XG4gICAgfVxuICAgIGNvbnN0IGF0dHJzID0geyBzdGFydCwgc3RvcCwgbnVtIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoTGluU3BhY2UsIHt9LCBhdHRycyk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1saW5zcGFjZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgTFJOIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9yZXNoYXBlJztcbi8qKlxuICogTm9ybWFsaXplcyB0aGUgYWN0aXZhdGlvbiBvZiBhIGxvY2FsIG5laWdoYm9yaG9vZCBhY3Jvc3Mgb3Igd2l0aGluXG4gKiBjaGFubmVscy5cbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLiBUaGUgNC1EIGlucHV0IHRlbnNvciBpcyB0cmVhdGVkIGFzIGEgMy1EIGFycmF5XG4gKiAgICAgb2YgMUQgdmVjdG9ycyAoYWxvbmcgdGhlIGxhc3QgZGltZW5zaW9uKSwgYW5kIGVhY2ggdmVjdG9yIGlzXG4gKiAgICAgbm9ybWFsaXplZCBpbmRlcGVuZGVudGx5LlxuICogQHBhcmFtIGRlcHRoUmFkaXVzIFRoZSBudW1iZXIgb2YgYWRqYWNlbnQgY2hhbm5lbHMgaW4gdGhlIDFEIG5vcm1hbGl6YXRpb25cbiAqICAgICB3aW5kb3cuXG4gKiBAcGFyYW0gYmlhcyBBIGNvbnN0YW50IGJpYXMgdGVybSBmb3IgdGhlIGJhc2lzLlxuICogQHBhcmFtIGFscGhhIEEgc2NhbGUgZmFjdG9yLCB1c3VhbGx5IHBvc2l0aXZlLlxuICogQHBhcmFtIGJldGEgQW4gZXhwb25lbnQuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnTm9ybWFsaXphdGlvbid9XG4gKi9cbmZ1bmN0aW9uIGxvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uXyh4LCBkZXB0aFJhZGl1cyA9IDUsIGJpYXMgPSAxLCBhbHBoYSA9IDEsIGJldGEgPSAwLjUpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdsb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbicpO1xuICAgIHV0aWwuYXNzZXJ0KCR4LnJhbmsgPT09IDQgfHwgJHgucmFuayA9PT0gMywgKCkgPT4gYEVycm9yIGluIGxvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uOiB4IG11c3QgYmUgcmFuayAzIG9yIDQgYnV0IGdvdFxuICAgICAgICAgICAgICAgcmFuayAkeyR4LnJhbmt9LmApO1xuICAgIHV0aWwuYXNzZXJ0KHV0aWwuaXNJbnQoZGVwdGhSYWRpdXMpLCAoKSA9PiBgRXJyb3IgaW4gbG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb246IGRlcHRoUmFkaXVzIG11c3QgYmUgYW4gYCArXG4gICAgICAgIGBpbnRlZ2VyIGJ1dCBnb3QgZGVwdGhSYWRpdXMgJHtkZXB0aFJhZGl1c30uYCk7XG4gICAgbGV0IHg0RCA9ICR4O1xuICAgIGxldCByZXNoYXBlZFRvNEQgPSBmYWxzZTtcbiAgICBpZiAoJHgucmFuayA9PT0gMykge1xuICAgICAgICByZXNoYXBlZFRvNEQgPSB0cnVlO1xuICAgICAgICB4NEQgPSByZXNoYXBlKCR4LCBbMSwgJHguc2hhcGVbMF0sICR4LnNoYXBlWzFdLCAkeC5zaGFwZVsyXV0pO1xuICAgIH1cbiAgICBjb25zdCBpbnB1dHMgPSB7IHg6IHg0RCB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBkZXB0aFJhZGl1cywgYmlhcywgYWxwaGEsIGJldGEgfTtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgY29uc3QgcmVzID0gRU5HSU5FLnJ1bktlcm5lbChMUk4sIGlucHV0cywgYXR0cnMpO1xuICAgIGlmIChyZXNoYXBlZFRvNEQpIHtcbiAgICAgICAgcmV0dXJuIHJlc2hhcGUocmVzLCBbcmVzLnNoYXBlWzFdLCByZXMuc2hhcGVbMl0sIHJlcy5zaGFwZVszXV0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG59XG5leHBvcnQgY29uc3QgbG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb24gPSBvcCh7IGxvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxvY2FsX3Jlc3BvbnNlX25vcm1hbGl6YXRpb24uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IExvZyB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENvbXB1dGVzIG5hdHVyYWwgbG9nYXJpdGhtIG9mIHRoZSBpbnB1dCBgdGYuVGVuc29yYCBlbGVtZW50LXdpc2U6IGBsbih4KWBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLCAyLCBNYXRoLkVdKTtcbiAqXG4gKiB4LmxvZygpLnByaW50KCk7ICAvLyBvciB0Zi5sb2coeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gbG9nXyh4KSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnbG9nJyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKExvZywgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBsb2cgPSBvcCh7IGxvZ18gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sb2cuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IExvZzFwIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgbmF0dXJhbCBsb2dhcml0aG0gb2YgdGhlIGlucHV0IGB0Zi5UZW5zb3JgIHBsdXMgb25lXG4gKiBlbGVtZW50LXdpc2U6IGBsbigxICsgeClgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMSwgMiwgTWF0aC5FIC0gMV0pO1xuICpcbiAqIHgubG9nMXAoKS5wcmludCgpOyAgLy8gb3IgdGYubG9nMXAoeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gbG9nMXBfKHgpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdsb2cxcCcpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChMb2cxcCwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBsb2cxcCA9IG9wKHsgbG9nMXBfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bG9nMXAuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgY3VzdG9tR3JhZCB9IGZyb20gJy4uL2dyYWRpZW50cyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgbXVsIH0gZnJvbSAnLi9tdWwnO1xuaW1wb3J0IHsgbmVnIH0gZnJvbSAnLi9uZWcnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyBzaWdtb2lkIH0gZnJvbSAnLi9zaWdtb2lkJztcbmltcG9ydCB7IHNvZnRwbHVzIH0gZnJvbSAnLi9zb2Z0cGx1cyc7XG4vKipcbiAqIENvbXB1dGVzIGxvZyBzaWdtb2lkIG9mIHRoZSBpbnB1dCBgdGYuVGVuc29yYCBlbGVtZW50LXdpc2U6XG4gKiBgbG9nU2lnbW9pZCh4KWAuIEZvciBudW1lcmljYWwgc3RhYmlsaXR5LCB3ZSB1c2UgYC10Zi5zb2Z0cGx1cygteClgLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzAsIDEsIC0xLCAuN10pO1xuICpcbiAqIHgubG9nU2lnbW9pZCgpLnByaW50KCk7ICAvLyBvciB0Zi5sb2dTaWdtb2lkKHgpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMgbWF0aCd9XG4gKi9cbmZ1bmN0aW9uIGxvZ1NpZ21vaWRfKHgpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdsb2dTaWdtb2lkJyk7XG4gICAgLy8gVXNlIGEgY3VzdG9tIGdyYWRpZW50IHRvIG1haW50YWluIHByZXZpb3VzIGltcGxlbWVudGF0aW9uLlxuICAgIC8vIFRoZXJlIGlzIG5vIExvZ1NpZ21vaWQga2VybmVsIGluIFRGIHNvIHdlIGNhbid0IHVzZSBlbmdpbmUucnVuS2VybmVsXG4gICAgLy8gZGlyZWN0bHlcbiAgICBjb25zdCBjdXN0b21PcCA9IGN1c3RvbUdyYWQoKHgpID0+IHtcbiAgICAgICAgLy8gVE9ETyh5YXNzb2diYSkgd2UgY2FuIHJlbW92ZSB0aGUgY2hhaW5lZCBzb2Z0cGx1cyBjYWxsIGhlcmUgb25seVxuICAgICAgICAvLyBhZnRlciBiYWNrZW5kcyBoYXZlIG1vZHVhbHJpemVkIHNvZnRwbHVzIGF0IHdoaWNoIHBvaW50IHdlIGNhbiBjYWxsXG4gICAgICAgIC8vIGVuZ2luZSBydW5LZXJuZWwoLi4uLCBTb3RmcGx1cywgLi4uKSBkaXJlY3RseS5cbiAgICAgICAgY29uc3QgdmFsdWUgPSBuZWcoc29mdHBsdXMobmVnKHgpKSk7XG4gICAgICAgIGNvbnN0IGdyYWRGdW5jID0gKGR5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkZXJYID0gbXVsKGR5LCBzaWdtb2lkKG5lZyh4KSkpO1xuICAgICAgICAgICAgcmV0dXJuIGRlclg7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB7IHZhbHVlLCBncmFkRnVuYyB9O1xuICAgIH0pO1xuICAgIHJldHVybiBjdXN0b21PcCgkeCk7XG59XG5leHBvcnQgY29uc3QgbG9nU2lnbW9pZCA9IG9wKHsgbG9nU2lnbW9pZF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sb2dfc2lnbW9pZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBjdXN0b21HcmFkIH0gZnJvbSAnLi4vZ3JhZGllbnRzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBjYXN0IH0gZnJvbSAnLi9jYXN0JztcbmltcG9ydCB7IGV4cCB9IGZyb20gJy4vZXhwJztcbmltcG9ydCB7IGxvZyB9IGZyb20gJy4vbG9nJztcbmltcG9ydCB7IG1heCB9IGZyb20gJy4vbWF4JztcbmltcG9ydCB7IG11bCB9IGZyb20gJy4vbXVsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgc3ViIH0gZnJvbSAnLi9zdWInO1xuaW1wb3J0IHsgc3VtIH0gZnJvbSAnLi9zdW0nO1xuLyoqXG4gKiBDb21wdXRlcyB0aGUgbG9nIHNvZnRtYXguXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgMiwgM10pO1xuICpcbiAqIGEubG9nU29mdG1heCgpLnByaW50KCk7ICAvLyBvciB0Zi5sb2dTb2Z0bWF4KGEpXG4gKiBgYGBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjJkKFsyLCA0LCA2LCAxLCAyLCAzXSwgWzIsIDNdKTtcbiAqXG4gKiBhLmxvZ1NvZnRtYXgoKS5wcmludCgpOyAgLy8gb3IgdGYubG9nU29mdG1heChhKVxuICogYGBgXG4gKlxuICogQHBhcmFtIGxvZ2l0cyBUaGUgbG9naXRzIGFycmF5LlxuICogQHBhcmFtIGF4aXMgVGhlIGRpbWVuc2lvbiBzb2Z0bWF4IHdvdWxkIGJlIHBlcmZvcm1lZCBvbi4gRGVmYXVsdHMgdG8gYC0xYFxuICogICAgIHdoaWNoIGluZGljYXRlcyB0aGUgbGFzdCBkaW1lbnNpb24uXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnTm9ybWFsaXphdGlvbid9XG4gKi9cbmZ1bmN0aW9uIGxvZ1NvZnRtYXhfKGxvZ2l0cywgYXhpcyA9IC0xKSB7XG4gICAgY29uc3QgJGxvZ2l0cyA9IGNvbnZlcnRUb1RlbnNvcihsb2dpdHMsICdsb2dpdHMnLCAnbG9nU29mdG1heCcpO1xuICAgIGlmIChheGlzID09PSAtMSkge1xuICAgICAgICBheGlzID0gJGxvZ2l0cy5yYW5rIC0gMTtcbiAgICB9XG4gICAgaWYgKGF4aXMgIT09ICRsb2dpdHMucmFuayAtIDEpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoJ0xvZyBTb2Z0bWF4IGFsb25nIGEgbm9uLWxhc3QgZGltZW5zaW9uIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLiAnICtcbiAgICAgICAgICAgIGBMb2dpdHMgd2FzIHJhbmsgJHskbG9naXRzLnJhbmt9IGFuZCBheGlzIHdhcyAke2F4aXN9YCk7XG4gICAgfVxuICAgIC8vIGNvbnN0IGZvcndhcmQ6IEZvcndhcmRGdW5jPFRlbnNvcj4gPSAoYmFja2VuZCwgc2F2ZSkgPT4ge1xuICAgIC8vICAgY29uc3Qga2VlcERpbXMgPSB0cnVlO1xuICAgIC8vICAgY29uc3QgeE1heCA9IG1heChsb2dpdHMsIGF4aXMsIHRydWUpO1xuICAgIC8vICAgY29uc3Qgc2hpZnRlZCA9IHN1Yihsb2dpdHMsIHhNYXgpO1xuICAgIC8vICAgY29uc3QgdmFsdWUgPVxuICAgIC8vICAgICAgIHN1YihjYXN0KHNoaWZ0ZWQsICdmbG9hdDMyJyksIGxvZyhzdW0oZXhwKHNoaWZ0ZWQpLCBheGlzLFxuICAgIC8vICAgICAgIGtlZXBEaW1zKSkpO1xuICAgIC8vICAgc2F2ZShbdmFsdWVdKTtcbiAgICAvLyAgIHJldHVybiB2YWx1ZTtcbiAgICAvLyB9O1xuICAgIC8vIFVzZSBhIGN1c3RvbSBncmFkaWVudCBmb3IgbnVtZXJpY2FsIHN0YWJpbGl0eS5cbiAgICBjb25zdCBjdXN0b21PcCA9IGN1c3RvbUdyYWQoKGxvZ2l0cywgc2F2ZSkgPT4ge1xuICAgICAgICBjb25zdCBrZWVwRGltcyA9IHRydWU7XG4gICAgICAgIGNvbnN0IHhNYXggPSBtYXgobG9naXRzLCBheGlzLCB0cnVlKTtcbiAgICAgICAgY29uc3Qgc2hpZnRlZCA9IHN1Yihsb2dpdHMsIHhNYXgpO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHN1YihjYXN0KHNoaWZ0ZWQsICdmbG9hdDMyJyksIGxvZyhzdW0oZXhwKHNoaWZ0ZWQpLCBheGlzLCBrZWVwRGltcykpKTtcbiAgICAgICAgc2F2ZShbdmFsdWVdKTtcbiAgICAgICAgY29uc3QgZ3JhZEZ1bmMgPSAoZHksIHNhdmVkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBbdmFsdWVdID0gc2F2ZWQ7XG4gICAgICAgICAgICBjb25zdCBrZWVwRGltcyA9IHRydWU7XG4gICAgICAgICAgICBjb25zdCBzb2Z0bWF4ID0gZXhwKHZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiBzdWIoZHksIG11bChzdW0oZHksIGF4aXMsIGtlZXBEaW1zKSwgc29mdG1heCkpO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4geyB2YWx1ZSwgZ3JhZEZ1bmMgfTtcbiAgICB9KTtcbiAgICByZXR1cm4gY3VzdG9tT3AoJGxvZ2l0cyk7XG4gICAgLy8gVE9ETyBVc2UgRW5naW5lLnJ1bktlcm5lbCB3aGVuIENQVS9XZWJHTC9XQVNNIGJhY2tlbmRzIGltcGxlbWVudCB0aGlzLlxuICAgIC8vIGNvbnN0IGlucHV0czogTG9nU29mdG1heElucHV0cyA9IHtsb2dpdHM6ICRsb2dpdHN9O1xuICAgIC8vIGNvbnN0IGF0dHJzOiBMb2dTb2Z0bWF4QXR0cnMgPSB7YXhpc307XG4gICAgLy8gcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoXG4gICAgLy8gICAgICAgICAgICBMb2dTb2Z0bWF4LCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXAsXG4gICAgLy8gICAgICAgICAgICBhdHRycyBhcyB7fSBhcyBOYW1lZEF0dHJNYXApO1xufVxuZXhwb3J0IGNvbnN0IGxvZ1NvZnRtYXggPSBvcCh7IGxvZ1NvZnRtYXhfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bG9nX3NvZnRtYXguanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IHBhcnNlQXhpc1BhcmFtIH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBhZGQgfSBmcm9tICcuL2FkZCc7XG5pbXBvcnQgeyBleHBhbmRTaGFwZVRvS2VlcERpbSB9IGZyb20gJy4vYXhpc191dGlsJztcbmltcG9ydCB7IGV4cCB9IGZyb20gJy4vZXhwJztcbmltcG9ydCB7IGxvZyB9IGZyb20gJy4vbG9nJztcbmltcG9ydCB7IG1heCB9IGZyb20gJy4vbWF4JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vcmVzaGFwZSc7XG5pbXBvcnQgeyBzdWIgfSBmcm9tICcuL3N1Yic7XG5pbXBvcnQgeyBzdW0gfSBmcm9tICcuL3N1bSc7XG4vKipcbiAqIENvbXB1dGVzIHRoZSBsb2coc3VtKGV4cChlbGVtZW50cyBhY3Jvc3MgdGhlIHJlZHVjdGlvbiBkaW1lbnNpb25zKSkuXG4gKlxuICogUmVkdWNlcyB0aGUgaW5wdXQgYWxvbmcgdGhlIGRpbWVuc2lvbnMgZ2l2ZW4gaW4gYGF4aXNgLiBVbmxlc3MgYGtlZXBEaW1zYFxuICogaXMgdHJ1ZSwgdGhlIHJhbmsgb2YgdGhlIGFycmF5IGlzIHJlZHVjZWQgYnkgMSBmb3IgZWFjaCBlbnRyeSBpbiBgYXhpc2AuXG4gKiBJZiBga2VlcERpbXNgIGlzIHRydWUsIHRoZSByZWR1Y2VkIGRpbWVuc2lvbnMgYXJlIHJldGFpbmVkIHdpdGggbGVuZ3RoIDEuXG4gKiBJZiBgYXhpc2AgaGFzIG5vIGVudHJpZXMsIGFsbCBkaW1lbnNpb25zIGFyZSByZWR1Y2VkLCBhbmQgYW4gYXJyYXkgd2l0aCBhXG4gKiBzaW5nbGUgZWxlbWVudCBpcyByZXR1cm5lZC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzXSk7XG4gKlxuICogeC5sb2dTdW1FeHAoKS5wcmludCgpOyAgLy8gb3IgdGYubG9nU3VtRXhwKHgpXG4gKiBgYGBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjJkKFsxLCAyLCAzLCA0XSwgWzIsIDJdKTtcbiAqXG4gKiBjb25zdCBheGlzID0gMTtcbiAqIHgubG9nU3VtRXhwKGF4aXMpLnByaW50KCk7ICAvLyBvciB0Zi5sb2dTdW1FeHAoYSwgYXhpcylcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqIEBwYXJhbSBheGlzIFRoZSBkaW1lbnNpb24ocykgdG8gcmVkdWNlLiBJZiBudWxsICh0aGUgZGVmYXVsdCksXG4gKiAgICAgcmVkdWNlcyBhbGwgZGltZW5zaW9ucy5cbiAqIEBwYXJhbSBrZWVwRGltcyBJZiB0cnVlLCByZXRhaW5zIHJlZHVjZWQgZGltZW5zaW9ucyB3aXRoIGxlbmd0aFxuICogICAgIG9mIDEuIERlZmF1bHRzIHRvIGZhbHNlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ1JlZHVjdGlvbid9XG4gKi9cbmZ1bmN0aW9uIGxvZ1N1bUV4cF8oeCwgYXhpcyA9IG51bGwsIGtlZXBEaW1zID0gZmFsc2UpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdsb2dTdW1FeHAnKTtcbiAgICBjb25zdCBheGVzID0gcGFyc2VBeGlzUGFyYW0oYXhpcywgJHguc2hhcGUpO1xuICAgIGNvbnN0IHhNYXggPSBtYXgoJHgsIGF4ZXMsIHRydWUgLyoga2VlcERpbXMgKi8pO1xuICAgIGNvbnN0IGEgPSBzdWIoJHgsIHhNYXgpO1xuICAgIGNvbnN0IGIgPSBleHAoYSk7XG4gICAgY29uc3QgYyA9IHN1bShiLCBheGVzKTtcbiAgICBjb25zdCBkID0gbG9nKGMpO1xuICAgIGNvbnN0IHJlcyA9IGFkZChyZXNoYXBlKHhNYXgsIGQuc2hhcGUpLCBkKTtcbiAgICBpZiAoa2VlcERpbXMpIHtcbiAgICAgICAgY29uc3QgbmV3U2hhcGUgPSBleHBhbmRTaGFwZVRvS2VlcERpbShyZXMuc2hhcGUsIGF4ZXMpO1xuICAgICAgICByZXR1cm4gcmVzaGFwZShyZXMsIG5ld1NoYXBlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydCBjb25zdCBsb2dTdW1FeHAgPSBvcCh7IGxvZ1N1bUV4cF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sb2dfc3VtX2V4cC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgTG9naWNhbEFuZCB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUgfSBmcm9tICcuL2Jyb2FkY2FzdF91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSB0cnV0aCB2YWx1ZSBvZiBgYSBBTkQgYmAgZWxlbWVudC13aXNlLiBTdXBwb3J0cyBicm9hZGNhc3RpbmcuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbZmFsc2UsIGZhbHNlLCB0cnVlLCB0cnVlXSwgJ2Jvb2wnKTtcbiAqIGNvbnN0IGIgPSB0Zi50ZW5zb3IxZChbZmFsc2UsIHRydWUsIGZhbHNlLCB0cnVlXSwgJ2Jvb2wnKTtcbiAqXG4gKiBhLmxvZ2ljYWxBbmQoYikucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCBpbnB1dCB0ZW5zb3IuIE11c3QgYmUgb2YgZHR5cGUgYm9vbC5cbiAqIEBwYXJhbSBiIFRoZSBzZWNvbmQgaW5wdXQgdGVuc29yLiBNdXN0IGJlIG9mIGR0eXBlIGJvb2wuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnTG9naWNhbCd9XG4gKi9cbmZ1bmN0aW9uIGxvZ2ljYWxBbmRfKGEsIGIpIHtcbiAgICBjb25zdCAkYSA9IGNvbnZlcnRUb1RlbnNvcihhLCAnYScsICdsb2dpY2FsQW5kJywgJ2Jvb2wnKTtcbiAgICBjb25zdCAkYiA9IGNvbnZlcnRUb1RlbnNvcihiLCAnYicsICdsb2dpY2FsQW5kJywgJ2Jvb2wnKTtcbiAgICBhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSgkYS5zaGFwZSwgJGIuc2hhcGUpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgYTogJGEsIGI6ICRiIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoTG9naWNhbEFuZCwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBsb2dpY2FsQW5kID0gb3AoeyBsb2dpY2FsQW5kXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxvZ2ljYWxfYW5kLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBMb2dpY2FsTm90IH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogUmV0dXJucyB0aGUgdHJ1dGggdmFsdWUgb2YgYE5PVCB4YCBlbGVtZW50LXdpc2UuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbZmFsc2UsIHRydWVdLCAnYm9vbCcpO1xuICpcbiAqIGEubG9naWNhbE5vdCgpLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLiBNdXN0IGJlIG9mIGR0eXBlICdib29sJy5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdMb2dpY2FsJ31cbiAqL1xuZnVuY3Rpb24gbG9naWNhbE5vdF8oeCkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2xvZ2ljYWxOb3QnLCAnYm9vbCcpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChMb2dpY2FsTm90LCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IGxvZ2ljYWxOb3QgPSBvcCh7IGxvZ2ljYWxOb3RfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bG9naWNhbF9ub3QuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IExvZ2ljYWxPciB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUgfSBmcm9tICcuL2Jyb2FkY2FzdF91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSB0cnV0aCB2YWx1ZSBvZiBgYSBPUiBiYCBlbGVtZW50LXdpc2UuIFN1cHBvcnRzIGJyb2FkY2FzdGluZy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFtmYWxzZSwgZmFsc2UsIHRydWUsIHRydWVdLCAnYm9vbCcpO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjFkKFtmYWxzZSwgdHJ1ZSwgZmFsc2UsIHRydWVdLCAnYm9vbCcpO1xuICpcbiAqIGEubG9naWNhbE9yKGIpLnByaW50KCk7XG4gKiBgYGBcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCBpbnB1dCB0ZW5zb3IuIE11c3QgYmUgb2YgZHR5cGUgYm9vbC5cbiAqIEBwYXJhbSBiIFRoZSBzZWNvbmQgaW5wdXQgdGVuc29yLiBNdXN0IGJlIG9mIGR0eXBlIGJvb2wuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnTG9naWNhbCd9XG4gKi9cbmZ1bmN0aW9uIGxvZ2ljYWxPcl8oYSwgYikge1xuICAgIGNvbnN0ICRhID0gY29udmVydFRvVGVuc29yKGEsICdhJywgJ2xvZ2ljYWxPcicsICdib29sJyk7XG4gICAgY29uc3QgJGIgPSBjb252ZXJ0VG9UZW5zb3IoYiwgJ2InLCAnbG9naWNhbE9yJywgJ2Jvb2wnKTtcbiAgICBhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSgkYS5zaGFwZSwgJGIuc2hhcGUpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgYTogJGEsIGI6ICRiIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoTG9naWNhbE9yLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IGxvZ2ljYWxPciA9IG9wKHsgbG9naWNhbE9yXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxvZ2ljYWxfb3IuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IGFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlIH0gZnJvbSAnLi9icm9hZGNhc3RfdXRpbCc7XG5pbXBvcnQgeyBsb2dpY2FsQW5kIH0gZnJvbSAnLi9sb2dpY2FsX2FuZCc7XG5pbXBvcnQgeyBsb2dpY2FsTm90IH0gZnJvbSAnLi9sb2dpY2FsX25vdCc7XG5pbXBvcnQgeyBsb2dpY2FsT3IgfSBmcm9tICcuL2xvZ2ljYWxfb3InO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIFJldHVybnMgdGhlIHRydXRoIHZhbHVlIG9mIGBhIFhPUiBiYCBlbGVtZW50LXdpc2UuIFN1cHBvcnRzIGJyb2FkY2FzdGluZy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFtmYWxzZSwgZmFsc2UsIHRydWUsIHRydWVdLCAnYm9vbCcpO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjFkKFtmYWxzZSwgdHJ1ZSwgZmFsc2UsIHRydWVdLCAnYm9vbCcpO1xuICpcbiAqIGEubG9naWNhbFhvcihiKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGEgVGhlIGZpcnN0IGlucHV0IHRlbnNvci4gTXVzdCBiZSBvZiBkdHlwZSBib29sLlxuICogQHBhcmFtIGIgVGhlIHNlY29uZCBpbnB1dCB0ZW5zb3IuIE11c3QgYmUgb2YgZHR5cGUgYm9vbC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdMb2dpY2FsJ31cbiAqL1xuZnVuY3Rpb24gbG9naWNhbFhvcl8oYSwgYikge1xuICAgIGNvbnN0ICRhID0gY29udmVydFRvVGVuc29yKGEsICdhJywgJ2xvZ2ljYWxYb3InLCAnYm9vbCcpO1xuICAgIGNvbnN0ICRiID0gY29udmVydFRvVGVuc29yKGIsICdiJywgJ2xvZ2ljYWxYb3InLCAnYm9vbCcpO1xuICAgIGFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKCRhLnNoYXBlLCAkYi5zaGFwZSk7XG4gICAgLy8geCBeIHkgPSAoeCB8IHkpICYgfih4ICYgeSlcbiAgICByZXR1cm4gbG9naWNhbEFuZChsb2dpY2FsT3IoYSwgYiksIGxvZ2ljYWxOb3QobG9naWNhbEFuZChhLCBiKSkpO1xufVxuZXhwb3J0IGNvbnN0IGxvZ2ljYWxYb3IgPSBvcCh7IGxvZ2ljYWxYb3JfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bG9naWNhbF94b3IuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuZXhwb3J0IHZhciBSZWR1Y3Rpb247XG4oZnVuY3Rpb24gKFJlZHVjdGlvbikge1xuICAgIFJlZHVjdGlvbltSZWR1Y3Rpb25bXCJOT05FXCJdID0gMF0gPSBcIk5PTkVcIjtcbiAgICBSZWR1Y3Rpb25bUmVkdWN0aW9uW1wiTUVBTlwiXSA9IDFdID0gXCJNRUFOXCI7XG4gICAgUmVkdWN0aW9uW1JlZHVjdGlvbltcIlNVTVwiXSA9IDJdID0gXCJTVU1cIjtcbiAgICBSZWR1Y3Rpb25bUmVkdWN0aW9uW1wiU1VNX0JZX05PTlpFUk9fV0VJR0hUU1wiXSA9IDNdID0gXCJTVU1fQllfTk9OWkVST19XRUlHSFRTXCI7XG59KShSZWR1Y3Rpb24gfHwgKFJlZHVjdGlvbiA9IHt9KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sb3NzX29wc191dGlscy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgYXNzZXJ0U2hhcGVzTWF0Y2ggfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7IGFicyB9IGZyb20gJy4uL2Ficyc7XG5pbXBvcnQgeyBSZWR1Y3Rpb24gfSBmcm9tICcuLi9sb3NzX29wc191dGlscyc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4uL29wZXJhdGlvbic7XG5pbXBvcnQgeyBzdWIgfSBmcm9tICcuLi9zdWInO1xuaW1wb3J0IHsgY29tcHV0ZVdlaWdodGVkTG9zcyB9IGZyb20gJy4vY29tcHV0ZV93ZWlnaHRlZF9sb3NzJztcbi8qKlxuICogQ29tcHV0ZXMgdGhlIGFic29sdXRlIGRpZmZlcmVuY2UgbG9zcyBiZXR3ZWVuIHR3byB0ZW5zb3JzLlxuICpcbiAqIEBwYXJhbSBsYWJlbHMgVGhlIGdyb3VuZCB0cnV0aCBvdXRwdXQgdGVuc29yLCBzYW1lIGRpbWVuc2lvbnMgYXNcbiAqICAgICdwcmVkaWN0aW9ucycuXG4gKiBAcGFyYW0gcHJlZGljdGlvbnMgVGhlIHByZWRpY3RlZCBvdXRwdXRzLlxuICogQHBhcmFtIHdlaWdodHMgVGVuc29yIHdob3NlIHJhbmsgaXMgZWl0aGVyIDAsIG9yIHRoZSBzYW1lIHJhbmsgYXNcbiAqICAgIGBsYWJlbHNgLCBhbmQgbXVzdCBiZSBicm9hZGNhc3RhYmxlIHRvIGBsYWJlbHNgIChpLmUuLCBhbGwgZGltZW5zaW9uc1xuICogICAgbXVzdCBiZSBlaXRoZXIgYDFgLCBvciB0aGUgc2FtZSBhcyB0aGUgY29ycmVzcG9uZGluZyBgbG9zc2VzYFxuICogICAgZGltZW5zaW9uKS5cbiAqIEBwYXJhbSByZWR1Y3Rpb24gVHlwZSBvZiByZWR1Y3Rpb24gdG8gYXBwbHkgdG8gbG9zcy4gU2hvdWxkIGJlIG9mIHR5cGVcbiAqICAgIGBSZWR1Y3Rpb25gXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ0xvc3NlcycsIG5hbWVzcGFjZTogJ2xvc3Nlcyd9XG4gKi9cbmZ1bmN0aW9uIGFic29sdXRlRGlmZmVyZW5jZV8obGFiZWxzLCBwcmVkaWN0aW9ucywgd2VpZ2h0cywgcmVkdWN0aW9uID0gUmVkdWN0aW9uLlNVTV9CWV9OT05aRVJPX1dFSUdIVFMpIHtcbiAgICBjb25zdCAkbGFiZWxzID0gY29udmVydFRvVGVuc29yKGxhYmVscywgJ2xhYmVscycsICdhYnNvbHV0ZURpZmZlcmVuY2UnKTtcbiAgICBjb25zdCAkcHJlZGljdGlvbnMgPSBjb252ZXJ0VG9UZW5zb3IocHJlZGljdGlvbnMsICdwcmVkaWN0aW9ucycsICdhYnNvbHV0ZURpZmZlcmVuY2UnKTtcbiAgICBsZXQgJHdlaWdodHMgPSBudWxsO1xuICAgIGlmICh3ZWlnaHRzICE9IG51bGwpIHtcbiAgICAgICAgJHdlaWdodHMgPSBjb252ZXJ0VG9UZW5zb3Iod2VpZ2h0cywgJ3dlaWdodHMnLCAnYWJzb2x1dGVEaWZmZXJlbmNlJyk7XG4gICAgfVxuICAgIGFzc2VydFNoYXBlc01hdGNoKCRsYWJlbHMuc2hhcGUsICRwcmVkaWN0aW9ucy5zaGFwZSwgJ0Vycm9yIGluIGFic29sdXRlRGlmZmVyZW5jZTogJyk7XG4gICAgY29uc3QgbG9zc2VzID0gYWJzKHN1YigkbGFiZWxzLCAkcHJlZGljdGlvbnMpKTtcbiAgICByZXR1cm4gY29tcHV0ZVdlaWdodGVkTG9zcyhsb3NzZXMsICR3ZWlnaHRzLCByZWR1Y3Rpb24pO1xufVxuZXhwb3J0IGNvbnN0IGFic29sdXRlRGlmZmVyZW5jZSA9IG9wKHsgYWJzb2x1dGVEaWZmZXJlbmNlXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFic29sdXRlX2RpZmZlcmVuY2UuanMubWFwIiwiaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IGNhc3QgfSBmcm9tICcuLi9jYXN0JztcbmltcG9ydCB7IGRpdiB9IGZyb20gJy4uL2Rpdic7XG5pbXBvcnQgeyBSZWR1Y3Rpb24gfSBmcm9tICcuLi9sb3NzX29wc191dGlscyc7XG5pbXBvcnQgeyBtZWFuIH0gZnJvbSAnLi4vbWVhbic7XG5pbXBvcnQgeyBtdWwgfSBmcm9tICcuLi9tdWwnO1xuaW1wb3J0IHsgbm90RXF1YWwgfSBmcm9tICcuLi9ub3RfZXF1YWwnO1xuaW1wb3J0IHsgb25lcyB9IGZyb20gJy4uL29uZXMnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgc2NhbGFyIH0gZnJvbSAnLi4vc2NhbGFyJztcbmltcG9ydCB7IHN1bSB9IGZyb20gJy4uL3N1bSc7XG4vKipcbiAqIENvbXB1dGVzIHRoZSB3ZWlnaHRlZCBsb3NzIGJldHdlZW4gdHdvIHRlbnNvcnMuXG4gKlxuICogQHBhcmFtIGxvc3NlcyBUZW5zb3Igb2Ygc2hhcGUgYFtiYXRjaF9zaXplLCBkMSwgLi4uIGROXWAuXG4gKiBAcGFyYW0gd2VpZ2h0cyBUZW5zb3Igd2hvc2UgcmFuayBpcyBlaXRoZXIgMCwgb3IgdGhlIHNhbWUgcmFuayBhc1xuICogICAgYGxvc3Nlc2AsIGFuZCBtdXN0IGJlIGJyb2FkY2FzdGFibGUgdG8gYGxvc3Nlc2AgKGkuZS4sIGFsbFxuICogICAgZGltZW5zaW9ucyBtdXN0IGJlIGVpdGhlciBgMWAsIG9yIHRoZSBzYW1lIGFzIHRoZSBjb3JyZXNwb25kaW5nXG4gKiAgICBgbG9zc2VzYCBkaW1lbnNpb24pLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUcmFpbmluZycsIHN1YmhlYWRpbmc6ICdMb3NzZXMnLCBuYW1lc3BhY2U6ICdsb3NzZXMnfVxuICovXG5mdW5jdGlvbiBjb21wdXRlV2VpZ2h0ZWRMb3NzXyhsb3NzZXMsIHdlaWdodHMsIHJlZHVjdGlvbiA9IFJlZHVjdGlvbi5TVU1fQllfTk9OWkVST19XRUlHSFRTKSB7XG4gICAgY29uc3QgJGxvc3NlcyA9IGNvbnZlcnRUb1RlbnNvcihsb3NzZXMsICdsb3NzZXMnLCAnY29tcHV0ZVdlaWdodGVkTG9zcycpO1xuICAgIGxldCAkd2VpZ2h0cyA9IG51bGw7XG4gICAgaWYgKHdlaWdodHMgIT0gbnVsbCkge1xuICAgICAgICAkd2VpZ2h0cyA9IGNvbnZlcnRUb1RlbnNvcih3ZWlnaHRzLCAnd2VpZ2h0cycsICdjb21wdXRlV2VpZ2h0ZWRMb3NzJyk7XG4gICAgfVxuICAgIGNvbnN0IHdlaWdodGVkTG9zcyA9ICgkd2VpZ2h0cyA9PSBudWxsKSA/ICRsb3NzZXMgOiBtdWwoJGxvc3NlcywgJHdlaWdodHMpO1xuICAgIGlmIChyZWR1Y3Rpb24gPT09IFJlZHVjdGlvbi5OT05FKSB7XG4gICAgICAgIHJldHVybiB3ZWlnaHRlZExvc3M7XG4gICAgfVxuICAgIGlmIChyZWR1Y3Rpb24gPT09IFJlZHVjdGlvbi5TVU0pIHtcbiAgICAgICAgcmV0dXJuIHN1bSh3ZWlnaHRlZExvc3MpO1xuICAgIH1cbiAgICBpZiAocmVkdWN0aW9uID09PSBSZWR1Y3Rpb24uTUVBTikge1xuICAgICAgICBpZiAoJHdlaWdodHMgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG1lYW4od2VpZ2h0ZWRMb3NzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGJyb2FkY2FzdEZhY3RvciA9ICRsb3NzZXMuc2l6ZSAvICR3ZWlnaHRzLnNpemU7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBkaXYoc3VtKHdlaWdodGVkTG9zcyksIHN1bSgkd2VpZ2h0cykpO1xuICAgICAgICAgICAgcmV0dXJuIGJyb2FkY2FzdEZhY3RvciA+IDEgPyBkaXYocmVzdWx0LCBzY2FsYXIoYnJvYWRjYXN0RmFjdG9yKSkgOlxuICAgICAgICAgICAgICAgIHJlc3VsdDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAocmVkdWN0aW9uID09PSBSZWR1Y3Rpb24uU1VNX0JZX05PTlpFUk9fV0VJR0hUUykge1xuICAgICAgICBpZiAoJHdlaWdodHMgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGRpdihzdW0od2VpZ2h0ZWRMb3NzKSwgc2NhbGFyKCRsb3NzZXMuc2l6ZSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgYnJvYWRjYXN0ZWRXZWlnaHRzID0gbXVsKCR3ZWlnaHRzLCBvbmVzKCRsb3NzZXMuc2hhcGUpKTtcbiAgICAgICAgICAgIGNvbnN0IG51bU5vblplcm9zID0gY2FzdChzdW0obm90RXF1YWwoYnJvYWRjYXN0ZWRXZWlnaHRzLCBzY2FsYXIoMCkpKSwgJ2Zsb2F0MzInKTtcbiAgICAgICAgICAgIHJldHVybiBkaXYoc3VtKHdlaWdodGVkTG9zcyksIG51bU5vblplcm9zKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB0aHJvdyBFcnJvcihgVW5rbm93biByZWR1Y3Rpb246ICR7cmVkdWN0aW9ufWApO1xufVxuZXhwb3J0IGNvbnN0IGNvbXB1dGVXZWlnaHRlZExvc3MgPSBvcCh7IGNvbXB1dGVXZWlnaHRlZExvc3NfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29tcHV0ZV93ZWlnaHRlZF9sb3NzLmpzLm1hcCIsImltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBhc3NlcnRTaGFwZXNNYXRjaCB9IGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHsgUmVkdWN0aW9uIH0gZnJvbSAnLi4vbG9zc19vcHNfdXRpbHMnO1xuaW1wb3J0IHsgbXVsIH0gZnJvbSAnLi4vbXVsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHNjYWxhciB9IGZyb20gJy4uL3NjYWxhcic7XG5pbXBvcnQgeyBzdWIgfSBmcm9tICcuLi9zdWInO1xuaW1wb3J0IHsgc3VtIH0gZnJvbSAnLi4vc3VtJztcbmltcG9ydCB7IGNvbXB1dGVXZWlnaHRlZExvc3MgfSBmcm9tICcuL2NvbXB1dGVfd2VpZ2h0ZWRfbG9zcyc7XG4vKipcbiAqIENvbXB1dGVzIHRoZSBjb3NpbmUgZGlzdGFuY2UgbG9zcyBiZXR3ZWVuIHR3byB0ZW5zb3JzLlxuICpcbiAqIEBwYXJhbSBsYWJlbHMgVGhlIGdyb3VuZCB0cnV0aCBvdXRwdXQgdGVuc29yLCBzYW1lIGRpbWVuc2lvbnMgYXNcbiAqICAgICdwcmVkaWN0aW9ucycuXG4gKiBAcGFyYW0gcHJlZGljdGlvbnMgVGhlIHByZWRpY3RlZCBvdXRwdXRzLlxuICogQHBhcmFtIGF4aXMgVGhlIGRpbWVuc2lvbiBhbG9uZyB3aGljaCB0aGUgY29zaW5lIGRpc3RhbmNlIGlzIGNvbXB1dGVkLlxuICogQHBhcmFtIHdlaWdodHMgVGVuc29yIHdob3NlIHJhbmsgaXMgZWl0aGVyIDAsIG9yIHRoZSBzYW1lIHJhbmsgYXNcbiAqICAgIGBsYWJlbHNgLCBhbmQgbXVzdCBiZSBicm9hZGNhc3RhYmxlIHRvIGBsYWJlbHNgIChpLmUuLCBhbGwgZGltZW5zaW9uc1xuICogICAgbXVzdCBiZSBlaXRoZXIgYDFgLCBvciB0aGUgc2FtZSBhcyB0aGUgY29ycmVzcG9uZGluZyBgbG9zc2VzYFxuICogICAgZGltZW5zaW9uKS5cbiAqIEBwYXJhbSByZWR1Y3Rpb24gVHlwZSBvZiByZWR1Y3Rpb24gdG8gYXBwbHkgdG8gbG9zcy4gU2hvdWxkIGJlIG9mIHR5cGVcbiAqICAgIGBSZWR1Y3Rpb25gXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ0xvc3NlcycsIG5hbWVzcGFjZTogJ2xvc3Nlcyd9XG4gKi9cbmZ1bmN0aW9uIGNvc2luZURpc3RhbmNlXyhsYWJlbHMsIHByZWRpY3Rpb25zLCBheGlzLCB3ZWlnaHRzLCByZWR1Y3Rpb24gPSBSZWR1Y3Rpb24uU1VNX0JZX05PTlpFUk9fV0VJR0hUUykge1xuICAgIGNvbnN0ICRsYWJlbHMgPSBjb252ZXJ0VG9UZW5zb3IobGFiZWxzLCAnbGFiZWxzJywgJ2Nvc2luZURpc3RhbmNlJyk7XG4gICAgY29uc3QgJHByZWRpY3Rpb25zID0gY29udmVydFRvVGVuc29yKHByZWRpY3Rpb25zLCAncHJlZGljdGlvbnMnLCAnY29zaW5lRGlzdGFuY2UnKTtcbiAgICBsZXQgJHdlaWdodHMgPSBudWxsO1xuICAgIGlmICh3ZWlnaHRzICE9IG51bGwpIHtcbiAgICAgICAgJHdlaWdodHMgPSBjb252ZXJ0VG9UZW5zb3Iod2VpZ2h0cywgJ3dlaWdodHMnLCAnY29zaW5lRGlzdGFuY2UnKTtcbiAgICB9XG4gICAgYXNzZXJ0U2hhcGVzTWF0Y2goJGxhYmVscy5zaGFwZSwgJHByZWRpY3Rpb25zLnNoYXBlLCAnRXJyb3IgaW4gY29zaW5lRGlzdGFuY2U6ICcpO1xuICAgIGNvbnN0IG9uZSA9IHNjYWxhcigxKTtcbiAgICBjb25zdCBsb3NzZXMgPSBzdWIob25lLCBzdW0obXVsKCRsYWJlbHMsICRwcmVkaWN0aW9ucyksIGF4aXMsIHRydWUpKTtcbiAgICByZXR1cm4gY29tcHV0ZVdlaWdodGVkTG9zcyhsb3NzZXMsICR3ZWlnaHRzLCByZWR1Y3Rpb24pO1xufVxuZXhwb3J0IGNvbnN0IGNvc2luZURpc3RhbmNlID0gb3AoeyBjb3NpbmVEaXN0YW5jZV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb3NpbmVfZGlzdGFuY2UuanMubWFwIiwiaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IGFzc2VydFNoYXBlc01hdGNoIH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQgeyBSZWR1Y3Rpb24gfSBmcm9tICcuLi9sb3NzX29wc191dGlscyc7XG5pbXBvcnQgeyBtdWwgfSBmcm9tICcuLi9tdWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgcmVsdSB9IGZyb20gJy4uL3JlbHUnO1xuaW1wb3J0IHsgc2NhbGFyIH0gZnJvbSAnLi4vc2NhbGFyJztcbmltcG9ydCB7IHN1YiB9IGZyb20gJy4uL3N1Yic7XG5pbXBvcnQgeyBjb21wdXRlV2VpZ2h0ZWRMb3NzIH0gZnJvbSAnLi9jb21wdXRlX3dlaWdodGVkX2xvc3MnO1xuLyoqXG4gKiBDb21wdXRlcyB0aGUgSGluZ2UgbG9zcyBiZXR3ZWVuIHR3byB0ZW5zb3JzLlxuICpcbiAqIEBwYXJhbSBsYWJlbHMgVGhlIGdyb3VuZCB0cnV0aCBvdXRwdXQgdGVuc29yLCBzYW1lIGRpbWVuc2lvbnMgYXNcbiAqICAgICdwcmVkaWN0aW9ucycuXG4gKiBAcGFyYW0gcHJlZGljdGlvbnMgVGhlIHByZWRpY3RlZCBvdXRwdXRzLlxuICogQHBhcmFtIHdlaWdodHMgVGVuc29yIHdob3NlIHJhbmsgaXMgZWl0aGVyIDAsIG9yIHRoZSBzYW1lIHJhbmsgYXNcbiAqICAgIGBsYWJlbHNgLCBhbmQgbXVzdCBiZSBicm9hZGNhc3RhYmxlIHRvIGBsYWJlbHNgIChpLmUuLCBhbGwgZGltZW5zaW9uc1xuICogICAgbXVzdCBiZSBlaXRoZXIgYDFgLCBvciB0aGUgc2FtZSBhcyB0aGUgY29ycmVzcG9uZGluZyBgbG9zc2VzYFxuICogICAgZGltZW5zaW9uKS5cbiAqIEBwYXJhbSByZWR1Y3Rpb24gVHlwZSBvZiByZWR1Y3Rpb24gdG8gYXBwbHkgdG8gbG9zcy4gU2hvdWxkIGJlIG9mIHR5cGVcbiAqICAgIGBSZWR1Y3Rpb25gXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ0xvc3NlcycsIG5hbWVzcGFjZTogJ2xvc3Nlcyd9XG4gKi9cbmZ1bmN0aW9uIGhpbmdlTG9zc18obGFiZWxzLCBwcmVkaWN0aW9ucywgd2VpZ2h0cywgcmVkdWN0aW9uID0gUmVkdWN0aW9uLlNVTV9CWV9OT05aRVJPX1dFSUdIVFMpIHtcbiAgICBsZXQgJGxhYmVscyA9IGNvbnZlcnRUb1RlbnNvcihsYWJlbHMsICdsYWJlbHMnLCAnaGluZ2VMb3NzJyk7XG4gICAgY29uc3QgJHByZWRpY3Rpb25zID0gY29udmVydFRvVGVuc29yKHByZWRpY3Rpb25zLCAncHJlZGljdGlvbnMnLCAnaGluZ2VMb3NzJyk7XG4gICAgbGV0ICR3ZWlnaHRzID0gbnVsbDtcbiAgICBpZiAod2VpZ2h0cyAhPSBudWxsKSB7XG4gICAgICAgICR3ZWlnaHRzID0gY29udmVydFRvVGVuc29yKHdlaWdodHMsICd3ZWlnaHRzJywgJ2hpbmdlTG9zcycpO1xuICAgIH1cbiAgICBhc3NlcnRTaGFwZXNNYXRjaCgkbGFiZWxzLnNoYXBlLCAkcHJlZGljdGlvbnMuc2hhcGUsICdFcnJvciBpbiBoaW5nZUxvc3M6ICcpO1xuICAgIGNvbnN0IG9uZSA9IHNjYWxhcigxKTtcbiAgICAvLyBDb252ZXJ0IGJpbmFyeSBsYWJlbHMgdG8gKC0xLCAxKVxuICAgICRsYWJlbHMgPSBzdWIobXVsKHNjYWxhcigyKSwgJGxhYmVscyksIG9uZSk7XG4gICAgY29uc3QgbG9zc2VzID0gcmVsdShzdWIob25lLCBtdWwoJGxhYmVscywgJHByZWRpY3Rpb25zKSkpO1xuICAgIHJldHVybiBjb21wdXRlV2VpZ2h0ZWRMb3NzKGxvc3NlcywgJHdlaWdodHMsIHJlZHVjdGlvbik7XG59XG5leHBvcnQgY29uc3QgaGluZ2VMb3NzID0gb3AoeyBoaW5nZUxvc3NfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aGluZ2VfbG9zcy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgYXNzZXJ0U2hhcGVzTWF0Y2ggfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7IGFicyB9IGZyb20gJy4uL2Ficyc7XG5pbXBvcnQgeyBhZGQgfSBmcm9tICcuLi9hZGQnO1xuaW1wb3J0IHsgUmVkdWN0aW9uIH0gZnJvbSAnLi4vbG9zc19vcHNfdXRpbHMnO1xuaW1wb3J0IHsgbWluaW11bSB9IGZyb20gJy4uL21pbmltdW0nO1xuaW1wb3J0IHsgbXVsIH0gZnJvbSAnLi4vbXVsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHNjYWxhciB9IGZyb20gJy4uL3NjYWxhcic7XG5pbXBvcnQgeyBzcXVhcmUgfSBmcm9tICcuLi9zcXVhcmUnO1xuaW1wb3J0IHsgc3ViIH0gZnJvbSAnLi4vc3ViJztcbmltcG9ydCB7IGNvbXB1dGVXZWlnaHRlZExvc3MgfSBmcm9tICcuL2NvbXB1dGVfd2VpZ2h0ZWRfbG9zcyc7XG4vKipcbiAqIENvbXB1dGVzIHRoZSBodWJlciBsb3NzIGJldHdlZW4gdHdvIHRlbnNvcnMuXG4gKlxuICogQHBhcmFtIGxhYmVscyBUaGUgZ3JvdW5kIHRydXRoIG91dHB1dCB0ZW5zb3IsIHNhbWUgZGltZW5zaW9ucyBhc1xuICogICAgJ3ByZWRpY3Rpb25zJy5cbiAqIEBwYXJhbSBwcmVkaWN0aW9ucyBUaGUgcHJlZGljdGVkIG91dHB1dHMuXG4gKiBAcGFyYW0gd2VpZ2h0cyBUZW5zb3Igd2hvc2UgcmFuayBpcyBlaXRoZXIgMCwgb3IgdGhlIHNhbWUgcmFuayBhc1xuICogICAgYGxhYmVsc2AsIGFuZCBtdXN0IGJlIGJyb2FkY2FzdGFibGUgdG8gYGxhYmVsc2AgKGkuZS4sIGFsbCBkaW1lbnNpb25zXG4gKiAgICBtdXN0IGJlIGVpdGhlciBgMWAsIG9yIHRoZSBzYW1lIGFzIHRoZSBjb3JyZXNwb25kaW5nIGBsb3NzZXNgXG4gKiAgICBkaW1lbnNpb24pLlxuICogQHBhcmFtIGRlbHRhIFBvaW50IHdoZXJlIGh1YmVyIGxvc3MgY2hhbmdlcyBmcm9tIHF1YWRyYXRpYyB0byBsaW5lYXIuXG4gKiBAcGFyYW0gcmVkdWN0aW9uIFR5cGUgb2YgcmVkdWN0aW9uIHRvIGFwcGx5IHRvIGxvc3MuIFNob3VsZCBiZSBvZiB0eXBlXG4gKiAgICBgUmVkdWN0aW9uYC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVHJhaW5pbmcnLCBzdWJoZWFkaW5nOiAnTG9zc2VzJywgbmFtZXNwYWNlOiAnbG9zc2VzJ31cbiAqL1xuZnVuY3Rpb24gaHViZXJMb3NzXyhsYWJlbHMsIHByZWRpY3Rpb25zLCB3ZWlnaHRzLCBkZWx0YSA9IDEuMCwgcmVkdWN0aW9uID0gUmVkdWN0aW9uLlNVTV9CWV9OT05aRVJPX1dFSUdIVFMpIHtcbiAgICBjb25zdCAkbGFiZWxzID0gY29udmVydFRvVGVuc29yKGxhYmVscywgJ2xhYmVscycsICdodWJlckxvc3MnKTtcbiAgICBjb25zdCAkcHJlZGljdGlvbnMgPSBjb252ZXJ0VG9UZW5zb3IocHJlZGljdGlvbnMsICdwcmVkaWN0aW9ucycsICdodWJlckxvc3MnKTtcbiAgICBsZXQgJHdlaWdodHMgPSBudWxsO1xuICAgIGlmICh3ZWlnaHRzICE9IG51bGwpIHtcbiAgICAgICAgJHdlaWdodHMgPSBjb252ZXJ0VG9UZW5zb3Iod2VpZ2h0cywgJ3dlaWdodHMnLCAnaHViZXJMb3NzJyk7XG4gICAgfVxuICAgIGFzc2VydFNoYXBlc01hdGNoKCRsYWJlbHMuc2hhcGUsICRwcmVkaWN0aW9ucy5zaGFwZSwgJ0Vycm9yIGluIGh1YmVyTG9zczogJyk7XG4gICAgY29uc3QgZGVsdGFTY2FsYXIgPSBzY2FsYXIoZGVsdGEpO1xuICAgIGNvbnN0IGVycm9yID0gYWJzKHN1YigkcHJlZGljdGlvbnMsICRsYWJlbHMpKTtcbiAgICBjb25zdCBxdWFkcmF0aWMgPSBtaW5pbXVtKGVycm9yLCBkZWx0YVNjYWxhcik7XG4gICAgY29uc3QgbGluZWFyID0gc3ViKGVycm9yLCBxdWFkcmF0aWMpO1xuICAgIGNvbnN0IGxvc3NlcyA9IGFkZChtdWwoc2NhbGFyKDAuNSksIHNxdWFyZShxdWFkcmF0aWMpKSwgbXVsKGRlbHRhU2NhbGFyLCBsaW5lYXIpKTtcbiAgICByZXR1cm4gY29tcHV0ZVdlaWdodGVkTG9zcyhsb3NzZXMsICR3ZWlnaHRzLCByZWR1Y3Rpb24pO1xufVxuZXhwb3J0IGNvbnN0IGh1YmVyTG9zcyA9IG9wKHsgaHViZXJMb3NzXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWh1YmVyX2xvc3MuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IGFzc2VydFNoYXBlc01hdGNoIH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQgeyBhZGQgfSBmcm9tICcuLi9hZGQnO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSAnLi4vbG9nJztcbmltcG9ydCB7IFJlZHVjdGlvbiB9IGZyb20gJy4uL2xvc3Nfb3BzX3V0aWxzJztcbmltcG9ydCB7IG11bCB9IGZyb20gJy4uL211bCc7XG5pbXBvcnQgeyBuZWcgfSBmcm9tICcuLi9uZWcnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgc2NhbGFyIH0gZnJvbSAnLi4vc2NhbGFyJztcbmltcG9ydCB7IHN1YiB9IGZyb20gJy4uL3N1Yic7XG5pbXBvcnQgeyBjb21wdXRlV2VpZ2h0ZWRMb3NzIH0gZnJvbSAnLi9jb21wdXRlX3dlaWdodGVkX2xvc3MnO1xuLyoqXG4gKiBDb21wdXRlcyB0aGUgbG9nIGxvc3MgYmV0d2VlbiB0d28gdGVuc29ycy5cbiAqXG4gKiBAcGFyYW0gbGFiZWxzIFRoZSBncm91bmQgdHJ1dGggb3V0cHV0IHRlbnNvciwgc2FtZSBkaW1lbnNpb25zIGFzXG4gKiAgICAncHJlZGljdGlvbnMnLlxuICogQHBhcmFtIHByZWRpY3Rpb25zIFRoZSBwcmVkaWN0ZWQgb3V0cHV0cy5cbiAqIEBwYXJhbSB3ZWlnaHRzIFRlbnNvciB3aG9zZSByYW5rIGlzIGVpdGhlciAwLCBvciB0aGUgc2FtZSByYW5rIGFzXG4gKiAgICBgbGFiZWxzYCwgYW5kIG11c3QgYmUgYnJvYWRjYXN0YWJsZSB0byBgbGFiZWxzYCAoaS5lLiwgYWxsIGRpbWVuc2lvbnNcbiAqICAgIG11c3QgYmUgZWl0aGVyIGAxYCwgb3IgdGhlIHNhbWUgYXMgdGhlIGNvcnJlc3BvbmRpbmcgYGxvc3Nlc2BcbiAqICAgIGRpbWVuc2lvbikuXG4gKiBAcGFyYW0gZXBzaWxvbiBBIHNtYWxsIGluY3JlbWVudCB0byBhdm9pZCB0YWtpbmcgbG9nIG9mIHplcm9cbiAqIEBwYXJhbSByZWR1Y3Rpb24gVHlwZSBvZiByZWR1Y3Rpb24gdG8gYXBwbHkgdG8gbG9zcy4gU2hvdWxkIGJlIG9mIHR5cGVcbiAqICAgIGBSZWR1Y3Rpb25gXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ0xvc3NlcycsIG5hbWVzcGFjZTogJ2xvc3Nlcyd9XG4gKi9cbmZ1bmN0aW9uIGxvZ0xvc3NfKGxhYmVscywgcHJlZGljdGlvbnMsIHdlaWdodHMsIGVwc2lsb24gPSAxZS03LCByZWR1Y3Rpb24gPSBSZWR1Y3Rpb24uU1VNX0JZX05PTlpFUk9fV0VJR0hUUykge1xuICAgIGNvbnN0ICRsYWJlbHMgPSBjb252ZXJ0VG9UZW5zb3IobGFiZWxzLCAnbGFiZWxzJywgJ2xvZ0xvc3MnKTtcbiAgICBjb25zdCAkcHJlZGljdGlvbnMgPSBjb252ZXJ0VG9UZW5zb3IocHJlZGljdGlvbnMsICdwcmVkaWN0aW9ucycsICdsb2dMb3NzJyk7XG4gICAgbGV0ICR3ZWlnaHRzID0gbnVsbDtcbiAgICBpZiAod2VpZ2h0cyAhPSBudWxsKSB7XG4gICAgICAgICR3ZWlnaHRzID0gY29udmVydFRvVGVuc29yKHdlaWdodHMsICd3ZWlnaHRzJywgJ2xvZ0xvc3MnKTtcbiAgICB9XG4gICAgYXNzZXJ0U2hhcGVzTWF0Y2goJGxhYmVscy5zaGFwZSwgJHByZWRpY3Rpb25zLnNoYXBlLCAnRXJyb3IgaW4gbG9nTG9zczogJyk7XG4gICAgY29uc3Qgb25lID0gc2NhbGFyKDEpO1xuICAgIGNvbnN0IGVwc2lsb25TY2FsYXIgPSBzY2FsYXIoZXBzaWxvbik7XG4gICAgY29uc3QgbDEgPSBuZWcobXVsKCRsYWJlbHMsIGxvZyhhZGQoJHByZWRpY3Rpb25zLCBlcHNpbG9uU2NhbGFyKSkpKTtcbiAgICBjb25zdCBsMiA9IG11bChzdWIob25lLCAkbGFiZWxzKSwgbG9nKGFkZChzdWIob25lLCAkcHJlZGljdGlvbnMpLCBlcHNpbG9uU2NhbGFyKSkpO1xuICAgIGNvbnN0IGxvc3NlcyA9IHN1YihsMSwgbDIpO1xuICAgIHJldHVybiBjb21wdXRlV2VpZ2h0ZWRMb3NzKGxvc3NlcywgJHdlaWdodHMsIHJlZHVjdGlvbik7XG59XG5leHBvcnQgY29uc3QgbG9nTG9zcyA9IG9wKHsgbG9nTG9zc18gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sb2dfbG9zcy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgYXNzZXJ0U2hhcGVzTWF0Y2ggfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7IFJlZHVjdGlvbiB9IGZyb20gJy4uL2xvc3Nfb3BzX3V0aWxzJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHNxdWFyZWREaWZmZXJlbmNlIH0gZnJvbSAnLi4vc3F1YXJlZF9kaWZmZXJlbmNlJztcbmltcG9ydCB7IGNvbXB1dGVXZWlnaHRlZExvc3MgfSBmcm9tICcuL2NvbXB1dGVfd2VpZ2h0ZWRfbG9zcyc7XG4vKipcbiAqIENvbXB1dGVzIHRoZSBtZWFuIHNxdWFyZWQgZXJyb3IgYmV0d2VlbiB0d28gdGVuc29ycy5cbiAqXG4gKiBAcGFyYW0gbGFiZWxzIFRoZSBncm91bmQgdHJ1dGggb3V0cHV0IHRlbnNvciwgc2FtZSBkaW1lbnNpb25zIGFzXG4gKiAgICAncHJlZGljdGlvbnMnLlxuICogQHBhcmFtIHByZWRpY3Rpb25zIFRoZSBwcmVkaWN0ZWQgb3V0cHV0cy5cbiAqIEBwYXJhbSB3ZWlnaHRzIFRlbnNvciB3aG9zZSByYW5rIGlzIGVpdGhlciAwLCBvciB0aGUgc2FtZSByYW5rIGFzXG4gKiAgICBgbGFiZWxzYCwgYW5kIG11c3QgYmUgYnJvYWRjYXN0YWJsZSB0byBgbGFiZWxzYCAoaS5lLiwgYWxsIGRpbWVuc2lvbnNcbiAqICAgIG11c3QgYmUgZWl0aGVyIGAxYCwgb3IgdGhlIHNhbWUgYXMgdGhlIGNvcnJlc3BvbmRpbmcgYGxvc3Nlc2BcbiAqICAgIGRpbWVuc2lvbikuXG4gKiBAcGFyYW0gcmVkdWN0aW9uIFR5cGUgb2YgcmVkdWN0aW9uIHRvIGFwcGx5IHRvIGxvc3MuIFNob3VsZCBiZSBvZiB0eXBlXG4gKiAgICBgUmVkdWN0aW9uYFxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUcmFpbmluZycsIHN1YmhlYWRpbmc6ICdMb3NzZXMnLCBuYW1lc3BhY2U6ICdsb3NzZXMnfVxuICovXG5mdW5jdGlvbiBtZWFuU3F1YXJlZEVycm9yXyhsYWJlbHMsIHByZWRpY3Rpb25zLCB3ZWlnaHRzLCByZWR1Y3Rpb24gPSBSZWR1Y3Rpb24uU1VNX0JZX05PTlpFUk9fV0VJR0hUUykge1xuICAgIGNvbnN0ICRsYWJlbHMgPSBjb252ZXJ0VG9UZW5zb3IobGFiZWxzLCAnbGFiZWxzJywgJ21lYW5TcXVhcmVkRXJyb3InKTtcbiAgICBjb25zdCAkcHJlZGljdGlvbnMgPSBjb252ZXJ0VG9UZW5zb3IocHJlZGljdGlvbnMsICdwcmVkaWN0aW9ucycsICdtZWFuU3F1YXJlZEVycm9yJyk7XG4gICAgbGV0ICR3ZWlnaHRzID0gbnVsbDtcbiAgICBpZiAod2VpZ2h0cyAhPSBudWxsKSB7XG4gICAgICAgICR3ZWlnaHRzID0gY29udmVydFRvVGVuc29yKHdlaWdodHMsICd3ZWlnaHRzJywgJ21lYW5TcXVhcmVkRXJyb3InKTtcbiAgICB9XG4gICAgYXNzZXJ0U2hhcGVzTWF0Y2goJGxhYmVscy5zaGFwZSwgJHByZWRpY3Rpb25zLnNoYXBlLCAnRXJyb3IgaW4gbWVhblNxdWFyZWRFcnJvcjogJyk7XG4gICAgY29uc3QgbG9zc2VzID0gc3F1YXJlZERpZmZlcmVuY2UoJGxhYmVscywgJHByZWRpY3Rpb25zKTtcbiAgICByZXR1cm4gY29tcHV0ZVdlaWdodGVkTG9zcyhsb3NzZXMsICR3ZWlnaHRzLCByZWR1Y3Rpb24pO1xufVxuZXhwb3J0IGNvbnN0IG1lYW5TcXVhcmVkRXJyb3IgPSBvcCh7IG1lYW5TcXVhcmVkRXJyb3JfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWVhbl9zcXVhcmVkX2Vycm9yLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBhc3NlcnRTaGFwZXNNYXRjaCB9IGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHsgYWJzIH0gZnJvbSAnLi4vYWJzJztcbmltcG9ydCB7IGFkZCB9IGZyb20gJy4uL2FkZCc7XG5pbXBvcnQgeyBleHAgfSBmcm9tICcuLi9leHAnO1xuaW1wb3J0IHsgbG9nMXAgfSBmcm9tICcuLi9sb2cxcCc7XG5pbXBvcnQgeyBSZWR1Y3Rpb24gfSBmcm9tICcuLi9sb3NzX29wc191dGlscyc7XG5pbXBvcnQgeyBtdWwgfSBmcm9tICcuLi9tdWwnO1xuaW1wb3J0IHsgbmVnIH0gZnJvbSAnLi4vbmVnJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHJlbHUgfSBmcm9tICcuLi9yZWx1JztcbmltcG9ydCB7IHNjYWxhciB9IGZyb20gJy4uL3NjYWxhcic7XG5pbXBvcnQgeyBzdWIgfSBmcm9tICcuLi9zdWInO1xuaW1wb3J0IHsgY29tcHV0ZVdlaWdodGVkTG9zcyB9IGZyb20gJy4vY29tcHV0ZV93ZWlnaHRlZF9sb3NzJztcbmZ1bmN0aW9uIHNpZ21vaWRDcm9zc0VudHJvcHlXaXRoTG9naXRzXyhsYWJlbHMsIGxvZ2l0cykge1xuICAgIGNvbnN0ICRsYWJlbHMgPSBjb252ZXJ0VG9UZW5zb3IobGFiZWxzLCAnbGFiZWxzJywgJ3NpZ21vaWRDcm9zc0VudHJvcHlXaXRoTG9naXRzJyk7XG4gICAgY29uc3QgJGxvZ2l0cyA9IGNvbnZlcnRUb1RlbnNvcihsb2dpdHMsICdsb2dpdHMnLCAnc2lnbW9pZENyb3NzRW50cm9weVdpdGhMb2dpdHMnKTtcbiAgICBhc3NlcnRTaGFwZXNNYXRjaCgkbGFiZWxzLnNoYXBlLCAkbG9naXRzLnNoYXBlLCAnRXJyb3IgaW4gc2lnbW9pZENyb3NzRW50cm9weVdpdGhMb2dpdHM6ICcpO1xuICAgIC8qKlxuICAgICAqIEltcGxlbWVudGF0aW9uIERldGFpbHM6XG4gICAgICpcbiAgICAgKiBGb3IgYnJldml0eSwgbGV0IGB4ID0gbG9naXRzYCwgYHogPSBsYWJlbHNgLiAgVGhlIGxvZ2lzdGljIGxvc3MgaXNcbiAgICAgKiAgICAgeiAqIC1sb2coc2lnbW9pZCh4KSkgKyAoMSAtIHopICogLWxvZygxIC0gc2lnbW9pZCh4KSlcbiAgICAgKiAgID0geiAqIC1sb2coMSAvICgxICsgZXhwKC14KSkpICsgKDEgLSB6KSAqIC1sb2coZXhwKC14KSAvICgxICsgZXhwKC14KSkpXG4gICAgICogICA9IHogKiBsb2coMSArIGV4cCgteCkpICsgKDEgLSB6KSAqICgtbG9nKGV4cCgteCkpICsgbG9nKDEgKyBleHAoLXgpKSlcbiAgICAgKiAgID0geiAqIGxvZygxICsgZXhwKC14KSkgKyAoMSAtIHopICogKHggKyBsb2coMSArIGV4cCgteCkpXG4gICAgICogICA9ICgxIC0geikgKiB4ICsgbG9nKDEgKyBleHAoLXgpKVxuICAgICAqICAgPSB4IC0geCAqIHogKyBsb2coMSArIGV4cCgteCkpXG4gICAgICpcbiAgICAgKiAgIEZvciB4IDwgMCwgdG8gYXZvaWQgb3ZlcmZsb3cgaW4gZXhwKC14KSwgd2UgcmVmb3JtdWxhdGUgdGhlIGFib3ZlXG4gICAgICogICAgIHggLSB4ICogeiArIGxvZygxICsgZXhwKC14KSlcbiAgICAgKiAgID0gbG9nKGV4cCh4KSkgLSB4ICogeiArIGxvZygxICsgZXhwKC14KSlcbiAgICAgKiAgID0gLSB4ICogeiArIGxvZygxICsgZXhwKHgpKVxuICAgICAqXG4gICAgICogSGVuY2UsIHRvIGVuc3VyZSBzdGFiaWxpdHkgYW5kIGF2b2lkIG92ZXJmbG93LCB0aGUgaW1wbGVtZW50YXRpb24gdXNlc1xuICAgICAqIHRoaXMgZXF1aXZhbGVudCBmb3JtdWxhdGlvbjpcbiAgICAgKiAgICAgbWF4KHgsIDApIC0geCAqIHogKyBsb2coMSArIGV4cCgtYWJzKHgpKSlcbiAgICAgKi9cbiAgICBjb25zdCBtYXhPdXRwdXQgPSByZWx1KCRsb2dpdHMpO1xuICAgIGNvbnN0IG91dHB1dFhUYXJnZXQgPSBtdWwoJGxvZ2l0cywgJGxhYmVscyk7XG4gICAgY29uc3Qgc2lnbW9pZE91dHB1dCA9IGxvZzFwKGV4cChuZWcoYWJzKCRsb2dpdHMpKSkpO1xuICAgIHJldHVybiBhZGQoc3ViKG1heE91dHB1dCwgb3V0cHV0WFRhcmdldCksIHNpZ21vaWRPdXRwdXQpO1xufVxuLyoqXG4gKiBDb21wdXRlcyB0aGUgc2lnbW9pZCBjcm9zcyBlbnRyb3B5IGxvc3MgYmV0d2VlbiB0d28gdGVuc29ycy5cbiAqXG4gKiBJZiBsYWJlbFNtb290aGluZyBpcyBub256ZXJvLCBzbW9vdGggdGhlIGxhYmVscyB0b3dhcmRzIDEvMjpcbiAqXG4gKiAgIG5ld011bHRpY2xhc3NMYWJlbHMgPSBtdWx0aWNsYXNzTGFiZWxzICogKDEgLSBsYWJlbFNtb290aGluZylcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICsgMC41ICogbGFiZWxTbW9vdGhpbmdcbiAqXG4gKiBAcGFyYW0gbXVsdGlDbGFzc0xhYmVscyBUaGUgZ3JvdW5kIHRydXRoIG91dHB1dCB0ZW5zb3Igb2Ygc2hhcGVcbiAqIFtiYXRjaF9zaXplLCBudW1fY2xhc3Nlc10sIHNhbWUgZGltZW5zaW9ucyBhcyAncHJlZGljdGlvbnMnLlxuICogQHBhcmFtIGxvZ2l0cyBUaGUgcHJlZGljdGVkIG91dHB1dHMuXG4gKiBAcGFyYW0gd2VpZ2h0cyBUZW5zb3Igd2hvc2UgcmFuayBpcyBlaXRoZXIgMCwgb3IgdGhlIHNhbWUgcmFuayBhc1xuICogICAgYGxhYmVsc2AsIGFuZCBtdXN0IGJlIGJyb2FkY2FzdGFibGUgdG8gYGxhYmVsc2AgKGkuZS4sIGFsbCBkaW1lbnNpb25zXG4gKiAgICBtdXN0IGJlIGVpdGhlciBgMWAsIG9yIHRoZSBzYW1lIGFzIHRoZSBjb3JyZXNwb25kaW5nIGBsb3NzZXNgXG4gKiAgICBkaW1lbnNpb24pLlxuICogQHBhcmFtIGxhYmVsU21vb3RoaW5nIElmIGdyZWF0ZXIgdGhhbiAwLCB0aGVuIHNtb290aCB0aGUgbGFiZWxzLlxuICogQHBhcmFtIHJlZHVjdGlvbiBUeXBlIG9mIHJlZHVjdGlvbiB0byBhcHBseSB0byBsb3NzLiBTaG91bGQgYmUgb2YgdHlwZVxuICogICAgYFJlZHVjdGlvbmBcbiAqXG4gKiBAZG9jIHsgaGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ0xvc3NlcycsIG5hbWVzcGFjZTogJ2xvc3NlcycgfVxuICovXG5mdW5jdGlvbiBzaWdtb2lkQ3Jvc3NFbnRyb3B5XyhtdWx0aUNsYXNzTGFiZWxzLCBsb2dpdHMsIHdlaWdodHMsIGxhYmVsU21vb3RoaW5nID0gMCwgcmVkdWN0aW9uID0gUmVkdWN0aW9uLlNVTV9CWV9OT05aRVJPX1dFSUdIVFMpIHtcbiAgICBsZXQgJG11bHRpQ2xhc3NMYWJlbHMgPSBjb252ZXJ0VG9UZW5zb3IobXVsdGlDbGFzc0xhYmVscywgJ211bHRpQ2xhc3NMYWJlbHMnLCAnc2lnbW9pZENyb3NzRW50cm9weScpO1xuICAgIGNvbnN0ICRsb2dpdHMgPSBjb252ZXJ0VG9UZW5zb3IobG9naXRzLCAnbG9naXRzJywgJ3NpZ21vaWRDcm9zc0VudHJvcHknKTtcbiAgICBsZXQgJHdlaWdodHMgPSBudWxsO1xuICAgIGlmICh3ZWlnaHRzICE9IG51bGwpIHtcbiAgICAgICAgJHdlaWdodHMgPSBjb252ZXJ0VG9UZW5zb3Iod2VpZ2h0cywgJ3dlaWdodHMnLCAnc2lnbW9pZENyb3NzRW50cm9weScpO1xuICAgIH1cbiAgICBhc3NlcnRTaGFwZXNNYXRjaCgkbXVsdGlDbGFzc0xhYmVscy5zaGFwZSwgJGxvZ2l0cy5zaGFwZSwgJ0Vycm9yIGluIHNpZ21vaWRDcm9zc0VudHJvcHk6ICcpO1xuICAgIGlmIChsYWJlbFNtb290aGluZyA+IDApIHtcbiAgICAgICAgY29uc3QgbGFiZWxTbW9vdGhpbmdTY2FsYXIgPSBzY2FsYXIobGFiZWxTbW9vdGhpbmcpO1xuICAgICAgICBjb25zdCBvbmUgPSBzY2FsYXIoMSk7XG4gICAgICAgIGNvbnN0IGhhbGYgPSBzY2FsYXIoMC41KTtcbiAgICAgICAgJG11bHRpQ2xhc3NMYWJlbHMgPVxuICAgICAgICAgICAgYWRkKG11bCgkbXVsdGlDbGFzc0xhYmVscywgc3ViKG9uZSwgbGFiZWxTbW9vdGhpbmdTY2FsYXIpKSwgbXVsKGhhbGYsIGxhYmVsU21vb3RoaW5nU2NhbGFyKSk7XG4gICAgfVxuICAgIGNvbnN0IGxvc3NlcyA9IHNpZ21vaWRDcm9zc0VudHJvcHlXaXRoTG9naXRzXygkbXVsdGlDbGFzc0xhYmVscywgJGxvZ2l0cyk7XG4gICAgcmV0dXJuIGNvbXB1dGVXZWlnaHRlZExvc3MobG9zc2VzLCAkd2VpZ2h0cywgcmVkdWN0aW9uKTtcbn1cbmV4cG9ydCBjb25zdCBzaWdtb2lkQ3Jvc3NFbnRyb3B5ID0gb3AoeyBzaWdtb2lkQ3Jvc3NFbnRyb3B5XyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNpZ21vaWRfY3Jvc3NfZW50cm9weS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBjdXN0b21HcmFkIH0gZnJvbSAnLi4vLi4vZ3JhZGllbnRzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBhc3NlcnRTaGFwZXNNYXRjaCB9IGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHsgYWRkIH0gZnJvbSAnLi4vYWRkJztcbmltcG9ydCB7IGV4cGFuZFNoYXBlVG9LZWVwRGltIH0gZnJvbSAnLi4vYXhpc191dGlsJztcbmltcG9ydCB7IGNhc3QgfSBmcm9tICcuLi9jYXN0JztcbmltcG9ydCB7IGRpdiB9IGZyb20gJy4uL2Rpdic7XG5pbXBvcnQgeyBleHAgfSBmcm9tICcuLi9leHAnO1xuaW1wb3J0IHsgbG9nU3VtRXhwIH0gZnJvbSAnLi4vbG9nX3N1bV9leHAnO1xuaW1wb3J0IHsgUmVkdWN0aW9uIH0gZnJvbSAnLi4vbG9zc19vcHNfdXRpbHMnO1xuaW1wb3J0IHsgbXVsIH0gZnJvbSAnLi4vbXVsJztcbmltcG9ydCB7IG5lZyB9IGZyb20gJy4uL25lZyc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4uL29wZXJhdGlvbic7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi4vcmVzaGFwZSc7XG5pbXBvcnQgeyBzY2FsYXIgfSBmcm9tICcuLi9zY2FsYXInO1xuaW1wb3J0IHsgc3ViIH0gZnJvbSAnLi4vc3ViJztcbmltcG9ydCB7IHN1bSB9IGZyb20gJy4uL3N1bSc7XG5pbXBvcnQgeyBjb21wdXRlV2VpZ2h0ZWRMb3NzIH0gZnJvbSAnLi9jb21wdXRlX3dlaWdodGVkX2xvc3MnO1xuLyoqXG4gKiBDb21wdXRlcyBzb2Z0bWF4IGNyb3NzIGVudHJvcHkgYmV0d2VlbiBsb2dpdHMgYW5kIGxhYmVscy5cbiAqXG4gKiBNZWFzdXJlcyB0aGUgcHJvYmFiaWxpdHkgZXJyb3IgaW4gZGlzY3JldGUgY2xhc3NpZmljYXRpb24gdGFza3MgaW4gd2hpY2hcbiAqIHRoZSBjbGFzc2VzIGFyZSBtdXR1YWxseSBleGNsdXNpdmUgKGVhY2ggZW50cnkgaXMgaW4gZXhhY3RseSBvbmUgY2xhc3MpLlxuICogRm9yIGV4YW1wbGUsIGVhY2ggQ0lGQVItMTAgaW1hZ2UgaXMgbGFiZWxlZCB3aXRoIG9uZSBhbmQgb25seSBvbmUgbGFiZWw6IGFuXG4gKiBpbWFnZSBjYW4gYmUgYSBkb2cgb3IgYSB0cnVjaywgYnV0IG5vdCBib3RoLlxuICpcbiAqIGBOT1RFYDogV2hpbGUgdGhlIGNsYXNzZXMgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSwgdGhlaXIgcHJvYmFiaWxpdGllcyBuZWVkXG4gKiBub3QgYmUuIEFsbCB0aGF0IGlzIHJlcXVpcmVkIGlzIHRoYXQgZWFjaCByb3cgb2YgbGFiZWxzIGlzIGEgdmFsaWRcbiAqIHByb2JhYmlsaXR5IGRpc3RyaWJ1dGlvbi4gSWYgdGhleSBhcmUgbm90LCB0aGUgY29tcHV0YXRpb24gb2YgdGhlIGdyYWRpZW50XG4gKiB3aWxsIGJlIGluY29ycmVjdC5cbiAqXG4gKiBgV0FSTklOR2A6IFRoaXMgb3AgZXhwZWN0cyB1bnNjYWxlZCBsb2dpdHMsIHNpbmNlIGl0IHBlcmZvcm1zIGEgc29mdG1heCBvblxuICogbG9naXRzIGludGVybmFsbHkgZm9yIGVmZmljaWVuY3kuIERvIG5vdCBjYWxsIHRoaXMgb3Agd2l0aCB0aGUgb3V0cHV0IG9mXG4gKiBzb2Z0bWF4LCBhcyBpdCB3aWxsIHByb2R1Y2UgaW5jb3JyZWN0IHJlc3VsdHMuXG4gKlxuICogbG9naXRzIGFuZCBsYWJlbHMgbXVzdCBoYXZlIHRoZSBzYW1lIHNoYXBlLCBlLmcuIFtiYXRjaF9zaXplLCBudW1fY2xhc3Nlc11cbiAqIGFuZCB0aGUgc2FtZSBkdHlwZS5cbiAqIEBwYXJhbSBsYWJlbHMgVGhlIGxhYmVscyBhcnJheS5cbiAqIEBwYXJhbSBsb2dpdHMgVGhlIGxvZ2l0cyBhcnJheS5cbiAqIEBwYXJhbSBkaW0gVGhlIGRpbWVuc2lvbiBzb2Z0bWF4IHdvdWxkIGJlIHBlcmZvcm1lZCBvbi4gRGVmYXVsdHMgdG8gYC0xYFxuICogICAgIHdoaWNoIGluZGljYXRlcyB0aGUgbGFzdCBkaW1lbnNpb24uXG4gKi9cbmZ1bmN0aW9uIHNvZnRtYXhDcm9zc0VudHJvcHlXaXRoTG9naXRzXyhsYWJlbHMsIGxvZ2l0cywgZGltID0gLTEpIHtcbiAgICBpZiAoZGltID09PSAtMSkge1xuICAgICAgICBkaW0gPSBsb2dpdHMucmFuayAtIDE7XG4gICAgfVxuICAgIGlmIChkaW0gIT09IGxvZ2l0cy5yYW5rIC0gMSkge1xuICAgICAgICB0aHJvdyBFcnJvcihgU29mdG1heCBjcm9zcyBlbnRyb3B5IGFsb25nIGEgbm9uLWxhc3QgZGltZW5zaW9uIGlzIG5vdCB5ZXQgYCArXG4gICAgICAgICAgICBgc3VwcG9ydGVkLiBMYWJlbHMgLyBsb2dpdHMgd2FzIHJhbmsgJHtsb2dpdHMucmFua30gYCArXG4gICAgICAgICAgICBgYW5kIGRpbSB3YXMgJHtkaW19YCk7XG4gICAgfVxuICAgIC8vIFVzZSBhIGN1c3RvbSBncmFkaWVudCBmb3IgbnVtZXJpY2FsIHN0YWJpbGl0eS5cbiAgICBjb25zdCBjdXN0b21PcCA9IGN1c3RvbUdyYWQoKGxhYmVscywgbG9naXRzLCBzYXZlKSA9PiB7XG4gICAgICAgIC8vIFJlZmVyZW5jZTpcbiAgICAgICAgLy8gICAxLiBodHRwOi8vY3MyMzFuLmdpdGh1Yi5pby9saW5lYXItY2xhc3NpZnkvI3NvZnRtYXhcbiAgICAgICAgLy8gICAyLiBodHRwczovL2Jsb2cuZmVlZGx5LmNvbS90cmlja3Mtb2YtdGhlLXRyYWRlLWxvZ3N1bWV4cC9cbiAgICAgICAgY29uc3Qga2VlcERpbXMgPSB0cnVlO1xuICAgICAgICBjb25zdCBsc2UgPSBsb2dTdW1FeHAobG9naXRzLCBbZGltXSwga2VlcERpbXMpO1xuICAgICAgICBjb25zdCBsb2dSZXN1bHQgPSBzdWIoY2FzdChsb2dpdHMsICdmbG9hdDMyJyksIGxzZSk7XG4gICAgICAgIHNhdmUoW2xhYmVscywgbG9nUmVzdWx0XSk7XG4gICAgICAgIGNvbnN0IGNvc3RWZWN0b3IgPSBuZWcobXVsKGxvZ1Jlc3VsdCwgbGFiZWxzKSk7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gc3VtKGNvc3RWZWN0b3IsIFtkaW1dKTtcbiAgICAgICAgY29uc3QgZ3JhZEZ1bmMgPSAoZHksIHNhdmVkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBbbGFiZWxzLCBsb2dSZXN1bHRdID0gc2F2ZWQ7XG4gICAgICAgICAgICBjb25zdCBkeVNoYXBlID0gZXhwYW5kU2hhcGVUb0tlZXBEaW0oZHkuc2hhcGUsIFtkaW1dKTtcbiAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgbXVsKHJlc2hhcGUoZHksIGR5U2hhcGUpLCBzdWIoY2FzdChsYWJlbHMsICdmbG9hdDMyJyksIGV4cChsb2dSZXN1bHQpKSksXG4gICAgICAgICAgICAgICAgbXVsKHJlc2hhcGUoZHksIGR5U2hhcGUpLCBzdWIoZXhwKGxvZ1Jlc3VsdCksIGNhc3QobGFiZWxzLCAnZmxvYXQzMicpKSksXG4gICAgICAgICAgICBdO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4geyB2YWx1ZSwgZ3JhZEZ1bmMgfTtcbiAgICB9KTtcbiAgICByZXR1cm4gY3VzdG9tT3AobGFiZWxzLCBsb2dpdHMpO1xufVxuLyoqXG4gKiBDb21wdXRlcyB0aGUgc29mdG1heCBjcm9zcyBlbnRyb3B5IGxvc3MgYmV0d2VlbiB0d28gdGVuc29ycy5cbiAqXG4gKiBJZiBsYWJlbFNtb290aGluZyBpcyBub256ZXJvLCBzbW9vdGggdGhlIGxhYmVscyB0b3dhcmRzIDEvMjpcbiAqXG4gKiAgIG5ld09uZWhvdExhYmVscyA9IG9uZWhvdExhYmVscyAqICgxIC0gbGFiZWxTbW9vdGhpbmcpXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICArIGxhYmVsU21vb3RoaW5nIC8gbnVtQ2xhc3Nlc1xuICpcbiAqIEBwYXJhbSBvbmVob3RMYWJlbHMgT25lIGhvdCBlbmNvZGVkIGxhYmVsc1xuICogICAgW2JhdGNoX3NpemUsIG51bV9jbGFzc2VzXSwgc2FtZSBkaW1lbnNpb25zIGFzICdwcmVkaWN0aW9ucycuXG4gKiBAcGFyYW0gbG9naXRzIFRoZSBwcmVkaWN0ZWQgb3V0cHV0cy5cbiAqIEBwYXJhbSB3ZWlnaHRzIFRlbnNvciB3aG9zZSByYW5rIGlzIGVpdGhlciAwLCBvciAxLCBhbmQgbXVzdCBiZVxuICogICAgYnJvYWRjYXN0YWJsZSB0byBgbG9zc2AgIG9mIHNoYXBlIFtiYXRjaF9zaXplXVxuICogQHBhcmFtIGxhYmVsU21vb3RoaW5nIElmIGdyZWF0ZXIgdGhhbiAwLCB0aGVuIHNtb290aCB0aGUgbGFiZWxzLlxuICogQHBhcmFtIHJlZHVjdGlvbiBUeXBlIG9mIHJlZHVjdGlvbiB0byBhcHBseSB0byBsb3NzLiBTaG91bGQgYmUgb2YgdHlwZVxuICogICAgYFJlZHVjdGlvbmBcbiAqXG4gKiBAZG9jIHsgaGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ0xvc3NlcycsIG5hbWVzcGFjZTogJ2xvc3NlcycgfVxuICovXG5mdW5jdGlvbiBzb2Z0bWF4Q3Jvc3NFbnRyb3B5XyhvbmVob3RMYWJlbHMsIGxvZ2l0cywgd2VpZ2h0cywgbGFiZWxTbW9vdGhpbmcgPSAwLCByZWR1Y3Rpb24gPSBSZWR1Y3Rpb24uU1VNX0JZX05PTlpFUk9fV0VJR0hUUykge1xuICAgIGxldCAkb25laG90TGFiZWxzID0gY29udmVydFRvVGVuc29yKG9uZWhvdExhYmVscywgJ29uZWhvdExhYmVscycsICdzb2Z0bWF4Q3Jvc3NFbnRyb3B5Jyk7XG4gICAgY29uc3QgJGxvZ2l0cyA9IGNvbnZlcnRUb1RlbnNvcihsb2dpdHMsICdsb2dpdHMnLCAnc29mdG1heENyb3NzRW50cm9weScpO1xuICAgIGxldCAkd2VpZ2h0cyA9IG51bGw7XG4gICAgaWYgKHdlaWdodHMgIT0gbnVsbCkge1xuICAgICAgICAkd2VpZ2h0cyA9IGNvbnZlcnRUb1RlbnNvcih3ZWlnaHRzLCAnd2VpZ2h0cycsICdzb2Z0bWF4Q3Jvc3NFbnRyb3B5Jyk7XG4gICAgfVxuICAgIGFzc2VydFNoYXBlc01hdGNoKCRvbmVob3RMYWJlbHMuc2hhcGUsICRsb2dpdHMuc2hhcGUsICdFcnJvciBpbiBzb2Z0bWF4Q3Jvc3NFbnRyb3B5OiAnKTtcbiAgICBpZiAobGFiZWxTbW9vdGhpbmcgPiAwKSB7XG4gICAgICAgIGNvbnN0IGxhYmVsU21vb3RoaW5nU2NhbGFyID0gc2NhbGFyKGxhYmVsU21vb3RoaW5nKTtcbiAgICAgICAgY29uc3Qgb25lID0gc2NhbGFyKDEpO1xuICAgICAgICBjb25zdCBudW1DbGFzc2VzID0gc2NhbGFyKCRvbmVob3RMYWJlbHMuc2hhcGVbMV0pO1xuICAgICAgICAkb25laG90TGFiZWxzID1cbiAgICAgICAgICAgIGFkZChtdWwoJG9uZWhvdExhYmVscywgc3ViKG9uZSwgbGFiZWxTbW9vdGhpbmdTY2FsYXIpKSwgZGl2KGxhYmVsU21vb3RoaW5nU2NhbGFyLCBudW1DbGFzc2VzKSk7XG4gICAgfVxuICAgIGNvbnN0IGxvc3NlcyA9IHNvZnRtYXhDcm9zc0VudHJvcHlXaXRoTG9naXRzXygkb25laG90TGFiZWxzLCAkbG9naXRzKTtcbiAgICByZXR1cm4gY29tcHV0ZVdlaWdodGVkTG9zcyhsb3NzZXMsICR3ZWlnaHRzLCByZWR1Y3Rpb24pO1xufVxuZXhwb3J0IGNvbnN0IHNvZnRtYXhDcm9zc0VudHJvcHkgPSBvcCh7IHNvZnRtYXhDcm9zc0VudHJvcHlfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c29mdG1heF9jcm9zc19lbnRyb3B5LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBCYXRjaE1hdE11bCB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBtYWtlVHlwZXNNYXRjaCB9IGZyb20gJy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgdGhlIGRvdCBwcm9kdWN0IG9mIHR3byBtYXRyaWNlcywgQSAqIEIuIFRoZXNlIG11c3QgYmUgbWF0cmljZXMuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IyZChbMSwgMl0sIFsxLCAyXSk7XG4gKiBjb25zdCBiID0gdGYudGVuc29yMmQoWzEsIDIsIDMsIDRdLCBbMiwgMl0pO1xuICpcbiAqIGEubWF0TXVsKGIpLnByaW50KCk7ICAvLyBvciB0Zi5tYXRNdWwoYSwgYilcbiAqIGBgYFxuICogQHBhcmFtIGEgRmlyc3QgbWF0cml4IGluIGRvdCBwcm9kdWN0IG9wZXJhdGlvbi5cbiAqIEBwYXJhbSBiIFNlY29uZCBtYXRyaXggaW4gZG90IHByb2R1Y3Qgb3BlcmF0aW9uLlxuICogQHBhcmFtIHRyYW5zcG9zZUEgSWYgdHJ1ZSwgYGFgIGlzIHRyYW5zcG9zZWQgYmVmb3JlIG11bHRpcGxpY2F0aW9uLlxuICogQHBhcmFtIHRyYW5zcG9zZUIgSWYgdHJ1ZSwgYGJgIGlzIHRyYW5zcG9zZWQgYmVmb3JlIG11bHRpcGxpY2F0aW9uLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ01hdHJpY2VzJ31cbiAqL1xuZnVuY3Rpb24gbWF0TXVsXyhhLCBiLCB0cmFuc3Bvc2VBID0gZmFsc2UsIHRyYW5zcG9zZUIgPSBmYWxzZSkge1xuICAgIGxldCAkYSA9IGNvbnZlcnRUb1RlbnNvcihhLCAnYScsICdtYXRNdWwnKTtcbiAgICBsZXQgJGIgPSBjb252ZXJ0VG9UZW5zb3IoYiwgJ2InLCAnbWF0TXVsJyk7XG4gICAgWyRhLCAkYl0gPSBtYWtlVHlwZXNNYXRjaCgkYSwgJGIpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgYTogJGEsIGI6ICRiIH07XG4gICAgY29uc3QgYXR0cnMgPSB7IHRyYW5zcG9zZUEsIHRyYW5zcG9zZUIgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChCYXRjaE1hdE11bCwgaW5wdXRzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3QgbWF0TXVsID0gb3AoeyBtYXRNdWxfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWF0X211bC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgTWF4IH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgdGhlIG1heGltdW0gb2YgZWxlbWVudHMgYWNyb3NzIGRpbWVuc2lvbnMgb2YgYSBgdGYuVGVuc29yYC5cbiAqXG4gKiBSZWR1Y2VzIHRoZSBpbnB1dCBhbG9uZyB0aGUgZGltZW5zaW9ucyBnaXZlbiBpbiBgYXhlc2AuIFVubGVzcyBga2VlcERpbXNgXG4gKiBpcyB0cnVlLCB0aGUgcmFuayBvZiB0aGUgYHRmLlRlbnNvcmAgaXMgcmVkdWNlZCBieSAxIGZvciBlYWNoIGVudHJ5IGluXG4gKiBgYXhlc2AuIElmIGBrZWVwRGltc2AgaXMgdHJ1ZSwgdGhlIHJlZHVjZWQgZGltZW5zaW9ucyBhcmUgcmV0YWluZWQgd2l0aFxuICogbGVuZ3RoIDEuIElmIGBheGVzYCBoYXMgbm8gZW50cmllcywgYWxsIGRpbWVuc2lvbnMgYXJlIHJlZHVjZWQsIGFuZCBhblxuICogYHRmLlRlbnNvcmAgd2l0aCBhIHNpbmdsZSBlbGVtZW50IGlzIHJldHVybmVkLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIDNdKTtcbiAqXG4gKiB4Lm1heCgpLnByaW50KCk7ICAvLyBvciB0Zi5tYXgoeClcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMmQoWzEsIDIsIDMsIDRdLCBbMiwgMl0pO1xuICpcbiAqIGNvbnN0IGF4aXMgPSAxO1xuICogeC5tYXgoYXhpcykucHJpbnQoKTsgIC8vIG9yIHRmLm1heCh4LCBheGlzKVxuICogYGBgXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqIEBwYXJhbSBheGlzIFRoZSBkaW1lbnNpb24ocykgdG8gcmVkdWNlLiBCeSBkZWZhdWx0IGl0IHJlZHVjZXNcbiAqICAgICBhbGwgZGltZW5zaW9ucy5cbiAqIEBwYXJhbSBrZWVwRGltcyBJZiB0cnVlLCByZXRhaW5zIHJlZHVjZWQgZGltZW5zaW9ucyB3aXRoIHNpemUgMS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdSZWR1Y3Rpb24nfVxuICovXG5mdW5jdGlvbiBtYXhfKHgsIGF4aXMgPSBudWxsLCBrZWVwRGltcyA9IGZhbHNlKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnbWF4Jyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIGNvbnN0IGF0dHJzID0geyByZWR1Y3Rpb25JbmRpY2VzOiBheGlzLCBrZWVwRGltcyB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKE1heCwgaW5wdXRzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3QgbWF4ID0gb3AoeyBtYXhfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWF4LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBNYXhQb29sIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0ICogYXMgY29udl91dGlsIGZyb20gJy4vY29udl91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vcmVzaGFwZSc7XG4vKipcbiAqIENvbXB1dGVzIHRoZSAyRCBtYXggcG9vbGluZyBvZiBhbiBpbWFnZS5cbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLCBvZiByYW5rIDQgb3IgcmFuayAzIG9mIHNoYXBlXG4gKiAgICAgYFtiYXRjaCwgaGVpZ2h0LCB3aWR0aCwgaW5DaGFubmVsc11gLiBJZiByYW5rIDMsIGJhdGNoIG9mIDEgaXMgYXNzdW1lZC5cbiAqIEBwYXJhbSBmaWx0ZXJTaXplIFRoZSBmaWx0ZXIgc2l6ZTogYFtmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoXWAuIElmXG4gKiAgICAgYGZpbHRlclNpemVgIGlzIGEgc2luZ2xlIG51bWJlciwgdGhlbiBgZmlsdGVySGVpZ2h0ID09IGZpbHRlcldpZHRoYC5cbiAqIEBwYXJhbSBzdHJpZGVzIFRoZSBzdHJpZGVzIG9mIHRoZSBwb29saW5nOiBgW3N0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGhdYC4gSWZcbiAqICAgICBgc3RyaWRlc2AgaXMgYSBzaW5nbGUgbnVtYmVyLCB0aGVuIGBzdHJpZGVIZWlnaHQgPT0gc3RyaWRlV2lkdGhgLlxuICogQHBhcmFtIGRpbGF0aW9ucyBUaGUgZGlsYXRpb24gcmF0ZXM6IGBbZGlsYXRpb25IZWlnaHQsIGRpbGF0aW9uV2lkdGhdYFxuICogICAgIGluIHdoaWNoIHdlIHNhbXBsZSBpbnB1dCB2YWx1ZXMgYWNyb3NzIHRoZSBoZWlnaHQgYW5kIHdpZHRoIGRpbWVuc2lvbnNcbiAqICAgICBpbiBkaWxhdGVkIHBvb2xpbmcuIERlZmF1bHRzIHRvIGBbMSwgMV1gLiBJZiBgZGlsYXRpb25zYCBpcyBhIHNpbmdsZVxuICogICAgIG51bWJlciwgdGhlbiBgZGlsYXRpb25IZWlnaHQgPT0gZGlsYXRpb25XaWR0aGAuIElmIGl0IGlzIGdyZWF0ZXIgdGhhblxuICogICAgIDEsIHRoZW4gYWxsIHZhbHVlcyBvZiBgc3RyaWRlc2AgbXVzdCBiZSAxLlxuICogQHBhcmFtIHBhZCBUaGUgdHlwZSBvZiBwYWRkaW5nIGFsZ29yaXRobS5cbiAqICAgIC0gYHNhbWVgIGFuZCBzdHJpZGUgMTogb3V0cHV0IHdpbGwgYmUgb2Ygc2FtZSBzaXplIGFzIGlucHV0LFxuICogICAgICAgcmVnYXJkbGVzcyBvZiBmaWx0ZXIgc2l6ZS5cbiAqICAgIC0gYHZhbGlkYDogb3V0cHV0IHdpbGwgYmUgc21hbGxlciB0aGFuIGlucHV0IGlmIGZpbHRlciBpcyBsYXJnZXJcbiAqICAgICAgIHRoYW4gMXgxLlxuICogICAgLSBGb3IgbW9yZSBpbmZvLCBzZWUgdGhpcyBndWlkZTpcbiAqICAgICBbaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uXShcbiAqICAgICAgICAgIGh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9jb252b2x1dGlvbilcbiAqIEBwYXJhbSBkaW1Sb3VuZGluZ01vZGUgQSBzdHJpbmcgZnJvbTogJ2NlaWwnLCAncm91bmQnLCAnZmxvb3InLiBJZiBub25lIGlzXG4gKiAgICAgcHJvdmlkZWQsIGl0IHdpbGwgZGVmYXVsdCB0byB0cnVuY2F0ZS5cbiAqL1xuZnVuY3Rpb24gbWF4UG9vbF8oeCwgZmlsdGVyU2l6ZSwgc3RyaWRlcywgcGFkLCBkaW1Sb3VuZGluZ01vZGUpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdtYXhQb29sJyk7XG4gICAgY29uc3QgZGlsYXRpb25zID0gMTtcbiAgICBsZXQgeDREID0gJHg7XG4gICAgbGV0IHJlc2hhcGVkVG80RCA9IGZhbHNlO1xuICAgIGlmICgkeC5yYW5rID09PSAzKSB7XG4gICAgICAgIHJlc2hhcGVkVG80RCA9IHRydWU7XG4gICAgICAgIHg0RCA9IHJlc2hhcGUoJHgsIFsxLCAkeC5zaGFwZVswXSwgJHguc2hhcGVbMV0sICR4LnNoYXBlWzJdXSk7XG4gICAgfVxuICAgIHV0aWwuYXNzZXJ0KHg0RC5yYW5rID09PSA0LCAoKSA9PiBgRXJyb3IgaW4gbWF4UG9vbDogaW5wdXQgbXVzdCBiZSByYW5rIDQgYnV0IGdvdCByYW5rICR7eDRELnJhbmt9LmApO1xuICAgIHV0aWwuYXNzZXJ0KGNvbnZfdXRpbC5laXRoZXJTdHJpZGVzT3JEaWxhdGlvbnNBcmVPbmUoc3RyaWRlcywgZGlsYXRpb25zKSwgKCkgPT4gJ0Vycm9yIGluIG1heFBvb2w6IEVpdGhlciBzdHJpZGVzIG9yIGRpbGF0aW9ucyBtdXN0IGJlIDEuICcgK1xuICAgICAgICBgR290IHN0cmlkZXMgJHtzdHJpZGVzfSBhbmQgZGlsYXRpb25zICcke2RpbGF0aW9uc30nYCk7XG4gICAgaWYgKGRpbVJvdW5kaW5nTW9kZSAhPSBudWxsKSB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KHV0aWwuaXNJbnQocGFkKSwgKCkgPT4gYEVycm9yIGluIG1heFBvb2w6IHBhZCBtdXN0IGJlIGFuIGludGVnZXIgd2hlbiB1c2luZywgYCArXG4gICAgICAgICAgICBgZGltUm91bmRpbmdNb2RlICR7ZGltUm91bmRpbmdNb2RlfSBidXQgZ290IHBhZCAke3BhZH0uYCk7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogeDREIH07XG4gICAgY29uc3QgYXR0cnMgPSB7IGZpbHRlclNpemUsIHN0cmlkZXMsIHBhZCwgZGltUm91bmRpbmdNb2RlIH07XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICAgIGNvbnN0IHJlcyA9IEVOR0lORS5ydW5LZXJuZWwoTWF4UG9vbCwgaW5wdXRzLCBhdHRycyk7XG4gICAgaWYgKHJlc2hhcGVkVG80RCkge1xuICAgICAgICByZXR1cm4gcmVzaGFwZShyZXMsIFtyZXMuc2hhcGVbMV0sIHJlcy5zaGFwZVsyXSwgcmVzLnNoYXBlWzNdXSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG5leHBvcnQgY29uc3QgbWF4UG9vbCA9IG9wKHsgbWF4UG9vbF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tYXhfcG9vbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgTWF4UG9vbDNEIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9yZXNoYXBlJztcbi8qKlxuICogQ29tcHV0ZXMgdGhlIDNEIG1heCBwb29saW5nLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yNWQoWzEsIDIsIDMsIDQsIDUsIDYsIDcsIDhdLCBbMSwgMiwgMiwgMiwgMV0pO1xuICogY29uc3QgcmVzdWx0ID0gdGYubWF4UG9vbDNkKHgsIDIsIDEsICd2YWxpZCcpO1xuICogcmVzdWx0LnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLCBvZiByYW5rIDUgb3IgcmFuayA0IG9mIHNoYXBlXG4gKiAgICAgYFtiYXRjaCwgZGVwdGgsIGhlaWdodCwgd2lkdGgsIGluQ2hhbm5lbHNdYC5cbiAqIEBwYXJhbSBmaWx0ZXJTaXplIFRoZSBmaWx0ZXIgc2l6ZTpcbiAqICAgICBgW2ZpbHRlckRlcHRoLCBmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoXWAuXG4gKiAgICAgSWYgYGZpbHRlclNpemVgIGlzIGEgc2luZ2xlIG51bWJlcixcbiAqICAgICB0aGVuIGBmaWx0ZXJEZXB0aCA9PSBmaWx0ZXJIZWlnaHQgPT0gZmlsdGVyV2lkdGhgLlxuICogQHBhcmFtIHN0cmlkZXMgVGhlIHN0cmlkZXMgb2YgdGhlIHBvb2xpbmc6XG4gKiAgICAgYFtzdHJpZGVEZXB0aCwgc3RyaWRlSGVpZ2h0LCBzdHJpZGVXaWR0aF1gLlxuICogICAgIElmIGBzdHJpZGVzYCBpcyBhIHNpbmdsZSBudW1iZXIsXG4gKiAgICAgdGhlbiBgc3RyaWRlRGVwdGggPT0gc3RyaWRlSGVpZ2h0ID09IHN0cmlkZVdpZHRoYC5cbiAqIEBwYXJhbSBwYWQgVGhlIHR5cGUgb2YgcGFkZGluZyBhbGdvcml0aG0uXG4gKiAgICAtIGBzYW1lYCBhbmQgc3RyaWRlIDE6IG91dHB1dCB3aWxsIGJlIG9mIHNhbWUgc2l6ZSBhcyBpbnB1dCxcbiAqICAgICAgIHJlZ2FyZGxlc3Mgb2YgZmlsdGVyIHNpemUuXG4gKiAgICAtIGB2YWxpZGA6IG91dHB1dCB3aWxsIGJlIHNtYWxsZXIgdGhhbiBpbnB1dCBpZiBmaWx0ZXIgaXMgbGFyZ2VyXG4gKiAgICAgICB0aGFuIDEqMXgxLlxuICogICAgLSBGb3IgbW9yZSBpbmZvLCBzZWUgdGhpcyBndWlkZTpcbiAqICAgICBbaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uXShcbiAqICAgICAgICAgIGh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9jb252b2x1dGlvbilcbiAqIEBwYXJhbSBkaW1Sb3VuZGluZ01vZGUgQSBzdHJpbmcgZnJvbTogJ2NlaWwnLCAncm91bmQnLCAnZmxvb3InLiBJZiBub25lIGlzXG4gKiAgICAgcHJvdmlkZWQsIGl0IHdpbGwgZGVmYXVsdCB0byB0cnVuY2F0ZS5cbiAqIEBwYXJhbSBkYXRhRm9ybWF0IEFuIG9wdGlvbmFsIHN0cmluZyBmcm9tOiBcIk5ESFdDXCIsIFwiTkNESFdcIi4gRGVmYXVsdHMgdG9cbiAqICAgICBcIk5ESFdDXCIuIFNwZWNpZnkgdGhlIGRhdGEgZm9ybWF0IG9mIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGRhdGEuIFdpdGggdGhlXG4gKiAgICAgZGVmYXVsdCBmb3JtYXQgXCJOREhXQ1wiLCB0aGUgZGF0YSBpcyBzdG9yZWQgaW4gdGhlIG9yZGVyIG9mOiBbYmF0Y2gsXG4gKiAgICAgZGVwdGgsIGhlaWdodCwgd2lkdGgsIGNoYW5uZWxzXS4gT25seSBcIk5ESFdDXCIgaXMgY3VycmVudGx5IHN1cHBvcnRlZC5cbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0NvbnZvbHV0aW9uJ31cbiAqL1xuZnVuY3Rpb24gbWF4UG9vbDNkXyh4LCBmaWx0ZXJTaXplID0gWzEsIDEsIDFdLCBzdHJpZGVzLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSwgZGF0YUZvcm1hdCA9ICdOREhXQycpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdtYXhQb29sM2QnKTtcbiAgICBsZXQgeDVEID0gJHg7XG4gICAgbGV0IHJlc2hhcGVkVG81RCA9IGZhbHNlO1xuICAgIGlmICgkeC5yYW5rID09PSA0KSB7XG4gICAgICAgIHJlc2hhcGVkVG81RCA9IHRydWU7XG4gICAgICAgIHg1RCA9IHJlc2hhcGUoJHgsIFsxLCAkeC5zaGFwZVswXSwgJHguc2hhcGVbMV0sICR4LnNoYXBlWzJdLCAkeC5zaGFwZVszXV0pO1xuICAgIH1cbiAgICB1dGlsLmFzc2VydCh4NUQucmFuayA9PT0gNSwgKCkgPT4gYEVycm9yIGluIG1heFBvb2wzZDogeCBtdXN0IGJlIHJhbmsgNSBidXQgZ290IHJhbmsgJHt4NUQucmFua30uYCk7XG4gICAgdXRpbC5hc3NlcnQoZGF0YUZvcm1hdCA9PT0gJ05ESFdDJywgKCkgPT4gYEVycm9yIGluIG1heFBvb2wzZDogT25seSBOREhXQyBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLCBgICtcbiAgICAgICAgYGJ1dCBnb3QgZGF0YUZvcm1hdCBvZiAke2RhdGFGb3JtYXR9YCk7XG4gICAgaWYgKGRpbVJvdW5kaW5nTW9kZSAhPSBudWxsKSB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KHV0aWwuaXNJbnQocGFkKSwgKCkgPT4gYEVycm9yIGluIG1heFBvb2wzZDogcGFkIG11c3QgYmUgYW4gaW50ZWdlciB3aGVuIHVzaW5nLCBgICtcbiAgICAgICAgICAgIGBkaW1Sb3VuZGluZ01vZGUgJHtkaW1Sb3VuZGluZ01vZGV9IGJ1dCBnb3QgcGFkICR7cGFkfS5gKTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiB4NUQgfTtcbiAgICBjb25zdCBhdHRycyA9IHsgZmlsdGVyU2l6ZSwgc3RyaWRlcywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIGRhdGFGb3JtYXQgfTtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgY29uc3QgcmVzID0gRU5HSU5FLnJ1bktlcm5lbChNYXhQb29sM0QsIGlucHV0cywgYXR0cnMpO1xuICAgIGlmIChyZXNoYXBlZFRvNUQpIHtcbiAgICAgICAgcmV0dXJuIHJlc2hhcGUocmVzLCBbcmVzLnNoYXBlWzFdLCByZXMuc2hhcGVbMl0sIHJlcy5zaGFwZVszXSwgcmVzLnNoYXBlWzRdXSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG5leHBvcnQgY29uc3QgbWF4UG9vbDNkID0gb3AoeyBtYXhQb29sM2RfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWF4X3Bvb2xfM2QuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IE1heFBvb2xXaXRoQXJnbWF4IH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgdGhlIDJEIG1heCBwb29saW5nIG9mIGFuIGltYWdlIHdpdGggQXJnbWF4IGluZGV4LlxuICogVGhlIGluZGljZXMgaW4gYXJnbWF4IGFyZSBmbGF0dGVuZWQsIHNvIHRoYXQgYSBtYXhpbXVtIHZhbHVlIGF0IHBvc2l0aW9uIGBbYixcbiAqIHksIHgsIGNdYCBiZWNvbWVzIGZsYXR0ZW5lZCBpbmRleDogYCh5ICogd2lkdGggKyB4KSAqIGNoYW5uZWxzICsgY2AgaWZcbiAqIGluY2x1ZGVfYmF0Y2hfaW5faW5kZXggaXMgRmFsc2U7IGAoKGIgKiBoZWlnaHQgKyB5KSAqIHdpZHRoICsgeCkgKiBjaGFubmVsc1xuICogK2NgIGlmIGluY2x1ZGVfYmF0Y2hfaW5faW5kZXggaXMgVHJ1ZS5cbiAqXG4gKiBUaGUgaW5kaWNlcyByZXR1cm5lZCBhcmUgYWx3YXlzIGluIGBbMCwgaGVpZ2h0KSB4IFswLCB3aWR0aClgIGJlZm9yZVxuICogZmxhdHRlbmluZy5cbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLCBvZiByYW5rIDQgb3IgcmFuayAzIG9mIHNoYXBlXG4gKiAgICAgYFtiYXRjaCwgaGVpZ2h0LCB3aWR0aCwgaW5DaGFubmVsc11gLiBJZiByYW5rIDMsIGJhdGNoIG9mIDEgaXMgYXNzdW1lZC5cbiAqIEBwYXJhbSBmaWx0ZXJTaXplIFRoZSBmaWx0ZXIgc2l6ZTogYFtmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoXWAuIElmXG4gKiAgICAgYGZpbHRlclNpemVgIGlzIGEgc2luZ2xlIG51bWJlciwgdGhlbiBgZmlsdGVySGVpZ2h0ID09IGZpbHRlcldpZHRoYC5cbiAqIEBwYXJhbSBzdHJpZGVzIFRoZSBzdHJpZGVzIG9mIHRoZSBwb29saW5nOiBgW3N0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGhdYC4gSWZcbiAqICAgICBgc3RyaWRlc2AgaXMgYSBzaW5nbGUgbnVtYmVyLCB0aGVuIGBzdHJpZGVIZWlnaHQgPT0gc3RyaWRlV2lkdGhgLlxuICogQHBhcmFtIGRhdGFGb3JtYXQgQW4gb3B0aW9uYWwgc3RyaW5nIGZyb206IFwiTkRIV0NcIiwgXCJOQ0RIV1wiLiBEZWZhdWx0cyB0b1xuICogICAgIFwiTkRIV0NcIi4gU3BlY2lmeSB0aGUgZGF0YSBmb3JtYXQgb2YgdGhlIGlucHV0IGFuZCBvdXRwdXQgZGF0YS4gV2l0aCB0aGVcbiAqICAgICBkZWZhdWx0IGZvcm1hdCBcIk5ESFdDXCIsIHRoZSBkYXRhIGlzIHN0b3JlZCBpbiB0aGUgb3JkZXIgb2Y6IFtiYXRjaCxcbiAqICAgICBkZXB0aCwgaGVpZ2h0LCB3aWR0aCwgY2hhbm5lbHNdLiBPbmx5IFwiTkRIV0NcIiBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLlxuICogQHBhcmFtIHBhZCBUaGUgdHlwZSBvZiBwYWRkaW5nIGFsZ29yaXRobS5cbiAqICAgIC0gYHNhbWVgIGFuZCBzdHJpZGUgMTogb3V0cHV0IHdpbGwgYmUgb2Ygc2FtZSBzaXplIGFzIGlucHV0LFxuICogICAgICAgcmVnYXJkbGVzcyBvZiBmaWx0ZXIgc2l6ZS5cbiAqICAgIC0gYHZhbGlkYDogb3V0cHV0IHdpbGwgYmUgc21hbGxlciB0aGFuIGlucHV0IGlmIGZpbHRlciBpcyBsYXJnZXJcbiAqICAgICAgIHRoYW4gMXgxLlxuICogICAgLSBGb3IgbW9yZSBpbmZvLCBzZWUgdGhpcyBndWlkZTpcbiAqICAgICBbaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uXShcbiAqICAgICAgICAgIGh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9jb252b2x1dGlvbilcbiAqIEBwYXJhbSBpbmNsdWRlQmF0Y2hJbmRleCBEZWZhdWx0cyB0byBGYWxzZS4gV2hldGhlciB0byBpbmNsdWRlIGJhdGNoXG4gKiAgICBkaW1lbnNpb24gaW4gZmxhdHRlbmVkIGluZGV4IG9mIGFyZ21heC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdDb252b2x1dGlvbid9XG4gKi9cbmZ1bmN0aW9uIG1heFBvb2xXaXRoQXJnbWF4Xyh4LCBmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWQsIGluY2x1ZGVCYXRjaEluSW5kZXggPSBmYWxzZSkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ21heFBvb2xXaXRoQXJnbWF4Jyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWQsIGluY2x1ZGVCYXRjaEluSW5kZXggfTtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgY29uc3QgcmVzdWx0ID0gRU5HSU5FLnJ1bktlcm5lbChNYXhQb29sV2l0aEFyZ21heCwgaW5wdXRzLCBhdHRycyk7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiByZXN1bHRbMF0sIGluZGV4ZXM6IHJlc3VsdFsxXSB9O1xufVxuZXhwb3J0IGNvbnN0IG1heFBvb2xXaXRoQXJnbWF4ID0gb3AoeyBtYXhQb29sV2l0aEFyZ21heF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tYXhfcG9vbF93aXRoX2FyZ21heC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgTWF4aW11bSB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBtYWtlVHlwZXNNYXRjaCB9IGZyb20gJy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSB9IGZyb20gJy4vYnJvYWRjYXN0X3V0aWwnO1xuaW1wb3J0IHsgY2FzdCB9IGZyb20gJy4vY2FzdCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogUmV0dXJucyB0aGUgbWF4IG9mIGEgYW5kIGIgKGBhID4gYiA/IGEgOiBiYCkgZWxlbWVudC13aXNlLlxuICogU3VwcG9ydHMgYnJvYWRjYXN0aW5nLlxuICpcbiAqIFdlIGFsc28gZXhwb3NlIGB0Zi5tYXhpbXVtU3RyaWN0YCB3aGljaCBoYXMgdGhlIHNhbWUgc2lnbmF0dXJlIGFzIHRoaXMgb3AgYW5kXG4gKiBhc3NlcnRzIHRoYXQgYGFgIGFuZCBgYmAgYXJlIHRoZSBzYW1lIHNoYXBlIChkb2VzIG5vdCBicm9hZGNhc3QpLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzEsIDQsIDMsIDE2XSk7XG4gKiBjb25zdCBiID0gdGYudGVuc29yMWQoWzEsIDIsIDksIDRdKTtcbiAqXG4gKiBhLm1heGltdW0oYikucHJpbnQoKTsgIC8vIG9yIHRmLm1heGltdW0oYSwgYilcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiAvLyBCcm9hZGNhc3QgbWF4aW11bSBhIHdpdGggYi5cbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMiwgNCwgNiwgOF0pO1xuICogY29uc3QgYiA9IHRmLnNjYWxhcig1KTtcbiAqXG4gKiBhLm1heGltdW0oYikucHJpbnQoKTsgIC8vIG9yIHRmLm1heGltdW0oYSwgYilcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCB0ZW5zb3IuXG4gKiBAcGFyYW0gYiBUaGUgc2Vjb25kIHRlbnNvci4gTXVzdCBoYXZlIHRoZSBzYW1lIHR5cGUgYXMgYGFgLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0FyaXRobWV0aWMnfVxuICovXG5mdW5jdGlvbiBtYXhpbXVtXyhhLCBiKSB7XG4gICAgbGV0ICRhID0gY29udmVydFRvVGVuc29yKGEsICdhJywgJ21heGltdW0nKTtcbiAgICBsZXQgJGIgPSBjb252ZXJ0VG9UZW5zb3IoYiwgJ2InLCAnbWF4aW11bScpO1xuICAgIFskYSwgJGJdID0gbWFrZVR5cGVzTWF0Y2goJGEsICRiKTtcbiAgICBpZiAoJGEuZHR5cGUgPT09ICdib29sJykge1xuICAgICAgICAkYSA9IGNhc3QoJGEsICdpbnQzMicpO1xuICAgICAgICAkYiA9IGNhc3QoJGIsICdpbnQzMicpO1xuICAgIH1cbiAgICBhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSgkYS5zaGFwZSwgJGIuc2hhcGUpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgYTogJGEsIGI6ICRiIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoTWF4aW11bSwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBtYXhpbXVtID0gb3AoeyBtYXhpbXVtXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1heGltdW0uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IE1lYW4gfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyB0aGUgbWVhbiBvZiBlbGVtZW50cyBhY3Jvc3MgZGltZW5zaW9ucyBvZiBhIGB0Zi5UZW5zb3JgLlxuICpcbiAqIFJlZHVjZXMgYHhgIGFsb25nIHRoZSBkaW1lbnNpb25zIGdpdmVuIGluIGBheGlzYC4gVW5sZXNzIGBrZWVwRGltc2AgaXNcbiAqIHRydWUsIHRoZSByYW5rIG9mIHRoZSBgdGYuVGVuc29yYCBpcyByZWR1Y2VkIGJ5IDEgZm9yIGVhY2ggZW50cnkgaW4gYGF4aXNgLlxuICogSWYgYGtlZXBEaW1zYCBpcyB0cnVlLCB0aGUgcmVkdWNlZCBkaW1lbnNpb25zIGFyZSByZXRhaW5lZCB3aXRoIGxlbmd0aCAxLlxuICogSWYgYGF4aXNgIGhhcyBubyBlbnRyaWVzLCBhbGwgZGltZW5zaW9ucyBhcmUgcmVkdWNlZCwgYW5kIGEgYHRmLlRlbnNvcmAgd2l0aFxuICogYSBzaW5nbGUgZWxlbWVudCBpcyByZXR1cm5lZC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzXSk7XG4gKlxuICogeC5tZWFuKCkucHJpbnQoKTsgIC8vIG9yIHRmLm1lYW4oYSlcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMmQoWzEsIDIsIDMsIDRdLCBbMiwgMl0pO1xuICpcbiAqIGNvbnN0IGF4aXMgPSAxO1xuICogeC5tZWFuKGF4aXMpLnByaW50KCk7ICAvLyBvciB0Zi5tZWFuKHgsIGF4aXMpXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICogQHBhcmFtIGF4aXMgVGhlIGRpbWVuc2lvbihzKSB0byByZWR1Y2UuIEJ5IGRlZmF1bHQgaXQgcmVkdWNlc1xuICogICAgIGFsbCBkaW1lbnNpb25zLlxuICogQHBhcmFtIGtlZXBEaW1zIElmIHRydWUsIHJldGFpbnMgcmVkdWNlZCBkaW1lbnNpb25zIHdpdGggc2l6ZSAxLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ1JlZHVjdGlvbid9XG4gKi9cbmZ1bmN0aW9uIG1lYW5fKHgsIGF4aXMgPSBudWxsLCBrZWVwRGltcyA9IGZhbHNlKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnbWVhbicpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICBjb25zdCBhdHRycyA9IHsgYXhpcywga2VlcERpbXMgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChNZWFuLCBpbnB1dHMsIGF0dHJzKTtcbn1cbmV4cG9ydCBjb25zdCBtZWFuID0gb3AoeyBtZWFuXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1lYW4uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgbWF0TXVsIH0gZnJvbSAnLi9tYXRfbXVsJztcbmltcG9ydCB7IG9uZXMgfSBmcm9tICcuL29uZXMnO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vcmVzaGFwZSc7XG5pbXBvcnQgeyBUZW5zb3IgfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IHNpemVGcm9tU2hhcGUgfSBmcm9tICcuLi91dGlsX2Jhc2UnO1xuLyoqXG4gKiBCcm9hZGNhc3RzIHBhcmFtZXRlcnMgZm9yIGV2YWx1YXRpb24gb24gYW4gTi1EIGdyaWQuXG4gKlxuICogR2l2ZW4gTiBvbmUtZGltZW5zaW9uYWwgY29vcmRpbmF0ZSBhcnJheXMgYCphcmdzYCwgcmV0dXJucyBhIGxpc3QgYG91dHB1dHNgXG4gKiBvZiBOLUQgY29vcmRpbmF0ZSBhcnJheXMgZm9yIGV2YWx1YXRpbmcgZXhwcmVzc2lvbnMgb24gYW4gTi1EIGdyaWQuXG4gKlxuICogTm90ZXM6XG4gKiBgbWVzaGdyaWRgIHN1cHBvcnRzIGNhcnRlc2lhbiAoJ3h5JykgYW5kIG1hdHJpeCAoJ2lqJykgaW5kZXhpbmcgY29udmVudGlvbnMuXG4gKiBXaGVuIHRoZSBgaW5kZXhpbmdgIGFyZ3VtZW50IGlzIHNldCB0byAneHknICh0aGUgZGVmYXVsdCksIHRoZSBicm9hZGNhc3RpbmdcbiAqIGluc3RydWN0aW9ucyBmb3IgdGhlIGZpcnN0IHR3byBkaW1lbnNpb25zIGFyZSBzd2FwcGVkLlxuICogRXhhbXBsZXM6XG4gKiBDYWxsaW5nIGBjb25zdCBbWCwgWV0gPSBtZXNoZ3JpZCh4LCB5KWAgd2l0aCB0aGUgdGVuc29yc1xuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIGNvbnN0IHggPSBbMSwgMiwgM107XG4gKiBjb25zdCB5ID0gWzQsIDUsIDZdO1xuICogY29uc3QgW1gsIFldID0gdGYubWVzaGdyaWQoeCwgeSk7XG4gKiAvLyBYID0gW1sxLCAyLCAzXSxcbiAqIC8vICAgICAgWzEsIDIsIDNdLFxuICogLy8gICAgICBbMSwgMiwgM11dXG4gKiAvLyBZID0gW1s0LCA0LCA0XSxcbiAqIC8vICAgICAgWzUsIDUsIDVdLFxuICogLy8gICAgICBbNiwgNiwgNl1dXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBUZW5zb3Igd2l0aCByYW5rIGdlcSAxLlxuICogQHBhcmFtIHkgVGVuc29yIHdpdGggcmFuayBnZXEgMS5cbiAqIEBwYXJhbSBpbmRleGluZ1xuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ1NsaWNpbmcgYW5kIEpvaW5pbmcnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVzaGdyaWQoeCwgeSwgeyBpbmRleGluZyA9ICd4eScgfSA9IHt9KSB7XG4gICAgaWYgKGluZGV4aW5nICE9PSAneHknICYmIGluZGV4aW5nICE9PSAnaWonKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYCR7aW5kZXhpbmd9IGlzIG5vdCBhIHZhbGlkIHRoaXJkIGFyZ3VtZW50IHRvIG1lc2hncmlkYCk7XG4gICAgfVxuICAgIGlmICh4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBsZXQgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnbWVzaGdyaWQnLCB4IGluc3RhbmNlb2YgVGVuc29yID8geC5kdHlwZSA6ICdmbG9hdDMyJyk7XG4gICAgaWYgKHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gWyR4XTtcbiAgICB9XG4gICAgbGV0ICR5ID0gY29udmVydFRvVGVuc29yKHksICd5JywgJ21lc2hncmlkJywgeSBpbnN0YW5jZW9mIFRlbnNvciA/IHkuZHR5cGUgOiAnZmxvYXQzMicpO1xuICAgIGNvbnN0IHcgPSBzaXplRnJvbVNoYXBlKCR4LnNoYXBlKTtcbiAgICBjb25zdCBoID0gc2l6ZUZyb21TaGFwZSgkeS5zaGFwZSk7XG4gICAgaWYgKGluZGV4aW5nID09PSAneHknKSB7XG4gICAgICAgICR4ID0gcmVzaGFwZSgkeCwgWzEsIC0xXSk7XG4gICAgICAgICR5ID0gcmVzaGFwZSgkeSwgWy0xLCAxXSk7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBtYXRNdWwob25lcyhbaCwgMV0sICR4LmR0eXBlKSwgJHgpLFxuICAgICAgICAgICAgbWF0TXVsKCR5LCBvbmVzKFsxLCB3XSwgJHkuZHR5cGUpKSxcbiAgICAgICAgXTtcbiAgICB9XG4gICAgJHggPSByZXNoYXBlKCR4LCBbLTEsIDFdKTtcbiAgICAkeSA9IHJlc2hhcGUoJHksIFsxLCAtMV0pO1xuICAgIHJldHVybiBbXG4gICAgICAgIG1hdE11bCgkeCwgb25lcyhbMSwgaF0sICR4LmR0eXBlKSksXG4gICAgICAgIG1hdE11bChvbmVzKFt3LCAxXSwgJHkuZHR5cGUpLCAkeSksXG4gICAgXTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1lc2hncmlkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBNaW4gfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyB0aGUgbWluaW11bSB2YWx1ZSBmcm9tIHRoZSBpbnB1dC5cbiAqXG4gKiBSZWR1Y2VzIHRoZSBpbnB1dCBhbG9uZyB0aGUgZGltZW5zaW9ucyBnaXZlbiBpbiBgYXhlc2AuIFVubGVzcyBga2VlcERpbXNgXG4gKiBpcyB0cnVlLCB0aGUgcmFuayBvZiB0aGUgYXJyYXkgaXMgcmVkdWNlZCBieSAxIGZvciBlYWNoIGVudHJ5IGluIGBheGVzYC5cbiAqIElmIGBrZWVwRGltc2AgaXMgdHJ1ZSwgdGhlIHJlZHVjZWQgZGltZW5zaW9ucyBhcmUgcmV0YWluZWQgd2l0aCBsZW5ndGggMS5cbiAqIElmIGBheGVzYCBoYXMgbm8gZW50cmllcywgYWxsIGRpbWVuc2lvbnMgYXJlIHJlZHVjZWQsIGFuZCBhbiBhcnJheSB3aXRoIGFcbiAqIHNpbmdsZSBlbGVtZW50IGlzIHJldHVybmVkLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIDNdKTtcbiAqXG4gKiB4Lm1pbigpLnByaW50KCk7ICAvLyBvciB0Zi5taW4oeClcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMmQoWzEsIDIsIDMsIDRdLCBbMiwgMl0pO1xuICpcbiAqIGNvbnN0IGF4aXMgPSAxO1xuICogeC5taW4oYXhpcykucHJpbnQoKTsgIC8vIG9yIHRmLm1pbih4LCBheGlzKVxuICogYGBgXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IFRlbnNvci5cbiAqIEBwYXJhbSBheGlzIFRoZSBkaW1lbnNpb24ocykgdG8gcmVkdWNlLiBCeSBkZWZhdWx0IGl0IHJlZHVjZXNcbiAqICAgICBhbGwgZGltZW5zaW9ucy5cbiAqIEBwYXJhbSBrZWVwRGltcyBJZiB0cnVlLCByZXRhaW5zIHJlZHVjZWQgZGltZW5zaW9ucyB3aXRoIHNpemUgMS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdSZWR1Y3Rpb24nfVxuICovXG5mdW5jdGlvbiBtaW5fKHgsIGF4aXMgPSBudWxsLCBrZWVwRGltcyA9IGZhbHNlKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnbWluJyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBheGlzLCBrZWVwRGltcyB9O1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChNaW4sIGlucHV0cywgYXR0cnMpO1xufVxuZXhwb3J0IGNvbnN0IG1pbiA9IG9wKHsgbWluXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1pbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgTWluaW11bSB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBtYWtlVHlwZXNNYXRjaCB9IGZyb20gJy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSB9IGZyb20gJy4vYnJvYWRjYXN0X3V0aWwnO1xuaW1wb3J0IHsgY2FzdCB9IGZyb20gJy4vY2FzdCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogUmV0dXJucyB0aGUgbWluIG9mIGEgYW5kIGIgKGBhIDwgYiA/IGEgOiBiYCkgZWxlbWVudC13aXNlLlxuICogU3VwcG9ydHMgYnJvYWRjYXN0aW5nLlxuICpcbiAqIFdlIGFsc28gZXhwb3NlIGBtaW5pbXVtU3RyaWN0YCB3aGljaCBoYXMgdGhlIHNhbWUgc2lnbmF0dXJlIGFzIHRoaXMgb3AgYW5kXG4gKiBhc3NlcnRzIHRoYXQgYGFgIGFuZCBgYmAgYXJlIHRoZSBzYW1lIHNoYXBlIChkb2VzIG5vdCBicm9hZGNhc3QpLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzEsIDQsIDMsIDE2XSk7XG4gKiBjb25zdCBiID0gdGYudGVuc29yMWQoWzEsIDIsIDksIDRdKTtcbiAqXG4gKiBhLm1pbmltdW0oYikucHJpbnQoKTsgIC8vIG9yIHRmLm1pbmltdW0oYSwgYilcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiAvLyBCcm9hZGNhc3QgbWluaW11bSBhIHdpdGggYi5cbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMiwgNCwgNiwgOF0pO1xuICogY29uc3QgYiA9IHRmLnNjYWxhcig1KTtcbiAqXG4gKiBhLm1pbmltdW0oYikucHJpbnQoKTsgIC8vIG9yIHRmLm1pbmltdW0oYSwgYilcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCB0ZW5zb3IuXG4gKiBAcGFyYW0gYiBUaGUgc2Vjb25kIHRlbnNvci4gTXVzdCBoYXZlIHRoZSBzYW1lIHR5cGUgYXMgYGFgLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0FyaXRobWV0aWMnfVxuICovXG5mdW5jdGlvbiBtaW5pbXVtXyhhLCBiKSB7XG4gICAgbGV0ICRhID0gY29udmVydFRvVGVuc29yKGEsICdhJywgJ21pbmltdW0nKTtcbiAgICBsZXQgJGIgPSBjb252ZXJ0VG9UZW5zb3IoYiwgJ2InLCAnbWluaW11bScpO1xuICAgIFskYSwgJGJdID0gbWFrZVR5cGVzTWF0Y2goJGEsICRiKTtcbiAgICBpZiAoJGEuZHR5cGUgPT09ICdib29sJykge1xuICAgICAgICAkYSA9IGNhc3QoJGEsICdpbnQzMicpO1xuICAgICAgICAkYiA9IGNhc3QoJGIsICdpbnQzMicpO1xuICAgIH1cbiAgICBhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSgkYS5zaGFwZSwgJGIuc2hhcGUpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgYTogJGEsIGI6ICRiIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoTWluaW11bSwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBtaW5pbXVtID0gb3AoeyBtaW5pbXVtXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1pbmltdW0uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IE1pcnJvclBhZCB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBQYWRzIGEgYHRmLlRlbnNvcmAgdXNpbmcgbWlycm9yIHBhZGRpbmcuXG4gKlxuICogVGhpcyBvcGVyYXRpb24gaW1wbGVtZW50cyB0aGUgYFJFRkxFQ1RgIGFuZCBgU1lNTUVUUklDYCBtb2RlcyBvZiBwYWQuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi5yYW5nZSgwLCA5KS5yZXNoYXBlKFsxLCAxLCAzLCAzXSk7XG4gKiB4Lm1pcnJvclBhZChbWzAsIDBdLCBbMCwgMF0sIFsyLCAyXSwgWzIsIDJdXSwgJ3JlZmxlY3QnKS5wcmludCgpO1xuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgdGVuc29yIHRvIHBhZC5cbiAqIEBwYXJhbSBwYWRkaW5ncyBBbiBhcnJheSBvZiBsZW5ndGggYFJgICh0aGUgcmFuayBvZiB0aGUgdGVuc29yKSwgd2hlcmVcbiAqIGVhY2ggZWxlbWVudCBpcyBhIGxlbmd0aC0yIHR1cGxlIG9mIGludHMgYFtwYWRCZWZvcmUsIHBhZEFmdGVyXWAsXG4gKiBzcGVjaWZ5aW5nIGhvdyBtdWNoIHRvIHBhZCBhbG9uZyBlYWNoIGRpbWVuc2lvbiBvZiB0aGUgdGVuc29yLlxuICogSW4gXCJyZWZsZWN0XCIgbW9kZSwgdGhlIHBhZGRlZCByZWdpb25zIGRvIG5vdCBpbmNsdWRlIHRoZSBib3JkZXJzLFxuICogd2hpbGUgaW4gXCJzeW1tZXRyaWNcIiBtb2RlIHRoZSBwYWRkZWQgcmVnaW9ucyBkbyBpbmNsdWRlIHRoZSBib3JkZXJzLlxuICogRm9yIGV4YW1wbGUsIGlmIHRoZSBpbnB1dCBpcyBgWzEsIDIsIDNdYCBhbmQgcGFkZGluZ3MgaXMgYFswLCAyXWAsXG4gKiB0aGVuIHRoZSBvdXRwdXQgaXMgYFsxLCAyLCAzLCAyLCAxXWAgaW4gXCJyZWZsZWN0XCIgbW9kZSwgYW5kXG4gKiBgWzEsIDIsIDMsIDMsIDJdYCBpbiBcInN5bW1ldHJpY1wiIG1vZGUuXG4gKiBJZiBgbW9kZWAgaXMgXCJyZWZsZWN0XCIgdGhlbiBib3RoIGBwYWRkaW5nc1tELCAwXWAgYW5kIGBwYWRkaW5nc1tELCAxXWBcbiAqIG11c3QgYmUgbm8gZ3JlYXRlciB0aGFuIGB4LnNoYXBlW0RdIC0gMWAuIElmIG1vZGUgaXMgXCJzeW1tZXRyaWNcIlxuICogdGhlbiBib3RoIGBwYWRkaW5nc1tELCAwXWAgYW5kIGBwYWRkaW5nc1tELCAxXWAgbXVzdCBiZSBubyBncmVhdGVyIHRoYW5cbiAqIGB4LnNoYXBlW0RdYFxuICogQHBhcmFtIG1vZGUgU3RyaW5nIHRvIHNwZWNpZnkgcGFkZGluZyBtb2RlLiBDYW4gYmUgYCdyZWZsZWN0JyB8ICdzeW1tZXRyaWMnYFxuICovXG4vKiogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnVHJhbnNmb3JtYXRpb25zJ30gKi9cbmZ1bmN0aW9uIG1pcnJvclBhZF8oeCwgcGFkZGluZ3MsIG1vZGUpIHtcbiAgICB1dGlsLmFzc2VydChtb2RlID09PSAncmVmbGVjdCcgfHwgbW9kZSA9PT0gJ3N5bW1ldHJpYycsICgpID0+IGBJbnZhbGlkIG1vZGUuIE1vZGUgbXVzdCBiZSBlaXRoZXIgcmVmbGVjdCBvciBzeW1tZXRyaWMuIGAgK1xuICAgICAgICBgR290ICR7bW9kZX0uYCk7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnbWlycm9yUGFkJyk7XG4gICAgaWYgKCR4LnJhbmsgPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXJyb3JQYWQoc2NhbGFyKSBpcyBub3QgZGVmaW5lZC4gJyArXG4gICAgICAgICAgICAnUGFzcyBub24tc2NhbGFyIHRvIG1pcnJvclBhZCcpO1xuICAgIH1cbiAgICB1dGlsLmFzc2VydChwYWRkaW5ncy5sZW5ndGggPT09ICR4LnJhbmssICgpID0+IGBQYWRkaW5nIGRvZXNuJ3QgbWF0Y2ggaW5wdXQuIE11c3QgYmUgJHskeC5yYW5rfS4gYCArXG4gICAgICAgIGBHb3QgJHtwYWRkaW5ncy5sZW5ndGh9LmApO1xuICAgIGNvbnN0IHNoYXBlT2Zmc2V0ID0gbW9kZSA9PT0gJ3JlZmxlY3QnID8gMSA6IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCAkeC5yYW5rOyBpKyspIHtcbiAgICAgICAgdXRpbC5hc3NlcnQocGFkZGluZ3NbaV0ubGVuZ3RoID09PSAyLCAoKSA9PiBgSW52YWxpZCBudW1iZXIgb2YgcGFkZGluZ3MuIE11c3QgYmUgbGVuZ3RoIG9mIDIgZWFjaC5gKTtcbiAgICAgICAgdXRpbC5hc3NlcnQocGFkZGluZ3NbaV1bMF0gPj0gMCAmJiBwYWRkaW5nc1tpXVswXSA8PSAkeC5zaGFwZVtpXSAtIHNoYXBlT2Zmc2V0ICYmXG4gICAgICAgICAgICBwYWRkaW5nc1tpXVsxXSA+PSAwICYmIHBhZGRpbmdzW2ldWzFdIDw9ICR4LnNoYXBlW2ldIC0gc2hhcGVPZmZzZXQsICgpID0+IGBQYWRkaW5nIGluIGRpbWVuc2lvbiAke2l9IGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgYCArXG4gICAgICAgICAgICBgdG8gJHskeC5zaGFwZVtpXSAtIHNoYXBlT2Zmc2V0fSBvciBsZXNzIHRoYW4gMCBmb3IgaW5wdXQgb2YgYCArXG4gICAgICAgICAgICBgc2hhcGUgJHskeC5zaGFwZX1gKTtcbiAgICB9XG4gICAgY29uc3QgYXR0cnMgPSB7IHBhZGRpbmdzLCBtb2RlIH07XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKE1pcnJvclBhZCwgaW5wdXRzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3QgbWlycm9yUGFkID0gb3AoeyBtaXJyb3JQYWRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWlycm9yX3BhZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgTW9kIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IG1ha2VUeXBlc01hdGNoIH0gZnJvbSAnLi4vdGVuc29yX3V0aWwnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSBtb2Qgb2YgYSBhbmQgYiBlbGVtZW50LXdpc2UuXG4gKiBgZmxvb3IoeCAvIHkpICogeSArIG1vZCh4LCB5KSA9IHhgXG4gKiBTdXBwb3J0cyBicm9hZGNhc3RpbmcuXG4gKlxuICogV2UgYWxzbyBleHBvc2UgYHRmLm1vZFN0cmljdGAgd2hpY2ggaGFzIHRoZSBzYW1lIHNpZ25hdHVyZSBhcyB0aGlzIG9wIGFuZFxuICogYXNzZXJ0cyB0aGF0IGBhYCBhbmQgYGJgIGFyZSB0aGUgc2FtZSBzaGFwZSAoZG9lcyBub3QgYnJvYWRjYXN0KS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsxLCA0LCAzLCAxNl0pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjFkKFsxLCAyLCA5LCA0XSk7XG4gKlxuICogYS5tb2QoYikucHJpbnQoKTsgIC8vIG9yIHRmLm1vZChhLCBiKVxuICogYGBgXG4gKlxuICogYGBganNcbiAqIC8vIEJyb2FkY2FzdCBhIG1vZCBiLlxuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsyLCA0LCA2LCA4XSk7XG4gKiBjb25zdCBiID0gdGYuc2NhbGFyKDUpO1xuICpcbiAqIGEubW9kKGIpLnByaW50KCk7ICAvLyBvciB0Zi5tb2QoYSwgYilcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCB0ZW5zb3IuXG4gKiBAcGFyYW0gYiBUaGUgc2Vjb25kIHRlbnNvci4gTXVzdCBoYXZlIHRoZSBzYW1lIHR5cGUgYXMgYGFgLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0FyaXRobWV0aWMnfVxuICovXG5mdW5jdGlvbiBtb2RfKGEsIGIpIHtcbiAgICBsZXQgJGEgPSBjb252ZXJ0VG9UZW5zb3IoYSwgJ2EnLCAnbW9kJyk7XG4gICAgbGV0ICRiID0gY29udmVydFRvVGVuc29yKGIsICdiJywgJ21vZCcpO1xuICAgIFskYSwgJGJdID0gbWFrZVR5cGVzTWF0Y2goJGEsICRiKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IGE6ICRhLCBiOiAkYiB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKE1vZCwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBtb2QgPSBvcCh7IG1vZF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tb2QuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IHBhcnNlQXhpc1BhcmFtIH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBleHBhbmRTaGFwZVRvS2VlcERpbSB9IGZyb20gJy4vYXhpc191dGlsJztcbmltcG9ydCB7IGNhc3QgfSBmcm9tICcuL2Nhc3QnO1xuaW1wb3J0IHsgbWVhbiB9IGZyb20gJy4vbWVhbic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL3Jlc2hhcGUnO1xuaW1wb3J0IHsgc3F1YXJlIH0gZnJvbSAnLi9zcXVhcmUnO1xuaW1wb3J0IHsgc3ViIH0gZnJvbSAnLi9zdWInO1xuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBtZWFuIGFuZCB2YXJpYW5jZSBvZiBgeGAuIFRoZSBtZWFuIGFuZCB2YXJpYW5jZSBhcmVcbiAqIGNhbGN1bGF0ZWQgYnkgYWdncmVnYXRpbmcgdGhlIGNvbnRlbnRzIG9mIGB4YCBhY3Jvc3MgYGF4ZXNgLiBJZiBgeGAgaXNcbiAqIDEtRCBhbmQgYGF4ZXMgPSBbMF1gIHRoaXMgaXMganVzdCB0aGUgbWVhbiBhbmQgdmFyaWFuY2Ugb2YgYSB2ZWN0b3IuXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqIEBwYXJhbSBheGlzIFRoZSBkaW1lbnNpb24ocykgYWxvbmcgd2l0aCB0byBjb21wdXRlIG1lYW4gYW5kXG4gKiAgICAgdmFyaWFuY2UuIEJ5IGRlZmF1bHQgaXQgcmVkdWNlcyBhbGwgZGltZW5zaW9ucy5cbiAqIEBwYXJhbSBrZWVwRGltcyBJZiB0cnVlLCB0aGUgbW9tZW50cyBoYXZlIHRoZSBzYW1lIGRpbWVuc2lvbmFsaXR5IGFzIHRoZVxuICogICAgIGlucHV0LlxuICogQHJldHVybiBBbiBvYmplY3Qgd2l0aCB0d28ga2V5czogYG1lYW5gIGFuZCBgdmFyaWFuY2VgLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ05vcm1hbGl6YXRpb24nfVxuICovXG5mdW5jdGlvbiBtb21lbnRzXyh4LCBheGlzID0gbnVsbCwga2VlcERpbXMgPSBmYWxzZSkge1xuICAgIHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnbW9tZW50cycpO1xuICAgIGNvbnN0IGF4ZXMgPSBwYXJzZUF4aXNQYXJhbShheGlzLCB4LnNoYXBlKTtcbiAgICBjb25zdCB4TWVhbiA9IG1lYW4oeCwgYXhlcywga2VlcERpbXMpO1xuICAgIGxldCBrZWVwRGltc1NoYXBlID0geE1lYW4uc2hhcGU7XG4gICAgaWYgKCFrZWVwRGltcykge1xuICAgICAgICBrZWVwRGltc1NoYXBlID0gZXhwYW5kU2hhcGVUb0tlZXBEaW0oeE1lYW4uc2hhcGUsIGF4ZXMpO1xuICAgIH1cbiAgICBjb25zdCBkZXZTcXVhcmVkID0gc3F1YXJlKHN1YihjYXN0KHgsICdmbG9hdDMyJyksIHJlc2hhcGUoeE1lYW4sIGtlZXBEaW1zU2hhcGUpKSk7XG4gICAgY29uc3QgdmFyaWFuY2UgPSBtZWFuKGRldlNxdWFyZWQsIGF4ZXMsIGtlZXBEaW1zKTtcbiAgICByZXR1cm4geyBtZWFuOiB4TWVhbiwgdmFyaWFuY2UgfTtcbn1cbmV4cG9ydCBjb25zdCBtb21lbnRzID0gb3AoeyBtb21lbnRzXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1vbWVudHMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYXNzZXJ0VHlwZXNNYXRjaCB9IGZyb20gJy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgYWRkIH0gZnJvbSAnLi9hZGQnO1xuaW1wb3J0IHsgZGl2IH0gZnJvbSAnLi9kaXYnO1xuaW1wb3J0IHsgbXVsIH0gZnJvbSAnLi9tdWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyBwb3cgfSBmcm9tICcuL3Bvdyc7XG5pbXBvcnQgeyBzY2FsYXIgfSBmcm9tICcuL3NjYWxhcic7XG5pbXBvcnQgeyBzdWIgfSBmcm9tICcuL3N1Yic7XG4vKipcbiAqIENvbXB1dGUgdGhlIG1vdmluZyBhdmVyYWdlIG9mIGEgdmFyaWFibGUuXG4gKlxuICogV2l0aG91dCB6ZXJvRGViaWFzLCB0aGUgbW92aW5nIGF2ZXJhZ2Ugb3BlcmF0aW9uIGlzIGRlZmluZWQgYnk6XG4gKiAgIGB2ICs9IGRlbHRhYFxuICogd2hlcmVcbiAqICAgYGRlbHRhID0gKDEgLSBkZWNheSkgKiAoeCAtIHYpYFxuICpcbiAqIFdpdGggemVyb0RlYmlhcyAoZGVmYXVsdCksIHRoZSBgZGVsdGFgIHRlcm0gaXMgc2NhbGVkIHRvIGRlYmlhcyB0aGVcbiAqIGVmZmVjdCBvZiB0aGUgKGFzc3VtZWQpIHplcm8taW5pdGlhbGl6YXRpb24gb2YgYHZgLlxuICogICBgZGVsdGEgLz0gKDEgLSBkZWNheSBeIHN0ZXApYFxuICpcbiAqIEZvciBtb3JlIGRldGFpbHMgb24gdGhlIHplcm8tZGViaWFzaW5nIGFsZ29yaXRobSwgc2VlOlxuICogICBodHRwczovL2FyeGl2Lm9yZy9hYnMvMTQxMi42OTgwXG4gKlxuICogTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gaXMgY29tcGxldGVseSBzdGF0ZWxlc3MgYW5kIGRvZXMgbm90IGtlZXAgdHJhY2sgb2ZcbiAqIHN0ZXAgY291bnQuIFRoZSBzdGVwIGNvdW50IG5lZWRzIHRvIGJlIG1haW50YWluZWQgYnkgdGhlIGNhbGxlciBhbmQgcGFzc2VkXG4gKiBpbiBhcyBgc3RlcGAuXG4gKlxuICogQHBhcmFtIHYgVGhlIGN1cnJlbnQgbW92aW5nIGF2ZXJhZ2UgdmFsdWUuXG4gKiBAcGFyYW0geCBOZXcgaW5wdXQgdmFsdWUsIG11c3QgaGF2ZSB0aGUgc2FtZSBzaGFwZSBhbmQgZHR5cGUgYXMgYHZgLlxuICogQHBhcmFtIGRlY2F5IFRoZSBkZWNheSBmYWN0b3IuIFR5cGljYWwgdmFsdWVzIGFyZSAwLjk1IGFuZCAwLjk5LlxuICogQHBhcmFtIHN0ZXAgU3RlcCBjb3VudC5cbiAqIEBwYXJhbSB6ZXJvRGViaWFzOiBXaGV0aGVyIHplcm9EZWJpYXMgaXMgdG8gYmUgcGVyZm9ybWVkIChkZWZhdWx0OiBgdHJ1ZWApLlxuICogQHJldHVybnMgVGhlIG5ldyBtb3ZpbmcgYXZlcmFnZSB2YWx1ZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdNb3ZpbmcgQXZlcmFnZSd9XG4gKi9cbmZ1bmN0aW9uIG1vdmluZ0F2ZXJhZ2VfKHYsIHgsIGRlY2F5LCBzdGVwLCB6ZXJvRGViaWFzID0gdHJ1ZSkge1xuICAgIGNvbnN0ICR2ID0gY29udmVydFRvVGVuc29yKHYsICd2JywgJ21vdmluZ0F2ZXJhZ2UnKTtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdtb3ZpbmdBdmVyYWdlJyk7XG4gICAgY29uc3QgJGRlY2F5ID0gY29udmVydFRvVGVuc29yKGRlY2F5LCAnZGVjYXknLCAnbW92aW5nQXZlcmFnZScpO1xuICAgIGFzc2VydFR5cGVzTWF0Y2goJHYsICR4KTtcbiAgICB1dGlsLmFzc2VydCh1dGlsLmFycmF5c0VxdWFsKCR2LnNoYXBlLCAkeC5zaGFwZSksICgpID0+ICdTaGFwZSBtaXNtYXRjaCBpbiB2IGFuZCB4Jyk7XG4gICAgY29uc3Qgb25lID0gc2NhbGFyKDEpO1xuICAgIGNvbnN0IG9uZU1pbnVzRGVjYXkgPSBzdWIob25lLCAkZGVjYXkpO1xuICAgIGxldCB1cGRhdGUgPSBtdWwoc3ViKCR4LCAkdiksIG9uZU1pbnVzRGVjYXkpO1xuICAgIGlmICh6ZXJvRGViaWFzKSB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KHN0ZXAgIT0gbnVsbCwgKCkgPT4gJ1doZW4gdXNpbmcgemVyb0RlYmlhczogdHJ1ZSwgc3RlcCBpcyByZXF1aXJlZC4nKTtcbiAgICAgICAgY29uc3QgJHN0ZXAgPSBjb252ZXJ0VG9UZW5zb3Ioc3RlcCwgJ3N0ZXAnLCAnbW92aW5nQXZlcmFnZScpO1xuICAgICAgICB1cGRhdGUgPSBkaXYodXBkYXRlLCBzdWIob25lLCBwb3coJGRlY2F5LCAkc3RlcCkpKTtcbiAgICB9XG4gICAgcmV0dXJuIGFkZCgkdiwgdXBkYXRlKTtcbn1cbmV4cG9ydCBjb25zdCBtb3ZpbmdBdmVyYWdlID0gb3AoeyBtb3ZpbmdBdmVyYWdlXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1vdmluZ19hdmVyYWdlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBNdWx0aXBseSB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBtYWtlVHlwZXNNYXRjaCB9IGZyb20gJy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogTXVsdGlwbGllcyB0d28gYHRmLlRlbnNvcmBzIGVsZW1lbnQtd2lzZSwgQSAqIEIuIFN1cHBvcnRzIGJyb2FkY2FzdGluZy5cbiAqXG4gKiBXZSBhbHNvIGV4cG9zZSBgdGYubXVsU3RyaWN0YCB3aGljaCBoYXMgdGhlIHNhbWUgc2lnbmF0dXJlIGFzIHRoaXMgb3AgYW5kXG4gKiBhc3NlcnRzIHRoYXQgYGFgIGFuZCBgYmAgYXJlIHRoZSBzYW1lIHNoYXBlIChkb2VzIG5vdCBicm9hZGNhc3QpLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzEsIDIsIDMsIDRdKTtcbiAqIGNvbnN0IGIgPSB0Zi50ZW5zb3IxZChbMiwgMywgNCwgNV0pO1xuICpcbiAqIGEubXVsKGIpLnByaW50KCk7ICAvLyBvciB0Zi5tdWwoYSwgYilcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiAvLyBCcm9hZGNhc3QgbXVsIGEgd2l0aCBiLlxuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzLCA0XSk7XG4gKiBjb25zdCBiID0gdGYuc2NhbGFyKDUpO1xuICpcbiAqIGEubXVsKGIpLnByaW50KCk7ICAvLyBvciB0Zi5tdWwoYSwgYilcbiAqIGBgYFxuICogQHBhcmFtIGEgVGhlIGZpcnN0IHRlbnNvciB0byBtdWx0aXBseS5cbiAqIEBwYXJhbSBiIFRoZSBzZWNvbmQgdGVuc29yIHRvIG11bHRpcGx5LiBNdXN0IGhhdmUgdGhlIHNhbWUgZHR5cGUgYXMgYGFgLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0FyaXRobWV0aWMnfVxuICovXG5mdW5jdGlvbiBtdWxfKGEsIGIpIHtcbiAgICBsZXQgJGEgPSBjb252ZXJ0VG9UZW5zb3IoYSwgJ2EnLCAnbXVsJyk7XG4gICAgbGV0ICRiID0gY29udmVydFRvVGVuc29yKGIsICdiJywgJ211bCcpO1xuICAgIFskYSwgJGJdID0gbWFrZVR5cGVzTWF0Y2goJGEsICRiKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IGE6ICRhLCBiOiAkYiB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKE11bHRpcGx5LCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IG11bCA9IG9wKHsgbXVsXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW11bC5qcy5tYXAiLCJpbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IsIGNvbnZlcnRUb1RlbnNvckFycmF5IH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyB0aGUgbmV4dCBzdGF0ZXMgYW5kIG91dHB1dHMgb2YgYSBzdGFjayBvZiBMU1RNQ2VsbHMuXG4gKlxuICogRWFjaCBjZWxsIG91dHB1dCBpcyB1c2VkIGFzIGlucHV0IHRvIHRoZSBuZXh0IGNlbGwuXG4gKlxuICogUmV0dXJucyBgW2NlbGxTdGF0ZSwgY2VsbE91dHB1dF1gLlxuICpcbiAqIERlcml2ZWQgZnJvbSB0Zi5jb250cmliLnJuLk11bHRpUk5OQ2VsbC5cbiAqXG4gKiBAcGFyYW0gbHN0bUNlbGxzIEFycmF5IG9mIExTVE1DZWxsIGZ1bmN0aW9ucy5cbiAqIEBwYXJhbSBkYXRhIFRoZSBpbnB1dCB0byB0aGUgY2VsbC5cbiAqIEBwYXJhbSBjIEFycmF5IG9mIHByZXZpb3VzIGNlbGwgc3RhdGVzLlxuICogQHBhcmFtIGggQXJyYXkgb2YgcHJldmlvdXMgY2VsbCBvdXRwdXRzLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ1JOTid9XG4gKi9cbmZ1bmN0aW9uIG11bHRpUk5OQ2VsbF8obHN0bUNlbGxzLCBkYXRhLCBjLCBoKSB7XG4gICAgY29uc3QgJGRhdGEgPSBjb252ZXJ0VG9UZW5zb3IoZGF0YSwgJ2RhdGEnLCAnbXVsdGlSTk5DZWxsJyk7XG4gICAgY29uc3QgJGMgPSBjb252ZXJ0VG9UZW5zb3JBcnJheShjLCAnYycsICdtdWx0aVJOTkNlbGwnKTtcbiAgICBjb25zdCAkaCA9IGNvbnZlcnRUb1RlbnNvckFycmF5KGgsICdoJywgJ211bHRpUk5OQ2VsbCcpO1xuICAgIGxldCBpbnB1dCA9ICRkYXRhO1xuICAgIGNvbnN0IG5ld1N0YXRlcyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbHN0bUNlbGxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IG91dHB1dCA9IGxzdG1DZWxsc1tpXShpbnB1dCwgJGNbaV0sICRoW2ldKTtcbiAgICAgICAgbmV3U3RhdGVzLnB1c2gob3V0cHV0WzBdKTtcbiAgICAgICAgbmV3U3RhdGVzLnB1c2gob3V0cHV0WzFdKTtcbiAgICAgICAgaW5wdXQgPSBvdXRwdXRbMV07XG4gICAgfVxuICAgIGNvbnN0IG5ld0MgPSBbXTtcbiAgICBjb25zdCBuZXdIID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXdTdGF0ZXMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgbmV3Qy5wdXNoKG5ld1N0YXRlc1tpXSk7XG4gICAgICAgIG5ld0gucHVzaChuZXdTdGF0ZXNbaSArIDFdKTtcbiAgICB9XG4gICAgcmV0dXJuIFtuZXdDLCBuZXdIXTtcbn1cbmV4cG9ydCBjb25zdCBtdWx0aVJOTkNlbGwgPSBvcCh7IG11bHRpUk5OQ2VsbF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tdWx0aV9ybm5fY2VsbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgTXVsdGlub21pYWwgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4vcmVzaGFwZSc7XG4vKipcbiAqIENyZWF0ZXMgYSBgdGYuVGVuc29yYCB3aXRoIHZhbHVlcyBkcmF3biBmcm9tIGEgbXVsdGlub21pYWwgZGlzdHJpYnV0aW9uLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBwcm9icyA9IHRmLnRlbnNvcihbLjc1LCAuMjVdKTtcbiAqIHRmLm11bHRpbm9taWFsKHByb2JzLCAzKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGxvZ2l0cyAxRCBhcnJheSB3aXRoIHVubm9ybWFsaXplZCBsb2ctcHJvYmFiaWxpdGllcywgb3JcbiAqICAgICAyRCBhcnJheSBvZiBzaGFwZSBgW2JhdGNoU2l6ZSwgbnVtT3V0Y29tZXNdYC4gU2VlIHRoZSBgbm9ybWFsaXplZGBcbiAqICAgICBwYXJhbWV0ZXIuXG4gKiBAcGFyYW0gbnVtU2FtcGxlcyBOdW1iZXIgb2Ygc2FtcGxlcyB0byBkcmF3IGZvciBlYWNoIHJvdyBzbGljZS5cbiAqIEBwYXJhbSBzZWVkIFRoZSBzZWVkIG51bWJlci5cbiAqIEBwYXJhbSBub3JtYWxpemVkIFdoZXRoZXIgdGhlIHByb3ZpZGVkIGBsb2dpdHNgIGFyZSBub3JtYWxpemVkIHRydWVcbiAqICAgICBwcm9iYWJpbGl0aWVzIChzdW0gdG8gMSkuIERlZmF1bHRzIHRvIGZhbHNlLlxuICogQHJldHVybiAxRCBhcnJheSBvZiBzaGFwZSBgW251bVNhbXBsZXNdYCwgb3IgMkQgYXJyYXkgb2Ygc2hhcGVcbiAqICAgICBgW2JhdGNoU2l6ZSwgbnVtU2FtcGxlc11gLCBkZXBlbmRpbmcgb24gdGhlIHJhbmsgb2YgdGhlIGlucHV0LlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ1JhbmRvbSd9XG4gKi9cbmZ1bmN0aW9uIG11bHRpbm9taWFsXyhsb2dpdHMsIG51bVNhbXBsZXMsIHNlZWQsIG5vcm1hbGl6ZWQgPSBmYWxzZSkge1xuICAgIGNvbnN0ICRsb2dpdHMgPSBjb252ZXJ0VG9UZW5zb3IobG9naXRzLCAnbG9naXRzJywgJ211bHRpbm9taWFsJyk7XG4gICAgY29uc3QgbnVtT3V0Y29tZXMgPSAkbG9naXRzLnNpemU7XG4gICAgY29uc3Qgb3JpZ1JhbmsgPSAkbG9naXRzLnJhbms7XG4gICAgaWYgKG51bU91dGNvbWVzIDwgMikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGluIG11bHRpbm9taWFsOiB5b3UgbmVlZCBhdCBsZWFzdCAyIG91dGNvbWVzLCBidXQgZ290IGAgK1xuICAgICAgICAgICAgYCR7bnVtT3V0Y29tZXN9LmApO1xuICAgIH1cbiAgICBpZiAob3JpZ1JhbmsgPiAyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUmFuayBvZiBwcm9iYWJpbGl0aWVzIG11c3QgYmUgMSBvciAyLCBidXQgaXMgJHtvcmlnUmFua31gKTtcbiAgICB9XG4gICAgLy8gVE9ETyhsaW5hMTI4KTogSW52ZXN0aWdhdGUgY29ycmVjdCBzZWVkIGJlaGF2aW9yLiBUaGUgY29kZSBzZWVtcyBub3QgYWxsb3dcbiAgICAvLyBzZXR0aW5nIHNlZSB0byAwLlxuICAgIHNlZWQgPSBzZWVkIHx8IE1hdGgucmFuZG9tKCk7XG4gICAgLy8gVGhlIGtlcm5lbCBvbmx5IGFjY2VwdHMgKGFuZCByZXR1cm5zKSByYW5rIDIgdGVuc29ycy5cbiAgICBjb25zdCBsb2dpdHMyRCA9IG9yaWdSYW5rID09PSAxID8gcmVzaGFwZSgkbG9naXRzLCBbMSwgLTFdKSA6ICRsb2dpdHM7XG4gICAgY29uc3QgaW5wdXRzID0geyBsb2dpdHM6IGxvZ2l0czJEIH07XG4gICAgY29uc3QgYXR0cnMgPSB7IG51bVNhbXBsZXMsIHNlZWQsIG5vcm1hbGl6ZWQgfTtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgY29uc3QgcmVzID0gRU5HSU5FLnJ1bktlcm5lbChNdWx0aW5vbWlhbCwgaW5wdXRzLCBhdHRycyk7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgcmV0dXJuIG9yaWdSYW5rID09PSAxID8gcmVzaGFwZShyZXMsIFtyZXMuc2l6ZV0pIDogcmVzO1xufVxuZXhwb3J0IGNvbnN0IG11bHRpbm9taWFsID0gb3AoeyBtdWx0aW5vbWlhbF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tdWx0aW5vbWlhbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgTmVnIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgYC0xICogeGAgZWxlbWVudC13aXNlLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMmQoWzEsIDIsIC0yLCAwXSwgWzIsIDJdKTtcbiAqXG4gKiB4Lm5lZygpLnByaW50KCk7ICAvLyBvciB0Zi5uZWcoeClcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMgbWF0aCd9XG4gKi9cbmZ1bmN0aW9uIG5lZ18oeCkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ25lZycpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChOZWcsIGlucHV0cyk7XG59XG5leHBvcnQgY29uc3QgbmVnID0gb3AoeyBuZWdfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bmVnLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5mdW5jdGlvbiBub25NYXhTdXBwU2FuaXR5Q2hlY2soYm94ZXMsIHNjb3JlcywgbWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLCBzY29yZVRocmVzaG9sZCwgc29mdE5tc1NpZ21hKSB7XG4gICAgaWYgKGlvdVRocmVzaG9sZCA9PSBudWxsKSB7XG4gICAgICAgIGlvdVRocmVzaG9sZCA9IDAuNTtcbiAgICB9XG4gICAgaWYgKHNjb3JlVGhyZXNob2xkID09IG51bGwpIHtcbiAgICAgICAgc2NvcmVUaHJlc2hvbGQgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7XG4gICAgfVxuICAgIGlmIChzb2Z0Tm1zU2lnbWEgPT0gbnVsbCkge1xuICAgICAgICBzb2Z0Tm1zU2lnbWEgPSAwLjA7XG4gICAgfVxuICAgIGNvbnN0IG51bUJveGVzID0gYm94ZXMuc2hhcGVbMF07XG4gICAgbWF4T3V0cHV0U2l6ZSA9IE1hdGgubWluKG1heE91dHB1dFNpemUsIG51bUJveGVzKTtcbiAgICB1dGlsLmFzc2VydCgwIDw9IGlvdVRocmVzaG9sZCAmJiBpb3VUaHJlc2hvbGQgPD0gMSwgKCkgPT4gYGlvdVRocmVzaG9sZCBtdXN0IGJlIGluIFswLCAxXSwgYnV0IHdhcyAnJHtpb3VUaHJlc2hvbGR9J2ApO1xuICAgIHV0aWwuYXNzZXJ0KGJveGVzLnJhbmsgPT09IDIsICgpID0+IGBib3hlcyBtdXN0IGJlIGEgMkQgdGVuc29yLCBidXQgd2FzIG9mIHJhbmsgJyR7Ym94ZXMucmFua30nYCk7XG4gICAgdXRpbC5hc3NlcnQoYm94ZXMuc2hhcGVbMV0gPT09IDQsICgpID0+IGBib3hlcyBtdXN0IGhhdmUgNCBjb2x1bW5zLCBidXQgMm5kIGRpbWVuc2lvbiB3YXMgJHtib3hlcy5zaGFwZVsxXX1gKTtcbiAgICB1dGlsLmFzc2VydChzY29yZXMucmFuayA9PT0gMSwgKCkgPT4gJ3Njb3JlcyBtdXN0IGJlIGEgMUQgdGVuc29yJyk7XG4gICAgdXRpbC5hc3NlcnQoc2NvcmVzLnNoYXBlWzBdID09PSBudW1Cb3hlcywgKCkgPT4gYHNjb3JlcyBoYXMgaW5jb21wYXRpYmxlIHNoYXBlIHdpdGggYm94ZXMuIEV4cGVjdGVkICR7bnVtQm94ZXN9LCBgICtcbiAgICAgICAgYGJ1dCB3YXMgJHtzY29yZXMuc2hhcGVbMF19YCk7XG4gICAgdXRpbC5hc3NlcnQoMCA8PSBzb2Z0Tm1zU2lnbWEgJiYgc29mdE5tc1NpZ21hIDw9IDEsICgpID0+IGBzb2Z0Tm1zU2lnbWEgbXVzdCBiZSBpbiBbMCwgMV0sIGJ1dCB3YXMgJyR7c29mdE5tc1NpZ21hfSdgKTtcbiAgICByZXR1cm4geyBtYXhPdXRwdXRTaXplLCBpb3VUaHJlc2hvbGQsIHNjb3JlVGhyZXNob2xkLCBzb2Z0Tm1zU2lnbWEgfTtcbn1cbmV4cG9ydCB7IG5vbk1heFN1cHBTYW5pdHlDaGVjayB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bm9ubWF4X3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IHBhcnNlQXhpc1BhcmFtIH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBhYnMgfSBmcm9tICcuL2Ficyc7XG5pbXBvcnQgKiBhcyBheGlzX3V0aWwgZnJvbSAnLi9heGlzX3V0aWwnO1xuaW1wb3J0IHsgbWF4IH0gZnJvbSAnLi9tYXgnO1xuaW1wb3J0IHsgbWluIH0gZnJvbSAnLi9taW4nO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyBwb3cgfSBmcm9tICcuL3Bvdyc7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9yZXNoYXBlJztcbmltcG9ydCB7IHNjYWxhciB9IGZyb20gJy4vc2NhbGFyJztcbmltcG9ydCB7IHNxcnQgfSBmcm9tICcuL3NxcnQnO1xuaW1wb3J0IHsgc3F1YXJlIH0gZnJvbSAnLi9zcXVhcmUnO1xuaW1wb3J0IHsgc3VtIH0gZnJvbSAnLi9zdW0nO1xuLyoqXG4gKiBDb21wdXRlcyB0aGUgbm9ybSBvZiBzY2FsYXIsIHZlY3RvcnMsIGFuZCBtYXRyaWNlcy5cbiAqIFRoaXMgZnVuY3Rpb24gY2FuIGNvbXB1dGUgc2V2ZXJhbCBkaWZmZXJlbnQgdmVjdG9yIG5vcm1zICh0aGUgMS1ub3JtLCB0aGVcbiAqIEV1Y2xpZGVhbiBvciAyLW5vcm0sIHRoZSBpbmYtbm9ybSwgYW5kIGluIGdlbmVyYWwgdGhlIHAtbm9ybSBmb3IgcCA+IDApXG4gKiBhbmQgbWF0cml4IG5vcm1zIChGcm9iZW5pdXMsIDEtbm9ybSwgYW5kIGluZi1ub3JtKS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzLCA0XSk7XG4gKlxuICogeC5ub3JtKCkucHJpbnQoKTsgIC8vIG9yIHRmLm5vcm0oeClcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCBhcnJheS5cbiAqIEBwYXJhbSBvcmQgT3B0aW9uYWwuIE9yZGVyIG9mIHRoZSBub3JtLiBTdXBwb3J0ZWQgbm9ybSB0eXBlcyBhcmVcbiAqIGZvbGxvd2luZzpcbiAqXG4gKiAgfCBvcmQgICAgICAgIHwgbm9ybSBmb3IgbWF0cmljZXMgICAgICAgICB8IG5vcm0gZm9yIHZlY3RvcnNcbiAqICB8LS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICB8J2V1Y2xpZGVhbicgfEZyb2Jlbml1cyBub3JtICAgICAgICAgICAgIHwyLW5vcm1cbiAqICB8J2ZybycgICAgICAgfEZyb2Jlbml1cyBub3JtXHQgICAgICAgICAgIHxcbiAqICB8SW5maW5pdHkgICAgfG1heChzdW0oYWJzKHgpLCBheGlzPTEpKSAgIHxtYXgoYWJzKHgpKVxuICogIHwtSW5maW5pdHkgICB8bWluKHN1bShhYnMoeCksIGF4aXM9MSkpICAgfG1pbihhYnMoeCkpXG4gKiAgfDEgICAgICAgICAgIHxtYXgoc3VtKGFicyh4KSwgYXhpcz0wKSkgICB8c3VtKGFicyh4KSlcbiAqICB8MiAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHxzdW0oYWJzKHgpXjIpXjEvMipcbiAqXG4gKiBAcGFyYW0gYXhpcyBPcHRpb25hbC4gSWYgYXhpcyBpcyBudWxsICh0aGUgZGVmYXVsdCksIHRoZSBpbnB1dCBpc1xuICogY29uc2lkZXJlZCBhIHZlY3RvciBhbmQgYSBzaW5nbGUgdmVjdG9yIG5vcm0gaXMgY29tcHV0ZWQgb3ZlciB0aGUgZW50aXJlXG4gKiBzZXQgb2YgdmFsdWVzIGluIHRoZSBUZW5zb3IsIGkuZS4gbm9ybSh4LCBvcmQpIGlzIGVxdWl2YWxlbnRcbiAqIHRvIG5vcm0oeC5yZXNoYXBlKFstMV0pLCBvcmQpLiBJZiBheGlzIGlzIGEgaW50ZWdlciwgdGhlIGlucHV0XG4gKiBpcyBjb25zaWRlcmVkIGEgYmF0Y2ggb2YgdmVjdG9ycywgYW5kIGF4aXMgZGV0ZXJtaW5lcyB0aGUgYXhpcyBpbiB4XG4gKiBvdmVyIHdoaWNoIHRvIGNvbXB1dGUgdmVjdG9yIG5vcm1zLiBJZiBheGlzIGlzIGEgMi10dXBsZSBvZiBpbnRlZ2VyIGl0IGlzXG4gKiBjb25zaWRlcmVkIGEgYmF0Y2ggb2YgbWF0cmljZXMgYW5kIGF4aXMgZGV0ZXJtaW5lcyB0aGUgYXhlcyBpbiBOREFycmF5XG4gKiBvdmVyIHdoaWNoIHRvIGNvbXB1dGUgYSBtYXRyaXggbm9ybS5cbiAqIEBwYXJhbSBrZWVwRGltcyBPcHRpb25hbC4gSWYgdHJ1ZSwgdGhlIG5vcm0gaGF2ZSB0aGUgc2FtZSBkaW1lbnNpb25hbGl0eVxuICogYXMgdGhlIGlucHV0LlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ01hdHJpY2VzJ31cbiAqL1xuZnVuY3Rpb24gbm9ybV8oeCwgb3JkID0gJ2V1Y2xpZGVhbicsIGF4aXMgPSBudWxsLCBrZWVwRGltcyA9IGZhbHNlKSB7XG4gICAgeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdub3JtJyk7XG4gICAgY29uc3Qgbm9ybSA9IG5vcm1JbXBsKHgsIG9yZCwgYXhpcyk7XG4gICAgbGV0IGtlZXBEaW1zU2hhcGUgPSBub3JtLnNoYXBlO1xuICAgIGlmIChrZWVwRGltcykge1xuICAgICAgICBjb25zdCBheGVzID0gcGFyc2VBeGlzUGFyYW0oYXhpcywgeC5zaGFwZSk7XG4gICAgICAgIGtlZXBEaW1zU2hhcGUgPSBheGlzX3V0aWwuZXhwYW5kU2hhcGVUb0tlZXBEaW0obm9ybS5zaGFwZSwgYXhlcyk7XG4gICAgfVxuICAgIHJldHVybiByZXNoYXBlKG5vcm0sIGtlZXBEaW1zU2hhcGUpO1xufVxuZnVuY3Rpb24gbm9ybUltcGwoeCwgcCwgYXhpcyA9IG51bGwpIHtcbiAgICBpZiAoeC5yYW5rID09PSAwKSB7XG4gICAgICAgIHJldHVybiBhYnMoeCk7XG4gICAgfVxuICAgIC8vIGNvbnNpZGVyIHZlY3RvciB3aGVuIG5vIGF4aXMgaXMgc3BlY2lmaWVkXG4gICAgaWYgKHgucmFuayAhPT0gMSAmJiBheGlzID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBub3JtSW1wbChyZXNoYXBlKHgsIFstMV0pLCBwLCBheGlzKTtcbiAgICB9XG4gICAgLy8gdmVjdG9yXG4gICAgaWYgKHgucmFuayA9PT0gMSB8fCB0eXBlb2YgYXhpcyA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgQXJyYXkuaXNBcnJheShheGlzKSAmJiBheGlzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBpZiAocCA9PT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIHN1bShhYnMoeCksIGF4aXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwID09PSBJbmZpbml0eSkge1xuICAgICAgICAgICAgcmV0dXJuIG1heChhYnMoeCksIGF4aXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwID09PSAtSW5maW5pdHkpIHtcbiAgICAgICAgICAgIHJldHVybiBtaW4oYWJzKHgpLCBheGlzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocCA9PT0gJ2V1Y2xpZGVhbicgfHwgcCA9PT0gMikge1xuICAgICAgICAgICAgLy8gbm9ybSh4LCAyKSA9IHN1bShhYnMoeGkpIF4gMikgXiAxLzJcbiAgICAgICAgICAgIHJldHVybiBzcXJ0KHN1bShwb3coYWJzKHgpLCBzY2FsYXIoMiwgJ2ludDMyJykpLCBheGlzKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBpbiBub3JtOiBpbnZhbGlkIG9yZCB2YWx1ZTogJHtwfWApO1xuICAgIH1cbiAgICAvLyBtYXRyaXggKGFzc3VtcHRpb24gYXhpc1swXSA8IGF4aXNbMV0pXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYXhpcykgJiYgYXhpcy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgaWYgKHAgPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBtYXgoc3VtKGFicyh4KSwgYXhpc1swXSksIGF4aXNbMV0gLSAxKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocCA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgICAgIHJldHVybiBtYXgoc3VtKGFicyh4KSwgYXhpc1sxXSksIGF4aXNbMF0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwID09PSAtSW5maW5pdHkpIHtcbiAgICAgICAgICAgIHJldHVybiBtaW4oc3VtKGFicyh4KSwgYXhpc1sxXSksIGF4aXNbMF0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwID09PSAnZnJvJyB8fCBwID09PSAnZXVjbGlkZWFuJykge1xuICAgICAgICAgICAgLy8gbm9ybSh4KSA9IHNxcnQoc3VtKHBvdyh4LCAyKSkpXG4gICAgICAgICAgICByZXR1cm4gc3FydChzdW0oc3F1YXJlKHgpLCBheGlzKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBpbiBub3JtOiBpbnZhbGlkIG9yZCB2YWx1ZTogJHtwfWApO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGluIG5vcm06IGludmFsaWQgYXhpczogJHtheGlzfWApO1xufVxuZXhwb3J0IGNvbnN0IG5vcm0gPSBvcCh7IG5vcm1fIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bm9ybS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgTm90RXF1YWwgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgbWFrZVR5cGVzTWF0Y2ggfSBmcm9tICcuLi90ZW5zb3JfdXRpbCc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUgfSBmcm9tICcuL2Jyb2FkY2FzdF91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSB0cnV0aCB2YWx1ZSBvZiAoYSAhPSBiKSBlbGVtZW50LXdpc2UuIFN1cHBvcnRzIGJyb2FkY2FzdGluZy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzXSk7XG4gKiBjb25zdCBiID0gdGYudGVuc29yMWQoWzAsIDIsIDNdKTtcbiAqXG4gKiBhLm5vdEVxdWFsKGIpLnByaW50KCk7XG4gKiBgYGBcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCBpbnB1dCB0ZW5zb3IuXG4gKiBAcGFyYW0gYiBUaGUgc2Vjb25kIGlucHV0IHRlbnNvci4gTXVzdCBoYXZlIHRoZSBzYW1lIGR0eXBlIGFzIGBhYC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdMb2dpY2FsJ31cbiAqL1xuZnVuY3Rpb24gbm90RXF1YWxfKGEsIGIpIHtcbiAgICBsZXQgJGEgPSBjb252ZXJ0VG9UZW5zb3IoYSwgJ2EnLCAnbm90RXF1YWwnLCAnc3RyaW5nX29yX251bWVyaWMnKTtcbiAgICBsZXQgJGIgPSBjb252ZXJ0VG9UZW5zb3IoYiwgJ2InLCAnbm90RXF1YWwnLCAnc3RyaW5nX29yX251bWVyaWMnKTtcbiAgICBbJGEsICRiXSA9IG1ha2VUeXBlc01hdGNoKCRhLCAkYik7XG4gICAgYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoJGEuc2hhcGUsICRiLnNoYXBlKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IGE6ICRhLCBiOiAkYiB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKE5vdEVxdWFsLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IG5vdEVxdWFsID0gb3AoeyBub3RFcXVhbF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ub3RfZXF1YWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IE9uZUhvdCB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENyZWF0ZXMgYSBvbmUtaG90IGB0Zi5UZW5zb3JgLiBUaGUgbG9jYXRpb25zIHJlcHJlc2VudGVkIGJ5IGBpbmRpY2VzYCB0YWtlXG4gKiB2YWx1ZSBgb25WYWx1ZWAgKGRlZmF1bHRzIHRvIDEpLCB3aGlsZSBhbGwgb3RoZXIgbG9jYXRpb25zIHRha2UgdmFsdWVcbiAqIGBvZmZWYWx1ZWAgKGRlZmF1bHRzIHRvIDApLiBJZiBgaW5kaWNlc2AgaXMgcmFuayBgUmAsIHRoZSBvdXRwdXQgaGFzIHJhbmtcbiAqIGBSKzFgIHdpdGggdGhlIGxhc3QgYXhpcyBvZiBzaXplIGBkZXB0aGAuXG4gKlxuICogYGBganNcbiAqIHRmLm9uZUhvdCh0Zi50ZW5zb3IxZChbMCwgMV0sICdpbnQzMicpLCAzKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGluZGljZXMgYHRmLlRlbnNvcmAgb2YgaW5kaWNlcyB3aXRoIGR0eXBlIGBpbnQzMmAuXG4gKiBAcGFyYW0gZGVwdGggVGhlIGRlcHRoIG9mIHRoZSBvbmUgaG90IGRpbWVuc2lvbi5cbiAqIEBwYXJhbSBvblZhbHVlIEEgbnVtYmVyIHVzZWQgdG8gZmlsbCBpbiB0aGUgb3V0cHV0IHdoZW4gdGhlIGluZGV4IG1hdGNoZXNcbiAqIHRoZSBsb2NhdGlvbi5cbiAqIEBwYXJhbSBvZmZWYWx1ZSBBIG51bWJlciB1c2VkIHRvIGZpbGwgaW4gdGhlIG91dHB1dCB3aGVuIHRoZSBpbmRleCBkb2VzXG4gKiAgICAgbm90IG1hdGNoIHRoZSBsb2NhdGlvbi5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDcmVhdGlvbid9XG4gKi9cbmZ1bmN0aW9uIG9uZUhvdF8oaW5kaWNlcywgZGVwdGgsIG9uVmFsdWUgPSAxLCBvZmZWYWx1ZSA9IDApIHtcbiAgICBpZiAoZGVwdGggPCAyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgaW4gb25lSG90OiBkZXB0aCBtdXN0IGJlID49MiwgYnV0IGl0IGlzICR7ZGVwdGh9YCk7XG4gICAgfVxuICAgIGNvbnN0ICRpbmRpY2VzID0gY29udmVydFRvVGVuc29yKGluZGljZXMsICdpbmRpY2VzJywgJ29uZUhvdCcsICdpbnQzMicpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgaW5kaWNlczogJGluZGljZXMgfTtcbiAgICBjb25zdCBhdHRycyA9IHsgZGVwdGgsIG9uVmFsdWUsIG9mZlZhbHVlIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoT25lSG90LCBpbnB1dHMsIGF0dHJzKTtcbn1cbmV4cG9ydCBjb25zdCBvbmVIb3QgPSBvcCh7IG9uZUhvdF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1vbmVfaG90LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBtYWtlT25lc1R5cGVkQXJyYXksIHNpemVGcm9tU2hhcGUgfSBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IGNvbXBsZXggfSBmcm9tICcuL2NvbXBsZXgnO1xuaW1wb3J0IHsgemVyb3MgfSBmcm9tICcuL3plcm9zJztcbi8qKlxuICogQ3JlYXRlcyBhIGB0Zi5UZW5zb3JgIHdpdGggYWxsIGVsZW1lbnRzIHNldCB0byAxLlxuICpcbiAqIGBgYGpzXG4gKiB0Zi5vbmVzKFsyLCAyXSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBzaGFwZSBBbiBhcnJheSBvZiBpbnRlZ2VycyBkZWZpbmluZyB0aGUgb3V0cHV0IHRlbnNvciBzaGFwZS5cbiAqIEBwYXJhbSBkdHlwZSBUaGUgdHlwZSBvZiBhbiBlbGVtZW50IGluIHRoZSByZXN1bHRpbmcgdGVuc29yLiBEZWZhdWx0cyB0b1xuICogICAgICdmbG9hdCcuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ3JlYXRpb24nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gb25lcyhzaGFwZSwgZHR5cGUgPSAnZmxvYXQzMicpIHtcbiAgICBpZiAoZHR5cGUgPT09ICdjb21wbGV4NjQnKSB7XG4gICAgICAgIGNvbnN0IHJlYWwgPSBvbmVzKHNoYXBlLCAnZmxvYXQzMicpO1xuICAgICAgICBjb25zdCBpbWFnID0gemVyb3Moc2hhcGUsICdmbG9hdDMyJyk7XG4gICAgICAgIHJldHVybiBjb21wbGV4KHJlYWwsIGltYWcpO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZXMgPSBtYWtlT25lc1R5cGVkQXJyYXkoc2l6ZUZyb21TaGFwZShzaGFwZSksIGR0eXBlKTtcbiAgICByZXR1cm4gRU5HSU5FLm1ha2VUZW5zb3IodmFsdWVzLCBzaGFwZSwgZHR5cGUpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9b25lcy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgT25lc0xpa2UgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDcmVhdGVzIGEgYHRmLlRlbnNvcmAgd2l0aCBhbGwgZWxlbWVudHMgc2V0IHRvIDEgd2l0aCB0aGUgc2FtZSBzaGFwZSBhcyB0aGVcbiAqIGdpdmVuIHRlbnNvci5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcihbMSwgMl0pO1xuICogdGYub25lc0xpa2UoeCkucHJpbnQoKTtcbiAqIGBgYFxuICogQHBhcmFtIHggQSB0ZW5zb3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ3JlYXRpb24nfVxuICovXG5mdW5jdGlvbiBvbmVzTGlrZV8oeCkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ29uZXNMaWtlJyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKE9uZXNMaWtlLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IG9uZXNMaWtlID0gb3AoeyBvbmVzTGlrZV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1vbmVzX2xpa2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IGlzUHJvbWlzZSB9IGZyb20gJy4uL3V0aWwnO1xuZXhwb3J0IGNvbnN0IE9QX1NDT1BFX1NVRkZJWCA9ICdfX29wJztcbi8qKlxuICogVXNlZCBmb3Igd3JhcHBpbmcgZnVuY3Rpb25zIHRoYXQgcGVyZm9ybSBtYXRoIG9wZXJhdGlvbnMgb25cbiAqIFRlbnNvcnMuIFRoZSBmdW5jdGlvbiB3aWxsIGJlIHdyYXBwZWQgaW4gYSBuYW1lZCBzY29wZSB0aGF0IGNsZWFucyBhbGxcbiAqIG1lbW9yeSB1c2FnZSBhZnRlciB0aGUgZnVuY3Rpb24gaXMgZG9uZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9wKGYpIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZik7XG4gICAgaWYgKGtleXMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUGxlYXNlIHByb3ZpZGUgYW4gb2JqZWN0IHdpdGggYSBzaW5nbGUga2V5IGAgK1xuICAgICAgICAgICAgYChvcGVyYXRpb24gbmFtZSkgbWFwcGluZyB0byBhIGZ1bmN0aW9uLiBHb3QgYW4gb2JqZWN0IHdpdGggYCArXG4gICAgICAgICAgICBgJHtrZXlzLmxlbmd0aH0ga2V5cy5gKTtcbiAgICB9XG4gICAgbGV0IG9wTmFtZSA9IGtleXNbMF07XG4gICAgY29uc3QgZm4gPSBmW29wTmFtZV07XG4gICAgLy8gU3RyaXAgdGhlIHVuZGVyc2NvcmUgZnJvbSB0aGUgZW5kIG9mIHRoZSBmdW5jdGlvbiBuYW1lLlxuICAgIGlmIChvcE5hbWUuZW5kc1dpdGgoJ18nKSkge1xuICAgICAgICBvcE5hbWUgPSBvcE5hbWUuc3Vic3RyaW5nKDAsIG9wTmFtZS5sZW5ndGggLSAxKTtcbiAgICB9XG4gICAgLy8gYWRkIGFuIF9fb3Agc3VmZml4IHRvIGRpc3Rpbmd1aXNoIG9wcyBmcm9tIGtlcm5lbHMgaW4gdGYucHJvZmlsZVxuICAgIG9wTmFtZSA9IG9wTmFtZSArIE9QX1NDT1BFX1NVRkZJWDtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gICAgY29uc3QgZjIgPSAoLi4uYXJncykgPT4ge1xuICAgICAgICBFTkdJTkUuc3RhcnRTY29wZShvcE5hbWUpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZm4oLi4uYXJncyk7XG4gICAgICAgICAgICBpZiAoaXNQcm9taXNlKHJlc3VsdCkpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdDYW5ub3QgcmV0dXJuIGEgUHJvbWlzZSBpbnNpZGUgb2YgdGlkeS4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEVOR0lORS5lbmRTY29wZShyZXN1bHQpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXgpIHtcbiAgICAgICAgICAgIEVOR0lORS5lbmRTY29wZShudWxsKTtcbiAgICAgICAgICAgIHRocm93IGV4O1xuICAgICAgICB9XG4gICAgfTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZjIsICduYW1lJywgeyB2YWx1ZTogb3BOYW1lLCBjb25maWd1cmFibGU6IHRydWUgfSk7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICAgIHJldHVybiBmMjtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW9wZXJhdGlvbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG4vLyBNb2R1bGFyaXplZCBvcHMuXG5leHBvcnQgeyBhYnMgfSBmcm9tICcuL2Ficyc7XG5leHBvcnQgeyBhY29zIH0gZnJvbSAnLi9hY29zJztcbmV4cG9ydCB7IGFjb3NoIH0gZnJvbSAnLi9hY29zaCc7XG5leHBvcnQgeyBhZGQgfSBmcm9tICcuL2FkZCc7XG5leHBvcnQgeyBhZGROIH0gZnJvbSAnLi9hZGRfbic7XG5leHBvcnQgeyBhbGwgfSBmcm9tICcuL2FsbCc7XG5leHBvcnQgeyBhbnkgfSBmcm9tICcuL2FueSc7XG5leHBvcnQgeyBhcmdNYXggfSBmcm9tICcuL2FyZ19tYXgnO1xuZXhwb3J0IHsgYXJnTWluIH0gZnJvbSAnLi9hcmdfbWluJztcbmV4cG9ydCB7IGFzaW4gfSBmcm9tICcuL2FzaW4nO1xuZXhwb3J0IHsgYXNpbmggfSBmcm9tICcuL2FzaW5oJztcbmV4cG9ydCB7IGF0YW4gfSBmcm9tICcuL2F0YW4nO1xuZXhwb3J0IHsgYXRhbjIgfSBmcm9tICcuL2F0YW4yJztcbmV4cG9ydCB7IGF0YW5oIH0gZnJvbSAnLi9hdGFuaCc7XG5leHBvcnQgeyBhdmdQb29sIH0gZnJvbSAnLi9hdmdfcG9vbCc7XG5leHBvcnQgeyBhdmdQb29sM2QgfSBmcm9tICcuL2F2Z19wb29sXzNkJztcbmV4cG9ydCB7IGJhc2ljTFNUTUNlbGwgfSBmcm9tICcuL2Jhc2ljX2xzdG1fY2VsbCc7XG5leHBvcnQgeyBiYXRjaFRvU3BhY2VORCB9IGZyb20gJy4vYmF0Y2hfdG9fc3BhY2VfbmQnO1xuZXhwb3J0IHsgYmF0Y2hOb3JtIH0gZnJvbSAnLi9iYXRjaG5vcm0nO1xuZXhwb3J0IHsgYmF0Y2hOb3JtMmQgfSBmcm9tICcuL2JhdGNobm9ybTJkJztcbmV4cG9ydCB7IGJhdGNoTm9ybTNkIH0gZnJvbSAnLi9iYXRjaG5vcm0zZCc7XG5leHBvcnQgeyBiYXRjaE5vcm00ZCB9IGZyb20gJy4vYmF0Y2hub3JtNGQnO1xuZXhwb3J0IHsgYmluY291bnQgfSBmcm9tICcuL2JpbmNvdW50JztcbmV4cG9ydCB7IGJyb2FkY2FzdFRvIH0gZnJvbSAnLi9icm9hZGNhc3RfdG8nO1xuZXhwb3J0IHsgYnVmZmVyIH0gZnJvbSAnLi9idWZmZXInO1xuZXhwb3J0IHsgY2FzdCB9IGZyb20gJy4vY2FzdCc7XG5leHBvcnQgeyBjZWlsIH0gZnJvbSAnLi9jZWlsJztcbmV4cG9ydCB7IGNsaXBCeVZhbHVlIH0gZnJvbSAnLi9jbGlwX2J5X3ZhbHVlJztcbmV4cG9ydCB7IGNsb25lIH0gZnJvbSAnLi9jbG9uZSc7XG5leHBvcnQgeyBjb21wbGV4IH0gZnJvbSAnLi9jb21wbGV4JztcbmV4cG9ydCB7IGNvbmNhdCB9IGZyb20gJy4vY29uY2F0JztcbmV4cG9ydCB7IGNvbmNhdDFkIH0gZnJvbSAnLi9jb25jYXRfMWQnO1xuZXhwb3J0IHsgY29uY2F0MmQgfSBmcm9tICcuL2NvbmNhdF8yZCc7XG5leHBvcnQgeyBjb25jYXQzZCB9IGZyb20gJy4vY29uY2F0XzNkJztcbmV4cG9ydCB7IGNvbmNhdDRkIH0gZnJvbSAnLi9jb25jYXRfNGQnO1xuZXhwb3J0IHsgY29udjFkIH0gZnJvbSAnLi9jb252MWQnO1xuZXhwb3J0IHsgY29udjJkIH0gZnJvbSAnLi9jb252MmQnO1xuZXhwb3J0IHsgY29udjJkVHJhbnNwb3NlIH0gZnJvbSAnLi9jb252MmRfdHJhbnNwb3NlJztcbmV4cG9ydCB7IGNvbnYzZCB9IGZyb20gJy4vY29udjNkJztcbmV4cG9ydCB7IGNvbnYzZFRyYW5zcG9zZSB9IGZyb20gJy4vY29udjNkX3RyYW5zcG9zZSc7XG5leHBvcnQgeyBjb3MgfSBmcm9tICcuL2Nvcyc7XG5leHBvcnQgeyBjb3NoIH0gZnJvbSAnLi9jb3NoJztcbmV4cG9ydCB7IGN1bXN1bSB9IGZyb20gJy4vY3Vtc3VtJztcbmV4cG9ydCB7IGRlbnNlQmluY291bnQgfSBmcm9tICcuL2RlbnNlX2JpbmNvdW50JztcbmV4cG9ydCB7IGRlcHRoVG9TcGFjZSB9IGZyb20gJy4vZGVwdGhfdG9fc3BhY2UnO1xuZXhwb3J0IHsgZGVwdGh3aXNlQ29udjJkIH0gZnJvbSAnLi9kZXB0aHdpc2VfY29udjJkJztcbmV4cG9ydCB7IGRpYWcgfSBmcm9tICcuL2RpYWcnO1xuZXhwb3J0IHsgZGlsYXRpb24yZCB9IGZyb20gJy4vZGlsYXRpb24yZCc7XG5leHBvcnQgeyBkaXYgfSBmcm9tICcuL2Rpdic7XG5leHBvcnQgeyBkaXZOb05hbiB9IGZyb20gJy4vZGl2X25vX25hbic7XG5leHBvcnQgeyBkb3QgfSBmcm9tICcuL2RvdCc7XG5leHBvcnQgeyBlaW5zdW0gfSBmcm9tICcuL2VpbnN1bSc7XG5leHBvcnQgeyBlbHUgfSBmcm9tICcuL2VsdSc7XG5leHBvcnQgeyBlcXVhbCB9IGZyb20gJy4vZXF1YWwnO1xuZXhwb3J0IHsgZXJmIH0gZnJvbSAnLi9lcmYnO1xuZXhwb3J0IHsgZXhwIH0gZnJvbSAnLi9leHAnO1xuZXhwb3J0IHsgZXhwYW5kRGltcyB9IGZyb20gJy4vZXhwYW5kX2RpbXMnO1xuZXhwb3J0IHsgZXhwbTEgfSBmcm9tICcuL2V4cG0xJztcbmV4cG9ydCB7IGV5ZSB9IGZyb20gJy4vZXllJztcbmV4cG9ydCB7IGZpbGwgfSBmcm9tICcuL2ZpbGwnO1xuZXhwb3J0IHsgZmxvb3IgfSBmcm9tICcuL2Zsb29yJztcbmV4cG9ydCB7IGZsb29yRGl2IH0gZnJvbSAnLi9mbG9vckRpdic7XG5leHBvcnQgeyBnYXRoZXIgfSBmcm9tICcuL2dhdGhlcic7XG5leHBvcnQgeyBncmVhdGVyIH0gZnJvbSAnLi9ncmVhdGVyJztcbmV4cG9ydCB7IGdyZWF0ZXJFcXVhbCB9IGZyb20gJy4vZ3JlYXRlcl9lcXVhbCc7XG5leHBvcnQgeyBpbWFnIH0gZnJvbSAnLi9pbWFnJztcbmV4cG9ydCB7IGlzRmluaXRlIH0gZnJvbSAnLi9pc19maW5pdGUnO1xuZXhwb3J0IHsgaXNJbmYgfSBmcm9tICcuL2lzX2luZic7XG5leHBvcnQgeyBpc05hTiB9IGZyb20gJy4vaXNfbmFuJztcbmV4cG9ydCB7IGxlYWt5UmVsdSB9IGZyb20gJy4vbGVha3lfcmVsdSc7XG5leHBvcnQgeyBsZXNzIH0gZnJvbSAnLi9sZXNzJztcbmV4cG9ydCB7IGxlc3NFcXVhbCB9IGZyb20gJy4vbGVzc19lcXVhbCc7XG5leHBvcnQgeyBsaW5zcGFjZSB9IGZyb20gJy4vbGluc3BhY2UnO1xuZXhwb3J0IHsgbG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb24gfSBmcm9tICcuL2xvY2FsX3Jlc3BvbnNlX25vcm1hbGl6YXRpb24nO1xuZXhwb3J0IHsgbG9nIH0gZnJvbSAnLi9sb2cnO1xuZXhwb3J0IHsgbG9nMXAgfSBmcm9tICcuL2xvZzFwJztcbmV4cG9ydCB7IGxvZ1NpZ21vaWQgfSBmcm9tICcuL2xvZ19zaWdtb2lkJztcbmV4cG9ydCB7IGxvZ1NvZnRtYXggfSBmcm9tICcuL2xvZ19zb2Z0bWF4JztcbmV4cG9ydCB7IGxvZ1N1bUV4cCB9IGZyb20gJy4vbG9nX3N1bV9leHAnO1xuZXhwb3J0IHsgbG9naWNhbEFuZCB9IGZyb20gJy4vbG9naWNhbF9hbmQnO1xuZXhwb3J0IHsgbG9naWNhbE5vdCB9IGZyb20gJy4vbG9naWNhbF9ub3QnO1xuZXhwb3J0IHsgbG9naWNhbE9yIH0gZnJvbSAnLi9sb2dpY2FsX29yJztcbmV4cG9ydCB7IGxvZ2ljYWxYb3IgfSBmcm9tICcuL2xvZ2ljYWxfeG9yJztcbmV4cG9ydCB7IG1hdE11bCB9IGZyb20gJy4vbWF0X211bCc7XG5leHBvcnQgeyBtYXggfSBmcm9tICcuL21heCc7XG5leHBvcnQgeyBtYXhQb29sIH0gZnJvbSAnLi9tYXhfcG9vbCc7XG5leHBvcnQgeyBtYXhQb29sM2QgfSBmcm9tICcuL21heF9wb29sXzNkJztcbmV4cG9ydCB7IG1heFBvb2xXaXRoQXJnbWF4IH0gZnJvbSAnLi9tYXhfcG9vbF93aXRoX2FyZ21heCc7XG5leHBvcnQgeyBtYXhpbXVtIH0gZnJvbSAnLi9tYXhpbXVtJztcbmV4cG9ydCB7IG1lYW4gfSBmcm9tICcuL21lYW4nO1xuZXhwb3J0IHsgbWVzaGdyaWQgfSBmcm9tICcuL21lc2hncmlkJztcbmV4cG9ydCB7IG1pbiB9IGZyb20gJy4vbWluJztcbmV4cG9ydCB7IG1pbmltdW0gfSBmcm9tICcuL21pbmltdW0nO1xuZXhwb3J0IHsgbWlycm9yUGFkIH0gZnJvbSAnLi9taXJyb3JfcGFkJztcbmV4cG9ydCB7IG1vZCB9IGZyb20gJy4vbW9kJztcbmV4cG9ydCB7IG1vbWVudHMgfSBmcm9tICcuL21vbWVudHMnO1xuZXhwb3J0IHsgbXVsIH0gZnJvbSAnLi9tdWwnO1xuZXhwb3J0IHsgbXVsdGlSTk5DZWxsIH0gZnJvbSAnLi9tdWx0aV9ybm5fY2VsbCc7XG5leHBvcnQgeyBtdWx0aW5vbWlhbCB9IGZyb20gJy4vbXVsdGlub21pYWwnO1xuZXhwb3J0IHsgbmVnIH0gZnJvbSAnLi9uZWcnO1xuZXhwb3J0IHsgbm90RXF1YWwgfSBmcm9tICcuL25vdF9lcXVhbCc7XG5leHBvcnQgeyBvbmVIb3QgfSBmcm9tICcuL29uZV9ob3QnO1xuZXhwb3J0IHsgb25lcyB9IGZyb20gJy4vb25lcyc7XG5leHBvcnQgeyBvbmVzTGlrZSB9IGZyb20gJy4vb25lc19saWtlJztcbmV4cG9ydCB7IG91dGVyUHJvZHVjdCB9IGZyb20gJy4vb3V0ZXJfcHJvZHVjdCc7XG5leHBvcnQgeyBwYWQgfSBmcm9tICcuL3BhZCc7XG5leHBvcnQgeyBwYWQxZCB9IGZyb20gJy4vcGFkMWQnO1xuZXhwb3J0IHsgcGFkMmQgfSBmcm9tICcuL3BhZDJkJztcbmV4cG9ydCB7IHBhZDNkIH0gZnJvbSAnLi9wYWQzZCc7XG5leHBvcnQgeyBwYWQ0ZCB9IGZyb20gJy4vcGFkNGQnO1xuZXhwb3J0IHsgcG9vbCB9IGZyb20gJy4vcG9vbCc7XG5leHBvcnQgeyBwb3cgfSBmcm9tICcuL3Bvdyc7XG5leHBvcnQgeyBwcmVsdSB9IGZyb20gJy4vcHJlbHUnO1xuZXhwb3J0IHsgcHJpbnQgfSBmcm9tICcuL3ByaW50JztcbmV4cG9ydCB7IHByb2QgfSBmcm9tICcuL3Byb2QnO1xuZXhwb3J0IHsgcmFuZCB9IGZyb20gJy4vcmFuZCc7XG5leHBvcnQgeyByYW5kb21HYW1tYSB9IGZyb20gJy4vcmFuZG9tX2dhbW1hJztcbmV4cG9ydCB7IHJhbmRvbU5vcm1hbCB9IGZyb20gJy4vcmFuZG9tX25vcm1hbCc7XG5leHBvcnQgeyByYW5kb21Vbmlmb3JtIH0gZnJvbSAnLi9yYW5kb21fdW5pZm9ybSc7XG5leHBvcnQgeyByYW5nZSB9IGZyb20gJy4vcmFuZ2UnO1xuZXhwb3J0IHsgcmVhbCB9IGZyb20gJy4vcmVhbCc7XG5leHBvcnQgeyByZWNpcHJvY2FsIH0gZnJvbSAnLi9yZWNpcHJvY2FsJztcbmV4cG9ydCB7IHJlbHUgfSBmcm9tICcuL3JlbHUnO1xuZXhwb3J0IHsgcmVsdTYgfSBmcm9tICcuL3JlbHU2JztcbmV4cG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuL3Jlc2hhcGUnO1xuZXhwb3J0IHsgcmV2ZXJzZSB9IGZyb20gJy4vcmV2ZXJzZSc7XG5leHBvcnQgeyByZXZlcnNlMWQgfSBmcm9tICcuL3JldmVyc2VfMWQnO1xuZXhwb3J0IHsgcmV2ZXJzZTJkIH0gZnJvbSAnLi9yZXZlcnNlXzJkJztcbmV4cG9ydCB7IHJldmVyc2UzZCB9IGZyb20gJy4vcmV2ZXJzZV8zZCc7XG5leHBvcnQgeyByZXZlcnNlNGQgfSBmcm9tICcuL3JldmVyc2VfNGQnO1xuZXhwb3J0IHsgcm91bmQgfSBmcm9tICcuL3JvdW5kJztcbmV4cG9ydCB7IHJzcXJ0IH0gZnJvbSAnLi9yc3FydCc7XG5leHBvcnQgeyBzY2FsYXIgfSBmcm9tICcuL3NjYWxhcic7XG5leHBvcnQgeyBzZWx1IH0gZnJvbSAnLi9zZWx1JztcbmV4cG9ydCB7IHNlcGFyYWJsZUNvbnYyZCB9IGZyb20gJy4vc2VwYXJhYmxlX2NvbnYyZCc7XG5leHBvcnQgeyBzZXRkaWZmMWRBc3luYyB9IGZyb20gJy4vc2V0ZGlmZjFkX2FzeW5jJztcbmV4cG9ydCB7IHNpZ21vaWQgfSBmcm9tICcuL3NpZ21vaWQnO1xuZXhwb3J0IHsgc2lnbiB9IGZyb20gJy4vc2lnbic7XG5leHBvcnQgeyBzaW4gfSBmcm9tICcuL3Npbic7XG5leHBvcnQgeyBzaW5oIH0gZnJvbSAnLi9zaW5oJztcbmV4cG9ydCB7IHNsaWNlIH0gZnJvbSAnLi9zbGljZSc7XG5leHBvcnQgeyBzbGljZTFkIH0gZnJvbSAnLi9zbGljZTFkJztcbmV4cG9ydCB7IHNsaWNlMmQgfSBmcm9tICcuL3NsaWNlMmQnO1xuZXhwb3J0IHsgc2xpY2UzZCB9IGZyb20gJy4vc2xpY2UzZCc7XG5leHBvcnQgeyBzbGljZTRkIH0gZnJvbSAnLi9zbGljZTRkJztcbmV4cG9ydCB7IHNvZnRtYXggfSBmcm9tICcuL3NvZnRtYXgnO1xuZXhwb3J0IHsgc29mdHBsdXMgfSBmcm9tICcuL3NvZnRwbHVzJztcbmV4cG9ydCB7IHNwYWNlVG9CYXRjaE5EIH0gZnJvbSAnLi9zcGFjZV90b19iYXRjaF9uZCc7XG5leHBvcnQgeyBmZnQgfSBmcm9tICcuL3NwZWN0cmFsL2ZmdCc7XG5leHBvcnQgeyBpZmZ0IH0gZnJvbSAnLi9zcGVjdHJhbC9pZmZ0JztcbmV4cG9ydCB7IGlyZmZ0IH0gZnJvbSAnLi9zcGVjdHJhbC9pcmZmdCc7XG5leHBvcnQgeyByZmZ0IH0gZnJvbSAnLi9zcGVjdHJhbC9yZmZ0JztcbmV4cG9ydCB7IHNwbGl0IH0gZnJvbSAnLi9zcGxpdCc7XG5leHBvcnQgeyBzcXJ0IH0gZnJvbSAnLi9zcXJ0JztcbmV4cG9ydCB7IHNxdWFyZSB9IGZyb20gJy4vc3F1YXJlJztcbmV4cG9ydCB7IHNxdWFyZWREaWZmZXJlbmNlIH0gZnJvbSAnLi9zcXVhcmVkX2RpZmZlcmVuY2UnO1xuZXhwb3J0IHsgc3F1ZWV6ZSB9IGZyb20gJy4vc3F1ZWV6ZSc7XG5leHBvcnQgeyBzdGFjayB9IGZyb20gJy4vc3RhY2snO1xuZXhwb3J0IHsgc3RlcCB9IGZyb20gJy4vc3RlcCc7XG5leHBvcnQgeyBzdHJpZGVkU2xpY2UgfSBmcm9tICcuL3N0cmlkZWRfc2xpY2UnO1xuZXhwb3J0IHsgc3ViIH0gZnJvbSAnLi9zdWInO1xuZXhwb3J0IHsgc3VtIH0gZnJvbSAnLi9zdW0nO1xuZXhwb3J0IHsgdGFuIH0gZnJvbSAnLi90YW4nO1xuZXhwb3J0IHsgdGFuaCB9IGZyb20gJy4vdGFuaCc7XG5leHBvcnQgeyB0ZW5zb3IgfSBmcm9tICcuL3RlbnNvcic7XG5leHBvcnQgeyB0ZW5zb3IxZCB9IGZyb20gJy4vdGVuc29yMWQnO1xuZXhwb3J0IHsgdGVuc29yMmQgfSBmcm9tICcuL3RlbnNvcjJkJztcbmV4cG9ydCB7IHRlbnNvcjNkIH0gZnJvbSAnLi90ZW5zb3IzZCc7XG5leHBvcnQgeyB0ZW5zb3I0ZCB9IGZyb20gJy4vdGVuc29yNGQnO1xuZXhwb3J0IHsgdGVuc29yNWQgfSBmcm9tICcuL3RlbnNvcjVkJztcbmV4cG9ydCB7IHRlbnNvcjZkIH0gZnJvbSAnLi90ZW5zb3I2ZCc7XG5leHBvcnQgeyB0aWxlIH0gZnJvbSAnLi90aWxlJztcbmV4cG9ydCB7IHRvcGsgfSBmcm9tICcuL3RvcGsnO1xuZXhwb3J0IHsgdHJ1bmNhdGVkTm9ybWFsIH0gZnJvbSAnLi90cnVuY2F0ZWRfbm9ybWFsJztcbmV4cG9ydCB7IHVuaXF1ZSB9IGZyb20gJy4vdW5pcXVlJztcbmV4cG9ydCB7IHVuc29ydGVkU2VnbWVudFN1bSB9IGZyb20gJy4vdW5zb3J0ZWRfc2VnbWVudF9zdW0nO1xuZXhwb3J0IHsgdW5zdGFjayB9IGZyb20gJy4vdW5zdGFjayc7XG5leHBvcnQgeyB2YXJpYWJsZSB9IGZyb20gJy4vdmFyaWFibGUnO1xuZXhwb3J0IHsgd2hlcmUgfSBmcm9tICcuL3doZXJlJztcbmV4cG9ydCB7IHdoZXJlQXN5bmMgfSBmcm9tICcuL3doZXJlX2FzeW5jJztcbmV4cG9ydCB7IHplcm9zIH0gZnJvbSAnLi96ZXJvcyc7XG5leHBvcnQgeyB6ZXJvc0xpa2UgfSBmcm9tICcuL3plcm9zX2xpa2UnO1xuZXhwb3J0ICogZnJvbSAnLi9ib29sZWFuX21hc2snO1xuZXhwb3J0ICogZnJvbSAnLi90cmFuc3Bvc2UnO1xuZXhwb3J0ICogZnJvbSAnLi9ub3JtJztcbmV4cG9ydCAqIGZyb20gJy4vbW92aW5nX2F2ZXJhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9zY2F0dGVyX25kJztcbmV4cG9ydCAqIGZyb20gJy4vc3BhcnNlX3RvX2RlbnNlJztcbmV4cG9ydCAqIGZyb20gJy4vZ2F0aGVyX25kJztcbmV4cG9ydCAqIGZyb20gJy4vZHJvcG91dCc7XG5leHBvcnQgKiBmcm9tICcuL3NpZ25hbF9vcHNfdXRpbCc7XG5leHBvcnQgKiBmcm9tICcuL2luX3RvcF9rJztcbmV4cG9ydCB7IG9wLCBPUF9TQ09QRV9TVUZGSVggfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyByZmZ0IH0gZnJvbSAnLi9zcGVjdHJhbC9yZmZ0JztcbmltcG9ydCB7IGZmdCB9IGZyb20gJy4vc3BlY3RyYWwvZmZ0JztcbmltcG9ydCB7IGlmZnQgfSBmcm9tICcuL3NwZWN0cmFsL2lmZnQnO1xuaW1wb3J0IHsgaXJmZnQgfSBmcm9tICcuL3NwZWN0cmFsL2lyZmZ0JztcbmNvbnN0IHNwZWN0cmFsID0ge1xuICAgIGZmdCxcbiAgICBpZmZ0LFxuICAgIHJmZnQsXG4gICAgaXJmZnRcbn07XG5pbXBvcnQgKiBhcyBmdXNlZCBmcm9tICcuL2Z1c2VkX29wcyc7XG5pbXBvcnQgeyBoYW1taW5nV2luZG93IH0gZnJvbSAnLi9zaWduYWwvaGFtbWluZ193aW5kb3cnO1xuaW1wb3J0IHsgaGFubldpbmRvdyB9IGZyb20gJy4vc2lnbmFsL2hhbm5fd2luZG93JztcbmltcG9ydCB7IGZyYW1lIH0gZnJvbSAnLi9zaWduYWwvZnJhbWUnO1xuaW1wb3J0IHsgc3RmdCB9IGZyb20gJy4vc2lnbmFsL3N0ZnQnO1xuY29uc3Qgc2lnbmFsID0ge1xuICAgIGhhbW1pbmdXaW5kb3csXG4gICAgaGFubldpbmRvdyxcbiAgICBmcmFtZSxcbiAgICBzdGZ0LFxufTtcbi8vIEltYWdlIE9wcyBuYW1lc3BhY2VcbmltcG9ydCB7IGNyb3BBbmRSZXNpemUgfSBmcm9tICcuL2ltYWdlL2Nyb3BfYW5kX3Jlc2l6ZSc7XG5pbXBvcnQgeyBmbGlwTGVmdFJpZ2h0IH0gZnJvbSAnLi9pbWFnZS9mbGlwX2xlZnRfcmlnaHQnO1xuaW1wb3J0IHsgcm90YXRlV2l0aE9mZnNldCB9IGZyb20gJy4vaW1hZ2Uvcm90YXRlX3dpdGhfb2Zmc2V0JztcbmltcG9ydCB7IG5vbk1heFN1cHByZXNzaW9uIH0gZnJvbSAnLi9pbWFnZS9ub25fbWF4X3N1cHByZXNzaW9uJztcbmltcG9ydCB7IG5vbk1heFN1cHByZXNzaW9uQXN5bmMgfSBmcm9tICcuL2ltYWdlL25vbl9tYXhfc3VwcHJlc3Npb25fYXN5bmMnO1xuaW1wb3J0IHsgbm9uTWF4U3VwcHJlc3Npb25XaXRoU2NvcmUgfSBmcm9tICcuL2ltYWdlL25vbl9tYXhfc3VwcHJlc3Npb25fd2l0aF9zY29yZSc7XG5pbXBvcnQgeyBub25NYXhTdXBwcmVzc2lvbldpdGhTY29yZUFzeW5jIH0gZnJvbSAnLi9pbWFnZS9ub25fbWF4X3N1cHByZXNzaW9uX3dpdGhfc2NvcmVfYXN5bmMnO1xuaW1wb3J0IHsgbm9uTWF4U3VwcHJlc3Npb25QYWRkZWQgfSBmcm9tICcuL2ltYWdlL25vbl9tYXhfc3VwcHJlc3Npb25fcGFkZGVkJztcbmltcG9ydCB7IG5vbk1heFN1cHByZXNzaW9uUGFkZGVkQXN5bmMgfSBmcm9tICcuL2ltYWdlL25vbl9tYXhfc3VwcHJlc3Npb25fcGFkZGVkX2FzeW5jJztcbmltcG9ydCB7IHJlc2l6ZUJpbGluZWFyIH0gZnJvbSAnLi9pbWFnZS9yZXNpemVfYmlsaW5lYXInO1xuaW1wb3J0IHsgcmVzaXplTmVhcmVzdE5laWdoYm9yIH0gZnJvbSAnLi9pbWFnZS9yZXNpemVfbmVhcmVzdF9uZWlnaGJvcic7XG5pbXBvcnQgeyB0aHJlc2hvbGQgfSBmcm9tICcuL2ltYWdlL3RocmVzaG9sZCc7XG5pbXBvcnQgeyB0cmFuc2Zvcm0gfSBmcm9tICcuL2ltYWdlL3RyYW5zZm9ybSc7XG5jb25zdCBpbWFnZSA9IHtcbiAgICBmbGlwTGVmdFJpZ2h0LFxuICAgIHJlc2l6ZU5lYXJlc3ROZWlnaGJvcixcbiAgICByZXNpemVCaWxpbmVhcixcbiAgICByb3RhdGVXaXRoT2Zmc2V0LFxuICAgIGNyb3BBbmRSZXNpemUsXG4gICAgbm9uTWF4U3VwcHJlc3Npb24sXG4gICAgbm9uTWF4U3VwcHJlc3Npb25Bc3luYyxcbiAgICBub25NYXhTdXBwcmVzc2lvbldpdGhTY29yZSxcbiAgICBub25NYXhTdXBwcmVzc2lvbldpdGhTY29yZUFzeW5jLFxuICAgIG5vbk1heFN1cHByZXNzaW9uUGFkZGVkLFxuICAgIG5vbk1heFN1cHByZXNzaW9uUGFkZGVkQXN5bmMsXG4gICAgdGhyZXNob2xkLFxuICAgIHRyYW5zZm9ybVxufTtcbi8vIGxpbmFsZyBuYW1lc3BhY2VcbmltcG9ydCB7IGJhbmRQYXJ0IH0gZnJvbSAnLi9saW5hbGcvYmFuZF9wYXJ0JztcbmltcG9ydCB7IGdyYW1TY2htaWR0IH0gZnJvbSAnLi9saW5hbGcvZ3JhbV9zY2htaWR0JztcbmltcG9ydCB7IHFyIH0gZnJvbSAnLi9saW5hbGcvcXInO1xuY29uc3QgbGluYWxnID0ge1xuICAgIGJhbmRQYXJ0LFxuICAgIGdyYW1TY2htaWR0LFxuICAgIHFyXG59O1xuLy8gbG9zc2VzIG5hbWVzcGFjZTtcbmltcG9ydCB7IGFic29sdXRlRGlmZmVyZW5jZSB9IGZyb20gJy4vbG9zc2VzL2Fic29sdXRlX2RpZmZlcmVuY2UnO1xuaW1wb3J0IHsgY29tcHV0ZVdlaWdodGVkTG9zcyB9IGZyb20gJy4vbG9zc2VzL2NvbXB1dGVfd2VpZ2h0ZWRfbG9zcyc7XG5pbXBvcnQgeyBjb3NpbmVEaXN0YW5jZSB9IGZyb20gJy4vbG9zc2VzL2Nvc2luZV9kaXN0YW5jZSc7XG5pbXBvcnQgeyBoaW5nZUxvc3MgfSBmcm9tICcuL2xvc3Nlcy9oaW5nZV9sb3NzJztcbmltcG9ydCB7IGh1YmVyTG9zcyB9IGZyb20gJy4vbG9zc2VzL2h1YmVyX2xvc3MnO1xuaW1wb3J0IHsgbG9nTG9zcyB9IGZyb20gJy4vbG9zc2VzL2xvZ19sb3NzJztcbmltcG9ydCB7IG1lYW5TcXVhcmVkRXJyb3IgfSBmcm9tICcuL2xvc3Nlcy9tZWFuX3NxdWFyZWRfZXJyb3InO1xuaW1wb3J0IHsgc2lnbW9pZENyb3NzRW50cm9weSB9IGZyb20gJy4vbG9zc2VzL3NpZ21vaWRfY3Jvc3NfZW50cm9weSc7XG5pbXBvcnQgeyBzb2Z0bWF4Q3Jvc3NFbnRyb3B5IH0gZnJvbSAnLi9sb3NzZXMvc29mdG1heF9jcm9zc19lbnRyb3B5JztcbmNvbnN0IGxvc3NlcyA9IHtcbiAgICBhYnNvbHV0ZURpZmZlcmVuY2UsXG4gICAgY29tcHV0ZVdlaWdodGVkTG9zcyxcbiAgICBjb3NpbmVEaXN0YW5jZSxcbiAgICBoaW5nZUxvc3MsXG4gICAgaHViZXJMb3NzLFxuICAgIGxvZ0xvc3MsXG4gICAgbWVhblNxdWFyZWRFcnJvcixcbiAgICBzaWdtb2lkQ3Jvc3NFbnRyb3B5LFxuICAgIHNvZnRtYXhDcm9zc0VudHJvcHlcbn07XG5pbXBvcnQgeyBzcGFyc2VGaWxsRW1wdHlSb3dzIH0gZnJvbSAnLi9zcGFyc2Uvc3BhcnNlX2ZpbGxfZW1wdHlfcm93cyc7XG5pbXBvcnQgeyBzcGFyc2VSZXNoYXBlIH0gZnJvbSAnLi9zcGFyc2Uvc3BhcnNlX3Jlc2hhcGUnO1xuaW1wb3J0IHsgc3BhcnNlU2VnbWVudE1lYW4gfSBmcm9tICcuL3NwYXJzZS9zcGFyc2Vfc2VnbWVudF9tZWFuJztcbmltcG9ydCB7IHNwYXJzZVNlZ21lbnRTdW0gfSBmcm9tICcuL3NwYXJzZS9zcGFyc2Vfc2VnbWVudF9zdW0nO1xuY29uc3Qgc3BhcnNlID0ge1xuICAgIHNwYXJzZUZpbGxFbXB0eVJvd3MsXG4gICAgc3BhcnNlUmVzaGFwZSxcbiAgICBzcGFyc2VTZWdtZW50TWVhbixcbiAgICBzcGFyc2VTZWdtZW50U3VtXG59O1xuaW1wb3J0IHsgc3RyaW5nTkdyYW1zIH0gZnJvbSAnLi9zdHJpbmcvc3RyaW5nX25fZ3JhbXMnO1xuaW1wb3J0IHsgc3RyaW5nU3BsaXQgfSBmcm9tICcuL3N0cmluZy9zdHJpbmdfc3BsaXQnO1xuaW1wb3J0IHsgc3RyaW5nVG9IYXNoQnVja2V0RmFzdCB9IGZyb20gJy4vc3RyaW5nL3N0cmluZ190b19oYXNoX2J1Y2tldF9mYXN0Jztcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp2YXJpYWJsZS1uYW1lXG5jb25zdCBzdHJpbmcgPSB7XG4gICAgc3RyaW5nTkdyYW1zLFxuICAgIHN0cmluZ1NwbGl0LFxuICAgIHN0cmluZ1RvSGFzaEJ1Y2tldEZhc3Rcbn07XG4vLyBTZWNvbmQgbGV2ZWwgZXhwb3J0cy5cbmV4cG9ydCB7IGltYWdlLCBsaW5hbGcsIGxvc3Nlcywgc3BlY3RyYWwsIGZ1c2VkLCBzaWduYWwsIHNwYXJzZSwgc3RyaW5nIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1vcHMuanMubWFwIiwiaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBtYXRNdWwgfSBmcm9tICcuL21hdF9tdWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9yZXNoYXBlJztcbi8qKlxuICogQ29tcHV0ZXMgdGhlIG91dGVyIHByb2R1Y3Qgb2YgdHdvIHZlY3RvcnMsIGB2MWAgYW5kIGB2MmAuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgMiwgM10pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjFkKFszLCA0LCA1XSk7XG4gKlxuICogdGYub3V0ZXJQcm9kdWN0KGEsIGIpLnByaW50KCk7XG4gKiBgYGBcbiAqIEBwYXJhbSB2MSBUaGUgZmlyc3QgdmVjdG9yIGluIHRoZSBvdXRlciBwcm9kdWN0IG9wZXJhdGlvbi5cbiAqIEBwYXJhbSB2MiBUaGUgc2Vjb25kIHZlY3RvciBpbiB0aGUgb3V0ZXIgcHJvZHVjdCBvcGVyYXRpb24uXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnTWF0cmljZXMnfVxuICovXG5mdW5jdGlvbiBvdXRlclByb2R1Y3RfKHYxLCB2Mikge1xuICAgIGNvbnN0ICR2MSA9IGNvbnZlcnRUb1RlbnNvcih2MSwgJ3YxJywgJ291dGVyUHJvZHVjdCcpO1xuICAgIGNvbnN0ICR2MiA9IGNvbnZlcnRUb1RlbnNvcih2MiwgJ3YyJywgJ291dGVyUHJvZHVjdCcpO1xuICAgIHV0aWwuYXNzZXJ0KCR2MS5yYW5rID09PSAxICYmICR2Mi5yYW5rID09PSAxLCAoKSA9PiBgRXJyb3IgaW4gb3V0ZXJQcm9kdWN0OiBpbnB1dHMgbXVzdCBiZSByYW5rIDEsIGJ1dCBnb3QgcmFua3MgYCArXG4gICAgICAgIGAkeyR2MS5yYW5rfSBhbmQgJHskdjIucmFua30uYCk7XG4gICAgY29uc3QgdjEyRCA9IHJlc2hhcGUoJHYxLCBbLTEsIDFdKTtcbiAgICBjb25zdCB2MjJEID0gcmVzaGFwZSgkdjIsIFsxLCAtMV0pO1xuICAgIHJldHVybiBtYXRNdWwodjEyRCwgdjIyRCk7XG59XG5leHBvcnQgY29uc3Qgb3V0ZXJQcm9kdWN0ID0gb3AoeyBvdXRlclByb2R1Y3RfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9b3V0ZXJfcHJvZHVjdC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgUGFkVjIgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBQYWRzIGEgYHRmLlRlbnNvcmAgd2l0aCBhIGdpdmVuIHZhbHVlIGFuZCBwYWRkaW5ncy5cbiAqXG4gKiBUaGlzIG9wZXJhdGlvbiBpbXBsZW1lbnRzIGBDT05TVEFOVGAgbW9kZS4gRm9yIGBSRUZMRUNUYCBhbmQgYFNZTU1FVFJJQ2AsXG4gKiByZWZlciB0byBgdGYubWlycm9yUGFkYFxuICpcbiAqIEFsc28gYXZhaWxhYmxlIGFyZSBzdHJpY3RlciByYW5rLXNwZWNpZmljIG1ldGhvZHMgd2l0aCB0aGUgc2FtZSBzaWduYXR1cmVcbiAqIGFzIHRoaXMgbWV0aG9kIHRoYXQgYXNzZXJ0IHRoYXQgYHBhZGRpbmdzYCBpcyBvZiBnaXZlbiBsZW5ndGguXG4gKiAgIC0gYHRmLnBhZDFkYFxuICogICAtIGB0Zi5wYWQyZGBcbiAqICAgLSBgdGYucGFkM2RgXG4gKiAgIC0gYHRmLnBhZDRkYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIDMsIDRdKTtcbiAqIHgucGFkKFtbMSwgMl1dKS5wcmludCgpO1xuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgdGVuc29yIHRvIHBhZC5cbiAqIEBwYXJhbSBwYWRkaW5ncyBBbiBhcnJheSBvZiBsZW5ndGggYFJgICh0aGUgcmFuayBvZiB0aGUgdGVuc29yKSwgd2hlcmVcbiAqIGVhY2ggZWxlbWVudCBpcyBhIGxlbmd0aC0yIHR1cGxlIG9mIGludHMgYFtwYWRCZWZvcmUsIHBhZEFmdGVyXWAsXG4gKiBzcGVjaWZ5aW5nIGhvdyBtdWNoIHRvIHBhZCBhbG9uZyBlYWNoIGRpbWVuc2lvbiBvZiB0aGUgdGVuc29yLlxuICogQHBhcmFtIGNvbnN0YW50VmFsdWUgVGhlIHBhZCB2YWx1ZSB0byB1c2UuIERlZmF1bHRzIHRvIDAuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnVHJhbnNmb3JtYXRpb25zJ31cbiAqL1xuZnVuY3Rpb24gcGFkXyh4LCBwYWRkaW5ncywgY29uc3RhbnRWYWx1ZSA9IDApIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdwYWQnKTtcbiAgICBpZiAoJHgucmFuayA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3BhZChzY2FsYXIpIGlzIG5vdCBkZWZpbmVkLiBQYXNzIG5vbi1zY2FsYXIgdG8gcGFkJyk7XG4gICAgfVxuICAgIGNvbnN0IGF0dHJzID0geyBwYWRkaW5ncywgY29uc3RhbnRWYWx1ZSB9O1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChQYWRWMiwgaW5wdXRzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3QgcGFkID0gb3AoeyBwYWRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGFkLmpzLm1hcCIsImltcG9ydCB7IGFzc2VydCB9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyBwYWQgfSBmcm9tICcuL3BhZCc7XG4vKipcbiAqIFBhZHMgYSBgdGYuVGVuc29yMURgIHdpdGggYSBnaXZlbiB2YWx1ZSBhbmQgcGFkZGluZ3MuIFNlZSBgcGFkYCBmb3IgZGV0YWlscy5cbiAqL1xuZnVuY3Rpb24gcGFkMWRfKHgsIHBhZGRpbmdzLCBjb25zdGFudFZhbHVlID0gMCkge1xuICAgIGFzc2VydChwYWRkaW5ncy5sZW5ndGggPT09IDIsICgpID0+ICdJbnZhbGlkIG51bWJlciBvZiBwYWRkaW5ncy4gTXVzdCBiZSBsZW5ndGggb2YgMi4nKTtcbiAgICByZXR1cm4gcGFkKHgsIFtwYWRkaW5nc10sIGNvbnN0YW50VmFsdWUpO1xufVxuZXhwb3J0IGNvbnN0IHBhZDFkID0gb3AoeyBwYWQxZF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYWQxZC5qcy5tYXAiLCJpbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgcGFkIH0gZnJvbSAnLi9wYWQnO1xuLyoqXG4gKiBQYWRzIGEgYHRmLlRlbnNvcjJEYCB3aXRoIGEgZ2l2ZW4gdmFsdWUgYW5kIHBhZGRpbmdzLiBTZWUgYHBhZGAgZm9yIGRldGFpbHMuXG4gKi9cbmZ1bmN0aW9uIHBhZDJkXyh4LCBwYWRkaW5ncywgY29uc3RhbnRWYWx1ZSA9IDApIHtcbiAgICBhc3NlcnQocGFkZGluZ3MubGVuZ3RoID09PSAyICYmIHBhZGRpbmdzWzBdLmxlbmd0aCA9PT0gMiAmJlxuICAgICAgICBwYWRkaW5nc1sxXS5sZW5ndGggPT09IDIsICgpID0+ICdJbnZhbGlkIG51bWJlciBvZiBwYWRkaW5ncy4gTXVzdCBiZSBsZW5ndGggb2YgMiBlYWNoLicpO1xuICAgIHJldHVybiBwYWQoeCwgcGFkZGluZ3MsIGNvbnN0YW50VmFsdWUpO1xufVxuZXhwb3J0IGNvbnN0IHBhZDJkID0gb3AoeyBwYWQyZF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYWQyZC5qcy5tYXAiLCJpbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgcGFkIH0gZnJvbSAnLi9wYWQnO1xuLyoqXG4gKiBQYWRzIGEgYHRmLlRlbnNvcjNEYCB3aXRoIGEgZ2l2ZW4gdmFsdWUgYW5kIHBhZGRpbmdzLiBTZWUgYHBhZGAgZm9yIGRldGFpbHMuXG4gKi9cbmZ1bmN0aW9uIHBhZDNkXyh4LCBwYWRkaW5ncywgY29uc3RhbnRWYWx1ZSA9IDApIHtcbiAgICBhc3NlcnQocGFkZGluZ3MubGVuZ3RoID09PSAzICYmIHBhZGRpbmdzWzBdLmxlbmd0aCA9PT0gMiAmJlxuICAgICAgICBwYWRkaW5nc1sxXS5sZW5ndGggPT09IDIgJiYgcGFkZGluZ3NbMl0ubGVuZ3RoID09PSAyLCAoKSA9PiAnSW52YWxpZCBudW1iZXIgb2YgcGFkZGluZ3MuIE11c3QgYmUgbGVuZ3RoIG9mIDIgZWFjaC4nKTtcbiAgICByZXR1cm4gcGFkKHgsIHBhZGRpbmdzLCBjb25zdGFudFZhbHVlKTtcbn1cbmV4cG9ydCBjb25zdCBwYWQzZCA9IG9wKHsgcGFkM2RfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGFkM2QuanMubWFwIiwiaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHBhZCB9IGZyb20gJy4vcGFkJztcbi8qKlxuICogUGFkcyBhIGB0Zi5UZW5zb3I0RGAgd2l0aCBhIGdpdmVuIHZhbHVlIGFuZCBwYWRkaW5ncy4gU2VlIGBwYWRgIGZvciBkZXRhaWxzLlxuICovXG5mdW5jdGlvbiBwYWQ0ZF8oeCwgcGFkZGluZ3MsIGNvbnN0YW50VmFsdWUgPSAwKSB7XG4gICAgYXNzZXJ0KHBhZGRpbmdzLmxlbmd0aCA9PT0gNCAmJiBwYWRkaW5nc1swXS5sZW5ndGggPT09IDIgJiZcbiAgICAgICAgcGFkZGluZ3NbMV0ubGVuZ3RoID09PSAyICYmIHBhZGRpbmdzWzJdLmxlbmd0aCA9PT0gMiAmJlxuICAgICAgICBwYWRkaW5nc1szXS5sZW5ndGggPT09IDIsICgpID0+ICdJbnZhbGlkIG51bWJlciBvZiBwYWRkaW5ncy4gTXVzdCBiZSBsZW5ndGggb2YgMiBlYWNoLicpO1xuICAgIHJldHVybiBwYWQoeCwgcGFkZGluZ3MsIGNvbnN0YW50VmFsdWUpO1xufVxuZXhwb3J0IGNvbnN0IHBhZDRkID0gb3AoeyBwYWQ0ZF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYWQ0ZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IGF2Z1Bvb2wgfSBmcm9tICcuL2F2Z19wb29sJztcbmltcG9ydCB7IGJhdGNoVG9TcGFjZU5EIH0gZnJvbSAnLi9iYXRjaF90b19zcGFjZV9uZCc7XG5pbXBvcnQgKiBhcyBjb252X3V0aWwgZnJvbSAnLi9jb252X3V0aWwnO1xuaW1wb3J0IHsgbWF4UG9vbCB9IGZyb20gJy4vbWF4X3Bvb2wnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9yZXNoYXBlJztcbmltcG9ydCB7IHNwYWNlVG9CYXRjaE5EIH0gZnJvbSAnLi9zcGFjZV90b19iYXRjaF9uZCc7XG4vKipcbiAqIFBlcmZvcm1zIGFuIE4tRCBwb29saW5nIG9wZXJhdGlvblxuICpcbiAqIEBwYXJhbSBpbnB1dCBUaGUgaW5wdXQgdGVuc29yLCBvZiByYW5rIDQgb3IgcmFuayAzIG9mIHNoYXBlXG4gKiAgICAgYFtiYXRjaCwgaGVpZ2h0LCB3aWR0aCwgaW5DaGFubmVsc11gLiBJZiByYW5rIDMsIGJhdGNoIG9mIDEgaXMgYXNzdW1lZC5cbiAqIEBwYXJhbSB3aW5kb3dTaGFwZSBUaGUgZmlsdGVyIHNpemU6IGBbZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aF1gLiBJZlxuICogICAgIGBmaWx0ZXJTaXplYCBpcyBhIHNpbmdsZSBudW1iZXIsIHRoZW4gYGZpbHRlckhlaWdodCA9PSBmaWx0ZXJXaWR0aGAuXG4gKiBAcGFyYW0gcG9vbGluZ1R5cGUgVGhlIHR5cGUgb2YgcG9vbGluZywgZWl0aGVyICdtYXgnIG9yICdhdmcnLlxuICogQHBhcmFtIHBhZCBUaGUgdHlwZSBvZiBwYWRkaW5nIGFsZ29yaXRobTpcbiAqICAgIC0gYHNhbWVgIGFuZCBzdHJpZGUgMTogb3V0cHV0IHdpbGwgYmUgb2Ygc2FtZSBzaXplIGFzIGlucHV0LFxuICogICAgICAgcmVnYXJkbGVzcyBvZiBmaWx0ZXIgc2l6ZS5cbiAqICAgIC0gYHZhbGlkYDogb3V0cHV0IHdpbGwgYmUgc21hbGxlciB0aGFuIGlucHV0IGlmIGZpbHRlciBpcyBsYXJnZXJcbiAqICAgICAgIHRoYW4gMXgxLlxuICogICAgLSBGb3IgbW9yZSBpbmZvLCBzZWUgdGhpcyBndWlkZTpcbiAqICAgICBbaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2d1aWRlcy9weXRob24vbm4jQ29udm9sdXRpb25dKFxuICogICAgICAgICBodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZ3VpZGVzL3B5dGhvbi9ubiNDb252b2x1dGlvbilcbiAqIEBwYXJhbSBkaWxhdGlvbnMgVGhlIGRpbGF0aW9uIHJhdGVzOiBgW2RpbGF0aW9uSGVpZ2h0LCBkaWxhdGlvbldpZHRoXWBcbiAqICAgICBpbiB3aGljaCB3ZSBzYW1wbGUgaW5wdXQgdmFsdWVzIGFjcm9zcyB0aGUgaGVpZ2h0IGFuZCB3aWR0aCBkaW1lbnNpb25zXG4gKiAgICAgaW4gZGlsYXRlZCBwb29saW5nLiBEZWZhdWx0cyB0byBgWzEsIDFdYC4gSWYgYGRpbGF0aW9uUmF0ZWAgaXMgYSBzaW5nbGVcbiAqICAgICBudW1iZXIsIHRoZW4gYGRpbGF0aW9uSGVpZ2h0ID09IGRpbGF0aW9uV2lkdGhgLiBJZiBpdCBpcyBncmVhdGVyIHRoYW5cbiAqICAgICAxLCB0aGVuIGFsbCB2YWx1ZXMgb2YgYHN0cmlkZXNgIG11c3QgYmUgMS5cbiAqIEBwYXJhbSBzdHJpZGVzIFRoZSBzdHJpZGVzIG9mIHRoZSBwb29saW5nOiBgW3N0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGhdYC4gSWZcbiAqICAgICBgc3RyaWRlc2AgaXMgYSBzaW5nbGUgbnVtYmVyLCB0aGVuIGBzdHJpZGVIZWlnaHQgPT0gc3RyaWRlV2lkdGhgLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0NvbnZvbHV0aW9uJ31cbiAqL1xuZnVuY3Rpb24gcG9vbF8oaW5wdXQsIHdpbmRvd1NoYXBlLCBwb29saW5nVHlwZSwgcGFkLCBkaWxhdGlvbnMsIHN0cmlkZXMpIHtcbiAgICBpZiAoZGlsYXRpb25zID09IG51bGwpIHtcbiAgICAgICAgZGlsYXRpb25zID0gWzEsIDFdO1xuICAgIH1cbiAgICBpZiAoc3RyaWRlcyA9PSBudWxsKSB7XG4gICAgICAgIHN0cmlkZXMgPSAxO1xuICAgIH1cbiAgICBpZiAocGFkID09PSAwKSB7XG4gICAgICAgIHBhZCA9ICd2YWxpZCc7XG4gICAgfVxuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKGlucHV0LCAneCcsICdtYXhQb29sJyk7XG4gICAgbGV0IHg0RCA9ICR4O1xuICAgIGxldCByZXNoYXBlZFRvNEQgPSBmYWxzZTtcbiAgICBpZiAoJHgucmFuayA9PT0gMykge1xuICAgICAgICByZXNoYXBlZFRvNEQgPSB0cnVlO1xuICAgICAgICB4NEQgPSByZXNoYXBlKCR4LCBbMSwgJHguc2hhcGVbMF0sICR4LnNoYXBlWzFdLCAkeC5zaGFwZVsyXV0pO1xuICAgIH1cbiAgICB1dGlsLmFzc2VydChjb252X3V0aWwuZWl0aGVyU3RyaWRlc09yRGlsYXRpb25zQXJlT25lKHN0cmlkZXMsIGRpbGF0aW9ucyksICgpID0+ICdFcnJvciBpbiBwb29sOiBFaXRoZXIgc3RyaWRlcyBvciBkaWxhdGlvbnMgbXVzdCBiZSAxLiAnICtcbiAgICAgICAgYEdvdCBzdHJpZGVzICR7c3RyaWRlc30gYW5kIGRpbGF0aW9ucyAnJHtkaWxhdGlvbnN9J2ApO1xuICAgIGNvbnN0IGNvbnZJbmZvID0gY29udl91dGlsLmNvbXB1dGVQb29sMkRJbmZvKHg0RC5zaGFwZSwgd2luZG93U2hhcGUsIHN0cmlkZXMsIGRpbGF0aW9ucywgcGFkKTtcbiAgICBjb25zdCBkaWxhdGlvbiA9IFtjb252SW5mby5kaWxhdGlvbkhlaWdodCwgY29udkluZm8uZGlsYXRpb25XaWR0aF07XG4gICAgLy8gVGhlIGZvbGxvd2luZyBpbXBsZW1lbnRhdGlvbiBkb2VzIGJhdGNoVG9TcGFjZShwb29sKHNwYWNlVG9CYXRjaCh4KSkpXG4gICAgLy8gd2hlbmV2ZXIgZGlsYXRpb24gPiAxIHNpbmNlIHRoZSBURiBrZXJuZWxzIGRvIG5vdCBzdXBwb3J0IGRpbGF0aW9uID4gMS5cbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yZmxvdy9ibG9iLzUwZjZiYjY3ZGM5OGM5Yjc0NjMwYjYwNDdhYWU3YTRmOGE0MGZkMDIvdGVuc29yZmxvdy9weXRob24vb3BzL25uX29wcy5weSNMMTAzN1xuICAgIGxldCBiYXNlUGFkZGluZztcbiAgICBpZiAocGFkID09PSAnc2FtZScpIHtcbiAgICAgICAgYmFzZVBhZGRpbmcgPSB3aXRoU3BhY2VUb0JhdGNoQmFzZVBhZGRpbmdzKFtjb252SW5mby5maWx0ZXJIZWlnaHQsIGNvbnZJbmZvLmZpbHRlcldpZHRoXSwgZGlsYXRpb24pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgYmFzZVBhZGRpbmcgPSBbWzAsIDBdLCBbMCwgMF1dO1xuICAgIH1cbiAgICBjb25zdCBpc0RpbGF0aW9uT25lID0gZGlsYXRpb25bMF0gPT09IDEgJiYgZGlsYXRpb25bMV0gPT09IDE7XG4gICAgY29uc3QgW2FkanVzdGVkUGFkZGluZywgYWRqdXN0ZWRDcm9wc10gPSByZXF1aXJlZFNwYWNlVG9CYXRjaFBhZGRpbmdzKFtjb252SW5mby5pbkhlaWdodCwgY29udkluZm8uaW5XaWR0aF0sIGRpbGF0aW9uLCBiYXNlUGFkZGluZyk7XG4gICAgY29uc3QgY29udmVydGVkUGFkID0gaXNEaWxhdGlvbk9uZSA/IHBhZCA6ICd2YWxpZCc7XG4gICAgY29uc3QgY29udmVydGVkWCA9IGlzRGlsYXRpb25PbmUgPyB4NEQgOiBzcGFjZVRvQmF0Y2hORCh4NEQsIGRpbGF0aW9uLCBhZGp1c3RlZFBhZGRpbmcpO1xuICAgIGNvbnN0IGZvcndhcmRPcCA9IHBvb2xpbmdUeXBlID09PSAnYXZnJyA/XG4gICAgICAgICgpID0+IGF2Z1Bvb2woY29udmVydGVkWCwgd2luZG93U2hhcGUsIHN0cmlkZXMsIGNvbnZlcnRlZFBhZCkgOlxuICAgICAgICAoKSA9PiBtYXhQb29sKGNvbnZlcnRlZFgsIHdpbmRvd1NoYXBlLCBzdHJpZGVzLCBjb252ZXJ0ZWRQYWQpO1xuICAgIGNvbnN0IHkgPSBmb3J3YXJkT3AoKTtcbiAgICBjb25zdCByZXMgPSBpc0RpbGF0aW9uT25lID8geSA6IGJhdGNoVG9TcGFjZU5EKHksIGRpbGF0aW9uLCBhZGp1c3RlZENyb3BzKTtcbiAgICBpZiAocmVzaGFwZWRUbzREKSB7XG4gICAgICAgIHJldHVybiByZXNoYXBlKHJlcywgW3Jlcy5zaGFwZVsxXSwgcmVzLnNoYXBlWzJdLCByZXMuc2hhcGVbM11dKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbi8vIEhlbHBlciBmdW5jdGlvbiB0byBjb21wdXRlIGNyb3BzIGFuZCBwYWRkaW5ncyBmb3IgcG9vbCB3aXRoIGRpbGF0aW9uID4gMS5cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmZsb3cvYmxvYi81MGY2YmI2N2RjOThjOWI3NDYzMGI2MDQ3YWFlN2E0ZjhhNDBmZDAyL3RlbnNvcmZsb3cvcHl0aG9uL29wcy9hcnJheV9vcHMucHkjTDIxODRcbmZ1bmN0aW9uIHJlcXVpcmVkU3BhY2VUb0JhdGNoUGFkZGluZ3MoaW5wdXRTaGFwZSwgYmxvY2tTaGFwZSwgYmFzZVBhZGRpbmcpIHtcbiAgICBjb25zdCBwYWRTdGFydCA9IGJhc2VQYWRkaW5nLm1hcChiID0+IGJbMF0pO1xuICAgIGNvbnN0IG9yaWdQYWRFbmQgPSBiYXNlUGFkZGluZy5tYXAoYiA9PiBiWzFdKTtcbiAgICBjb25zdCBmdWxsSW5wdXRTaGFwZSA9IGlucHV0U2hhcGUuY29uY2F0KHBhZFN0YXJ0LCBvcmlnUGFkRW5kKTtcbiAgICBjb25zdCBwYWRFbmRFeHRyYSA9IGJsb2NrU2hhcGUubWFwKChiLCBpKSA9PiAoYiAtIGZ1bGxJbnB1dFNoYXBlW2ldICUgYikgJSBiKTtcbiAgICBjb25zdCBwYWRFbmQgPSBvcmlnUGFkRW5kLm1hcCgocywgaSkgPT4gcyArIHBhZEVuZEV4dHJhW2ldKTtcbiAgICBjb25zdCBwYWRkaW5ncyA9IGJsb2NrU2hhcGUubWFwKChfLCBpKSA9PiBbcGFkU3RhcnRbaV0sIHBhZEVuZFtpXV0pO1xuICAgIGNvbnN0IGNyb3BzID0gYmxvY2tTaGFwZS5tYXAoKF8sIGkpID0+IFswLCBwYWRFbmRFeHRyYVtpXV0pO1xuICAgIHJldHVybiBbcGFkZGluZ3MsIGNyb3BzXTtcbn1cbi8vIEhlbHBlciBmdW5jdGlvbiB0byBjb21wdXRlIGJhc2UgcGFkZGluZ3MgZm9yIHBvb2wgd2l0aCBkaWxhdGlvbiA+IDEuXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3JmbG93L2Jsb2IvNTBmNmJiNjdkYzk4YzliNzQ2MzBiNjA0N2FhZTdhNGY4YTQwZmQwMi90ZW5zb3JmbG93L3B5dGhvbi9vcHMvbm5fb3BzLnB5I0w1MjRcbmZ1bmN0aW9uIHdpdGhTcGFjZVRvQmF0Y2hCYXNlUGFkZGluZ3MoZmlsdGVyU2hhcGUsIGRpbGF0aW9uKSB7XG4gICAgLy8gU3BhdGlhbCBkaW1lbnNpb25zIG9mIHRoZSBmaWx0ZXJzIGFuZCB0aGUgdXBzYW1wbGVkIGZpbHRlcnMgaW4gd2hpY2ggd2VcbiAgICAvLyBpbnRyb2R1Y2UgKHJhdGUgLSAxKSB6ZXJvcyBiZXR3ZWVuIGNvbnNlY3V0aXZlIGZpbHRlciB2YWx1ZXMuXG4gICAgY29uc3QgZGlsYXRlZEZpbHRlclNoYXBlID0gZmlsdGVyU2hhcGUubWFwKChzLCBpKSA9PiB7XG4gICAgICAgIHJldHVybiBzICsgKHMgLSAxKSAqIChkaWxhdGlvbltpXSAtIDEpO1xuICAgIH0pO1xuICAgIGNvbnN0IHBhZEV4dHJhU2hhcGUgPSBkaWxhdGVkRmlsdGVyU2hhcGUubWFwKHMgPT4gcyAtIDEpO1xuICAgIC8vIFdoZW4gcGFkZGluZyBpcyBvZGQsIHdlIHBhZCBtb3JlIGF0IGVuZCwgZm9sbG93aW5nIHRoZSBzYW1lXG4gICAgLy8gY29udmVudGlvbiBhcyBjb252MmQuXG4gICAgY29uc3QgcGFkRXh0cmFTdGFydCA9IHBhZEV4dHJhU2hhcGUubWFwKHMgPT4gTWF0aC5mbG9vcihzIC8gMikpO1xuICAgIGNvbnN0IHBhZEV4dHJhRW5kID0gcGFkRXh0cmFTaGFwZS5tYXAoKHMsIGkpID0+IHMgLSBwYWRFeHRyYVN0YXJ0W2ldKTtcbiAgICByZXR1cm4gcGFkRXh0cmFTaGFwZS5tYXAoKF8sIGkpID0+IHtcbiAgICAgICAgcmV0dXJuIFtwYWRFeHRyYVN0YXJ0W2ldLCBwYWRFeHRyYUVuZFtpXV07XG4gICAgfSk7XG59XG5leHBvcnQgY29uc3QgcG9vbCA9IG9wKHsgcG9vbF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wb29sLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBQb3cgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgbWFrZVR5cGVzTWF0Y2ggfSBmcm9tICcuLi90ZW5zb3JfdXRpbCc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENvbXB1dGVzIHRoZSBwb3dlciBvZiBvbmUgYHRmLlRlbnNvcmAgdG8gYW5vdGhlci4gU3VwcG9ydHMgYnJvYWRjYXN0aW5nLlxuICpcbiAqIEdpdmVuIGEgYHRmLlRlbnNvcmAgeCBhbmQgYSBgdGYuVGVuc29yYCB5LCB0aGlzIG9wZXJhdGlvbiBjb21wdXRlcyB4XnkgZm9yXG4gKiBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIGluIHggYW5kIHkuIFRoZSByZXN1bHQncyBkdHlwZSB3aWxsIGJlIHRoZSB1cGNhc3RlZFxuICogdHlwZSBvZiB0aGUgYGJhc2VgIGFuZCBgZXhwYCBkdHlwZXMuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IoW1syLCAzXSwgWzQsIDVdXSlcbiAqIGNvbnN0IGIgPSB0Zi50ZW5zb3IoW1sxLCAyXSwgWzMsIDBdXSkudG9JbnQoKTtcbiAqXG4gKiBhLnBvdyhiKS5wcmludCgpOyAgLy8gb3IgdGYucG93KGEsIGIpXG4gKiBgYGBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcihbWzEsIDJdLCBbMywgNF1dKVxuICogY29uc3QgYiA9IHRmLnRlbnNvcigyKS50b0ludCgpO1xuICpcbiAqIGEucG93KGIpLnByaW50KCk7ICAvLyBvciB0Zi5wb3coYSwgYilcbiAqIGBgYFxuICogV2UgYWxzbyBleHBvc2UgYHBvd1N0cmljdGAgd2hpY2ggaGFzIHRoZSBzYW1lIHNpZ25hdHVyZSBhcyB0aGlzIG9wIGFuZFxuICogYXNzZXJ0cyB0aGF0IGBiYXNlYCBhbmQgYGV4cGAgYXJlIHRoZSBzYW1lIHNoYXBlIChkb2VzIG5vdCBicm9hZGNhc3QpLlxuICpcbiAqIEBwYXJhbSBiYXNlIFRoZSBiYXNlIGB0Zi5UZW5zb3JgIHRvIHBvdyBlbGVtZW50LXdpc2UuXG4gKiBAcGFyYW0gZXhwIFRoZSBleHBvbmVudCBgdGYuVGVuc29yYCB0byBwb3cgZWxlbWVudC13aXNlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0FyaXRobWV0aWMnfVxuICovXG5mdW5jdGlvbiBwb3dfKGJhc2UsIGV4cCkge1xuICAgIGxldCAkYmFzZSA9IGNvbnZlcnRUb1RlbnNvcihiYXNlLCAnYmFzZScsICdwb3cnKTtcbiAgICBsZXQgJGV4cCA9IGNvbnZlcnRUb1RlbnNvcihleHAsICdleHAnLCAncG93Jyk7XG4gICAgWyRiYXNlLCAkZXhwXSA9IG1ha2VUeXBlc01hdGNoKCRiYXNlLCAkZXhwKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IGE6ICRiYXNlLCBiOiAkZXhwIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoUG93LCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IHBvdyA9IG9wKHsgcG93XyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBvdy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgUHJlbHUgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyBsZWFreSByZWN0aWZpZWQgbGluZWFyIGVsZW1lbnQtd2lzZSB3aXRoIHBhcmFtZXRyaWMgYWxwaGFzLlxuICpcbiAqIGB4IDwgMCA/IGFscGhhICogeCA6IGYoeCkgPSB4YFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWy0xLCAyLCAtMywgNF0pO1xuICogY29uc3QgYWxwaGEgPSB0Zi5zY2FsYXIoMC4xKTtcbiAqXG4gKiB4LnByZWx1KGFscGhhKS5wcmludCgpOyAgLy8gb3IgdGYucHJlbHUoeCwgYWxwaGEpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKiBAcGFyYW0gYWxwaGEgU2NhbGluZyBmYWN0b3IgZm9yIG5lZ2F0aXZlIHZhbHVlcy5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gcHJlbHVfKHgsIGFscGhhKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAncHJlbHUnKTtcbiAgICBjb25zdCAkYWxwaGEgPSBjb252ZXJ0VG9UZW5zb3IoYWxwaGEsICdhbHBoYScsICdwcmVsdScpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHgsIGFscGhhOiAkYWxwaGEgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChQcmVsdSwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBwcmVsdSA9IG9wKHsgcHJlbHVfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cHJlbHUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuLyoqXG4gKiBQcmludHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGB0Zi5UZW5zb3JgIGluY2x1ZGluZyBpdHMgZGF0YS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgdmVyYm9zZSA9IHRydWU7XG4gKiB0Zi50ZW5zb3IyZChbMSwgMiwgMywgNF0sIFsyLCAyXSkucHJpbnQodmVyYm9zZSk7XG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSB0ZW5zb3IgdG8gYmUgcHJpbnRlZC5cbiAqIEBwYXJhbSB2ZXJib3NlIFdoZXRoZXIgdG8gcHJpbnQgdmVyYm9zZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYCBUZW5zb3JgLFxuICogaW5jbHVkaW5nIGR0eXBlIGFuZCBzaXplLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NyZWF0aW9uJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByaW50KHgsIHZlcmJvc2UgPSBmYWxzZSkge1xuICAgIGNvbnNvbGUubG9nKHgudG9TdHJpbmcodmVyYm9zZSkpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cHJpbnQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IFByb2QgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IGNhc3QgfSBmcm9tICcuL2Nhc3QnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENvbXB1dGVzIHRoZSBwcm9kdWN0IG9mIGVsZW1lbnRzIGFjcm9zcyBkaW1lbnNpb25zIG9mIGEgYHRmLlRlbnNvcmAuXG4gKlxuICogUmVkdWNlcyB0aGUgaW5wdXQgYWxvbmcgdGhlIGRpbWVuc2lvbnMgZ2l2ZW4gaW4gYGF4ZXNgLiBVbmxlc3MgYGtlZXBEaW1zYFxuICogaXMgdHJ1ZSwgdGhlIHJhbmsgb2YgdGhlIGB0Zi5UZW5zb3JgIGlzIHJlZHVjZWQgYnkgMSBmb3IgZWFjaCBlbnRyeSBpblxuICogYGF4ZXNgLiBJZiBga2VlcERpbXNgIGlzIHRydWUsIHRoZSByZWR1Y2VkIGRpbWVuc2lvbnMgYXJlIHJldGFpbmVkIHdpdGhcbiAqIGxlbmd0aCAxLiBJZiBgYXhlc2AgaGFzIG5vIGVudHJpZXMsIGFsbCBkaW1lbnNpb25zIGFyZSByZWR1Y2VkLCBhbmQgYVxuICogYHRmLlRlbnNvcmAgd2l0aCBhIHNpbmdsZSBlbGVtZW50IGlzIHJldHVybmVkLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIDNdKTtcbiAqXG4gKiB4LnByb2QoKS5wcmludCgpOyAgLy8gb3IgdGYucHJvZCh4KVxuICogYGBgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IyZChbMSwgMiwgMywgNF0sIFsyLCAyXSk7XG4gKlxuICogY29uc3QgYXhpcyA9IDE7XG4gKiB4LnByb2QoYXhpcykucHJpbnQoKTsgIC8vIG9yIHRmLnByb2QoeCwgYXhpcylcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IgdG8gY29tcHV0ZSB0aGUgcHJvZHVjdCBvdmVyLiBJZiB0aGUgZHR5cGUgaXMgYGJvb2xgXG4gKiAgIGl0IHdpbGwgYmUgY29udmVydGVkIHRvIGBpbnQzMmAgYW5kIHRoZSBvdXRwdXQgZHR5cGUgd2lsbCBiZSBgaW50MzJgLlxuICogQHBhcmFtIGF4aXMgVGhlIGRpbWVuc2lvbihzKSB0byByZWR1Y2UuIEJ5IGRlZmF1bHQgaXQgcmVkdWNlc1xuICogICAgIGFsbCBkaW1lbnNpb25zLlxuICogQHBhcmFtIGtlZXBEaW1zIElmIHRydWUsIHJldGFpbnMgcmVkdWNlZCBkaW1lbnNpb25zIHdpdGggc2l6ZSAxLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ1JlZHVjdGlvbid9XG4gKi9cbmZ1bmN0aW9uIHByb2RfKHgsIGF4aXMgPSBudWxsLCBrZWVwRGltcyA9IGZhbHNlKSB7XG4gICAgbGV0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3Byb2QnKTtcbiAgICBpZiAoJHguZHR5cGUgPT09ICdib29sJykge1xuICAgICAgICAvLyBib29sIGlzIG5vdCBhbiBhbGxvd2VkIHR5cGUgZm9yIHRoZSB1bmRlcmx5aW5nIGtlcm5lbC5cbiAgICAgICAgJHggPSBjYXN0KCR4LCAnaW50MzInKTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBheGlzLCBrZWVwRGltcyB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFByb2QsIGlucHV0cywgYXR0cnMpO1xufVxuZXhwb3J0IGNvbnN0IHByb2QgPSBvcCh7IHByb2RfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cHJvZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgc2l6ZUZyb21TaGFwZSB9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENyZWF0ZXMgYSBgdGYuVGVuc29yYCB3aXRoIHZhbHVlcyBzYW1wbGVkIGZyb20gYSByYW5kb20gbnVtYmVyIGdlbmVyYXRvclxuICogZnVuY3Rpb24gZGVmaW5lZCBieSB0aGUgdXNlci5cbiAqXG4gKiBAcGFyYW0gc2hhcGUgQW4gYXJyYXkgb2YgaW50ZWdlcnMgZGVmaW5pbmcgdGhlIG91dHB1dCB0ZW5zb3Igc2hhcGUuXG4gKiBAcGFyYW0gcmFuZEZ1bmN0aW9uIEEgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkXG4gKiBmb3IgZWFjaCBlbGVtZW50IGluIHRoZSBvdXRwdXQgdGVuc29yLlxuICogQHBhcmFtIGR0eXBlIFRoZSBkYXRhIHR5cGUgb2YgdGhlIG91dHB1dCB0ZW5zb3IuIERlZmF1bHRzIHRvICdmbG9hdDMyJy5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdSYW5kb20nfVxuICovXG5mdW5jdGlvbiByYW5kXyhzaGFwZSwgcmFuZEZ1bmN0aW9uLCBkdHlwZSkge1xuICAgIGNvbnN0IHNpemUgPSBzaXplRnJvbVNoYXBlKHNoYXBlKTtcbiAgICBsZXQgdmFsdWVzID0gbnVsbDtcbiAgICBpZiAoZHR5cGUgPT0gbnVsbCB8fCBkdHlwZSA9PT0gJ2Zsb2F0MzInKSB7XG4gICAgICAgIHZhbHVlcyA9IG5ldyBGbG9hdDMyQXJyYXkoc2l6ZSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGR0eXBlID09PSAnaW50MzInKSB7XG4gICAgICAgIHZhbHVlcyA9IG5ldyBJbnQzMkFycmF5KHNpemUpO1xuICAgIH1cbiAgICBlbHNlIGlmIChkdHlwZSA9PT0gJ2Jvb2wnKSB7XG4gICAgICAgIHZhbHVlcyA9IG5ldyBVaW50OEFycmF5KHNpemUpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGRhdGEgdHlwZSAke2R0eXBlfWApO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNpemU7IGkrKykge1xuICAgICAgICB2YWx1ZXNbaV0gPSByYW5kRnVuY3Rpb24oKTtcbiAgICB9XG4gICAgcmV0dXJuIEVOR0lORS5tYWtlVGVuc29yKHZhbHVlcywgc2hhcGUsIGR0eXBlKTtcbn1cbmV4cG9ydCBjb25zdCByYW5kID0gb3AoeyByYW5kXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJhbmQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0ICogYXMgc2VlZHJhbmRvbSBmcm9tICdzZWVkcmFuZG9tJztcbmltcG9ydCB7IGV4cGVjdE51bWJlcnNDbG9zZSwgdGVzdEVwc2lsb24gfSBmcm9tICcuLi90ZXN0X3V0aWwnO1xuLy8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTWFyc2FnbGlhX3BvbGFyX21ldGhvZFxuZXhwb3J0IGNsYXNzIE1QUmFuZEdhdXNzIHtcbiAgICBjb25zdHJ1Y3RvcihtZWFuLCBzdGREZXZpYXRpb24sIGR0eXBlLCB0cnVuY2F0ZWQsIHNlZWQpIHtcbiAgICAgICAgdGhpcy5tZWFuID0gbWVhbjtcbiAgICAgICAgdGhpcy5zdGREZXYgPSBzdGREZXZpYXRpb247XG4gICAgICAgIHRoaXMuZHR5cGUgPSBkdHlwZTtcbiAgICAgICAgdGhpcy5uZXh0VmFsID0gTmFOO1xuICAgICAgICB0aGlzLnRydW5jYXRlZCA9IHRydW5jYXRlZDtcbiAgICAgICAgaWYgKHRoaXMudHJ1bmNhdGVkKSB7XG4gICAgICAgICAgICB0aGlzLnVwcGVyID0gdGhpcy5tZWFuICsgdGhpcy5zdGREZXYgKiAyO1xuICAgICAgICAgICAgdGhpcy5sb3dlciA9IHRoaXMubWVhbiAtIHRoaXMuc3RkRGV2ICogMjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZWVkVmFsdWUgPSBzZWVkID8gc2VlZCA6IE1hdGgucmFuZG9tKCk7XG4gICAgICAgIHRoaXMucmFuZG9tID0gc2VlZHJhbmRvbS5hbGVhKHNlZWRWYWx1ZS50b1N0cmluZygpKTtcbiAgICB9XG4gICAgLyoqIFJldHVybnMgbmV4dCBzYW1wbGUgZnJvbSBhIEdhdXNzaWFuIGRpc3RyaWJ1dGlvbi4gKi9cbiAgICBuZXh0VmFsdWUoKSB7XG4gICAgICAgIGlmICghaXNOYU4odGhpcy5uZXh0VmFsKSkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLm5leHRWYWw7XG4gICAgICAgICAgICB0aGlzLm5leHRWYWwgPSBOYU47XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlc3VsdFgsIHJlc3VsdFk7XG4gICAgICAgIGxldCBpc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgIHdoaWxlICghaXNWYWxpZCkge1xuICAgICAgICAgICAgbGV0IHYxLCB2MiwgcztcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICB2MSA9IDIgKiB0aGlzLnJhbmRvbSgpIC0gMTtcbiAgICAgICAgICAgICAgICB2MiA9IDIgKiB0aGlzLnJhbmRvbSgpIC0gMTtcbiAgICAgICAgICAgICAgICBzID0gdjEgKiB2MSArIHYyICogdjI7XG4gICAgICAgICAgICB9IHdoaWxlIChzID49IDEgfHwgcyA9PT0gMCk7XG4gICAgICAgICAgICBjb25zdCBtdWwgPSBNYXRoLnNxcnQoLTIuMCAqIE1hdGgubG9nKHMpIC8gcyk7XG4gICAgICAgICAgICByZXN1bHRYID0gdGhpcy5tZWFuICsgdGhpcy5zdGREZXYgKiB2MSAqIG11bDtcbiAgICAgICAgICAgIHJlc3VsdFkgPSB0aGlzLm1lYW4gKyB0aGlzLnN0ZERldiAqIHYyICogbXVsO1xuICAgICAgICAgICAgaWYgKCF0aGlzLnRydW5jYXRlZCB8fCB0aGlzLmlzVmFsaWRUcnVuY2F0ZWQocmVzdWx0WCkpIHtcbiAgICAgICAgICAgICAgICBpc1ZhbGlkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMudHJ1bmNhdGVkIHx8IHRoaXMuaXNWYWxpZFRydW5jYXRlZChyZXN1bHRZKSkge1xuICAgICAgICAgICAgdGhpcy5uZXh0VmFsID0gdGhpcy5jb252ZXJ0VmFsdWUocmVzdWx0WSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY29udmVydFZhbHVlKHJlc3VsdFgpO1xuICAgIH1cbiAgICAvKiogSGFuZGxlcyBwcm9wZXIgcm91bmRpbmcgZm9yIG5vbi1mbG9hdGluZy1wb2ludCBudW1iZXJzLiAqL1xuICAgIGNvbnZlcnRWYWx1ZSh2YWx1ZSkge1xuICAgICAgICBpZiAodGhpcy5kdHlwZSA9PSBudWxsIHx8IHRoaXMuZHR5cGUgPT09ICdmbG9hdDMyJykge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKHZhbHVlKTtcbiAgICB9XG4gICAgLyoqIFJldHVybnMgdHJ1ZSBpZiBsZXNzIHRoYW4gMi1zdGFuZGFyZC1kZXZpYXRpb25zIGZyb20gdGhlIG1lYW4uICovXG4gICAgaXNWYWxpZFRydW5jYXRlZCh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdmFsdWUgPD0gdGhpcy51cHBlciAmJiB2YWx1ZSA+PSB0aGlzLmxvd2VyO1xuICAgIH1cbn1cbi8vIE1hcnNhZ2xpYSwgR2VvcmdlLCBhbmQgV2FpIFdhbiBUc2FuZy4gMjAwMC4gXCJBIFNpbXBsZSBNZXRob2QgZm9yIEdlbmVyYXRpbmdcbi8vIEdhbW1hIFZhcmlhYmxlcy5cIlxuZXhwb3J0IGNsYXNzIFJhbmRHYW1tYSB7XG4gICAgY29uc3RydWN0b3IoYWxwaGEsIGJldGEsIGR0eXBlLCBzZWVkKSB7XG4gICAgICAgIHRoaXMuYWxwaGEgPSBhbHBoYTtcbiAgICAgICAgdGhpcy5iZXRhID0gMSAvIGJldGE7IC8vIGNvbnZlcnQgcmF0ZSB0byBzY2FsZSBwYXJhbWV0ZXJcbiAgICAgICAgdGhpcy5kdHlwZSA9IGR0eXBlO1xuICAgICAgICBjb25zdCBzZWVkVmFsdWUgPSBzZWVkID8gc2VlZCA6IE1hdGgucmFuZG9tKCk7XG4gICAgICAgIHRoaXMucmFuZHUgPSBzZWVkcmFuZG9tLmFsZWEoc2VlZFZhbHVlLnRvU3RyaW5nKCkpO1xuICAgICAgICB0aGlzLnJhbmRuID0gbmV3IE1QUmFuZEdhdXNzKDAsIDEsIGR0eXBlLCBmYWxzZSwgdGhpcy5yYW5kdSgpKTtcbiAgICAgICAgaWYgKGFscGhhIDwgMSkge1xuICAgICAgICAgICAgdGhpcy5kID0gYWxwaGEgKyAoMiAvIDMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kID0gYWxwaGEgLSAoMSAvIDMpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYyA9IDEgLyBNYXRoLnNxcnQoOSAqIHRoaXMuZCk7XG4gICAgfVxuICAgIC8qKiBSZXR1cm5zIG5leHQgc2FtcGxlIGZyb20gYSBnYW1tYSBkaXN0cmlidXRpb24uICovXG4gICAgbmV4dFZhbHVlKCkge1xuICAgICAgICBsZXQgeDIsIHYwLCB2MSwgeCwgdSwgdjtcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICB4ID0gdGhpcy5yYW5kbi5uZXh0VmFsdWUoKTtcbiAgICAgICAgICAgICAgICB2ID0gMSArICh0aGlzLmMgKiB4KTtcbiAgICAgICAgICAgIH0gd2hpbGUgKHYgPD0gMCk7XG4gICAgICAgICAgICB2ICo9IHYgKiB2O1xuICAgICAgICAgICAgeDIgPSB4ICogeDtcbiAgICAgICAgICAgIHYwID0gMSAtICgwLjMzMSAqIHgyICogeDIpO1xuICAgICAgICAgICAgdjEgPSAoMC41ICogeDIpICsgKHRoaXMuZCAqICgxIC0gdiArIE1hdGgubG9nKHYpKSk7XG4gICAgICAgICAgICB1ID0gdGhpcy5yYW5kdSgpO1xuICAgICAgICAgICAgaWYgKHUgPCB2MCB8fCBNYXRoLmxvZyh1KSA8IHYxKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdiA9ICgxIC8gdGhpcy5iZXRhKSAqIHRoaXMuZCAqIHY7XG4gICAgICAgIGlmICh0aGlzLmFscGhhIDwgMSkge1xuICAgICAgICAgICAgdiAqPSBNYXRoLnBvdyh0aGlzLnJhbmR1KCksIDEgLyB0aGlzLmFscGhhKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jb252ZXJ0VmFsdWUodik7XG4gICAgfVxuICAgIC8qKiBIYW5kbGVzIHByb3BlciByb3VuZGluZyBmb3Igbm9uLWZsb2F0aW5nLXBvaW50IG51bWJlcnMuICovXG4gICAgY29udmVydFZhbHVlKHZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLmR0eXBlID09PSAnZmxvYXQzMicpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZCh2YWx1ZSk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIFVuaWZvcm1SYW5kb20ge1xuICAgIGNvbnN0cnVjdG9yKG1pbiA9IDAsIG1heCA9IDEsIGR0eXBlLCBzZWVkKSB7XG4gICAgICAgIC8qKiBIYW5kbGVzIHByb3BlciByb3VuZGluZyBmb3Igbm9uIGZsb2F0aW5nIHBvaW50IG51bWJlcnMuICovXG4gICAgICAgIHRoaXMuY2FuUmV0dXJuRmxvYXQgPSAoKSA9PiAodGhpcy5kdHlwZSA9PSBudWxsIHx8IHRoaXMuZHR5cGUgPT09ICdmbG9hdDMyJyk7XG4gICAgICAgIHRoaXMubWluID0gbWluO1xuICAgICAgICB0aGlzLnJhbmdlID0gbWF4IC0gbWluO1xuICAgICAgICB0aGlzLmR0eXBlID0gZHR5cGU7XG4gICAgICAgIGlmIChzZWVkID09IG51bGwpIHtcbiAgICAgICAgICAgIHNlZWQgPSBNYXRoLnJhbmRvbSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc2VlZCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHNlZWQgPSBzZWVkLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmNhblJldHVybkZsb2F0KCkgJiYgdGhpcy5yYW5nZSA8PSAxKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gJHttaW59IC0gJHttYXh9IDw9IDEgYW5kIGR0eXBlIGlzIG5vdCBmbG9hdGApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmFuZG9tID0gc2VlZHJhbmRvbS5hbGVhKHNlZWQpO1xuICAgIH1cbiAgICBjb252ZXJ0VmFsdWUodmFsdWUpIHtcbiAgICAgICAgaWYgKHRoaXMuY2FuUmV0dXJuRmxvYXQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKHZhbHVlKTtcbiAgICB9XG4gICAgbmV4dFZhbHVlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb252ZXJ0VmFsdWUodGhpcy5taW4gKyB0aGlzLnJhbmdlICogdGhpcy5yYW5kb20oKSk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGphcnF1ZUJlcmFOb3JtYWxpdHlUZXN0KHZhbHVlcykge1xuICAgIC8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0phcnF1ZSVFMiU4MCU5M0JlcmFfdGVzdFxuICAgIGNvbnN0IG4gPSB2YWx1ZXMubGVuZ3RoO1xuICAgIGNvbnN0IHMgPSBza2V3bmVzcyh2YWx1ZXMpO1xuICAgIGNvbnN0IGsgPSBrdXJ0b3Npcyh2YWx1ZXMpO1xuICAgIGNvbnN0IGpiID0gbiAvIDYgKiAoTWF0aC5wb3cocywgMikgKyAwLjI1ICogTWF0aC5wb3coayAtIDMsIDIpKTtcbiAgICAvLyBKQiB0ZXN0IHJlcXVpcmVzIDItZGVncmVzcyBvZiBmcmVlZG9tIGZyb20gQ2hpLVNxdWFyZSBAIDAuOTU6XG4gICAgLy8gaHR0cDovL3d3dy5pdGwubmlzdC5nb3YvZGl2ODk4L2hhbmRib29rL2VkYS9zZWN0aW9uMy9lZGEzNjc0Lmh0bVxuICAgIGNvbnN0IENISV9TUVVBUkVfMkRFRyA9IDUuOTkxO1xuICAgIGlmIChqYiA+IENISV9TUVVBUkVfMkRFRykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcC12YWx1ZSBmb3IgSkI6ICR7amJ9YCk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGV4cGVjdEFycmF5SW5NZWFuU3RkUmFuZ2UoYWN0dWFsLCBleHBlY3RlZE1lYW4sIGV4cGVjdGVkU3RkRGV2LCBlcHNpbG9uKSB7XG4gICAgaWYgKGVwc2lsb24gPT0gbnVsbCkge1xuICAgICAgICBlcHNpbG9uID0gdGVzdEVwc2lsb24oKTtcbiAgICB9XG4gICAgY29uc3QgYWN0dWFsTWVhbiA9IG1lYW4oYWN0dWFsKTtcbiAgICBleHBlY3ROdW1iZXJzQ2xvc2UoYWN0dWFsTWVhbiwgZXhwZWN0ZWRNZWFuLCBlcHNpbG9uKTtcbiAgICBleHBlY3ROdW1iZXJzQ2xvc2Uoc3RhbmRhcmREZXZpYXRpb24oYWN0dWFsLCBhY3R1YWxNZWFuKSwgZXhwZWN0ZWRTdGREZXYsIGVwc2lsb24pO1xufVxuZnVuY3Rpb24gbWVhbih2YWx1ZXMpIHtcbiAgICBsZXQgc3VtID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBzdW0gKz0gdmFsdWVzW2ldO1xuICAgIH1cbiAgICByZXR1cm4gc3VtIC8gdmFsdWVzLmxlbmd0aDtcbn1cbmZ1bmN0aW9uIHN0YW5kYXJkRGV2aWF0aW9uKHZhbHVlcywgbWVhbikge1xuICAgIGxldCBzcXVhcmVEaWZmU3VtID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBkaWZmID0gdmFsdWVzW2ldIC0gbWVhbjtcbiAgICAgICAgc3F1YXJlRGlmZlN1bSArPSBkaWZmICogZGlmZjtcbiAgICB9XG4gICAgcmV0dXJuIE1hdGguc3FydChzcXVhcmVEaWZmU3VtIC8gdmFsdWVzLmxlbmd0aCk7XG59XG5mdW5jdGlvbiBrdXJ0b3Npcyh2YWx1ZXMpIHtcbiAgICAvLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9LdXJ0b3Npc1xuICAgIGNvbnN0IHZhbHVlc01lYW4gPSBtZWFuKHZhbHVlcyk7XG4gICAgY29uc3QgbiA9IHZhbHVlcy5sZW5ndGg7XG4gICAgbGV0IHN1bTIgPSAwO1xuICAgIGxldCBzdW00ID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuICAgICAgICBjb25zdCB2ID0gdmFsdWVzW2ldIC0gdmFsdWVzTWVhbjtcbiAgICAgICAgc3VtMiArPSBNYXRoLnBvdyh2LCAyKTtcbiAgICAgICAgc3VtNCArPSBNYXRoLnBvdyh2LCA0KTtcbiAgICB9XG4gICAgcmV0dXJuICgxIC8gbikgKiBzdW00IC8gTWF0aC5wb3coKDEgLyBuKSAqIHN1bTIsIDIpO1xufVxuZnVuY3Rpb24gc2tld25lc3ModmFsdWVzKSB7XG4gICAgLy8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU2tld25lc3NcbiAgICBjb25zdCB2YWx1ZXNNZWFuID0gbWVhbih2YWx1ZXMpO1xuICAgIGNvbnN0IG4gPSB2YWx1ZXMubGVuZ3RoO1xuICAgIGxldCBzdW0yID0gMDtcbiAgICBsZXQgc3VtMyA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgY29uc3QgdiA9IHZhbHVlc1tpXSAtIHZhbHVlc01lYW47XG4gICAgICAgIHN1bTIgKz0gTWF0aC5wb3codiwgMik7XG4gICAgICAgIHN1bTMgKz0gTWF0aC5wb3codiwgMyk7XG4gICAgfVxuICAgIHJldHVybiAoMSAvIG4pICogc3VtMyAvIE1hdGgucG93KCgxIC8gKG4gLSAxKSkgKiBzdW0yLCAzIC8gMik7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yYW5kX3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYnVmZmVyIH0gZnJvbSAnLi9idWZmZXInO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyBSYW5kR2FtbWEgfSBmcm9tICcuL3JhbmRfdXRpbCc7XG4vKipcbiAqIENyZWF0ZXMgYSBgdGYuVGVuc29yYCB3aXRoIHZhbHVlcyBzYW1wbGVkIGZyb20gYSBnYW1tYSBkaXN0cmlidXRpb24uXG4gKlxuICogYGBganNcbiAqIHRmLnJhbmRvbUdhbW1hKFsyLCAyXSwgMSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBzaGFwZSBBbiBhcnJheSBvZiBpbnRlZ2VycyBkZWZpbmluZyB0aGUgb3V0cHV0IHRlbnNvciBzaGFwZS5cbiAqIEBwYXJhbSBhbHBoYSBUaGUgc2hhcGUgcGFyYW1ldGVyIG9mIHRoZSBnYW1tYSBkaXN0cmlidXRpb24uXG4gKiBAcGFyYW0gYmV0YSBUaGUgaW52ZXJzZSBzY2FsZSBwYXJhbWV0ZXIgb2YgdGhlIGdhbW1hIGRpc3RyaWJ1dGlvbi4gRGVmYXVsdHNcbiAqICAgICB0byAxLlxuICogQHBhcmFtIGR0eXBlIFRoZSBkYXRhIHR5cGUgb2YgdGhlIG91dHB1dC4gRGVmYXVsdHMgdG8gZmxvYXQzMi5cbiAqIEBwYXJhbSBzZWVkIFRoZSBzZWVkIGZvciB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnUmFuZG9tJ31cbiAqL1xuZnVuY3Rpb24gcmFuZG9tR2FtbWFfKHNoYXBlLCBhbHBoYSwgYmV0YSA9IDEsIGR0eXBlID0gJ2Zsb2F0MzInLCBzZWVkKSB7XG4gICAgaWYgKGJldGEgPT0gbnVsbCkge1xuICAgICAgICBiZXRhID0gMTtcbiAgICB9XG4gICAgaWYgKGR0eXBlID09IG51bGwpIHtcbiAgICAgICAgZHR5cGUgPSAnZmxvYXQzMic7XG4gICAgfVxuICAgIGlmIChkdHlwZSAhPT0gJ2Zsb2F0MzInICYmIGR0eXBlICE9PSAnaW50MzInKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgZGF0YSB0eXBlICR7ZHR5cGV9YCk7XG4gICAgfVxuICAgIGNvbnN0IHJnYW1tYSA9IG5ldyBSYW5kR2FtbWEoYWxwaGEsIGJldGEsIGR0eXBlLCBzZWVkKTtcbiAgICBjb25zdCByZXMgPSBidWZmZXIoc2hhcGUsIGR0eXBlKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlcy52YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmVzLnZhbHVlc1tpXSA9IHJnYW1tYS5uZXh0VmFsdWUoKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcy50b1RlbnNvcigpO1xufVxuZXhwb3J0IGNvbnN0IHJhbmRvbUdhbW1hID0gb3AoeyByYW5kb21HYW1tYV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yYW5kb21fZ2FtbWEuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYnVmZmVyIH0gZnJvbSAnLi9idWZmZXInO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyBNUFJhbmRHYXVzcyB9IGZyb20gJy4vcmFuZF91dGlsJztcbi8qKlxuICogQ3JlYXRlcyBhIGB0Zi5UZW5zb3JgIHdpdGggdmFsdWVzIHNhbXBsZWQgZnJvbSBhIG5vcm1hbCBkaXN0cmlidXRpb24uXG4gKlxuICogYGBganNcbiAqIHRmLnJhbmRvbU5vcm1hbChbMiwgMl0pLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gc2hhcGUgQW4gYXJyYXkgb2YgaW50ZWdlcnMgZGVmaW5pbmcgdGhlIG91dHB1dCB0ZW5zb3Igc2hhcGUuXG4gKiBAcGFyYW0gbWVhbiBUaGUgbWVhbiBvZiB0aGUgbm9ybWFsIGRpc3RyaWJ1dGlvbi5cbiAqIEBwYXJhbSBzdGREZXYgVGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgbm9ybWFsIGRpc3RyaWJ1dGlvbi5cbiAqIEBwYXJhbSBkdHlwZSBUaGUgZGF0YSB0eXBlIG9mIHRoZSBvdXRwdXQuXG4gKiBAcGFyYW0gc2VlZCBUaGUgc2VlZCBmb3IgdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ1JhbmRvbSd9XG4gKi9cbmZ1bmN0aW9uIHJhbmRvbU5vcm1hbF8oc2hhcGUsIG1lYW4gPSAwLCBzdGREZXYgPSAxLCBkdHlwZSwgc2VlZCkge1xuICAgIGlmIChkdHlwZSAhPSBudWxsICYmIGR0eXBlID09PSAnYm9vbCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBkYXRhIHR5cGUgJHtkdHlwZX1gKTtcbiAgICB9XG4gICAgY29uc3QgcmFuZEdhdXNzID0gbmV3IE1QUmFuZEdhdXNzKG1lYW4sIHN0ZERldiwgZHR5cGUsIGZhbHNlIC8qIHRydW5jYXRlZCAqLywgc2VlZCk7XG4gICAgY29uc3QgcmVzID0gYnVmZmVyKHNoYXBlLCBkdHlwZSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXMudmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJlcy52YWx1ZXNbaV0gPSByYW5kR2F1c3MubmV4dFZhbHVlKCk7XG4gICAgfVxuICAgIHJldHVybiByZXMudG9UZW5zb3IoKTtcbn1cbmV4cG9ydCBjb25zdCByYW5kb21Ob3JtYWwgPSBvcCh7IHJhbmRvbU5vcm1hbF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yYW5kb21fbm9ybWFsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGJ1ZmZlciB9IGZyb20gJy4vYnVmZmVyJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgVW5pZm9ybVJhbmRvbSB9IGZyb20gJy4vcmFuZF91dGlsJztcbi8qKlxuICogQ3JlYXRlcyBhIGB0Zi5UZW5zb3JgIHdpdGggdmFsdWVzIHNhbXBsZWQgZnJvbSBhIHVuaWZvcm0gZGlzdHJpYnV0aW9uLlxuICpcbiAqIFRoZSBnZW5lcmF0ZWQgdmFsdWVzIGZvbGxvdyBhIHVuaWZvcm0gZGlzdHJpYnV0aW9uIGluIHRoZSByYW5nZSBbbWludmFsLFxuICogbWF4dmFsKS4gVGhlIGxvd2VyIGJvdW5kIG1pbnZhbCBpcyBpbmNsdWRlZCBpbiB0aGUgcmFuZ2UsIHdoaWxlIHRoZSB1cHBlclxuICogYm91bmQgbWF4dmFsIGlzIGV4Y2x1ZGVkLlxuICpcbiAqIGBgYGpzXG4gKiB0Zi5yYW5kb21Vbmlmb3JtKFsyLCAyXSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBzaGFwZSBBbiBhcnJheSBvZiBpbnRlZ2VycyBkZWZpbmluZyB0aGUgb3V0cHV0IHRlbnNvciBzaGFwZS5cbiAqIEBwYXJhbSBtaW52YWwgVGhlIGxvd2VyIGJvdW5kIG9uIHRoZSByYW5nZSBvZiByYW5kb20gdmFsdWVzIHRvIGdlbmVyYXRlLlxuICogICBEZWZhdWx0cyB0byAwLlxuICogQHBhcmFtIG1heHZhbCBUaGUgdXBwZXIgYm91bmQgb24gdGhlIHJhbmdlIG9mIHJhbmRvbSB2YWx1ZXMgdG8gZ2VuZXJhdGUuXG4gKiAgIERlZmF1bHRzIHRvIDEuXG4gKiBAcGFyYW0gZHR5cGUgVGhlIGRhdGEgdHlwZSBvZiB0aGUgb3V0cHV0IHRlbnNvci4gRGVmYXVsdHMgdG8gJ2Zsb2F0MzInLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ1JhbmRvbSd9XG4gKi9cbmZ1bmN0aW9uIHJhbmRvbVVuaWZvcm1fKHNoYXBlLCBtaW52YWwgPSAwLCBtYXh2YWwgPSAxLCBkdHlwZSA9ICdmbG9hdDMyJywgc2VlZCkge1xuICAgIGNvbnN0IHJlcyA9IGJ1ZmZlcihzaGFwZSwgZHR5cGUpO1xuICAgIGNvbnN0IHJhbmRvbSA9IG5ldyBVbmlmb3JtUmFuZG9tKG1pbnZhbCwgbWF4dmFsLCBudWxsLCBzZWVkKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlcy52YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmVzLnZhbHVlc1tpXSA9IHJhbmRvbS5uZXh0VmFsdWUoKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcy50b1RlbnNvcigpO1xufVxuZXhwb3J0IGNvbnN0IHJhbmRvbVVuaWZvcm0gPSBvcCh7IHJhbmRvbVVuaWZvcm1fIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmFuZG9tX3VuaWZvcm0uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IFJhbmdlIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBgdGYuVGVuc29yMURgIGZpbGxlZCB3aXRoIHRoZSBudW1iZXJzIGluIHRoZSByYW5nZSBwcm92aWRlZC5cbiAqXG4gKiBUaGUgdGVuc29yIGlzIGEgaXMgaGFsZi1vcGVuIGludGVydmFsIG1lYW5pbmcgaXQgaW5jbHVkZXMgc3RhcnQsIGJ1dFxuICogZXhjbHVkZXMgc3RvcC4gRGVjcmVtZW50aW5nIHJhbmdlcyBhbmQgbmVnYXRpdmUgc3RlcCB2YWx1ZXMgYXJlIGFsc29cbiAqIHN1cHBvcnRlZC5zdlxuICpcbiAqXG4gKiBgYGBqc1xuICogdGYucmFuZ2UoMCwgOSwgMikucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBzdGFydCBBbiBpbnRlZ2VyIHN0YXJ0IHZhbHVlXG4gKiBAcGFyYW0gc3RvcCBBbiBpbnRlZ2VyIHN0b3AgdmFsdWVcbiAqIEBwYXJhbSBzdGVwIEFuIGludGVnZXIgaW5jcmVtZW50ICh3aWxsIGRlZmF1bHQgdG8gMSBvciAtMSlcbiAqIEBwYXJhbSBkdHlwZSBUaGUgZGF0YSB0eXBlIG9mIHRoZSBvdXRwdXQgdGVuc29yLiBEZWZhdWx0cyB0byAnZmxvYXQzMicuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ3JlYXRpb24nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmFuZ2Uoc3RhcnQsIHN0b3AsIHN0ZXAgPSAxLCBkdHlwZSA9ICdmbG9hdDMyJykge1xuICAgIGlmIChzdGVwID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGhhdmUgYSBzdGVwIG9mIHplcm8nKTtcbiAgICB9XG4gICAgY29uc3QgYXR0cnMgPSB7IHN0YXJ0LCBzdG9wLCBzdGVwLCBkdHlwZSB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFJhbmdlLCB7fSAvKiBpbnB1dHMgKi8sIGF0dHJzKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJhbmdlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBSZWFsIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogUmV0dXJucyB0aGUgcmVhbCBwYXJ0IG9mIGEgY29tcGxleCAob3IgcmVhbCkgdGVuc29yLlxuICpcbiAqIEdpdmVuIGEgdGVuc29yIGlucHV0LCB0aGlzIG9wZXJhdGlvbiByZXR1cm5zIGEgdGVuc29yIG9mIHR5cGUgZmxvYXQgdGhhdCBpc1xuICogdGhlIHJlYWwgcGFydCBvZiBlYWNoIGVsZW1lbnQgaW4gaW5wdXQgY29uc2lkZXJlZCBhcyBhIGNvbXBsZXggbnVtYmVyLlxuICpcbiAqIElmIHRoZSBpbnB1dCBpcyByZWFsLCBpdCBzaW1wbHkgbWFrZXMgYSBjbG9uZS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLmNvbXBsZXgoWy0yLjI1LCAzLjI1XSwgWzQuNzUsIDUuNzVdKTtcbiAqIHRmLnJlYWwoeCkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NyZWF0aW9uJ31cbiAqL1xuZnVuY3Rpb24gcmVhbF8oaW5wdXQpIHtcbiAgICBjb25zdCAkaW5wdXQgPSBjb252ZXJ0VG9UZW5zb3IoaW5wdXQsICdpbnB1dCcsICdyZWFsJyk7XG4gICAgY29uc3QgaW5wdXRzID0geyBpbnB1dDogJGlucHV0IH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoUmVhbCwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCByZWFsID0gb3AoeyByZWFsXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlYWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IFJlY2lwcm9jYWwgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyByZWNpcHJvY2FsIG9mIHggZWxlbWVudC13aXNlOiBgMSAvIHhgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMCwgMSwgMl0pO1xuICpcbiAqIHgucmVjaXByb2NhbCgpLnByaW50KCk7ICAvLyBvciB0Zi5yZWNpcHJvY2FsKHgpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMgbWF0aCd9XG4gKi9cbmZ1bmN0aW9uIHJlY2lwcm9jYWxfKHgpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdyZWNpcHJvY2FsJyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFJlY2lwcm9jYWwsIGlucHV0cyk7XG59XG5leHBvcnQgY29uc3QgcmVjaXByb2NhbCA9IG9wKHsgcmVjaXByb2NhbF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZWNpcHJvY2FsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbi8qKlxuICogSW5wdXRzIG9mIHNpemUgYWJvdmUgdGhpcyB0aHJlc2hvbGQgd2lsbCBiZSBwYXJhbGxlbGl6ZWQgYnkgY2FsbGluZyBtdWx0aXBsZVxuICogc2hhZGVyIHByb2dyYW1zLlxuICovXG5pbXBvcnQgeyBuZWFyZXN0RGl2aXNvciB9IGZyb20gJy4uL3V0aWwnO1xuZXhwb3J0IGNvbnN0IFBBUkFMTEVMSVpFX1RIUkVTSE9MRCA9IDMwO1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVPcHRpbWFsV2luZG93U2l6ZShpblNpemUpIHtcbiAgICBpZiAoaW5TaXplIDw9IFBBUkFMTEVMSVpFX1RIUkVTSE9MRCkge1xuICAgICAgICByZXR1cm4gaW5TaXplO1xuICAgIH1cbiAgICByZXR1cm4gbmVhcmVzdERpdmlzb3IoaW5TaXplLCBNYXRoLmZsb29yKE1hdGguc3FydChpblNpemUpKSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZWR1Y2VfdXRpbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgUmVsdSB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENvbXB1dGVzIHJlY3RpZmllZCBsaW5lYXIgZWxlbWVudC13aXNlOiBgbWF4KHgsIDApYC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFstMSwgMiwgLTMsIDRdKTtcbiAqXG4gKiB4LnJlbHUoKS5wcmludCgpOyAgLy8gb3IgdGYucmVsdSh4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLiBJZiB0aGUgZHR5cGUgaXMgYGJvb2xgLCB0aGUgb3V0cHV0IGR0eXBlIHdpbGwgYmVcbiAqICAgICBgaW50MzInLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiByZWx1Xyh4KSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAncmVsdScpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChSZWx1LCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IHJlbHUgPSBvcCh7IHJlbHVfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVsdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgUmVsdTYgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyByZWN0aWZpZWQgbGluZWFyIDYgZWxlbWVudC13aXNlOiBgbWluKG1heCh4LCAwKSwgNilgLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWy0xLCAyLCAtMywgOF0pO1xuICpcbiAqIHgucmVsdTYoKS5wcmludCgpOyAgLy8gb3IgdGYucmVsdTYoeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci4gSWYgdGhlIGR0eXBlIGlzIGBib29sYCwgdGhlIG91dHB1dCBkdHlwZSB3aWxsIGJlXG4gKiAgICAgYGludDMyJy5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gcmVsdTZfKHgpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdyZWx1NicpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChSZWx1NiwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCByZWx1NiA9IG9wKHsgcmVsdTZfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVsdTYuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IFJlc2hhcGUgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBSZXNoYXBlcyBhIGB0Zi5UZW5zb3JgIHRvIGEgZ2l2ZW4gc2hhcGUuXG4gKlxuICogR2l2ZW4gYW4gaW5wdXQgdGVuc29yLCByZXR1cm5zIGEgbmV3IHRlbnNvciB3aXRoIHRoZSBzYW1lIHZhbHVlcyBhcyB0aGVcbiAqIGlucHV0IHRlbnNvciB3aXRoIHNoYXBlIGBzaGFwZWAuXG4gKlxuICogSWYgb25lIGNvbXBvbmVudCBvZiBzaGFwZSBpcyB0aGUgc3BlY2lhbCB2YWx1ZSAtMSwgdGhlIHNpemUgb2YgdGhhdFxuICogZGltZW5zaW9uIGlzIGNvbXB1dGVkIHNvIHRoYXQgdGhlIHRvdGFsIHNpemUgcmVtYWlucyBjb25zdGFudC4gSW5cbiAqIHBhcnRpY3VsYXIsIGEgc2hhcGUgb2YgWy0xXSBmbGF0dGVucyBpbnRvIDEtRC4gQXQgbW9zdCBvbmUgY29tcG9uZW50IG9mXG4gKiBzaGFwZSBjYW4gYmUgLTEuXG4gKlxuICogSWYgc2hhcGUgaXMgMS1EIG9yIGhpZ2hlciwgdGhlbiB0aGUgb3BlcmF0aW9uIHJldHVybnMgYSB0ZW5zb3Igd2l0aCBzaGFwZVxuICogc2hhcGUgZmlsbGVkIHdpdGggdGhlIHZhbHVlcyBvZiB0ZW5zb3IuIEluIHRoaXMgY2FzZSwgdGhlIG51bWJlciBvZlxuICogZWxlbWVudHMgaW1wbGllZCBieSBzaGFwZSBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW5cbiAqIHRlbnNvci5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzLCA0XSk7XG4gKiB4LnJlc2hhcGUoWzIsIDJdKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvciB0byBiZSByZXNoYXBlZC5cbiAqIEBwYXJhbSBzaGFwZSBBbiBhcnJheSBvZiBpbnRlZ2VycyBkZWZpbmluZyB0aGUgb3V0cHV0IHRlbnNvciBzaGFwZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdUcmFuc2Zvcm1hdGlvbnMnfVxuICovXG5mdW5jdGlvbiByZXNoYXBlXyh4LCBzaGFwZSkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3Jlc2hhcGUnLCAnc3RyaW5nX29yX251bWVyaWMnKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IHg6ICR4IH07XG4gICAgY29uc3QgYXR0cnMgPSB7IHNoYXBlIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoUmVzaGFwZSwgaW5wdXRzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3QgcmVzaGFwZSA9IG9wKHsgcmVzaGFwZV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZXNoYXBlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBSZXZlcnNlIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogUmV2ZXJzZXMgYSBgdGYuVGVuc29yYCBhbG9uZyBhIHNwZWNpZmllZCBheGlzLlxuICpcbiAqIEFsc28gYXZhaWxhYmxlIGFyZSBzdHJpY3RlciByYW5rLXNwZWNpZmljIG1ldGhvZHMgdGhhdCBhc3NlcnQgdGhhdCBgeGAgaXNcbiAqIG9mIHRoZSBnaXZlbiByYW5rOlxuICogICAtIGB0Zi5yZXZlcnNlMWRgXG4gKiAgIC0gYHRmLnJldmVyc2UyZGBcbiAqICAgLSBgdGYucmV2ZXJzZTNkYFxuICogICAtIGB0Zi5yZXZlcnNlNGRgXG4gKlxuICogRXhjZXB0IGB0Zi5yZXZlcnNlMWRgICh3aGljaCBkb2VzIG5vdCBoYXZlIGF4aXMgcGFyYW0pLCBhbGwgbWV0aG9kcyBoYXZlXG4gKiBzYW1lIHNpZ25hdHVyZSBhcyB0aGlzIG1ldGhvZC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzLCA0XSk7XG4gKlxuICogeC5yZXZlcnNlKCkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMmQoWzEsIDIsIDMsIDRdLCBbMiwgMl0pO1xuICpcbiAqIGNvbnN0IGF4aXMgPSAxO1xuICogeC5yZXZlcnNlKGF4aXMpLnByaW50KCk7XG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IgdG8gYmUgcmV2ZXJzZWQuXG4gKiBAcGFyYW0gYXhpcyBUaGUgc2V0IG9mIGRpbWVuc2lvbnMgdG8gcmV2ZXJzZS4gTXVzdCBiZSBpbiB0aGVcbiAqICAgICByYW5nZSBbLXJhbmsoeCksIHJhbmsoeCkpLiBEZWZhdWx0cyB0byBhbGwgYXhlcy5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdTbGljaW5nIGFuZCBKb2luaW5nJ31cbiAqL1xuZnVuY3Rpb24gcmV2ZXJzZV8oeCwgYXhpcykge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3JldmVyc2UnKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IHg6ICR4IH07XG4gICAgY29uc3QgYXR0cnMgPSB7IGRpbXM6IGF4aXMgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChSZXZlcnNlLCBpbnB1dHMsIGF0dHJzKTtcbn1cbmV4cG9ydCBjb25zdCByZXZlcnNlID0gb3AoeyByZXZlcnNlXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJldmVyc2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHJldmVyc2UgfSBmcm9tICcuL3JldmVyc2UnO1xuLyoqXG4gKiBSZXZlcnNlcyBhIGB0Zi5UZW5zb3IxRGAuXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqL1xuZnVuY3Rpb24gcmV2ZXJzZTFkXyh4KSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAncmV2ZXJzZScpO1xuICAgIHV0aWwuYXNzZXJ0KCR4LnJhbmsgPT09IDEsICgpID0+IGBFcnJvciBpbiByZXZlcnNlMUQ6IHggbXVzdCBiZSByYW5rIDEgYnV0IGdvdCByYW5rICR7JHgucmFua30uYCk7XG4gICAgcmV0dXJuIHJldmVyc2UoJHgsIDApO1xufVxuZXhwb3J0IGNvbnN0IHJldmVyc2UxZCA9IG9wKHsgcmV2ZXJzZTFkXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJldmVyc2VfMWQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHJldmVyc2UgfSBmcm9tICcuL3JldmVyc2UnO1xuLyoqXG4gKiBSZXZlcnNlcyBhIGB0Zi5UZW5zb3IyRGAgYWxvbmcgYSBzcGVjaWZpZWQgYXhpcy5cbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICogQHBhcmFtIGF4aXMgVGhlIHNldCBvZiBkaW1lbnNpb25zIHRvIHJldmVyc2UuIE11c3QgYmUgaW4gdGhlXG4gKiAgICAgcmFuZ2UgWy1yYW5rKHgpLCByYW5rKHgpKS4gRGVmYXVsdHMgdG8gYWxsIGF4ZXMuXG4gKi9cbmZ1bmN0aW9uIHJldmVyc2UyZF8oeCwgYXhpcykge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3JldmVyc2UnKTtcbiAgICB1dGlsLmFzc2VydCgkeC5yYW5rID09PSAyLCAoKSA9PiBgRXJyb3IgaW4gcmV2ZXJzZTJEOiB4IG11c3QgYmUgcmFuayAyIGJ1dCBnb3QgcmFuayAkeyR4LnJhbmt9LmApO1xuICAgIHJldHVybiByZXZlcnNlKCR4LCBheGlzKTtcbn1cbmV4cG9ydCBjb25zdCByZXZlcnNlMmQgPSBvcCh7IHJldmVyc2UyZF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZXZlcnNlXzJkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyByZXZlcnNlIH0gZnJvbSAnLi9yZXZlcnNlJztcbi8qKlxuICogUmV2ZXJzZXMgYSBgdGYuVGVuc29yM0RgIGFsb25nIGEgc3BlY2lmaWVkIGF4aXMuXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqIEBwYXJhbSBheGlzIFRoZSBzZXQgb2YgZGltZW5zaW9ucyB0byByZXZlcnNlLiBNdXN0IGJlIGluIHRoZVxuICogICAgIHJhbmdlIFstcmFuayh4KSwgcmFuayh4KSkuIERlZmF1bHRzIHRvIGFsbCBheGVzLlxuICovXG5mdW5jdGlvbiByZXZlcnNlM2RfKHgsIGF4aXMpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdyZXZlcnNlJyk7XG4gICAgdXRpbC5hc3NlcnQoJHgucmFuayA9PT0gMywgKCkgPT4gYEVycm9yIGluIHJldmVyc2UzRDogeCBtdXN0IGJlIHJhbmsgMyBidXQgZ290IHJhbmsgJHskeC5yYW5rfS5gKTtcbiAgICByZXR1cm4gcmV2ZXJzZSgkeCwgYXhpcyk7XG59XG5leHBvcnQgY29uc3QgcmV2ZXJzZTNkID0gb3AoeyByZXZlcnNlM2RfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmV2ZXJzZV8zZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgcmV2ZXJzZSB9IGZyb20gJy4vcmV2ZXJzZSc7XG4vKipcbiAqIFJldmVyc2VzIGEgYHRmLlRlbnNvcjREYCBhbG9uZyBhIHNwZWNpZmllZCBheGlzLlxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKiBAcGFyYW0gYXhpcyBUaGUgc2V0IG9mIGRpbWVuc2lvbnMgdG8gcmV2ZXJzZS4gTXVzdCBiZSBpbiB0aGVcbiAqICAgICByYW5nZSBbLXJhbmsoeCksIHJhbmsoeCkpLiBEZWZhdWx0cyB0byBhbGwgYXhlcy5cbiAqL1xuZnVuY3Rpb24gcmV2ZXJzZTRkXyh4LCBheGlzKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAncmV2ZXJzZScpO1xuICAgIHV0aWwuYXNzZXJ0KCR4LnJhbmsgPT09IDQsICgpID0+IGBFcnJvciBpbiByZXZlcnNlNEQ6IHggbXVzdCBiZSByYW5rIDQgYnV0IGdvdCByYW5rICR7JHgucmFua30uYCk7XG4gICAgcmV0dXJuIHJldmVyc2UoJHgsIGF4aXMpO1xufVxuZXhwb3J0IGNvbnN0IHJldmVyc2U0ZCA9IG9wKHsgcmV2ZXJzZTRkXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJldmVyc2VfNGQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuLy8gUmV0dXJucyB0aGUgaW1hZ2UgY2VudGVyIGluIHBpeGVscy5cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbWFnZUNlbnRlcihjZW50ZXIsIGltYWdlSGVpZ2h0LCBpbWFnZVdpZHRoKSB7XG4gICAgY29uc3QgY2VudGVyWCA9IGltYWdlV2lkdGggKiAodHlwZW9mIGNlbnRlciA9PT0gJ251bWJlcicgPyBjZW50ZXIgOiBjZW50ZXJbMF0pO1xuICAgIGNvbnN0IGNlbnRlclkgPSBpbWFnZUhlaWdodCAqICh0eXBlb2YgY2VudGVyID09PSAnbnVtYmVyJyA/IGNlbnRlciA6IGNlbnRlclsxXSk7XG4gICAgcmV0dXJuIFtjZW50ZXJYLCBjZW50ZXJZXTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJvdGF0ZV91dGlsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBSb3VuZCB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENvbXB1dGVzIHJvdW5kIG9mIGlucHV0IGB0Zi5UZW5zb3JgIGVsZW1lbnQtd2lzZTogYHJvdW5kKHgpYC5cbiAqIEl0IGltcGxlbWVudHMgYmFua2VyJ3Mgcm91bmRpbmcuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbLjYsIDEuMSwgLTMuM10pO1xuICpcbiAqIHgucm91bmQoKS5wcmludCgpOyAgLy8gb3IgdGYucm91bmQoeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gcm91bmRfKHgpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdyb3VuZCcpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChSb3VuZCwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCByb3VuZCA9IG9wKHsgcm91bmRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cm91bmQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IFJzcXJ0IH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgcmVjaXByb2NhbCBvZiBzcXVhcmUgcm9vdCBvZiB0aGUgaW5wdXQgYHRmLlRlbnNvcmAgZWxlbWVudC13aXNlOlxuICogYHkgPSAxIC8gc3FydCh4KWBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLCAyLCA0LCAtMV0pO1xuICpcbiAqIHgucnNxcnQoKS5wcmludCgpOyAgLy8gb3IgdGYucnNxcnQoeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gcnNxcnRfKHgpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdyc3FydCcpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChSc3FydCwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCByc3FydCA9IG9wKHsgcnNxcnRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cnNxcnQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgaXNUeXBlZEFycmF5IH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBtYWtlVGVuc29yIH0gZnJvbSAnLi90ZW5zb3Jfb3BzX3V0aWwnO1xuLyoqXG4gKiBDcmVhdGVzIHJhbmstMCBgdGYuVGVuc29yYCAoc2NhbGFyKSB3aXRoIHRoZSBwcm92aWRlZCB2YWx1ZSBhbmQgZHR5cGUuXG4gKlxuICogVGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBjYW4gYmUgYWNoaWV2ZWQgd2l0aCBgdGYudGVuc29yYCwgYnV0IGluIGdlbmVyYWxcbiAqIHdlIHJlY29tbWVuZCB1c2luZyBgdGYuc2NhbGFyYCBhcyBpdCBtYWtlcyB0aGUgY29kZSBtb3JlIHJlYWRhYmxlLlxuICpcbiAqIGBgYGpzXG4gKiB0Zi5zY2FsYXIoMy4xNCkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIHNjYWxhci5cbiAqIEBwYXJhbSBkdHlwZSBUaGUgZGF0YSB0eXBlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NyZWF0aW9uJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNjYWxhcih2YWx1ZSwgZHR5cGUpIHtcbiAgICBpZiAoKChpc1R5cGVkQXJyYXkodmFsdWUpICYmIGR0eXBlICE9PSAnc3RyaW5nJykgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkpICYmXG4gICAgICAgIGR0eXBlICE9PSAnY29tcGxleDY0Jykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Vycm9yIGNyZWF0aW5nIGEgbmV3IFNjYWxhcjogdmFsdWUgbXVzdCBiZSBhIHByaW1pdGl2ZSAnICtcbiAgICAgICAgICAgICcobnVtYmVyfGJvb2xlYW58c3RyaW5nKScpO1xuICAgIH1cbiAgICBpZiAoZHR5cGUgPT09ICdzdHJpbmcnICYmIGlzVHlwZWRBcnJheSh2YWx1ZSkgJiZcbiAgICAgICAgISh2YWx1ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignV2hlbiBtYWtpbmcgYSBzY2FsYXIgZnJvbSBlbmNvZGVkIHN0cmluZywgJyArXG4gICAgICAgICAgICAndGhlIHZhbHVlIG11c3QgYmUgYFVpbnQ4QXJyYXlgLicpO1xuICAgIH1cbiAgICBjb25zdCBzaGFwZSA9IFtdO1xuICAgIGNvbnN0IGluZmVycmVkU2hhcGUgPSBbXTtcbiAgICByZXR1cm4gbWFrZVRlbnNvcih2YWx1ZSwgc2hhcGUsIGluZmVycmVkU2hhcGUsIGR0eXBlKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNjYWxhci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgU2NhdHRlck5kIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCAqIGFzIHNjYXR0ZXJfbmRfdXRpbCBmcm9tICcuL3NjYXR0ZXJfbmRfdXRpbCc7XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgdGVuc29yIGJ5IGFwcGx5aW5nIHNwYXJzZSB1cGRhdGVzIHRvIGluZGl2aWR1YWxcbiAqIHZhbHVlcyBvciBzbGljZXMgd2l0aGluIGEgemVybyB0ZW5zb3Igb2YgdGhlIGdpdmVuIHNoYXBlIHRlbnNvciBhY2NvcmRpbmcgdG9cbiAqIGluZGljZXMuIFRoaXMgb3BlcmF0b3IgaXMgdGhlIGludmVyc2Ugb2YgdGhlIGB0Zi5nYXRoZXJORGAgb3BlcmF0b3Igd2hpY2hcbiAqIGV4dHJhY3RzIHZhbHVlcyBvciBzbGljZXMgZnJvbSBhIGdpdmVuIHRlbnNvci5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgaW5kaWNlcyA9IHRmLnRlbnNvcjJkKFs0LCAzLCAxLCA3XSwgWzQsIDFdLCAnaW50MzInKTtcbiAqIGNvbnN0IHVwZGF0ZXMgPSB0Zi50ZW5zb3IxZChbOSwgMTAsIDExLCAxMl0pO1xuICogY29uc3Qgc2hhcGUgPSBbOF07XG4gKiB0Zi5zY2F0dGVyTkQoaW5kaWNlcywgdXBkYXRlcywgc2hhcGUpLnByaW50KCkgLy9bMCwgMTEsIDAsIDEwLCA5LCAwLCAwLCAxMl1cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBpbmRpY2VzIFRoZSB0ZW5zb3IgY29udGFpbnMgdGhlIGluZGljZXMgaW50byB0aGUgb3V0cHV0IHRlbnNvci5cbiAqIEBwYXJhbSB1cGRhdGVzIFRoZSB0ZW5zb3IgY29udGFpbnMgdGhlIHZhbHVlIGZvciB0aGUgaW5kaWNlcy5cbiAqIEBwYXJhbSBzaGFwZTogVGhlIHNoYXBlIG9mIHRoZSBvdXRwdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ1NsaWNpbmcgYW5kIEpvaW5pbmcnfVxuICovXG5mdW5jdGlvbiBzY2F0dGVyTkRfKGluZGljZXMsIHVwZGF0ZXMsIHNoYXBlKSB7XG4gICAgY29uc3QgJGluZGljZXMgPSBjb252ZXJ0VG9UZW5zb3IoaW5kaWNlcywgJ2luZGljZXMnLCAnc2NhdHRlck5EJywgJ2ludDMyJyk7XG4gICAgY29uc3QgJHVwZGF0ZXMgPSBjb252ZXJ0VG9UZW5zb3IodXBkYXRlcywgJ3VwZGF0ZXMnLCAnc2NhdHRlck5EJyk7XG4gICAgc2NhdHRlcl9uZF91dGlsLnZhbGlkYXRlSW5wdXQoJHVwZGF0ZXMsICRpbmRpY2VzLCBzaGFwZSk7XG4gICAgY29uc3QgaW5wdXRzID0geyBpbmRpY2VzOiAkaW5kaWNlcywgdXBkYXRlczogJHVwZGF0ZXMgfTtcbiAgICBjb25zdCBhdHRycyA9IHsgc2hhcGUgfTtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoU2NhdHRlck5kLCBpbnB1dHMsIGF0dHJzKTtcbn1cbmV4cG9ydCBjb25zdCBzY2F0dGVyTkQgPSBvcCh7IHNjYXR0ZXJORF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zY2F0dGVyX25kLmpzLm1hcCIsImltcG9ydCB7IGNvbXB1dGVTdHJpZGVzLCBzaXplRnJvbVNoYXBlIH0gZnJvbSAnLi4vdXRpbCc7XG4vKipcbiAqIENoZWNrIHdoZXRoZXIgdXBkYXRlcy5zaGFwZSA9IGluZGljZXMuc2hhcGVbOmJhdGNoRGltXSArXG4gKiBzaGFwZVtzbGljZURpbTpdXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlVXBkYXRlU2hhcGUoc2hhcGUsIGluZGljZXMsIHVwZGF0ZXMpIHtcbiAgICBjb25zdCBzbGljZURpbSA9IChpbmRpY2VzLnJhbmsgPiAxKSA/IGluZGljZXMuc2hhcGVbaW5kaWNlcy5yYW5rIC0gMV0gOiAxO1xuICAgIGNvbnN0IGJhdGNoRGltID0gKGluZGljZXMucmFuayA+IDEpID8gaW5kaWNlcy5yYW5rIC0gMSA6IDE7XG4gICAgY29uc3Qgc2hhcGVFcnJvciA9ICdNdXN0IGhhdmUgdXBkYXRlcy5zaGFwZSA9IGluZGljZXMuc2hhcGVbOmJhdGNoRGltXSArICcgK1xuICAgICAgICBgc2hhcGVbc2xpY2VEaW06XSwgZ290IHVwZGF0ZXMuc2hhcGU6ICR7dXBkYXRlcy5zaGFwZX1gICtcbiAgICAgICAgYCwgaW5kaWNlcy5zaGFwZTogJHtpbmRpY2VzLnNoYXBlfSwgc2hhcGU6ICR7c2hhcGV9YCArXG4gICAgICAgIGAsIHNsaWNlRGltOiAke3NsaWNlRGltfSwgYW5kIGJhdGNoRGltOiAke2JhdGNoRGltfS5gO1xuICAgIGlmICh1cGRhdGVzLnJhbmsgPCBiYXRjaERpbSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3Ioc2hhcGVFcnJvciArIGAgdXBkYXRlLnJhbmsgPCAke2JhdGNoRGltfS4gYCk7XG4gICAgfVxuICAgIGlmIChzaGFwZS5sZW5ndGggPCBzbGljZURpbSArICh1cGRhdGVzLnJhbmsgLSBiYXRjaERpbSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHNoYXBlRXJyb3IgK1xuICAgICAgICAgICAgYCBPdXRwdXQgc2hhcGUgbGVuZ3RoIDwgJHtzbGljZURpbSArICh1cGRhdGVzLnJhbmsgLSBiYXRjaERpbSl9YCk7XG4gICAgfVxuICAgIGlmICh1cGRhdGVzLnJhbmsgIT09IGJhdGNoRGltICsgc2hhcGUubGVuZ3RoIC0gc2xpY2VEaW0pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHNoYXBlRXJyb3IgKyBgIHVwZGF0ZS5yYW5rICE9ICR7YmF0Y2hEaW0gKyBzaGFwZS5sZW5ndGggLSBzbGljZURpbX1gKTtcbiAgICB9XG4gICAgZm9yIChsZXQgZCA9IDA7IGQgPCBiYXRjaERpbTsgKytkKSB7XG4gICAgICAgIGlmICh1cGRhdGVzLnNoYXBlW2RdICE9PSBpbmRpY2VzLnNoYXBlW2RdKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3Ioc2hhcGVFcnJvciArXG4gICAgICAgICAgICAgICAgYCB1cGRhdGVzLnNoYXBlWyR7ZH1dICgke3VwZGF0ZXMuc2hhcGVbZF19KSAhPSBpbmRpY2VzLnNoYXBlWyR7ZH1dICgke2luZGljZXMuc2hhcGVbZF19KS5gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGxldCBkID0gMDsgZCA8IHVwZGF0ZXMucmFuayAtIGJhdGNoRGltOyArK2QpIHtcbiAgICAgICAgaWYgKHVwZGF0ZXMuc2hhcGVbZCArIGJhdGNoRGltXSAhPT0gc2hhcGVbZCArIHNsaWNlRGltXSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHNoYXBlRXJyb3IgK1xuICAgICAgICAgICAgICAgIGAgdXBkYXRlcy5zaGFwZVske2QgKyBiYXRjaERpbX1dICgke3VwZGF0ZXMuc2hhcGVbZCArIGJhdGNoRGltXX0pICE9IHNoYXBlWyR7ZCArIGJhdGNoRGltfV0gKCR7c2hhcGVbZCArIGJhdGNoRGltXX0pYCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIFZhbGlkYXRlIHNjYXR0ZXIgbmQgaW5wdXRzLlxuICpcbiAqIEBwYXJhbSB1cGRhdGUgVGhlIHRlbnNvciBjb250YWlucyB0aGUgdXBkYXRlIHZhbHVlcy5cbiAqIEBwYXJhbSBpbmRpY2VzIFRoZSB0ZW5zb3IgY29udGFpbnMgdGhlIGluZGljZXMgZm9yIHRoZSB1cGRhdGUgdmFsdWVzLlxuICogQHBhcmFtIHNoYXBlIFRoZSBzaGFwZSBvZiB0aGUgb3V0cHV0IHRlbnNvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlSW5wdXQodXBkYXRlcywgaW5kaWNlcywgc2hhcGUpIHtcbiAgICBpZiAoaW5kaWNlcy5yYW5rIDwgMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RmLnNjYXR0ZXJORCgpIGV4cGVjdHMgdGhlIGluZGljZXMgdG8gYmUgcmFuayAxIG9yIGhpZ2hlciwnICtcbiAgICAgICAgICAgIGAgYnV0IHRoZSByYW5rIHdhcyAke2luZGljZXMucmFua30uYCk7XG4gICAgfVxuICAgIGlmICh1cGRhdGVzLnJhbmsgPCAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndGYuc2NhdHRlck5EKCkgZXhwZWN0cyB0aGUgdXBkYXRlcyB0byBiZSByYW5rIDEgb3IgaGlnaGVyLCcgK1xuICAgICAgICAgICAgYCBidXQgdGhlIHJhbmsgd2FzICR7dXBkYXRlcy5yYW5rfS5gKTtcbiAgICB9XG4gICAgaWYgKGluZGljZXMuZHR5cGUgIT09ICdpbnQzMicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgZHR5cGUgb2YgJ2luZGljZXMnIHNob3VsZCBiZSBpbnQzMiwgYnV0IGdvdCBkdHlwZTogJHtpbmRpY2VzLmR0eXBlfWApO1xuICAgIH1cbiAgICBpZiAoc2hhcGUubGVuZ3RoIDwgMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE91dHB1dCByYW5rIG11c3QgYmUgZ3JlYXRlciBvciBlcXVhbCB0byAxLCBidXQgZ290IHNoYXBlOiAke3NoYXBlfWApO1xuICAgIH1cbiAgICBpZiAoc2hhcGUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGlmIChpbmRpY2VzLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW5kaWNlcyBzcGVjaWZpZWQgZm9yIGVtcHR5IG91dHB1dC4gaW5kaWNlcyBzaGFwZTogJHtpbmRpY2VzLnNoYXBlfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1cGRhdGVzLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVXBkYXRlcyBzcGVjaWZpZWQgZm9yIGVtcHR5IG91dHB1dC4gdXBkYXRlcyBzaGFwZTogJHt1cGRhdGVzLnNoYXBlfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZhbGlkYXRlVXBkYXRlU2hhcGUoc2hhcGUsIGluZGljZXMsIHVwZGF0ZXMpO1xufVxuLyoqXG4gKiBDYWxjdWxhdGUgdGhlIHNoYXBlIGluZm9ybWF0aW9uIGZvciB0aGUgb3V0cHV0LlxuICpcbiAqIEBwYXJhbSB1cGRhdGUgVGhlIHRlbnNvciBjb250YWlucyB0aGUgdXBkYXRlIHZhbHVlcy5cbiAqIEBwYXJhbSBpbmRpY2VzIFRoZSB0ZW5zb3IgY29udGFpbnMgdGhlIGluZGljZXMgZm9yIHRoZSB1cGRhdGUgdmFsdWVzLlxuICogQHBhcmFtIHNoYXBlIFRoZSBzaGFwZSBvZiB0aGUgb3V0cHV0IHRlbnNvci5cbiAqXG4gKiBAcmV0dXJucyBTY2F0dGVyU2hhcGVJbmZvXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVTaGFwZXModXBkYXRlcywgaW5kaWNlcywgc2hhcGUpIHtcbiAgICAvLyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBkaW1lbnNpb25zIGluIGluZGljZXNcbiAgICBjb25zdCBpbmRpY2VzUmFuayA9IGluZGljZXMuc2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IHNsaWNlUmFuayA9IChpbmRpY2VzUmFuayA+IDEpID8gaW5kaWNlcy5zaGFwZVtpbmRpY2VzUmFuayAtIDFdIDogMTtcbiAgICAvLyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBlbGVtZW50cyB0aGF0IG1ha2UgdXAgZWFjaCBzbGljZSBvZiBvdXIgdXBkYXRlZFxuICAgIC8vIHRlbnNvci4gVGhpcyBhbGxvd3MgdXMgdG8gd29yayB3aXRoIGZsYXR0ZW5lZCB0ZW5zb3JzIGFuZCBjb3B5IG92ZXIgd2hvbGVcbiAgICAvLyBzbGljZXMgYXQgYSB0aW1lLlxuICAgIGNvbnN0IHRvdGFsTmQgPSBzaGFwZS5sZW5ndGg7XG4gICAgbGV0IHNsaWNlU2l6ZSA9IDE7XG4gICAgZm9yIChsZXQgaSA9IHNsaWNlUmFuazsgaSA8IHRvdGFsTmQ7ICsraSkge1xuICAgICAgICBzbGljZVNpemUgKj0gc2hhcGVbaV07XG4gICAgfVxuICAgIGNvbnN0IHNhZmVTbGljZURpbSA9IChzbGljZVJhbmsgPCAxKSA/IDEgOiBzbGljZVJhbms7XG4gICAgY29uc3QgbnVtVXBkYXRlcyA9IHNpemVGcm9tU2hhcGUoaW5kaWNlcy5zaGFwZSkgLyBzYWZlU2xpY2VEaW07XG4gICAgY29uc3Qgc3RyaWRlcyA9IFsuLi5jb21wdXRlU3RyaWRlcyhzaGFwZS5zbGljZSgwLCBzbGljZVJhbmspKSwgMV07XG4gICAgY29uc3Qgb3V0cHV0U2l6ZSA9IHNpemVGcm9tU2hhcGUoc2hhcGUpO1xuICAgIHJldHVybiB7IHNsaWNlUmFuaywgbnVtVXBkYXRlcywgc2xpY2VTaXplLCBzdHJpZGVzLCBvdXRwdXRTaXplIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zY2F0dGVyX25kX3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgbmVhcmVzdERpdmlzb3IgfSBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IFBBUkFMTEVMSVpFX1RIUkVTSE9MRCB9IGZyb20gJy4vcmVkdWNlX3V0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIHNlZ09wQ29tcHV0ZU9wdGltYWxXaW5kb3dTaXplKGluU2l6ZSwgbnVtU2VnbWVudHMpIHtcbiAgICBsZXQgZG9uZSA9IGZhbHNlO1xuICAgIGxldCByZXM7XG4gICAgaWYgKGluU2l6ZSA8PSBQQVJBTExFTElaRV9USFJFU0hPTEQpIHtcbiAgICAgICAgcmVzID0gaW5TaXplO1xuICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJlcyA9IG5lYXJlc3REaXZpc29yKGluU2l6ZSwgTWF0aC5mbG9vcihNYXRoLnNxcnQoaW5TaXplKSkpO1xuICAgIH1cbiAgICB3aGlsZSAoIWRvbmUpIHtcbiAgICAgICAgaWYgKHJlcyA+IG51bVNlZ21lbnRzIHx8IHJlcyA9PT0gaW5TaXplKSB7XG4gICAgICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlcyA9IG5lYXJlc3REaXZpc29yKGluU2l6ZSwgcmVzICsgMSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlT3V0U2hhcGUoYVNoYXBlLCBheGlzLCBudW1TZWdtZW50cykge1xuICAgIGNvbnN0IG91dFNoYXBlID0gW107XG4gICAgY29uc3QgcmFuayA9IGFTaGFwZS5sZW5ndGg7XG4gICAgZm9yIChsZXQgZGltID0gMDsgZGltIDwgcmFuazsgZGltKyspIHtcbiAgICAgICAgaWYgKGRpbSAhPT0gYXhpcykge1xuICAgICAgICAgICAgb3V0U2hhcGUucHVzaChhU2hhcGVbZGltXSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvdXRTaGFwZS5wdXNoKG51bVNlZ21lbnRzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3V0U2hhcGU7XG59XG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdEdhdGhlck9wU2hhcGVJbmZvKHgsIGluZGljZXMsIGF4aXMsIGJhdGNoRGltcykge1xuICAgIGNvbnN0IGluZGljZXNSYW5rID0gaW5kaWNlcy5zaGFwZS5sZW5ndGg7XG4gICAgY29uc3QgeFJhbmsgPSB4LnNoYXBlLmxlbmd0aDtcbiAgICBpZiAoYmF0Y2hEaW1zICE9PSAwKSB7XG4gICAgICAgIGlmIChiYXRjaERpbXMgPCAtaW5kaWNlc1JhbmsgfHwgYmF0Y2hEaW1zID4gaW5kaWNlc1JhbmspIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0IGJhdGNoRGltcyBpbiB0aGUgcmFuZ2Ugb2YgWy0ke2luZGljZXNSYW5rfSwgJHtpbmRpY2VzUmFua31dLCBidXQgZ290ICR7YmF0Y2hEaW1zfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChiYXRjaERpbXMgPCAwKSB7XG4gICAgICAgIGJhdGNoRGltcyArPSBpbmRpY2VzUmFuaztcbiAgICB9XG4gICAgaWYgKGJhdGNoRGltcyA+IHhSYW5rKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgYmF0Y2hEaW1zICgke2JhdGNoRGltc30pIG11c3QgYmUgbGVzcyB0aGFuIHJhbmsoeCkgKFxuICAgICR7eFJhbmt9KS5gKTtcbiAgICB9XG4gICAgaWYgKGF4aXMgPCBiYXRjaERpbXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBiYXRjaERpbXMgKCR7YmF0Y2hEaW1zfSkgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYXhpcyAoJHtheGlzfSkuYCk7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmF0Y2hEaW1zOyArK2kpIHtcbiAgICAgICAgaWYgKHguc2hhcGVbaV0gIT09IGluZGljZXMuc2hhcGVbaV0pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgeC5zaGFwZVske2l9XTogJHt4LnNoYXBlW2ldfSBzaG91bGQgYmUgZXF1YWwgdG8gaW5kaWNlcy5zaGFwZVske2l9XTogJHtpbmRpY2VzLnNoYXBlW2ldfS5gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBkaW1TaXplID0geC5zaGFwZVtheGlzXTtcbiAgICBjb25zdCBvdXRwdXRTaGFwZSA9IFtdO1xuICAgIGxldCBiYXRjaFNpemUgPSAxO1xuICAgIGxldCBvdXRlclNpemUgPSAxO1xuICAgIGxldCBzbGljZVNpemUgPSAxO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmF0Y2hEaW1zOyArK2kpIHtcbiAgICAgICAgb3V0cHV0U2hhcGUucHVzaCh4LnNoYXBlW2ldKTtcbiAgICAgICAgYmF0Y2hTaXplICo9IHguc2hhcGVbaV07XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSBiYXRjaERpbXM7IGkgPCBheGlzOyBpKyspIHtcbiAgICAgICAgb3V0cHV0U2hhcGUucHVzaCh4LnNoYXBlW2ldKTtcbiAgICAgICAgb3V0ZXJTaXplICo9IHguc2hhcGVbaV07XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSBiYXRjaERpbXM7IGkgPCBpbmRpY2VzUmFuazsgaSsrKSB7XG4gICAgICAgIG91dHB1dFNoYXBlLnB1c2goaW5kaWNlcy5zaGFwZVtpXSk7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSBheGlzICsgMTsgaSA8IHhSYW5rOyBpKyspIHtcbiAgICAgICAgb3V0cHV0U2hhcGUucHVzaCh4LnNoYXBlW2ldKTtcbiAgICAgICAgc2xpY2VTaXplICo9IHguc2hhcGVbaV07XG4gICAgfVxuICAgIHJldHVybiB7IGJhdGNoU2l6ZSwgc2xpY2VTaXplLCBvdXRlclNpemUsIGRpbVNpemUsIG91dHB1dFNoYXBlIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zZWdtZW50X3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IFNlbHUgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyBzY2FsZWQgZXhwb25lbnRpYWwgbGluZWFyIGVsZW1lbnQtd2lzZS5cbiAqXG4gKiBgeCA8IDAgPyBzY2FsZSAqIGFscGhhICogKGV4cCh4KSAtIDEpIDogeGBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFstMSwgMiwgLTMsIDRdKTtcbiAqXG4gKiB4LnNlbHUoKS5wcmludCgpOyAgLy8gb3IgdGYuc2VsdSh4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiBzZWx1Xyh4KSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnc2VsdScpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChTZWx1LCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IHNlbHUgPSBvcCh7IHNlbHVfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2VsdS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5leHBvcnQgY29uc3QgU0VMVV9TQ0FMRUFMUEhBID0gMS43NTgwOTkzNDA4NDczNzY4NTk5NDAyMTc1MjA4MTIzO1xuZXhwb3J0IGNvbnN0IFNFTFVfU0NBTEUgPSAxLjA1MDcwMDk4NzM1NTQ4MDQ5MzQxOTMzNDk4NTI5NDY7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zZWx1X3V0aWwuanMubWFwIiwiaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBjb252MmQgfSBmcm9tICcuL2NvbnYyZCc7XG5pbXBvcnQgeyBkZXB0aHdpc2VDb252MmQgfSBmcm9tICcuL2RlcHRod2lzZV9jb252MmQnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9yZXNoYXBlJztcbi8qKlxuICogMi1EIGNvbnZvbHV0aW9uIHdpdGggc2VwYXJhYmxlIGZpbHRlcnMuXG4gKlxuICogUGVyZm9ybXMgYSBkZXB0aHdpc2UgY29udm9sdXRpb24gdGhhdCBhY3RzIHNlcGFyYXRlbHkgb24gY2hhbm5lbHMgZm9sbG93ZWRcbiAqIGJ5IGEgcG9pbnR3aXNlIGNvbnZvbHV0aW9uIHRoYXQgbWl4ZXMgY2hhbm5lbHMuIE5vdGUgdGhhdCB0aGlzIGlzXG4gKiBzZXBhcmFiaWxpdHkgYmV0d2VlbiBkaW1lbnNpb25zIFsxLCAyXSBhbmQgMywgbm90IHNwYXRpYWwgc2VwYXJhYmlsaXR5XG4gKiBiZXR3ZWVuIGRpbWVuc2lvbnMgMSBhbmQgMi5cbiAqXG4gKiBTZWVcbiAqIFtodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvbm4vc2VwYXJhYmxlX2NvbnYyZF0oXG4gKiAgICAgaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL3NlcGFyYWJsZV9jb252MmQpXG4gKiBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IsIG9mIHJhbmsgNCBvciByYW5rIDMsIG9mIHNoYXBlXG4gKiAgICAgYFtiYXRjaCwgaGVpZ2h0LCB3aWR0aCwgaW5DaGFubmVsc11gLiBJZiByYW5rIDMsIGJhdGNoIG9mIDEgaXNcbiAqIGFzc3VtZWQuXG4gKiBAcGFyYW0gZGVwdGh3aXNlRmlsdGVyIFRoZSBkZXB0aHdpc2UgZmlsdGVyIHRlbnNvciwgcmFuayA0LCBvZiBzaGFwZVxuICogICAgIGBbZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgaW5DaGFubmVscywgY2hhbm5lbE11bHRpcGxpZXJdYC4gVGhpcyBpc1xuICogICAgIHRoZSBmaWx0ZXIgdXNlZCBpbiB0aGUgZmlyc3Qgc3RlcC5cbiAqIEBwYXJhbSBwb2ludHdpc2VGaWx0ZXIgVGhlIHBvaW50d2lzZSBmaWx0ZXIgdGVuc29yLCByYW5rIDQsIG9mIHNoYXBlXG4gKiAgICAgYFsxLCAxLCBpbkNoYW5uZWxzICogY2hhbm5lbE11bHRpcGxpZXIsIG91dENoYW5uZWxzXWAuIFRoaXMgaXNcbiAqICAgICB0aGUgZmlsdGVyIHVzZWQgaW4gdGhlIHNlY29uZCBzdGVwLlxuICogQHBhcmFtIHN0cmlkZXMgVGhlIHN0cmlkZXMgb2YgdGhlIGNvbnZvbHV0aW9uOiBgW3N0cmlkZUhlaWdodCxcbiAqIHN0cmlkZVdpZHRoXWAuIElmIHN0cmlkZXMgaXMgYSBzaW5nbGUgbnVtYmVyLCB0aGVuIGBzdHJpZGVIZWlnaHQgPT1cbiAqIHN0cmlkZVdpZHRoYC5cbiAqIEBwYXJhbSBwYWQgVGhlIHR5cGUgb2YgcGFkZGluZyBhbGdvcml0aG0uXG4gKiAgIC0gYHNhbWVgIGFuZCBzdHJpZGUgMTogb3V0cHV0IHdpbGwgYmUgb2Ygc2FtZSBzaXplIGFzIGlucHV0LFxuICogICAgICAgcmVnYXJkbGVzcyBvZiBmaWx0ZXIgc2l6ZS5cbiAqICAgLSBgdmFsaWRgOiBvdXRwdXQgd2lsbCBiZSBzbWFsbGVyIHRoYW4gaW5wdXQgaWYgZmlsdGVyIGlzIGxhcmdlclxuICogICAgICAgdGhhbiAxeDEuXG4gKiAgIC0gRm9yIG1vcmUgaW5mbywgc2VlIHRoaXMgZ3VpZGU6XG4gKiAgICAgW2h0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9jb252b2x1dGlvbl0oXG4gKiAgICAgICAgICBodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvbm4vY29udm9sdXRpb24pXG4gKiBAcGFyYW0gZGlsYXRpb25zIFRoZSBkaWxhdGlvbiByYXRlczogYFtkaWxhdGlvbkhlaWdodCwgZGlsYXRpb25XaWR0aF1gXG4gKiAgICAgaW4gd2hpY2ggd2Ugc2FtcGxlIGlucHV0IHZhbHVlcyBhY3Jvc3MgdGhlIGhlaWdodCBhbmQgd2lkdGggZGltZW5zaW9uc1xuICogICAgIGluIGF0cm91cyBjb252b2x1dGlvbi4gRGVmYXVsdHMgdG8gYFsxLCAxXWAuIElmIGByYXRlYCBpcyBhIHNpbmdsZVxuICogICAgIG51bWJlciwgdGhlbiBgZGlsYXRpb25IZWlnaHQgPT0gZGlsYXRpb25XaWR0aGAuIElmIGl0IGlzIGdyZWF0ZXIgdGhhblxuICogICAgIDEsIHRoZW4gYWxsIHZhbHVlcyBvZiBgc3RyaWRlc2AgbXVzdCBiZSAxLlxuICogQHBhcmFtIGRhdGFGb3JtYXQ6IEFuIG9wdGlvbmFsIHN0cmluZyBmcm9tOiBcIk5IV0NcIiwgXCJOQ0hXXCIuIERlZmF1bHRzIHRvXG4gKiAgICAgXCJOSFdDXCIuIFNwZWNpZnkgdGhlIGRhdGEgZm9ybWF0IG9mIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGRhdGEuIFdpdGggdGhlXG4gKiAgICAgZGVmYXVsdCBmb3JtYXQgXCJOSFdDXCIsIHRoZSBkYXRhIGlzIHN0b3JlZCBpbiB0aGUgb3JkZXIgb2Y6IFtiYXRjaCxcbiAqICAgICBoZWlnaHQsIHdpZHRoLCBjaGFubmVsc10uIE9ubHkgXCJOSFdDXCIgaXMgY3VycmVudGx5IHN1cHBvcnRlZC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdDb252b2x1dGlvbid9XG4gKi9cbmZ1bmN0aW9uIHNlcGFyYWJsZUNvbnYyZF8oeCwgZGVwdGh3aXNlRmlsdGVyLCBwb2ludHdpc2VGaWx0ZXIsIHN0cmlkZXMsIHBhZCwgZGlsYXRpb24gPSBbMSwgMV0sIGRhdGFGb3JtYXQgPSAnTkhXQycpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdzZXBhcmFibGVDb252MmQnKTtcbiAgICBjb25zdCAkZGVwdGh3aXNlRmlsdGVyID0gY29udmVydFRvVGVuc29yKGRlcHRod2lzZUZpbHRlciwgJ2RlcHRod2lzZUZpbHRlcicsICdzZXBhcmFibGVDb252MmQnKTtcbiAgICBjb25zdCAkcG9pbnR3aXNlRmlsdGVyID0gY29udmVydFRvVGVuc29yKHBvaW50d2lzZUZpbHRlciwgJ3BvaW50d2lzZUZpbHRlcicsICdzZXBhcmFibGVDb252MmQnKTtcbiAgICBsZXQgeDREID0gJHg7XG4gICAgbGV0IHJlc2hhcGVkVG80RCA9IGZhbHNlO1xuICAgIGlmICgkeC5yYW5rID09PSAzKSB7XG4gICAgICAgIHJlc2hhcGVkVG80RCA9IHRydWU7XG4gICAgICAgIHg0RCA9IHJlc2hhcGUoJHgsIFsxLCAkeC5zaGFwZVswXSwgJHguc2hhcGVbMV0sICR4LnNoYXBlWzJdXSk7XG4gICAgfVxuICAgIGlmIChkYXRhRm9ybWF0ID09PSAnTkNIVycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzZXBhcmFibGVDb252MmQgY3VycmVudGx5IGRvZXMgbm90IHN1cHBvcnQgZGF0YUZvcm1hdCBOQ0hXOyBvbmx5ICcgK1xuICAgICAgICAgICAgJ05IV0MgaXMgc3VwcG9ydGVkJyk7XG4gICAgfVxuICAgIHV0aWwuYXNzZXJ0KHg0RC5yYW5rID09PSA0LCAoKSA9PiBgRXJyb3IgaW4gc2VwYXJhYmxlQ29udjJkOiBpbnB1dCBtdXN0IGJlIHJhbmsgNCwgYnV0IGdvdCBgICtcbiAgICAgICAgYHJhbmsgJHt4NEQucmFua30uYCk7XG4gICAgdXRpbC5hc3NlcnQoJGRlcHRod2lzZUZpbHRlci5yYW5rID09PSA0LCAoKSA9PiBgRXJyb3IgaW4gc2VwYXJhYmxlQ29udjJkOiBkZXB0aHdpc2UgZmlsdGVyIG11c3QgYmUgcmFuayA0LCBidXQgYCArXG4gICAgICAgIGBnb3QgcmFuayAkeyRkZXB0aHdpc2VGaWx0ZXIucmFua30uYCk7XG4gICAgdXRpbC5hc3NlcnQoJHBvaW50d2lzZUZpbHRlci5yYW5rID09PSA0LCAoKSA9PiBgRXJyb3IgaW4gc2VwYXJhYmxlQ29udjJkOiBwb2ludHdpc2UgZmlsdGVyIG11c3QgYmUgcmFuayA0LCBidXQgYCArXG4gICAgICAgIGBnb3QgcmFuayAkeyRkZXB0aHdpc2VGaWx0ZXIucmFua30uYCk7XG4gICAgdXRpbC5hc3NlcnQoJHBvaW50d2lzZUZpbHRlci5zaGFwZVswXSA9PT0gMSwgKCkgPT4gYEVycm9yIGluIHNlcGFyYWJsZUNvbnYyZDogdGhlIGZpcnN0IGRpbWVuc2lvbiBvZiBwb2ludHdpc2UgZmlsdGVyIGAgK1xuICAgICAgICBgIG11c3QgYmUgMSwgYnV0IGdvdCAkeyRwb2ludHdpc2VGaWx0ZXIuc2hhcGVbMF19LmApO1xuICAgIHV0aWwuYXNzZXJ0KCRwb2ludHdpc2VGaWx0ZXIuc2hhcGVbMV0gPT09IDEsICgpID0+IGBFcnJvciBpbiBzZXBhcmFibGVDb252MmQ6IHRoZSBzZWNvbmQgZGltZW5zaW9uIG9mIHBvaW50d2lzZSBgICtcbiAgICAgICAgYGZpbHRlciBtdXN0IGJlIDEsIGJ1dCBnb3QgJHskcG9pbnR3aXNlRmlsdGVyLnNoYXBlWzFdfS5gKTtcbiAgICBjb25zdCBpbkNoYW5uZWxzID0gJGRlcHRod2lzZUZpbHRlci5zaGFwZVsyXTtcbiAgICBjb25zdCBjaGFubmVsTXVsdGlwbGllciA9ICRkZXB0aHdpc2VGaWx0ZXIuc2hhcGVbM107XG4gICAgdXRpbC5hc3NlcnQoJHBvaW50d2lzZUZpbHRlci5zaGFwZVsyXSA9PT0gaW5DaGFubmVscyAqIGNoYW5uZWxNdWx0aXBsaWVyLCAoKSA9PiBgRXJyb3IgaW4gc2VwYXJhYmxlQ29udjJkOiB0aGUgdGhpcmQgZGltZW5zaW9uIG9mIHBvaW50d2lzZSBmaWx0ZXIgYCArXG4gICAgICAgIGBtdXN0IGJlICR7aW5DaGFubmVscyAqIGNoYW5uZWxNdWx0aXBsaWVyfSwgYCArXG4gICAgICAgIGBidXQgZ290ICR7JHBvaW50d2lzZUZpbHRlci5zaGFwZVsyXX0uYCk7XG4gICAgY29uc3QgZGVwdGh3aXNlID0gZGVwdGh3aXNlQ29udjJkKHg0RCwgJGRlcHRod2lzZUZpbHRlciwgc3RyaWRlcywgcGFkLCBkYXRhRm9ybWF0LCBkaWxhdGlvbik7XG4gICAgY29uc3QgcG9pbnR3aXNlU3RyaWRlID0gMTtcbiAgICBjb25zdCByZXMgPSBjb252MmQoZGVwdGh3aXNlLCAkcG9pbnR3aXNlRmlsdGVyLCBwb2ludHdpc2VTdHJpZGUsICd2YWxpZCcsIGRhdGFGb3JtYXQpO1xuICAgIGlmIChyZXNoYXBlZFRvNEQpIHtcbiAgICAgICAgcmV0dXJuIHJlc2hhcGUocmVzLCBbcmVzLnNoYXBlWzFdLCByZXMuc2hhcGVbMl0sIHJlcy5zaGFwZVszXV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufVxuZXhwb3J0IGNvbnN0IHNlcGFyYWJsZUNvbnYyZCA9IG9wKHsgc2VwYXJhYmxlQ29udjJkXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNlcGFyYWJsZV9jb252MmQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgVGVuc29yQnVmZmVyIH0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuLyoqXG4gKiBDb21wdXRlcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBsaXN0cyBvZiBudW1iZXJzLlxuICpcbiAqIEdpdmVuIGEgVGVuc29yIGB4YCBhbmQgYSBUZW5zb3IgYHlgLCB0aGlzIG9wZXJhdGlvbiByZXR1cm5zIGEgVGVuc29yIGBvdXRgXG4gKiB0aGF0IHJlcHJlc2VudHMgYWxsIHZhbHVlcyB0aGF0IGFyZSBpbiBgeGAgYnV0IG5vdCBpbiBgeWAuIFRoZSByZXR1cm5lZFxuICogVGVuc29yIGBvdXRgIGlzIHNvcnRlZCBpbiB0aGUgc2FtZSBvcmRlciB0aGF0IHRoZSBudW1iZXJzIGFwcGVhciBpbiBgeGBcbiAqIChkdXBsaWNhdGVzIGFyZSBwcmVzZXJ2ZWQpLiBUaGlzIG9wZXJhdGlvbiBhbHNvIHJldHVybnMgYSBUZW5zb3IgaW5kaWNlcyB0aGF0XG4gKiByZXByZXNlbnRzIHRoZSBwb3NpdGlvbiBvZiBlYWNoIG91dCBlbGVtZW50IGluIGB4YC4gSW4gb3RoZXIgd29yZHM6XG4gKlxuICogYG91dFtpXSA9IHhbaWR4W2ldXSBmb3IgaSBpbiBbMCwgMSwgLi4uLCBvdXQubGVuZ3RoIC0gMV1gXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSBbMSwgMiwgMywgNCwgNSwgNl07XG4gKiBjb25zdCB5ID0gWzEsIDMsIDVdO1xuICpcbiAqIGNvbnN0IFtvdXQsIGluZGljZXNdID0gYXdhaXQgdGYuc2V0ZGlmZjFkQXN5bmMoeCwgeSk7XG4gKiBvdXQucHJpbnQoKTsgLy8gWzIsIDQsIDZdXG4gKiBpbmRpY2VzLnByaW50KCk7IC8vIFsxLCAzLCA1XVxuICogYGBgXG4gKlxuICogQHBhcmFtIHggMS1EIFRlbnNvci4gVmFsdWVzIHRvIGtlZXAuXG4gKiBAcGFyYW0geSAxLUQgVGVuc29yLiBNdXN0IGhhdmUgdGhlIHNhbWUgdHlwZSBhcyB4LiBWYWx1ZXMgdG8gZXhjbHVkZSBpbiB0aGVcbiAqICAgICBvdXRwdXQuXG4gKiBAcmV0dXJucyBQcm9taXNlIG9mIFRlbnNvciB0dXBsZSBbb3V0LCBpbmRpY2VzXS5cbiAqICBvdXQ6IFRlbnNvciB3aXRoIHRoZSBzYW1lIHR5cGUgYXMgeC5cbiAqICBpbmRpY2VzOiBBIFRlbnNvciBvZiB0eXBlIGludDMyLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ1RyYW5zZm9ybWF0aW9ucyd9XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNldGRpZmYxZEFzeW5jXyh4LCB5KSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnc2V0ZGlmZjFkJyk7XG4gICAgY29uc3QgJHkgPSBjb252ZXJ0VG9UZW5zb3IoeSwgJ3knLCAnc2V0ZGlmZjFkJyk7XG4gICAgdXRpbC5hc3NlcnQoJHguZHR5cGUgPT09ICR5LmR0eXBlLCAoKSA9PiBgeCBhbmQgeSBzaG91bGQgaGF2ZSB0aGUgc2FtZSBkdHlwZSwgYnV0IGdvdCB4ICgkeyR4LmR0eXBlfSkgYW5kIHkgKCR7JHkuZHR5cGV9KS5gKTtcbiAgICB1dGlsLmFzc2VydCgkeC5yYW5rID09PSAxLCAoKSA9PiBgeCBzaG91bGQgYmUgMUQgdGVuc29yLCBidXQgZ290IHggKCR7JHguc2hhcGV9KS5gKTtcbiAgICB1dGlsLmFzc2VydCgkeS5yYW5rID09PSAxLCAoKSA9PiBgeSBzaG91bGQgYmUgMUQgdGVuc29yLCBidXQgZ290IHkgKCR7JHkuc2hhcGV9KS5gKTtcbiAgICBjb25zdCB4VmFscyA9IGF3YWl0ICR4LmRhdGEoKTtcbiAgICBjb25zdCB5VmFscyA9IGF3YWl0ICR5LmRhdGEoKTtcbiAgICBjb25zdCB5U2V0ID0gbmV3IFNldCh5VmFscyk7XG4gICAgbGV0IG91dHB1dFNpemUgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgeFZhbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKCF5U2V0Lmhhcyh4VmFsc1tpXSkpIHtcbiAgICAgICAgICAgIG91dHB1dFNpemUrKztcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBidWZmZXIgPSBuZXcgVGVuc29yQnVmZmVyKFtvdXRwdXRTaXplXSwgJHguZHR5cGUpO1xuICAgIGNvbnN0IGluZGljZXMgPSBuZXcgVGVuc29yQnVmZmVyKFtvdXRwdXRTaXplXSwgJ2ludDMyJyk7XG4gICAgZm9yIChsZXQgaSA9IDAsIHAgPSAwOyBpIDwgeFZhbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKCF5U2V0Lmhhcyh4VmFsc1tpXSkpIHtcbiAgICAgICAgICAgIGJ1ZmZlci52YWx1ZXNbcF0gPSB4VmFsc1tpXTtcbiAgICAgICAgICAgIGluZGljZXMudmFsdWVzW3BdID0gaTtcbiAgICAgICAgICAgIHArKztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW2J1ZmZlci50b1RlbnNvcigpLCBpbmRpY2VzLnRvVGVuc29yKCldO1xufVxuZXhwb3J0IGNvbnN0IHNldGRpZmYxZEFzeW5jID0gc2V0ZGlmZjFkQXN5bmNfO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2V0ZGlmZjFkX2FzeW5jLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBTaWdtb2lkIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgc2lnbW9pZCBlbGVtZW50LXdpc2UsIGAxIC8gKDEgKyBleHAoLXgpKWBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFswLCAtMSwgMiwgLTNdKTtcbiAqXG4gKiB4LnNpZ21vaWQoKS5wcmludCgpOyAgLy8gb3IgdGYuc2lnbW9pZCh4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiBzaWdtb2lkXyh4KSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnc2lnbW9pZCcpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChTaWdtb2lkLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IHNpZ21vaWQgPSBvcCh7IHNpZ21vaWRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2lnbW9pZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgU2lnbiB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIFJldHVybnMgYW4gZWxlbWVudC13aXNlIGluZGljYXRpb24gb2YgdGhlIHNpZ24gb2YgYSBudW1iZXIuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbLjYsIDEuMSwgLTMuMywgTmFOLCAwXSk7XG4gKlxuICogeC5zaWduKCkucHJpbnQoKTsgIC8vIG9yIHRmLnNpZ24oeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IFRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gc2lnbl8oeCkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3NpZ24nKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IHg6ICR4IH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoU2lnbiwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBzaWduID0gb3AoeyBzaWduXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNpZ24uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgY29uY2F0IH0gZnJvbSAnLi4vY29uY2F0JztcbmltcG9ydCB7IGZpbGwgfSBmcm9tICcuLi9maWxsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuLi9yZXNoYXBlJztcbmltcG9ydCB7IHNsaWNlIH0gZnJvbSAnLi4vc2xpY2UnO1xuaW1wb3J0IHsgdGVuc29yMmQgfSBmcm9tICcuLi90ZW5zb3IyZCc7XG4vKipcbiAqIEV4cGFuZHMgaW5wdXQgaW50byBmcmFtZXMgb2YgZnJhbWVMZW5ndGguXG4gKiBTbGlkZXMgYSB3aW5kb3cgc2l6ZSB3aXRoIGZyYW1lU3RlcC5cbiAqXG4gKiBgYGBqc1xuICogdGYuc2lnbmFsLmZyYW1lKFsxLCAyLCAzXSwgMiwgMSkucHJpbnQoKTtcbiAqIGBgYFxuICogQHBhcmFtIHNpZ25hbCBUaGUgaW5wdXQgdGVuc29yIHRvIGJlIGV4cGFuZGVkXG4gKiBAcGFyYW0gZnJhbWVMZW5ndGggTGVuZ3RoIG9mIGVhY2ggZnJhbWVcbiAqIEBwYXJhbSBmcmFtZVN0ZXAgVGhlIGZyYW1lIGhvcCBzaXplIGluIHNhbXBsZXMuXG4gKiBAcGFyYW0gcGFkRW5kIFdoZXRoZXIgdG8gcGFkIHRoZSBlbmQgb2Ygc2lnbmFsIHdpdGggcGFkVmFsdWUuXG4gKiBAcGFyYW0gcGFkVmFsdWUgQW4gbnVtYmVyIHRvIHVzZSB3aGVyZSB0aGUgaW5wdXQgc2lnbmFsIGRvZXNcbiAqICAgICBub3QgZXhpc3Qgd2hlbiBwYWRFbmQgaXMgVHJ1ZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdTaWduYWwnLCBuYW1lc3BhY2U6ICdzaWduYWwnfVxuICovXG5mdW5jdGlvbiBmcmFtZV8oc2lnbmFsLCBmcmFtZUxlbmd0aCwgZnJhbWVTdGVwLCBwYWRFbmQgPSBmYWxzZSwgcGFkVmFsdWUgPSAwKSB7XG4gICAgbGV0IHN0YXJ0ID0gMDtcbiAgICBjb25zdCBvdXRwdXQgPSBbXTtcbiAgICB3aGlsZSAoc3RhcnQgKyBmcmFtZUxlbmd0aCA8PSBzaWduYWwuc2l6ZSkge1xuICAgICAgICBvdXRwdXQucHVzaChzbGljZShzaWduYWwsIHN0YXJ0LCBmcmFtZUxlbmd0aCkpO1xuICAgICAgICBzdGFydCArPSBmcmFtZVN0ZXA7XG4gICAgfVxuICAgIGlmIChwYWRFbmQpIHtcbiAgICAgICAgd2hpbGUgKHN0YXJ0IDwgc2lnbmFsLnNpemUpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhZExlbiA9IChzdGFydCArIGZyYW1lTGVuZ3RoKSAtIHNpZ25hbC5zaXplO1xuICAgICAgICAgICAgY29uc3QgcGFkID0gY29uY2F0KFtcbiAgICAgICAgICAgICAgICBzbGljZShzaWduYWwsIHN0YXJ0LCBmcmFtZUxlbmd0aCAtIHBhZExlbiksIGZpbGwoW3BhZExlbl0sIHBhZFZhbHVlKVxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICBvdXRwdXQucHVzaChwYWQpO1xuICAgICAgICAgICAgc3RhcnQgKz0gZnJhbWVTdGVwO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChvdXRwdXQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiB0ZW5zb3IyZChbXSwgWzAsIGZyYW1lTGVuZ3RoXSk7XG4gICAgfVxuICAgIHJldHVybiByZXNoYXBlKGNvbmNhdChvdXRwdXQpLCBbb3V0cHV0Lmxlbmd0aCwgZnJhbWVMZW5ndGhdKTtcbn1cbmV4cG9ydCBjb25zdCBmcmFtZSA9IG9wKHsgZnJhbWVfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZnJhbWUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgY29zaW5lV2luZG93IH0gZnJvbSAnLi4vc2lnbmFsX29wc191dGlsJztcbi8qKlxuICogR2VuZXJhdGUgYSBoYW1taW5nIHdpbmRvdy5cbiAqXG4gKiBTZWU6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1dpbmRvd19mdW5jdGlvbiNIYW5uX2FuZF9IYW1taW5nX3dpbmRvd3NcbiAqXG4gKiBgYGBqc1xuICogdGYuc2lnbmFsLmhhbW1pbmdXaW5kb3coMTApLnByaW50KCk7XG4gKiBgYGBcbiAqIEBwYXJhbSBUaGUgbGVuZ3RoIG9mIHdpbmRvd1xuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ1NpZ25hbCcsIG5hbWVzcGFjZTogJ3NpZ25hbCd9XG4gKi9cbmZ1bmN0aW9uIGhhbW1pbmdXaW5kb3dfKHdpbmRvd0xlbmd0aCkge1xuICAgIHJldHVybiBjb3NpbmVXaW5kb3cod2luZG93TGVuZ3RoLCAwLjU0LCAwLjQ2KTtcbn1cbmV4cG9ydCBjb25zdCBoYW1taW5nV2luZG93ID0gb3AoeyBoYW1taW5nV2luZG93XyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWhhbW1pbmdfd2luZG93LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IG9wIH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCB7IGNvc2luZVdpbmRvdyB9IGZyb20gJy4uL3NpZ25hbF9vcHNfdXRpbCc7XG4vKipcbiAqIEdlbmVyYXRlIGEgSGFubiB3aW5kb3cuXG4gKlxuICogU2VlOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9XaW5kb3dfZnVuY3Rpb24jSGFubl9hbmRfSGFtbWluZ193aW5kb3dzXG4gKlxuICogYGBganNcbiAqIHRmLnNpZ25hbC5oYW5uV2luZG93KDEwKS5wcmludCgpO1xuICogYGBgXG4gKiBAcGFyYW0gVGhlIGxlbmd0aCBvZiB3aW5kb3dcbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdTaWduYWwnLCBuYW1lc3BhY2U6ICdzaWduYWwnfVxuICovXG5mdW5jdGlvbiBoYW5uV2luZG93Xyh3aW5kb3dMZW5ndGgpIHtcbiAgICByZXR1cm4gY29zaW5lV2luZG93KHdpbmRvd0xlbmd0aCwgMC41LCAwLjUpO1xufVxuZXhwb3J0IGNvbnN0IGhhbm5XaW5kb3cgPSBvcCh7IGhhbm5XaW5kb3dfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aGFubl93aW5kb3cuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgbXVsIH0gZnJvbSAnLi4vbXVsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCB7IGVuY2xvc2luZ1Bvd2VyT2ZUd28gfSBmcm9tICcuLi9zaWduYWxfb3BzX3V0aWwnO1xuaW1wb3J0IHsgcmZmdCB9IGZyb20gJy4uL3NwZWN0cmFsL3JmZnQnO1xuaW1wb3J0IHsgZnJhbWUgfSBmcm9tICcuL2ZyYW1lJztcbmltcG9ydCB7IGhhbm5XaW5kb3cgfSBmcm9tICcuL2hhbm5fd2luZG93Jztcbi8qKlxuICogQ29tcHV0ZXMgdGhlIFNob3J0LXRpbWUgRm91cmllciBUcmFuc2Zvcm0gb2Ygc2lnbmFsc1xuICogU2VlOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TaG9ydC10aW1lX0ZvdXJpZXJfdHJhbnNmb3JtXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGlucHV0ID0gdGYudGVuc29yMWQoWzEsIDEsIDEsIDEsIDFdKVxuICogdGYuc2lnbmFsLnN0ZnQoaW5wdXQsIDMsIDEpLnByaW50KCk7XG4gKiBgYGBcbiAqIEBwYXJhbSBzaWduYWwgMS1kaW1lbnNpb25hbCByZWFsIHZhbHVlIHRlbnNvci5cbiAqIEBwYXJhbSBmcmFtZUxlbmd0aCBUaGUgd2luZG93IGxlbmd0aCBvZiBzYW1wbGVzLlxuICogQHBhcmFtIGZyYW1lU3RlcCBUaGUgbnVtYmVyIG9mIHNhbXBsZXMgdG8gc3RlcC5cbiAqIEBwYXJhbSBmZnRMZW5ndGggVGhlIHNpemUgb2YgdGhlIEZGVCB0byBhcHBseS5cbiAqIEBwYXJhbSB3aW5kb3dGbiBBIGNhbGxhYmxlIHRoYXQgdGFrZXMgYSB3aW5kb3cgbGVuZ3RoIGFuZCByZXR1cm5zIDEtZCB0ZW5zb3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnU2lnbmFsJywgbmFtZXNwYWNlOiAnc2lnbmFsJ31cbiAqL1xuZnVuY3Rpb24gc3RmdF8oc2lnbmFsLCBmcmFtZUxlbmd0aCwgZnJhbWVTdGVwLCBmZnRMZW5ndGgsIHdpbmRvd0ZuID0gaGFubldpbmRvdykge1xuICAgIGlmIChmZnRMZW5ndGggPT0gbnVsbCkge1xuICAgICAgICBmZnRMZW5ndGggPSBlbmNsb3NpbmdQb3dlck9mVHdvKGZyYW1lTGVuZ3RoKTtcbiAgICB9XG4gICAgY29uc3QgZnJhbWVkU2lnbmFsID0gZnJhbWUoc2lnbmFsLCBmcmFtZUxlbmd0aCwgZnJhbWVTdGVwKTtcbiAgICBjb25zdCB3aW5kb3dlZFNpZ25hbCA9IG11bChmcmFtZWRTaWduYWwsIHdpbmRvd0ZuKGZyYW1lTGVuZ3RoKSk7XG4gICAgcmV0dXJuIHJmZnQod2luZG93ZWRTaWduYWwsIGZmdExlbmd0aCk7XG59XG5leHBvcnQgY29uc3Qgc3RmdCA9IG9wKHsgc3RmdF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdGZ0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IHRlbnNvcjFkIH0gZnJvbSAnLi90ZW5zb3IxZCc7XG5leHBvcnQgZnVuY3Rpb24gZW5jbG9zaW5nUG93ZXJPZlR3byh2YWx1ZSkge1xuICAgIC8vIFJldHVybiAyKipOIGZvciBpbnRlZ2VyIE4gc3VjaCB0aGF0IDIqKk4gPj0gdmFsdWUuXG4gICAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5wb3coMiwgTWF0aC5jZWlsKE1hdGgubG9nKHZhbHVlKSAvIE1hdGgubG9nKDIuMCkpKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gY29zaW5lV2luZG93KHdpbmRvd0xlbmd0aCwgYSwgYikge1xuICAgIGNvbnN0IGV2ZW4gPSAxIC0gd2luZG93TGVuZ3RoICUgMjtcbiAgICBjb25zdCBuZXdWYWx1ZXMgPSBuZXcgRmxvYXQzMkFycmF5KHdpbmRvd0xlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3aW5kb3dMZW5ndGg7ICsraSkge1xuICAgICAgICBjb25zdCBjb3NBcmcgPSAoMi4wICogTWF0aC5QSSAqIGkpIC8gKHdpbmRvd0xlbmd0aCArIGV2ZW4gLSAxKTtcbiAgICAgICAgbmV3VmFsdWVzW2ldID0gYSAtIGIgKiBNYXRoLmNvcyhjb3NBcmcpO1xuICAgIH1cbiAgICByZXR1cm4gdGVuc29yMWQobmV3VmFsdWVzLCAnZmxvYXQzMicpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2lnbmFsX29wc191dGlsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBTaW4gfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyBzaW4gb2YgdGhlIGlucHV0IFRlbnNvciBlbGVtZW50LXdpc2U6IGBzaW4oeClgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMCwgTWF0aC5QSSAvIDIsIE1hdGguUEkgKiAzIC8gNF0pO1xuICpcbiAqIHguc2luKCkucHJpbnQoKTsgIC8vIG9yIHRmLnNpbih4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiBzaW5fKHgpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdzaW4nKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IHg6ICR4IH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoU2luLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IHNpbiA9IG9wKHsgc2luXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNpbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgU2luaCB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENvbXB1dGVzIGh5cGVyYm9saWMgc2luIG9mIHRoZSBpbnB1dCBgdGYuVGVuc29yYCBlbGVtZW50LXdpc2U6IGBzaW5oKHgpYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzAsIDEsIC0xLCAuN10pO1xuICpcbiAqIHguc2luaCgpLnByaW50KCk7ICAvLyBvciB0Zi5zaW5oKHgpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMgbWF0aCd9XG4gKi9cbmZ1bmN0aW9uIHNpbmhfKHgpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdzaW5oJyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFNpbmgsIGlucHV0cyk7XG59XG5leHBvcnQgY29uc3Qgc2luaCA9IG9wKHsgc2luaF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zaW5oLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBTbGljZSB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIEV4dHJhY3RzIGEgc2xpY2UgZnJvbSBhIGB0Zi5UZW5zb3JgIHN0YXJ0aW5nIGF0IGNvb3JkaW5hdGVzIGBiZWdpbmBcbiAqIGFuZCBpcyBvZiBzaXplIGBzaXplYC5cbiAqXG4gKiBBbHNvIGF2YWlsYWJsZSBhcmUgc3RyaWN0ZXIgcmFuay1zcGVjaWZpYyBtZXRob2RzIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlXG4gKiBhcyB0aGlzIG1ldGhvZCB0aGF0IGFzc2VydCB0aGF0IGB4YCBpcyBvZiB0aGUgZ2l2ZW4gcmFuazpcbiAqICAgLSBgdGYuc2xpY2UxZGBcbiAqICAgLSBgdGYuc2xpY2UyZGBcbiAqICAgLSBgdGYuc2xpY2UzZGBcbiAqICAgLSBgdGYuc2xpY2U0ZGBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzLCA0XSk7XG4gKlxuICogeC5zbGljZShbMV0sIFsyXSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMmQoWzEsIDIsIDMsIDRdLCBbMiwgMl0pO1xuICpcbiAqIHguc2xpY2UoWzEsIDBdLCBbMSwgMl0pLnByaW50KCk7XG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCBgdGYuVGVuc29yYCB0byBzbGljZSBmcm9tLlxuICogQHBhcmFtIGJlZ2luIFRoZSBjb29yZGluYXRlcyB0byBzdGFydCB0aGUgc2xpY2UgZnJvbS4gVGhlIGxlbmd0aCBjYW4gYmVcbiAqICAgICBsZXNzIHRoYW4gdGhlIHJhbmsgb2YgeCAtIHRoZSByZXN0IG9mIHRoZSBheGVzIHdpbGwgaGF2ZSBpbXBsaWNpdCAwIGFzXG4gKiAgICAgc3RhcnQuIENhbiBhbHNvIGJlIGEgc2luZ2xlIG51bWJlciwgaW4gd2hpY2ggY2FzZSBpdCBzcGVjaWZpZXMgdGhlXG4gKiAgICAgZmlyc3QgYXhpcy5cbiAqIEBwYXJhbSBzaXplIFRoZSBzaXplIG9mIHRoZSBzbGljZS4gVGhlIGxlbmd0aCBjYW4gYmUgbGVzcyB0aGFuIHRoZSByYW5rIG9mXG4gKiAgICAgeCAtIHRoZSByZXN0IG9mIHRoZSBheGVzIHdpbGwgaGF2ZSBpbXBsaWNpdCAtMS4gQSB2YWx1ZSBvZiAtMSByZXF1ZXN0c1xuICogICAgIHRoZSByZXN0IG9mIHRoZSBkaW1lbnNpb25zIGluIHRoZSBheGlzLiBDYW4gYWxzbyBiZSBhIHNpbmdsZSBudW1iZXIsXG4gKiAgICAgaW4gd2hpY2ggY2FzZSBpdCBzcGVjaWZpZXMgdGhlIHNpemUgb2YgdGhlIGZpcnN0IGF4aXMuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnU2xpY2luZyBhbmQgSm9pbmluZyd9XG4gKi9cbmZ1bmN0aW9uIHNsaWNlXyh4LCBiZWdpbiwgc2l6ZSkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3NsaWNlJywgJ3N0cmluZ19vcl9udW1lcmljJyk7XG4gICAgaWYgKCR4LnJhbmsgPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTbGljaW5nIHNjYWxhciBpcyBub3QgcG9zc2libGUnKTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBiZWdpbiwgc2l6ZSB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFNsaWNlLCBpbnB1dHMsIGF0dHJzKTtcbn1cbmV4cG9ydCBjb25zdCBzbGljZSA9IG9wKHsgc2xpY2VfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2xpY2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHNsaWNlIH0gZnJvbSAnLi9zbGljZSc7XG4vKipcbiAqIEV4dHJhY3RzIGEgMUQgc2xpY2UgZnJvbSAxRCBhcnJheSBzdGFydGluZyBhdCBjb29yZGluYXRlcyBgYmVnaW5gIGFuZCBpc1xuICogb2YgbGVuZ3RoIGBzaXplYC4gU2VlIGBzbGljZWAgZm9yIGRldGFpbHMuXG4gKi9cbmZ1bmN0aW9uIHNsaWNlMWRfKHgsIGJlZ2luLCBzaXplKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnc2xpY2UxZCcpO1xuICAgIHV0aWwuYXNzZXJ0KCR4LnJhbmsgPT09IDEsICgpID0+IGBzbGljZTFkIGV4cGVjdHMgYSByYW5rLTEgdGVuc29yLCBidXQgZ290IGEgcmFuay0keyR4LnJhbmt9IHRlbnNvcmApO1xuICAgIHJldHVybiBzbGljZSgkeCwgW2JlZ2luXSwgW3NpemVdKTtcbn1cbmV4cG9ydCBjb25zdCBzbGljZTFkID0gb3AoeyBzbGljZTFkXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNsaWNlMWQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHNsaWNlIH0gZnJvbSAnLi9zbGljZSc7XG4vKipcbiAqIEV4dHJhY3RzIGEgMkQgc2xpY2UgZnJvbSBhIDJEIGFycmF5IHN0YXJ0aW5nIGF0IGNvb3JkaW5hdGVzIGBiZWdpbmAgYW5kXG4gKiBpcyBvZiBzaXplIGBzaXplYC4gU2VlIGBzbGljZWAgZm9yIGRldGFpbHMuXG4gKi9cbmZ1bmN0aW9uIHNsaWNlMmRfKHgsIGJlZ2luLCBzaXplKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnc2xpY2UyZCcpO1xuICAgIHV0aWwuYXNzZXJ0KCR4LnJhbmsgPT09IDIsICgpID0+IGBzbGljZTJkIGV4cGVjdHMgYSByYW5rLTIgdGVuc29yLCBidXQgZ290IGEgcmFuay0keyR4LnJhbmt9IHRlbnNvcmApO1xuICAgIHJldHVybiBzbGljZSgkeCwgYmVnaW4sIHNpemUpO1xufVxuZXhwb3J0IGNvbnN0IHNsaWNlMmQgPSBvcCh7IHNsaWNlMmRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2xpY2UyZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgc2xpY2UgfSBmcm9tICcuL3NsaWNlJztcbi8qKlxuICogRXh0cmFjdHMgYSAzRCBzbGljZSBmcm9tIGEgM0QgYXJyYXkgc3RhcnRpbmcgYXQgY29vcmRpbmF0ZXMgYGJlZ2luYCBhbmRcbiAqIGlzIG9mIHNpemUgYHNpemVgLiBTZWUgYHNsaWNlYCBmb3IgZGV0YWlscy5cbiAqL1xuZnVuY3Rpb24gc2xpY2UzZF8oeCwgYmVnaW4sIHNpemUpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdzbGljZTNkJyk7XG4gICAgdXRpbC5hc3NlcnQoJHgucmFuayA9PT0gMywgKCkgPT4gYHNsaWNlM2QgZXhwZWN0cyBhIHJhbmstMyB0ZW5zb3IsIGJ1dCBnb3QgYSByYW5rLSR7JHgucmFua30gdGVuc29yYCk7XG4gICAgcmV0dXJuIHNsaWNlKCR4LCBiZWdpbiwgc2l6ZSk7XG59XG5leHBvcnQgY29uc3Qgc2xpY2UzZCA9IG9wKHsgc2xpY2UzZF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zbGljZTNkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyBzbGljZSB9IGZyb20gJy4vc2xpY2UnO1xuLyoqXG4gKiBFeHRyYWN0cyBhIDREIHNsaWNlIGZyb20gYSA0RCBhcnJheSBzdGFydGluZyBhdCBjb29yZGluYXRlcyBgYmVnaW5gIGFuZFxuICogaXMgb2Ygc2l6ZSBgc2l6ZWAuIFNlZSBgc2xpY2VgIGZvciBkZXRhaWxzLlxuICovXG5mdW5jdGlvbiBzbGljZTRkXyh4LCBiZWdpbiwgc2l6ZSkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3NsaWNlNGQnKTtcbiAgICB1dGlsLmFzc2VydCgkeC5yYW5rID09PSA0LCAoKSA9PiBgc2xpY2U0ZCBleHBlY3RzIGEgcmFuay00IHRlbnNvciwgYnV0IGdvdCBhIHJhbmstJHskeC5yYW5rfSB0ZW5zb3JgKTtcbiAgICByZXR1cm4gc2xpY2UoJHgsIGJlZ2luLCBzaXplKTtcbn1cbmV4cG9ydCBjb25zdCBzbGljZTRkID0gb3AoeyBzbGljZTRkXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNsaWNlNGQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRQYXJhbXNWYWxpZChpbnB1dCwgYmVnaW4sIHNpemUpIHtcbiAgICBjb25zdCBpbnB1dFJhbmsgPSBpbnB1dC5zaGFwZS5sZW5ndGg7XG4gICAgdXRpbC5hc3NlcnQoaW5wdXRSYW5rID09PSBiZWdpbi5sZW5ndGgsICgpID0+IGBFcnJvciBpbiBzbGljZSR7aW5wdXRSYW5rfUQ6IExlbmd0aCBvZiBiZWdpbiAke2JlZ2lufSBtdXN0IGAgK1xuICAgICAgICBgbWF0Y2ggdGhlIHJhbmsgb2YgdGhlIGFycmF5ICgke2lucHV0UmFua30pLmApO1xuICAgIHV0aWwuYXNzZXJ0KGlucHV0UmFuayA9PT0gc2l6ZS5sZW5ndGgsICgpID0+IGBFcnJvciBpbiBzbGljZSR7aW5wdXRSYW5rfUQ6IExlbmd0aCBvZiBzaXplICR7c2l6ZX0gbXVzdCBgICtcbiAgICAgICAgYG1hdGNoIHRoZSByYW5rIG9mIHRoZSBhcnJheSAoJHtpbnB1dFJhbmt9KS5gKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0UmFuazsgKytpKSB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KGJlZ2luW2ldICsgc2l6ZVtpXSA8PSBpbnB1dC5zaGFwZVtpXSwgKCkgPT4gYEVycm9yIGluIHNsaWNlJHtpbnB1dFJhbmt9RDogYmVnaW5bJHtpfV0gKyBzaXplWyR7aX1dIGAgK1xuICAgICAgICAgICAgYCgke2JlZ2luW2ldICsgc2l6ZVtpXX0pIHdvdWxkIG92ZXJmbG93IGlucHV0LnNoYXBlWyR7aX1dICgke2lucHV0LnNoYXBlW2ldfSlgKTtcbiAgICB9XG59XG4vKiogQ29udmVydHMgYSBiaW5hcnkgbWFzayB0byBhbiBhcnJheSBvZiBheGVzLiBVc2VkIGluIHN0cmlkZWRTbGljZSgpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hc2tUb0F4ZXMobWFzaykge1xuICAgIGNvbnN0IGF4ZXMgPSBbXTtcbiAgICBsZXQgYXhpcyA9IDA7XG4gICAgd2hpbGUgKG1hc2sgPiAwKSB7XG4gICAgICAgIGlmIChtYXNrICYgMSkge1xuICAgICAgICAgICAgYXhlcy5wdXNoKGF4aXMpO1xuICAgICAgICB9XG4gICAgICAgIG1hc2sgLz0gMjtcbiAgICAgICAgYXhpcysrO1xuICAgIH1cbiAgICByZXR1cm4gYXhlcztcbn1cbi8qKiBDb21wdXRlcyB0aGUgb3V0cHV0IHNoYXBlIGdpdmVuIHRoZSBzdHJpZGVkIHNsaWNlIHBhcmFtcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlT3V0U2hhcGUoYmVnaW4sIGVuZCwgc3RyaWRlcykge1xuICAgIGNvbnN0IHNpemUgPSBbXTtcbiAgICBmb3IgKGxldCBheGlzID0gMDsgYXhpcyA8IGJlZ2luLmxlbmd0aDsgYXhpcysrKSB7XG4gICAgICAgIHNpemVbYXhpc10gPSBNYXRoLmNlaWwoKGVuZFtheGlzXSAtIGJlZ2luW2F4aXNdKSAvIHN0cmlkZXNbYXhpc10pO1xuICAgIH1cbiAgICByZXR1cm4gc2l6ZTtcbn1cbi8vIENyZWF0ZXMgZnVsbCBzZWxlY3Rpb24gYXQgdGhlIGVsaWRlZCBkaW1lbnNpb25zLiBJZiB0aGUgZGltZW5zaW9uIG1hdGNoZXNcbi8vIHRoZSBlbGxpcHNpcyBtYXNrLCBvdmVycmlkZSB0aGUgY3VycmVudCBzdHJpZGUgdmFsdWUuIE90aGVyd2lzZSwgaW5zZXJ0LlxuZXhwb3J0IGZ1bmN0aW9uIHN0cmlkZXNXaXRoRWxpZGVkRGltcyhzdHJpZGVzLCBlbGxpcHNpc0luc2VydGlvbkluZGV4LCBudW1FbGlkZWRBeGVzLCBpbnB1dFNoYXBlKSB7XG4gICAgY29uc3QgbmV3U3RyaWRlcyA9IFsuLi5zdHJpZGVzXTtcbiAgICBmb3IgKGxldCBpID0gbmV3U3RyaWRlcy5sZW5ndGg7IGkgPCBpbnB1dFNoYXBlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG5ld1N0cmlkZXMucHVzaCgxKTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1FbGlkZWRBeGVzOyBpKyspIHtcbiAgICAgICAgaWYgKGkgPT09IDApIHtcbiAgICAgICAgICAgIG5ld1N0cmlkZXNbZWxsaXBzaXNJbnNlcnRpb25JbmRleF0gPSAxO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbmV3U3RyaWRlcy5zcGxpY2UoZWxsaXBzaXNJbnNlcnRpb25JbmRleCwgMCAvKiBudW0gZWxlbWVudHMgdG8gZGVsZXRlICovLCAxIC8qIGVsZW1lbnQgdG8gYWRkICovKTtcbiAgICAgICAgICAgIG5ld1N0cmlkZXMucG9wKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5ld1N0cmlkZXM7XG59XG5mdW5jdGlvbiB1bm5vcm1hbGl6ZUF4aXMoZWxsaXBzaXNJbnNlcnRpb25JbmRleCwgbnVtRWxpZGVkQXhlcywgbm9ybWFsaXplZEF4aXMpIHtcbiAgICBpZiAobm9ybWFsaXplZEF4aXMgPD0gZWxsaXBzaXNJbnNlcnRpb25JbmRleCkge1xuICAgICAgICByZXR1cm4gbm9ybWFsaXplZEF4aXM7XG4gICAgfVxuICAgIHJldHVybiBub3JtYWxpemVkQXhpcyAtIChudW1FbGlkZWRBeGVzIC0gMSk7XG59XG5mdW5jdGlvbiBnZXRFbGlkZWRBeGVzKG51bUVsaWRlZEF4ZXMsIGVsbGlwc2lzSW5zZXJ0aW9uSW5kZXgpIHtcbiAgICBjb25zdCBlbGlkZWRBeGVzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1FbGlkZWRBeGVzOyBpKyspIHtcbiAgICAgICAgZWxpZGVkQXhlcy5wdXNoKGVsbGlwc2lzSW5zZXJ0aW9uSW5kZXggKyBpKTtcbiAgICB9XG4gICAgcmV0dXJuIGVsaWRlZEF4ZXM7XG59XG4vLyBOb3JtYWxpemUgdGhlIHN0YXJ0LCBlbmQgYW5kIHN0cmlkZXMuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Tm9ybWFsaXplZEF4ZXMoaW5wdXRTaGFwZSwgZWxsaXBzaXNBeGVzLCBudW1JbnRlcnBvbGF0ZWRBeGVzLCBiZWdpbiwgZW5kLCBzdHJpZGVzLCBiZWdpbk1hc2ssIGVuZE1hc2ssIGVsbGlwc2lzTWFzaykge1xuICAgIGNvbnN0IGlucHV0UmFuayA9IGlucHV0U2hhcGUubGVuZ3RoO1xuICAgIGxldCBub3JtYWxpemVkQmVnaW4gPSBuZXcgQXJyYXkoaW5wdXRSYW5rKSwgbm9ybWFsaXplZEVuZCA9IG5ldyBBcnJheShpbnB1dFJhbmspLCBub3JtYWxpemVkU3RyaWRlcyA9IG5ldyBBcnJheShpbnB1dFJhbmspO1xuICAgIGlmIChlbGxpcHNpc0F4ZXMubGVuZ3RoICYmIG51bUludGVycG9sYXRlZEF4ZXMgPiAwKSB7XG4gICAgICAgIGNvbnN0IGZ1bGxJbmRleCA9IGVsbGlwc2lzQXhlc1swXTtcbiAgICAgICAgLy8gVGhlIGVsbGlwc2lzIGFwcGxpZXMgdG8gdGhlIG1hc2tlZCBpbmRleCBhcyB3ZWxsIGFzIGFueSBkaW1lbnNpb25zXG4gICAgICAgIC8vIHRoYXQgYXJlIGludGVycG9sYXRlZC5cbiAgICAgICAgY29uc3QgbnVtRWxpZGVkQXhlcyA9IG51bUludGVycG9sYXRlZEF4ZXMgKyAxO1xuICAgICAgICBub3JtYWxpemVkQmVnaW4gPSBzdGFydEluZGljZXNXaXRoRWxpZGVkRGltcyhiZWdpbk1hc2ssIGZ1bGxJbmRleCwgbnVtRWxpZGVkQXhlcywgYmVnaW4sIGlucHV0U2hhcGUpO1xuICAgICAgICBub3JtYWxpemVkRW5kID0gc3RvcEluZGljZXNXaXRoRWxpZGVkRGltcyhlbmRNYXNrLCBmdWxsSW5kZXgsIG51bUVsaWRlZEF4ZXMsIGVuZCwgaW5wdXRTaGFwZSk7XG4gICAgICAgIG5vcm1hbGl6ZWRTdHJpZGVzID1cbiAgICAgICAgICAgIHN0cmlkZXNXaXRoRWxpZGVkRGltcyhzdHJpZGVzLCBmdWxsSW5kZXgsIG51bUVsaWRlZEF4ZXMsIGlucHV0U2hhcGUpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZm9yIChsZXQgYXhpcyA9IDA7IGF4aXMgPCBpbnB1dFJhbms7IGF4aXMrKykge1xuICAgICAgICAgICAgbm9ybWFsaXplZEJlZ2luW2F4aXNdID0gc3RhcnRGb3JBeGlzKGJlZ2luTWFzaywgYmVnaW4sIHN0cmlkZXMsIGlucHV0U2hhcGUsIGF4aXMsIGVsbGlwc2lzTWFzayk7XG4gICAgICAgICAgICBub3JtYWxpemVkRW5kW2F4aXNdID1cbiAgICAgICAgICAgICAgICBzdG9wRm9yQXhpcyhlbmRNYXNrLCBlbmQsIHN0cmlkZXMsIGlucHV0U2hhcGUsIGF4aXMsIGVsbGlwc2lzTWFzayk7XG4gICAgICAgICAgICBub3JtYWxpemVkU3RyaWRlc1theGlzXSA9IHN0cmlkZXNGb3JBeGlzKHN0cmlkZXMsIGF4aXMsIGVsbGlwc2lzTWFzayk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYmVnaW46IG5vcm1hbGl6ZWRCZWdpbixcbiAgICAgICAgZW5kOiBub3JtYWxpemVkRW5kLFxuICAgICAgICBzdHJpZGVzOiBub3JtYWxpemVkU3RyaWRlc1xuICAgIH07XG59XG4vLyBDcmVhdGVzIGZ1bGwgc2VsZWN0aW9uIGF0IHRoZSBlbGlkZWQgZGltZW5zaW9ucy4gSWYgdGhlIGRpbWVuc2lvbiBtYXRjaGVzXG4vLyB0aGUgZWxsaXBzaXMgbWFzaywgb3ZlcnJpZGUgdGhlIGN1cnJlbnQgc3RhcnQgdmFsdWUuIE90aGVyd2lzZSwgaW5zZXJ0LlxuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0SW5kaWNlc1dpdGhFbGlkZWREaW1zKGJlZ2luTWFzaywgZWxsaXBzaXNJbnNlcnRpb25JbmRleCwgbnVtRWxpZGVkQXhlcywgb3JpZ2luYWxCZWdpbiwgaW5wdXRTaGFwZSkge1xuICAgIGNvbnN0IG5ld0luZGljZXMgPSBbLi4uaW5wdXRTaGFwZV07XG4gICAgY29uc3QgZWxpZGVkQXhlcyA9IGdldEVsaWRlZEF4ZXMobnVtRWxpZGVkQXhlcywgZWxsaXBzaXNJbnNlcnRpb25JbmRleCk7XG4gICAgZm9yIChsZXQgYXhpcyA9IDA7IGF4aXMgPCBuZXdJbmRpY2VzLmxlbmd0aDsgYXhpcysrKSB7XG4gICAgICAgIGlmIChlbGlkZWRBeGVzLmluZGV4T2YoYXhpcykgPiAtMSkge1xuICAgICAgICAgICAgbmV3SW5kaWNlc1theGlzXSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbEF4aXMgPSB1bm5vcm1hbGl6ZUF4aXMoZWxsaXBzaXNJbnNlcnRpb25JbmRleCwgbnVtRWxpZGVkQXhlcywgYXhpcyk7XG4gICAgICAgICAgICBsZXQgb3JpZ2luYWxWYWx1ZSA9IG9yaWdpbmFsQmVnaW5bb3JpZ2luYWxBeGlzXTtcbiAgICAgICAgICAgIGlmIChiZWdpbk1hc2sgJiAxIDw8IG9yaWdpbmFsQXhpcykge1xuICAgICAgICAgICAgICAgIG9yaWdpbmFsVmFsdWUgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmV3SW5kaWNlc1theGlzXSA9IG9yaWdpbmFsVmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5ld0luZGljZXM7XG59XG4vLyBDcmVhdGVzIGZ1bGwgc2VsZWN0aW9uIGF0IHRoZSBlbGlkZWQgZGltZW5zaW9ucy4gSWYgdGhlIGRpbWVuc2lvbiBtYXRjaGVzXG4vLyB0aGUgZWxsaXBzaXMgbWFzaywgb3ZlcnJpZGUgdGhlIGN1cnJlbnQgc3RvcCB2YWx1ZS4gT3RoZXJ3aXNlLCBpbnNlcnQuXG5leHBvcnQgZnVuY3Rpb24gc3RvcEluZGljZXNXaXRoRWxpZGVkRGltcyhlbmRNYXNrLCBlbGxpcHNpc0luc2VydGlvbkluZGV4LCBudW1FbGlkZWRBeGVzLCBvcmlnaW5hbEVuZCwgaW5wdXRTaGFwZSkge1xuICAgIGNvbnN0IG5ld0luZGljZXMgPSBbLi4uaW5wdXRTaGFwZV07XG4gICAgY29uc3QgZWxpZGVkQXhlcyA9IGdldEVsaWRlZEF4ZXMobnVtRWxpZGVkQXhlcywgZWxsaXBzaXNJbnNlcnRpb25JbmRleCk7XG4gICAgZm9yIChsZXQgYXhpcyA9IDA7IGF4aXMgPCBuZXdJbmRpY2VzLmxlbmd0aDsgYXhpcysrKSB7XG4gICAgICAgIGlmIChlbGlkZWRBeGVzLmluZGV4T2YoYXhpcykgPiAtMSkge1xuICAgICAgICAgICAgbmV3SW5kaWNlc1theGlzXSA9IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxBeGlzID0gdW5ub3JtYWxpemVBeGlzKGVsbGlwc2lzSW5zZXJ0aW9uSW5kZXgsIG51bUVsaWRlZEF4ZXMsIGF4aXMpO1xuICAgICAgICAgICAgbGV0IG9yaWdpbmFsVmFsdWUgPSBvcmlnaW5hbEVuZFtvcmlnaW5hbEF4aXNdO1xuICAgICAgICAgICAgaWYgKGVuZE1hc2sgJiAxIDw8IG9yaWdpbmFsQXhpcykge1xuICAgICAgICAgICAgICAgIG9yaWdpbmFsVmFsdWUgPSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5ld0luZGljZXNbYXhpc10gPSBvcmlnaW5hbFZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3SW5kaWNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAvLyBIYW5kbGUgbmVnYXRpdmUgaW5kaWNlc1xuICAgICAgICBjb25zdCBheGlzU2l6ZSA9IGlucHV0U2hhcGVbaV07XG4gICAgICAgIGlmIChuZXdJbmRpY2VzW2ldIDwgMCkge1xuICAgICAgICAgICAgbmV3SW5kaWNlc1tpXSArPSBheGlzU2l6ZTtcbiAgICAgICAgfVxuICAgICAgICBuZXdJbmRpY2VzW2ldID0gdXRpbC5jbGFtcCgwLCBuZXdJbmRpY2VzW2ldLCBpbnB1dFNoYXBlW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ld0luZGljZXM7XG59XG5leHBvcnQgZnVuY3Rpb24gc3RyaWRlc0ZvckF4aXMoc3RyaWRlcywgYXhpcywgZWxsaXBzaXNNYXNrKSB7XG4gICAgbGV0IHN0cmlkZSA9IHN0cmlkZXNbYXhpc107XG4gICAgaWYgKGVsbGlwc2lzTWFzayAmICgxIDw8IGF4aXMpIHx8IHN0cmlkZSA9PSBudWxsKSB7XG4gICAgICAgIHN0cmlkZSA9IDE7XG4gICAgfVxuICAgIHJldHVybiBzdHJpZGU7XG59XG5leHBvcnQgZnVuY3Rpb24gc3RhcnRGb3JBeGlzKGJlZ2luTWFzaywgc3RhcnRJbmRpY2VzLCBzdHJpZGVzLCBpbnB1dFNoYXBlLCBheGlzLCBlbGxpcHNpc01hc2spIHtcbiAgICAvLyBCZWdpbiB3aXRoIHRoZSBzcGVjaWZpZWQgaW5kZXhcbiAgICBsZXQgc3RhcnQgPSBzdGFydEluZGljZXNbYXhpc107XG4gICAgY29uc3Qgc3RyaWRlID0gc3RyaWRlc1theGlzXSB8fCAxO1xuICAgIC8vIENoZWNrIHRoZSBheGlzIGJpdCBmcm9tIHJpZ2h0IG9mIG1hc2tlZCBheGVzLCBvciB0aGUgYmVnaW4gaW5kZXggaXMgbm90IHNldFxuICAgIC8vIGZvciB0aGUgYXhpcy5cbiAgICBpZiAoYmVnaW5NYXNrICYgMSA8PCBheGlzIHx8IGVsbGlwc2lzTWFzayAmIDEgPDwgYXhpcyB8fCBzdGFydCA9PSBudWxsKSB7XG4gICAgICAgIGlmIChzdHJpZGUgPiAwKSB7XG4gICAgICAgICAgICAvLyBGb3J3YXJkIGl0ZXJhdGlvbiAtIHVzZSB0aGUgZmlyc3QgZWxlbWVudC4gVGhlc2UgdmFsdWVzIHdpbGwgZ2V0XG4gICAgICAgICAgICAvLyBjbGFtcGVkIGJlbG93IChOb3RlOiBXZSBjb3VsZCBoYXZlIHNldCB0aGVtIHRvIDAgYW5kIGF4aXNfc2l6ZS0xLCBidXRcbiAgICAgICAgICAgIC8vIHVzZSBsb3dlc3QoKSBhbmQgbWF4KCkgdG8gbWFpbnRhaW4gc3ltbWV0cnkgd2l0aCBTdG9wRm9yQXhpcygpKVxuICAgICAgICAgICAgc3RhcnQgPSBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIEJhY2t3YXJkIGl0ZXJhdGlvbiAtIHVzZSB0aGUgbGFzdCBlbGVtZW50LlxuICAgICAgICAgICAgc3RhcnQgPSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBIYW5kbGUgbmVnYXRpdmUgaW5kaWNlc1xuICAgIGNvbnN0IGF4aXNTaXplID0gaW5wdXRTaGFwZVtheGlzXTtcbiAgICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgICAgIHN0YXJ0ICs9IGF4aXNTaXplO1xuICAgIH1cbiAgICAvLyBDbGFtcGluZ1xuICAgIHN0YXJ0ID0gdXRpbC5jbGFtcCgwLCBzdGFydCwgYXhpc1NpemUgLSAxKTtcbiAgICByZXR1cm4gc3RhcnQ7XG59XG5leHBvcnQgZnVuY3Rpb24gc3RvcEZvckF4aXMoZW5kTWFzaywgc3RvcEluZGljZXMsIHN0cmlkZXMsIGlucHV0U2hhcGUsIGF4aXMsIGVsbGlwc2lzTWFzaykge1xuICAgIC8vIEJlZ2luIHdpdGggdGhlIHNwZWNpZmllZCBpbmRleFxuICAgIGxldCBzdG9wID0gc3RvcEluZGljZXNbYXhpc107XG4gICAgY29uc3Qgc3RyaWRlID0gc3RyaWRlc1theGlzXSB8fCAxO1xuICAgIC8vIENoZWNrIHRoZSBheGlzIGJpdCBmcm9tIHJpZ2h0IG9mIG1hc2tlZCBheGVzLCBvciBpZiB0aGUgc3RvcCBpbmRleCBpcyBub3RcbiAgICAvLyBzZXQgZm9yIHRoaXMgYXhpcy5cbiAgICBpZiAoZW5kTWFzayAmICgxIDw8IGF4aXMpIHx8IGVsbGlwc2lzTWFzayAmICgxIDw8IGF4aXMpIHx8IHN0b3AgPT0gbnVsbCkge1xuICAgICAgICBpZiAoc3RyaWRlID4gMCkge1xuICAgICAgICAgICAgLy8gRm9yd2FyZCBpdGVyYXRpb24gLSB1c2UgdGhlIGxhc3QgZWxlbWVudC4gVGhlc2UgdmFsdWVzIHdpbGwgZ2V0XG4gICAgICAgICAgICAvLyBjbGFtcGVkIGJlbG93XG4gICAgICAgICAgICBzdG9wID0gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBCYWNrd2FyZCBpdGVyYXRpb24gLSB1c2UgdGhlIGZpcnN0IGVsZW1lbnQuXG4gICAgICAgICAgICBzdG9wID0gTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gSGFuZGxlIG5lZ2F0aXZlIGluZGljZXNcbiAgICBjb25zdCBheGlzU2l6ZSA9IGlucHV0U2hhcGVbYXhpc107XG4gICAgaWYgKHN0b3AgPCAwKSB7XG4gICAgICAgIHN0b3AgKz0gYXhpc1NpemU7XG4gICAgfVxuICAgIC8vIENsYW1waW5nXG4gICAgLy8gQmVjYXVzZSB0aGUgZW5kIGluZGV4IHBvaW50cyBvbmUgcGFzdCB0aGUgbGFzdCBlbGVtZW50LCB3ZSBuZWVkIHNsaWdodGx5XG4gICAgLy8gZGlmZmVyZW50IGNsYW1waW5nIHJhbmdlcyBkZXBlbmRpbmcgb24gdGhlIGRpcmVjdGlvbi5cbiAgICBpZiAoc3RyaWRlID4gMCkge1xuICAgICAgICAvLyBGb3J3YXJkIGl0ZXJhdGlvblxuICAgICAgICBzdG9wID0gdXRpbC5jbGFtcCgwLCBzdG9wLCBheGlzU2l6ZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBCYWNrd2FyZCBpdGVyYXRpb25cbiAgICAgICAgc3RvcCA9IHV0aWwuY2xhbXAoLTEsIHN0b3AsIGF4aXNTaXplIC0gMSk7XG4gICAgfVxuICAgIHJldHVybiBzdG9wO1xufVxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNsaWNlIG9jY3VwaWVzIGEgY29udGlub3VzIHNldCBvZiBlbGVtZW50cyBpbiB0aGVcbiAqICdmbGF0JyBzcGFjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU2xpY2VDb250aW5vdXMoc2hhcGUsIGJlZ2luLCBzaXplKSB7XG4gICAgLy8gSW5kZXggb2YgdGhlIGZpcnN0IGF4aXMgdGhhdCBoYXMgc2l6ZSA+IDEuXG4gICAgbGV0IGZpcnN0Tm9uT25lQXhpcyA9IHNpemUubGVuZ3RoO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2l6ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoc2l6ZVtpXSA+IDEpIHtcbiAgICAgICAgICAgIGZpcnN0Tm9uT25lQXhpcyA9IGk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGxldCBpID0gZmlyc3ROb25PbmVBeGlzICsgMTsgaSA8IHNpemUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGJlZ2luW2ldID4gMCB8fCBzaXplW2ldICE9PSBzaGFwZVtpXSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVGbGF0T2Zmc2V0KGJlZ2luLCBzdHJpZGVzKSB7XG4gICAgbGV0IGZsYXRPZmZzZXQgPSBiZWdpbi5sZW5ndGggPiAwID8gYmVnaW5bYmVnaW4ubGVuZ3RoIC0gMV0gOiAxO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmVnaW4ubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgIGZsYXRPZmZzZXQgKz0gYmVnaW5baV0gKiBzdHJpZGVzW2ldO1xuICAgIH1cbiAgICByZXR1cm4gZmxhdE9mZnNldDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVNsaWNlUGFyYW1zKHgsIGJlZ2luLCBzaXplKSB7XG4gICAgLy8gVGhlIGZvbGxvd2luZyBsb2dpYyBhbGxvd3MgZm9yIG1vcmUgZXJnb25vbWljIGNhbGxzLlxuICAgIGxldCBiZWdpbl87XG4gICAgY29uc3QgeFJhbmsgPSB4LnNoYXBlLmxlbmd0aDtcbiAgICBpZiAodHlwZW9mIGJlZ2luID09PSAnbnVtYmVyJykge1xuICAgICAgICBiZWdpbl8gPSBbYmVnaW4sIC4uLm5ldyBBcnJheSh4UmFuayAtIDEpLmZpbGwoMCldO1xuICAgIH1cbiAgICBlbHNlIGlmIChiZWdpbi5sZW5ndGggPCB4UmFuaykge1xuICAgICAgICBiZWdpbl8gPSBiZWdpbi5jb25jYXQobmV3IEFycmF5KHhSYW5rIC0gYmVnaW4ubGVuZ3RoKS5maWxsKDApKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGJlZ2luXyA9IGJlZ2luLnNsaWNlKCk7XG4gICAgfVxuICAgIGJlZ2luXy5mb3JFYWNoKGQgPT4ge1xuICAgICAgICB1dGlsLmFzc2VydChkICE9PSAtMSwgKCkgPT4gJ3NsaWNlKCkgZG9lcyBub3Qgc3VwcG9ydCBuZWdhdGl2ZSBiZWdpbiBpbmRleGluZy4nKTtcbiAgICB9KTtcbiAgICBsZXQgc2l6ZV87XG4gICAgaWYgKHNpemUgPT0gbnVsbCkge1xuICAgICAgICBzaXplXyA9IG5ldyBBcnJheSh4UmFuaykuZmlsbCgtMSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBzaXplID09PSAnbnVtYmVyJykge1xuICAgICAgICBzaXplXyA9IFtzaXplLCAuLi5uZXcgQXJyYXkoeFJhbmsgLSAxKS5maWxsKC0xKV07XG4gICAgfVxuICAgIGVsc2UgaWYgKHNpemUubGVuZ3RoIDwgeFJhbmspIHtcbiAgICAgICAgc2l6ZV8gPSBzaXplLmNvbmNhdChuZXcgQXJyYXkoeFJhbmsgLSBzaXplLmxlbmd0aCkuZmlsbCgtMSkpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgc2l6ZV8gPSBzaXplO1xuICAgIH1cbiAgICBzaXplXyA9IHNpemVfLm1hcCgoZCwgaSkgPT4ge1xuICAgICAgICBpZiAoZCA+PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHV0aWwuYXNzZXJ0KGQgPT09IC0xLCAoKSA9PiBgTmVnYXRpdmUgc2l6ZSB2YWx1ZXMgc2hvdWxkIGJlIGV4YWN0bHkgLTEgYnV0IGdvdCBgICtcbiAgICAgICAgICAgICAgICBgJHtkfSBmb3IgdGhlIHNsaWNlKCkgc2l6ZSBhdCBpbmRleCAke2l9LmApO1xuICAgICAgICAgICAgcmV0dXJuIHguc2hhcGVbaV0gLSBiZWdpbl9baV07XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gW2JlZ2luXywgc2l6ZV9dO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHNsaWNlSW5mbyh4U2hhcGUsIGJlZ2luLCBlbmQsIHN0cmlkZXMsIGJlZ2luTWFzaywgZW5kTWFzaywgZWxsaXBzaXNNYXNrLCBuZXdBeGlzTWFzaywgc2hyaW5rQXhpc01hc2spIHtcbiAgICAvLyBtYWtlIGEgY29weSBiZWNhdXNlIGl0IG1heSBiZSBtb2RpZmllZCBmdXJ0aGVyIGRvd24uXG4gICAgbGV0ICRiZWdpbiA9IGJlZ2luLnNsaWNlKCk7XG4gICAgbGV0ICRlbmQgPSBlbmQuc2xpY2UoKTtcbiAgICBsZXQgJHN0cmlkZXMgPSBzdHJpZGVzO1xuICAgIGlmIChzdHJpZGVzID09IG51bGwpIHtcbiAgICAgICAgJHN0cmlkZXMgPSBuZXcgQXJyYXkoJGJlZ2luLmxlbmd0aCk7XG4gICAgfVxuICAgIGNvbnN0IGVsbGlwc2lzQXhlcyA9IG1hc2tUb0F4ZXMoZWxsaXBzaXNNYXNrKTtcbiAgICBpZiAoZWxsaXBzaXNBeGVzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNdWx0aXBsZSBlbGxpcHNlcyBpbiBzbGljZSBpcyBub3QgYWxsb3dlZC4nKTtcbiAgICB9XG4gICAgaWYgKGVsbGlwc2lzTWFzayAhPT0gMCAmJiBuZXdBeGlzTWFzayAhPT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VzaW5nIGJvdGggZWxsaXBzaXNNYXNrIGFuZCBuZXdBeGlzTWFzayBpcyBub3QgeWV0IHN1cHBvcnRlZC4nKTtcbiAgICB9XG4gICAgaWYgKGVsbGlwc2lzTWFzayAhPT0gMCAmJiBzaHJpbmtBeGlzTWFzayAhPT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VzaW5nIGJvdGggZWxsaXBzaXNNYXNrIGFuZCBzaHJpbmtBeGlzTWFzayBpcyBub3QgeWV0IHN1cHBvcnRlZC4nKTtcbiAgICB9XG4gICAgY29uc3QgbnVtSW50ZXJwb2xhdGVkQXhlcyA9IHhTaGFwZS5sZW5ndGggLSAkYmVnaW4ubGVuZ3RoO1xuICAgIC8vIEV4cGFuZCB0aGUgZGltcyBvZiB4IGJhc2VkIG9uIHRoZSBuZXdBeGlzTWFzay5cbiAgICBjb25zdCBleHBhbmRBeGVzID0gbWFza1RvQXhlcyhuZXdBeGlzTWFzayk7XG4gICAgY29uc3QgbmV3U2hhcGUgPSB4U2hhcGUuc2xpY2UoKTtcbiAgICBleHBhbmRBeGVzLmZvckVhY2goYXhpcyA9PiB7XG4gICAgICAgICRiZWdpbltheGlzXSA9IDA7XG4gICAgICAgICRlbmRbYXhpc10gPSAxO1xuICAgICAgICBuZXdTaGFwZS5zcGxpY2UoYXhpcywgMCwgMSk7XG4gICAgfSk7XG4gICAgY29uc3QgeyBiZWdpbjogbm9ybWFsaXplZEJlZ2luLCBlbmQ6IG5vcm1hbGl6ZWRFbmQsIHN0cmlkZXM6IG5vcm1hbGl6ZWRTdHJpZGVzIH0gPSBnZXROb3JtYWxpemVkQXhlcyhuZXdTaGFwZSwgZWxsaXBzaXNBeGVzLCBudW1JbnRlcnBvbGF0ZWRBeGVzLCAkYmVnaW4sICRlbmQsICRzdHJpZGVzLCBiZWdpbk1hc2ssIGVuZE1hc2ssIGVsbGlwc2lzTWFzayk7XG4gICAgJGJlZ2luID0gbm9ybWFsaXplZEJlZ2luO1xuICAgICRlbmQgPSBub3JtYWxpemVkRW5kO1xuICAgICRzdHJpZGVzID0gbm9ybWFsaXplZFN0cmlkZXM7XG4gICAgY29uc3Qgc2hyaW5rQXhlcyA9IG1hc2tUb0F4ZXMoc2hyaW5rQXhpc01hc2spO1xuICAgIC8vIEFkanVzdCB0aGUgZW5kcyBiYXNlZCBvbiB0aGUgc2hyaW5rIG1hc2suXG4gICAgc2hyaW5rQXhlcy5mb3JFYWNoKGF4aXMgPT4ge1xuICAgICAgICAkZW5kW2F4aXNdID0gJGJlZ2luW2F4aXNdICsgMTtcbiAgICAgICAgJHN0cmlkZXNbYXhpc10gPSAxO1xuICAgIH0pO1xuICAgIC8vIEZpZ3VyZSBvdXQgdGhlIG91dHB1dCBzaGFwZS5cbiAgICBjb25zdCBzaXplID0gY29tcHV0ZU91dFNoYXBlKCRiZWdpbiwgJGVuZCwgJHN0cmlkZXMpO1xuICAgIC8vIFJlbW92ZSB0aGUgYXhlcyBiYXNlZCBvbiBzaHJpbmtNYXNrLlxuICAgIGNvbnN0IG91dFNoYXBlID0gc2l6ZS5maWx0ZXIoKF8sIGF4aXMpID0+IHNocmlua0F4ZXMuaW5kZXhPZihheGlzKSA9PT0gLTEpO1xuICAgIGNvbnN0IG5vblN0cmlkZWQgPSAkc3RyaWRlcy5ldmVyeSh2ID0+IHYgPT09IDEpO1xuICAgIHJldHVybiB7IG5vblN0cmlkZWQsICRiZWdpbiwgJGVuZCwgJHN0cmlkZXMsIHNpemUsIG5ld1NoYXBlLCBvdXRTaGFwZSB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2xpY2VfdXRpbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgU29mdG1heCB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENvbXB1dGVzIHRoZSBzb2Z0bWF4IG5vcm1hbGl6ZWQgdmVjdG9yIGdpdmVuIHRoZSBsb2dpdHMuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgMiwgM10pO1xuICpcbiAqIGEuc29mdG1heCgpLnByaW50KCk7ICAvLyBvciB0Zi5zb2Z0bWF4KGEpXG4gKiBgYGBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjJkKFsyLCA0LCA2LCAxLCAyLCAzXSwgWzIsIDNdKTtcbiAqXG4gKiBhLnNvZnRtYXgoKS5wcmludCgpOyAgLy8gb3IgdGYuc29mdG1heChhKVxuICogYGBgXG4gKlxuICogQHBhcmFtIGxvZ2l0cyBUaGUgbG9naXRzIGFycmF5LlxuICogQHBhcmFtIGRpbSBUaGUgZGltZW5zaW9uIHNvZnRtYXggd291bGQgYmUgcGVyZm9ybWVkIG9uLiBEZWZhdWx0cyB0byBgLTFgXG4gKiAgICAgd2hpY2ggaW5kaWNhdGVzIHRoZSBsYXN0IGRpbWVuc2lvbi5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdOb3JtYWxpemF0aW9uJ31cbiAqL1xuZnVuY3Rpb24gc29mdG1heF8obG9naXRzLCBkaW0gPSAtMSkge1xuICAgIGNvbnN0ICRsb2dpdHMgPSBjb252ZXJ0VG9UZW5zb3IobG9naXRzLCAnbG9naXRzJywgJ3NvZnRtYXgnLCAnZmxvYXQzMicpO1xuICAgIGlmIChkaW0gPT09IC0xKSB7XG4gICAgICAgIGRpbSA9ICRsb2dpdHMucmFuayAtIDE7XG4gICAgfVxuICAgIGlmIChkaW0gIT09ICRsb2dpdHMucmFuayAtIDEpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoJ1NvZnRtYXggYWxvbmcgYSBub24tbGFzdCBkaW1lbnNpb24gaXMgbm90IHlldCBzdXBwb3J0ZWQuICcgK1xuICAgICAgICAgICAgYExvZ2l0cyB3YXMgcmFuayAkeyRsb2dpdHMucmFua30gYW5kIGRpbSB3YXMgJHtkaW19YCk7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0cyA9IHsgbG9naXRzOiAkbG9naXRzIH07XG4gICAgY29uc3QgYXR0cnMgPSB7IGRpbSB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFNvZnRtYXgsIGlucHV0cywgYXR0cnMpO1xufVxuZXhwb3J0IGNvbnN0IHNvZnRtYXggPSBvcCh7IHNvZnRtYXhfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c29mdG1heC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgU29mdHBsdXMgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyBzb2Z0cGx1cyBvZiB0aGUgaW5wdXQgYHRmLlRlbnNvcmAgZWxlbWVudC13aXNlOiBgbG9nKGV4cCh4KSArIDEpYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzAsIDEsIC0xLCAuN10pO1xuICpcbiAqIHguc29mdHBsdXMoKS5wcmludCgpOyAgLy8gb3IgdGYuc29mdHBsdXMoeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gc29mdHBsdXNfKHgpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdzb2Z0cGx1cycpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChTb2Z0cGx1cywgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBzb2Z0cGx1cyA9IG9wKHsgc29mdHBsdXNfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c29mdHBsdXMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IFNwYWNlVG9CYXRjaE5EIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIFRoaXMgb3BlcmF0aW9uIGRpdmlkZXMgXCJzcGF0aWFsXCIgZGltZW5zaW9ucyBgWzEsIC4uLiwgTV1gIG9mIHRoZSBpbnB1dCBpbnRvXG4gKiBhIGdyaWQgb2YgYmxvY2tzIG9mIHNoYXBlIGBibG9ja1NoYXBlYCwgYW5kIGludGVybGVhdmVzIHRoZXNlIGJsb2NrcyB3aXRoXG4gKiB0aGUgXCJiYXRjaFwiIGRpbWVuc2lvbiAoMCkgc3VjaCB0aGF0IGluIHRoZSBvdXRwdXQsIHRoZSBzcGF0aWFsXG4gKiBkaW1lbnNpb25zIGBbMSwgLi4uLCBNXWAgY29ycmVzcG9uZCB0byB0aGUgcG9zaXRpb24gd2l0aGluIHRoZSBncmlkLFxuICogYW5kIHRoZSBiYXRjaCBkaW1lbnNpb24gY29tYmluZXMgYm90aCB0aGUgcG9zaXRpb24gd2l0aGluIGEgc3BhdGlhbCBibG9ja1xuICogYW5kIHRoZSBvcmlnaW5hbCBiYXRjaCBwb3NpdGlvbi4gUHJpb3IgdG8gZGl2aXNpb24gaW50byBibG9ja3MsXG4gKiB0aGUgc3BhdGlhbCBkaW1lbnNpb25zIG9mIHRoZSBpbnB1dCBhcmUgb3B0aW9uYWxseSB6ZXJvIHBhZGRlZFxuICogYWNjb3JkaW5nIHRvIGBwYWRkaW5nc2AuIFNlZSBiZWxvdyBmb3IgYSBwcmVjaXNlIGRlc2NyaXB0aW9uLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yNGQoWzEsIDIsIDMsIDRdLCBbMSwgMiwgMiwgMV0pO1xuICogY29uc3QgYmxvY2tTaGFwZSA9IFsyLCAyXTtcbiAqIGNvbnN0IHBhZGRpbmdzID0gW1swLCAwXSwgWzAsIDBdXTtcbiAqXG4gKiB4LnNwYWNlVG9CYXRjaE5EKGJsb2NrU2hhcGUsIHBhZGRpbmdzKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHggQSBgdGYuVGVuc29yYC4gTi1EIHdpdGggYHguc2hhcGVgID0gYFtiYXRjaF0gKyBzcGF0aWFsU2hhcGUgK1xuICogcmVtYWluaW5nU2hhcGVgLCB3aGVyZSBzcGF0aWFsU2hhcGUgaGFzIGBNYCBkaW1lbnNpb25zLlxuICogQHBhcmFtIGJsb2NrU2hhcGUgQSAxLUQgYXJyYXkuIE11c3QgaGF2ZSBzaGFwZSBgW01dYCwgYWxsIHZhbHVlcyBtdXN0XG4gKiBiZSA+PSAxLlxuICogQHBhcmFtIHBhZGRpbmdzIEEgMi1EIGFycmF5LiBNdXN0IGhhdmUgc2hhcGUgYFtNLCAyXWAsIGFsbCB2YWx1ZXMgbXVzdCBiZSA+PVxuICogICAgIDAuIGBwYWRkaW5nc1tpXSA9IFtwYWRTdGFydCwgcGFkRW5kXWAgc3BlY2lmaWVzIHRoZSBhbW91bnQgdG8gemVyby1wYWRcbiAqIGZyb20gaW5wdXQgZGltZW5zaW9uIGBpICsgMWAsIHdoaWNoIGNvcnJlc3BvbmRzIHRvIHNwYXRpYWwgZGltZW5zaW9uIGBpYC4gSXRcbiAqIGlzIHJlcXVpcmVkIHRoYXRcbiAqIGAoaW5wdXRTaGFwZVtpICsgMV0gKyBwYWRTdGFydCArIHBhZEVuZCkgJSBibG9ja1NoYXBlW2ldID09PSAwYFxuICpcbiAqIFRoaXMgb3BlcmF0aW9uIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGZvbGxvd2luZyBzdGVwczpcbiAqXG4gKiAxLiBaZXJvLXBhZCB0aGUgc3RhcnQgYW5kIGVuZCBvZiBkaW1lbnNpb25zIGBbMSwgLi4uLCBNXWAgb2YgdGhlIGlucHV0XG4gKiBhY2NvcmRpbmcgdG8gYHBhZGRpbmdzYCB0byBwcm9kdWNlIGBwYWRkZWRgIG9mIHNoYXBlIHBhZGRlZFNoYXBlLlxuICpcbiAqIDIuIFJlc2hhcGUgYHBhZGRlZGAgdG8gYHJlc2hhcGVkUGFkZGVkYCBvZiBzaGFwZTpcbiAqIGBbYmF0Y2hdICsgW3BhZGRlZFNoYXBlWzFdIC8gYmxvY2tTaGFwZVswXSwgYmxvY2tTaGFwZVswXSwgLi4uLFxuICogcGFkZGVkU2hhcGVbTV0gLyBibG9ja1NoYXBlW00tMV0sIGJsb2NrU2hhcGVbTS0xXV0gKyByZW1haW5pbmdTaGFwZWBcbiAqXG4gKiAzLiBQZXJtdXRlIGRpbWVuc2lvbnMgb2YgYHJlc2hhcGVkUGFkZGVkYCB0byBwcm9kdWNlIGBwZXJtdXRlZFJlc2hhcGVkUGFkZGVkYFxuICogb2Ygc2hhcGU6IGBibG9ja1NoYXBlICsgW2JhdGNoXSArIFtwYWRkZWRTaGFwZVsxXSAvIGJsb2NrU2hhcGVbMF0sIC4uLixcbiAqIHBhZGRlZFNoYXBlW01dIC8gYmxvY2tTaGFwZVtNLTFdXSArIHJlbWFpbmluZ1NoYXBlYFxuICpcbiAqIDQuIFJlc2hhcGUgYHBlcm11dGVkUmVzaGFwZWRQYWRkZWRgIHRvIGZsYXR0ZW4gYGJsb2NrU2hhcGVgIGludG8gdGhlXG4gKiBiYXRjaCBkaW1lbnNpb24sIHByb2R1Y2luZyBhbiBvdXRwdXQgdGVuc29yIG9mIHNoYXBlOlxuICogYFtiYXRjaCAqIHByb2QoYmxvY2tTaGFwZSldICsgW3BhZGRlZFNoYXBlWzFdIC8gYmxvY2tTaGFwZVswXSwgLi4uLFxuICogcGFkZGVkU2hhcGVbTV0gLyBibG9ja1NoYXBlW00tMV1dICsgcmVtYWluaW5nU2hhcGVgXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnVHJhbnNmb3JtYXRpb25zJ31cbiAqL1xuZnVuY3Rpb24gc3BhY2VUb0JhdGNoTkRfKHgsIGJsb2NrU2hhcGUsIHBhZGRpbmdzKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnc3BhY2VUb0JhdGNoTkQnKTtcbiAgICB1dGlsLmFzc2VydCgkeC5yYW5rID49IDEgKyBibG9ja1NoYXBlLmxlbmd0aCwgKCkgPT4gYGlucHV0IHJhbmsgJHskeC5yYW5rfSBzaG91bGQgYmUgPiB0aGFuIFtibG9ja1NoYXBlXSAke2Jsb2NrU2hhcGUubGVuZ3RofWApO1xuICAgIHV0aWwuYXNzZXJ0KHBhZGRpbmdzLmxlbmd0aCA9PT0gYmxvY2tTaGFwZS5sZW5ndGgsICgpID0+IGBwYWRkaW5ncy5zaGFwZVswXSAke3BhZGRpbmdzLmxlbmd0aH0gbXVzdCBiZSBlcXVhbCB0byBbYmxvY2tTaGFwZV0gJHtibG9ja1NoYXBlLmxlbmd0aH1gKTtcbiAgICB1dGlsLmFzc2VydCgkeC5zaGFwZS5yZWR1Y2UoKGEsIGIsIGkpID0+IHtcbiAgICAgICAgaWYgKGkgPiAwICYmIGkgPD0gYmxvY2tTaGFwZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBhICYmXG4gICAgICAgICAgICAgICAgKChiICsgcGFkZGluZ3NbaSAtIDFdWzBdICsgcGFkZGluZ3NbaSAtIDFdWzFdKSAlXG4gICAgICAgICAgICAgICAgICAgIGJsb2NrU2hhcGVbaSAtIDFdID09PVxuICAgICAgICAgICAgICAgICAgICAwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYTtcbiAgICB9LCB0cnVlKSwgKCkgPT4gYGlucHV0IHNwYXRpYWwgZGltZW5zaW9ucyAkeyR4LnNoYXBlLnNsaWNlKDEpfSB3aXRoIHBhZGRpbmdzICR7cGFkZGluZ3MudG9TdHJpbmcoKX0gbXVzdCBiZSBkaXZpc2libGUgYnkgYmxvY2tTaGFwZXMgJHtibG9ja1NoYXBlLnRvU3RyaW5nKCl9YCk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBibG9ja1NoYXBlLCBwYWRkaW5ncyB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFNwYWNlVG9CYXRjaE5ELCBpbnB1dHMsIGF0dHJzKTtcbn1cbmV4cG9ydCBjb25zdCBzcGFjZVRvQmF0Y2hORCA9IG9wKHsgc3BhY2VUb0JhdGNoTkRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3BhY2VfdG9fYmF0Y2hfbmQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vLi4vZW5naW5lJztcbmltcG9ydCB7IFNwYXJzZUZpbGxFbXB0eVJvd3MgfSBmcm9tICcuLi8uLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbi8qKlxuICogVGhlIGlucHV0IFNwYXJzZVRlbnNvciBpcyByZXByZXNlbnRlZCB2aWEgdGhlIG1hcCBvZiBpbnB1dHMge2BpbmRpY2VzYCxcbiAqIGB2YWx1ZXNgLCBgZGVuc2VTaGFwZWB9LiBUaGUgb3V0cHV0IFNwYXJzZVRlbnNvciBoYXMgdGhlIHNhbWUgYGRlbnNlU2hhcGVgXG4gKiBidXQgd2l0aCBpbmRpY2VzIGBvdXRwdXRJbmRpY2VzYCBhbmQgdmFsdWVzIGBvdXRwdXRWYWx1ZXNgLiBUaGlzIG9wIGluc2VydHMgYVxuICogc2luZ2xlIGVudHJ5IGZvciBldmVyeSByb3cgdGhhdCBkb2Vzbid0IGhhdmUgYW55IHZhbHVlcy4gVGhlIGluZGV4IGlzIGNyZWF0ZWRcbiAqIGFzIGBbcm93LCAwLCAuLi4sIDBdYCBhbmQgdGhlIGluc2VydGVkIHZhbHVlIGlzIGBkZWZhdWx0VmFsdWVgLlxuICpcbiAqIEZvciBleGFtcGxlLCBzdXBwb3NlIGBzcElucHV0YCBoYXMgc2hhcGUgWzUsIDZdIGFuZCBub24tZW1wdHkgdmFsdWVzOlxuICogWzAsIDFdOiBhXG4gKiBbMCwgM106IGJcbiAqIFsyLCAwXTogY1xuICogWzMsIDFdOiBkXG4gKlxuICogUm93cyAxIGFuZCA0IGFyZSBlbXB0eSwgc28gdGhlIG91dHB1dCB3aWxsIGJlIG9mIHNoYXBlIFs1LCA2XSB3aXRoIHZhbHVlczpcbiAqIFswLCAxXTogYVxuICogWzAsIDNdOiBiXG4gKiBbMSwgMF06IGBkZWZhdWx0VmFsdWVgXG4gKiBbMiwgMF06IGNcbiAqIFszLCAxXTogZFxuICogWzQsIDBdOiBgZGVmYXVsdFZhbHVlYFxuICpcbiAqIFRoZSBvdXRwdXQgU3BhcnNlVGVuc29yIHdpbGwgYmUgaW4gcm93LW1ham9yIG9yZGVyIGFuZCB3aWxsIGhhdmUgdGhlIHNhbWVcbiAqIHNoYXBlIGFzIHRoZSBpbnB1dC5cbiAqXG4gKiBUaGlzIG9wIGFsc28gcmV0dXJucyBhbiBpbmRpY2F0b3IgdmVjdG9yIHNoYXBlZCBbZGVuc2Vfc2hhcGVbMF1dIHN1Y2ggdGhhdFxuICogZW1wdHlSb3dJbmRpY2F0b3JbaV0gPSBUcnVlIGlmZiByb3cgaSB3YXMgYW4gZW1wdHkgcm93LlxuICpcbiAqIEFuZCBhIHJldmVyc2UgaW5kZXggbWFwIHZlY3RvciBzaGFwZWQgW2luZGljZXMuc2hhcGVbMF1dIHRoYXQgaXMgdXNlZCBkdXJpbmdcbiAqIGJhY2twcm9wYWdhdGlvbiwgcmV2ZXJzZUluZGV4TWFwW2ldID0gb3V0aSBzLnQuIGluZGljZXNbaSwgal0gPT1cbiAqIG91dHB1dEluZGljZXNbb3V0aSwgal0gZm9yIGFsbCBqXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHJlc3VsdCA9IHRmLnNwYXJzZS5zcGFyc2VGaWxsRW1wdHlSb3dzKFxuICogICBbWzAsIDBdLCBbMSwgMF0sIFsxLCAzXSwgWzEsIDRdLCBbMywgMl0sIFszLCAzXV0sXG4gKiAgIFswLCAxMCwgMTMsIDE0LCAzMiwgMzNdLCBbNSwgNl0sIC0xKTtcbiAqIGNvbnNvbGUubG9nKHJlc3VsdCk7XG4gKiByZXN1bHRbJ291dHB1dEluZGljZXMnXS5wcmludCgpOyAvLyBbWzAsIDBdLCBbMSwgMF0sIFsxLCAzXSwgWzEsIDRdLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIFsyLCAwXSwgWzMsIDJdLCBbMywgM10sIFs0LCAwXV1cbiAqIHJlc3VsdFsnb3V0cHV0VmFsdWVzJ10ucHJpbnQoKTsgLy8gWzAsIDEwLCAxMywgMTQsLTEsIDMyLCAzMywgLTFdXG4gKiByZXN1bHRbJ2VtcHR5Um93SW5kaWNhdG9yJ10ucHJpbnQoKTsgLy8gW2ZhbHNlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIHRydWVdXG4gKiByZXN1bHRbJ3JldmVyc2VJbmRleE1hcCddLnByaW50KCk7IC8vIFswLCAxLCAyLCAzLCA1LCA2XVxuICogYGBgXG4gKiBAcGFyYW0gaW5kaWNlczogMi1ELiB0aGUgaW5kaWNlcyBvZiB0aGUgc3BhcnNlIHRlbnNvci5cbiAqIEBwYXJhbSB2YWx1ZXM6IDEtRC4gdGhlIHZhbHVlcyBvZiB0aGUgc3BhcnNlIHRlbnNvci5cbiAqIEBwYXJhbSBkZW5zZVNoYXBlOiAxLUQuIHRoZSBzaGFwZSBvZiB0aGUgc3BhcnNlIHRlbnNvci5cbiAqIEBwYXJhbSBkZWZhdWx0VmFsdWU6IDAtRC4gZGVmYXVsdCB2YWx1ZSB0byBpbnNlcnQgaW50byBsb2NhdGlvbiBbcm93LCAwLCAuLi4sXG4gKiAgICAgMF0gZm9yIHJvd3MgbWlzc2luZyBmcm9tIHRoZSBpbnB1dCBzcGFyc2UgdGVuc29yLlxuICogQHJldHVybiBBIG1hcCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqICAgICAtIG91dHB1dEluZGljZXNcbiAqICAgICAtIG91dHB1dFZhbHVlczogMS1ELiB0aGUgdmFsdWVzIG9mIHRoZSBmaWxsZWQgc3BhcnNlIHRlbnNvci5cbiAqICAgICAtIGVtcHR5Um93SW5kaWNhdG9yOiAxLUQuIHdoZXRoZXIgdGhlIGRlbnNlIHJvdyB3YXMgbWlzc2luZyBpbiB0aGUgaW5wdXRcbiAqIHNwYXJzZSB0ZW5zb3IuXG4gKiAgICAgLSByZXZlcnNlSW5kZXhNYXA6IDEtRC4gYSBtYXAgZnJvbSB0aGUgaW5wdXQgaW5kaWNlcyB0byB0aGUgb3V0cHV0XG4gKiBpbmRpY2VzLlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnU3BhcnNlJ31cbiAqL1xuZnVuY3Rpb24gc3BhcnNlRmlsbEVtcHR5Um93c18oaW5kaWNlcywgdmFsdWVzLCBkZW5zZVNoYXBlLCBkZWZhdWx0VmFsdWUpIHtcbiAgICBjb25zdCAkaW5kaWNlcyA9IGNvbnZlcnRUb1RlbnNvcihpbmRpY2VzLCAnaW5kaWNlcycsICdzcGFyc2VGaWxsRW1wdHlSb3dzJyk7XG4gICAgY29uc3QgJHZhbHVlcyA9IGNvbnZlcnRUb1RlbnNvcih2YWx1ZXMsICd2YWx1ZXMnLCAnc3BhcnNlRmlsbEVtcHR5Um93cycpO1xuICAgIGNvbnN0ICRkZW5zZVNoYXBlID0gY29udmVydFRvVGVuc29yKGRlbnNlU2hhcGUsICdkZW5zZVNoYXBlJywgJ3NwYXJzZUZpbGxFbXB0eVJvd3MnKTtcbiAgICBjb25zdCAkZGVmYXVsdFZhbHVlID0gY29udmVydFRvVGVuc29yKGRlZmF1bHRWYWx1ZSwgJ2RlZmF1bHRWYWx1ZScsICdzcGFyc2VGaWxsRW1wdHlSb3dzJywgJHZhbHVlcy5kdHlwZSk7XG4gICAgaWYgKCRpbmRpY2VzLnJhbmsgIT09IDIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbmRpY2VzIHNob3VsZCBiZSBUZW5zb3IyRCBidXQgcmVjZWl2ZWQgc2hhcGVcbiAgICAgICAgJHskaW5kaWNlcy5zaGFwZX1gKTtcbiAgICB9XG4gICAgaWYgKCR2YWx1ZXMucmFuayAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFZhbHVlcyBzaG91bGQgYmUgVGVuc29yMUQgYnV0IHJlY2VpdmVkIHNoYXBlICR7JHZhbHVlcy5zaGFwZX1gKTtcbiAgICB9XG4gICAgaWYgKCRkZW5zZVNoYXBlLnJhbmsgIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEZW5zZSBzaGFwZSBzaG91bGQgYmUgVGVuc29yMUQgYnV0IHJlY2VpdmVkIHNoYXBlICR7JGRlbnNlU2hhcGUuc2hhcGV9YCk7XG4gICAgfVxuICAgIGlmICgkZGVmYXVsdFZhbHVlLnJhbmsgIT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEZWZhdWx0IHZhbHVlIHNob3VsZCBiZSBhIHNjYWxhciBidXQgcmVjZWl2ZWQgc2hhcGUgJHskZGVmYXVsdFZhbHVlLnNoYXBlfWApO1xuICAgIH1cbiAgICBjb25zdCBpbnB1dHMgPSB7XG4gICAgICAgIGluZGljZXM6ICRpbmRpY2VzLFxuICAgICAgICB2YWx1ZXM6ICR2YWx1ZXMsXG4gICAgICAgIGRlbnNlU2hhcGU6ICRkZW5zZVNoYXBlLFxuICAgICAgICBkZWZhdWx0VmFsdWU6ICRkZWZhdWx0VmFsdWVcbiAgICB9O1xuICAgIGNvbnN0IHJlc3VsdCA9IEVOR0lORS5ydW5LZXJuZWwoU3BhcnNlRmlsbEVtcHR5Um93cywgaW5wdXRzKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBvdXRwdXRJbmRpY2VzOiByZXN1bHRbMF0sXG4gICAgICAgIG91dHB1dFZhbHVlczogcmVzdWx0WzFdLFxuICAgICAgICBlbXB0eVJvd0luZGljYXRvcjogcmVzdWx0WzJdLFxuICAgICAgICByZXZlcnNlSW5kZXhNYXA6IHJlc3VsdFszXVxuICAgIH07XG59XG5leHBvcnQgY29uc3Qgc3BhcnNlRmlsbEVtcHR5Um93cyA9IG9wKHsgc3BhcnNlRmlsbEVtcHR5Um93c18gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zcGFyc2VfZmlsbF9lbXB0eV9yb3dzLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBTcGFyc2VSZXNoYXBlIH0gZnJvbSAnLi4vLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4uL29wZXJhdGlvbic7XG4vKipcbiAqIFRoaXMgb3BlcmF0aW9uIGhhcyB0aGUgc2FtZSBzZW1hbnRpY3MgYXMgcmVzaGFwZSBvbiB0aGUgcmVwcmVzZW50ZWQgZGVuc2VcbiAqIHRlbnNvci4gVGhlIGBpbnB1dEluZGljZXNgIGFyZSByZWNvbXB1dGVkIGJhc2VkIG9uIHRoZSByZXF1ZXN0ZWQgYG5ld1NoYXBlYC5cbiAqIElmIG9uZSBjb21wb25lbnQgb2YgYG5ld1NoYXBlYCBpcyB0aGUgc3BlY2lhbCB2YWx1ZSAtMSwgdGhlIHNpemUgb2YgdGhhdFxuICogZGltZW5zaW9uIGlzIGNvbXB1dGVkIHNvIHRoYXQgdGhlIHRvdGFsIGRlbnNlIHNpemUgcmVtYWlucyBjb25zdGFudC4gQXQgbW9zdFxuICogb25lIGNvbXBvbmVudCBvZiBgbmV3U2hhcGVgIGNhbiBiZSAtMS4gVGhlIG51bWJlciBvZiBkZW5zZSBlbGVtZW50cyBpbXBsaWVkXG4gKiBieSBgbmV3U2hhcGVgIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiBkZW5zZSBlbGVtZW50cyBvcmlnaW5hbGx5XG4gKiBpbXBsaWVkIGJ5IGBpbnB1dFNoYXBlYC4gUmVzaGFwaW5nIGRvZXMgbm90IGFmZmVjdCB0aGUgb3JkZXIgb2YgdmFsdWVzIGluIHRoZVxuICogU3BhcnNlVGVuc29yLiBJZiB0aGUgaW5wdXQgdGVuc29yIGhhcyByYW5rIFJfaW4gYW5kIE4gbm9uLWVtcHR5IHZhbHVlcywgYW5kXG4gKiBgbmV3U2hhcGVgIGhhcyBsZW5ndGggUl9vdXQsIHRoZW4gYGlucHV0SW5kaWNlc2AgaGFzIHNoYXBlIFtOLCBSX2luXSxcbiAqIGBpbnB1dFNoYXBlYCBoYXMgbGVuZ3RoIFJfaW4sIGBvdXRwdXRJbmRpY2VzYCBoYXMgc2hhcGUgW04sIFJfb3V0XSwgYW5kXG4gKiBgb3V0cHV0U2hhcGVgIGhhcyBsZW5ndGggUl9vdXQuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHJlc3VsdCA9IHRmLnNwYXJzZS5zcGFyc2VSZXNoYXBlKFxuICogICBbWzAsIDAsIDBdLCBbMCwgMCwgMV0sIFswLCAxLCAwXSwgWzEsIDAsIDBdLCBbMSwgMiwgM11dLFxuICogICBbMiwgMywgNl0sIFs5LCAtMV0pO1xuICogY29uc29sZS5sb2cocmVzdWx0KTtcbiAqIHJlc3VsdFsnb3V0cHV0SW5kaWNlcyddLnByaW50KCk7IC8vW1swLCAwXSwgWzAsIDFdLCBbMSwgMl0sIFs0LCAyXSwgWzgsIDFdXVxuICogcmVzdWx0WydvdXRwdXRTaGFwZSddLnByaW50KCk7IC8vIFs5LCA0XVxuICogYGBgXG4gKiBAcGFyYW0gaW5wdXRJbmRpY2VzOiAyLUQuIE4geCBSX2luIG1hdHJpeCB3aXRoIHRoZSBpbmRpY2VzIG9mIG5vbi1lbXB0eVxuICogdmFsdWVzIGluIGEgU3BhcnNlVGVuc29yLlxuICogQHBhcmFtIGlucHV0U2hhcGU6IDEtRC4gUl9pbiBUZW5zb3IxRCB3aXRoIHRoZSBpbnB1dCBTcGFyc2VUZW5zb3IncyBkZW5zZVxuICogc2hhcGUuXG4gKiBAcGFyYW0gbmV3U2hhcGU6IDEtRC4gUl9vdXQgVGVuc29yMUQgd2l0aCB0aGUgcmVxdWVzdGVkIG5ldyBkZW5zZSBzaGFwZS5cbiAqIEByZXR1cm4gQSBtYXAgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKiAgICAgLSBvdXRwdXRJbmRpY2VzOiAyLUQuIE4geCBSX291dCBtYXRyaXggd2l0aCB0aGUgdXBkYXRlZCBpbmRpY2VzIG9mXG4gKiAgICAgICBub24tZW1wdHkgdmFsdWVzIGluIHRoZSBvdXRwdXQgU3BhcnNlVGVuc29yLlxuICogICAgIC0gb3V0cHV0U2hhcGU6IDEtRC4gUl9vdXQgdmVjdG9yIHdpdGggdGhlIGZ1bGwgZGVuc2Ugc2hhcGUgb2YgdGhlIG91dHB1dFxuICogICAgICAgU3BhcnNlVGVuc29yLiBUaGlzIGlzIHRoZSBzYW1lIGFzIG5ld1NoYXBlIGJ1dCB3aXRoIGFueSAtMSBkaW1lbnNpb25zXG4gKiAgICAgICAgZmlsbGVkIGluLlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnU3BhcnNlJ31cbiAqL1xuZnVuY3Rpb24gc3BhcnNlUmVzaGFwZV8oaW5wdXRJbmRpY2VzLCBpbnB1dFNoYXBlLCBuZXdTaGFwZSkge1xuICAgIGNvbnN0ICRpbnB1dEluZGljZXMgPSBjb252ZXJ0VG9UZW5zb3IoaW5wdXRJbmRpY2VzLCAnaW5wdXRJbmRpY2VzJywgJ3NwYXJzZVJlc2hhcGUnKTtcbiAgICBjb25zdCAkaW5wdXRTaGFwZSA9IGNvbnZlcnRUb1RlbnNvcihpbnB1dFNoYXBlLCAnaW5wdXRTaGFwZScsICdzcGFyc2VSZXNoYXBlJyk7XG4gICAgY29uc3QgJG5ld1NoYXBlID0gY29udmVydFRvVGVuc29yKG5ld1NoYXBlLCAnbmV3U2hhcGUnLCAnc3BhcnNlUmVzaGFwZScpO1xuICAgIGlmICgkaW5wdXRJbmRpY2VzLnJhbmsgIT09IDIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnB1dCBpbmRpY2VzIHNob3VsZCBiZSBUZW5zb3IyRCBidXQgcmVjZWl2ZWQgc2hhcGVcbiAgICAgICAgJHskaW5wdXRJbmRpY2VzLnNoYXBlfWApO1xuICAgIH1cbiAgICBpZiAoJGlucHV0U2hhcGUucmFuayAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYElucHV0IHNoYXBlIHNob3VsZCBiZSBUZW5zb3IxRCBidXQgcmVjZWl2ZWQgc2hhcGUgJHskaW5wdXRTaGFwZS5zaGFwZX1gKTtcbiAgICB9XG4gICAgaWYgKCRuZXdTaGFwZS5yYW5rICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTmV3IHNoYXBlIHNob3VsZCBiZSBUZW5zb3IxRCBidXQgcmVjZWl2ZWQgc2hhcGUgJHskbmV3U2hhcGUuc2hhcGV9YCk7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0cyA9IHtcbiAgICAgICAgaW5wdXRJbmRpY2VzOiAkaW5wdXRJbmRpY2VzLFxuICAgICAgICBpbnB1dFNoYXBlOiAkaW5wdXRTaGFwZSxcbiAgICAgICAgbmV3U2hhcGU6ICRuZXdTaGFwZVxuICAgIH07XG4gICAgY29uc3QgcmVzdWx0ID0gRU5HSU5FLnJ1bktlcm5lbChTcGFyc2VSZXNoYXBlLCBpbnB1dHMpO1xuICAgIHJldHVybiB7IG91dHB1dEluZGljZXM6IHJlc3VsdFswXSwgb3V0cHV0U2hhcGU6IHJlc3VsdFsxXSB9O1xufVxuZXhwb3J0IGNvbnN0IHNwYXJzZVJlc2hhcGUgPSBvcCh7IHNwYXJzZVJlc2hhcGVfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3BhcnNlX3Jlc2hhcGUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vLi4vZW5naW5lJztcbmltcG9ydCB7IFNwYXJzZVNlZ21lbnRNZWFuIH0gZnJvbSAnLi4vLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4uL29wZXJhdGlvbic7XG4vKipcbiAqIENvbXB1dGVzIHRoZSBtZWFuIGFsb25nIHNwYXJzZSBzZWdtZW50cyBvZiBhIHRlbnNvci5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYyA9IHRmLnRlbnNvcjJkKFtbMSwyLDMsNF0sIFstMSwtMiwtMywtNF0sIFs2LDcsOCw5XV0pO1xuICogLy8gU2VsZWN0IHR3byByb3dzLCBvbmUgc2VnbWVudC5cbiAqIGNvbnN0IHJlc3VsdDEgPSB0Zi5zcGFyc2Uuc3BhcnNlU2VnbWVudE1lYW4oYyxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRmLnRlbnNvcjFkKFswLCAxXSwgJ2ludDMyJyksXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Zi50ZW5zb3IxZChbMCwgMF0sICdpbnQzMicpKTtcbiAqIHJlc3VsdDEucHJpbnQoKTsgLy8gW1swLCAwLCAwLCAwXV1cbiAqXG4gKiAvLyBTZWxlY3QgdHdvIHJvd3MsIHR3byBzZWdtZW50cy5cbiAqIGNvbnN0IHJlc3VsdDIgPSB0Zi5zcGFyc2Uuc3BhcnNlU2VnbWVudE1lYW4oYyxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGYudGVuc29yMWQoWzAsIDFdLCAnaW50MzInKSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGYudGVuc29yMWQoWzAsIDFdLCAnaW50MzInKSk7XG4gKiByZXN1bHQyLnByaW50KCk7IC8vIFtbMSwgMiwgMywgNF0sIFstMSwgLTIsIC0zLCAtNF1dXG4gKlxuICogLy8gU2VsZWN0IGFsbCByb3dzLCB0d28gc2VnbWVudHMuXG4gKiBjb25zdCByZXN1bHQzID0gdGYuc3BhcnNlLnNwYXJzZVNlZ21lbnRNZWFuKGMsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRmLnRlbnNvcjFkKFswLCAxLCAyXSwgJ2ludDMyJyksXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRmLnRlbnNvcjFkKFswLCAxLCAxXSwgJ2ludDMyJykpO1xuICogcmVzdWx0My5wcmludCgpOyAvLyBbWzEuMCwgMi4wLCAzLjAsIDQuMF0sIFsyLjUsIDIuNSwgMi41LCAyLjVdXVxuICogYGBgXG4gKiBAcGFyYW0gZGF0YTogQSBUZW5zb3Igb2YgYXQgbGVhc3Qgb25lIGRpbWVuc2lvbiB3aXRoIGRhdGEgdGhhdCB3aWxsIGJlXG4gKiAgICAgYXNzZW1ibGVkIGluIHRoZSBvdXRwdXQuXG4gKiBAcGFyYW0gaW5kaWNlczogQSAxLUQgVGVuc29yIHdpdGggaW5kaWNlcyBpbnRvIGRhdGEuIEhhcyBzYW1lIHJhbmsgYXNcbiAqICAgICBzZWdtZW50SWRzLlxuICogQHBhcmFtIHNlZ21lbnRJZHM6IEEgMS1EIFRlbnNvciB3aXRoIGluZGljZXMgaW50byB0aGUgb3V0cHV0IFRlbnNvci4gVmFsdWVzXG4gKiAgICAgc2hvdWxkIGJlIHNvcnRlZCBhbmQgY2FuIGJlIHJlcGVhdGVkLlxuICogQHJldHVybiBIYXMgc2FtZSBzaGFwZSBhcyBkYXRhLCBleGNlcHQgZm9yIGRpbWVuc2lvbiAwIHdoaWNoIGhhcyBlcXVhbCB0b1xuICogICAgICAgICB0aGUgbnVtYmVyIG9mIHNlZ21lbnRzLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ1NwYXJzZSd9XG4gKi9cbmZ1bmN0aW9uIHNwYXJzZVNlZ21lbnRNZWFuXyhkYXRhLCBpbmRpY2VzLCBzZWdtZW50SWRzKSB7XG4gICAgY29uc3QgJGRhdGEgPSBjb252ZXJ0VG9UZW5zb3IoZGF0YSwgJ2RhdGEnLCAnc3BhcnNlU2VnbWVudE1lYW4nKTtcbiAgICBjb25zdCAkaW5kaWNlcyA9IGNvbnZlcnRUb1RlbnNvcihpbmRpY2VzLCAnaW5kaWNlcycsICdzcGFyc2VTZWdtZW50TWVhbicpO1xuICAgIGNvbnN0ICRzZWdtZW50SWRzID0gY29udmVydFRvVGVuc29yKHNlZ21lbnRJZHMsICdzZWdtZW50SWRzJywgJ3NwYXJzZVNlZ21lbnRNZWFuJyk7XG4gICAgaWYgKCRkYXRhLnJhbmsgPCAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRGF0YSBzaG91bGQgYmUgYXQgbGVhc3QgMSBkaW1lbnNpb25hbCBidXQgcmVjZWl2ZWQgc2NhbGFyYCk7XG4gICAgfVxuICAgIGlmICgkaW5kaWNlcy5yYW5rICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW5kaWNlcyBzaG91bGQgYmUgVGVuc29yMUQgYnV0IHJlY2VpdmVkIHNoYXBlXG4gICAgICAgICAgJHskaW5kaWNlcy5zaGFwZX1gKTtcbiAgICB9XG4gICAgaWYgKCRzZWdtZW50SWRzLnJhbmsgIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTZWdtZW50IGlkcyBzaG91bGQgYmUgVGVuc29yMUQgYnV0IHJlY2VpdmVkIHNoYXBlXG4gICAgICAgICAgJHskc2VnbWVudElkcy5zaGFwZX1gKTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRzID0ge1xuICAgICAgICBkYXRhOiAkZGF0YSxcbiAgICAgICAgaW5kaWNlczogJGluZGljZXMsXG4gICAgICAgIHNlZ21lbnRJZHM6ICRzZWdtZW50SWRzXG4gICAgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChTcGFyc2VTZWdtZW50TWVhbiwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBzcGFyc2VTZWdtZW50TWVhbiA9IG9wKHsgc3BhcnNlU2VnbWVudE1lYW5fIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3BhcnNlX3NlZ21lbnRfbWVhbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi8uLi9lbmdpbmUnO1xuaW1wb3J0IHsgU3BhcnNlU2VnbWVudFN1bSB9IGZyb20gJy4uLy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyB0aGUgc3VtIGFsb25nIHNwYXJzZSBzZWdtZW50cyBvZiBhIHRlbnNvci5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYyA9IHRmLnRlbnNvcjJkKFtbMSwyLDMsNF0sIFstMSwtMiwtMywtNF0sIFs1LDYsNyw4XV0pO1xuICogLy8gU2VsZWN0IHR3byByb3dzLCBvbmUgc2VnbWVudC5cbiAqIGNvbnN0IHJlc3VsdDEgPSB0Zi5zcGFyc2Uuc3BhcnNlU2VnbWVudFN1bShjLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGYudGVuc29yMWQoWzAsIDFdLCAnaW50MzInKSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRmLnRlbnNvcjFkKFswLCAwXSwgJ2ludDMyJykpO1xuICogcmVzdWx0MS5wcmludCgpOyAvLyBbWzAsIDAsIDAsIDBdXVxuICpcbiAqIC8vIFNlbGVjdCB0d28gcm93cywgdHdvIHNlZ21lbnQuXG4gKiBjb25zdCByZXN1bHQyID0gdGYuc3BhcnNlLnNwYXJzZVNlZ21lbnRTdW0oYyxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRmLnRlbnNvcjFkKFswLCAxXSwgJ2ludDMyJyksXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Zi50ZW5zb3IxZChbMCwgMV0sICdpbnQzMicpKTtcbiAqIHJlc3VsdDIucHJpbnQoKTsgLy8gW1sxLCAyLCAzLCA0XSwgWy0xLCAtMiwgLTMsIC00XV1cbiAqXG4gKiAvLyBTZWxlY3QgYWxsIHJvd3MsIHR3byBzZWdtZW50cy5cbiAqIGNvbnN0IHJlc3VsdDMgPSB0Zi5zcGFyc2Uuc3BhcnNlU2VnbWVudFN1bShjLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGYudGVuc29yMWQoWzAsIDEsIDJdLCAnaW50MzInKSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRmLnRlbnNvcjFkKFswLCAwLCAxXSwgJ2ludDMyJykpO1xuICogcmVzdWx0My5wcmludCgpOyAvLyBbWzAsIDAsIDAsIDBdLCBbNSwgNiwgNywgOF1dXG4gKiBgYGBcbiAqIEBwYXJhbSBkYXRhOiBBIFRlbnNvciBvZiBhdCBsZWFzdCBvbmUgZGltZW5zaW9uIHdpdGggZGF0YSB0aGF0IHdpbGwgYmVcbiAqICAgICBhc3NlbWJsZWQgaW4gdGhlIG91dHB1dC5cbiAqIEBwYXJhbSBpbmRpY2VzOiBBIDEtRCBUZW5zb3Igd2l0aCBpbmRpY2VzIGludG8gZGF0YS4gSGFzIHNhbWUgcmFuayBhc1xuICogICAgIHNlZ21lbnRJZHMuXG4gKiBAcGFyYW0gc2VnbWVudElkczogQSAxLUQgVGVuc29yIHdpdGggaW5kaWNlcyBpbnRvIHRoZSBvdXRwdXQgVGVuc29yLiBWYWx1ZXNcbiAqICAgICBzaG91bGQgYmUgc29ydGVkIGFuZCBjYW4gYmUgcmVwZWF0ZWQuXG4gKiBAcmV0dXJuIEhhcyBzYW1lIHNoYXBlIGFzIGRhdGEsIGV4Y2VwdCBmb3IgZGltZW5zaW9uIDAgd2hpY2ggaGFzIGVxdWFsIHRvXG4gKiAgICAgICAgIHRoZSBudW1iZXIgb2Ygc2VnbWVudHMuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnU3BhcnNlJ31cbiAqL1xuZnVuY3Rpb24gc3BhcnNlU2VnbWVudFN1bV8oZGF0YSwgaW5kaWNlcywgc2VnbWVudElkcykge1xuICAgIGNvbnN0ICRkYXRhID0gY29udmVydFRvVGVuc29yKGRhdGEsICdkYXRhJywgJ3NwYXJzZVNlZ21lbnRTdW0nKTtcbiAgICBjb25zdCAkaW5kaWNlcyA9IGNvbnZlcnRUb1RlbnNvcihpbmRpY2VzLCAnaW5kaWNlcycsICdzcGFyc2VTZWdtZW50U3VtJyk7XG4gICAgY29uc3QgJHNlZ21lbnRJZHMgPSBjb252ZXJ0VG9UZW5zb3Ioc2VnbWVudElkcywgJ3NlZ21lbnRJZHMnLCAnc3BhcnNlU2VnbWVudFN1bScpO1xuICAgIGlmICgkZGF0YS5yYW5rIDwgMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYERhdGEgc2hvdWxkIGJlIGF0IGxlYXN0IDEgZGltZW5zaW9uYWwgYnV0IHJlY2VpdmVkIHNjYWxhcmApO1xuICAgIH1cbiAgICBpZiAoJGluZGljZXMucmFuayAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEluZGljZXMgc2hvdWxkIGJlIFRlbnNvcjFEIGJ1dCByZWNlaXZlZCBzaGFwZVxuICAgICAgICAgJHskaW5kaWNlcy5zaGFwZX1gKTtcbiAgICB9XG4gICAgaWYgKCRzZWdtZW50SWRzLnJhbmsgIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTZWdtZW50IGlkcyBzaG91bGQgYmUgVGVuc29yMUQgYnV0IHJlY2VpdmVkIHNoYXBlXG4gICAgICAgICAkeyRzZWdtZW50SWRzLnNoYXBlfWApO1xuICAgIH1cbiAgICBjb25zdCBpbnB1dHMgPSB7XG4gICAgICAgIGRhdGE6ICRkYXRhLFxuICAgICAgICBpbmRpY2VzOiAkaW5kaWNlcyxcbiAgICAgICAgc2VnbWVudElkczogJHNlZ21lbnRJZHNcbiAgICB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFNwYXJzZVNlZ21lbnRTdW0sIGlucHV0cyk7XG59XG5leHBvcnQgY29uc3Qgc3BhcnNlU2VnbWVudFN1bSA9IG9wKHsgc3BhcnNlU2VnbWVudFN1bV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zcGFyc2Vfc2VnbWVudF9zdW0uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IFNwYXJzZVRvRGVuc2UgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0ICogYXMgc3BhcnNlX3RvX2RlbnNlIGZyb20gJy4uL29wcy9zcGFyc2VfdG9fZGVuc2VfdXRpbCc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENvbnZlcnRzIGEgc3BhcnNlIHJlcHJlc2VudGF0aW9uIGludG8gYSBkZW5zZSB0ZW5zb3IuXG4gKlxuICogQnVpbGRzIGFuIGFycmF5IGRlbnNlIHdpdGggc2hhcGUgb3V0cHV0U2hhcGUgc3VjaCB0aGF0OlxuICpcbiAqIC8vIElmIHNwYXJzZUluZGljZXMgaXMgc2NhbGFyXG4gKiBkZW5zZVtpXSA9IChpID09IHNwYXJzZUluZGljZXMgPyBzcGFyc2VWYWx1ZXMgOiBkZWZhdWx0VmFsdWUpXG4gKlxuICogLy8gSWYgc3BhcnNlSW5kaWNlcyBpcyBhIHZlY3RvciwgdGhlbiBmb3IgZWFjaCBpXG4gKiBkZW5zZVtzcGFyc2VJbmRpY2VzW2ldXSA9IHNwYXJzZVZhbHVlc1tpXVxuICpcbiAqIC8vIElmIHNwYXJzZUluZGljZXMgaXMgYW4gbiBieSBkIG1hdHJpeCwgdGhlbiBmb3IgZWFjaCBpIGluIFswLCBuKVxuICogZGVuc2Vbc3BhcnNlSW5kaWNlc1tpXVswXSwgLi4uLCBzcGFyc2VJbmRpY2VzW2ldW2QtMV1dID0gc3BhcnNlVmFsdWVzW2ldXG4gKiBBbGwgb3RoZXIgdmFsdWVzIGluIGRlbnNlIGFyZSBzZXQgdG8gZGVmYXVsdFZhbHVlLiBJZiBzcGFyc2VWYWx1ZXMgaXMgYVxuICogc2NhbGFyLCBhbGwgc3BhcnNlIGluZGljZXMgYXJlIHNldCB0byB0aGlzIHNpbmdsZSB2YWx1ZS5cbiAqXG4gKiBJZiBpbmRpY2VzIGFyZSByZXBlYXRlZCB0aGUgZmluYWwgdmFsdWUgaXMgc3VtbWVkIG92ZXIgYWxsIHZhbHVlcyBmb3IgdGhvc2VcbiAqIGluZGljZXMuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGluZGljZXMgPSB0Zi50ZW5zb3IxZChbNCwgNSwgNiwgMSwgMiwgM10sICdpbnQzMicpO1xuICogY29uc3QgdmFsdWVzID0gdGYudGVuc29yMWQoWzEwLCAxMSwgMTIsIDEzLCAxNCwgMTVdLCAnZmxvYXQzMicpO1xuICogY29uc3Qgc2hhcGUgPSBbOF07XG4gKiB0Zi5zcGFyc2VUb0RlbnNlKGluZGljZXMsIHZhbHVlcywgc2hhcGUpLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gc3BhcnNlSW5kaWNlcyBBIDAtRCwgMS1ELCBvciAyLUQgVGVuc29yIG9mIHR5cGUgaW50MzIuXG4gKiBzcGFyc2VJbmRpY2VzW2ldIGNvbnRhaW5zIHRoZSBjb21wbGV0ZSBpbmRleCB3aGVyZSBzcGFyc2VWYWx1ZXNbaV0gd2lsbCBiZVxuICogcGxhY2VkLlxuICogQHBhcmFtIHNwYXJzZVZhbHVlcyBBIDAtRCBvciAxLUQgVGVuc29yLiBWYWx1ZXNcbiAqIGNvcnJlc3BvbmRpbmcgdG8gZWFjaCByb3cgb2Ygc3BhcnNlSW5kaWNlcywgb3IgYSBzY2FsYXIgdmFsdWUgdG8gYmUgdXNlZCBmb3JcbiAqIGFsbCBzcGFyc2UgaW5kaWNlcy5cbiAqIEBwYXJhbSBvdXRwdXRTaGFwZSBTaGFwZSBvZiB0aGUgZGVuc2Ugb3V0cHV0IHRlbnNvci4gdGhlIHR5cGUgaXMgaW5mZXJyZWQuXG4gKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFNjYWxhci4gVmFsdWUgdG8gc2V0IGZvciBpbmRpY2VzIG5vdCBzcGVjaWZpZWQgaW5cbiAqIHNwYXJzZUluZGljZXMuIERlZmF1bHRzIHRvIHplcm8uXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnTm9ybWFsaXphdGlvbid9XG4gKi9cbmZ1bmN0aW9uIHNwYXJzZVRvRGVuc2VfKHNwYXJzZUluZGljZXMsIHNwYXJzZVZhbHVlcywgb3V0cHV0U2hhcGUsIGRlZmF1bHRWYWx1ZSA9IDApIHtcbiAgICBjb25zdCAkc3BhcnNlSW5kaWNlcyA9IGNvbnZlcnRUb1RlbnNvcihzcGFyc2VJbmRpY2VzLCAnc3BhcnNlSW5kaWNlcycsICdzcGFyc2VUb0RlbnNlJywgJ2ludDMyJyk7XG4gICAgY29uc3QgJHNwYXJzZVZhbHVlcyA9IGNvbnZlcnRUb1RlbnNvcihzcGFyc2VWYWx1ZXMsICdzcGFyc2VWYWx1ZXMnLCAnc3BhcnNlVG9EZW5zZScpO1xuICAgIGNvbnN0ICRkZWZhdWx0VmFsdWUgPSBjb252ZXJ0VG9UZW5zb3IoZGVmYXVsdFZhbHVlLCAnZGVmYXVsdFZhbHVlJywgJ3NwYXJzZVRvRGVuc2UnLCAkc3BhcnNlVmFsdWVzLmR0eXBlKTtcbiAgICBzcGFyc2VfdG9fZGVuc2UudmFsaWRhdGVJbnB1dCgkc3BhcnNlSW5kaWNlcywgJHNwYXJzZVZhbHVlcywgb3V0cHV0U2hhcGUsICRkZWZhdWx0VmFsdWUpO1xuICAgIGNvbnN0IGlucHV0cyA9IHtcbiAgICAgICAgc3BhcnNlSW5kaWNlczogJHNwYXJzZUluZGljZXMsXG4gICAgICAgIHNwYXJzZVZhbHVlczogJHNwYXJzZVZhbHVlcyxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiAkZGVmYXVsdFZhbHVlXG4gICAgfTtcbiAgICBjb25zdCBhdHRycyA9IHsgb3V0cHV0U2hhcGUgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChTcGFyc2VUb0RlbnNlLCBpbnB1dHMsIGF0dHJzKTtcbn1cbmV4cG9ydCBjb25zdCBzcGFyc2VUb0RlbnNlID0gb3AoeyBzcGFyc2VUb0RlbnNlXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNwYXJzZV90b19kZW5zZS5qcy5tYXAiLCIvKipcbiAqIFZhbGlkYXRlIHNwYXJzZVRvRGVuc2UgaW5wdXRzLlxuICpcbiAqIEBwYXJhbSBzcGFyc2VJbmRpY2VzIEEgMC1ELCAxLUQsIG9yIDItRCBUZW5zb3Igb2YgdHlwZSBpbnQzMi5cbiAqIHNwYXJzZUluZGljZXNbaV0gY29udGFpbnMgdGhlIGNvbXBsZXRlIGluZGV4IHdoZXJlIHNwYXJzZVZhbHVlc1tpXSB3aWxsIGJlXG4gKiBwbGFjZWQuXG4gKiBAcGFyYW0gc3BhcnNlVmFsdWVzIEEgMC1EIG9yIDEtRCBUZW5zb3IuIFZhbHVlc1xuICogY29ycmVzcG9uZGluZyB0byBlYWNoIHJvdyBvZiBzcGFyc2VJbmRpY2VzLCBvciBhIHNjYWxhciB2YWx1ZSB0byBiZSB1c2VkIGZvclxuICogYWxsIHNwYXJzZSBpbmRpY2VzLlxuICogQHBhcmFtIG91dHB1dFNoYXBlIG51bWJlcltdLiBTaGFwZSBvZiB0aGUgZGVuc2Ugb3V0cHV0IHRlbnNvci5cbiAqIEBwYXJhbSB2YWxpZGF0ZUluZGljZXMgYm9vbGVhbi4gaW5kaWNlIHZhbGlkYXRpb24gaXMgbm90IHN1cHBvcnRlZCwgZXJyb3JcbiAqIHdpbGwgYmUgdGhyb3duIGlmIGl0IGlzIHNldC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlSW5wdXQoc3BhcnNlSW5kaWNlcywgc3BhcnNlVmFsdWVzLCBvdXRwdXRTaGFwZSwgZGVmYXVsdFZhbHVlcykge1xuICAgIGlmIChzcGFyc2VJbmRpY2VzLmR0eXBlICE9PSAnaW50MzInKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndGYuc3BhcnNlVG9EZW5zZSgpIGV4cGVjdHMgdGhlIGluZGljZXMgdG8gYmUgaW50MzIgdHlwZSwnICtcbiAgICAgICAgICAgIGAgYnV0IHRoZSBkdHlwZSB3YXMgJHtzcGFyc2VJbmRpY2VzLmR0eXBlfS5gKTtcbiAgICB9XG4gICAgaWYgKHNwYXJzZUluZGljZXMucmFuayA+IDIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzcGFyc2VJbmRpY2VzIHNob3VsZCBiZSBhIHNjYWxhciwgdmVjdG9yLCBvciBtYXRyaXgsJyArXG4gICAgICAgICAgICBgIGJ1dCBnb3Qgc2hhcGUgJHtzcGFyc2VJbmRpY2VzLnNoYXBlfS5gKTtcbiAgICB9XG4gICAgY29uc3QgbnVtRWxlbXMgPSBzcGFyc2VJbmRpY2VzLnJhbmsgPiAwID8gc3BhcnNlSW5kaWNlcy5zaGFwZVswXSA6IDE7XG4gICAgY29uc3QgbnVtRGltcyA9IHNwYXJzZUluZGljZXMucmFuayA+IDEgPyBzcGFyc2VJbmRpY2VzLnNoYXBlWzFdIDogMTtcbiAgICBpZiAob3V0cHV0U2hhcGUubGVuZ3RoICE9PSBudW1EaW1zKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignb3V0cHV0U2hhcGUgaGFzIGluY29ycmVjdCBudW1iZXIgb2YgZWxlbWVudHM6LCcgK1xuICAgICAgICAgICAgYCAke291dHB1dFNoYXBlLmxlbmd0aH0sIHNob3VsZCBiZTogJHtudW1EaW1zfS5gKTtcbiAgICB9XG4gICAgY29uc3QgbnVtVmFsdWVzID0gc3BhcnNlVmFsdWVzLnNpemU7XG4gICAgaWYgKCEoc3BhcnNlVmFsdWVzLnJhbmsgPT09IDAgfHxcbiAgICAgICAgc3BhcnNlVmFsdWVzLnJhbmsgPT09IDEgJiYgbnVtVmFsdWVzID09PSBudW1FbGVtcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzcGFyc2VWYWx1ZXMgaGFzIGluY29ycmVjdCBzaGFwZSAnICtcbiAgICAgICAgICAgIGAke3NwYXJzZVZhbHVlcy5zaGFwZX0sIHNob3VsZCBiZSBbXSBvciBbJHtudW1FbGVtc31dYCk7XG4gICAgfVxuICAgIGlmIChzcGFyc2VWYWx1ZXMuZHR5cGUgIT09IGRlZmF1bHRWYWx1ZXMuZHR5cGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzcGFyc2VWYWx1ZXMuZHR5cGUgbXVzdCBtYXRjaCBkZWZhdWx0VmFsdWVzLmR0eXBlJyk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3BhcnNlX3RvX2RlbnNlX3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vLi4vZW5naW5lJztcbmltcG9ydCB7IEZGVCB9IGZyb20gJy4uLy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbi8qKlxuICogRmFzdCBGb3VyaWVyIHRyYW5zZm9ybS5cbiAqXG4gKiBDb21wdXRlcyB0aGUgMS1kaW1lbnNpb25hbCBkaXNjcmV0ZSBGb3VyaWVyIHRyYW5zZm9ybSBvdmVyIHRoZSBpbm5lci1tb3N0XG4gKiBkaW1lbnNpb24gb2YgaW5wdXQuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHJlYWwgPSB0Zi50ZW5zb3IxZChbMSwgMiwgM10pO1xuICogY29uc3QgaW1hZyA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzXSk7XG4gKiBjb25zdCB4ID0gdGYuY29tcGxleChyZWFsLCBpbWFnKTtcbiAqXG4gKiB4LmZmdCgpLnByaW50KCk7ICAvLyB0Zi5zcGVjdHJhbC5mZnQoeCkucHJpbnQoKTtcbiAqIGBgYFxuICogQHBhcmFtIGlucHV0IFRoZSBjb21wbGV4IGlucHV0IHRvIGNvbXB1dGUgYW4gZmZ0IG92ZXIuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnU3BlY3RyYWwnLCBuYW1lc3BhY2U6ICdzcGVjdHJhbCd9XG4gKi9cbmZ1bmN0aW9uIGZmdF8oaW5wdXQpIHtcbiAgICBhc3NlcnQoaW5wdXQuZHR5cGUgPT09ICdjb21wbGV4NjQnLCAoKSA9PiBgVGhlIGR0eXBlIGZvciB0Zi5zcGVjdHJhbC5mZnQoKSBtdXN0IGJlIGNvbXBsZXg2NCBgICtcbiAgICAgICAgYGJ1dCBnb3QgJHtpbnB1dC5kdHlwZX0uYCk7XG4gICAgY29uc3QgaW5wdXRzID0geyBpbnB1dCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEZGVCwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCBmZnQgPSBvcCh7IGZmdF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mZnQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vLi4vZW5naW5lJztcbmltcG9ydCB7IElGRlQgfSBmcm9tICcuLi8uLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4uL29wZXJhdGlvbic7XG4vKipcbiAqIEludmVyc2UgZmFzdCBGb3VyaWVyIHRyYW5zZm9ybS5cbiAqXG4gKiBDb21wdXRlcyB0aGUgaW52ZXJzZSAxLWRpbWVuc2lvbmFsIGRpc2NyZXRlIEZvdXJpZXIgdHJhbnNmb3JtIG92ZXIgdGhlXG4gKiBpbm5lci1tb3N0IGRpbWVuc2lvbiBvZiBpbnB1dC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgcmVhbCA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzXSk7XG4gKiBjb25zdCBpbWFnID0gdGYudGVuc29yMWQoWzEsIDIsIDNdKTtcbiAqIGNvbnN0IHggPSB0Zi5jb21wbGV4KHJlYWwsIGltYWcpO1xuICpcbiAqIHguaWZmdCgpLnByaW50KCk7ICAvLyB0Zi5zcGVjdHJhbC5pZmZ0KHgpLnByaW50KCk7XG4gKiBgYGBcbiAqIEBwYXJhbSBpbnB1dCBUaGUgY29tcGxleCBpbnB1dCB0byBjb21wdXRlIGFuIGlmZnQgb3Zlci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdTcGVjdHJhbCcsIG5hbWVzcGFjZTogJ3NwZWN0cmFsJ31cbiAqL1xuZnVuY3Rpb24gaWZmdF8oaW5wdXQpIHtcbiAgICBhc3NlcnQoaW5wdXQuZHR5cGUgPT09ICdjb21wbGV4NjQnLCAoKSA9PiBgVGhlIGR0eXBlIGZvciB0Zi5zcGVjdHJhbC5pZmZ0KCkgbXVzdCBiZSBjb21wbGV4NjQgYCArXG4gICAgICAgIGBidXQgZ290ICR7aW5wdXQuZHR5cGV9LmApO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgaW5wdXQgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChJRkZULCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IGlmZnQgPSBvcCh7IGlmZnRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aWZmdC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBjb21wbGV4IH0gZnJvbSAnLi4vY29tcGxleCc7XG5pbXBvcnQgeyBjb25jYXQgfSBmcm9tICcuLi9jb25jYXQnO1xuaW1wb3J0IHsgaW1hZyB9IGZyb20gJy4uL2ltYWcnO1xuaW1wb3J0IHsgbXVsIH0gZnJvbSAnLi4vbXVsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCB7IHJlYWwgfSBmcm9tICcuLi9yZWFsJztcbmltcG9ydCB7IHJlc2hhcGUgfSBmcm9tICcuLi9yZXNoYXBlJztcbmltcG9ydCB7IHJldmVyc2UgfSBmcm9tICcuLi9yZXZlcnNlJztcbmltcG9ydCB7IHNjYWxhciB9IGZyb20gJy4uL3NjYWxhcic7XG5pbXBvcnQgeyBzbGljZSB9IGZyb20gJy4uL3NsaWNlJztcbmltcG9ydCB7IGlmZnQgfSBmcm9tICcuL2lmZnQnO1xuLyoqXG4gKiBJbnZlcnNlZCByZWFsIHZhbHVlIGlucHV0IGZhc3QgRm91cmllciB0cmFuc2Zvcm0uXG4gKlxuICogQ29tcHV0ZXMgdGhlIDEtZGltZW5zaW9uYWwgaW52ZXJzZWQgZGlzY3JldGUgRm91cmllciB0cmFuc2Zvcm0gb3ZlciB0aGVcbiAqIGlubmVyLW1vc3QgZGltZW5zaW9uIG9mIHRoZSByZWFsIGlucHV0LlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCByZWFsID0gdGYudGVuc29yMWQoWzEsIDIsIDNdKTtcbiAqIGNvbnN0IGltYWcgPSB0Zi50ZW5zb3IxZChbMCwgMCwgMF0pO1xuICogY29uc3QgeCA9IHRmLmNvbXBsZXgocmVhbCwgaW1hZyk7XG4gKlxuICogeC5pcmZmdCgpLnByaW50KCk7XG4gKiBgYGBcbiAqIEBwYXJhbSBpbnB1dCBUaGUgcmVhbCB2YWx1ZSBpbnB1dCB0byBjb21wdXRlIGFuIGlyZmZ0IG92ZXIuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnU3BlY3RyYWwnLCBuYW1lc3BhY2U6ICdzcGVjdHJhbCd9XG4gKi9cbmZ1bmN0aW9uIGlyZmZ0XyhpbnB1dCkge1xuICAgIGNvbnN0IGlubmVyRGltZW5zaW9uU2l6ZSA9IGlucHV0LnNoYXBlW2lucHV0LnNoYXBlLmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IGJhdGNoID0gaW5wdXQuc2l6ZSAvIGlubmVyRGltZW5zaW9uU2l6ZTtcbiAgICBsZXQgcmV0O1xuICAgIGlmIChpbm5lckRpbWVuc2lvblNpemUgPD0gMikge1xuICAgICAgICBjb25zdCBjb21wbGV4SW5wdXQgPSByZXNoYXBlKGlucHV0LCBbYmF0Y2gsIGlubmVyRGltZW5zaW9uU2l6ZV0pO1xuICAgICAgICByZXQgPSBpZmZ0KGNvbXBsZXhJbnB1dCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBUaGUgbGVuZ3RoIG9mIHVuaXF1ZSBjb21wb25lbnRzIG9mIHRoZSBERlQgb2YgYSByZWFsLXZhbHVlZCBzaWduYWxcbiAgICAgICAgLy8gaXMgMiAqIChpbnB1dF9sZW4gLSAxKVxuICAgICAgICBjb25zdCBvdXRwdXRTaGFwZSA9IFtiYXRjaCwgMiAqIChpbm5lckRpbWVuc2lvblNpemUgLSAxKV07XG4gICAgICAgIGNvbnN0IHJlYWxJbnB1dCA9IHJlc2hhcGUocmVhbChpbnB1dCksIFtiYXRjaCwgaW5uZXJEaW1lbnNpb25TaXplXSk7XG4gICAgICAgIGNvbnN0IGltYWdJbnB1dCA9IHJlc2hhcGUoaW1hZyhpbnB1dCksIFtiYXRjaCwgaW5uZXJEaW1lbnNpb25TaXplXSk7XG4gICAgICAgIGNvbnN0IHJlYWxDb25qdWdhdGUgPSByZXZlcnNlKHNsaWNlKHJlYWxJbnB1dCwgWzAsIDFdLCBbYmF0Y2gsIGlubmVyRGltZW5zaW9uU2l6ZSAtIDJdKSwgMSk7XG4gICAgICAgIGNvbnN0IGltYWdDb25qdWdhdGUgPSBtdWwocmV2ZXJzZShzbGljZShpbWFnSW5wdXQsIFswLCAxXSwgW2JhdGNoLCBpbm5lckRpbWVuc2lvblNpemUgLSAyXSksIDEpLCBzY2FsYXIoLTEpKTtcbiAgICAgICAgY29uc3QgciA9IGNvbmNhdChbcmVhbElucHV0LCByZWFsQ29uanVnYXRlXSwgMSk7XG4gICAgICAgIGNvbnN0IGkgPSBjb25jYXQoW2ltYWdJbnB1dCwgaW1hZ0Nvbmp1Z2F0ZV0sIDEpO1xuICAgICAgICBjb25zdCBjb21wbGV4SW5wdXQgPSByZXNoYXBlKGNvbXBsZXgociwgaSksIFtvdXRwdXRTaGFwZVswXSwgb3V0cHV0U2hhcGVbMV1dKTtcbiAgICAgICAgcmV0ID0gaWZmdChjb21wbGV4SW5wdXQpO1xuICAgIH1cbiAgICByZXQgPSByZWFsKHJldCk7XG4gICAgLy8gcmVzaGFwZSB0aGUgcmVzdWx0IGlmIHRoZSBpbnB1dCBpcyAzRCB0ZW5zb3IuXG4gICAgaWYgKGlucHV0LnJhbmsgPT09IDMgJiYgaW5wdXQuc2hhcGVbMF0gIT09IDApIHtcbiAgICAgICAgY29uc3QgdGVtcCA9IHJldDtcbiAgICAgICAgY29uc3QgYmF0Y2ggPSBpbnB1dC5zaGFwZVswXTtcbiAgICAgICAgcmV0ID0gcmVzaGFwZShyZXQsIFtiYXRjaCwgcmV0LnNoYXBlWzBdIC8gYmF0Y2gsIHJldC5zaGFwZVsxXV0pO1xuICAgICAgICB0ZW1wLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbn1cbmV4cG9ydCBjb25zdCBpcmZmdCA9IG9wKHsgaXJmZnRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aXJmZnQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQgeyBjb21wbGV4IH0gZnJvbSAnLi4vY29tcGxleCc7XG5pbXBvcnQgeyBjb25jYXQgfSBmcm9tICcuLi9jb25jYXQnO1xuaW1wb3J0IHsgaW1hZyB9IGZyb20gJy4uL2ltYWcnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgcmVhbCB9IGZyb20gJy4uL3JlYWwnO1xuaW1wb3J0IHsgcmVzaGFwZSB9IGZyb20gJy4uL3Jlc2hhcGUnO1xuaW1wb3J0IHsgc2xpY2UgfSBmcm9tICcuLi9zbGljZSc7XG5pbXBvcnQgeyBzcGxpdCB9IGZyb20gJy4uL3NwbGl0JztcbmltcG9ydCB7IHplcm9zIH0gZnJvbSAnLi4vemVyb3MnO1xuaW1wb3J0IHsgemVyb3NMaWtlIH0gZnJvbSAnLi4vemVyb3NfbGlrZSc7XG5pbXBvcnQgeyBmZnQgfSBmcm9tICcuL2ZmdCc7XG4vKipcbiAqIFJlYWwgdmFsdWUgaW5wdXQgZmFzdCBGb3VyaWVyIHRyYW5zZm9ybS5cbiAqXG4gKiBDb21wdXRlcyB0aGUgMS1kaW1lbnNpb25hbCBkaXNjcmV0ZSBGb3VyaWVyIHRyYW5zZm9ybSBvdmVyIHRoZVxuICogaW5uZXItbW9zdCBkaW1lbnNpb24gb2YgdGhlIHJlYWwgaW5wdXQuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHJlYWwgPSB0Zi50ZW5zb3IxZChbMSwgMiwgM10pO1xuICpcbiAqIHJlYWwucmZmdCgpLnByaW50KCk7XG4gKiBgYGBcbiAqIEBwYXJhbSBpbnB1dCBUaGUgcmVhbCB2YWx1ZSBpbnB1dCB0byBjb21wdXRlIGFuIHJmZnQgb3Zlci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdTcGVjdHJhbCcsIG5hbWVzcGFjZTogJ3NwZWN0cmFsJ31cbiAqL1xuZnVuY3Rpb24gcmZmdF8oaW5wdXQsIGZmdExlbmd0aCkge1xuICAgIGFzc2VydChpbnB1dC5kdHlwZSA9PT0gJ2Zsb2F0MzInLCAoKSA9PiBgVGhlIGR0eXBlIGZvciByZmZ0KCkgbXVzdCBiZSByZWFsIHZhbHVlIGJ1dCBnb3QgJHtpbnB1dC5kdHlwZX1gKTtcbiAgICBsZXQgaW5uZXJEaW1lbnNpb25TaXplID0gaW5wdXQuc2hhcGVbaW5wdXQuc2hhcGUubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgYmF0Y2ggPSBpbnB1dC5zaXplIC8gaW5uZXJEaW1lbnNpb25TaXplO1xuICAgIGxldCBhZGp1c3RlZElucHV0O1xuICAgIGlmIChmZnRMZW5ndGggIT0gbnVsbCAmJiBmZnRMZW5ndGggPCBpbm5lckRpbWVuc2lvblNpemUpIHtcbiAgICAgICAgLy8gTmVlZCB0byBjcm9wXG4gICAgICAgIGNvbnN0IGJlZ2luID0gaW5wdXQuc2hhcGUubWFwKHYgPT4gMCk7XG4gICAgICAgIGNvbnN0IHNpemUgPSBpbnB1dC5zaGFwZS5tYXAodiA9PiB2KTtcbiAgICAgICAgc2l6ZVtpbnB1dC5zaGFwZS5sZW5ndGggLSAxXSA9IGZmdExlbmd0aDtcbiAgICAgICAgYWRqdXN0ZWRJbnB1dCA9IHNsaWNlKGlucHV0LCBiZWdpbiwgc2l6ZSk7XG4gICAgICAgIGlubmVyRGltZW5zaW9uU2l6ZSA9IGZmdExlbmd0aDtcbiAgICB9XG4gICAgZWxzZSBpZiAoZmZ0TGVuZ3RoICE9IG51bGwgJiYgZmZ0TGVuZ3RoID4gaW5uZXJEaW1lbnNpb25TaXplKSB7XG4gICAgICAgIC8vIE5lZWQgdG8gcGFkIHdpdGggemVyb3NcbiAgICAgICAgY29uc3QgemVyb3NTaGFwZSA9IGlucHV0LnNoYXBlLm1hcCh2ID0+IHYpO1xuICAgICAgICB6ZXJvc1NoYXBlW2lucHV0LnNoYXBlLmxlbmd0aCAtIDFdID0gZmZ0TGVuZ3RoIC0gaW5uZXJEaW1lbnNpb25TaXplO1xuICAgICAgICBhZGp1c3RlZElucHV0ID0gY29uY2F0KFtpbnB1dCwgemVyb3MoemVyb3NTaGFwZSldLCBpbnB1dC5zaGFwZS5sZW5ndGggLSAxKTtcbiAgICAgICAgaW5uZXJEaW1lbnNpb25TaXplID0gZmZ0TGVuZ3RoO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgYWRqdXN0ZWRJbnB1dCA9IGlucHV0O1xuICAgIH1cbiAgICAvLyBDb21wbGVtZW50IHRoZSBpbnB1dCB3aXRoIHplcm8gaW1hZ2luYXJ5IG51bWJlcnMuXG4gICAgY29uc3QgemVyb3NJbnB1dCA9IHplcm9zTGlrZShhZGp1c3RlZElucHV0KTtcbiAgICBjb25zdCBjb21wbGV4SW5wdXQgPSByZXNoYXBlKGNvbXBsZXgoYWRqdXN0ZWRJbnB1dCwgemVyb3NJbnB1dCksIFtiYXRjaCwgaW5uZXJEaW1lbnNpb25TaXplXSk7XG4gICAgY29uc3QgcmV0ID0gZmZ0KGNvbXBsZXhJbnB1dCk7XG4gICAgLy8gRXhjbHVkZSBjb21wbGV4IGNvbmp1Z2F0aW9ucy4gVGhlc2UgY29uanVnYXRpb25zIGFyZSBwdXQgc3ltbWV0cmljYWxseS5cbiAgICBjb25zdCBoYWxmID0gTWF0aC5mbG9vcihpbm5lckRpbWVuc2lvblNpemUgLyAyKSArIDE7XG4gICAgY29uc3QgcmVhbFZhbHVlcyA9IHJlYWwocmV0KTtcbiAgICBjb25zdCBpbWFnVmFsdWVzID0gaW1hZyhyZXQpO1xuICAgIGNvbnN0IHJlYWxDb21wbGV4Q29uanVnYXRlID0gc3BsaXQocmVhbFZhbHVlcywgW2hhbGYsIGlubmVyRGltZW5zaW9uU2l6ZSAtIGhhbGZdLCByZWFsVmFsdWVzLnNoYXBlLmxlbmd0aCAtIDEpO1xuICAgIGNvbnN0IGltYWdDb21wbGV4Q29uanVnYXRlID0gc3BsaXQoaW1hZ1ZhbHVlcywgW2hhbGYsIGlubmVyRGltZW5zaW9uU2l6ZSAtIGhhbGZdLCBpbWFnVmFsdWVzLnNoYXBlLmxlbmd0aCAtIDEpO1xuICAgIGNvbnN0IG91dHB1dFNoYXBlID0gYWRqdXN0ZWRJbnB1dC5zaGFwZS5zbGljZSgpO1xuICAgIG91dHB1dFNoYXBlW2FkanVzdGVkSW5wdXQuc2hhcGUubGVuZ3RoIC0gMV0gPSBoYWxmO1xuICAgIHJldHVybiByZXNoYXBlKGNvbXBsZXgocmVhbENvbXBsZXhDb25qdWdhdGVbMF0sIGltYWdDb21wbGV4Q29uanVnYXRlWzBdKSwgb3V0cHV0U2hhcGUpO1xufVxuZXhwb3J0IGNvbnN0IHJmZnQgPSBvcCh7IHJmZnRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmZmdC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgU3BsaXRWIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogU3BsaXRzIGEgYHRmLlRlbnNvcmAgaW50byBzdWIgdGVuc29ycy5cbiAqXG4gKiBJZiBgbnVtT3JTaXplU3BsaXRzYCBpcyBhIG51bWJlciwgc3BsaXRzIGB4YCBhbG9uZyBkaW1lbnNpb24gYGF4aXNgXG4gKiBpbnRvIGBudW1PclNpemVTcGxpdHNgIHNtYWxsZXIgdGVuc29ycy5cbiAqIFJlcXVpcmVzIHRoYXQgYG51bU9yU2l6ZVNwbGl0c2AgZXZlbmx5IGRpdmlkZXMgYHguc2hhcGVbYXhpc11gLlxuICpcbiAqIElmIGBudW1PclNpemVTcGxpdHNgIGlzIGEgbnVtYmVyIGFycmF5LCBzcGxpdHMgYHhgIGludG9cbiAqIGBudW1PclNpemVTcGxpdHMubGVuZ3RoYCBwaWVjZXMuIFRoZSBzaGFwZSBvZiB0aGUgYGlgLXRoIHBpZWNlIGhhcyB0aGVcbiAqIHNhbWUgc2l6ZSBhcyBgeGAgZXhjZXB0IGFsb25nIGRpbWVuc2lvbiBgYXhpc2Agd2hlcmUgdGhlIHNpemUgaXNcbiAqIGBudW1PclNpemVTcGxpdHNbaV1gLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMmQoWzEsIDIsIDMsIDQsIDUsIDYsIDcsIDhdLCBbMiwgNF0pO1xuICogY29uc3QgW2EsIGJdID0gdGYuc3BsaXQoeCwgMiwgMSk7XG4gKiBhLnByaW50KCk7XG4gKiBiLnByaW50KCk7XG4gKlxuICogY29uc3QgW2MsIGQsIGVdID0gdGYuc3BsaXQoeCwgWzEsIDIsIDFdLCAxKTtcbiAqIGMucHJpbnQoKTtcbiAqIGQucHJpbnQoKTtcbiAqIGUucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IgdG8gc3BsaXQuXG4gKiBAcGFyYW0gbnVtT3JTaXplU3BsaXRzIEVpdGhlciBhbiBpbnRlZ2VyIGluZGljYXRpbmcgdGhlIG51bWJlciBvZlxuICogc3BsaXRzIGFsb25nIHRoZSBheGlzIG9yIGFuIGFycmF5IG9mIGludGVnZXJzIGNvbnRhaW5pbmcgdGhlIHNpemVzIG9mXG4gKiBlYWNoIG91dHB1dCB0ZW5zb3IgYWxvbmcgdGhlIGF4aXMuIElmIGEgbnVtYmVyIHRoZW4gaXQgbXVzdCBldmVubHkgZGl2aWRlXG4gKiBgeC5zaGFwZVtheGlzXWA7IG90aGVyd2lzZSB0aGUgc3VtIG9mIHNpemVzIG11c3QgbWF0Y2ggYHguc2hhcGVbYXhpc11gLlxuICogQ2FuIGNvbnRhaW4gb25lIC0xIGluZGljYXRpbmcgdGhhdCBkaW1lbnNpb24gaXMgdG8gYmUgaW5mZXJyZWQuXG4gKiBAcGFyYW0gYXhpcyBUaGUgZGltZW5zaW9uIGFsb25nIHdoaWNoIHRvIHNwbGl0LiBEZWZhdWx0cyB0byAwICh0aGUgZmlyc3RcbiAqIGRpbSkuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnU2xpY2luZyBhbmQgSm9pbmluZyd9XG4gKi9cbmZ1bmN0aW9uIHNwbGl0Xyh4LCBudW1PclNpemVTcGxpdHMsIGF4aXMgPSAwKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnc3BsaXQnKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IHg6ICR4IH07XG4gICAgY29uc3QgYXR0ciA9IHsgbnVtT3JTaXplU3BsaXRzLCBheGlzIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoU3BsaXRWLCBpbnB1dHMsIGF0dHIpO1xufVxuZXhwb3J0IGNvbnN0IHNwbGl0ID0gb3AoeyBzcGxpdF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zcGxpdC5qcy5tYXAiLCJpbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi91dGlsJztcbi8qKlxuICogUHJlcGFyZSB0aGUgc3BsaXQgc2l6ZSBhcnJheS4gV2hlbiB0aGUgaW5wdXQgaXMgYSBudW1iZXIsIHRoZSBheGlzIGlzIGV2ZW5seVxuICogZGl2aWRlZCBhbW9uZyB0aGUgc3BsaXQgc2l6ZS4gV2hlbiB0aGUgaW5wdXQgY29udGFpbnMgdGhlIG5lZ2F0aXZlIHZhbHVlLCB0aGVcbiAqIHJlc3Qgb2YgdGhlIGF4aXMgaXMgYWxsb2NhdGVkIHRvd2FyZCB0aGF0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZVNwbGl0U2l6ZSh4LCBudW1PclNpemVTcGxpdHMsIGF4aXMgPSAwKSB7XG4gICAgbGV0IHNwbGl0U2l6ZXMgPSBbXTtcbiAgICBpZiAodHlwZW9mIChudW1PclNpemVTcGxpdHMpID09PSAnbnVtYmVyJykge1xuICAgICAgICBhc3NlcnQoeC5zaGFwZVtheGlzXSAlIG51bU9yU2l6ZVNwbGl0cyA9PT0gMCwgKCkgPT4gJ051bWJlciBvZiBzcGxpdHMgbXVzdCBldmVubHkgZGl2aWRlIHRoZSBheGlzLicpO1xuICAgICAgICBzcGxpdFNpemVzID1cbiAgICAgICAgICAgIG5ldyBBcnJheShudW1PclNpemVTcGxpdHMpLmZpbGwoeC5zaGFwZVtheGlzXSAvIG51bU9yU2l6ZVNwbGl0cyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBudW1PZk5lZ3MgPSBudW1PclNpemVTcGxpdHMucmVkdWNlKChjb3VudCwgdmFsdWUpID0+IHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBjb3VudCArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvdW50O1xuICAgICAgICB9LCAwKTtcbiAgICAgICAgYXNzZXJ0KG51bU9mTmVncyA8PSAxLCAoKSA9PiAnVGhlcmUgc2hvdWxkIGJlIG9ubHkgb25lIG5lZ2F0aXZlIHZhbHVlIGluIHNwbGl0IGFycmF5LicpO1xuICAgICAgICBjb25zdCBuZWdJbmRleCA9IG51bU9yU2l6ZVNwbGl0cy5pbmRleE9mKC0xKTtcbiAgICAgICAgLy8gQWxsb3cgdGhlIG51bWJlciBvZiBzcGxpdCBhcnJheSB0byBiZSAtMSwgd2hpY2ggaW5kaWNhdGVzIHRoZSByZXN0XG4gICAgICAgIC8vIG9mIGRpbWVuc2lvbiBpcyBhbGxvY2F0ZWQgdG8gdGhhdCBzcGxpdC5cbiAgICAgICAgaWYgKG5lZ0luZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgY29uc3QgdG90YWwgPSBudW1PclNpemVTcGxpdHMucmVkdWNlKChhLCBiKSA9PiBiID4gMCA/IGEgKyBiIDogYSk7XG4gICAgICAgICAgICBudW1PclNpemVTcGxpdHNbbmVnSW5kZXhdID0geC5zaGFwZVtheGlzXSAtIHRvdGFsO1xuICAgICAgICB9XG4gICAgICAgIGFzc2VydCh4LnNoYXBlW2F4aXNdID09PSBudW1PclNpemVTcGxpdHMucmVkdWNlKChhLCBiKSA9PiBhICsgYiksICgpID0+ICdUaGUgc3VtIG9mIHNpemVzIG11c3QgbWF0Y2ggdGhlIHNpemUgb2YgdGhlIGF4aXMgZGltZW5zaW9uLicpO1xuICAgICAgICBzcGxpdFNpemVzID0gbnVtT3JTaXplU3BsaXRzO1xuICAgIH1cbiAgICByZXR1cm4gc3BsaXRTaXplcztcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNwbGl0X3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IFNxcnQgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyBzcXVhcmUgcm9vdCBvZiB0aGUgaW5wdXQgYHRmLlRlbnNvcmAgZWxlbWVudC13aXNlOiBgeSA9IHNxcnQoeClgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMSwgMiwgNCwgLTFdKTtcbiAqXG4gKiB4LnNxcnQoKS5wcmludCgpOyAgLy8gb3IgdGYuc3FydCh4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiBzcXJ0Xyh4KSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnc3FydCcpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChTcXJ0LCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IHNxcnQgPSBvcCh7IHNxcnRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3FydC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyBzcXVhcmUgb2YgYHhgIGVsZW1lbnQtd2lzZTogYHggXiAyYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIE1hdGguc3FydCgyKSwgLTFdKTtcbiAqXG4gKiB4LnNxdWFyZSgpLnByaW50KCk7ICAvLyBvciB0Zi5zcXVhcmUoeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IFRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gc3F1YXJlXyh4KSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnc3F1YXJlJyk7XG4gICAgY29uc3QgYXR0cnMgPSB7fTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbCgnU3F1YXJlJywgeyB4OiAkeCB9LCBhdHRycyk7XG59XG5leHBvcnQgY29uc3Qgc3F1YXJlID0gb3AoeyBzcXVhcmVfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3F1YXJlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBTcXVhcmVkRGlmZmVyZW5jZSB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBtYWtlVHlwZXNNYXRjaCB9IGZyb20gJy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSB9IGZyb20gJy4vYnJvYWRjYXN0X3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIFJldHVybnMgKGEgLSBiKSAqIChhIC0gYikgZWxlbWVudC13aXNlLlxuICogU3VwcG9ydHMgYnJvYWRjYXN0aW5nLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzEsIDQsIDMsIDE2XSk7XG4gKiBjb25zdCBiID0gdGYudGVuc29yMWQoWzEsIDIsIDksIDRdKTtcbiAqXG4gKiBhLnNxdWFyZWREaWZmZXJlbmNlKGIpLnByaW50KCk7ICAvLyBvciB0Zi5zcXVhcmVkRGlmZmVyZW5jZShhLCBiKVxuICogYGBgXG4gKlxuICogYGBganNcbiAqIC8vIEJyb2FkY2FzdCBzcXVhcmVkIGRpZmZlcmVuY2UgIGEgd2l0aCBiLlxuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsyLCA0LCA2LCA4XSk7XG4gKiBjb25zdCBiID0gdGYuc2NhbGFyKDUpO1xuICpcbiAqIGEuc3F1YXJlZERpZmZlcmVuY2UoYikucHJpbnQoKTsgIC8vIG9yIHRmLnNxdWFyZWREaWZmZXJlbmNlKGEsIGIpXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gYSBUaGUgZmlyc3QgdGVuc29yLlxuICogQHBhcmFtIGIgVGhlIHNlY29uZCB0ZW5zb3IuIE11c3QgaGF2ZSB0aGUgc2FtZSB0eXBlIGFzIGBhYC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdBcml0aG1ldGljJ31cbiAqL1xuZnVuY3Rpb24gc3F1YXJlZERpZmZlcmVuY2VfKGEsIGIpIHtcbiAgICBsZXQgJGEgPSBjb252ZXJ0VG9UZW5zb3IoYSwgJ2EnLCAnc3F1YXJlZERpZmZlcmVuY2UnKTtcbiAgICBsZXQgJGIgPSBjb252ZXJ0VG9UZW5zb3IoYiwgJ2InLCAnc3F1YXJlZERpZmZlcmVuY2UnKTtcbiAgICBbJGEsICRiXSA9IG1ha2VUeXBlc01hdGNoKCRhLCAkYik7XG4gICAgYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoJGEuc2hhcGUsICRiLnNoYXBlKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IGE6ICRhLCBiOiAkYiB9O1xuICAgIGNvbnN0IGF0dHJzID0ge307XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoU3F1YXJlZERpZmZlcmVuY2UsIGlucHV0cywgYXR0cnMpO1xufVxuZXhwb3J0IGNvbnN0IHNxdWFyZWREaWZmZXJlbmNlID0gb3AoeyBzcXVhcmVkRGlmZmVyZW5jZV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zcXVhcmVkX2RpZmZlcmVuY2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IHNxdWVlemVTaGFwZSB9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyByZXNoYXBlIH0gZnJvbSAnLi9yZXNoYXBlJztcbi8qKlxuICogUmVtb3ZlcyBkaW1lbnNpb25zIG9mIHNpemUgMSBmcm9tIHRoZSBzaGFwZSBvZiBhIGB0Zi5UZW5zb3JgLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yKFsxLCAyLCAzLCA0XSwgWzEsIDEsIDRdKTtcbiAqIHguc3F1ZWV6ZSgpLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yIHRvIGJlIHNxdWVlemVkLlxuICogQHBhcmFtIGF4aXMgQW4gb3B0aW9uYWwgbGlzdCBvZiBudW1iZXJzLiBJZiBzcGVjaWZpZWQsIG9ubHlcbiAqICAgICBzcXVlZXplcyB0aGUgZGltZW5zaW9ucyBsaXN0ZWQuIFRoZSBkaW1lbnNpb24gaW5kZXggc3RhcnRzIGF0IDAuIEl0XG4gKiBpcyBhbiBlcnJvciB0byBzcXVlZXplIGEgZGltZW5zaW9uIHRoYXQgaXMgbm90IDEuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnVHJhbnNmb3JtYXRpb25zJ31cbiAqL1xuZnVuY3Rpb24gc3F1ZWV6ZV8oeCwgYXhpcykge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3NxdWVlemUnKTtcbiAgICByZXR1cm4gcmVzaGFwZSgkeCwgc3F1ZWV6ZVNoYXBlKCR4LnNoYXBlLCBheGlzKS5uZXdTaGFwZSk7XG59XG5leHBvcnQgY29uc3Qgc3F1ZWV6ZSA9IG9wKHsgc3F1ZWV6ZV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zcXVlZXplLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBQYWNrIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvckFycmF5IH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogU3RhY2tzIGEgbGlzdCBvZiByYW5rLWBSYCBgdGYuVGVuc29yYHMgaW50byBvbmUgcmFuay1gKFIrMSlgIGB0Zi5UZW5zb3JgLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzEsIDJdKTtcbiAqIGNvbnN0IGIgPSB0Zi50ZW5zb3IxZChbMywgNF0pO1xuICogY29uc3QgYyA9IHRmLnRlbnNvcjFkKFs1LCA2XSk7XG4gKiB0Zi5zdGFjayhbYSwgYiwgY10pLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gdGVuc29ycyBBIGxpc3Qgb2YgdGVuc29yIG9iamVjdHMgd2l0aCB0aGUgc2FtZSBzaGFwZSBhbmQgZHR5cGUuXG4gKiBAcGFyYW0gYXhpcyBUaGUgYXhpcyB0byBzdGFjayBhbG9uZy4gRGVmYXVsdHMgdG8gMCAodGhlIGZpcnN0IGRpbSkuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnU2xpY2luZyBhbmQgSm9pbmluZyd9XG4gKi9cbmZ1bmN0aW9uIHN0YWNrXyh0ZW5zb3JzLCBheGlzID0gMCkge1xuICAgIGNvbnN0ICR0ZW5zb3JzID0gY29udmVydFRvVGVuc29yQXJyYXkodGVuc29ycywgJ3RlbnNvcnMnLCAnc3RhY2snLCAnc3RyaW5nX29yX251bWVyaWMnKTtcbiAgICB1dGlsLmFzc2VydCgkdGVuc29ycy5sZW5ndGggPj0gMSwgKCkgPT4gJ1Bhc3MgYXQgbGVhc3Qgb25lIHRlbnNvciB0byB0Zi5zdGFjaycpO1xuICAgIGlmICgkdGVuc29ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KGF4aXMgPD0gJHRlbnNvcnNbMF0ucmFuaywgKCkgPT4gJ0F4aXMgbXVzdCBiZSA8PSByYW5rIG9mIHRoZSB0ZW5zb3InKTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRzID0gJHRlbnNvcnM7XG4gICAgY29uc3QgYXR0cnMgPSB7IGF4aXMgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChQYWNrLCBpbnB1dHMsIGF0dHJzKTtcbn1cbmV4cG9ydCBjb25zdCBzdGFjayA9IG9wKHsgc3RhY2tfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3RhY2suanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IFN0ZXAgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb21wdXRlcyBzdGVwIG9mIHRoZSBpbnB1dCBgdGYuVGVuc29yYCBlbGVtZW50LXdpc2U6IGB4ID4gMCA/IDEgOiBhbHBoYSAqIHhgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMCwgMiwgLTEsIC0zXSk7XG4gKlxuICogeC5zdGVwKC41KS5wcmludCgpOyAgLy8gb3IgdGYuc3RlcCh4LCAuNSlcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqIEBwYXJhbSBhbHBoYSBUaGUgZ3JhZGllbnQgd2hlbiBpbnB1dCBpcyBuZWdhdGl2ZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gc3RlcF8oeCwgYWxwaGEgPSAwLjApIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdzdGVwJyk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBhbHBoYSB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFN0ZXAsIGlucHV0cywgYXR0cnMpO1xufVxuZXhwb3J0IGNvbnN0IHN0ZXAgPSBvcCh7IHN0ZXBfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3RlcC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgU3RyaWRlZFNsaWNlIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogRXh0cmFjdHMgYSBzdHJpZGVkIHNsaWNlIG9mIGEgdGVuc29yLlxuICpcbiAqIFJvdWdobHkgc3BlYWtpbmcsIHRoaXMgb3AgZXh0cmFjdHMgYSBzbGljZSBvZiBzaXplIChlbmQtYmVnaW4pL3N0cmlkZSBmcm9tXG4gKiB0aGUgZ2l2ZW4gaW5wdXQgdGVuc29yICh4KS4gU3RhcnRpbmcgYXQgdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBieSBiZWdpbiB0aGVcbiAqIHNsaWNlIGNvbnRpbnVlcyBieSBhZGRpbmcgc3RyaWRlIHRvIHRoZSBpbmRleCB1bnRpbCBhbGwgZGltZW5zaW9ucyBhcmUgbm90XG4gKiBsZXNzIHRoYW4gZW5kLiBOb3RlIHRoYXQgYSBzdHJpZGUgY2FuIGJlIG5lZ2F0aXZlLCB3aGljaCBjYXVzZXMgYSByZXZlcnNlXG4gKiBzbGljZS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgdCA9IHRmLnRlbnNvcjNkKFsxLCAxLCAxICwyLCAyLCAyLCAzLCAzLCAzLCA0LCA0LCA0LCA1LCA1LCA1LCA2LCA2LCA2XSxcbiAqICAgIFszLCAyLCAzXSk7XG4gKiB0LnN0cmlkZWRTbGljZShbMSwgMCwgMF0sIFsyLCAxLCAzXSwgWzEsIDEsIDFdKS5wcmludCgpICAvLyBbW1szLCAzLCAzXV1dXG4gKiB0LnN0cmlkZWRTbGljZShbMSwgMCwgMF0sIFsyLCAyLCAzXSwgWzEsIDEsIDFdKS5wcmludCgpICAvLyBbW1szLCAzLCAzXSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBbNCwgNCwgNF1dXVxuICogdC5zdHJpZGVkU2xpY2UoWzEsIC0xLCAwXSwgWzIsIC0zLCAzXSwgWzEsIC0xLCAxXSkucHJpbnQoKSAvLyBbW1s0LCA0LCA0XSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBbMywgMywgM11dXVxuICogYGBgXG4gKlxuICogQHBhcmFtIHggVGhlIHRlbnNvciB0byBzdHJpZGUgc2xpY2UuXG4gKiBAcGFyYW0gYmVnaW4gVGhlIGNvb3JkaW5hdGVzIHRvIHN0YXJ0IHRoZSBzbGljZSBmcm9tLlxuICogQHBhcmFtIGVuZDogVGhlIGNvb3JkaW5hdGVzIHRvIGVuZCB0aGUgc2xpY2UgYXQuXG4gKiBAcGFyYW0gc3RyaWRlczogVGhlIHNpemUgb2YgdGhlIHNsaWNlLlxuICogQHBhcmFtIGJlZ2luTWFzazogSWYgdGhlIGl0aCBiaXQgb2YgYmVnaW5NYXNrIGlzIHNldCwgYmVnaW5baV0gaXMgaWdub3JlZFxuICogICAgICBhbmQgdGhlIGZ1bGxlc3QgcG9zc2libGUgcmFuZ2UgaW4gdGhhdCBkaW1lbnNpb24gaXMgdXNlZCBpbnN0ZWFkLlxuICogQHBhcmFtIGVuZE1hc2s6IElmIHRoZSBpdGggYml0IG9mIGVuZE1hc2sgaXMgc2V0LCBlbmRbaV0gaXMgaWdub3JlZFxuICogICAgICBhbmQgdGhlIGZ1bGxlc3QgcG9zc2libGUgcmFuZ2UgaW4gdGhhdCBkaW1lbnNpb24gaXMgdXNlZCBpbnN0ZWFkLlxuICogQHBhcmFtIHNocmlua0F4aXNNYXNrOiBhIGJpdG1hc2sgd2hlcmUgYml0IGkgaW1wbGllcyB0aGF0XG4gKiB0aGUgaXRoIHNwZWNpZmljYXRpb24gc2hvdWxkIHNocmluayB0aGUgZGltZW5zaW9uYWxpdHkuIGJlZ2luIGFuZCBlbmQgbXVzdFxuICogaW1wbHkgYSBzbGljZSBvZiBzaXplIDEgaW4gdGhlIGRpbWVuc2lvbi5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdTbGljaW5nIGFuZCBKb2luaW5nJ31cbiAqL1xuZnVuY3Rpb24gc3RyaWRlZFNsaWNlXyh4LCBiZWdpbiwgZW5kLCBzdHJpZGVzLCBiZWdpbk1hc2sgPSAwLCBlbmRNYXNrID0gMCwgZWxsaXBzaXNNYXNrID0gMCwgbmV3QXhpc01hc2sgPSAwLCBzaHJpbmtBeGlzTWFzayA9IDApIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdzdHJpZGVkU2xpY2UnLCAnc3RyaW5nX29yX251bWVyaWMnKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IHg6ICR4IH07XG4gICAgY29uc3QgYXR0cnMgPSB7XG4gICAgICAgIGJlZ2luLFxuICAgICAgICBlbmQsXG4gICAgICAgIHN0cmlkZXMsXG4gICAgICAgIGJlZ2luTWFzayxcbiAgICAgICAgZW5kTWFzayxcbiAgICAgICAgZWxsaXBzaXNNYXNrLFxuICAgICAgICBuZXdBeGlzTWFzayxcbiAgICAgICAgc2hyaW5rQXhpc01hc2tcbiAgICB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFN0cmlkZWRTbGljZSwgaW5wdXRzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3Qgc3RyaWRlZFNsaWNlID0gb3AoeyBzdHJpZGVkU2xpY2VfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3RyaWRlZF9zbGljZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi8uLi9lbmdpbmUnO1xuaW1wb3J0IHsgU3RyaW5nTkdyYW1zIH0gZnJvbSAnLi4vLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4uL29wZXJhdGlvbic7XG4vKipcbiAqIENyZWF0ZXMgbmdyYW1zIGZyb20gcmFnZ2VkIHN0cmluZyBkYXRhLlxuICpcbiAqIFRoaXMgb3AgYWNjZXB0cyBhIHJhZ2dlZCB0ZW5zb3Igd2l0aCAxIHJhZ2dlZCBkaW1lbnNpb24gY29udGFpbmluZyBvbmx5XG4gKiBzdHJpbmdzIGFuZCBvdXRwdXRzIGEgcmFnZ2VkIHRlbnNvciB3aXRoIDEgcmFnZ2VkIGRpbWVuc2lvbiBjb250YWluaW5nIG5ncmFtc1xuICogb2YgdGhhdCBzdHJpbmcsIGpvaW5lZCBhbG9uZyB0aGUgaW5uZXJtb3N0IGF4aXMuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHJlc3VsdCA9IHRmLnN0cmluZy5zdHJpbmdOR3JhbXMoXG4gKiAgIFsnYScsICdiJywgJ2MnLCAnZCddLCB0Zi50ZW5zb3IxZChbMCwgMiwgNF0sICdpbnQzMicpLFxuICogICAnfCcsIFsxLCAyXSwgJ0xQJywgJ1JQJywgLTEsIGZhbHNlKTtcbiAqIHJlc3VsdFsnbkdyYW1zJ10ucHJpbnQoKTsgLy8gWydhJywgJ2InLCAnTFB8YScsICdhfGInLCAnYnxSUCcsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAnYycsICdkJywgJ0xQfGMnLCAnY3xkJywgJ2R8UlAnXVxuICogcmVzdWx0WyduR3JhbXNTcGxpdHMnXS5wcmludCgpOyAvLyBbMCwgNSwgMTBdXG4gKiBgYGBcbiAqIEBwYXJhbSBkYXRhOiBUaGUgdmFsdWVzIHRlbnNvciBvZiB0aGUgcmFnZ2VkIHN0cmluZyB0ZW5zb3IgdG8gbWFrZSBuZ3JhbXMgb3V0XG4gKiAgICAgb2YuIE11c3QgYmUgYSAxRCBzdHJpbmcgdGVuc29yLlxuICogQHBhcmFtIGRhdGFTcGxpdHM6IFRoZSBzcGxpdHMgdGVuc29yIG9mIHRoZSByYWdnZWQgc3RyaW5nIHRlbnNvciB0byBtYWtlXG4gKiAgICAgbmdyYW1zIG91dCBvZi5cbiAqIEBwYXJhbSBzZXBhcmF0b3I6IFRoZSBzdHJpbmcgdG8gYXBwZW5kIGJldHdlZW4gZWxlbWVudHMgb2YgdGhlIHRva2VuLiBVc2UgXCJcIlxuICogICAgIGZvciBubyBzZXBhcmF0b3IuXG4gKiBAcGFyYW0gbkdyYW1XaWR0aHM6IFRoZSBzaXplcyBvZiB0aGUgbmdyYW1zIHRvIGNyZWF0ZS5cbiAqIEBwYXJhbSBsZWZ0UGFkOiBUaGUgc3RyaW5nIHRvIHVzZSB0byBwYWQgdGhlIGxlZnQgc2lkZSBvZiB0aGUgbmdyYW0gc2VxdWVuY2UuXG4gKiAgICAgT25seSB1c2VkIGlmIHBhZF93aWR0aCAhPT0gMC5cbiAqIEBwYXJhbSByaWdodFBhZDogVGhlIHN0cmluZyB0byB1c2UgdG8gcGFkIHRoZSByaWdodCBzaWRlIG9mIHRoZSBuZ3JhbVxuICogICAgIHNlcXVlbmNlLiBPbmx5IHVzZWQgaWYgcGFkX3dpZHRoICE9PSAwLlxuICogQHBhcmFtIHBhZFdpZHRoOiBUaGUgbnVtYmVyIG9mIHBhZGRpbmcgZWxlbWVudHMgdG8gYWRkIHRvIGVhY2ggc2lkZSBvZiBlYWNoXG4gKiAgICAgc2VxdWVuY2UuIE5vdGUgdGhhdCBwYWRkaW5nIHdpbGwgbmV2ZXIgYmUgZ3JlYXRlciB0aGFuIGBuR3JhbVdpZHRoc2AtMVxuICogICAgIHJlZ2FyZGxlc3Mgb2YgdGhpcyB2YWx1ZS4gSWYgYHBhZFdpZHRoYD0tMSAsIHRoZW4gYWRkIG1heChgbkdyYW1XaWR0aHMpLTFcbiAqICAgICBlbGVtZW50cy5cbiAqIEBwYXJhbSBwcmVzZXJ2ZVNob3J0U2VxdWVuY2VzOiBJZiB0cnVlLCB0aGVuIGVuc3VyZSB0aGF0IGF0IGxlYXN0IG9uZSBuZ3JhbVxuICogICAgIGlzIGdlbmVyYXRlZCBmb3IgZWFjaCBpbnB1dCBzZXF1ZW5jZS4gSW4gcGFydGljdWxhciwgaWYgYW4gaW5wdXQgc2VxdWVuY2VcbiAqICAgICBpcyBzaG9ydGVyIHRoYW4gbWluKG5ncmFtV2lkdGgpICsgMipwYWRXaWR0aCwgdGhlbiBnZW5lcmF0ZSBhIHNpbmdsZVxuICogICAgIG5ncmFtIGNvbnRhaW5pbmcgdGhlIGVudGlyZSBzZXF1ZW5jZS4gSWYgZmFsc2UsIHRoZW4gbm8gbmdyYW1zIGFyZVxuICogICAgIGdlbmVyYXRlZCBmb3IgdGhlc2Ugc2hvcnQgaW5wdXQgc2VxdWVuY2VzLlxuICogQHJldHVybiBBIG1hcCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqICAgICAtIG5HcmFtczogVGhlIHZhbHVlcyB0ZW5zb3Igb2YgdGhlIG91dHB1dCBuZ3JhbXMgcmFnZ2VkIHRlbnNvci5cbiAqICAgICAtIG5HcmFtc1NwbGl0czogVGhlIHNwbGl0cyB0ZW5zb3Igb2YgdGhlIG91dHB1dCBuZ3JhbXMgcmFnZ2VkIHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdTdHJpbmcnfVxuICovXG5mdW5jdGlvbiBzdHJpbmdOR3JhbXNfKGRhdGEsIGRhdGFTcGxpdHMsIHNlcGFyYXRvciwgbkdyYW1XaWR0aHMsIGxlZnRQYWQsIHJpZ2h0UGFkLCBwYWRXaWR0aCwgcHJlc2VydmVTaG9ydFNlcXVlbmNlcykge1xuICAgIGNvbnN0ICRkYXRhID0gY29udmVydFRvVGVuc29yKGRhdGEsICdkYXRhJywgJ3N0cmluZ05HcmFtcycsICdzdHJpbmcnKTtcbiAgICBpZiAoJGRhdGEuZHR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRGF0YSBtdXN0IGJlIG9mIGRhdGF0eXBlIHN0cmluZycpO1xuICAgIH1cbiAgICBpZiAoJGRhdGEuc2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRGF0YSBtdXN0IGJlIGEgdmVjdG9yLCBzYXc6ICR7JGRhdGEuc2hhcGV9YCk7XG4gICAgfVxuICAgIGNvbnN0ICRkYXRhU3BsaXRzID0gY29udmVydFRvVGVuc29yKGRhdGFTcGxpdHMsICdkYXRhU3BsaXRzJywgJ3N0cmluZ05HcmFtcycpO1xuICAgIGlmICgkZGF0YVNwbGl0cy5kdHlwZSAhPT0gJ2ludDMyJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RhdGEgc3BsaXRzIG11c3QgYmUgb2YgZGF0YXR5cGUgaW50MzInKTtcbiAgICB9XG4gICAgY29uc3QgYXR0cnMgPSB7XG4gICAgICAgIHNlcGFyYXRvcixcbiAgICAgICAgbkdyYW1XaWR0aHMsXG4gICAgICAgIGxlZnRQYWQsXG4gICAgICAgIHJpZ2h0UGFkLFxuICAgICAgICBwYWRXaWR0aCxcbiAgICAgICAgcHJlc2VydmVTaG9ydFNlcXVlbmNlc1xuICAgIH07XG4gICAgY29uc3QgaW5wdXRzID0geyBkYXRhOiAkZGF0YSwgZGF0YVNwbGl0czogJGRhdGFTcGxpdHMgfTtcbiAgICBjb25zdCByZXN1bHQgPSBFTkdJTkUucnVuS2VybmVsKFN0cmluZ05HcmFtcywgaW5wdXRzLCBhdHRycyk7XG4gICAgcmV0dXJuIHsgbkdyYW1zOiByZXN1bHRbMF0sIG5HcmFtc1NwbGl0czogcmVzdWx0WzFdIH07XG59XG5leHBvcnQgY29uc3Qgc3RyaW5nTkdyYW1zID0gb3AoeyBzdHJpbmdOR3JhbXNfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3RyaW5nX25fZ3JhbXMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vLi4vZW5naW5lJztcbmltcG9ydCB7IFN0cmluZ1NwbGl0IH0gZnJvbSAnLi4vLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4uL29wZXJhdGlvbic7XG4vKipcbiAqIFNwbGl0IGVsZW1lbnRzIG9mIGBpbnB1dGAgYmFzZWQgb24gYGRlbGltaXRlcmAgaW50byBhIFNwYXJzZVRlbnNvciAuXG4gKlxuICogTGV0IE4gYmUgdGhlIHNpemUgb2Ygc291cmNlICh0eXBpY2FsbHkgTiB3aWxsIGJlIHRoZSBiYXRjaCBzaXplKS4gU3BsaXQgZWFjaFxuICogZWxlbWVudCBvZiBgaW5wdXRgIGJhc2VkIG9uIGBkZWxpbWl0ZXJgIGFuZCByZXR1cm4gYSBTcGFyc2VUZW5zb3IgY29udGFpbmluZ1xuICogdGhlIHNwbGl0dGVkIHRva2Vucy4gRW1wdHkgdG9rZW5zIGFyZSBpZ25vcmVkIGlmIGBza2lwRW1wdHlgIGlzIHNldCB0byBUcnVlLlxuICpcbiAqIGBkZWxpbWl0ZXJgIGNhbiBiZSBlbXB0eSwgb3IgYSBzdHJpbmcgb2Ygc3BsaXQgY2hhcmFjdGVycy4gSWYgYGRlbGltaXRlcmAgaXNcbiAqIGFuIGVtcHR5IHN0cmluZywgZWFjaCBlbGVtZW50IG9mIGBpbnB1dGAgaXMgc3BsaXQgaW50byBpbmRpdmlkdWFsXG4gKiBjaGFyYWN0ZXIgc3RyaW5ncy4gT3RoZXJ3aXNlIGV2ZXJ5IGNoYXJhY3RlciBvZiBgZGVsaW1pdGVyYCBpcyBhIHBvdGVudGlhbFxuICogc3BsaXQgcG9pbnQuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHJlc3VsdCA9IHRmLnN0cmluZy5zdHJpbmdTcGxpdChbJ2hlbGxvIHdvcmxkJywgICdhIGIgYyddLCAnICcpO1xuICogcmVzdWx0WydpbmRpY2VzJ10ucHJpbnQoKTsgLy8gW1swLCAwXSwgWzAsIDFdLCBbMSwgMF0sIFsxLCAxXSwgWzEsIDJdXVxuICogcmVzdWx0Wyd2YWx1ZXMnXS5wcmludCgpOyAvLyBbJ2hlbGxvJywgJ3dvcmxkJywgJ2EnLCAnYicsICdjJ11cbiAqIHJlc3VsdFsnc2hhcGUnXS5wcmludCgpOyAvLyBbMiwgM11cbiAqIGBgYFxuICogQHBhcmFtIGlucHV0OiAxLUQuIFN0cmluZ3MgdG8gc3BsaXQuXG4gKiBAcGFyYW0gZGVsaW1pdGVyOiAwLUQuIERlbGltaXRlciBjaGFyYWN0ZXJzLCBvciBlbXB0eSBzdHJpbmcuXG4gKiBAcGFyYW0gc2tpcEVtcHR5OiBPcHRpb25hbC4gSWYgdHJ1ZSwgc2tpcCB0aGUgZW1wdHkgc3RyaW5ncyBmcm9tIHRoZSByZXN1bHQuXG4gKiAgICAgRGVmYXVsdHMgdG8gdHJ1ZS5cbiAqIEByZXR1cm4gQSBtYXAgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKiAgICAgLSBpbmRpY2VzOiBBIGRlbnNlIG1hdHJpeCBvZiBpbnQzMiByZXByZXNlbnRpbmcgdGhlIGluZGljZXMgb2YgdGhlIHNwYXJzZVxuICogICAgICAgdGVuc29yLlxuICogICAgIC0gdmFsdWVzOiBBIHZlY3RvciBvZiBzdHJpbmdzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwbGl0ZWQgdmFsdWVzLlxuICogICAgIC0gc2hhcGU6IGEgbGVuZ3RoLTIgdmVjdG9yIG9mIGludDMyIHJlcHJlc2VudGluZyB0aGUgc2hhcGUgb2YgdGhlIHNwYXJzZVxuICogdGVuc29yLCB3aGVyZSB0aGUgZmlyc3QgdmFsdWUgaXMgTiBhbmQgdGhlIHNlY29uZCB2YWx1ZSBpcyB0aGUgbWF4aW11bSBudW1iZXJcbiAqIG9mIHRva2VucyBpbiBhIHNpbmdsZSBpbnB1dCBlbnRyeS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdTdHJpbmcnfVxuICovXG5mdW5jdGlvbiBzdHJpbmdTcGxpdF8oaW5wdXQsIGRlbGltaXRlciwgc2tpcEVtcHR5ID0gdHJ1ZSkge1xuICAgIGNvbnN0ICRpbnB1dCA9IGNvbnZlcnRUb1RlbnNvcihpbnB1dCwgJ2lucHV0JywgJ3N0cmluZ1NwbGl0JywgJ3N0cmluZycpO1xuICAgIGNvbnN0ICRkZWxpbWl0ZXIgPSBjb252ZXJ0VG9UZW5zb3IoZGVsaW1pdGVyLCAnZGVsaW1pdGVyJywgJ3N0cmluZ1NwbGl0JywgJ3N0cmluZycpO1xuICAgIGlmICgkaW5wdXQucmFuayAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYElucHV0IHNob3VsZCBiZSBUZW5zb3IxRCBidXQgcmVjZWl2ZWQgc2hhcGUgJHskaW5wdXQuc2hhcGV9YCk7XG4gICAgfVxuICAgIGlmICgkZGVsaW1pdGVyLnJhbmsgIT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEZWxpbWl0ZXIgc2hvdWxkIGJlIGEgc2NhbGFyIGJ1dCByZWNlaXZlZCBzaGFwZSAkeyRkZWxpbWl0ZXIuc2hhcGV9YCk7XG4gICAgfVxuICAgIGNvbnN0IGF0dHJzID0geyBza2lwRW1wdHkgfTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IGlucHV0OiAkaW5wdXQsIGRlbGltaXRlcjogJGRlbGltaXRlciB9O1xuICAgIGNvbnN0IHJlc3VsdCA9IEVOR0lORS5ydW5LZXJuZWwoU3RyaW5nU3BsaXQsIGlucHV0cywgYXR0cnMpO1xuICAgIHJldHVybiB7IGluZGljZXM6IHJlc3VsdFswXSwgdmFsdWVzOiByZXN1bHRbMV0sIHNoYXBlOiByZXN1bHRbMl0gfTtcbn1cbmV4cG9ydCBjb25zdCBzdHJpbmdTcGxpdCA9IG9wKHsgc3RyaW5nU3BsaXRfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3RyaW5nX3NwbGl0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBTdHJpbmdUb0hhc2hCdWNrZXRGYXN0IH0gZnJvbSAnLi4vLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4uL29wZXJhdGlvbic7XG4vKipcbiAqIENvbnZlcnRzIGVhY2ggc3RyaW5nIGluIHRoZSBpbnB1dCBUZW5zb3IgdG8gaXRzIGhhc2ggbW9kIGJ5IGEgbnVtYmVyIG9mXG4gKiBidWNrZXRzLlxuICpcbiAqIFRoZSBoYXNoIGZ1bmN0aW9uIGlzIGRldGVybWluaXN0aWMgb24gdGhlIGNvbnRlbnQgb2YgdGhlIHN0cmluZyB3aXRoaW4gdGhlXG4gKiBwcm9jZXNzIGFuZCB3aWxsIG5ldmVyIGNoYW5nZS4gSG93ZXZlciwgaXQgaXMgbm90IHN1aXRhYmxlIGZvciBjcnlwdG9ncmFwaHkuXG4gKiBUaGlzIGZ1bmN0aW9uIG1heSBiZSB1c2VkIHdoZW4gQ1BVIHRpbWUgaXMgc2NhcmNlIGFuZCBpbnB1dHMgYXJlIHRydXN0ZWQgb3JcbiAqIHVuaW1wb3J0YW50LiBUaGVyZSBpcyBhIHJpc2sgb2YgYWR2ZXJzYXJpZXMgY29uc3RydWN0aW5nIGlucHV0cyB0aGF0IGFsbCBoYXNoXG4gKiB0byB0aGUgc2FtZSBidWNrZXQuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHJlc3VsdCA9IHRmLnN0cmluZy5zdHJpbmdUb0hhc2hCdWNrZXRGYXN0KFxuICogICBbJ0hlbGxvJywgJ1RlbnNvckZsb3cnLCAnMi54J10sIDMpO1xuICogcmVzdWx0LnByaW50KCk7IC8vIFswLCAyLCAyXVxuICogYGBgXG4gKiBAcGFyYW0gaW5wdXQ6IFRoZSBzdHJpbmdzIHRvIGFzc2lnbiBhIGhhc2ggYnVja2V0LlxuICogQHBhcmFtIG51bUJ1Y2tldHM6IFRoZSBudW1iZXIgb2YgYnVja2V0cy5cbiAqIEByZXR1cm4gQSBUZW5zb3Igb2YgdGhlIHNhbWUgc2hhcGUgYXMgdGhlIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdTdHJpbmcnfVxuICovXG5mdW5jdGlvbiBzdHJpbmdUb0hhc2hCdWNrZXRGYXN0XyhpbnB1dCwgbnVtQnVja2V0cykge1xuICAgIGNvbnN0ICRpbnB1dCA9IGNvbnZlcnRUb1RlbnNvcihpbnB1dCwgJ2lucHV0JywgJ3N0cmluZ1RvSGFzaEJ1Y2tldEZhc3QnLCAnc3RyaW5nJyk7XG4gICAgY29uc3QgYXR0cnMgPSB7IG51bUJ1Y2tldHMgfTtcbiAgICBpZiAobnVtQnVja2V0cyA8PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTnVtYmVyIG9mIGJ1Y2tldHMgbXVzdCBiZSBhdCBsZWFzdCAxYCk7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0cyA9IHsgaW5wdXQ6ICRpbnB1dCB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFN0cmluZ1RvSGFzaEJ1Y2tldEZhc3QsIGlucHV0cywgYXR0cnMpO1xufVxuZXhwb3J0IGNvbnN0IHN0cmluZ1RvSGFzaEJ1Y2tldEZhc3QgPSBvcCh7IHN0cmluZ1RvSGFzaEJ1Y2tldEZhc3RfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3RyaW5nX3RvX2hhc2hfYnVja2V0X2Zhc3QuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IFN1YiB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBtYWtlVHlwZXNNYXRjaCB9IGZyb20gJy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogU3VidHJhY3RzIHR3byBgdGYuVGVuc29yYHMgZWxlbWVudC13aXNlLCBBIC0gQi4gU3VwcG9ydHMgYnJvYWRjYXN0aW5nLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzEwLCAyMCwgMzAsIDQwXSk7XG4gKiBjb25zdCBiID0gdGYudGVuc29yMWQoWzEsIDIsIDMsIDRdKTtcbiAqXG4gKiBhLnN1YihiKS5wcmludCgpOyAgLy8gb3IgdGYuc3ViKGEsIGIpXG4gKiBgYGBcbiAqXG4gKiBgYGBqc1xuICogLy8gQnJvYWRjYXN0IHN1YnRyYWN0IGEgd2l0aCBiLlxuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsxMCwgMjAsIDMwLCA0MF0pO1xuICogY29uc3QgYiA9IHRmLnNjYWxhcig1KTtcbiAqXG4gKiBhLnN1YihiKS5wcmludCgpOyAgLy8gb3IgdGYuc3ViKGEsIGIpXG4gKiBgYGBcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCBgdGYuVGVuc29yYCB0byBzdWJ0cmFjdCBmcm9tLlxuICogQHBhcmFtIGIgVGhlIHNlY29uZCBgdGYuVGVuc29yYCB0byBiZSBzdWJ0cmFjdGVkLiBNdXN0IGhhdmUgdGhlIHNhbWUgZHR5cGUgYXNcbiAqIGBhYC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdBcml0aG1ldGljJ31cbiAqL1xuZnVuY3Rpb24gc3ViXyhhLCBiKSB7XG4gICAgbGV0ICRhID0gY29udmVydFRvVGVuc29yKGEsICdhJywgJ3N1YicpO1xuICAgIGxldCAkYiA9IGNvbnZlcnRUb1RlbnNvcihiLCAnYicsICdzdWInKTtcbiAgICBbJGEsICRiXSA9IG1ha2VUeXBlc01hdGNoKCRhLCAkYik7XG4gICAgY29uc3QgaW5wdXRzID0geyBhOiAkYSwgYjogJGIgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChTdWIsIGlucHV0cyk7XG59XG5leHBvcnQgY29uc3Qgc3ViID0gb3AoeyBzdWJfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3ViLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBTdW0gfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IGNhc3QgfSBmcm9tICcuL2Nhc3QnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENvbXB1dGVzIHRoZSBzdW0gb2YgZWxlbWVudHMgYWNyb3NzIGRpbWVuc2lvbnMgb2YgYSBgdGYuVGVuc29yYC5cbiAqXG4gKiBSZWR1Y2VzIHRoZSBpbnB1dCBhbG9uZyB0aGUgZGltZW5zaW9ucyBnaXZlbiBpbiBgYXhlc2AuIFVubGVzcyBga2VlcERpbXNgXG4gKiBpcyB0cnVlLCB0aGUgcmFuayBvZiB0aGUgYHRmLlRlbnNvcmAgaXMgcmVkdWNlZCBieSAxIGZvciBlYWNoIGVudHJ5IGluXG4gKiBgYXhlc2AuIElmIGBrZWVwRGltc2AgaXMgdHJ1ZSwgdGhlIHJlZHVjZWQgZGltZW5zaW9ucyBhcmUgcmV0YWluZWQgd2l0aFxuICogbGVuZ3RoIDEuIElmIGF4ZXMgaGFzIG5vIGVudHJpZXMsIGFsbCBkaW1lbnNpb25zIGFyZSByZWR1Y2VkLCBhbmQgYVxuICogYHRmLlRlbnNvcmAgd2l0aCBhIHNpbmdsZSBlbGVtZW50IGlzIHJldHVybmVkLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIDNdKTtcbiAqXG4gKiB4LnN1bSgpLnByaW50KCk7ICAvLyBvciB0Zi5zdW0oeClcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMmQoWzEsIDIsIDMsIDRdLCBbMiwgMl0pO1xuICpcbiAqIGNvbnN0IGF4aXMgPSAxO1xuICogeC5zdW0oYXhpcykucHJpbnQoKTsgIC8vIG9yIHRmLnN1bSh4LCBheGlzKVxuICogYGBgXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvciB0byBjb21wdXRlIHRoZSBzdW0gb3Zlci4gSWYgdGhlIGR0eXBlIGlzIGBib29sYFxuICogICBpdCB3aWxsIGJlIGNvbnZlcnRlZCB0byBgaW50MzJgIGFuZCB0aGUgb3V0cHV0IGR0eXBlIHdpbGwgYmUgYGludDMyYC5cbiAqIEBwYXJhbSBheGlzIFRoZSBkaW1lbnNpb24ocykgdG8gcmVkdWNlLiBCeSBkZWZhdWx0IGl0IHJlZHVjZXNcbiAqICAgICBhbGwgZGltZW5zaW9ucy5cbiAqIEBwYXJhbSBrZWVwRGltcyBJZiB0cnVlLCByZXRhaW5zIHJlZHVjZWQgZGltZW5zaW9ucyB3aXRoIHNpemUgMS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdSZWR1Y3Rpb24nfVxuICovXG5mdW5jdGlvbiBzdW1fKHgsIGF4aXMgPSBudWxsLCBrZWVwRGltcyA9IGZhbHNlKSB7XG4gICAgbGV0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3N1bScpO1xuICAgIGlmICgkeC5kdHlwZSA9PT0gJ2Jvb2wnKSB7XG4gICAgICAgICR4ID0gY2FzdCgkeCwgJ2ludDMyJyk7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICBjb25zdCBhdHRycyA9IHsgYXhpcywga2VlcERpbXMgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChTdW0sIGlucHV0cywgYXR0cnMpO1xufVxuZXhwb3J0IGNvbnN0IHN1bSA9IG9wKHsgc3VtXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXN1bS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgVGFuIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgdGFuIG9mIHRoZSBpbnB1dCBgdGYuVGVuc29yYCBlbGVtZW50LXdpc2UsIGB0YW4oeClgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMCwgTWF0aC5QSSAvIDIsIE1hdGguUEkgKiAzIC8gNF0pO1xuICpcbiAqIHgudGFuKCkucHJpbnQoKTsgIC8vIG9yIHRmLnRhbih4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiB0YW5fKHgpIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICd0YW4nKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7IHg6ICR4IH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoVGFuLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IHRhbiA9IG9wKHsgdGFuXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRhbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgVGFuaCB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIENvbXB1dGVzIGh5cGVyYm9saWMgdGFuZ2VudCBvZiB0aGUgaW5wdXQgYHRmLlRlbnNvcmAgZWxlbWVudC13aXNlOiBgdGFuaCh4KWBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFswLCAxLCAtMSwgNzBdKTtcbiAqXG4gKiB4LnRhbmgoKS5wcmludCgpOyAgLy8gb3IgdGYudGFuaCh4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiB0YW5oXyh4KSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAndGFuaCcpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChUYW5oLCBpbnB1dHMpO1xufVxuZXhwb3J0IGNvbnN0IHRhbmggPSBvcCh7IHRhbmhfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGFuaC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBpbmZlclNoYXBlIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IG1ha2VUZW5zb3IgfSBmcm9tICcuL3RlbnNvcl9vcHNfdXRpbCc7XG4vKipcbiAqIENyZWF0ZXMgYSBgdGYuVGVuc29yYCB3aXRoIHRoZSBwcm92aWRlZCB2YWx1ZXMsIHNoYXBlIGFuZCBkdHlwZS5cbiAqXG4gKiBgYGBqc1xuICogLy8gUGFzcyBhbiBhcnJheSBvZiB2YWx1ZXMgdG8gY3JlYXRlIGEgdmVjdG9yLlxuICogdGYudGVuc29yKFsxLCAyLCAzLCA0XSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiAvLyBQYXNzIGEgbmVzdGVkIGFycmF5IG9mIHZhbHVlcyB0byBtYWtlIGEgbWF0cml4IG9yIGEgaGlnaGVyXG4gKiAvLyBkaW1lbnNpb25hbCB0ZW5zb3IuXG4gKiB0Zi50ZW5zb3IoW1sxLCAyXSwgWzMsIDRdXSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiAvLyBQYXNzIGEgZmxhdCBhcnJheSBhbmQgc3BlY2lmeSBhIHNoYXBlIHlvdXJzZWxmLlxuICogdGYudGVuc29yKFsxLCAyLCAzLCA0XSwgWzIsIDJdKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHZhbHVlcyBUaGUgdmFsdWVzIG9mIHRoZSB0ZW5zb3IuIENhbiBiZSBuZXN0ZWQgYXJyYXkgb2YgbnVtYmVycyxcbiAqICAgICBvciBhIGZsYXQgYXJyYXksIG9yIGEgYFR5cGVkQXJyYXlgLiBJZiB0aGUgdmFsdWVzIGFyZSBzdHJpbmdzLFxuICogICAgIHRoZXkgd2lsbCBiZSBlbmNvZGVkIGFzIHV0Zi04IGFuZCBrZXB0IGFzIGBVaW50OEFycmF5W11gLlxuICogQHBhcmFtIHNoYXBlIFRoZSBzaGFwZSBvZiB0aGUgdGVuc29yLiBPcHRpb25hbC4gSWYgbm90IHByb3ZpZGVkLFxuICogICBpdCBpcyBpbmZlcnJlZCBmcm9tIGB2YWx1ZXNgLlxuICogQHBhcmFtIGR0eXBlIFRoZSBkYXRhIHR5cGUuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ3JlYXRpb24nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gdGVuc29yKHZhbHVlcywgc2hhcGUsIGR0eXBlKSB7XG4gICAgY29uc3QgaW5mZXJyZWRTaGFwZSA9IGluZmVyU2hhcGUodmFsdWVzLCBkdHlwZSk7XG4gICAgcmV0dXJuIG1ha2VUZW5zb3IodmFsdWVzLCBzaGFwZSwgaW5mZXJyZWRTaGFwZSwgZHR5cGUpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGVuc29yLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGluZmVyU2hhcGUgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgYXNzZXJ0Tm9uTnVsbCB9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgbWFrZVRlbnNvciB9IGZyb20gJy4vdGVuc29yX29wc191dGlsJztcbi8qKlxuICogQ3JlYXRlcyByYW5rLTEgYHRmLlRlbnNvcmAgd2l0aCB0aGUgcHJvdmlkZWQgdmFsdWVzLCBzaGFwZSBhbmQgZHR5cGUuXG4gKlxuICogVGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBjYW4gYmUgYWNoaWV2ZWQgd2l0aCBgdGYudGVuc29yYCwgYnV0IGluIGdlbmVyYWxcbiAqIHdlIHJlY29tbWVuZCB1c2luZyBgdGYudGVuc29yMWRgIGFzIGl0IG1ha2VzIHRoZSBjb2RlIG1vcmUgcmVhZGFibGUuXG4gKlxuICogYGBganNcbiAqIHRmLnRlbnNvcjFkKFsxLCAyLCAzXSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB2YWx1ZXMgVGhlIHZhbHVlcyBvZiB0aGUgdGVuc29yLiBDYW4gYmUgYXJyYXkgb2YgbnVtYmVycyxcbiAqICAgICBvciBhIGBUeXBlZEFycmF5YC5cbiAqIEBwYXJhbSBkdHlwZSBUaGUgZGF0YSB0eXBlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NyZWF0aW9uJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRlbnNvcjFkKHZhbHVlcywgZHR5cGUpIHtcbiAgICBhc3NlcnROb25OdWxsKHZhbHVlcyk7XG4gICAgY29uc3QgaW5mZXJyZWRTaGFwZSA9IGluZmVyU2hhcGUodmFsdWVzLCBkdHlwZSk7XG4gICAgaWYgKGluZmVycmVkU2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndGVuc29yMWQoKSByZXF1aXJlcyB2YWx1ZXMgdG8gYmUgYSBmbGF0L1R5cGVkQXJyYXknKTtcbiAgICB9XG4gICAgY29uc3Qgc2hhcGUgPSBudWxsO1xuICAgIHJldHVybiBtYWtlVGVuc29yKHZhbHVlcywgc2hhcGUsIGluZmVycmVkU2hhcGUsIGR0eXBlKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRlbnNvcjFkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGluZmVyU2hhcGUgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgYXNzZXJ0Tm9uTnVsbCB9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgbWFrZVRlbnNvciB9IGZyb20gJy4vdGVuc29yX29wc191dGlsJztcbi8qKlxuICogQ3JlYXRlcyByYW5rLTIgYHRmLlRlbnNvcmAgd2l0aCB0aGUgcHJvdmlkZWQgdmFsdWVzLCBzaGFwZSBhbmQgZHR5cGUuXG4gKlxuICogVGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBjYW4gYmUgYWNoaWV2ZWQgd2l0aCBgdGYudGVuc29yYCwgYnV0IGluIGdlbmVyYWxcbiAqIHdlIHJlY29tbWVuZCB1c2luZyBgdGYudGVuc29yMmRgIGFzIGl0IG1ha2VzIHRoZSBjb2RlIG1vcmUgcmVhZGFibGUuXG4gKlxuICogIGBgYGpzXG4gKiAvLyBQYXNzIGEgbmVzdGVkIGFycmF5LlxuICogdGYudGVuc29yMmQoW1sxLCAyXSwgWzMsIDRdXSkucHJpbnQoKTtcbiAqIGBgYFxuICogYGBganNcbiAqIC8vIFBhc3MgYSBmbGF0IGFycmF5IGFuZCBzcGVjaWZ5IGEgc2hhcGUuXG4gKiB0Zi50ZW5zb3IyZChbMSwgMiwgMywgNF0sIFsyLCAyXSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB2YWx1ZXMgVGhlIHZhbHVlcyBvZiB0aGUgdGVuc29yLiBDYW4gYmUgbmVzdGVkIGFycmF5IG9mIG51bWJlcnMsXG4gKiAgICAgb3IgYSBmbGF0IGFycmF5LCBvciBhIGBUeXBlZEFycmF5YC5cbiAqIEBwYXJhbSBzaGFwZSBUaGUgc2hhcGUgb2YgdGhlIHRlbnNvci4gSWYgbm90IHByb3ZpZGVkLCBpdCBpcyBpbmZlcnJlZCBmcm9tXG4gKiAgICAgYHZhbHVlc2AuXG4gKiBAcGFyYW0gZHR5cGUgVGhlIGRhdGEgdHlwZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDcmVhdGlvbid9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZW5zb3IyZCh2YWx1ZXMsIHNoYXBlLCBkdHlwZSkge1xuICAgIGFzc2VydE5vbk51bGwodmFsdWVzKTtcbiAgICBpZiAoc2hhcGUgIT0gbnVsbCAmJiBzaGFwZS5sZW5ndGggIT09IDIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0ZW5zb3IyZCgpIHJlcXVpcmVzIHNoYXBlIHRvIGhhdmUgdHdvIG51bWJlcnMnKTtcbiAgICB9XG4gICAgY29uc3QgaW5mZXJyZWRTaGFwZSA9IGluZmVyU2hhcGUodmFsdWVzLCBkdHlwZSk7XG4gICAgaWYgKGluZmVycmVkU2hhcGUubGVuZ3RoICE9PSAyICYmIGluZmVycmVkU2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndGVuc29yMmQoKSByZXF1aXJlcyB2YWx1ZXMgdG8gYmUgbnVtYmVyW11bXSBvciBmbGF0L1R5cGVkQXJyYXknKTtcbiAgICB9XG4gICAgaWYgKGluZmVycmVkU2hhcGUubGVuZ3RoID09PSAxICYmIHNoYXBlID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0ZW5zb3IyZCgpIHJlcXVpcmVzIHNoYXBlIHRvIGJlIHByb3ZpZGVkIHdoZW4gYHZhbHVlc2AgJyArXG4gICAgICAgICAgICAnYXJlIGEgZmxhdC9UeXBlZEFycmF5Jyk7XG4gICAgfVxuICAgIHJldHVybiBtYWtlVGVuc29yKHZhbHVlcywgc2hhcGUsIGluZmVycmVkU2hhcGUsIGR0eXBlKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRlbnNvcjJkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGluZmVyU2hhcGUgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgYXNzZXJ0Tm9uTnVsbCB9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgbWFrZVRlbnNvciB9IGZyb20gJy4vdGVuc29yX29wc191dGlsJztcbi8qKlxuICogQ3JlYXRlcyByYW5rLTMgYHRmLlRlbnNvcmAgd2l0aCB0aGUgcHJvdmlkZWQgdmFsdWVzLCBzaGFwZSBhbmQgZHR5cGUuXG4gKlxuICogVGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBjYW4gYmUgYWNoaWV2ZWQgd2l0aCBgdGYudGVuc29yYCwgYnV0IGluIGdlbmVyYWxcbiAqIHdlIHJlY29tbWVuZCB1c2luZyBgdGYudGVuc29yM2RgIGFzIGl0IG1ha2VzIHRoZSBjb2RlIG1vcmUgcmVhZGFibGUuXG4gKlxuICogIGBgYGpzXG4gKiAvLyBQYXNzIGEgbmVzdGVkIGFycmF5LlxuICogdGYudGVuc29yM2QoW1tbMV0sIFsyXV0sIFtbM10sIFs0XV1dKS5wcmludCgpO1xuICogYGBgXG4gKiBgYGBqc1xuICogLy8gUGFzcyBhIGZsYXQgYXJyYXkgYW5kIHNwZWNpZnkgYSBzaGFwZS5cbiAqIHRmLnRlbnNvcjNkKFsxLCAyLCAzLCA0XSwgWzIsIDIsIDFdKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHZhbHVlcyBUaGUgdmFsdWVzIG9mIHRoZSB0ZW5zb3IuIENhbiBiZSBuZXN0ZWQgYXJyYXkgb2YgbnVtYmVycyxcbiAqICAgICBvciBhIGZsYXQgYXJyYXksIG9yIGEgYFR5cGVkQXJyYXlgLlxuICogQHBhcmFtIHNoYXBlIFRoZSBzaGFwZSBvZiB0aGUgdGVuc29yLiBJZiBub3QgcHJvdmlkZWQsICBpdCBpcyBpbmZlcnJlZCBmcm9tXG4gKiAgICAgYHZhbHVlc2AuXG4gKiBAcGFyYW0gZHR5cGUgVGhlIGRhdGEgdHlwZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDcmVhdGlvbid9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZW5zb3IzZCh2YWx1ZXMsIHNoYXBlLCBkdHlwZSkge1xuICAgIGFzc2VydE5vbk51bGwodmFsdWVzKTtcbiAgICBpZiAoc2hhcGUgIT0gbnVsbCAmJiBzaGFwZS5sZW5ndGggIT09IDMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0ZW5zb3IzZCgpIHJlcXVpcmVzIHNoYXBlIHRvIGhhdmUgdGhyZWUgbnVtYmVycycpO1xuICAgIH1cbiAgICBjb25zdCBpbmZlcnJlZFNoYXBlID0gaW5mZXJTaGFwZSh2YWx1ZXMsIGR0eXBlKTtcbiAgICBpZiAoaW5mZXJyZWRTaGFwZS5sZW5ndGggIT09IDMgJiYgaW5mZXJyZWRTaGFwZS5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0ZW5zb3IzZCgpIHJlcXVpcmVzIHZhbHVlcyB0byBiZSBudW1iZXJbXVtdW10gb3IgZmxhdC9UeXBlZEFycmF5Jyk7XG4gICAgfVxuICAgIGlmIChpbmZlcnJlZFNoYXBlLmxlbmd0aCA9PT0gMSAmJiBzaGFwZSA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndGVuc29yM2QoKSByZXF1aXJlcyBzaGFwZSB0byBiZSBwcm92aWRlZCB3aGVuIGB2YWx1ZXNgICcgK1xuICAgICAgICAgICAgJ2FyZSBhIGZsYXQgYXJyYXknKTtcbiAgICB9XG4gICAgcmV0dXJuIG1ha2VUZW5zb3IodmFsdWVzLCBzaGFwZSwgaW5mZXJyZWRTaGFwZSwgZHR5cGUpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGVuc29yM2QuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgaW5mZXJTaGFwZSB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBhc3NlcnROb25OdWxsIH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBtYWtlVGVuc29yIH0gZnJvbSAnLi90ZW5zb3Jfb3BzX3V0aWwnO1xuLyoqXG4gKiBDcmVhdGVzIHJhbmstNCBgdGYuVGVuc29yYCB3aXRoIHRoZSBwcm92aWRlZCB2YWx1ZXMsIHNoYXBlIGFuZCBkdHlwZS5cbiAqXG4gKiBUaGUgc2FtZSBmdW5jdGlvbmFsaXR5IGNhbiBiZSBhY2hpZXZlZCB3aXRoIGB0Zi50ZW5zb3JgLCBidXQgaW4gZ2VuZXJhbFxuICogd2UgcmVjb21tZW5kIHVzaW5nIGB0Zi50ZW5zb3I0ZGAgYXMgaXQgbWFrZXMgdGhlIGNvZGUgbW9yZSByZWFkYWJsZS5cbiAqXG4gKiAgYGBganNcbiAqIC8vIFBhc3MgYSBuZXN0ZWQgYXJyYXkuXG4gKiB0Zi50ZW5zb3I0ZChbW1tbMV0sIFsyXV0sIFtbM10sIFs0XV1dXSkucHJpbnQoKTtcbiAqIGBgYFxuICogYGBganNcbiAqIC8vIFBhc3MgYSBmbGF0IGFycmF5IGFuZCBzcGVjaWZ5IGEgc2hhcGUuXG4gKiB0Zi50ZW5zb3I0ZChbMSwgMiwgMywgNF0sIFsxLCAyLCAyLCAxXSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB2YWx1ZXMgVGhlIHZhbHVlcyBvZiB0aGUgdGVuc29yLiBDYW4gYmUgbmVzdGVkIGFycmF5IG9mIG51bWJlcnMsXG4gKiAgICAgb3IgYSBmbGF0IGFycmF5LCBvciBhIGBUeXBlZEFycmF5YC5cbiAqIEBwYXJhbSBzaGFwZSBUaGUgc2hhcGUgb2YgdGhlIHRlbnNvci4gT3B0aW9uYWwuIElmIG5vdCBwcm92aWRlZCxcbiAqICAgaXQgaXMgaW5mZXJyZWQgZnJvbSBgdmFsdWVzYC5cbiAqIEBwYXJhbSBkdHlwZSBUaGUgZGF0YSB0eXBlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NyZWF0aW9uJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRlbnNvcjRkKHZhbHVlcywgc2hhcGUsIGR0eXBlKSB7XG4gICAgYXNzZXJ0Tm9uTnVsbCh2YWx1ZXMpO1xuICAgIGlmIChzaGFwZSAhPSBudWxsICYmIHNoYXBlLmxlbmd0aCAhPT0gNCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RlbnNvcjRkKCkgcmVxdWlyZXMgc2hhcGUgdG8gaGF2ZSBmb3VyIG51bWJlcnMnKTtcbiAgICB9XG4gICAgY29uc3QgaW5mZXJyZWRTaGFwZSA9IGluZmVyU2hhcGUodmFsdWVzLCBkdHlwZSk7XG4gICAgaWYgKGluZmVycmVkU2hhcGUubGVuZ3RoICE9PSA0ICYmIGluZmVycmVkU2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndGVuc29yNGQoKSByZXF1aXJlcyB2YWx1ZXMgdG8gYmUgbnVtYmVyW11bXVtdW10gb3IgZmxhdC9UeXBlZEFycmF5Jyk7XG4gICAgfVxuICAgIGlmIChpbmZlcnJlZFNoYXBlLmxlbmd0aCA9PT0gMSAmJiBzaGFwZSA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndGVuc29yNGQoKSByZXF1aXJlcyBzaGFwZSB0byBiZSBwcm92aWRlZCB3aGVuIGB2YWx1ZXNgICcgK1xuICAgICAgICAgICAgJ2FyZSBhIGZsYXQgYXJyYXknKTtcbiAgICB9XG4gICAgcmV0dXJuIG1ha2VUZW5zb3IodmFsdWVzLCBzaGFwZSwgaW5mZXJyZWRTaGFwZSwgZHR5cGUpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGVuc29yNGQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgaW5mZXJTaGFwZSB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBhc3NlcnROb25OdWxsIH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBtYWtlVGVuc29yIH0gZnJvbSAnLi90ZW5zb3Jfb3BzX3V0aWwnO1xuLyoqXG4gKiBDcmVhdGVzIHJhbmstNSBgdGYuVGVuc29yYCB3aXRoIHRoZSBwcm92aWRlZCB2YWx1ZXMsIHNoYXBlIGFuZCBkdHlwZS5cbiAqXG4gKiBUaGUgc2FtZSBmdW5jdGlvbmFsaXR5IGNhbiBiZSBhY2hpZXZlZCB3aXRoIGB0Zi50ZW5zb3JgLCBidXQgaW4gZ2VuZXJhbFxuICogd2UgcmVjb21tZW5kIHVzaW5nIGB0Zi50ZW5zb3I1ZGAgYXMgaXQgbWFrZXMgdGhlIGNvZGUgbW9yZSByZWFkYWJsZS5cbiAqXG4gKiAgYGBganNcbiAqIC8vIFBhc3MgYSBuZXN0ZWQgYXJyYXkuXG4gKiB0Zi50ZW5zb3I1ZChbW1tbWzFdLFsyXV0sW1szXSxbNF1dXSxbW1s1XSxbNl1dLFtbN10sWzhdXV1dXSkucHJpbnQoKTtcbiAqIGBgYFxuICogYGBganNcbiAqIC8vIFBhc3MgYSBmbGF0IGFycmF5IGFuZCBzcGVjaWZ5IGEgc2hhcGUuXG4gKiB0Zi50ZW5zb3I1ZChbMSwgMiwgMywgNCwgNSwgNiwgNywgOF0sIFsxLCAyLCAyLCAyLCAxXSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB2YWx1ZXMgVGhlIHZhbHVlcyBvZiB0aGUgdGVuc29yLiBDYW4gYmUgbmVzdGVkIGFycmF5IG9mIG51bWJlcnMsXG4gKiAgICAgb3IgYSBmbGF0IGFycmF5LCBvciBhIGBUeXBlZEFycmF5YC5cbiAqIEBwYXJhbSBzaGFwZSBUaGUgc2hhcGUgb2YgdGhlIHRlbnNvci4gT3B0aW9uYWwuIElmIG5vdCBwcm92aWRlZCxcbiAqICAgaXQgaXMgaW5mZXJyZWQgZnJvbSBgdmFsdWVzYC5cbiAqIEBwYXJhbSBkdHlwZSBUaGUgZGF0YSB0eXBlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NyZWF0aW9uJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRlbnNvcjVkKHZhbHVlcywgc2hhcGUsIGR0eXBlKSB7XG4gICAgYXNzZXJ0Tm9uTnVsbCh2YWx1ZXMpO1xuICAgIGlmIChzaGFwZSAhPSBudWxsICYmIHNoYXBlLmxlbmd0aCAhPT0gNSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RlbnNvcjVkKCkgcmVxdWlyZXMgc2hhcGUgdG8gaGF2ZSBmaXZlIG51bWJlcnMnKTtcbiAgICB9XG4gICAgY29uc3QgaW5mZXJyZWRTaGFwZSA9IGluZmVyU2hhcGUodmFsdWVzLCBkdHlwZSk7XG4gICAgaWYgKGluZmVycmVkU2hhcGUubGVuZ3RoICE9PSA1ICYmIGluZmVycmVkU2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndGVuc29yNWQoKSByZXF1aXJlcyB2YWx1ZXMgdG8gYmUgJyArXG4gICAgICAgICAgICAnbnVtYmVyW11bXVtdW11bXSBvciBmbGF0L1R5cGVkQXJyYXknKTtcbiAgICB9XG4gICAgaWYgKGluZmVycmVkU2hhcGUubGVuZ3RoID09PSAxICYmIHNoYXBlID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0ZW5zb3I1ZCgpIHJlcXVpcmVzIHNoYXBlIHRvIGJlIHByb3ZpZGVkIHdoZW4gYHZhbHVlc2AgJyArXG4gICAgICAgICAgICAnYXJlIGEgZmxhdCBhcnJheScpO1xuICAgIH1cbiAgICByZXR1cm4gbWFrZVRlbnNvcih2YWx1ZXMsIHNoYXBlLCBpbmZlcnJlZFNoYXBlLCBkdHlwZSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD10ZW5zb3I1ZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBpbmZlclNoYXBlIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IGFzc2VydE5vbk51bGwgfSBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IG1ha2VUZW5zb3IgfSBmcm9tICcuL3RlbnNvcl9vcHNfdXRpbCc7XG4vKipcbiAqIENyZWF0ZXMgcmFuay02IGB0Zi5UZW5zb3JgIHdpdGggdGhlIHByb3ZpZGVkIHZhbHVlcywgc2hhcGUgYW5kIGR0eXBlLlxuICpcbiAqIFRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgY2FuIGJlIGFjaGlldmVkIHdpdGggYHRmLnRlbnNvcmAsIGJ1dCBpbiBnZW5lcmFsXG4gKiB3ZSByZWNvbW1lbmQgdXNpbmcgYHRmLnRlbnNvcjZkYCBhcyBpdCBtYWtlcyB0aGUgY29kZSBtb3JlIHJlYWRhYmxlLlxuICpcbiAqICBgYGBqc1xuICogLy8gUGFzcyBhIG5lc3RlZCBhcnJheS5cbiAqIHRmLnRlbnNvcjZkKFtbW1tbWzFdLFsyXV0sW1szXSxbNF1dXSxbW1s1XSxbNl1dLFtbN10sWzhdXV1dXV0pLnByaW50KCk7XG4gKiBgYGBcbiAqIGBgYGpzXG4gKiAvLyBQYXNzIGEgZmxhdCBhcnJheSBhbmQgc3BlY2lmeSBhIHNoYXBlLlxuICogdGYudGVuc29yNmQoWzEsIDIsIDMsIDQsIDUsIDYsIDcsIDhdLCBbMSwgMSwgMiwgMiwgMiwgMV0pLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gdmFsdWVzIFRoZSB2YWx1ZXMgb2YgdGhlIHRlbnNvci4gQ2FuIGJlIG5lc3RlZCBhcnJheSBvZiBudW1iZXJzLFxuICogICAgIG9yIGEgZmxhdCBhcnJheSwgb3IgYSBgVHlwZWRBcnJheWAuXG4gKiBAcGFyYW0gc2hhcGUgVGhlIHNoYXBlIG9mIHRoZSB0ZW5zb3IuIE9wdGlvbmFsLiBJZiBub3QgcHJvdmlkZWQsXG4gKiAgIGl0IGlzIGluZmVycmVkIGZyb20gYHZhbHVlc2AuXG4gKiBAcGFyYW0gZHR5cGUgVGhlIGRhdGEgdHlwZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDcmVhdGlvbid9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZW5zb3I2ZCh2YWx1ZXMsIHNoYXBlLCBkdHlwZSkge1xuICAgIGFzc2VydE5vbk51bGwodmFsdWVzKTtcbiAgICBpZiAoc2hhcGUgIT0gbnVsbCAmJiBzaGFwZS5sZW5ndGggIT09IDYpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0ZW5zb3I2ZCgpIHJlcXVpcmVzIHNoYXBlIHRvIGhhdmUgc2l4IG51bWJlcnMnKTtcbiAgICB9XG4gICAgY29uc3QgaW5mZXJyZWRTaGFwZSA9IGluZmVyU2hhcGUodmFsdWVzLCBkdHlwZSk7XG4gICAgaWYgKGluZmVycmVkU2hhcGUubGVuZ3RoICE9PSA2ICYmIGluZmVycmVkU2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndGVuc29yNmQoKSByZXF1aXJlcyB2YWx1ZXMgdG8gYmUgbnVtYmVyW11bXVtdW11bXVtdIG9yICcgK1xuICAgICAgICAgICAgJ2ZsYXQvVHlwZWRBcnJheScpO1xuICAgIH1cbiAgICBpZiAoaW5mZXJyZWRTaGFwZS5sZW5ndGggPT09IDEgJiYgc2hhcGUgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RlbnNvcjZkKCkgcmVxdWlyZXMgc2hhcGUgdG8gYmUgcHJvdmlkZWQgd2hlbiBgdmFsdWVzYCAnICtcbiAgICAgICAgICAgICdhcmUgYSBmbGF0IGFycmF5Jyk7XG4gICAgfVxuICAgIHNoYXBlID0gc2hhcGUgfHxcbiAgICAgICAgaW5mZXJyZWRTaGFwZTtcbiAgICByZXR1cm4gbWFrZVRlbnNvcih2YWx1ZXMsIHNoYXBlLCBpbmZlcnJlZFNoYXBlLCBkdHlwZSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD10ZW5zb3I2ZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgYXNzZXJ0LCBhc3NlcnROb25OZWdhdGl2ZUludGVnZXJEaW1lbnNpb25zLCBmbGF0dGVuLCBpbmZlckR0eXBlLCBpc1R5cGVkQXJyYXksIHNpemVGcm9tU2hhcGUsIHRvVHlwZWRBcnJheSB9IGZyb20gJy4uL3V0aWwnO1xuLyoqIFRoaXMgaXMgc2hhcmVkIGNvZGUgYWNyb3NzIGFsbCB0ZW5zb3IgY3JlYXRpb24gbWV0aG9kcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWtlVGVuc29yKHZhbHVlcywgc2hhcGUsIGluZmVycmVkU2hhcGUsIGR0eXBlKSB7XG4gICAgaWYgKGR0eXBlID09IG51bGwpIHtcbiAgICAgICAgZHR5cGUgPSBpbmZlckR0eXBlKHZhbHVlcyk7XG4gICAgfVxuICAgIGlmIChkdHlwZSA9PT0gJ2NvbXBsZXg2NCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY29uc3RydWN0IGEgY29tcGxleDY0IHRlbnNvciBkaXJlY3RseS4gYCArXG4gICAgICAgICAgICBgUGxlYXNlIHVzZSB0Zi5jb21wbGV4KHJlYWwsIGltYWcpLmApO1xuICAgIH1cbiAgICBpZiAoIWlzVHlwZWRBcnJheSh2YWx1ZXMpICYmICFBcnJheS5pc0FycmF5KHZhbHVlcykgJiZcbiAgICAgICAgdHlwZW9mIHZhbHVlcyAhPT0gJ251bWJlcicgJiYgdHlwZW9mIHZhbHVlcyAhPT0gJ2Jvb2xlYW4nICYmXG4gICAgICAgIHR5cGVvZiB2YWx1ZXMgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndmFsdWVzIHBhc3NlZCB0byB0ZW5zb3IodmFsdWVzKSBtdXN0IGJlIGEgbnVtYmVyL2Jvb2xlYW4vc3RyaW5nIG9yICcgK1xuICAgICAgICAgICAgJ2FuIGFycmF5IG9mIG51bWJlcnMvYm9vbGVhbnMvc3RyaW5ncywgb3IgYSBUeXBlZEFycmF5Jyk7XG4gICAgfVxuICAgIGlmIChzaGFwZSAhPSBudWxsKSB7XG4gICAgICAgIGFzc2VydE5vbk5lZ2F0aXZlSW50ZWdlckRpbWVuc2lvbnMoc2hhcGUpO1xuICAgICAgICBjb25zdCBwcm92aWRlZFNpemUgPSBzaXplRnJvbVNoYXBlKHNoYXBlKTtcbiAgICAgICAgY29uc3QgaW5mZXJyZWRTaXplID0gc2l6ZUZyb21TaGFwZShpbmZlcnJlZFNoYXBlKTtcbiAgICAgICAgYXNzZXJ0KHByb3ZpZGVkU2l6ZSA9PT0gaW5mZXJyZWRTaXplLCAoKSA9PiBgQmFzZWQgb24gdGhlIHByb3ZpZGVkIHNoYXBlLCBbJHtzaGFwZX1dLCB0aGUgdGVuc29yIHNob3VsZCBoYXZlIGAgK1xuICAgICAgICAgICAgYCR7cHJvdmlkZWRTaXplfSB2YWx1ZXMgYnV0IGhhcyAke2luZmVycmVkU2l6ZX1gKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmZlcnJlZFNoYXBlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBjb25zdCBpbmZlcnJlZCA9IGluZmVycmVkU2hhcGVbaV07XG4gICAgICAgICAgICBjb25zdCBmbGF0RGltc0RvbnRNYXRjaCA9IGkgPT09IGluZmVycmVkU2hhcGUubGVuZ3RoIC0gMSA/XG4gICAgICAgICAgICAgICAgaW5mZXJyZWQgIT09IHNpemVGcm9tU2hhcGUoc2hhcGUuc2xpY2UoaSkpIDpcbiAgICAgICAgICAgICAgICB0cnVlO1xuICAgICAgICAgICAgYXNzZXJ0KGluZmVycmVkU2hhcGVbaV0gPT09IHNoYXBlW2ldIHx8ICFmbGF0RGltc0RvbnRNYXRjaCwgKCkgPT4gYEVycm9yIGNyZWF0aW5nIGEgbmV3IFRlbnNvci4gSW5mZXJyZWQgc2hhcGUgYCArXG4gICAgICAgICAgICAgICAgYCgke2luZmVycmVkU2hhcGV9KSBkb2VzIG5vdCBtYXRjaCB0aGUgcHJvdmlkZWQgYCArXG4gICAgICAgICAgICAgICAgYHNoYXBlICgke3NoYXBlfSkuIGApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICghaXNUeXBlZEFycmF5KHZhbHVlcykgJiYgIUFycmF5LmlzQXJyYXkodmFsdWVzKSkge1xuICAgICAgICB2YWx1ZXMgPSBbdmFsdWVzXTtcbiAgICB9XG4gICAgc2hhcGUgPSBzaGFwZSB8fCBpbmZlcnJlZFNoYXBlO1xuICAgIHZhbHVlcyA9IGR0eXBlICE9PSAnc3RyaW5nJyA/XG4gICAgICAgIHRvVHlwZWRBcnJheSh2YWx1ZXMsIGR0eXBlKSA6XG4gICAgICAgIGZsYXR0ZW4odmFsdWVzLCBbXSwgdHJ1ZSk7XG4gICAgcmV0dXJuIEVOR0lORS5tYWtlVGVuc29yKHZhbHVlcywgc2hhcGUsIGR0eXBlKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRlbnNvcl9vcHNfdXRpbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgVGlsZSB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuLyoqXG4gKiBDb25zdHJ1Y3QgYSB0ZW5zb3IgYnkgcmVwZWF0aW5nIGl0IHRoZSBudW1iZXIgb2YgdGltZXMgZ2l2ZW4gYnkgcmVwcy5cbiAqXG4gKiBUaGlzIG9wZXJhdGlvbiBjcmVhdGVzIGEgbmV3IHRlbnNvciBieSByZXBsaWNhdGluZyBgaW5wdXRgIGByZXBzYFxuICogdGltZXMuIFRoZSBvdXRwdXQgdGVuc29yJ3MgaSd0aCBkaW1lbnNpb24gaGFzIGBpbnB1dC5zaGFwZVtpXSAqXG4gKiByZXBzW2ldYCBlbGVtZW50cywgYW5kIHRoZSB2YWx1ZXMgb2YgYGlucHV0YCBhcmUgcmVwbGljYXRlZFxuICogYHJlcHNbaV1gIHRpbWVzIGFsb25nIHRoZSBpJ3RoIGRpbWVuc2lvbi4gRm9yIGV4YW1wbGUsIHRpbGluZ1xuICogYFthLCBiLCBjLCBkXWAgYnkgYFsyXWAgcHJvZHVjZXMgYFthLCBiLCBjLCBkLCBhLCBiLCBjLCBkXWAuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgMl0pO1xuICpcbiAqIGEudGlsZShbMl0pLnByaW50KCk7ICAgIC8vIG9yIGEudGlsZShbMl0pXG4gKiBgYGBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjJkKFsxLCAyLCAzLCA0XSwgWzIsIDJdKTtcbiAqXG4gKiBhLnRpbGUoWzEsIDJdKS5wcmludCgpOyAgLy8gb3IgYS50aWxlKFsxLCAyXSlcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIHRlbnNvciB0byB0aWxlLlxuICogQHBhcmFtIHJlcHMgRGV0ZXJtaW5lcyB0aGUgbnVtYmVyIG9mIHJlcGxpY2F0aW9ucyBwZXIgZGltZW5zaW9uLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ1NsaWNpbmcgYW5kIEpvaW5pbmcnfVxuICovXG5mdW5jdGlvbiB0aWxlXyh4LCByZXBzKSB7XG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAndGlsZScsICdzdHJpbmdfb3JfbnVtZXJpYycpO1xuICAgIHV0aWwuYXNzZXJ0KCR4LnJhbmsgPT09IHJlcHMubGVuZ3RoLCAoKSA9PiBgRXJyb3IgaW4gdHJhbnNwb3NlOiByYW5rIG9mIGlucHV0ICR7JHgucmFua30gYCArXG4gICAgICAgIGBtdXN0IG1hdGNoIGxlbmd0aCBvZiByZXBzICR7cmVwc30uYCk7XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIGNvbnN0IGF0dHJzID0geyByZXBzIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoVGlsZSwgaW5wdXRzLCBhdHRycyk7XG59XG5leHBvcnQgY29uc3QgdGlsZSA9IG9wKHsgdGlsZV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10aWxlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBUb3BLIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogRmluZHMgdGhlIHZhbHVlcyBhbmQgaW5kaWNlcyBvZiB0aGUgYGtgIGxhcmdlc3QgZW50cmllcyBhbG9uZyB0aGUgbGFzdFxuICogZGltZW5zaW9uLlxuICpcbiAqIElmIHRoZSBpbnB1dCBpcyBhIHZlY3RvciAocmFuaz0xKSwgZmluZHMgdGhlIGsgbGFyZ2VzdCBlbnRyaWVzIGluIHRoZSB2ZWN0b3JcbiAqIGFuZCBvdXRwdXRzIHRoZWlyIHZhbHVlcyBhbmQgaW5kaWNlcyBhcyB2ZWN0b3JzLiBUaHVzIHZhbHVlc1tqXSBpcyB0aGUgai10aFxuICogbGFyZ2VzdCBlbnRyeSBpbiBpbnB1dCwgYW5kIGl0cyBpbmRleCBpcyBpbmRpY2VzW2pdLlxuICogRm9yIGhpZ2hlciByYW5rIGlucHV0cywgY29tcHV0ZXMgdGhlIHRvcCBrIGVudHJpZXMgYWxvbmcgdGhlIGxhc3QgZGltZW5zaW9uLlxuICpcbiAqIElmIHR3byBlbGVtZW50cyBhcmUgZXF1YWwsIHRoZSBsb3dlci1pbmRleCBlbGVtZW50IGFwcGVhcnMgZmlyc3QuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IyZChbWzEsIDVdLCBbNCwgM11dKTtcbiAqIGNvbnN0IHt2YWx1ZXMsIGluZGljZXN9ID0gdGYudG9wayhhKTtcbiAqIHZhbHVlcy5wcmludCgpO1xuICogaW5kaWNlcy5wcmludCgpO1xuICogYGBgXG4gKiBAcGFyYW0geCAxLUQgb3IgaGlnaGVyIGB0Zi5UZW5zb3JgIHdpdGggbGFzdCBkaW1lbnNpb24gYmVpbmcgYXQgbGVhc3QgYGtgLlxuICogQHBhcmFtIGsgTnVtYmVyIG9mIHRvcCBlbGVtZW50cyB0byBsb29rIGZvciBhbG9uZyB0aGUgbGFzdCBkaW1lbnNpb24uXG4gKiBAcGFyYW0gc29ydGVkIElmIHRydWUsIHRoZSByZXN1bHRpbmcgYGtgIGVsZW1lbnRzIHdpbGwgYmUgc29ydGVkIGJ5IHRoZVxuICogICAgIHZhbHVlcyBpbiBkZXNjZW5kaW5nIG9yZGVyLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0V2YWx1YXRpb24nfVxuICovXG5mdW5jdGlvbiB0b3BrXyh4LCBrID0gMSwgc29ydGVkID0gdHJ1ZSkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3RvcGsnKTtcbiAgICBpZiAoJHgucmFuayA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RvcGsoKSBleHBlY3RzIHRoZSBpbnB1dCB0byBiZSBvZiByYW5rIDEgb3IgaGlnaGVyJyk7XG4gICAgfVxuICAgIGNvbnN0IGxhc3REaW0gPSAkeC5zaGFwZVskeC5zaGFwZS5sZW5ndGggLSAxXTtcbiAgICBpZiAoayA8IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAnaycgcGFzc2VkIHRvIHRvcGsoKSBtdXN0IGJlID49IDAgYnV0IGdvdCAke2t9YCk7XG4gICAgfVxuICAgIGlmIChrID4gbGFzdERpbSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCdrJyBwYXNzZWQgdG8gdG9waygpIG11c3QgYmUgPD0gdGhlIGxhc3QgZGltZW5zaW9uICgke2xhc3REaW19KSBgICtcbiAgICAgICAgICAgIGBidXQgZ290ICR7a31gKTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBrLCBzb3J0ZWQgfTtcbiAgICBjb25zdCBbdmFsdWVzLCBpbmRpY2VzXSA9IEVOR0lORS5ydW5LZXJuZWwoVG9wSywgaW5wdXRzLCBhdHRycyk7XG4gICAgcmV0dXJuIHsgdmFsdWVzLCBpbmRpY2VzIH07XG59XG5leHBvcnQgY29uc3QgdG9wayA9IG9wKHsgdG9wa18gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10b3BrLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBUcmFuc3Bvc2UgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogVHJhbnNwb3NlcyB0aGUgYHRmLlRlbnNvcmAuIFBlcm11dGVzIHRoZSBkaW1lbnNpb25zIGFjY29yZGluZyB0byBgcGVybWAuXG4gKlxuICogVGhlIHJldHVybmVkIGB0Zi5UZW5zb3JgJ3MgZGltZW5zaW9uIGBpYCB3aWxsIGNvcnJlc3BvbmQgdG8gdGhlIGlucHV0XG4gKiBkaW1lbnNpb24gYHBlcm1baV1gLiBJZiBgcGVybWAgaXMgbm90IGdpdmVuLCBpdCBpcyBzZXQgdG8gYFtuLTEuLi4wXWAsXG4gKiB3aGVyZSBgbmAgaXMgdGhlIHJhbmsgb2YgdGhlIGlucHV0IGB0Zi5UZW5zb3JgLiBIZW5jZSBieSBkZWZhdWx0LCB0aGlzXG4gKiBvcGVyYXRpb24gcGVyZm9ybXMgYSByZWd1bGFyIG1hdHJpeCB0cmFuc3Bvc2Ugb24gMi1EIGlucHV0IGB0Zi5UZW5zb3Jgcy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjJkKFsxLCAyLCAzLCA0LCA1LCA2XSwgWzIsIDNdKTtcbiAqXG4gKiBhLnRyYW5zcG9zZSgpLnByaW50KCk7ICAvLyBvciB0Zi50cmFuc3Bvc2UoYSlcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB4IFRoZSB0ZW5zb3IgdG8gdHJhbnNwb3NlLlxuICogQHBhcmFtIHBlcm0gVGhlIHBlcm11dGF0aW9uIG9mIHRoZSBkaW1lbnNpb25zIG9mIGEuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnTWF0cmljZXMnfVxuICovXG5mdW5jdGlvbiB0cmFuc3Bvc2VfKHgsIHBlcm0pIHtcbiAgICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICd0cmFuc3Bvc2UnKTtcbiAgICBpZiAocGVybSA9PSBudWxsKSB7XG4gICAgICAgIHBlcm0gPSAkeC5zaGFwZS5tYXAoKHMsIGkpID0+IGkpLnJldmVyc2UoKTtcbiAgICB9XG4gICAgdXRpbC5hc3NlcnQoJHgucmFuayA9PT0gcGVybS5sZW5ndGgsICgpID0+IGBFcnJvciBpbiB0cmFuc3Bvc2U6IHJhbmsgb2YgaW5wdXQgJHskeC5yYW5rfSBgICtcbiAgICAgICAgYG11c3QgbWF0Y2ggbGVuZ3RoIG9mIHBlcm0gJHtwZXJtfS5gKTtcbiAgICBwZXJtLmZvckVhY2goYXhpcyA9PiB7XG4gICAgICAgIHV0aWwuYXNzZXJ0KGF4aXMgPj0gMCAmJiBheGlzIDwgJHgucmFuaywgKCkgPT4gYEFsbCBlbnRyaWVzIGluICdwZXJtJyBtdXN0IGJlIGJldHdlZW4gMCBhbmQgJHskeC5yYW5rIC0gMX1gICtcbiAgICAgICAgICAgIGAgYnV0IGdvdCAke3Blcm19YCk7XG4gICAgfSk7XG4gICAgaWYgKCR4LnJhbmsgPD0gMSkge1xuICAgICAgICByZXR1cm4gJHguY2xvbmUoKTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRzID0geyB4OiAkeCB9O1xuICAgIGNvbnN0IGF0dHJzID0geyBwZXJtIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoVHJhbnNwb3NlLCBpbnB1dHMsIGF0dHJzKTtcbn1cbmV4cG9ydCBjb25zdCB0cmFuc3Bvc2UgPSBvcCh7IHRyYW5zcG9zZV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10cmFuc3Bvc2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgYnVmZmVyIH0gZnJvbSAnLi9idWZmZXInO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQgeyBNUFJhbmRHYXVzcyB9IGZyb20gJy4vcmFuZF91dGlsJztcbi8qKlxuICogQ3JlYXRlcyBhIGB0Zi5UZW5zb3JgIHdpdGggdmFsdWVzIHNhbXBsZWQgZnJvbSBhIHRydW5jYXRlZCBub3JtYWxcbiAqIGRpc3RyaWJ1dGlvbi5cbiAqXG4gKiBgYGBqc1xuICogdGYudHJ1bmNhdGVkTm9ybWFsKFsyLCAyXSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIFRoZSBnZW5lcmF0ZWQgdmFsdWVzIGZvbGxvdyBhIG5vcm1hbCBkaXN0cmlidXRpb24gd2l0aCBzcGVjaWZpZWQgbWVhbiBhbmRcbiAqIHN0YW5kYXJkIGRldmlhdGlvbiwgZXhjZXB0IHRoYXQgdmFsdWVzIHdob3NlIG1hZ25pdHVkZSBpcyBtb3JlIHRoYW4gMlxuICogc3RhbmRhcmQgZGV2aWF0aW9ucyBmcm9tIHRoZSBtZWFuIGFyZSBkcm9wcGVkIGFuZCByZS1waWNrZWQuXG4gKlxuICogQHBhcmFtIHNoYXBlIEFuIGFycmF5IG9mIGludGVnZXJzIGRlZmluaW5nIHRoZSBvdXRwdXQgdGVuc29yIHNoYXBlLlxuICogQHBhcmFtIG1lYW4gVGhlIG1lYW4gb2YgdGhlIG5vcm1hbCBkaXN0cmlidXRpb24uXG4gKiBAcGFyYW0gc3RkRGV2IFRoZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIG5vcm1hbCBkaXN0cmlidXRpb24uXG4gKiBAcGFyYW0gZHR5cGUgVGhlIGRhdGEgdHlwZSBvZiB0aGUgb3V0cHV0IHRlbnNvci5cbiAqIEBwYXJhbSBzZWVkIFRoZSBzZWVkIGZvciB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ3JlYXRpb24nfVxuICovXG5mdW5jdGlvbiB0cnVuY2F0ZWROb3JtYWxfKHNoYXBlLCBtZWFuID0gMCwgc3RkRGV2ID0gMSwgZHR5cGUsIHNlZWQpIHtcbiAgICBpZiAoZHR5cGUgIT0gbnVsbCAmJiBkdHlwZSA9PT0gJ2Jvb2wnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgZGF0YSB0eXBlICQgeyBkdHlwZSB9YCk7XG4gICAgfVxuICAgIGNvbnN0IHJhbmRHYXVzcyA9IG5ldyBNUFJhbmRHYXVzcyhtZWFuLCBzdGREZXYsIGR0eXBlLCB0cnVlIC8qIHRydW5jYXRlZCAqLywgc2VlZCk7XG4gICAgY29uc3QgcmVzID0gYnVmZmVyKHNoYXBlLCBkdHlwZSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXMudmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJlcy52YWx1ZXNbaV0gPSByYW5kR2F1c3MubmV4dFZhbHVlKCk7XG4gICAgfVxuICAgIHJldHVybiByZXMudG9UZW5zb3IoKTtcbn1cbmV4cG9ydCBjb25zdCB0cnVuY2F0ZWROb3JtYWwgPSBvcCh7IHRydW5jYXRlZE5vcm1hbF8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10cnVuY2F0ZWRfbm9ybWFsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBVbmlxdWUgfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IGFzc2VydCB9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIEZpbmRzIHVuaXF1ZSBlbGVtZW50cyBhbG9uZyBhbiBheGlzIG9mIGEgdGVuc29yLlxuICpcbiAqIEl0IHJldHVybnMgYSB0ZW5zb3IgYHZhbHVlc2AgY29udGFpbmluZyBhbGwgb2YgdGhlIHVuaXF1ZSBlbGVtZW50cyBhbG9uZyB0aGVcbiAqIGBheGlzYCBvZiB0aGUgZ2l2ZW4gdGVuc29yIGB4YCBpbiB0aGUgc2FtZSBvcmRlciB0aGF0IHRoZXkgb2NjdXIgYWxvbmcgdGhlXG4gKiBgYXhpc2AgaW4gYHhgOyBgeGAgZG9lcyBub3QgbmVlZCB0byBiZSBzb3J0ZWQuIEl0IGFsc28gcmV0dXJucyBhIHRlbnNvclxuICogYGluZGljZXNgIHRoZSBzYW1lIHNpemUgYXMgdGhlIG51bWJlciBvZiB0aGUgZWxlbWVudHMgaW4gYHhgIGFsb25nIHRoZSBgYXhpc2BcbiAqIGRpbWVuc2lvbi4gSXQgY29udGFpbnMgdGhlIGluZGV4IGluIHRoZSB1bmlxdWUgb3V0cHV0IGB2YWx1ZXNgLlxuICpcbiAqIGBgYGpzXG4gKiAvLyBBIDEtRCB0ZW5zb3JcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgMSwgMiwgNCwgNCwgNCwgNywgOCwgOF0pO1xuICogY29uc3Qge3ZhbHVlcywgaW5kaWNlc30gPSB0Zi51bmlxdWUoYSk7XG4gKiB2YWx1ZXMucHJpbnQoKTsgICAvLyBbMSwgMiwgNCwgNywgOCxdXG4gKiBpbmRpY2VzLnByaW50KCk7ICAvLyBbMCwgMCwgMSwgMiwgMiwgMiwgMywgNCwgNF1cbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiAvLyBBIDItRCB0ZW5zb3Igd2l0aCBheGlzPTBcbiAqIC8vXG4gKiAvLyAnYScgaXM6IFtbMSwgMCwgMF0sXG4gKiAvLyAgICAgICAgICBbMSwgMCwgMF0sXG4gKiAvLyAgICAgICAgICBbMiwgMCwgMF1dXG4gKiBjb25zdCBhID0gdGYudGVuc29yMmQoW1sxLCAwLCAwXSwgWzEsIDAsIDBdLCBbMiwgMCwgMF1dKTtcbiAqIGNvbnN0IHt2YWx1ZXMsIGluZGljZXN9ID0gdGYudW5pcXVlKGEsIDApXG4gKiB2YWx1ZXMucHJpbnQoKTsgICAvLyBbWzEsIDAsIDBdLFxuICogICAgICAgICAgICAgICAgICAgLy8gIFsyLCAwLCAwXV1cbiAqIGluZGljZXMucHJpbnQoKTsgIC8vIFswLCAwLCAxXVxuICogYGBgXG4gKlxuICogYGBganNcbiAqIC8vIEEgMi1EIHRlbnNvciB3aXRoIGF4aXM9MVxuICogLy9cbiAqIC8vICdhJyBpczogW1sxLCAwLCAwXSxcbiAqIC8vICAgICAgICAgIFsxLCAwLCAwXSxcbiAqIC8vICAgICAgICAgIFsyLCAwLCAwXV1cbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IyZChbWzEsIDAsIDBdLCBbMSwgMCwgMF0sIFsyLCAwLCAwXV0pO1xuICogY29uc3Qge3ZhbHVlcywgaW5kaWNlc30gPSB0Zi51bmlxdWUoYSwgMSlcbiAqIHZhbHVlcy5wcmludCgpOyAgIC8vIFtbMSwgMF0sXG4gKiAgICAgICAgICAgICAgICAgICAvLyAgWzEsIDBdLFxuICogICAgICAgICAgICAgICAgICAgLy8gIFsyLCAwXV1cbiAqIGluZGljZXMucHJpbnQoKTsgIC8vIFswLCAxLCAxXVxuICogYGBgXG4gKiBAcGFyYW0geCBBIHRlbnNvciAoaW50MzIsIHN0cmluZywgYm9vbCkuXG4gKiBAcGFyYW0gYXhpcyBUaGUgYXhpcyBvZiB0aGUgdGVuc29yIHRvIGZpbmQgdGhlIHVuaXF1ZSBlbGVtZW50cy5cbiAqIEByZXR1cm5zIFt1bmlxdWVFbGVtZW50cywgaW5kaWNlc10gKHNlZSBhYm92ZSBmb3IgZGV0YWlscylcbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdFdmFsdWF0aW9uJ31cbiAqL1xuZnVuY3Rpb24gdW5pcXVlXyh4LCBheGlzID0gMCkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3VuaXF1ZScsICdzdHJpbmdfb3JfbnVtZXJpYycpO1xuICAgIGFzc2VydCgkeC5yYW5rID4gMCwgKCkgPT4gJ1RoZSBpbnB1dCB0ZW5zb3IgbXVzdCBiZSBhdCBsZWFzdCAxRCcpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICBjb25zdCBhdHRycyA9IHsgYXhpcyB9O1xuICAgIGNvbnN0IFt2YWx1ZXMsIGluZGljZXNdID0gRU5HSU5FLnJ1bktlcm5lbChVbmlxdWUsIGlucHV0cywgYXR0cnMpO1xuICAgIHJldHVybiB7IHZhbHVlcywgaW5kaWNlcyB9O1xufVxuZXhwb3J0IGNvbnN0IHVuaXF1ZSA9IG9wKHsgdW5pcXVlXyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXVuaXF1ZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgVW5zb3J0ZWRTZWdtZW50U3VtIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBhc3NlcnQsIGlzSW50IH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ29tcHV0ZXMgdGhlIHN1bSBhbG9uZyBzZWdtZW50cyBvZiBhIGB0Zi5UZW5zb3JgLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIDMsIDRdKTtcbiAqIGNvbnN0IHNlZ21lbnRJZHMgPSB0Zi50ZW5zb3IxZChbMSwgMiwgMCwgMV0sICdpbnQzMicpO1xuICogY29uc3QgbnVtU2VnbWVudHMgPSAzO1xuICpcbiAqIHgudW5zb3J0ZWRTZWdtZW50U3VtKHNlZ21lbnRJZHMsIG51bVNlZ21lbnRzKS5wcmludCgpXG4gKiAvL29yIHRmLnVuc29ydGVkU2VnbWVudFN1bSh4LCBzZWdtZW50SWRzLCBudW1TZWdtZW50cylcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGB0Zi5UZW5zb3JgIHRoYXQgd2lsbCBiZSBzdW1tZWQgYWxvbmcgaXRzIHNlZ21lbnRzLlxuICogQHBhcmFtIHNlZ21lbnRJZHMgQSBgdGYuVGVuc29yMURgIHdob3NlIHJhbmsgaXMgZXF1YWwgdG8gdGhlIHJhbmsgb2YgYHhgJ3NcbiAqIGRpbWVuc2lvbiBhbG9uZyB0aGUgYGF4aXNgLiAgTWFwcyBlYWNoIGVsZW1lbnQgb2YgYHhgIHRvIGEgc2VnbWVudC5cbiAqIEBwYXJhbSBudW1TZWdtZW50cyBUaGUgbnVtYmVyIG9mIGRpc3RpbmN0IGBzZWdtZW50SWRzYC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdTZWdtZW50J31cbiAqL1xuZnVuY3Rpb24gdW5zb3J0ZWRTZWdtZW50U3VtXyh4LCBzZWdtZW50SWRzLCBudW1TZWdtZW50cykge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3Vuc29ydGVkU2VnbWVudFN1bScpO1xuICAgIGNvbnN0ICRzZWdtZW50SWRzID0gY29udmVydFRvVGVuc29yKHNlZ21lbnRJZHMsICdzZWdtZW50SWRzJywgJ3Vuc29ydGVkU2VnbWVudFN1bScsICdpbnQzMicpO1xuICAgIGFzc2VydChpc0ludChudW1TZWdtZW50cyksICgpID0+ICdudW1TZWdtZW50cyBtdXN0IGJlIG9mIGR0eXBlIGludCcpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHgsIHNlZ21lbnRJZHM6ICRzZWdtZW50SWRzIH07XG4gICAgY29uc3QgYXR0cnMgPSB7IG51bVNlZ21lbnRzIH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoVW5zb3J0ZWRTZWdtZW50U3VtLCBpbnB1dHMsIGF0dHJzKTtcbn1cbmV4cG9ydCBjb25zdCB1bnNvcnRlZFNlZ21lbnRTdW0gPSBvcCh7IHVuc29ydGVkU2VnbWVudFN1bV8gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD11bnNvcnRlZF9zZWdtZW50X3N1bS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgVW5wYWNrIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIFVuc3RhY2tzIGEgYHRmLlRlbnNvcmAgb2YgcmFuay1gUmAgaW50byBhIGxpc3Qgb2YgcmFuay1gKFItMSlgIGB0Zi5UZW5zb3Jgcy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjJkKFsxLCAyLCAzLCA0XSwgWzIsIDJdKTtcbiAqXG4gKiB0Zi51bnN0YWNrKGEpLmZvckVhY2godGVuc29yID0+IHRlbnNvci5wcmludCgpKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB4IEEgdGVuc29yIG9iamVjdC5cbiAqIEBwYXJhbSBheGlzIFRoZSBheGlzIHRvIHVuc3RhY2sgYWxvbmcuIERlZmF1bHRzIHRvIDAgKHRoZSBmaXJzdCBkaW0pLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ1NsaWNpbmcgYW5kIEpvaW5pbmcnfVxuICovXG5mdW5jdGlvbiB1bnN0YWNrXyh4LCBheGlzID0gMCkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3Vuc3RhY2snLCAnc3RyaW5nX29yX251bWVyaWMnKTtcbiAgICB1dGlsLmFzc2VydChheGlzID49IC0keC5zaGFwZS5sZW5ndGggJiYgYXhpcyA8ICR4LnNoYXBlLmxlbmd0aCwgKCkgPT4gYEF4aXMgPSAke2F4aXN9IGlzIG5vdCBpbiBbLSR7JHguc2hhcGUubGVuZ3RofSwgJHskeC5zaGFwZS5sZW5ndGh9KWApO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgdmFsdWU6ICR4IH07XG4gICAgY29uc3QgYXR0cnMgPSB7IGF4aXMgfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChVbnBhY2ssIGlucHV0cywgYXR0cnMpO1xufVxuZXhwb3J0IGNvbnN0IHVuc3RhY2sgPSBvcCh7IHVuc3RhY2tfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dW5zdGFjay5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHZhcmlhYmxlIHdpdGggdGhlIHByb3ZpZGVkIGluaXRpYWwgdmFsdWUuXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnZhcmlhYmxlKHRmLnRlbnNvcihbMSwgMiwgM10pKTtcbiAqIHguYXNzaWduKHRmLnRlbnNvcihbNCwgNSwgNl0pKTtcbiAqXG4gKiB4LnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gaW5pdGlhbFZhbHVlIEluaXRpYWwgdmFsdWUgZm9yIHRoZSB0ZW5zb3IuXG4gKiBAcGFyYW0gdHJhaW5hYmxlIElmIHRydWUsIG9wdGltaXplcnMgYXJlIGFsbG93ZWQgdG8gdXBkYXRlIGl0LlxuICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgdmFyaWFibGUuIERlZmF1bHRzIHRvIGEgdW5pcXVlIGlkLlxuICogQHBhcmFtIGR0eXBlIElmIHNldCwgaW5pdGlhbFZhbHVlIHdpbGwgYmUgY29udmVydGVkIHRvIHRoZSBnaXZlbiB0eXBlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NyZWF0aW9uJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhcmlhYmxlKGluaXRpYWxWYWx1ZSwgdHJhaW5hYmxlID0gdHJ1ZSwgbmFtZSwgZHR5cGUpIHtcbiAgICByZXR1cm4gRU5HSU5FLm1ha2VWYXJpYWJsZShpbml0aWFsVmFsdWUsIHRyYWluYWJsZSwgbmFtZSwgZHR5cGUpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dmFyaWFibGUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IFNlbGVjdCB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgYnJvYWRjYXN0VG8gfSBmcm9tICcuL2Jyb2FkY2FzdF90byc7XG5pbXBvcnQgeyBhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSB9IGZyb20gJy4vYnJvYWRjYXN0X3V0aWwnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuL29wZXJhdGlvbic7XG4vKipcbiAqIFJldHVybnMgdGhlIGVsZW1lbnRzLCBlaXRoZXIgYGFgIG9yIGBiYCBkZXBlbmRpbmcgb24gdGhlIGBjb25kaXRpb25gLlxuICpcbiAqIElmIHRoZSBjb25kaXRpb24gaXMgdHJ1ZSwgc2VsZWN0IGZyb20gYGFgLCBvdGhlcndpc2Ugc2VsZWN0IGZyb20gYGJgLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBjb25kID0gdGYudGVuc29yMWQoW2ZhbHNlLCBmYWxzZSwgdHJ1ZV0sICdib29sJyk7XG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzEgLCAyLCAzXSk7XG4gKiBjb25zdCBiID0gdGYudGVuc29yMWQoWy0xLCAtMiwgLTNdKTtcbiAqXG4gKiBhLndoZXJlKGNvbmQsIGIpLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gY29uZGl0aW9uIFRoZSBpbnB1dCBjb25kaXRpb24uIE11c3QgYmUgb2YgZHR5cGUgYm9vbC5cbiAqIEBwYXJhbSBhIElmIGBjb25kaXRpb25gIGlzIHJhbmsgMSwgYGFgIG1heSBoYXZlIGEgaGlnaGVyIHJhbmsgYnV0XG4gKiAgICAgaXRzIGZpcnN0IGRpbWVuc2lvbiBtdXN0IG1hdGNoIHRoZSBzaXplIG9mIGBjb25kaXRpb25gLlxuICogQHBhcmFtIGIgQSB0ZW5zb3Igd2l0aCB0aGUgc2FtZSBkdHlwZSBhcyBgYWAgYW5kIHdpdGggc2hhcGUgdGhhdCBpc1xuICogICAgIGNvbXBhdGlibGUgd2l0aCBgYWAuXG4gKiBAcmV0dXJuIEEgdGVuc29yIHdpdGggc2FtZSBkdHlwZSBhcyBgYWAgYW5kIGBiYCwgYW5kIHNoYXBlIHRoYXQgaXNcbiAqICAgICBicm9hZGNhc3RhYmxlIGZyb20gYGFgIGFuZCBgYmAuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnTG9naWNhbCd9XG4gKi9cbmZ1bmN0aW9uIHdoZXJlXyhjb25kaXRpb24sIGEsIGIpIHtcbiAgICBjb25zdCAkYSA9IGNvbnZlcnRUb1RlbnNvcihhLCAnYScsICd3aGVyZScpO1xuICAgIGNvbnN0ICRiID0gY29udmVydFRvVGVuc29yKGIsICdiJywgJ3doZXJlJyk7XG4gICAgY29uc3QgJGNvbmRpdGlvbiA9IGNvbnZlcnRUb1RlbnNvcihjb25kaXRpb24sICdjb25kaXRpb24nLCAnd2hlcmUnLCAnYm9vbCcpO1xuICAgIC8vIFRPRE86IG1vdmUgdGhpcyBsb2dpYyB0byBmb3J3YXJkIGZ1bmN0aW9uIHdoZW4gdGhlIGJyb2FkY2FzdFRvIG9wIGlzXG4gICAgLy8gaW1wbGVtZW50ZWQgaW4gV0FTTS5cbiAgICAvLyBGaW5kIHRoZSBicm9hZGNhc3RhYmxlIHNoYXBlIGZvciAkY29uZGl0aW9uLCAkYSwgYW5kICRiLlxuICAgIGNvbnN0IGJyb2FkY2FzdFNoYXBlID0gYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoJGNvbmRpdGlvbi5zaGFwZSwgJGEuc2hhcGUpLCAkYi5zaGFwZSk7XG4gICAgY29uc3QgJGJyb2FkY2FzdGVkQ29uZGl0aW9uID0gYnJvYWRjYXN0VG8oJGNvbmRpdGlvbiwgYnJvYWRjYXN0U2hhcGUpO1xuICAgIGNvbnN0ICRicm9hZGNhc3RlZEEgPSBicm9hZGNhc3RUbygkYSwgYnJvYWRjYXN0U2hhcGUpO1xuICAgIGNvbnN0ICRicm9hZGNhc3RlZEIgPSBicm9hZGNhc3RUbygkYiwgYnJvYWRjYXN0U2hhcGUpO1xuICAgIGNvbnN0IGlucHV0cyA9IHtcbiAgICAgICAgY29uZGl0aW9uOiAkYnJvYWRjYXN0ZWRDb25kaXRpb24sXG4gICAgICAgIHQ6ICRicm9hZGNhc3RlZEEsXG4gICAgICAgIGU6ICRicm9hZGNhc3RlZEJcbiAgICB9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFNlbGVjdCwgaW5wdXRzKTtcbn1cbmV4cG9ydCBjb25zdCB3aGVyZSA9IG9wKHsgd2hlcmVfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9d2hlcmUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgd2hlcmVJbXBsIH0gZnJvbSAnLi4vYmFja2VuZHMvd2hlcmVfaW1wbCc7XG5pbXBvcnQgeyBjb252ZXJ0VG9UZW5zb3IgfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSBjb29yZGluYXRlcyBvZiB0cnVlIGVsZW1lbnRzIG9mIGNvbmRpdGlvbi5cbiAqXG4gKiBUaGUgY29vcmRpbmF0ZXMgYXJlIHJldHVybmVkIGluIGEgMi1EIHRlbnNvciB3aGVyZSB0aGUgZmlyc3QgZGltZW5zaW9uIChyb3dzKVxuICogcmVwcmVzZW50cyB0aGUgbnVtYmVyIG9mIHRydWUgZWxlbWVudHMsIGFuZCB0aGUgc2Vjb25kIGRpbWVuc2lvbiAoY29sdW1ucylcbiAqIHJlcHJlc2VudHMgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSB0cnVlIGVsZW1lbnRzLiBLZWVwIGluIG1pbmQsIHRoZSBzaGFwZSBvZlxuICogdGhlIG91dHB1dCB0ZW5zb3IgY2FuIHZhcnkgZGVwZW5kaW5nIG9uIGhvdyBtYW55IHRydWUgdmFsdWVzIHRoZXJlIGFyZSBpblxuICogaW5wdXQuIEluZGljZXMgYXJlIG91dHB1dCBpbiByb3ctbWFqb3Igb3JkZXIuIFRoZSByZXN1bHRpbmcgdGVuc29yIGhhcyB0aGVcbiAqIHNoYXBlIGBbbnVtVHJ1ZUVsZW1zLCBjb25kaXRpb24ucmFua11gLlxuICpcbiAqIFRoaXMgaXMgYW5hbG9nb3VzIHRvIGNhbGxpbmcgdGhlIHB5dGhvbiBgdGYud2hlcmUoY29uZClgIHdpdGhvdXQgYW4geCBvciB5LlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBjb25kID0gdGYudGVuc29yMWQoW2ZhbHNlLCBmYWxzZSwgdHJ1ZV0sICdib29sJyk7XG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCB0Zi53aGVyZUFzeW5jKGNvbmQpO1xuICogcmVzdWx0LnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdMb2dpY2FsJ31cbiAqL1xuYXN5bmMgZnVuY3Rpb24gd2hlcmVBc3luY18oY29uZGl0aW9uKSB7XG4gICAgY29uc3QgJGNvbmRpdGlvbiA9IGNvbnZlcnRUb1RlbnNvcihjb25kaXRpb24sICdjb25kaXRpb24nLCAnd2hlcmVBc3luYycsICdib29sJyk7XG4gICAgY29uc3QgdmFscyA9IGF3YWl0ICRjb25kaXRpb24uZGF0YSgpO1xuICAgIGNvbnN0IHJlcyA9IHdoZXJlSW1wbCgkY29uZGl0aW9uLnNoYXBlLCB2YWxzKTtcbiAgICBpZiAoY29uZGl0aW9uICE9PSAkY29uZGl0aW9uKSB7XG4gICAgICAgICRjb25kaXRpb24uZGlzcG9zZSgpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufVxuZXhwb3J0IGNvbnN0IHdoZXJlQXN5bmMgPSB3aGVyZUFzeW5jXztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXdoZXJlX2FzeW5jLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBtYWtlWmVyb3NUeXBlZEFycmF5LCBzaXplRnJvbVNoYXBlIH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBjb21wbGV4IH0gZnJvbSAnLi9jb21wbGV4Jztcbi8qKlxuICogQ3JlYXRlcyBhIGB0Zi5UZW5zb3JgIHdpdGggYWxsIGVsZW1lbnRzIHNldCB0byAwLlxuICpcbiAqIGBgYGpzXG4gKiB0Zi56ZXJvcyhbMiwgMl0pLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gc2hhcGUgQW4gYXJyYXkgb2YgaW50ZWdlcnMgZGVmaW5pbmcgdGhlIG91dHB1dCB0ZW5zb3Igc2hhcGUuXG4gKiBAcGFyYW0gZHR5cGUgVGhlIHR5cGUgb2YgYW4gZWxlbWVudCBpbiB0aGUgcmVzdWx0aW5nIHRlbnNvci4gQ2FuXG4gKiAgICAgYmUgJ2Zsb2F0MzInLCAnaW50MzInIG9yICdib29sJy4gRGVmYXVsdHMgdG8gJ2Zsb2F0Jy5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDcmVhdGlvbid9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB6ZXJvcyhzaGFwZSwgZHR5cGUgPSAnZmxvYXQzMicpIHtcbiAgICBpZiAoZHR5cGUgPT09ICdjb21wbGV4NjQnKSB7XG4gICAgICAgIGNvbnN0IHJlYWwgPSB6ZXJvcyhzaGFwZSwgJ2Zsb2F0MzInKTtcbiAgICAgICAgY29uc3QgaW1hZyA9IHplcm9zKHNoYXBlLCAnZmxvYXQzMicpO1xuICAgICAgICByZXR1cm4gY29tcGxleChyZWFsLCBpbWFnKTtcbiAgICB9XG4gICAgY29uc3QgdmFsdWVzID0gbWFrZVplcm9zVHlwZWRBcnJheShzaXplRnJvbVNoYXBlKHNoYXBlKSwgZHR5cGUpO1xuICAgIHJldHVybiBFTkdJTkUubWFrZVRlbnNvcih2YWx1ZXMsIHNoYXBlLCBkdHlwZSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD16ZXJvcy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgWmVyb3NMaWtlIH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogQ3JlYXRlcyBhIGB0Zi5UZW5zb3JgIHdpdGggYWxsIGVsZW1lbnRzIHNldCB0byAwIHdpdGggdGhlIHNhbWUgc2hhcGUgYXMgdGhlXG4gKiBnaXZlbiB0ZW5zb3IuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IoWzEsIDJdKTtcbiAqIHRmLnplcm9zTGlrZSh4KS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHggVGhlIHRlbnNvciBvZiByZXF1aXJlZCBzaGFwZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDcmVhdGlvbid9XG4gKi9cbmZ1bmN0aW9uIHplcm9zTGlrZV8oeCkge1xuICAgIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3plcm9zTGlrZScpO1xuICAgIGNvbnN0IGlucHV0cyA9IHsgeDogJHggfTtcbiAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChaZXJvc0xpa2UsIGlucHV0cyk7XG59XG5leHBvcnQgY29uc3QgemVyb3NMaWtlID0gb3AoeyB6ZXJvc0xpa2VfIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9emVyb3NfbGlrZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgZGlzcG9zZSwgdGlkeSB9IGZyb20gJy4uL2dsb2JhbHMnO1xuaW1wb3J0IHsgYWRkIH0gZnJvbSAnLi4vb3BzL2FkZCc7XG5pbXBvcnQgeyBkaXYgfSBmcm9tICcuLi9vcHMvZGl2JztcbmltcG9ydCB7IG11bCB9IGZyb20gJy4uL29wcy9tdWwnO1xuaW1wb3J0IHsgc3FydCB9IGZyb20gJy4uL29wcy9vcHMnO1xuaW1wb3J0IHsgc3F1YXJlIH0gZnJvbSAnLi4vb3BzL3NxdWFyZSc7XG5pbXBvcnQgeyB6ZXJvc0xpa2UgfSBmcm9tICcuLi9vcHMvemVyb3NfbGlrZSc7XG5pbXBvcnQgeyByZWdpc3RlckNsYXNzIH0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbic7XG5pbXBvcnQgeyBPcHRpbWl6ZXIgfSBmcm9tICcuL29wdGltaXplcic7XG4vKiogQGRvY2xpbmsgT3B0aW1pemVyICovXG5leHBvcnQgY2xhc3MgQWRhZGVsdGFPcHRpbWl6ZXIgZXh0ZW5kcyBPcHRpbWl6ZXIge1xuICAgIGNvbnN0cnVjdG9yKGxlYXJuaW5nUmF0ZSwgcmhvLCBlcHNpbG9uID0gbnVsbCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmxlYXJuaW5nUmF0ZSA9IGxlYXJuaW5nUmF0ZTtcbiAgICAgICAgdGhpcy5yaG8gPSByaG87XG4gICAgICAgIHRoaXMuZXBzaWxvbiA9IGVwc2lsb247XG4gICAgICAgIHRoaXMuYWNjdW11bGF0ZWRHcmFkcyA9IFtdO1xuICAgICAgICB0aGlzLmFjY3VtdWxhdGVkVXBkYXRlcyA9IFtdO1xuICAgICAgICBpZiAoZXBzaWxvbiA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmVwc2lsb24gPSBFTkdJTkUuYmFja2VuZC5lcHNpbG9uKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXBwbHlHcmFkaWVudHModmFyaWFibGVHcmFkaWVudHMpIHtcbiAgICAgICAgY29uc3QgdmFyaWFibGVOYW1lcyA9IEFycmF5LmlzQXJyYXkodmFyaWFibGVHcmFkaWVudHMpID9cbiAgICAgICAgICAgIHZhcmlhYmxlR3JhZGllbnRzLm1hcChpdGVtID0+IGl0ZW0ubmFtZSkgOlxuICAgICAgICAgICAgT2JqZWN0LmtleXModmFyaWFibGVHcmFkaWVudHMpO1xuICAgICAgICB2YXJpYWJsZU5hbWVzLmZvckVhY2goKG5hbWUsIGkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gRU5HSU5FLnJlZ2lzdGVyZWRWYXJpYWJsZXNbbmFtZV07XG4gICAgICAgICAgICBjb25zdCB0cmFpbmFibGUgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmICh0aGlzLmFjY3VtdWxhdGVkR3JhZHNbaV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWNjdW11bGF0ZWRHcmFkc1tpXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxOYW1lOiBgJHtuYW1lfS9hY2N1bV9ncmFkYCxcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGU6IHRpZHkoKCkgPT4gemVyb3NMaWtlKHZhbHVlKS52YXJpYWJsZSh0cmFpbmFibGUpKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5hY2N1bXVsYXRlZFVwZGF0ZXNbaV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWNjdW11bGF0ZWRVcGRhdGVzW2ldID0ge1xuICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbE5hbWU6IGAke25hbWV9L2FjY3VtX3ZhcmAsXG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlOiB0aWR5KCgpID0+IHplcm9zTGlrZSh2YWx1ZSkudmFyaWFibGUodHJhaW5hYmxlKSlcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZ3JhZGllbnQgPSBBcnJheS5pc0FycmF5KHZhcmlhYmxlR3JhZGllbnRzKSA/XG4gICAgICAgICAgICAgICAgdmFyaWFibGVHcmFkaWVudHNbaV0udGVuc29yIDpcbiAgICAgICAgICAgICAgICB2YXJpYWJsZUdyYWRpZW50c1tuYW1lXTtcbiAgICAgICAgICAgIGlmIChncmFkaWVudCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYWNjdW11bGF0ZWRHcmFkID0gdGhpcy5hY2N1bXVsYXRlZEdyYWRzW2ldLnZhcmlhYmxlO1xuICAgICAgICAgICAgY29uc3QgYWNjdW11bGF0ZWRVcGRhdGUgPSB0aGlzLmFjY3VtdWxhdGVkVXBkYXRlc1tpXS52YXJpYWJsZTtcbiAgICAgICAgICAgIHRpZHkoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld0FjY3VtdWxhdGVkR3JhZCA9IGFkZChtdWwoYWNjdW11bGF0ZWRHcmFkLCB0aGlzLnJobyksIG11bChzcXVhcmUoZ3JhZGllbnQpLCAxIC0gdGhpcy5yaG8pKTtcbiAgICAgICAgICAgICAgICBjb25zdCB1cGRhdGVzID0gbXVsKGRpdihzcXJ0KGFkZChhY2N1bXVsYXRlZFVwZGF0ZSwgdGhpcy5lcHNpbG9uKSksIHNxcnQoYWRkKGFjY3VtdWxhdGVkR3JhZCwgdGhpcy5lcHNpbG9uKSkpLCBncmFkaWVudCk7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3QWNjdW11bGF0ZWRVcGRhdGUgPSBhZGQobXVsKGFjY3VtdWxhdGVkVXBkYXRlLCB0aGlzLnJobyksIG11bChzcXVhcmUodXBkYXRlcyksIDEgLSB0aGlzLnJobykpO1xuICAgICAgICAgICAgICAgIGFjY3VtdWxhdGVkR3JhZC5hc3NpZ24obmV3QWNjdW11bGF0ZWRHcmFkKTtcbiAgICAgICAgICAgICAgICBhY2N1bXVsYXRlZFVwZGF0ZS5hc3NpZ24obmV3QWNjdW11bGF0ZWRVcGRhdGUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gYWRkKG11bCh1cGRhdGVzLCAtdGhpcy5sZWFybmluZ1JhdGUpLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgdmFsdWUuYXNzaWduKG5ld1ZhbHVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5pbmNyZW1lbnRJdGVyYXRpb25zKCk7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLmFjY3VtdWxhdGVkVXBkYXRlcyAhPSBudWxsKSB7XG4gICAgICAgICAgICBkaXNwb3NlKHRoaXMuYWNjdW11bGF0ZWRHcmFkcy5tYXAodiA9PiB2LnZhcmlhYmxlKSk7XG4gICAgICAgICAgICBkaXNwb3NlKHRoaXMuYWNjdW11bGF0ZWRVcGRhdGVzLm1hcCh2ID0+IHYudmFyaWFibGUpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBnZXRXZWlnaHRzKCkge1xuICAgICAgICAvLyBPcmRlciBtYXR0ZXJzIGZvciBQeXRob24gY29tcGF0aWJpbGl0eS5cbiAgICAgICAgY29uc3QgdmFyaWFibGVzID0gWy4uLnRoaXMuYWNjdW11bGF0ZWRHcmFkcywgLi4udGhpcy5hY2N1bXVsYXRlZFVwZGF0ZXNdO1xuICAgICAgICByZXR1cm4gW2F3YWl0IHRoaXMuc2F2ZUl0ZXJhdGlvbnMoKV0uY29uY2F0KHZhcmlhYmxlcy5tYXAodiA9PiAoeyBuYW1lOiB2Lm9yaWdpbmFsTmFtZSwgdGVuc29yOiB2LnZhcmlhYmxlIH0pKSk7XG4gICAgfVxuICAgIGFzeW5jIHNldFdlaWdodHMod2VpZ2h0VmFsdWVzKSB7XG4gICAgICAgIHdlaWdodFZhbHVlcyA9IGF3YWl0IHRoaXMuZXh0cmFjdEl0ZXJhdGlvbnMod2VpZ2h0VmFsdWVzKTtcbiAgICAgICAgY29uc3QgdmFyaWFibGVDb3VudCA9IHdlaWdodFZhbHVlcy5sZW5ndGggLyAyO1xuICAgICAgICBjb25zdCB0cmFpbmFibGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5hY2N1bXVsYXRlZEdyYWRzID1cbiAgICAgICAgICAgIHdlaWdodFZhbHVlcy5zbGljZSgwLCB2YXJpYWJsZUNvdW50KS5tYXAodiA9PiAoe1xuICAgICAgICAgICAgICAgIG9yaWdpbmFsTmFtZTogdi5uYW1lLFxuICAgICAgICAgICAgICAgIHZhcmlhYmxlOiB2LnRlbnNvci52YXJpYWJsZSh0cmFpbmFibGUpXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIHRoaXMuYWNjdW11bGF0ZWRVcGRhdGVzID1cbiAgICAgICAgICAgIHdlaWdodFZhbHVlcy5zbGljZSh2YXJpYWJsZUNvdW50LCB2YXJpYWJsZUNvdW50ICogMilcbiAgICAgICAgICAgICAgICAubWFwKHYgPT4gKHtcbiAgICAgICAgICAgICAgICBvcmlnaW5hbE5hbWU6IHYubmFtZSxcbiAgICAgICAgICAgICAgICB2YXJpYWJsZTogdi50ZW5zb3IudmFyaWFibGUodHJhaW5hYmxlKVxuICAgICAgICAgICAgfSkpO1xuICAgIH1cbiAgICBnZXRDb25maWcoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAnbGVhcm5pbmdSYXRlJzogdGhpcy5sZWFybmluZ1JhdGUsXG4gICAgICAgICAgICAncmhvJzogdGhpcy5yaG8sXG4gICAgICAgICAgICAnZXBzaWxvbic6IHRoaXMuZXBzaWxvblxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICBzdGF0aWMgZnJvbUNvbmZpZyhjbHMsIGNvbmZpZykge1xuICAgICAgICByZXR1cm4gbmV3IGNscyhjb25maWdbJ2xlYXJuaW5nUmF0ZSddLCBjb25maWdbJ3JobyddLCBjb25maWdbJ2Vwc2lsb24nXSk7XG4gICAgfVxufVxuLyoqIEBub2NvbGxhcHNlICovXG5BZGFkZWx0YU9wdGltaXplci5jbGFzc05hbWUgPSAnQWRhZGVsdGEnOyAvLyBOYW1lIG1hdHRlcnMgZm9yIFB5dGhvbiBjb21wYXRpYmlsaXR5LlxucmVnaXN0ZXJDbGFzcyhBZGFkZWx0YU9wdGltaXplcik7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hZGFkZWx0YV9vcHRpbWl6ZXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IGRpc3Bvc2UsIHRpZHkgfSBmcm9tICcuLi9nbG9iYWxzJztcbmltcG9ydCB7IGFkZCB9IGZyb20gJy4uL29wcy9hZGQnO1xuaW1wb3J0IHsgZGl2IH0gZnJvbSAnLi4vb3BzL2Rpdic7XG5pbXBvcnQgeyBmaWxsIH0gZnJvbSAnLi4vb3BzL2ZpbGwnO1xuaW1wb3J0IHsgbXVsIH0gZnJvbSAnLi4vb3BzL211bCc7XG5pbXBvcnQgeyBzcXJ0IH0gZnJvbSAnLi4vb3BzL3NxcnQnO1xuaW1wb3J0IHsgc3F1YXJlIH0gZnJvbSAnLi4vb3BzL3NxdWFyZSc7XG5pbXBvcnQgeyByZWdpc3RlckNsYXNzIH0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbic7XG5pbXBvcnQgeyBPcHRpbWl6ZXIgfSBmcm9tICcuL29wdGltaXplcic7XG4vKiogQGRvY2xpbmsgT3B0aW1pemVyICovXG5leHBvcnQgY2xhc3MgQWRhZ3JhZE9wdGltaXplciBleHRlbmRzIE9wdGltaXplciB7XG4gICAgY29uc3RydWN0b3IobGVhcm5pbmdSYXRlLCBpbml0aWFsQWNjdW11bGF0b3JWYWx1ZSA9IDAuMSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmxlYXJuaW5nUmF0ZSA9IGxlYXJuaW5nUmF0ZTtcbiAgICAgICAgdGhpcy5pbml0aWFsQWNjdW11bGF0b3JWYWx1ZSA9IGluaXRpYWxBY2N1bXVsYXRvclZhbHVlO1xuICAgICAgICB0aGlzLmFjY3VtdWxhdGVkR3JhZHMgPSBbXTtcbiAgICB9XG4gICAgYXBwbHlHcmFkaWVudHModmFyaWFibGVHcmFkaWVudHMpIHtcbiAgICAgICAgY29uc3QgdmFyaWFibGVOYW1lcyA9IEFycmF5LmlzQXJyYXkodmFyaWFibGVHcmFkaWVudHMpID9cbiAgICAgICAgICAgIHZhcmlhYmxlR3JhZGllbnRzLm1hcChpdGVtID0+IGl0ZW0ubmFtZSkgOlxuICAgICAgICAgICAgT2JqZWN0LmtleXModmFyaWFibGVHcmFkaWVudHMpO1xuICAgICAgICB2YXJpYWJsZU5hbWVzLmZvckVhY2goKG5hbWUsIGkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gRU5HSU5FLnJlZ2lzdGVyZWRWYXJpYWJsZXNbbmFtZV07XG4gICAgICAgICAgICBpZiAodGhpcy5hY2N1bXVsYXRlZEdyYWRzW2ldID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0cmFpbmFibGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmFjY3VtdWxhdGVkR3JhZHNbaV0gPSB7XG4gICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsTmFtZTogYCR7bmFtZX0vYWNjdW11bGF0b3JgLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogdGlkeSgoKSA9PiBmaWxsKHZhbHVlLnNoYXBlLCB0aGlzLmluaXRpYWxBY2N1bXVsYXRvclZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnZhcmlhYmxlKHRyYWluYWJsZSkpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGdyYWRpZW50ID0gQXJyYXkuaXNBcnJheSh2YXJpYWJsZUdyYWRpZW50cykgP1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JhZGllbnRzW2ldLnRlbnNvciA6XG4gICAgICAgICAgICAgICAgdmFyaWFibGVHcmFkaWVudHNbbmFtZV07XG4gICAgICAgICAgICBpZiAoZ3JhZGllbnQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGFjY3VtdWxhdGVkR3JhZCA9IHRoaXMuYWNjdW11bGF0ZWRHcmFkc1tpXS52YXJpYWJsZTtcbiAgICAgICAgICAgIHRpZHkoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld0FjY3VtdWxhdGVkR3JhZCA9IGFkZChhY2N1bXVsYXRlZEdyYWQsIHNxdWFyZShncmFkaWVudCkpO1xuICAgICAgICAgICAgICAgIGFjY3VtdWxhdGVkR3JhZC5hc3NpZ24obmV3QWNjdW11bGF0ZWRHcmFkKTtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IGFkZChtdWwoZGl2KGdyYWRpZW50LCBzcXJ0KGFkZChuZXdBY2N1bXVsYXRlZEdyYWQsIEVOR0lORS5iYWNrZW5kLmVwc2lsb24oKSkpKSwgLXRoaXMubGVhcm5pbmdSYXRlKSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIHZhbHVlLmFzc2lnbihuZXdWYWx1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuaW5jcmVtZW50SXRlcmF0aW9ucygpO1xuICAgIH1cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICBpZiAodGhpcy5hY2N1bXVsYXRlZEdyYWRzICE9IG51bGwpIHtcbiAgICAgICAgICAgIGRpc3Bvc2UodGhpcy5hY2N1bXVsYXRlZEdyYWRzLm1hcCh2ID0+IHYudmFyaWFibGUpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBnZXRXZWlnaHRzKCkge1xuICAgICAgICAvLyBPcmRlciBtYXR0ZXJzIGZvciBQeXRob24gY29tcGF0aWJpbGl0eS5cbiAgICAgICAgcmV0dXJuIFthd2FpdCB0aGlzLnNhdmVJdGVyYXRpb25zKCldLmNvbmNhdCh0aGlzLmFjY3VtdWxhdGVkR3JhZHMubWFwKHYgPT4gKHsgbmFtZTogdi5vcmlnaW5hbE5hbWUsIHRlbnNvcjogdi52YXJpYWJsZSB9KSkpO1xuICAgIH1cbiAgICBhc3luYyBzZXRXZWlnaHRzKHdlaWdodFZhbHVlcykge1xuICAgICAgICB3ZWlnaHRWYWx1ZXMgPSBhd2FpdCB0aGlzLmV4dHJhY3RJdGVyYXRpb25zKHdlaWdodFZhbHVlcyk7XG4gICAgICAgIGNvbnN0IHRyYWluYWJsZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFjY3VtdWxhdGVkR3JhZHMgPSB3ZWlnaHRWYWx1ZXMubWFwKHYgPT4gKHsgb3JpZ2luYWxOYW1lOiB2Lm5hbWUsIHZhcmlhYmxlOiB2LnRlbnNvci52YXJpYWJsZSh0cmFpbmFibGUpIH0pKTtcbiAgICB9XG4gICAgZ2V0Q29uZmlnKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgJ2xlYXJuaW5nUmF0ZSc6IHRoaXMubGVhcm5pbmdSYXRlLFxuICAgICAgICAgICAgJ2luaXRpYWxBY2N1bXVsYXRvclZhbHVlJzogdGhpcy5pbml0aWFsQWNjdW11bGF0b3JWYWx1ZSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgc3RhdGljIGZyb21Db25maWcoY2xzLCBjb25maWcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBjbHMoY29uZmlnWydsZWFybmluZ1JhdGUnXSwgY29uZmlnWydpbml0aWFsQWNjdW11bGF0b3JWYWx1ZSddKTtcbiAgICB9XG59XG4vKiogQG5vY29sbGFwc2UgKi9cbkFkYWdyYWRPcHRpbWl6ZXIuY2xhc3NOYW1lID0gJ0FkYWdyYWQnOyAvLyBOb3RlOiBOYW1lIG1hdHRlcnMgZm9yIFB5dGhvbiBjb21wYXRpYmlsaXR5LlxucmVnaXN0ZXJDbGFzcyhBZGFncmFkT3B0aW1pemVyKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFkYWdyYWRfb3B0aW1pemVyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBkaXNwb3NlLCB0aWR5IH0gZnJvbSAnLi4vZ2xvYmFscyc7XG5pbXBvcnQgeyBhZGQgfSBmcm9tICcuLi9vcHMvYWRkJztcbmltcG9ydCB7IGRpdiB9IGZyb20gJy4uL29wcy9kaXYnO1xuaW1wb3J0IHsgbXVsIH0gZnJvbSAnLi4vb3BzL211bCc7XG5pbXBvcnQgeyBwb3cgfSBmcm9tICcuLi9vcHMvcG93JztcbmltcG9ydCB7IHNjYWxhciB9IGZyb20gJy4uL29wcy9zY2FsYXInO1xuaW1wb3J0IHsgc3FydCB9IGZyb20gJy4uL29wcy9zcXJ0JztcbmltcG9ydCB7IHNxdWFyZSB9IGZyb20gJy4uL29wcy9zcXVhcmUnO1xuaW1wb3J0IHsgc3ViIH0gZnJvbSAnLi4vb3BzL3N1Yic7XG5pbXBvcnQgeyB6ZXJvc0xpa2UgfSBmcm9tICcuLi9vcHMvemVyb3NfbGlrZSc7XG5pbXBvcnQgeyByZWdpc3RlckNsYXNzIH0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbic7XG5pbXBvcnQgeyBPcHRpbWl6ZXIgfSBmcm9tICcuL29wdGltaXplcic7XG5leHBvcnQgY2xhc3MgQWRhbU9wdGltaXplciBleHRlbmRzIE9wdGltaXplciB7XG4gICAgY29uc3RydWN0b3IobGVhcm5pbmdSYXRlLCBiZXRhMSwgYmV0YTIsIGVwc2lsb24gPSBudWxsKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMubGVhcm5pbmdSYXRlID0gbGVhcm5pbmdSYXRlO1xuICAgICAgICB0aGlzLmJldGExID0gYmV0YTE7XG4gICAgICAgIHRoaXMuYmV0YTIgPSBiZXRhMjtcbiAgICAgICAgdGhpcy5lcHNpbG9uID0gZXBzaWxvbjtcbiAgICAgICAgdGhpcy5hY2N1bXVsYXRlZEZpcnN0TW9tZW50ID0gW107XG4gICAgICAgIHRoaXMuYWNjdW11bGF0ZWRTZWNvbmRNb21lbnQgPSBbXTtcbiAgICAgICAgdGlkeSgoKSA9PiB7XG4gICAgICAgICAgICAvLyBhY2NCKiB3aWxsIGJlIHVwZGF0ZWQgYnkgYmF0Y2guXG4gICAgICAgICAgICB0aGlzLmFjY0JldGExID0gc2NhbGFyKGJldGExKS52YXJpYWJsZSgpO1xuICAgICAgICAgICAgdGhpcy5hY2NCZXRhMiA9IHNjYWxhcihiZXRhMikudmFyaWFibGUoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChlcHNpbG9uID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuZXBzaWxvbiA9IEVOR0lORS5iYWNrZW5kLmVwc2lsb24oKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhcHBseUdyYWRpZW50cyh2YXJpYWJsZUdyYWRpZW50cykge1xuICAgICAgICBjb25zdCB2YXJOYW1lcyA9IEFycmF5LmlzQXJyYXkodmFyaWFibGVHcmFkaWVudHMpID9cbiAgICAgICAgICAgIHZhcmlhYmxlR3JhZGllbnRzLm1hcCh2ID0+IHYubmFtZSkgOlxuICAgICAgICAgICAgT2JqZWN0LmtleXModmFyaWFibGVHcmFkaWVudHMpO1xuICAgICAgICB0aWR5KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG9uZU1pbnVzQWNjQmV0YTEgPSBzdWIoMSwgdGhpcy5hY2NCZXRhMSk7XG4gICAgICAgICAgICBjb25zdCBvbmVNaW51c0FjY0JldGEyID0gc3ViKDEsIHRoaXMuYWNjQmV0YTIpO1xuICAgICAgICAgICAgdmFyTmFtZXMuZm9yRWFjaCgobmFtZSwgaSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gRU5HSU5FLnJlZ2lzdGVyZWRWYXJpYWJsZXNbbmFtZV07XG4gICAgICAgICAgICAgICAgY29uc3QgdHJhaW5hYmxlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYWNjdW11bGF0ZWRGaXJzdE1vbWVudFtpXSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWNjdW11bGF0ZWRGaXJzdE1vbWVudFtpXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsTmFtZTogYCR7bmFtZX0vbWAsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogdGlkeSgoKSA9PiB6ZXJvc0xpa2UodmFsdWUpLnZhcmlhYmxlKHRyYWluYWJsZSkpXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmFjY3VtdWxhdGVkU2Vjb25kTW9tZW50W2ldID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY2N1bXVsYXRlZFNlY29uZE1vbWVudFtpXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsTmFtZTogYCR7bmFtZX0vdmAsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogdGlkeSgoKSA9PiB6ZXJvc0xpa2UodmFsdWUpLnZhcmlhYmxlKHRyYWluYWJsZSkpXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGdyYWRpZW50ID0gQXJyYXkuaXNBcnJheSh2YXJpYWJsZUdyYWRpZW50cykgP1xuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyYWRpZW50c1tpXS50ZW5zb3IgOlxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyYWRpZW50c1tuYW1lXTtcbiAgICAgICAgICAgICAgICBpZiAoZ3JhZGllbnQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGZpcnN0TW9tZW50ID0gdGhpcy5hY2N1bXVsYXRlZEZpcnN0TW9tZW50W2ldLnZhcmlhYmxlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlY29uZE1vbWVudCA9IHRoaXMuYWNjdW11bGF0ZWRTZWNvbmRNb21lbnRbaV0udmFyaWFibGU7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3Rmlyc3RNb21lbnQgPSBhZGQobXVsKGZpcnN0TW9tZW50LCB0aGlzLmJldGExKSwgbXVsKGdyYWRpZW50LCAxIC0gdGhpcy5iZXRhMSkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1NlY29uZE1vbWVudCA9IGFkZChtdWwoc2Vjb25kTW9tZW50LCB0aGlzLmJldGEyKSwgbXVsKHNxdWFyZShncmFkaWVudCksIDEgLSB0aGlzLmJldGEyKSk7XG4gICAgICAgICAgICAgICAgY29uc3QgYmlhc0NvcnJlY3RlZEZpcnN0TW9tZW50ID0gZGl2KG5ld0ZpcnN0TW9tZW50LCBvbmVNaW51c0FjY0JldGExKTtcbiAgICAgICAgICAgICAgICBjb25zdCBiaWFzQ29ycmVjdGVkU2Vjb25kTW9tZW50ID0gZGl2KG5ld1NlY29uZE1vbWVudCwgb25lTWludXNBY2NCZXRhMik7XG4gICAgICAgICAgICAgICAgZmlyc3RNb21lbnQuYXNzaWduKG5ld0ZpcnN0TW9tZW50KTtcbiAgICAgICAgICAgICAgICBzZWNvbmRNb21lbnQuYXNzaWduKG5ld1NlY29uZE1vbWVudCk7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBhZGQobXVsKGRpdihiaWFzQ29ycmVjdGVkRmlyc3RNb21lbnQsIGFkZChzcXJ0KGJpYXNDb3JyZWN0ZWRTZWNvbmRNb21lbnQpLCB0aGlzLmVwc2lsb24pKSwgLXRoaXMubGVhcm5pbmdSYXRlKSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIHZhbHVlLmFzc2lnbihuZXdWYWx1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuYWNjQmV0YTEuYXNzaWduKG11bCh0aGlzLmFjY0JldGExLCB0aGlzLmJldGExKSk7XG4gICAgICAgICAgICB0aGlzLmFjY0JldGEyLmFzc2lnbihtdWwodGhpcy5hY2NCZXRhMiwgdGhpcy5iZXRhMikpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5pbmNyZW1lbnRJdGVyYXRpb25zKCk7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIHRoaXMuYWNjQmV0YTEuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLmFjY0JldGEyLmRpc3Bvc2UoKTtcbiAgICAgICAgaWYgKHRoaXMuYWNjdW11bGF0ZWRGaXJzdE1vbWVudCAhPSBudWxsKSB7XG4gICAgICAgICAgICBkaXNwb3NlKHRoaXMuYWNjdW11bGF0ZWRGaXJzdE1vbWVudC5tYXAodiA9PiB2LnZhcmlhYmxlKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuYWNjdW11bGF0ZWRTZWNvbmRNb21lbnQgIT0gbnVsbCkge1xuICAgICAgICAgICAgZGlzcG9zZSh0aGlzLmFjY3VtdWxhdGVkU2Vjb25kTW9tZW50Lm1hcCh2ID0+IHYudmFyaWFibGUpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBnZXRXZWlnaHRzKCkge1xuICAgICAgICAvLyBPcmRlciBtYXR0ZXJzIGZvciBQeXRob24gY29tcGF0aWJpbGl0eS5cbiAgICAgICAgY29uc3QgdmFyaWFibGVzID0gWy4uLnRoaXMuYWNjdW11bGF0ZWRGaXJzdE1vbWVudCwgLi4udGhpcy5hY2N1bXVsYXRlZFNlY29uZE1vbWVudF07XG4gICAgICAgIHJldHVybiBbYXdhaXQgdGhpcy5zYXZlSXRlcmF0aW9ucygpXS5jb25jYXQodmFyaWFibGVzLm1hcCh2ID0+ICh7IG5hbWU6IHYub3JpZ2luYWxOYW1lLCB0ZW5zb3I6IHYudmFyaWFibGUgfSkpKTtcbiAgICB9XG4gICAgYXN5bmMgc2V0V2VpZ2h0cyh3ZWlnaHRWYWx1ZXMpIHtcbiAgICAgICAgd2VpZ2h0VmFsdWVzID0gYXdhaXQgdGhpcy5leHRyYWN0SXRlcmF0aW9ucyh3ZWlnaHRWYWx1ZXMpO1xuICAgICAgICB0aWR5KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWNjQmV0YTEuYXNzaWduKHBvdyh0aGlzLmJldGExLCB0aGlzLml0ZXJhdGlvbnNfICsgMSkpO1xuICAgICAgICAgICAgdGhpcy5hY2NCZXRhMi5hc3NpZ24ocG93KHRoaXMuYmV0YTIsIHRoaXMuaXRlcmF0aW9uc18gKyAxKSk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCB2YXJpYWJsZUNvdW50ID0gd2VpZ2h0VmFsdWVzLmxlbmd0aCAvIDI7XG4gICAgICAgIGNvbnN0IHRyYWluYWJsZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFjY3VtdWxhdGVkRmlyc3RNb21lbnQgPVxuICAgICAgICAgICAgd2VpZ2h0VmFsdWVzLnNsaWNlKDAsIHZhcmlhYmxlQ291bnQpLm1hcCh2ID0+ICh7XG4gICAgICAgICAgICAgICAgb3JpZ2luYWxOYW1lOiB2Lm5hbWUsXG4gICAgICAgICAgICAgICAgdmFyaWFibGU6IHYudGVuc29yLnZhcmlhYmxlKHRyYWluYWJsZSlcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgdGhpcy5hY2N1bXVsYXRlZFNlY29uZE1vbWVudCA9XG4gICAgICAgICAgICB3ZWlnaHRWYWx1ZXMuc2xpY2UodmFyaWFibGVDb3VudCwgdmFyaWFibGVDb3VudCAqIDIpXG4gICAgICAgICAgICAgICAgLm1hcCh2ID0+ICh7XG4gICAgICAgICAgICAgICAgb3JpZ2luYWxOYW1lOiB2Lm5hbWUsXG4gICAgICAgICAgICAgICAgdmFyaWFibGU6IHYudGVuc29yLnZhcmlhYmxlKHRyYWluYWJsZSlcbiAgICAgICAgICAgIH0pKTtcbiAgICB9XG4gICAgZ2V0Q29uZmlnKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgJ2xlYXJuaW5nUmF0ZSc6IHRoaXMubGVhcm5pbmdSYXRlLFxuICAgICAgICAgICAgJ2JldGExJzogdGhpcy5iZXRhMSxcbiAgICAgICAgICAgICdiZXRhMic6IHRoaXMuYmV0YTIsXG4gICAgICAgICAgICAnZXBzaWxvbic6IHRoaXMuZXBzaWxvbixcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgc3RhdGljIGZyb21Db25maWcoY2xzLCBjb25maWcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBjbHMoY29uZmlnWydsZWFybmluZ1JhdGUnXSwgY29uZmlnWydiZXRhMSddLCBjb25maWdbJ2JldGEyJ10sIGNvbmZpZ1snZXBzaWxvbiddKTtcbiAgICB9XG59XG4vKiogQG5vY29sbGFwc2UgKi9cbkFkYW1PcHRpbWl6ZXIuY2xhc3NOYW1lID0gJ0FkYW0nOyAvLyBOb3RlOiBOYW1lIG1hdHRlcnMgZm9yIFB5dGhvbiBjb21wYXRpYmlsaXR5LlxucmVnaXN0ZXJDbGFzcyhBZGFtT3B0aW1pemVyKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFkYW1fb3B0aW1pemVyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBkaXNwb3NlLCB0aWR5IH0gZnJvbSAnLi4vZ2xvYmFscyc7XG5pbXBvcnQgeyBhYnMgfSBmcm9tICcuLi9vcHMvYWJzJztcbmltcG9ydCB7IGFkZCB9IGZyb20gJy4uL29wcy9hZGQnO1xuaW1wb3J0IHsgZGl2IH0gZnJvbSAnLi4vb3BzL2Rpdic7XG5pbXBvcnQgeyBtYXhpbXVtIH0gZnJvbSAnLi4vb3BzL21heGltdW0nO1xuaW1wb3J0IHsgbXVsIH0gZnJvbSAnLi4vb3BzL211bCc7XG5pbXBvcnQgeyBzY2FsYXIgfSBmcm9tICcuLi9vcHMvc2NhbGFyJztcbmltcG9ydCB7IHN1YiB9IGZyb20gJy4uL29wcy9zdWInO1xuaW1wb3J0IHsgemVyb3NMaWtlIH0gZnJvbSAnLi4vb3BzL3plcm9zX2xpa2UnO1xuaW1wb3J0IHsgcmVnaXN0ZXJDbGFzcyB9IGZyb20gJy4uL3NlcmlhbGl6YXRpb24nO1xuaW1wb3J0IHsgT3B0aW1pemVyIH0gZnJvbSAnLi9vcHRpbWl6ZXInO1xuZXhwb3J0IGNsYXNzIEFkYW1heE9wdGltaXplciBleHRlbmRzIE9wdGltaXplciB7XG4gICAgY29uc3RydWN0b3IobGVhcm5pbmdSYXRlLCBiZXRhMSwgYmV0YTIsIGVwc2lsb24gPSBudWxsLCBkZWNheSA9IDAuMCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmxlYXJuaW5nUmF0ZSA9IGxlYXJuaW5nUmF0ZTtcbiAgICAgICAgdGhpcy5iZXRhMSA9IGJldGExO1xuICAgICAgICB0aGlzLmJldGEyID0gYmV0YTI7XG4gICAgICAgIHRoaXMuZXBzaWxvbiA9IGVwc2lsb247XG4gICAgICAgIHRoaXMuZGVjYXkgPSBkZWNheTtcbiAgICAgICAgdGhpcy5hY2N1bXVsYXRlZEZpcnN0TW9tZW50ID0gW107XG4gICAgICAgIHRoaXMuYWNjdW11bGF0ZWRXZWlnaHRlZEluZk5vcm0gPSBbXTtcbiAgICAgICAgdGlkeSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLml0ZXJhdGlvbiA9IHNjYWxhcigwKS52YXJpYWJsZSgpO1xuICAgICAgICAgICAgdGhpcy5hY2NCZXRhMSA9IHNjYWxhcihiZXRhMSkudmFyaWFibGUoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChlcHNpbG9uID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuZXBzaWxvbiA9IEVOR0lORS5iYWNrZW5kLmVwc2lsb24oKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhcHBseUdyYWRpZW50cyh2YXJpYWJsZUdyYWRpZW50cykge1xuICAgICAgICBjb25zdCB2YXJpYWJsZU5hbWVzID0gQXJyYXkuaXNBcnJheSh2YXJpYWJsZUdyYWRpZW50cykgP1xuICAgICAgICAgICAgdmFyaWFibGVHcmFkaWVudHMubWFwKGl0ZW0gPT4gaXRlbS5uYW1lKSA6XG4gICAgICAgICAgICBPYmplY3Qua2V5cyh2YXJpYWJsZUdyYWRpZW50cyk7XG4gICAgICAgIHRpZHkoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb25lTWludXNBY2NCZXRhMSA9IHN1YigxLCB0aGlzLmFjY0JldGExKTtcbiAgICAgICAgICAgIGNvbnN0IGxyID0gZGl2KC10aGlzLmxlYXJuaW5nUmF0ZSwgYWRkKG11bCh0aGlzLml0ZXJhdGlvbiwgdGhpcy5kZWNheSksIDEpKTtcbiAgICAgICAgICAgIHZhcmlhYmxlTmFtZXMuZm9yRWFjaCgobmFtZSwgaSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gRU5HSU5FLnJlZ2lzdGVyZWRWYXJpYWJsZXNbbmFtZV07XG4gICAgICAgICAgICAgICAgY29uc3QgdHJhaW5hYmxlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYWNjdW11bGF0ZWRGaXJzdE1vbWVudFtpXSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWNjdW11bGF0ZWRGaXJzdE1vbWVudFtpXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsTmFtZTogYCR7bmFtZX0vbWAsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogemVyb3NMaWtlKHZhbHVlKS52YXJpYWJsZSh0cmFpbmFibGUpXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmFjY3VtdWxhdGVkV2VpZ2h0ZWRJbmZOb3JtW2ldID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY2N1bXVsYXRlZFdlaWdodGVkSW5mTm9ybVtpXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsTmFtZTogYCR7bmFtZX0vdmAsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogemVyb3NMaWtlKHZhbHVlKS52YXJpYWJsZSh0cmFpbmFibGUpXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGdyYWRpZW50ID0gQXJyYXkuaXNBcnJheSh2YXJpYWJsZUdyYWRpZW50cykgP1xuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyYWRpZW50c1tpXS50ZW5zb3IgOlxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyYWRpZW50c1tuYW1lXTtcbiAgICAgICAgICAgICAgICBpZiAoZ3JhZGllbnQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGZpcnN0TW9tZW50ID0gdGhpcy5hY2N1bXVsYXRlZEZpcnN0TW9tZW50W2ldLnZhcmlhYmxlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHdlaWdodGVkSW5mTm9ybSA9IHRoaXMuYWNjdW11bGF0ZWRXZWlnaHRlZEluZk5vcm1baV0udmFyaWFibGU7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3Rmlyc3RNb21lbnQgPSBhZGQobXVsKGZpcnN0TW9tZW50LCB0aGlzLmJldGExKSwgbXVsKGdyYWRpZW50LCAxIC0gdGhpcy5iZXRhMSkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHV0MCA9IG11bCh3ZWlnaHRlZEluZk5vcm0sIHRoaXMuYmV0YTIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHV0MSA9IGFicyhncmFkaWVudCk7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3V2VpZ2h0ZWRJbmZOb3JtID0gbWF4aW11bSh1dDAsIHV0MSk7XG4gICAgICAgICAgICAgICAgZmlyc3RNb21lbnQuYXNzaWduKG5ld0ZpcnN0TW9tZW50KTtcbiAgICAgICAgICAgICAgICB3ZWlnaHRlZEluZk5vcm0uYXNzaWduKG5ld1dlaWdodGVkSW5mTm9ybSk7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBhZGQobXVsKGRpdihsciwgb25lTWludXNBY2NCZXRhMSksIGRpdihuZXdGaXJzdE1vbWVudCwgYWRkKG5ld1dlaWdodGVkSW5mTm9ybSwgdGhpcy5lcHNpbG9uKSkpLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgdmFsdWUuYXNzaWduKG5ld1ZhbHVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5pdGVyYXRpb24uYXNzaWduKGFkZCh0aGlzLml0ZXJhdGlvbiwgMSkpO1xuICAgICAgICAgICAgdGhpcy5hY2NCZXRhMS5hc3NpZ24obXVsKHRoaXMuYWNjQmV0YTEsIHRoaXMuYmV0YTEpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuaW5jcmVtZW50SXRlcmF0aW9ucygpO1xuICAgIH1cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICB0aGlzLmFjY0JldGExLmRpc3Bvc2UoKTtcbiAgICAgICAgdGhpcy5pdGVyYXRpb24uZGlzcG9zZSgpO1xuICAgICAgICBpZiAodGhpcy5hY2N1bXVsYXRlZEZpcnN0TW9tZW50ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGRpc3Bvc2UodGhpcy5hY2N1bXVsYXRlZEZpcnN0TW9tZW50Lm1hcCh2ID0+IHYudmFyaWFibGUpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5hY2N1bXVsYXRlZFdlaWdodGVkSW5mTm9ybSAhPSBudWxsKSB7XG4gICAgICAgICAgICBkaXNwb3NlKHRoaXMuYWNjdW11bGF0ZWRXZWlnaHRlZEluZk5vcm0ubWFwKHYgPT4gdi52YXJpYWJsZSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIGdldFdlaWdodHMoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZ2V0V2VpZ2h0cygpIGlzIG5vdCBpbXBsZW1lbnRlZCBmb3IgQWRhbWF4IHlldC4nKTtcbiAgICB9XG4gICAgYXN5bmMgc2V0V2VpZ2h0cyh3ZWlnaHRWYWx1ZXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzZXRXZWlnaHRzKCkgaXMgbm90IGltcGxlbWVudGVkIGZvciBBZGFtYXggeWV0LicpO1xuICAgIH1cbiAgICBnZXRDb25maWcoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAnbGVhcm5pbmdSYXRlJzogdGhpcy5sZWFybmluZ1JhdGUsXG4gICAgICAgICAgICAnYmV0YTEnOiB0aGlzLmJldGExLFxuICAgICAgICAgICAgJ2JldGEyJzogdGhpcy5iZXRhMixcbiAgICAgICAgICAgICdlcHNpbG9uJzogdGhpcy5lcHNpbG9uLFxuICAgICAgICAgICAgJ2RlY2F5JzogdGhpcy5kZWNheVxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICBzdGF0aWMgZnJvbUNvbmZpZyhjbHMsIGNvbmZpZykge1xuICAgICAgICByZXR1cm4gbmV3IGNscyhjb25maWdbJ2xlYXJuaW5nUmF0ZSddLCBjb25maWdbJ2JldGExJ10sIGNvbmZpZ1snYmV0YTInXSwgY29uZmlnWydlcHNpbG9uJ10sIGNvbmZpZ1snZGVjYXknXSk7XG4gICAgfVxufVxuLyoqIEBub2NvbGxhcHNlICovXG5BZGFtYXhPcHRpbWl6ZXIuY2xhc3NOYW1lID0gJ0FkYW1heCc7IC8vIE5vdGU6IE5hbWUgbWF0dGVycyBmb3IgUHl0aG9uIGNvbXBhdGJpbGl0eS5cbnJlZ2lzdGVyQ2xhc3MoQWRhbWF4T3B0aW1pemVyKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFkYW1heF9vcHRpbWl6ZXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IGRpc3Bvc2UsIHRpZHkgfSBmcm9tICcuLi9nbG9iYWxzJztcbmltcG9ydCB7IGFkZCB9IGZyb20gJy4uL29wcy9hZGQnO1xuaW1wb3J0IHsgbXVsIH0gZnJvbSAnLi4vb3BzL211bCc7XG5pbXBvcnQgeyBzY2FsYXIgfSBmcm9tICcuLi9vcHMvc2NhbGFyJztcbmltcG9ydCB7IHplcm9zTGlrZSB9IGZyb20gJy4uL29wcy96ZXJvc19saWtlJztcbmltcG9ydCB7IHJlZ2lzdGVyQ2xhc3MgfSBmcm9tICcuLi9zZXJpYWxpemF0aW9uJztcbmltcG9ydCB7IFNHRE9wdGltaXplciB9IGZyb20gJy4vc2dkX29wdGltaXplcic7XG4vKiogQGRvY2xpbmsgT3B0aW1pemVyICovXG5leHBvcnQgY2xhc3MgTW9tZW50dW1PcHRpbWl6ZXIgZXh0ZW5kcyBTR0RPcHRpbWl6ZXIge1xuICAgIGNvbnN0cnVjdG9yKGxlYXJuaW5nUmF0ZSwgbW9tZW50dW0sIHVzZU5lc3Rlcm92ID0gZmFsc2UpIHtcbiAgICAgICAgc3VwZXIobGVhcm5pbmdSYXRlKTtcbiAgICAgICAgdGhpcy5sZWFybmluZ1JhdGUgPSBsZWFybmluZ1JhdGU7XG4gICAgICAgIHRoaXMubW9tZW50dW0gPSBtb21lbnR1bTtcbiAgICAgICAgdGhpcy51c2VOZXN0ZXJvdiA9IHVzZU5lc3Rlcm92O1xuICAgICAgICB0aGlzLmFjY3VtdWxhdGlvbnMgPSBbXTtcbiAgICAgICAgdGhpcy5tID0gc2NhbGFyKHRoaXMubW9tZW50dW0pO1xuICAgIH1cbiAgICBhcHBseUdyYWRpZW50cyh2YXJpYWJsZUdyYWRpZW50cykge1xuICAgICAgICBjb25zdCB2YXJpYWJsZU5hbWVzID0gQXJyYXkuaXNBcnJheSh2YXJpYWJsZUdyYWRpZW50cykgP1xuICAgICAgICAgICAgdmFyaWFibGVHcmFkaWVudHMubWFwKGl0ZW0gPT4gaXRlbS5uYW1lKSA6XG4gICAgICAgICAgICBPYmplY3Qua2V5cyh2YXJpYWJsZUdyYWRpZW50cyk7XG4gICAgICAgIHZhcmlhYmxlTmFtZXMuZm9yRWFjaCgobmFtZSwgaSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBFTkdJTkUucmVnaXN0ZXJlZFZhcmlhYmxlc1tuYW1lXTtcbiAgICAgICAgICAgIGlmICh0aGlzLmFjY3VtdWxhdGlvbnNbaV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRyYWluYWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuYWNjdW11bGF0aW9uc1tpXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxOYW1lOiBgJHtuYW1lfS9tb21lbnR1bWAsXG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlOiB0aWR5KCgpID0+IHplcm9zTGlrZSh2YWx1ZSkudmFyaWFibGUodHJhaW5hYmxlKSlcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYWNjdW11bGF0aW9uID0gdGhpcy5hY2N1bXVsYXRpb25zW2ldLnZhcmlhYmxlO1xuICAgICAgICAgICAgY29uc3QgZ3JhZGllbnQgPSBBcnJheS5pc0FycmF5KHZhcmlhYmxlR3JhZGllbnRzKSA/XG4gICAgICAgICAgICAgICAgdmFyaWFibGVHcmFkaWVudHNbaV0udGVuc29yIDpcbiAgICAgICAgICAgICAgICB2YXJpYWJsZUdyYWRpZW50c1tuYW1lXTtcbiAgICAgICAgICAgIGlmIChncmFkaWVudCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGlkeSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IG5ld1ZhbHVlO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld0FjY3VtdWxhdGlvbiA9IGFkZChtdWwodGhpcy5tLCBhY2N1bXVsYXRpb24pLCBncmFkaWVudCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudXNlTmVzdGVyb3YpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3VmFsdWUgPSBhZGQobXVsKHRoaXMuYywgYWRkKGdyYWRpZW50LCBtdWwobmV3QWNjdW11bGF0aW9uLCB0aGlzLm0pKSksIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlID0gYWRkKG11bCh0aGlzLmMsIG5ld0FjY3VtdWxhdGlvbiksIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYWNjdW11bGF0aW9uLmFzc2lnbihuZXdBY2N1bXVsYXRpb24pO1xuICAgICAgICAgICAgICAgIHZhbHVlLmFzc2lnbihuZXdWYWx1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuaW5jcmVtZW50SXRlcmF0aW9ucygpO1xuICAgIH1cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICB0aGlzLm0uZGlzcG9zZSgpO1xuICAgICAgICBpZiAodGhpcy5hY2N1bXVsYXRpb25zICE9IG51bGwpIHtcbiAgICAgICAgICAgIGRpc3Bvc2UodGhpcy5hY2N1bXVsYXRpb25zLm1hcCh2ID0+IHYudmFyaWFibGUpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBtb21lbnR1bSBvZiB0aGUgb3B0aW1pemVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIG1vbWVudHVtXG4gICAgICovXG4gICAgc2V0TW9tZW50dW0obW9tZW50dW0pIHtcbiAgICAgICAgdGhpcy5tb21lbnR1bSA9IG1vbWVudHVtO1xuICAgIH1cbiAgICBhc3luYyBnZXRXZWlnaHRzKCkge1xuICAgICAgICAvLyBPcmRlciBtYXR0ZXJzIGZvciBQeXRob24gY29tcGF0aWJpbGl0eS5cbiAgICAgICAgcmV0dXJuIFthd2FpdCB0aGlzLnNhdmVJdGVyYXRpb25zKCldLmNvbmNhdCh0aGlzLmFjY3VtdWxhdGlvbnMubWFwKHYgPT4gKHsgbmFtZTogdi5vcmlnaW5hbE5hbWUsIHRlbnNvcjogdi52YXJpYWJsZSB9KSkpO1xuICAgIH1cbiAgICBhc3luYyBzZXRXZWlnaHRzKHdlaWdodFZhbHVlcykge1xuICAgICAgICB3ZWlnaHRWYWx1ZXMgPSBhd2FpdCB0aGlzLmV4dHJhY3RJdGVyYXRpb25zKHdlaWdodFZhbHVlcyk7XG4gICAgICAgIGNvbnN0IHRyYWluYWJsZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFjY3VtdWxhdGlvbnMgPSB3ZWlnaHRWYWx1ZXMubWFwKHYgPT4gKHsgb3JpZ2luYWxOYW1lOiB2Lm5hbWUsIHZhcmlhYmxlOiB2LnRlbnNvci52YXJpYWJsZSh0cmFpbmFibGUpIH0pKTtcbiAgICB9XG4gICAgZ2V0Q29uZmlnKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgJ2xlYXJuaW5nUmF0ZSc6IHRoaXMubGVhcm5pbmdSYXRlLFxuICAgICAgICAgICAgJ21vbWVudHVtJzogdGhpcy5tb21lbnR1bSxcbiAgICAgICAgICAgICd1c2VOZXN0ZXJvdic6IHRoaXMudXNlTmVzdGVyb3ZcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgc3RhdGljIGZyb21Db25maWcoY2xzLCBjb25maWcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBjbHMoY29uZmlnWydsZWFybmluZ1JhdGUnXSwgY29uZmlnWydtb21lbnR1bSddLCBjb25maWdbJ3VzZU5lc3Rlcm92J10pO1xuICAgIH1cbn1cbi8qKiBAbm9jb2xsYXBzZSAqL1xuTW9tZW50dW1PcHRpbWl6ZXIuY2xhc3NOYW1lID0gJ01vbWVudHVtJzsgLy8gTmFtZSBtYXR0ZXJzIGZvciBQeXRob24gY29tcGF0aWJpbGl0eS5cbnJlZ2lzdGVyQ2xhc3MoTW9tZW50dW1PcHRpbWl6ZXIpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bW9tZW50dW1fb3B0aW1pemVyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGRpc3Bvc2UgfSBmcm9tICcuLi9nbG9iYWxzJztcbmltcG9ydCB7IHZhcmlhYmxlR3JhZHMgfSBmcm9tICcuLi9ncmFkaWVudHMnO1xuaW1wb3J0IHsgc2NhbGFyIH0gZnJvbSAnLi4vb3BzL29wcyc7XG5pbXBvcnQgeyBTZXJpYWxpemFibGUgfSBmcm9tICcuLi9zZXJpYWxpemF0aW9uJztcbi8qKiBAZG9jIHtoZWFkaW5nOiAnVHJhaW5pbmcnLCBzdWJoZWFkaW5nOiAnQ2xhc3NlcycsIG5hbWVzcGFjZTogJ3RyYWluJ30gKi9cbmV4cG9ydCBjbGFzcyBPcHRpbWl6ZXIgZXh0ZW5kcyBTZXJpYWxpemFibGUge1xuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIGBmKClgIGFuZCBtaW5pbWl6ZXMgdGhlIHNjYWxhciBvdXRwdXQgb2YgYGYoKWAgYnkgY29tcHV0aW5nXG4gICAgICogZ3JhZGllbnRzIG9mIHkgd2l0aCByZXNwZWN0IHRvIHRoZSBsaXN0IG9mIHRyYWluYWJsZSB2YXJpYWJsZXMgcHJvdmlkZWQgYnlcbiAgICAgKiBgdmFyTGlzdGAuIElmIG5vIGxpc3QgaXMgcHJvdmlkZWQsIGl0IGRlZmF1bHRzIHRvIGFsbCB0cmFpbmFibGUgdmFyaWFibGVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGYgVGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgYW5kIHdob3NlIG91dHB1dCB0byBtaW5pbWl6ZS5cbiAgICAgKiBAcGFyYW0gcmV0dXJuQ29zdCBXaGV0aGVyIHRvIHJldHVybiB0aGUgc2NhbGFyIGNvc3QgdmFsdWUgcHJvZHVjZWQgYnlcbiAgICAgKiBleGVjdXRpbmcgYGYoKWAuXG4gICAgICogQHBhcmFtIHZhckxpc3QgQW4gb3B0aW9uYWwgbGlzdCBvZiB2YXJpYWJsZXMgdG8gdXBkYXRlLiBJZiBzcGVjaWZpZWQsIG9ubHlcbiAgICAgKiB0aGUgdHJhaW5hYmxlIHZhcmlhYmxlcyBpbiB2YXJMaXN0IHdpbGwgYmUgdXBkYXRlZCBieSBtaW5pbWl6ZS4gRGVmYXVsdHMgdG9cbiAgICAgKiBhbGwgdHJhaW5hYmxlIHZhcmlhYmxlcy5cbiAgICAgKlxuICAgICAqIEBkb2Mge2hlYWRpbmc6ICdUcmFpbmluZycsIHN1YmhlYWRpbmc6ICdPcHRpbWl6ZXJzJ31cbiAgICAgKi9cbiAgICBtaW5pbWl6ZShmLCByZXR1cm5Db3N0ID0gZmFsc2UsIHZhckxpc3QpIHtcbiAgICAgICAgY29uc3QgeyB2YWx1ZSwgZ3JhZHMgfSA9IHRoaXMuY29tcHV0ZUdyYWRpZW50cyhmLCB2YXJMaXN0KTtcbiAgICAgICAgaWYgKHZhckxpc3QgIT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgZ3JhZEFycmF5ID0gdmFyTGlzdC5tYXAodiA9PiAoeyBuYW1lOiB2Lm5hbWUsIHRlbnNvcjogZ3JhZHNbdi5uYW1lXSB9KSk7XG4gICAgICAgICAgICB0aGlzLmFwcGx5R3JhZGllbnRzKGdyYWRBcnJheSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFwcGx5R3JhZGllbnRzKGdyYWRzKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBEaXNwb3NlIGdyYWRpZW50cy5cbiAgICAgICAgZGlzcG9zZShncmFkcyk7XG4gICAgICAgIGlmIChyZXR1cm5Db3N0KSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YWx1ZS5kaXNwb3NlKCk7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgdGhhdCB0aGlzIG9wdGltaXplciBpbnN0YW5jZSBoYXMgYmVlbiBpbnZva2VkIGZvci5cbiAgICAgKi9cbiAgICBnZXQgaXRlcmF0aW9ucygpIHtcbiAgICAgICAgaWYgKHRoaXMuaXRlcmF0aW9uc18gPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5pdGVyYXRpb25zXyA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuaXRlcmF0aW9uc187XG4gICAgfVxuICAgIGluY3JlbWVudEl0ZXJhdGlvbnMoKSB7XG4gICAgICAgIHRoaXMuaXRlcmF0aW9uc18gPSB0aGlzLml0ZXJhdGlvbnMgKyAxO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyBmKCkgYW5kIGNvbXB1dGVzIHRoZSBncmFkaWVudCBvZiB0aGUgc2NhbGFyIG91dHB1dCBvZiBmKCkgd2l0aFxuICAgICAqIHJlc3BlY3QgdG8gdGhlIGxpc3Qgb2YgdHJhaW5hYmxlIHZhcmlhYmxlcyBwcm92aWRlZCBieSBgdmFyTGlzdGAuIElmIG5vXG4gICAgICogbGlzdCBpcyBwcm92aWRlZCwgaXQgZGVmYXVsdHMgdG8gYWxsIHRyYWluYWJsZSB2YXJpYWJsZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZiBUaGUgZnVuY3Rpb24gdG8gZXhlY3V0ZSBhbmQgd2hvc2Ugb3V0cHV0IHRvIHVzZSBmb3IgY29tcHV0aW5nXG4gICAgICogZ3JhZGllbnRzIHdpdGggcmVzcGVjdCB0byB2YXJpYWJsZXMuXG4gICAgICogQHBhcmFtIHZhckxpc3QgQW4gb3B0aW9uYWwgbGlzdCBvZiB2YXJpYWJsZXMgdG8gY29tcHV0ZSBncmFkaWVudHMgd2l0aFxuICAgICAqIHJlc3BlY3QgdG8uIElmIHNwZWNpZmllZCwgb25seSB0aGUgdHJhaW5hYmxlIHZhcmlhYmxlcyBpbiB2YXJMaXN0IHdpbGwgaGF2ZVxuICAgICAqIGdyYWRpZW50cyBjb21wdXRlZCB3aXRoIHJlc3BlY3QgdG8uIERlZmF1bHRzIHRvIGFsbCB0cmFpbmFibGUgdmFyaWFibGVzLlxuICAgICAqXG4gICAgICogQGRvYyB7aGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ09wdGltaXplcnMnfVxuICAgICAqL1xuICAgIGNvbXB1dGVHcmFkaWVudHMoZiwgdmFyTGlzdCkge1xuICAgICAgICByZXR1cm4gdmFyaWFibGVHcmFkcyhmLCB2YXJMaXN0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGlzcG9zZSB0aGUgdmFyaWFibGVzIChpZiBhbnkpIG93bmVkIGJ5IHRoaXMgb3B0aW1pemVyIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLml0ZXJhdGlvbnNfICE9IG51bGwpIHtcbiAgICAgICAgICAgIGRpc3Bvc2UodGhpcy5pdGVyYXRpb25zXyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgc2F2ZUl0ZXJhdGlvbnMoKSB7XG4gICAgICAgIGlmICh0aGlzLml0ZXJhdGlvbnNfID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuaXRlcmF0aW9uc18gPSAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnaXRlcicsXG4gICAgICAgICAgICAvLyBUT0RPKGNhaXMpOiBVc2UgJ2ludDY0JyB0eXBlIHdoZW4gYXZhaWxhYmxlLlxuICAgICAgICAgICAgdGVuc29yOiBzY2FsYXIodGhpcy5pdGVyYXRpb25zXywgJ2ludDMyJylcbiAgICAgICAgfTtcbiAgICB9XG4gICAgYXN5bmMgZ2V0V2VpZ2h0cygpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdnZXRXZWlnaHRzKCkgaXMgbm90IGltcGxlbWVudGVkIGZvciB0aGlzIG9wdGltaXplciB5ZXQuJyk7XG4gICAgfVxuICAgIGFzeW5jIHNldFdlaWdodHMod2VpZ2h0VmFsdWVzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgc2V0V2VpZ2h0cygpIGlzIG5vdCBpbXBsZW1lbnRlZCBmb3IgdGhpcyBvcHRpbWl6ZXIgY2xhc3MgYCArXG4gICAgICAgICAgICBgJHt0aGlzLmdldENsYXNzTmFtZSgpfWApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFeHRyYWN0IHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSB3ZWlnaHQgdmFsdWVzIGFuZCBzZXQgaXRcbiAgICAgKiBhcyB0aGUgaXRlcmF0aW9ucyBjb3VudGVyIHZhcmlhYmxlIG9mIHRoaXMgaW5zdGFuY2Ugb2Ygb3B0aW1pemVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHdlaWdodFZhbHVlc1xuICAgICAqIEByZXR1cm5zIFdlaWdodCB2YWx1ZXMgd2l0aCB0aGUgZmlyc3QgZWxlbWVudCBjb25zdW1lZCBhbmQgZXhjbHVkZWQuXG4gICAgICovXG4gICAgYXN5bmMgZXh0cmFjdEl0ZXJhdGlvbnMod2VpZ2h0VmFsdWVzKSB7XG4gICAgICAgIHRoaXMuaXRlcmF0aW9uc18gPSAoYXdhaXQgd2VpZ2h0VmFsdWVzWzBdLnRlbnNvci5kYXRhKCkpWzBdO1xuICAgICAgICByZXR1cm4gd2VpZ2h0VmFsdWVzLnNsaWNlKDEpO1xuICAgIH1cbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShPcHRpbWl6ZXIsIFN5bWJvbC5oYXNJbnN0YW5jZSwge1xuICAgIHZhbHVlOiAoaW5zdGFuY2UpID0+IHtcbiAgICAgICAgcmV0dXJuIGluc3RhbmNlLm1pbmltaXplICE9IG51bGwgJiYgaW5zdGFuY2UuY29tcHV0ZUdyYWRpZW50cyAhPSBudWxsICYmXG4gICAgICAgICAgICBpbnN0YW5jZS5hcHBseUdyYWRpZW50cyAhPSBudWxsO1xuICAgIH1cbn0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9b3B0aW1pemVyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEFkYWRlbHRhT3B0aW1pemVyIH0gZnJvbSAnLi9hZGFkZWx0YV9vcHRpbWl6ZXInO1xuaW1wb3J0IHsgQWRhZ3JhZE9wdGltaXplciB9IGZyb20gJy4vYWRhZ3JhZF9vcHRpbWl6ZXInO1xuaW1wb3J0IHsgQWRhbU9wdGltaXplciB9IGZyb20gJy4vYWRhbV9vcHRpbWl6ZXInO1xuaW1wb3J0IHsgQWRhbWF4T3B0aW1pemVyIH0gZnJvbSAnLi9hZGFtYXhfb3B0aW1pemVyJztcbmltcG9ydCB7IE1vbWVudHVtT3B0aW1pemVyIH0gZnJvbSAnLi9tb21lbnR1bV9vcHRpbWl6ZXInO1xuaW1wb3J0IHsgUk1TUHJvcE9wdGltaXplciB9IGZyb20gJy4vcm1zcHJvcF9vcHRpbWl6ZXInO1xuaW1wb3J0IHsgU0dET3B0aW1pemVyIH0gZnJvbSAnLi9zZ2Rfb3B0aW1pemVyJztcbmV4cG9ydCBjbGFzcyBPcHRpbWl6ZXJDb25zdHJ1Y3RvcnMge1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdHMgYSBgdGYuU0dET3B0aW1pemVyYCB0aGF0IHVzZXMgc3RvY2hhc3RpYyBncmFkaWVudCBkZXNjZW50LlxuICAgICAqXG4gICAgICogYGBganNcbiAgICAgKiAvLyBGaXQgYSBxdWFkcmF0aWMgZnVuY3Rpb24gYnkgbGVhcm5pbmcgdGhlIGNvZWZmaWNpZW50cyBhLCBiLCBjLlxuICAgICAqIGNvbnN0IHhzID0gdGYudGVuc29yMWQoWzAsIDEsIDIsIDNdKTtcbiAgICAgKiBjb25zdCB5cyA9IHRmLnRlbnNvcjFkKFsxLjEsIDUuOSwgMTYuOCwgMzMuOV0pO1xuICAgICAqXG4gICAgICogY29uc3QgYSA9IHRmLnNjYWxhcihNYXRoLnJhbmRvbSgpKS52YXJpYWJsZSgpO1xuICAgICAqIGNvbnN0IGIgPSB0Zi5zY2FsYXIoTWF0aC5yYW5kb20oKSkudmFyaWFibGUoKTtcbiAgICAgKiBjb25zdCBjID0gdGYuc2NhbGFyKE1hdGgucmFuZG9tKCkpLnZhcmlhYmxlKCk7XG4gICAgICpcbiAgICAgKiAvLyB5ID0gYSAqIHheMiArIGIgKiB4ICsgYy5cbiAgICAgKiBjb25zdCBmID0geCA9PiBhLm11bCh4LnNxdWFyZSgpKS5hZGQoYi5tdWwoeCkpLmFkZChjKTtcbiAgICAgKiBjb25zdCBsb3NzID0gKHByZWQsIGxhYmVsKSA9PiBwcmVkLnN1YihsYWJlbCkuc3F1YXJlKCkubWVhbigpO1xuICAgICAqXG4gICAgICogY29uc3QgbGVhcm5pbmdSYXRlID0gMC4wMTtcbiAgICAgKiBjb25zdCBvcHRpbWl6ZXIgPSB0Zi50cmFpbi5zZ2QobGVhcm5pbmdSYXRlKTtcbiAgICAgKlxuICAgICAqIC8vIFRyYWluIHRoZSBtb2RlbC5cbiAgICAgKiBmb3IgKGxldCBpID0gMDsgaSA8IDEwOyBpKyspIHtcbiAgICAgKiAgIG9wdGltaXplci5taW5pbWl6ZSgoKSA9PiBsb3NzKGYoeHMpLCB5cykpO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIC8vIE1ha2UgcHJlZGljdGlvbnMuXG4gICAgICogY29uc29sZS5sb2coXG4gICAgICogICAgIGBhOiAke2EuZGF0YVN5bmMoKX0sIGI6ICR7Yi5kYXRhU3luYygpfSwgYzogJHtjLmRhdGFTeW5jKCl9YCk7XG4gICAgICogY29uc3QgcHJlZHMgPSBmKHhzKS5kYXRhU3luYygpO1xuICAgICAqIHByZWRzLmZvckVhY2goKHByZWQsIGkpID0+IHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGB4OiAke2l9LCBwcmVkOiAke3ByZWR9YCk7XG4gICAgICogfSk7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbGVhcm5pbmdSYXRlIFRoZSBsZWFybmluZyByYXRlIHRvIHVzZSBmb3IgdGhlIFNHRCBhbGdvcml0aG0uXG4gICAgICpcbiAgICAgKiBAZG9jIHtoZWFkaW5nOiAnVHJhaW5pbmcnLCBzdWJoZWFkaW5nOiAnT3B0aW1pemVycycsIG5hbWVzcGFjZTogJ3RyYWluJ31cbiAgICAgKi9cbiAgICBzdGF0aWMgc2dkKGxlYXJuaW5nUmF0ZSkge1xuICAgICAgICByZXR1cm4gbmV3IFNHRE9wdGltaXplcihsZWFybmluZ1JhdGUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgYHRmLk1vbWVudHVtT3B0aW1pemVyYCB0aGF0IHVzZXMgbW9tZW50dW0gZ3JhZGllbnRcbiAgICAgKiBkZXNjZW50LlxuICAgICAqXG4gICAgICogU2VlXG4gICAgICogW2h0dHA6Ly9wcm9jZWVkaW5ncy5tbHIucHJlc3MvdjI4L3N1dHNrZXZlcjEzLnBkZl0oXG4gICAgICogaHR0cDovL3Byb2NlZWRpbmdzLm1sci5wcmVzcy92Mjgvc3V0c2tldmVyMTMucGRmKVxuICAgICAqXG4gICAgICogQHBhcmFtIGxlYXJuaW5nUmF0ZSBUaGUgbGVhcm5pbmcgcmF0ZSB0byB1c2UgZm9yIHRoZSBNb21lbnR1bSBncmFkaWVudFxuICAgICAqIGRlc2NlbnQgYWxnb3JpdGhtLlxuICAgICAqIEBwYXJhbSBtb21lbnR1bSBUaGUgbW9tZW50dW0gdG8gdXNlIGZvciB0aGUgbW9tZW50dW0gZ3JhZGllbnQgZGVzY2VudFxuICAgICAqIGFsZ29yaXRobS5cbiAgICAgKlxuICAgICAqIEBkb2Mge2hlYWRpbmc6ICdUcmFpbmluZycsIHN1YmhlYWRpbmc6ICdPcHRpbWl6ZXJzJywgbmFtZXNwYWNlOiAndHJhaW4nfVxuICAgICAqL1xuICAgIHN0YXRpYyBtb21lbnR1bShsZWFybmluZ1JhdGUsIG1vbWVudHVtLCB1c2VOZXN0ZXJvdiA9IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBuZXcgTW9tZW50dW1PcHRpbWl6ZXIobGVhcm5pbmdSYXRlLCBtb21lbnR1bSwgdXNlTmVzdGVyb3YpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgYHRmLlJNU1Byb3BPcHRpbWl6ZXJgIHRoYXQgdXNlcyBSTVNQcm9wIGdyYWRpZW50XG4gICAgICogZGVzY2VudC4gVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzIHBsYWluIG1vbWVudHVtIGFuZCBpcyBub3QgY2VudGVyZWRcbiAgICAgKiB2ZXJzaW9uIG9mIFJNU1Byb3AuXG4gICAgICpcbiAgICAgKiBTZWVcbiAgICAgKiBbaHR0cDovL3d3dy5jcy50b3JvbnRvLmVkdS9+dGlqbWVuL2NzYzMyMS9zbGlkZXMvbGVjdHVyZV9zbGlkZXNfbGVjNi5wZGZdKFxuICAgICAqIGh0dHA6Ly93d3cuY3MudG9yb250by5lZHUvfnRpam1lbi9jc2MzMjEvc2xpZGVzL2xlY3R1cmVfc2xpZGVzX2xlYzYucGRmKVxuICAgICAqXG4gICAgICogQHBhcmFtIGxlYXJuaW5nUmF0ZSBUaGUgbGVhcm5pbmcgcmF0ZSB0byB1c2UgZm9yIHRoZSBSTVNQcm9wIGdyYWRpZW50XG4gICAgICogZGVzY2VudCBhbGdvcml0aG0uXG4gICAgICogQHBhcmFtIGRlY2F5IFRoZSBkaXNjb3VudGluZyBmYWN0b3IgZm9yIHRoZSBoaXN0b3J5L2NvbWluZyBncmFkaWVudC5cbiAgICAgKiBAcGFyYW0gbW9tZW50dW0gVGhlIG1vbWVudHVtIHRvIHVzZSBmb3IgdGhlIFJNU1Byb3AgZ3JhZGllbnQgZGVzY2VudFxuICAgICAqIGFsZ29yaXRobS5cbiAgICAgKiBAcGFyYW0gZXBzaWxvbiBTbWFsbCB2YWx1ZSB0byBhdm9pZCB6ZXJvIGRlbm9taW5hdG9yLlxuICAgICAqIEBwYXJhbSBjZW50ZXJlZCBJZiB0cnVlLCBncmFkaWVudHMgYXJlIG5vcm1hbGl6ZWQgYnkgdGhlIGVzdGltYXRlZFxuICAgICAqIHZhcmlhbmNlIG9mIHRoZSBncmFkaWVudC5cbiAgICAgKlxuICAgICAqIEBkb2Mge2hlYWRpbmc6ICdUcmFpbmluZycsIHN1YmhlYWRpbmc6ICdPcHRpbWl6ZXJzJywgbmFtZXNwYWNlOiAndHJhaW4nfVxuICAgICAqL1xuICAgIHN0YXRpYyBybXNwcm9wKGxlYXJuaW5nUmF0ZSwgZGVjYXkgPSAuOSwgbW9tZW50dW0gPSAwLjAsIGVwc2lsb24gPSBudWxsLCBjZW50ZXJlZCA9IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBuZXcgUk1TUHJvcE9wdGltaXplcihsZWFybmluZ1JhdGUsIGRlY2F5LCBtb21lbnR1bSwgZXBzaWxvbiwgY2VudGVyZWQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgYHRmLkFkYW1PcHRpbWl6ZXJgIHRoYXQgdXNlcyB0aGUgQWRhbSBhbGdvcml0aG0uXG4gICAgICogU2VlIFtodHRwczovL2FyeGl2Lm9yZy9hYnMvMTQxMi42OTgwXShodHRwczovL2FyeGl2Lm9yZy9hYnMvMTQxMi42OTgwKVxuICAgICAqXG4gICAgICogQHBhcmFtIGxlYXJuaW5nUmF0ZSBUaGUgbGVhcm5pbmcgcmF0ZSB0byB1c2UgZm9yIHRoZSBBZGFtIGdyYWRpZW50XG4gICAgICogZGVzY2VudCBhbGdvcml0aG0uXG4gICAgICogQHBhcmFtIGJldGExIFRoZSBleHBvbmVudGlhbCBkZWNheSByYXRlIGZvciB0aGUgMXN0IG1vbWVudCBlc3RpbWF0ZXMuXG4gICAgICogQHBhcmFtIGJldGEyIFRoZSBleHBvbmVudGlhbCBkZWNheSByYXRlIGZvciB0aGUgMm5kIG1vbWVudCBlc3RpbWF0ZXMuXG4gICAgICogQHBhcmFtIGVwc2lsb24gQSBzbWFsbCBjb25zdGFudCBmb3IgbnVtZXJpY2FsIHN0YWJpbGl0eS5cbiAgICAgKlxuICAgICAqIEBkb2Mge2hlYWRpbmc6ICdUcmFpbmluZycsIHN1YmhlYWRpbmc6ICdPcHRpbWl6ZXJzJywgbmFtZXNwYWNlOiAndHJhaW4nfVxuICAgICAqL1xuICAgIHN0YXRpYyBhZGFtKGxlYXJuaW5nUmF0ZSA9IDAuMDAxLCBiZXRhMSA9IDAuOSwgYmV0YTIgPSAwLjk5OSwgZXBzaWxvbiA9IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBZGFtT3B0aW1pemVyKGxlYXJuaW5nUmF0ZSwgYmV0YTEsIGJldGEyLCBlcHNpbG9uKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0cyBhIGB0Zi5BZGFkZWx0YU9wdGltaXplcmAgdGhhdCB1c2VzIHRoZSBBZGFkZWx0YSBhbGdvcml0aG0uXG4gICAgICogU2VlIFtodHRwczovL2FyeGl2Lm9yZy9hYnMvMTIxMi41NzAxXShodHRwczovL2FyeGl2Lm9yZy9hYnMvMTIxMi41NzAxKVxuICAgICAqXG4gICAgICogQHBhcmFtIGxlYXJuaW5nUmF0ZSBUaGUgbGVhcm5pbmcgcmF0ZSB0byB1c2UgZm9yIHRoZSBBZGFkZWx0YSBncmFkaWVudFxuICAgICAqIGRlc2NlbnQgYWxnb3JpdGhtLlxuICAgICAqIEBwYXJhbSByaG8gVGhlIGxlYXJuaW5nIHJhdGUgZGVjYXkgb3ZlciBlYWNoIHVwZGF0ZS5cbiAgICAgKiBAcGFyYW0gZXBzaWxvbiBBIGNvbnN0YW50IGVwc2lsb24gdXNlZCB0byBiZXR0ZXIgY29uZGl0aW9uIHRoZSBncmFkXG4gICAgICogdXBkYXRlLlxuICAgICAqXG4gICAgICogQGRvYyB7aGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ09wdGltaXplcnMnLCBuYW1lc3BhY2U6ICd0cmFpbid9XG4gICAgICovXG4gICAgc3RhdGljIGFkYWRlbHRhKGxlYXJuaW5nUmF0ZSA9IC4wMDEsIHJobyA9IC45NSwgZXBzaWxvbiA9IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBZGFkZWx0YU9wdGltaXplcihsZWFybmluZ1JhdGUsIHJobywgZXBzaWxvbik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdHMgYSBgdGYuQWRhbWF4T3B0aW1pemVyYCB0aGF0IHVzZXMgdGhlIEFkYW1heCBhbGdvcml0aG0uXG4gICAgICogU2VlIFtodHRwczovL2FyeGl2Lm9yZy9hYnMvMTQxMi42OTgwXShodHRwczovL2FyeGl2Lm9yZy9hYnMvMTQxMi42OTgwKVxuICAgICAqXG4gICAgICogQHBhcmFtIGxlYXJuaW5nUmF0ZSBUaGUgbGVhcm5pbmcgcmF0ZSB0byB1c2UgZm9yIHRoZSBBZGFtYXggZ3JhZGllbnRcbiAgICAgKiBkZXNjZW50IGFsZ29yaXRobS5cbiAgICAgKiBAcGFyYW0gYmV0YTEgVGhlIGV4cG9uZW50aWFsIGRlY2F5IHJhdGUgZm9yIHRoZSAxc3QgbW9tZW50IGVzdGltYXRlcy5cbiAgICAgKiBAcGFyYW0gYmV0YTIgVGhlIGV4cG9uZW50aWFsIGRlY2F5IHJhdGUgZm9yIHRoZSAybmQgbW9tZW50IGVzdGltYXRlcy5cbiAgICAgKiBAcGFyYW0gZXBzaWxvbiBBIHNtYWxsIGNvbnN0YW50IGZvciBudW1lcmljYWwgc3RhYmlsaXR5LlxuICAgICAqIEBwYXJhbSBkZWNheSBUaGUgbGVhcm5pbmcgcmF0ZSBkZWNheSBvdmVyIGVhY2ggdXBkYXRlLlxuICAgICAqXG4gICAgICogQGRvYyB7aGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ09wdGltaXplcnMnLCBuYW1lc3BhY2U6ICd0cmFpbid9XG4gICAgICovXG4gICAgc3RhdGljIGFkYW1heChsZWFybmluZ1JhdGUgPSAwLjAwMiwgYmV0YTEgPSAwLjksIGJldGEyID0gMC45OTksIGVwc2lsb24gPSBudWxsLCBkZWNheSA9IDAuMCkge1xuICAgICAgICByZXR1cm4gbmV3IEFkYW1heE9wdGltaXplcihsZWFybmluZ1JhdGUsIGJldGExLCBiZXRhMiwgZXBzaWxvbiwgZGVjYXkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgYHRmLkFkYWdyYWRPcHRpbWl6ZXJgIHRoYXQgdXNlcyB0aGUgQWRhZ3JhZCBhbGdvcml0aG0uXG4gICAgICogU2VlXG4gICAgICogW2h0dHA6Ly93d3cuam1sci5vcmcvcGFwZXJzL3ZvbHVtZTEyL2R1Y2hpMTFhL2R1Y2hpMTFhLnBkZl0oXG4gICAgICogaHR0cDovL3d3dy5qbWxyLm9yZy9wYXBlcnMvdm9sdW1lMTIvZHVjaGkxMWEvZHVjaGkxMWEucGRmKVxuICAgICAqIG9yXG4gICAgICogW2h0dHA6Ly9ydWRlci5pby9vcHRpbWl6aW5nLWdyYWRpZW50LWRlc2NlbnQvaW5kZXguaHRtbCNhZGFncmFkXShcbiAgICAgKiBodHRwOi8vcnVkZXIuaW8vb3B0aW1pemluZy1ncmFkaWVudC1kZXNjZW50L2luZGV4Lmh0bWwjYWRhZ3JhZClcbiAgICAgKlxuICAgICAqIEBwYXJhbSBsZWFybmluZ1JhdGUgVGhlIGxlYXJuaW5nIHJhdGUgdG8gdXNlIGZvciB0aGUgQWRhZ3JhZCBncmFkaWVudFxuICAgICAqIGRlc2NlbnQgYWxnb3JpdGhtLlxuICAgICAqIEBwYXJhbSBpbml0aWFsQWNjdW11bGF0b3JWYWx1ZSBTdGFydGluZyB2YWx1ZSBmb3IgdGhlIGFjY3VtdWxhdG9ycywgbXVzdCBiZVxuICAgICAqIHBvc2l0aXZlLlxuICAgICAqXG4gICAgICogQGRvYyB7aGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ09wdGltaXplcnMnLCBuYW1lc3BhY2U6ICd0cmFpbid9XG4gICAgICovXG4gICAgc3RhdGljIGFkYWdyYWQobGVhcm5pbmdSYXRlLCBpbml0aWFsQWNjdW11bGF0b3JWYWx1ZSA9IDAuMSkge1xuICAgICAgICByZXR1cm4gbmV3IEFkYWdyYWRPcHRpbWl6ZXIobGVhcm5pbmdSYXRlLCBpbml0aWFsQWNjdW11bGF0b3JWYWx1ZSk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9b3B0aW1pemVyX2NvbnN0cnVjdG9ycy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgZGlzcG9zZSwgdGlkeSB9IGZyb20gJy4uL2dsb2JhbHMnO1xuaW1wb3J0IHsgYWRkIH0gZnJvbSAnLi4vb3BzL2FkZCc7XG5pbXBvcnQgeyBkaXYgfSBmcm9tICcuLi9vcHMvZGl2JztcbmltcG9ydCB7IG11bCB9IGZyb20gJy4uL29wcy9tdWwnO1xuaW1wb3J0IHsgc3FydCB9IGZyb20gJy4uL29wcy9zcXJ0JztcbmltcG9ydCB7IHNxdWFyZSB9IGZyb20gJy4uL29wcy9zcXVhcmUnO1xuaW1wb3J0IHsgc3ViIH0gZnJvbSAnLi4vb3BzL3N1Yic7XG5pbXBvcnQgeyB6ZXJvc0xpa2UgfSBmcm9tICcuLi9vcHMvemVyb3NfbGlrZSc7XG5pbXBvcnQgeyByZWdpc3RlckNsYXNzIH0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbic7XG5pbXBvcnQgeyBPcHRpbWl6ZXIgfSBmcm9tICcuL29wdGltaXplcic7XG4vKiogQGRvY2xpbmsgT3B0aW1pemVyICovXG5leHBvcnQgY2xhc3MgUk1TUHJvcE9wdGltaXplciBleHRlbmRzIE9wdGltaXplciB7XG4gICAgY29uc3RydWN0b3IobGVhcm5pbmdSYXRlLCBkZWNheSA9IDAuOSwgbW9tZW50dW0gPSAwLjAsIGVwc2lsb24gPSBudWxsLCBjZW50ZXJlZCA9IGZhbHNlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMubGVhcm5pbmdSYXRlID0gbGVhcm5pbmdSYXRlO1xuICAgICAgICB0aGlzLmRlY2F5ID0gZGVjYXk7XG4gICAgICAgIHRoaXMubW9tZW50dW0gPSBtb21lbnR1bTtcbiAgICAgICAgdGhpcy5lcHNpbG9uID0gZXBzaWxvbjtcbiAgICAgICAgdGhpcy5hY2N1bXVsYXRlZE1lYW5TcXVhcmVzID0gW107XG4gICAgICAgIHRoaXMuYWNjdW11bGF0ZWRNb21lbnRzID0gW107XG4gICAgICAgIHRoaXMuYWNjdW11bGF0ZWRNZWFuR3JhZHMgPSBbXTtcbiAgICAgICAgdGhpcy5jZW50ZXJlZCA9IGNlbnRlcmVkO1xuICAgICAgICBpZiAoZXBzaWxvbiA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmVwc2lsb24gPSBFTkdJTkUuYmFja2VuZC5lcHNpbG9uKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxlYXJuaW5nUmF0ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGxlYXJuaW5nUmF0ZSBmb3IgUk1TUHJvcE9wdGltaXplciBtdXN0IGJlIGRlZmluZWQuYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXBwbHlHcmFkaWVudHModmFyaWFibGVHcmFkaWVudHMpIHtcbiAgICAgICAgY29uc3QgdmFyaWFibGVOYW1lcyA9IEFycmF5LmlzQXJyYXkodmFyaWFibGVHcmFkaWVudHMpID9cbiAgICAgICAgICAgIHZhcmlhYmxlR3JhZGllbnRzLm1hcChpdGVtID0+IGl0ZW0ubmFtZSkgOlxuICAgICAgICAgICAgT2JqZWN0LmtleXModmFyaWFibGVHcmFkaWVudHMpO1xuICAgICAgICB2YXJpYWJsZU5hbWVzLmZvckVhY2goKG5hbWUsIGkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gRU5HSU5FLnJlZ2lzdGVyZWRWYXJpYWJsZXNbbmFtZV07XG4gICAgICAgICAgICBjb25zdCB0cmFpbmFibGUgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmICh0aGlzLmFjY3VtdWxhdGVkTWVhblNxdWFyZXNbaV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWNjdW11bGF0ZWRNZWFuU3F1YXJlc1tpXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxOYW1lOiBgJHtuYW1lfS9ybXNgLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogdGlkeSgoKSA9PiB6ZXJvc0xpa2UodmFsdWUpLnZhcmlhYmxlKHRyYWluYWJsZSkpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmFjY3VtdWxhdGVkTW9tZW50c1tpXSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hY2N1bXVsYXRlZE1vbWVudHNbaV0gPSB7XG4gICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsTmFtZTogYCR7bmFtZX0vbW9tZW50dW1gLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogdGlkeSgoKSA9PiB6ZXJvc0xpa2UodmFsdWUpLnZhcmlhYmxlKHRyYWluYWJsZSkpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmFjY3VtdWxhdGVkTWVhbkdyYWRzW2ldID09IG51bGwgJiYgdGhpcy5jZW50ZXJlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWNjdW11bGF0ZWRNZWFuR3JhZHNbaV0gPSB7XG4gICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsTmFtZTogYCR7bmFtZX0vbWdgLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogdGlkeSgoKSA9PiB6ZXJvc0xpa2UodmFsdWUpLnZhcmlhYmxlKHRyYWluYWJsZSkpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGdyYWRpZW50ID0gQXJyYXkuaXNBcnJheSh2YXJpYWJsZUdyYWRpZW50cykgP1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JhZGllbnRzW2ldLnRlbnNvciA6XG4gICAgICAgICAgICAgICAgdmFyaWFibGVHcmFkaWVudHNbbmFtZV07XG4gICAgICAgICAgICBpZiAoZ3JhZGllbnQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGFjY3VtdWxhdGVkTWVhblNxdWFyZSA9IHRoaXMuYWNjdW11bGF0ZWRNZWFuU3F1YXJlc1tpXS52YXJpYWJsZTtcbiAgICAgICAgICAgIGNvbnN0IGFjY3VtdWxhdGVkTW9tZW50cyA9IHRoaXMuYWNjdW11bGF0ZWRNb21lbnRzW2ldLnZhcmlhYmxlO1xuICAgICAgICAgICAgdGlkeSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3QWNjdW11bGF0ZWRNZWFuU3F1YXJlID0gYWRkKG11bChhY2N1bXVsYXRlZE1lYW5TcXVhcmUsIHRoaXMuZGVjYXkpLCBtdWwoc3F1YXJlKGdyYWRpZW50KSwgMSAtIHRoaXMuZGVjYXkpKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jZW50ZXJlZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhY2N1bXVsYXRlZE1lYW5HcmFkID0gdGhpcy5hY2N1bXVsYXRlZE1lYW5HcmFkc1tpXS52YXJpYWJsZTtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2VudGVyZWQgZ3JhZGllbnRcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3QWNjdW11bGF0ZWRNZWFuR3JhZCA9IGFkZChtdWwoYWNjdW11bGF0ZWRNZWFuR3JhZCwgdGhpcy5kZWNheSksIG11bChncmFkaWVudCwgMSAtIHRoaXMuZGVjYXkpKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JhZENvbnRyaWJ1dGlvbiA9IGRpdihtdWwoZ3JhZGllbnQsIHRoaXMubGVhcm5pbmdSYXRlKSwgc3FydChzdWIobmV3QWNjdW11bGF0ZWRNZWFuU3F1YXJlLCBhZGQoc3F1YXJlKG5ld0FjY3VtdWxhdGVkTWVhbkdyYWQpLCB0aGlzLmVwc2lsb24pKSkpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdBY2N1bXVsYXRlZE1vbWVudHMgPSBhZGQobXVsKGFjY3VtdWxhdGVkTW9tZW50cywgdGhpcy5tb21lbnR1bSksIGdyYWRDb250cmlidXRpb24pO1xuICAgICAgICAgICAgICAgICAgICBhY2N1bXVsYXRlZE1lYW5TcXVhcmUuYXNzaWduKG5ld0FjY3VtdWxhdGVkTWVhblNxdWFyZSk7XG4gICAgICAgICAgICAgICAgICAgIGFjY3VtdWxhdGVkTWVhbkdyYWQuYXNzaWduKG5ld0FjY3VtdWxhdGVkTWVhbkdyYWQpO1xuICAgICAgICAgICAgICAgICAgICBhY2N1bXVsYXRlZE1vbWVudHMuYXNzaWduKG5ld0FjY3VtdWxhdGVkTW9tZW50cyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gc3ViKHZhbHVlLCBuZXdBY2N1bXVsYXRlZE1vbWVudHMpO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZS5hc3NpZ24obmV3VmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUGxhaW4gZ3JhZGllbnRcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3QWNjdW11bGF0ZWRNZWFuU3F1YXJlID0gYWRkKG11bChhY2N1bXVsYXRlZE1lYW5TcXVhcmUsIHRoaXMuZGVjYXkpLCBtdWwoc3F1YXJlKGdyYWRpZW50KSwgMSAtIHRoaXMuZGVjYXkpKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3QWNjdW11bGF0ZWRNb21lbnRzID0gYWRkKG11bChhY2N1bXVsYXRlZE1vbWVudHMsIHRoaXMubW9tZW50dW0pLCBkaXYobXVsKGdyYWRpZW50LCB0aGlzLmxlYXJuaW5nUmF0ZSksIHNxcnQoYWRkKG5ld0FjY3VtdWxhdGVkTWVhblNxdWFyZSwgdGhpcy5lcHNpbG9uKSkpKTtcbiAgICAgICAgICAgICAgICAgICAgYWNjdW11bGF0ZWRNZWFuU3F1YXJlLmFzc2lnbihuZXdBY2N1bXVsYXRlZE1lYW5TcXVhcmUpO1xuICAgICAgICAgICAgICAgICAgICBhY2N1bXVsYXRlZE1vbWVudHMuYXNzaWduKG5ld0FjY3VtdWxhdGVkTW9tZW50cyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gc3ViKHZhbHVlLCBuZXdBY2N1bXVsYXRlZE1vbWVudHMpO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZS5hc3NpZ24obmV3VmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5pbmNyZW1lbnRJdGVyYXRpb25zKCk7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLmFjY3VtdWxhdGVkTWVhblNxdWFyZXMgIT0gbnVsbCkge1xuICAgICAgICAgICAgZGlzcG9zZSh0aGlzLmFjY3VtdWxhdGVkTWVhblNxdWFyZXMubWFwKHYgPT4gdi52YXJpYWJsZSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmFjY3VtdWxhdGVkTWVhbkdyYWRzICE9IG51bGwgJiYgdGhpcy5jZW50ZXJlZCkge1xuICAgICAgICAgICAgZGlzcG9zZSh0aGlzLmFjY3VtdWxhdGVkTWVhbkdyYWRzLm1hcCh2ID0+IHYudmFyaWFibGUpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5hY2N1bXVsYXRlZE1vbWVudHMgIT0gbnVsbCkge1xuICAgICAgICAgICAgZGlzcG9zZSh0aGlzLmFjY3VtdWxhdGVkTW9tZW50cy5tYXAodiA9PiB2LnZhcmlhYmxlKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgZ2V0V2VpZ2h0cygpIHtcbiAgICAgICAgLy8gT3JkZXIgbWF0dGVycyBmb3IgUHl0aG9uIGNvbXBhdGliaWxpdHkuXG4gICAgICAgIGNvbnN0IHZhcmlhYmxlcyA9IFsuLi50aGlzLmFjY3VtdWxhdGVkTWVhblNxdWFyZXMsIC4uLnRoaXMuYWNjdW11bGF0ZWRNb21lbnRzXTtcbiAgICAgICAgaWYgKHRoaXMuY2VudGVyZWQpIHtcbiAgICAgICAgICAgIHZhcmlhYmxlcy5wdXNoKC4uLnRoaXMuYWNjdW11bGF0ZWRNZWFuR3JhZHMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbYXdhaXQgdGhpcy5zYXZlSXRlcmF0aW9ucygpXS5jb25jYXQodmFyaWFibGVzLm1hcCh2ID0+ICh7IG5hbWU6IHYub3JpZ2luYWxOYW1lLCB0ZW5zb3I6IHYudmFyaWFibGUgfSkpKTtcbiAgICB9XG4gICAgYXN5bmMgc2V0V2VpZ2h0cyh3ZWlnaHRWYWx1ZXMpIHtcbiAgICAgICAgd2VpZ2h0VmFsdWVzID0gYXdhaXQgdGhpcy5leHRyYWN0SXRlcmF0aW9ucyh3ZWlnaHRWYWx1ZXMpO1xuICAgICAgICBjb25zdCB2YXJpYWJsZUNvdW50ID0gdGhpcy5jZW50ZXJlZCA/IHdlaWdodFZhbHVlcy5sZW5ndGggLyAzIDogd2VpZ2h0VmFsdWVzLmxlbmd0aCAvIDI7XG4gICAgICAgIGNvbnN0IHRyYWluYWJsZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFjY3VtdWxhdGVkTWVhblNxdWFyZXMgPVxuICAgICAgICAgICAgd2VpZ2h0VmFsdWVzLnNsaWNlKDAsIHZhcmlhYmxlQ291bnQpLm1hcCh2ID0+ICh7XG4gICAgICAgICAgICAgICAgb3JpZ2luYWxOYW1lOiB2Lm5hbWUsXG4gICAgICAgICAgICAgICAgdmFyaWFibGU6IHYudGVuc29yLnZhcmlhYmxlKHRyYWluYWJsZSlcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgdGhpcy5hY2N1bXVsYXRlZE1vbWVudHMgPVxuICAgICAgICAgICAgd2VpZ2h0VmFsdWVzLnNsaWNlKHZhcmlhYmxlQ291bnQsIHZhcmlhYmxlQ291bnQgKiAyKVxuICAgICAgICAgICAgICAgIC5tYXAodiA9PiAoe1xuICAgICAgICAgICAgICAgIG9yaWdpbmFsTmFtZTogdi5uYW1lLFxuICAgICAgICAgICAgICAgIHZhcmlhYmxlOiB2LnRlbnNvci52YXJpYWJsZSh0cmFpbmFibGUpXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIGlmICh0aGlzLmNlbnRlcmVkKSB7XG4gICAgICAgICAgICB0aGlzLmFjY3VtdWxhdGVkTWVhbkdyYWRzID1cbiAgICAgICAgICAgICAgICB3ZWlnaHRWYWx1ZXMuc2xpY2UodmFyaWFibGVDb3VudCAqIDIsIHZhcmlhYmxlQ291bnQgKiAzKVxuICAgICAgICAgICAgICAgICAgICAubWFwKHYgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxOYW1lOiB2Lm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlOiB2LnRlbnNvci52YXJpYWJsZSh0cmFpbmFibGUpXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldENvbmZpZygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICdsZWFybmluZ1JhdGUnOiB0aGlzLmxlYXJuaW5nUmF0ZSxcbiAgICAgICAgICAgICdkZWNheSc6IHRoaXMuZGVjYXksXG4gICAgICAgICAgICAnbW9tZW50dW0nOiB0aGlzLm1vbWVudHVtLFxuICAgICAgICAgICAgJ2Vwc2lsb24nOiB0aGlzLmVwc2lsb24sXG4gICAgICAgICAgICAnY2VudGVyZWQnOiB0aGlzLmNlbnRlcmVkXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKiBAbm9jb2xsYXBzZSAqL1xuICAgIHN0YXRpYyBmcm9tQ29uZmlnKGNscywgY29uZmlnKSB7XG4gICAgICAgIHJldHVybiBuZXcgY2xzKGNvbmZpZ1snbGVhcm5pbmdSYXRlJ10sIGNvbmZpZ1snZGVjYXknXSwgY29uZmlnWydtb21lbnR1bSddLCBjb25maWdbJ2Vwc2lsb24nXSwgY29uZmlnWydjZW50ZXJlZCddKTtcbiAgICB9XG59XG4vKiogQG5vY29sbGFwc2UgKi9cblJNU1Byb3BPcHRpbWl6ZXIuY2xhc3NOYW1lID0gJ1JNU1Byb3AnOyAvLyBOb3RlOiBOYW1lIG1hdHRlcnMgZm9yIFB5dGhvbiBjb21wYXRpYmlsaXR5LlxucmVnaXN0ZXJDbGFzcyhSTVNQcm9wT3B0aW1pemVyKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJtc3Byb3Bfb3B0aW1pemVyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IEVOR0lORSB9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBrZWVwLCB0aWR5IH0gZnJvbSAnLi4vZ2xvYmFscyc7XG5pbXBvcnQgeyBhZGQgfSBmcm9tICcuLi9vcHMvYWRkJztcbmltcG9ydCB7IG11bCB9IGZyb20gJy4uL29wcy9tdWwnO1xuaW1wb3J0IHsgc2NhbGFyIH0gZnJvbSAnLi4vb3BzL3NjYWxhcic7XG5pbXBvcnQgeyByZWdpc3RlckNsYXNzIH0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbic7XG5pbXBvcnQgeyBPcHRpbWl6ZXIgfSBmcm9tICcuL29wdGltaXplcic7XG4vKiogQGRvY2xpbmsgT3B0aW1pemVyICovXG5leHBvcnQgY2xhc3MgU0dET3B0aW1pemVyIGV4dGVuZHMgT3B0aW1pemVyIHtcbiAgICBjb25zdHJ1Y3RvcihsZWFybmluZ1JhdGUpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5sZWFybmluZ1JhdGUgPSBsZWFybmluZ1JhdGU7XG4gICAgICAgIHRoaXMuc2V0TGVhcm5pbmdSYXRlKGxlYXJuaW5nUmF0ZSk7XG4gICAgfVxuICAgIGFwcGx5R3JhZGllbnRzKHZhcmlhYmxlR3JhZGllbnRzKSB7XG4gICAgICAgIGNvbnN0IHZhck5hbWVzID0gQXJyYXkuaXNBcnJheSh2YXJpYWJsZUdyYWRpZW50cykgP1xuICAgICAgICAgICAgdmFyaWFibGVHcmFkaWVudHMubWFwKHYgPT4gdi5uYW1lKSA6XG4gICAgICAgICAgICBPYmplY3Qua2V5cyh2YXJpYWJsZUdyYWRpZW50cyk7XG4gICAgICAgIHZhck5hbWVzLmZvckVhY2goKG5hbWUsIGkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGdyYWRpZW50ID0gQXJyYXkuaXNBcnJheSh2YXJpYWJsZUdyYWRpZW50cykgP1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JhZGllbnRzW2ldLnRlbnNvciA6XG4gICAgICAgICAgICAgICAgdmFyaWFibGVHcmFkaWVudHNbbmFtZV07XG4gICAgICAgICAgICBpZiAoZ3JhZGllbnQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gRU5HSU5FLnJlZ2lzdGVyZWRWYXJpYWJsZXNbbmFtZV07XG4gICAgICAgICAgICB0aWR5KCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IGFkZChtdWwodGhpcy5jLCBncmFkaWVudCksIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB2YWx1ZS5hc3NpZ24obmV3VmFsdWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmluY3JlbWVudEl0ZXJhdGlvbnMoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgbGVhcm5pbmcgcmF0ZSBvZiB0aGUgb3B0aW1pemVyLlxuICAgICAqL1xuICAgIHNldExlYXJuaW5nUmF0ZShsZWFybmluZ1JhdGUpIHtcbiAgICAgICAgdGhpcy5sZWFybmluZ1JhdGUgPSBsZWFybmluZ1JhdGU7XG4gICAgICAgIGlmICh0aGlzLmMgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5jLmRpc3Bvc2UoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmMgPSBrZWVwKHNjYWxhcigtbGVhcm5pbmdSYXRlKSk7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIHRoaXMuYy5kaXNwb3NlKCk7XG4gICAgfVxuICAgIGFzeW5jIGdldFdlaWdodHMoKSB7XG4gICAgICAgIHJldHVybiBbYXdhaXQgdGhpcy5zYXZlSXRlcmF0aW9ucygpXTtcbiAgICB9XG4gICAgYXN5bmMgc2V0V2VpZ2h0cyh3ZWlnaHRWYWx1ZXMpIHtcbiAgICAgICAgd2VpZ2h0VmFsdWVzID0gYXdhaXQgdGhpcy5leHRyYWN0SXRlcmF0aW9ucyh3ZWlnaHRWYWx1ZXMpO1xuICAgICAgICBpZiAod2VpZ2h0VmFsdWVzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTR0Qgb3B0aW1pemVyIGRvZXMgbm90IGhhdmUgc2V0dGFibGUgd2VpZ2h0cy4nKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXRDb25maWcoKSB7XG4gICAgICAgIHJldHVybiB7ICdsZWFybmluZ1JhdGUnOiB0aGlzLmxlYXJuaW5nUmF0ZSB9O1xuICAgIH1cbiAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICBzdGF0aWMgZnJvbUNvbmZpZyhjbHMsIGNvbmZpZykge1xuICAgICAgICByZXR1cm4gbmV3IGNscyhjb25maWdbJ2xlYXJuaW5nUmF0ZSddKTtcbiAgICB9XG59XG4vKiogQG5vY29sbGFwc2UgKi9cblNHRE9wdGltaXplci5jbGFzc05hbWUgPSAnU0dEJzsgLy8gTm90ZTogTmFtZSBtYXR0ZXJzIGZvciBQeXRob24gY29tcGF0aWJpbGl0eS5cbnJlZ2lzdGVyQ2xhc3MoU0dET3B0aW1pemVyKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNnZF9vcHRpbWl6ZXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0ICcuLi9mbGFncyc7XG5pbXBvcnQgeyBlbnYgfSBmcm9tICcuLi9lbnZpcm9ubWVudCc7XG5pbXBvcnQgeyBCcm93c2VySW5kZXhlZERCLCBCcm93c2VySW5kZXhlZERCTWFuYWdlciB9IGZyb20gJy4uL2lvL2luZGV4ZWRfZGInO1xuaW1wb3J0IHsgQnJvd3NlckxvY2FsU3RvcmFnZSwgQnJvd3NlckxvY2FsU3RvcmFnZU1hbmFnZXIgfSBmcm9tICcuLi9pby9sb2NhbF9zdG9yYWdlJztcbmltcG9ydCB7IE1vZGVsU3RvcmVNYW5hZ2VyUmVnaXN0cnkgfSBmcm9tICcuLi9pby9tb2RlbF9tYW5hZ2VtZW50JztcbmV4cG9ydCBjbGFzcyBQbGF0Zm9ybUJyb3dzZXIge1xuICAgIGZldGNoKHBhdGgsIGluaXQpIHtcbiAgICAgICAgcmV0dXJuIGZldGNoKHBhdGgsIGluaXQpO1xuICAgIH1cbiAgICBub3coKSB7XG4gICAgICAgIHJldHVybiBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICB9XG4gICAgZW5jb2RlKHRleHQsIGVuY29kaW5nKSB7XG4gICAgICAgIGlmIChlbmNvZGluZyAhPT0gJ3V0Zi04JyAmJiBlbmNvZGluZyAhPT0gJ3V0ZjgnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJyb3dzZXIncyBlbmNvZGVyIG9ubHkgc3VwcG9ydHMgdXRmLTgsIGJ1dCBnb3QgJHtlbmNvZGluZ31gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy50ZXh0RW5jb2RlciA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnRleHRFbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMudGV4dEVuY29kZXIuZW5jb2RlKHRleHQpO1xuICAgIH1cbiAgICBkZWNvZGUoYnl0ZXMsIGVuY29kaW5nKSB7XG4gICAgICAgIHJldHVybiBuZXcgVGV4dERlY29kZXIoZW5jb2RpbmcpLmRlY29kZShieXRlcyk7XG4gICAgfVxufVxuaWYgKGVudigpLmdldCgnSVNfQlJPV1NFUicpKSB7XG4gICAgZW52KCkuc2V0UGxhdGZvcm0oJ2Jyb3dzZXInLCBuZXcgUGxhdGZvcm1Ccm93c2VyKCkpO1xuICAgIC8vIFJlZ2lzdGVyIExvY2FsU3RvcmFnZSBJT0hhbmRsZXJcbiAgICB0cnkge1xuICAgICAgICBNb2RlbFN0b3JlTWFuYWdlclJlZ2lzdHJ5LnJlZ2lzdGVyTWFuYWdlcihCcm93c2VyTG9jYWxTdG9yYWdlLlVSTF9TQ0hFTUUsIG5ldyBCcm93c2VyTG9jYWxTdG9yYWdlTWFuYWdlcigpKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgIH1cbiAgICAvLyBSZWdpc3RlciBJbmRleGVkREIgSU9IYW5kbGVyXG4gICAgdHJ5IHtcbiAgICAgICAgTW9kZWxTdG9yZU1hbmFnZXJSZWdpc3RyeS5yZWdpc3Rlck1hbmFnZXIoQnJvd3NlckluZGV4ZWREQi5VUkxfU0NIRU1FLCBuZXcgQnJvd3NlckluZGV4ZWREQk1hbmFnZXIoKSk7XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wbGF0Zm9ybV9icm93c2VyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGVudiB9IGZyb20gJy4uL2Vudmlyb25tZW50Jztcbi8vIFdlIGFyZSB3cmFwcGluZyB0aGlzIHdpdGhpbiBhbiBvYmplY3Qgc28gaXQgY2FuIGJlIHN0dWJiZWQgYnkgSmFzbWluZS5cbmV4cG9ydCBjb25zdCBnZXROb2RlRmV0Y2ggPSB7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXJlcXVpcmUtaW1wb3J0c1xuICAgIGltcG9ydEZldGNoOiAoKSA9PiByZXF1aXJlKCdub2RlLWZldGNoJylcbn07XG5sZXQgc3lzdGVtRmV0Y2g7XG4vLyBUaGVzZSBnZXR0ZXJzIGFuZCBzZXR0ZXJzIGFyZSBmb3IgdGVzdGluZyBzbyB3ZSBkb24ndCBleHBvcnQgYSBtdXRhYmxlXG4vLyB2YXJpYWJsZS5cbmV4cG9ydCBmdW5jdGlvbiByZXNldFN5c3RlbUZldGNoKCkge1xuICAgIHN5c3RlbUZldGNoID0gbnVsbDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBzZXRTeXN0ZW1GZXRjaChmZXRjaEZuKSB7XG4gICAgc3lzdGVtRmV0Y2ggPSBmZXRjaEZuO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFN5c3RlbUZldGNoKCkge1xuICAgIHJldHVybiBzeXN0ZW1GZXRjaDtcbn1cbmV4cG9ydCBjbGFzcyBQbGF0Zm9ybU5vZGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tcmVxdWlyZS1pbXBvcnRzXG4gICAgICAgIHRoaXMudXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbiAgICAgICAgLy8gQWNjb3JkaW5nIHRvIHRoZSBzcGVjLCB0aGUgYnVpbHQtaW4gZW5jb2RlciBjYW4gZG8gb25seSBVVEYtOCBlbmNvZGluZy5cbiAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1RleHRFbmNvZGVyL1RleHRFbmNvZGVyXG4gICAgICAgIHRoaXMudGV4dEVuY29kZXIgPSBuZXcgdGhpcy51dGlsLlRleHRFbmNvZGVyKCk7XG4gICAgfVxuICAgIGZldGNoKHBhdGgsIHJlcXVlc3RJbml0cykge1xuICAgICAgICBpZiAoZW52KCkuZ2xvYmFsLmZldGNoICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBlbnYoKS5nbG9iYWwuZmV0Y2gocGF0aCwgcmVxdWVzdEluaXRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3lzdGVtRmV0Y2ggPT0gbnVsbCkge1xuICAgICAgICAgICAgc3lzdGVtRmV0Y2ggPSBnZXROb2RlRmV0Y2guaW1wb3J0RmV0Y2goKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3lzdGVtRmV0Y2gocGF0aCwgcmVxdWVzdEluaXRzKTtcbiAgICB9XG4gICAgbm93KCkge1xuICAgICAgICBjb25zdCB0aW1lID0gcHJvY2Vzcy5ocnRpbWUoKTtcbiAgICAgICAgcmV0dXJuIHRpbWVbMF0gKiAxMDAwICsgdGltZVsxXSAvIDEwMDAwMDA7XG4gICAgfVxuICAgIGVuY29kZSh0ZXh0LCBlbmNvZGluZykge1xuICAgICAgICBpZiAoZW5jb2RpbmcgIT09ICd1dGYtOCcgJiYgZW5jb2RpbmcgIT09ICd1dGY4Jykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBOb2RlIGJ1aWx0LWluIGVuY29kZXIgb25seSBzdXBwb3J0cyB1dGYtOCwgYnV0IGdvdCAke2VuY29kaW5nfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnRleHRFbmNvZGVyLmVuY29kZSh0ZXh0KTtcbiAgICB9XG4gICAgZGVjb2RlKGJ5dGVzLCBlbmNvZGluZykge1xuICAgICAgICBpZiAoYnl0ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyB0aGlzLnV0aWwuVGV4dERlY29kZXIoZW5jb2RpbmcpLmRlY29kZShieXRlcyk7XG4gICAgfVxufVxuaWYgKGVudigpLmdldCgnSVNfTk9ERScpKSB7XG4gICAgZW52KCkuc2V0UGxhdGZvcm0oJ25vZGUnLCBuZXcgUGxhdGZvcm1Ob2RlKCkpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGxhdGZvcm1fbm9kZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBlbnYgfSBmcm9tICcuL2Vudmlyb25tZW50JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi91dGlsJztcbmV4cG9ydCBjbGFzcyBQcm9maWxlciB7XG4gICAgY29uc3RydWN0b3IoYmFja2VuZFRpbWVyLCBsb2dnZXIpIHtcbiAgICAgICAgdGhpcy5iYWNrZW5kVGltZXIgPSBiYWNrZW5kVGltZXI7XG4gICAgICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyO1xuICAgICAgICBpZiAobG9nZ2VyID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyID0gbmV3IExvZ2dlcigpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHByb2ZpbGVLZXJuZWwoa2VybmVsTmFtZSwgaW5wdXRzLCBmKSB7XG4gICAgICAgIGxldCBvdXRwdXRzO1xuICAgICAgICBjb25zdCBob2xkUmVzdWx0V3JhcHBlckZuID0gKCkgPT4ge1xuICAgICAgICAgICAgb3V0cHV0cyA9IGYoKTtcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IHRpbWVyO1xuICAgICAgICBjb25zdCBzdGFydCA9IHV0aWwubm93KCk7XG4gICAgICAgIGlmICh0aGlzLmJhY2tlbmRUaW1lci50aW1lckF2YWlsYWJsZSgpKSB7XG4gICAgICAgICAgICB0aW1lciA9IHRoaXMuYmFja2VuZFRpbWVyLnRpbWUoaG9sZFJlc3VsdFdyYXBwZXJGbik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBob2xkUmVzdWx0V3JhcHBlckZuKCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG91dHB1dCBvZiBvdXRwdXRzKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0LmRhdGFTeW5jKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aW1lciA9IFByb21pc2UucmVzb2x2ZSh7IGtlcm5lbE1zOiB1dGlsLm5vdygpIC0gc3RhcnQgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVudigpLmdldEJvb2woJ0NIRUNLX0NPTVBVVEFUSU9OX0ZPUl9FUlJPUlMnKSkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvdXRwdXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3V0cHV0ID0gb3V0cHV0c1tpXTtcbiAgICAgICAgICAgICAgICAvLyBEYW5nbGluZyBwcm9taXNlIGhlcmUgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIHByb3BhZ2F0ZSB1cFxuICAgICAgICAgICAgICAgIC8vIGFzeW5jaHJvbmljaXR5LlxuICAgICAgICAgICAgICAgIG91dHB1dC5kYXRhKCkudGhlbih0ZW5zb3JWYWxzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY2hlY2tDb21wdXRhdGlvbkZvckVycm9ycyh0ZW5zb3JWYWxzLCBvdXRwdXQuZHR5cGUsIGtlcm5lbE5hbWUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGtlcm5lbFByb2ZpbGUgPSB7XG4gICAgICAgICAgICBrZXJuZWxOYW1lLFxuICAgICAgICAgICAgb3V0cHV0cyxcbiAgICAgICAgICAgIGlucHV0cyxcbiAgICAgICAgICAgIHRpbWVNczogdGltZXIudGhlbih0aW1pbmcgPT4gdGltaW5nLmtlcm5lbE1zKSxcbiAgICAgICAgICAgIGV4dHJhSW5mbzogdGltZXIudGhlbih0aW1pbmcgPT4gdGltaW5nLmdldEV4dHJhUHJvZmlsZUluZm8gIT0gbnVsbCA/XG4gICAgICAgICAgICAgICAgdGltaW5nLmdldEV4dHJhUHJvZmlsZUluZm8oKSA6XG4gICAgICAgICAgICAgICAgJycpXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBrZXJuZWxQcm9maWxlO1xuICAgIH1cbiAgICBsb2dLZXJuZWxQcm9maWxlKGtlcm5lbFByb2ZpbGUpIHtcbiAgICAgICAgY29uc3QgeyBrZXJuZWxOYW1lLCBvdXRwdXRzLCB0aW1lTXMsIGlucHV0cywgZXh0cmFJbmZvIH0gPSBrZXJuZWxQcm9maWxlO1xuICAgICAgICBvdXRwdXRzLmZvckVhY2gocmVzdWx0ID0+IHtcbiAgICAgICAgICAgIFByb21pc2UuYWxsKFtyZXN1bHQuZGF0YSgpLCB0aW1lTXMsIGV4dHJhSW5mb10pLnRoZW4odmFsdWVDb250YWluZXIgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZ0tlcm5lbFByb2ZpbGUoa2VybmVsTmFtZSwgcmVzdWx0LCB2YWx1ZUNvbnRhaW5lclswXSwgdmFsdWVDb250YWluZXJbMV0sIGlucHV0cywgdmFsdWVDb250YWluZXJbMl0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBjaGVja0NvbXB1dGF0aW9uRm9yRXJyb3JzKHZhbHMsIGR0eXBlLCBrZXJuZWxOYW1lKSB7XG4gICAgaWYgKGR0eXBlICE9PSAnZmxvYXQzMicpIHtcbiAgICAgICAgLy8gT25seSBmbG9hdGluZyBwb2ludCBjb21wdXRhdGlvbnMgd2lsbCBnZW5lcmF0ZSBOYU4gdmFsdWVzXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IG51bSA9IHZhbHNbaV07XG4gICAgICAgIGlmIChpc05hTihudW0pIHx8ICFpc0Zpbml0ZShudW0pKSB7XG4gICAgICAgICAgICAvLyBUaHJvd2luZyBjdXN0b20gZXhjZXB0aW9uIHNvIGJlaGF2aW9yIGlzIHRlc3RhYmxlLlxuICAgICAgICAgICAgY29uc29sZS53YXJuKGBGb3VuZCAke251bX0gaW4gdGhlIHJlc3VsdCBvZiAnJHtrZXJuZWxOYW1lfSdgKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmV4cG9ydCBjbGFzcyBMb2dnZXIge1xuICAgIGxvZ0tlcm5lbFByb2ZpbGUobmFtZSwgcmVzdWx0LCB2YWxzLCB0aW1lTXMsIGlucHV0cywgZXh0cmFJbmZvKSB7XG4gICAgICAgIGNvbnN0IHRpbWUgPSB0eXBlb2YgdGltZU1zID09PSAnbnVtYmVyJyA/IHV0aWwucmlnaHRQYWQoYCR7dGltZU1zfW1zYCwgOSkgOlxuICAgICAgICAgICAgdGltZU1zWydlcnJvciddO1xuICAgICAgICBjb25zdCBwYWRkZWROYW1lID0gdXRpbC5yaWdodFBhZChuYW1lLCAyNSk7XG4gICAgICAgIGNvbnN0IHJhbmsgPSByZXN1bHQucmFuaztcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHJlc3VsdC5zaXplO1xuICAgICAgICBjb25zdCBzaGFwZSA9IHV0aWwucmlnaHRQYWQocmVzdWx0LnNoYXBlLnRvU3RyaW5nKCksIDE0KTtcbiAgICAgICAgbGV0IGlucHV0U2hhcGVzRGVzY3JpcHRpb24gPSAnJztcbiAgICAgICAgZm9yIChjb25zdCBuYW1lIGluIGlucHV0cykge1xuICAgICAgICAgICAgY29uc3QgaW5wdXQgPSBpbnB1dHNbbmFtZV07XG4gICAgICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIFRoZSBpbnB1dCBtaWdodCBiZSBhIG5vbi10ZW5zb3IgKGUuZyBIVE1MSW1hZ2VFbGVtZW50KSwgaW4gd2hpY2ggY2FzZVxuICAgICAgICAgICAgICAgIC8vIHdlIGNsYWltIHRoZSBvdXRwdXQgc2hhcGUgYXMgaW5wdXQgc2hhcGUuXG4gICAgICAgICAgICAgICAgY29uc3QgaW5wdXRTaGFwZSA9IGlucHV0LnNoYXBlIHx8IHJlc3VsdC5zaGFwZTtcbiAgICAgICAgICAgICAgICBjb25zdCBpbnB1dFJhbmsgPSBpbnB1dFNoYXBlLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBpbnB1dFNoYXBlc0Rlc2NyaXB0aW9uICs9XG4gICAgICAgICAgICAgICAgICAgIGAke25hbWV9OiAke2lucHV0UmFua31EICR7aW5wdXRSYW5rID4gMCA/IGlucHV0U2hhcGUgOiAnJ30gYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZyhgJWMke3BhZGRlZE5hbWV9XFx0JWMke3RpbWV9XFx0JWMke3Jhbmt9RCAke3NoYXBlfVxcdCVjJHtzaXplfVxcdCVjJHtpbnB1dFNoYXBlc0Rlc2NyaXB0aW9ufVxcdCVjJHtleHRyYUluZm99YCwgJ2ZvbnQtd2VpZ2h0OmJvbGQnLCAnY29sb3I6cmVkJywgJ2NvbG9yOmJsdWUnLCAnY29sb3I6IG9yYW5nZScsICdjb2xvcjogZ3JlZW4nLCAnY29sb3I6IHN0ZWVsYmx1ZScpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXByb2ZpbGVyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGFzc2VydCB9IGZyb20gJy4vdXRpbCc7XG4vKipcbiAqIFNlcmlhbGl6YWJsZSBkZWZpbmVzIHRoZSBzZXJpYWxpemF0aW9uIGNvbnRyYWN0LlxuICpcbiAqIFRGSlMgcmVxdWlyZXMgc2VyaWFsaXphYmxlIGNsYXNzZXMgdG8gcmV0dXJuIHRoZWlyIGNsYXNzTmFtZSB3aGVuIGFza2VkXG4gKiB0byBhdm9pZCBpc3N1ZXMgd2l0aCBtaW5pZmljYXRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBTZXJpYWxpemFibGUge1xuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgY2xhc3MgbmFtZSBmb3IgdGhpcyBjbGFzcyB0byB1c2UgaW4gc2VyaWFsaXphdGlvbiBjb250ZXh0cy5cbiAgICAgKlxuICAgICAqIEdlbmVyYWxseSBzcGVha2luZyB0aGlzIHdpbGwgYmUgdGhlIHNhbWUgdGhpbmcgdGhhdCBjb25zdHJ1Y3Rvci5uYW1lXG4gICAgICogd291bGQgaGF2ZSByZXR1cm5lZC4gIEhvd2V2ZXIsIHRoZSBjbGFzcyBuYW1lIG5lZWRzIHRvIGJlIHJvYnVzdFxuICAgICAqIGFnYWluc3QgbWluaWZpY2F0aW9uIGZvciBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiB0byB3b3JrIHByb3Blcmx5LlxuICAgICAqXG4gICAgICogVGhlcmUncyBhbHNvIHBsYWNlcyBzdWNoIGFzIGluaXRpYWxpemVycy5WYXJpYW5jZVNjYWxpbmcsIHdoZXJlXG4gICAgICogaW1wbGVtZW50YXRpb24gZGV0YWlscyBiZXR3ZWVuIGRpZmZlcmVudCBsYW5ndWFnZXMgbGVkIHRvIGRpZmZlcmVudFxuICAgICAqIGNsYXNzIGhpZXJhcmNoaWVzIGFuZCBhIG5vbi1sZWFmIG5vZGUgaXMgdXNlZCBmb3Igc2VyaWFsaXphdGlvbiBwdXJwb3Nlcy5cbiAgICAgKi9cbiAgICBnZXRDbGFzc05hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yXG4gICAgICAgICAgICAuY2xhc3NOYW1lO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIFQgZnJvbSBhIENvbmZpZ0RpY3QuXG4gICAgICpcbiAgICAgKiBUaGlzIHdvcmtzIGZvciBtb3N0IGRlc2NlbmRhbnRzIG9mIHNlcmlhbGl6YWJsZS4gIEEgZmV3IG5lZWQgdG9cbiAgICAgKiBwcm92aWRlIHNwZWNpYWwgaGFuZGxpbmcuXG4gICAgICogQHBhcmFtIGNscyBBIENvbnN0cnVjdG9yIGZvciB0aGUgY2xhc3MgdG8gaW5zdGFudGlhdGUuXG4gICAgICogQHBhcmFtIGNvbmZpZyBUaGUgQ29uZmlndXJhdGlvbiBmb3IgdGhlIG9iamVjdC5cbiAgICAgKi9cbiAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICBzdGF0aWMgZnJvbUNvbmZpZyhjbHMsIGNvbmZpZykge1xuICAgICAgICByZXR1cm4gbmV3IGNscyhjb25maWcpO1xuICAgIH1cbn1cbi8qKlxuICogTWFwcyBzdHJpbmcga2V5cyB0byBjbGFzcyBjb25zdHJ1Y3RvcnMuXG4gKlxuICogVXNlZCBkdXJpbmcgKGRlKXNlcmlhbGl6YXRpb24gZnJvbSB0aGUgY3Jvc3MtbGFuZ3VhZ2UgSlNPTiBmb3JtYXQsIHdoaWNoXG4gKiByZXF1aXJlcyB0aGUgY2xhc3MgbmFtZSBpbiB0aGUgc2VyaWFsaXphdGlvbiBmb3JtYXQgbWF0Y2hlcyB0aGUgY2xhc3NcbiAqIG5hbWVzIGFzIHVzZWQgaW4gUHl0aG9uLCBzaG91bGQgaXQgZXhpc3QuXG4gKi9cbmV4cG9ydCBjbGFzcyBTZXJpYWxpemF0aW9uTWFwIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5jbGFzc05hbWVNYXAgPSB7fTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBtYXAuXG4gICAgICovXG4gICAgc3RhdGljIGdldE1hcCgpIHtcbiAgICAgICAgaWYgKFNlcmlhbGl6YXRpb25NYXAuaW5zdGFuY2UgPT0gbnVsbCkge1xuICAgICAgICAgICAgU2VyaWFsaXphdGlvbk1hcC5pbnN0YW5jZSA9IG5ldyBTZXJpYWxpemF0aW9uTWFwKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFNlcmlhbGl6YXRpb25NYXAuaW5zdGFuY2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVycyB0aGUgY2xhc3MgYXMgc2VyaWFsaXphYmxlLlxuICAgICAqL1xuICAgIHN0YXRpYyByZWdpc3RlcihjbHMpIHtcbiAgICAgICAgU2VyaWFsaXphdGlvbk1hcC5nZXRNYXAoKS5jbGFzc05hbWVNYXBbY2xzLmNsYXNzTmFtZV0gPVxuICAgICAgICAgICAgW2NscywgY2xzLmZyb21Db25maWddO1xuICAgIH1cbn1cbi8qKlxuICogUmVnaXN0ZXIgYSBjbGFzcyB3aXRoIHRoZSBzZXJpYWxpemF0aW9uIG1hcCBvZiBUZW5zb3JGbG93LmpzLlxuICpcbiAqIFRoaXMgaXMgb2Z0ZW4gdXNlZCBmb3IgcmVnaXN0ZXJpbmcgY3VzdG9tIExheWVycywgc28gdGhleSBjYW4gYmVcbiAqIHNlcmlhbGl6ZWQgYW5kIGRlc2VyaWFsaXplZC5cbiAqXG4gKiBFeGFtcGxlOlxuICpcbiAqIGBgYGpzXG4gKiBjbGFzcyBNeUN1c3RvbUxheWVyIGV4dGVuZHMgdGYubGF5ZXJzLkxheWVyIHtcbiAqICAgc3RhdGljIGNsYXNzTmFtZSA9ICdNeUN1c3RvbUxheWVyJztcbiAqXG4gKiAgIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICogICAgIHN1cGVyKGNvbmZpZyk7XG4gKiAgIH1cbiAqIH1cbiAqIHRmLnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhNeUN1c3RvbUxheWVyKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBjbHMgVGhlIGNsYXNzIHRvIGJlIHJlZ2lzdGVyZWQuIEl0IG11c3QgaGF2ZSBhIHB1YmxpYyBzdGF0aWMgbWVtYmVyXG4gKiAgIGNhbGxlZCBgY2xhc3NOYW1lYCBkZWZpbmVkIGFuZCB0aGUgdmFsdWUgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ01vZGVscycsIHN1YmhlYWRpbmc6ICdTZXJpYWxpemF0aW9uJywgaWdub3JlQ0k6IHRydWV9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckNsYXNzKGNscykge1xuICAgIGFzc2VydChjbHMuY2xhc3NOYW1lICE9IG51bGwsICgpID0+IGBDbGFzcyBiZWluZyByZWdpc3RlcmVkIGRvZXMgbm90IGhhdmUgdGhlIHN0YXRpYyBjbGFzc05hbWUgYCArXG4gICAgICAgIGBwcm9wZXJ0eSBkZWZpbmVkLmApO1xuICAgIGFzc2VydCh0eXBlb2YgY2xzLmNsYXNzTmFtZSA9PT0gJ3N0cmluZycsICgpID0+IGBjbGFzc05hbWUgaXMgcmVxdWlyZWQgdG8gYmUgYSBzdHJpbmcsIGJ1dCBnb3QgdHlwZSBgICtcbiAgICAgICAgdHlwZW9mIGNscy5jbGFzc05hbWUpO1xuICAgIGFzc2VydChjbHMuY2xhc3NOYW1lLmxlbmd0aCA+IDAsICgpID0+IGBDbGFzcyBiZWluZyByZWdpc3RlcmVkIGhhcyBhbiBlbXB0eS1zdHJpbmcgYXMgaXRzIGNsYXNzTmFtZSwgYCArXG4gICAgICAgIGB3aGljaCBpcyBkaXNhbGxvd2VkLmApO1xuICAgIFNlcmlhbGl6YXRpb25NYXAucmVnaXN0ZXIoY2xzKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNlcmlhbGl6YXRpb24uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuL3V0aWwnO1xuLyoqXG4gKiBDb21wdXRlcyBhIGxpc3Qgb2YgVGFwZU5vZGVzIHRoYXQgY29ubmVjdCB4IHRvIHksIGZpbHRlcmluZyBldmVyeXRoaW5nIGVsc2VcbiAqIG91dCBhbmQgcHJlc2VydmluZyB0aGUgb3JkZXIgb2YgdGhlIG9yaWdpbmFsIHRhcGUgZWxlbWVudHMuXG4gKlxuICogQHBhcmFtIHRhcGUgVGhlIHRhcGUgZWxlbWVudHMgdG8gZmlsdGVyLlxuICogQHBhcmFtIHhzIFRoZSBpbnB1dCBUZW5zb3JzLlxuICogQHBhcmFtIHkgVGhlIG91dHB1dCBUZW5zb3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGaWx0ZXJlZE5vZGVzWFRvWSh0YXBlLCB4cywgeSkge1xuICAgIC8vIEZvcndhcmQgcGFzcyB0byBjb21wdXRlIGFsbCB0aGUgbm9kZXMgYW5kIFRlbnNvcnMgdGhhdCBhcmUgdHJhbnNpdGl2ZWx5IGFcbiAgICAvLyBmdW5jdGlvbiBvZiB4LlxuICAgIGNvbnN0IHRlbnNvcnNGcm9tWCA9IHt9O1xuICAgIGNvbnN0IG5vZGVzRnJvbVggPSB7fTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHhzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRlbnNvcnNGcm9tWFt4c1tpXS5pZF0gPSB0cnVlO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhcGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IHRhcGVbaV07XG4gICAgICAgIGNvbnN0IG5vZGVJbnB1dHMgPSBub2RlLmlucHV0cztcbiAgICAgICAgZm9yIChjb25zdCBpbnB1dE5hbWUgaW4gbm9kZUlucHV0cykge1xuICAgICAgICAgICAgY29uc3QgaW5wdXQgPSBub2RlSW5wdXRzW2lucHV0TmFtZV07XG4gICAgICAgICAgICBsZXQgYW55SW5wdXRGcm9tWCA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB4cy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIGlmICh0ZW5zb3JzRnJvbVhbaW5wdXQuaWRdKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUub3V0cHV0cy5mb3JFYWNoKG91dHB1dCA9PiB0ZW5zb3JzRnJvbVhbb3V0cHV0LmlkXSA9IHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBhbnlJbnB1dEZyb21YID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgbm9kZXNGcm9tWFtub2RlLmlkXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhbnlJbnB1dEZyb21YKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gQmFja3dhcmQgcGFzcyB0byBmaW5kIGFsbCBvZiB0aGUgbm9kZXMgYW5kIFRlbnNvcnMgdGhhdCBsZWFkIHRvIHkuXG4gICAgY29uc3QgdGVuc29yc0xlYWRUb1kgPSB7fTtcbiAgICB0ZW5zb3JzTGVhZFRvWVt5LmlkXSA9IHRydWU7XG4gICAgY29uc3Qgbm9kZXNUb1kgPSB7fTtcbiAgICBmb3IgKGxldCBpID0gdGFwZS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBjb25zdCBub2RlID0gdGFwZVtpXTtcbiAgICAgICAgY29uc3Qgbm9kZUlucHV0cyA9IG5vZGUuaW5wdXRzO1xuICAgICAgICAvLyBJZiBhbnkgb2YgdGhlIG91dHB1dHMgbGVhZCB0byB5LCBtYXJrIGFsbCBvZiB0aGUgaW5wdXRzIGFzIGxlYWRpbmcgdG8geS5cbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBub2RlLm91dHB1dHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGlmICh0ZW5zb3JzTGVhZFRvWVtub2RlLm91dHB1dHNbal0uaWRdKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBpbnB1dE5hbWUgaW4gbm9kZUlucHV0cykge1xuICAgICAgICAgICAgICAgICAgICB0ZW5zb3JzTGVhZFRvWVtub2RlSW5wdXRzW2lucHV0TmFtZV0uaWRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgbm9kZXNUb1lbbm9kZS5pZF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBSZXR1cm4gdGhlIHBhdGhzIHRoYXQgY29tZSBmcm9tIHggYW5kIGxlYWQgdG8geS5cbiAgICBjb25zdCBmaWx0ZXJlZFRhcGUgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhcGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IHRhcGVbaV07XG4gICAgICAgIGlmIChub2Rlc0Zyb21YW25vZGUuaWRdICYmIG5vZGVzVG9ZW25vZGUuaWRdKSB7XG4gICAgICAgICAgICAvLyBQcnVuZSB0aGUgaW5wdXRzIGZyb20gdGhlIG5vZGUgdGhhdCBhcmVuJ3QgYSBmdW5jdGlvbiBvZiB4LlxuICAgICAgICAgICAgY29uc3QgcHJ1bmVkSW5wdXRzID0ge307XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGlucHV0TmFtZSBpbiBub2RlLmlucHV0cykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVJbnB1dCA9IG5vZGUuaW5wdXRzW2lucHV0TmFtZV07XG4gICAgICAgICAgICAgICAgaWYgKHRlbnNvcnNGcm9tWFtub2RlSW5wdXQuaWRdKSB7XG4gICAgICAgICAgICAgICAgICAgIHBydW5lZElucHV0c1tpbnB1dE5hbWVdID0gbm9kZUlucHV0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIENvcHkgdGhlIG5vZGUgYW5kIG92ZXJ3cml0ZSBpbnB1dHNBbmRBcmdzIHRvIHRoZSBwcnVuZWQgdmVyc2lvbi5cbiAgICAgICAgICAgIGNvbnN0IHBydW5lZE5vZGUgPSBPYmplY3QuYXNzaWduKHt9LCBub2RlKTtcbiAgICAgICAgICAgIHBydW5lZE5vZGUuaW5wdXRzID0gcHJ1bmVkSW5wdXRzO1xuICAgICAgICAgICAgcHJ1bmVkTm9kZS5vdXRwdXRzID0gbm9kZS5vdXRwdXRzO1xuICAgICAgICAgICAgZmlsdGVyZWRUYXBlLnB1c2gocHJ1bmVkTm9kZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZpbHRlcmVkVGFwZTtcbn1cbi8qKlxuICogQmFja3Byb3BhZ2F0ZSBncmFkaWVudHMgdGhyb3VnaCB0aGUgZmlsdGVyZWQgVGFwZU5vZGVzLlxuICpcbiAqIEBwYXJhbSB0ZW5zb3JBY2N1bXVsYXRlZEdyYWRpZW50TWFwIEEgbWFwIG9mIFRlbnNvciB0byBpdHMgZ3JhZGllbnQuIFRoaXMgbWFwXG4gKiBpcyBtdXRhdGVkIGJ5IHRoaXMgbWV0aG9kLlxuICogQHBhcmFtIGZpbHRlcmVkVGFwZSBUaGUgZmlsdGVyZWQgVGFwZU5vZGVzIHRvIGJhY2twcm9wIHRocm91Z2guXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiYWNrcHJvcGFnYXRlR3JhZGllbnRzKHRlbnNvckFjY3VtdWxhdGVkR3JhZGllbnRNYXAsIGZpbHRlcmVkVGFwZSwgdGlkeSwgYWRkKSB7XG4gICAgLy8gV2FsayB0aGUgdGFwZSBiYWNrd2FyZCBhbmQga2VlcCBhIG1hcCBvZiBUZW5zb3IgdG8gaXRzIGdyYWRpZW50LlxuICAgIGZvciAobGV0IGkgPSBmaWx0ZXJlZFRhcGUubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IGZpbHRlcmVkVGFwZVtpXTtcbiAgICAgICAgY29uc3QgZHlzID0gW107XG4gICAgICAgIG5vZGUub3V0cHV0cy5mb3JFYWNoKG8gPT4ge1xuICAgICAgICAgICAgY29uc3QgZ3JhZFRlbnNvciA9IHRlbnNvckFjY3VtdWxhdGVkR3JhZGllbnRNYXBbby5pZF07XG4gICAgICAgICAgICBpZiAoZ3JhZFRlbnNvciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgZHlzLnB1c2goZ3JhZFRlbnNvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBUaGlzIHBhcnRpY3VsYXIgb3V0cHV0IGlzIG5vdCBpbiB0aGUgYmFjay1wcm9wYWdhdGlvbiBzdWJncmFwaCwgc28gaXRcbiAgICAgICAgICAgICAgICAvLyBkb2VzIG5vdCBhZmZlY3QgdGhlIGZpbmFsIG91dHB1dCwgdGh1cyB3ZSBwdXQgbnVsbCBmb3IgaXRzIGR5LlxuICAgICAgICAgICAgICAgIGR5cy5wdXNoKG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKG5vZGUuZ3JhZGllbnQgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY29tcHV0ZSBncmFkaWVudDogZ3JhZGllbnQgZnVuY3Rpb24gbm90IGZvdW5kIGAgK1xuICAgICAgICAgICAgICAgIGBmb3IgJHtub2RlLmtlcm5lbE5hbWV9LmApO1xuICAgICAgICB9XG4gICAgICAgIC8vIEJhY2twcm9wIGR5IHRocm91Z2ggdGhpcyBub2RlIGFuZCBhY2N1bXVsYXRlIGdyYWRpZW50cyBvdmVyIHRoZSBpbnB1dHMuXG4gICAgICAgIGNvbnN0IGlucHV0R3JhZGllbnRzID0gbm9kZS5ncmFkaWVudChkeXMpO1xuICAgICAgICBmb3IgKGNvbnN0IGlucHV0TmFtZSBpbiBub2RlLmlucHV0cykge1xuICAgICAgICAgICAgaWYgKCEoaW5wdXROYW1lIGluIGlucHV0R3JhZGllbnRzKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGJhY2twcm9wIHRocm91Z2ggaW5wdXQgJHtpbnB1dE5hbWV9LiBgICtcbiAgICAgICAgICAgICAgICAgICAgYEF2YWlsYWJsZSBncmFkaWVudHMgZm91bmQ6ICR7T2JqZWN0LmtleXMoaW5wdXRHcmFkaWVudHMpfS5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIENhbGwgdGhlIGdyYWRpZW50IGZ1bmN0aW9uLlxuICAgICAgICAgICAgY29uc3QgZHggPSB0aWR5KCgpID0+IGlucHV0R3JhZGllbnRzW2lucHV0TmFtZV0oKSk7XG4gICAgICAgICAgICBpZiAoZHguZHR5cGUgIT09ICdmbG9hdDMyJykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgaW4gZ3JhZGllbnQgZm9yIG9wICR7bm9kZS5rZXJuZWxOYW1lfS4gVGhlIGdyYWRpZW50IG9mIGlucHV0IGAgK1xuICAgICAgICAgICAgICAgICAgICBgJHtpbnB1dE5hbWV9IG11c3QgaGF2ZSAnZmxvYXQzMicgZHR5cGUsIGJ1dCBoYXMgJyR7ZHguZHR5cGV9J2ApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgeCA9IG5vZGUuaW5wdXRzW2lucHV0TmFtZV07XG4gICAgICAgICAgICBpZiAoIXV0aWwuYXJyYXlzRXF1YWwoZHguc2hhcGUsIHguc2hhcGUpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBpbiBncmFkaWVudCBmb3Igb3AgJHtub2RlLmtlcm5lbE5hbWV9LiBUaGUgZ3JhZGllbnQgb2YgaW5wdXQgYCArXG4gICAgICAgICAgICAgICAgICAgIGAnJHtpbnB1dE5hbWV9JyBoYXMgc2hhcGUgJyR7ZHguc2hhcGV9Jywgd2hpY2ggZG9lcyBub3QgbWF0Y2ggYCArXG4gICAgICAgICAgICAgICAgICAgIGB0aGUgc2hhcGUgb2YgdGhlIGlucHV0ICcke3guc2hhcGV9J2ApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRlbnNvckFjY3VtdWxhdGVkR3JhZGllbnRNYXBbeC5pZF0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRlbnNvckFjY3VtdWxhdGVkR3JhZGllbnRNYXBbeC5pZF0gPSBkeDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1ckdyYWRpZW50ID0gdGVuc29yQWNjdW11bGF0ZWRHcmFkaWVudE1hcFt4LmlkXTtcbiAgICAgICAgICAgICAgICB0ZW5zb3JBY2N1bXVsYXRlZEdyYWRpZW50TWFwW3guaWRdID0gYWRkKGN1ckdyYWRpZW50LCBkeCk7XG4gICAgICAgICAgICAgICAgY3VyR3JhZGllbnQuZGlzcG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGFwZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBnZXRHbG9iYWwgfSBmcm9tICcuL2dsb2JhbF91dGlsJztcbmltcG9ydCB7IHRlbnNvclRvU3RyaW5nIH0gZnJvbSAnLi90ZW5zb3JfZm9ybWF0JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi91dGlsJztcbmltcG9ydCB7IGNvbXB1dGVTdHJpZGVzLCB0b05lc3RlZEFycmF5IH0gZnJvbSAnLi91dGlsJztcbi8qKlxuICogQSBtdXRhYmxlIG9iamVjdCwgc2ltaWxhciB0byBgdGYuVGVuc29yYCwgdGhhdCBhbGxvd3MgdXNlcnMgdG8gc2V0IHZhbHVlc1xuICogYXQgbG9jYXRpb25zIGJlZm9yZSBjb252ZXJ0aW5nIHRvIGFuIGltbXV0YWJsZSBgdGYuVGVuc29yYC5cbiAqXG4gKiBTZWUgYHRmLmJ1ZmZlcmAgZm9yIGNyZWF0aW5nIGEgdGVuc29yIGJ1ZmZlci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAqL1xuZXhwb3J0IGNsYXNzIFRlbnNvckJ1ZmZlciB7XG4gICAgY29uc3RydWN0b3Ioc2hhcGUsIGR0eXBlLCB2YWx1ZXMpIHtcbiAgICAgICAgdGhpcy5kdHlwZSA9IGR0eXBlO1xuICAgICAgICB0aGlzLnNoYXBlID0gc2hhcGUuc2xpY2UoKTtcbiAgICAgICAgdGhpcy5zaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHNoYXBlKTtcbiAgICAgICAgaWYgKHZhbHVlcyAhPSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBuID0gdmFsdWVzLmxlbmd0aDtcbiAgICAgICAgICAgIHV0aWwuYXNzZXJ0KG4gPT09IHRoaXMuc2l6ZSwgKCkgPT4gYExlbmd0aCBvZiB2YWx1ZXMgJyR7bn0nIGRvZXMgbm90IG1hdGNoIHRoZSBzaXplIGAgK1xuICAgICAgICAgICAgICAgIGBpbmZlcnJlZCBieSB0aGUgc2hhcGUgJyR7dGhpcy5zaXplfScuYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBjb21wbGV4NjQgZHR5cGUgVGVuc29yQnVmZmVycyBhcmUgbm90IHN1cHBvcnRlZC4gUGxlYXNlIGNyZWF0ZSBgICtcbiAgICAgICAgICAgICAgICBgYSBUZW5zb3JCdWZmZXIgZm9yIHRoZSByZWFsIGFuZCBpbWFnaW5hcnkgcGFydHMgc2VwYXJhdGVseSBhbmQgYCArXG4gICAgICAgICAgICAgICAgYGNhbGwgdGYuY29tcGxleChyZWFsLCBpbWFnKS5gKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZhbHVlcyA9IHZhbHVlcyB8fCB1dGlsLmdldEFycmF5RnJvbURUeXBlKGR0eXBlLCB0aGlzLnNpemUpO1xuICAgICAgICB0aGlzLnN0cmlkZXMgPSBjb21wdXRlU3RyaWRlcyhzaGFwZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgYSB2YWx1ZSBpbiB0aGUgYnVmZmVyIGF0IGEgZ2l2ZW4gbG9jYXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcGFyYW0gbG9jcyAgVGhlIGxvY2F0aW9uIGluZGljZXMuXG4gICAgICpcbiAgICAgKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDcmVhdGlvbid9XG4gICAgICovXG4gICAgc2V0KHZhbHVlLCAuLi5sb2NzKSB7XG4gICAgICAgIGlmIChsb2NzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgbG9jcyA9IFswXTtcbiAgICAgICAgfVxuICAgICAgICB1dGlsLmFzc2VydChsb2NzLmxlbmd0aCA9PT0gdGhpcy5yYW5rLCAoKSA9PiBgVGhlIG51bWJlciBvZiBwcm92aWRlZCBjb29yZGluYXRlcyAoJHtsb2NzLmxlbmd0aH0pIG11c3QgYCArXG4gICAgICAgICAgICBgbWF0Y2ggdGhlIHJhbmsgKCR7dGhpcy5yYW5rfSlgKTtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmxvY1RvSW5kZXgobG9jcyk7XG4gICAgICAgIHRoaXMudmFsdWVzW2luZGV4XSA9IHZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBpbiB0aGUgYnVmZmVyIGF0IHRoZSBwcm92aWRlZCBsb2NhdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBsb2NzIFRoZSBsb2NhdGlvbiBpbmRpY2VzLlxuICAgICAqXG4gICAgICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ3JlYXRpb24nfVxuICAgICAqL1xuICAgIGdldCguLi5sb2NzKSB7XG4gICAgICAgIGlmIChsb2NzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgbG9jcyA9IFswXTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIGZvciAoY29uc3QgbG9jIG9mIGxvY3MpIHtcbiAgICAgICAgICAgIGlmIChsb2MgPCAwIHx8IGxvYyA+PSB0aGlzLnNoYXBlW2ldKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbXNnID0gYFJlcXVlc3RlZCBvdXQgb2YgcmFuZ2UgZWxlbWVudCBhdCAke2xvY3N9LiBgICtcbiAgICAgICAgICAgICAgICAgICAgYCAgQnVmZmVyIHNoYXBlPSR7dGhpcy5zaGFwZX1gO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgICAgIGxldCBpbmRleCA9IGxvY3NbbG9jcy5sZW5ndGggLSAxXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb2NzLmxlbmd0aCAtIDE7ICsraSkge1xuICAgICAgICAgICAgaW5kZXggKz0gdGhpcy5zdHJpZGVzW2ldICogbG9jc1tpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZXNbaW5kZXhdO1xuICAgIH1cbiAgICBsb2NUb0luZGV4KGxvY3MpIHtcbiAgICAgICAgaWYgKHRoaXMucmFuayA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5yYW5rID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gbG9jc1swXTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaW5kZXggPSBsb2NzW2xvY3MubGVuZ3RoIC0gMV07XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbG9jcy5sZW5ndGggLSAxOyArK2kpIHtcbiAgICAgICAgICAgIGluZGV4ICs9IHRoaXMuc3RyaWRlc1tpXSAqIGxvY3NbaV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cbiAgICBpbmRleFRvTG9jKGluZGV4KSB7XG4gICAgICAgIGlmICh0aGlzLnJhbmsgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLnJhbmsgPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBbaW5kZXhdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxvY3MgPSBuZXcgQXJyYXkodGhpcy5zaGFwZS5sZW5ndGgpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxvY3MubGVuZ3RoIC0gMTsgKytpKSB7XG4gICAgICAgICAgICBsb2NzW2ldID0gTWF0aC5mbG9vcihpbmRleCAvIHRoaXMuc3RyaWRlc1tpXSk7XG4gICAgICAgICAgICBpbmRleCAtPSBsb2NzW2ldICogdGhpcy5zdHJpZGVzW2ldO1xuICAgICAgICB9XG4gICAgICAgIGxvY3NbbG9jcy5sZW5ndGggLSAxXSA9IGluZGV4O1xuICAgICAgICByZXR1cm4gbG9jcztcbiAgICB9XG4gICAgZ2V0IHJhbmsoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNoYXBlLmxlbmd0aDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpbW11dGFibGUgYHRmLlRlbnNvcmAgb2JqZWN0IGZyb20gdGhlIGJ1ZmZlci5cbiAgICAgKlxuICAgICAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NyZWF0aW9uJ31cbiAgICAgKi9cbiAgICB0b1RlbnNvcigpIHtcbiAgICAgICAgcmV0dXJuIHRyYWNrZXJGbigpLm1ha2VUZW5zb3IodGhpcy52YWx1ZXMsIHRoaXMuc2hhcGUsIHRoaXMuZHR5cGUpO1xuICAgIH1cbn1cbi8vIEZvciB0cmFja2luZyB0ZW5zb3IgY3JlYXRpb24gYW5kIGRpc3Bvc2FsLlxubGV0IHRyYWNrZXJGbiA9IG51bGw7XG4vLyBVc2VkIGJ5IGNoYWluaW5nIG1ldGhvZHMgdG8gY2FsbCBpbnRvIG9wcy5cbmxldCBvcEhhbmRsZXIgPSBudWxsO1xuLy8gVXNlZCB0byB3YXJuIGFib3V0IGRlcHJlY2F0ZWQgbWV0aG9kcy5cbmxldCBkZXByZWNhdGlvbldhcm5pbmdGbiA9IG51bGw7XG4vLyBUaGlzIGhlcmUgc28gdGhhdCB3ZSBjYW4gdXNlIHRoaXMgbWV0aG9kIG9uIGRldiBicmFuY2hlcyBhbmQga2VlcCB0aGVcbi8vIGZ1bmN0aW9uYWxpdHkgYXQgbWFzdGVyLlxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXVudXNlZC1leHByZXNzaW9uXG5bZGVwcmVjYXRpb25XYXJuaW5nRm5dO1xuLyoqXG4gKiBBbiBleHRlcm5hbCBjb25zdW1lciBjYW4gcmVnaXN0ZXIgaXRzZWxmIGFzIHRoZSB0ZW5zb3IgdHJhY2tlci4gVGhpcyB3YXlcbiAqIHRoZSBUZW5zb3IgY2xhc3MgY2FuIG5vdGlmeSB0aGUgdHJhY2tlciBmb3IgZXZlcnkgdGVuc29yIGNyZWF0ZWQgYW5kXG4gKiBkaXNwb3NlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFRlbnNvclRyYWNrZXIoZm4pIHtcbiAgICB0cmFja2VyRm4gPSBmbjtcbn1cbi8qKlxuICogQW4gZXh0ZXJuYWwgY29uc3VtZXIgY2FuIHJlZ2lzdGVyIGl0c2VsZiBhcyB0aGUgb3AgaGFuZGxlci4gVGhpcyB3YXkgdGhlXG4gKiBUZW5zb3IgY2xhc3MgY2FuIGhhdmUgY2hhaW5pbmcgbWV0aG9kcyB0aGF0IGNhbGwgaW50byBvcHMgdmlhIHRoZSBvcFxuICogaGFuZGxlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldE9wSGFuZGxlcihoYW5kbGVyKSB7XG4gICAgb3BIYW5kbGVyID0gaGFuZGxlcjtcbn1cbi8qKlxuICogU2V0cyB0aGUgZGVwcmVjYXRpb24gd2FybmluZyBmdW5jdGlvbiB0byBiZSB1c2VkIGJ5IHRoaXMgZmlsZS4gVGhpcyB3YXkgdGhlXG4gKiBUZW5zb3IgY2xhc3MgY2FuIGJlIGEgbGVhZiBidXQgc3RpbGwgdXNlIHRoZSBlbnZpcm9ubWVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldERlcHJlY2F0aW9uV2FybmluZ0ZuKGZuKSB7XG4gICAgZGVwcmVjYXRpb25XYXJuaW5nRm4gPSBmbjtcbn1cbi8qKlxuICogQSBgdGYuVGVuc29yYCBvYmplY3QgcmVwcmVzZW50cyBhbiBpbW11dGFibGUsIG11bHRpZGltZW5zaW9uYWwgYXJyYXkgb2ZcbiAqIG51bWJlcnMgdGhhdCBoYXMgYSBzaGFwZSBhbmQgYSBkYXRhIHR5cGUuXG4gKlxuICogRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIGZ1bmN0aW9ucyB0aGF0IGNyZWF0ZSB0ZW5zb3JzIGRvIG5vdCBuZWNlc3NhcmlseVxuICogcGVyZm9ybSBhIGNvcHkgb2YgdGhlIGRhdGEgcGFzc2VkIHRvIHRoZW0gKGUuZy4gaWYgdGhlIGRhdGEgaXMgcGFzc2VkIGFzIGFcbiAqIGBGbG9hdDMyQXJyYXlgKSwgYW5kIGNoYW5nZXMgdG8gdGhlIGRhdGEgd2lsbCBjaGFuZ2UgdGhlIHRlbnNvci4gVGhpcyBpcyBub3RcbiAqIGEgZmVhdHVyZSBhbmQgaXMgbm90IHN1cHBvcnRlZC4gVG8gYXZvaWQgdGhpcyBiZWhhdmlvciwgdXNlIHRoZSB0ZW5zb3IgYmVmb3JlXG4gKiBjaGFuZ2luZyB0aGUgaW5wdXQgZGF0YSBvciBjcmVhdGUgYSBjb3B5IHdpdGggYGNvcHkgPSB0Zi5hZGQoeW91clRlbnNvciwgMClgLlxuICpcbiAqIFNlZSBgdGYudGVuc29yYCBmb3IgZGV0YWlscyBvbiBob3cgdG8gY3JlYXRlIGEgYHRmLlRlbnNvcmAuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ2xhc3Nlcyd9XG4gKi9cbmV4cG9ydCBjbGFzcyBUZW5zb3Ige1xuICAgIGNvbnN0cnVjdG9yKHNoYXBlLCBkdHlwZSwgZGF0YUlkLCBpZCkge1xuICAgICAgICAvKiogV2hldGhlciB0aGlzIHRlbnNvciBoYXMgYmVlbiBnbG9iYWxseSBrZXB0LiAqL1xuICAgICAgICB0aGlzLmtlcHQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pc0Rpc3Bvc2VkSW50ZXJuYWwgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zaGFwZSA9IHNoYXBlLnNsaWNlKCk7XG4gICAgICAgIHRoaXMuZHR5cGUgPSBkdHlwZSB8fCAnZmxvYXQzMic7XG4gICAgICAgIHRoaXMuc2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShzaGFwZSk7XG4gICAgICAgIHRoaXMuc3RyaWRlcyA9IGNvbXB1dGVTdHJpZGVzKHNoYXBlKTtcbiAgICAgICAgdGhpcy5kYXRhSWQgPSBkYXRhSWQ7XG4gICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICAgICAgdGhpcy5yYW5rVHlwZSA9ICh0aGlzLnJhbmsgPCA1ID8gdGhpcy5yYW5rLnRvU3RyaW5nKCkgOiAnaGlnaGVyJyk7XG4gICAgfVxuICAgIGdldCByYW5rKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zaGFwZS5sZW5ndGg7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBwcm9taXNlIG9mIGB0Zi5UZW5zb3JCdWZmZXJgIHRoYXQgaG9sZHMgdGhlIHVuZGVybHlpbmcgZGF0YS5cbiAgICAgKlxuICAgICAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NsYXNzZXMnfVxuICAgICAqL1xuICAgIGFzeW5jIGJ1ZmZlcigpIHtcbiAgICAgICAgY29uc3QgdmFscyA9IGF3YWl0IHRoaXMuZGF0YSgpO1xuICAgICAgICByZXR1cm4gb3BIYW5kbGVyLmJ1ZmZlcih0aGlzLnNoYXBlLCB0aGlzLmR0eXBlLCB2YWxzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIGB0Zi5UZW5zb3JCdWZmZXJgIHRoYXQgaG9sZHMgdGhlIHVuZGVybHlpbmcgZGF0YS5cbiAgICAgKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAgICAgKi9cbiAgICBidWZmZXJTeW5jKCkge1xuICAgICAgICByZXR1cm4gb3BIYW5kbGVyLmJ1ZmZlcih0aGlzLnNoYXBlLCB0aGlzLmR0eXBlLCB0aGlzLmRhdGFTeW5jKCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB0ZW5zb3IgZGF0YSBhcyBhIG5lc3RlZCBhcnJheS4gVGhlIHRyYW5zZmVyIG9mIGRhdGEgaXMgZG9uZVxuICAgICAqIGFzeW5jaHJvbm91c2x5LlxuICAgICAqXG4gICAgICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ2xhc3Nlcyd9XG4gICAgICovXG4gICAgYXN5bmMgYXJyYXkoKSB7XG4gICAgICAgIGNvbnN0IHZhbHMgPSBhd2FpdCB0aGlzLmRhdGEoKTtcbiAgICAgICAgcmV0dXJuIHRvTmVzdGVkQXJyYXkodGhpcy5zaGFwZSwgdmFscywgdGhpcy5kdHlwZSA9PT0gJ2NvbXBsZXg2NCcpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB0ZW5zb3IgZGF0YSBhcyBhIG5lc3RlZCBhcnJheS4gVGhlIHRyYW5zZmVyIG9mIGRhdGEgaXMgZG9uZVxuICAgICAqIHN5bmNocm9ub3VzbHkuXG4gICAgICpcbiAgICAgKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAgICAgKi9cbiAgICBhcnJheVN5bmMoKSB7XG4gICAgICAgIHJldHVybiB0b05lc3RlZEFycmF5KHRoaXMuc2hhcGUsIHRoaXMuZGF0YVN5bmMoKSwgdGhpcy5kdHlwZSA9PT0gJ2NvbXBsZXg2NCcpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBc3luY2hyb25vdXNseSBkb3dubG9hZHMgdGhlIHZhbHVlcyBmcm9tIHRoZSBgdGYuVGVuc29yYC4gUmV0dXJucyBhXG4gICAgICogcHJvbWlzZSBvZiBgVHlwZWRBcnJheWAgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBjb21wdXRhdGlvbiBoYXMgZmluaXNoZWQuXG4gICAgICpcbiAgICAgKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAgICAgKi9cbiAgICBhc3luYyBkYXRhKCkge1xuICAgICAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgICAgICBjb25zdCBkYXRhID0gdHJhY2tlckZuKCkucmVhZCh0aGlzLmRhdGFJZCk7XG4gICAgICAgIGlmICh0aGlzLmR0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uc3QgYnl0ZXMgPSBhd2FpdCBkYXRhO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYnl0ZXMubWFwKGIgPT4gdXRpbC5kZWNvZGVTdHJpbmcoYikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKF9hKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gZGVjb2RlIHRoZSBzdHJpbmcgYnl0ZXMgaW50byB1dGYtOC4gJyArXG4gICAgICAgICAgICAgICAgICAgICdUbyBnZXQgdGhlIG9yaWdpbmFsIGJ5dGVzLCBjYWxsIHRlbnNvci5ieXRlcygpLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTeW5jaHJvbm91c2x5IGRvd25sb2FkcyB0aGUgdmFsdWVzIGZyb20gdGhlIGB0Zi5UZW5zb3JgLiBUaGlzIGJsb2NrcyB0aGVcbiAgICAgKiBVSSB0aHJlYWQgdW50aWwgdGhlIHZhbHVlcyBhcmUgcmVhZHksIHdoaWNoIGNhbiBjYXVzZSBwZXJmb3JtYW5jZSBpc3N1ZXMuXG4gICAgICpcbiAgICAgKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAgICAgKi9cbiAgICBkYXRhU3luYygpIHtcbiAgICAgICAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRyYWNrZXJGbigpLnJlYWRTeW5jKHRoaXMuZGF0YUlkKTtcbiAgICAgICAgaWYgKHRoaXMuZHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBkYXRhLm1hcChiID0+IHV0aWwuZGVjb2RlU3RyaW5nKGIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChfYSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGRlY29kZSB0aGUgc3RyaW5nIGJ5dGVzIGludG8gdXRmLTguICcgK1xuICAgICAgICAgICAgICAgICAgICAnVG8gZ2V0IHRoZSBvcmlnaW5hbCBieXRlcywgY2FsbCB0ZW5zb3IuYnl0ZXMoKS4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gICAgLyoqIFJldHVybnMgdGhlIHVuZGVybHlpbmcgYnl0ZXMgb2YgdGhlIHRlbnNvcidzIGRhdGEuICovXG4gICAgYXN5bmMgYnl0ZXMoKSB7XG4gICAgICAgIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0cmFja2VyRm4oKS5yZWFkKHRoaXMuZGF0YUlkKTtcbiAgICAgICAgaWYgKHRoaXMuZHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShkYXRhLmJ1ZmZlcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogRGlzcG9zZXMgYHRmLlRlbnNvcmAgZnJvbSBtZW1vcnkuXG4gICAgICpcbiAgICAgKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAgICAgKi9cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICBpZiAodGhpcy5pc0Rpc3Bvc2VkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdHJhY2tlckZuKCkuZGlzcG9zZVRlbnNvcih0aGlzKTtcbiAgICAgICAgdGhpcy5pc0Rpc3Bvc2VkSW50ZXJuYWwgPSB0cnVlO1xuICAgIH1cbiAgICBnZXQgaXNEaXNwb3NlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNEaXNwb3NlZEludGVybmFsO1xuICAgIH1cbiAgICB0aHJvd0lmRGlzcG9zZWQoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRGlzcG9zZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGVuc29yIGlzIGRpc3Bvc2VkLmApO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFByaW50cyB0aGUgYHRmLlRlbnNvcmAuIFNlZSBgdGYucHJpbnRgIGZvciBkZXRhaWxzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZlcmJvc2UgV2hldGhlciB0byBwcmludCB2ZXJib3NlIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0ZW5zb3IsXG4gICAgICogICAgaW5jbHVkaW5nIGR0eXBlIGFuZCBzaXplLlxuICAgICAqXG4gICAgICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ2xhc3Nlcyd9XG4gICAgICovXG4gICAgcHJpbnQodmVyYm9zZSA9IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBvcEhhbmRsZXIucHJpbnQodGhpcywgdmVyYm9zZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBjb3B5IG9mIHRoZSB0ZW5zb3IuIFNlZSBgdGYuY2xvbmVgIGZvciBkZXRhaWxzLlxuICAgICAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NsYXNzZXMnfVxuICAgICAqL1xuICAgIGNsb25lKCkge1xuICAgICAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgICAgICByZXR1cm4gb3BIYW5kbGVyLmNsb25lKHRoaXMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIHRlbnNvci4gVXNlZnVsIGZvciBsb2dnaW5nLlxuICAgICAqXG4gICAgICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ2xhc3Nlcyd9XG4gICAgICovXG4gICAgdG9TdHJpbmcodmVyYm9zZSA9IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IHZhbHMgPSB0aGlzLmRhdGFTeW5jKCk7XG4gICAgICAgIHJldHVybiB0ZW5zb3JUb1N0cmluZyh2YWxzLCB0aGlzLnNoYXBlLCB0aGlzLmR0eXBlLCB2ZXJib3NlKTtcbiAgICB9XG4gICAgY2FzdChkdHlwZSkge1xuICAgICAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgICAgICByZXR1cm4gb3BIYW5kbGVyLmNhc3QodGhpcywgZHR5cGUpO1xuICAgIH1cbiAgICB2YXJpYWJsZSh0cmFpbmFibGUgPSB0cnVlLCBuYW1lLCBkdHlwZSkge1xuICAgICAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgICAgICByZXR1cm4gdHJhY2tlckZuKCkubWFrZVZhcmlhYmxlKHRoaXMsIHRyYWluYWJsZSwgbmFtZSwgZHR5cGUpO1xuICAgIH1cbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShUZW5zb3IsIFN5bWJvbC5oYXNJbnN0YW5jZSwge1xuICAgIHZhbHVlOiAoaW5zdGFuY2UpID0+IHtcbiAgICAgICAgLy8gSW1wbGVtZW50YXRpb24gbm90ZTogd2Ugc2hvdWxkIHVzZSBwcm9wZXJ0aWVzIG9mIHRoZSBvYmplY3QgdGhhdCB3aWxsIGJlXG4gICAgICAgIC8vIGRlZmluZWQgYmVmb3JlIHRoZSBjb25zdHJ1Y3RvciBib2R5IGhhcyBmaW5pc2hlZCBleGVjdXRpbmcgKG1ldGhvZHMpLlxuICAgICAgICAvLyBUaGlzIGlzIGJlY2F1c2Ugd2hlbiB0aGlzIGNvZGUgaXMgdHJhbnNwaWxlZCBieSBiYWJlbCwgYmFiZWwgd2lsbCBjYWxsXG4gICAgICAgIC8vIGNsYXNzQ2FsbENoZWNrIGJlZm9yZSB0aGUgY29uc3RydWN0b3IgYm9keSBpcyBydW4uXG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZmpzL2lzc3Vlcy8zMzg0IGZvciBiYWNrc3RvcnkuXG4gICAgICAgIHJldHVybiAhIWluc3RhbmNlICYmIGluc3RhbmNlLmRhdGEgIT0gbnVsbCAmJiBpbnN0YW5jZS5kYXRhU3luYyAhPSBudWxsICYmXG4gICAgICAgICAgICBpbnN0YW5jZS50aHJvd0lmRGlzcG9zZWQgIT0gbnVsbDtcbiAgICB9XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBnZXRHbG9iYWxUZW5zb3JDbGFzcygpIHtcbiAgICAvLyBVc2UgZ2V0R2xvYmFsIHNvIHRoYXQgd2UgY2FuIGF1Z21lbnQgdGhlIFRlbnNvciBjbGFzcyBhY3Jvc3MgcGFja2FnZVxuICAgIC8vIGJvdW5kYXJpZXMgYmVjYXNlIHRoZSBub2RlIHJlc29sdXRpb24gYWxnIG1heSByZXN1bHQgaW4gZGlmZmVyZW50IG1vZHVsZXNcbiAgICAvLyBiZWluZyByZXR1cm5lZCBmb3IgdGhpcyBmaWxlIGRlcGVuZGluZyBvbiB0aGUgcGF0aCB0aGV5IGFyZSBsb2FkZWQgZnJvbS5cbiAgICByZXR1cm4gZ2V0R2xvYmFsKCdUZW5zb3InLCAoKSA9PiB7XG4gICAgICAgIHJldHVybiBUZW5zb3I7XG4gICAgfSk7XG59XG4vLyBHbG9iYWwgc2lkZSBlZmZlY3QuIENhY2hlIGdsb2JhbCByZWZlcmVuY2UgdG8gVGVuc29yIGNsYXNzXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpO1xuLyoqXG4gKiBBIG11dGFibGUgYHRmLlRlbnNvcmAsIHVzZWZ1bCBmb3IgcGVyc2lzdGluZyBzdGF0ZSwgZS5nLiBmb3IgdHJhaW5pbmcuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ2xhc3Nlcyd9XG4gKi9cbmV4cG9ydCBjbGFzcyBWYXJpYWJsZSBleHRlbmRzIFRlbnNvciB7XG4gICAgY29uc3RydWN0b3IoaW5pdGlhbFZhbHVlLCB0cmFpbmFibGUsIG5hbWUsIHRlbnNvcklkKSB7XG4gICAgICAgIHN1cGVyKGluaXRpYWxWYWx1ZS5zaGFwZSwgaW5pdGlhbFZhbHVlLmR0eXBlLCBpbml0aWFsVmFsdWUuZGF0YUlkLCB0ZW5zb3JJZCk7XG4gICAgICAgIHRoaXMudHJhaW5hYmxlID0gdHJhaW5hYmxlO1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBc3NpZ24gYSBuZXcgYHRmLlRlbnNvcmAgdG8gdGhpcyB2YXJpYWJsZS4gVGhlIG5ldyBgdGYuVGVuc29yYCBtdXN0IGhhdmVcbiAgICAgKiB0aGUgc2FtZSBzaGFwZSBhbmQgZHR5cGUgYXMgdGhlIG9sZCBgdGYuVGVuc29yYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBuZXdWYWx1ZSBOZXcgdGVuc29yIHRvIGJlIGFzc2lnbmVkIHRvIHRoaXMgdmFyaWFibGUuXG4gICAgICpcbiAgICAgKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAgICAgKi9cbiAgICBhc3NpZ24obmV3VmFsdWUpIHtcbiAgICAgICAgaWYgKG5ld1ZhbHVlLmR0eXBlICE9PSB0aGlzLmR0eXBlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGR0eXBlIG9mIHRoZSBuZXcgdmFsdWUgKCR7bmV3VmFsdWUuZHR5cGV9KSBhbmQgYCArXG4gICAgICAgICAgICAgICAgYHByZXZpb3VzIHZhbHVlICgke3RoaXMuZHR5cGV9KSBtdXN0IG1hdGNoYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF1dGlsLmFycmF5c0VxdWFsKG5ld1ZhbHVlLnNoYXBlLCB0aGlzLnNoYXBlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBzaGFwZSBvZiB0aGUgbmV3IHZhbHVlICgke25ld1ZhbHVlLnNoYXBlfSkgYW5kIGAgK1xuICAgICAgICAgICAgICAgIGBwcmV2aW91cyB2YWx1ZSAoJHt0aGlzLnNoYXBlfSkgbXVzdCBtYXRjaGApO1xuICAgICAgICB9XG4gICAgICAgIHRyYWNrZXJGbigpLmRpc3Bvc2VUZW5zb3IodGhpcyk7XG4gICAgICAgIHRoaXMuZGF0YUlkID0gbmV3VmFsdWUuZGF0YUlkO1xuICAgICAgICB0cmFja2VyRm4oKS5pbmNSZWYodGhpcywgbnVsbCAvKiBiYWNrZW5kICovKTtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgdHJhY2tlckZuKCkuZGlzcG9zZVZhcmlhYmxlKHRoaXMpO1xuICAgICAgICB0aGlzLmlzRGlzcG9zZWRJbnRlcm5hbCA9IHRydWU7XG4gICAgfVxufVxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFZhcmlhYmxlLCBTeW1ib2wuaGFzSW5zdGFuY2UsIHtcbiAgICB2YWx1ZTogKGluc3RhbmNlKSA9PiB7XG4gICAgICAgIHJldHVybiBpbnN0YW5jZSBpbnN0YW5jZW9mIFRlbnNvciAmJiBpbnN0YW5jZS5hc3NpZ24gIT0gbnVsbCAmJlxuICAgICAgICAgICAgaW5zdGFuY2UuYXNzaWduIGluc3RhbmNlb2YgRnVuY3Rpb247XG4gICAgfVxufSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10ZW5zb3IuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgY29tcHV0ZVN0cmlkZXMsIGlzU3RyaW5nLCByaWdodFBhZCwgc2l6ZUZyb21TaGFwZSB9IGZyb20gJy4vdXRpbCc7XG4vLyBNYXhpbXVtIG51bWJlciBvZiB2YWx1ZXMgYmVmb3JlIHdlIGRlY2lkZSB0byBzaG93IGVsbGlwc2lzLlxuY29uc3QgRk9STUFUX0xJTUlUX05VTV9WQUxTID0gMjA7XG4vLyBOdW1iZXIgb2YgZmlyc3QgYW5kIGxhc3QgdmFsdWVzIHRvIHNob3cgd2hlbiBkaXNwbGF5aW5nIGEsIGIsLi4uLHksIHouXG5jb25zdCBGT1JNQVRfTlVNX0ZJUlNUX0xBU1RfVkFMUyA9IDM7XG4vLyBOdW1iZXIgb2Ygc2lnbmlmaWNhbnQgZGlnaXRzIHRvIHNob3cuXG5jb25zdCBGT1JNQVRfTlVNX1NJR19ESUdJVFMgPSA3O1xuZXhwb3J0IGZ1bmN0aW9uIHRlbnNvclRvU3RyaW5nKHZhbHMsIHNoYXBlLCBkdHlwZSwgdmVyYm9zZSkge1xuICAgIGNvbnN0IHN0cmlkZXMgPSBjb21wdXRlU3RyaWRlcyhzaGFwZSk7XG4gICAgY29uc3QgcGFkUGVyQ29sID0gY29tcHV0ZU1heFNpemVQZXJDb2x1bW4odmFscywgc2hhcGUsIGR0eXBlLCBzdHJpZGVzKTtcbiAgICBjb25zdCByYW5rID0gc2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IHZhbHNMaW5lcyA9IHN1YlRlbnNvclRvU3RyaW5nKHZhbHMsIHNoYXBlLCBkdHlwZSwgc3RyaWRlcywgcGFkUGVyQ29sKTtcbiAgICBjb25zdCBsaW5lcyA9IFsnVGVuc29yJ107XG4gICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgICAgbGluZXMucHVzaChgICBkdHlwZTogJHtkdHlwZX1gKTtcbiAgICAgICAgbGluZXMucHVzaChgICByYW5rOiAke3Jhbmt9YCk7XG4gICAgICAgIGxpbmVzLnB1c2goYCAgc2hhcGU6IFske3NoYXBlfV1gKTtcbiAgICAgICAgbGluZXMucHVzaChgICB2YWx1ZXM6YCk7XG4gICAgfVxuICAgIGxpbmVzLnB1c2godmFsc0xpbmVzLm1hcChsID0+ICcgICAgJyArIGwpLmpvaW4oJ1xcbicpKTtcbiAgICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG59XG5mdW5jdGlvbiBjb21wdXRlTWF4U2l6ZVBlckNvbHVtbih2YWxzLCBzaGFwZSwgZHR5cGUsIHN0cmlkZXMpIHtcbiAgICBjb25zdCBuID0gc2l6ZUZyb21TaGFwZShzaGFwZSk7XG4gICAgY29uc3QgbnVtQ29scyA9IHN0cmlkZXNbc3RyaWRlcy5sZW5ndGggLSAxXTtcbiAgICBjb25zdCBwYWRQZXJDb2wgPSBuZXcgQXJyYXkobnVtQ29scykuZmlsbCgwKTtcbiAgICBjb25zdCByYW5rID0gc2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IHZhbHVlc09yVHVwbGVzID0gZHR5cGUgPT09ICdjb21wbGV4NjQnID8gY3JlYXRlQ29tcGxleFR1cGxlcyh2YWxzKSA6IHZhbHM7XG4gICAgaWYgKHJhbmsgPiAxKSB7XG4gICAgICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IG4gLyBudW1Db2xzOyByb3crKykge1xuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gcm93ICogbnVtQ29scztcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbnVtQ29sczsgaisrKSB7XG4gICAgICAgICAgICAgICAgcGFkUGVyQ29sW2pdID0gTWF0aC5tYXgocGFkUGVyQ29sW2pdLCB2YWxUb1N0cmluZyh2YWx1ZXNPclR1cGxlc1tvZmZzZXQgKyBqXSwgMCwgZHR5cGUpLmxlbmd0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBhZFBlckNvbDtcbn1cbmZ1bmN0aW9uIHZhbFRvU3RyaW5nKHZhbCwgcGFkLCBkdHlwZSkge1xuICAgIGxldCB2YWxTdHI7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgICB2YWxTdHIgPSBgJHtwYXJzZUZsb2F0KHZhbFswXS50b0ZpeGVkKEZPUk1BVF9OVU1fU0lHX0RJR0lUUykpfSArIGAgK1xuICAgICAgICAgICAgYCR7cGFyc2VGbG9hdCh2YWxbMV0udG9GaXhlZChGT1JNQVRfTlVNX1NJR19ESUdJVFMpKX1qYDtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNTdHJpbmcodmFsKSkge1xuICAgICAgICB2YWxTdHIgPSBgJyR7dmFsfSdgO1xuICAgIH1cbiAgICBlbHNlIGlmIChkdHlwZSA9PT0gJ2Jvb2wnKSB7XG4gICAgICAgIHZhbFN0ciA9IGJvb2xOdW1Ub1N0cmluZyh2YWwpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdmFsU3RyID0gcGFyc2VGbG9hdCh2YWwudG9GaXhlZChGT1JNQVRfTlVNX1NJR19ESUdJVFMpKS50b1N0cmluZygpO1xuICAgIH1cbiAgICByZXR1cm4gcmlnaHRQYWQodmFsU3RyLCBwYWQpO1xufVxuZnVuY3Rpb24gYm9vbE51bVRvU3RyaW5nKHYpIHtcbiAgICByZXR1cm4gdiA9PT0gMCA/ICdmYWxzZScgOiAndHJ1ZSc7XG59XG5mdW5jdGlvbiBzdWJUZW5zb3JUb1N0cmluZyh2YWxzLCBzaGFwZSwgZHR5cGUsIHN0cmlkZXMsIHBhZFBlckNvbCwgaXNMYXN0ID0gdHJ1ZSkge1xuICAgIGNvbnN0IHN0b3JhZ2VQZXJFbGVtZW50ID0gZHR5cGUgPT09ICdjb21wbGV4NjQnID8gMiA6IDE7XG4gICAgY29uc3Qgc2l6ZSA9IHNoYXBlWzBdO1xuICAgIGNvbnN0IHJhbmsgPSBzaGFwZS5sZW5ndGg7XG4gICAgaWYgKHJhbmsgPT09IDApIHtcbiAgICAgICAgaWYgKGR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgICAgICAgICAgY29uc3QgY29tcGxleFR1cGxlID0gY3JlYXRlQ29tcGxleFR1cGxlcyh2YWxzKTtcbiAgICAgICAgICAgIHJldHVybiBbdmFsVG9TdHJpbmcoY29tcGxleFR1cGxlWzBdLCAwLCBkdHlwZSldO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkdHlwZSA9PT0gJ2Jvb2wnKSB7XG4gICAgICAgICAgICByZXR1cm4gW2Jvb2xOdW1Ub1N0cmluZyh2YWxzWzBdKV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFt2YWxzWzBdLnRvU3RyaW5nKCldO1xuICAgIH1cbiAgICBpZiAocmFuayA9PT0gMSkge1xuICAgICAgICBpZiAoc2l6ZSA+IEZPUk1BVF9MSU1JVF9OVU1fVkFMUykge1xuICAgICAgICAgICAgY29uc3QgZmlyc3RWYWxzU2l6ZSA9IEZPUk1BVF9OVU1fRklSU1RfTEFTVF9WQUxTICogc3RvcmFnZVBlckVsZW1lbnQ7XG4gICAgICAgICAgICBsZXQgZmlyc3RWYWxzID0gQXJyYXkuZnJvbSh2YWxzLnNsaWNlKDAsIGZpcnN0VmFsc1NpemUpKTtcbiAgICAgICAgICAgIGxldCBsYXN0VmFscyA9IEFycmF5LmZyb20odmFscy5zbGljZSgoc2l6ZSAtIEZPUk1BVF9OVU1fRklSU1RfTEFTVF9WQUxTKSAqIHN0b3JhZ2VQZXJFbGVtZW50LCBzaXplICogc3RvcmFnZVBlckVsZW1lbnQpKTtcbiAgICAgICAgICAgIGlmIChkdHlwZSA9PT0gJ2NvbXBsZXg2NCcpIHtcbiAgICAgICAgICAgICAgICBmaXJzdFZhbHMgPSBjcmVhdGVDb21wbGV4VHVwbGVzKGZpcnN0VmFscyk7XG4gICAgICAgICAgICAgICAgbGFzdFZhbHMgPSBjcmVhdGVDb21wbGV4VHVwbGVzKGxhc3RWYWxzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgJ1snICtcbiAgICAgICAgICAgICAgICAgICAgZmlyc3RWYWxzLm1hcCgoeCwgaSkgPT4gdmFsVG9TdHJpbmcoeCwgcGFkUGVyQ29sW2ldLCBkdHlwZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAuam9pbignLCAnKSArXG4gICAgICAgICAgICAgICAgICAgICcsIC4uLiwgJyArXG4gICAgICAgICAgICAgICAgICAgIGxhc3RWYWxzXG4gICAgICAgICAgICAgICAgICAgICAgICAubWFwKCh4LCBpKSA9PiB2YWxUb1N0cmluZyh4LCBwYWRQZXJDb2xbc2l6ZSAtIEZPUk1BVF9OVU1fRklSU1RfTEFTVF9WQUxTICsgaV0sIGR0eXBlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5qb2luKCcsICcpICtcbiAgICAgICAgICAgICAgICAgICAgJ10nXG4gICAgICAgICAgICBdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRpc3BsYXlWYWxzID0gZHR5cGUgPT09ICdjb21wbGV4NjQnID8gY3JlYXRlQ29tcGxleFR1cGxlcyh2YWxzKSA6XG4gICAgICAgICAgICBBcnJheS5mcm9tKHZhbHMpO1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgJ1snICtcbiAgICAgICAgICAgICAgICBkaXNwbGF5VmFscy5tYXAoKHgsIGkpID0+IHZhbFRvU3RyaW5nKHgsIHBhZFBlckNvbFtpXSwgZHR5cGUpKVxuICAgICAgICAgICAgICAgICAgICAuam9pbignLCAnKSArXG4gICAgICAgICAgICAgICAgJ10nXG4gICAgICAgIF07XG4gICAgfVxuICAgIC8vIFRoZSBhcnJheSBpcyByYW5rIDIgb3IgbW9yZS5cbiAgICBjb25zdCBzdWJzaGFwZSA9IHNoYXBlLnNsaWNlKDEpO1xuICAgIGNvbnN0IHN1YnN0cmlkZXMgPSBzdHJpZGVzLnNsaWNlKDEpO1xuICAgIGNvbnN0IHN0cmlkZSA9IHN0cmlkZXNbMF0gKiBzdG9yYWdlUGVyRWxlbWVudDtcbiAgICBjb25zdCBsaW5lcyA9IFtdO1xuICAgIGlmIChzaXplID4gRk9STUFUX0xJTUlUX05VTV9WQUxTKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgRk9STUFUX05VTV9GSVJTVF9MQVNUX1ZBTFM7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBpICogc3RyaWRlO1xuICAgICAgICAgICAgY29uc3QgZW5kID0gc3RhcnQgKyBzdHJpZGU7XG4gICAgICAgICAgICBsaW5lcy5wdXNoKC4uLnN1YlRlbnNvclRvU3RyaW5nKHZhbHMuc2xpY2Uoc3RhcnQsIGVuZCksIHN1YnNoYXBlLCBkdHlwZSwgc3Vic3RyaWRlcywgcGFkUGVyQ29sLCBmYWxzZSAvKiBpc0xhc3QgKi8pKTtcbiAgICAgICAgfVxuICAgICAgICBsaW5lcy5wdXNoKCcuLi4nKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHNpemUgLSBGT1JNQVRfTlVNX0ZJUlNUX0xBU1RfVkFMUzsgaSA8IHNpemU7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBpICogc3RyaWRlO1xuICAgICAgICAgICAgY29uc3QgZW5kID0gc3RhcnQgKyBzdHJpZGU7XG4gICAgICAgICAgICBsaW5lcy5wdXNoKC4uLnN1YlRlbnNvclRvU3RyaW5nKHZhbHMuc2xpY2Uoc3RhcnQsIGVuZCksIHN1YnNoYXBlLCBkdHlwZSwgc3Vic3RyaWRlcywgcGFkUGVyQ29sLCBpID09PSBzaXplIC0gMSAvKiBpc0xhc3QgKi8pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gaSAqIHN0cmlkZTtcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHN0YXJ0ICsgc3RyaWRlO1xuICAgICAgICAgICAgbGluZXMucHVzaCguLi5zdWJUZW5zb3JUb1N0cmluZyh2YWxzLnNsaWNlKHN0YXJ0LCBlbmQpLCBzdWJzaGFwZSwgZHR5cGUsIHN1YnN0cmlkZXMsIHBhZFBlckNvbCwgaSA9PT0gc2l6ZSAtIDEgLyogaXNMYXN0ICovKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgc2VwID0gcmFuayA9PT0gMiA/ICcsJyA6ICcnO1xuICAgIGxpbmVzWzBdID0gJ1snICsgbGluZXNbMF0gKyBzZXA7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBsaW5lcy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgbGluZXNbaV0gPSAnICcgKyBsaW5lc1tpXSArIHNlcDtcbiAgICB9XG4gICAgbGV0IG5ld0xpbmVTZXAgPSAnLFxcbic7XG4gICAgZm9yIChsZXQgaSA9IDI7IGkgPCByYW5rOyBpKyspIHtcbiAgICAgICAgbmV3TGluZVNlcCArPSAnXFxuJztcbiAgICB9XG4gICAgbGluZXNbbGluZXMubGVuZ3RoIC0gMV0gPVxuICAgICAgICAnICcgKyBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXSArICddJyArIChpc0xhc3QgPyAnJyA6IG5ld0xpbmVTZXApO1xuICAgIHJldHVybiBsaW5lcztcbn1cbmZ1bmN0aW9uIGNyZWF0ZUNvbXBsZXhUdXBsZXModmFscykge1xuICAgIGNvbnN0IGNvbXBsZXhUdXBsZXMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgY29tcGxleFR1cGxlcy5wdXNoKFt2YWxzW2ldLCB2YWxzW2kgKyAxXV0pO1xuICAgIH1cbiAgICByZXR1cm4gY29tcGxleFR1cGxlcztcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRlbnNvcl9mb3JtYXQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgVGVuc29yIH0gZnJvbSAnLi90ZW5zb3InO1xuaW1wb3J0IHsgdXBjYXN0VHlwZSB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi91dGlsJztcbmV4cG9ydCBmdW5jdGlvbiBtYWtlVHlwZXNNYXRjaChhLCBiKSB7XG4gICAgaWYgKGEuZHR5cGUgPT09IGIuZHR5cGUpIHtcbiAgICAgICAgcmV0dXJuIFthLCBiXTtcbiAgICB9XG4gICAgY29uc3QgZHR5cGUgPSB1cGNhc3RUeXBlKGEuZHR5cGUsIGIuZHR5cGUpO1xuICAgIHJldHVybiBbYS5jYXN0KGR0eXBlKSwgYi5jYXN0KGR0eXBlKV07XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VHlwZXNNYXRjaChhLCBiKSB7XG4gICAgYXNzZXJ0KGEuZHR5cGUgPT09IGIuZHR5cGUsICgpID0+IGBUaGUgZHR5cGVzIG9mIHRoZSBmaXJzdCgke2EuZHR5cGV9KSBhbmRgICtcbiAgICAgICAgYCBzZWNvbmQoJHtiLmR0eXBlfSkgaW5wdXQgbXVzdCBtYXRjaGApO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVGVuc29ySW5MaXN0KHRlbnNvciwgdGVuc29yTGlzdCkge1xuICAgIHJldHVybiB0ZW5zb3JMaXN0LnNvbWUoeCA9PiB4LmlkID09PSB0ZW5zb3IuaWQpO1xufVxuLyoqXG4gKiBFeHRyYWN0cyBhbnkgYFRlbnNvcmBzIGZvdW5kIHdpdGhpbiB0aGUgcHJvdmlkZWQgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSBjb250YWluZXIgYW4gb2JqZWN0IHRoYXQgbWF5IGJlIGEgYFRlbnNvcmAgb3IgbWF5IGRpcmVjdGx5IGNvbnRhaW5cbiAqICAgYFRlbnNvcmBzLCBzdWNoIGFzIGEgYFRlbnNvcltdYCBvciBge2tleTogVGVuc29yLCAuLi59YC4gSW4gZ2VuZXJhbCBpdFxuICogICBpcyBzYWZlIHRvIHBhc3MgYW55IG9iamVjdCBoZXJlLCBleGNlcHQgdGhhdCBgUHJvbWlzZWBzIGFyZSBub3RcbiAqICAgc3VwcG9ydGVkLlxuICogQHJldHVybnMgQW4gYXJyYXkgb2YgYFRlbnNvcnNgIGZvdW5kIHdpdGhpbiB0aGUgcGFzc2VkIG9iamVjdC4gSWYgdGhlXG4gKiAgIGFyZ3VtZW50IGlzIHNpbXBseSBhIGBUZW5zb3InLCBhIGxpc3QgY29udGFpbmluZyB0aGF0IGBUZW5zb3JgIGlzXG4gKiAgIHJldHVybmVkLiBJZiB0aGUgb2JqZWN0IGlzIG5vdCBhIGBUZW5zb3JgIG9yIGRvZXMgbm90XG4gKiAgIGNvbnRhaW4gYFRlbnNvcnNgLCBhbiBlbXB0eSBsaXN0IGlzIHJldHVybmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGVuc29yc0luQ29udGFpbmVyKHJlc3VsdCkge1xuICAgIGNvbnN0IGxpc3QgPSBbXTtcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldCgpO1xuICAgIHdhbGtUZW5zb3JDb250YWluZXIocmVzdWx0LCBsaXN0LCBzZWVuKTtcbiAgICByZXR1cm4gbGlzdDtcbn1cbmZ1bmN0aW9uIHdhbGtUZW5zb3JDb250YWluZXIoY29udGFpbmVyLCBsaXN0LCBzZWVuKSB7XG4gICAgaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFRlbnNvcikge1xuICAgICAgICBsaXN0LnB1c2goY29udGFpbmVyKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIWlzSXRlcmFibGUoY29udGFpbmVyKSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIEl0ZXJhdGlvbiBvdmVyIGtleXMgd29ya3MgYWxzbyBmb3IgYXJyYXlzLlxuICAgIGNvbnN0IGl0ZXJhYmxlID0gY29udGFpbmVyO1xuICAgIGZvciAoY29uc3QgayBpbiBpdGVyYWJsZSkge1xuICAgICAgICBjb25zdCB2YWwgPSBpdGVyYWJsZVtrXTtcbiAgICAgICAgaWYgKCFzZWVuLmhhcyh2YWwpKSB7XG4gICAgICAgICAgICBzZWVuLmFkZCh2YWwpO1xuICAgICAgICAgICAgd2Fsa1RlbnNvckNvbnRhaW5lcih2YWwsIGxpc3QsIHNlZW4pO1xuICAgICAgICB9XG4gICAgfVxufVxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuZnVuY3Rpb24gaXNJdGVyYWJsZShvYmopIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShvYmopIHx8IHR5cGVvZiBvYmogPT09ICdvYmplY3QnO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGVuc29yX3V0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi9lbmdpbmUnO1xuaW1wb3J0IHsgZW52IH0gZnJvbSAnLi9lbnZpcm9ubWVudCc7XG5pbXBvcnQgeyBUZW5zb3IgfSBmcm9tICcuL3RlbnNvcic7XG5pbXBvcnQgeyBhc3NlcnQsIGZsYXR0ZW4sIGluZmVyRHR5cGUsIGlzVHlwZWRBcnJheSwgdG9UeXBlZEFycmF5IH0gZnJvbSAnLi91dGlsJztcbmV4cG9ydCBmdW5jdGlvbiBpbmZlclNoYXBlKHZhbCwgZHR5cGUpIHtcbiAgICBsZXQgZmlyc3RFbGVtID0gdmFsO1xuICAgIGlmIChpc1R5cGVkQXJyYXkodmFsKSkge1xuICAgICAgICByZXR1cm4gZHR5cGUgPT09ICdzdHJpbmcnID8gW10gOiBbdmFsLmxlbmd0aF07XG4gICAgfVxuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICAgIHJldHVybiBbXTsgLy8gU2NhbGFyLlxuICAgIH1cbiAgICBjb25zdCBzaGFwZSA9IFtdO1xuICAgIHdoaWxlIChBcnJheS5pc0FycmF5KGZpcnN0RWxlbSkgfHxcbiAgICAgICAgaXNUeXBlZEFycmF5KGZpcnN0RWxlbSkgJiYgZHR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHNoYXBlLnB1c2goZmlyc3RFbGVtLmxlbmd0aCk7XG4gICAgICAgIGZpcnN0RWxlbSA9IGZpcnN0RWxlbVswXTtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSAmJlxuICAgICAgICBlbnYoKS5nZXRCb29sKCdURU5TT1JMSUtFX0NIRUNLX1NIQVBFX0NPTlNJU1RFTkNZJykpIHtcbiAgICAgICAgZGVlcEFzc2VydFNoYXBlQ29uc2lzdGVuY3kodmFsLCBzaGFwZSwgW10pO1xuICAgIH1cbiAgICByZXR1cm4gc2hhcGU7XG59XG5mdW5jdGlvbiBkZWVwQXNzZXJ0U2hhcGVDb25zaXN0ZW5jeSh2YWwsIHNoYXBlLCBpbmRpY2VzKSB7XG4gICAgaW5kaWNlcyA9IGluZGljZXMgfHwgW107XG4gICAgaWYgKCEoQXJyYXkuaXNBcnJheSh2YWwpKSAmJiAhaXNUeXBlZEFycmF5KHZhbCkpIHtcbiAgICAgICAgYXNzZXJ0KHNoYXBlLmxlbmd0aCA9PT0gMCwgKCkgPT4gYEVsZW1lbnQgYXJyWyR7aW5kaWNlcy5qb2luKCddWycpfV0gaXMgYSBwcmltaXRpdmUsIGAgK1xuICAgICAgICAgICAgYGJ1dCBzaG91bGQgYmUgYW4gYXJyYXkvVHlwZWRBcnJheSBvZiAke3NoYXBlWzBdfSBlbGVtZW50c2ApO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGFzc2VydChzaGFwZS5sZW5ndGggPiAwLCAoKSA9PiBgRWxlbWVudCBhcnJbJHtpbmRpY2VzLmpvaW4oJ11bJyl9XSBzaG91bGQgYmUgYSBwcmltaXRpdmUsIGAgK1xuICAgICAgICBgYnV0IGlzIGFuIGFycmF5IG9mICR7dmFsLmxlbmd0aH0gZWxlbWVudHNgKTtcbiAgICBhc3NlcnQodmFsLmxlbmd0aCA9PT0gc2hhcGVbMF0sICgpID0+IGBFbGVtZW50IGFyclske2luZGljZXMuam9pbignXVsnKX1dIHNob3VsZCBoYXZlICR7c2hhcGVbMF19IGAgK1xuICAgICAgICBgZWxlbWVudHMsIGJ1dCBoYXMgJHt2YWwubGVuZ3RofSBlbGVtZW50c2ApO1xuICAgIGNvbnN0IHN1YlNoYXBlID0gc2hhcGUuc2xpY2UoMSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgZGVlcEFzc2VydFNoYXBlQ29uc2lzdGVuY3kodmFsW2ldLCBzdWJTaGFwZSwgaW5kaWNlcy5jb25jYXQoaSkpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGFzc2VydER0eXBlKGV4cGVjdGVkRHR5cGUsIGFjdHVhbERUeXBlLCBhcmdOYW1lLCBmdW5jdGlvbk5hbWUpIHtcbiAgICBpZiAoZXhwZWN0ZWREdHlwZSA9PT0gJ3N0cmluZ19vcl9udW1lcmljJykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChleHBlY3RlZER0eXBlID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBkdHlwZSBjYW5ub3QgYmUgbnVsbC5gKTtcbiAgICB9XG4gICAgaWYgKGV4cGVjdGVkRHR5cGUgIT09ICdudW1lcmljJyAmJiBleHBlY3RlZER0eXBlICE9PSBhY3R1YWxEVHlwZSB8fFxuICAgICAgICBleHBlY3RlZER0eXBlID09PSAnbnVtZXJpYycgJiYgYWN0dWFsRFR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQXJndW1lbnQgJyR7YXJnTmFtZX0nIHBhc3NlZCB0byAnJHtmdW5jdGlvbk5hbWV9JyBtdXN0IGAgK1xuICAgICAgICAgICAgYGJlICR7ZXhwZWN0ZWREdHlwZX0gdGVuc29yLCBidXQgZ290ICR7YWN0dWFsRFR5cGV9IHRlbnNvcmApO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0VG9UZW5zb3IoeCwgYXJnTmFtZSwgZnVuY3Rpb25OYW1lLCBwYXJzZUFzRHR5cGUgPSAnbnVtZXJpYycpIHtcbiAgICBpZiAoeCBpbnN0YW5jZW9mIFRlbnNvcikge1xuICAgICAgICBhc3NlcnREdHlwZShwYXJzZUFzRHR5cGUsIHguZHR5cGUsIGFyZ05hbWUsIGZ1bmN0aW9uTmFtZSk7XG4gICAgICAgIHJldHVybiB4O1xuICAgIH1cbiAgICBsZXQgaW5mZXJyZWREdHlwZSA9IGluZmVyRHR5cGUoeCk7XG4gICAgLy8gSWYgdGhlIHVzZXIgZXhwZWN0cyBhIGJvb2wvaW50L2Zsb2F0LCB1c2UgdGhhdCBpbmZvIHRvIHVwZGF0ZSB0aGVcbiAgICAvLyBpbmZlcnJlZER0eXBlIHdoZW4gaXQgaXMgbm90IGEgc3RyaW5nLlxuICAgIGlmIChpbmZlcnJlZER0eXBlICE9PSAnc3RyaW5nJyAmJlxuICAgICAgICBbJ2Jvb2wnLCAnaW50MzInLCAnZmxvYXQzMiddLmluZGV4T2YocGFyc2VBc0R0eXBlKSA+PSAwKSB7XG4gICAgICAgIGluZmVycmVkRHR5cGUgPSBwYXJzZUFzRHR5cGU7XG4gICAgfVxuICAgIGFzc2VydER0eXBlKHBhcnNlQXNEdHlwZSwgaW5mZXJyZWREdHlwZSwgYXJnTmFtZSwgZnVuY3Rpb25OYW1lKTtcbiAgICBpZiAoKHggPT0gbnVsbCkgfHxcbiAgICAgICAgKCFpc1R5cGVkQXJyYXkoeCkgJiYgIUFycmF5LmlzQXJyYXkoeCkgJiYgdHlwZW9mIHggIT09ICdudW1iZXInICYmXG4gICAgICAgICAgICB0eXBlb2YgeCAhPT0gJ2Jvb2xlYW4nICYmIHR5cGVvZiB4ICE9PSAnc3RyaW5nJykpIHtcbiAgICAgICAgY29uc3QgdHlwZSA9IHggPT0gbnVsbCA/ICdudWxsJyA6IHguY29uc3RydWN0b3IubmFtZTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBcmd1bWVudCAnJHthcmdOYW1lfScgcGFzc2VkIHRvICcke2Z1bmN0aW9uTmFtZX0nIG11c3QgYmUgYSBgICtcbiAgICAgICAgICAgIGBUZW5zb3Igb3IgVGVuc29yTGlrZSwgYnV0IGdvdCAnJHt0eXBlfSdgKTtcbiAgICB9XG4gICAgY29uc3QgaW5mZXJyZWRTaGFwZSA9IGluZmVyU2hhcGUoeCwgaW5mZXJyZWREdHlwZSk7XG4gICAgaWYgKCFpc1R5cGVkQXJyYXkoeCkgJiYgIUFycmF5LmlzQXJyYXkoeCkpIHtcbiAgICAgICAgeCA9IFt4XTtcbiAgICB9XG4gICAgY29uc3Qgc2tpcFR5cGVkQXJyYXkgPSB0cnVlO1xuICAgIGNvbnN0IHZhbHVlcyA9IGluZmVycmVkRHR5cGUgIT09ICdzdHJpbmcnID9cbiAgICAgICAgdG9UeXBlZEFycmF5KHgsIGluZmVycmVkRHR5cGUpIDpcbiAgICAgICAgZmxhdHRlbih4LCBbXSwgc2tpcFR5cGVkQXJyYXkpO1xuICAgIHJldHVybiBFTkdJTkUubWFrZVRlbnNvcih2YWx1ZXMsIGluZmVycmVkU2hhcGUsIGluZmVycmVkRHR5cGUpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRUb1RlbnNvckFycmF5KGFyZywgYXJnTmFtZSwgZnVuY3Rpb25OYW1lLCBwYXJzZUFzRHR5cGUgPSAnbnVtZXJpYycpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoYXJnKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFyZ3VtZW50ICR7YXJnTmFtZX0gcGFzc2VkIHRvICR7ZnVuY3Rpb25OYW1lfSBtdXN0IGJlIGEgYCArXG4gICAgICAgICAgICAnYFRlbnNvcltdYCBvciBgVGVuc29yTGlrZVtdYCcpO1xuICAgIH1cbiAgICBjb25zdCB0ZW5zb3JzID0gYXJnO1xuICAgIHJldHVybiB0ZW5zb3JzLm1hcCgodCwgaSkgPT4gY29udmVydFRvVGVuc29yKHQsIGAke2FyZ05hbWV9WyR7aX1dYCwgZnVuY3Rpb25OYW1lLCBwYXJzZUFzRHR5cGUpKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRlbnNvcl91dGlsX2Vudi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuL2VuZ2luZSc7XG5pbXBvcnQgeyBpbmZlclNoYXBlIH0gZnJvbSAnLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHsgYXJyYXlzRXF1YWwsIGVuY29kZVN0cmluZywgZmxhdHRlbiwgaXNTdHJpbmcsIGlzVHlwZWRBcnJheSB9IGZyb20gJy4vdXRpbCc7XG5jb25zdCBURVNUX0VQU0lMT05fRkxPQVQzMiA9IDFlLTM7XG5leHBvcnQgY29uc3QgVEVTVF9FUFNJTE9OX0ZMT0FUMTYgPSAxZS0xO1xuZXhwb3J0IGZ1bmN0aW9uIGV4cGVjdEFycmF5c0Nsb3NlKGFjdHVhbCwgZXhwZWN0ZWQsIGVwc2lsb24pIHtcbiAgICBpZiAoZXBzaWxvbiA9PSBudWxsKSB7XG4gICAgICAgIGVwc2lsb24gPSB0ZXN0RXBzaWxvbigpO1xuICAgIH1cbiAgICByZXR1cm4gZXhwZWN0QXJyYXlzUHJlZGljYXRlKGFjdHVhbCwgZXhwZWN0ZWQsIChhLCBiKSA9PiBhcmVDbG9zZShhLCBiLCBlcHNpbG9uKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gdGVzdEVwc2lsb24oKSB7XG4gICAgcmV0dXJuIEVOR0lORS5iYWNrZW5kLmZsb2F0UHJlY2lzaW9uKCkgPT09IDMyID8gVEVTVF9FUFNJTE9OX0ZMT0FUMzIgOlxuICAgICAgICBURVNUX0VQU0lMT05fRkxPQVQxNjtcbn1cbmZ1bmN0aW9uIGV4cGVjdEFycmF5c1ByZWRpY2F0ZShhY3R1YWwsIGV4cGVjdGVkLCBwcmVkaWNhdGUpIHtcbiAgICBsZXQgY2hlY2tDbGFzc1R5cGUgPSB0cnVlO1xuICAgIGlmIChpc1R5cGVkQXJyYXkoYWN0dWFsKSB8fCBpc1R5cGVkQXJyYXkoZXhwZWN0ZWQpKSB7XG4gICAgICAgIGNoZWNrQ2xhc3NUeXBlID0gZmFsc2U7XG4gICAgfVxuICAgIGlmIChpc1R5cGVkQXJyYXkoYWN0dWFsKSAmJiBpc1R5cGVkQXJyYXkoZXhwZWN0ZWQpKSB7XG4gICAgICAgIGNoZWNrQ2xhc3NUeXBlID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGNoZWNrQ2xhc3NUeXBlKSB7XG4gICAgICAgIGNvbnN0IGFUeXBlID0gYWN0dWFsLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgICAgIGNvbnN0IGJUeXBlID0gZXhwZWN0ZWQuY29uc3RydWN0b3IubmFtZTtcbiAgICAgICAgaWYgKGFUeXBlICE9PSBiVHlwZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBcnJheXMgYXJlIG9mIGRpZmZlcmVudCB0eXBlLiBBY3R1YWw6ICR7YVR5cGV9LiBgICtcbiAgICAgICAgICAgICAgICBgRXhwZWN0ZWQ6ICR7YlR5cGV9YCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYWN0dWFsKSAmJiBBcnJheS5pc0FycmF5KGV4cGVjdGVkKSkge1xuICAgICAgICBjb25zdCBhY3R1YWxTaGFwZSA9IGluZmVyU2hhcGUoYWN0dWFsKTtcbiAgICAgICAgY29uc3QgZXhwZWN0ZWRTaGFwZSA9IGluZmVyU2hhcGUoZXhwZWN0ZWQpO1xuICAgICAgICBpZiAoIWFycmF5c0VxdWFsKGFjdHVhbFNoYXBlLCBleHBlY3RlZFNoYXBlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBcnJheXMgaGF2ZSBkaWZmZXJlbnQgc2hhcGVzLiBgICtcbiAgICAgICAgICAgICAgICBgQWN0dWFsOiBbJHthY3R1YWxTaGFwZX1dLiBFeHBlY3RlZDogWyR7ZXhwZWN0ZWRTaGFwZX1dYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgYWN0dWFsRmxhdCA9IGlzVHlwZWRBcnJheShhY3R1YWwpID8gYWN0dWFsIDogZmxhdHRlbihhY3R1YWwpO1xuICAgIGNvbnN0IGV4cGVjdGVkRmxhdCA9IGlzVHlwZWRBcnJheShleHBlY3RlZCkgP1xuICAgICAgICBleHBlY3RlZCA6XG4gICAgICAgIGZsYXR0ZW4oZXhwZWN0ZWQpO1xuICAgIGlmIChhY3R1YWxGbGF0Lmxlbmd0aCAhPT0gZXhwZWN0ZWRGbGF0Lmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFycmF5cyBoYXZlIGRpZmZlcmVudCBsZW5ndGhzIGFjdHVhbDogJHthY3R1YWxGbGF0Lmxlbmd0aH0gdnMgYCArXG4gICAgICAgICAgICBgZXhwZWN0ZWQ6ICR7ZXhwZWN0ZWRGbGF0Lmxlbmd0aH0uXFxuYCArXG4gICAgICAgICAgICBgQWN0dWFsOiAgICR7YWN0dWFsRmxhdH0uXFxuYCArXG4gICAgICAgICAgICBgRXhwZWN0ZWQ6ICR7ZXhwZWN0ZWRGbGF0fS5gKTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHBlY3RlZEZsYXQubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY29uc3QgYSA9IGFjdHVhbEZsYXRbaV07XG4gICAgICAgIGNvbnN0IGUgPSBleHBlY3RlZEZsYXRbaV07XG4gICAgICAgIGlmICghcHJlZGljYXRlKGEsIGUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFycmF5cyBkaWZmZXI6IGFjdHVhbFske2l9XSA9ICR7YX0sIGV4cGVjdGVkWyR7aX1dID0gJHtlfS5cXG5gICtcbiAgICAgICAgICAgICAgICBgQWN0dWFsOiAgICR7YWN0dWFsRmxhdH0uXFxuYCArXG4gICAgICAgICAgICAgICAgYEV4cGVjdGVkOiAke2V4cGVjdGVkRmxhdH0uYCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gZXhwZWN0UHJvbWlzZVRvRmFpbChmbiwgZG9uZSkge1xuICAgIGZuKCkudGhlbigoKSA9PiBkb25lLmZhaWwoKSwgKCkgPT4gZG9uZSgpKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBleHBlY3RBcnJheXNFcXVhbChhY3R1YWwsIGV4cGVjdGVkKSB7XG4gICAgY29uc3QgZXhwID0gdHlwZW9mIGV4cGVjdGVkID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgZXhwZWN0ZWQgPT09ICdudW1iZXInIHx8XG4gICAgICAgIHR5cGVvZiBleHBlY3RlZCA9PT0gJ2Jvb2xlYW4nID9cbiAgICAgICAgW2V4cGVjdGVkXSA6XG4gICAgICAgIGV4cGVjdGVkO1xuICAgIGlmIChpc1N0cmluZyhhY3R1YWwpIHx8IGlzU3RyaW5nKGFjdHVhbFswXSkgfHxcbiAgICAgICAgaXNTdHJpbmcoZXhwZWN0ZWQpIHx8IGlzU3RyaW5nKGV4cGVjdGVkWzBdKSkge1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IHRyaXBsZS1lcXVhbHNcbiAgICAgICAgcmV0dXJuIGV4cGVjdEFycmF5c1ByZWRpY2F0ZShhY3R1YWwsIGV4cCwgKGEsIGIpID0+IGEgPT0gYik7XG4gICAgfVxuICAgIHJldHVybiBleHBlY3RBcnJheXNQcmVkaWNhdGUoYWN0dWFsLCBleHBlY3RlZCwgKGEsIGIpID0+IGFyZUNsb3NlKGEsIGIsIDApKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBleHBlY3ROdW1iZXJzQ2xvc2UoYSwgZSwgZXBzaWxvbikge1xuICAgIGlmIChlcHNpbG9uID09IG51bGwpIHtcbiAgICAgICAgZXBzaWxvbiA9IHRlc3RFcHNpbG9uKCk7XG4gICAgfVxuICAgIGlmICghYXJlQ2xvc2UoYSwgZSwgZXBzaWxvbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBOdW1iZXJzIGRpZmZlcjogYWN0dWFsID09PSAke2F9LCBleHBlY3RlZCA9PT0gJHtlfWApO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGFyZUNsb3NlKGEsIGUsIGVwc2lsb24pIHtcbiAgICBpZiAoIWlzRmluaXRlKGEpICYmICFpc0Zpbml0ZShlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGlzTmFOKGEpIHx8IGlzTmFOKGUpIHx8IE1hdGguYWJzKGEgLSBlKSA+IGVwc2lsb24pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBleHBlY3RWYWx1ZXNJblJhbmdlKGFjdHVhbCwgbG93LCBoaWdoKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhY3R1YWwubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGFjdHVhbFtpXSA8IGxvdyB8fCBhY3R1YWxbaV0gPiBoaWdoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFZhbHVlIG91dCBvZiByYW5nZToke2FjdHVhbFtpXX0gbG93OiAke2xvd30sIGhpZ2g6ICR7aGlnaH1gKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBleHBlY3RBcnJheUJ1ZmZlcnNFcXVhbChhY3R1YWwsIGV4cGVjdGVkKSB7XG4gICAgLy8gU2FmYXJpICYgSmFzbWluZSBkb24ndCBsaWtlIGNvbXBhcmluZyBBcnJheUJ1ZmZlcnMgZGlyZWN0bHkuIFdyYXBwaW5nIGluXG4gICAgLy8gYSBGbG9hdDMyQXJyYXkgc29sdmVzIHRoaXMgaXNzdWUuXG4gICAgZXhwZWN0KG5ldyBGbG9hdDMyQXJyYXkoYWN0dWFsKSkudG9FcXVhbChuZXcgRmxvYXQzMkFycmF5KGV4cGVjdGVkKSk7XG59XG4vKiogRW5jb2RlcyBzdHJpbmdzIGludG8gdXRmLTggYnl0ZXMuICovXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlU3RyaW5ncyhhKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHZhbCA9IGFbaV07XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAgICAgICAgIGVuY29kZVN0cmluZ3ModmFsKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGFbaV0gPSBlbmNvZGVTdHJpbmcodmFsKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRlc3RfdXRpbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG4vLyBTbyB0eXBpbmdzIGNhbiBwcm9wYWdhdGUuXG5pbXBvcnQgeyBBZGFkZWx0YU9wdGltaXplciB9IGZyb20gJy4vb3B0aW1pemVycy9hZGFkZWx0YV9vcHRpbWl6ZXInO1xuaW1wb3J0IHsgQWRhZ3JhZE9wdGltaXplciB9IGZyb20gJy4vb3B0aW1pemVycy9hZGFncmFkX29wdGltaXplcic7XG5pbXBvcnQgeyBBZGFtT3B0aW1pemVyIH0gZnJvbSAnLi9vcHRpbWl6ZXJzL2FkYW1fb3B0aW1pemVyJztcbmltcG9ydCB7IEFkYW1heE9wdGltaXplciB9IGZyb20gJy4vb3B0aW1pemVycy9hZGFtYXhfb3B0aW1pemVyJztcbmltcG9ydCB7IE1vbWVudHVtT3B0aW1pemVyIH0gZnJvbSAnLi9vcHRpbWl6ZXJzL21vbWVudHVtX29wdGltaXplcic7XG5pbXBvcnQgeyBPcHRpbWl6ZXJDb25zdHJ1Y3RvcnMgfSBmcm9tICcuL29wdGltaXplcnMvb3B0aW1pemVyX2NvbnN0cnVjdG9ycyc7XG5pbXBvcnQgeyBSTVNQcm9wT3B0aW1pemVyIH0gZnJvbSAnLi9vcHRpbWl6ZXJzL3Jtc3Byb3Bfb3B0aW1pemVyJztcbmltcG9ydCB7IFNHRE9wdGltaXplciB9IGZyb20gJy4vb3B0aW1pemVycy9zZ2Rfb3B0aW1pemVyJztcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby11bnVzZWQtZXhwcmVzc2lvblxuW01vbWVudHVtT3B0aW1pemVyLCBTR0RPcHRpbWl6ZXIsIEFkYWRlbHRhT3B0aW1pemVyLCBBZGFncmFkT3B0aW1pemVyLFxuICAgIFJNU1Byb3BPcHRpbWl6ZXIsIEFkYW1heE9wdGltaXplciwgQWRhbU9wdGltaXplcl07XG5leHBvcnQgY29uc3QgdHJhaW4gPSB7XG4gICAgc2dkOiBPcHRpbWl6ZXJDb25zdHJ1Y3RvcnMuc2dkLFxuICAgIG1vbWVudHVtOiBPcHRpbWl6ZXJDb25zdHJ1Y3RvcnMubW9tZW50dW0sXG4gICAgYWRhZGVsdGE6IE9wdGltaXplckNvbnN0cnVjdG9ycy5hZGFkZWx0YSxcbiAgICBhZGFncmFkOiBPcHRpbWl6ZXJDb25zdHJ1Y3RvcnMuYWRhZ3JhZCxcbiAgICBybXNwcm9wOiBPcHRpbWl6ZXJDb25zdHJ1Y3RvcnMucm1zcHJvcCxcbiAgICBhZGFtYXg6IE9wdGltaXplckNvbnN0cnVjdG9ycy5hZGFtYXgsXG4gICAgYWRhbTogT3B0aW1pemVyQ29uc3RydWN0b3JzLmFkYW1cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD10cmFpbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5leHBvcnQgdmFyIFJhbms7XG4oZnVuY3Rpb24gKFJhbmspIHtcbiAgICBSYW5rW1wiUjBcIl0gPSBcIlIwXCI7XG4gICAgUmFua1tcIlIxXCJdID0gXCJSMVwiO1xuICAgIFJhbmtbXCJSMlwiXSA9IFwiUjJcIjtcbiAgICBSYW5rW1wiUjNcIl0gPSBcIlIzXCI7XG4gICAgUmFua1tcIlI0XCJdID0gXCJSNFwiO1xuICAgIFJhbmtbXCJSNVwiXSA9IFwiUjVcIjtcbiAgICBSYW5rW1wiUjZcIl0gPSBcIlI2XCI7XG59KShSYW5rIHx8IChSYW5rID0ge30pKTtcbi8vIExvb2tzIGZvciB1cGNhc3RpbmcgdHlwZXMuIFVzZWQsIGZvciBleGFtcGxlLCBpbiBvcGVyYXRpb25zIHdpdGggbWl4ZWQgZHR5cGVcbi8vIGlucHV0cy5cbnZhciBVcGNhc3RJbnQzMkFuZE1hcDtcbihmdW5jdGlvbiAoVXBjYXN0SW50MzJBbmRNYXApIHtcbiAgICBVcGNhc3RJbnQzMkFuZE1hcFtcImZsb2F0MzJcIl0gPSBcImZsb2F0MzJcIjtcbiAgICBVcGNhc3RJbnQzMkFuZE1hcFtcImludDMyXCJdID0gXCJpbnQzMlwiO1xuICAgIFVwY2FzdEludDMyQW5kTWFwW1wiYm9vbFwiXSA9IFwiaW50MzJcIjtcbiAgICBVcGNhc3RJbnQzMkFuZE1hcFtcImNvbXBsZXg2NFwiXSA9IFwiY29tcGxleDY0XCI7XG59KShVcGNhc3RJbnQzMkFuZE1hcCB8fCAoVXBjYXN0SW50MzJBbmRNYXAgPSB7fSkpO1xudmFyIFVwY2FzdEJvb2xBbmRNYXA7XG4oZnVuY3Rpb24gKFVwY2FzdEJvb2xBbmRNYXApIHtcbiAgICBVcGNhc3RCb29sQW5kTWFwW1wiZmxvYXQzMlwiXSA9IFwiZmxvYXQzMlwiO1xuICAgIFVwY2FzdEJvb2xBbmRNYXBbXCJpbnQzMlwiXSA9IFwiaW50MzJcIjtcbiAgICBVcGNhc3RCb29sQW5kTWFwW1wiYm9vbFwiXSA9IFwiYm9vbFwiO1xuICAgIFVwY2FzdEJvb2xBbmRNYXBbXCJjb21wbGV4NjRcIl0gPSBcImNvbXBsZXg2NFwiO1xufSkoVXBjYXN0Qm9vbEFuZE1hcCB8fCAoVXBjYXN0Qm9vbEFuZE1hcCA9IHt9KSk7XG52YXIgVXBjYXN0RmxvYXQzMkFuZE1hcDtcbihmdW5jdGlvbiAoVXBjYXN0RmxvYXQzMkFuZE1hcCkge1xuICAgIFVwY2FzdEZsb2F0MzJBbmRNYXBbXCJmbG9hdDMyXCJdID0gXCJmbG9hdDMyXCI7XG4gICAgVXBjYXN0RmxvYXQzMkFuZE1hcFtcImludDMyXCJdID0gXCJmbG9hdDMyXCI7XG4gICAgVXBjYXN0RmxvYXQzMkFuZE1hcFtcImJvb2xcIl0gPSBcImZsb2F0MzJcIjtcbiAgICBVcGNhc3RGbG9hdDMyQW5kTWFwW1wiY29tcGxleDY0XCJdID0gXCJjb21wbGV4NjRcIjtcbn0pKFVwY2FzdEZsb2F0MzJBbmRNYXAgfHwgKFVwY2FzdEZsb2F0MzJBbmRNYXAgPSB7fSkpO1xudmFyIFVwY2FzdENvbXBsZXg2NEFuZE1hcDtcbihmdW5jdGlvbiAoVXBjYXN0Q29tcGxleDY0QW5kTWFwKSB7XG4gICAgVXBjYXN0Q29tcGxleDY0QW5kTWFwW1wiZmxvYXQzMlwiXSA9IFwiY29tcGxleDY0XCI7XG4gICAgVXBjYXN0Q29tcGxleDY0QW5kTWFwW1wiaW50MzJcIl0gPSBcImNvbXBsZXg2NFwiO1xuICAgIFVwY2FzdENvbXBsZXg2NEFuZE1hcFtcImJvb2xcIl0gPSBcImNvbXBsZXg2NFwiO1xuICAgIFVwY2FzdENvbXBsZXg2NEFuZE1hcFtcImNvbXBsZXg2NFwiXSA9IFwiY29tcGxleDY0XCI7XG59KShVcGNhc3RDb21wbGV4NjRBbmRNYXAgfHwgKFVwY2FzdENvbXBsZXg2NEFuZE1hcCA9IHt9KSk7XG5jb25zdCB1cGNhc3RUeXBlTWFwID0ge1xuICAgICdmbG9hdDMyJzogVXBjYXN0RmxvYXQzMkFuZE1hcCxcbiAgICAnaW50MzInOiBVcGNhc3RJbnQzMkFuZE1hcCxcbiAgICAnYm9vbCc6IFVwY2FzdEJvb2xBbmRNYXAsXG4gICAgJ2NvbXBsZXg2NCc6IFVwY2FzdENvbXBsZXg2NEFuZE1hcFxufTtcbmV4cG9ydCBmdW5jdGlvbiB1cGNhc3RUeXBlKHR5cGVBLCB0eXBlQikge1xuICAgIGlmICh0eXBlQSA9PT0gJ3N0cmluZycgfHwgdHlwZUIgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmICh0eXBlQSA9PT0gJ3N0cmluZycgJiYgdHlwZUIgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gJ3N0cmluZyc7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW4gbm90IHVwY2FzdCAke3R5cGVBfSB3aXRoICR7dHlwZUJ9YCk7XG4gICAgfVxuICAgIHJldHVybiB1cGNhc3RUeXBlTWFwW3R5cGVBXVt0eXBlQl07XG59XG4vKiogUmV0dXJucyB0aGUgb3V0cHV0IHR5cGUgYWZ0ZXIgc3VtbWF0aW9uLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1bU91dFR5cGUodHlwZSkge1xuICAgIHJldHVybiB1cGNhc3RUeXBlKHR5cGUsICdpbnQzMicpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dHlwZXMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHsgZW52IH0gZnJvbSAnLi9lbnZpcm9ubWVudCc7XG5pbXBvcnQgKiBhcyBiYXNlIGZyb20gJy4vdXRpbF9iYXNlJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbF9iYXNlJztcbmV4cG9ydCAqIGZyb20gJy4vaGFzaF91dGlsJztcbi8qKlxuICogQ3JlYXRlIHR5cGVkIGFycmF5IGZvciBzY2FsYXIgdmFsdWUuIFVzZWQgZm9yIHN0b3JpbmcgaW4gYERhdGFTdG9yYWdlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNjYWxhclZhbHVlKHZhbHVlLCBkdHlwZSkge1xuICAgIGlmIChkdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIGVuY29kZVN0cmluZyh2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiB0b1R5cGVkQXJyYXkoW3ZhbHVlXSwgZHR5cGUpO1xufVxuZnVuY3Rpb24gbm9Db252ZXJzaW9uTmVlZGVkKGEsIGR0eXBlKSB7XG4gICAgcmV0dXJuIChhIGluc3RhbmNlb2YgRmxvYXQzMkFycmF5ICYmIGR0eXBlID09PSAnZmxvYXQzMicpIHx8XG4gICAgICAgIChhIGluc3RhbmNlb2YgSW50MzJBcnJheSAmJiBkdHlwZSA9PT0gJ2ludDMyJykgfHxcbiAgICAgICAgKGEgaW5zdGFuY2VvZiBVaW50OEFycmF5ICYmIGR0eXBlID09PSAnYm9vbCcpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHRvVHlwZWRBcnJheShhLCBkdHlwZSkge1xuICAgIGlmIChkdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY29udmVydCBhIHN0cmluZ1tdIHRvIGEgVHlwZWRBcnJheScpO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShhKSkge1xuICAgICAgICBhID0gYmFzZS5mbGF0dGVuKGEpO1xuICAgIH1cbiAgICBpZiAoZW52KCkuZ2V0Qm9vbCgnREVCVUcnKSkge1xuICAgICAgICBiYXNlLmNoZWNrQ29udmVyc2lvbkZvckVycm9ycyhhLCBkdHlwZSk7XG4gICAgfVxuICAgIGlmIChub0NvbnZlcnNpb25OZWVkZWQoYSwgZHR5cGUpKSB7XG4gICAgICAgIHJldHVybiBhO1xuICAgIH1cbiAgICBpZiAoZHR5cGUgPT0gbnVsbCB8fCBkdHlwZSA9PT0gJ2Zsb2F0MzInIHx8IGR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgICAgICByZXR1cm4gbmV3IEZsb2F0MzJBcnJheShhKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZHR5cGUgPT09ICdpbnQzMicpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnQzMkFycmF5KGEpO1xuICAgIH1cbiAgICBlbHNlIGlmIChkdHlwZSA9PT0gJ2Jvb2wnKSB7XG4gICAgICAgIGNvbnN0IGJvb2wgPSBuZXcgVWludDhBcnJheShhLmxlbmd0aCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYm9vbC5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgaWYgKE1hdGgucm91bmQoYVtpXSkgIT09IDApIHtcbiAgICAgICAgICAgICAgICBib29sW2ldID0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYm9vbDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBkYXRhIHR5cGUgJHtkdHlwZX1gKTtcbiAgICB9XG59XG4vKipcbiAqIFJldHVybnMgdGhlIGN1cnJlbnQgaGlnaC1yZXNvbHV0aW9uIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHJlbGF0aXZlIHRvIGFuXG4gKiBhcmJpdHJhcnkgdGltZSBpbiB0aGUgcGFzdC4gSXQgd29ya3MgYWNyb3NzIGRpZmZlcmVudCBwbGF0Zm9ybXMgKG5vZGUuanMsXG4gKiBicm93c2VycykuXG4gKlxuICogYGBganNcbiAqIGNvbnNvbGUubG9nKHRmLnV0aWwubm93KCkpO1xuICogYGBgXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1V0aWwnLCBuYW1lc3BhY2U6ICd1dGlsJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vdygpIHtcbiAgICByZXR1cm4gZW52KCkucGxhdGZvcm0ubm93KCk7XG59XG4vKipcbiAqIFJldHVybnMgYSBwbGF0Zm9ybS1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBvZlxuICogW2BmZXRjaGBdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9GZXRjaF9BUEkpLlxuICpcbiAqIElmIGBmZXRjaGAgaXMgZGVmaW5lZCBvbiB0aGUgZ2xvYmFsIG9iamVjdCAoYHdpbmRvd2AsIGBwcm9jZXNzYCwgZXRjLiksXG4gKiBgdGYudXRpbC5mZXRjaGAgcmV0dXJucyB0aGF0IGZ1bmN0aW9uLlxuICpcbiAqIElmIG5vdCwgYHRmLnV0aWwuZmV0Y2hgIHJldHVybnMgYSBwbGF0Zm9ybS1zcGVjaWZpYyBzb2x1dGlvbi5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgcmVzb3VyY2UgPSBhd2FpdCB0Zi51dGlsLmZldGNoKCdodHRwczovL3VucGtnLmNvbS9AdGVuc29yZmxvdy90ZmpzJyk7XG4gKiAvLyBoYW5kbGUgcmVzcG9uc2VcbiAqIGBgYFxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdVdGlsJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZldGNoKHBhdGgsIHJlcXVlc3RJbml0cykge1xuICAgIHJldHVybiBlbnYoKS5wbGF0Zm9ybS5mZXRjaChwYXRoLCByZXF1ZXN0SW5pdHMpO1xufVxuLyoqXG4gKiBFbmNvZGVzIHRoZSBwcm92aWRlZCBzdHJpbmcgaW50byBieXRlcyB1c2luZyB0aGUgcHJvdmlkZWQgZW5jb2Rpbmcgc2NoZW1lLlxuICpcbiAqIEBwYXJhbSBzIFRoZSBzdHJpbmcgdG8gZW5jb2RlLlxuICogQHBhcmFtIGVuY29kaW5nIFRoZSBlbmNvZGluZyBzY2hlbWUuIERlZmF1bHRzIHRvIHV0Zi04LlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdVdGlsJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZVN0cmluZyhzLCBlbmNvZGluZyA9ICd1dGYtOCcpIHtcbiAgICBlbmNvZGluZyA9IGVuY29kaW5nIHx8ICd1dGYtOCc7XG4gICAgcmV0dXJuIGVudigpLnBsYXRmb3JtLmVuY29kZShzLCBlbmNvZGluZyk7XG59XG4vKipcbiAqIERlY29kZXMgdGhlIHByb3ZpZGVkIGJ5dGVzIGludG8gYSBzdHJpbmcgdXNpbmcgdGhlIHByb3ZpZGVkIGVuY29kaW5nIHNjaGVtZS5cbiAqIEBwYXJhbSBieXRlcyBUaGUgYnl0ZXMgdG8gZGVjb2RlLlxuICpcbiAqIEBwYXJhbSBlbmNvZGluZyBUaGUgZW5jb2Rpbmcgc2NoZW1lLiBEZWZhdWx0cyB0byB1dGYtOC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVXRpbCd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVTdHJpbmcoYnl0ZXMsIGVuY29kaW5nID0gJ3V0Zi04Jykge1xuICAgIGVuY29kaW5nID0gZW5jb2RpbmcgfHwgJ3V0Zi04JztcbiAgICByZXR1cm4gZW52KCkucGxhdGZvcm0uZGVjb2RlKGJ5dGVzLCBlbmNvZGluZyk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD11dGlsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbi8qKlxuICogU2h1ZmZsZXMgdGhlIGFycmF5IGluLXBsYWNlIHVzaW5nIEZpc2hlci1ZYXRlcyBhbGdvcml0aG0uXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSBbMSwgMiwgMywgNCwgNV07XG4gKiB0Zi51dGlsLnNodWZmbGUoYSk7XG4gKiBjb25zb2xlLmxvZyhhKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBhcnJheSBUaGUgYXJyYXkgdG8gc2h1ZmZsZSBpbi1wbGFjZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVXRpbCcsIG5hbWVzcGFjZTogJ3V0aWwnfVxuICovXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG5leHBvcnQgZnVuY3Rpb24gc2h1ZmZsZShhcnJheSkge1xuICAgIGxldCBjb3VudGVyID0gYXJyYXkubGVuZ3RoO1xuICAgIGxldCBpbmRleCA9IDA7XG4gICAgLy8gV2hpbGUgdGhlcmUgYXJlIGVsZW1lbnRzIGluIHRoZSBhcnJheVxuICAgIHdoaWxlIChjb3VudGVyID4gMCkge1xuICAgICAgICAvLyBQaWNrIGEgcmFuZG9tIGluZGV4XG4gICAgICAgIGluZGV4ID0gKE1hdGgucmFuZG9tKCkgKiBjb3VudGVyKSB8IDA7XG4gICAgICAgIC8vIERlY3JlYXNlIGNvdW50ZXIgYnkgMVxuICAgICAgICBjb3VudGVyLS07XG4gICAgICAgIC8vIEFuZCBzd2FwIHRoZSBsYXN0IGVsZW1lbnQgd2l0aCBpdFxuICAgICAgICBzd2FwKGFycmF5LCBjb3VudGVyLCBpbmRleCk7XG4gICAgfVxufVxuLyoqXG4gKiBTaHVmZmxlcyB0d28gYXJyYXlzIGluLXBsYWNlIHRoZSBzYW1lIHdheSB1c2luZyBGaXNoZXItWWF0ZXMgYWxnb3JpdGhtLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gWzEsMiwzLDQsNV07XG4gKiBjb25zdCBiID0gWzExLDIyLDMzLDQ0LDU1XTtcbiAqIHRmLnV0aWwuc2h1ZmZsZUNvbWJvKGEsIGIpO1xuICogY29uc29sZS5sb2coYSwgYik7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gYXJyYXkgVGhlIGZpcnN0IGFycmF5IHRvIHNodWZmbGUgaW4tcGxhY2UuXG4gKiBAcGFyYW0gYXJyYXkyIFRoZSBzZWNvbmQgYXJyYXkgdG8gc2h1ZmZsZSBpbi1wbGFjZSB3aXRoIHRoZSBzYW1lIHBlcm11dGF0aW9uXG4gKiAgICAgYXMgdGhlIGZpcnN0IGFycmF5LlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdVdGlsJywgbmFtZXNwYWNlOiAndXRpbCd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaHVmZmxlQ29tYm8oXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG5hcnJheSwgXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG5hcnJheTIpIHtcbiAgICBpZiAoYXJyYXkubGVuZ3RoICE9PSBhcnJheTIubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQXJyYXkgc2l6ZXMgbXVzdCBtYXRjaCB0byBiZSBzaHVmZmxlZCB0b2dldGhlciBgICtcbiAgICAgICAgICAgIGBGaXJzdCBhcnJheSBsZW5ndGggd2FzICR7YXJyYXkubGVuZ3RofWAgK1xuICAgICAgICAgICAgYFNlY29uZCBhcnJheSBsZW5ndGggd2FzICR7YXJyYXkyLmxlbmd0aH1gKTtcbiAgICB9XG4gICAgbGV0IGNvdW50ZXIgPSBhcnJheS5sZW5ndGg7XG4gICAgbGV0IGluZGV4ID0gMDtcbiAgICAvLyBXaGlsZSB0aGVyZSBhcmUgZWxlbWVudHMgaW4gdGhlIGFycmF5XG4gICAgd2hpbGUgKGNvdW50ZXIgPiAwKSB7XG4gICAgICAgIC8vIFBpY2sgYSByYW5kb20gaW5kZXhcbiAgICAgICAgaW5kZXggPSAoTWF0aC5yYW5kb20oKSAqIGNvdW50ZXIpIHwgMDtcbiAgICAgICAgLy8gRGVjcmVhc2UgY291bnRlciBieSAxXG4gICAgICAgIGNvdW50ZXItLTtcbiAgICAgICAgLy8gQW5kIHN3YXAgdGhlIGxhc3QgZWxlbWVudCBvZiBlYWNoIGFycmF5IHdpdGggaXRcbiAgICAgICAgc3dhcChhcnJheSwgY291bnRlciwgaW5kZXgpO1xuICAgICAgICBzd2FwKGFycmF5MiwgY291bnRlciwgaW5kZXgpO1xuICAgIH1cbn1cbi8qKiBDbGFtcHMgYSB2YWx1ZSB0byBhIHNwZWNpZmllZCByYW5nZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGFtcChtaW4sIHgsIG1heCkge1xuICAgIHJldHVybiBNYXRoLm1heChtaW4sIE1hdGgubWluKHgsIG1heCkpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG5lYXJlc3RMYXJnZXJFdmVuKHZhbCkge1xuICAgIHJldHVybiB2YWwgJSAyID09PSAwID8gdmFsIDogdmFsICsgMTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBzd2FwKG9iamVjdCwgbGVmdCwgcmlnaHQpIHtcbiAgICBjb25zdCB0ZW1wID0gb2JqZWN0W2xlZnRdO1xuICAgIG9iamVjdFtsZWZ0XSA9IG9iamVjdFtyaWdodF07XG4gICAgb2JqZWN0W3JpZ2h0XSA9IHRlbXA7XG59XG5leHBvcnQgZnVuY3Rpb24gc3VtKGFycikge1xuICAgIGxldCBzdW0gPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHN1bSArPSBhcnJbaV07XG4gICAgfVxuICAgIHJldHVybiBzdW07XG59XG4vKipcbiAqIFJldHVybnMgYSBzYW1wbGUgZnJvbSBhIHVuaWZvcm0gW2EsIGIpIGRpc3RyaWJ1dGlvbi5cbiAqXG4gKiBAcGFyYW0gYSBUaGUgbWluaW11bSBzdXBwb3J0IChpbmNsdXNpdmUpLlxuICogQHBhcmFtIGIgVGhlIG1heGltdW0gc3VwcG9ydCAoZXhjbHVzaXZlKS5cbiAqIEByZXR1cm4gQSBwc2V1ZG9yYW5kb20gbnVtYmVyIG9uIHRoZSBoYWxmLW9wZW4gaW50ZXJ2YWwgW2EsYikuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByYW5kVW5pZm9ybShhLCBiKSB7XG4gICAgY29uc3QgciA9IE1hdGgucmFuZG9tKCk7XG4gICAgcmV0dXJuIChiICogcikgKyAoMSAtIHIpICogYTtcbn1cbi8qKiBSZXR1cm5zIHRoZSBzcXVhcmVkIEV1Y2xpZGVhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byB2ZWN0b3JzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpc3RTcXVhcmVkKGEsIGIpIHtcbiAgICBsZXQgcmVzdWx0ID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgZGlmZiA9IE51bWJlcihhW2ldKSAtIE51bWJlcihiW2ldKTtcbiAgICAgICAgcmVzdWx0ICs9IGRpZmYgKiBkaWZmO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG4gKiBBc3NlcnRzIHRoYXQgdGhlIGV4cHJlc3Npb24gaXMgdHJ1ZS4gT3RoZXJ3aXNlIHRocm93cyBhbiBlcnJvciB3aXRoIHRoZVxuICogcHJvdmlkZWQgbWVzc2FnZS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IDI7XG4gKiB0Zi51dGlsLmFzc2VydCh4ID09PSAyLCAneCBpcyBub3QgMicpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGV4cHIgVGhlIGV4cHJlc3Npb24gdG8gYXNzZXJ0IChhcyBhIGJvb2xlYW4pLlxuICogQHBhcmFtIG1zZyBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgbWVzc2FnZSB0byByZXBvcnQgd2hlbiB0aHJvd2luZyBhblxuICogICAgIGVycm9yLiBXZSB1c2UgYSBmdW5jdGlvbiBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVXRpbCcsIG5hbWVzcGFjZTogJ3V0aWwnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0KGV4cHIsIG1zZykge1xuICAgIGlmICghZXhwcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IodHlwZW9mIG1zZyA9PT0gJ3N0cmluZycgPyBtc2cgOiBtc2coKSk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFNoYXBlc01hdGNoKHNoYXBlQSwgc2hhcGVCLCBlcnJvck1lc3NhZ2VQcmVmaXggPSAnJykge1xuICAgIGFzc2VydChhcnJheXNFcXVhbChzaGFwZUEsIHNoYXBlQiksICgpID0+IGVycm9yTWVzc2FnZVByZWZpeCArIGAgU2hhcGVzICR7c2hhcGVBfSBhbmQgJHtzaGFwZUJ9IG11c3QgbWF0Y2hgKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnROb25OdWxsKGEpIHtcbiAgICBhc3NlcnQoYSAhPSBudWxsLCAoKSA9PiBgVGhlIGlucHV0IHRvIHRoZSB0ZW5zb3IgY29uc3RydWN0b3IgbXVzdCBiZSBhIG5vbi1udWxsIHZhbHVlLmApO1xufVxuLy8gTk9URTogV2UgZXhwbGljaXRseSB0eXBlIG91dCB3aGF0IFQgZXh0ZW5kcyBpbnN0ZWFkIG9mIGFueSBzbyB0aGF0XG4vLyB1dGlsLmZsYXR0ZW4gb24gYSBuZXN0ZWQgYXJyYXkgb2YgbnVtYmVyIGRvZXNuJ3QgdHJ5IHRvIGluZmVyIFQgYXMgYVxuLy8gbnVtYmVyW11bXSwgY2F1c2luZyB1cyB0byBleHBsaWNpdGx5IHR5cGUgdXRpbC5mbGF0dGVuPG51bWJlcj4oKS5cbi8qKlxuICogIEZsYXR0ZW5zIGFuIGFyYml0cmFyaWx5IG5lc3RlZCBhcnJheS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IFtbMSwgMl0sIFszLCA0XSwgWzUsIFs2LCBbN11dXV07XG4gKiBjb25zdCBmbGF0ID0gdGYudXRpbC5mbGF0dGVuKGEpO1xuICogY29uc29sZS5sb2coZmxhdCk7XG4gKiBgYGBcbiAqXG4gKiAgQHBhcmFtIGFyciBUaGUgbmVzdGVkIGFycmF5IHRvIGZsYXR0ZW4uXG4gKiAgQHBhcmFtIHJlc3VsdCBUaGUgZGVzdGluYXRpb24gYXJyYXkgd2hpY2ggaG9sZHMgdGhlIGVsZW1lbnRzLlxuICogIEBwYXJhbSBza2lwVHlwZWRBcnJheSBJZiB0cnVlLCBhdm9pZHMgZmxhdHRlbmluZyB0aGUgdHlwZWQgYXJyYXlzLiBEZWZhdWx0c1xuICogICAgICB0byBmYWxzZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVXRpbCcsIG5hbWVzcGFjZTogJ3V0aWwnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZmxhdHRlbihhcnIsIHJlc3VsdCA9IFtdLCBza2lwVHlwZWRBcnJheSA9IGZhbHNlKSB7XG4gICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7XG4gICAgICAgIHJlc3VsdCA9IFtdO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShhcnIpIHx8IGlzVHlwZWRBcnJheShhcnIpICYmICFza2lwVHlwZWRBcnJheSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgZmxhdHRlbihhcnJbaV0sIHJlc3VsdCwgc2tpcFR5cGVkQXJyYXkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXN1bHQucHVzaChhcnIpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSBzaXplIChudW1iZXIgb2YgZWxlbWVudHMpIG9mIHRoZSB0ZW5zb3IgZ2l2ZW4gaXRzIHNoYXBlLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBzaGFwZSA9IFszLCA0LCAyXTtcbiAqIGNvbnN0IHNpemUgPSB0Zi51dGlsLnNpemVGcm9tU2hhcGUoc2hhcGUpO1xuICogY29uc29sZS5sb2coc2l6ZSk7XG4gKiBgYGBcbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVXRpbCcsIG5hbWVzcGFjZTogJ3V0aWwnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2l6ZUZyb21TaGFwZShzaGFwZSkge1xuICAgIGlmIChzaGFwZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgLy8gU2NhbGFyLlxuICAgICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgbGV0IHNpemUgPSBzaGFwZVswXTtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHNoYXBlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHNpemUgKj0gc2hhcGVbaV07XG4gICAgfVxuICAgIHJldHVybiBzaXplO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzU2NhbGFyU2hhcGUoc2hhcGUpIHtcbiAgICByZXR1cm4gc2hhcGUubGVuZ3RoID09PSAwO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFycmF5c0VxdWFsKG4xLCBuMikge1xuICAgIGlmIChuMSA9PT0gbjIpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChuMSA9PSBudWxsIHx8IG4yID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAobjEubGVuZ3RoICE9PSBuMi5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG4xLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChuMVtpXSAhPT0gbjJbaV0pIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0ludChhKSB7XG4gICAgcmV0dXJuIGEgJSAxID09PSAwO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHRhbmgoeCkge1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgICBpZiAoTWF0aC50YW5oICE9IG51bGwpIHtcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICAgICAgICByZXR1cm4gTWF0aC50YW5oKHgpO1xuICAgIH1cbiAgICBpZiAoeCA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIGVsc2UgaWYgKHggPT09IC1JbmZpbml0eSkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBlMnggPSBNYXRoLmV4cCgyICogeCk7XG4gICAgICAgIHJldHVybiAoZTJ4IC0gMSkgLyAoZTJ4ICsgMSk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIHNpemVUb1NxdWFyaXNoU2hhcGUoc2l6ZSkge1xuICAgIGNvbnN0IHdpZHRoID0gTWF0aC5jZWlsKE1hdGguc3FydChzaXplKSk7XG4gICAgcmV0dXJuIFt3aWR0aCwgTWF0aC5jZWlsKHNpemUgLyB3aWR0aCldO1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGFycmF5IHdpdGggcmFuZG9taXplZCBpbmRpY2llcyB0byBhIGdpdmVuIHF1YW50aXR5LlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCByYW5kb21UZW4gPSB0Zi51dGlsLmNyZWF0ZVNodWZmbGVkSW5kaWNlcygxMCk7XG4gKiBjb25zb2xlLmxvZyhyYW5kb21UZW4pO1xuICogYGBgXG4gKlxuICogQHBhcmFtIG51bWJlciBRdWFudGl0eSBvZiBob3cgbWFueSBzaHVmZmxlZCBpbmRpY2llcyB0byBjcmVhdGUuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1V0aWwnLCBuYW1lc3BhY2U6ICd1dGlsJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNodWZmbGVkSW5kaWNlcyhuKSB7XG4gICAgY29uc3Qgc2h1ZmZsZWRJbmRpY2VzID0gbmV3IFVpbnQzMkFycmF5KG4pO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICAgIHNodWZmbGVkSW5kaWNlc1tpXSA9IGk7XG4gICAgfVxuICAgIHNodWZmbGUoc2h1ZmZsZWRJbmRpY2VzKTtcbiAgICByZXR1cm4gc2h1ZmZsZWRJbmRpY2VzO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJpZ2h0UGFkKGEsIHNpemUpIHtcbiAgICBpZiAoc2l6ZSA8PSBhLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gYTtcbiAgICB9XG4gICAgcmV0dXJuIGEgKyAnICcucmVwZWF0KHNpemUgLSBhLmxlbmd0aCk7XG59XG5leHBvcnQgZnVuY3Rpb24gcmVwZWF0ZWRUcnkoY2hlY2tGbiwgZGVsYXlGbiA9IChjb3VudGVyKSA9PiAwLCBtYXhDb3VudGVyKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgbGV0IHRyeUNvdW50ID0gMDtcbiAgICAgICAgY29uc3QgdHJ5Rm4gPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoY2hlY2tGbigpKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeUNvdW50Kys7XG4gICAgICAgICAgICBjb25zdCBuZXh0QmFja29mZiA9IGRlbGF5Rm4odHJ5Q291bnQpO1xuICAgICAgICAgICAgaWYgKG1heENvdW50ZXIgIT0gbnVsbCAmJiB0cnlDb3VudCA+PSBtYXhDb3VudGVyKSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2V0VGltZW91dCh0cnlGbiwgbmV4dEJhY2tvZmYpO1xuICAgICAgICB9O1xuICAgICAgICB0cnlGbigpO1xuICAgIH0pO1xufVxuLyoqXG4gKiBHaXZlbiB0aGUgZnVsbCBzaXplIG9mIHRoZSBhcnJheSBhbmQgYSBzaGFwZSB0aGF0IG1heSBjb250YWluIC0xIGFzIHRoZVxuICogaW1wbGljaXQgZGltZW5zaW9uLCByZXR1cm5zIHRoZSBpbmZlcnJlZCBzaGFwZSB3aGVyZSAtMSBpcyByZXBsYWNlZC5cbiAqIEUuZy4gRm9yIHNoYXBlPVsyLCAtMSwgM10gYW5kIHNpemU9MjQsIGl0IHdpbGwgcmV0dXJuIFsyLCA0LCAzXS5cbiAqXG4gKiBAcGFyYW0gc2hhcGUgVGhlIHNoYXBlLCB3aGljaCBtYXkgY29udGFpbiAtMSBpbiBzb21lIGRpbWVuc2lvbi5cbiAqIEBwYXJhbSBzaXplIFRoZSBmdWxsIHNpemUgKG51bWJlciBvZiBlbGVtZW50cykgb2YgdGhlIGFycmF5LlxuICogQHJldHVybiBUaGUgaW5mZXJyZWQgc2hhcGUgd2hlcmUgLTEgaXMgcmVwbGFjZWQgd2l0aCB0aGUgaW5mZXJyZWQgc2l6ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluZmVyRnJvbUltcGxpY2l0U2hhcGUoc2hhcGUsIHNpemUpIHtcbiAgICBsZXQgc2hhcGVQcm9kID0gMTtcbiAgICBsZXQgaW1wbGljaXRJZHggPSAtMTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNoYXBlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGlmIChzaGFwZVtpXSA+PSAwKSB7XG4gICAgICAgICAgICBzaGFwZVByb2QgKj0gc2hhcGVbaV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc2hhcGVbaV0gPT09IC0xKSB7XG4gICAgICAgICAgICBpZiAoaW1wbGljaXRJZHggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoYFNoYXBlcyBjYW4gb25seSBoYXZlIDEgaW1wbGljaXQgc2l6ZS4gYCArXG4gICAgICAgICAgICAgICAgICAgIGBGb3VuZCAtMSBhdCBkaW0gJHtpbXBsaWNpdElkeH0gYW5kIGRpbSAke2l9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbXBsaWNpdElkeCA9IGk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc2hhcGVbaV0gPCAwKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcihgU2hhcGVzIGNhbiBub3QgYmUgPCAwLiBGb3VuZCAke3NoYXBlW2ldfSBhdCBkaW0gJHtpfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChpbXBsaWNpdElkeCA9PT0gLTEpIHtcbiAgICAgICAgaWYgKHNpemUgPiAwICYmIHNpemUgIT09IHNoYXBlUHJvZCkge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoYFNpemUoJHtzaXplfSkgbXVzdCBtYXRjaCB0aGUgcHJvZHVjdCBvZiBzaGFwZSAke3NoYXBlfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzaGFwZTtcbiAgICB9XG4gICAgaWYgKHNoYXBlUHJvZCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBFcnJvcihgQ2Fubm90IGluZmVyIHRoZSBtaXNzaW5nIHNpemUgaW4gWyR7c2hhcGV9XSB3aGVuIGAgK1xuICAgICAgICAgICAgYHRoZXJlIGFyZSAwIGVsZW1lbnRzYCk7XG4gICAgfVxuICAgIGlmIChzaXplICUgc2hhcGVQcm9kICE9PSAwKSB7XG4gICAgICAgIHRocm93IEVycm9yKGBUaGUgaW1wbGljaXQgc2hhcGUgY2FuJ3QgYmUgYSBmcmFjdGlvbmFsIG51bWJlci4gYCArXG4gICAgICAgICAgICBgR290ICR7c2l6ZX0gLyAke3NoYXBlUHJvZH1gKTtcbiAgICB9XG4gICAgY29uc3QgbmV3U2hhcGUgPSBzaGFwZS5zbGljZSgpO1xuICAgIG5ld1NoYXBlW2ltcGxpY2l0SWR4XSA9IHNpemUgLyBzaGFwZVByb2Q7XG4gICAgcmV0dXJuIG5ld1NoYXBlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQXhpc1BhcmFtKGF4aXMsIHNoYXBlKSB7XG4gICAgY29uc3QgcmFuayA9IHNoYXBlLmxlbmd0aDtcbiAgICAvLyBOb3JtYWxpemUgaW5wdXRcbiAgICBheGlzID0gYXhpcyA9PSBudWxsID8gc2hhcGUubWFwKChzLCBpKSA9PiBpKSA6IFtdLmNvbmNhdChheGlzKTtcbiAgICAvLyBDaGVjayBmb3IgdmFsaWQgcmFuZ2VcbiAgICBhc3NlcnQoYXhpcy5ldmVyeShheCA9PiBheCA+PSAtcmFuayAmJiBheCA8IHJhbmspLCAoKSA9PiBgQWxsIHZhbHVlcyBpbiBheGlzIHBhcmFtIG11c3QgYmUgaW4gcmFuZ2UgWy0ke3Jhbmt9LCAke3Jhbmt9KSBidXQgYCArXG4gICAgICAgIGBnb3QgYXhpcyAke2F4aXN9YCk7XG4gICAgLy8gQ2hlY2sgZm9yIG9ubHkgaW50ZWdlcnNcbiAgICBhc3NlcnQoYXhpcy5ldmVyeShheCA9PiBpc0ludChheCkpLCAoKSA9PiBgQWxsIHZhbHVlcyBpbiBheGlzIHBhcmFtIG11c3QgYmUgaW50ZWdlcnMgYnV0IGAgK1xuICAgICAgICBgZ290IGF4aXMgJHtheGlzfWApO1xuICAgIC8vIEhhbmRsZSBuZWdhdGl2ZSBheGlzLlxuICAgIHJldHVybiBheGlzLm1hcChhID0+IGEgPCAwID8gcmFuayArIGEgOiBhKTtcbn1cbi8qKiBSZWR1Y2VzIHRoZSBzaGFwZSBieSByZW1vdmluZyBhbGwgZGltZW5zaW9ucyBvZiBzaGFwZSAxLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNxdWVlemVTaGFwZShzaGFwZSwgYXhpcykge1xuICAgIGNvbnN0IG5ld1NoYXBlID0gW107XG4gICAgY29uc3Qga2VwdERpbXMgPSBbXTtcbiAgICBjb25zdCBpc0VtcHR5QXJyYXkgPSBheGlzICE9IG51bGwgJiYgQXJyYXkuaXNBcnJheShheGlzKSAmJiBheGlzLmxlbmd0aCA9PT0gMDtcbiAgICBjb25zdCBheGVzID0gKGF4aXMgPT0gbnVsbCB8fCBpc0VtcHR5QXJyYXkpID9cbiAgICAgICAgbnVsbCA6XG4gICAgICAgIHBhcnNlQXhpc1BhcmFtKGF4aXMsIHNoYXBlKS5zb3J0KCk7XG4gICAgbGV0IGogPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2hhcGUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgaWYgKGF4ZXMgIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGF4ZXNbal0gPT09IGkgJiYgc2hhcGVbaV0gIT09IDEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbid0IHNxdWVlemUgYXhpcyAke2l9IHNpbmNlIGl0cyBkaW0gJyR7c2hhcGVbaV19JyBpcyBub3QgMWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKChheGVzW2pdID09IG51bGwgfHwgYXhlc1tqXSA+IGkpICYmIHNoYXBlW2ldID09PSAxKSB7XG4gICAgICAgICAgICAgICAgbmV3U2hhcGUucHVzaChzaGFwZVtpXSk7XG4gICAgICAgICAgICAgICAga2VwdERpbXMucHVzaChpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChheGVzW2pdIDw9IGkpIHtcbiAgICAgICAgICAgICAgICBqKys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNoYXBlW2ldICE9PSAxKSB7XG4gICAgICAgICAgICBuZXdTaGFwZS5wdXNoKHNoYXBlW2ldKTtcbiAgICAgICAgICAgIGtlcHREaW1zLnB1c2goaSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgbmV3U2hhcGUsIGtlcHREaW1zIH07XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0VHlwZWRBcnJheUZyb21EVHlwZShkdHlwZSwgc2l6ZSkge1xuICAgIGxldCB2YWx1ZXMgPSBudWxsO1xuICAgIGlmIChkdHlwZSA9PSBudWxsIHx8IGR0eXBlID09PSAnZmxvYXQzMicpIHtcbiAgICAgICAgdmFsdWVzID0gbmV3IEZsb2F0MzJBcnJheShzaXplKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZHR5cGUgPT09ICdpbnQzMicpIHtcbiAgICAgICAgdmFsdWVzID0gbmV3IEludDMyQXJyYXkoc2l6ZSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGR0eXBlID09PSAnYm9vbCcpIHtcbiAgICAgICAgdmFsdWVzID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gZGF0YSB0eXBlICR7ZHR5cGV9YCk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZXM7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0QXJyYXlGcm9tRFR5cGUoZHR5cGUsIHNpemUpIHtcbiAgICBsZXQgdmFsdWVzID0gbnVsbDtcbiAgICBpZiAoZHR5cGUgPT0gbnVsbCB8fCBkdHlwZSA9PT0gJ2Zsb2F0MzInKSB7XG4gICAgICAgIHZhbHVlcyA9IG5ldyBGbG9hdDMyQXJyYXkoc2l6ZSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGR0eXBlID09PSAnaW50MzInKSB7XG4gICAgICAgIHZhbHVlcyA9IG5ldyBJbnQzMkFycmF5KHNpemUpO1xuICAgIH1cbiAgICBlbHNlIGlmIChkdHlwZSA9PT0gJ2Jvb2wnKSB7XG4gICAgICAgIHZhbHVlcyA9IG5ldyBVaW50OEFycmF5KHNpemUpO1xuICAgIH1cbiAgICBlbHNlIGlmIChkdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdmFsdWVzID0gbmV3IEFycmF5KHNpemUpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGRhdGEgdHlwZSAke2R0eXBlfWApO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWVzO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrQ29udmVyc2lvbkZvckVycm9ycyh2YWxzLCBkdHlwZSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFscy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBudW0gPSB2YWxzW2ldO1xuICAgICAgICBpZiAoaXNOYU4obnVtKSB8fCAhaXNGaW5pdGUobnVtKSkge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoYEEgdGVuc29yIG9mIHR5cGUgJHtkdHlwZX0gYmVpbmcgdXBsb2FkZWQgY29udGFpbnMgJHtudW19LmApO1xuICAgICAgICB9XG4gICAgfVxufVxuLyoqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZHR5cGUgaXMgdmFsaWQuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZER0eXBlKGR0eXBlKSB7XG4gICAgcmV0dXJuIGR0eXBlID09PSAnYm9vbCcgfHwgZHR5cGUgPT09ICdjb21wbGV4NjQnIHx8IGR0eXBlID09PSAnZmxvYXQzMicgfHxcbiAgICAgICAgZHR5cGUgPT09ICdpbnQzMicgfHwgZHR5cGUgPT09ICdzdHJpbmcnO1xufVxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIG5ldyB0eXBlIGNhbid0IGVuY29kZSB0aGUgb2xkIHR5cGUgd2l0aG91dCBsb3NzIG9mXG4gKiBwcmVjaXNpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNFbmNvZGluZ0xvc3Mob2xkVHlwZSwgbmV3VHlwZSkge1xuICAgIGlmIChuZXdUeXBlID09PSAnY29tcGxleDY0Jykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChuZXdUeXBlID09PSAnZmxvYXQzMicgJiYgb2xkVHlwZSAhPT0gJ2NvbXBsZXg2NCcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAobmV3VHlwZSA9PT0gJ2ludDMyJyAmJiBvbGRUeXBlICE9PSAnZmxvYXQzMicgJiYgb2xkVHlwZSAhPT0gJ2NvbXBsZXg2NCcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAobmV3VHlwZSA9PT0gJ2Jvb2wnICYmIG9sZFR5cGUgPT09ICdib29sJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVHlwZWRBcnJheShhKSB7XG4gICAgcmV0dXJuIGEgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkgfHwgYSBpbnN0YW5jZW9mIEludDMyQXJyYXkgfHxcbiAgICAgICAgYSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXk7XG59XG5leHBvcnQgZnVuY3Rpb24gYnl0ZXNQZXJFbGVtZW50KGR0eXBlKSB7XG4gICAgaWYgKGR0eXBlID09PSAnZmxvYXQzMicgfHwgZHR5cGUgPT09ICdpbnQzMicpIHtcbiAgICAgICAgcmV0dXJuIDQ7XG4gICAgfVxuICAgIGVsc2UgaWYgKGR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgICAgICByZXR1cm4gODtcbiAgICB9XG4gICAgZWxzZSBpZiAoZHR5cGUgPT09ICdib29sJykge1xuICAgICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBkdHlwZSAke2R0eXBlfWApO1xuICAgIH1cbn1cbi8qKlxuICogUmV0dXJucyB0aGUgYXBwcm94aW1hdGUgbnVtYmVyIG9mIGJ5dGVzIGFsbG9jYXRlZCBpbiB0aGUgc3RyaW5nIGFycmF5IC0gMlxuICogYnl0ZXMgcGVyIGNoYXJhY3Rlci4gQ29tcHV0aW5nIHRoZSBleGFjdCBieXRlcyBmb3IgYSBuYXRpdmUgc3RyaW5nIGluIEpTIGlzXG4gKiBub3QgcG9zc2libGUgc2luY2UgaXQgZGVwZW5kcyBvbiB0aGUgZW5jb2Rpbmcgb2YgdGhlIGh0bWwgcGFnZSB0aGF0IHNlcnZlc1xuICogdGhlIHdlYnNpdGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBieXRlc0Zyb21TdHJpbmdBcnJheShhcnIpIHtcbiAgICBpZiAoYXJyID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIGxldCBieXRlcyA9IDA7XG4gICAgYXJyLmZvckVhY2goeCA9PiBieXRlcyArPSB4Lmxlbmd0aCk7XG4gICAgcmV0dXJuIGJ5dGVzO1xufVxuLyoqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYSBzdHJpbmcuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTdHJpbmcodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZztcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0Jvb2xlYW4odmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbic7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNOdW1iZXIodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJztcbn1cbmV4cG9ydCBmdW5jdGlvbiBpbmZlckR0eXBlKHZhbHVlcykge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlcykpIHtcbiAgICAgICAgcmV0dXJuIGluZmVyRHR5cGUodmFsdWVzWzBdKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlcyBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSkge1xuICAgICAgICByZXR1cm4gJ2Zsb2F0MzInO1xuICAgIH1cbiAgICBlbHNlIGlmICh2YWx1ZXMgaW5zdGFuY2VvZiBJbnQzMkFycmF5IHx8IHZhbHVlcyBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAgICAgcmV0dXJuICdpbnQzMic7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzTnVtYmVyKHZhbHVlcykpIHtcbiAgICAgICAgcmV0dXJuICdmbG9hdDMyJztcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNTdHJpbmcodmFsdWVzKSkge1xuICAgICAgICByZXR1cm4gJ3N0cmluZyc7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzQm9vbGVhbih2YWx1ZXMpKSB7XG4gICAgICAgIHJldHVybiAnYm9vbCc7XG4gICAgfVxuICAgIHJldHVybiAnZmxvYXQzMic7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNGdW5jdGlvbihmKSB7XG4gICAgcmV0dXJuICEhKGYgJiYgZi5jb25zdHJ1Y3RvciAmJiBmLmNhbGwgJiYgZi5hcHBseSk7XG59XG5leHBvcnQgZnVuY3Rpb24gbmVhcmVzdERpdmlzb3Ioc2l6ZSwgc3RhcnQpIHtcbiAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBzaXplOyArK2kpIHtcbiAgICAgICAgaWYgKHNpemUgJSBpID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc2l6ZTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlU3RyaWRlcyhzaGFwZSkge1xuICAgIGNvbnN0IHJhbmsgPSBzaGFwZS5sZW5ndGg7XG4gICAgaWYgKHJhbmsgPCAyKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgLy8gTGFzdCBkaW1lbnNpb24gaGFzIGltcGxpY2l0IHN0cmlkZSBvZiAxLCB0aHVzIGhhdmluZyBELTEgKGluc3RlYWQgb2YgRClcbiAgICAvLyBzdHJpZGVzLlxuICAgIGNvbnN0IHN0cmlkZXMgPSBuZXcgQXJyYXkocmFuayAtIDEpO1xuICAgIHN0cmlkZXNbcmFuayAtIDJdID0gc2hhcGVbcmFuayAtIDFdO1xuICAgIGZvciAobGV0IGkgPSByYW5rIC0gMzsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgc3RyaWRlc1tpXSA9IHN0cmlkZXNbaSArIDFdICogc2hhcGVbaSArIDFdO1xuICAgIH1cbiAgICByZXR1cm4gc3RyaWRlcztcbn1cbmZ1bmN0aW9uIGNyZWF0ZU5lc3RlZEFycmF5KG9mZnNldCwgc2hhcGUsIGEsIGlzQ29tcGxleCA9IGZhbHNlKSB7XG4gICAgY29uc3QgcmV0ID0gbmV3IEFycmF5KCk7XG4gICAgaWYgKHNoYXBlLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBjb25zdCBkID0gc2hhcGVbMF0gKiAoaXNDb21wbGV4ID8gMiA6IDEpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGQ7IGkrKykge1xuICAgICAgICAgICAgcmV0W2ldID0gYVtvZmZzZXQgKyBpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgZCA9IHNoYXBlWzBdO1xuICAgICAgICBjb25zdCByZXN0ID0gc2hhcGUuc2xpY2UoMSk7XG4gICAgICAgIGNvbnN0IGxlbiA9IHJlc3QucmVkdWNlKChhY2MsIGMpID0+IGFjYyAqIGMpICogKGlzQ29tcGxleCA/IDIgOiAxKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkOyBpKyspIHtcbiAgICAgICAgICAgIHJldFtpXSA9IGNyZWF0ZU5lc3RlZEFycmF5KG9mZnNldCArIGkgKiBsZW4sIHJlc3QsIGEsIGlzQ29tcGxleCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbn1cbi8vIFByb3ZpZGUgYSBuZXN0ZWQgYXJyYXkgb2YgVHlwZWRBcnJheSBpbiBnaXZlbiBzaGFwZS5cbmV4cG9ydCBmdW5jdGlvbiB0b05lc3RlZEFycmF5KHNoYXBlLCBhLCBpc0NvbXBsZXggPSBmYWxzZSkge1xuICAgIGlmIChzaGFwZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgLy8gU2NhbGFyIHR5cGUgc2hvdWxkIHJldHVybiBhIHNpbmdsZSBudW1iZXIuXG4gICAgICAgIHJldHVybiBhWzBdO1xuICAgIH1cbiAgICBjb25zdCBzaXplID0gc2hhcGUucmVkdWNlKChhY2MsIGMpID0+IGFjYyAqIGMpICogKGlzQ29tcGxleCA/IDIgOiAxKTtcbiAgICBpZiAoc2l6ZSA9PT0gMCkge1xuICAgICAgICAvLyBBIHRlbnNvciB3aXRoIHNoYXBlIHplcm8gc2hvdWxkIGJlIHR1cm5lZCBpbnRvIGVtcHR5IGxpc3QuXG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgaWYgKHNpemUgIT09IGEubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWyR7c2hhcGV9XSBkb2VzIG5vdCBtYXRjaCB0aGUgaW5wdXQgc2l6ZSAke2EubGVuZ3RofSR7aXNDb21wbGV4ID8gJyBmb3IgYSBjb21wbGV4IHRlbnNvcicgOiAnJ30uYCk7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVOZXN0ZWRBcnJheSgwLCBzaGFwZSwgYSwgaXNDb21wbGV4KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBtYWtlT25lc1R5cGVkQXJyYXkoc2l6ZSwgZHR5cGUpIHtcbiAgICBjb25zdCBhcnJheSA9IG1ha2VaZXJvc1R5cGVkQXJyYXkoc2l6ZSwgZHR5cGUpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYXJyYXlbaV0gPSAxO1xuICAgIH1cbiAgICByZXR1cm4gYXJyYXk7XG59XG5leHBvcnQgZnVuY3Rpb24gbWFrZVplcm9zVHlwZWRBcnJheShzaXplLCBkdHlwZSkge1xuICAgIGlmIChkdHlwZSA9PSBudWxsIHx8IGR0eXBlID09PSAnZmxvYXQzMicgfHwgZHR5cGUgPT09ICdjb21wbGV4NjQnKSB7XG4gICAgICAgIHJldHVybiBuZXcgRmxvYXQzMkFycmF5KHNpemUpO1xuICAgIH1cbiAgICBlbHNlIGlmIChkdHlwZSA9PT0gJ2ludDMyJykge1xuICAgICAgICByZXR1cm4gbmV3IEludDMyQXJyYXkoc2l6ZSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGR0eXBlID09PSAnYm9vbCcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KHNpemUpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGRhdGEgdHlwZSAke2R0eXBlfWApO1xuICAgIH1cbn1cbi8qKlxuICogTWFrZSBuZXN0ZWQgYFR5cGVkQXJyYXlgIGZpbGxlZCB3aXRoIHplcm9zLlxuICogQHBhcmFtIHNoYXBlIFRoZSBzaGFwZSBpbmZvcm1hdGlvbiBmb3IgdGhlIG5lc3RlZCBhcnJheS5cbiAqIEBwYXJhbSBkdHlwZSBkdHlwZSBvZiB0aGUgYXJyYXkgZWxlbWVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ha2VaZXJvc05lc3RlZFR5cGVkQXJyYXkoc2hhcGUsIGR0eXBlKSB7XG4gICAgY29uc3Qgc2l6ZSA9IHNoYXBlLnJlZHVjZSgocHJldiwgY3VycikgPT4gcHJldiAqIGN1cnIsIDEpO1xuICAgIGlmIChkdHlwZSA9PSBudWxsIHx8IGR0eXBlID09PSAnZmxvYXQzMicpIHtcbiAgICAgICAgcmV0dXJuIHRvTmVzdGVkQXJyYXkoc2hhcGUsIG5ldyBGbG9hdDMyQXJyYXkoc2l6ZSkpO1xuICAgIH1cbiAgICBlbHNlIGlmIChkdHlwZSA9PT0gJ2ludDMyJykge1xuICAgICAgICByZXR1cm4gdG9OZXN0ZWRBcnJheShzaGFwZSwgbmV3IEludDMyQXJyYXkoc2l6ZSkpO1xuICAgIH1cbiAgICBlbHNlIGlmIChkdHlwZSA9PT0gJ2Jvb2wnKSB7XG4gICAgICAgIHJldHVybiB0b05lc3RlZEFycmF5KHNoYXBlLCBuZXcgVWludDhBcnJheShzaXplKSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gZGF0YSB0eXBlICR7ZHR5cGV9YCk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydE5vbk5lZ2F0aXZlSW50ZWdlckRpbWVuc2lvbnMoc2hhcGUpIHtcbiAgICBzaGFwZS5mb3JFYWNoKGRpbVNpemUgPT4ge1xuICAgICAgICBhc3NlcnQoTnVtYmVyLmlzSW50ZWdlcihkaW1TaXplKSAmJiBkaW1TaXplID49IDAsICgpID0+IGBUZW5zb3IgbXVzdCBoYXZlIGEgc2hhcGUgY29tcHJpc2VkIG9mIHBvc2l0aXZlIGludGVnZXJzIGJ1dCBnb3QgYCArXG4gICAgICAgICAgICBgc2hhcGUgWyR7c2hhcGV9XS5gKTtcbiAgICB9KTtcbn1cbi8qKlxuICogQ29tcHV0ZXMgZmxhdCBpbmRleCBmb3IgYSBnaXZlbiBsb2NhdGlvbiAobXVsdGlkaW1lbnRpb25zYWwgaW5kZXgpIGluIGFcbiAqIFRlbnNvci9tdWx0aWRpbWVuc2lvbmFsIGFycmF5LlxuICpcbiAqIEBwYXJhbSBsb2NzIExvY2F0aW9uIGluIHRoZSB0ZW5zb3IuXG4gKiBAcGFyYW0gcmFuayBSYW5rIG9mIHRoZSB0ZW5zb3IuXG4gKiBAcGFyYW0gc3RyaWRlcyBUZW5zb3Igc3RyaWRlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvY1RvSW5kZXgobG9jcywgcmFuaywgc3RyaWRlcykge1xuICAgIGlmIChyYW5rID09PSAwKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBlbHNlIGlmIChyYW5rID09PSAxKSB7XG4gICAgICAgIHJldHVybiBsb2NzWzBdO1xuICAgIH1cbiAgICBsZXQgaW5kZXggPSBsb2NzW2xvY3MubGVuZ3RoIC0gMV07XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb2NzLmxlbmd0aCAtIDE7ICsraSkge1xuICAgICAgICBpbmRleCArPSBzdHJpZGVzW2ldICogbG9jc1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIGluZGV4O1xufVxuLyoqXG4gKiBDb21wdXRlcyB0aGUgbG9jYXRpb24gKG11bHRpZGltZW5zaW9uYWwgaW5kZXgpIGluIGEgdGVuc29yL211bHRpZGltZW50aW9uYWxcbiAqIGFycmF5IGZvciBhIGdpdmVuIGZsYXQgaW5kZXguXG4gKlxuICogQHBhcmFtIGluZGV4IEluZGV4IGluIGZsYXQgYXJyYXkuXG4gKiBAcGFyYW0gcmFuayBSYW5rIG9mIHRlbnNvci5cbiAqIEBwYXJhbSBzdHJpZGVzIFN0cmlkZXMgb2YgdGVuc29yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5kZXhUb0xvYyhpbmRleCwgcmFuaywgc3RyaWRlcykge1xuICAgIGlmIChyYW5rID09PSAwKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgZWxzZSBpZiAocmFuayA9PT0gMSkge1xuICAgICAgICByZXR1cm4gW2luZGV4XTtcbiAgICB9XG4gICAgY29uc3QgbG9jcyA9IG5ldyBBcnJheShyYW5rKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxvY3MubGVuZ3RoIC0gMTsgKytpKSB7XG4gICAgICAgIGxvY3NbaV0gPSBNYXRoLmZsb29yKGluZGV4IC8gc3RyaWRlc1tpXSk7XG4gICAgICAgIGluZGV4IC09IGxvY3NbaV0gKiBzdHJpZGVzW2ldO1xuICAgIH1cbiAgICBsb2NzW2xvY3MubGVuZ3RoIC0gMV0gPSBpbmRleDtcbiAgICByZXR1cm4gbG9jcztcbn1cbi8qKlxuICogVGhpcyBtZXRob2QgYXNzZXJ0cyB3aGV0aGVyIGFuIG9iamVjdCBpcyBhIFByb21pc2UgaW5zdGFuY2UuXG4gKiBAcGFyYW0gb2JqZWN0XG4gKi9cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tYW55XG5leHBvcnQgZnVuY3Rpb24gaXNQcm9taXNlKG9iamVjdCkge1xuICAgIC8vICBXZSBjaG9zZSB0byBub3QgdXNlICdvYmogaW5zdGFuY2VPZiBQcm9taXNlJyBmb3IgdHdvIHJlYXNvbnM6XG4gICAgLy8gIDEuIEl0IG9ubHkgcmVsaWFibHkgd29ya3MgZm9yIGVzNiBQcm9taXNlLCBub3Qgb3RoZXIgUHJvbWlzZVxuICAgIC8vICBpbXBsZW1lbnRhdGlvbnMuXG4gICAgLy8gIDIuIEl0IGRvZXNuJ3Qgd29yayB3aXRoIGZyYW1ld29yayB0aGF0IHVzZXMgem9uZS5qcy4gem9uZS5qcyBtb25rZXkgcGF0Y2hcbiAgICAvLyAgdGhlIGFzeW5jIGNhbGxzLCBzbyBpdCBpcyBwb3NzaWJsZSB0aGUgb2JqIChwYXRjaGVkKSBpcyBjb21wYXJpbmcgdG8gYVxuICAgIC8vICBwcmUtcGF0Y2hlZCBQcm9taXNlLlxuICAgIHJldHVybiBvYmplY3QgJiYgb2JqZWN0LnRoZW4gJiYgdHlwZW9mIG9iamVjdC50aGVuID09PSAnZnVuY3Rpb24nO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXRpbF9iYXNlLmpzLm1hcCIsIi8qKiBAbGljZW5zZSBTZWUgdGhlIExJQ0VOU0UgZmlsZS4gKi9cbi8vIFRoaXMgY29kZSBpcyBhdXRvLWdlbmVyYXRlZCwgZG8gbm90IG1vZGlmeSB0aGlzIGZpbGUhXG5jb25zdCB2ZXJzaW9uID0gJzMuOC4wJztcbmV4cG9ydCB7IHZlcnNpb24gfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXZlcnNpb24uanMubWFwIiwiJ3VzZSBzdHJpY3QnXG5cbmV4cG9ydHMuYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGhcbmV4cG9ydHMudG9CeXRlQXJyYXkgPSB0b0J5dGVBcnJheVxuZXhwb3J0cy5mcm9tQnl0ZUFycmF5ID0gZnJvbUJ5dGVBcnJheVxuXG52YXIgbG9va3VwID0gW11cbnZhciByZXZMb29rdXAgPSBbXVxudmFyIEFyciA9IHR5cGVvZiBVaW50OEFycmF5ICE9PSAndW5kZWZpbmVkJyA/IFVpbnQ4QXJyYXkgOiBBcnJheVxuXG52YXIgY29kZSA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvJ1xuZm9yICh2YXIgaSA9IDAsIGxlbiA9IGNvZGUubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcbiAgbG9va3VwW2ldID0gY29kZVtpXVxuICByZXZMb29rdXBbY29kZS5jaGFyQ29kZUF0KGkpXSA9IGlcbn1cblxuLy8gU3VwcG9ydCBkZWNvZGluZyBVUkwtc2FmZSBiYXNlNjQgc3RyaW5ncywgYXMgTm9kZS5qcyBkb2VzLlxuLy8gU2VlOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CYXNlNjQjVVJMX2FwcGxpY2F0aW9uc1xucmV2TG9va3VwWyctJy5jaGFyQ29kZUF0KDApXSA9IDYyXG5yZXZMb29rdXBbJ18nLmNoYXJDb2RlQXQoMCldID0gNjNcblxuZnVuY3Rpb24gZ2V0TGVucyAoYjY0KSB7XG4gIHZhciBsZW4gPSBiNjQubGVuZ3RoXG5cbiAgaWYgKGxlbiAlIDQgPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHN0cmluZy4gTGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0JylcbiAgfVxuXG4gIC8vIFRyaW0gb2ZmIGV4dHJhIGJ5dGVzIGFmdGVyIHBsYWNlaG9sZGVyIGJ5dGVzIGFyZSBmb3VuZFxuICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9iZWF0Z2FtbWl0L2Jhc2U2NC1qcy9pc3N1ZXMvNDJcbiAgdmFyIHZhbGlkTGVuID0gYjY0LmluZGV4T2YoJz0nKVxuICBpZiAodmFsaWRMZW4gPT09IC0xKSB2YWxpZExlbiA9IGxlblxuXG4gIHZhciBwbGFjZUhvbGRlcnNMZW4gPSB2YWxpZExlbiA9PT0gbGVuXG4gICAgPyAwXG4gICAgOiA0IC0gKHZhbGlkTGVuICUgNClcblxuICByZXR1cm4gW3ZhbGlkTGVuLCBwbGFjZUhvbGRlcnNMZW5dXG59XG5cbi8vIGJhc2U2NCBpcyA0LzMgKyB1cCB0byB0d28gY2hhcmFjdGVycyBvZiB0aGUgb3JpZ2luYWwgZGF0YVxuZnVuY3Rpb24gYnl0ZUxlbmd0aCAoYjY0KSB7XG4gIHZhciBsZW5zID0gZ2V0TGVucyhiNjQpXG4gIHZhciB2YWxpZExlbiA9IGxlbnNbMF1cbiAgdmFyIHBsYWNlSG9sZGVyc0xlbiA9IGxlbnNbMV1cbiAgcmV0dXJuICgodmFsaWRMZW4gKyBwbGFjZUhvbGRlcnNMZW4pICogMyAvIDQpIC0gcGxhY2VIb2xkZXJzTGVuXG59XG5cbmZ1bmN0aW9uIF9ieXRlTGVuZ3RoIChiNjQsIHZhbGlkTGVuLCBwbGFjZUhvbGRlcnNMZW4pIHtcbiAgcmV0dXJuICgodmFsaWRMZW4gKyBwbGFjZUhvbGRlcnNMZW4pICogMyAvIDQpIC0gcGxhY2VIb2xkZXJzTGVuXG59XG5cbmZ1bmN0aW9uIHRvQnl0ZUFycmF5IChiNjQpIHtcbiAgdmFyIHRtcFxuICB2YXIgbGVucyA9IGdldExlbnMoYjY0KVxuICB2YXIgdmFsaWRMZW4gPSBsZW5zWzBdXG4gIHZhciBwbGFjZUhvbGRlcnNMZW4gPSBsZW5zWzFdXG5cbiAgdmFyIGFyciA9IG5ldyBBcnIoX2J5dGVMZW5ndGgoYjY0LCB2YWxpZExlbiwgcGxhY2VIb2xkZXJzTGVuKSlcblxuICB2YXIgY3VyQnl0ZSA9IDBcblxuICAvLyBpZiB0aGVyZSBhcmUgcGxhY2Vob2xkZXJzLCBvbmx5IGdldCB1cCB0byB0aGUgbGFzdCBjb21wbGV0ZSA0IGNoYXJzXG4gIHZhciBsZW4gPSBwbGFjZUhvbGRlcnNMZW4gPiAwXG4gICAgPyB2YWxpZExlbiAtIDRcbiAgICA6IHZhbGlkTGVuXG5cbiAgdmFyIGlcbiAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSArPSA0KSB7XG4gICAgdG1wID1cbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDE4KSB8XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPDwgMTIpIHxcbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDIpXSA8PCA2KSB8XG4gICAgICByZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDMpXVxuICAgIGFycltjdXJCeXRlKytdID0gKHRtcCA+PiAxNikgJiAweEZGXG4gICAgYXJyW2N1ckJ5dGUrK10gPSAodG1wID4+IDgpICYgMHhGRlxuICAgIGFycltjdXJCeXRlKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgaWYgKHBsYWNlSG9sZGVyc0xlbiA9PT0gMikge1xuICAgIHRtcCA9XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAyKSB8XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPj4gNClcbiAgICBhcnJbY3VyQnl0ZSsrXSA9IHRtcCAmIDB4RkZcbiAgfVxuXG4gIGlmIChwbGFjZUhvbGRlcnNMZW4gPT09IDEpIHtcbiAgICB0bXAgPVxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMTApIHxcbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA8PCA0KSB8XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAyKV0gPj4gMilcbiAgICBhcnJbY3VyQnl0ZSsrXSA9ICh0bXAgPj4gOCkgJiAweEZGXG4gICAgYXJyW2N1ckJ5dGUrK10gPSB0bXAgJiAweEZGXG4gIH1cblxuICByZXR1cm4gYXJyXG59XG5cbmZ1bmN0aW9uIHRyaXBsZXRUb0Jhc2U2NCAobnVtKSB7XG4gIHJldHVybiBsb29rdXBbbnVtID4+IDE4ICYgMHgzRl0gK1xuICAgIGxvb2t1cFtudW0gPj4gMTIgJiAweDNGXSArXG4gICAgbG9va3VwW251bSA+PiA2ICYgMHgzRl0gK1xuICAgIGxvb2t1cFtudW0gJiAweDNGXVxufVxuXG5mdW5jdGlvbiBlbmNvZGVDaHVuayAodWludDgsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHRtcFxuICB2YXIgb3V0cHV0ID0gW11cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpICs9IDMpIHtcbiAgICB0bXAgPVxuICAgICAgKCh1aW50OFtpXSA8PCAxNikgJiAweEZGMDAwMCkgK1xuICAgICAgKCh1aW50OFtpICsgMV0gPDwgOCkgJiAweEZGMDApICtcbiAgICAgICh1aW50OFtpICsgMl0gJiAweEZGKVxuICAgIG91dHB1dC5wdXNoKHRyaXBsZXRUb0Jhc2U2NCh0bXApKVxuICB9XG4gIHJldHVybiBvdXRwdXQuam9pbignJylcbn1cblxuZnVuY3Rpb24gZnJvbUJ5dGVBcnJheSAodWludDgpIHtcbiAgdmFyIHRtcFxuICB2YXIgbGVuID0gdWludDgubGVuZ3RoXG4gIHZhciBleHRyYUJ5dGVzID0gbGVuICUgMyAvLyBpZiB3ZSBoYXZlIDEgYnl0ZSBsZWZ0LCBwYWQgMiBieXRlc1xuICB2YXIgcGFydHMgPSBbXVxuICB2YXIgbWF4Q2h1bmtMZW5ndGggPSAxNjM4MyAvLyBtdXN0IGJlIG11bHRpcGxlIG9mIDNcblxuICAvLyBnbyB0aHJvdWdoIHRoZSBhcnJheSBldmVyeSB0aHJlZSBieXRlcywgd2UnbGwgZGVhbCB3aXRoIHRyYWlsaW5nIHN0dWZmIGxhdGVyXG4gIGZvciAodmFyIGkgPSAwLCBsZW4yID0gbGVuIC0gZXh0cmFCeXRlczsgaSA8IGxlbjI7IGkgKz0gbWF4Q2h1bmtMZW5ndGgpIHtcbiAgICBwYXJ0cy5wdXNoKGVuY29kZUNodW5rKHVpbnQ4LCBpLCAoaSArIG1heENodW5rTGVuZ3RoKSA+IGxlbjIgPyBsZW4yIDogKGkgKyBtYXhDaHVua0xlbmd0aCkpKVxuICB9XG5cbiAgLy8gcGFkIHRoZSBlbmQgd2l0aCB6ZXJvcywgYnV0IG1ha2Ugc3VyZSB0byBub3QgZm9yZ2V0IHRoZSBleHRyYSBieXRlc1xuICBpZiAoZXh0cmFCeXRlcyA9PT0gMSkge1xuICAgIHRtcCA9IHVpbnQ4W2xlbiAtIDFdXG4gICAgcGFydHMucHVzaChcbiAgICAgIGxvb2t1cFt0bXAgPj4gMl0gK1xuICAgICAgbG9va3VwWyh0bXAgPDwgNCkgJiAweDNGXSArXG4gICAgICAnPT0nXG4gICAgKVxuICB9IGVsc2UgaWYgKGV4dHJhQnl0ZXMgPT09IDIpIHtcbiAgICB0bXAgPSAodWludDhbbGVuIC0gMl0gPDwgOCkgKyB1aW50OFtsZW4gLSAxXVxuICAgIHBhcnRzLnB1c2goXG4gICAgICBsb29rdXBbdG1wID4+IDEwXSArXG4gICAgICBsb29rdXBbKHRtcCA+PiA0KSAmIDB4M0ZdICtcbiAgICAgIGxvb2t1cFsodG1wIDw8IDIpICYgMHgzRl0gK1xuICAgICAgJz0nXG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIHBhcnRzLmpvaW4oJycpXG59XG4iLCIvKiFcbiAqIFRoZSBidWZmZXIgbW9kdWxlIGZyb20gbm9kZS5qcywgZm9yIHRoZSBicm93c2VyLlxuICpcbiAqIEBhdXRob3IgICBGZXJvc3MgQWJvdWtoYWRpamVoIDxodHRwOi8vZmVyb3NzLm9yZz5cbiAqIEBsaWNlbnNlICBNSVRcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG8gKi9cblxuJ3VzZSBzdHJpY3QnXG5cbnZhciBiYXNlNjQgPSByZXF1aXJlKCdiYXNlNjQtanMnKVxudmFyIGllZWU3NTQgPSByZXF1aXJlKCdpZWVlNzU0JylcbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnaXNhcnJheScpXG5cbmV4cG9ydHMuQnVmZmVyID0gQnVmZmVyXG5leHBvcnRzLlNsb3dCdWZmZXIgPSBTbG93QnVmZmVyXG5leHBvcnRzLklOU1BFQ1RfTUFYX0JZVEVTID0gNTBcblxuLyoqXG4gKiBJZiBgQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRgOlxuICogICA9PT0gdHJ1ZSAgICBVc2UgVWludDhBcnJheSBpbXBsZW1lbnRhdGlvbiAoZmFzdGVzdClcbiAqICAgPT09IGZhbHNlICAgVXNlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiAobW9zdCBjb21wYXRpYmxlLCBldmVuIElFNilcbiAqXG4gKiBCcm93c2VycyB0aGF0IHN1cHBvcnQgdHlwZWQgYXJyYXlzIGFyZSBJRSAxMCssIEZpcmVmb3ggNCssIENocm9tZSA3KywgU2FmYXJpIDUuMSssXG4gKiBPcGVyYSAxMS42KywgaU9TIDQuMisuXG4gKlxuICogRHVlIHRvIHZhcmlvdXMgYnJvd3NlciBidWdzLCBzb21ldGltZXMgdGhlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiB3aWxsIGJlIHVzZWQgZXZlblxuICogd2hlbiB0aGUgYnJvd3NlciBzdXBwb3J0cyB0eXBlZCBhcnJheXMuXG4gKlxuICogTm90ZTpcbiAqXG4gKiAgIC0gRmlyZWZveCA0LTI5IGxhY2tzIHN1cHBvcnQgZm9yIGFkZGluZyBuZXcgcHJvcGVydGllcyB0byBgVWludDhBcnJheWAgaW5zdGFuY2VzLFxuICogICAgIFNlZTogaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk1NDM4LlxuICpcbiAqICAgLSBDaHJvbWUgOS0xMCBpcyBtaXNzaW5nIHRoZSBgVHlwZWRBcnJheS5wcm90b3R5cGUuc3ViYXJyYXlgIGZ1bmN0aW9uLlxuICpcbiAqICAgLSBJRTEwIGhhcyBhIGJyb2tlbiBgVHlwZWRBcnJheS5wcm90b3R5cGUuc3ViYXJyYXlgIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgYXJyYXlzIG9mXG4gKiAgICAgaW5jb3JyZWN0IGxlbmd0aCBpbiBzb21lIHNpdHVhdGlvbnMuXG5cbiAqIFdlIGRldGVjdCB0aGVzZSBidWdneSBicm93c2VycyBhbmQgc2V0IGBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVGAgdG8gYGZhbHNlYCBzbyB0aGV5XG4gKiBnZXQgdGhlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggaXMgc2xvd2VyIGJ1dCBiZWhhdmVzIGNvcnJlY3RseS5cbiAqL1xuQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgPSBnbG9iYWwuVFlQRURfQVJSQVlfU1VQUE9SVCAhPT0gdW5kZWZpbmVkXG4gID8gZ2xvYmFsLlRZUEVEX0FSUkFZX1NVUFBPUlRcbiAgOiB0eXBlZEFycmF5U3VwcG9ydCgpXG5cbi8qXG4gKiBFeHBvcnQga01heExlbmd0aCBhZnRlciB0eXBlZCBhcnJheSBzdXBwb3J0IGlzIGRldGVybWluZWQuXG4gKi9cbmV4cG9ydHMua01heExlbmd0aCA9IGtNYXhMZW5ndGgoKVxuXG5mdW5jdGlvbiB0eXBlZEFycmF5U3VwcG9ydCAoKSB7XG4gIHRyeSB7XG4gICAgdmFyIGFyciA9IG5ldyBVaW50OEFycmF5KDEpXG4gICAgYXJyLl9fcHJvdG9fXyA9IHtfX3Byb3RvX186IFVpbnQ4QXJyYXkucHJvdG90eXBlLCBmb286IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDQyIH19XG4gICAgcmV0dXJuIGFyci5mb28oKSA9PT0gNDIgJiYgLy8gdHlwZWQgYXJyYXkgaW5zdGFuY2VzIGNhbiBiZSBhdWdtZW50ZWRcbiAgICAgICAgdHlwZW9mIGFyci5zdWJhcnJheSA9PT0gJ2Z1bmN0aW9uJyAmJiAvLyBjaHJvbWUgOS0xMCBsYWNrIGBzdWJhcnJheWBcbiAgICAgICAgYXJyLnN1YmFycmF5KDEsIDEpLmJ5dGVMZW5ndGggPT09IDAgLy8gaWUxMCBoYXMgYnJva2VuIGBzdWJhcnJheWBcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbmZ1bmN0aW9uIGtNYXhMZW5ndGggKCkge1xuICByZXR1cm4gQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRcbiAgICA/IDB4N2ZmZmZmZmZcbiAgICA6IDB4M2ZmZmZmZmZcbn1cblxuZnVuY3Rpb24gY3JlYXRlQnVmZmVyICh0aGF0LCBsZW5ndGgpIHtcbiAgaWYgKGtNYXhMZW5ndGgoKSA8IGxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIHR5cGVkIGFycmF5IGxlbmd0aCcpXG4gIH1cbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2UsIGZvciBiZXN0IHBlcmZvcm1hbmNlXG4gICAgdGhhdCA9IG5ldyBVaW50OEFycmF5KGxlbmd0aClcbiAgICB0aGF0Ll9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgfSBlbHNlIHtcbiAgICAvLyBGYWxsYmFjazogUmV0dXJuIGFuIG9iamVjdCBpbnN0YW5jZSBvZiB0aGUgQnVmZmVyIGNsYXNzXG4gICAgaWYgKHRoYXQgPT09IG51bGwpIHtcbiAgICAgIHRoYXQgPSBuZXcgQnVmZmVyKGxlbmd0aClcbiAgICB9XG4gICAgdGhhdC5sZW5ndGggPSBsZW5ndGhcbiAgfVxuXG4gIHJldHVybiB0aGF0XG59XG5cbi8qKlxuICogVGhlIEJ1ZmZlciBjb25zdHJ1Y3RvciByZXR1cm5zIGluc3RhbmNlcyBvZiBgVWludDhBcnJheWAgdGhhdCBoYXZlIHRoZWlyXG4gKiBwcm90b3R5cGUgY2hhbmdlZCB0byBgQnVmZmVyLnByb3RvdHlwZWAuIEZ1cnRoZXJtb3JlLCBgQnVmZmVyYCBpcyBhIHN1YmNsYXNzIG9mXG4gKiBgVWludDhBcnJheWAsIHNvIHRoZSByZXR1cm5lZCBpbnN0YW5jZXMgd2lsbCBoYXZlIGFsbCB0aGUgbm9kZSBgQnVmZmVyYCBtZXRob2RzXG4gKiBhbmQgdGhlIGBVaW50OEFycmF5YCBtZXRob2RzLiBTcXVhcmUgYnJhY2tldCBub3RhdGlvbiB3b3JrcyBhcyBleHBlY3RlZCAtLSBpdFxuICogcmV0dXJucyBhIHNpbmdsZSBvY3RldC5cbiAqXG4gKiBUaGUgYFVpbnQ4QXJyYXlgIHByb3RvdHlwZSByZW1haW5zIHVubW9kaWZpZWQuXG4gKi9cblxuZnVuY3Rpb24gQnVmZmVyIChhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUICYmICEodGhpcyBpbnN0YW5jZW9mIEJ1ZmZlcikpIHtcbiAgICByZXR1cm4gbmV3IEJ1ZmZlcihhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIC8vIENvbW1vbiBjYXNlLlxuICBpZiAodHlwZW9mIGFyZyA9PT0gJ251bWJlcicpIHtcbiAgICBpZiAodHlwZW9mIGVuY29kaW5nT3JPZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdJZiBlbmNvZGluZyBpcyBzcGVjaWZpZWQgdGhlbiB0aGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZydcbiAgICAgIClcbiAgICB9XG4gICAgcmV0dXJuIGFsbG9jVW5zYWZlKHRoaXMsIGFyZylcbiAgfVxuICByZXR1cm4gZnJvbSh0aGlzLCBhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuQnVmZmVyLnBvb2xTaXplID0gODE5MiAvLyBub3QgdXNlZCBieSB0aGlzIGltcGxlbWVudGF0aW9uXG5cbi8vIFRPRE86IExlZ2FjeSwgbm90IG5lZWRlZCBhbnltb3JlLiBSZW1vdmUgaW4gbmV4dCBtYWpvciB2ZXJzaW9uLlxuQnVmZmVyLl9hdWdtZW50ID0gZnVuY3Rpb24gKGFycikge1xuICBhcnIuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICByZXR1cm4gYXJyXG59XG5cbmZ1bmN0aW9uIGZyb20gKHRoYXQsIHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcInZhbHVlXCIgYXJndW1lbnQgbXVzdCBub3QgYmUgYSBudW1iZXInKVxuICB9XG5cbiAgaWYgKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsdWUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgIHJldHVybiBmcm9tQXJyYXlCdWZmZXIodGhhdCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZyb21TdHJpbmcodGhhdCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQpXG4gIH1cblxuICByZXR1cm4gZnJvbU9iamVjdCh0aGF0LCB2YWx1ZSlcbn1cblxuLyoqXG4gKiBGdW5jdGlvbmFsbHkgZXF1aXZhbGVudCB0byBCdWZmZXIoYXJnLCBlbmNvZGluZykgYnV0IHRocm93cyBhIFR5cGVFcnJvclxuICogaWYgdmFsdWUgaXMgYSBudW1iZXIuXG4gKiBCdWZmZXIuZnJvbShzdHJbLCBlbmNvZGluZ10pXG4gKiBCdWZmZXIuZnJvbShhcnJheSlcbiAqIEJ1ZmZlci5mcm9tKGJ1ZmZlcilcbiAqIEJ1ZmZlci5mcm9tKGFycmF5QnVmZmVyWywgYnl0ZU9mZnNldFssIGxlbmd0aF1dKVxuICoqL1xuQnVmZmVyLmZyb20gPSBmdW5jdGlvbiAodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gZnJvbShudWxsLCB2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG5pZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgQnVmZmVyLnByb3RvdHlwZS5fX3Byb3RvX18gPSBVaW50OEFycmF5LnByb3RvdHlwZVxuICBCdWZmZXIuX19wcm90b19fID0gVWludDhBcnJheVxuICBpZiAodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnNwZWNpZXMgJiZcbiAgICAgIEJ1ZmZlcltTeW1ib2wuc3BlY2llc10gPT09IEJ1ZmZlcikge1xuICAgIC8vIEZpeCBzdWJhcnJheSgpIGluIEVTMjAxNi4gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlci9wdWxsLzk3XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEJ1ZmZlciwgU3ltYm9sLnNwZWNpZXMsIHtcbiAgICAgIHZhbHVlOiBudWxsLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSlcbiAgfVxufVxuXG5mdW5jdGlvbiBhc3NlcnRTaXplIChzaXplKSB7XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcInNpemVcIiBhcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJylcbiAgfSBlbHNlIGlmIChzaXplIDwgMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcInNpemVcIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBuZWdhdGl2ZScpXG4gIH1cbn1cblxuZnVuY3Rpb24gYWxsb2MgKHRoYXQsIHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIGFzc2VydFNpemUoc2l6ZSlcbiAgaWYgKHNpemUgPD0gMCkge1xuICAgIHJldHVybiBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSlcbiAgfVxuICBpZiAoZmlsbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gT25seSBwYXkgYXR0ZW50aW9uIHRvIGVuY29kaW5nIGlmIGl0J3MgYSBzdHJpbmcuIFRoaXNcbiAgICAvLyBwcmV2ZW50cyBhY2NpZGVudGFsbHkgc2VuZGluZyBpbiBhIG51bWJlciB0aGF0IHdvdWxkXG4gICAgLy8gYmUgaW50ZXJwcmV0dGVkIGFzIGEgc3RhcnQgb2Zmc2V0LlxuICAgIHJldHVybiB0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnXG4gICAgICA/IGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplKS5maWxsKGZpbGwsIGVuY29kaW5nKVxuICAgICAgOiBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSkuZmlsbChmaWxsKVxuICB9XG4gIHJldHVybiBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSlcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKiBhbGxvYyhzaXplWywgZmlsbFssIGVuY29kaW5nXV0pXG4gKiovXG5CdWZmZXIuYWxsb2MgPSBmdW5jdGlvbiAoc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGFsbG9jKG51bGwsIHNpemUsIGZpbGwsIGVuY29kaW5nKVxufVxuXG5mdW5jdGlvbiBhbGxvY1Vuc2FmZSAodGhhdCwgc2l6ZSkge1xuICBhc3NlcnRTaXplKHNpemUpXG4gIHRoYXQgPSBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSA8IDAgPyAwIDogY2hlY2tlZChzaXplKSB8IDApXG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7ICsraSkge1xuICAgICAgdGhhdFtpXSA9IDBcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuLyoqXG4gKiBFcXVpdmFsZW50IHRvIEJ1ZmZlcihudW0pLCBieSBkZWZhdWx0IGNyZWF0ZXMgYSBub24temVyby1maWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICogKi9cbkJ1ZmZlci5hbGxvY1Vuc2FmZSA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIHJldHVybiBhbGxvY1Vuc2FmZShudWxsLCBzaXplKVxufVxuLyoqXG4gKiBFcXVpdmFsZW50IHRvIFNsb3dCdWZmZXIobnVtKSwgYnkgZGVmYXVsdCBjcmVhdGVzIGEgbm9uLXplcm8tZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqL1xuQnVmZmVyLmFsbG9jVW5zYWZlU2xvdyA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIHJldHVybiBhbGxvY1Vuc2FmZShudWxsLCBzaXplKVxufVxuXG5mdW5jdGlvbiBmcm9tU3RyaW5nICh0aGF0LCBzdHJpbmcsIGVuY29kaW5nKSB7XG4gIGlmICh0eXBlb2YgZW5jb2RpbmcgIT09ICdzdHJpbmcnIHx8IGVuY29kaW5nID09PSAnJykge1xuICAgIGVuY29kaW5nID0gJ3V0ZjgnXG4gIH1cblxuICBpZiAoIUJ1ZmZlci5pc0VuY29kaW5nKGVuY29kaW5nKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiZW5jb2RpbmdcIiBtdXN0IGJlIGEgdmFsaWQgc3RyaW5nIGVuY29kaW5nJylcbiAgfVxuXG4gIHZhciBsZW5ndGggPSBieXRlTGVuZ3RoKHN0cmluZywgZW5jb2RpbmcpIHwgMFxuICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIGxlbmd0aClcblxuICB2YXIgYWN0dWFsID0gdGhhdC53cml0ZShzdHJpbmcsIGVuY29kaW5nKVxuXG4gIGlmIChhY3R1YWwgIT09IGxlbmd0aCkge1xuICAgIC8vIFdyaXRpbmcgYSBoZXggc3RyaW5nLCBmb3IgZXhhbXBsZSwgdGhhdCBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMgd2lsbFxuICAgIC8vIGNhdXNlIGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIGZpcnN0IGludmFsaWQgY2hhcmFjdGVyIHRvIGJlIGlnbm9yZWQuIChlLmcuXG4gICAgLy8gJ2FieHhjZCcgd2lsbCBiZSB0cmVhdGVkIGFzICdhYicpXG4gICAgdGhhdCA9IHRoYXQuc2xpY2UoMCwgYWN0dWFsKVxuICB9XG5cbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbUFycmF5TGlrZSAodGhhdCwgYXJyYXkpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCA8IDAgPyAwIDogY2hlY2tlZChhcnJheS5sZW5ndGgpIHwgMFxuICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIGxlbmd0aClcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgIHRoYXRbaV0gPSBhcnJheVtpXSAmIDI1NVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheUJ1ZmZlciAodGhhdCwgYXJyYXksIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICBhcnJheS5ieXRlTGVuZ3RoIC8vIHRoaXMgdGhyb3dzIGlmIGBhcnJheWAgaXMgbm90IGEgdmFsaWQgQXJyYXlCdWZmZXJcblxuICBpZiAoYnl0ZU9mZnNldCA8IDAgfHwgYXJyYXkuYnl0ZUxlbmd0aCA8IGJ5dGVPZmZzZXQpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXFwnb2Zmc2V0XFwnIGlzIG91dCBvZiBib3VuZHMnKVxuICB9XG5cbiAgaWYgKGFycmF5LmJ5dGVMZW5ndGggPCBieXRlT2Zmc2V0ICsgKGxlbmd0aCB8fCAwKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcXCdsZW5ndGhcXCcgaXMgb3V0IG9mIGJvdW5kcycpXG4gIH1cblxuICBpZiAoYnl0ZU9mZnNldCA9PT0gdW5kZWZpbmVkICYmIGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheSlcbiAgfSBlbHNlIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXksIGJ5dGVPZmZzZXQpXG4gIH0gZWxzZSB7XG4gICAgYXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheSwgYnl0ZU9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2UsIGZvciBiZXN0IHBlcmZvcm1hbmNlXG4gICAgdGhhdCA9IGFycmF5XG4gICAgdGhhdC5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIH0gZWxzZSB7XG4gICAgLy8gRmFsbGJhY2s6IFJldHVybiBhbiBvYmplY3QgaW5zdGFuY2Ugb2YgdGhlIEJ1ZmZlciBjbGFzc1xuICAgIHRoYXQgPSBmcm9tQXJyYXlMaWtlKHRoYXQsIGFycmF5KVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21PYmplY3QgKHRoYXQsIG9iaikge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKG9iaikpIHtcbiAgICB2YXIgbGVuID0gY2hlY2tlZChvYmoubGVuZ3RoKSB8IDBcbiAgICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIGxlbilcblxuICAgIGlmICh0aGF0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRoYXRcbiAgICB9XG5cbiAgICBvYmouY29weSh0aGF0LCAwLCAwLCBsZW4pXG4gICAgcmV0dXJuIHRoYXRcbiAgfVxuXG4gIGlmIChvYmopIHtcbiAgICBpZiAoKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgb2JqLmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB8fCAnbGVuZ3RoJyBpbiBvYmopIHtcbiAgICAgIGlmICh0eXBlb2Ygb2JqLmxlbmd0aCAhPT0gJ251bWJlcicgfHwgaXNuYW4ob2JqLmxlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcih0aGF0LCAwKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZyb21BcnJheUxpa2UodGhhdCwgb2JqKVxuICAgIH1cblxuICAgIGlmIChvYmoudHlwZSA9PT0gJ0J1ZmZlcicgJiYgaXNBcnJheShvYmouZGF0YSkpIHtcbiAgICAgIHJldHVybiBmcm9tQXJyYXlMaWtlKHRoYXQsIG9iai5kYXRhKVxuICAgIH1cbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCBvciBhcnJheS1saWtlIG9iamVjdC4nKVxufVxuXG5mdW5jdGlvbiBjaGVja2VkIChsZW5ndGgpIHtcbiAgLy8gTm90ZTogY2Fubm90IHVzZSBgbGVuZ3RoIDwga01heExlbmd0aCgpYCBoZXJlIGJlY2F1c2UgdGhhdCBmYWlscyB3aGVuXG4gIC8vIGxlbmd0aCBpcyBOYU4gKHdoaWNoIGlzIG90aGVyd2lzZSBjb2VyY2VkIHRvIHplcm8uKVxuICBpZiAobGVuZ3RoID49IGtNYXhMZW5ndGgoKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdBdHRlbXB0IHRvIGFsbG9jYXRlIEJ1ZmZlciBsYXJnZXIgdGhhbiBtYXhpbXVtICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICdzaXplOiAweCcgKyBrTWF4TGVuZ3RoKCkudG9TdHJpbmcoMTYpICsgJyBieXRlcycpXG4gIH1cbiAgcmV0dXJuIGxlbmd0aCB8IDBcbn1cblxuZnVuY3Rpb24gU2xvd0J1ZmZlciAobGVuZ3RoKSB7XG4gIGlmICgrbGVuZ3RoICE9IGxlbmd0aCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGVxZXFlcVxuICAgIGxlbmd0aCA9IDBcbiAgfVxuICByZXR1cm4gQnVmZmVyLmFsbG9jKCtsZW5ndGgpXG59XG5cbkJ1ZmZlci5pc0J1ZmZlciA9IGZ1bmN0aW9uIGlzQnVmZmVyIChiKSB7XG4gIHJldHVybiAhIShiICE9IG51bGwgJiYgYi5faXNCdWZmZXIpXG59XG5cbkJ1ZmZlci5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSAoYSwgYikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihhKSB8fCAhQnVmZmVyLmlzQnVmZmVyKGIpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnRzIG11c3QgYmUgQnVmZmVycycpXG4gIH1cblxuICBpZiAoYSA9PT0gYikgcmV0dXJuIDBcblxuICB2YXIgeCA9IGEubGVuZ3RoXG4gIHZhciB5ID0gYi5sZW5ndGhcblxuICBmb3IgKHZhciBpID0gMCwgbGVuID0gTWF0aC5taW4oeCwgeSk7IGkgPCBsZW47ICsraSkge1xuICAgIGlmIChhW2ldICE9PSBiW2ldKSB7XG4gICAgICB4ID0gYVtpXVxuICAgICAgeSA9IGJbaV1cbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgaWYgKHggPCB5KSByZXR1cm4gLTFcbiAgaWYgKHkgPCB4KSByZXR1cm4gMVxuICByZXR1cm4gMFxufVxuXG5CdWZmZXIuaXNFbmNvZGluZyA9IGZ1bmN0aW9uIGlzRW5jb2RpbmcgKGVuY29kaW5nKSB7XG4gIHN3aXRjaCAoU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgY2FzZSAnaGV4JzpcbiAgICBjYXNlICd1dGY4JzpcbiAgICBjYXNlICd1dGYtOCc6XG4gICAgY2FzZSAnYXNjaWknOlxuICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgY2FzZSAnYmluYXJ5JzpcbiAgICBjYXNlICdiYXNlNjQnOlxuICAgIGNhc2UgJ3VjczInOlxuICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICBjYXNlICd1dGYxNmxlJzpcbiAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5CdWZmZXIuY29uY2F0ID0gZnVuY3Rpb24gY29uY2F0IChsaXN0LCBsZW5ndGgpIHtcbiAgaWYgKCFpc0FycmF5KGxpc3QpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0XCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJylcbiAgfVxuXG4gIGlmIChsaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBCdWZmZXIuYWxsb2MoMClcbiAgfVxuXG4gIHZhciBpXG4gIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGxlbmd0aCA9IDBcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xuICAgICAgbGVuZ3RoICs9IGxpc3RbaV0ubGVuZ3RoXG4gICAgfVxuICB9XG5cbiAgdmFyIGJ1ZmZlciA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShsZW5ndGgpXG4gIHZhciBwb3MgPSAwXG4gIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIGJ1ZiA9IGxpc3RbaV1cbiAgICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihidWYpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RcIiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKVxuICAgIH1cbiAgICBidWYuY29weShidWZmZXIsIHBvcylcbiAgICBwb3MgKz0gYnVmLmxlbmd0aFxuICB9XG4gIHJldHVybiBidWZmZXJcbn1cblxuZnVuY3Rpb24gYnl0ZUxlbmd0aCAoc3RyaW5nLCBlbmNvZGluZykge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHN0cmluZykpIHtcbiAgICByZXR1cm4gc3RyaW5nLmxlbmd0aFxuICB9XG4gIGlmICh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBBcnJheUJ1ZmZlci5pc1ZpZXcgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgIChBcnJheUJ1ZmZlci5pc1ZpZXcoc3RyaW5nKSB8fCBzdHJpbmcgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikpIHtcbiAgICByZXR1cm4gc3RyaW5nLmJ5dGVMZW5ndGhcbiAgfVxuICBpZiAodHlwZW9mIHN0cmluZyAhPT0gJ3N0cmluZycpIHtcbiAgICBzdHJpbmcgPSAnJyArIHN0cmluZ1xuICB9XG5cbiAgdmFyIGxlbiA9IHN0cmluZy5sZW5ndGhcbiAgaWYgKGxlbiA9PT0gMCkgcmV0dXJuIDBcblxuICAvLyBVc2UgYSBmb3IgbG9vcCB0byBhdm9pZCByZWN1cnNpb25cbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGVuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgICByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGhcbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiBsZW4gKiAyXG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gbGVuID4+PiAxXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICByZXR1cm4gYmFzZTY0VG9CeXRlcyhzdHJpbmcpLmxlbmd0aFxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGggLy8gYXNzdW1lIHV0ZjhcbiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cbkJ1ZmZlci5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aFxuXG5mdW5jdGlvbiBzbG93VG9TdHJpbmcgKGVuY29kaW5nLCBzdGFydCwgZW5kKSB7XG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG5cbiAgLy8gTm8gbmVlZCB0byB2ZXJpZnkgdGhhdCBcInRoaXMubGVuZ3RoIDw9IE1BWF9VSU5UMzJcIiBzaW5jZSBpdCdzIGEgcmVhZC1vbmx5XG4gIC8vIHByb3BlcnR5IG9mIGEgdHlwZWQgYXJyYXkuXG5cbiAgLy8gVGhpcyBiZWhhdmVzIG5laXRoZXIgbGlrZSBTdHJpbmcgbm9yIFVpbnQ4QXJyYXkgaW4gdGhhdCB3ZSBzZXQgc3RhcnQvZW5kXG4gIC8vIHRvIHRoZWlyIHVwcGVyL2xvd2VyIGJvdW5kcyBpZiB0aGUgdmFsdWUgcGFzc2VkIGlzIG91dCBvZiByYW5nZS5cbiAgLy8gdW5kZWZpbmVkIGlzIGhhbmRsZWQgc3BlY2lhbGx5IGFzIHBlciBFQ01BLTI2MiA2dGggRWRpdGlvbixcbiAgLy8gU2VjdGlvbiAxMy4zLjMuNyBSdW50aW1lIFNlbWFudGljczogS2V5ZWRCaW5kaW5nSW5pdGlhbGl6YXRpb24uXG4gIGlmIChzdGFydCA9PT0gdW5kZWZpbmVkIHx8IHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ID0gMFxuICB9XG4gIC8vIFJldHVybiBlYXJseSBpZiBzdGFydCA+IHRoaXMubGVuZ3RoLiBEb25lIGhlcmUgdG8gcHJldmVudCBwb3RlbnRpYWwgdWludDMyXG4gIC8vIGNvZXJjaW9uIGZhaWwgYmVsb3cuXG4gIGlmIChzdGFydCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICBpZiAoZW5kID09PSB1bmRlZmluZWQgfHwgZW5kID4gdGhpcy5sZW5ndGgpIHtcbiAgICBlbmQgPSB0aGlzLmxlbmd0aFxuICB9XG5cbiAgaWYgKGVuZCA8PSAwKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICAvLyBGb3JjZSBjb2Vyc2lvbiB0byB1aW50MzIuIFRoaXMgd2lsbCBhbHNvIGNvZXJjZSBmYWxzZXkvTmFOIHZhbHVlcyB0byAwLlxuICBlbmQgPj4+PSAwXG4gIHN0YXJ0ID4+Pj0gMFxuXG4gIGlmIChlbmQgPD0gc3RhcnQpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gJ3V0ZjgnXG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gaGV4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICByZXR1cm4gYXNjaWlTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxhdGluMVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIHJldHVybiBiYXNlNjRTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gdXRmMTZsZVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgICAgICBlbmNvZGluZyA9IChlbmNvZGluZyArICcnKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuXG4vLyBUaGUgcHJvcGVydHkgaXMgdXNlZCBieSBgQnVmZmVyLmlzQnVmZmVyYCBhbmQgYGlzLWJ1ZmZlcmAgKGluIFNhZmFyaSA1LTcpIHRvIGRldGVjdFxuLy8gQnVmZmVyIGluc3RhbmNlcy5cbkJ1ZmZlci5wcm90b3R5cGUuX2lzQnVmZmVyID0gdHJ1ZVxuXG5mdW5jdGlvbiBzd2FwIChiLCBuLCBtKSB7XG4gIHZhciBpID0gYltuXVxuICBiW25dID0gYlttXVxuICBiW21dID0gaVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnN3YXAxNiA9IGZ1bmN0aW9uIHN3YXAxNiAoKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuICUgMiAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYtYml0cycpXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gMikge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDEpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwMzIgPSBmdW5jdGlvbiBzd2FwMzIgKCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDQgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLWJpdHMnKVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyAzKVxuICAgIHN3YXAodGhpcywgaSArIDEsIGkgKyAyKVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDY0ID0gZnVuY3Rpb24gc3dhcDY0ICgpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW4gJSA4ICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA2NC1iaXRzJylcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSA4KSB7XG4gICAgc3dhcCh0aGlzLCBpLCBpICsgNylcbiAgICBzd2FwKHRoaXMsIGkgKyAxLCBpICsgNilcbiAgICBzd2FwKHRoaXMsIGkgKyAyLCBpICsgNSlcbiAgICBzd2FwKHRoaXMsIGkgKyAzLCBpICsgNClcbiAgfVxuICByZXR1cm4gdGhpc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcgKCkge1xuICB2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGggfCAwXG4gIGlmIChsZW5ndGggPT09IDApIHJldHVybiAnJ1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHV0ZjhTbGljZSh0aGlzLCAwLCBsZW5ndGgpXG4gIHJldHVybiBzbG93VG9TdHJpbmcuYXBwbHkodGhpcywgYXJndW1lbnRzKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyAoYikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlcicpXG4gIGlmICh0aGlzID09PSBiKSByZXR1cm4gdHJ1ZVxuICByZXR1cm4gQnVmZmVyLmNvbXBhcmUodGhpcywgYikgPT09IDBcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCAoKSB7XG4gIHZhciBzdHIgPSAnJ1xuICB2YXIgbWF4ID0gZXhwb3J0cy5JTlNQRUNUX01BWF9CWVRFU1xuICBpZiAodGhpcy5sZW5ndGggPiAwKSB7XG4gICAgc3RyID0gdGhpcy50b1N0cmluZygnaGV4JywgMCwgbWF4KS5tYXRjaCgvLnsyfS9nKS5qb2luKCcgJylcbiAgICBpZiAodGhpcy5sZW5ndGggPiBtYXgpIHN0ciArPSAnIC4uLiAnXG4gIH1cbiAgcmV0dXJuICc8QnVmZmVyICcgKyBzdHIgKyAnPidcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSAodGFyZ2V0LCBzdGFydCwgZW5kLCB0aGlzU3RhcnQsIHRoaXNFbmQpIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIodGFyZ2V0KSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXInKVxuICB9XG5cbiAgaWYgKHN0YXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgICBzdGFydCA9IDBcbiAgfVxuICBpZiAoZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICBlbmQgPSB0YXJnZXQgPyB0YXJnZXQubGVuZ3RoIDogMFxuICB9XG4gIGlmICh0aGlzU3RhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRoaXNTdGFydCA9IDBcbiAgfVxuICBpZiAodGhpc0VuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhpc0VuZCA9IHRoaXMubGVuZ3RoXG4gIH1cblxuICBpZiAoc3RhcnQgPCAwIHx8IGVuZCA+IHRhcmdldC5sZW5ndGggfHwgdGhpc1N0YXJ0IDwgMCB8fCB0aGlzRW5kID4gdGhpcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignb3V0IG9mIHJhbmdlIGluZGV4JylcbiAgfVxuXG4gIGlmICh0aGlzU3RhcnQgPj0gdGhpc0VuZCAmJiBzdGFydCA+PSBlbmQpIHtcbiAgICByZXR1cm4gMFxuICB9XG4gIGlmICh0aGlzU3RhcnQgPj0gdGhpc0VuZCkge1xuICAgIHJldHVybiAtMVxuICB9XG4gIGlmIChzdGFydCA+PSBlbmQpIHtcbiAgICByZXR1cm4gMVxuICB9XG5cbiAgc3RhcnQgPj4+PSAwXG4gIGVuZCA+Pj49IDBcbiAgdGhpc1N0YXJ0ID4+Pj0gMFxuICB0aGlzRW5kID4+Pj0gMFxuXG4gIGlmICh0aGlzID09PSB0YXJnZXQpIHJldHVybiAwXG5cbiAgdmFyIHggPSB0aGlzRW5kIC0gdGhpc1N0YXJ0XG4gIHZhciB5ID0gZW5kIC0gc3RhcnRcbiAgdmFyIGxlbiA9IE1hdGgubWluKHgsIHkpXG5cbiAgdmFyIHRoaXNDb3B5ID0gdGhpcy5zbGljZSh0aGlzU3RhcnQsIHRoaXNFbmQpXG4gIHZhciB0YXJnZXRDb3B5ID0gdGFyZ2V0LnNsaWNlKHN0YXJ0LCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgIGlmICh0aGlzQ29weVtpXSAhPT0gdGFyZ2V0Q29weVtpXSkge1xuICAgICAgeCA9IHRoaXNDb3B5W2ldXG4gICAgICB5ID0gdGFyZ2V0Q29weVtpXVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICBpZiAoeCA8IHkpIHJldHVybiAtMVxuICBpZiAoeSA8IHgpIHJldHVybiAxXG4gIHJldHVybiAwXG59XG5cbi8vIEZpbmRzIGVpdGhlciB0aGUgZmlyc3QgaW5kZXggb2YgYHZhbGAgaW4gYGJ1ZmZlcmAgYXQgb2Zmc2V0ID49IGBieXRlT2Zmc2V0YCxcbi8vIE9SIHRoZSBsYXN0IGluZGV4IG9mIGB2YWxgIGluIGBidWZmZXJgIGF0IG9mZnNldCA8PSBgYnl0ZU9mZnNldGAuXG4vL1xuLy8gQXJndW1lbnRzOlxuLy8gLSBidWZmZXIgLSBhIEJ1ZmZlciB0byBzZWFyY2hcbi8vIC0gdmFsIC0gYSBzdHJpbmcsIEJ1ZmZlciwgb3IgbnVtYmVyXG4vLyAtIGJ5dGVPZmZzZXQgLSBhbiBpbmRleCBpbnRvIGBidWZmZXJgOyB3aWxsIGJlIGNsYW1wZWQgdG8gYW4gaW50MzJcbi8vIC0gZW5jb2RpbmcgLSBhbiBvcHRpb25hbCBlbmNvZGluZywgcmVsZXZhbnQgaXMgdmFsIGlzIGEgc3RyaW5nXG4vLyAtIGRpciAtIHRydWUgZm9yIGluZGV4T2YsIGZhbHNlIGZvciBsYXN0SW5kZXhPZlxuZnVuY3Rpb24gYmlkaXJlY3Rpb25hbEluZGV4T2YgKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKSB7XG4gIC8vIEVtcHR5IGJ1ZmZlciBtZWFucyBubyBtYXRjaFxuICBpZiAoYnVmZmVyLmxlbmd0aCA9PT0gMCkgcmV0dXJuIC0xXG5cbiAgLy8gTm9ybWFsaXplIGJ5dGVPZmZzZXRcbiAgaWYgKHR5cGVvZiBieXRlT2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgIGVuY29kaW5nID0gYnl0ZU9mZnNldFxuICAgIGJ5dGVPZmZzZXQgPSAwXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA+IDB4N2ZmZmZmZmYpIHtcbiAgICBieXRlT2Zmc2V0ID0gMHg3ZmZmZmZmZlxuICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPCAtMHg4MDAwMDAwMCkge1xuICAgIGJ5dGVPZmZzZXQgPSAtMHg4MDAwMDAwMFxuICB9XG4gIGJ5dGVPZmZzZXQgPSArYnl0ZU9mZnNldCAgLy8gQ29lcmNlIHRvIE51bWJlci5cbiAgaWYgKGlzTmFOKGJ5dGVPZmZzZXQpKSB7XG4gICAgLy8gYnl0ZU9mZnNldDogaXQgaXQncyB1bmRlZmluZWQsIG51bGwsIE5hTiwgXCJmb29cIiwgZXRjLCBzZWFyY2ggd2hvbGUgYnVmZmVyXG4gICAgYnl0ZU9mZnNldCA9IGRpciA/IDAgOiAoYnVmZmVyLmxlbmd0aCAtIDEpXG4gIH1cblxuICAvLyBOb3JtYWxpemUgYnl0ZU9mZnNldDogbmVnYXRpdmUgb2Zmc2V0cyBzdGFydCBmcm9tIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlclxuICBpZiAoYnl0ZU9mZnNldCA8IDApIGJ5dGVPZmZzZXQgPSBidWZmZXIubGVuZ3RoICsgYnl0ZU9mZnNldFxuICBpZiAoYnl0ZU9mZnNldCA+PSBidWZmZXIubGVuZ3RoKSB7XG4gICAgaWYgKGRpcikgcmV0dXJuIC0xXG4gICAgZWxzZSBieXRlT2Zmc2V0ID0gYnVmZmVyLmxlbmd0aCAtIDFcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0IDwgMCkge1xuICAgIGlmIChkaXIpIGJ5dGVPZmZzZXQgPSAwXG4gICAgZWxzZSByZXR1cm4gLTFcbiAgfVxuXG4gIC8vIE5vcm1hbGl6ZSB2YWxcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFsID0gQnVmZmVyLmZyb20odmFsLCBlbmNvZGluZylcbiAgfVxuXG4gIC8vIEZpbmFsbHksIHNlYXJjaCBlaXRoZXIgaW5kZXhPZiAoaWYgZGlyIGlzIHRydWUpIG9yIGxhc3RJbmRleE9mXG4gIGlmIChCdWZmZXIuaXNCdWZmZXIodmFsKSkge1xuICAgIC8vIFNwZWNpYWwgY2FzZTogbG9va2luZyBmb3IgZW1wdHkgc3RyaW5nL2J1ZmZlciBhbHdheXMgZmFpbHNcbiAgICBpZiAodmFsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIC0xXG4gICAgfVxuICAgIHJldHVybiBhcnJheUluZGV4T2YoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpXG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICB2YWwgPSB2YWwgJiAweEZGIC8vIFNlYXJjaCBmb3IgYSBieXRlIHZhbHVlIFswLTI1NV1cbiAgICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgJiZcbiAgICAgICAgdHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmIChkaXIpIHtcbiAgICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBVaW50OEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZi5jYWxsKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0KVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXlJbmRleE9mKGJ1ZmZlciwgWyB2YWwgXSwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcilcbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ZhbCBtdXN0IGJlIHN0cmluZywgbnVtYmVyIG9yIEJ1ZmZlcicpXG59XG5cbmZ1bmN0aW9uIGFycmF5SW5kZXhPZiAoYXJyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpIHtcbiAgdmFyIGluZGV4U2l6ZSA9IDFcbiAgdmFyIGFyckxlbmd0aCA9IGFyci5sZW5ndGhcbiAgdmFyIHZhbExlbmd0aCA9IHZhbC5sZW5ndGhcblxuICBpZiAoZW5jb2RpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgIGVuY29kaW5nID0gU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgaWYgKGVuY29kaW5nID09PSAndWNzMicgfHwgZW5jb2RpbmcgPT09ICd1Y3MtMicgfHxcbiAgICAgICAgZW5jb2RpbmcgPT09ICd1dGYxNmxlJyB8fCBlbmNvZGluZyA9PT0gJ3V0Zi0xNmxlJykge1xuICAgICAgaWYgKGFyci5sZW5ndGggPCAyIHx8IHZhbC5sZW5ndGggPCAyKSB7XG4gICAgICAgIHJldHVybiAtMVxuICAgICAgfVxuICAgICAgaW5kZXhTaXplID0gMlxuICAgICAgYXJyTGVuZ3RoIC89IDJcbiAgICAgIHZhbExlbmd0aCAvPSAyXG4gICAgICBieXRlT2Zmc2V0IC89IDJcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZWFkIChidWYsIGkpIHtcbiAgICBpZiAoaW5kZXhTaXplID09PSAxKSB7XG4gICAgICByZXR1cm4gYnVmW2ldXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBidWYucmVhZFVJbnQxNkJFKGkgKiBpbmRleFNpemUpXG4gICAgfVxuICB9XG5cbiAgdmFyIGlcbiAgaWYgKGRpcikge1xuICAgIHZhciBmb3VuZEluZGV4ID0gLTFcbiAgICBmb3IgKGkgPSBieXRlT2Zmc2V0OyBpIDwgYXJyTGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChyZWFkKGFyciwgaSkgPT09IHJlYWQodmFsLCBmb3VuZEluZGV4ID09PSAtMSA/IDAgOiBpIC0gZm91bmRJbmRleCkpIHtcbiAgICAgICAgaWYgKGZvdW5kSW5kZXggPT09IC0xKSBmb3VuZEluZGV4ID0gaVxuICAgICAgICBpZiAoaSAtIGZvdW5kSW5kZXggKyAxID09PSB2YWxMZW5ndGgpIHJldHVybiBmb3VuZEluZGV4ICogaW5kZXhTaXplXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZm91bmRJbmRleCAhPT0gLTEpIGkgLT0gaSAtIGZvdW5kSW5kZXhcbiAgICAgICAgZm91bmRJbmRleCA9IC0xXG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChieXRlT2Zmc2V0ICsgdmFsTGVuZ3RoID4gYXJyTGVuZ3RoKSBieXRlT2Zmc2V0ID0gYXJyTGVuZ3RoIC0gdmFsTGVuZ3RoXG4gICAgZm9yIChpID0gYnl0ZU9mZnNldDsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBmb3VuZCA9IHRydWVcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdmFsTGVuZ3RoOyBqKyspIHtcbiAgICAgICAgaWYgKHJlYWQoYXJyLCBpICsgaikgIT09IHJlYWQodmFsLCBqKSkge1xuICAgICAgICAgIGZvdW5kID0gZmFsc2VcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZm91bmQpIHJldHVybiBpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIC0xXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5jbHVkZXMgPSBmdW5jdGlvbiBpbmNsdWRlcyAodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gdGhpcy5pbmRleE9mKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpICE9PSAtMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiBpbmRleE9mICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiBiaWRpcmVjdGlvbmFsSW5kZXhPZih0aGlzLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCB0cnVlKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmxhc3RJbmRleE9mID0gZnVuY3Rpb24gbGFzdEluZGV4T2YgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGJpZGlyZWN0aW9uYWxJbmRleE9mKHRoaXMsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGZhbHNlKVxufVxuXG5mdW5jdGlvbiBoZXhXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIG9mZnNldCA9IE51bWJlcihvZmZzZXQpIHx8IDBcbiAgdmFyIHJlbWFpbmluZyA9IGJ1Zi5sZW5ndGggLSBvZmZzZXRcbiAgaWYgKCFsZW5ndGgpIHtcbiAgICBsZW5ndGggPSByZW1haW5pbmdcbiAgfSBlbHNlIHtcbiAgICBsZW5ndGggPSBOdW1iZXIobGVuZ3RoKVxuICAgIGlmIChsZW5ndGggPiByZW1haW5pbmcpIHtcbiAgICAgIGxlbmd0aCA9IHJlbWFpbmluZ1xuICAgIH1cbiAgfVxuXG4gIC8vIG11c3QgYmUgYW4gZXZlbiBudW1iZXIgb2YgZGlnaXRzXG4gIHZhciBzdHJMZW4gPSBzdHJpbmcubGVuZ3RoXG4gIGlmIChzdHJMZW4gJSAyICE9PSAwKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGhleCBzdHJpbmcnKVxuXG4gIGlmIChsZW5ndGggPiBzdHJMZW4gLyAyKSB7XG4gICAgbGVuZ3RoID0gc3RyTGVuIC8gMlxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgcGFyc2VkID0gcGFyc2VJbnQoc3RyaW5nLnN1YnN0cihpICogMiwgMiksIDE2KVxuICAgIGlmIChpc05hTihwYXJzZWQpKSByZXR1cm4gaVxuICAgIGJ1ZltvZmZzZXQgKyBpXSA9IHBhcnNlZFxuICB9XG4gIHJldHVybiBpXG59XG5cbmZ1bmN0aW9uIHV0ZjhXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKHV0ZjhUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGFzY2lpV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcihhc2NpaVRvQnl0ZXMoc3RyaW5nKSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gbGF0aW4xV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYXNjaWlXcml0ZShidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGJhc2U2NFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIoYmFzZTY0VG9CeXRlcyhzdHJpbmcpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiB1Y3MyV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcih1dGYxNmxlVG9CeXRlcyhzdHJpbmcsIGJ1Zi5sZW5ndGggLSBvZmZzZXQpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gd3JpdGUgKHN0cmluZywgb2Zmc2V0LCBsZW5ndGgsIGVuY29kaW5nKSB7XG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcpXG4gIGlmIChvZmZzZXQgPT09IHVuZGVmaW5lZCkge1xuICAgIGVuY29kaW5nID0gJ3V0ZjgnXG4gICAgbGVuZ3RoID0gdGhpcy5sZW5ndGhcbiAgICBvZmZzZXQgPSAwXG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcsIGVuY29kaW5nKVxuICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jb2RpbmcgPSBvZmZzZXRcbiAgICBsZW5ndGggPSB0aGlzLmxlbmd0aFxuICAgIG9mZnNldCA9IDBcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZywgb2Zmc2V0WywgbGVuZ3RoXVssIGVuY29kaW5nXSlcbiAgfSBlbHNlIGlmIChpc0Zpbml0ZShvZmZzZXQpKSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICAgIGlmIChpc0Zpbml0ZShsZW5ndGgpKSB7XG4gICAgICBsZW5ndGggPSBsZW5ndGggfCAwXG4gICAgICBpZiAoZW5jb2RpbmcgPT09IHVuZGVmaW5lZCkgZW5jb2RpbmcgPSAndXRmOCdcbiAgICB9IGVsc2Uge1xuICAgICAgZW5jb2RpbmcgPSBsZW5ndGhcbiAgICAgIGxlbmd0aCA9IHVuZGVmaW5lZFxuICAgIH1cbiAgLy8gbGVnYWN5IHdyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldCwgbGVuZ3RoKSAtIHJlbW92ZSBpbiB2MC4xM1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdCdWZmZXIud3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0WywgbGVuZ3RoXSkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCdcbiAgICApXG4gIH1cblxuICB2YXIgcmVtYWluaW5nID0gdGhpcy5sZW5ndGggLSBvZmZzZXRcbiAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkIHx8IGxlbmd0aCA+IHJlbWFpbmluZykgbGVuZ3RoID0gcmVtYWluaW5nXG5cbiAgaWYgKChzdHJpbmcubGVuZ3RoID4gMCAmJiAobGVuZ3RoIDwgMCB8fCBvZmZzZXQgPCAwKSkgfHwgb2Zmc2V0ID4gdGhpcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQXR0ZW1wdCB0byB3cml0ZSBvdXRzaWRlIGJ1ZmZlciBib3VuZHMnKVxuICB9XG5cbiAgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSAndXRmOCdcblxuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuICBmb3IgKDs7KSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGhleFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gdXRmOFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgICAgcmV0dXJuIGFzY2lpV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBsYXRpbjFXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICAvLyBXYXJuaW5nOiBtYXhMZW5ndGggbm90IHRha2VuIGludG8gYWNjb3VudCBpbiBiYXNlNjRXcml0ZVxuICAgICAgICByZXR1cm4gYmFzZTY0V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIHVjczJXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiB0b0pTT04gKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdCdWZmZXInLFxuICAgIGRhdGE6IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX2FyciB8fCB0aGlzLCAwKVxuICB9XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKHN0YXJ0ID09PSAwICYmIGVuZCA9PT0gYnVmLmxlbmd0aCkge1xuICAgIHJldHVybiBiYXNlNjQuZnJvbUJ5dGVBcnJheShidWYpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGJhc2U2NC5mcm9tQnl0ZUFycmF5KGJ1Zi5zbGljZShzdGFydCwgZW5kKSlcbiAgfVxufVxuXG5mdW5jdGlvbiB1dGY4U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG4gIHZhciByZXMgPSBbXVxuXG4gIHZhciBpID0gc3RhcnRcbiAgd2hpbGUgKGkgPCBlbmQpIHtcbiAgICB2YXIgZmlyc3RCeXRlID0gYnVmW2ldXG4gICAgdmFyIGNvZGVQb2ludCA9IG51bGxcbiAgICB2YXIgYnl0ZXNQZXJTZXF1ZW5jZSA9IChmaXJzdEJ5dGUgPiAweEVGKSA/IDRcbiAgICAgIDogKGZpcnN0Qnl0ZSA+IDB4REYpID8gM1xuICAgICAgOiAoZmlyc3RCeXRlID4gMHhCRikgPyAyXG4gICAgICA6IDFcblxuICAgIGlmIChpICsgYnl0ZXNQZXJTZXF1ZW5jZSA8PSBlbmQpIHtcbiAgICAgIHZhciBzZWNvbmRCeXRlLCB0aGlyZEJ5dGUsIGZvdXJ0aEJ5dGUsIHRlbXBDb2RlUG9pbnRcblxuICAgICAgc3dpdGNoIChieXRlc1BlclNlcXVlbmNlKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBpZiAoZmlyc3RCeXRlIDwgMHg4MCkge1xuICAgICAgICAgICAgY29kZVBvaW50ID0gZmlyc3RCeXRlXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4MUYpIDw8IDB4NiB8IChzZWNvbmRCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHg3Rikge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIHRoaXJkQnl0ZSA9IGJ1ZltpICsgMl1cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAodGhpcmRCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHhGKSA8PCAweEMgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpIDw8IDB4NiB8ICh0aGlyZEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweDdGRiAmJiAodGVtcENvZGVQb2ludCA8IDB4RDgwMCB8fCB0ZW1wQ29kZVBvaW50ID4gMHhERkZGKSkge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIHRoaXJkQnl0ZSA9IGJ1ZltpICsgMl1cbiAgICAgICAgICBmb3VydGhCeXRlID0gYnVmW2kgKyAzXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwICYmICh0aGlyZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAoZm91cnRoQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4RikgPDwgMHgxMiB8IChzZWNvbmRCeXRlICYgMHgzRikgPDwgMHhDIHwgKHRoaXJkQnl0ZSAmIDB4M0YpIDw8IDB4NiB8IChmb3VydGhCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHhGRkZGICYmIHRlbXBDb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb2RlUG9pbnQgPT09IG51bGwpIHtcbiAgICAgIC8vIHdlIGRpZCBub3QgZ2VuZXJhdGUgYSB2YWxpZCBjb2RlUG9pbnQgc28gaW5zZXJ0IGFcbiAgICAgIC8vIHJlcGxhY2VtZW50IGNoYXIgKFUrRkZGRCkgYW5kIGFkdmFuY2Ugb25seSAxIGJ5dGVcbiAgICAgIGNvZGVQb2ludCA9IDB4RkZGRFxuICAgICAgYnl0ZXNQZXJTZXF1ZW5jZSA9IDFcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA+IDB4RkZGRikge1xuICAgICAgLy8gZW5jb2RlIHRvIHV0ZjE2IChzdXJyb2dhdGUgcGFpciBkYW5jZSlcbiAgICAgIGNvZGVQb2ludCAtPSAweDEwMDAwXG4gICAgICByZXMucHVzaChjb2RlUG9pbnQgPj4+IDEwICYgMHgzRkYgfCAweEQ4MDApXG4gICAgICBjb2RlUG9pbnQgPSAweERDMDAgfCBjb2RlUG9pbnQgJiAweDNGRlxuICAgIH1cblxuICAgIHJlcy5wdXNoKGNvZGVQb2ludClcbiAgICBpICs9IGJ5dGVzUGVyU2VxdWVuY2VcbiAgfVxuXG4gIHJldHVybiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkocmVzKVxufVxuXG4vLyBCYXNlZCBvbiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yMjc0NzI3Mi82ODA3NDIsIHRoZSBicm93c2VyIHdpdGhcbi8vIHRoZSBsb3dlc3QgbGltaXQgaXMgQ2hyb21lLCB3aXRoIDB4MTAwMDAgYXJncy5cbi8vIFdlIGdvIDEgbWFnbml0dWRlIGxlc3MsIGZvciBzYWZldHlcbnZhciBNQVhfQVJHVU1FTlRTX0xFTkdUSCA9IDB4MTAwMFxuXG5mdW5jdGlvbiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkgKGNvZGVQb2ludHMpIHtcbiAgdmFyIGxlbiA9IGNvZGVQb2ludHMubGVuZ3RoXG4gIGlmIChsZW4gPD0gTUFYX0FSR1VNRU5UU19MRU5HVEgpIHtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsIGNvZGVQb2ludHMpIC8vIGF2b2lkIGV4dHJhIHNsaWNlKClcbiAgfVxuXG4gIC8vIERlY29kZSBpbiBjaHVua3MgdG8gYXZvaWQgXCJjYWxsIHN0YWNrIHNpemUgZXhjZWVkZWRcIi5cbiAgdmFyIHJlcyA9ICcnXG4gIHZhciBpID0gMFxuICB3aGlsZSAoaSA8IGxlbikge1xuICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFxuICAgICAgU3RyaW5nLFxuICAgICAgY29kZVBvaW50cy5zbGljZShpLCBpICs9IE1BWF9BUkdVTUVOVFNfTEVOR1RIKVxuICAgIClcbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbmZ1bmN0aW9uIGFzY2lpU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgcmV0ID0gJydcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgcmV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldICYgMHg3RilcbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbmZ1bmN0aW9uIGxhdGluMVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHJldCA9ICcnXG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcblxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgIHJldCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSlcbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbmZ1bmN0aW9uIGhleFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxlbiA9IGJ1Zi5sZW5ndGhcblxuICBpZiAoIXN0YXJ0IHx8IHN0YXJ0IDwgMCkgc3RhcnQgPSAwXG4gIGlmICghZW5kIHx8IGVuZCA8IDAgfHwgZW5kID4gbGVuKSBlbmQgPSBsZW5cblxuICB2YXIgb3V0ID0gJydcbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICBvdXQgKz0gdG9IZXgoYnVmW2ldKVxuICB9XG4gIHJldHVybiBvdXRcbn1cblxuZnVuY3Rpb24gdXRmMTZsZVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGJ5dGVzID0gYnVmLnNsaWNlKHN0YXJ0LCBlbmQpXG4gIHZhciByZXMgPSAnJ1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZXNbaV0gKyBieXRlc1tpICsgMV0gKiAyNTYpXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnNsaWNlID0gZnVuY3Rpb24gc2xpY2UgKHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIHN0YXJ0ID0gfn5zdGFydFxuICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IGxlbiA6IH5+ZW5kXG5cbiAgaWYgKHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ICs9IGxlblxuICAgIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gMFxuICB9IGVsc2UgaWYgKHN0YXJ0ID4gbGVuKSB7XG4gICAgc3RhcnQgPSBsZW5cbiAgfVxuXG4gIGlmIChlbmQgPCAwKSB7XG4gICAgZW5kICs9IGxlblxuICAgIGlmIChlbmQgPCAwKSBlbmQgPSAwXG4gIH0gZWxzZSBpZiAoZW5kID4gbGVuKSB7XG4gICAgZW5kID0gbGVuXG4gIH1cblxuICBpZiAoZW5kIDwgc3RhcnQpIGVuZCA9IHN0YXJ0XG5cbiAgdmFyIG5ld0J1ZlxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICBuZXdCdWYgPSB0aGlzLnN1YmFycmF5KHN0YXJ0LCBlbmQpXG4gICAgbmV3QnVmLl9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgfSBlbHNlIHtcbiAgICB2YXIgc2xpY2VMZW4gPSBlbmQgLSBzdGFydFxuICAgIG5ld0J1ZiA9IG5ldyBCdWZmZXIoc2xpY2VMZW4sIHVuZGVmaW5lZClcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNsaWNlTGVuOyArK2kpIHtcbiAgICAgIG5ld0J1ZltpXSA9IHRoaXNbaSArIHN0YXJ0XVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXdCdWZcbn1cblxuLypcbiAqIE5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgYnVmZmVyIGlzbid0IHRyeWluZyB0byB3cml0ZSBvdXQgb2YgYm91bmRzLlxuICovXG5mdW5jdGlvbiBjaGVja09mZnNldCAob2Zmc2V0LCBleHQsIGxlbmd0aCkge1xuICBpZiAoKG9mZnNldCAlIDEpICE9PSAwIHx8IG9mZnNldCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdvZmZzZXQgaXMgbm90IHVpbnQnKVxuICBpZiAob2Zmc2V0ICsgZXh0ID4gbGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aCcpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRMRSA9IGZ1bmN0aW9uIHJlYWRVSW50TEUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIGldICogbXVsXG4gIH1cblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRCRSA9IGZ1bmN0aW9uIHJlYWRVSW50QkUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG4gIH1cblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAtLWJ5dGVMZW5ndGhdXG4gIHZhciBtdWwgPSAxXG4gIHdoaWxlIChieXRlTGVuZ3RoID4gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIC0tYnl0ZUxlbmd0aF0gKiBtdWxcbiAgfVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDggPSBmdW5jdGlvbiByZWFkVUludDggKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAxLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIHRoaXNbb2Zmc2V0XVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MTZMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gdGhpc1tvZmZzZXRdIHwgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2QkUgPSBmdW5jdGlvbiByZWFkVUludDE2QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuICh0aGlzW29mZnNldF0gPDwgOCkgfCB0aGlzW29mZnNldCArIDFdXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkxFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICgodGhpc1tvZmZzZXRdKSB8XG4gICAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KSB8XG4gICAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCAxNikpICtcbiAgICAgICh0aGlzW29mZnNldCArIDNdICogMHgxMDAwMDAwKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJCRSA9IGZ1bmN0aW9uIHJlYWRVSW50MzJCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdICogMHgxMDAwMDAwKSArXG4gICAgKCh0aGlzW29mZnNldCArIDFdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgOCkgfFxuICAgIHRoaXNbb2Zmc2V0ICsgM10pXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludExFID0gZnVuY3Rpb24gcmVhZEludExFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XVxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyBpXSAqIG11bFxuICB9XG4gIG11bCAqPSAweDgwXG5cbiAgaWYgKHZhbCA+PSBtdWwpIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aClcblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludEJFID0gZnVuY3Rpb24gcmVhZEludEJFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoXG4gIHZhciBtdWwgPSAxXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIC0taV1cbiAgd2hpbGUgKGkgPiAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgLS1pXSAqIG11bFxuICB9XG4gIG11bCAqPSAweDgwXG5cbiAgaWYgKHZhbCA+PSBtdWwpIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aClcblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDggPSBmdW5jdGlvbiByZWFkSW50OCAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDEsIHRoaXMubGVuZ3RoKVxuICBpZiAoISh0aGlzW29mZnNldF0gJiAweDgwKSkgcmV0dXJuICh0aGlzW29mZnNldF0pXG4gIHJldHVybiAoKDB4ZmYgLSB0aGlzW29mZnNldF0gKyAxKSAqIC0xKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkxFID0gZnVuY3Rpb24gcmVhZEludDE2TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XSB8ICh0aGlzW29mZnNldCArIDFdIDw8IDgpXG4gIHJldHVybiAodmFsICYgMHg4MDAwKSA/IHZhbCB8IDB4RkZGRjAwMDAgOiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZCRSA9IGZ1bmN0aW9uIHJlYWRJbnQxNkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIDFdIHwgKHRoaXNbb2Zmc2V0XSA8PCA4KVxuICByZXR1cm4gKHZhbCAmIDB4ODAwMCkgPyB2YWwgfCAweEZGRkYwMDAwIDogdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyTEUgPSBmdW5jdGlvbiByZWFkSW50MzJMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdKSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOCkgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgM10gPDwgMjQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyQkUgPSBmdW5jdGlvbiByZWFkSW50MzJCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdIDw8IDI0KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCA4KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgM10pXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0TEUgPSBmdW5jdGlvbiByZWFkRmxvYXRMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgMjMsIDQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0QkUgPSBmdW5jdGlvbiByZWFkRmxvYXRCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgZmFsc2UsIDIzLCA0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVMRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDgsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgNTIsIDgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZERvdWJsZUJFID0gZnVuY3Rpb24gcmVhZERvdWJsZUJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgOCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCBmYWxzZSwgNTIsIDgpXG59XG5cbmZ1bmN0aW9uIGNoZWNrSW50IChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYnVmKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJidWZmZXJcIiBhcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIGluc3RhbmNlJylcbiAgaWYgKHZhbHVlID4gbWF4IHx8IHZhbHVlIDwgbWluKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJ2YWx1ZVwiIGFyZ3VtZW50IGlzIG91dCBvZiBib3VuZHMnKVxuICBpZiAob2Zmc2V0ICsgZXh0ID4gYnVmLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50TEUgPSBmdW5jdGlvbiB3cml0ZVVJbnRMRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBtYXhCeXRlcyA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKSAtIDFcbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBtYXhCeXRlcywgMClcbiAgfVxuXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB0aGlzW29mZnNldCArIGldID0gKHZhbHVlIC8gbXVsKSAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnRCRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBtYXhCeXRlcyA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKSAtIDFcbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBtYXhCeXRlcywgMClcbiAgfVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aCAtIDFcbiAgdmFyIG11bCA9IDFcbiAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoLS1pID49IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB0aGlzW29mZnNldCArIGldID0gKHZhbHVlIC8gbXVsKSAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50OCA9IGZ1bmN0aW9uIHdyaXRlVUludDggKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMHhmZiwgMClcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkgdmFsdWUgPSBNYXRoLmZsb29yKHZhbHVlKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgMVxufVxuXG5mdW5jdGlvbiBvYmplY3RXcml0ZVVJbnQxNiAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4pIHtcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmYgKyB2YWx1ZSArIDFcbiAgZm9yICh2YXIgaSA9IDAsIGogPSBNYXRoLm1pbihidWYubGVuZ3RoIC0gb2Zmc2V0LCAyKTsgaSA8IGo7ICsraSkge1xuICAgIGJ1ZltvZmZzZXQgKyBpXSA9ICh2YWx1ZSAmICgweGZmIDw8ICg4ICogKGxpdHRsZUVuZGlhbiA/IGkgOiAxIC0gaSkpKSkgPj4+XG4gICAgICAobGl0dGxlRW5kaWFuID8gaSA6IDEgLSBpKSAqIDhcbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZVVJbnQxNkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4ZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MTZCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweGZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5mdW5jdGlvbiBvYmplY3RXcml0ZVVJbnQzMiAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4pIHtcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmZmZmZmICsgdmFsdWUgKyAxXG4gIGZvciAodmFyIGkgPSAwLCBqID0gTWF0aC5taW4oYnVmLmxlbmd0aCAtIG9mZnNldCwgNCk7IGkgPCBqOyArK2kpIHtcbiAgICBidWZbb2Zmc2V0ICsgaV0gPSAodmFsdWUgPj4+IChsaXR0bGVFbmRpYW4gPyBpIDogMyAtIGkpICogOCkgJiAweGZmXG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkxFID0gZnVuY3Rpb24gd3JpdGVVSW50MzJMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweGZmZmZmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlID4+PiAyNClcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDMyQkUgPSBmdW5jdGlvbiB3cml0ZVVJbnQzMkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4ZmZmZmZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gMjQpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50TEUgPSBmdW5jdGlvbiB3cml0ZUludExFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbGltaXQgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCAtIDEpXG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdClcbiAgfVxuXG4gIHZhciBpID0gMFxuICB2YXIgbXVsID0gMVxuICB2YXIgc3ViID0gMFxuICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICBpZiAodmFsdWUgPCAwICYmIHN1YiA9PT0gMCAmJiB0aGlzW29mZnNldCArIGkgLSAxXSAhPT0gMCkge1xuICAgICAgc3ViID0gMVxuICAgIH1cbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50QkUgPSBmdW5jdGlvbiB3cml0ZUludEJFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbGltaXQgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCAtIDEpXG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdClcbiAgfVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aCAtIDFcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHN1YiA9IDBcbiAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoLS1pID49IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICBpZiAodmFsdWUgPCAwICYmIHN1YiA9PT0gMCAmJiB0aGlzW29mZnNldCArIGkgKyAxXSAhPT0gMCkge1xuICAgICAgc3ViID0gMVxuICAgIH1cbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50OCA9IGZ1bmN0aW9uIHdyaXRlSW50OCAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAxLCAweDdmLCAtMHg4MClcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkgdmFsdWUgPSBNYXRoLmZsb29yKHZhbHVlKVxuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmYgKyB2YWx1ZSArIDFcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZUludDE2TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHg3ZmZmLCAtMHg4MDAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZCRSA9IGZ1bmN0aW9uIHdyaXRlSW50MTZCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweDdmZmYsIC0weDgwMDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJMRSA9IGZ1bmN0aW9uIHdyaXRlSW50MzJMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgPj4+IDI0KVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyQkUgPSBmdW5jdGlvbiB3cml0ZUludDMyQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDApXG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmZmZmZiArIHZhbHVlICsgMVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDI0KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuZnVuY3Rpb24gY2hlY2tJRUVFNzU0IChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHtcbiAgaWYgKG9mZnNldCArIGV4dCA+IGJ1Zi5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxuICBpZiAob2Zmc2V0IDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG59XG5cbmZ1bmN0aW9uIHdyaXRlRmxvYXQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgNCwgMy40MDI4MjM0NjYzODUyODg2ZSszOCwgLTMuNDAyODIzNDY2Mzg1Mjg4NmUrMzgpXG4gIH1cbiAgaWVlZTc1NC53cml0ZShidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgMjMsIDQpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdExFID0gZnVuY3Rpb24gd3JpdGVGbG9hdExFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVGbG9hdCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0QkUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydClcbn1cblxuZnVuY3Rpb24gd3JpdGVEb3VibGUgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgOCwgMS43OTc2OTMxMzQ4NjIzMTU3RSszMDgsIC0xLjc5NzY5MzEzNDg2MjMxNTdFKzMwOClcbiAgfVxuICBpZWVlNzU0LndyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCA1MiwgOClcbiAgcmV0dXJuIG9mZnNldCArIDhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUxFID0gZnVuY3Rpb24gd3JpdGVEb3VibGVMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlQkUgPSBmdW5jdGlvbiB3cml0ZURvdWJsZUJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVEb3VibGUodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG4vLyBjb3B5KHRhcmdldEJ1ZmZlciwgdGFyZ2V0U3RhcnQ9MCwgc291cmNlU3RhcnQ9MCwgc291cmNlRW5kPWJ1ZmZlci5sZW5ndGgpXG5CdWZmZXIucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiBjb3B5ICh0YXJnZXQsIHRhcmdldFN0YXJ0LCBzdGFydCwgZW5kKSB7XG4gIGlmICghc3RhcnQpIHN0YXJ0ID0gMFxuICBpZiAoIWVuZCAmJiBlbmQgIT09IDApIGVuZCA9IHRoaXMubGVuZ3RoXG4gIGlmICh0YXJnZXRTdGFydCA+PSB0YXJnZXQubGVuZ3RoKSB0YXJnZXRTdGFydCA9IHRhcmdldC5sZW5ndGhcbiAgaWYgKCF0YXJnZXRTdGFydCkgdGFyZ2V0U3RhcnQgPSAwXG4gIGlmIChlbmQgPiAwICYmIGVuZCA8IHN0YXJ0KSBlbmQgPSBzdGFydFxuXG4gIC8vIENvcHkgMCBieXRlczsgd2UncmUgZG9uZVxuICBpZiAoZW5kID09PSBzdGFydCkgcmV0dXJuIDBcbiAgaWYgKHRhcmdldC5sZW5ndGggPT09IDAgfHwgdGhpcy5sZW5ndGggPT09IDApIHJldHVybiAwXG5cbiAgLy8gRmF0YWwgZXJyb3IgY29uZGl0aW9uc1xuICBpZiAodGFyZ2V0U3RhcnQgPCAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3RhcmdldFN0YXJ0IG91dCBvZiBib3VuZHMnKVxuICB9XG4gIGlmIChzdGFydCA8IDAgfHwgc3RhcnQgPj0gdGhpcy5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdzb3VyY2VTdGFydCBvdXQgb2YgYm91bmRzJylcbiAgaWYgKGVuZCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdzb3VyY2VFbmQgb3V0IG9mIGJvdW5kcycpXG5cbiAgLy8gQXJlIHdlIG9vYj9cbiAgaWYgKGVuZCA+IHRoaXMubGVuZ3RoKSBlbmQgPSB0aGlzLmxlbmd0aFxuICBpZiAodGFyZ2V0Lmxlbmd0aCAtIHRhcmdldFN0YXJ0IDwgZW5kIC0gc3RhcnQpIHtcbiAgICBlbmQgPSB0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgKyBzdGFydFxuICB9XG5cbiAgdmFyIGxlbiA9IGVuZCAtIHN0YXJ0XG4gIHZhciBpXG5cbiAgaWYgKHRoaXMgPT09IHRhcmdldCAmJiBzdGFydCA8IHRhcmdldFN0YXJ0ICYmIHRhcmdldFN0YXJ0IDwgZW5kKSB7XG4gICAgLy8gZGVzY2VuZGluZyBjb3B5IGZyb20gZW5kXG4gICAgZm9yIChpID0gbGVuIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgIHRhcmdldFtpICsgdGFyZ2V0U3RhcnRdID0gdGhpc1tpICsgc3RhcnRdXG4gICAgfVxuICB9IGVsc2UgaWYgKGxlbiA8IDEwMDAgfHwgIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gYXNjZW5kaW5nIGNvcHkgZnJvbSBzdGFydFxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgICAgdGFyZ2V0W2kgKyB0YXJnZXRTdGFydF0gPSB0aGlzW2kgKyBzdGFydF1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgVWludDhBcnJheS5wcm90b3R5cGUuc2V0LmNhbGwoXG4gICAgICB0YXJnZXQsXG4gICAgICB0aGlzLnN1YmFycmF5KHN0YXJ0LCBzdGFydCArIGxlbiksXG4gICAgICB0YXJnZXRTdGFydFxuICAgIClcbiAgfVxuXG4gIHJldHVybiBsZW5cbn1cblxuLy8gVXNhZ2U6XG4vLyAgICBidWZmZXIuZmlsbChudW1iZXJbLCBvZmZzZXRbLCBlbmRdXSlcbi8vICAgIGJ1ZmZlci5maWxsKGJ1ZmZlclssIG9mZnNldFssIGVuZF1dKVxuLy8gICAgYnVmZmVyLmZpbGwoc3RyaW5nWywgb2Zmc2V0WywgZW5kXV1bLCBlbmNvZGluZ10pXG5CdWZmZXIucHJvdG90eXBlLmZpbGwgPSBmdW5jdGlvbiBmaWxsICh2YWwsIHN0YXJ0LCBlbmQsIGVuY29kaW5nKSB7XG4gIC8vIEhhbmRsZSBzdHJpbmcgY2FzZXM6XG4gIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgIGlmICh0eXBlb2Ygc3RhcnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbmNvZGluZyA9IHN0YXJ0XG4gICAgICBzdGFydCA9IDBcbiAgICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZW5kID09PSAnc3RyaW5nJykge1xuICAgICAgZW5jb2RpbmcgPSBlbmRcbiAgICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gICAgfVxuICAgIGlmICh2YWwubGVuZ3RoID09PSAxKSB7XG4gICAgICB2YXIgY29kZSA9IHZhbC5jaGFyQ29kZUF0KDApXG4gICAgICBpZiAoY29kZSA8IDI1Nikge1xuICAgICAgICB2YWwgPSBjb2RlXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBlbmNvZGluZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2VuY29kaW5nIG11c3QgYmUgYSBzdHJpbmcnKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJyAmJiAhQnVmZmVyLmlzRW5jb2RpbmcoZW5jb2RpbmcpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgdmFsID0gdmFsICYgMjU1XG4gIH1cblxuICAvLyBJbnZhbGlkIHJhbmdlcyBhcmUgbm90IHNldCB0byBhIGRlZmF1bHQsIHNvIGNhbiByYW5nZSBjaGVjayBlYXJseS5cbiAgaWYgKHN0YXJ0IDwgMCB8fCB0aGlzLmxlbmd0aCA8IHN0YXJ0IHx8IHRoaXMubGVuZ3RoIDwgZW5kKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ091dCBvZiByYW5nZSBpbmRleCcpXG4gIH1cblxuICBpZiAoZW5kIDw9IHN0YXJ0KSB7XG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHN0YXJ0ID0gc3RhcnQgPj4+IDBcbiAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyB0aGlzLmxlbmd0aCA6IGVuZCA+Pj4gMFxuXG4gIGlmICghdmFsKSB2YWwgPSAwXG5cbiAgdmFyIGlcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgICAgdGhpc1tpXSA9IHZhbFxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgYnl0ZXMgPSBCdWZmZXIuaXNCdWZmZXIodmFsKVxuICAgICAgPyB2YWxcbiAgICAgIDogdXRmOFRvQnl0ZXMobmV3IEJ1ZmZlcih2YWwsIGVuY29kaW5nKS50b1N0cmluZygpKVxuICAgIHZhciBsZW4gPSBieXRlcy5sZW5ndGhcbiAgICBmb3IgKGkgPSAwOyBpIDwgZW5kIC0gc3RhcnQ7ICsraSkge1xuICAgICAgdGhpc1tpICsgc3RhcnRdID0gYnl0ZXNbaSAlIGxlbl1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpc1xufVxuXG4vLyBIRUxQRVIgRlVOQ1RJT05TXG4vLyA9PT09PT09PT09PT09PT09XG5cbnZhciBJTlZBTElEX0JBU0U2NF9SRSA9IC9bXitcXC8wLTlBLVphLXotX10vZ1xuXG5mdW5jdGlvbiBiYXNlNjRjbGVhbiAoc3RyKSB7XG4gIC8vIE5vZGUgc3RyaXBzIG91dCBpbnZhbGlkIGNoYXJhY3RlcnMgbGlrZSBcXG4gYW5kIFxcdCBmcm9tIHRoZSBzdHJpbmcsIGJhc2U2NC1qcyBkb2VzIG5vdFxuICBzdHIgPSBzdHJpbmd0cmltKHN0cikucmVwbGFjZShJTlZBTElEX0JBU0U2NF9SRSwgJycpXG4gIC8vIE5vZGUgY29udmVydHMgc3RyaW5ncyB3aXRoIGxlbmd0aCA8IDIgdG8gJydcbiAgaWYgKHN0ci5sZW5ndGggPCAyKSByZXR1cm4gJydcbiAgLy8gTm9kZSBhbGxvd3MgZm9yIG5vbi1wYWRkZWQgYmFzZTY0IHN0cmluZ3MgKG1pc3NpbmcgdHJhaWxpbmcgPT09KSwgYmFzZTY0LWpzIGRvZXMgbm90XG4gIHdoaWxlIChzdHIubGVuZ3RoICUgNCAhPT0gMCkge1xuICAgIHN0ciA9IHN0ciArICc9J1xuICB9XG4gIHJldHVybiBzdHJcbn1cblxuZnVuY3Rpb24gc3RyaW5ndHJpbSAoc3RyKSB7XG4gIGlmIChzdHIudHJpbSkgcmV0dXJuIHN0ci50cmltKClcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLCAnJylcbn1cblxuZnVuY3Rpb24gdG9IZXggKG4pIHtcbiAgaWYgKG4gPCAxNikgcmV0dXJuICcwJyArIG4udG9TdHJpbmcoMTYpXG4gIHJldHVybiBuLnRvU3RyaW5nKDE2KVxufVxuXG5mdW5jdGlvbiB1dGY4VG9CeXRlcyAoc3RyaW5nLCB1bml0cykge1xuICB1bml0cyA9IHVuaXRzIHx8IEluZmluaXR5XG4gIHZhciBjb2RlUG9pbnRcbiAgdmFyIGxlbmd0aCA9IHN0cmluZy5sZW5ndGhcbiAgdmFyIGxlYWRTdXJyb2dhdGUgPSBudWxsXG4gIHZhciBieXRlcyA9IFtdXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGNvZGVQb2ludCA9IHN0cmluZy5jaGFyQ29kZUF0KGkpXG5cbiAgICAvLyBpcyBzdXJyb2dhdGUgY29tcG9uZW50XG4gICAgaWYgKGNvZGVQb2ludCA+IDB4RDdGRiAmJiBjb2RlUG9pbnQgPCAweEUwMDApIHtcbiAgICAgIC8vIGxhc3QgY2hhciB3YXMgYSBsZWFkXG4gICAgICBpZiAoIWxlYWRTdXJyb2dhdGUpIHtcbiAgICAgICAgLy8gbm8gbGVhZCB5ZXRcbiAgICAgICAgaWYgKGNvZGVQb2ludCA+IDB4REJGRikge1xuICAgICAgICAgIC8vIHVuZXhwZWN0ZWQgdHJhaWxcbiAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9IGVsc2UgaWYgKGkgKyAxID09PSBsZW5ndGgpIHtcbiAgICAgICAgICAvLyB1bnBhaXJlZCBsZWFkXG4gICAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHZhbGlkIGxlYWRcbiAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IGNvZGVQb2ludFxuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIDIgbGVhZHMgaW4gYSByb3dcbiAgICAgIGlmIChjb2RlUG9pbnQgPCAweERDMDApIHtcbiAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgIGxlYWRTdXJyb2dhdGUgPSBjb2RlUG9pbnRcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gdmFsaWQgc3Vycm9nYXRlIHBhaXJcbiAgICAgIGNvZGVQb2ludCA9IChsZWFkU3Vycm9nYXRlIC0gMHhEODAwIDw8IDEwIHwgY29kZVBvaW50IC0gMHhEQzAwKSArIDB4MTAwMDBcbiAgICB9IGVsc2UgaWYgKGxlYWRTdXJyb2dhdGUpIHtcbiAgICAgIC8vIHZhbGlkIGJtcCBjaGFyLCBidXQgbGFzdCBjaGFyIHdhcyBhIGxlYWRcbiAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgIH1cblxuICAgIGxlYWRTdXJyb2dhdGUgPSBudWxsXG5cbiAgICAvLyBlbmNvZGUgdXRmOFxuICAgIGlmIChjb2RlUG9pbnQgPCAweDgwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDEpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goY29kZVBvaW50KVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHg4MDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMikgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiB8IDB4QzAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDEwMDAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDMpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweEMgfCAweEUwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2ICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSA0KSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHgxMiB8IDB4RjAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweEMgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29kZSBwb2ludCcpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJ5dGVzXG59XG5cbmZ1bmN0aW9uIGFzY2lpVG9CeXRlcyAoc3RyKSB7XG4gIHZhciBieXRlQXJyYXkgPSBbXVxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgIC8vIE5vZGUncyBjb2RlIHNlZW1zIHRvIGJlIGRvaW5nIHRoaXMgYW5kIG5vdCAmIDB4N0YuLlxuICAgIGJ5dGVBcnJheS5wdXNoKHN0ci5jaGFyQ29kZUF0KGkpICYgMHhGRilcbiAgfVxuICByZXR1cm4gYnl0ZUFycmF5XG59XG5cbmZ1bmN0aW9uIHV0ZjE2bGVUb0J5dGVzIChzdHIsIHVuaXRzKSB7XG4gIHZhciBjLCBoaSwgbG9cbiAgdmFyIGJ5dGVBcnJheSA9IFtdXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgaWYgKCh1bml0cyAtPSAyKSA8IDApIGJyZWFrXG5cbiAgICBjID0gc3RyLmNoYXJDb2RlQXQoaSlcbiAgICBoaSA9IGMgPj4gOFxuICAgIGxvID0gYyAlIDI1NlxuICAgIGJ5dGVBcnJheS5wdXNoKGxvKVxuICAgIGJ5dGVBcnJheS5wdXNoKGhpKVxuICB9XG5cbiAgcmV0dXJuIGJ5dGVBcnJheVxufVxuXG5mdW5jdGlvbiBiYXNlNjRUb0J5dGVzIChzdHIpIHtcbiAgcmV0dXJuIGJhc2U2NC50b0J5dGVBcnJheShiYXNlNjRjbGVhbihzdHIpKVxufVxuXG5mdW5jdGlvbiBibGl0QnVmZmVyIChzcmMsIGRzdCwgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGlmICgoaSArIG9mZnNldCA+PSBkc3QubGVuZ3RoKSB8fCAoaSA+PSBzcmMubGVuZ3RoKSkgYnJlYWtcbiAgICBkc3RbaSArIG9mZnNldF0gPSBzcmNbaV1cbiAgfVxuICByZXR1cm4gaVxufVxuXG5mdW5jdGlvbiBpc25hbiAodmFsKSB7XG4gIHJldHVybiB2YWwgIT09IHZhbCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtY29tcGFyZVxufVxuIiwiLyohIGllZWU3NTQuIEJTRC0zLUNsYXVzZSBMaWNlbnNlLiBGZXJvc3MgQWJvdWtoYWRpamVoIDxodHRwczovL2Zlcm9zcy5vcmcvb3BlbnNvdXJjZT4gKi9cbmV4cG9ydHMucmVhZCA9IGZ1bmN0aW9uIChidWZmZXIsIG9mZnNldCwgaXNMRSwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBlLCBtXG4gIHZhciBlTGVuID0gKG5CeXRlcyAqIDgpIC0gbUxlbiAtIDFcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDFcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxXG4gIHZhciBuQml0cyA9IC03XG4gIHZhciBpID0gaXNMRSA/IChuQnl0ZXMgLSAxKSA6IDBcbiAgdmFyIGQgPSBpc0xFID8gLTEgOiAxXG4gIHZhciBzID0gYnVmZmVyW29mZnNldCArIGldXG5cbiAgaSArPSBkXG5cbiAgZSA9IHMgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgcyA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gZUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBlID0gKGUgKiAyNTYpICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgbSA9IGUgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgZSA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gbUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBtID0gKG0gKiAyNTYpICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgaWYgKGUgPT09IDApIHtcbiAgICBlID0gMSAtIGVCaWFzXG4gIH0gZWxzZSBpZiAoZSA9PT0gZU1heCkge1xuICAgIHJldHVybiBtID8gTmFOIDogKChzID8gLTEgOiAxKSAqIEluZmluaXR5KVxuICB9IGVsc2Uge1xuICAgIG0gPSBtICsgTWF0aC5wb3coMiwgbUxlbilcbiAgICBlID0gZSAtIGVCaWFzXG4gIH1cbiAgcmV0dXJuIChzID8gLTEgOiAxKSAqIG0gKiBNYXRoLnBvdygyLCBlIC0gbUxlbilcbn1cblxuZXhwb3J0cy53cml0ZSA9IGZ1bmN0aW9uIChidWZmZXIsIHZhbHVlLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbSwgY1xuICB2YXIgZUxlbiA9IChuQnl0ZXMgKiA4KSAtIG1MZW4gLSAxXG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxXG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMVxuICB2YXIgcnQgPSAobUxlbiA9PT0gMjMgPyBNYXRoLnBvdygyLCAtMjQpIC0gTWF0aC5wb3coMiwgLTc3KSA6IDApXG4gIHZhciBpID0gaXNMRSA/IDAgOiAobkJ5dGVzIC0gMSlcbiAgdmFyIGQgPSBpc0xFID8gMSA6IC0xXG4gIHZhciBzID0gdmFsdWUgPCAwIHx8ICh2YWx1ZSA9PT0gMCAmJiAxIC8gdmFsdWUgPCAwKSA/IDEgOiAwXG5cbiAgdmFsdWUgPSBNYXRoLmFicyh2YWx1ZSlcblxuICBpZiAoaXNOYU4odmFsdWUpIHx8IHZhbHVlID09PSBJbmZpbml0eSkge1xuICAgIG0gPSBpc05hTih2YWx1ZSkgPyAxIDogMFxuICAgIGUgPSBlTWF4XG4gIH0gZWxzZSB7XG4gICAgZSA9IE1hdGguZmxvb3IoTWF0aC5sb2codmFsdWUpIC8gTWF0aC5MTjIpXG4gICAgaWYgKHZhbHVlICogKGMgPSBNYXRoLnBvdygyLCAtZSkpIDwgMSkge1xuICAgICAgZS0tXG4gICAgICBjICo9IDJcbiAgICB9XG4gICAgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICB2YWx1ZSArPSBydCAvIGNcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWUgKz0gcnQgKiBNYXRoLnBvdygyLCAxIC0gZUJpYXMpXG4gICAgfVxuICAgIGlmICh2YWx1ZSAqIGMgPj0gMikge1xuICAgICAgZSsrXG4gICAgICBjIC89IDJcbiAgICB9XG5cbiAgICBpZiAoZSArIGVCaWFzID49IGVNYXgpIHtcbiAgICAgIG0gPSAwXG4gICAgICBlID0gZU1heFxuICAgIH0gZWxzZSBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIG0gPSAoKHZhbHVlICogYykgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pXG4gICAgICBlID0gZSArIGVCaWFzXG4gICAgfSBlbHNlIHtcbiAgICAgIG0gPSB2YWx1ZSAqIE1hdGgucG93KDIsIGVCaWFzIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKVxuICAgICAgZSA9IDBcbiAgICB9XG4gIH1cblxuICBmb3IgKDsgbUxlbiA+PSA4OyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBtICYgMHhmZiwgaSArPSBkLCBtIC89IDI1NiwgbUxlbiAtPSA4KSB7fVxuXG4gIGUgPSAoZSA8PCBtTGVuKSB8IG1cbiAgZUxlbiArPSBtTGVuXG4gIGZvciAoOyBlTGVuID4gMDsgYnVmZmVyW29mZnNldCArIGldID0gZSAmIDB4ZmYsIGkgKz0gZCwgZSAvPSAyNTYsIGVMZW4gLT0gOCkge31cblxuICBidWZmZXJbb2Zmc2V0ICsgaSAtIGRdIHw9IHMgKiAxMjhcbn1cbiIsInZhciB0b1N0cmluZyA9IHt9LnRvU3RyaW5nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gKGFycikge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbChhcnIpID09ICdbb2JqZWN0IEFycmF5XSc7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBMb25nO1xyXG5cclxuLyoqXHJcbiAqIHdhc20gb3B0aW1pemF0aW9ucywgdG8gZG8gbmF0aXZlIGk2NCBtdWx0aXBsaWNhdGlvbiBhbmQgZGl2aWRlXHJcbiAqL1xyXG52YXIgd2FzbSA9IG51bGw7XHJcblxyXG50cnkge1xyXG4gIHdhc20gPSBuZXcgV2ViQXNzZW1ibHkuSW5zdGFuY2UobmV3IFdlYkFzc2VtYmx5Lk1vZHVsZShuZXcgVWludDhBcnJheShbXHJcbiAgICAwLCA5NywgMTE1LCAxMDksIDEsIDAsIDAsIDAsIDEsIDEzLCAyLCA5NiwgMCwgMSwgMTI3LCA5NiwgNCwgMTI3LCAxMjcsIDEyNywgMTI3LCAxLCAxMjcsIDMsIDcsIDYsIDAsIDEsIDEsIDEsIDEsIDEsIDYsIDYsIDEsIDEyNywgMSwgNjUsIDAsIDExLCA3LCA1MCwgNiwgMywgMTA5LCAxMTcsIDEwOCwgMCwgMSwgNSwgMTAwLCAxMDUsIDExOCwgOTUsIDExNSwgMCwgMiwgNSwgMTAwLCAxMDUsIDExOCwgOTUsIDExNywgMCwgMywgNSwgMTE0LCAxMDEsIDEwOSwgOTUsIDExNSwgMCwgNCwgNSwgMTE0LCAxMDEsIDEwOSwgOTUsIDExNywgMCwgNSwgOCwgMTAzLCAxMDEsIDExNiwgOTUsIDEwNCwgMTA1LCAxMDMsIDEwNCwgMCwgMCwgMTAsIDE5MSwgMSwgNiwgNCwgMCwgMzUsIDAsIDExLCAzNiwgMSwgMSwgMTI2LCAzMiwgMCwgMTczLCAzMiwgMSwgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAzMiwgMiwgMTczLCAzMiwgMywgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAxMjYsIDM0LCA0LCA2NiwgMzIsIDEzNSwgMTY3LCAzNiwgMCwgMzIsIDQsIDE2NywgMTEsIDM2LCAxLCAxLCAxMjYsIDMyLCAwLCAxNzMsIDMyLCAxLCAxNzMsIDY2LCAzMiwgMTM0LCAxMzIsIDMyLCAyLCAxNzMsIDMyLCAzLCAxNzMsIDY2LCAzMiwgMTM0LCAxMzIsIDEyNywgMzQsIDQsIDY2LCAzMiwgMTM1LCAxNjcsIDM2LCAwLCAzMiwgNCwgMTY3LCAxMSwgMzYsIDEsIDEsIDEyNiwgMzIsIDAsIDE3MywgMzIsIDEsIDE3MywgNjYsIDMyLCAxMzQsIDEzMiwgMzIsIDIsIDE3MywgMzIsIDMsIDE3MywgNjYsIDMyLCAxMzQsIDEzMiwgMTI4LCAzNCwgNCwgNjYsIDMyLCAxMzUsIDE2NywgMzYsIDAsIDMyLCA0LCAxNjcsIDExLCAzNiwgMSwgMSwgMTI2LCAzMiwgMCwgMTczLCAzMiwgMSwgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAzMiwgMiwgMTczLCAzMiwgMywgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAxMjksIDM0LCA0LCA2NiwgMzIsIDEzNSwgMTY3LCAzNiwgMCwgMzIsIDQsIDE2NywgMTEsIDM2LCAxLCAxLCAxMjYsIDMyLCAwLCAxNzMsIDMyLCAxLCAxNzMsIDY2LCAzMiwgMTM0LCAxMzIsIDMyLCAyLCAxNzMsIDMyLCAzLCAxNzMsIDY2LCAzMiwgMTM0LCAxMzIsIDEzMCwgMzQsIDQsIDY2LCAzMiwgMTM1LCAxNjcsIDM2LCAwLCAzMiwgNCwgMTY3LCAxMVxyXG4gIF0pKSwge30pLmV4cG9ydHM7XHJcbn0gY2F0Y2ggKGUpIHtcclxuICAvLyBubyB3YXNtIHN1cHBvcnQgOihcclxufVxyXG5cclxuLyoqXHJcbiAqIENvbnN0cnVjdHMgYSA2NCBiaXQgdHdvJ3MtY29tcGxlbWVudCBpbnRlZ2VyLCBnaXZlbiBpdHMgbG93IGFuZCBoaWdoIDMyIGJpdCB2YWx1ZXMgYXMgKnNpZ25lZCogaW50ZWdlcnMuXHJcbiAqICBTZWUgdGhlIGZyb20qIGZ1bmN0aW9ucyBiZWxvdyBmb3IgbW9yZSBjb252ZW5pZW50IHdheXMgb2YgY29uc3RydWN0aW5nIExvbmdzLlxyXG4gKiBAZXhwb3J0cyBMb25nXHJcbiAqIEBjbGFzcyBBIExvbmcgY2xhc3MgZm9yIHJlcHJlc2VudGluZyBhIDY0IGJpdCB0d28ncy1jb21wbGVtZW50IGludGVnZXIgdmFsdWUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBsb3cgVGhlIGxvdyAoc2lnbmVkKSAzMiBiaXRzIG9mIHRoZSBsb25nXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBoaWdoIFRoZSBoaWdoIChzaWduZWQpIDMyIGJpdHMgb2YgdGhlIGxvbmdcclxuICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWQgV2hldGhlciB1bnNpZ25lZCBvciBub3QsIGRlZmF1bHRzIHRvIHNpZ25lZFxyXG4gKiBAY29uc3RydWN0b3JcclxuICovXHJcbmZ1bmN0aW9uIExvbmcobG93LCBoaWdoLCB1bnNpZ25lZCkge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGxvdyAzMiBiaXRzIGFzIGEgc2lnbmVkIHZhbHVlLlxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqL1xyXG4gICAgdGhpcy5sb3cgPSBsb3cgfCAwO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGhpZ2ggMzIgYml0cyBhcyBhIHNpZ25lZCB2YWx1ZS5cclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKi9cclxuICAgIHRoaXMuaGlnaCA9IGhpZ2ggfCAwO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogV2hldGhlciB1bnNpZ25lZCBvciBub3QuXHJcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAqL1xyXG4gICAgdGhpcy51bnNpZ25lZCA9ICEhdW5zaWduZWQ7XHJcbn1cclxuXHJcbi8vIFRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiBhIGxvbmcgaXMgdGhlIHR3byBnaXZlbiBzaWduZWQsIDMyLWJpdCB2YWx1ZXMuXHJcbi8vIFdlIHVzZSAzMi1iaXQgcGllY2VzIGJlY2F1c2UgdGhlc2UgYXJlIHRoZSBzaXplIG9mIGludGVnZXJzIG9uIHdoaWNoXHJcbi8vIEphdmFzY3JpcHQgcGVyZm9ybXMgYml0LW9wZXJhdGlvbnMuICBGb3Igb3BlcmF0aW9ucyBsaWtlIGFkZGl0aW9uIGFuZFxyXG4vLyBtdWx0aXBsaWNhdGlvbiwgd2Ugc3BsaXQgZWFjaCBudW1iZXIgaW50byAxNiBiaXQgcGllY2VzLCB3aGljaCBjYW4gZWFzaWx5IGJlXHJcbi8vIG11bHRpcGxpZWQgd2l0aGluIEphdmFzY3JpcHQncyBmbG9hdGluZy1wb2ludCByZXByZXNlbnRhdGlvbiB3aXRob3V0IG92ZXJmbG93XHJcbi8vIG9yIGNoYW5nZSBpbiBzaWduLlxyXG4vL1xyXG4vLyBJbiB0aGUgYWxnb3JpdGhtcyBiZWxvdywgd2UgZnJlcXVlbnRseSByZWR1Y2UgdGhlIG5lZ2F0aXZlIGNhc2UgdG8gdGhlXHJcbi8vIHBvc2l0aXZlIGNhc2UgYnkgbmVnYXRpbmcgdGhlIGlucHV0KHMpIGFuZCB0aGVuIHBvc3QtcHJvY2Vzc2luZyB0aGUgcmVzdWx0LlxyXG4vLyBOb3RlIHRoYXQgd2UgbXVzdCBBTFdBWVMgY2hlY2sgc3BlY2lhbGx5IHdoZXRoZXIgdGhvc2UgdmFsdWVzIGFyZSBNSU5fVkFMVUVcclxuLy8gKC0yXjYzKSBiZWNhdXNlIC1NSU5fVkFMVUUgPT0gTUlOX1ZBTFVFIChzaW5jZSAyXjYzIGNhbm5vdCBiZSByZXByZXNlbnRlZCBhc1xyXG4vLyBhIHBvc2l0aXZlIG51bWJlciwgaXQgb3ZlcmZsb3dzIGJhY2sgaW50byBhIG5lZ2F0aXZlKS4gIE5vdCBoYW5kbGluZyB0aGlzXHJcbi8vIGNhc2Ugd291bGQgb2Z0ZW4gcmVzdWx0IGluIGluZmluaXRlIHJlY3Vyc2lvbi5cclxuLy9cclxuLy8gQ29tbW9uIGNvbnN0YW50IHZhbHVlcyBaRVJPLCBPTkUsIE5FR19PTkUsIGV0Yy4gYXJlIGRlZmluZWQgYmVsb3cgdGhlIGZyb20qXHJcbi8vIG1ldGhvZHMgb24gd2hpY2ggdGhleSBkZXBlbmQuXHJcblxyXG4vKipcclxuICogQW4gaW5kaWNhdG9yIHVzZWQgdG8gcmVsaWFibHkgZGV0ZXJtaW5lIGlmIGFuIG9iamVjdCBpcyBhIExvbmcgb3Igbm90LlxyXG4gKiBAdHlwZSB7Ym9vbGVhbn1cclxuICogQGNvbnN0XHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5Mb25nLnByb3RvdHlwZS5fX2lzTG9uZ19fO1xyXG5cclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KExvbmcucHJvdG90eXBlLCBcIl9faXNMb25nX19cIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcclxuXHJcbi8qKlxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHsqfSBvYmogT2JqZWN0XHJcbiAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gKiBAaW5uZXJcclxuICovXHJcbmZ1bmN0aW9uIGlzTG9uZyhvYmopIHtcclxuICAgIHJldHVybiAob2JqICYmIG9ialtcIl9faXNMb25nX19cIl0pID09PSB0cnVlO1xyXG59XHJcblxyXG4vKipcclxuICogVGVzdHMgaWYgdGhlIHNwZWNpZmllZCBvYmplY3QgaXMgYSBMb25nLlxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHsqfSBvYmogT2JqZWN0XHJcbiAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gKi9cclxuTG9uZy5pc0xvbmcgPSBpc0xvbmc7XHJcblxyXG4vKipcclxuICogQSBjYWNoZSBvZiB0aGUgTG9uZyByZXByZXNlbnRhdGlvbnMgb2Ygc21hbGwgaW50ZWdlciB2YWx1ZXMuXHJcbiAqIEB0eXBlIHshT2JqZWN0fVxyXG4gKiBAaW5uZXJcclxuICovXHJcbnZhciBJTlRfQ0FDSEUgPSB7fTtcclxuXHJcbi8qKlxyXG4gKiBBIGNhY2hlIG9mIHRoZSBMb25nIHJlcHJlc2VudGF0aW9ucyBvZiBzbWFsbCB1bnNpZ25lZCBpbnRlZ2VyIHZhbHVlcy5cclxuICogQHR5cGUgeyFPYmplY3R9XHJcbiAqIEBpbm5lclxyXG4gKi9cclxudmFyIFVJTlRfQ0FDSEUgPSB7fTtcclxuXHJcbi8qKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcclxuICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWRcclxuICogQHJldHVybnMgeyFMb25nfVxyXG4gKiBAaW5uZXJcclxuICovXHJcbmZ1bmN0aW9uIGZyb21JbnQodmFsdWUsIHVuc2lnbmVkKSB7XHJcbiAgICB2YXIgb2JqLCBjYWNoZWRPYmosIGNhY2hlO1xyXG4gICAgaWYgKHVuc2lnbmVkKSB7XHJcbiAgICAgICAgdmFsdWUgPj4+PSAwO1xyXG4gICAgICAgIGlmIChjYWNoZSA9ICgwIDw9IHZhbHVlICYmIHZhbHVlIDwgMjU2KSkge1xyXG4gICAgICAgICAgICBjYWNoZWRPYmogPSBVSU5UX0NBQ0hFW3ZhbHVlXTtcclxuICAgICAgICAgICAgaWYgKGNhY2hlZE9iailcclxuICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZWRPYmo7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG9iaiA9IGZyb21CaXRzKHZhbHVlLCAodmFsdWUgfCAwKSA8IDAgPyAtMSA6IDAsIHRydWUpO1xyXG4gICAgICAgIGlmIChjYWNoZSlcclxuICAgICAgICAgICAgVUlOVF9DQUNIRVt2YWx1ZV0gPSBvYmo7XHJcbiAgICAgICAgcmV0dXJuIG9iajtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdmFsdWUgfD0gMDtcclxuICAgICAgICBpZiAoY2FjaGUgPSAoLTEyOCA8PSB2YWx1ZSAmJiB2YWx1ZSA8IDEyOCkpIHtcclxuICAgICAgICAgICAgY2FjaGVkT2JqID0gSU5UX0NBQ0hFW3ZhbHVlXTtcclxuICAgICAgICAgICAgaWYgKGNhY2hlZE9iailcclxuICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZWRPYmo7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG9iaiA9IGZyb21CaXRzKHZhbHVlLCB2YWx1ZSA8IDAgPyAtMSA6IDAsIGZhbHNlKTtcclxuICAgICAgICBpZiAoY2FjaGUpXHJcbiAgICAgICAgICAgIElOVF9DQUNIRVt2YWx1ZV0gPSBvYmo7XHJcbiAgICAgICAgcmV0dXJuIG9iajtcclxuICAgIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgYSBMb25nIHJlcHJlc2VudGluZyB0aGUgZ2l2ZW4gMzIgYml0IGludGVnZXIgdmFsdWUuXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgVGhlIDMyIGJpdCBpbnRlZ2VyIGluIHF1ZXN0aW9uXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkIFdoZXRoZXIgdW5zaWduZWQgb3Igbm90LCBkZWZhdWx0cyB0byBzaWduZWRcclxuICogQHJldHVybnMgeyFMb25nfSBUaGUgY29ycmVzcG9uZGluZyBMb25nIHZhbHVlXHJcbiAqL1xyXG5Mb25nLmZyb21JbnQgPSBmcm9tSW50O1xyXG5cclxuLyoqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZVxyXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSB1bnNpZ25lZFxyXG4gKiBAcmV0dXJucyB7IUxvbmd9XHJcbiAqIEBpbm5lclxyXG4gKi9cclxuZnVuY3Rpb24gZnJvbU51bWJlcih2YWx1ZSwgdW5zaWduZWQpIHtcclxuICAgIGlmIChpc05hTih2YWx1ZSkpXHJcbiAgICAgICAgcmV0dXJuIHVuc2lnbmVkID8gVVpFUk8gOiBaRVJPO1xyXG4gICAgaWYgKHVuc2lnbmVkKSB7XHJcbiAgICAgICAgaWYgKHZhbHVlIDwgMClcclxuICAgICAgICAgICAgcmV0dXJuIFVaRVJPO1xyXG4gICAgICAgIGlmICh2YWx1ZSA+PSBUV09fUFdSXzY0X0RCTClcclxuICAgICAgICAgICAgcmV0dXJuIE1BWF9VTlNJR05FRF9WQUxVRTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKHZhbHVlIDw9IC1UV09fUFdSXzYzX0RCTClcclxuICAgICAgICAgICAgcmV0dXJuIE1JTl9WQUxVRTtcclxuICAgICAgICBpZiAodmFsdWUgKyAxID49IFRXT19QV1JfNjNfREJMKVxyXG4gICAgICAgICAgICByZXR1cm4gTUFYX1ZBTFVFO1xyXG4gICAgfVxyXG4gICAgaWYgKHZhbHVlIDwgMClcclxuICAgICAgICByZXR1cm4gZnJvbU51bWJlcigtdmFsdWUsIHVuc2lnbmVkKS5uZWcoKTtcclxuICAgIHJldHVybiBmcm9tQml0cygodmFsdWUgJSBUV09fUFdSXzMyX0RCTCkgfCAwLCAodmFsdWUgLyBUV09fUFdSXzMyX0RCTCkgfCAwLCB1bnNpZ25lZCk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIGEgTG9uZyByZXByZXNlbnRpbmcgdGhlIGdpdmVuIHZhbHVlLCBwcm92aWRlZCB0aGF0IGl0IGlzIGEgZmluaXRlIG51bWJlci4gT3RoZXJ3aXNlLCB6ZXJvIGlzIHJldHVybmVkLlxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIFRoZSBudW1iZXIgaW4gcXVlc3Rpb25cclxuICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWQgV2hldGhlciB1bnNpZ25lZCBvciBub3QsIGRlZmF1bHRzIHRvIHNpZ25lZFxyXG4gKiBAcmV0dXJucyB7IUxvbmd9IFRoZSBjb3JyZXNwb25kaW5nIExvbmcgdmFsdWVcclxuICovXHJcbkxvbmcuZnJvbU51bWJlciA9IGZyb21OdW1iZXI7XHJcblxyXG4vKipcclxuICogQHBhcmFtIHtudW1iZXJ9IGxvd0JpdHNcclxuICogQHBhcmFtIHtudW1iZXJ9IGhpZ2hCaXRzXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkXHJcbiAqIEByZXR1cm5zIHshTG9uZ31cclxuICogQGlubmVyXHJcbiAqL1xyXG5mdW5jdGlvbiBmcm9tQml0cyhsb3dCaXRzLCBoaWdoQml0cywgdW5zaWduZWQpIHtcclxuICAgIHJldHVybiBuZXcgTG9uZyhsb3dCaXRzLCBoaWdoQml0cywgdW5zaWduZWQpO1xyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJucyBhIExvbmcgcmVwcmVzZW50aW5nIHRoZSA2NCBiaXQgaW50ZWdlciB0aGF0IGNvbWVzIGJ5IGNvbmNhdGVuYXRpbmcgdGhlIGdpdmVuIGxvdyBhbmQgaGlnaCBiaXRzLiBFYWNoIGlzXHJcbiAqICBhc3N1bWVkIHRvIHVzZSAzMiBiaXRzLlxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtudW1iZXJ9IGxvd0JpdHMgVGhlIGxvdyAzMiBiaXRzXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBoaWdoQml0cyBUaGUgaGlnaCAzMiBiaXRzXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkIFdoZXRoZXIgdW5zaWduZWQgb3Igbm90LCBkZWZhdWx0cyB0byBzaWduZWRcclxuICogQHJldHVybnMgeyFMb25nfSBUaGUgY29ycmVzcG9uZGluZyBMb25nIHZhbHVlXHJcbiAqL1xyXG5Mb25nLmZyb21CaXRzID0gZnJvbUJpdHM7XHJcblxyXG4vKipcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBiYXNlXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBleHBvbmVudFxyXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxyXG4gKiBAaW5uZXJcclxuICovXHJcbnZhciBwb3dfZGJsID0gTWF0aC5wb3c7IC8vIFVzZWQgNCB0aW1lcyAoNCo4IHRvIDE1KzQpXHJcblxyXG4vKipcclxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxyXG4gKiBAcGFyYW0geyhib29sZWFufG51bWJlcik9fSB1bnNpZ25lZFxyXG4gKiBAcGFyYW0ge251bWJlcj19IHJhZGl4XHJcbiAqIEByZXR1cm5zIHshTG9uZ31cclxuICogQGlubmVyXHJcbiAqL1xyXG5mdW5jdGlvbiBmcm9tU3RyaW5nKHN0ciwgdW5zaWduZWQsIHJhZGl4KSB7XHJcbiAgICBpZiAoc3RyLmxlbmd0aCA9PT0gMClcclxuICAgICAgICB0aHJvdyBFcnJvcignZW1wdHkgc3RyaW5nJyk7XHJcbiAgICBpZiAoc3RyID09PSBcIk5hTlwiIHx8IHN0ciA9PT0gXCJJbmZpbml0eVwiIHx8IHN0ciA9PT0gXCIrSW5maW5pdHlcIiB8fCBzdHIgPT09IFwiLUluZmluaXR5XCIpXHJcbiAgICAgICAgcmV0dXJuIFpFUk87XHJcbiAgICBpZiAodHlwZW9mIHVuc2lnbmVkID09PSAnbnVtYmVyJykge1xyXG4gICAgICAgIC8vIEZvciBnb29nLm1hdGgubG9uZyBjb21wYXRpYmlsaXR5XHJcbiAgICAgICAgcmFkaXggPSB1bnNpZ25lZCxcclxuICAgICAgICB1bnNpZ25lZCA9IGZhbHNlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICB1bnNpZ25lZCA9ICEhIHVuc2lnbmVkO1xyXG4gICAgfVxyXG4gICAgcmFkaXggPSByYWRpeCB8fCAxMDtcclxuICAgIGlmIChyYWRpeCA8IDIgfHwgMzYgPCByYWRpeClcclxuICAgICAgICB0aHJvdyBSYW5nZUVycm9yKCdyYWRpeCcpO1xyXG5cclxuICAgIHZhciBwO1xyXG4gICAgaWYgKChwID0gc3RyLmluZGV4T2YoJy0nKSkgPiAwKVxyXG4gICAgICAgIHRocm93IEVycm9yKCdpbnRlcmlvciBoeXBoZW4nKTtcclxuICAgIGVsc2UgaWYgKHAgPT09IDApIHtcclxuICAgICAgICByZXR1cm4gZnJvbVN0cmluZyhzdHIuc3Vic3RyaW5nKDEpLCB1bnNpZ25lZCwgcmFkaXgpLm5lZygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIERvIHNldmVyYWwgKDgpIGRpZ2l0cyBlYWNoIHRpbWUgdGhyb3VnaCB0aGUgbG9vcCwgc28gYXMgdG9cclxuICAgIC8vIG1pbmltaXplIHRoZSBjYWxscyB0byB0aGUgdmVyeSBleHBlbnNpdmUgZW11bGF0ZWQgZGl2LlxyXG4gICAgdmFyIHJhZGl4VG9Qb3dlciA9IGZyb21OdW1iZXIocG93X2RibChyYWRpeCwgOCkpO1xyXG5cclxuICAgIHZhciByZXN1bHQgPSBaRVJPO1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpICs9IDgpIHtcclxuICAgICAgICB2YXIgc2l6ZSA9IE1hdGgubWluKDgsIHN0ci5sZW5ndGggLSBpKSxcclxuICAgICAgICAgICAgdmFsdWUgPSBwYXJzZUludChzdHIuc3Vic3RyaW5nKGksIGkgKyBzaXplKSwgcmFkaXgpO1xyXG4gICAgICAgIGlmIChzaXplIDwgOCkge1xyXG4gICAgICAgICAgICB2YXIgcG93ZXIgPSBmcm9tTnVtYmVyKHBvd19kYmwocmFkaXgsIHNpemUpKTtcclxuICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0Lm11bChwb3dlcikuYWRkKGZyb21OdW1iZXIodmFsdWUpKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXN1bHQgPSByZXN1bHQubXVsKHJhZGl4VG9Qb3dlcik7XHJcbiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5hZGQoZnJvbU51bWJlcih2YWx1ZSkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJlc3VsdC51bnNpZ25lZCA9IHVuc2lnbmVkO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgYSBMb25nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBzdHJpbmcsIHdyaXR0ZW4gdXNpbmcgdGhlIHNwZWNpZmllZCByYWRpeC5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgVGhlIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIExvbmdcclxuICogQHBhcmFtIHsoYm9vbGVhbnxudW1iZXIpPX0gdW5zaWduZWQgV2hldGhlciB1bnNpZ25lZCBvciBub3QsIGRlZmF1bHRzIHRvIHNpZ25lZFxyXG4gKiBAcGFyYW0ge251bWJlcj19IHJhZGl4IFRoZSByYWRpeCBpbiB3aGljaCB0aGUgdGV4dCBpcyB3cml0dGVuICgyLTM2KSwgZGVmYXVsdHMgdG8gMTBcclxuICogQHJldHVybnMgeyFMb25nfSBUaGUgY29ycmVzcG9uZGluZyBMb25nIHZhbHVlXHJcbiAqL1xyXG5Mb25nLmZyb21TdHJpbmcgPSBmcm9tU3RyaW5nO1xyXG5cclxuLyoqXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd8IXtsb3c6IG51bWJlciwgaGlnaDogbnVtYmVyLCB1bnNpZ25lZDogYm9vbGVhbn19IHZhbFxyXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSB1bnNpZ25lZFxyXG4gKiBAcmV0dXJucyB7IUxvbmd9XHJcbiAqIEBpbm5lclxyXG4gKi9cclxuZnVuY3Rpb24gZnJvbVZhbHVlKHZhbCwgdW5zaWduZWQpIHtcclxuICAgIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJylcclxuICAgICAgICByZXR1cm4gZnJvbU51bWJlcih2YWwsIHVuc2lnbmVkKTtcclxuICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJylcclxuICAgICAgICByZXR1cm4gZnJvbVN0cmluZyh2YWwsIHVuc2lnbmVkKTtcclxuICAgIC8vIFRocm93cyBmb3Igbm9uLW9iamVjdHMsIGNvbnZlcnRzIG5vbi1pbnN0YW5jZW9mIExvbmc6XHJcbiAgICByZXR1cm4gZnJvbUJpdHModmFsLmxvdywgdmFsLmhpZ2gsIHR5cGVvZiB1bnNpZ25lZCA9PT0gJ2Jvb2xlYW4nID8gdW5zaWduZWQgOiB2YWwudW5zaWduZWQpO1xyXG59XHJcblxyXG4vKipcclxuICogQ29udmVydHMgdGhlIHNwZWNpZmllZCB2YWx1ZSB0byBhIExvbmcgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIGZyb20qIGZ1bmN0aW9uIGZvciBpdHMgdHlwZS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ3whe2xvdzogbnVtYmVyLCBoaWdoOiBudW1iZXIsIHVuc2lnbmVkOiBib29sZWFufX0gdmFsIFZhbHVlXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkIFdoZXRoZXIgdW5zaWduZWQgb3Igbm90LCBkZWZhdWx0cyB0byBzaWduZWRcclxuICogQHJldHVybnMgeyFMb25nfVxyXG4gKi9cclxuTG9uZy5mcm9tVmFsdWUgPSBmcm9tVmFsdWU7XHJcblxyXG4vLyBOT1RFOiB0aGUgY29tcGlsZXIgc2hvdWxkIGlubGluZSB0aGVzZSBjb25zdGFudCB2YWx1ZXMgYmVsb3cgYW5kIHRoZW4gcmVtb3ZlIHRoZXNlIHZhcmlhYmxlcywgc28gdGhlcmUgc2hvdWxkIGJlXHJcbi8vIG5vIHJ1bnRpbWUgcGVuYWx0eSBmb3IgdGhlc2UuXHJcblxyXG4vKipcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0XHJcbiAqIEBpbm5lclxyXG4gKi9cclxudmFyIFRXT19QV1JfMTZfREJMID0gMSA8PCAxNjtcclxuXHJcbi8qKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RcclxuICogQGlubmVyXHJcbiAqL1xyXG52YXIgVFdPX1BXUl8yNF9EQkwgPSAxIDw8IDI0O1xyXG5cclxuLyoqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdFxyXG4gKiBAaW5uZXJcclxuICovXHJcbnZhciBUV09fUFdSXzMyX0RCTCA9IFRXT19QV1JfMTZfREJMICogVFdPX1BXUl8xNl9EQkw7XHJcblxyXG4vKipcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0XHJcbiAqIEBpbm5lclxyXG4gKi9cclxudmFyIFRXT19QV1JfNjRfREJMID0gVFdPX1BXUl8zMl9EQkwgKiBUV09fUFdSXzMyX0RCTDtcclxuXHJcbi8qKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RcclxuICogQGlubmVyXHJcbiAqL1xyXG52YXIgVFdPX1BXUl82M19EQkwgPSBUV09fUFdSXzY0X0RCTCAvIDI7XHJcblxyXG4vKipcclxuICogQHR5cGUgeyFMb25nfVxyXG4gKiBAY29uc3RcclxuICogQGlubmVyXHJcbiAqL1xyXG52YXIgVFdPX1BXUl8yNCA9IGZyb21JbnQoVFdPX1BXUl8yNF9EQkwpO1xyXG5cclxuLyoqXHJcbiAqIEB0eXBlIHshTG9uZ31cclxuICogQGlubmVyXHJcbiAqL1xyXG52YXIgWkVSTyA9IGZyb21JbnQoMCk7XHJcblxyXG4vKipcclxuICogU2lnbmVkIHplcm8uXHJcbiAqIEB0eXBlIHshTG9uZ31cclxuICovXHJcbkxvbmcuWkVSTyA9IFpFUk87XHJcblxyXG4vKipcclxuICogQHR5cGUgeyFMb25nfVxyXG4gKiBAaW5uZXJcclxuICovXHJcbnZhciBVWkVSTyA9IGZyb21JbnQoMCwgdHJ1ZSk7XHJcblxyXG4vKipcclxuICogVW5zaWduZWQgemVyby5cclxuICogQHR5cGUgeyFMb25nfVxyXG4gKi9cclxuTG9uZy5VWkVSTyA9IFVaRVJPO1xyXG5cclxuLyoqXHJcbiAqIEB0eXBlIHshTG9uZ31cclxuICogQGlubmVyXHJcbiAqL1xyXG52YXIgT05FID0gZnJvbUludCgxKTtcclxuXHJcbi8qKlxyXG4gKiBTaWduZWQgb25lLlxyXG4gKiBAdHlwZSB7IUxvbmd9XHJcbiAqL1xyXG5Mb25nLk9ORSA9IE9ORTtcclxuXHJcbi8qKlxyXG4gKiBAdHlwZSB7IUxvbmd9XHJcbiAqIEBpbm5lclxyXG4gKi9cclxudmFyIFVPTkUgPSBmcm9tSW50KDEsIHRydWUpO1xyXG5cclxuLyoqXHJcbiAqIFVuc2lnbmVkIG9uZS5cclxuICogQHR5cGUgeyFMb25nfVxyXG4gKi9cclxuTG9uZy5VT05FID0gVU9ORTtcclxuXHJcbi8qKlxyXG4gKiBAdHlwZSB7IUxvbmd9XHJcbiAqIEBpbm5lclxyXG4gKi9cclxudmFyIE5FR19PTkUgPSBmcm9tSW50KC0xKTtcclxuXHJcbi8qKlxyXG4gKiBTaWduZWQgbmVnYXRpdmUgb25lLlxyXG4gKiBAdHlwZSB7IUxvbmd9XHJcbiAqL1xyXG5Mb25nLk5FR19PTkUgPSBORUdfT05FO1xyXG5cclxuLyoqXHJcbiAqIEB0eXBlIHshTG9uZ31cclxuICogQGlubmVyXHJcbiAqL1xyXG52YXIgTUFYX1ZBTFVFID0gZnJvbUJpdHMoMHhGRkZGRkZGRnwwLCAweDdGRkZGRkZGfDAsIGZhbHNlKTtcclxuXHJcbi8qKlxyXG4gKiBNYXhpbXVtIHNpZ25lZCB2YWx1ZS5cclxuICogQHR5cGUgeyFMb25nfVxyXG4gKi9cclxuTG9uZy5NQVhfVkFMVUUgPSBNQVhfVkFMVUU7XHJcblxyXG4vKipcclxuICogQHR5cGUgeyFMb25nfVxyXG4gKiBAaW5uZXJcclxuICovXHJcbnZhciBNQVhfVU5TSUdORURfVkFMVUUgPSBmcm9tQml0cygweEZGRkZGRkZGfDAsIDB4RkZGRkZGRkZ8MCwgdHJ1ZSk7XHJcblxyXG4vKipcclxuICogTWF4aW11bSB1bnNpZ25lZCB2YWx1ZS5cclxuICogQHR5cGUgeyFMb25nfVxyXG4gKi9cclxuTG9uZy5NQVhfVU5TSUdORURfVkFMVUUgPSBNQVhfVU5TSUdORURfVkFMVUU7XHJcblxyXG4vKipcclxuICogQHR5cGUgeyFMb25nfVxyXG4gKiBAaW5uZXJcclxuICovXHJcbnZhciBNSU5fVkFMVUUgPSBmcm9tQml0cygwLCAweDgwMDAwMDAwfDAsIGZhbHNlKTtcclxuXHJcbi8qKlxyXG4gKiBNaW5pbXVtIHNpZ25lZCB2YWx1ZS5cclxuICogQHR5cGUgeyFMb25nfVxyXG4gKi9cclxuTG9uZy5NSU5fVkFMVUUgPSBNSU5fVkFMVUU7XHJcblxyXG4vKipcclxuICogQGFsaWFzIExvbmcucHJvdG90eXBlXHJcbiAqIEBpbm5lclxyXG4gKi9cclxudmFyIExvbmdQcm90b3R5cGUgPSBMb25nLnByb3RvdHlwZTtcclxuXHJcbi8qKlxyXG4gKiBDb252ZXJ0cyB0aGUgTG9uZyB0byBhIDMyIGJpdCBpbnRlZ2VyLCBhc3N1bWluZyBpdCBpcyBhIDMyIGJpdCBpbnRlZ2VyLlxyXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS50b0ludCA9IGZ1bmN0aW9uIHRvSW50KCkge1xyXG4gICAgcmV0dXJuIHRoaXMudW5zaWduZWQgPyB0aGlzLmxvdyA+Pj4gMCA6IHRoaXMubG93O1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIENvbnZlcnRzIHRoZSBMb25nIHRvIGEgdGhlIG5lYXJlc3QgZmxvYXRpbmctcG9pbnQgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB2YWx1ZSAoZG91YmxlLCA1MyBiaXQgbWFudGlzc2EpLlxyXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS50b051bWJlciA9IGZ1bmN0aW9uIHRvTnVtYmVyKCkge1xyXG4gICAgaWYgKHRoaXMudW5zaWduZWQpXHJcbiAgICAgICAgcmV0dXJuICgodGhpcy5oaWdoID4+PiAwKSAqIFRXT19QV1JfMzJfREJMKSArICh0aGlzLmxvdyA+Pj4gMCk7XHJcbiAgICByZXR1cm4gdGhpcy5oaWdoICogVFdPX1BXUl8zMl9EQkwgKyAodGhpcy5sb3cgPj4+IDApO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIENvbnZlcnRzIHRoZSBMb25nIHRvIGEgc3RyaW5nIHdyaXR0ZW4gaW4gdGhlIHNwZWNpZmllZCByYWRpeC5cclxuICogQHBhcmFtIHtudW1iZXI9fSByYWRpeCBSYWRpeCAoMi0zNiksIGRlZmF1bHRzIHRvIDEwXHJcbiAqIEByZXR1cm5zIHtzdHJpbmd9XHJcbiAqIEBvdmVycmlkZVxyXG4gKiBAdGhyb3dzIHtSYW5nZUVycm9yfSBJZiBgcmFkaXhgIGlzIG91dCBvZiByYW5nZVxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKHJhZGl4KSB7XHJcbiAgICByYWRpeCA9IHJhZGl4IHx8IDEwO1xyXG4gICAgaWYgKHJhZGl4IDwgMiB8fCAzNiA8IHJhZGl4KVxyXG4gICAgICAgIHRocm93IFJhbmdlRXJyb3IoJ3JhZGl4Jyk7XHJcbiAgICBpZiAodGhpcy5pc1plcm8oKSlcclxuICAgICAgICByZXR1cm4gJzAnO1xyXG4gICAgaWYgKHRoaXMuaXNOZWdhdGl2ZSgpKSB7IC8vIFVuc2lnbmVkIExvbmdzIGFyZSBuZXZlciBuZWdhdGl2ZVxyXG4gICAgICAgIGlmICh0aGlzLmVxKE1JTl9WQUxVRSkpIHtcclxuICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBjaGFuZ2UgdGhlIExvbmcgdmFsdWUgYmVmb3JlIGl0IGNhbiBiZSBuZWdhdGVkLCBzbyB3ZSByZW1vdmVcclxuICAgICAgICAgICAgLy8gdGhlIGJvdHRvbS1tb3N0IGRpZ2l0IGluIHRoaXMgYmFzZSBhbmQgdGhlbiByZWN1cnNlIHRvIGRvIHRoZSByZXN0LlxyXG4gICAgICAgICAgICB2YXIgcmFkaXhMb25nID0gZnJvbU51bWJlcihyYWRpeCksXHJcbiAgICAgICAgICAgICAgICBkaXYgPSB0aGlzLmRpdihyYWRpeExvbmcpLFxyXG4gICAgICAgICAgICAgICAgcmVtMSA9IGRpdi5tdWwocmFkaXhMb25nKS5zdWIodGhpcyk7XHJcbiAgICAgICAgICAgIHJldHVybiBkaXYudG9TdHJpbmcocmFkaXgpICsgcmVtMS50b0ludCgpLnRvU3RyaW5nKHJhZGl4KTtcclxuICAgICAgICB9IGVsc2VcclxuICAgICAgICAgICAgcmV0dXJuICctJyArIHRoaXMubmVnKCkudG9TdHJpbmcocmFkaXgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIERvIHNldmVyYWwgKDYpIGRpZ2l0cyBlYWNoIHRpbWUgdGhyb3VnaCB0aGUgbG9vcCwgc28gYXMgdG9cclxuICAgIC8vIG1pbmltaXplIHRoZSBjYWxscyB0byB0aGUgdmVyeSBleHBlbnNpdmUgZW11bGF0ZWQgZGl2LlxyXG4gICAgdmFyIHJhZGl4VG9Qb3dlciA9IGZyb21OdW1iZXIocG93X2RibChyYWRpeCwgNiksIHRoaXMudW5zaWduZWQpLFxyXG4gICAgICAgIHJlbSA9IHRoaXM7XHJcbiAgICB2YXIgcmVzdWx0ID0gJyc7XHJcbiAgICB3aGlsZSAodHJ1ZSkge1xyXG4gICAgICAgIHZhciByZW1EaXYgPSByZW0uZGl2KHJhZGl4VG9Qb3dlciksXHJcbiAgICAgICAgICAgIGludHZhbCA9IHJlbS5zdWIocmVtRGl2Lm11bChyYWRpeFRvUG93ZXIpKS50b0ludCgpID4+PiAwLFxyXG4gICAgICAgICAgICBkaWdpdHMgPSBpbnR2YWwudG9TdHJpbmcocmFkaXgpO1xyXG4gICAgICAgIHJlbSA9IHJlbURpdjtcclxuICAgICAgICBpZiAocmVtLmlzWmVybygpKVxyXG4gICAgICAgICAgICByZXR1cm4gZGlnaXRzICsgcmVzdWx0O1xyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB3aGlsZSAoZGlnaXRzLmxlbmd0aCA8IDYpXHJcbiAgICAgICAgICAgICAgICBkaWdpdHMgPSAnMCcgKyBkaWdpdHM7XHJcbiAgICAgICAgICAgIHJlc3VsdCA9ICcnICsgZGlnaXRzICsgcmVzdWx0O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufTtcclxuXHJcbi8qKlxyXG4gKiBHZXRzIHRoZSBoaWdoIDMyIGJpdHMgYXMgYSBzaWduZWQgaW50ZWdlci5cclxuICogQHJldHVybnMge251bWJlcn0gU2lnbmVkIGhpZ2ggYml0c1xyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5nZXRIaWdoQml0cyA9IGZ1bmN0aW9uIGdldEhpZ2hCaXRzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaGlnaDtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBHZXRzIHRoZSBoaWdoIDMyIGJpdHMgYXMgYW4gdW5zaWduZWQgaW50ZWdlci5cclxuICogQHJldHVybnMge251bWJlcn0gVW5zaWduZWQgaGlnaCBiaXRzXHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmdldEhpZ2hCaXRzVW5zaWduZWQgPSBmdW5jdGlvbiBnZXRIaWdoQml0c1Vuc2lnbmVkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaGlnaCA+Pj4gMDtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBHZXRzIHRoZSBsb3cgMzIgYml0cyBhcyBhIHNpZ25lZCBpbnRlZ2VyLlxyXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBTaWduZWQgbG93IGJpdHNcclxuICovXHJcbkxvbmdQcm90b3R5cGUuZ2V0TG93Qml0cyA9IGZ1bmN0aW9uIGdldExvd0JpdHMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5sb3c7XHJcbn07XHJcblxyXG4vKipcclxuICogR2V0cyB0aGUgbG93IDMyIGJpdHMgYXMgYW4gdW5zaWduZWQgaW50ZWdlci5cclxuICogQHJldHVybnMge251bWJlcn0gVW5zaWduZWQgbG93IGJpdHNcclxuICovXHJcbkxvbmdQcm90b3R5cGUuZ2V0TG93Qml0c1Vuc2lnbmVkID0gZnVuY3Rpb24gZ2V0TG93Qml0c1Vuc2lnbmVkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMubG93ID4+PiAwO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIEdldHMgdGhlIG51bWJlciBvZiBiaXRzIG5lZWRlZCB0byByZXByZXNlbnQgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoaXMgTG9uZy5cclxuICogQHJldHVybnMge251bWJlcn1cclxuICovXHJcbkxvbmdQcm90b3R5cGUuZ2V0TnVtQml0c0FicyA9IGZ1bmN0aW9uIGdldE51bUJpdHNBYnMoKSB7XHJcbiAgICBpZiAodGhpcy5pc05lZ2F0aXZlKCkpIC8vIFVuc2lnbmVkIExvbmdzIGFyZSBuZXZlciBuZWdhdGl2ZVxyXG4gICAgICAgIHJldHVybiB0aGlzLmVxKE1JTl9WQUxVRSkgPyA2NCA6IHRoaXMubmVnKCkuZ2V0TnVtQml0c0FicygpO1xyXG4gICAgdmFyIHZhbCA9IHRoaXMuaGlnaCAhPSAwID8gdGhpcy5oaWdoIDogdGhpcy5sb3c7XHJcbiAgICBmb3IgKHZhciBiaXQgPSAzMTsgYml0ID4gMDsgYml0LS0pXHJcbiAgICAgICAgaWYgKCh2YWwgJiAoMSA8PCBiaXQpKSAhPSAwKVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgIHJldHVybiB0aGlzLmhpZ2ggIT0gMCA/IGJpdCArIDMzIDogYml0ICsgMTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBlcXVhbHMgemVyby5cclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmlzWmVybyA9IGZ1bmN0aW9uIGlzWmVybygpIHtcclxuICAgIHJldHVybiB0aGlzLmhpZ2ggPT09IDAgJiYgdGhpcy5sb3cgPT09IDA7XHJcbn07XHJcblxyXG4vKipcclxuICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgZXF1YWxzIHplcm8uIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjaXNaZXJvfS5cclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmVxeiA9IExvbmdQcm90b3R5cGUuaXNaZXJvO1xyXG5cclxuLyoqXHJcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIG5lZ2F0aXZlLlxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICovXHJcbkxvbmdQcm90b3R5cGUuaXNOZWdhdGl2ZSA9IGZ1bmN0aW9uIGlzTmVnYXRpdmUoKSB7XHJcbiAgICByZXR1cm4gIXRoaXMudW5zaWduZWQgJiYgdGhpcy5oaWdoIDwgMDtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBwb3NpdGl2ZS5cclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmlzUG9zaXRpdmUgPSBmdW5jdGlvbiBpc1Bvc2l0aXZlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMudW5zaWduZWQgfHwgdGhpcy5oaWdoID49IDA7XHJcbn07XHJcblxyXG4vKipcclxuICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgaXMgb2RkLlxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICovXHJcbkxvbmdQcm90b3R5cGUuaXNPZGQgPSBmdW5jdGlvbiBpc09kZCgpIHtcclxuICAgIHJldHVybiAodGhpcy5sb3cgJiAxKSA9PT0gMTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBldmVuLlxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICovXHJcbkxvbmdQcm90b3R5cGUuaXNFdmVuID0gZnVuY3Rpb24gaXNFdmVuKCkge1xyXG4gICAgcmV0dXJuICh0aGlzLmxvdyAmIDEpID09PSAwO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGVxdWFscyB0aGUgc3BlY2lmaWVkJ3MuXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyhvdGhlcikge1xyXG4gICAgaWYgKCFpc0xvbmcob3RoZXIpKVxyXG4gICAgICAgIG90aGVyID0gZnJvbVZhbHVlKG90aGVyKTtcclxuICAgIGlmICh0aGlzLnVuc2lnbmVkICE9PSBvdGhlci51bnNpZ25lZCAmJiAodGhpcy5oaWdoID4+PiAzMSkgPT09IDEgJiYgKG90aGVyLmhpZ2ggPj4+IDMxKSA9PT0gMSlcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICByZXR1cm4gdGhpcy5oaWdoID09PSBvdGhlci5oaWdoICYmIHRoaXMubG93ID09PSBvdGhlci5sb3c7XHJcbn07XHJcblxyXG4vKipcclxuICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgZXF1YWxzIHRoZSBzcGVjaWZpZWQncy4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNlcXVhbHN9LlxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICovXHJcbkxvbmdQcm90b3R5cGUuZXEgPSBMb25nUHJvdG90eXBlLmVxdWFscztcclxuXHJcbi8qKlxyXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBkaWZmZXJzIGZyb20gdGhlIHNwZWNpZmllZCdzLlxyXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXHJcbiAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5ub3RFcXVhbHMgPSBmdW5jdGlvbiBub3RFcXVhbHMob3RoZXIpIHtcclxuICAgIHJldHVybiAhdGhpcy5lcSgvKiB2YWxpZGF0ZXMgKi8gb3RoZXIpO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGRpZmZlcnMgZnJvbSB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbm90RXF1YWxzfS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLm5lcSA9IExvbmdQcm90b3R5cGUubm90RXF1YWxzO1xyXG5cclxuLyoqXHJcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGRpZmZlcnMgZnJvbSB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbm90RXF1YWxzfS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLm5lID0gTG9uZ1Byb3RvdHlwZS5ub3RFcXVhbHM7XHJcblxyXG4vKipcclxuICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgaXMgbGVzcyB0aGFuIHRoZSBzcGVjaWZpZWQncy5cclxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICovXHJcbkxvbmdQcm90b3R5cGUubGVzc1RoYW4gPSBmdW5jdGlvbiBsZXNzVGhhbihvdGhlcikge1xyXG4gICAgcmV0dXJuIHRoaXMuY29tcCgvKiB2YWxpZGF0ZXMgKi8gb3RoZXIpIDwgMDtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBsZXNzIHRoYW4gdGhlIHNwZWNpZmllZCdzLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI2xlc3NUaGFufS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmx0ID0gTG9uZ1Byb3RvdHlwZS5sZXNzVGhhbjtcclxuXHJcbi8qKlxyXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdGhlIHNwZWNpZmllZCdzLlxyXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXHJcbiAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5sZXNzVGhhbk9yRXF1YWwgPSBmdW5jdGlvbiBsZXNzVGhhbk9yRXF1YWwob3RoZXIpIHtcclxuICAgIHJldHVybiB0aGlzLmNvbXAoLyogdmFsaWRhdGVzICovIG90aGVyKSA8PSAwO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbGVzc1RoYW5PckVxdWFsfS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmx0ZSA9IExvbmdQcm90b3R5cGUubGVzc1RoYW5PckVxdWFsO1xyXG5cclxuLyoqXHJcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbGVzc1RoYW5PckVxdWFsfS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmxlID0gTG9uZ1Byb3RvdHlwZS5sZXNzVGhhbk9yRXF1YWw7XHJcblxyXG4vKipcclxuICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIHRoZSBzcGVjaWZpZWQncy5cclxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICovXHJcbkxvbmdQcm90b3R5cGUuZ3JlYXRlclRoYW4gPSBmdW5jdGlvbiBncmVhdGVyVGhhbihvdGhlcikge1xyXG4gICAgcmV0dXJuIHRoaXMuY29tcCgvKiB2YWxpZGF0ZXMgKi8gb3RoZXIpID4gMDtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhlIHNwZWNpZmllZCdzLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI2dyZWF0ZXJUaGFufS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmd0ID0gTG9uZ1Byb3RvdHlwZS5ncmVhdGVyVGhhbjtcclxuXHJcbi8qKlxyXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdGhlIHNwZWNpZmllZCdzLlxyXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXHJcbiAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5ncmVhdGVyVGhhbk9yRXF1YWwgPSBmdW5jdGlvbiBncmVhdGVyVGhhbk9yRXF1YWwob3RoZXIpIHtcclxuICAgIHJldHVybiB0aGlzLmNvbXAoLyogdmFsaWRhdGVzICovIG90aGVyKSA+PSAwO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjZ3JlYXRlclRoYW5PckVxdWFsfS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmd0ZSA9IExvbmdQcm90b3R5cGUuZ3JlYXRlclRoYW5PckVxdWFsO1xyXG5cclxuLyoqXHJcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjZ3JlYXRlclRoYW5PckVxdWFsfS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmdlID0gTG9uZ1Byb3RvdHlwZS5ncmVhdGVyVGhhbk9yRXF1YWw7XHJcblxyXG4vKipcclxuICogQ29tcGFyZXMgdGhpcyBMb25nJ3MgdmFsdWUgd2l0aCB0aGUgc3BlY2lmaWVkJ3MuXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcclxuICogQHJldHVybnMge251bWJlcn0gMCBpZiB0aGV5IGFyZSB0aGUgc2FtZSwgMSBpZiB0aGUgdGhpcyBpcyBncmVhdGVyIGFuZCAtMVxyXG4gKiAgaWYgdGhlIGdpdmVuIG9uZSBpcyBncmVhdGVyXHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlKG90aGVyKSB7XHJcbiAgICBpZiAoIWlzTG9uZyhvdGhlcikpXHJcbiAgICAgICAgb3RoZXIgPSBmcm9tVmFsdWUob3RoZXIpO1xyXG4gICAgaWYgKHRoaXMuZXEob3RoZXIpKVxyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgdmFyIHRoaXNOZWcgPSB0aGlzLmlzTmVnYXRpdmUoKSxcclxuICAgICAgICBvdGhlck5lZyA9IG90aGVyLmlzTmVnYXRpdmUoKTtcclxuICAgIGlmICh0aGlzTmVnICYmICFvdGhlck5lZylcclxuICAgICAgICByZXR1cm4gLTE7XHJcbiAgICBpZiAoIXRoaXNOZWcgJiYgb3RoZXJOZWcpXHJcbiAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAvLyBBdCB0aGlzIHBvaW50IHRoZSBzaWduIGJpdHMgYXJlIHRoZSBzYW1lXHJcbiAgICBpZiAoIXRoaXMudW5zaWduZWQpXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ViKG90aGVyKS5pc05lZ2F0aXZlKCkgPyAtMSA6IDE7XHJcbiAgICAvLyBCb3RoIGFyZSBwb3NpdGl2ZSBpZiBhdCBsZWFzdCBvbmUgaXMgdW5zaWduZWRcclxuICAgIHJldHVybiAob3RoZXIuaGlnaCA+Pj4gMCkgPiAodGhpcy5oaWdoID4+PiAwKSB8fCAob3RoZXIuaGlnaCA9PT0gdGhpcy5oaWdoICYmIChvdGhlci5sb3cgPj4+IDApID4gKHRoaXMubG93ID4+PiAwKSkgPyAtMSA6IDE7XHJcbn07XHJcblxyXG4vKipcclxuICogQ29tcGFyZXMgdGhpcyBMb25nJ3MgdmFsdWUgd2l0aCB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjY29tcGFyZX0uXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXHJcbiAqIEByZXR1cm5zIHtudW1iZXJ9IDAgaWYgdGhleSBhcmUgdGhlIHNhbWUsIDEgaWYgdGhlIHRoaXMgaXMgZ3JlYXRlciBhbmQgLTFcclxuICogIGlmIHRoZSBnaXZlbiBvbmUgaXMgZ3JlYXRlclxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5jb21wID0gTG9uZ1Byb3RvdHlwZS5jb21wYXJlO1xyXG5cclxuLyoqXHJcbiAqIE5lZ2F0ZXMgdGhpcyBMb25nJ3MgdmFsdWUuXHJcbiAqIEByZXR1cm5zIHshTG9uZ30gTmVnYXRlZCBMb25nXHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLm5lZ2F0ZSA9IGZ1bmN0aW9uIG5lZ2F0ZSgpIHtcclxuICAgIGlmICghdGhpcy51bnNpZ25lZCAmJiB0aGlzLmVxKE1JTl9WQUxVRSkpXHJcbiAgICAgICAgcmV0dXJuIE1JTl9WQUxVRTtcclxuICAgIHJldHVybiB0aGlzLm5vdCgpLmFkZChPTkUpO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIE5lZ2F0ZXMgdGhpcyBMb25nJ3MgdmFsdWUuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbmVnYXRlfS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEByZXR1cm5zIHshTG9uZ30gTmVnYXRlZCBMb25nXHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLm5lZyA9IExvbmdQcm90b3R5cGUubmVnYXRlO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIHN1bSBvZiB0aGlzIGFuZCB0aGUgc3BlY2lmaWVkIExvbmcuXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gYWRkZW5kIEFkZGVuZFxyXG4gKiBAcmV0dXJucyB7IUxvbmd9IFN1bVxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiBhZGQoYWRkZW5kKSB7XHJcbiAgICBpZiAoIWlzTG9uZyhhZGRlbmQpKVxyXG4gICAgICAgIGFkZGVuZCA9IGZyb21WYWx1ZShhZGRlbmQpO1xyXG5cclxuICAgIC8vIERpdmlkZSBlYWNoIG51bWJlciBpbnRvIDQgY2h1bmtzIG9mIDE2IGJpdHMsIGFuZCB0aGVuIHN1bSB0aGUgY2h1bmtzLlxyXG5cclxuICAgIHZhciBhNDggPSB0aGlzLmhpZ2ggPj4+IDE2O1xyXG4gICAgdmFyIGEzMiA9IHRoaXMuaGlnaCAmIDB4RkZGRjtcclxuICAgIHZhciBhMTYgPSB0aGlzLmxvdyA+Pj4gMTY7XHJcbiAgICB2YXIgYTAwID0gdGhpcy5sb3cgJiAweEZGRkY7XHJcblxyXG4gICAgdmFyIGI0OCA9IGFkZGVuZC5oaWdoID4+PiAxNjtcclxuICAgIHZhciBiMzIgPSBhZGRlbmQuaGlnaCAmIDB4RkZGRjtcclxuICAgIHZhciBiMTYgPSBhZGRlbmQubG93ID4+PiAxNjtcclxuICAgIHZhciBiMDAgPSBhZGRlbmQubG93ICYgMHhGRkZGO1xyXG5cclxuICAgIHZhciBjNDggPSAwLCBjMzIgPSAwLCBjMTYgPSAwLCBjMDAgPSAwO1xyXG4gICAgYzAwICs9IGEwMCArIGIwMDtcclxuICAgIGMxNiArPSBjMDAgPj4+IDE2O1xyXG4gICAgYzAwICY9IDB4RkZGRjtcclxuICAgIGMxNiArPSBhMTYgKyBiMTY7XHJcbiAgICBjMzIgKz0gYzE2ID4+PiAxNjtcclxuICAgIGMxNiAmPSAweEZGRkY7XHJcbiAgICBjMzIgKz0gYTMyICsgYjMyO1xyXG4gICAgYzQ4ICs9IGMzMiA+Pj4gMTY7XHJcbiAgICBjMzIgJj0gMHhGRkZGO1xyXG4gICAgYzQ4ICs9IGE0OCArIGI0ODtcclxuICAgIGM0OCAmPSAweEZGRkY7XHJcbiAgICByZXR1cm4gZnJvbUJpdHMoKGMxNiA8PCAxNikgfCBjMDAsIChjNDggPDwgMTYpIHwgYzMyLCB0aGlzLnVuc2lnbmVkKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBkaWZmZXJlbmNlIG9mIHRoaXMgYW5kIHRoZSBzcGVjaWZpZWQgTG9uZy5cclxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8c3RyaW5nfSBzdWJ0cmFoZW5kIFN1YnRyYWhlbmRcclxuICogQHJldHVybnMgeyFMb25nfSBEaWZmZXJlbmNlXHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLnN1YnRyYWN0ID0gZnVuY3Rpb24gc3VidHJhY3Qoc3VidHJhaGVuZCkge1xyXG4gICAgaWYgKCFpc0xvbmcoc3VidHJhaGVuZCkpXHJcbiAgICAgICAgc3VidHJhaGVuZCA9IGZyb21WYWx1ZShzdWJ0cmFoZW5kKTtcclxuICAgIHJldHVybiB0aGlzLmFkZChzdWJ0cmFoZW5kLm5lZygpKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBkaWZmZXJlbmNlIG9mIHRoaXMgYW5kIHRoZSBzcGVjaWZpZWQgTG9uZy4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNzdWJ0cmFjdH0uXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IHN1YnRyYWhlbmQgU3VidHJhaGVuZFxyXG4gKiBAcmV0dXJucyB7IUxvbmd9IERpZmZlcmVuY2VcclxuICovXHJcbkxvbmdQcm90b3R5cGUuc3ViID0gTG9uZ1Byb3RvdHlwZS5zdWJ0cmFjdDtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBwcm9kdWN0IG9mIHRoaXMgYW5kIHRoZSBzcGVjaWZpZWQgTG9uZy5cclxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8c3RyaW5nfSBtdWx0aXBsaWVyIE11bHRpcGxpZXJcclxuICogQHJldHVybnMgeyFMb25nfSBQcm9kdWN0XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLm11bHRpcGx5ID0gZnVuY3Rpb24gbXVsdGlwbHkobXVsdGlwbGllcikge1xyXG4gICAgaWYgKHRoaXMuaXNaZXJvKCkpXHJcbiAgICAgICAgcmV0dXJuIFpFUk87XHJcbiAgICBpZiAoIWlzTG9uZyhtdWx0aXBsaWVyKSlcclxuICAgICAgICBtdWx0aXBsaWVyID0gZnJvbVZhbHVlKG11bHRpcGxpZXIpO1xyXG5cclxuICAgIC8vIHVzZSB3YXNtIHN1cHBvcnQgaWYgcHJlc2VudFxyXG4gICAgaWYgKHdhc20pIHtcclxuICAgICAgICB2YXIgbG93ID0gd2FzbS5tdWwodGhpcy5sb3csXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGlnaCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGllci5sb3csXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpcGxpZXIuaGlnaCk7XHJcbiAgICAgICAgcmV0dXJuIGZyb21CaXRzKGxvdywgd2FzbS5nZXRfaGlnaCgpLCB0aGlzLnVuc2lnbmVkKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAobXVsdGlwbGllci5pc1plcm8oKSlcclxuICAgICAgICByZXR1cm4gWkVSTztcclxuICAgIGlmICh0aGlzLmVxKE1JTl9WQUxVRSkpXHJcbiAgICAgICAgcmV0dXJuIG11bHRpcGxpZXIuaXNPZGQoKSA/IE1JTl9WQUxVRSA6IFpFUk87XHJcbiAgICBpZiAobXVsdGlwbGllci5lcShNSU5fVkFMVUUpKVxyXG4gICAgICAgIHJldHVybiB0aGlzLmlzT2RkKCkgPyBNSU5fVkFMVUUgOiBaRVJPO1xyXG5cclxuICAgIGlmICh0aGlzLmlzTmVnYXRpdmUoKSkge1xyXG4gICAgICAgIGlmIChtdWx0aXBsaWVyLmlzTmVnYXRpdmUoKSlcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubmVnKCkubXVsKG11bHRpcGxpZXIubmVnKCkpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubmVnKCkubXVsKG11bHRpcGxpZXIpLm5lZygpO1xyXG4gICAgfSBlbHNlIGlmIChtdWx0aXBsaWVyLmlzTmVnYXRpdmUoKSlcclxuICAgICAgICByZXR1cm4gdGhpcy5tdWwobXVsdGlwbGllci5uZWcoKSkubmVnKCk7XHJcblxyXG4gICAgLy8gSWYgYm90aCBsb25ncyBhcmUgc21hbGwsIHVzZSBmbG9hdCBtdWx0aXBsaWNhdGlvblxyXG4gICAgaWYgKHRoaXMubHQoVFdPX1BXUl8yNCkgJiYgbXVsdGlwbGllci5sdChUV09fUFdSXzI0KSlcclxuICAgICAgICByZXR1cm4gZnJvbU51bWJlcih0aGlzLnRvTnVtYmVyKCkgKiBtdWx0aXBsaWVyLnRvTnVtYmVyKCksIHRoaXMudW5zaWduZWQpO1xyXG5cclxuICAgIC8vIERpdmlkZSBlYWNoIGxvbmcgaW50byA0IGNodW5rcyBvZiAxNiBiaXRzLCBhbmQgdGhlbiBhZGQgdXAgNHg0IHByb2R1Y3RzLlxyXG4gICAgLy8gV2UgY2FuIHNraXAgcHJvZHVjdHMgdGhhdCB3b3VsZCBvdmVyZmxvdy5cclxuXHJcbiAgICB2YXIgYTQ4ID0gdGhpcy5oaWdoID4+PiAxNjtcclxuICAgIHZhciBhMzIgPSB0aGlzLmhpZ2ggJiAweEZGRkY7XHJcbiAgICB2YXIgYTE2ID0gdGhpcy5sb3cgPj4+IDE2O1xyXG4gICAgdmFyIGEwMCA9IHRoaXMubG93ICYgMHhGRkZGO1xyXG5cclxuICAgIHZhciBiNDggPSBtdWx0aXBsaWVyLmhpZ2ggPj4+IDE2O1xyXG4gICAgdmFyIGIzMiA9IG11bHRpcGxpZXIuaGlnaCAmIDB4RkZGRjtcclxuICAgIHZhciBiMTYgPSBtdWx0aXBsaWVyLmxvdyA+Pj4gMTY7XHJcbiAgICB2YXIgYjAwID0gbXVsdGlwbGllci5sb3cgJiAweEZGRkY7XHJcblxyXG4gICAgdmFyIGM0OCA9IDAsIGMzMiA9IDAsIGMxNiA9IDAsIGMwMCA9IDA7XHJcbiAgICBjMDAgKz0gYTAwICogYjAwO1xyXG4gICAgYzE2ICs9IGMwMCA+Pj4gMTY7XHJcbiAgICBjMDAgJj0gMHhGRkZGO1xyXG4gICAgYzE2ICs9IGExNiAqIGIwMDtcclxuICAgIGMzMiArPSBjMTYgPj4+IDE2O1xyXG4gICAgYzE2ICY9IDB4RkZGRjtcclxuICAgIGMxNiArPSBhMDAgKiBiMTY7XHJcbiAgICBjMzIgKz0gYzE2ID4+PiAxNjtcclxuICAgIGMxNiAmPSAweEZGRkY7XHJcbiAgICBjMzIgKz0gYTMyICogYjAwO1xyXG4gICAgYzQ4ICs9IGMzMiA+Pj4gMTY7XHJcbiAgICBjMzIgJj0gMHhGRkZGO1xyXG4gICAgYzMyICs9IGExNiAqIGIxNjtcclxuICAgIGM0OCArPSBjMzIgPj4+IDE2O1xyXG4gICAgYzMyICY9IDB4RkZGRjtcclxuICAgIGMzMiArPSBhMDAgKiBiMzI7XHJcbiAgICBjNDggKz0gYzMyID4+PiAxNjtcclxuICAgIGMzMiAmPSAweEZGRkY7XHJcbiAgICBjNDggKz0gYTQ4ICogYjAwICsgYTMyICogYjE2ICsgYTE2ICogYjMyICsgYTAwICogYjQ4O1xyXG4gICAgYzQ4ICY9IDB4RkZGRjtcclxuICAgIHJldHVybiBmcm9tQml0cygoYzE2IDw8IDE2KSB8IGMwMCwgKGM0OCA8PCAxNikgfCBjMzIsIHRoaXMudW5zaWduZWQpO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIHByb2R1Y3Qgb2YgdGhpcyBhbmQgdGhlIHNwZWNpZmllZCBMb25nLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI211bHRpcGx5fS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gbXVsdGlwbGllciBNdWx0aXBsaWVyXHJcbiAqIEByZXR1cm5zIHshTG9uZ30gUHJvZHVjdFxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5tdWwgPSBMb25nUHJvdG90eXBlLm11bHRpcGx5O1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhpcyBMb25nIGRpdmlkZWQgYnkgdGhlIHNwZWNpZmllZC4gVGhlIHJlc3VsdCBpcyBzaWduZWQgaWYgdGhpcyBMb25nIGlzIHNpZ25lZCBvclxyXG4gKiAgdW5zaWduZWQgaWYgdGhpcyBMb25nIGlzIHVuc2lnbmVkLlxyXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IGRpdmlzb3IgRGl2aXNvclxyXG4gKiBAcmV0dXJucyB7IUxvbmd9IFF1b3RpZW50XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmRpdmlkZSA9IGZ1bmN0aW9uIGRpdmlkZShkaXZpc29yKSB7XHJcbiAgICBpZiAoIWlzTG9uZyhkaXZpc29yKSlcclxuICAgICAgICBkaXZpc29yID0gZnJvbVZhbHVlKGRpdmlzb3IpO1xyXG4gICAgaWYgKGRpdmlzb3IuaXNaZXJvKCkpXHJcbiAgICAgICAgdGhyb3cgRXJyb3IoJ2RpdmlzaW9uIGJ5IHplcm8nKTtcclxuXHJcbiAgICAvLyB1c2Ugd2FzbSBzdXBwb3J0IGlmIHByZXNlbnRcclxuICAgIGlmICh3YXNtKSB7XHJcbiAgICAgICAgLy8gZ3VhcmQgYWdhaW5zdCBzaWduZWQgZGl2aXNpb24gb3ZlcmZsb3c6IHRoZSBsYXJnZXN0XHJcbiAgICAgICAgLy8gbmVnYXRpdmUgbnVtYmVyIC8gLTEgd291bGQgYmUgMSBsYXJnZXIgdGhhbiB0aGUgbGFyZ2VzdFxyXG4gICAgICAgIC8vIHBvc2l0aXZlIG51bWJlciwgZHVlIHRvIHR3bydzIGNvbXBsZW1lbnQuXHJcbiAgICAgICAgaWYgKCF0aGlzLnVuc2lnbmVkICYmXHJcbiAgICAgICAgICAgIHRoaXMuaGlnaCA9PT0gLTB4ODAwMDAwMDAgJiZcclxuICAgICAgICAgICAgZGl2aXNvci5sb3cgPT09IC0xICYmIGRpdmlzb3IuaGlnaCA9PT0gLTEpIHtcclxuICAgICAgICAgICAgLy8gYmUgY29uc2lzdGVudCB3aXRoIG5vbi13YXNtIGNvZGUgcGF0aFxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGxvdyA9ICh0aGlzLnVuc2lnbmVkID8gd2FzbS5kaXZfdSA6IHdhc20uZGl2X3MpKFxyXG4gICAgICAgICAgICB0aGlzLmxvdyxcclxuICAgICAgICAgICAgdGhpcy5oaWdoLFxyXG4gICAgICAgICAgICBkaXZpc29yLmxvdyxcclxuICAgICAgICAgICAgZGl2aXNvci5oaWdoXHJcbiAgICAgICAgKTtcclxuICAgICAgICByZXR1cm4gZnJvbUJpdHMobG93LCB3YXNtLmdldF9oaWdoKCksIHRoaXMudW5zaWduZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmlzWmVybygpKVxyXG4gICAgICAgIHJldHVybiB0aGlzLnVuc2lnbmVkID8gVVpFUk8gOiBaRVJPO1xyXG4gICAgdmFyIGFwcHJveCwgcmVtLCByZXM7XHJcbiAgICBpZiAoIXRoaXMudW5zaWduZWQpIHtcclxuICAgICAgICAvLyBUaGlzIHNlY3Rpb24gaXMgb25seSByZWxldmFudCBmb3Igc2lnbmVkIGxvbmdzIGFuZCBpcyBkZXJpdmVkIGZyb20gdGhlXHJcbiAgICAgICAgLy8gY2xvc3VyZSBsaWJyYXJ5IGFzIGEgd2hvbGUuXHJcbiAgICAgICAgaWYgKHRoaXMuZXEoTUlOX1ZBTFVFKSkge1xyXG4gICAgICAgICAgICBpZiAoZGl2aXNvci5lcShPTkUpIHx8IGRpdmlzb3IuZXEoTkVHX09ORSkpXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gTUlOX1ZBTFVFOyAgLy8gcmVjYWxsIHRoYXQgLU1JTl9WQUxVRSA9PSBNSU5fVkFMVUVcclxuICAgICAgICAgICAgZWxzZSBpZiAoZGl2aXNvci5lcShNSU5fVkFMVUUpKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIE9ORTtcclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBBdCB0aGlzIHBvaW50LCB3ZSBoYXZlIHxvdGhlcnwgPj0gMiwgc28gfHRoaXMvb3RoZXJ8IDwgfE1JTl9WQUxVRXwuXHJcbiAgICAgICAgICAgICAgICB2YXIgaGFsZlRoaXMgPSB0aGlzLnNocigxKTtcclxuICAgICAgICAgICAgICAgIGFwcHJveCA9IGhhbGZUaGlzLmRpdihkaXZpc29yKS5zaGwoMSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoYXBwcm94LmVxKFpFUk8pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRpdmlzb3IuaXNOZWdhdGl2ZSgpID8gT05FIDogTkVHX09ORTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVtID0gdGhpcy5zdWIoZGl2aXNvci5tdWwoYXBwcm94KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzID0gYXBwcm94LmFkZChyZW0uZGl2KGRpdmlzb3IpKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmIChkaXZpc29yLmVxKE1JTl9WQUxVRSkpXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnVuc2lnbmVkID8gVVpFUk8gOiBaRVJPO1xyXG4gICAgICAgIGlmICh0aGlzLmlzTmVnYXRpdmUoKSkge1xyXG4gICAgICAgICAgICBpZiAoZGl2aXNvci5pc05lZ2F0aXZlKCkpXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5uZWcoKS5kaXYoZGl2aXNvci5uZWcoKSk7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm5lZygpLmRpdihkaXZpc29yKS5uZWcoKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGRpdmlzb3IuaXNOZWdhdGl2ZSgpKVxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kaXYoZGl2aXNvci5uZWcoKSkubmVnKCk7XHJcbiAgICAgICAgcmVzID0gWkVSTztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gVGhlIGFsZ29yaXRobSBiZWxvdyBoYXMgbm90IGJlZW4gbWFkZSBmb3IgdW5zaWduZWQgbG9uZ3MuIEl0J3MgdGhlcmVmb3JlXHJcbiAgICAgICAgLy8gcmVxdWlyZWQgdG8gdGFrZSBzcGVjaWFsIGNhcmUgb2YgdGhlIE1TQiBwcmlvciB0byBydW5uaW5nIGl0LlxyXG4gICAgICAgIGlmICghZGl2aXNvci51bnNpZ25lZClcclxuICAgICAgICAgICAgZGl2aXNvciA9IGRpdmlzb3IudG9VbnNpZ25lZCgpO1xyXG4gICAgICAgIGlmIChkaXZpc29yLmd0KHRoaXMpKVxyXG4gICAgICAgICAgICByZXR1cm4gVVpFUk87XHJcbiAgICAgICAgaWYgKGRpdmlzb3IuZ3QodGhpcy5zaHJ1KDEpKSkgLy8gMTUgPj4+IDEgPSA3IDsgd2l0aCBkaXZpc29yID0gOCA7IHRydWVcclxuICAgICAgICAgICAgcmV0dXJuIFVPTkU7XHJcbiAgICAgICAgcmVzID0gVVpFUk87XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmVwZWF0IHRoZSBmb2xsb3dpbmcgdW50aWwgdGhlIHJlbWFpbmRlciBpcyBsZXNzIHRoYW4gb3RoZXI6ICBmaW5kIGFcclxuICAgIC8vIGZsb2F0aW5nLXBvaW50IHRoYXQgYXBwcm94aW1hdGVzIHJlbWFpbmRlciAvIG90aGVyICpmcm9tIGJlbG93KiwgYWRkIHRoaXNcclxuICAgIC8vIGludG8gdGhlIHJlc3VsdCwgYW5kIHN1YnRyYWN0IGl0IGZyb20gdGhlIHJlbWFpbmRlci4gIEl0IGlzIGNyaXRpY2FsIHRoYXRcclxuICAgIC8vIHRoZSBhcHByb3hpbWF0ZSB2YWx1ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHJlYWwgdmFsdWUgc28gdGhhdCB0aGVcclxuICAgIC8vIHJlbWFpbmRlciBuZXZlciBiZWNvbWVzIG5lZ2F0aXZlLlxyXG4gICAgcmVtID0gdGhpcztcclxuICAgIHdoaWxlIChyZW0uZ3RlKGRpdmlzb3IpKSB7XHJcbiAgICAgICAgLy8gQXBwcm94aW1hdGUgdGhlIHJlc3VsdCBvZiBkaXZpc2lvbi4gVGhpcyBtYXkgYmUgYSBsaXR0bGUgZ3JlYXRlciBvclxyXG4gICAgICAgIC8vIHNtYWxsZXIgdGhhbiB0aGUgYWN0dWFsIHZhbHVlLlxyXG4gICAgICAgIGFwcHJveCA9IE1hdGgubWF4KDEsIE1hdGguZmxvb3IocmVtLnRvTnVtYmVyKCkgLyBkaXZpc29yLnRvTnVtYmVyKCkpKTtcclxuXHJcbiAgICAgICAgLy8gV2Ugd2lsbCB0d2VhayB0aGUgYXBwcm94aW1hdGUgcmVzdWx0IGJ5IGNoYW5naW5nIGl0IGluIHRoZSA0OC10aCBkaWdpdCBvclxyXG4gICAgICAgIC8vIHRoZSBzbWFsbGVzdCBub24tZnJhY3Rpb25hbCBkaWdpdCwgd2hpY2hldmVyIGlzIGxhcmdlci5cclxuICAgICAgICB2YXIgbG9nMiA9IE1hdGguY2VpbChNYXRoLmxvZyhhcHByb3gpIC8gTWF0aC5MTjIpLFxyXG4gICAgICAgICAgICBkZWx0YSA9IChsb2cyIDw9IDQ4KSA/IDEgOiBwb3dfZGJsKDIsIGxvZzIgLSA0OCksXHJcblxyXG4gICAgICAgIC8vIERlY3JlYXNlIHRoZSBhcHByb3hpbWF0aW9uIHVudGlsIGl0IGlzIHNtYWxsZXIgdGhhbiB0aGUgcmVtYWluZGVyLiAgTm90ZVxyXG4gICAgICAgIC8vIHRoYXQgaWYgaXQgaXMgdG9vIGxhcmdlLCB0aGUgcHJvZHVjdCBvdmVyZmxvd3MgYW5kIGlzIG5lZ2F0aXZlLlxyXG4gICAgICAgICAgICBhcHByb3hSZXMgPSBmcm9tTnVtYmVyKGFwcHJveCksXHJcbiAgICAgICAgICAgIGFwcHJveFJlbSA9IGFwcHJveFJlcy5tdWwoZGl2aXNvcik7XHJcbiAgICAgICAgd2hpbGUgKGFwcHJveFJlbS5pc05lZ2F0aXZlKCkgfHwgYXBwcm94UmVtLmd0KHJlbSkpIHtcclxuICAgICAgICAgICAgYXBwcm94IC09IGRlbHRhO1xyXG4gICAgICAgICAgICBhcHByb3hSZXMgPSBmcm9tTnVtYmVyKGFwcHJveCwgdGhpcy51bnNpZ25lZCk7XHJcbiAgICAgICAgICAgIGFwcHJveFJlbSA9IGFwcHJveFJlcy5tdWwoZGl2aXNvcik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBXZSBrbm93IHRoZSBhbnN3ZXIgY2FuJ3QgYmUgemVyby4uLiBhbmQgYWN0dWFsbHksIHplcm8gd291bGQgY2F1c2VcclxuICAgICAgICAvLyBpbmZpbml0ZSByZWN1cnNpb24gc2luY2Ugd2Ugd291bGQgbWFrZSBubyBwcm9ncmVzcy5cclxuICAgICAgICBpZiAoYXBwcm94UmVzLmlzWmVybygpKVxyXG4gICAgICAgICAgICBhcHByb3hSZXMgPSBPTkU7XHJcblxyXG4gICAgICAgIHJlcyA9IHJlcy5hZGQoYXBwcm94UmVzKTtcclxuICAgICAgICByZW0gPSByZW0uc3ViKGFwcHJveFJlbSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhpcyBMb25nIGRpdmlkZWQgYnkgdGhlIHNwZWNpZmllZC4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNkaXZpZGV9LlxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8c3RyaW5nfSBkaXZpc29yIERpdmlzb3JcclxuICogQHJldHVybnMgeyFMb25nfSBRdW90aWVudFxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5kaXYgPSBMb25nUHJvdG90eXBlLmRpdmlkZTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoaXMgTG9uZyBtb2R1bG8gdGhlIHNwZWNpZmllZC5cclxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8c3RyaW5nfSBkaXZpc29yIERpdmlzb3JcclxuICogQHJldHVybnMgeyFMb25nfSBSZW1haW5kZXJcclxuICovXHJcbkxvbmdQcm90b3R5cGUubW9kdWxvID0gZnVuY3Rpb24gbW9kdWxvKGRpdmlzb3IpIHtcclxuICAgIGlmICghaXNMb25nKGRpdmlzb3IpKVxyXG4gICAgICAgIGRpdmlzb3IgPSBmcm9tVmFsdWUoZGl2aXNvcik7XHJcblxyXG4gICAgLy8gdXNlIHdhc20gc3VwcG9ydCBpZiBwcmVzZW50XHJcbiAgICBpZiAod2FzbSkge1xyXG4gICAgICAgIHZhciBsb3cgPSAodGhpcy51bnNpZ25lZCA/IHdhc20ucmVtX3UgOiB3YXNtLnJlbV9zKShcclxuICAgICAgICAgICAgdGhpcy5sb3csXHJcbiAgICAgICAgICAgIHRoaXMuaGlnaCxcclxuICAgICAgICAgICAgZGl2aXNvci5sb3csXHJcbiAgICAgICAgICAgIGRpdmlzb3IuaGlnaFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgcmV0dXJuIGZyb21CaXRzKGxvdywgd2FzbS5nZXRfaGlnaCgpLCB0aGlzLnVuc2lnbmVkKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5zdWIodGhpcy5kaXYoZGl2aXNvcikubXVsKGRpdmlzb3IpKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoaXMgTG9uZyBtb2R1bG8gdGhlIHNwZWNpZmllZC4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNtb2R1bG99LlxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8c3RyaW5nfSBkaXZpc29yIERpdmlzb3JcclxuICogQHJldHVybnMgeyFMb25nfSBSZW1haW5kZXJcclxuICovXHJcbkxvbmdQcm90b3R5cGUubW9kID0gTG9uZ1Byb3RvdHlwZS5tb2R1bG87XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGlzIExvbmcgbW9kdWxvIHRoZSBzcGVjaWZpZWQuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbW9kdWxvfS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gZGl2aXNvciBEaXZpc29yXHJcbiAqIEByZXR1cm5zIHshTG9uZ30gUmVtYWluZGVyXHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLnJlbSA9IExvbmdQcm90b3R5cGUubW9kdWxvO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIGJpdHdpc2UgTk9UIG9mIHRoaXMgTG9uZy5cclxuICogQHJldHVybnMgeyFMb25nfVxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5ub3QgPSBmdW5jdGlvbiBub3QoKSB7XHJcbiAgICByZXR1cm4gZnJvbUJpdHMofnRoaXMubG93LCB+dGhpcy5oaWdoLCB0aGlzLnVuc2lnbmVkKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBiaXR3aXNlIEFORCBvZiB0aGlzIExvbmcgYW5kIHRoZSBzcGVjaWZpZWQuXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgTG9uZ1xyXG4gKiBAcmV0dXJucyB7IUxvbmd9XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmFuZCA9IGZ1bmN0aW9uIGFuZChvdGhlcikge1xyXG4gICAgaWYgKCFpc0xvbmcob3RoZXIpKVxyXG4gICAgICAgIG90aGVyID0gZnJvbVZhbHVlKG90aGVyKTtcclxuICAgIHJldHVybiBmcm9tQml0cyh0aGlzLmxvdyAmIG90aGVyLmxvdywgdGhpcy5oaWdoICYgb3RoZXIuaGlnaCwgdGhpcy51bnNpZ25lZCk7XHJcbn07XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGUgYml0d2lzZSBPUiBvZiB0aGlzIExvbmcgYW5kIHRoZSBzcGVjaWZpZWQuXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgTG9uZ1xyXG4gKiBAcmV0dXJucyB7IUxvbmd9XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLm9yID0gZnVuY3Rpb24gb3Iob3RoZXIpIHtcclxuICAgIGlmICghaXNMb25nKG90aGVyKSlcclxuICAgICAgICBvdGhlciA9IGZyb21WYWx1ZShvdGhlcik7XHJcbiAgICByZXR1cm4gZnJvbUJpdHModGhpcy5sb3cgfCBvdGhlci5sb3csIHRoaXMuaGlnaCB8IG90aGVyLmhpZ2gsIHRoaXMudW5zaWduZWQpO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIGJpdHdpc2UgWE9SIG9mIHRoaXMgTG9uZyBhbmQgdGhlIGdpdmVuIG9uZS5cclxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8c3RyaW5nfSBvdGhlciBPdGhlciBMb25nXHJcbiAqIEByZXR1cm5zIHshTG9uZ31cclxuICovXHJcbkxvbmdQcm90b3R5cGUueG9yID0gZnVuY3Rpb24geG9yKG90aGVyKSB7XHJcbiAgICBpZiAoIWlzTG9uZyhvdGhlcikpXHJcbiAgICAgICAgb3RoZXIgPSBmcm9tVmFsdWUob3RoZXIpO1xyXG4gICAgcmV0dXJuIGZyb21CaXRzKHRoaXMubG93IF4gb3RoZXIubG93LCB0aGlzLmhpZ2ggXiBvdGhlci5oaWdoLCB0aGlzLnVuc2lnbmVkKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoaXMgTG9uZyB3aXRoIGJpdHMgc2hpZnRlZCB0byB0aGUgbGVmdCBieSB0aGUgZ2l2ZW4gYW1vdW50LlxyXG4gKiBAcGFyYW0ge251bWJlcnwhTG9uZ30gbnVtQml0cyBOdW1iZXIgb2YgYml0c1xyXG4gKiBAcmV0dXJucyB7IUxvbmd9IFNoaWZ0ZWQgTG9uZ1xyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5zaGlmdExlZnQgPSBmdW5jdGlvbiBzaGlmdExlZnQobnVtQml0cykge1xyXG4gICAgaWYgKGlzTG9uZyhudW1CaXRzKSlcclxuICAgICAgICBudW1CaXRzID0gbnVtQml0cy50b0ludCgpO1xyXG4gICAgaWYgKChudW1CaXRzICY9IDYzKSA9PT0gMClcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIGVsc2UgaWYgKG51bUJpdHMgPCAzMilcclxuICAgICAgICByZXR1cm4gZnJvbUJpdHModGhpcy5sb3cgPDwgbnVtQml0cywgKHRoaXMuaGlnaCA8PCBudW1CaXRzKSB8ICh0aGlzLmxvdyA+Pj4gKDMyIC0gbnVtQml0cykpLCB0aGlzLnVuc2lnbmVkKTtcclxuICAgIGVsc2VcclxuICAgICAgICByZXR1cm4gZnJvbUJpdHMoMCwgdGhpcy5sb3cgPDwgKG51bUJpdHMgLSAzMiksIHRoaXMudW5zaWduZWQpO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhpcyBMb25nIHdpdGggYml0cyBzaGlmdGVkIHRvIHRoZSBsZWZ0IGJ5IHRoZSBnaXZlbiBhbW91bnQuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjc2hpZnRMZWZ0fS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfCFMb25nfSBudW1CaXRzIE51bWJlciBvZiBiaXRzXHJcbiAqIEByZXR1cm5zIHshTG9uZ30gU2hpZnRlZCBMb25nXHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLnNobCA9IExvbmdQcm90b3R5cGUuc2hpZnRMZWZ0O1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhpcyBMb25nIHdpdGggYml0cyBhcml0aG1ldGljYWxseSBzaGlmdGVkIHRvIHRoZSByaWdodCBieSB0aGUgZ2l2ZW4gYW1vdW50LlxyXG4gKiBAcGFyYW0ge251bWJlcnwhTG9uZ30gbnVtQml0cyBOdW1iZXIgb2YgYml0c1xyXG4gKiBAcmV0dXJucyB7IUxvbmd9IFNoaWZ0ZWQgTG9uZ1xyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5zaGlmdFJpZ2h0ID0gZnVuY3Rpb24gc2hpZnRSaWdodChudW1CaXRzKSB7XHJcbiAgICBpZiAoaXNMb25nKG51bUJpdHMpKVxyXG4gICAgICAgIG51bUJpdHMgPSBudW1CaXRzLnRvSW50KCk7XHJcbiAgICBpZiAoKG51bUJpdHMgJj0gNjMpID09PSAwKVxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgZWxzZSBpZiAobnVtQml0cyA8IDMyKVxyXG4gICAgICAgIHJldHVybiBmcm9tQml0cygodGhpcy5sb3cgPj4+IG51bUJpdHMpIHwgKHRoaXMuaGlnaCA8PCAoMzIgLSBudW1CaXRzKSksIHRoaXMuaGlnaCA+PiBudW1CaXRzLCB0aGlzLnVuc2lnbmVkKTtcclxuICAgIGVsc2VcclxuICAgICAgICByZXR1cm4gZnJvbUJpdHModGhpcy5oaWdoID4+IChudW1CaXRzIC0gMzIpLCB0aGlzLmhpZ2ggPj0gMCA/IDAgOiAtMSwgdGhpcy51bnNpZ25lZCk7XHJcbn07XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGlzIExvbmcgd2l0aCBiaXRzIGFyaXRobWV0aWNhbGx5IHNoaWZ0ZWQgdG8gdGhlIHJpZ2h0IGJ5IHRoZSBnaXZlbiBhbW91bnQuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjc2hpZnRSaWdodH0uXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge251bWJlcnwhTG9uZ30gbnVtQml0cyBOdW1iZXIgb2YgYml0c1xyXG4gKiBAcmV0dXJucyB7IUxvbmd9IFNoaWZ0ZWQgTG9uZ1xyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5zaHIgPSBMb25nUHJvdG90eXBlLnNoaWZ0UmlnaHQ7XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGlzIExvbmcgd2l0aCBiaXRzIGxvZ2ljYWxseSBzaGlmdGVkIHRvIHRoZSByaWdodCBieSB0aGUgZ2l2ZW4gYW1vdW50LlxyXG4gKiBAcGFyYW0ge251bWJlcnwhTG9uZ30gbnVtQml0cyBOdW1iZXIgb2YgYml0c1xyXG4gKiBAcmV0dXJucyB7IUxvbmd9IFNoaWZ0ZWQgTG9uZ1xyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5zaGlmdFJpZ2h0VW5zaWduZWQgPSBmdW5jdGlvbiBzaGlmdFJpZ2h0VW5zaWduZWQobnVtQml0cykge1xyXG4gICAgaWYgKGlzTG9uZyhudW1CaXRzKSlcclxuICAgICAgICBudW1CaXRzID0gbnVtQml0cy50b0ludCgpO1xyXG4gICAgbnVtQml0cyAmPSA2MztcclxuICAgIGlmIChudW1CaXRzID09PSAwKVxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgdmFyIGhpZ2ggPSB0aGlzLmhpZ2g7XHJcbiAgICAgICAgaWYgKG51bUJpdHMgPCAzMikge1xyXG4gICAgICAgICAgICB2YXIgbG93ID0gdGhpcy5sb3c7XHJcbiAgICAgICAgICAgIHJldHVybiBmcm9tQml0cygobG93ID4+PiBudW1CaXRzKSB8IChoaWdoIDw8ICgzMiAtIG51bUJpdHMpKSwgaGlnaCA+Pj4gbnVtQml0cywgdGhpcy51bnNpZ25lZCk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChudW1CaXRzID09PSAzMilcclxuICAgICAgICAgICAgcmV0dXJuIGZyb21CaXRzKGhpZ2gsIDAsIHRoaXMudW5zaWduZWQpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgICAgcmV0dXJuIGZyb21CaXRzKGhpZ2ggPj4+IChudW1CaXRzIC0gMzIpLCAwLCB0aGlzLnVuc2lnbmVkKTtcclxuICAgIH1cclxufTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoaXMgTG9uZyB3aXRoIGJpdHMgbG9naWNhbGx5IHNoaWZ0ZWQgdG8gdGhlIHJpZ2h0IGJ5IHRoZSBnaXZlbiBhbW91bnQuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjc2hpZnRSaWdodFVuc2lnbmVkfS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfCFMb25nfSBudW1CaXRzIE51bWJlciBvZiBiaXRzXHJcbiAqIEByZXR1cm5zIHshTG9uZ30gU2hpZnRlZCBMb25nXHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLnNocnUgPSBMb25nUHJvdG90eXBlLnNoaWZ0UmlnaHRVbnNpZ25lZDtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoaXMgTG9uZyB3aXRoIGJpdHMgbG9naWNhbGx5IHNoaWZ0ZWQgdG8gdGhlIHJpZ2h0IGJ5IHRoZSBnaXZlbiBhbW91bnQuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjc2hpZnRSaWdodFVuc2lnbmVkfS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfCFMb25nfSBudW1CaXRzIE51bWJlciBvZiBiaXRzXHJcbiAqIEByZXR1cm5zIHshTG9uZ30gU2hpZnRlZCBMb25nXHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLnNocl91ID0gTG9uZ1Byb3RvdHlwZS5zaGlmdFJpZ2h0VW5zaWduZWQ7XHJcblxyXG4vKipcclxuICogQ29udmVydHMgdGhpcyBMb25nIHRvIHNpZ25lZC5cclxuICogQHJldHVybnMgeyFMb25nfSBTaWduZWQgbG9uZ1xyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS50b1NpZ25lZCA9IGZ1bmN0aW9uIHRvU2lnbmVkKCkge1xyXG4gICAgaWYgKCF0aGlzLnVuc2lnbmVkKVxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgcmV0dXJuIGZyb21CaXRzKHRoaXMubG93LCB0aGlzLmhpZ2gsIGZhbHNlKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBDb252ZXJ0cyB0aGlzIExvbmcgdG8gdW5zaWduZWQuXHJcbiAqIEByZXR1cm5zIHshTG9uZ30gVW5zaWduZWQgbG9uZ1xyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS50b1Vuc2lnbmVkID0gZnVuY3Rpb24gdG9VbnNpZ25lZCgpIHtcclxuICAgIGlmICh0aGlzLnVuc2lnbmVkKVxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgcmV0dXJuIGZyb21CaXRzKHRoaXMubG93LCB0aGlzLmhpZ2gsIHRydWUpO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIENvbnZlcnRzIHRoaXMgTG9uZyB0byBpdHMgYnl0ZSByZXByZXNlbnRhdGlvbi5cclxuICogQHBhcmFtIHtib29sZWFuPX0gbGUgV2hldGhlciBsaXR0bGUgb3IgYmlnIGVuZGlhbiwgZGVmYXVsdHMgdG8gYmlnIGVuZGlhblxyXG4gKiBAcmV0dXJucyB7IUFycmF5LjxudW1iZXI+fSBCeXRlIHJlcHJlc2VudGF0aW9uXHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLnRvQnl0ZXMgPSBmdW5jdGlvbiB0b0J5dGVzKGxlKSB7XHJcbiAgICByZXR1cm4gbGUgPyB0aGlzLnRvQnl0ZXNMRSgpIDogdGhpcy50b0J5dGVzQkUoKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBDb252ZXJ0cyB0aGlzIExvbmcgdG8gaXRzIGxpdHRsZSBlbmRpYW4gYnl0ZSByZXByZXNlbnRhdGlvbi5cclxuICogQHJldHVybnMgeyFBcnJheS48bnVtYmVyPn0gTGl0dGxlIGVuZGlhbiBieXRlIHJlcHJlc2VudGF0aW9uXHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLnRvQnl0ZXNMRSA9IGZ1bmN0aW9uIHRvQnl0ZXNMRSgpIHtcclxuICAgIHZhciBoaSA9IHRoaXMuaGlnaCxcclxuICAgICAgICBsbyA9IHRoaXMubG93O1xyXG4gICAgcmV0dXJuIFtcclxuICAgICAgICBsbyAgICAgICAgJiAweGZmLFxyXG4gICAgICAgIGxvID4+PiAgOCAmIDB4ZmYsXHJcbiAgICAgICAgbG8gPj4+IDE2ICYgMHhmZixcclxuICAgICAgICBsbyA+Pj4gMjQgICAgICAgLFxyXG4gICAgICAgIGhpICAgICAgICAmIDB4ZmYsXHJcbiAgICAgICAgaGkgPj4+ICA4ICYgMHhmZixcclxuICAgICAgICBoaSA+Pj4gMTYgJiAweGZmLFxyXG4gICAgICAgIGhpID4+PiAyNFxyXG4gICAgXTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBDb252ZXJ0cyB0aGlzIExvbmcgdG8gaXRzIGJpZyBlbmRpYW4gYnl0ZSByZXByZXNlbnRhdGlvbi5cclxuICogQHJldHVybnMgeyFBcnJheS48bnVtYmVyPn0gQmlnIGVuZGlhbiBieXRlIHJlcHJlc2VudGF0aW9uXHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLnRvQnl0ZXNCRSA9IGZ1bmN0aW9uIHRvQnl0ZXNCRSgpIHtcclxuICAgIHZhciBoaSA9IHRoaXMuaGlnaCxcclxuICAgICAgICBsbyA9IHRoaXMubG93O1xyXG4gICAgcmV0dXJuIFtcclxuICAgICAgICBoaSA+Pj4gMjQgICAgICAgLFxyXG4gICAgICAgIGhpID4+PiAxNiAmIDB4ZmYsXHJcbiAgICAgICAgaGkgPj4+ICA4ICYgMHhmZixcclxuICAgICAgICBoaSAgICAgICAgJiAweGZmLFxyXG4gICAgICAgIGxvID4+PiAyNCAgICAgICAsXHJcbiAgICAgICAgbG8gPj4+IDE2ICYgMHhmZixcclxuICAgICAgICBsbyA+Pj4gIDggJiAweGZmLFxyXG4gICAgICAgIGxvICAgICAgICAmIDB4ZmZcclxuICAgIF07XHJcbn07XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhIExvbmcgZnJvbSBpdHMgYnl0ZSByZXByZXNlbnRhdGlvbi5cclxuICogQHBhcmFtIHshQXJyYXkuPG51bWJlcj59IGJ5dGVzIEJ5dGUgcmVwcmVzZW50YXRpb25cclxuICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWQgV2hldGhlciB1bnNpZ25lZCBvciBub3QsIGRlZmF1bHRzIHRvIHNpZ25lZFxyXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBsZSBXaGV0aGVyIGxpdHRsZSBvciBiaWcgZW5kaWFuLCBkZWZhdWx0cyB0byBiaWcgZW5kaWFuXHJcbiAqIEByZXR1cm5zIHtMb25nfSBUaGUgY29ycmVzcG9uZGluZyBMb25nIHZhbHVlXHJcbiAqL1xyXG5Mb25nLmZyb21CeXRlcyA9IGZ1bmN0aW9uIGZyb21CeXRlcyhieXRlcywgdW5zaWduZWQsIGxlKSB7XHJcbiAgICByZXR1cm4gbGUgPyBMb25nLmZyb21CeXRlc0xFKGJ5dGVzLCB1bnNpZ25lZCkgOiBMb25nLmZyb21CeXRlc0JFKGJ5dGVzLCB1bnNpZ25lZCk7XHJcbn07XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhIExvbmcgZnJvbSBpdHMgbGl0dGxlIGVuZGlhbiBieXRlIHJlcHJlc2VudGF0aW9uLlxyXG4gKiBAcGFyYW0geyFBcnJheS48bnVtYmVyPn0gYnl0ZXMgTGl0dGxlIGVuZGlhbiBieXRlIHJlcHJlc2VudGF0aW9uXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkIFdoZXRoZXIgdW5zaWduZWQgb3Igbm90LCBkZWZhdWx0cyB0byBzaWduZWRcclxuICogQHJldHVybnMge0xvbmd9IFRoZSBjb3JyZXNwb25kaW5nIExvbmcgdmFsdWVcclxuICovXHJcbkxvbmcuZnJvbUJ5dGVzTEUgPSBmdW5jdGlvbiBmcm9tQnl0ZXNMRShieXRlcywgdW5zaWduZWQpIHtcclxuICAgIHJldHVybiBuZXcgTG9uZyhcclxuICAgICAgICBieXRlc1swXSAgICAgICB8XHJcbiAgICAgICAgYnl0ZXNbMV0gPDwgIDggfFxyXG4gICAgICAgIGJ5dGVzWzJdIDw8IDE2IHxcclxuICAgICAgICBieXRlc1szXSA8PCAyNCxcclxuICAgICAgICBieXRlc1s0XSAgICAgICB8XHJcbiAgICAgICAgYnl0ZXNbNV0gPDwgIDggfFxyXG4gICAgICAgIGJ5dGVzWzZdIDw8IDE2IHxcclxuICAgICAgICBieXRlc1s3XSA8PCAyNCxcclxuICAgICAgICB1bnNpZ25lZFxyXG4gICAgKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgTG9uZyBmcm9tIGl0cyBiaWcgZW5kaWFuIGJ5dGUgcmVwcmVzZW50YXRpb24uXHJcbiAqIEBwYXJhbSB7IUFycmF5LjxudW1iZXI+fSBieXRlcyBCaWcgZW5kaWFuIGJ5dGUgcmVwcmVzZW50YXRpb25cclxuICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWQgV2hldGhlciB1bnNpZ25lZCBvciBub3QsIGRlZmF1bHRzIHRvIHNpZ25lZFxyXG4gKiBAcmV0dXJucyB7TG9uZ30gVGhlIGNvcnJlc3BvbmRpbmcgTG9uZyB2YWx1ZVxyXG4gKi9cclxuTG9uZy5mcm9tQnl0ZXNCRSA9IGZ1bmN0aW9uIGZyb21CeXRlc0JFKGJ5dGVzLCB1bnNpZ25lZCkge1xyXG4gICAgcmV0dXJuIG5ldyBMb25nKFxyXG4gICAgICAgIGJ5dGVzWzRdIDw8IDI0IHxcclxuICAgICAgICBieXRlc1s1XSA8PCAxNiB8XHJcbiAgICAgICAgYnl0ZXNbNl0gPDwgIDggfFxyXG4gICAgICAgIGJ5dGVzWzddLFxyXG4gICAgICAgIGJ5dGVzWzBdIDw8IDI0IHxcclxuICAgICAgICBieXRlc1sxXSA8PCAxNiB8XHJcbiAgICAgICAgYnl0ZXNbMl0gPDwgIDggfFxyXG4gICAgICAgIGJ5dGVzWzNdLFxyXG4gICAgICAgIHVuc2lnbmVkXHJcbiAgICApO1xyXG59O1xyXG4iLCIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLy8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG4vLyBkb24ndCBicmVhayB0aGluZ3MuICBCdXQgd2UgbmVlZCB0byB3cmFwIGl0IGluIGEgdHJ5IGNhdGNoIGluIGNhc2UgaXQgaXNcbi8vIHdyYXBwZWQgaW4gc3RyaWN0IG1vZGUgY29kZSB3aGljaCBkb2Vzbid0IGRlZmluZSBhbnkgZ2xvYmFscy4gIEl0J3MgaW5zaWRlIGFcbi8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cbnZhciBjYWNoZWRTZXRUaW1lb3V0O1xudmFyIGNhY2hlZENsZWFyVGltZW91dDtcblxuZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG4oZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgIH1cbn0gKCkpXG5mdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG59XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpO1xuICAgIH1cbn07XG5cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRPbmNlTGlzdGVuZXIgPSBub29wO1xuXG5wcm9jZXNzLmxpc3RlbmVycyA9IGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBbXSB9XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuIiwiLy8gQSBsaWJyYXJ5IG9mIHNlZWRhYmxlIFJOR3MgaW1wbGVtZW50ZWQgaW4gSmF2YXNjcmlwdC5cbi8vXG4vLyBVc2FnZTpcbi8vXG4vLyB2YXIgc2VlZHJhbmRvbSA9IHJlcXVpcmUoJ3NlZWRyYW5kb20nKTtcbi8vIHZhciByYW5kb20gPSBzZWVkcmFuZG9tKDEpOyAvLyBvciBhbnkgc2VlZC5cbi8vIHZhciB4ID0gcmFuZG9tKCk7ICAgICAgIC8vIDAgPD0geCA8IDEuICBFdmVyeSBiaXQgaXMgcmFuZG9tLlxuLy8gdmFyIHggPSByYW5kb20ucXVpY2soKTsgLy8gMCA8PSB4IDwgMS4gIDMyIGJpdHMgb2YgcmFuZG9tbmVzcy5cblxuLy8gYWxlYSwgYSA1My1iaXQgbXVsdGlwbHktd2l0aC1jYXJyeSBnZW5lcmF0b3IgYnkgSm9oYW5uZXMgQmFhZ8O4ZS5cbi8vIFBlcmlvZDogfjJeMTE2XG4vLyBSZXBvcnRlZCB0byBwYXNzIGFsbCBCaWdDcnVzaCB0ZXN0cy5cbnZhciBhbGVhID0gcmVxdWlyZSgnLi9saWIvYWxlYScpO1xuXG4vLyB4b3IxMjgsIGEgcHVyZSB4b3Itc2hpZnQgZ2VuZXJhdG9yIGJ5IEdlb3JnZSBNYXJzYWdsaWEuXG4vLyBQZXJpb2Q6IDJeMTI4LTEuXG4vLyBSZXBvcnRlZCB0byBmYWlsOiBNYXRyaXhSYW5rIGFuZCBMaW5lYXJDb21wLlxudmFyIHhvcjEyOCA9IHJlcXVpcmUoJy4vbGliL3hvcjEyOCcpO1xuXG4vLyB4b3J3b3csIEdlb3JnZSBNYXJzYWdsaWEncyAxNjAtYml0IHhvci1zaGlmdCBjb21iaW5lZCBwbHVzIHdleWwuXG4vLyBQZXJpb2Q6IDJeMTkyLTJeMzJcbi8vIFJlcG9ydGVkIHRvIGZhaWw6IENvbGxpc2lvbk92ZXIsIFNpbXBQb2tlciwgYW5kIExpbmVhckNvbXAuXG52YXIgeG9yd293ID0gcmVxdWlyZSgnLi9saWIveG9yd293Jyk7XG5cbi8vIHhvcnNoaWZ0NywgYnkgRnJhbsOnb2lzIFBhbm5ldG9uIGFuZCBQaWVycmUgTCdlY3V5ZXIsIHRha2VzXG4vLyBhIGRpZmZlcmVudCBhcHByb2FjaDogaXQgYWRkcyByb2J1c3RuZXNzIGJ5IGFsbG93aW5nIG1vcmUgc2hpZnRzXG4vLyB0aGFuIE1hcnNhZ2xpYSdzIG9yaWdpbmFsIHRocmVlLiAgSXQgaXMgYSA3LXNoaWZ0IGdlbmVyYXRvclxuLy8gd2l0aCAyNTYgYml0cywgdGhhdCBwYXNzZXMgQmlnQ3J1c2ggd2l0aCBubyBzeXN0bWF0aWMgZmFpbHVyZXMuXG4vLyBQZXJpb2QgMl4yNTYtMS5cbi8vIE5vIHN5c3RlbWF0aWMgQmlnQ3J1c2ggZmFpbHVyZXMgcmVwb3J0ZWQuXG52YXIgeG9yc2hpZnQ3ID0gcmVxdWlyZSgnLi9saWIveG9yc2hpZnQ3Jyk7XG5cbi8vIHhvcjQwOTYsIGJ5IFJpY2hhcmQgQnJlbnQsIGlzIGEgNDA5Ni1iaXQgeG9yLXNoaWZ0IHdpdGggYVxuLy8gdmVyeSBsb25nIHBlcmlvZCB0aGF0IGFsc28gYWRkcyBhIFdleWwgZ2VuZXJhdG9yLiBJdCBhbHNvIHBhc3Nlc1xuLy8gQmlnQ3J1c2ggd2l0aCBubyBzeXN0ZW1hdGljIGZhaWx1cmVzLiAgSXRzIGxvbmcgcGVyaW9kIG1heVxuLy8gYmUgdXNlZnVsIGlmIHlvdSBoYXZlIG1hbnkgZ2VuZXJhdG9ycyBhbmQgbmVlZCB0byBhdm9pZFxuLy8gY29sbGlzaW9ucy5cbi8vIFBlcmlvZDogMl40MTI4LTJeMzIuXG4vLyBObyBzeXN0ZW1hdGljIEJpZ0NydXNoIGZhaWx1cmVzIHJlcG9ydGVkLlxudmFyIHhvcjQwOTYgPSByZXF1aXJlKCcuL2xpYi94b3I0MDk2Jyk7XG5cbi8vIFR5Y2hlLWksIGJ5IFNhbXVlbCBOZXZlcyBhbmQgRmlsaXBlIEFyYXVqbywgaXMgYSBiaXQtc2hpZnRpbmcgcmFuZG9tXG4vLyBudW1iZXIgZ2VuZXJhdG9yIGRlcml2ZWQgZnJvbSBDaGFDaGEsIGEgbW9kZXJuIHN0cmVhbSBjaXBoZXIuXG4vLyBodHRwczovL2VkZW4uZGVpLnVjLnB0L35zbmV2ZXMvcHVicy8yMDExLXNuZmEyLnBkZlxuLy8gUGVyaW9kOiB+Ml4xMjdcbi8vIE5vIHN5c3RlbWF0aWMgQmlnQ3J1c2ggZmFpbHVyZXMgcmVwb3J0ZWQuXG52YXIgdHljaGVpID0gcmVxdWlyZSgnLi9saWIvdHljaGVpJyk7XG5cbi8vIFRoZSBvcmlnaW5hbCBBUkM0LWJhc2VkIHBybmcgaW5jbHVkZWQgaW4gdGhpcyBsaWJyYXJ5LlxuLy8gUGVyaW9kOiB+Ml4xNjAwXG52YXIgc3IgPSByZXF1aXJlKCcuL3NlZWRyYW5kb20nKTtcblxuc3IuYWxlYSA9IGFsZWE7XG5zci54b3IxMjggPSB4b3IxMjg7XG5zci54b3J3b3cgPSB4b3J3b3c7XG5zci54b3JzaGlmdDcgPSB4b3JzaGlmdDc7XG5zci54b3I0MDk2ID0geG9yNDA5NjtcbnNyLnR5Y2hlaSA9IHR5Y2hlaTtcblxubW9kdWxlLmV4cG9ydHMgPSBzcjtcbiIsIi8vIEEgcG9ydCBvZiBhbiBhbGdvcml0aG0gYnkgSm9oYW5uZXMgQmFhZ8O4ZSA8YmFhZ29lQGJhYWdvZS5jb20+LCAyMDEwXG4vLyBodHRwOi8vYmFhZ29lLmNvbS9lbi9SYW5kb21NdXNpbmdzL2phdmFzY3JpcHQvXG4vLyBodHRwczovL2dpdGh1Yi5jb20vbnF1aW5sYW4vYmV0dGVyLXJhbmRvbS1udW1iZXJzLWZvci1qYXZhc2NyaXB0LW1pcnJvclxuLy8gT3JpZ2luYWwgd29yayBpcyB1bmRlciBNSVQgbGljZW5zZSAtXG5cbi8vIENvcHlyaWdodCAoQykgMjAxMCBieSBKb2hhbm5lcyBCYWFnw7hlIDxiYWFnb2VAYmFhZ29lLm9yZz5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vLyBcbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vIFxuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyBUSEUgU09GVFdBUkUuXG5cblxuXG4oZnVuY3Rpb24oZ2xvYmFsLCBtb2R1bGUsIGRlZmluZSkge1xuXG5mdW5jdGlvbiBBbGVhKHNlZWQpIHtcbiAgdmFyIG1lID0gdGhpcywgbWFzaCA9IE1hc2goKTtcblxuICBtZS5uZXh0ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHQgPSAyMDkxNjM5ICogbWUuczAgKyBtZS5jICogMi4zMjgzMDY0MzY1Mzg2OTYzZS0xMDsgLy8gMl4tMzJcbiAgICBtZS5zMCA9IG1lLnMxO1xuICAgIG1lLnMxID0gbWUuczI7XG4gICAgcmV0dXJuIG1lLnMyID0gdCAtIChtZS5jID0gdCB8IDApO1xuICB9O1xuXG4gIC8vIEFwcGx5IHRoZSBzZWVkaW5nIGFsZ29yaXRobSBmcm9tIEJhYWdvZS5cbiAgbWUuYyA9IDE7XG4gIG1lLnMwID0gbWFzaCgnICcpO1xuICBtZS5zMSA9IG1hc2goJyAnKTtcbiAgbWUuczIgPSBtYXNoKCcgJyk7XG4gIG1lLnMwIC09IG1hc2goc2VlZCk7XG4gIGlmIChtZS5zMCA8IDApIHsgbWUuczAgKz0gMTsgfVxuICBtZS5zMSAtPSBtYXNoKHNlZWQpO1xuICBpZiAobWUuczEgPCAwKSB7IG1lLnMxICs9IDE7IH1cbiAgbWUuczIgLT0gbWFzaChzZWVkKTtcbiAgaWYgKG1lLnMyIDwgMCkgeyBtZS5zMiArPSAxOyB9XG4gIG1hc2ggPSBudWxsO1xufVxuXG5mdW5jdGlvbiBjb3B5KGYsIHQpIHtcbiAgdC5jID0gZi5jO1xuICB0LnMwID0gZi5zMDtcbiAgdC5zMSA9IGYuczE7XG4gIHQuczIgPSBmLnMyO1xuICByZXR1cm4gdDtcbn1cblxuZnVuY3Rpb24gaW1wbChzZWVkLCBvcHRzKSB7XG4gIHZhciB4ZyA9IG5ldyBBbGVhKHNlZWQpLFxuICAgICAgc3RhdGUgPSBvcHRzICYmIG9wdHMuc3RhdGUsXG4gICAgICBwcm5nID0geGcubmV4dDtcbiAgcHJuZy5pbnQzMiA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gKHhnLm5leHQoKSAqIDB4MTAwMDAwMDAwKSB8IDA7IH1cbiAgcHJuZy5kb3VibGUgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gcHJuZygpICsgKHBybmcoKSAqIDB4MjAwMDAwIHwgMCkgKiAxLjExMDIyMzAyNDYyNTE1NjVlLTE2OyAvLyAyXi01M1xuICB9O1xuICBwcm5nLnF1aWNrID0gcHJuZztcbiAgaWYgKHN0YXRlKSB7XG4gICAgaWYgKHR5cGVvZihzdGF0ZSkgPT0gJ29iamVjdCcpIGNvcHkoc3RhdGUsIHhnKTtcbiAgICBwcm5nLnN0YXRlID0gZnVuY3Rpb24oKSB7IHJldHVybiBjb3B5KHhnLCB7fSk7IH1cbiAgfVxuICByZXR1cm4gcHJuZztcbn1cblxuZnVuY3Rpb24gTWFzaCgpIHtcbiAgdmFyIG4gPSAweGVmYzgyNDlkO1xuXG4gIHZhciBtYXNoID0gZnVuY3Rpb24oZGF0YSkge1xuICAgIGRhdGEgPSBkYXRhLnRvU3RyaW5nKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBuICs9IGRhdGEuY2hhckNvZGVBdChpKTtcbiAgICAgIHZhciBoID0gMC4wMjUxOTYwMzI4MjQxNjkzOCAqIG47XG4gICAgICBuID0gaCA+Pj4gMDtcbiAgICAgIGggLT0gbjtcbiAgICAgIGggKj0gbjtcbiAgICAgIG4gPSBoID4+PiAwO1xuICAgICAgaCAtPSBuO1xuICAgICAgbiArPSBoICogMHgxMDAwMDAwMDA7IC8vIDJeMzJcbiAgICB9XG4gICAgcmV0dXJuIChuID4+PiAwKSAqIDIuMzI4MzA2NDM2NTM4Njk2M2UtMTA7IC8vIDJeLTMyXG4gIH07XG5cbiAgcmV0dXJuIG1hc2g7XG59XG5cblxuaWYgKG1vZHVsZSAmJiBtb2R1bGUuZXhwb3J0cykge1xuICBtb2R1bGUuZXhwb3J0cyA9IGltcGw7XG59IGVsc2UgaWYgKGRlZmluZSAmJiBkZWZpbmUuYW1kKSB7XG4gIGRlZmluZShmdW5jdGlvbigpIHsgcmV0dXJuIGltcGw7IH0pO1xufSBlbHNlIHtcbiAgdGhpcy5hbGVhID0gaW1wbDtcbn1cblxufSkoXG4gIHRoaXMsXG4gICh0eXBlb2YgbW9kdWxlKSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUsICAgIC8vIHByZXNlbnQgaW4gbm9kZS5qc1xuICAodHlwZW9mIGRlZmluZSkgPT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUgICAvLyBwcmVzZW50IHdpdGggYW4gQU1EIGxvYWRlclxuKTtcblxuXG4iLCIvLyBBIEphdmFzY3JpcHQgaW1wbGVtZW50YWlvbiBvZiB0aGUgXCJUeWNoZS1pXCIgcHJuZyBhbGdvcml0aG0gYnlcbi8vIFNhbXVlbCBOZXZlcyBhbmQgRmlsaXBlIEFyYXVqby5cbi8vIFNlZSBodHRwczovL2VkZW4uZGVpLnVjLnB0L35zbmV2ZXMvcHVicy8yMDExLXNuZmEyLnBkZlxuXG4oZnVuY3Rpb24oZ2xvYmFsLCBtb2R1bGUsIGRlZmluZSkge1xuXG5mdW5jdGlvbiBYb3JHZW4oc2VlZCkge1xuICB2YXIgbWUgPSB0aGlzLCBzdHJzZWVkID0gJyc7XG5cbiAgLy8gU2V0IHVwIGdlbmVyYXRvciBmdW5jdGlvbi5cbiAgbWUubmV4dCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBiID0gbWUuYiwgYyA9IG1lLmMsIGQgPSBtZS5kLCBhID0gbWUuYTtcbiAgICBiID0gKGIgPDwgMjUpIF4gKGIgPj4+IDcpIF4gYztcbiAgICBjID0gKGMgLSBkKSB8IDA7XG4gICAgZCA9IChkIDw8IDI0KSBeIChkID4+PiA4KSBeIGE7XG4gICAgYSA9IChhIC0gYikgfCAwO1xuICAgIG1lLmIgPSBiID0gKGIgPDwgMjApIF4gKGIgPj4+IDEyKSBeIGM7XG4gICAgbWUuYyA9IGMgPSAoYyAtIGQpIHwgMDtcbiAgICBtZS5kID0gKGQgPDwgMTYpIF4gKGMgPj4+IDE2KSBeIGE7XG4gICAgcmV0dXJuIG1lLmEgPSAoYSAtIGIpIHwgMDtcbiAgfTtcblxuICAvKiBUaGUgZm9sbG93aW5nIGlzIG5vbi1pbnZlcnRlZCB0eWNoZSwgd2hpY2ggaGFzIGJldHRlciBpbnRlcm5hbFxuICAgKiBiaXQgZGlmZnVzaW9uLCBidXQgd2hpY2ggaXMgYWJvdXQgMjUlIHNsb3dlciB0aGFuIHR5Y2hlLWkgaW4gSlMuXG4gIG1lLm5leHQgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgYSA9IG1lLmEsIGIgPSBtZS5iLCBjID0gbWUuYywgZCA9IG1lLmQ7XG4gICAgYSA9IChtZS5hICsgbWUuYiB8IDApID4+PiAwO1xuICAgIGQgPSBtZS5kIF4gYTsgZCA9IGQgPDwgMTYgXiBkID4+PiAxNjtcbiAgICBjID0gbWUuYyArIGQgfCAwO1xuICAgIGIgPSBtZS5iIF4gYzsgYiA9IGIgPDwgMTIgXiBkID4+PiAyMDtcbiAgICBtZS5hID0gYSA9IGEgKyBiIHwgMDtcbiAgICBkID0gZCBeIGE7IG1lLmQgPSBkID0gZCA8PCA4IF4gZCA+Pj4gMjQ7XG4gICAgbWUuYyA9IGMgPSBjICsgZCB8IDA7XG4gICAgYiA9IGIgXiBjO1xuICAgIHJldHVybiBtZS5iID0gKGIgPDwgNyBeIGIgPj4+IDI1KTtcbiAgfVxuICAqL1xuXG4gIG1lLmEgPSAwO1xuICBtZS5iID0gMDtcbiAgbWUuYyA9IDI2NTQ0MzU3NjkgfCAwO1xuICBtZS5kID0gMTM2NzEzMDU1MTtcblxuICBpZiAoc2VlZCA9PT0gTWF0aC5mbG9vcihzZWVkKSkge1xuICAgIC8vIEludGVnZXIgc2VlZC5cbiAgICBtZS5hID0gKHNlZWQgLyAweDEwMDAwMDAwMCkgfCAwO1xuICAgIG1lLmIgPSBzZWVkIHwgMDtcbiAgfSBlbHNlIHtcbiAgICAvLyBTdHJpbmcgc2VlZC5cbiAgICBzdHJzZWVkICs9IHNlZWQ7XG4gIH1cblxuICAvLyBNaXggaW4gc3RyaW5nIHNlZWQsIHRoZW4gZGlzY2FyZCBhbiBpbml0aWFsIGJhdGNoIG9mIDY0IHZhbHVlcy5cbiAgZm9yICh2YXIgayA9IDA7IGsgPCBzdHJzZWVkLmxlbmd0aCArIDIwOyBrKyspIHtcbiAgICBtZS5iIF49IHN0cnNlZWQuY2hhckNvZGVBdChrKSB8IDA7XG4gICAgbWUubmV4dCgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvcHkoZiwgdCkge1xuICB0LmEgPSBmLmE7XG4gIHQuYiA9IGYuYjtcbiAgdC5jID0gZi5jO1xuICB0LmQgPSBmLmQ7XG4gIHJldHVybiB0O1xufTtcblxuZnVuY3Rpb24gaW1wbChzZWVkLCBvcHRzKSB7XG4gIHZhciB4ZyA9IG5ldyBYb3JHZW4oc2VlZCksXG4gICAgICBzdGF0ZSA9IG9wdHMgJiYgb3B0cy5zdGF0ZSxcbiAgICAgIHBybmcgPSBmdW5jdGlvbigpIHsgcmV0dXJuICh4Zy5uZXh0KCkgPj4+IDApIC8gMHgxMDAwMDAwMDA7IH07XG4gIHBybmcuZG91YmxlID0gZnVuY3Rpb24oKSB7XG4gICAgZG8ge1xuICAgICAgdmFyIHRvcCA9IHhnLm5leHQoKSA+Pj4gMTEsXG4gICAgICAgICAgYm90ID0gKHhnLm5leHQoKSA+Pj4gMCkgLyAweDEwMDAwMDAwMCxcbiAgICAgICAgICByZXN1bHQgPSAodG9wICsgYm90KSAvICgxIDw8IDIxKTtcbiAgICB9IHdoaWxlIChyZXN1bHQgPT09IDApO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG4gIHBybmcuaW50MzIgPSB4Zy5uZXh0O1xuICBwcm5nLnF1aWNrID0gcHJuZztcbiAgaWYgKHN0YXRlKSB7XG4gICAgaWYgKHR5cGVvZihzdGF0ZSkgPT0gJ29iamVjdCcpIGNvcHkoc3RhdGUsIHhnKTtcbiAgICBwcm5nLnN0YXRlID0gZnVuY3Rpb24oKSB7IHJldHVybiBjb3B5KHhnLCB7fSk7IH1cbiAgfVxuICByZXR1cm4gcHJuZztcbn1cblxuaWYgKG1vZHVsZSAmJiBtb2R1bGUuZXhwb3J0cykge1xuICBtb2R1bGUuZXhwb3J0cyA9IGltcGw7XG59IGVsc2UgaWYgKGRlZmluZSAmJiBkZWZpbmUuYW1kKSB7XG4gIGRlZmluZShmdW5jdGlvbigpIHsgcmV0dXJuIGltcGw7IH0pO1xufSBlbHNlIHtcbiAgdGhpcy50eWNoZWkgPSBpbXBsO1xufVxuXG59KShcbiAgdGhpcyxcbiAgKHR5cGVvZiBtb2R1bGUpID09ICdvYmplY3QnICYmIG1vZHVsZSwgICAgLy8gcHJlc2VudCBpbiBub2RlLmpzXG4gICh0eXBlb2YgZGVmaW5lKSA9PSAnZnVuY3Rpb24nICYmIGRlZmluZSAgIC8vIHByZXNlbnQgd2l0aCBhbiBBTUQgbG9hZGVyXG4pO1xuXG5cbiIsIi8vIEEgSmF2YXNjcmlwdCBpbXBsZW1lbnRhaW9uIG9mIHRoZSBcInhvcjEyOFwiIHBybmcgYWxnb3JpdGhtIGJ5XG4vLyBHZW9yZ2UgTWFyc2FnbGlhLiAgU2VlIGh0dHA6Ly93d3cuanN0YXRzb2Z0Lm9yZy92MDgvaTE0L3BhcGVyXG5cbihmdW5jdGlvbihnbG9iYWwsIG1vZHVsZSwgZGVmaW5lKSB7XG5cbmZ1bmN0aW9uIFhvckdlbihzZWVkKSB7XG4gIHZhciBtZSA9IHRoaXMsIHN0cnNlZWQgPSAnJztcblxuICBtZS54ID0gMDtcbiAgbWUueSA9IDA7XG4gIG1lLnogPSAwO1xuICBtZS53ID0gMDtcblxuICAvLyBTZXQgdXAgZ2VuZXJhdG9yIGZ1bmN0aW9uLlxuICBtZS5uZXh0ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHQgPSBtZS54IF4gKG1lLnggPDwgMTEpO1xuICAgIG1lLnggPSBtZS55O1xuICAgIG1lLnkgPSBtZS56O1xuICAgIG1lLnogPSBtZS53O1xuICAgIHJldHVybiBtZS53IF49IChtZS53ID4+PiAxOSkgXiB0IF4gKHQgPj4+IDgpO1xuICB9O1xuXG4gIGlmIChzZWVkID09PSAoc2VlZCB8IDApKSB7XG4gICAgLy8gSW50ZWdlciBzZWVkLlxuICAgIG1lLnggPSBzZWVkO1xuICB9IGVsc2Uge1xuICAgIC8vIFN0cmluZyBzZWVkLlxuICAgIHN0cnNlZWQgKz0gc2VlZDtcbiAgfVxuXG4gIC8vIE1peCBpbiBzdHJpbmcgc2VlZCwgdGhlbiBkaXNjYXJkIGFuIGluaXRpYWwgYmF0Y2ggb2YgNjQgdmFsdWVzLlxuICBmb3IgKHZhciBrID0gMDsgayA8IHN0cnNlZWQubGVuZ3RoICsgNjQ7IGsrKykge1xuICAgIG1lLnggXj0gc3Ryc2VlZC5jaGFyQ29kZUF0KGspIHwgMDtcbiAgICBtZS5uZXh0KCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29weShmLCB0KSB7XG4gIHQueCA9IGYueDtcbiAgdC55ID0gZi55O1xuICB0LnogPSBmLno7XG4gIHQudyA9IGYudztcbiAgcmV0dXJuIHQ7XG59XG5cbmZ1bmN0aW9uIGltcGwoc2VlZCwgb3B0cykge1xuICB2YXIgeGcgPSBuZXcgWG9yR2VuKHNlZWQpLFxuICAgICAgc3RhdGUgPSBvcHRzICYmIG9wdHMuc3RhdGUsXG4gICAgICBwcm5nID0gZnVuY3Rpb24oKSB7IHJldHVybiAoeGcubmV4dCgpID4+PiAwKSAvIDB4MTAwMDAwMDAwOyB9O1xuICBwcm5nLmRvdWJsZSA9IGZ1bmN0aW9uKCkge1xuICAgIGRvIHtcbiAgICAgIHZhciB0b3AgPSB4Zy5uZXh0KCkgPj4+IDExLFxuICAgICAgICAgIGJvdCA9ICh4Zy5uZXh0KCkgPj4+IDApIC8gMHgxMDAwMDAwMDAsXG4gICAgICAgICAgcmVzdWx0ID0gKHRvcCArIGJvdCkgLyAoMSA8PCAyMSk7XG4gICAgfSB3aGlsZSAocmVzdWx0ID09PSAwKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuICBwcm5nLmludDMyID0geGcubmV4dDtcbiAgcHJuZy5xdWljayA9IHBybmc7XG4gIGlmIChzdGF0ZSkge1xuICAgIGlmICh0eXBlb2Yoc3RhdGUpID09ICdvYmplY3QnKSBjb3B5KHN0YXRlLCB4Zyk7XG4gICAgcHJuZy5zdGF0ZSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gY29weSh4Zywge30pOyB9XG4gIH1cbiAgcmV0dXJuIHBybmc7XG59XG5cbmlmIChtb2R1bGUgJiYgbW9kdWxlLmV4cG9ydHMpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBpbXBsO1xufSBlbHNlIGlmIChkZWZpbmUgJiYgZGVmaW5lLmFtZCkge1xuICBkZWZpbmUoZnVuY3Rpb24oKSB7IHJldHVybiBpbXBsOyB9KTtcbn0gZWxzZSB7XG4gIHRoaXMueG9yMTI4ID0gaW1wbDtcbn1cblxufSkoXG4gIHRoaXMsXG4gICh0eXBlb2YgbW9kdWxlKSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUsICAgIC8vIHByZXNlbnQgaW4gbm9kZS5qc1xuICAodHlwZW9mIGRlZmluZSkgPT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUgICAvLyBwcmVzZW50IHdpdGggYW4gQU1EIGxvYWRlclxuKTtcblxuXG4iLCIvLyBBIEphdmFzY3JpcHQgaW1wbGVtZW50YWlvbiBvZiBSaWNoYXJkIEJyZW50J3MgWG9yZ2VucyB4b3I0MDk2IGFsZ29yaXRobS5cbi8vXG4vLyBUaGlzIGZhc3Qgbm9uLWNyeXB0b2dyYXBoaWMgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgaXMgZGVzaWduZWQgZm9yXG4vLyB1c2UgaW4gTW9udGUtQ2FybG8gYWxnb3JpdGhtcy4gSXQgY29tYmluZXMgYSBsb25nLXBlcmlvZCB4b3JzaGlmdFxuLy8gZ2VuZXJhdG9yIHdpdGggYSBXZXlsIGdlbmVyYXRvciwgYW5kIGl0IHBhc3NlcyBhbGwgY29tbW9uIGJhdHRlcmllc1xuLy8gb2Ygc3Rhc3RpY2lhbCB0ZXN0cyBmb3IgcmFuZG9tbmVzcyB3aGlsZSBjb25zdW1pbmcgb25seSBhIGZldyBuYW5vc2Vjb25kc1xuLy8gZm9yIGVhY2ggcHJuZyBnZW5lcmF0ZWQuICBGb3IgYmFja2dyb3VuZCBvbiB0aGUgZ2VuZXJhdG9yLCBzZWUgQnJlbnQnc1xuLy8gcGFwZXI6IFwiU29tZSBsb25nLXBlcmlvZCByYW5kb20gbnVtYmVyIGdlbmVyYXRvcnMgdXNpbmcgc2hpZnRzIGFuZCB4b3JzLlwiXG4vLyBodHRwOi8vYXJ4aXYub3JnL3BkZi8xMDA0LjMxMTV2MS5wZGZcbi8vXG4vLyBVc2FnZTpcbi8vXG4vLyB2YXIgeG9yNDA5NiA9IHJlcXVpcmUoJ3hvcjQwOTYnKTtcbi8vIHJhbmRvbSA9IHhvcjQwOTYoMSk7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VlZCB3aXRoIGludDMyIG9yIHN0cmluZy5cbi8vIGFzc2VydC5lcXVhbChyYW5kb20oKSwgMC4xNTIwNDM2NDUwNTM4NTQ3KTsgLy8gKDAsIDEpIHJhbmdlLCA1MyBiaXRzLlxuLy8gYXNzZXJ0LmVxdWFsKHJhbmRvbS5pbnQzMigpLCAxODA2NTM0ODk3KTsgICAvLyBzaWduZWQgaW50MzIsIDMyIGJpdHMuXG4vL1xuLy8gRm9yIG5vbnplcm8gbnVtZXJpYyBrZXlzLCB0aGlzIGltcGVsZW1lbnRhdGlvbiBwcm92aWRlcyBhIHNlcXVlbmNlXG4vLyBpZGVudGljYWwgdG8gdGhhdCBieSBCcmVudCdzIHhvcmdlbnMgMyBpbXBsZW1lbnRhaW9uIGluIEMuICBUaGlzXG4vLyBpbXBsZW1lbnRhdGlvbiBhbHNvIHByb3ZpZGVzIGZvciBpbml0YWxpemluZyB0aGUgZ2VuZXJhdG9yIHdpdGhcbi8vIHN0cmluZyBzZWVkcywgb3IgZm9yIHNhdmluZyBhbmQgcmVzdG9yaW5nIHRoZSBzdGF0ZSBvZiB0aGUgZ2VuZXJhdG9yLlxuLy9cbi8vIE9uIENocm9tZSwgdGhpcyBwcm5nIGJlbmNobWFya3MgYWJvdXQgMi4xIHRpbWVzIHNsb3dlciB0aGFuXG4vLyBKYXZhc2NyaXB0J3MgYnVpbHQtaW4gTWF0aC5yYW5kb20oKS5cblxuKGZ1bmN0aW9uKGdsb2JhbCwgbW9kdWxlLCBkZWZpbmUpIHtcblxuZnVuY3Rpb24gWG9yR2VuKHNlZWQpIHtcbiAgdmFyIG1lID0gdGhpcztcblxuICAvLyBTZXQgdXAgZ2VuZXJhdG9yIGZ1bmN0aW9uLlxuICBtZS5uZXh0ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHcgPSBtZS53LFxuICAgICAgICBYID0gbWUuWCwgaSA9IG1lLmksIHQsIHY7XG4gICAgLy8gVXBkYXRlIFdleWwgZ2VuZXJhdG9yLlxuICAgIG1lLncgPSB3ID0gKHcgKyAweDYxYzg4NjQ3KSB8IDA7XG4gICAgLy8gVXBkYXRlIHhvciBnZW5lcmF0b3IuXG4gICAgdiA9IFhbKGkgKyAzNCkgJiAxMjddO1xuICAgIHQgPSBYW2kgPSAoKGkgKyAxKSAmIDEyNyldO1xuICAgIHYgXj0gdiA8PCAxMztcbiAgICB0IF49IHQgPDwgMTc7XG4gICAgdiBePSB2ID4+PiAxNTtcbiAgICB0IF49IHQgPj4+IDEyO1xuICAgIC8vIFVwZGF0ZSBYb3IgZ2VuZXJhdG9yIGFycmF5IHN0YXRlLlxuICAgIHYgPSBYW2ldID0gdiBeIHQ7XG4gICAgbWUuaSA9IGk7XG4gICAgLy8gUmVzdWx0IGlzIHRoZSBjb21iaW5hdGlvbi5cbiAgICByZXR1cm4gKHYgKyAodyBeICh3ID4+PiAxNikpKSB8IDA7XG4gIH07XG5cbiAgZnVuY3Rpb24gaW5pdChtZSwgc2VlZCkge1xuICAgIHZhciB0LCB2LCBpLCBqLCB3LCBYID0gW10sIGxpbWl0ID0gMTI4O1xuICAgIGlmIChzZWVkID09PSAoc2VlZCB8IDApKSB7XG4gICAgICAvLyBOdW1lcmljIHNlZWRzIGluaXRpYWxpemUgdiwgd2hpY2ggaXMgdXNlZCB0byBnZW5lcmF0ZXMgWC5cbiAgICAgIHYgPSBzZWVkO1xuICAgICAgc2VlZCA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFN0cmluZyBzZWVkcyBhcmUgbWl4ZWQgaW50byB2IGFuZCBYIG9uZSBjaGFyYWN0ZXIgYXQgYSB0aW1lLlxuICAgICAgc2VlZCA9IHNlZWQgKyAnXFwwJztcbiAgICAgIHYgPSAwO1xuICAgICAgbGltaXQgPSBNYXRoLm1heChsaW1pdCwgc2VlZC5sZW5ndGgpO1xuICAgIH1cbiAgICAvLyBJbml0aWFsaXplIGNpcmN1bGFyIGFycmF5IGFuZCB3ZXlsIHZhbHVlLlxuICAgIGZvciAoaSA9IDAsIGogPSAtMzI7IGogPCBsaW1pdDsgKytqKSB7XG4gICAgICAvLyBQdXQgdGhlIHVuaWNvZGUgY2hhcmFjdGVycyBpbnRvIHRoZSBhcnJheSwgYW5kIHNodWZmbGUgdGhlbS5cbiAgICAgIGlmIChzZWVkKSB2IF49IHNlZWQuY2hhckNvZGVBdCgoaiArIDMyKSAlIHNlZWQubGVuZ3RoKTtcbiAgICAgIC8vIEFmdGVyIDMyIHNodWZmbGVzLCB0YWtlIHYgYXMgdGhlIHN0YXJ0aW5nIHcgdmFsdWUuXG4gICAgICBpZiAoaiA9PT0gMCkgdyA9IHY7XG4gICAgICB2IF49IHYgPDwgMTA7XG4gICAgICB2IF49IHYgPj4+IDE1O1xuICAgICAgdiBePSB2IDw8IDQ7XG4gICAgICB2IF49IHYgPj4+IDEzO1xuICAgICAgaWYgKGogPj0gMCkge1xuICAgICAgICB3ID0gKHcgKyAweDYxYzg4NjQ3KSB8IDA7ICAgICAvLyBXZXlsLlxuICAgICAgICB0ID0gKFhbaiAmIDEyN10gXj0gKHYgKyB3KSk7ICAvLyBDb21iaW5lIHhvciBhbmQgd2V5bCB0byBpbml0IGFycmF5LlxuICAgICAgICBpID0gKDAgPT0gdCkgPyBpICsgMSA6IDA7ICAgICAvLyBDb3VudCB6ZXJvZXMuXG4gICAgICB9XG4gICAgfVxuICAgIC8vIFdlIGhhdmUgZGV0ZWN0ZWQgYWxsIHplcm9lczsgbWFrZSB0aGUga2V5IG5vbnplcm8uXG4gICAgaWYgKGkgPj0gMTI4KSB7XG4gICAgICBYWyhzZWVkICYmIHNlZWQubGVuZ3RoIHx8IDApICYgMTI3XSA9IC0xO1xuICAgIH1cbiAgICAvLyBSdW4gdGhlIGdlbmVyYXRvciA1MTIgdGltZXMgdG8gZnVydGhlciBtaXggdGhlIHN0YXRlIGJlZm9yZSB1c2luZyBpdC5cbiAgICAvLyBGYWN0b3JpbmcgdGhpcyBhcyBhIGZ1bmN0aW9uIHNsb3dzIHRoZSBtYWluIGdlbmVyYXRvciwgc28gaXQgaXMganVzdFxuICAgIC8vIHVucm9sbGVkIGhlcmUuICBUaGUgd2V5bCBnZW5lcmF0b3IgaXMgbm90IGFkdmFuY2VkIHdoaWxlIHdhcm1pbmcgdXAuXG4gICAgaSA9IDEyNztcbiAgICBmb3IgKGogPSA0ICogMTI4OyBqID4gMDsgLS1qKSB7XG4gICAgICB2ID0gWFsoaSArIDM0KSAmIDEyN107XG4gICAgICB0ID0gWFtpID0gKChpICsgMSkgJiAxMjcpXTtcbiAgICAgIHYgXj0gdiA8PCAxMztcbiAgICAgIHQgXj0gdCA8PCAxNztcbiAgICAgIHYgXj0gdiA+Pj4gMTU7XG4gICAgICB0IF49IHQgPj4+IDEyO1xuICAgICAgWFtpXSA9IHYgXiB0O1xuICAgIH1cbiAgICAvLyBTdG9yaW5nIHN0YXRlIGFzIG9iamVjdCBtZW1iZXJzIGlzIGZhc3RlciB0aGFuIHVzaW5nIGNsb3N1cmUgdmFyaWFibGVzLlxuICAgIG1lLncgPSB3O1xuICAgIG1lLlggPSBYO1xuICAgIG1lLmkgPSBpO1xuICB9XG5cbiAgaW5pdChtZSwgc2VlZCk7XG59XG5cbmZ1bmN0aW9uIGNvcHkoZiwgdCkge1xuICB0LmkgPSBmLmk7XG4gIHQudyA9IGYudztcbiAgdC5YID0gZi5YLnNsaWNlKCk7XG4gIHJldHVybiB0O1xufTtcblxuZnVuY3Rpb24gaW1wbChzZWVkLCBvcHRzKSB7XG4gIGlmIChzZWVkID09IG51bGwpIHNlZWQgPSArKG5ldyBEYXRlKTtcbiAgdmFyIHhnID0gbmV3IFhvckdlbihzZWVkKSxcbiAgICAgIHN0YXRlID0gb3B0cyAmJiBvcHRzLnN0YXRlLFxuICAgICAgcHJuZyA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gKHhnLm5leHQoKSA+Pj4gMCkgLyAweDEwMDAwMDAwMDsgfTtcbiAgcHJuZy5kb3VibGUgPSBmdW5jdGlvbigpIHtcbiAgICBkbyB7XG4gICAgICB2YXIgdG9wID0geGcubmV4dCgpID4+PiAxMSxcbiAgICAgICAgICBib3QgPSAoeGcubmV4dCgpID4+PiAwKSAvIDB4MTAwMDAwMDAwLFxuICAgICAgICAgIHJlc3VsdCA9ICh0b3AgKyBib3QpIC8gKDEgPDwgMjEpO1xuICAgIH0gd2hpbGUgKHJlc3VsdCA9PT0gMCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgcHJuZy5pbnQzMiA9IHhnLm5leHQ7XG4gIHBybmcucXVpY2sgPSBwcm5nO1xuICBpZiAoc3RhdGUpIHtcbiAgICBpZiAoc3RhdGUuWCkgY29weShzdGF0ZSwgeGcpO1xuICAgIHBybmcuc3RhdGUgPSBmdW5jdGlvbigpIHsgcmV0dXJuIGNvcHkoeGcsIHt9KTsgfVxuICB9XG4gIHJldHVybiBwcm5nO1xufVxuXG5pZiAobW9kdWxlICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gaW1wbDtcbn0gZWxzZSBpZiAoZGVmaW5lICYmIGRlZmluZS5hbWQpIHtcbiAgZGVmaW5lKGZ1bmN0aW9uKCkgeyByZXR1cm4gaW1wbDsgfSk7XG59IGVsc2Uge1xuICB0aGlzLnhvcjQwOTYgPSBpbXBsO1xufVxuXG59KShcbiAgdGhpcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2luZG93IG9iamVjdCBvciBnbG9iYWxcbiAgKHR5cGVvZiBtb2R1bGUpID09ICdvYmplY3QnICYmIG1vZHVsZSwgICAgLy8gcHJlc2VudCBpbiBub2RlLmpzXG4gICh0eXBlb2YgZGVmaW5lKSA9PSAnZnVuY3Rpb24nICYmIGRlZmluZSAgIC8vIHByZXNlbnQgd2l0aCBhbiBBTUQgbG9hZGVyXG4pO1xuIiwiLy8gQSBKYXZhc2NyaXB0IGltcGxlbWVudGFpb24gb2YgdGhlIFwieG9yc2hpZnQ3XCIgYWxnb3JpdGhtIGJ5XG4vLyBGcmFuw6dvaXMgUGFubmV0b24gYW5kIFBpZXJyZSBMJ2VjdXllcjpcbi8vIFwiT24gdGhlIFhvcmdzaGlmdCBSYW5kb20gTnVtYmVyIEdlbmVyYXRvcnNcIlxuLy8gaHR0cDovL3NhbHVjLmVuZ3IudWNvbm4uZWR1L3JlZnMvY3J5cHRvL3JuZy9wYW5uZXRvbjA1b250aGV4b3JzaGlmdC5wZGZcblxuKGZ1bmN0aW9uKGdsb2JhbCwgbW9kdWxlLCBkZWZpbmUpIHtcblxuZnVuY3Rpb24gWG9yR2VuKHNlZWQpIHtcbiAgdmFyIG1lID0gdGhpcztcblxuICAvLyBTZXQgdXAgZ2VuZXJhdG9yIGZ1bmN0aW9uLlxuICBtZS5uZXh0ID0gZnVuY3Rpb24oKSB7XG4gICAgLy8gVXBkYXRlIHhvciBnZW5lcmF0b3IuXG4gICAgdmFyIFggPSBtZS54LCBpID0gbWUuaSwgdCwgdiwgdztcbiAgICB0ID0gWFtpXTsgdCBePSAodCA+Pj4gNyk7IHYgPSB0IF4gKHQgPDwgMjQpO1xuICAgIHQgPSBYWyhpICsgMSkgJiA3XTsgdiBePSB0IF4gKHQgPj4+IDEwKTtcbiAgICB0ID0gWFsoaSArIDMpICYgN107IHYgXj0gdCBeICh0ID4+PiAzKTtcbiAgICB0ID0gWFsoaSArIDQpICYgN107IHYgXj0gdCBeICh0IDw8IDcpO1xuICAgIHQgPSBYWyhpICsgNykgJiA3XTsgdCA9IHQgXiAodCA8PCAxMyk7IHYgXj0gdCBeICh0IDw8IDkpO1xuICAgIFhbaV0gPSB2O1xuICAgIG1lLmkgPSAoaSArIDEpICYgNztcbiAgICByZXR1cm4gdjtcbiAgfTtcblxuICBmdW5jdGlvbiBpbml0KG1lLCBzZWVkKSB7XG4gICAgdmFyIGosIHcsIFggPSBbXTtcblxuICAgIGlmIChzZWVkID09PSAoc2VlZCB8IDApKSB7XG4gICAgICAvLyBTZWVkIHN0YXRlIGFycmF5IHVzaW5nIGEgMzItYml0IGludGVnZXIuXG4gICAgICB3ID0gWFswXSA9IHNlZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFNlZWQgc3RhdGUgdXNpbmcgYSBzdHJpbmcuXG4gICAgICBzZWVkID0gJycgKyBzZWVkO1xuICAgICAgZm9yIChqID0gMDsgaiA8IHNlZWQubGVuZ3RoOyArK2opIHtcbiAgICAgICAgWFtqICYgN10gPSAoWFtqICYgN10gPDwgMTUpIF5cbiAgICAgICAgICAgIChzZWVkLmNoYXJDb2RlQXQoaikgKyBYWyhqICsgMSkgJiA3XSA8PCAxMyk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIEVuZm9yY2UgYW4gYXJyYXkgbGVuZ3RoIG9mIDgsIG5vdCBhbGwgemVyb2VzLlxuICAgIHdoaWxlIChYLmxlbmd0aCA8IDgpIFgucHVzaCgwKTtcbiAgICBmb3IgKGogPSAwOyBqIDwgOCAmJiBYW2pdID09PSAwOyArK2opO1xuICAgIGlmIChqID09IDgpIHcgPSBYWzddID0gLTE7IGVsc2UgdyA9IFhbal07XG5cbiAgICBtZS54ID0gWDtcbiAgICBtZS5pID0gMDtcblxuICAgIC8vIERpc2NhcmQgYW4gaW5pdGlhbCAyNTYgdmFsdWVzLlxuICAgIGZvciAoaiA9IDI1NjsgaiA+IDA7IC0taikge1xuICAgICAgbWUubmV4dCgpO1xuICAgIH1cbiAgfVxuXG4gIGluaXQobWUsIHNlZWQpO1xufVxuXG5mdW5jdGlvbiBjb3B5KGYsIHQpIHtcbiAgdC54ID0gZi54LnNsaWNlKCk7XG4gIHQuaSA9IGYuaTtcbiAgcmV0dXJuIHQ7XG59XG5cbmZ1bmN0aW9uIGltcGwoc2VlZCwgb3B0cykge1xuICBpZiAoc2VlZCA9PSBudWxsKSBzZWVkID0gKyhuZXcgRGF0ZSk7XG4gIHZhciB4ZyA9IG5ldyBYb3JHZW4oc2VlZCksXG4gICAgICBzdGF0ZSA9IG9wdHMgJiYgb3B0cy5zdGF0ZSxcbiAgICAgIHBybmcgPSBmdW5jdGlvbigpIHsgcmV0dXJuICh4Zy5uZXh0KCkgPj4+IDApIC8gMHgxMDAwMDAwMDA7IH07XG4gIHBybmcuZG91YmxlID0gZnVuY3Rpb24oKSB7XG4gICAgZG8ge1xuICAgICAgdmFyIHRvcCA9IHhnLm5leHQoKSA+Pj4gMTEsXG4gICAgICAgICAgYm90ID0gKHhnLm5leHQoKSA+Pj4gMCkgLyAweDEwMDAwMDAwMCxcbiAgICAgICAgICByZXN1bHQgPSAodG9wICsgYm90KSAvICgxIDw8IDIxKTtcbiAgICB9IHdoaWxlIChyZXN1bHQgPT09IDApO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG4gIHBybmcuaW50MzIgPSB4Zy5uZXh0O1xuICBwcm5nLnF1aWNrID0gcHJuZztcbiAgaWYgKHN0YXRlKSB7XG4gICAgaWYgKHN0YXRlLngpIGNvcHkoc3RhdGUsIHhnKTtcbiAgICBwcm5nLnN0YXRlID0gZnVuY3Rpb24oKSB7IHJldHVybiBjb3B5KHhnLCB7fSk7IH1cbiAgfVxuICByZXR1cm4gcHJuZztcbn1cblxuaWYgKG1vZHVsZSAmJiBtb2R1bGUuZXhwb3J0cykge1xuICBtb2R1bGUuZXhwb3J0cyA9IGltcGw7XG59IGVsc2UgaWYgKGRlZmluZSAmJiBkZWZpbmUuYW1kKSB7XG4gIGRlZmluZShmdW5jdGlvbigpIHsgcmV0dXJuIGltcGw7IH0pO1xufSBlbHNlIHtcbiAgdGhpcy54b3JzaGlmdDcgPSBpbXBsO1xufVxuXG59KShcbiAgdGhpcyxcbiAgKHR5cGVvZiBtb2R1bGUpID09ICdvYmplY3QnICYmIG1vZHVsZSwgICAgLy8gcHJlc2VudCBpbiBub2RlLmpzXG4gICh0eXBlb2YgZGVmaW5lKSA9PSAnZnVuY3Rpb24nICYmIGRlZmluZSAgIC8vIHByZXNlbnQgd2l0aCBhbiBBTUQgbG9hZGVyXG4pO1xuXG4iLCIvLyBBIEphdmFzY3JpcHQgaW1wbGVtZW50YWlvbiBvZiB0aGUgXCJ4b3J3b3dcIiBwcm5nIGFsZ29yaXRobSBieVxuLy8gR2VvcmdlIE1hcnNhZ2xpYS4gIFNlZSBodHRwOi8vd3d3LmpzdGF0c29mdC5vcmcvdjA4L2kxNC9wYXBlclxuXG4oZnVuY3Rpb24oZ2xvYmFsLCBtb2R1bGUsIGRlZmluZSkge1xuXG5mdW5jdGlvbiBYb3JHZW4oc2VlZCkge1xuICB2YXIgbWUgPSB0aGlzLCBzdHJzZWVkID0gJyc7XG5cbiAgLy8gU2V0IHVwIGdlbmVyYXRvciBmdW5jdGlvbi5cbiAgbWUubmV4dCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciB0ID0gKG1lLnggXiAobWUueCA+Pj4gMikpO1xuICAgIG1lLnggPSBtZS55OyBtZS55ID0gbWUuejsgbWUueiA9IG1lLnc7IG1lLncgPSBtZS52O1xuICAgIHJldHVybiAobWUuZCA9IChtZS5kICsgMzYyNDM3IHwgMCkpICtcbiAgICAgICAobWUudiA9IChtZS52IF4gKG1lLnYgPDwgNCkpIF4gKHQgXiAodCA8PCAxKSkpIHwgMDtcbiAgfTtcblxuICBtZS54ID0gMDtcbiAgbWUueSA9IDA7XG4gIG1lLnogPSAwO1xuICBtZS53ID0gMDtcbiAgbWUudiA9IDA7XG5cbiAgaWYgKHNlZWQgPT09IChzZWVkIHwgMCkpIHtcbiAgICAvLyBJbnRlZ2VyIHNlZWQuXG4gICAgbWUueCA9IHNlZWQ7XG4gIH0gZWxzZSB7XG4gICAgLy8gU3RyaW5nIHNlZWQuXG4gICAgc3Ryc2VlZCArPSBzZWVkO1xuICB9XG5cbiAgLy8gTWl4IGluIHN0cmluZyBzZWVkLCB0aGVuIGRpc2NhcmQgYW4gaW5pdGlhbCBiYXRjaCBvZiA2NCB2YWx1ZXMuXG4gIGZvciAodmFyIGsgPSAwOyBrIDwgc3Ryc2VlZC5sZW5ndGggKyA2NDsgaysrKSB7XG4gICAgbWUueCBePSBzdHJzZWVkLmNoYXJDb2RlQXQoaykgfCAwO1xuICAgIGlmIChrID09IHN0cnNlZWQubGVuZ3RoKSB7XG4gICAgICBtZS5kID0gbWUueCA8PCAxMCBeIG1lLnggPj4+IDQ7XG4gICAgfVxuICAgIG1lLm5leHQoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb3B5KGYsIHQpIHtcbiAgdC54ID0gZi54O1xuICB0LnkgPSBmLnk7XG4gIHQueiA9IGYuejtcbiAgdC53ID0gZi53O1xuICB0LnYgPSBmLnY7XG4gIHQuZCA9IGYuZDtcbiAgcmV0dXJuIHQ7XG59XG5cbmZ1bmN0aW9uIGltcGwoc2VlZCwgb3B0cykge1xuICB2YXIgeGcgPSBuZXcgWG9yR2VuKHNlZWQpLFxuICAgICAgc3RhdGUgPSBvcHRzICYmIG9wdHMuc3RhdGUsXG4gICAgICBwcm5nID0gZnVuY3Rpb24oKSB7IHJldHVybiAoeGcubmV4dCgpID4+PiAwKSAvIDB4MTAwMDAwMDAwOyB9O1xuICBwcm5nLmRvdWJsZSA9IGZ1bmN0aW9uKCkge1xuICAgIGRvIHtcbiAgICAgIHZhciB0b3AgPSB4Zy5uZXh0KCkgPj4+IDExLFxuICAgICAgICAgIGJvdCA9ICh4Zy5uZXh0KCkgPj4+IDApIC8gMHgxMDAwMDAwMDAsXG4gICAgICAgICAgcmVzdWx0ID0gKHRvcCArIGJvdCkgLyAoMSA8PCAyMSk7XG4gICAgfSB3aGlsZSAocmVzdWx0ID09PSAwKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuICBwcm5nLmludDMyID0geGcubmV4dDtcbiAgcHJuZy5xdWljayA9IHBybmc7XG4gIGlmIChzdGF0ZSkge1xuICAgIGlmICh0eXBlb2Yoc3RhdGUpID09ICdvYmplY3QnKSBjb3B5KHN0YXRlLCB4Zyk7XG4gICAgcHJuZy5zdGF0ZSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gY29weSh4Zywge30pOyB9XG4gIH1cbiAgcmV0dXJuIHBybmc7XG59XG5cbmlmIChtb2R1bGUgJiYgbW9kdWxlLmV4cG9ydHMpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBpbXBsO1xufSBlbHNlIGlmIChkZWZpbmUgJiYgZGVmaW5lLmFtZCkge1xuICBkZWZpbmUoZnVuY3Rpb24oKSB7IHJldHVybiBpbXBsOyB9KTtcbn0gZWxzZSB7XG4gIHRoaXMueG9yd293ID0gaW1wbDtcbn1cblxufSkoXG4gIHRoaXMsXG4gICh0eXBlb2YgbW9kdWxlKSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUsICAgIC8vIHByZXNlbnQgaW4gbm9kZS5qc1xuICAodHlwZW9mIGRlZmluZSkgPT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUgICAvLyBwcmVzZW50IHdpdGggYW4gQU1EIGxvYWRlclxuKTtcblxuXG4iLCIvKlxuQ29weXJpZ2h0IDIwMTQgRGF2aWQgQmF1LlxuXG5QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmdcbmEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG53aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG5kaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG9cbnBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0b1xudGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuXG5UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZVxuaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG5cblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsXG5FWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbk1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC5cbklOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZXG5DTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULFxuVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEVcblNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4qL1xuXG4oZnVuY3Rpb24gKHBvb2wsIG1hdGgpIHtcbi8vXG4vLyBUaGUgZm9sbG93aW5nIGNvbnN0YW50cyBhcmUgcmVsYXRlZCB0byBJRUVFIDc1NCBsaW1pdHMuXG4vL1xudmFyIGdsb2JhbCA9IHRoaXMsXG4gICAgd2lkdGggPSAyNTYsICAgICAgICAvLyBlYWNoIFJDNCBvdXRwdXQgaXMgMCA8PSB4IDwgMjU2XG4gICAgY2h1bmtzID0gNiwgICAgICAgICAvLyBhdCBsZWFzdCBzaXggUkM0IG91dHB1dHMgZm9yIGVhY2ggZG91YmxlXG4gICAgZGlnaXRzID0gNTIsICAgICAgICAvLyB0aGVyZSBhcmUgNTIgc2lnbmlmaWNhbnQgZGlnaXRzIGluIGEgZG91YmxlXG4gICAgcm5nbmFtZSA9ICdyYW5kb20nLCAvLyBybmduYW1lOiBuYW1lIGZvciBNYXRoLnJhbmRvbSBhbmQgTWF0aC5zZWVkcmFuZG9tXG4gICAgc3RhcnRkZW5vbSA9IG1hdGgucG93KHdpZHRoLCBjaHVua3MpLFxuICAgIHNpZ25pZmljYW5jZSA9IG1hdGgucG93KDIsIGRpZ2l0cyksXG4gICAgb3ZlcmZsb3cgPSBzaWduaWZpY2FuY2UgKiAyLFxuICAgIG1hc2sgPSB3aWR0aCAtIDEsXG4gICAgbm9kZWNyeXB0bzsgICAgICAgICAvLyBub2RlLmpzIGNyeXB0byBtb2R1bGUsIGluaXRpYWxpemVkIGF0IHRoZSBib3R0b20uXG5cbi8vXG4vLyBzZWVkcmFuZG9tKClcbi8vIFRoaXMgaXMgdGhlIHNlZWRyYW5kb20gZnVuY3Rpb24gZGVzY3JpYmVkIGFib3ZlLlxuLy9cbmZ1bmN0aW9uIHNlZWRyYW5kb20oc2VlZCwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgdmFyIGtleSA9IFtdO1xuICBvcHRpb25zID0gKG9wdGlvbnMgPT0gdHJ1ZSkgPyB7IGVudHJvcHk6IHRydWUgfSA6IChvcHRpb25zIHx8IHt9KTtcblxuICAvLyBGbGF0dGVuIHRoZSBzZWVkIHN0cmluZyBvciBidWlsZCBvbmUgZnJvbSBsb2NhbCBlbnRyb3B5IGlmIG5lZWRlZC5cbiAgdmFyIHNob3J0c2VlZCA9IG1peGtleShmbGF0dGVuKFxuICAgIG9wdGlvbnMuZW50cm9weSA/IFtzZWVkLCB0b3N0cmluZyhwb29sKV0gOlxuICAgIChzZWVkID09IG51bGwpID8gYXV0b3NlZWQoKSA6IHNlZWQsIDMpLCBrZXkpO1xuXG4gIC8vIFVzZSB0aGUgc2VlZCB0byBpbml0aWFsaXplIGFuIEFSQzQgZ2VuZXJhdG9yLlxuICB2YXIgYXJjNCA9IG5ldyBBUkM0KGtleSk7XG5cbiAgLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcmFuZG9tIGRvdWJsZSBpbiBbMCwgMSkgdGhhdCBjb250YWluc1xuICAvLyByYW5kb21uZXNzIGluIGV2ZXJ5IGJpdCBvZiB0aGUgbWFudGlzc2Egb2YgdGhlIElFRUUgNzU0IHZhbHVlLlxuICB2YXIgcHJuZyA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBuID0gYXJjNC5nKGNodW5rcyksICAgICAgICAgICAgIC8vIFN0YXJ0IHdpdGggYSBudW1lcmF0b3IgbiA8IDIgXiA0OFxuICAgICAgICBkID0gc3RhcnRkZW5vbSwgICAgICAgICAgICAgICAgIC8vICAgYW5kIGRlbm9taW5hdG9yIGQgPSAyIF4gNDguXG4gICAgICAgIHggPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBhbmQgbm8gJ2V4dHJhIGxhc3QgYnl0ZScuXG4gICAgd2hpbGUgKG4gPCBzaWduaWZpY2FuY2UpIHsgICAgICAgICAgLy8gRmlsbCB1cCBhbGwgc2lnbmlmaWNhbnQgZGlnaXRzIGJ5XG4gICAgICBuID0gKG4gKyB4KSAqIHdpZHRoOyAgICAgICAgICAgICAgLy8gICBzaGlmdGluZyBudW1lcmF0b3IgYW5kXG4gICAgICBkICo9IHdpZHRoOyAgICAgICAgICAgICAgICAgICAgICAgLy8gICBkZW5vbWluYXRvciBhbmQgZ2VuZXJhdGluZyBhXG4gICAgICB4ID0gYXJjNC5nKDEpOyAgICAgICAgICAgICAgICAgICAgLy8gICBuZXcgbGVhc3Qtc2lnbmlmaWNhbnQtYnl0ZS5cbiAgICB9XG4gICAgd2hpbGUgKG4gPj0gb3ZlcmZsb3cpIHsgICAgICAgICAgICAgLy8gVG8gYXZvaWQgcm91bmRpbmcgdXAsIGJlZm9yZSBhZGRpbmdcbiAgICAgIG4gLz0gMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIGxhc3QgYnl0ZSwgc2hpZnQgZXZlcnl0aGluZ1xuICAgICAgZCAvPSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgcmlnaHQgdXNpbmcgaW50ZWdlciBtYXRoIHVudGlsXG4gICAgICB4ID4+Pj0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICB3ZSBoYXZlIGV4YWN0bHkgdGhlIGRlc2lyZWQgYml0cy5cbiAgICB9XG4gICAgcmV0dXJuIChuICsgeCkgLyBkOyAgICAgICAgICAgICAgICAgLy8gRm9ybSB0aGUgbnVtYmVyIHdpdGhpbiBbMCwgMSkuXG4gIH07XG5cbiAgcHJuZy5pbnQzMiA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gYXJjNC5nKDQpIHwgMDsgfVxuICBwcm5nLnF1aWNrID0gZnVuY3Rpb24oKSB7IHJldHVybiBhcmM0LmcoNCkgLyAweDEwMDAwMDAwMDsgfVxuICBwcm5nLmRvdWJsZSA9IHBybmc7XG5cbiAgLy8gTWl4IHRoZSByYW5kb21uZXNzIGludG8gYWNjdW11bGF0ZWQgZW50cm9weS5cbiAgbWl4a2V5KHRvc3RyaW5nKGFyYzQuUyksIHBvb2wpO1xuXG4gIC8vIENhbGxpbmcgY29udmVudGlvbjogd2hhdCB0byByZXR1cm4gYXMgYSBmdW5jdGlvbiBvZiBwcm5nLCBzZWVkLCBpc19tYXRoLlxuICByZXR1cm4gKG9wdGlvbnMucGFzcyB8fCBjYWxsYmFjayB8fFxuICAgICAgZnVuY3Rpb24ocHJuZywgc2VlZCwgaXNfbWF0aF9jYWxsLCBzdGF0ZSkge1xuICAgICAgICBpZiAoc3RhdGUpIHtcbiAgICAgICAgICAvLyBMb2FkIHRoZSBhcmM0IHN0YXRlIGZyb20gdGhlIGdpdmVuIHN0YXRlIGlmIGl0IGhhcyBhbiBTIGFycmF5LlxuICAgICAgICAgIGlmIChzdGF0ZS5TKSB7IGNvcHkoc3RhdGUsIGFyYzQpOyB9XG4gICAgICAgICAgLy8gT25seSBwcm92aWRlIHRoZSAuc3RhdGUgbWV0aG9kIGlmIHJlcXVlc3RlZCB2aWEgb3B0aW9ucy5zdGF0ZS5cbiAgICAgICAgICBwcm5nLnN0YXRlID0gZnVuY3Rpb24oKSB7IHJldHVybiBjb3B5KGFyYzQsIHt9KTsgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgY2FsbGVkIGFzIGEgbWV0aG9kIG9mIE1hdGggKE1hdGguc2VlZHJhbmRvbSgpKSwgbXV0YXRlXG4gICAgICAgIC8vIE1hdGgucmFuZG9tIGJlY2F1c2UgdGhhdCBpcyBob3cgc2VlZHJhbmRvbS5qcyBoYXMgd29ya2VkIHNpbmNlIHYxLjAuXG4gICAgICAgIGlmIChpc19tYXRoX2NhbGwpIHsgbWF0aFtybmduYW1lXSA9IHBybmc7IHJldHVybiBzZWVkOyB9XG5cbiAgICAgICAgLy8gT3RoZXJ3aXNlLCBpdCBpcyBhIG5ld2VyIGNhbGxpbmcgY29udmVudGlvbiwgc28gcmV0dXJuIHRoZVxuICAgICAgICAvLyBwcm5nIGRpcmVjdGx5LlxuICAgICAgICBlbHNlIHJldHVybiBwcm5nO1xuICAgICAgfSkoXG4gIHBybmcsXG4gIHNob3J0c2VlZCxcbiAgJ2dsb2JhbCcgaW4gb3B0aW9ucyA/IG9wdGlvbnMuZ2xvYmFsIDogKHRoaXMgPT0gbWF0aCksXG4gIG9wdGlvbnMuc3RhdGUpO1xufVxubWF0aFsnc2VlZCcgKyBybmduYW1lXSA9IHNlZWRyYW5kb207XG5cbi8vXG4vLyBBUkM0XG4vL1xuLy8gQW4gQVJDNCBpbXBsZW1lbnRhdGlvbi4gIFRoZSBjb25zdHJ1Y3RvciB0YWtlcyBhIGtleSBpbiB0aGUgZm9ybSBvZlxuLy8gYW4gYXJyYXkgb2YgYXQgbW9zdCAod2lkdGgpIGludGVnZXJzIHRoYXQgc2hvdWxkIGJlIDAgPD0geCA8ICh3aWR0aCkuXG4vL1xuLy8gVGhlIGcoY291bnQpIG1ldGhvZCByZXR1cm5zIGEgcHNldWRvcmFuZG9tIGludGVnZXIgdGhhdCBjb25jYXRlbmF0ZXNcbi8vIHRoZSBuZXh0IChjb3VudCkgb3V0cHV0cyBmcm9tIEFSQzQuICBJdHMgcmV0dXJuIHZhbHVlIGlzIGEgbnVtYmVyIHhcbi8vIHRoYXQgaXMgaW4gdGhlIHJhbmdlIDAgPD0geCA8ICh3aWR0aCBeIGNvdW50KS5cbi8vXG5mdW5jdGlvbiBBUkM0KGtleSkge1xuICB2YXIgdCwga2V5bGVuID0ga2V5Lmxlbmd0aCxcbiAgICAgIG1lID0gdGhpcywgaSA9IDAsIGogPSBtZS5pID0gbWUuaiA9IDAsIHMgPSBtZS5TID0gW107XG5cbiAgLy8gVGhlIGVtcHR5IGtleSBbXSBpcyB0cmVhdGVkIGFzIFswXS5cbiAgaWYgKCFrZXlsZW4pIHsga2V5ID0gW2tleWxlbisrXTsgfVxuXG4gIC8vIFNldCB1cCBTIHVzaW5nIHRoZSBzdGFuZGFyZCBrZXkgc2NoZWR1bGluZyBhbGdvcml0aG0uXG4gIHdoaWxlIChpIDwgd2lkdGgpIHtcbiAgICBzW2ldID0gaSsrO1xuICB9XG4gIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgaSsrKSB7XG4gICAgc1tpXSA9IHNbaiA9IG1hc2sgJiAoaiArIGtleVtpICUga2V5bGVuXSArICh0ID0gc1tpXSkpXTtcbiAgICBzW2pdID0gdDtcbiAgfVxuXG4gIC8vIFRoZSBcImdcIiBtZXRob2QgcmV0dXJucyB0aGUgbmV4dCAoY291bnQpIG91dHB1dHMgYXMgb25lIG51bWJlci5cbiAgKG1lLmcgPSBmdW5jdGlvbihjb3VudCkge1xuICAgIC8vIFVzaW5nIGluc3RhbmNlIG1lbWJlcnMgaW5zdGVhZCBvZiBjbG9zdXJlIHN0YXRlIG5lYXJseSBkb3VibGVzIHNwZWVkLlxuICAgIHZhciB0LCByID0gMCxcbiAgICAgICAgaSA9IG1lLmksIGogPSBtZS5qLCBzID0gbWUuUztcbiAgICB3aGlsZSAoY291bnQtLSkge1xuICAgICAgdCA9IHNbaSA9IG1hc2sgJiAoaSArIDEpXTtcbiAgICAgIHIgPSByICogd2lkdGggKyBzW21hc2sgJiAoKHNbaV0gPSBzW2ogPSBtYXNrICYgKGogKyB0KV0pICsgKHNbal0gPSB0KSldO1xuICAgIH1cbiAgICBtZS5pID0gaTsgbWUuaiA9IGo7XG4gICAgcmV0dXJuIHI7XG4gICAgLy8gRm9yIHJvYnVzdCB1bnByZWRpY3RhYmlsaXR5LCB0aGUgZnVuY3Rpb24gY2FsbCBiZWxvdyBhdXRvbWF0aWNhbGx5XG4gICAgLy8gZGlzY2FyZHMgYW4gaW5pdGlhbCBiYXRjaCBvZiB2YWx1ZXMuICBUaGlzIGlzIGNhbGxlZCBSQzQtZHJvcFsyNTZdLlxuICAgIC8vIFNlZSBodHRwOi8vZ29vZ2xlLmNvbS9zZWFyY2g/cT1yc2ErZmx1aHJlcityZXNwb25zZSZidG5JXG4gIH0pKHdpZHRoKTtcbn1cblxuLy9cbi8vIGNvcHkoKVxuLy8gQ29waWVzIGludGVybmFsIHN0YXRlIG9mIEFSQzQgdG8gb3IgZnJvbSBhIHBsYWluIG9iamVjdC5cbi8vXG5mdW5jdGlvbiBjb3B5KGYsIHQpIHtcbiAgdC5pID0gZi5pO1xuICB0LmogPSBmLmo7XG4gIHQuUyA9IGYuUy5zbGljZSgpO1xuICByZXR1cm4gdDtcbn07XG5cbi8vXG4vLyBmbGF0dGVuKClcbi8vIENvbnZlcnRzIGFuIG9iamVjdCB0cmVlIHRvIG5lc3RlZCBhcnJheXMgb2Ygc3RyaW5ncy5cbi8vXG5mdW5jdGlvbiBmbGF0dGVuKG9iaiwgZGVwdGgpIHtcbiAgdmFyIHJlc3VsdCA9IFtdLCB0eXAgPSAodHlwZW9mIG9iaiksIHByb3A7XG4gIGlmIChkZXB0aCAmJiB0eXAgPT0gJ29iamVjdCcpIHtcbiAgICBmb3IgKHByb3AgaW4gb2JqKSB7XG4gICAgICB0cnkgeyByZXN1bHQucHVzaChmbGF0dGVuKG9ialtwcm9wXSwgZGVwdGggLSAxKSk7IH0gY2F0Y2ggKGUpIHt9XG4gICAgfVxuICB9XG4gIHJldHVybiAocmVzdWx0Lmxlbmd0aCA/IHJlc3VsdCA6IHR5cCA9PSAnc3RyaW5nJyA/IG9iaiA6IG9iaiArICdcXDAnKTtcbn1cblxuLy9cbi8vIG1peGtleSgpXG4vLyBNaXhlcyBhIHN0cmluZyBzZWVkIGludG8gYSBrZXkgdGhhdCBpcyBhbiBhcnJheSBvZiBpbnRlZ2VycywgYW5kXG4vLyByZXR1cm5zIGEgc2hvcnRlbmVkIHN0cmluZyBzZWVkIHRoYXQgaXMgZXF1aXZhbGVudCB0byB0aGUgcmVzdWx0IGtleS5cbi8vXG5mdW5jdGlvbiBtaXhrZXkoc2VlZCwga2V5KSB7XG4gIHZhciBzdHJpbmdzZWVkID0gc2VlZCArICcnLCBzbWVhciwgaiA9IDA7XG4gIHdoaWxlIChqIDwgc3RyaW5nc2VlZC5sZW5ndGgpIHtcbiAgICBrZXlbbWFzayAmIGpdID1cbiAgICAgIG1hc2sgJiAoKHNtZWFyIF49IGtleVttYXNrICYgal0gKiAxOSkgKyBzdHJpbmdzZWVkLmNoYXJDb2RlQXQoaisrKSk7XG4gIH1cbiAgcmV0dXJuIHRvc3RyaW5nKGtleSk7XG59XG5cbi8vXG4vLyBhdXRvc2VlZCgpXG4vLyBSZXR1cm5zIGFuIG9iamVjdCBmb3IgYXV0b3NlZWRpbmcsIHVzaW5nIHdpbmRvdy5jcnlwdG8gYW5kIE5vZGUgY3J5cHRvXG4vLyBtb2R1bGUgaWYgYXZhaWxhYmxlLlxuLy9cbmZ1bmN0aW9uIGF1dG9zZWVkKCkge1xuICB0cnkge1xuICAgIHZhciBvdXQ7XG4gICAgaWYgKG5vZGVjcnlwdG8gJiYgKG91dCA9IG5vZGVjcnlwdG8ucmFuZG9tQnl0ZXMpKSB7XG4gICAgICAvLyBUaGUgdXNlIG9mICdvdXQnIHRvIHJlbWVtYmVyIHJhbmRvbUJ5dGVzIG1ha2VzIHRpZ2h0IG1pbmlmaWVkIGNvZGUuXG4gICAgICBvdXQgPSBvdXQod2lkdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQgPSBuZXcgVWludDhBcnJheSh3aWR0aCk7XG4gICAgICAoZ2xvYmFsLmNyeXB0byB8fCBnbG9iYWwubXNDcnlwdG8pLmdldFJhbmRvbVZhbHVlcyhvdXQpO1xuICAgIH1cbiAgICByZXR1cm4gdG9zdHJpbmcob3V0KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHZhciBicm93c2VyID0gZ2xvYmFsLm5hdmlnYXRvcixcbiAgICAgICAgcGx1Z2lucyA9IGJyb3dzZXIgJiYgYnJvd3Nlci5wbHVnaW5zO1xuICAgIHJldHVybiBbK25ldyBEYXRlLCBnbG9iYWwsIHBsdWdpbnMsIGdsb2JhbC5zY3JlZW4sIHRvc3RyaW5nKHBvb2wpXTtcbiAgfVxufVxuXG4vL1xuLy8gdG9zdHJpbmcoKVxuLy8gQ29udmVydHMgYW4gYXJyYXkgb2YgY2hhcmNvZGVzIHRvIGEgc3RyaW5nXG4vL1xuZnVuY3Rpb24gdG9zdHJpbmcoYSkge1xuICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseSgwLCBhKTtcbn1cblxuLy9cbi8vIFdoZW4gc2VlZHJhbmRvbS5qcyBpcyBsb2FkZWQsIHdlIGltbWVkaWF0ZWx5IG1peCBhIGZldyBiaXRzXG4vLyBmcm9tIHRoZSBidWlsdC1pbiBSTkcgaW50byB0aGUgZW50cm9weSBwb29sLiAgQmVjYXVzZSB3ZSBkb1xuLy8gbm90IHdhbnQgdG8gaW50ZXJmZXJlIHdpdGggZGV0ZXJtaW5pc3RpYyBQUk5HIHN0YXRlIGxhdGVyLFxuLy8gc2VlZHJhbmRvbSB3aWxsIG5vdCBjYWxsIG1hdGgucmFuZG9tIG9uIGl0cyBvd24gYWdhaW4gYWZ0ZXJcbi8vIGluaXRpYWxpemF0aW9uLlxuLy9cbm1peGtleShtYXRoLnJhbmRvbSgpLCBwb29sKTtcblxuLy9cbi8vIE5vZGVqcyBhbmQgQU1EIHN1cHBvcnQ6IGV4cG9ydCB0aGUgaW1wbGVtZW50YXRpb24gYXMgYSBtb2R1bGUgdXNpbmdcbi8vIGVpdGhlciBjb252ZW50aW9uLlxuLy9cbmlmICgodHlwZW9mIG1vZHVsZSkgPT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBzZWVkcmFuZG9tO1xuICAvLyBXaGVuIGluIG5vZGUuanMsIHRyeSB1c2luZyBjcnlwdG8gcGFja2FnZSBmb3IgYXV0b3NlZWRpbmcuXG4gIHRyeSB7XG4gICAgbm9kZWNyeXB0byA9IHJlcXVpcmUoJ2NyeXB0bycpO1xuICB9IGNhdGNoIChleCkge31cbn0gZWxzZSBpZiAoKHR5cGVvZiBkZWZpbmUpID09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuICBkZWZpbmUoZnVuY3Rpb24oKSB7IHJldHVybiBzZWVkcmFuZG9tOyB9KTtcbn1cblxuLy8gRW5kIGFub255bW91cyBzY29wZSwgYW5kIHBhc3MgaW5pdGlhbCB2YWx1ZXMuXG59KShcbiAgW10sICAgICAvLyBwb29sOiBlbnRyb3B5IHBvb2wgc3RhcnRzIGVtcHR5XG4gIE1hdGggICAgLy8gbWF0aDogcGFja2FnZSBjb250YWluaW5nIHJhbmRvbSwgcG93LCBhbmQgc2VlZHJhbmRvbVxuKTtcbiIsIihmdW5jdGlvbiAoZ2xvYmFsLCB1bmRlZmluZWQpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIGlmIChnbG9iYWwuc2V0SW1tZWRpYXRlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgbmV4dEhhbmRsZSA9IDE7IC8vIFNwZWMgc2F5cyBncmVhdGVyIHRoYW4gemVyb1xuICAgIHZhciB0YXNrc0J5SGFuZGxlID0ge307XG4gICAgdmFyIGN1cnJlbnRseVJ1bm5pbmdBVGFzayA9IGZhbHNlO1xuICAgIHZhciBkb2MgPSBnbG9iYWwuZG9jdW1lbnQ7XG4gICAgdmFyIHJlZ2lzdGVySW1tZWRpYXRlO1xuXG4gICAgZnVuY3Rpb24gc2V0SW1tZWRpYXRlKGNhbGxiYWNrKSB7XG4gICAgICAvLyBDYWxsYmFjayBjYW4gZWl0aGVyIGJlIGEgZnVuY3Rpb24gb3IgYSBzdHJpbmdcbiAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBjYWxsYmFjayA9IG5ldyBGdW5jdGlvbihcIlwiICsgY2FsbGJhY2spO1xuICAgICAgfVxuICAgICAgLy8gQ29weSBmdW5jdGlvbiBhcmd1bWVudHNcbiAgICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGFyZ3NbaV0gPSBhcmd1bWVudHNbaSArIDFdO1xuICAgICAgfVxuICAgICAgLy8gU3RvcmUgYW5kIHJlZ2lzdGVyIHRoZSB0YXNrXG4gICAgICB2YXIgdGFzayA9IHsgY2FsbGJhY2s6IGNhbGxiYWNrLCBhcmdzOiBhcmdzIH07XG4gICAgICB0YXNrc0J5SGFuZGxlW25leHRIYW5kbGVdID0gdGFzaztcbiAgICAgIHJlZ2lzdGVySW1tZWRpYXRlKG5leHRIYW5kbGUpO1xuICAgICAgcmV0dXJuIG5leHRIYW5kbGUrKztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjbGVhckltbWVkaWF0ZShoYW5kbGUpIHtcbiAgICAgICAgZGVsZXRlIHRhc2tzQnlIYW5kbGVbaGFuZGxlXTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBydW4odGFzaykge1xuICAgICAgICB2YXIgY2FsbGJhY2sgPSB0YXNrLmNhbGxiYWNrO1xuICAgICAgICB2YXIgYXJncyA9IHRhc2suYXJncztcbiAgICAgICAgc3dpdGNoIChhcmdzLmxlbmd0aCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIGNhbGxiYWNrKGFyZ3NbMF0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIGNhbGxiYWNrKGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgIGNhbGxiYWNrKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBjYWxsYmFjay5hcHBseSh1bmRlZmluZWQsIGFyZ3MpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBydW5JZlByZXNlbnQoaGFuZGxlKSB7XG4gICAgICAgIC8vIEZyb20gdGhlIHNwZWM6IFwiV2FpdCB1bnRpbCBhbnkgaW52b2NhdGlvbnMgb2YgdGhpcyBhbGdvcml0aG0gc3RhcnRlZCBiZWZvcmUgdGhpcyBvbmUgaGF2ZSBjb21wbGV0ZWQuXCJcbiAgICAgICAgLy8gU28gaWYgd2UncmUgY3VycmVudGx5IHJ1bm5pbmcgYSB0YXNrLCB3ZSdsbCBuZWVkIHRvIGRlbGF5IHRoaXMgaW52b2NhdGlvbi5cbiAgICAgICAgaWYgKGN1cnJlbnRseVJ1bm5pbmdBVGFzaykge1xuICAgICAgICAgICAgLy8gRGVsYXkgYnkgZG9pbmcgYSBzZXRUaW1lb3V0LiBzZXRJbW1lZGlhdGUgd2FzIHRyaWVkIGluc3RlYWQsIGJ1dCBpbiBGaXJlZm94IDcgaXQgZ2VuZXJhdGVkIGFcbiAgICAgICAgICAgIC8vIFwidG9vIG11Y2ggcmVjdXJzaW9uXCIgZXJyb3IuXG4gICAgICAgICAgICBzZXRUaW1lb3V0KHJ1bklmUHJlc2VudCwgMCwgaGFuZGxlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciB0YXNrID0gdGFza3NCeUhhbmRsZVtoYW5kbGVdO1xuICAgICAgICAgICAgaWYgKHRhc2spIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50bHlSdW5uaW5nQVRhc2sgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJ1bih0YXNrKTtcbiAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICBjbGVhckltbWVkaWF0ZShoYW5kbGUpO1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50bHlSdW5uaW5nQVRhc2sgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnN0YWxsTmV4dFRpY2tJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgcmVnaXN0ZXJJbW1lZGlhdGUgPSBmdW5jdGlvbihoYW5kbGUpIHtcbiAgICAgICAgICAgIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gKCkgeyBydW5JZlByZXNlbnQoaGFuZGxlKTsgfSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2FuVXNlUG9zdE1lc3NhZ2UoKSB7XG4gICAgICAgIC8vIFRoZSB0ZXN0IGFnYWluc3QgYGltcG9ydFNjcmlwdHNgIHByZXZlbnRzIHRoaXMgaW1wbGVtZW50YXRpb24gZnJvbSBiZWluZyBpbnN0YWxsZWQgaW5zaWRlIGEgd2ViIHdvcmtlcixcbiAgICAgICAgLy8gd2hlcmUgYGdsb2JhbC5wb3N0TWVzc2FnZWAgbWVhbnMgc29tZXRoaW5nIGNvbXBsZXRlbHkgZGlmZmVyZW50IGFuZCBjYW4ndCBiZSB1c2VkIGZvciB0aGlzIHB1cnBvc2UuXG4gICAgICAgIGlmIChnbG9iYWwucG9zdE1lc3NhZ2UgJiYgIWdsb2JhbC5pbXBvcnRTY3JpcHRzKSB7XG4gICAgICAgICAgICB2YXIgcG9zdE1lc3NhZ2VJc0FzeW5jaHJvbm91cyA9IHRydWU7XG4gICAgICAgICAgICB2YXIgb2xkT25NZXNzYWdlID0gZ2xvYmFsLm9ubWVzc2FnZTtcbiAgICAgICAgICAgIGdsb2JhbC5vbm1lc3NhZ2UgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZUlzQXN5bmNocm9ub3VzID0gZmFsc2U7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZ2xvYmFsLnBvc3RNZXNzYWdlKFwiXCIsIFwiKlwiKTtcbiAgICAgICAgICAgIGdsb2JhbC5vbm1lc3NhZ2UgPSBvbGRPbk1lc3NhZ2U7XG4gICAgICAgICAgICByZXR1cm4gcG9zdE1lc3NhZ2VJc0FzeW5jaHJvbm91cztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3RhbGxQb3N0TWVzc2FnZUltcGxlbWVudGF0aW9uKCkge1xuICAgICAgICAvLyBJbnN0YWxscyBhbiBldmVudCBoYW5kbGVyIG9uIGBnbG9iYWxgIGZvciB0aGUgYG1lc3NhZ2VgIGV2ZW50OiBzZWVcbiAgICAgICAgLy8gKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9ET00vd2luZG93LnBvc3RNZXNzYWdlXG4gICAgICAgIC8vICogaHR0cDovL3d3dy53aGF0d2cub3JnL3NwZWNzL3dlYi1hcHBzL2N1cnJlbnQtd29yay9tdWx0aXBhZ2UvY29tbXMuaHRtbCNjcm9zc0RvY3VtZW50TWVzc2FnZXNcblxuICAgICAgICB2YXIgbWVzc2FnZVByZWZpeCA9IFwic2V0SW1tZWRpYXRlJFwiICsgTWF0aC5yYW5kb20oKSArIFwiJFwiO1xuICAgICAgICB2YXIgb25HbG9iYWxNZXNzYWdlID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIGlmIChldmVudC5zb3VyY2UgPT09IGdsb2JhbCAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiBldmVudC5kYXRhID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgICAgICAgICAgZXZlbnQuZGF0YS5pbmRleE9mKG1lc3NhZ2VQcmVmaXgpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcnVuSWZQcmVzZW50KCtldmVudC5kYXRhLnNsaWNlKG1lc3NhZ2VQcmVmaXgubGVuZ3RoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKGdsb2JhbC5hZGRFdmVudExpc3RlbmVyKSB7XG4gICAgICAgICAgICBnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgb25HbG9iYWxNZXNzYWdlLCBmYWxzZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBnbG9iYWwuYXR0YWNoRXZlbnQoXCJvbm1lc3NhZ2VcIiwgb25HbG9iYWxNZXNzYWdlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlZ2lzdGVySW1tZWRpYXRlID0gZnVuY3Rpb24oaGFuZGxlKSB7XG4gICAgICAgICAgICBnbG9iYWwucG9zdE1lc3NhZ2UobWVzc2FnZVByZWZpeCArIGhhbmRsZSwgXCIqXCIpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3RhbGxNZXNzYWdlQ2hhbm5lbEltcGxlbWVudGF0aW9uKCkge1xuICAgICAgICB2YXIgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpO1xuICAgICAgICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICB2YXIgaGFuZGxlID0gZXZlbnQuZGF0YTtcbiAgICAgICAgICAgIHJ1bklmUHJlc2VudChoYW5kbGUpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHJlZ2lzdGVySW1tZWRpYXRlID0gZnVuY3Rpb24oaGFuZGxlKSB7XG4gICAgICAgICAgICBjaGFubmVsLnBvcnQyLnBvc3RNZXNzYWdlKGhhbmRsZSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5zdGFsbFJlYWR5U3RhdGVDaGFuZ2VJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgdmFyIGh0bWwgPSBkb2MuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgICByZWdpc3RlckltbWVkaWF0ZSA9IGZ1bmN0aW9uKGhhbmRsZSkge1xuICAgICAgICAgICAgLy8gQ3JlYXRlIGEgPHNjcmlwdD4gZWxlbWVudDsgaXRzIHJlYWR5c3RhdGVjaGFuZ2UgZXZlbnQgd2lsbCBiZSBmaXJlZCBhc3luY2hyb25vdXNseSBvbmNlIGl0IGlzIGluc2VydGVkXG4gICAgICAgICAgICAvLyBpbnRvIHRoZSBkb2N1bWVudC4gRG8gc28sIHRodXMgcXVldWluZyB1cCB0aGUgdGFzay4gUmVtZW1iZXIgdG8gY2xlYW4gdXAgb25jZSBpdCdzIGJlZW4gY2FsbGVkLlxuICAgICAgICAgICAgdmFyIHNjcmlwdCA9IGRvYy5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpO1xuICAgICAgICAgICAgc2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBydW5JZlByZXNlbnQoaGFuZGxlKTtcbiAgICAgICAgICAgICAgICBzY3JpcHQub25yZWFkeXN0YXRlY2hhbmdlID0gbnVsbDtcbiAgICAgICAgICAgICAgICBodG1sLnJlbW92ZUNoaWxkKHNjcmlwdCk7XG4gICAgICAgICAgICAgICAgc2NyaXB0ID0gbnVsbDtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBodG1sLmFwcGVuZENoaWxkKHNjcmlwdCk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5zdGFsbFNldFRpbWVvdXRJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgcmVnaXN0ZXJJbW1lZGlhdGUgPSBmdW5jdGlvbihoYW5kbGUpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQocnVuSWZQcmVzZW50LCAwLCBoYW5kbGUpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIElmIHN1cHBvcnRlZCwgd2Ugc2hvdWxkIGF0dGFjaCB0byB0aGUgcHJvdG90eXBlIG9mIGdsb2JhbCwgc2luY2UgdGhhdCBpcyB3aGVyZSBzZXRUaW1lb3V0IGV0IGFsLiBsaXZlLlxuICAgIHZhciBhdHRhY2hUbyA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoZ2xvYmFsKTtcbiAgICBhdHRhY2hUbyA9IGF0dGFjaFRvICYmIGF0dGFjaFRvLnNldFRpbWVvdXQgPyBhdHRhY2hUbyA6IGdsb2JhbDtcblxuICAgIC8vIERvbid0IGdldCBmb29sZWQgYnkgZS5nLiBicm93c2VyaWZ5IGVudmlyb25tZW50cy5cbiAgICBpZiAoe30udG9TdHJpbmcuY2FsbChnbG9iYWwucHJvY2VzcykgPT09IFwiW29iamVjdCBwcm9jZXNzXVwiKSB7XG4gICAgICAgIC8vIEZvciBOb2RlLmpzIGJlZm9yZSAwLjlcbiAgICAgICAgaW5zdGFsbE5leHRUaWNrSW1wbGVtZW50YXRpb24oKTtcblxuICAgIH0gZWxzZSBpZiAoY2FuVXNlUG9zdE1lc3NhZ2UoKSkge1xuICAgICAgICAvLyBGb3Igbm9uLUlFMTAgbW9kZXJuIGJyb3dzZXJzXG4gICAgICAgIGluc3RhbGxQb3N0TWVzc2FnZUltcGxlbWVudGF0aW9uKCk7XG5cbiAgICB9IGVsc2UgaWYgKGdsb2JhbC5NZXNzYWdlQ2hhbm5lbCkge1xuICAgICAgICAvLyBGb3Igd2ViIHdvcmtlcnMsIHdoZXJlIHN1cHBvcnRlZFxuICAgICAgICBpbnN0YWxsTWVzc2FnZUNoYW5uZWxJbXBsZW1lbnRhdGlvbigpO1xuXG4gICAgfSBlbHNlIGlmIChkb2MgJiYgXCJvbnJlYWR5c3RhdGVjaGFuZ2VcIiBpbiBkb2MuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKSkge1xuICAgICAgICAvLyBGb3IgSUUgNuKAkzhcbiAgICAgICAgaW5zdGFsbFJlYWR5U3RhdGVDaGFuZ2VJbXBsZW1lbnRhdGlvbigpO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRm9yIG9sZGVyIGJyb3dzZXJzXG4gICAgICAgIGluc3RhbGxTZXRUaW1lb3V0SW1wbGVtZW50YXRpb24oKTtcbiAgICB9XG5cbiAgICBhdHRhY2hUby5zZXRJbW1lZGlhdGUgPSBzZXRJbW1lZGlhdGU7XG4gICAgYXR0YWNoVG8uY2xlYXJJbW1lZGlhdGUgPSBjbGVhckltbWVkaWF0ZTtcbn0odHlwZW9mIHNlbGYgPT09IFwidW5kZWZpbmVkXCIgPyB0eXBlb2YgZ2xvYmFsID09PSBcInVuZGVmaW5lZFwiID8gdGhpcyA6IGdsb2JhbCA6IHNlbGYpKTtcbiIsInZhciBzY29wZSA9ICh0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiICYmIGdsb2JhbCkgfHxcbiAgICAgICAgICAgICh0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiAmJiBzZWxmKSB8fFxuICAgICAgICAgICAgd2luZG93O1xudmFyIGFwcGx5ID0gRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5O1xuXG4vLyBET00gQVBJcywgZm9yIGNvbXBsZXRlbmVzc1xuXG5leHBvcnRzLnNldFRpbWVvdXQgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBUaW1lb3V0KGFwcGx5LmNhbGwoc2V0VGltZW91dCwgc2NvcGUsIGFyZ3VtZW50cyksIGNsZWFyVGltZW91dCk7XG59O1xuZXhwb3J0cy5zZXRJbnRlcnZhbCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFRpbWVvdXQoYXBwbHkuY2FsbChzZXRJbnRlcnZhbCwgc2NvcGUsIGFyZ3VtZW50cyksIGNsZWFySW50ZXJ2YWwpO1xufTtcbmV4cG9ydHMuY2xlYXJUaW1lb3V0ID1cbmV4cG9ydHMuY2xlYXJJbnRlcnZhbCA9IGZ1bmN0aW9uKHRpbWVvdXQpIHtcbiAgaWYgKHRpbWVvdXQpIHtcbiAgICB0aW1lb3V0LmNsb3NlKCk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIFRpbWVvdXQoaWQsIGNsZWFyRm4pIHtcbiAgdGhpcy5faWQgPSBpZDtcbiAgdGhpcy5fY2xlYXJGbiA9IGNsZWFyRm47XG59XG5UaW1lb3V0LnByb3RvdHlwZS51bnJlZiA9IFRpbWVvdXQucHJvdG90eXBlLnJlZiA9IGZ1bmN0aW9uKCkge307XG5UaW1lb3V0LnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLl9jbGVhckZuLmNhbGwoc2NvcGUsIHRoaXMuX2lkKTtcbn07XG5cbi8vIERvZXMgbm90IHN0YXJ0IHRoZSB0aW1lLCBqdXN0IHNldHMgdXAgdGhlIG1lbWJlcnMgbmVlZGVkLlxuZXhwb3J0cy5lbnJvbGwgPSBmdW5jdGlvbihpdGVtLCBtc2Vjcykge1xuICBjbGVhclRpbWVvdXQoaXRlbS5faWRsZVRpbWVvdXRJZCk7XG4gIGl0ZW0uX2lkbGVUaW1lb3V0ID0gbXNlY3M7XG59O1xuXG5leHBvcnRzLnVuZW5yb2xsID0gZnVuY3Rpb24oaXRlbSkge1xuICBjbGVhclRpbWVvdXQoaXRlbS5faWRsZVRpbWVvdXRJZCk7XG4gIGl0ZW0uX2lkbGVUaW1lb3V0ID0gLTE7XG59O1xuXG5leHBvcnRzLl91bnJlZkFjdGl2ZSA9IGV4cG9ydHMuYWN0aXZlID0gZnVuY3Rpb24oaXRlbSkge1xuICBjbGVhclRpbWVvdXQoaXRlbS5faWRsZVRpbWVvdXRJZCk7XG5cbiAgdmFyIG1zZWNzID0gaXRlbS5faWRsZVRpbWVvdXQ7XG4gIGlmIChtc2VjcyA+PSAwKSB7XG4gICAgaXRlbS5faWRsZVRpbWVvdXRJZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gb25UaW1lb3V0KCkge1xuICAgICAgaWYgKGl0ZW0uX29uVGltZW91dClcbiAgICAgICAgaXRlbS5fb25UaW1lb3V0KCk7XG4gICAgfSwgbXNlY3MpO1xuICB9XG59O1xuXG4vLyBzZXRpbW1lZGlhdGUgYXR0YWNoZXMgaXRzZWxmIHRvIHRoZSBnbG9iYWwgb2JqZWN0XG5yZXF1aXJlKFwic2V0aW1tZWRpYXRlXCIpO1xuLy8gT24gc29tZSBleG90aWMgZW52aXJvbm1lbnRzLCBpdCdzIG5vdCBjbGVhciB3aGljaCBvYmplY3QgYHNldGltbWVkaWF0ZWAgd2FzXG4vLyBhYmxlIHRvIGluc3RhbGwgb250by4gIFNlYXJjaCBlYWNoIHBvc3NpYmlsaXR5IGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZVxuLy8gYHNldGltbWVkaWF0ZWAgbGlicmFyeS5cbmV4cG9ydHMuc2V0SW1tZWRpYXRlID0gKHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiICYmIHNlbGYuc2V0SW1tZWRpYXRlKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAodHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBnbG9iYWwuc2V0SW1tZWRpYXRlKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAodGhpcyAmJiB0aGlzLnNldEltbWVkaWF0ZSk7XG5leHBvcnRzLmNsZWFySW1tZWRpYXRlID0gKHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiICYmIHNlbGYuY2xlYXJJbW1lZGlhdGUpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgKHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgJiYgZ2xvYmFsLmNsZWFySW1tZWRpYXRlKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzICYmIHRoaXMuY2xlYXJJbW1lZGlhdGUpO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHtcblx0dGhyb3cgbmV3IEVycm9yKFwiZGVmaW5lIGNhbm5vdCBiZSB1c2VkIGluZGlyZWN0XCIpO1xufTtcbiIsIi8qIGdsb2JhbHMgX193ZWJwYWNrX2FtZF9vcHRpb25zX18gKi9cbm1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX2FtZF9vcHRpb25zX187XG4iLCJ2YXIgZztcblxuLy8gVGhpcyB3b3JrcyBpbiBub24tc3RyaWN0IG1vZGVcbmcgPSAoZnVuY3Rpb24oKSB7XG5cdHJldHVybiB0aGlzO1xufSkoKTtcblxudHJ5IHtcblx0Ly8gVGhpcyB3b3JrcyBpZiBldmFsIGlzIGFsbG93ZWQgKHNlZSBDU1ApXG5cdGcgPSBnIHx8IG5ldyBGdW5jdGlvbihcInJldHVybiB0aGlzXCIpKCk7XG59IGNhdGNoIChlKSB7XG5cdC8vIFRoaXMgd29ya3MgaWYgdGhlIHdpbmRvdyByZWZlcmVuY2UgaXMgYXZhaWxhYmxlXG5cdGlmICh0eXBlb2Ygd2luZG93ID09PSBcIm9iamVjdFwiKSBnID0gd2luZG93O1xufVxuXG4vLyBnIGNhbiBzdGlsbCBiZSB1bmRlZmluZWQsIGJ1dCBub3RoaW5nIHRvIGRvIGFib3V0IGl0Li4uXG4vLyBXZSByZXR1cm4gdW5kZWZpbmVkLCBpbnN0ZWFkIG9mIG5vdGhpbmcgaGVyZSwgc28gaXQnc1xuLy8gZWFzaWVyIHRvIGhhbmRsZSB0aGlzIGNhc2UuIGlmKCFnbG9iYWwpIHsgLi4ufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGc7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuXHRpZiAoIW1vZHVsZS53ZWJwYWNrUG9seWZpbGwpIHtcblx0XHRtb2R1bGUuZGVwcmVjYXRlID0gZnVuY3Rpb24oKSB7fTtcblx0XHRtb2R1bGUucGF0aHMgPSBbXTtcblx0XHQvLyBtb2R1bGUucGFyZW50ID0gdW5kZWZpbmVkIGJ5IGRlZmF1bHRcblx0XHRpZiAoIW1vZHVsZS5jaGlsZHJlbikgbW9kdWxlLmNoaWxkcmVuID0gW107XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZSwgXCJsb2FkZWRcIiwge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdGdldDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiBtb2R1bGUubDtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCBcImlkXCIsIHtcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gbW9kdWxlLmk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0bW9kdWxlLndlYnBhY2tQb2x5ZmlsbCA9IDE7XG5cdH1cblx0cmV0dXJuIG1vZHVsZTtcbn07XG4iLCJpbXBvcnQge01MfSBmcm9tICcuL21sJztcbmltcG9ydCB7TUxDb250ZXh0fSBmcm9tICcuL25uL2NvbnRleHQnO1xuaW1wb3J0IHtNTEdyYXBofSBmcm9tICcuL25uL2dyYXBoJztcbmltcG9ydCB7TUxHcmFwaEJ1aWxkZXJ9IGZyb20gJy4vbm4vZ3JhcGhfYnVpbGRlcic7XG5pbXBvcnQge01MT3BlcmFuZH0gZnJvbSAnLi9ubi9vcGVyYW5kJztcblxuaWYgKG5hdmlnYXRvci5tbCA9PSBudWxsKSB7XG4gIG5hdmlnYXRvci5tbCA9IG5ldyBNTCgpO1xufVxuXG5pZiAoZ2xvYmFsLk1MID09IG51bGwpIHtcbiAgZ2xvYmFsLk1MID0gTUw7XG59XG5cbmlmIChnbG9iYWwuTUxDb250ZXh0ID09IG51bGwpIHtcbiAgZ2xvYmFsLk1MQ29udGV4dCA9IE1MQ29udGV4dDtcbn1cblxuaWYgKGdsb2JhbC5NTEdyYXBoQnVpbGRlciA9PSBudWxsKSB7XG4gIGdsb2JhbC5NTEdyYXBoQnVpbGRlciA9IE1MR3JhcGhCdWlsZGVyO1xufVxuXG5pZiAoZ2xvYmFsLk1MR3JhcGggPT0gbnVsbCkge1xuICBnbG9iYWwuTUxHcmFwaCA9IE1MR3JhcGg7XG59XG5cbmlmIChnbG9iYWwuTUxPcGVyYW5kID09IG51bGwpIHtcbiAgZ2xvYmFsLk1MT3BlcmFuZCA9IE1MT3BlcmFuZDtcbn1cbiIsImltcG9ydCB7TUxDb250ZXh0LCBNTENvbnRleHRPcHRpb25zfSBmcm9tICcuL25uL2NvbnRleHQnO1xuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI21sKVxuICovXG5leHBvcnQgY2xhc3MgTUwge1xuICAvKiogQGlnbm9yZSAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBjcmVhdGVDb250ZXh0KG9wdGlvbnM6IE1MQ29udGV4dE9wdGlvbnMgPSB7fSk6IE1MQ29udGV4dCB7XG4gICAgcmV0dXJuIG5ldyBNTENvbnRleHQob3B0aW9ucyk7XG4gIH1cbn1cbiIsImltcG9ydCAnQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsJztcbmltcG9ydCAnQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdSc7XG5pbXBvcnQgKiBhcyB3YXNtIGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtJztcblxuaW1wb3J0ICogYXMgdGYgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi91dGlscyc7XG5cbi8qKlxuICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZW51bWRlZi1tbHBvd2VycHJlZmVyZW5jZSlcbiAqL1xuZXhwb3J0IGVudW0gTUxQb3dlclByZWZlcmVuY2Uge1xuICAnZGVmYXVsdCcgPSAnZGVmYXVsdCcsXG4gICdoaWdoLXBlcmZvcm1hbmNlJyA9ICdoaWdoLXBlcmZvcm1hbmNlJyxcbiAgJ2xvdy1wb3dlcicgPSAnbG93LXBvd2VyJ1xufVxuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2VudW1kZWYtbWxkZXZpY2VwcmVmZXJlbmNlKVxuICovXG5leHBvcnQgZW51bSBNTERldmljZVByZWZlcmVuY2Uge1xuICAnZGVmYXVsdCcgPSAnZGVmYXVsdCcsXG4gICdncHUnID0gJ2dwdScsXG4gICdjcHUnID0gJ2NwdSdcbn1cblxuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RpY3RkZWYtbWxjb250ZXh0b3B0aW9ucylcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNTENvbnRleHRPcHRpb25zIHtcbiAgLyoqICovXG4gIHBvd2VyUHJlZmVyZW5jZT86IE1MUG93ZXJQcmVmZXJlbmNlO1xuICAvKiogKi9cbiAgZGV2aWNlUHJlZmVyZW5jZT86IE1MRGV2aWNlUHJlZmVyZW5jZTtcbn1cblxuLyoqXG4gKiBbQVBJIHNwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jbWxjb250ZXh0KVxuICovXG5leHBvcnQgY2xhc3MgTUxDb250ZXh0IHtcbiAgcHJpdmF0ZSBvcHRpb25zXzogTUxDb250ZXh0T3B0aW9ucztcblxuICAvKiogQGludGVybmFsICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgY29uc3RydWN0b3Iob3B0aW9uczogTUxDb250ZXh0T3B0aW9ucyA9IHt9KSB7XG4gICAgdXRpbHMuYXNzZXJ0KG9wdGlvbnMgaW5zdGFuY2VvZiBPYmplY3QsICdJbnZhbGlkIG9wdGlvbnMuJyk7XG4gICAgaWYgKG9wdGlvbnMucG93ZXJQcmVmZXJlbmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgICBvcHRpb25zLnBvd2VyUHJlZmVyZW5jZSBpbiBNTFBvd2VyUHJlZmVyZW5jZSxcbiAgICAgICAgICAnSW52YWxpZCBwb3dlciBwcmVmZXJlbmNlLicpO1xuICAgIH1cbiAgICB0aGlzLm9wdGlvbnNfID0gb3B0aW9ucztcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0IG9wdGlvbnMoKTogTUxDb250ZXh0T3B0aW9ucyB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9uc187XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIC8vIEV4cG9zZSB0Zi5qcyBmb3IgYmFja2VuZCBkZWJ1Z2dpbmcuXG4gIGdldCB0ZigpOiB1bmtub3duIHtcbiAgICAvLyBTZXQgZGlyZWN0b3J5IG9mIHdhc20gYmluYXJpZXMgZm9yICd3YXNtJyBiYWNrZW5kXG4gICAgd2FzbS5zZXRXYXNtUGF0aHMoYGh0dHBzOi8vdW5wa2cuY29tL0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtQCR7XG4gICAgICAgIHRmLnZlcnNpb25fY29yZX0vZGlzdC9gKTtcbiAgICByZXR1cm4gdGY7XG4gIH1cbn1cbiIsImltcG9ydCAnQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLXdlYmdsJztcbmltcG9ydCAnQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdSc7XG5pbXBvcnQgJ0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC13YXNtJztcblxuaW1wb3J0ICogYXMgdGYgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNTEJ1ZmZlclZpZXcsIE1MTmFtZWRPcGVyYW5kc30gZnJvbSAnLi9ncmFwaF9idWlsZGVyJztcbmltcG9ydCB7Q29uc3RhbnRPcGVyYW5kLCBJbnB1dE9wZXJhbmQsIE1MT3BlcmFuZCwgTUxPcGVyYW5kRGVzY3JpcHRvciwgT3V0cHV0T3BlcmFuZH0gZnJvbSAnLi9vcGVyYW5kJztcbmltcG9ydCB7T3BlcmF0aW9ufSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQge0FycmF5QnVmZmVyVmlld30gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tICcuL3V0aWxzJztcblxuZXhwb3J0IHR5cGUgTUxSZXNvdXJjY2UgPSBNTEJ1ZmZlclZpZXd8V2ViR0xUZXh0dXJlO1xuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RpY3RkZWYtbWxpbnB1dClcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNTElucHV0IHtcbiAgcmVzb3VyY2U6IE1MUmVzb3VyY2NlO1xuICBkaW1lbnNpb25zOiBudW1iZXJbXTtcbn1cblxuLyoqXG4gKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyN0eXBlZGVmZGVmLW1sbmFtZWRpbnB1dHMpXG4gKi9cbmV4cG9ydCB0eXBlIE1MTmFtZWRJbnB1dHMgPSBSZWNvcmQ8c3RyaW5nLCBNTElucHV0fE1MUmVzb3VyY2NlPjtcblxuLyoqXG4gKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyN0eXBlZGVmZGVmLW1sbmFtZWRvdXRwdXRzKVxuICovXG5leHBvcnQgdHlwZSBNTE5hbWVkT3V0cHV0cyA9IFJlY29yZDxzdHJpbmcsIE1MUmVzb3VyY2NlPjtcblxuLyoqIEBpbnRlcm5hbCAqL1xuY2xhc3MgT3BlcmFuZFRlbnNvciB7XG4gIHJlZjogbnVtYmVyO1xuICB0ZW5zb3I6IHRmLlRlbnNvcjtcbn1cblxuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGNsYXNzIEV4ZWN1dGlvbkNvbnRleHQge1xuICBwcml2YXRlIGNvbnN0YW50VGVub3Nyc186IE1hcDxDb25zdGFudE9wZXJhbmQsIHRmLlRlbnNvcj47XG4gIHByaXZhdGUgaW5wdXRUZW5zb3JzXzogTWFwPElucHV0T3BlcmFuZCwgT3BlcmFuZFRlbnNvcj47XG4gIHByaXZhdGUgb3V0cHV0VGVuc29yc186IE1hcDxPdXRwdXRPcGVyYW5kLCBPcGVyYW5kVGVuc29yPjtcbiAgcHJpdmF0ZSBvcGVyYW5kUmVmc186IE1hcDxNTE9wZXJhbmQsIG51bWJlcj47XG4gIHByaXZhdGUgb3V0cHV0T3BlcmFuZHNfOiBTZXQ8T3V0cHV0T3BlcmFuZD47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBjb25zdGFudFRlbnNvcnM6IE1hcDxDb25zdGFudE9wZXJhbmQsIHRmLlRlbnNvcj4sXG4gICAgICBpbnB1dE9wZXJhbmRzOiBNYXA8c3RyaW5nLCBJbnB1dE9wZXJhbmQ+LFxuICAgICAgaW5wdXRzOiBNTE5hbWVkSW5wdXRzLFxuICAgICAgb3BlcmFuZFJlZnM6IE1hcDxNTE9wZXJhbmQsIG51bWJlcj4sXG4gICkge1xuICAgIHRoaXMuY29uc3RhbnRUZW5vc3JzXyA9IGNvbnN0YW50VGVuc29ycztcbiAgICB0aGlzLm9wZXJhbmRSZWZzXyA9IG9wZXJhbmRSZWZzO1xuICAgIHRoaXMuYWxsb2NhdGVJbnB1dFRlbnNvcnMoaW5wdXRPcGVyYW5kcywgaW5wdXRzKTtcbiAgICB0aGlzLm91dHB1dFRlbnNvcnNfID0gbmV3IE1hcCgpO1xuICAgIHRoaXMub3V0cHV0T3BlcmFuZHNfID0gbmV3IFNldCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhbGxvY2F0ZUlucHV0VGVuc29ycyhcbiAgICAgIGlucHV0T3BlcmFuZHM6IE1hcDxzdHJpbmcsIElucHV0T3BlcmFuZD4sIGlucHV0czogTUxOYW1lZElucHV0cykge1xuICAgIHRoaXMuaW5wdXRUZW5zb3JzXyA9IG5ldyBNYXAoKTtcbiAgICBmb3IgKGNvbnN0IGlucHV0TmFtZSBpbiBpbnB1dHMpIHtcbiAgICAgIGNvbnN0IGlucHV0ID0gaW5wdXRzW2lucHV0TmFtZV07XG4gICAgICBjb25zdCBpbnB1dE9wZXJhbmQgPSBpbnB1dE9wZXJhbmRzLmdldChpbnB1dE5hbWUpO1xuICAgICAgbGV0IGRlc2M6IE1MT3BlcmFuZERlc2NyaXB0b3I7XG4gICAgICBsZXQgcmVzb3VyY2U7XG4gICAgICBpZiAoKGlucHV0IGFzIE1MSW5wdXQpLmRpbWVuc2lvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBkZXNjID0ge1xuICAgICAgICAgIHR5cGU6IGlucHV0T3BlcmFuZC5kZXNjLnR5cGUsXG4gICAgICAgICAgZGltZW5zaW9uczogKGlucHV0IGFzIE1MSW5wdXQpLmRpbWVuc2lvbnNcbiAgICAgICAgfSBhcyBNTE9wZXJhbmREZXNjcmlwdG9yO1xuICAgICAgICByZXNvdXJjZSA9IChpbnB1dCBhcyBNTElucHV0KS5yZXNvdXJjZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlc2MgPSBpbnB1dE9wZXJhbmQuZGVzYztcbiAgICAgICAgcmVzb3VyY2UgPSBpbnB1dDtcbiAgICAgIH1cbiAgICAgIHRoaXMuaW5wdXRUZW5zb3JzXy5zZXQoaW5wdXRPcGVyYW5kLCB7XG4gICAgICAgIHJlZjogdGhpcy5vcGVyYW5kUmVmc18uZ2V0KGlucHV0T3BlcmFuZCksXG4gICAgICAgIHRlbnNvcjogdXRpbHMuY3JlYXRlVGVuc29yKGRlc2MsIHJlc291cmNlIGFzIEFycmF5QnVmZmVyVmlldylcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGNvbXB1dGUob3V0cHV0czogTWFwPHN0cmluZywgT3V0cHV0T3BlcmFuZD4pOiB0Zi5UZW5zb3JDb250YWluZXJPYmplY3Qge1xuICAgIGZvciAoY29uc3Qgb3V0cHV0IG9mIG91dHB1dHMudmFsdWVzKCkpIHtcbiAgICAgIHRoaXMub3V0cHV0T3BlcmFuZHNfLmFkZChvdXRwdXQpO1xuICAgIH1cbiAgICBjb25zdCBvdXRwdXRUZW5zb3JzOiB0Zi5UZW5zb3JDb250YWluZXJPYmplY3QgPSB7fTtcbiAgICBmb3IgKGNvbnN0IG91dHB1dE5hbWUgb2Ygb3V0cHV0cy5rZXlzKCkpIHtcbiAgICAgIG91dHB1dFRlbnNvcnNbb3V0cHV0TmFtZV0gPSB0aGlzLmdldFRlbnNvcihvdXRwdXRzLmdldChvdXRwdXROYW1lKSk7XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXRUZW5zb3JzO1xuICB9XG5cbiAgc2V0T3V0cHV0VGVuc29yKG91dHB1dDogT3V0cHV0T3BlcmFuZCwgdGVuc29yOiB0Zi5UZW5zb3IpOiB2b2lkIHtcbiAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgICF0aGlzLm91dHB1dFRlbnNvcnNfLmhhcyhvdXRwdXQpLCAnTUxPdXRwdXQgYWxyZWFkeSBoYXMgdGVuc29yLicpO1xuICAgIHRoaXMub3V0cHV0VGVuc29yc18uc2V0KFxuICAgICAgICBvdXRwdXQsIHtyZWY6IHRoaXMub3BlcmFuZFJlZnNfLmdldChvdXRwdXQpLCB0ZW5zb3J9KTtcbiAgfVxuXG4gIHJlbGVhc2VUZW5zb3Iob3BlcmFuZDogTUxPcGVyYW5kKTogdm9pZCB7XG4gICAgbGV0IG9wZXJhbmRUZW5zb3JNYXA6IE1hcDxNTE9wZXJhbmQsIE9wZXJhbmRUZW5zb3I+O1xuICAgIGlmIChvcGVyYW5kIGluc3RhbmNlb2YgSW5wdXRPcGVyYW5kKSB7XG4gICAgICBvcGVyYW5kVGVuc29yTWFwID0gdGhpcy5pbnB1dFRlbnNvcnNfO1xuICAgIH0gZWxzZSBpZiAob3BlcmFuZCBpbnN0YW5jZW9mIE91dHB1dE9wZXJhbmQpIHtcbiAgICAgIGlmICh0aGlzLm91dHB1dE9wZXJhbmRzXy5oYXMob3BlcmFuZCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgb3BlcmFuZFRlbnNvck1hcCA9IHRoaXMub3V0cHV0VGVuc29yc187XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgb3BlcmFuZFRlbnNvcjogT3BlcmFuZFRlbnNvciA9IG9wZXJhbmRUZW5zb3JNYXAuZ2V0KG9wZXJhbmQpO1xuICAgIHV0aWxzLmFzc2VydChvcGVyYW5kVGVuc29yICE9PSB1bmRlZmluZWQsICdObyB0ZW5zb3IgZm91bmQgZm9yIG9wZXJhbmQuJyk7XG4gICAgb3BlcmFuZFRlbnNvci5yZWYtLTtcbiAgICBpZiAob3BlcmFuZFRlbnNvci5yZWYgPT09IDApIHtcbiAgICAgIHRmLmRpc3Bvc2Uob3BlcmFuZFRlbnNvci50ZW5zb3IpO1xuICAgICAgb3BlcmFuZFRlbnNvck1hcC5kZWxldGUob3BlcmFuZCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0VGVuc29yKG9wZXJhbmQ6IE1MT3BlcmFuZCk6IHRmLlRlbnNvciB7XG4gICAgaWYgKG9wZXJhbmQgaW5zdGFuY2VvZiBDb25zdGFudE9wZXJhbmQpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnN0YW50VGVub3Nyc18uZ2V0KG9wZXJhbmQpO1xuICAgIH0gZWxzZSBpZiAob3BlcmFuZCBpbnN0YW5jZW9mIElucHV0T3BlcmFuZCkge1xuICAgICAgcmV0dXJuIHRoaXMuaW5wdXRUZW5zb3JzXy5nZXQob3BlcmFuZCkudGVuc29yO1xuICAgIH0gZWxzZSBpZiAob3BlcmFuZCBpbnN0YW5jZW9mIE91dHB1dE9wZXJhbmQpIHtcbiAgICAgIGlmICh0aGlzLm91dHB1dFRlbnNvcnNfLmhhcyhvcGVyYW5kKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5vdXRwdXRUZW5zb3JzXy5nZXQob3BlcmFuZCkudGVuc29yO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3BlcmFuZC5vcGVyYXRpb24uY29tcHV0ZSh0aGlzKTtcbiAgICAgICAgdXRpbHMuYXNzZXJ0KHRoaXMub3V0cHV0VGVuc29yc18uaGFzKG9wZXJhbmQpLCAnTm8gb3V0cHV0IGlzIHNldC4nKTtcbiAgICAgICAgcmV0dXJuIHRoaXMub3V0cHV0VGVuc29yc18uZ2V0KG9wZXJhbmQpLnRlbnNvcjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgb3BlcmFuZCBpcyBpbnZhbGlkLicpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2FwaS1tbGdyYXBoKVxuICovXG5leHBvcnQgY2xhc3MgTUxHcmFwaCB7XG4gIHByaXZhdGUgaW5wdXRzXzogTWFwPHN0cmluZywgSW5wdXRPcGVyYW5kPiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBvdXRwdXRzXzogTWFwPHN0cmluZywgT3V0cHV0T3BlcmFuZD4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgY29uc3RhbnRzXzogU2V0PENvbnN0YW50T3BlcmFuZD4gPSBuZXcgU2V0KCk7XG4gIHByaXZhdGUgb3BlcmFuZFJlZnNfOiBNYXA8TUxPcGVyYW5kLCBudW1iZXI+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIGNvbnN0YW50VGVuc29yc186IE1hcDxDb25zdGFudE9wZXJhbmQsIHRmLlRlbnNvcj4gPSBuZXcgTWFwKCk7XG5cbiAgY29tcHV0ZShpbnB1dHM6IE1MTmFtZWRJbnB1dHMsIG91dHB1dHM6IE1MTmFtZWRPdXRwdXRzKTogdm9pZCB7XG4gICAgdGhpcy52YWxpZGF0ZUlucHV0cyhpbnB1dHMpO1xuXG4gICAgLy8gVmFsaWRhdGUgYW5kIGZpbHRlciB0aGUgcmVxdWlyZWQgb3V0cHV0IG9wZXJhbmRzLlxuICAgIHV0aWxzLmFzc2VydChPYmplY3Qua2V5cyhvdXRwdXRzKS5sZW5ndGggIT09IDAsICdUaGUgb3V0cHV0cyBpcyBpbnZhbGlkLicpO1xuICAgIGNvbnN0IG91dHB1dE9wZXJhbmRzOiBNYXA8c3RyaW5nLCBPdXRwdXRPcGVyYW5kPiA9IG5ldyBNYXAoKTtcbiAgICBmb3IgKGNvbnN0IG91dHB1dE5hbWUgaW4gb3V0cHV0cykge1xuICAgICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICAgIHR5cGVvZiBvdXRwdXROYW1lID09PSAnc3RyaW5nJyAmJiB0aGlzLm91dHB1dHNfLmhhcyhvdXRwdXROYW1lKSxcbiAgICAgICAgICAnVGhlIG5hbWUgb2YgdGhlIG91dHB1dCBpcyBpbnZhbGlkLicpO1xuICAgICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICAgIHV0aWxzLmlzVHlwZWRBcnJheShvdXRwdXRzW291dHB1dE5hbWVdKSxcbiAgICAgICAgICAnT25seSBvdXRwdXQgb2YgQXJyYXlCdWZmZXJWaWV3IHR5cGUgaXMgc3VwcG9ydGVkLicpO1xuICAgICAgb3V0cHV0T3BlcmFuZHMuc2V0KG91dHB1dE5hbWUsIHRoaXMub3V0cHV0c18uZ2V0KG91dHB1dE5hbWUpKTtcbiAgICB9XG5cbiAgICAvLyBDb21wdXRlIHRoZSBvdXRwdXQgdGVuc29ycy5cbiAgICBjb25zdCBvdXRwdXRUZW5zb3JzOiB0Zi5UZW5zb3JDb250YWluZXJPYmplY3QgPSB0Zi50aWR5KCgpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSBuZXcgRXhlY3V0aW9uQ29udGV4dChcbiAgICAgICAgICB0aGlzLmNvbnN0YW50VGVuc29yc18sIHRoaXMuaW5wdXRzXywgaW5wdXRzLCB0aGlzLm9wZXJhbmRSZWZzXyk7XG4gICAgICAvLyBUaGUgaW5wdXQgYW5kIGltbWVkaWF0ZSB0ZW5zb3JzIHdpbGwgYmUgY2xlYW5lZCB1cC5cbiAgICAgIHJldHVybiBjb250ZXh0LmNvbXB1dGUob3V0cHV0T3BlcmFuZHMpO1xuICAgIH0pO1xuXG4gICAgLy8gU2V0dXAgdGhlIG91dHB1dHMuXG4gICAgZm9yIChjb25zdCBvdXRwdXROYW1lIG9mIE9iamVjdC5rZXlzKG91dHB1dFRlbnNvcnMpKSB7XG4gICAgICBjb25zdCB0ZW5zb3IgPSBvdXRwdXRUZW5zb3JzW291dHB1dE5hbWVdIGFzIHRmLlRlbnNvcjtcbiAgICAgIGNvbnN0IGRlc2MgPSB1dGlscy5jcmVhdGVPcGVyYW5kRGVzY3JpcHRvckZyb21UZW5zb3IodGVuc29yKTtcbiAgICAgIGNvbnN0IHJlc291cmNlID0gb3V0cHV0c1tvdXRwdXROYW1lXSBhcyBBcnJheUJ1ZmZlclZpZXc7XG4gICAgICB1dGlscy52YWxpZGF0ZVR5cGVkQXJyYXkocmVzb3VyY2UsIGRlc2MudHlwZSwgZGVzYy5kaW1lbnNpb25zKTtcbiAgICAgIHJlc291cmNlLnNldCh0ZW5zb3IuZGF0YVN5bmMoKSk7XG4gICAgICB0Zi5kaXNwb3NlKHRlbnNvcik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZUlucHV0cyhpbnB1dHM6IE1MTmFtZWRJbnB1dHMpIHtcbiAgICBmb3IgKGNvbnN0IG5hbWUgaW4gaW5wdXRzKSB7XG4gICAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgICAgdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnICYmIHRoaXMuaW5wdXRzXy5oYXMobmFtZSksXG4gICAgICAgICAgJ1RoZSBuYW1lIG9mIHRoZSBpbnB1dCBpcyBpbnZhbGlkLicpO1xuICAgICAgY29uc3QgaW5wdXRPcGVyYW5kID0gdGhpcy5pbnB1dHNfLmdldChuYW1lKTtcbiAgICAgIGxldCByZXNvdXJjZTtcbiAgICAgIGxldCBkaW1lbnNpb25zO1xuICAgICAgaWYgKChpbnB1dHNbbmFtZV0gYXMgTUxJbnB1dCkuZGltZW5zaW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gaW5wdXRzW25hbWVdIGFzIE1MSW5wdXQ7XG4gICAgICAgIHJlc291cmNlID0gaW5wdXQucmVzb3VyY2U7XG4gICAgICAgIGRpbWVuc2lvbnMgPSBpbnB1dC5kaW1lbnNpb25zO1xuICAgICAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgICAgICByZXNvdXJjZSAhPT0gdW5kZWZpbmVkLCAnVGhlIHJlc291cmNlIG9mIGlucHV0IGlzIHVuZGVmaW5lZC4nKTtcbiAgICAgICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICAgICAgdXRpbHMuaXNJbnRlZ2VyQXJyYXkoZGltZW5zaW9ucykgPT09IHRydWUsXG4gICAgICAgICAgICAnVGhlIHR5cGUgb2YgdGhlIGlucHV0IGRpbWVuc2lvbnMgaXMgaW52YWxpZC4nKTtcbiAgICAgICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICAgICAgZGltZW5zaW9ucy5sZW5ndGggPT09IGlucHV0T3BlcmFuZC5kZXNjLmRpbWVuc2lvbnMubGVuZ3RoLFxuICAgICAgICAgICAgJ1RoZSByYW5rIG9mIHRoZSBpbnB1dCBkaW1lbnNpb25zIGlzIGludmFsaWQuJyk7XG4gICAgICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgICAgICF1dGlscy5pc0R5YW5taWNTaGFwZShkaW1lbnNpb25zKSxcbiAgICAgICAgICAgICdUaGUgdmFsdWUgb2YgaW5wdXQgZGltZW5zaW9ucyBpcyBuZWdhdGl2ZS4nKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dE9wZXJhbmQuZGVzYy5kaW1lbnNpb25zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgY29uc3QgZCA9IGlucHV0T3BlcmFuZC5kZXNjLmRpbWVuc2lvbnNbaV07XG4gICAgICAgICAgaWYgKGQgPiAwKSB7XG4gICAgICAgICAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgICAgICAgICAgZCA9PT0gZGltZW5zaW9uc1tpXSxcbiAgICAgICAgICAgICAgICAnVGhlIHZhbHVlIG9mIHRoZSBpbnB1dCBkaW1lbnNpb25zIGlzIGludmFsaWQuJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNvdXJjZSA9IGlucHV0c1tuYW1lXSBhcyBNTFJlc291cmNjZTtcbiAgICAgICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICAgICAgIXV0aWxzLmlzRHlhbm1pY1NoYXBlKGlucHV0T3BlcmFuZC5kZXNjLmRpbWVuc2lvbnMpLFxuICAgICAgICAgICAgJ1RoZSBpbnB1dCBkaW1lbnNpb25zIGlzIG5vdCBzcGVjaWZpZWQuJyk7XG4gICAgICAgIGRpbWVuc2lvbnMgPSBpbnB1dE9wZXJhbmQuZGVzYy5kaW1lbnNpb25zO1xuICAgICAgfVxuICAgICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICAgIHV0aWxzLmlzVHlwZWRBcnJheShyZXNvdXJjZSksXG4gICAgICAgICAgJ09ubHkgcmVzb3VyY2Ugb2YgQXJyYXlCdWZmZXJWaWV3IHR5cGUgaXMgc3VwcG9ydGVkLicpO1xuICAgICAgdXRpbHMudmFsaWRhdGVUeXBlZEFycmF5KFxuICAgICAgICAgIHJlc291cmNlIGFzIEFycmF5QnVmZmVyVmlldywgaW5wdXRPcGVyYW5kLmRlc2MudHlwZSwgZGltZW5zaW9ucyk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgY29uc3RydWN0b3Iob3V0cHV0cz86IE1MTmFtZWRPcGVyYW5kcykge1xuICAgIHV0aWxzLmFzc2VydChvdXRwdXRzICE9PSB1bmRlZmluZWQsICdJbnZhbGlkIGFyZ3VtZW50Jyk7XG4gICAgZm9yIChjb25zdCBuYW1lIGluIG91dHB1dHMpIHtcbiAgICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgICB0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycgJiYgb3V0cHV0c1tuYW1lXSBpbnN0YW5jZW9mIE91dHB1dE9wZXJhbmQsXG4gICAgICAgICAgJ1RoZSBvdXRwdXRzIHBhcmFtZXRlciBpcyBpbnZhbGlkLicpO1xuICAgICAgdGhpcy5vdXRwdXRzXy5zZXQobmFtZSwgb3V0cHV0c1tuYW1lXSBhcyBPdXRwdXRPcGVyYW5kKTtcbiAgICB9XG4gICAgdXRpbHMuYXNzZXJ0KHRoaXMub3V0cHV0c18uc2l6ZSAhPT0gMCwgJ1RoZSBvdXRwdXRzIGlzIGVtcHR5Jyk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHN0YXRpYyBidWlsZEFuZENvbXBpbGUob3V0cHV0cz86IE1MTmFtZWRPcGVyYW5kcyk6IE1MR3JhcGgge1xuICAgIGNvbnN0IGdyYXBoID0gbmV3IE1MR3JhcGgob3V0cHV0cyk7XG4gICAgZ3JhcGguYnVpbGQoKTtcbiAgICBncmFwaC5jb21waWxlKCk7XG4gICAgcmV0dXJuIGdyYXBoO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZCgpOiB2b2lkIHtcbiAgICBjb25zdCB2aXNpdGVkT3BzOiBTZXQ8T3BlcmF0aW9uPiA9IG5ldyBTZXQoKTtcbiAgICBmb3IgKGNvbnN0IG91dHB1dCBvZiB0aGlzLm91dHB1dHNfLnZhbHVlcygpKSB7XG4gICAgICB0aGlzLmJ1aWxkT3BlcmF0aW9uKG91dHB1dC5vcGVyYXRpb24sIHZpc2l0ZWRPcHMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRPcGVyYXRpb24ob3BlcmF0aW9uOiBPcGVyYXRpb24sIHZpc2l0ZWRPcHM6IFNldDxPcGVyYXRpb24+KTpcbiAgICAgIHZvaWQge1xuICAgIGlmICh2aXNpdGVkT3BzLmhhcyhvcGVyYXRpb24pKSB7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIHZpc2l0ZWRPcHMuYWRkKG9wZXJhdGlvbik7XG4gICAgfVxuICAgIGZvciAoY29uc3Qgb3BlcmFuZCBvZiBvcGVyYXRpb24uaW5wdXRzKCkpIHtcbiAgICAgIGlmICghdGhpcy5vcGVyYW5kUmVmc18uaGFzKG9wZXJhbmQpKSB7XG4gICAgICAgIHRoaXMub3BlcmFuZFJlZnNfLnNldChvcGVyYW5kLCAxKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCByZWYgPSB0aGlzLm9wZXJhbmRSZWZzXy5nZXQob3BlcmFuZCk7XG4gICAgICAgIHJlZisrO1xuICAgICAgICB0aGlzLm9wZXJhbmRSZWZzXy5zZXQob3BlcmFuZCwgcmVmKTtcbiAgICAgIH1cbiAgICAgIGlmIChvcGVyYW5kIGluc3RhbmNlb2YgSW5wdXRPcGVyYW5kKSB7XG4gICAgICAgIGlmICh0aGlzLmlucHV0c18uaGFzKG9wZXJhbmQubmFtZSkpIHtcbiAgICAgICAgICBpZiAodGhpcy5pbnB1dHNfLmdldChvcGVyYW5kLm5hbWUpICE9PSBvcGVyYW5kKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBuYW1lIG9mIHRoaXMgaW5wdXQgaXMgZXhpc3RlZC4nKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5wdXRzXy5zZXQob3BlcmFuZC5uYW1lLCBvcGVyYW5kKTtcbiAgICAgIH0gZWxzZSBpZiAob3BlcmFuZCBpbnN0YW5jZW9mIENvbnN0YW50T3BlcmFuZCkge1xuICAgICAgICBpZiAoIXRoaXMuY29uc3RhbnRzXy5oYXMob3BlcmFuZCkpIHtcbiAgICAgICAgICB0aGlzLmNvbnN0YW50c18uYWRkKG9wZXJhbmQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG9wZXJhbmQgaW5zdGFuY2VvZiBPdXRwdXRPcGVyYW5kKSB7XG4gICAgICAgIHRoaXMuYnVpbGRPcGVyYXRpb24ob3BlcmFuZC5vcGVyYXRpb24sIHZpc2l0ZWRPcHMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY29tcGlsZSgpOiB2b2lkIHtcbiAgICB0aGlzLmFsbG9jYXRlQ29uc3RhbnRzKCk7XG4gICAgdGhpcy5jb21wdXRlT25jZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhbGxvY2F0ZUNvbnN0YW50cygpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGNvbnN0YW50IG9mIHRoaXMuY29uc3RhbnRzXykge1xuICAgICAgdGhpcy5jb25zdGFudFRlbnNvcnNfLnNldChcbiAgICAgICAgICBjb25zdGFudCwgdXRpbHMuY3JlYXRlVGVuc29yKGNvbnN0YW50LmRlc2MsIGNvbnN0YW50LnZhbHVlKSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjb21wdXRlT25jZSgpOiB2b2lkIHtcbiAgICBjb25zdCBpbnB1dHM6IE1MTmFtZWRJbnB1dHMgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGlucHV0TmFtZSBvZiB0aGlzLmlucHV0c18ua2V5cygpKSB7XG4gICAgICBjb25zdCBpbnB1dE9wZXJhbmQgPSB0aGlzLmlucHV0c18uZ2V0KGlucHV0TmFtZSk7XG4gICAgICAvLyBhc3N1bWUgMSBmb3IgbmVnYXRpdmUgZGltIHZhbHVlLlxuICAgICAgY29uc3Qgc2hhcGUgPSBpbnB1dE9wZXJhbmQuZGVzYy5kaW1lbnNpb25zLm1hcCh4ID0+IHggPCAwID8gMSA6IHgpO1xuICAgICAgY29uc3QgdHlwZWRBcnJheUNvbnN0cnVjdG9yID0gdXRpbHMuZ2V0VHlwZWRBcnJheShpbnB1dE9wZXJhbmQuZGVzYy50eXBlKTtcbiAgICAgIGNvbnN0IGlucHV0QnVmZmVyID0gbmV3IHR5cGVkQXJyYXlDb25zdHJ1Y3RvcihcbiAgICAgICAgICB1dGlscy5zaXplRnJvbURpbWVuc2lvbnMoaW5wdXRPcGVyYW5kLmRlc2MuZGltZW5zaW9ucykpO1xuICAgICAgaW5wdXRzW2lucHV0TmFtZV0gPSB7cmVzb3VyY2U6IGlucHV0QnVmZmVyLCBkaW1lbnNpb25zOiBzaGFwZX0gYXMgTUxJbnB1dDtcbiAgICB9XG4gICAgY29uc3Qgb3V0cHV0VGVuc29yczogdGYuVGVuc29yQ29udGFpbmVyT2JqZWN0ID0gdGYudGlkeSgoKSA9PiB7XG4gICAgICBjb25zdCBjb250ZXh0ID0gbmV3IEV4ZWN1dGlvbkNvbnRleHQoXG4gICAgICAgICAgdGhpcy5jb25zdGFudFRlbnNvcnNfLCB0aGlzLmlucHV0c18sIGlucHV0cywgdGhpcy5vcGVyYW5kUmVmc18pO1xuICAgICAgLy8gVGhlIGlucHV0IGFuZCBpbW1lZGlhdGUgdGVuc29ycyB3aWxsIGJlIGNsZWFuZWQgdXAuXG4gICAgICByZXR1cm4gY29udGV4dC5jb21wdXRlKHRoaXMub3V0cHV0c18pO1xuICAgIH0pO1xuICAgIGZvciAoY29uc3Qgb3V0cHV0TmFtZSBvZiBPYmplY3Qua2V5cyhvdXRwdXRUZW5zb3JzKSkge1xuICAgICAgY29uc3QgdGVuc29yID0gb3V0cHV0VGVuc29yc1tvdXRwdXROYW1lXSBhcyB0Zi5UZW5zb3I7XG4gICAgICB0ZW5zb3IuZGF0YVN5bmMoKTtcbiAgICAgIHRmLmRpc3Bvc2UodGVuc29yKTtcbiAgICB9XG4gIH1cblxuICAvKiogQGlnbm9yZSAqL1xuICAvLyBGb3IgbWVtb3J5IGxlYWsgdGVzdGluZy5cbiAgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IHRlbnNvciBvZiB0aGlzLmNvbnN0YW50VGVuc29yc18udmFsdWVzKCkpIHtcbiAgICAgIHRmLmRpc3Bvc2UodGVuc29yKTtcbiAgICB9XG4gICAgY29uc3QgdmlzaXRlZE9wczogU2V0PE9wZXJhdGlvbj4gPSBuZXcgU2V0KCk7XG4gICAgZm9yIChjb25zdCBvdXRwdXQgb2YgdGhpcy5vdXRwdXRzXy52YWx1ZXMoKSkge1xuICAgICAgdGhpcy5kaXNwb3NlT3BlcmF0aW9uKG91dHB1dC5vcGVyYXRpb24sIHZpc2l0ZWRPcHMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZGlzcG9zZU9wZXJhdGlvbihvcGVyYXRpb246IE9wZXJhdGlvbiwgdmlzaXRlZE9wczogU2V0PE9wZXJhdGlvbj4pOlxuICAgICAgdm9pZCB7XG4gICAgaWYgKHZpc2l0ZWRPcHMuaGFzKG9wZXJhdGlvbikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgb3BlcmF0aW9uLmRpc3Bvc2UoKTtcbiAgICAgIHZpc2l0ZWRPcHMuYWRkKG9wZXJhdGlvbik7XG4gICAgfVxuICAgIGZvciAoY29uc3Qgb3BlcmFuZCBvZiBvcGVyYXRpb24uaW5wdXRzKCkpIHtcbiAgICAgIGlmIChvcGVyYW5kIGluc3RhbmNlb2YgT3V0cHV0T3BlcmFuZCkge1xuICAgICAgICB0aGlzLmRpc3Bvc2VPcGVyYXRpb24ob3BlcmFuZC5vcGVyYXRpb24sIHZpc2l0ZWRPcHMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHtNTENvbnRleHR9IGZyb20gJy4vY29udGV4dCc7XG5pbXBvcnQge01MR3JhcGh9IGZyb20gJy4vZ3JhcGgnO1xuaW1wb3J0IHtDb25zdGFudE9wZXJhbmQsIElucHV0T3BlcmFuZCwgTUxPcGVyYW5kLCBNTE9wZXJhbmREZXNjcmlwdG9yLCBNTE9wZXJhbmRUeXBlfSBmcm9tICcuL29wZXJhbmQnO1xuaW1wb3J0IHtNTE9wZXJhdG9yfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQge0JhdGNoTm9ybWFsaXphdGlvbn0gZnJvbSAnLi9vcHMvYmF0Y2hfbm9ybSc7XG5pbXBvcnQge0FkZCwgRGl2LCBNYXRNdWwsIE1heCwgTWluLCBNdWwsIFBvdywgU3VifSBmcm9tICcuL29wcy9iaW5hcnknO1xuaW1wb3J0IHtDbGFtcH0gZnJvbSAnLi9vcHMvY2xhbXAnO1xuaW1wb3J0IHtDb25jYXR9IGZyb20gJy4vb3BzL2NvbmNhdCc7XG5pbXBvcnQge0NvbnYyZH0gZnJvbSAnLi9vcHMvY29udjJkJztcbmltcG9ydCB7R2VtbX0gZnJvbSAnLi9vcHMvZ2VtbSc7XG5pbXBvcnQge0dydSwgR3J1Q2VsbH0gZnJvbSAnLi9vcHMvZ3J1JztcbmltcG9ydCB7SW5zdGFuY2VOb3JtYWxpemF0aW9ufSBmcm9tICcuL29wcy9pbnN0YW5jZV9ub3JtJztcbmltcG9ydCB7TGVha3lSZWx1fSBmcm9tICcuL29wcy9sZWFreV9yZWx1JztcbmltcG9ydCB7UGFkfSBmcm9tICcuL29wcy9wYWQnO1xuaW1wb3J0IHtBdmVyYWdlUG9vbDJkLCBNYXhQb29sMmR9IGZyb20gJy4vb3BzL3Bvb2wyZCc7XG5pbXBvcnQge1JlZHVjZUxvZ1N1bUV4cCwgUmVkdWNlTWF4LCBSZWR1Y2VNZWFuLCBSZWR1Y2VNaW4sIFJlZHVjZVByb2R1Y3QsIFJlZHVjZVN1bX0gZnJvbSAnLi9vcHMvcmVkdWNlJztcbmltcG9ydCB7UmVzYW1wbGV9IGZyb20gJy4vb3BzL3Jlc2FtcGxlJztcbmltcG9ydCB7UmVzaGFwZX0gZnJvbSAnLi9vcHMvcmVzaGFwZSc7XG5pbXBvcnQge1NsaWNlfSBmcm9tICcuL29wcy9zbGljZSc7XG5pbXBvcnQge1NvZnRtYXh9IGZyb20gJy4vb3BzL3NvZnRtYXgnO1xuaW1wb3J0IHtTcGxpdH0gZnJvbSAnLi9vcHMvc3BsaXQnO1xuaW1wb3J0IHtTcXVlZXplfSBmcm9tICcuL29wcy9zcXVlZXplJztcbmltcG9ydCB7VHJhbnNwb3NlfSBmcm9tICcuL29wcy90cmFuc3Bvc2UnO1xuaW1wb3J0IHtFeHAsIFJlbHUsIFNpZ21vaWQsIFRhbmh9IGZyb20gJy4vb3BzL3VuYXJ5JztcbmltcG9ydCB7QXJyYXlCdWZmZXJWaWV3fSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJy4vdXRpbHMnO1xuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2VudW1kZWYtbWxpbnB1dG9wZXJhbmRsYXlvdXQpXG4gKi9cbmV4cG9ydCBlbnVtIE1MSW5wdXRPcGVyYW5kTGF5b3V0IHtcbiAgJ25jaHcnID0gJ25jaHcnLFxuICAnbmh3YycgPSAnbmh3Yydcbn1cblxuLyoqXG4gKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkaWN0ZGVmLW1sYmF0Y2hub3JtYWxpemF0aW9ub3B0aW9ucylcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNTEJhdGNoTm9ybWFsaXphdGlvbk9wdGlvbnMge1xuICBzY2FsZT86IE1MT3BlcmFuZDtcbiAgYmlhcz86IE1MT3BlcmFuZDtcbiAgYXhpcz86IG51bWJlcjtcbiAgZXBzaWxvbj86IG51bWJlcjtcbiAgYWN0aXZhdGlvbj86IE1MT3BlcmF0b3I7XG59XG5cbi8qKlxuICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZGljdGRlZi1tbGNsYW1wb3B0aW9ucylcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNTENsYW1wT3B0aW9ucyB7XG4gIG1pblZhbHVlPzogTUxPcGVyYW5kO1xuICBtYXhWYWx1ZT86IE1MT3BlcmFuZDtcbn1cblxuLyoqXG4gKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNlbnVtZGVmLW1sZmlsdGVyb3BlcmFuZGxheW91dClcbiAqL1xuZXhwb3J0IGVudW0gTUxGaWx0ZXJPcGVyYW5kTGF5b3V0IHtcbiAgJ29paHcnID0gJ29paHcnLFxuICAnaHdpbycgPSAnaHdpbycsXG4gICdvaHdpJyA9ICdvaHdpJyxcbiAgJ2lod28nID0gJ2lod28nLFxufVxuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2VudW1kZWYtbWxhdXRvcGFkKVxuICovXG5leHBvcnQgZW51bSBNTEF1dG9QYWQge1xuICAnZXhwbGljaXQnID0gJ2V4cGxpY2l0JyxcbiAgJ3NhbWUtdXBwZXInID0gJ3NhbWUtdXBwZXInLFxuICAnc2FtZS1sb3dlcicgPSAnc2FtZS1sb3dlcicsXG59XG5cbi8qKlxuICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZGljdGRlZi1tbGNvbnYyZG9wdGlvbnMpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTUxDb252MmRPcHRpb25zIHtcbiAgcGFkZGluZz86IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuICBzdHJpZGVzPzogW251bWJlciwgbnVtYmVyXTtcbiAgZGlsYXRpb25zPzogW251bWJlciwgbnVtYmVyXTtcbiAgb3V0cHV0UGFkZGluZz86IFtudW1iZXIsIG51bWJlcl07XG4gIG91dHB1dFNpemVzPzogW251bWJlciwgbnVtYmVyXTtcbiAgYXV0b1BhZD86IE1MQXV0b1BhZDtcbiAgdHJhbnNwb3NlPzogYm9vbGVhbjtcbiAgZ3JvdXBzPzogbnVtYmVyO1xuICBpbnB1dExheW91dD86IE1MSW5wdXRPcGVyYW5kTGF5b3V0O1xuICBmaWx0ZXJMYXlvdXQ/OiBNTEZpbHRlck9wZXJhbmRMYXlvdXQ7XG4gIGJpYXM/OiBNTE9wZXJhbmQ7XG4gIGFjdGl2YXRpb24/OiBNTE9wZXJhdG9yO1xufVxuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RpY3RkZWYtbWxnZW1tb3B0aW9ucylcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNTEdlbW1PcHRpb25zIHtcbiAgYz86IE1MT3BlcmFuZDtcbiAgYWxwaGE/OiBudW1iZXI7XG4gIGJldGE/OiBudW1iZXI7XG4gIGFUcmFuc3Bvc2U/OiBib29sZWFuO1xuICBiVHJhbnNwb3NlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNlbnVtZGVmLW1scmVjdXJyZW50bmV0d29ya3dlaWdodGxheW91dClcbiAqL1xuZXhwb3J0IGVudW0gTUxSZWN1cnJlbnROZXR3b3JrV2VpZ2h0TGF5b3V0IHtcbiAgJ3pybicgPSAnenJuJyxcbiAgJ3J6bicgPSAncnpuJyxcbn1cblxuLyoqXG4gKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNlbnVtZGVmLW1scmVjdXJyZW50bmV0d29ya2RpcmVjdGlvbilcbiAqL1xuZXhwb3J0IGVudW0gTUxSZWN1cnJlbnROZXR3b3JrRGlyZWN0aW9uIHtcbiAgJ2ZvcndhcmQnID0gJ2ZvcndhcmQnLFxuICAnYmFja3dhcmQnID0gJ2JhY2t3YXJkJyxcbiAgJ2JvdGgnID0gJ2JvdGgnLFxufVxuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RpY3RkZWYtbWxncnVvcHRpb25zKVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1MR3J1T3B0aW9ucyB7XG4gIGJpYXM/OiBNTE9wZXJhbmQ7XG4gIHJlY3VycmVudEJpYXM/OiBNTE9wZXJhbmQ7XG4gIGluaXRpYWxIaWRkZW5TdGF0ZT86IE1MT3BlcmFuZDtcbiAgcmVzZXRBZnRlcj86IGJvb2xlYW47XG4gIHJldHVyblNlcXVlbmNlPzogYm9vbGVhbjtcbiAgZGlyZWN0aW9uPzogTUxSZWN1cnJlbnROZXR3b3JrRGlyZWN0aW9uO1xuICBsYXlvdXQ/OiBNTFJlY3VycmVudE5ldHdvcmtXZWlnaHRMYXlvdXQ7XG4gIGFjdGl2YXRpb25zPzogTUxPcGVyYXRvcltdO1xufVxuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RpY3RkZWYtbWxncnVjZWxsb3B0aW9ucylcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNTEdydUNlbGxPcHRpb25zIHtcbiAgYmlhcz86IE1MT3BlcmFuZDtcbiAgcmVjdXJyZW50Qmlhcz86IE1MT3BlcmFuZDtcbiAgcmVzZXRBZnRlcj86IGJvb2xlYW47XG4gIGxheW91dD86IE1MUmVjdXJyZW50TmV0d29ya1dlaWdodExheW91dDtcbiAgYWN0aXZhdGlvbnM/OiBNTE9wZXJhdG9yW107XG59XG5cbi8qKlxuICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZGljdGRlZi1tbGluc3RhbmNlbm9ybWFsaXphdGlvbm9wdGlvbnMpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTUxJbnN0YW5jZU5vcm1hbGl6YXRpb25PcHRpb25zIHtcbiAgc2NhbGU/OiBNTE9wZXJhbmQ7XG4gIGJpYXM/OiBNTE9wZXJhbmQ7XG4gIGVwc2lsb24/OiBudW1iZXI7XG4gIGxheW91dD86IE1MSW5wdXRPcGVyYW5kTGF5b3V0O1xufVxuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RpY3RkZWYtbWxsZWFreXJlbHVvcHRpb25zKVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1MTGVha3lSZWx1T3B0aW9ucyB7XG4gIGFscGhhPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2VudW1kZWYtbWxwYWRkaW5nbW9kZSlcbiAqL1xuZXhwb3J0IGVudW0gTUxQYWRkaW5nTW9kZSB7XG4gICdjb25zdGFudCcgPSAnY29uc3RhbnQnLFxuICAnZWRnZScgPSAnZWRnZScsXG4gICdyZWZsZWN0aW9uJyA9ICdyZWZsZWN0aW9uJyxcbiAgJ3N5bW1ldHJpYycgPSAnc3ltbWV0cmljJ1xufVxuXG4vKipcbiAqIFtzcGVjXShoaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkaWN0ZGVmLW1scGFkb3B0aW9ucylcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNTFBhZE9wdGlvbnMge1xuICBtb2RlPzogTUxQYWRkaW5nTW9kZTtcbiAgdmFsdWU/OiBudW1iZXI7XG59XG5cbi8qKlxuICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZGljdGRlZi1tbHBvb2wyZG9wdGlvbnMpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTUxQb29saW5nMmRPcHRpb25zIHtcbiAgd2luZG93RGltZW5zaW9ucz86IFtudW1iZXIsIG51bWJlcl07XG4gIHBhZGRpbmc/OiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcbiAgc3RyaWRlcz86IFtudW1iZXIsIG51bWJlcl07XG4gIGRpbGF0aW9ucz86IFtudW1iZXIsIG51bWJlcl07XG4gIGF1dG9QYWQ/OiBNTEF1dG9QYWQ7XG4gIGxheW91dD86IE1MSW5wdXRPcGVyYW5kTGF5b3V0O1xufVxuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RpY3RkZWYtbWxyZWR1Y2VvcHRpb25zKVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1MUmVkdWNlT3B0aW9ucyB7XG4gIGF4ZXM/OiBudW1iZXJbXTtcbiAga2VlcERpbWVuc2lvbnM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2VudW1kZWYtbWxpbnRlcnBvbGF0aW9ubW9kZSlcbiAqL1xuZXhwb3J0IGVudW0gTUxJbnRlcnBvbGF0aW9uTW9kZSB7XG4gICduZWFyZXN0LW5laWdoYm9yJyA9ICduZWFyZXN0LW5laWdoYm9yJyxcbiAgJ2xpbmVhcicgPSAnbGluZWFyJ1xufVxuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RpY3RkZWYtbWxyZXNhbXBsZW9wdGlvbnMpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTUxSZXNhbXBsZU9wdGlvbnMge1xuICBtb2RlPzogTUxJbnRlcnBvbGF0aW9uTW9kZTtcbiAgc2NhbGVzPzogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG4gIHNpemVzPzogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG59XG5cbi8qKlxuICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZGljdGRlZi1tbHNsaWNlb3B0aW9ucylcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNTFNsaWNlT3B0aW9ucyB7XG4gIGF4ZXM/OiBudW1iZXJbXTtcbn1cblxuLyoqXG4gKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkaWN0ZGVmLW1sc3BsaXRvcHRpb25zKVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1MU3BsaXRPcHRpb25zIHtcbiAgYXhpcz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkaWN0ZGVmLW1sc3F1ZWV6ZW9wdGlvbnMpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTUxTcXVlZXplT3B0aW9ucyB7XG4gIGF4ZXM/OiBudW1iZXJbXTtcbn1cblxuLyoqXG4gKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkaWN0ZGVmLW1sdHJhbnNwb3Nlb3B0aW9ucylcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNTFRyYW5zcG9zZU9wdGlvbnMge1xuICBwZXJtdXRhdGlvbj86IG51bWJlcltdO1xufVxuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI3R5cGVkZWZkZWYtbWxuYW1lZG9wZXJhbmRzKVxuICovXG5leHBvcnQgdHlwZSBNTE5hbWVkT3BlcmFuZHMgPSBSZWNvcmQ8c3RyaW5nLCBNTE9wZXJhbmQ+O1xuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RpY3RkZWYtbWxidWZmZXJyZXNvdXJjZXZpZXcpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTUxCdWZmZXJSZXNvdXJjZVZpZXcge1xuICByZXNvdXJjZTogV2ViR0xCdWZmZXI7XG4gIG9mZnNldD86IG51bWJlcjtcbiAgc2l6ZT86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyN0eXBlZGVmZGVmLW1sYnVmZmVydmlldylcbiAqL1xuZXhwb3J0IHR5cGUgTUxCdWZmZXJWaWV3ID0gQXJyYXlCdWZmZXJWaWV3fE1MQnVmZmVyUmVzb3VyY2VWaWV3O1xuXG4vKipcbiAqIFtzcGVjXShoaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNhcGktbWxncmFwaGJ1aWxkZXIpXG4gKi9cbmV4cG9ydCBjbGFzcyBNTEdyYXBoQnVpbGRlciB7XG4gIHByaXZhdGUgY29udGV4dF86IE1MQ29udGV4dDtcblxuICBjb25zdHJ1Y3Rvcihjb250ZXh0OiBNTENvbnRleHQpIHtcbiAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgIGNvbnRleHQgaW5zdGFuY2VvZiBNTENvbnRleHQsICdUaGUgY29udGV4dCBwYXJhbXRlciBpcyBpbnZhbGlkLicpO1xuICAgIHRoaXMuY29udGV4dF8gPSBjb250ZXh0O1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXQgY29udGV4dCgpOiBNTENvbnRleHQge1xuICAgIHJldHVybiB0aGlzLmNvbnRleHRfO1xuICB9XG5cbiAgLyoqXG4gICAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RvbS1tbGdyYXBoYnVpbGRlci1idWlsZClcbiAgICovXG4gIGJ1aWxkKG91dHB1dHM6IE1MTmFtZWRPcGVyYW5kcyk6IE1MR3JhcGgge1xuICAgIHJldHVybiBNTEdyYXBoLmJ1aWxkQW5kQ29tcGlsZShvdXRwdXRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkb20tbWxncmFwaGJ1aWxkZXItaW5wdXQpXG4gICAqL1xuICBpbnB1dChuYW1lOiBzdHJpbmcsIGRlc2M6IE1MT3BlcmFuZERlc2NyaXB0b3IpOiBNTE9wZXJhbmQge1xuICAgIHJldHVybiBuZXcgSW5wdXRPcGVyYW5kKG5hbWUsIGRlc2MsIHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RvbS1tbGdyYXBoYnVpbGRlci1jb25zdGFudClcbiAgICovXG4gIGNvbnN0YW50KGRlc2M6IE1MT3BlcmFuZERlc2NyaXB0b3IsIGJ1ZmZlclZpZXc6IE1MQnVmZmVyVmlldyk6IE1MT3BlcmFuZDtcbiAgLyoqXG4gICAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RvbS1tbGdyYXBoYnVpbGRlci1jb25zdGFudC12YWx1ZS10eXBlKVxuICAgKi9cbiAgY29uc3RhbnQodmFsdWU6IG51bWJlciwgdHlwZT86IE1MT3BlcmFuZFR5cGUpOiBNTE9wZXJhbmQ7XG4gIGNvbnN0YW50KFxuICAgICAgZGVzY09yVmFsdWU6IE1MT3BlcmFuZERlc2NyaXB0b3J8bnVtYmVyLFxuICAgICAgdmFsdWVPclR5cGU6IE1MQnVmZmVyVmlld3xNTE9wZXJhbmRUeXBlKTogQ29uc3RhbnRPcGVyYW5kIHtcbiAgICBpZiAodHlwZW9mIGRlc2NPclZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgaWYgKHZhbHVlT3JUeXBlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmFsdWVPclR5cGUgPSBNTE9wZXJhbmRUeXBlLmZsb2F0MzI7XG4gICAgICB9XG4gICAgICByZXR1cm4gQ29uc3RhbnRPcGVyYW5kLmNyZWF0ZVNjYWxhcihcbiAgICAgICAgICBkZXNjT3JWYWx1ZSwgdmFsdWVPclR5cGUgYXMgTUxPcGVyYW5kVHlwZSwgdGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBDb25zdGFudE9wZXJhbmQuY3JlYXRlVGVuc29yKFxuICAgICAgICAgIGRlc2NPclZhbHVlLCB2YWx1ZU9yVHlwZSBhcyBNTEJ1ZmZlclZpZXcsIHRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkb20tbWxncmFwaGJ1aWxkZXItYmF0Y2hub3JtYWxpemF0aW9uKVxuICAgKi9cbiAgYmF0Y2hOb3JtYWxpemF0aW9uKFxuICAgICAgaW5wdXQ6IE1MT3BlcmFuZCwgbWVhbjogTUxPcGVyYW5kLCB2YXJpYW5jZTogTUxPcGVyYW5kLFxuICAgICAgb3B0aW9uczogTUxCYXRjaE5vcm1hbGl6YXRpb25PcHRpb25zID0ge30pOiBNTE9wZXJhbmQge1xuICAgIHRoaXMudmFsaWRhdGVPcGVyYW5kQnVpbGRlcihcbiAgICAgICAgW2lucHV0LCBtZWFuLCB2YXJpYW5jZSwgb3B0aW9ucy5zY2FsZSwgb3B0aW9ucy5iaWFzXSk7XG4gICAgcmV0dXJuIChuZXcgQmF0Y2hOb3JtYWxpemF0aW9uKGlucHV0LCBtZWFuLCB2YXJpYW5jZSwgb3B0aW9ucykpXG4gICAgICAgIC5nZXRGdXNlZE91dHB1dHMoKVswXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkb20tbWxncmFwaGJ1aWxkZXItY2xhbXApXG4gICAqL1xuICBjbGFtcCh4OiBNTE9wZXJhbmQsIG9wdGlvbnM6IE1MQ2xhbXBPcHRpb25zKTogTUxPcGVyYW5kO1xuICBjbGFtcChvcHRpb25zOiBNTENsYW1wT3B0aW9ucyk6IE1MT3BlcmF0b3I7XG4gIGNsYW1wKFxuICAgICAgb3BlcmFuZE9yT3B0aW9uczogTUxPcGVyYW5kfE1MQ2xhbXBPcHRpb25zID0ge30sXG4gICAgICBvcHRpb25zOiBNTENsYW1wT3B0aW9ucyA9IHt9KTogTUxPcGVyYW5kfE1MT3BlcmF0b3Ige1xuICAgIGlmIChvcGVyYW5kT3JPcHRpb25zIGluc3RhbmNlb2YgTUxPcGVyYW5kKSB7XG4gICAgICBjb25zdCB4ID0gb3BlcmFuZE9yT3B0aW9ucztcbiAgICAgIHRoaXMudmFsaWRhdGVPcGVyYW5kQnVpbGRlcihbeCwgb3B0aW9ucy5taW5WYWx1ZSwgb3B0aW9ucy5tYXhWYWx1ZV0pO1xuICAgICAgcmV0dXJuIChuZXcgQ2xhbXAoeCwgb3B0aW9ucykpLm91dHB1dDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IG9wZXJhbmRPck9wdGlvbnM7XG4gICAgICB0aGlzLnZhbGlkYXRlT3BlcmFuZEJ1aWxkZXIoW29wdGlvbnMubWluVmFsdWUsIG9wdGlvbnMubWF4VmFsdWVdKTtcbiAgICAgIHJldHVybiAobmV3IENsYW1wKHVuZGVmaW5lZCwgb3B0aW9ucykpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkb20tbWxncmFwaGJ1aWxkZXItY29uY2F0KVxuICAgKi9cbiAgY29uY2F0KGlucHV0czogTUxPcGVyYW5kW10sIGF4aXM6IG51bWJlcik6IE1MT3BlcmFuZCB7XG4gICAgdGhpcy52YWxpZGF0ZU9wZXJhbmRCdWlsZGVyKGlucHV0cyk7XG4gICAgcmV0dXJuIChuZXcgQ29uY2F0KGlucHV0cywgYXhpcykpLm91dHB1dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkb20tbWxncmFwaGJ1aWxkZXItY29udjJkKVxuICAgKi9cbiAgY29udjJkKGlucHV0OiBNTE9wZXJhbmQsIGZpbHRlcjogTUxPcGVyYW5kLCBvcHRpb25zOiBNTENvbnYyZE9wdGlvbnMgPSB7fSk6XG4gICAgICBNTE9wZXJhbmQge1xuICAgIGNvbnN0IGlucHV0cyA9IFtpbnB1dCwgZmlsdGVyXTtcbiAgICBpZiAob3B0aW9ucy5iaWFzKSB7XG4gICAgICBpbnB1dHMucHVzaChvcHRpb25zLmJpYXMpO1xuICAgIH1cbiAgICB0aGlzLnZhbGlkYXRlT3BlcmFuZEJ1aWxkZXIoaW5wdXRzKTtcbiAgICByZXR1cm4gKG5ldyBDb252MmQoaW5wdXQsIGZpbHRlciwgb3B0aW9ucykpLmdldEZ1c2VkT3V0cHV0cygpWzBdO1xuICB9XG5cbiAgLy8gc3RhcnQgb2YgZWxlbWVudC13aXNlIGJpbmFyeSBvcGVyYXRpb25zXG4gIC8vIGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jYXBpLW1sZ3JhcGhidWlsZGVyLWJpbmFyeVxuICAvKipcbiAgICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZG9tLW1sZ3JhcGhidWlsZGVyLWFkZClcbiAgICovXG4gIGFkZChhOiBNTE9wZXJhbmQsIGI6IE1MT3BlcmFuZCk6IE1MT3BlcmFuZCB7XG4gICAgdGhpcy52YWxpZGF0ZU9wZXJhbmRCdWlsZGVyKFthLCBiXSk7XG4gICAgcmV0dXJuIChuZXcgQWRkKGEsIGIpKS5vdXRwdXQ7XG4gIH1cblxuICAvKipcbiAgICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZG9tLW1sZ3JhcGhidWlsZGVyLXN1YilcbiAgICovXG4gIHN1YihhOiBNTE9wZXJhbmQsIGI6IE1MT3BlcmFuZCk6IE1MT3BlcmFuZCB7XG4gICAgdGhpcy52YWxpZGF0ZU9wZXJhbmRCdWlsZGVyKFthLCBiXSk7XG4gICAgcmV0dXJuIChuZXcgU3ViKGEsIGIpKS5vdXRwdXQ7XG4gIH1cblxuICAvKipcbiAgICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZG9tLW1sZ3JhcGhidWlsZGVyLW11bClcbiAgICovXG4gIG11bChhOiBNTE9wZXJhbmQsIGI6IE1MT3BlcmFuZCk6IE1MT3BlcmFuZCB7XG4gICAgdGhpcy52YWxpZGF0ZU9wZXJhbmRCdWlsZGVyKFthLCBiXSk7XG4gICAgcmV0dXJuIChuZXcgTXVsKGEsIGIpKS5vdXRwdXQ7XG4gIH1cblxuICAvKipcbiAgICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZG9tLW1sZ3JhcGhidWlsZGVyLWRpdilcbiAgICovXG4gIGRpdihhOiBNTE9wZXJhbmQsIGI6IE1MT3BlcmFuZCk6IE1MT3BlcmFuZCB7XG4gICAgdGhpcy52YWxpZGF0ZU9wZXJhbmRCdWlsZGVyKFthLCBiXSk7XG4gICAgcmV0dXJuIChuZXcgRGl2KGEsIGIpKS5vdXRwdXQ7XG4gIH1cblxuICAvKipcbiAgICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZG9tLW1sZ3JhcGhidWlsZGVyLW1heClcbiAgICovXG4gIG1heChhOiBNTE9wZXJhbmQsIGI6IE1MT3BlcmFuZCk6IE1MT3BlcmFuZCB7XG4gICAgdGhpcy52YWxpZGF0ZU9wZXJhbmRCdWlsZGVyKFthLCBiXSk7XG4gICAgcmV0dXJuIChuZXcgTWF4KGEsIGIpKS5vdXRwdXQ7XG4gIH1cblxuICAvKipcbiAgICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZG9tLW1sZ3JhcGhidWlsZGVyLW1pbilcbiAgICovXG4gIG1pbihhOiBNTE9wZXJhbmQsIGI6IE1MT3BlcmFuZCk6IE1MT3BlcmFuZCB7XG4gICAgdGhpcy52YWxpZGF0ZU9wZXJhbmRCdWlsZGVyKFthLCBiXSk7XG4gICAgcmV0dXJuIChuZXcgTWluKGEsIGIpKS5vdXRwdXQ7XG4gIH1cblxuICAvKipcbiAgICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZG9tLW1sZ3JhcGhidWlsZGVyLXBvdylcbiAgICpcbiAgICovXG4gIHBvdyhhOiBNTE9wZXJhbmQsIGI6IE1MT3BlcmFuZCk6IE1MT3BlcmFuZCB7XG4gICAgdGhpcy52YWxpZGF0ZU9wZXJhbmRCdWlsZGVyKFthLCBiXSk7XG4gICAgcmV0dXJuIChuZXcgUG93KGEsIGIpKS5vdXRwdXQ7XG4gIH1cbiAgLy8gZW5kIG9mIGVsZW1lbnQtd2lzZSBiaW5hcnkgb3BlcmF0aW9uc1xuXG4gIC8vIHN0YXJ0IG9mIGVsZW1lbnQtd2lzZSB1bmFyeSBvcGVyYXRpb25zXG4gIC8vIGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZG9tLW1sZ3JhcGhidWlsZGVyLXVuYXJ5XG4gIC8qKlxuICAgKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkb20tbWxncmFwaGJ1aWxkZXItZXhwKVxuICAgKi9cbiAgZXhwKHg6IE1MT3BlcmFuZCk6IE1MT3BlcmFuZCB7XG4gICAgdGhpcy52YWxpZGF0ZU9wZXJhbmRCdWlsZGVyKFt4XSk7XG4gICAgcmV0dXJuIChuZXcgRXhwKHgpKS5vdXRwdXQ7XG4gIH1cblxuICAvKipcbiAgICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZG9tLW1sZ3JhcGhidWlsZGVyLXJlbHUpXG4gICAqL1xuICByZWx1KGlucHV0OiBNTE9wZXJhbmQpOiBNTE9wZXJhbmQ7XG4gIHJlbHUoKTogTUxPcGVyYXRvcjtcbiAgcmVsdShpbnB1dDogTUxPcGVyYW5kID0gdW5kZWZpbmVkKTogTUxPcGVyYW5kfE1MT3BlcmF0b3Ige1xuICAgIGlmIChpbnB1dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gbmV3IFJlbHUodW5kZWZpbmVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52YWxpZGF0ZU9wZXJhbmRCdWlsZGVyKFtpbnB1dF0pO1xuICAgICAgcmV0dXJuIChuZXcgUmVsdShpbnB1dCkpLm91dHB1dDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZG9tLW1sZ3JhcGhidWlsZGVyLXNpZ21vaWQpXG4gICAqL1xuICBzaWdtb2lkKGlucHV0OiBNTE9wZXJhbmQpOiBNTE9wZXJhbmQ7XG4gIHNpZ21vaWQoKTogTUxPcGVyYXRvcjtcbiAgc2lnbW9pZChpbnB1dDogTUxPcGVyYW5kID0gdW5kZWZpbmVkKTogTUxPcGVyYW5kfE1MT3BlcmF0b3Ige1xuICAgIGlmIChpbnB1dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gbmV3IFNpZ21vaWQodW5kZWZpbmVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52YWxpZGF0ZU9wZXJhbmRCdWlsZGVyKFtpbnB1dF0pO1xuICAgICAgcmV0dXJuIChuZXcgU2lnbW9pZChpbnB1dCkpLm91dHB1dDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZG9tLW1sZ3JhcGhidWlsZGVyLXRhbmgpXG4gICAqL1xuICB0YW5oKGlucHV0OiBNTE9wZXJhbmQpOiBNTE9wZXJhbmQ7XG4gIHRhbmgoKTogTUxPcGVyYXRvcjtcbiAgdGFuaChpbnB1dDogTUxPcGVyYW5kID0gdW5kZWZpbmVkKTogTUxPcGVyYW5kfE1MT3BlcmF0b3Ige1xuICAgIGlmIChpbnB1dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gbmV3IFRhbmgodW5kZWZpbmVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52YWxpZGF0ZU9wZXJhbmRCdWlsZGVyKFtpbnB1dF0pO1xuICAgICAgcmV0dXJuIChuZXcgVGFuaChpbnB1dCkpLm91dHB1dDtcbiAgICB9XG4gIH1cbiAgLy8gZW5kIG9mIGVsZW1lbnQtd2lzZSB1bmFyeSBvcGVyYXRpb25zXG5cbiAgLyoqXG4gICAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RvbS1tbGdyYXBoYnVpbGRlci1nZW1tKVxuICAgKi9cbiAgZ2VtbShhOiBNTE9wZXJhbmQsIGI6IE1MT3BlcmFuZCwgb3B0aW9uczogTUxHZW1tT3B0aW9ucyA9IHt9KTogTUxPcGVyYW5kIHtcbiAgICB0aGlzLnZhbGlkYXRlT3BlcmFuZEJ1aWxkZXIoW2EsIGIsIG9wdGlvbnMuY10pO1xuICAgIHJldHVybiBHZW1tLmJ1aWxkKHRoaXMsIGEsIGIsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RvbS1tbGdyYXBoYnVpbGRlci1ncnUpXG4gICAqL1xuICBncnUoaW5wdXQ6IE1MT3BlcmFuZCwgd2VpZ2h0OiBNTE9wZXJhbmQsIHJlY3VycmVudFdlaWdodDogTUxPcGVyYW5kLFxuICAgICAgc3RlcHM6IG51bWJlciwgaGlkZGVuU2l6ZTogbnVtYmVyLFxuICAgICAgb3B0aW9uczogTUxHcnVPcHRpb25zID0ge30pOiBNTE9wZXJhbmRbXSB7XG4gICAgdGhpcy52YWxpZGF0ZU9wZXJhbmRCdWlsZGVyKFtcbiAgICAgIGlucHV0LCB3ZWlnaHQsIHJlY3VycmVudFdlaWdodCwgb3B0aW9ucy5iaWFzLCBvcHRpb25zLnJlY3VycmVudEJpYXMsXG4gICAgICBvcHRpb25zLmluaXRpYWxIaWRkZW5TdGF0ZVxuICAgIF0pO1xuICAgIHJldHVybiAobmV3IEdydShpbnB1dCwgd2VpZ2h0LCByZWN1cnJlbnRXZWlnaHQsIHN0ZXBzLCBoaWRkZW5TaXplLCBvcHRpb25zKSlcbiAgICAgICAgLm91dHB1dHM7XG4gIH1cblxuICAvKipcbiAgICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZG9tLW1sZ3JhcGhidWlsZGVyLWdydWNlbGwpXG4gICAqL1xuICBncnVDZWxsKFxuICAgICAgaW5wdXQ6IE1MT3BlcmFuZCwgd2VpZ2h0OiBNTE9wZXJhbmQsIHJlY3VycmVudFdlaWdodDogTUxPcGVyYW5kLFxuICAgICAgaGlkZGVuU3RhdGU6IE1MT3BlcmFuZCwgaGlkZGVuU2l6ZTogbnVtYmVyLFxuICAgICAgb3B0aW9uczogTUxHcnVDZWxsT3B0aW9ucyA9IHt9KTogTUxPcGVyYW5kIHtcbiAgICB0aGlzLnZhbGlkYXRlT3BlcmFuZEJ1aWxkZXIoW1xuICAgICAgaW5wdXQsIHdlaWdodCwgcmVjdXJyZW50V2VpZ2h0LCBoaWRkZW5TdGF0ZSwgb3B0aW9ucy5iaWFzLFxuICAgICAgb3B0aW9ucy5yZWN1cnJlbnRCaWFzXG4gICAgXSk7XG4gICAgcmV0dXJuIChuZXcgR3J1Q2VsbChcbiAgICAgICAgICAgICAgICBpbnB1dCwgd2VpZ2h0LCByZWN1cnJlbnRXZWlnaHQsIGhpZGRlblN0YXRlLCBoaWRkZW5TaXplLFxuICAgICAgICAgICAgICAgIG9wdGlvbnMpKVxuICAgICAgICAub3V0cHV0O1xuICB9XG5cbiAgLyoqXG4gICAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2FwaS1tbGdyYXBoYnVpbGRlci1pbnN0YW5jZW5vcm0pXG4gICAqL1xuICBpbnN0YW5jZU5vcm1hbGl6YXRpb24oXG4gICAgICBpbnB1dDogTUxPcGVyYW5kLFxuICAgICAgb3B0aW9uczogTUxJbnN0YW5jZU5vcm1hbGl6YXRpb25PcHRpb25zID0ge30pOiBNTE9wZXJhbmQge1xuICAgIHRoaXMudmFsaWRhdGVPcGVyYW5kQnVpbGRlcihbaW5wdXQsIG9wdGlvbnMuYmlhcywgb3B0aW9ucy5zY2FsZV0pO1xuICAgIHJldHVybiAobmV3IEluc3RhbmNlTm9ybWFsaXphdGlvbihpbnB1dCwgb3B0aW9ucykpLm91dHB1dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkb20tbWxncmFwaGJ1aWxkZXItbGVha3lyZWx1KVxuICAgKi9cbiAgbGVha3lSZWx1KHg6IE1MT3BlcmFuZCwgb3B0aW9uczogTUxMZWFreVJlbHVPcHRpb25zKTogTUxPcGVyYW5kO1xuICBsZWFreVJlbHUob3B0aW9uczogTUxMZWFreVJlbHVPcHRpb25zKTogTUxPcGVyYXRvcjtcbiAgbGVha3lSZWx1KFxuICAgICAgb3BlcmFuZE9yT3B0aW9uczogTUxPcGVyYW5kfE1MTGVha3lSZWx1T3B0aW9ucyA9IHt9LFxuICAgICAgb3B0aW9uczogTUxMZWFreVJlbHVPcHRpb25zID0ge30pOiBNTE9wZXJhbmR8TUxPcGVyYXRvciB7XG4gICAgaWYgKG9wZXJhbmRPck9wdGlvbnMgaW5zdGFuY2VvZiBNTE9wZXJhbmQpIHtcbiAgICAgIGNvbnN0IHggPSBvcGVyYW5kT3JPcHRpb25zO1xuICAgICAgdGhpcy52YWxpZGF0ZU9wZXJhbmRCdWlsZGVyKFt4XSk7XG4gICAgICByZXR1cm4gKG5ldyBMZWFreVJlbHUoeCwgb3B0aW9ucy5hbHBoYSkpLm91dHB1dDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IG9wZXJhbmRPck9wdGlvbnM7XG4gICAgICByZXR1cm4gKG5ldyBMZWFreVJlbHUodW5kZWZpbmVkLCBvcHRpb25zLmFscGhhKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RvbS1tbGdyYXBoYnVpbGRlci1tYXRtdWwpXG4gICAqL1xuICBtYXRtdWwoYTogTUxPcGVyYW5kLCBiOiBNTE9wZXJhbmQpOiBNTE9wZXJhbmQge1xuICAgIHRoaXMudmFsaWRhdGVPcGVyYW5kQnVpbGRlcihbYSwgYl0pO1xuICAgIHJldHVybiAobmV3IE1hdE11bChhLCBiKSkub3V0cHV0O1xuICB9XG5cbiAgLyoqXG4gICAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2FwaS1tbGdyYXBoYnVpbGRlci1wYWQpXG4gICAqL1xuICBwYWQoaW5wdXQ6IE1MT3BlcmFuZCwgcGFkZGluZzogTUxPcGVyYW5kLFxuICAgICAgb3B0aW9uczogTUxQYWRPcHRpb25zID0ge30pOiBNTE9wZXJhbmQge1xuICAgIHRoaXMudmFsaWRhdGVPcGVyYW5kQnVpbGRlcihbaW5wdXQsIHBhZGRpbmddKTtcbiAgICByZXR1cm4gKG5ldyBQYWQoaW5wdXQsIHBhZGRpbmcsIG9wdGlvbnMpKS5vdXRwdXQ7XG4gIH1cblxuICAvLyBzdGFydCBvZiBwb29saW5nIG9wZXJhdGlvbnNcbiAgLy8gaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkb20tbWxncmFwaGJ1aWxkZXItcG9vbDJkXG4gIC8qKlxuICAgKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkb20tbWxncmFwaGJ1aWxkZXItYXZlcmFnZXBvb2wyZClcbiAgICovXG4gIGF2ZXJhZ2VQb29sMmQoaW5wdXQ6IE1MT3BlcmFuZCwgb3B0aW9uczogTUxQb29saW5nMmRPcHRpb25zID0ge30pOiBNTE9wZXJhbmQge1xuICAgIHRoaXMudmFsaWRhdGVPcGVyYW5kQnVpbGRlcihbaW5wdXRdKTtcbiAgICByZXR1cm4gKG5ldyBBdmVyYWdlUG9vbDJkKGlucHV0LCBvcHRpb25zKSkub3V0cHV0O1xuICB9XG5cbiAgLyoqXG4gICAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RvbS1tbGdyYXBoYnVpbGRlci1tYXhwb29sMmQpXG4gICAqL1xuICBtYXhQb29sMmQoaW5wdXQ6IE1MT3BlcmFuZCwgb3B0aW9uczogTUxQb29saW5nMmRPcHRpb25zID0ge30pOiBNTE9wZXJhbmQge1xuICAgIHRoaXMudmFsaWRhdGVPcGVyYW5kQnVpbGRlcihbaW5wdXRdKTtcbiAgICByZXR1cm4gKG5ldyBNYXhQb29sMmQoaW5wdXQsIG9wdGlvbnMpKS5vdXRwdXQ7XG4gIH1cbiAgLy8gZW5kIG9mIHBvb2xpbmcgb3BlcmF0aW9uc1xuXG4gIC8vIHN0YXJ0IG9mIHJlZHVjdGlvbiBvcGVyYXRpb25zXG4gIC8vIGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jYXBpLW1sZ3JhcGhidWlsZGVyLXJlZHVjZVxuICAvKipcbiAgICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZG9tLW1sZ3JhcGhidWlsZGVyLXJlZHVjZWxvZ3N1bWV4cClcbiAgICovXG4gIHJlZHVjZUxvZ1N1bUV4cChpbnB1dDogTUxPcGVyYW5kLCBvcHRpb25zOiBNTFJlZHVjZU9wdGlvbnMgPSB7fSk6IE1MT3BlcmFuZCB7XG4gICAgdGhpcy52YWxpZGF0ZU9wZXJhbmRCdWlsZGVyKFtpbnB1dF0pO1xuICAgIHJldHVybiAobmV3IFJlZHVjZUxvZ1N1bUV4cChpbnB1dCwgb3B0aW9ucykpLm91dHB1dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkb20tbWxncmFwaGJ1aWxkZXItcmVkdWNlbWF4KVxuICAgKi9cbiAgcmVkdWNlTWF4KGlucHV0OiBNTE9wZXJhbmQsIG9wdGlvbnM6IE1MUmVkdWNlT3B0aW9ucyA9IHt9KTogTUxPcGVyYW5kIHtcbiAgICB0aGlzLnZhbGlkYXRlT3BlcmFuZEJ1aWxkZXIoW2lucHV0XSk7XG4gICAgcmV0dXJuIChuZXcgUmVkdWNlTWF4KGlucHV0LCBvcHRpb25zKSkub3V0cHV0O1xuICB9XG5cbiAgLyoqXG4gICAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RvbS1tbGdyYXBoYnVpbGRlci1yZWR1Y2VtZWFuKVxuICAgKi9cbiAgcmVkdWNlTWVhbihpbnB1dDogTUxPcGVyYW5kLCBvcHRpb25zOiBNTFJlZHVjZU9wdGlvbnMgPSB7fSk6IE1MT3BlcmFuZCB7XG4gICAgdGhpcy52YWxpZGF0ZU9wZXJhbmRCdWlsZGVyKFtpbnB1dF0pO1xuICAgIHJldHVybiAobmV3IFJlZHVjZU1lYW4oaW5wdXQsIG9wdGlvbnMpKS5vdXRwdXQ7XG4gIH1cblxuICAvKipcbiAgICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZG9tLW1sZ3JhcGhidWlsZGVyLXJlZHVjZW1pbilcbiAgICovXG4gIHJlZHVjZU1pbihpbnB1dDogTUxPcGVyYW5kLCBvcHRpb25zOiBNTFJlZHVjZU9wdGlvbnMgPSB7fSk6IE1MT3BlcmFuZCB7XG4gICAgdGhpcy52YWxpZGF0ZU9wZXJhbmRCdWlsZGVyKFtpbnB1dF0pO1xuICAgIHJldHVybiAobmV3IFJlZHVjZU1pbihpbnB1dCwgb3B0aW9ucykpLm91dHB1dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkb20tbWxncmFwaGJ1aWxkZXItcmVkdWNlcHJvZHVjdClcbiAgICovXG4gIHJlZHVjZVByb2R1Y3QoaW5wdXQ6IE1MT3BlcmFuZCwgb3B0aW9uczogTUxSZWR1Y2VPcHRpb25zID0ge30pOiBNTE9wZXJhbmQge1xuICAgIHRoaXMudmFsaWRhdGVPcGVyYW5kQnVpbGRlcihbaW5wdXRdKTtcbiAgICByZXR1cm4gKG5ldyBSZWR1Y2VQcm9kdWN0KGlucHV0LCBvcHRpb25zKSkub3V0cHV0O1xuICB9XG5cbiAgLyoqXG4gICAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RvbS1tbGdyYXBoYnVpbGRlci1yZWR1Y2VzdW0pXG4gICAqL1xuICByZWR1Y2VTdW0oaW5wdXQ6IE1MT3BlcmFuZCwgb3B0aW9uczogTUxSZWR1Y2VPcHRpb25zID0ge30pOiBNTE9wZXJhbmQge1xuICAgIHRoaXMudmFsaWRhdGVPcGVyYW5kQnVpbGRlcihbaW5wdXRdKTtcbiAgICByZXR1cm4gKG5ldyBSZWR1Y2VTdW0oaW5wdXQsIG9wdGlvbnMpKS5vdXRwdXQ7XG4gIH1cbiAgLy8gZW5kIG9mIHJlZHVjdGlvbiBvcGVyYXRpb25zXG5cbiAgLyoqXG4gICAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2FwaS1tbGdyYXBoYnVpbGRlci1yZXNhbXBsZSlcbiAgICovXG4gIHJlc2FtcGxlKGlucHV0OiBNTE9wZXJhbmQsIG9wdGlvbnM6IE1MUmVzYW1wbGVPcHRpb25zID0ge30pOiBNTE9wZXJhbmQge1xuICAgIHRoaXMudmFsaWRhdGVPcGVyYW5kQnVpbGRlcihbaW5wdXRdKTtcbiAgICByZXR1cm4gKG5ldyBSZXNhbXBsZShpbnB1dCwgb3B0aW9ucykpLm91dHB1dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkb20tbWxncmFwaGJ1aWxkZXItcmVzaGFwZSlcbiAgICovXG4gIHJlc2hhcGUoaW5wdXQ6IE1MT3BlcmFuZCwgbmV3U2hhcGU6IG51bWJlcltdKTogTUxPcGVyYW5kIHtcbiAgICB0aGlzLnZhbGlkYXRlT3BlcmFuZEJ1aWxkZXIoW2lucHV0XSk7XG4gICAgcmV0dXJuIChuZXcgUmVzaGFwZShpbnB1dCwgbmV3U2hhcGUpKS5vdXRwdXQ7XG4gIH1cblxuICAvKipcbiAgICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZG9tLW1sZ3JhcGhidWlsZGVyLXNsaWNlKVxuICAgKi9cbiAgc2xpY2UoXG4gICAgICBpbnB1dDogTUxPcGVyYW5kLCBzdGFydHM6IG51bWJlcltdLCBzaXplczogbnVtYmVyW10sXG4gICAgICBvcHRpb25zOiBNTFNsaWNlT3B0aW9ucyA9IHt9KTogTUxPcGVyYW5kIHtcbiAgICB0aGlzLnZhbGlkYXRlT3BlcmFuZEJ1aWxkZXIoW2lucHV0XSk7XG4gICAgcmV0dXJuIChuZXcgU2xpY2UoaW5wdXQsIHN0YXJ0cywgc2l6ZXMsIG9wdGlvbnMuYXhlcykpLm91dHB1dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkb20tbWxncmFwaGJ1aWxkZXItc29mdG1heClcbiAgICovXG4gIHNvZnRtYXgoeDogTUxPcGVyYW5kKTogTUxPcGVyYW5kIHtcbiAgICB0aGlzLnZhbGlkYXRlT3BlcmFuZEJ1aWxkZXIoW3hdKTtcbiAgICByZXR1cm4gKG5ldyBTb2Z0bWF4KHgpKS5vdXRwdXQ7XG4gIH1cblxuICAvKipcbiAgICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZG9tLW1sZ3JhcGhidWlsZGVyLXNwbGl0KVxuICAgKi9cbiAgc3BsaXQoXG4gICAgICBpbnB1dDogTUxPcGVyYW5kLCBzcGxpdHM6IG51bWJlcnxudW1iZXJbXSxcbiAgICAgIG9wdGlvbnM6IE1MU3BsaXRPcHRpb25zID0ge30pOiBNTE9wZXJhbmRbXSB7XG4gICAgdGhpcy52YWxpZGF0ZU9wZXJhbmRCdWlsZGVyKFtpbnB1dF0pO1xuICAgIHJldHVybiAobmV3IFNwbGl0KGlucHV0LCBzcGxpdHMsIG9wdGlvbnMpKS5vdXRwdXRzO1xuICB9XG5cbiAgLyoqXG4gICAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2RvbS1tbGdyYXBoYnVpbGRlci1zcXVlZXplKVxuICAgKi9cbiAgc3F1ZWV6ZShpbnB1dDogTUxPcGVyYW5kLCBvcHRpb25zOiBNTFNxdWVlemVPcHRpb25zID0ge30pOiBNTE9wZXJhbmQge1xuICAgIHRoaXMudmFsaWRhdGVPcGVyYW5kQnVpbGRlcihbaW5wdXRdKTtcbiAgICByZXR1cm4gKG5ldyBTcXVlZXplKGlucHV0LCBvcHRpb25zLmF4ZXMpKS5vdXRwdXQ7XG4gIH1cblxuICAvKipcbiAgICogW3NwZWNdKGh0dHBzOi8vd2VibWFjaGluZWxlYXJuaW5nLmdpdGh1Yi5pby93ZWJubi8jZG9tLW1sZ3JhcGhidWlsZGVyLXRyYW5zcG9zZSlcbiAgICovXG4gIHRyYW5zcG9zZShpbnB1dDogTUxPcGVyYW5kLCBvcHRpb25zOiBNTFRyYW5zcG9zZU9wdGlvbnMgPSB7fSk6IE1MT3BlcmFuZCB7XG4gICAgdGhpcy52YWxpZGF0ZU9wZXJhbmRCdWlsZGVyKFtpbnB1dF0pO1xuICAgIHJldHVybiAobmV3IFRyYW5zcG9zZShpbnB1dCwgb3B0aW9ucy5wZXJtdXRhdGlvbikpLm91dHB1dDtcbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVPcGVyYW5kQnVpbGRlcihvcGVyYW5kczogTUxPcGVyYW5kW10pIHtcbiAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgIG9wZXJhbmRzLmV2ZXJ5KFxuICAgICAgICAgICAgb3BlcmFuZCA9PiBvcGVyYW5kID9cbiAgICAgICAgICAgICAgICAob3BlcmFuZCBpbnN0YW5jZW9mIE1MT3BlcmFuZCAmJiBvcGVyYW5kLmJ1aWxkZXIgPT09IHRoaXMpIDpcbiAgICAgICAgICAgICAgICB0cnVlKSxcbiAgICAgICAgJ1RoZSBvcGVyYW5kIGlzIG5vdCBidWlsdCBieSB0aGlzIGJ1aWxkZXIuJyk7XG4gIH1cbn1cbiIsImltcG9ydCB7TUxCdWZmZXJWaWV3LCBNTEdyYXBoQnVpbGRlcn0gZnJvbSAnLi9ncmFwaF9idWlsZGVyJztcbmltcG9ydCB7T3BlcmF0aW9ufSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQge0FycmF5QnVmZmVyVmlld30gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tICcuL3V0aWxzJztcblxuLyoqXG4gKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNlbnVtZGVmLW1sb3BlcmFuZHR5cGUpXG4gKi9cbmV4cG9ydCBlbnVtIE1MT3BlcmFuZFR5cGUge1xuICAnZmxvYXQzMicgPSAnZmxvYXQzMicsXG4gICdmbG9hdDE2JyA9ICdmbG9hdDE2JyxcbiAgJ2ludDMyJyA9ICdpbnQzMicsXG4gICd1aW50MzInID0gJ3VpbnQzMicsXG4gICdpbnQ4JyA9ICdpbnQ4JyxcbiAgJ3VpbnQ4JyA9ICd1aW50OCdcbn1cblxuLyoqXG4gKiBbc3BlY10oaHR0cHM6Ly93ZWJtYWNoaW5lbGVhcm5pbmcuZ2l0aHViLmlvL3dlYm5uLyNkaWN0ZGVmLW1sb3BlcmFuZGRlc2NyaXB0b3IpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTUxPcGVyYW5kRGVzY3JpcHRvciB7XG4gIHR5cGU6IE1MT3BlcmFuZFR5cGU7XG4gIGRpbWVuc2lvbnM6IG51bWJlcltdO1xufVxuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2FwaS1tbG9wZXJhbmQpXG4gKi9cbmV4cG9ydCBjbGFzcyBNTE9wZXJhbmQge1xuICBwcml2YXRlIHJlYWRvbmx5IGJ1aWxkZXJfOiBNTEdyYXBoQnVpbGRlcjtcblxuICAvKiogQGludGVybmFsICovXG4gIGdldCBidWlsZGVyKCk6IE1MR3JhcGhCdWlsZGVyIHtcbiAgICByZXR1cm4gdGhpcy5idWlsZGVyXztcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgY29uc3RydWN0b3IoYnVpbGRlcjogTUxHcmFwaEJ1aWxkZXIpIHtcbiAgICB0aGlzLmJ1aWxkZXJfID0gYnVpbGRlcjtcbiAgfVxufVxuXG4vKiogQGludGVybmFsICovXG5leHBvcnQgY2xhc3MgSW5wdXRPcGVyYW5kIGV4dGVuZHMgTUxPcGVyYW5kIHtcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICByZWFkb25seSBkZXNjOiBNTE9wZXJhbmREZXNjcmlwdG9yO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgbmFtZTogc3RyaW5nLCBkZXNjOiBNTE9wZXJhbmREZXNjcmlwdG9yLCBidWlsZGVyOiBNTEdyYXBoQnVpbGRlcikge1xuICAgIHN1cGVyKGJ1aWxkZXIpO1xuICAgIHV0aWxzLmFzc2VydCh0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycsICdUaGUgbmFtZSBwYXJhbWV0ZXIgaXMgaW52YWxpZCcpO1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdXRpbHMudmFsaWRhdGVPcGVyYW5kRGVzY3JpcHRvcihkZXNjKTtcbiAgICB0aGlzLmRlc2MgPSBkZXNjO1xuICB9XG59XG5cbi8qKiBAaW50ZXJuYWwgKi9cbmV4cG9ydCBjbGFzcyBDb25zdGFudE9wZXJhbmQgZXh0ZW5kcyBNTE9wZXJhbmQge1xuICByZWFkb25seSBkZXNjOiBNTE9wZXJhbmREZXNjcmlwdG9yO1xuICByZWFkb25seSB2YWx1ZTogbnVtYmVyfEFycmF5QnVmZmVyVmlldztcblxuICBzdGF0aWMgY3JlYXRlU2NhbGFyKFxuICAgICAgdmFsdWU6IG51bWJlciwgdHlwZTogTUxPcGVyYW5kVHlwZSA9IE1MT3BlcmFuZFR5cGUuZmxvYXQzMixcbiAgICAgIGJ1aWxkZXI6IE1MR3JhcGhCdWlsZGVyKTogQ29uc3RhbnRPcGVyYW5kIHtcbiAgICB1dGlscy5hc3NlcnQodHlwZSBpbiBNTE9wZXJhbmRUeXBlLCAnVGhlIG9wZXJhbmQgdHlwZSBpcyBpbnZhbGlkLicpO1xuICAgIHV0aWxzLnZhbGlkYXRlVmFsdWVUeXBlKHZhbHVlLCB0eXBlKTtcbiAgICByZXR1cm4gbmV3IENvbnN0YW50T3BlcmFuZCh7dHlwZX0gYXMgTUxPcGVyYW5kRGVzY3JpcHRvciwgdmFsdWUsIGJ1aWxkZXIpO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZVRlbnNvcihcbiAgICAgIGRlc2M6IE1MT3BlcmFuZERlc2NyaXB0b3IsIHZhbHVlOiBNTEJ1ZmZlclZpZXcsXG4gICAgICBidWlsZGVyOiBNTEdyYXBoQnVpbGRlcik6IENvbnN0YW50T3BlcmFuZCB7XG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICB1dGlscy5pc1R5cGVkQXJyYXkodmFsdWUpLFxuICAgICAgICAnT25seSBBcnJheUJ1ZmZlclZpZXcgdmFsdWUgdHlwZSBpcyBzdXBwb3J0ZWQuJyk7XG4gICAgY29uc3QgYXJyYXkgPSB2YWx1ZSBhcyBBcnJheUJ1ZmZlclZpZXc7XG4gICAgdXRpbHMudmFsaWRhdGVPcGVyYW5kRGVzY3JpcHRvcihkZXNjKTtcbiAgICB1dGlscy52YWxpZGF0ZVR5cGVkQXJyYXkoYXJyYXksIGRlc2MudHlwZSwgZGVzYy5kaW1lbnNpb25zKTtcbiAgICByZXR1cm4gbmV3IENvbnN0YW50T3BlcmFuZChkZXNjLCBhcnJheSwgYnVpbGRlcik7XG4gIH1cblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKFxuICAgICAgZGVzYzogTUxPcGVyYW5kRGVzY3JpcHRvciwgdmFsdWU6IG51bWJlcnxBcnJheUJ1ZmZlclZpZXcsXG4gICAgICBidWlsZGVyOiBNTEdyYXBoQnVpbGRlcikge1xuICAgIHN1cGVyKGJ1aWxkZXIpO1xuICAgIHRoaXMuZGVzYyA9IGRlc2M7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICB9XG59XG5cbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgT3V0cHV0T3BlcmFuZCBleHRlbmRzIE1MT3BlcmFuZCB7XG4gIHJlYWRvbmx5IG9wZXJhdGlvbjogT3BlcmF0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKG9wZXJhdGlvbjogT3BlcmF0aW9uKSB7XG4gICAgc3VwZXIob3BlcmF0aW9uLmJ1aWxkZXIpO1xuICAgIHRoaXMub3BlcmF0aW9uID0gb3BlcmF0aW9uO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyB0ZiBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge0V4ZWN1dGlvbkNvbnRleHR9IGZyb20gJy4vZ3JhcGgnO1xuaW1wb3J0IHtNTEdyYXBoQnVpbGRlcn0gZnJvbSAnLi9ncmFwaF9idWlsZGVyJztcbmltcG9ydCB7TUxPcGVyYW5kLCBPdXRwdXRPcGVyYW5kfSBmcm9tICcuL29wZXJhbmQnO1xuXG4vKipcbiAqIFtzcGVjXShodHRwczovL3dlYm1hY2hpbmVsZWFybmluZy5naXRodWIuaW8vd2Vibm4vI2FwaS1tbG9wZXJhdG9yKVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1MT3BlcmF0b3Ige1xuICAvKiogQGludGVybmFsICovXG4gIGFwcGx5KGlucHV0OiBNTE9wZXJhbmQpOiBPdXRwdXRPcGVyYW5kO1xuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcnVuT3AoeDogdGYuVGVuc29yKTogdGYuVGVuc29yO1xufVxuXG4vKiogQGludGVybmFsICovXG5leHBvcnQgaW50ZXJmYWNlIEZ1c2VkT3BlcmF0aW9uIHtcbiAgZ2V0RnVzZWRPdXRwdXRzKCk6IE91dHB1dE9wZXJhbmRbXTtcbn1cblxuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE9wZXJhdGlvbiB7XG4gIHByb3RlY3RlZCBidWlsZGVyXzogTUxHcmFwaEJ1aWxkZXI7XG4gIHByb3RlY3RlZCBvdXRwdXRzXzogT3V0cHV0T3BlcmFuZFtdID0gW107XG5cbiAgZ2V0IGJ1aWxkZXIoKTogTUxHcmFwaEJ1aWxkZXIge1xuICAgIHJldHVybiB0aGlzLmJ1aWxkZXJfO1xuICB9XG5cbiAgZ2V0IG91dHB1dHMoKTogT3V0cHV0T3BlcmFuZFtdIHtcbiAgICByZXR1cm4gdGhpcy5vdXRwdXRzXztcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKGJ1aWxkZXI6IE1MR3JhcGhCdWlsZGVyKSB7XG4gICAgdGhpcy5idWlsZGVyXyA9IGJ1aWxkZXI7XG4gIH1cblxuICBhYnN0cmFjdCBpbnB1dHMoKTogTUxPcGVyYW5kW107XG5cbiAgY29tcHV0ZShjb250ZXh0OiBFeGVjdXRpb25Db250ZXh0KTogdm9pZCB7XG4gICAgY29uc3QgaW5wdXRUZW5zb3JzOiBNYXA8TUxPcGVyYW5kLCB0Zi5UZW5zb3I+ID0gbmV3IE1hcCgpO1xuICAgIGZvciAoY29uc3QgaW5wdXRPcGVyYW5kIG9mIHRoaXMuaW5wdXRzKCkpIHtcbiAgICAgIGlucHV0VGVuc29ycy5zZXQoaW5wdXRPcGVyYW5kLCBjb250ZXh0LmdldFRlbnNvcihpbnB1dE9wZXJhbmQpKTtcbiAgICB9XG4gICAgY29uc3Qgb3V0cHV0VGVuc29ycyA9IHRmLnRpZHkoKCkgPT4gdGhpcy5jb21wdXRlSW1wbChpbnB1dFRlbnNvcnMpKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub3V0cHV0c18ubGVuZ3RoOyArK2kpIHtcbiAgICAgIGNvbnRleHQuc2V0T3V0cHV0VGVuc29yKHRoaXMub3V0cHV0c19baV0sIG91dHB1dFRlbnNvcnNbaV0pO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGlucHV0T3BlcmFuZCBvZiB0aGlzLmlucHV0cygpKSB7XG4gICAgICBjb250ZXh0LnJlbGVhc2VUZW5zb3IoaW5wdXRPcGVyYW5kKTtcbiAgICB9XG4gIH1cblxuICBhYnN0cmFjdCBjb21wdXRlSW1wbChpbnB1dFRlbnNvcnM6IE1hcDxNTE9wZXJhbmQsIHRmLlRlbnNvcj4pOiB0Zi5UZW5zb3JbXTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gIGRpc3Bvc2UoKTogdm9pZCB7fVxufVxuXG4vKiogQGludGVybmFsICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgU2luZ2xlT3V0cHV0T3BlcmF0aW9uIGV4dGVuZHMgT3BlcmF0aW9uIHtcbiAgY29uc3RydWN0b3IoYnVpbGRlcjogTUxHcmFwaEJ1aWxkZXIpIHtcbiAgICBzdXBlcihidWlsZGVyKTtcbiAgICBpZiAoYnVpbGRlcikge1xuICAgICAgdGhpcy5jcmVhdGVPdXRwdXQoKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlT3V0cHV0KCk6IHZvaWQge1xuICAgIC8vIE9wZXJhdGlvbiBwcm9kdWNlcyAxIG91dHB1dCBvcGVyYW5kIGJ5IGRlZmF1bHQuXG4gICAgdGhpcy5vdXRwdXRzXy5wdXNoKG5ldyBPdXRwdXRPcGVyYW5kKHRoaXMpKTtcbiAgfVxuXG4gIGdldCBvdXRwdXQoKTogT3V0cHV0T3BlcmFuZCB7XG4gICAgcmV0dXJuIHRoaXMub3V0cHV0c19bMF07XG4gIH1cblxuICBjb21wdXRlSW1wbChpbnB1dFRlbnNvcnM6IE1hcDxNTE9wZXJhbmQsIHRmLlRlbnNvcj4pOiB0Zi5UZW5zb3JbXSB7XG4gICAgcmV0dXJuIFt0aGlzLnJ1bihpbnB1dFRlbnNvcnMpXTtcbiAgfVxuXG4gIGFic3RyYWN0IHJ1bihpbnB1dFRlbnNvcnM6IE1hcDxNTE9wZXJhbmQsIHRmLlRlbnNvcj4pOiB0Zi5UZW5zb3I7XG59IiwiaW1wb3J0ICogYXMgdGYgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNTEJhdGNoTm9ybWFsaXphdGlvbk9wdGlvbnN9IGZyb20gJy4uL2dyYXBoX2J1aWxkZXInO1xuaW1wb3J0IHtNTE9wZXJhbmQsIE91dHB1dE9wZXJhbmR9IGZyb20gJy4uL29wZXJhbmQnO1xuaW1wb3J0IHtGdXNlZE9wZXJhdGlvbiwgTUxPcGVyYXRvciwgU2luZ2xlT3V0cHV0T3BlcmF0aW9ufSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi4vdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgQmF0Y2hOb3JtYWxpemF0aW9uIGV4dGVuZHMgU2luZ2xlT3V0cHV0T3BlcmF0aW9uIGltcGxlbWVudHNcbiAgICBGdXNlZE9wZXJhdGlvbiB7XG4gIHByaXZhdGUgaW5wdXRfOiBNTE9wZXJhbmQ7XG4gIHByaXZhdGUgbWVhbl86IE1MT3BlcmFuZDtcbiAgcHJpdmF0ZSB2YXJpYW5jZV86IE1MT3BlcmFuZDtcbiAgcHJpdmF0ZSBzY2FsZV8/OiBNTE9wZXJhbmQ7XG4gIHByaXZhdGUgYmlhc18/OiBNTE9wZXJhbmQ7XG4gIHByaXZhdGUgYXhpc18/OiBudW1iZXI7XG4gIHByaXZhdGUgZXBzaWxvbl8/OiBudW1iZXI7XG4gIHByaXZhdGUgYWN0aXZhdGlvbl8/OiBNTE9wZXJhdG9yO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgaW5wdXQ6IE1MT3BlcmFuZCwgbWVhbjogTUxPcGVyYW5kLCB2YXJpYW5jZTogTUxPcGVyYW5kLFxuICAgICAgb3B0aW9uczogTUxCYXRjaE5vcm1hbGl6YXRpb25PcHRpb25zID0ge30pIHtcbiAgICBzdXBlcihpbnB1dC5idWlsZGVyKTtcbiAgICB1dGlscy52YWxpZGF0ZU9wZXJhbmQoaW5wdXQpO1xuICAgIHRoaXMuaW5wdXRfID0gaW5wdXQ7XG4gICAgdXRpbHMudmFsaWRhdGVPcGVyYW5kKG1lYW4pO1xuICAgIHRoaXMubWVhbl8gPSBtZWFuO1xuICAgIHV0aWxzLnZhbGlkYXRlT3BlcmFuZCh2YXJpYW5jZSk7XG4gICAgdGhpcy52YXJpYW5jZV8gPSB2YXJpYW5jZTtcbiAgICB1dGlscy52YWxpZGF0ZU9wdGlvbmFsT3BlcmFuZChvcHRpb25zLnNjYWxlKTtcbiAgICB0aGlzLnNjYWxlXyA9IG9wdGlvbnMuc2NhbGU7XG4gICAgdXRpbHMudmFsaWRhdGVPcHRpb25hbE9wZXJhbmQob3B0aW9ucy5iaWFzKTtcbiAgICB0aGlzLmJpYXNfID0gb3B0aW9ucy5iaWFzO1xuICAgIGlmIChvcHRpb25zLmF4aXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgYXhpcyA9IG9wdGlvbnMuYXhpcztcbiAgICAgIHV0aWxzLmFzc2VydCh1dGlscy5pc0ludGVnZXIoYXhpcyksICdUaGUgYXhpcyBwYXJhbWV0ZXIgaXMgaW52YWxpZC4nKTtcbiAgICAgIHRoaXMuYXhpc18gPSBheGlzO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmF4aXNfID0gMTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuZXBzaWxvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBlcHNpbG9uID0gb3B0aW9ucy5lcHNpbG9uO1xuICAgICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICAgIHR5cGVvZiBlcHNpbG9uID09PSAnbnVtYmVyJywgJ1RoZSBlcHNpbG9uIHBhcmFtZXRlciBpcyBpbnZhbGlkJyk7XG4gICAgICB0aGlzLmVwc2lsb25fID0gZXBzaWxvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lcHNpbG9uXyA9IDFlLTU7XG4gICAgfVxuICAgIHRoaXMuYWN0aXZhdGlvbl8gPSBvcHRpb25zLmFjdGl2YXRpb247XG4gIH1cblxuICBpbnB1dHMoKTogTUxPcGVyYW5kW10ge1xuICAgIGNvbnN0IGlucHV0czogTUxPcGVyYW5kW10gPSBbdGhpcy5pbnB1dF8sIHRoaXMubWVhbl8sIHRoaXMudmFyaWFuY2VfXTtcbiAgICBpZiAodGhpcy5zY2FsZV8pIHtcbiAgICAgIGlucHV0cy5wdXNoKHRoaXMuc2NhbGVfKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuYmlhc18pIHtcbiAgICAgIGlucHV0cy5wdXNoKHRoaXMuYmlhc18pO1xuICAgIH1cbiAgICByZXR1cm4gaW5wdXRzO1xuICB9XG5cbiAgZ2V0RnVzZWRPdXRwdXRzKCk6IE91dHB1dE9wZXJhbmRbXSB7XG4gICAgaWYgKHRoaXMuYWN0aXZhdGlvbl8pIHtcbiAgICAgIHJldHVybiBbdGhpcy5hY3RpdmF0aW9uXy5hcHBseSh0aGlzLm91dHB1dCldO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gW3RoaXMub3V0cHV0XTtcbiAgICB9XG4gIH1cblxuICBydW4oaW5wdXRUZW5zb3JzOiBNYXA8TUxPcGVyYW5kLCB0Zi5UZW5zb3I+KTogdGYuVGVuc29yIHtcbiAgICBjb25zdCBpbnB1dDogdGYuVGVuc29yID0gaW5wdXRUZW5zb3JzLmdldCh0aGlzLmlucHV0Xyk7XG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICB0aGlzLmF4aXNfIDwgaW5wdXQucmFuayAmJiB0aGlzLmF4aXNfID49IC1pbnB1dC5yYW5rLFxuICAgICAgICAnVGhlIGF4aXMgcGFyYW1ldGVyIGlzIGludmFsaWQuJyk7XG4gICAgY29uc3QgYXhpcyA9IHRoaXMuYXhpc18gPj0gMCA/IHRoaXMuYXhpc18gOiBpbnB1dC5yYW5rICsgdGhpcy5heGlzXztcbiAgICBjb25zdCBtZWFuOiB0Zi5UZW5zb3IgPSBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMubWVhbl8pO1xuICAgIHV0aWxzLmFzc2VydChtZWFuLnJhbmsgPT09IDEsICdUaGUgbWVhbiBvcGVyYW5kIGlzIG5vdCAxLUQuJyk7XG4gICAgY29uc3QgdmFyaWFuY2U6IHRmLlRlbnNvciA9IGlucHV0VGVuc29ycy5nZXQodGhpcy52YXJpYW5jZV8pO1xuICAgIHV0aWxzLmFzc2VydCh2YXJpYW5jZS5yYW5rID09PSAxLCAnVGhlIG1lYW4gb3BlcmFuZCBpcyBub3QgMS1ELicpO1xuICAgIGxldCBzY2FsZTogdGYuVGVuc29yO1xuICAgIGlmICh0aGlzLnNjYWxlXykge1xuICAgICAgc2NhbGUgPSBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMuc2NhbGVfKTtcbiAgICAgIHV0aWxzLmFzc2VydChzY2FsZS5yYW5rID09PSAxLCAnVGhlIHNjYWxlIG9wZXJhbmQgaXMgbm90IDEtRC4nKTtcbiAgICB9XG4gICAgbGV0IGJpYXM6IHRmLlRlbnNvcjtcbiAgICBpZiAodGhpcy5iaWFzXykge1xuICAgICAgYmlhcyA9IGlucHV0VGVuc29ycy5nZXQodGhpcy5iaWFzXyk7XG4gICAgICB1dGlscy5hc3NlcnQoYmlhcy5yYW5rID09PSAxLCAnVGhlIGJpYXMgb3BlcmFuZCBpcyBub3QgMS1ELicpO1xuICAgIH1cbiAgICAvLyB0Zi5iYXRjaE5vcm0gb25seSBjb21wdXRlcyBmb3IgdGhlIGxhc3QgZGltZW5zaW9uLlxuICAgIGNvbnN0IHBlcm11dGF0aW9uID0gQXJyYXkuZnJvbShBcnJheShpbnB1dC5yYW5rKS5rZXlzKCkpO1xuICAgIHBlcm11dGF0aW9uW2F4aXNdID0gaW5wdXQucmFuayAtIDE7XG4gICAgcGVybXV0YXRpb25baW5wdXQucmFuayAtIDFdID0gYXhpcztcbiAgICByZXR1cm4gdGYudHJhbnNwb3NlKFxuICAgICAgICB0Zi5iYXRjaE5vcm0oXG4gICAgICAgICAgICB0Zi50cmFuc3Bvc2UoaW5wdXQsIHBlcm11dGF0aW9uKSwgbWVhbiwgdmFyaWFuY2UsIGJpYXMsIHNjYWxlLFxuICAgICAgICAgICAgdGhpcy5lcHNpbG9uXyksXG4gICAgICAgIHBlcm11dGF0aW9uKTtcbiAgfVxufSIsImltcG9ydCAqIGFzIHRmIGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TUxPcGVyYW5kfSBmcm9tICcuLi9vcGVyYW5kJztcbmltcG9ydCB7U2luZ2xlT3V0cHV0T3BlcmF0aW9ufSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi4vdXRpbHMnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmluYXJ5IGV4dGVuZHMgU2luZ2xlT3V0cHV0T3BlcmF0aW9uIHtcbiAgcHJpdmF0ZSBhXzogTUxPcGVyYW5kO1xuICBwcml2YXRlIGJfOiBNTE9wZXJhbmQ7XG5cbiAgY29uc3RydWN0b3IoYTogTUxPcGVyYW5kLCBiOiBNTE9wZXJhbmQpIHtcbiAgICBzdXBlcihhLmJ1aWxkZXIpO1xuICAgIHV0aWxzLnZhbGlkYXRlT3BlcmFuZChhKTtcbiAgICB0aGlzLmFfID0gYTtcbiAgICB1dGlscy52YWxpZGF0ZU9wZXJhbmQoYik7XG4gICAgdGhpcy5iXyA9IGI7XG4gIH1cblxuICBpbnB1dHMoKTogTUxPcGVyYW5kW10ge1xuICAgIHJldHVybiBbdGhpcy5hXywgdGhpcy5iX107XG4gIH1cblxuICBydW4oaW5wdXRUZW5zb3JzOiBNYXA8TUxPcGVyYW5kLCB0Zi5UZW5zb3I+KTogdGYuVGVuc29yIHtcbiAgICBjb25zdCBhOiB0Zi5UZW5zb3IgPSBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMuYV8pO1xuICAgIGNvbnN0IGI6IHRmLlRlbnNvciA9IGlucHV0VGVuc29ycy5nZXQodGhpcy5iXyk7XG4gICAgcmV0dXJuIHRoaXMucnVuT3AoYSwgYik7XG4gIH1cblxuICBhYnN0cmFjdCBydW5PcChhOiB0Zi5UZW5zb3IsIGI6IHRmLlRlbnNvcik6IHRmLlRlbnNvcjtcbn1cblxuZXhwb3J0IGNsYXNzIEFkZCBleHRlbmRzIEJpbmFyeSB7XG4gIHJ1bk9wKGE6IHRmLlRlbnNvciwgYjogdGYuVGVuc29yKTogdGYuVGVuc29yIHtcbiAgICByZXR1cm4gdGYuYWRkKGEsIGIpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTdWIgZXh0ZW5kcyBCaW5hcnkge1xuICBydW5PcChhOiB0Zi5UZW5zb3IsIGI6IHRmLlRlbnNvcik6IHRmLlRlbnNvciB7XG4gICAgcmV0dXJuIHRmLnN1YihhLCBiKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTXVsIGV4dGVuZHMgQmluYXJ5IHtcbiAgcnVuT3AoYTogdGYuVGVuc29yLCBiOiB0Zi5UZW5zb3IpOiB0Zi5UZW5zb3Ige1xuICAgIHJldHVybiB0Zi5tdWwoYSwgYik7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIERpdiBleHRlbmRzIEJpbmFyeSB7XG4gIHJ1bk9wKGE6IHRmLlRlbnNvciwgYjogdGYuVGVuc29yKTogdGYuVGVuc29yIHtcbiAgICByZXR1cm4gdGYuZGl2KGEsIGIpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNYXggZXh0ZW5kcyBCaW5hcnkge1xuICBydW5PcChhOiB0Zi5UZW5zb3IsIGI6IHRmLlRlbnNvcik6IHRmLlRlbnNvciB7XG4gICAgcmV0dXJuIHRmLm1heGltdW0oYSwgYik7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1pbiBleHRlbmRzIEJpbmFyeSB7XG4gIHJ1bk9wKGE6IHRmLlRlbnNvciwgYjogdGYuVGVuc29yKTogdGYuVGVuc29yIHtcbiAgICByZXR1cm4gdGYubWluaW11bShhLCBiKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUG93IGV4dGVuZHMgQmluYXJ5IHtcbiAgcnVuT3AoYTogdGYuVGVuc29yLCBiOiB0Zi5UZW5zb3IpOiB0Zi5UZW5zb3Ige1xuICAgIHJldHVybiB0Zi5wb3coYSwgYik7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1hdE11bCBleHRlbmRzIEJpbmFyeSB7XG4gIHJ1bk9wKGE6IHRmLlRlbnNvciwgYjogdGYuVGVuc29yKTogdGYuVGVuc29yIHtcbiAgICBpZiAoYS5yYW5rID09PSAxKSB7XG4gICAgICBpZiAoYi5yYW5rID09PSAxKSB7XG4gICAgICAgIHJldHVybiB0Zi5kb3QoYSwgYik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBhIGlzIDEtRCwgY29udmVydCB0byBhIDItRCB0ZW5zb3IgYnkgcHJlcGVuZGluZyBhIDEgdG8gaXRzIGRpbWVzaW9uc1xuICAgICAgICByZXR1cm4gdGYubWF0TXVsKHRmLnJlc2hhcGUoYSwgWzEsIC0xXSksIGIpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoYi5yYW5rID09PSAxKSB7XG4gICAgICAgIC8vIGIgaXMgMS1ELCBjb252ZXJ0IHRvIGEgMi1EIHRlbnNvciBieSBhcHBlbmRpbmcgYSAxIHRvIGl0cyBkaW1lc2lvbnNcbiAgICAgICAgcmV0dXJuIHRmLm1hdE11bChhLCB0Zi5yZXNoYXBlKGIsIFstMSwgMV0pKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJhbmsgPSBhLnJhbmsgPiBiLnJhbmsgPyBhLnJhbmsgOiBiLnJhbms7XG4gICAgICAgIGxldCBjID0gdGYubWF0TXVsKGEsIGIpO1xuICAgICAgICAvLyB3b3JrYXJvdW5kIGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RmanMvaXNzdWVzLzQxOTJcbiAgICAgICAgaWYgKGMucmFuayAhPT0gcmFuaykge1xuICAgICAgICAgIGMgPSB0Zi5yZXNoYXBlKGMsIFsxXS5jb25jYXQoYy5zaGFwZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjO1xuICAgICAgfVxuICAgIH1cbiAgfVxufSIsImltcG9ydCAqIGFzIHRmIGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TUxDbGFtcE9wdGlvbnN9IGZyb20gJy4uL2dyYXBoX2J1aWxkZXInO1xuaW1wb3J0IHtDb25zdGFudE9wZXJhbmQsIE1MT3BlcmFuZCwgT3V0cHV0T3BlcmFuZH0gZnJvbSAnLi4vb3BlcmFuZCc7XG5pbXBvcnQge1NpbmdsZU91dHB1dE9wZXJhdGlvbn0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJy4uL3V0aWxzJztcblxuZXhwb3J0IGNsYXNzIENsYW1wIGV4dGVuZHMgU2luZ2xlT3V0cHV0T3BlcmF0aW9uIHtcbiAgcHJpdmF0ZSB4XzogTUxPcGVyYW5kO1xuICBwcml2YXRlIG1pbk9wZXJhbmRfPzogTUxPcGVyYW5kO1xuICBwcml2YXRlIG1heE9wZXJhbmRfPzogTUxPcGVyYW5kO1xuICBwcml2YXRlIG1pblNjYWxhclZhbHVlXz86IG51bWJlcjtcbiAgcHJpdmF0ZSBtYXhTY2FsYXJWYWx1ZV8/OiBudW1iZXI7XG5cbiAgZ2V0IG1pblNjYWxhclZhbHVlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMubWluU2NhbGFyVmFsdWVfO1xuICB9XG4gIGdldCBtYXhTY2FsYXJWYWx1ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLm1heFNjYWxhclZhbHVlXztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2NhbGFyVmFsdWUob3BlcmFuZDogTUxPcGVyYW5kLCBtaW51cyA9IGZhbHNlKTogbnVtYmVyIHtcbiAgICBpZiAob3BlcmFuZCBpbnN0YW5jZW9mIENvbnN0YW50T3BlcmFuZCkge1xuICAgICAgY29uc3QgbWluQ29uc3RhbnQgPSBvcGVyYW5kO1xuICAgICAgaWYgKHR5cGVvZiBtaW5Db25zdGFudC52YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIG1pbkNvbnN0YW50LnZhbHVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAob3BlcmFuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gbWludXMgPyAtSW5maW5pdHkgOiArSW5maW5pdHk7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcih4OiBNTE9wZXJhbmQsIG9wdGlvbnM6IE1MQ2xhbXBPcHRpb25zID0ge30pIHtcbiAgICBpZiAoeCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzdXBlcih4LmJ1aWxkZXIpO1xuICAgICAgdXRpbHMudmFsaWRhdGVPcGVyYW5kKHgpO1xuICAgICAgdGhpcy54XyA9IHg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN1cGVyKHVuZGVmaW5lZCk7XG4gICAgICB0aGlzLnhfID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICB1dGlscy52YWxpZGF0ZU9wdGlvbmFsT3BlcmFuZChvcHRpb25zLm1pblZhbHVlKTtcbiAgICB0aGlzLm1pbk9wZXJhbmRfID0gb3B0aW9ucy5taW5WYWx1ZTtcbiAgICB0aGlzLm1pblNjYWxhclZhbHVlXyA9IHRoaXMuZ2V0U2NhbGFyVmFsdWUodGhpcy5taW5PcGVyYW5kXywgdHJ1ZSk7XG4gICAgdXRpbHMudmFsaWRhdGVPcHRpb25hbE9wZXJhbmQob3B0aW9ucy5tYXhWYWx1ZSk7XG4gICAgdGhpcy5tYXhPcGVyYW5kXyA9IG9wdGlvbnMubWF4VmFsdWU7XG4gICAgdGhpcy5tYXhTY2FsYXJWYWx1ZV8gPSB0aGlzLmdldFNjYWxhclZhbHVlKHRoaXMubWF4T3BlcmFuZF8pO1xuICB9XG5cbiAgaW5wdXRzKCk6IE1MT3BlcmFuZFtdIHtcbiAgICBjb25zdCBpbnB1dHMgPSBbdGhpcy54X107XG4gICAgaWYgKHRoaXMubWluT3BlcmFuZF8pIHtcbiAgICAgIGlucHV0cy5wdXNoKHRoaXMubWluT3BlcmFuZF8pO1xuICAgIH1cbiAgICBpZiAodGhpcy5tYXhPcGVyYW5kXykge1xuICAgICAgaW5wdXRzLnB1c2godGhpcy5tYXhPcGVyYW5kXyk7XG4gICAgfVxuICAgIHJldHVybiBpbnB1dHM7XG4gIH1cblxuICBydW4oaW5wdXRUZW5zb3JzOiBNYXA8TUxPcGVyYW5kLCB0Zi5UZW5zb3I+KTogdGYuVGVuc29yIHtcbiAgICBjb25zdCB4OiB0Zi5UZW5zb3IgPSBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMueF8pO1xuICAgIGlmICh0aGlzLm1pbk9wZXJhbmRfKSB7XG4gICAgICBpZiAodGhpcy5tYXhPcGVyYW5kXykge1xuICAgICAgICByZXR1cm4gdGYubWluaW11bShcbiAgICAgICAgICAgIHRmLm1heGltdW0oeCwgaW5wdXRUZW5zb3JzLmdldCh0aGlzLm1pbk9wZXJhbmRfKSksXG4gICAgICAgICAgICBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMubWF4T3BlcmFuZF8pKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0Zi5tYXhpbXVtKHgsIGlucHV0VGVuc29ycy5nZXQodGhpcy5taW5PcGVyYW5kXykpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5tYXhPcGVyYW5kXykge1xuICAgICAgICByZXR1cm4gdGYubWluaW11bSh4LCBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMubWF4T3BlcmFuZF8pKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0Zi5jbG9uZSh4KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhcHBseSh4OiBNTE9wZXJhbmQpOiBPdXRwdXRPcGVyYW5kIHtcbiAgICB0aGlzLmJ1aWxkZXJfID0geC5idWlsZGVyO1xuICAgIHV0aWxzLnZhbGlkYXRlT3BlcmFuZCh4KTtcbiAgICB0aGlzLnhfID0geDtcbiAgICB0aGlzLmNyZWF0ZU91dHB1dCgpO1xuICAgIHJldHVybiB0aGlzLm91dHB1dDtcbiAgfVxuXG4gIHJ1bk9wKHg6IHRmLlRlbnNvcik6IHRmLlRlbnNvciB7XG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICB0aGlzLm1pblNjYWxhclZhbHVlXyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICB0aGlzLm1heFNjYWxhclZhbHVlXyAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAndGYuanMgb25seSBzdXBwb3J0cyBjbGlwQnlWYWx1ZS4nKTtcbiAgICByZXR1cm4gdGYuY2xpcEJ5VmFsdWUoeCwgdGhpcy5taW5TY2FsYXJWYWx1ZV8sIHRoaXMubWF4U2NhbGFyVmFsdWVfKTtcbiAgfVxufSIsImltcG9ydCAqIGFzIHRmIGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TUxPcGVyYW5kfSBmcm9tICcuLi9vcGVyYW5kJztcbmltcG9ydCB7U2luZ2xlT3V0cHV0T3BlcmF0aW9ufSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi4vdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgQ29uY2F0IGV4dGVuZHMgU2luZ2xlT3V0cHV0T3BlcmF0aW9uIHtcbiAgcHJpdmF0ZSBpbnB1dHNfOiBNTE9wZXJhbmRbXTtcbiAgcHJpdmF0ZSBheGlzXzogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKGlucHV0czogTUxPcGVyYW5kW10sIGF4aXM6IG51bWJlcikge1xuICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgaW5wdXRzLmV2ZXJ5KGlucHV0ID0+IGlucHV0IGluc3RhbmNlb2YgTUxPcGVyYW5kKSxcbiAgICAgICAgJ1RoZSBwYXJhbWV0ZXIgaXMgbm90IGFuIG9wZXJhbmQuJyk7XG4gICAgc3VwZXIoaW5wdXRzWzBdLmJ1aWxkZXIpO1xuICAgIHRoaXMuaW5wdXRzXyA9IGlucHV0cztcbiAgICB1dGlscy5hc3NlcnQodXRpbHMuaXNJbnRlZ2VyKGF4aXMpLCAnVGhlIGF4aXMgcGFyYW1ldGVyIGlzIGludmFsaWQuJyk7XG4gICAgdGhpcy5heGlzXyA9IGF4aXM7XG4gIH1cblxuICBpbnB1dHMoKTogTUxPcGVyYW5kW10ge1xuICAgIHJldHVybiB0aGlzLmlucHV0c187XG4gIH1cblxuICBydW4oaW5wdXRUZW5zb3JzOiBNYXA8TUxPcGVyYW5kLCB0Zi5UZW5zb3I+KTogdGYuVGVuc29yIHtcbiAgICBjb25zdCBpbnB1dHM6IHRmLlRlbnNvcltdID0gW107XG4gICAgZm9yIChjb25zdCBpbnB1dCBvZiB0aGlzLmlucHV0cygpKSB7XG4gICAgICBpbnB1dHMucHVzaChpbnB1dFRlbnNvcnMuZ2V0KGlucHV0KSk7XG4gICAgfVxuICAgIHJldHVybiB0Zi5jb25jYXQoaW5wdXRzLCB0aGlzLmF4aXNfKTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgdGYgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7RXhwbGljaXRQYWRkaW5nfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUvc3JjL29wcy9jb252X3V0aWwnO1xuXG5pbXBvcnQge01MQXV0b1BhZCwgTUxDb252MmRPcHRpb25zLCBNTEZpbHRlck9wZXJhbmRMYXlvdXQsIE1MSW5wdXRPcGVyYW5kTGF5b3V0fSBmcm9tICcuLi9ncmFwaF9idWlsZGVyJztcbmltcG9ydCB7Q29uc3RhbnRPcGVyYW5kLCBNTE9wZXJhbmQsIE91dHB1dE9wZXJhbmR9IGZyb20gJy4uL29wZXJhbmQnO1xuaW1wb3J0IHtGdXNlZE9wZXJhdGlvbiwgTUxPcGVyYXRvciwgU2luZ2xlT3V0cHV0T3BlcmF0aW9ufSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi4vdXRpbHMnO1xuXG5pbXBvcnQge0NsYW1wfSBmcm9tICcuL2NsYW1wJztcbmltcG9ydCB7TGVha3lSZWx1fSBmcm9tICcuL2xlYWt5X3JlbHUnO1xuaW1wb3J0IHtSZWx1LCBTaWdtb2lkfSBmcm9tICcuL3VuYXJ5JztcblxuZXhwb3J0IGNsYXNzIENvbnYyZCBleHRlbmRzIFNpbmdsZU91dHB1dE9wZXJhdGlvbiBpbXBsZW1lbnRzIEZ1c2VkT3BlcmF0aW9uIHtcbiAgcHJpdmF0ZSBpbnB1dF86IE1MT3BlcmFuZDtcbiAgcHJpdmF0ZSBmaWx0ZXJfOiBNTE9wZXJhbmQ7XG4gIHByaXZhdGUgYmlhc186IE1MT3BlcmFuZDtcbiAgcHJpdmF0ZSBwYWRkaW5nXz86IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuICBwcml2YXRlIHN0cmlkZXNfPzogW251bWJlciwgbnVtYmVyXTtcbiAgcHJpdmF0ZSBkaWxhdGlvbnNfPzogW251bWJlciwgbnVtYmVyXTtcbiAgcHJpdmF0ZSBncm91cHNfPzogbnVtYmVyO1xuICBwcml2YXRlIGlucHV0TGF5b3V0Xz86IE1MSW5wdXRPcGVyYW5kTGF5b3V0O1xuICBwcml2YXRlIGZpbHRlckxheW91dF8/OiBNTEZpbHRlck9wZXJhbmRMYXlvdXQ7XG4gIHByaXZhdGUgYXV0b1BhZF8/OiBNTEF1dG9QYWQ7XG4gIHByaXZhdGUgb3V0cHV0UGFkZGluZ18/OiBbbnVtYmVyLCBudW1iZXJdO1xuICBwcml2YXRlIG91dHB1dFNpemVzXz86IFtudW1iZXIsIG51bWJlcl07XG4gIHByaXZhdGUgdHJhbnNwb3NlXz86IGJvb2xlYW47XG4gIHByaXZhdGUgYWN0aXZhdGlvbl8/OiBNTE9wZXJhdG9yO1xuICBwcml2YXRlIGZ1c2VkQWN0aXZhdGlvbl8/OiB0Zi5mdXNlZC5BY3RpdmF0aW9uO1xuICBwcml2YXRlIGxlYWt5cmVsdUFscGhhXz86IG51bWJlcjtcbiAgcHJpdmF0ZSBmaWx0ZXJUZW5zb3JfPzogdGYuVGVuc29yNEQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBpbnB1dDogTUxPcGVyYW5kLCBmaWx0ZXI6IE1MT3BlcmFuZCwgb3B0aW9uczogTUxDb252MmRPcHRpb25zID0ge30pIHtcbiAgICBzdXBlcihpbnB1dC5idWlsZGVyKTtcbiAgICB1dGlscy52YWxpZGF0ZU9wZXJhbmQoaW5wdXQpO1xuICAgIHRoaXMuaW5wdXRfID0gaW5wdXQ7XG4gICAgdXRpbHMudmFsaWRhdGVPcGVyYW5kKGZpbHRlcik7XG4gICAgdGhpcy5maWx0ZXJfID0gZmlsdGVyO1xuXG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICAhKG9wdGlvbnMuYXV0b1BhZCA9PT0gTUxBdXRvUGFkLmV4cGxpY2l0ICYmXG4gICAgICAgICAgb3B0aW9ucy5wYWRkaW5nID09PSB1bmRlZmluZWQpLFxuICAgICAgICAnVGhlIHBhZGRpbmcgcGFyYW1ldGVyIHNob3VsZCBiZSBhc3NpZ25lZCB3aGVuIGF1dG9QYWQgaXMgZXhwbGljaXQuJyk7XG5cbiAgICB0aGlzLmluaXRPcHRpb25zKFxuICAgICAgICBvcHRpb25zLnBhZGRpbmcsIG9wdGlvbnMuc3RyaWRlcywgb3B0aW9ucy5kaWxhdGlvbnMsIG9wdGlvbnMuZ3JvdXBzLFxuICAgICAgICBvcHRpb25zLmlucHV0TGF5b3V0LCBvcHRpb25zLmZpbHRlckxheW91dCwgb3B0aW9ucy5hdXRvUGFkLFxuICAgICAgICBvcHRpb25zLnRyYW5zcG9zZSwgb3B0aW9ucy5vdXRwdXRQYWRkaW5nLCBvcHRpb25zLm91dHB1dFNpemVzLFxuICAgICAgICBvcHRpb25zLmJpYXMsIG9wdGlvbnMuYWN0aXZhdGlvbik7XG4gIH1cblxuICBwcml2YXRlIGluaXRPcHRpb25zKFxuICAgICAgcGFkZGluZzogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPSBbMCwgMCwgMCwgMF0sXG4gICAgICBzdHJpZGVzOiBbbnVtYmVyLCBudW1iZXJdID0gWzEsIDFdLCBkaWxhdGlvbnM6IFtudW1iZXIsIG51bWJlcl0gPSBbMSwgMV0sXG4gICAgICBncm91cHMgPSAxLCBpbnB1dExheW91dDogTUxJbnB1dE9wZXJhbmRMYXlvdXQgPSBNTElucHV0T3BlcmFuZExheW91dC5uY2h3LFxuICAgICAgZmlsdGVyTGF5b3V0OiBNTEZpbHRlck9wZXJhbmRMYXlvdXQgPSBNTEZpbHRlck9wZXJhbmRMYXlvdXQub2lodyxcbiAgICAgIGF1dG9QYWQ6IE1MQXV0b1BhZCA9IE1MQXV0b1BhZC5leHBsaWNpdCwgdHJhbnNwb3NlID0gZmFsc2UsXG4gICAgICBvdXRwdXRQYWRkaW5nOiBbbnVtYmVyLCBudW1iZXJdID0gWzAsIDBdLFxuICAgICAgb3V0cHV0U2l6ZXM6IFtudW1iZXIsIG51bWJlcl0gPSB1bmRlZmluZWQsIGJpYXM6IE1MT3BlcmFuZCA9IHVuZGVmaW5lZCxcbiAgICAgIGFjdGl2YXRpb246IE1MT3BlcmF0b3IgPSB1bmRlZmluZWQpIHtcbiAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgIHV0aWxzLmlzSW50ZWdlckFycmF5KHBhZGRpbmcpICYmIHBhZGRpbmcubGVuZ3RoID09PSA0LFxuICAgICAgICAnVGhlIHBhZGRpbmcgcGFyYW1ldGVyIGlzIGludmFsaWQuJyk7XG4gICAgdGhpcy5wYWRkaW5nXyA9IHBhZGRpbmc7XG5cbiAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgIHV0aWxzLmlzSW50ZWdlckFycmF5KHN0cmlkZXMpICYmIHN0cmlkZXMubGVuZ3RoID09PSAyLFxuICAgICAgICAnVGhlIHN0cmlkZXMgcGFyYW1ldGVyIGlzIGludmFsaWQuJyk7XG4gICAgdGhpcy5zdHJpZGVzXyA9IHN0cmlkZXM7XG5cbiAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgIHV0aWxzLmlzSW50ZWdlckFycmF5KGRpbGF0aW9ucykgJiYgZGlsYXRpb25zLmxlbmd0aCA9PT0gMixcbiAgICAgICAgJ1RoZSBkaWxhdGlvbnMgcGFyYW1ldGVyIGlzIGludmFsaWQuJyk7XG4gICAgdGhpcy5kaWxhdGlvbnNfID0gZGlsYXRpb25zO1xuXG4gICAgdXRpbHMuYXNzZXJ0KHV0aWxzLmlzSW50ZWdlcihncm91cHMpLCAnVGhlIGdvdXJwcyBwYXJhbWV0ZXIgaXMgaW52YWxpZC4nKTtcbiAgICB0aGlzLmdyb3Vwc18gPSBncm91cHM7XG5cbiAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgIGlucHV0TGF5b3V0IGluIE1MSW5wdXRPcGVyYW5kTGF5b3V0LFxuICAgICAgICAnVGhlIGlucHV0IGxheW91dCBwYXJhbWV0ZXIgaXMgaW52YWxpZC4nKTtcbiAgICB0aGlzLmlucHV0TGF5b3V0XyA9IGlucHV0TGF5b3V0O1xuXG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICBmaWx0ZXJMYXlvdXQgaW4gTUxGaWx0ZXJPcGVyYW5kTGF5b3V0LFxuICAgICAgICAnVGhlIGZpbHRlciBsYXlvdXQgcGFyYW1ldGVyIGlzIGludmFsaWQuJyk7XG4gICAgdGhpcy5maWx0ZXJMYXlvdXRfID0gZmlsdGVyTGF5b3V0O1xuXG4gICAgdXRpbHMuYXNzZXJ0KGF1dG9QYWQgaW4gTUxBdXRvUGFkLCAnVGhlIGF1dG9QYWQgcGFyYW1ldGVyIGlzIGludmFsaWQuJyk7XG4gICAgdGhpcy5hdXRvUGFkXyA9IGF1dG9QYWQ7XG5cbiAgICB0aGlzLnRyYW5zcG9zZV8gPSB0cmFuc3Bvc2U7XG5cbiAgICBpZiAodGhpcy50cmFuc3Bvc2VfKSB7XG4gICAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgICAgdXRpbHMuaXNJbnRlZ2VyQXJyYXkob3V0cHV0UGFkZGluZykgJiYgb3V0cHV0UGFkZGluZy5sZW5ndGggPT09IDIsXG4gICAgICAgICAgJ1RoZSBvdXRwdXRQYWRkaW5nIHBhcmFtZXRlciBpcyBpbnZhbGlkLicpO1xuICAgICAgdGhpcy5vdXRwdXRQYWRkaW5nXyA9IG91dHB1dFBhZGRpbmc7XG5cbiAgICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgICBvdXRwdXRTaXplcyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAgICh1dGlscy5pc0ludGVnZXJBcnJheShvdXRwdXRTaXplcykgJiYgb3V0cHV0U2l6ZXMubGVuZ3RoID09PSAyKSxcbiAgICAgICAgICAnVGhlIG91dHB1dFNpemVzIHBhcmFtZXRlciBpcyBpbnZhbGlkLicpO1xuICAgICAgdGhpcy5vdXRwdXRTaXplc18gPSBvdXRwdXRTaXplcztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vdXRwdXRQYWRkaW5nXyA9IFswLCAwXTtcbiAgICAgIHRoaXMub3V0cHV0U2l6ZXNfID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHRoaXMuYmlhc18gPSBiaWFzO1xuICAgIGlmICh0aGlzLmJpYXNfKSB7XG4gICAgICB1dGlscy52YWxpZGF0ZU9wZXJhbmQodGhpcy5iaWFzXyk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGl2YXRpb24gaW5zdGFuY2VvZiBSZWx1KSB7XG4gICAgICB0aGlzLmZ1c2VkQWN0aXZhdGlvbl8gPSAncmVsdSc7XG4gICAgICB0aGlzLmFjdGl2YXRpb25fID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc1JlbHU2KGFjdGl2YXRpb24pKSB7XG4gICAgICB0aGlzLmZ1c2VkQWN0aXZhdGlvbl8gPSAncmVsdTYnO1xuICAgICAgdGhpcy5hY3RpdmF0aW9uXyA9IHVuZGVmaW5lZDtcbiAgICB9IGVsc2UgaWYgKGFjdGl2YXRpb24gaW5zdGFuY2VvZiBMZWFreVJlbHUpIHtcbiAgICAgIHRoaXMuZnVzZWRBY3RpdmF0aW9uXyA9ICdsZWFreXJlbHUnO1xuICAgICAgdGhpcy5sZWFreXJlbHVBbHBoYV8gPSAoYWN0aXZhdGlvbikuYWxwaGE7XG4gICAgICB0aGlzLmFjdGl2YXRpb25fID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAoYWN0aXZhdGlvbiBpbnN0YW5jZW9mIFNpZ21vaWQpIHtcbiAgICAgIHRoaXMuZnVzZWRBY3RpdmF0aW9uXyA9ICdzaWdtb2lkJztcbiAgICAgIHRoaXMuYWN0aXZhdGlvbl8gPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZnVzZWRBY3RpdmF0aW9uXyA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuYWN0aXZhdGlvbl8gPSBhY3RpdmF0aW9uO1xuICAgIH1cbiAgfVxuXG4gIGlzUmVsdTYoYWN0aXZhdGlvbjogTUxPcGVyYXRvcik6IGJvb2xlYW4ge1xuICAgIGlmIChhY3RpdmF0aW9uIGluc3RhbmNlb2YgQ2xhbXApIHtcbiAgICAgIGNvbnN0IGNsYW1wID0gYWN0aXZhdGlvbjtcbiAgICAgIGlmIChNYXRoLmFicyhjbGFtcC5taW5TY2FsYXJWYWx1ZSAtIDAuMCkgPCAxZS01ICYmXG4gICAgICAgICAgTWF0aC5hYnMoY2xhbXAubWF4U2NhbGFyVmFsdWUgLSA2LjApIDwgMWUtNSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZ2V0RnVzZWRPdXRwdXRzKCk6IE91dHB1dE9wZXJhbmRbXSB7XG4gICAgaWYgKHRoaXMuYWN0aXZhdGlvbl8pIHtcbiAgICAgIHJldHVybiBbdGhpcy5hY3RpdmF0aW9uXy5hcHBseSh0aGlzLm91dHB1dCldO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gW3RoaXMub3V0cHV0XTtcbiAgICB9XG4gIH1cblxuICBpbnB1dHMoKTogTUxPcGVyYW5kW10ge1xuICAgIGNvbnN0IGlucHV0cyA9IFt0aGlzLmlucHV0XywgdGhpcy5maWx0ZXJfXTtcbiAgICBpZiAodGhpcy5iaWFzXykge1xuICAgICAgaW5wdXRzLnB1c2godGhpcy5iaWFzXyk7XG4gICAgfVxuICAgIHJldHVybiBpbnB1dHM7XG4gIH1cblxuICBydW4oaW5wdXRUZW5zb3JzOiBNYXA8TUxPcGVyYW5kLCB0Zi5UZW5zb3I+KTogdGYuVGVuc29yIHtcbiAgICBsZXQgaW5wdXQ6IHRmLlRlbnNvcjREID0gaW5wdXRUZW5zb3JzLmdldCh0aGlzLmlucHV0XykgYXMgdGYuVGVuc29yNEQ7XG4gICAgbGV0IGZpbHRlcjogdGYuVGVuc29yNEQ7XG4gICAgbGV0IGJpYXM6IHRmLlRlbnNvcjFEO1xuICAgIGxldCBmdXNlZCA9IGZhbHNlO1xuICAgIGlmICh0aGlzLmJpYXNfKSB7XG4gICAgICBiaWFzID0gaW5wdXRUZW5zb3JzLmdldCh0aGlzLmJpYXNfKSBhcyB0Zi5UZW5zb3IxRDtcbiAgICB9XG5cbiAgICAvLyB0Zi5jb252MmQgaW5wdXQgbGF5b3V0IChuaHdjKTogW2JhdGNoLCBoZWlnaHQsIHdpZHRoLCBpbkRlcHRoXVxuICAgIGlmICh0aGlzLmlucHV0TGF5b3V0XyA9PT0gTUxJbnB1dE9wZXJhbmRMYXlvdXQubmNodykge1xuICAgICAgLy8gbmNodyAtPiBuaHdjXG4gICAgICBpbnB1dCA9IHRmLnRyYW5zcG9zZShpbnB1dCwgWzAsIDIsIDMsIDFdKTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRDaGFubmVscyA9IGlucHV0LnNoYXBlWzNdO1xuICAgIC8vIHRmLmNvbnYyZCBmaWx0ZXIgbGF5b3V0IChod2lvKTogW2ZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsIGluRGVwdGgsXG4gICAgLy8gb3V0RGVwdGhdXG4gICAgaWYgKHRoaXMuZmlsdGVyVGVuc29yXyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBmaWx0ZXIgPSBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMuZmlsdGVyXykgYXMgdGYuVGVuc29yNEQ7XG4gICAgICBpZiAodGhpcy5maWx0ZXJMYXlvdXRfID09PSBNTEZpbHRlck9wZXJhbmRMYXlvdXQub2lodykge1xuICAgICAgICBmaWx0ZXIgPSB0Zi50cmFuc3Bvc2UoZmlsdGVyLCBbMiwgMywgMSwgMF0pO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmZpbHRlckxheW91dF8gPT09IE1MRmlsdGVyT3BlcmFuZExheW91dC5vaHdpKSB7XG4gICAgICAgIGZpbHRlciA9IHRmLnRyYW5zcG9zZShmaWx0ZXIsIFsxLCAyLCAzLCAwXSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuZmlsdGVyTGF5b3V0XyA9PT0gTUxGaWx0ZXJPcGVyYW5kTGF5b3V0Lmlod28pIHtcbiAgICAgICAgZmlsdGVyID0gdGYudHJhbnNwb3NlKGZpbHRlciwgWzEsIDIsIDAsIDNdKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmdyb3Vwc18gIT09IDEpIHtcbiAgICAgICAgLy8gZmlsdGVyIGxheW91dCBod2lvXG4gICAgICAgIC8vIHRmLmRlcHRod2lzZUNvbnYyZCBmaWx0ZXIgbGF5b3V0OiBbZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCxcbiAgICAgICAgLy8gaW5DaGFubmVscywgY2hhbm5lbE11bHRpcGxpZXJdXG4gICAgICAgIGZpbHRlciA9IHRmLnRyYW5zcG9zZShmaWx0ZXIsIFswLCAxLCAzLCAyXSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5maWx0ZXJfIGluc3RhbmNlb2YgQ29uc3RhbnRPcGVyYW5kKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyVGVuc29yXyA9IGZpbHRlcjtcbiAgICAgICAgdGYua2VlcCh0aGlzLmZpbHRlclRlbnNvcl8pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmaWx0ZXIgPSB0aGlzLmZpbHRlclRlbnNvcl87XG4gICAgfVxuICAgIGNvbnN0IHBhZGRpbmc6ICd2YWxpZCd8J3NhbWUnfEV4cGxpY2l0UGFkZGluZyA9IHV0aWxzLmdldFBhZGRpbmdzKFxuICAgICAgICBpbnB1dCwgZmlsdGVyLCB0aGlzLnBhZGRpbmdfLCB0aGlzLnN0cmlkZXNfLCB0aGlzLm91dHB1dFBhZGRpbmdfLFxuICAgICAgICB0aGlzLmRpbGF0aW9uc18sIHRoaXMuYXV0b1BhZF8pO1xuICAgIGxldCBvdXRwdXQ7XG4gICAgaWYgKHRoaXMudHJhbnNwb3NlXyA9PT0gZmFsc2UpIHtcbiAgICAgIGlmICh0aGlzLmdyb3Vwc18gPT09IDEpIHtcbiAgICAgICAgb3V0cHV0ID0gdGYuZnVzZWQuY29udjJkKHtcbiAgICAgICAgICB4OiBpbnB1dCxcbiAgICAgICAgICBmaWx0ZXIsXG4gICAgICAgICAgc3RyaWRlczogdGhpcy5zdHJpZGVzXyxcbiAgICAgICAgICBwYWQ6IHBhZGRpbmcsXG4gICAgICAgICAgZGF0YUZvcm1hdDogJ05IV0MnLFxuICAgICAgICAgIGRpbGF0aW9uczogdGhpcy5kaWxhdGlvbnNfLFxuICAgICAgICAgIGJpYXMsXG4gICAgICAgICAgYWN0aXZhdGlvbjogdGhpcy5mdXNlZEFjdGl2YXRpb25fLFxuICAgICAgICAgIGxlYWt5cmVsdUFscGhhOiB0aGlzLmxlYWt5cmVsdUFscGhhX1xuICAgICAgICB9KTtcbiAgICAgICAgZnVzZWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICB0aGlzLmdyb3Vwc18gPT09IGlucHV0Q2hhbm5lbHMgJiYgdGhpcy5ncm91cHNfID09PSBmaWx0ZXIuc2hhcGVbMl0pIHtcbiAgICAgICAgaWYgKHBhZGRpbmcgPT09ICd2YWxpZCcgfHwgcGFkZGluZyA9PT0gJ3NhbWUnIHx8XG4gICAgICAgICAgICAocGFkZGluZyBpbnN0YW5jZW9mIEFycmF5ICYmIHBhZGRpbmdbMV1bMF0gPT09IHBhZGRpbmdbMV1bMV0gJiZcbiAgICAgICAgICAgICBwYWRkaW5nWzFdWzBdID09PSBwYWRkaW5nWzJdWzBdICYmXG4gICAgICAgICAgICAgcGFkZGluZ1sxXVswXSA9PT0gcGFkZGluZ1syXVsxXSkpIHtcbiAgICAgICAgICBsZXQgZnVzZWREZXB0aHdpc2VQYWQ6ICd2YWxpZCd8J3NhbWUnfG51bWJlcjtcbiAgICAgICAgICBpZiAocGFkZGluZyA9PT0gJ3ZhbGlkJyB8fCBwYWRkaW5nID09PSAnc2FtZScpIHtcbiAgICAgICAgICAgIGZ1c2VkRGVwdGh3aXNlUGFkID0gcGFkZGluZztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZnVzZWREZXB0aHdpc2VQYWQgPSBwYWRkaW5nWzFdWzBdO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvdXRwdXQgPSB0Zi5mdXNlZC5kZXB0aHdpc2VDb252MmQoe1xuICAgICAgICAgICAgeDogaW5wdXQsXG4gICAgICAgICAgICBmaWx0ZXIsXG4gICAgICAgICAgICBzdHJpZGVzOiB0aGlzLnN0cmlkZXNfLFxuICAgICAgICAgICAgcGFkOiBmdXNlZERlcHRod2lzZVBhZCxcbiAgICAgICAgICAgIGRhdGFGb3JtYXQ6ICdOSFdDJyxcbiAgICAgICAgICAgIGRpbGF0aW9uczogdGhpcy5kaWxhdGlvbnNfLFxuICAgICAgICAgICAgYmlhcyxcbiAgICAgICAgICAgIGFjdGl2YXRpb246IHRoaXMuZnVzZWRBY3RpdmF0aW9uXyxcbiAgICAgICAgICAgIGxlYWt5cmVsdUFscGhhOiB0aGlzLmxlYWt5cmVsdUFscGhhX1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGZ1c2VkID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvdXRwdXQgPSB0Zi5kZXB0aHdpc2VDb252MmQoXG4gICAgICAgICAgICAgIGlucHV0LCBmaWx0ZXIsIHRoaXMuc3RyaWRlc18sIHBhZGRpbmcsICdOSFdDJywgdGhpcy5kaWxhdGlvbnNfKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ1RoZSB0Zi5qcyBjb252b2x1dGlvbiBkb2VzblxcJ3Qgc3VwcG9ydCBncm91cHMgcGFyYW1ldGVyJyArXG4gICAgICAgICAgICBgICR7dGhpcy5ncm91cHNffWApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyB0cmFuc3Bvc2UgPT0gdHJ1ZVxuICAgICAgaWYgKHRoaXMuYXV0b1BhZF8gIT09IE1MQXV0b1BhZC5leHBsaWNpdCkge1xuICAgICAgICB0aGlzLm91dHB1dFNpemVzXyA9IFtcbiAgICAgICAgICBpbnB1dC5zaGFwZVsxXSAqIHRoaXMuc3RyaWRlc19bMF0sXG4gICAgICAgICAgaW5wdXQuc2hhcGVbMl0gKiB0aGlzLnN0cmlkZXNfWzFdLFxuICAgICAgICBdO1xuICAgICAgfVxuICAgICAgLy8gdGYuY29udjJkVHJhbnNwb3NlIG91dHB1dFNoYXBlOiBbYmF0Y2gsIGhlaWdodCwgd2lkdGgsIG91dERlcHRoXVxuICAgICAgY29uc3Qgb3V0cHV0U2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID1cbiAgICAgICAgICBbaW5wdXQuc2hhcGVbMF0sIDAsIDAsIGZpbHRlci5zaGFwZVsyXV07XG4gICAgICBpZiAodGhpcy5vdXRwdXRTaXplc18gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDI7ICsraSkge1xuICAgICAgICAgIG91dHB1dFNoYXBlW2kgKyAxXSA9IHRoaXMuc3RyaWRlc19baV0gKiAoaW5wdXQuc2hhcGVbaSArIDFdIC0gMSkgK1xuICAgICAgICAgICAgICB0aGlzLm91dHB1dFBhZGRpbmdfW2ldICtcbiAgICAgICAgICAgICAgKChmaWx0ZXIuc2hhcGVbaV0gLSAxKSAqIHRoaXMuZGlsYXRpb25zX1tpXSArIDEpIC1cbiAgICAgICAgICAgICAgdGhpcy5wYWRkaW5nX1tpICogMl0gLSB0aGlzLnBhZGRpbmdfW2kgKiAyICsgMV07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dHB1dFNoYXBlWzFdID0gdGhpcy5vdXRwdXRTaXplc19bMF07XG4gICAgICAgIG91dHB1dFNoYXBlWzJdID0gdGhpcy5vdXRwdXRTaXplc19bMV07XG4gICAgICB9XG4gICAgICBvdXRwdXQgPSB0Zi5jb252MmRUcmFuc3Bvc2UoXG4gICAgICAgICAgaW5wdXQsIGZpbHRlciwgb3V0cHV0U2hhcGUsIHRoaXMuc3RyaWRlc18sIHBhZGRpbmcpO1xuICAgIH1cbiAgICBpZiAoIWZ1c2VkKSB7XG4gICAgICBpZiAoYmlhcykge1xuICAgICAgICAvLyBvdXRwdXQgaXMgc3RpbGwgbmh3Y1xuICAgICAgICBvdXRwdXQgPSB0Zi5hZGQob3V0cHV0LCBiaWFzKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmZ1c2VkQWN0aXZhdGlvbl8gPT09ICdyZWx1Jykge1xuICAgICAgICBvdXRwdXQgPSB0Zi5yZWx1KG91dHB1dCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuZnVzZWRBY3RpdmF0aW9uXyA9PT0gJ3JlbHU2Jykge1xuICAgICAgICBvdXRwdXQgPSB0Zi5jbGlwQnlWYWx1ZShvdXRwdXQsIDAsIDYpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmZ1c2VkQWN0aXZhdGlvbl8gPT09ICdsZWFreXJlbHUnKSB7XG4gICAgICAgIG91dHB1dCA9IHRmLmxlYWt5UmVsdShvdXRwdXQsIHRoaXMubGVha3lyZWx1QWxwaGFfKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5mdXNlZEFjdGl2YXRpb25fID09PSAnc2lnbW9pZCcpIHtcbiAgICAgICAgb3V0cHV0ID0gdGYuc2lnbW9pZChvdXRwdXQpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmZ1c2VkQWN0aXZhdGlvbl8gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB1dGlscy5hc3NlcnQoZmFsc2UsIGBUaGUgJHt0aGlzLmZ1c2VkQWN0aXZhdGlvbl99IGlzIHVuIHN1cHBvcnRlZC5gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuaW5wdXRMYXlvdXRfID09PSBNTElucHV0T3BlcmFuZExheW91dC5uY2h3KSB7XG4gICAgICAvLyBuaHdjIC0+IG5jaHdcbiAgICAgIG91dHB1dCA9IHRmLnRyYW5zcG9zZShvdXRwdXQsIFswLCAzLCAxLCAyXSk7XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXQ7XG4gIH1cblxuICBkaXNwb3NlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmZpbHRlclRlbnNvcl8pIHtcbiAgICAgIHRmLmRpc3Bvc2UodGhpcy5maWx0ZXJUZW5zb3JfKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7TUxHZW1tT3B0aW9ucywgTUxHcmFwaEJ1aWxkZXJ9IGZyb20gJy4uL2dyYXBoX2J1aWxkZXInO1xuaW1wb3J0IHtNTE9wZXJhbmR9IGZyb20gJy4uL29wZXJhbmQnO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi4vdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgR2VtbSB7XG4gIHN0YXRpYyBidWlsZChcbiAgICAgIGJ1aWxkZXI6IE1MR3JhcGhCdWlsZGVyLCBhOiBNTE9wZXJhbmQsIGI6IE1MT3BlcmFuZCxcbiAgICAgIG9wdGlvbnM6IE1MR2VtbU9wdGlvbnMgPSB7fSk6IE1MT3BlcmFuZCB7XG4gICAgdXRpbHMudmFsaWRhdGVPcGVyYW5kKGEpO1xuICAgIHV0aWxzLnZhbGlkYXRlT3BlcmFuZChiKTtcbiAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgIG9wdGlvbnMuYyA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBvcHRpb25zLmMgPT09ICdudW1iZXInIHx8XG4gICAgICAgICAgICBvcHRpb25zLmMgaW5zdGFuY2VvZiBNTE9wZXJhbmQsXG4gICAgICAgICdUaGUgb3B0aW9ucy5jIGlzIGludmFsaWQuJyk7XG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICBvcHRpb25zLmFUcmFuc3Bvc2UgPT09IHVuZGVmaW5lZCB8fCB1dGlscy5pc0Jvb2xlYW4ob3B0aW9ucy5hVHJhbnNwb3NlKSxcbiAgICAgICAgJ1RoZSBvcHRpb25zLmFUcmFuc3Bvc2UgaXMgaW52YWxpZC4nKTtcbiAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgIG9wdGlvbnMuYlRyYW5zcG9zZSA9PT0gdW5kZWZpbmVkIHx8IHV0aWxzLmlzQm9vbGVhbihvcHRpb25zLmJUcmFuc3Bvc2UpLFxuICAgICAgICAnVGhlIG9wdGlvbnMuYlRyYW5zcG9zZSBpcyBpbnZhbGlkLicpO1xuICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgb3B0aW9ucy5hbHBoYSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBvcHRpb25zLmFscGhhID09PSAnbnVtYmVyJyxcbiAgICAgICAgJ1RoZSBvcHRpb25zLmFscGhhIGlzIGludmFsaWQuJyk7XG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICBvcHRpb25zLmJldGEgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2Ygb3B0aW9ucy5iZXRhID09PSAnbnVtYmVyJyxcbiAgICAgICAgJ1RoZSBvcHRpb25zLmJldGEgaXMgaW52YWxpZC4nKTtcblxuICAgIC8vIGJ1aWxkIGdyYXBoXG4gICAgaWYgKG9wdGlvbnMuYVRyYW5zcG9zZSkge1xuICAgICAgYSA9IGJ1aWxkZXIudHJhbnNwb3NlKGEpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmJUcmFuc3Bvc2UpIHtcbiAgICAgIGIgPSBidWlsZGVyLnRyYW5zcG9zZShiKTtcbiAgICB9XG5cbiAgICBjb25zdCBhbHBoYSA9XG4gICAgICAgIGJ1aWxkZXIuY29uc3RhbnQob3B0aW9ucy5hbHBoYSA9PT0gdW5kZWZpbmVkID8gMS4wIDogb3B0aW9ucy5hbHBoYSk7XG4gICAgY29uc3QgYmV0YSA9XG4gICAgICAgIGJ1aWxkZXIuY29uc3RhbnQob3B0aW9ucy5iZXRhID09PSB1bmRlZmluZWQgPyAxLjAgOiBvcHRpb25zLmJldGEpO1xuXG4gICAgY29uc3QgYWIgPSBidWlsZGVyLm1hdG11bChidWlsZGVyLm11bChhbHBoYSwgYSksIGIpO1xuICAgIHJldHVybiAob3B0aW9ucy5jID8gYnVpbGRlci5hZGQoYWIsIGJ1aWxkZXIubXVsKGJldGEsIG9wdGlvbnMuYykpIDogYWIpO1xuICB9XG59IiwiaW1wb3J0ICogYXMgdGYgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNTEdydUNlbGxPcHRpb25zLCBNTEdydU9wdGlvbnMsIE1MUmVjdXJyZW50TmV0d29ya0RpcmVjdGlvbiwgTUxSZWN1cnJlbnROZXR3b3JrV2VpZ2h0TGF5b3V0fSBmcm9tICcuLi9ncmFwaF9idWlsZGVyJztcbmltcG9ydCB7TUxPcGVyYW5kLCBPdXRwdXRPcGVyYW5kfSBmcm9tICcuLi9vcGVyYW5kJztcbmltcG9ydCB7TUxPcGVyYXRvciwgT3BlcmF0aW9uLCBTaW5nbGVPdXRwdXRPcGVyYXRpb259IGZyb20gJy4uL29wZXJhdGlvbic7XG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQge1VuYXJ5TUxPcGVyYXRvcn0gZnJvbSAnLi91bmFyeSc7XG5cbmV4cG9ydCBjbGFzcyBHcnUgZXh0ZW5kcyBPcGVyYXRpb24ge1xuICBwcml2YXRlIGlucHV0XzogTUxPcGVyYW5kO1xuICBwcml2YXRlIHdlaWdodF86IE1MT3BlcmFuZDtcbiAgcHJpdmF0ZSByZWN1cnJlbnRXZWlnaHRfOiBNTE9wZXJhbmQ7XG4gIHByaXZhdGUgc3RlcHNfOiBudW1iZXI7XG4gIHByaXZhdGUgaGlkZGVuU2l6ZV86IG51bWJlcjtcbiAgcHJpdmF0ZSBiaWFzXz86IE1MT3BlcmFuZDtcbiAgcHJpdmF0ZSByZWN1cnJlbnRCaWFzXz86IE1MT3BlcmFuZDtcbiAgcHJpdmF0ZSBpbml0aWFsSGlkZGVuU3RhdGVfPzogTUxPcGVyYW5kO1xuICBwcml2YXRlIHJlc2V0QWZ0ZXJfOiBib29sZWFuO1xuICBwcml2YXRlIHJldHVyblNlcXVlbmNlXzogYm9vbGVhbjtcbiAgcHJpdmF0ZSBkaXJlY3Rpb25fOiBNTFJlY3VycmVudE5ldHdvcmtEaXJlY3Rpb247XG4gIHByaXZhdGUgbGF5b3V0XzogTUxSZWN1cnJlbnROZXR3b3JrV2VpZ2h0TGF5b3V0O1xuICBwcml2YXRlIGFjdGl2YXRpb25zXzogTUxPcGVyYXRvcltdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgaW5wdXQ6IE1MT3BlcmFuZCwgd2VpZ2h0OiBNTE9wZXJhbmQsIHJlY3VycmVudFdlaWdodDogTUxPcGVyYW5kLFxuICAgICAgc3RlcHM6IG51bWJlciwgaGlkZGVuU2l6ZTogbnVtYmVyLCBvcHRpb25zOiBNTEdydU9wdGlvbnMgPSB7fSkge1xuICAgIHN1cGVyKGlucHV0LmJ1aWxkZXIpO1xuICAgIHV0aWxzLnZhbGlkYXRlT3BlcmFuZChpbnB1dCk7XG4gICAgdGhpcy5pbnB1dF8gPSBpbnB1dDtcbiAgICB1dGlscy52YWxpZGF0ZU9wZXJhbmQod2VpZ2h0KTtcbiAgICB0aGlzLndlaWdodF8gPSB3ZWlnaHQ7XG4gICAgdXRpbHMudmFsaWRhdGVPcGVyYW5kKHJlY3VycmVudFdlaWdodCk7XG4gICAgdGhpcy5yZWN1cnJlbnRXZWlnaHRfID0gcmVjdXJyZW50V2VpZ2h0O1xuICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgdXRpbHMuaXNJbnRlZ2VyKHN0ZXBzKSAmJiBzdGVwcyA+IDAsICdUaGUgc3RlcHMgcGFyYW1ldGVyIGlzIGludmFsaWQuJyk7XG4gICAgdGhpcy5zdGVwc18gPSBzdGVwcztcbiAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgIHV0aWxzLmlzSW50ZWdlcihoaWRkZW5TaXplKSAmJiBoaWRkZW5TaXplID4gMCxcbiAgICAgICAgJ1RoZSBoaWRkZW5TaXplIHBhcmFtZXRlciBpcyBpbnZhbGlkLicpO1xuICAgIHRoaXMuaGlkZGVuU2l6ZV8gPSBoaWRkZW5TaXplO1xuICAgIHRoaXMuaW5pdE9wdGlvbnMoXG4gICAgICAgIG9wdGlvbnMuYmlhcywgb3B0aW9ucy5yZWN1cnJlbnRCaWFzLCBvcHRpb25zLmluaXRpYWxIaWRkZW5TdGF0ZSxcbiAgICAgICAgb3B0aW9ucy5yZXNldEFmdGVyLCBvcHRpb25zLnJldHVyblNlcXVlbmNlLCBvcHRpb25zLmRpcmVjdGlvbixcbiAgICAgICAgb3B0aW9ucy5sYXlvdXQsIG9wdGlvbnMuYWN0aXZhdGlvbnMpO1xuXG4gICAgdGhpcy5vdXRwdXRzLnB1c2gobmV3IE91dHB1dE9wZXJhbmQodGhpcykpO1xuICAgIGlmICh0aGlzLnJldHVyblNlcXVlbmNlXykge1xuICAgICAgdGhpcy5vdXRwdXRzXy5wdXNoKG5ldyBPdXRwdXRPcGVyYW5kKHRoaXMpKTtcbiAgICB9XG4gIH1cblxuICBpbml0T3B0aW9ucyhcbiAgICAgIGJpYXM/OiBNTE9wZXJhbmQsIHJlY3VycmVudEJpYXM/OiBNTE9wZXJhbmQsXG4gICAgICBpbml0aWFsSGlkZGVuU3RhdGU/OiBNTE9wZXJhbmQsIHJlc2V0QWZ0ZXIgPSB0cnVlLCByZXR1cm5TZXF1ZW5jZSA9IGZhbHNlLFxuICAgICAgZGlyZWN0aW9uOlxuICAgICAgICAgIE1MUmVjdXJyZW50TmV0d29ya0RpcmVjdGlvbiA9IE1MUmVjdXJyZW50TmV0d29ya0RpcmVjdGlvbi5mb3J3YXJkLFxuICAgICAgbGF5b3V0OlxuICAgICAgICAgIE1MUmVjdXJyZW50TmV0d29ya1dlaWdodExheW91dCA9IE1MUmVjdXJyZW50TmV0d29ya1dlaWdodExheW91dC56cm4sXG4gICAgICBhY3RpdmF0aW9uczpcbiAgICAgICAgICBNTE9wZXJhdG9yW10gPSBbdGhpcy5idWlsZGVyLnNpZ21vaWQoKSwgdGhpcy5idWlsZGVyLnRhbmgoKV0pOiB2b2lkIHtcbiAgICB1dGlscy52YWxpZGF0ZU9wdGlvbmFsT3BlcmFuZChiaWFzKTtcbiAgICB0aGlzLmJpYXNfID0gYmlhcztcbiAgICB1dGlscy52YWxpZGF0ZU9wdGlvbmFsT3BlcmFuZChyZWN1cnJlbnRCaWFzKTtcbiAgICB0aGlzLnJlY3VycmVudEJpYXNfID0gcmVjdXJyZW50QmlhcztcbiAgICB1dGlscy52YWxpZGF0ZU9wdGlvbmFsT3BlcmFuZChpbml0aWFsSGlkZGVuU3RhdGUpO1xuICAgIHRoaXMuaW5pdGlhbEhpZGRlblN0YXRlXyA9IGluaXRpYWxIaWRkZW5TdGF0ZTtcbiAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgIHV0aWxzLmlzQm9vbGVhbihyZXNldEFmdGVyKSxcbiAgICAgICAgJ1RoZSByZXNldEFmdGVyIHBhcmFtZXRlciBpcyBub3QgYSBib29sZWFuLicpO1xuICAgIHRoaXMucmVzZXRBZnRlcl8gPSByZXNldEFmdGVyO1xuICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgdXRpbHMuaXNCb29sZWFuKHJldHVyblNlcXVlbmNlKSxcbiAgICAgICAgJ1RoZSByZXNldEFmdGVyIHBhcmFtZXRlciBpcyBub3QgYSBib29sZWFuLicpO1xuICAgIHRoaXMucmV0dXJuU2VxdWVuY2VfID0gcmV0dXJuU2VxdWVuY2U7XG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICBkaXJlY3Rpb24gaW4gTUxSZWN1cnJlbnROZXR3b3JrRGlyZWN0aW9uLFxuICAgICAgICAnVGhlIGRpcmVjdGlvbiBwYXJhbWV0ZXIgaXMgaW52YWxpZC4nKTtcbiAgICB0aGlzLmRpcmVjdGlvbl8gPSBkaXJlY3Rpb247XG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICBsYXlvdXQgaW4gTUxSZWN1cnJlbnROZXR3b3JrV2VpZ2h0TGF5b3V0LFxuICAgICAgICAnVGhlIGxheW91dCBwYXJhbWV0ZXIgaXMgaW52YWxpZC4nKTtcbiAgICB0aGlzLmxheW91dF8gPSBsYXlvdXQ7XG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICBhY3RpdmF0aW9ucyBpbnN0YW5jZW9mIEFycmF5ICYmIGFjdGl2YXRpb25zLmxlbmd0aCA9PT0gMiAmJlxuICAgICAgICAgICAgYWN0aXZhdGlvbnMuZXZlcnkoYSA9PiBhIGluc3RhbmNlb2YgVW5hcnlNTE9wZXJhdG9yKSxcbiAgICAgICAgJ1RoZSBhY3RpdmF0aW9ucyBwYXJhbWV0ZXIgaXMgaW52YWxpZC4nKTtcbiAgICB0aGlzLmFjdGl2YXRpb25zXyA9IGFjdGl2YXRpb25zO1xuICB9XG5cbiAgaW5wdXRzKCk6IE1MT3BlcmFuZFtdIHtcbiAgICBjb25zdCBpbnB1dHM6IE1MT3BlcmFuZFtdID1cbiAgICAgICAgW3RoaXMuaW5wdXRfLCB0aGlzLndlaWdodF8sIHRoaXMucmVjdXJyZW50V2VpZ2h0X107XG4gICAgaWYgKHRoaXMuYmlhc18pIHtcbiAgICAgIGlucHV0cy5wdXNoKHRoaXMuYmlhc18pO1xuICAgIH1cbiAgICBpZiAodGhpcy5yZWN1cnJlbnRCaWFzXykge1xuICAgICAgaW5wdXRzLnB1c2godGhpcy5yZWN1cnJlbnRCaWFzXyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmluaXRpYWxIaWRkZW5TdGF0ZV8pIHtcbiAgICAgIGlucHV0cy5wdXNoKHRoaXMuaW5pdGlhbEhpZGRlblN0YXRlXyk7XG4gICAgfVxuICAgIHJldHVybiBpbnB1dHM7XG4gIH1cblxuICBjb21wdXRlSW1wbChpbnB1dFRlbnNvcnM6IE1hcDxNTE9wZXJhbmQsIHRmLlRlbnNvcj4pOiB0Zi5UZW5zb3JbXSB7XG4gICAgY29uc3QgaW5wdXQgPSBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMuaW5wdXRfKTtcbiAgICBjb25zdCB3ZWlnaHQgPSBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMud2VpZ2h0Xyk7XG4gICAgY29uc3QgcmVjdXJyZW50V2VpZ2h0ID0gaW5wdXRUZW5zb3JzLmdldCh0aGlzLnJlY3VycmVudFdlaWdodF8pO1xuICAgIGNvbnN0IGJpYXMgPSB0aGlzLmJpYXNfID8gaW5wdXRUZW5zb3JzLmdldCh0aGlzLmJpYXNfKSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCByZWN1cnJlbnRCaWFzID0gdGhpcy5yZWN1cnJlbnRXZWlnaHRfID9cbiAgICAgICAgaW5wdXRUZW5zb3JzLmdldCh0aGlzLnJlY3VycmVudEJpYXNfKSA6XG4gICAgICAgIHVuZGVmaW5lZDtcbiAgICBjb25zdCBpbml0aWFsSGlkZGVuU3RhdGUgPSB0aGlzLmluaXRpYWxIaWRkZW5TdGF0ZV8gP1xuICAgICAgICBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMuaW5pdGlhbEhpZGRlblN0YXRlXykgOlxuICAgICAgICB1bmRlZmluZWQ7XG4gICAgY29uc3Qgc3RlcHMgPSB0aGlzLnN0ZXBzXztcbiAgICBjb25zdCBoaWRkZW5TaXplID0gdGhpcy5oaWRkZW5TaXplXztcbiAgICBjb25zdCByZXNldEFmdGVyID0gdGhpcy5yZXNldEFmdGVyXztcbiAgICBjb25zdCByZXR1cm5TZXF1ZW5jZSA9IHRoaXMucmV0dXJuU2VxdWVuY2VfO1xuICAgIGNvbnN0IGxheW91dCA9IHRoaXMubGF5b3V0XztcbiAgICBjb25zdCBhY3RpdmF0aW9ucyA9IHRoaXMuYWN0aXZhdGlvbnNfO1xuICAgIGNvbnN0IGRpcmVjdGlvbiA9IHRoaXMuZGlyZWN0aW9uXztcblxuICAgIGNvbnN0IG51bURpcmVjdGlvbnMgPVxuICAgICAgICAoZGlyZWN0aW9uID09PSBNTFJlY3VycmVudE5ldHdvcmtEaXJlY3Rpb24uYm90aCA/IDIgOiAxKTtcbiAgICBsZXQgaGlkZGVuU3RhdGUgPSBpbml0aWFsSGlkZGVuU3RhdGU7XG5cbiAgICBpZiAoaGlkZGVuU3RhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaGlkZGVuU3RhdGUgPSB0Zi56ZXJvcyhbbnVtRGlyZWN0aW9ucywgMSwgaGlkZGVuU2l6ZV0pO1xuICAgIH1cblxuICAgIGxldCBzZXF1ZW5jZTogdGYuVGVuc29yO1xuICAgIGNvbnN0IGNlbGxXZWlnaHQ6IHRmLlRlbnNvcltdID0gW107XG4gICAgY29uc3QgY2VsbFJlY3VycmVudFdlaWdodDogdGYuVGVuc29yW10gPSBbXTtcbiAgICBjb25zdCBjZWxsQmlhczogdGYuVGVuc29yW10gPSBbXTtcbiAgICBjb25zdCBjZWxsUmVjdXJyZW50QmlhczogdGYuVGVuc29yW10gPSBbXTtcblxuICAgIGZvciAobGV0IHNsb3QgPSAwOyBzbG90IDwgbnVtRGlyZWN0aW9uczsgKytzbG90KSB7XG4gICAgICBjZWxsV2VpZ2h0LnB1c2goXG4gICAgICAgICAgdGYuc3F1ZWV6ZSh0Zi5zbGljZSh3ZWlnaHQsIFtzbG90LCAwLCAwXSwgWzEsIC0xLCAtMV0pLCBbMF0pKTtcbiAgICAgIGNlbGxSZWN1cnJlbnRXZWlnaHQucHVzaCh0Zi5zcXVlZXplKFxuICAgICAgICAgIHRmLnNsaWNlKHJlY3VycmVudFdlaWdodCwgW3Nsb3QsIDAsIDBdLCBbMSwgLTEsIC0xXSksIFswXSkpO1xuICAgICAgY2VsbEJpYXMucHVzaChcbiAgICAgICAgICBiaWFzID8gKHRmLnNxdWVlemUodGYuc2xpY2UoYmlhcywgW3Nsb3QsIDBdLCBbMSwgLTFdKSwgWzBdKSkgOlxuICAgICAgICAgICAgICAgICB1bmRlZmluZWQpO1xuICAgICAgY2VsbFJlY3VycmVudEJpYXMucHVzaChcbiAgICAgICAgICByZWN1cnJlbnRCaWFzID9cbiAgICAgICAgICAgICAgKHRmLnNxdWVlemUodGYuc2xpY2UocmVjdXJyZW50QmlhcywgW3Nsb3QsIDBdLCBbMSwgLTFdKSwgWzBdKSkgOlxuICAgICAgICAgICAgICB1bmRlZmluZWQpO1xuICAgIH1cblxuICAgIGZvciAobGV0IHN0ZXAgPSAwOyBzdGVwIDwgc3RlcHM7ICsrc3RlcCkge1xuICAgICAgY29uc3QgY2VsbEhpZGRlbjogdGYuVGVuc29yW10gPSBbXTtcbiAgICAgIGxldCBjZWxsT3V0cHV0OiB0Zi5UZW5zb3I7XG5cbiAgICAgIGZvciAobGV0IHNsb3QgPSAwOyBzbG90IDwgbnVtRGlyZWN0aW9uczsgKytzbG90KSB7XG4gICAgICAgIGNlbGxIaWRkZW4ucHVzaChcbiAgICAgICAgICAgIHRmLnNxdWVlemUodGYuc2xpY2UoaGlkZGVuU3RhdGUsIFtzbG90LCAwLCAwXSwgWzEsIC0xLCAtMV0pLCBbMF0pKTtcbiAgICAgIH1cblxuICAgICAgZm9yIChsZXQgc2xvdCA9IDA7IHNsb3QgPCBudW1EaXJlY3Rpb25zOyArK3Nsb3QpIHtcbiAgICAgICAgY29uc3Qgc2xpY2UgPVxuICAgICAgICAgICAgKHNsb3QgPT09IDEgfHwgZGlyZWN0aW9uID09PSBNTFJlY3VycmVudE5ldHdvcmtEaXJlY3Rpb24uYmFja3dhcmQgP1xuICAgICAgICAgICAgICAgICBzdGVwcyAtIHN0ZXAgLSAxIDpcbiAgICAgICAgICAgICAgICAgc3RlcCk7XG4gICAgICAgIGNvbnN0IGNlbGxJbnB1dCA9XG4gICAgICAgICAgICB0Zi5zcXVlZXplKHRmLnNsaWNlKGlucHV0LCBbc2xpY2UsIDAsIDBdLCBbMSwgLTEsIC0xXSksIFswXSk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGYucmVzaGFwZShcbiAgICAgICAgICAgIEdydUNlbGwuY29tcHV0ZShcbiAgICAgICAgICAgICAgICBjZWxsSW5wdXQsIGNlbGxXZWlnaHRbc2xvdF0sIGNlbGxSZWN1cnJlbnRXZWlnaHRbc2xvdF0sXG4gICAgICAgICAgICAgICAgY2VsbEhpZGRlbltzbG90XSwgaGlkZGVuU2l6ZSwgYWN0aXZhdGlvbnMsIGNlbGxCaWFzW3Nsb3RdLFxuICAgICAgICAgICAgICAgIGNlbGxSZWN1cnJlbnRCaWFzW3Nsb3RdLCByZXNldEFmdGVyLCBsYXlvdXQpLFxuICAgICAgICAgICAgWzEsIC0xLCBoaWRkZW5TaXplXSk7XG5cbiAgICAgICAgY2VsbE91dHB1dCA9IChjZWxsT3V0cHV0ID8gdGYuY29uY2F0KFtjZWxsT3V0cHV0LCByZXN1bHRdLCAwKSA6IHJlc3VsdCk7XG4gICAgICB9XG5cbiAgICAgIGhpZGRlblN0YXRlID0gY2VsbE91dHB1dDtcblxuICAgICAgaWYgKHJldHVyblNlcXVlbmNlKSB7XG4gICAgICAgIGNlbGxPdXRwdXQgPSB0Zi5yZXNoYXBlKGNlbGxPdXRwdXQsIFsxLCBudW1EaXJlY3Rpb25zLCAtMSwgaGlkZGVuU2l6ZV0pO1xuICAgICAgICBzZXF1ZW5jZSA9XG4gICAgICAgICAgICAoc2VxdWVuY2UgPyB0Zi5jb25jYXQoW3NlcXVlbmNlLCBjZWxsT3V0cHV0XSwgMCkgOiBjZWxsT3V0cHV0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gW2hpZGRlblN0YXRlLCBzZXF1ZW5jZV07XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEdydUNlbGwgZXh0ZW5kcyBTaW5nbGVPdXRwdXRPcGVyYXRpb24ge1xuICBwcml2YXRlIGlucHV0XzogTUxPcGVyYW5kO1xuICBwcml2YXRlIHdlaWdodF86IE1MT3BlcmFuZDtcbiAgcHJpdmF0ZSByZWN1cnJlbnRXZWlnaHRfOiBNTE9wZXJhbmQ7XG4gIHByaXZhdGUgaGlkZGVuU3RhdGVfOiBNTE9wZXJhbmQ7XG4gIHByaXZhdGUgaGlkZGVuU2l6ZV86IG51bWJlcjtcbiAgcHJpdmF0ZSBiaWFzXz86IE1MT3BlcmFuZDtcbiAgcHJpdmF0ZSByZWN1cnJlbnRCaWFzXz86IE1MT3BlcmFuZDtcbiAgcHJpdmF0ZSByZXNldEFmdGVyXzogYm9vbGVhbjtcbiAgcHJpdmF0ZSBsYXlvdXRfOiBNTFJlY3VycmVudE5ldHdvcmtXZWlnaHRMYXlvdXQ7XG4gIHByaXZhdGUgYWN0aXZhdGlvbnNfOiBNTE9wZXJhdG9yW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBpbnB1dDogTUxPcGVyYW5kLCB3ZWlnaHQ6IE1MT3BlcmFuZCwgcmVjdXJyZW50V2VpZ2h0OiBNTE9wZXJhbmQsXG4gICAgICBoaWRkZW5TdGF0ZTogTUxPcGVyYW5kLCBoaWRkZW5TaXplOiBudW1iZXIsXG4gICAgICBvcHRpb25zOiBNTEdydUNlbGxPcHRpb25zID0ge30pIHtcbiAgICBzdXBlcihpbnB1dC5idWlsZGVyKTtcbiAgICB1dGlscy52YWxpZGF0ZU9wZXJhbmQoaW5wdXQpO1xuICAgIHRoaXMuaW5wdXRfID0gaW5wdXQ7XG4gICAgdXRpbHMudmFsaWRhdGVPcGVyYW5kKHdlaWdodCk7XG4gICAgdGhpcy53ZWlnaHRfID0gd2VpZ2h0O1xuICAgIHV0aWxzLnZhbGlkYXRlT3BlcmFuZChyZWN1cnJlbnRXZWlnaHQpO1xuICAgIHRoaXMucmVjdXJyZW50V2VpZ2h0XyA9IHJlY3VycmVudFdlaWdodDtcbiAgICB1dGlscy52YWxpZGF0ZU9wZXJhbmQoaGlkZGVuU3RhdGUpO1xuICAgIHRoaXMuaGlkZGVuU3RhdGVfID0gaGlkZGVuU3RhdGU7XG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICB1dGlscy5pc0ludGVnZXIoaGlkZGVuU2l6ZSkgJiYgaGlkZGVuU2l6ZSA+IDAsXG4gICAgICAgICdUaGUgaGlkZGVuU2l6ZSBwYXJhbWV0ZXIgaXMgaW52YWxpZC4nKTtcbiAgICB0aGlzLmhpZGRlblNpemVfID0gaGlkZGVuU2l6ZTtcbiAgICB0aGlzLmluaXRPcHRpb25zKFxuICAgICAgICBvcHRpb25zLmJpYXMsIG9wdGlvbnMucmVjdXJyZW50Qmlhcywgb3B0aW9ucy5yZXNldEFmdGVyLCBvcHRpb25zLmxheW91dCxcbiAgICAgICAgb3B0aW9ucy5hY3RpdmF0aW9ucyk7XG4gIH1cblxuICBwcml2YXRlIGluaXRPcHRpb25zKFxuICAgICAgYmlhcz86IE1MT3BlcmFuZCwgcmVjdXJyZW50Qmlhcz86IE1MT3BlcmFuZCwgcmVzZXRBZnRlciA9IHRydWUsXG4gICAgICBsYXlvdXQ6XG4gICAgICAgICAgTUxSZWN1cnJlbnROZXR3b3JrV2VpZ2h0TGF5b3V0ID0gTUxSZWN1cnJlbnROZXR3b3JrV2VpZ2h0TGF5b3V0LnpybixcbiAgICAgIGFjdGl2YXRpb25zOlxuICAgICAgICAgIE1MT3BlcmF0b3JbXSA9IFt0aGlzLmJ1aWxkZXIuc2lnbW9pZCgpLCB0aGlzLmJ1aWxkZXIudGFuaCgpXSkge1xuICAgIHV0aWxzLnZhbGlkYXRlT3B0aW9uYWxPcGVyYW5kKGJpYXMpO1xuICAgIHRoaXMuYmlhc18gPSBiaWFzO1xuICAgIHV0aWxzLnZhbGlkYXRlT3B0aW9uYWxPcGVyYW5kKHJlY3VycmVudEJpYXMpO1xuICAgIHRoaXMucmVjdXJyZW50Qmlhc18gPSByZWN1cnJlbnRCaWFzO1xuICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgdXRpbHMuaXNCb29sZWFuKHJlc2V0QWZ0ZXIpLFxuICAgICAgICAnVGhlIHJlc2V0QWZ0ZXIgcGFyYW1ldGVyIGlzIG5vdCBhIGJvb2xlYW4uJyk7XG4gICAgdGhpcy5yZXNldEFmdGVyXyA9IHJlc2V0QWZ0ZXI7XG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICBsYXlvdXQgaW4gTUxSZWN1cnJlbnROZXR3b3JrV2VpZ2h0TGF5b3V0LFxuICAgICAgICAnVGhlIGxheW91dCBwYXJhbWV0ZXIgaXMgaW52YWxpZC4nKTtcbiAgICB0aGlzLmxheW91dF8gPSBsYXlvdXQ7XG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICBhY3RpdmF0aW9ucyBpbnN0YW5jZW9mIEFycmF5ICYmIGFjdGl2YXRpb25zLmxlbmd0aCA9PT0gMiAmJlxuICAgICAgICAgICAgYWN0aXZhdGlvbnMuZXZlcnkoYSA9PiBhIGluc3RhbmNlb2YgVW5hcnlNTE9wZXJhdG9yKSxcbiAgICAgICAgJ1RoZSBhY3RpdmF0aW9ucyBwYXJhbWV0ZXIgaXMgaW52YWxpZC4nKTtcbiAgICB0aGlzLmFjdGl2YXRpb25zXyA9IGFjdGl2YXRpb25zO1xuICB9XG5cbiAgaW5wdXRzKCk6IE1MT3BlcmFuZFtdIHtcbiAgICBjb25zdCBpbnB1dHM6IE1MT3BlcmFuZFtdID1cbiAgICAgICAgW3RoaXMuaW5wdXRfLCB0aGlzLndlaWdodF8sIHRoaXMucmVjdXJyZW50V2VpZ2h0XywgdGhpcy5oaWRkZW5TdGF0ZV9dO1xuICAgIGlmICh0aGlzLmJpYXNfKSB7XG4gICAgICBpbnB1dHMucHVzaCh0aGlzLmJpYXNfKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucmVjdXJyZW50Qmlhc18pIHtcbiAgICAgIGlucHV0cy5wdXNoKHRoaXMucmVjdXJyZW50Qmlhc18pO1xuICAgIH1cbiAgICByZXR1cm4gaW5wdXRzO1xuICB9XG5cbiAgc3RhdGljIGNvbXB1dGUoXG4gICAgICBpbnB1dDogdGYuVGVuc29yLCB3ZWlnaHQ6IHRmLlRlbnNvciwgcmVjdXJyZW50V2VpZ2h0OiB0Zi5UZW5zb3IsXG4gICAgICBoaWRkZW5TdGF0ZTogdGYuVGVuc29yLCBoaWRkZW5TaXplOiBudW1iZXIsIGFjdGl2YXRpb25zOiBNTE9wZXJhdG9yW10sXG4gICAgICBiaWFzPzogdGYuVGVuc29yLCByZWN1cnJlbnRCaWFzPzogdGYuVGVuc29yLCByZXNldEFmdGVyID0gdHJ1ZSxcbiAgICAgIGxheW91dDpcbiAgICAgICAgICBNTFJlY3VycmVudE5ldHdvcmtXZWlnaHRMYXlvdXQgPSBNTFJlY3VycmVudE5ldHdvcmtXZWlnaHRMYXlvdXQuenJuKTpcbiAgICAgIHRmLlRlbnNvciB7XG4gICAgY29uc3Qgb25lID0gdGYuc2NhbGFyKDEpO1xuICAgIGNvbnN0IHplcm8gPSB0Zi5zY2FsYXIoMCk7XG4gICAgY29uc3Qgc3RhcnRzID0gbGF5b3V0ID09PSBNTFJlY3VycmVudE5ldHdvcmtXZWlnaHRMYXlvdXQuenJuID9cbiAgICAgICAge3o6IDAsIHI6IGhpZGRlblNpemUsIG46IDIgKiBoaWRkZW5TaXplfSA6XG4gICAgICAgIC8qcnpuKi8ge3I6IDAsIHo6IGhpZGRlblNpemUsIG46IDIgKiBoaWRkZW5TaXplfTtcbiAgICBjb25zdCBhY3RpdmF0aW9uMDogVW5hcnlNTE9wZXJhdG9yID0gYWN0aXZhdGlvbnNbMF0gYXMgVW5hcnlNTE9wZXJhdG9yO1xuICAgIGNvbnN0IGFjdGl2YXRpb24xOiBVbmFyeU1MT3BlcmF0b3IgPSBhY3RpdmF0aW9uc1sxXSBhcyBVbmFyeU1MT3BlcmF0b3I7XG4gICAgLy8gdXBkYXRlIGdhdGVcbiAgICBjb25zdCB6ID0gYWN0aXZhdGlvbjAucnVuT3AodGYuYWRkKFxuICAgICAgICB0Zi5hZGQoXG4gICAgICAgICAgICAoYmlhcyA/IHRmLnNsaWNlKGJpYXMsIFtzdGFydHMuel0sIFtoaWRkZW5TaXplXSkgOiB6ZXJvKSxcbiAgICAgICAgICAgIChyZWN1cnJlbnRCaWFzID8gdGYuc2xpY2UocmVjdXJyZW50QmlhcywgW3N0YXJ0cy56XSwgW2hpZGRlblNpemVdKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHplcm8pKSxcbiAgICAgICAgdGYuYWRkKFxuICAgICAgICAgICAgdGYubWF0TXVsKFxuICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgIHRmLnRyYW5zcG9zZShcbiAgICAgICAgICAgICAgICAgICAgdGYuc2xpY2Uod2VpZ2h0LCBbc3RhcnRzLnosIDBdLCBbaGlkZGVuU2l6ZSwgLTFdKSkpLFxuICAgICAgICAgICAgdGYubWF0TXVsKFxuICAgICAgICAgICAgICAgIGhpZGRlblN0YXRlLFxuICAgICAgICAgICAgICAgIHRmLnRyYW5zcG9zZSh0Zi5zbGljZShcbiAgICAgICAgICAgICAgICAgICAgcmVjdXJyZW50V2VpZ2h0LCBbc3RhcnRzLnosIDBdLCBbaGlkZGVuU2l6ZSwgLTFdKSkpKSkpO1xuICAgIC8vIHJlc2V0IGdhdGVcbiAgICBjb25zdCByID0gYWN0aXZhdGlvbjAucnVuT3AodGYuYWRkKFxuICAgICAgICB0Zi5hZGQoXG4gICAgICAgICAgICAoYmlhcyA/IHRmLnNsaWNlKGJpYXMsIFtzdGFydHMucl0sIFtoaWRkZW5TaXplXSkgOiB6ZXJvKSxcbiAgICAgICAgICAgIChyZWN1cnJlbnRCaWFzID8gdGYuc2xpY2UocmVjdXJyZW50QmlhcywgW3N0YXJ0cy5yXSwgW2hpZGRlblNpemVdKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHplcm8pKSxcbiAgICAgICAgdGYuYWRkKFxuICAgICAgICAgICAgdGYubWF0TXVsKFxuICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgIHRmLnRyYW5zcG9zZShcbiAgICAgICAgICAgICAgICAgICAgdGYuc2xpY2Uod2VpZ2h0LCBbc3RhcnRzLnIsIDBdLCBbaGlkZGVuU2l6ZSwgLTFdKSkpLFxuICAgICAgICAgICAgdGYubWF0TXVsKFxuICAgICAgICAgICAgICAgIGhpZGRlblN0YXRlLFxuICAgICAgICAgICAgICAgIHRmLnRyYW5zcG9zZSh0Zi5zbGljZShcbiAgICAgICAgICAgICAgICAgICAgcmVjdXJyZW50V2VpZ2h0LCBbc3RhcnRzLnIsIDBdLCBbaGlkZGVuU2l6ZSwgLTFdKSkpKSkpO1xuICAgIC8vIG5ldyBnYXRlXG4gICAgbGV0IG47XG4gICAgaWYgKHJlc2V0QWZ0ZXIpIHtcbiAgICAgIG4gPSBhY3RpdmF0aW9uMS5ydW5PcCh0Zi5hZGQoXG4gICAgICAgICAgKGJpYXMgPyB0Zi5zbGljZShiaWFzLCBbc3RhcnRzLm5dLCBbaGlkZGVuU2l6ZV0pIDogemVybyksXG4gICAgICAgICAgdGYuYWRkKFxuICAgICAgICAgICAgICB0Zi5tYXRNdWwoXG4gICAgICAgICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgICAgICAgIHRmLnRyYW5zcG9zZShcbiAgICAgICAgICAgICAgICAgICAgICB0Zi5zbGljZSh3ZWlnaHQsIFtzdGFydHMubiwgMF0sIFtoaWRkZW5TaXplLCAtMV0pKSksXG4gICAgICAgICAgICAgIHRmLm11bChcbiAgICAgICAgICAgICAgICAgIHIsXG4gICAgICAgICAgICAgICAgICB0Zi5hZGQoXG4gICAgICAgICAgICAgICAgICAgICAgKHJlY3VycmVudEJpYXMgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgdGYuc2xpY2UocmVjdXJyZW50QmlhcywgW3N0YXJ0cy5uXSwgW2hpZGRlblNpemVdKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICB6ZXJvKSxcbiAgICAgICAgICAgICAgICAgICAgICB0Zi5tYXRNdWwoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGRlblN0YXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0Zi50cmFuc3Bvc2UodGYuc2xpY2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN1cnJlbnRXZWlnaHQsIFtzdGFydHMubiwgMF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGlkZGVuU2l6ZSwgLTFdKSkpKSkpKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG4gPSBhY3RpdmF0aW9uMS5ydW5PcCh0Zi5hZGQoXG4gICAgICAgICAgdGYuYWRkKFxuICAgICAgICAgICAgICAoYmlhcyA/IHRmLnNsaWNlKGJpYXMsIFtzdGFydHMubl0sIFtoaWRkZW5TaXplXSkgOiB6ZXJvKSxcbiAgICAgICAgICAgICAgKHJlY3VycmVudEJpYXMgP1xuICAgICAgICAgICAgICAgICAgIHRmLnNsaWNlKHJlY3VycmVudEJpYXMsIFtzdGFydHMubl0sIFtoaWRkZW5TaXplXSkgOlxuICAgICAgICAgICAgICAgICAgIHplcm8pKSxcbiAgICAgICAgICB0Zi5hZGQoXG4gICAgICAgICAgICAgIHRmLm1hdE11bChcbiAgICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgICAgdGYudHJhbnNwb3NlKFxuICAgICAgICAgICAgICAgICAgICAgIHRmLnNsaWNlKHdlaWdodCwgW3N0YXJ0cy5uLCAwXSwgW2hpZGRlblNpemUsIC0xXSkpKSxcbiAgICAgICAgICAgICAgdGYubWF0TXVsKFxuICAgICAgICAgICAgICAgICAgdGYubXVsKHIsIGhpZGRlblN0YXRlKSxcbiAgICAgICAgICAgICAgICAgIHRmLnRyYW5zcG9zZSh0Zi5zbGljZShcbiAgICAgICAgICAgICAgICAgICAgICByZWN1cnJlbnRXZWlnaHQsIFtzdGFydHMubiwgMF0sIFtoaWRkZW5TaXplLCAtMV0pKSkpKSk7XG4gICAgfVxuICAgIC8vIGNvbXB1dGUgdGhlIG5ldyBoaWRkZW4gc3RhdGVcbiAgICByZXR1cm4gdGYuYWRkKHRmLm11bCh6LCBoaWRkZW5TdGF0ZSksIHRmLm11bChuLCB0Zi5zdWIob25lLCB6KSkpO1xuICB9XG5cbiAgcnVuKGlucHV0VGVuc29yczogTWFwPE1MT3BlcmFuZCwgdGYuVGVuc29yPik6IHRmLlRlbnNvciB7XG4gICAgcmV0dXJuIEdydUNlbGwuY29tcHV0ZShcbiAgICAgICAgaW5wdXRUZW5zb3JzLmdldCh0aGlzLmlucHV0XyksIGlucHV0VGVuc29ycy5nZXQodGhpcy53ZWlnaHRfKSxcbiAgICAgICAgaW5wdXRUZW5zb3JzLmdldCh0aGlzLnJlY3VycmVudFdlaWdodF8pLFxuICAgICAgICBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMuaGlkZGVuU3RhdGVfKSwgdGhpcy5oaWRkZW5TaXplXyxcbiAgICAgICAgdGhpcy5hY3RpdmF0aW9uc18sXG4gICAgICAgIHRoaXMuYmlhc18gPyBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMuYmlhc18pIDogdW5kZWZpbmVkLFxuICAgICAgICB0aGlzLnJlY3VycmVudEJpYXNfID8gaW5wdXRUZW5zb3JzLmdldCh0aGlzLnJlY3VycmVudEJpYXNfKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgdGhpcy5yZXNldEFmdGVyXywgdGhpcy5sYXlvdXRfKTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgdGYgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNTElucHV0T3BlcmFuZExheW91dCwgTUxJbnN0YW5jZU5vcm1hbGl6YXRpb25PcHRpb25zfSBmcm9tICcuLi9ncmFwaF9idWlsZGVyJztcbmltcG9ydCB7TUxPcGVyYW5kfSBmcm9tICcuLi9vcGVyYW5kJztcbmltcG9ydCB7U2luZ2xlT3V0cHV0T3BlcmF0aW9ufSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi4vdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgSW5zdGFuY2VOb3JtYWxpemF0aW9uIGV4dGVuZHMgU2luZ2xlT3V0cHV0T3BlcmF0aW9uIHtcbiAgcHJpdmF0ZSBpbnB1dF86IE1MT3BlcmFuZDtcbiAgcHJpdmF0ZSBzY2FsZV8/OiBNTE9wZXJhbmQ7XG4gIHByaXZhdGUgYmlhc18/OiBNTE9wZXJhbmQ7XG4gIHByaXZhdGUgZXBzaWxvbl8/OiBudW1iZXI7XG4gIHByaXZhdGUgbGF5b3V0XzogTUxJbnB1dE9wZXJhbmRMYXlvdXQ7XG5cbiAgY29uc3RydWN0b3IoaW5wdXQ6IE1MT3BlcmFuZCwgb3B0aW9uczogTUxJbnN0YW5jZU5vcm1hbGl6YXRpb25PcHRpb25zID0ge30pIHtcbiAgICBzdXBlcihpbnB1dC5idWlsZGVyKTtcbiAgICB1dGlscy52YWxpZGF0ZU9wZXJhbmQoaW5wdXQpO1xuICAgIHRoaXMuaW5wdXRfID0gaW5wdXQ7XG4gICAgdXRpbHMudmFsaWRhdGVPcHRpb25hbE9wZXJhbmQob3B0aW9ucy5zY2FsZSk7XG4gICAgdGhpcy5zY2FsZV8gPSBvcHRpb25zLnNjYWxlO1xuICAgIHV0aWxzLnZhbGlkYXRlT3B0aW9uYWxPcGVyYW5kKG9wdGlvbnMuYmlhcyk7XG4gICAgdGhpcy5iaWFzXyA9IG9wdGlvbnMuYmlhcztcbiAgICBpZiAob3B0aW9ucy5lcHNpbG9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGVwc2lsb24gPSBvcHRpb25zLmVwc2lsb247XG4gICAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgICAgdHlwZW9mIGVwc2lsb24gPT09ICdudW1iZXInLCAnVGhlIGVwc2lsb24gcGFyYW1ldGVyIGlzIGludmFsaWQnKTtcbiAgICAgIHRoaXMuZXBzaWxvbl8gPSBlcHNpbG9uO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVwc2lsb25fID0gMWUtNTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMubGF5b3V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgICBvcHRpb25zLmxheW91dCBpbiBNTElucHV0T3BlcmFuZExheW91dCxcbiAgICAgICAgICAnVGhlIGxheW91dCBwYXJhbWV0ZXIgaXMgaW52YWxpZC4nKTtcbiAgICAgIHRoaXMubGF5b3V0XyA9IG9wdGlvbnMubGF5b3V0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxheW91dF8gPSBNTElucHV0T3BlcmFuZExheW91dC5uY2h3O1xuICAgIH1cbiAgfVxuXG4gIGlucHV0cygpOiBNTE9wZXJhbmRbXSB7XG4gICAgY29uc3QgaW5wdXRzOiBNTE9wZXJhbmRbXSA9IFt0aGlzLmlucHV0X107XG4gICAgaWYgKHRoaXMuc2NhbGVfKSB7XG4gICAgICBpbnB1dHMucHVzaCh0aGlzLnNjYWxlXyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmJpYXNfKSB7XG4gICAgICBpbnB1dHMucHVzaCh0aGlzLmJpYXNfKTtcbiAgICB9XG4gICAgcmV0dXJuIGlucHV0cztcbiAgfVxuXG4gIHJ1bihpbnB1dFRlbnNvcnM6IE1hcDxNTE9wZXJhbmQsIHRmLlRlbnNvcj4pOiB0Zi5UZW5zb3Ige1xuICAgIGNvbnN0IGlucHV0OiB0Zi5UZW5zb3IgPSBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMuaW5wdXRfKTtcbiAgICB1dGlscy5hc3NlcnQoaW5wdXQucmFuayA9PT0gNCwgJ1RoZSBpbnB1dCBvcGVyYW5kIGlzIG5vdCA0LUQuJyk7XG4gICAgbGV0IGF4ZXMgPSBbMiwgM107XG4gICAgbGV0IHNoYXBlID0gWzEsIC0xLCAxLCAxXTtcbiAgICBsZXQgaW5wdXRDaGFubmVscyA9IGlucHV0LnNoYXBlWzFdO1xuICAgIGlmICh0aGlzLmxheW91dF8gPT09IE1MSW5wdXRPcGVyYW5kTGF5b3V0Lm5od2MpIHtcbiAgICAgIGF4ZXMgPSBbMSwgMl07XG4gICAgICBzaGFwZSA9IFsxLCAxLCAxLCAtMV07XG4gICAgICBpbnB1dENoYW5uZWxzID0gaW5wdXQuc2hhcGVbM107XG4gICAgfVxuICAgIGxldCBzY2FsZTogdGYuVGVuc29yO1xuICAgIGlmICh0aGlzLnNjYWxlXykge1xuICAgICAgc2NhbGUgPSBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMuc2NhbGVfKTtcbiAgICAgIHV0aWxzLmFzc2VydChzY2FsZS5yYW5rID09PSAxLCAnVGhlIHNjYWxlIG9wZXJhbmQgaXMgbm90IDEtRC4nKTtcbiAgICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgICBzY2FsZS5zaGFwZVswXSA9PT0gaW5wdXRDaGFubmVscyxcbiAgICAgICAgICAnVGhlIGxlbmd0aCBvZiBzY2FsZSBpcyBub3QgZXF1YWwgdG8gdGhlIHNpemUgb2YgdGhlIGZlYXR1cmUgJyArXG4gICAgICAgICAgICAgICdkaW1lbnNpb24gb2YgdGhlIGlucHV0LicpO1xuICAgIH0gZWxzZSB7XG4gICAgfVxuICAgIGxldCBiaWFzOiB0Zi5UZW5zb3I7XG4gICAgaWYgKHRoaXMuYmlhc18pIHtcbiAgICAgIGJpYXMgPSBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMuYmlhc18pO1xuICAgICAgdXRpbHMuYXNzZXJ0KGJpYXMucmFuayA9PT0gMSwgJ1RoZSBiaWFzIG9wZXJhbmQgaXMgbm90IDEtRC4nKTtcbiAgICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgICBiaWFzLnNoYXBlWzBdID09PSBpbnB1dENoYW5uZWxzLFxuICAgICAgICAgICdUaGUgbGVuZ3RoIG9mIGJpYXMgaXMgbm90IGVxdWFsIHRvIHRoZSBzaXplIG9mIHRoZSBmZWF0dXJlICcgK1xuICAgICAgICAgICAgICAnZGltZW5zaW9uIG9mIHRoZSBpbnB1dC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBtZWFuID0gdGYubWVhbihpbnB1dCwgYXhlcywgdHJ1ZSk7XG4gICAgY29uc3QgdmFyaWFuY2UgPSB0Zi5tZWFuKHRmLnBvdyh0Zi5zdWIoaW5wdXQsIG1lYW4pLCAyKSwgYXhlcywgdHJ1ZSk7XG4gICAgY29uc3Qgbm9ybSA9IHRmLmRpdihcbiAgICAgICAgdGYuc3ViKGlucHV0LCBtZWFuKSwgdGYucG93KHRmLmFkZCh2YXJpYW5jZSwgdGhpcy5lcHNpbG9uXyksIDAuNSkpO1xuICAgIGNvbnN0IHNjYWxlZCA9IHNjYWxlID8gdGYubXVsKHRmLnJlc2hhcGUoc2NhbGUsIHNoYXBlKSwgbm9ybSkgOiBub3JtO1xuICAgIHJldHVybiBiaWFzID8gdGYuYWRkKHRmLnJlc2hhcGUoYmlhcywgc2hhcGUpLCBzY2FsZWQpIDogc2NhbGVkO1xuICB9XG59IiwiaW1wb3J0ICogYXMgdGYgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNTE9wZXJhbmR9IGZyb20gJy4uL29wZXJhbmQnO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi4vdXRpbHMnO1xuXG5pbXBvcnQge1VuYXJ5TUxPcGVyYXRvcn0gZnJvbSAnLi91bmFyeSc7XG5cbmV4cG9ydCBjbGFzcyBMZWFreVJlbHUgZXh0ZW5kcyBVbmFyeU1MT3BlcmF0b3Ige1xuICBwcml2YXRlIGFscGhhXz86IG51bWJlcjtcblxuICBnZXQgYWxwaGEoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5hbHBoYV87XG4gIH1cblxuICBjb25zdHJ1Y3Rvcih4OiBNTE9wZXJhbmQsIGFscGhhID0gMC4wMSkge1xuICAgIHN1cGVyKHgpO1xuICAgIHV0aWxzLmFzc2VydCh0eXBlb2YgYWxwaGEgPT09ICdudW1iZXInLCAnVGhlIGFscGhhIHBhcmFtZXRlciBpcyBpbnZhbGlkLicpO1xuICAgIHRoaXMuYWxwaGFfID0gYWxwaGE7XG4gIH1cblxuICBydW5PcCh4OiB0Zi5UZW5zb3IpOiB0Zi5UZW5zb3Ige1xuICAgIHJldHVybiB0Zi5sZWFreVJlbHUoeCwgdGhpcy5hbHBoYV8pO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyB0ZiBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01MUGFkZGluZ01vZGUsIE1MUGFkT3B0aW9uc30gZnJvbSAnLi4vZ3JhcGhfYnVpbGRlcic7XG5pbXBvcnQge01MT3BlcmFuZH0gZnJvbSAnLi4vb3BlcmFuZCc7XG5pbXBvcnQge1NpbmdsZU91dHB1dE9wZXJhdGlvbn0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJy4uL3V0aWxzJztcblxuZXhwb3J0IGNsYXNzIFBhZCBleHRlbmRzIFNpbmdsZU91dHB1dE9wZXJhdGlvbiB7XG4gIHByaXZhdGUgaW5wdXRfOiBNTE9wZXJhbmQ7XG4gIHByaXZhdGUgcGFkZGluZ186IE1MT3BlcmFuZDtcbiAgcHJpdmF0ZSBtb2RlXzogTUxQYWRkaW5nTW9kZSA9IE1MUGFkZGluZ01vZGUuY29uc3RhbnQ7XG4gIHByaXZhdGUgdmFsdWVfID0gMDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIGlucHV0OiBNTE9wZXJhbmQsIHBhZGRpbmc6IE1MT3BlcmFuZCwgb3B0aW9uczogTUxQYWRPcHRpb25zID0ge30pIHtcbiAgICBzdXBlcihpbnB1dC5idWlsZGVyKTtcbiAgICB1dGlscy52YWxpZGF0ZU9wZXJhbmQoaW5wdXQpO1xuICAgIHRoaXMuaW5wdXRfID0gaW5wdXQ7XG4gICAgdXRpbHMudmFsaWRhdGVPcGVyYW5kKHBhZGRpbmcpO1xuICAgIHRoaXMucGFkZGluZ18gPSBwYWRkaW5nO1xuICAgIGlmIChvcHRpb25zLm1vZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICAgIG9wdGlvbnMubW9kZSBpbiBNTFBhZGRpbmdNb2RlLCAnVGhlIG1vZGUgcGFyYW1ldGVyIGlzIGludmFsaWQuJyk7XG4gICAgICB0aGlzLm1vZGVfID0gb3B0aW9ucy5tb2RlO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy52YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnZhbHVlXyA9IG9wdGlvbnMudmFsdWU7XG4gICAgfVxuICB9XG5cbiAgaW5wdXRzKCk6IE1MT3BlcmFuZFtdIHtcbiAgICByZXR1cm4gW3RoaXMuaW5wdXRfLCB0aGlzLnBhZGRpbmdfXTtcbiAgfVxuXG4gIHJ1bihpbnB1dFRlbnNvcnM6IE1hcDxNTE9wZXJhbmQsIHRmLlRlbnNvcj4pOiB0Zi5UZW5zb3Ige1xuICAgIGNvbnN0IGlucHV0OiB0Zi5UZW5zb3IgPSBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMuaW5wdXRfKTtcbiAgICBjb25zdCBwYWRkaW5nOiB0Zi5UZW5zb3IgPSBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMucGFkZGluZ18pO1xuICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgcGFkZGluZy5yYW5rID09PSAyICYmIHBhZGRpbmcuZHR5cGUgPT09ICdpbnQzMicgJiZcbiAgICAgICAgICAgIHBhZGRpbmcuc2hhcGVbMF0gPT09IGlucHV0LnJhbmssXG4gICAgICAgICdUaGUgcGFkZGluZyBvcGVyYW5kIGlzIGludmFsaWQuJyk7XG4gICAgY29uc3QgcGFkZGluZ0FycmF5ID0gcGFkZGluZy5hcnJheVN5bmMoKSBhcyBBcnJheTxbbnVtYmVyLCBudW1iZXJdPjtcbiAgICBpZiAodGhpcy5tb2RlXyA9PT0gTUxQYWRkaW5nTW9kZS5jb25zdGFudCkge1xuICAgICAgcmV0dXJuIHRmLnBhZChpbnB1dCwgcGFkZGluZ0FycmF5LCB0aGlzLnZhbHVlXyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLm1vZGVfID09PSBNTFBhZGRpbmdNb2RlLmVkZ2UpIHtcbiAgICAgICAgY29uc3QgZWRnZVBhZGRpbmdzOiBBcnJheTxbbnVtYmVyLCBudW1iZXJdPiA9XG4gICAgICAgICAgICBuZXcgQXJyYXkocGFkZGluZ0FycmF5Lmxlbmd0aCk7XG4gICAgICAgIGxldCBwYWRkZWQ6IHRmLlRlbnNvciA9IGlucHV0O1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYWRkaW5nQXJyYXkubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGVkZ2VQYWRkaW5nc1tpXSA9IFswLCAwXTtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgMjsgKytqKSB7XG4gICAgICAgICAgICAgIGlmIChwYWRkaW5nQXJyYXlbaV1bal0gPiAwKSB7XG4gICAgICAgICAgICAgICAgZWRnZVBhZGRpbmdzW2ldW2pdID0gMTtcbiAgICAgICAgICAgICAgICBwYWRkaW5nQXJyYXlbaV1bal0gLT0gMTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBlZGdlUGFkZGluZ3NbaV1bal0gPSAwO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChlZGdlUGFkZGluZ3MuZXZlcnkodmFsdWUgPT4gdmFsdWVbMF0gPT09IDAgJiYgdmFsdWVbMV0gPT09IDApKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgcGFkZGVkID0gdGYubWlycm9yUGFkKHBhZGRlZCwgZWRnZVBhZGRpbmdzLCAnc3ltbWV0cmljJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhZGRlZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBtb2RlOiAncmVmbGVjdCd8J3N5bW1ldHJpYyc7XG4gICAgICAgIGlmICh0aGlzLm1vZGVfID09PSBNTFBhZGRpbmdNb2RlLnJlZmxlY3Rpb24pIHtcbiAgICAgICAgICBtb2RlID0gJ3JlZmxlY3QnO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubW9kZV8gPT09IE1MUGFkZGluZ01vZGUuc3ltbWV0cmljKSB7XG4gICAgICAgICAgbW9kZSA9ICdzeW1tZXRyaWMnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0Zi5taXJyb3JQYWQoaW5wdXQsIHBhZGRpbmdBcnJheSwgbW9kZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59IiwiaW1wb3J0ICogYXMgdGYgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7RXhwbGljaXRQYWRkaW5nfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUvc3JjL29wcy9jb252X3V0aWwnO1xuXG5pbXBvcnQge01MQXV0b1BhZCwgTUxJbnB1dE9wZXJhbmRMYXlvdXQsIE1MUG9vbGluZzJkT3B0aW9uc30gZnJvbSAnLi4vZ3JhcGhfYnVpbGRlcic7XG5pbXBvcnQge01MT3BlcmFuZH0gZnJvbSAnLi4vb3BlcmFuZCc7XG5pbXBvcnQge1NpbmdsZU91dHB1dE9wZXJhdGlvbn0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJy4uL3V0aWxzJztcblxudHlwZSBQb29saW5nVHlwZSA9ICdhdmcnfCdtYXgnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUG9vbCBleHRlbmRzIFNpbmdsZU91dHB1dE9wZXJhdGlvbiB7XG4gIHByb3RlY3RlZCBpbnB1dF86IE1MT3BlcmFuZDtcbiAgcHJvdGVjdGVkIHdpbmRvd0RpbWVuc2lvbnNfPzogW251bWJlciwgbnVtYmVyXTtcbiAgcHJvdGVjdGVkIHBhZGRpbmdfPzogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG4gIHByb3RlY3RlZCBzdHJpZGVzXz86IFtudW1iZXIsIG51bWJlcl07XG4gIHByb3RlY3RlZCBkaWxhdGlvbnNfPzogW251bWJlciwgbnVtYmVyXTtcbiAgcHJvdGVjdGVkIGdyb3Vwc18/OiBudW1iZXI7XG4gIHByb3RlY3RlZCBsYXlvdXRfPzogTUxJbnB1dE9wZXJhbmRMYXlvdXQ7XG4gIHByaXZhdGUgYXV0b1BhZF8/OiBNTEF1dG9QYWQ7XG5cbiAgY29uc3RydWN0b3IoaW5wdXQ6IE1MT3BlcmFuZCwgb3B0aW9uczogTUxQb29saW5nMmRPcHRpb25zID0ge30pIHtcbiAgICBzdXBlcihpbnB1dC5idWlsZGVyKTtcbiAgICB1dGlscy52YWxpZGF0ZU9wZXJhbmQoaW5wdXQpO1xuICAgIHRoaXMuaW5wdXRfID0gaW5wdXQ7XG4gICAgdGhpcy5pbml0T3B0aW9ucyhcbiAgICAgICAgb3B0aW9ucy53aW5kb3dEaW1lbnNpb25zLCBvcHRpb25zLnBhZGRpbmcsIG9wdGlvbnMuc3RyaWRlcyxcbiAgICAgICAgb3B0aW9ucy5kaWxhdGlvbnMsIG9wdGlvbnMubGF5b3V0LCBvcHRpb25zLmF1dG9QYWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0T3B0aW9ucyhcbiAgICAgIHdpbmRvd0RpbWVuc2lvbnM6IFtudW1iZXIsIG51bWJlcl0gPSBbLTEsIC0xXSxcbiAgICAgIHBhZGRpbmc6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID0gWzAsIDAsIDAsIDBdLFxuICAgICAgc3RyaWRlczogW251bWJlciwgbnVtYmVyXSA9IFsxLCAxXSwgZGlsYXRpb25zOiBbbnVtYmVyLCBudW1iZXJdID0gWzEsIDFdLFxuICAgICAgbGF5b3V0OiBNTElucHV0T3BlcmFuZExheW91dCA9IE1MSW5wdXRPcGVyYW5kTGF5b3V0Lm5jaHcsXG4gICAgICBhdXRvUGFkOiBNTEF1dG9QYWQgPSBNTEF1dG9QYWQuZXhwbGljaXQpIHtcbiAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgIHV0aWxzLmlzSW50ZWdlckFycmF5KHdpbmRvd0RpbWVuc2lvbnMpICYmIHdpbmRvd0RpbWVuc2lvbnMubGVuZ3RoID09PSAyLFxuICAgICAgICAnVGhlIHBhZGRpbmcgcGFyYW1ldGVyIGlzIGludmFsaWQuJyk7XG4gICAgdGhpcy53aW5kb3dEaW1lbnNpb25zXyA9IHdpbmRvd0RpbWVuc2lvbnM7XG5cbiAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgIHV0aWxzLmlzSW50ZWdlckFycmF5KHBhZGRpbmcpICYmIHBhZGRpbmcubGVuZ3RoID09PSA0LFxuICAgICAgICAnVGhlIHBhZGRpbmcgcGFyYW1ldGVyIGlzIGludmFsaWQuJyk7XG4gICAgdGhpcy5wYWRkaW5nXyA9IHBhZGRpbmc7XG5cbiAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgIHV0aWxzLmlzSW50ZWdlckFycmF5KHN0cmlkZXMpICYmIHN0cmlkZXMubGVuZ3RoID09PSAyLFxuICAgICAgICAnVGhlIHN0cmlkZXMgcGFyYW1ldGVyIGlzIGludmFsaWQuJyk7XG4gICAgdGhpcy5zdHJpZGVzXyA9IHN0cmlkZXM7XG5cbiAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgIHV0aWxzLmlzSW50ZWdlckFycmF5KGRpbGF0aW9ucykgJiYgZGlsYXRpb25zLmxlbmd0aCA9PT0gMixcbiAgICAgICAgJ1RoZSBkaWxhdGlvbnMgcGFyYW1ldGVyIGlzIGludmFsaWQuJyk7XG4gICAgdGhpcy5kaWxhdGlvbnNfID0gZGlsYXRpb25zO1xuXG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICBsYXlvdXQgaW4gTUxJbnB1dE9wZXJhbmRMYXlvdXQsICdUaGUgbGF5b3V0IHBhcmFtZXRlciBpcyBpbnZhbGlkLicpO1xuICAgIHRoaXMubGF5b3V0XyA9IGxheW91dDtcblxuICAgIHV0aWxzLmFzc2VydChhdXRvUGFkIGluIE1MQXV0b1BhZCwgJ1RoZSBhdXRvUGFkIHBhcmFtZXRlciBpcyBpbnZhbGlkLicpO1xuICAgIHRoaXMuYXV0b1BhZF8gPSBhdXRvUGFkO1xuICB9XG5cbiAgaW5wdXRzKCk6IE1MT3BlcmFuZFtdIHtcbiAgICByZXR1cm4gW3RoaXMuaW5wdXRfXTtcbiAgfVxuXG4gIHJ1bihpbnB1dFRlbnNvcnM6IE1hcDxNTE9wZXJhbmQsIHRmLlRlbnNvcj4pOiB0Zi5UZW5zb3Ige1xuICAgIGxldCBpbnB1dDogdGYuVGVuc29yNEQgPSBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMuaW5wdXRfKSBhcyB0Zi5UZW5zb3I0RDtcbiAgICBjb25zdCBwb29saW5nVHlwZSA9IHRoaXMuZ2V0UG9vbGluZ1R5cGUoKTtcbiAgICBpZiAodGhpcy5sYXlvdXRfID09PSBNTElucHV0T3BlcmFuZExheW91dC5uY2h3KSB7XG4gICAgICAvLyBuY2h3IC0+IG5od2NcbiAgICAgIGlucHV0ID0gdGYudHJhbnNwb3NlKGlucHV0LCBbMCwgMiwgMywgMV0pO1xuICAgIH1cbiAgICBjb25zdCB3aW5kb3dEaW1lbnNpb25zID0gdGhpcy53aW5kb3dEaW1lbnNpb25zXztcbiAgICBpZiAod2luZG93RGltZW5zaW9uc1swXSA9PT0gLTEgJiYgd2luZG93RGltZW5zaW9uc1sxXSA9PT0gLTEpIHtcbiAgICAgIHdpbmRvd0RpbWVuc2lvbnNbMF0gPSBpbnB1dC5zaGFwZVsxXTtcbiAgICAgIHdpbmRvd0RpbWVuc2lvbnNbMV0gPSBpbnB1dC5zaGFwZVsyXTtcbiAgICB9XG4gICAgbGV0IHBhZGRpbmc6ICd2YWxpZCd8J3NhbWUnfEV4cGxpY2l0UGFkZGluZztcbiAgICBpZiAodGhpcy5hdXRvUGFkXyA9PT0gTUxBdXRvUGFkLmV4cGxpY2l0KSB7XG4gICAgICBpZiAodGhpcy5wYWRkaW5nXy5ldmVyeSh2ID0+IHYgPT09IDApKSB7XG4gICAgICAgIHBhZGRpbmcgPSAndmFsaWQnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFkZGluZyA9IFtcbiAgICAgICAgICBbMCwgMF0sIFt0aGlzLnBhZGRpbmdfWzBdLCB0aGlzLnBhZGRpbmdfWzFdXSxcbiAgICAgICAgICBbdGhpcy5wYWRkaW5nX1syXSwgdGhpcy5wYWRkaW5nX1szXV0sIFswLCAwXVxuICAgICAgICBdIGFzIEV4cGxpY2l0UGFkZGluZztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuYXV0b1BhZF8gPT09IE1MQXV0b1BhZFsnc2FtZS11cHBlciddKSB7XG4gICAgICAgIHBhZGRpbmcgPSAnc2FtZSc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIGV4cGxpY2l0IHBhZGRpbmdzIGZvciAnc2FtZS1sb3dlcidcbiAgICAgICAgcGFkZGluZyA9IFtbMCwgMF0sIFswLCAwXSwgWzAsIDBdLCBbMCwgMF1dO1xuICAgICAgICBjb25zdCBvdXRwdXRTaXplcyA9IFswLCAwXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAyOyArK2kpIHtcbiAgICAgICAgICBvdXRwdXRTaXplc1tpXSA9IE1hdGguY2VpbChpbnB1dC5zaGFwZVsxICsgaV0gLyB0aGlzLnN0cmlkZXNfW2ldKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0b3RhbFBhZGRpbmc6IFtudW1iZXIsIG51bWJlcl0gPSBbMCwgMF07XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMjsgKytpKSB7XG4gICAgICAgICAgdG90YWxQYWRkaW5nW2ldID0gdGhpcy5zdHJpZGVzX1tpXSAqIChvdXRwdXRTaXplc1tpXSAtIDEpICtcbiAgICAgICAgICAgICAgKCh3aW5kb3dEaW1lbnNpb25zW2ldIC0gMSkgKiB0aGlzLmRpbGF0aW9uc19baV0gKyAxKSAtXG4gICAgICAgICAgICAgIGlucHV0LnNoYXBlWzEgKyBpXTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDI7ICsraSkge1xuICAgICAgICAgIHBhZGRpbmdbaSArIDFdWzBdID0gdG90YWxQYWRkaW5nW2ldIC0gTWF0aC5mbG9vcih0b3RhbFBhZGRpbmdbaV0gLyAyKTtcbiAgICAgICAgICBwYWRkaW5nW2kgKyAxXVsxXSA9IE1hdGguZmxvb3IodG90YWxQYWRkaW5nW2ldIC8gMik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgb3V0cHV0ID0gdGYucG9vbChcbiAgICAgICAgaW5wdXQsIHRoaXMud2luZG93RGltZW5zaW9uc18sIHBvb2xpbmdUeXBlLCBwYWRkaW5nLCB0aGlzLmRpbGF0aW9uc18sXG4gICAgICAgIHRoaXMuc3RyaWRlc18pO1xuICAgIGlmICh0aGlzLmxheW91dF8gPT09IE1MSW5wdXRPcGVyYW5kTGF5b3V0Lm5jaHcpIHtcbiAgICAgIC8vIG5od2MgLT4gbmNod1xuICAgICAgb3V0cHV0ID0gdGYudHJhbnNwb3NlKG91dHB1dCwgWzAsIDMsIDEsIDJdKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfVxuXG4gIGFic3RyYWN0IGdldFBvb2xpbmdUeXBlKCk6IFBvb2xpbmdUeXBlO1xufVxuXG5leHBvcnQgY2xhc3MgQXZlcmFnZVBvb2wyZCBleHRlbmRzIFBvb2wge1xuICBnZXRQb29saW5nVHlwZSgpOiBQb29saW5nVHlwZSB7XG4gICAgcmV0dXJuICdhdmcnO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNYXhQb29sMmQgZXh0ZW5kcyBQb29sIHtcbiAgZ2V0UG9vbGluZ1R5cGUoKTogUG9vbGluZ1R5cGUge1xuICAgIHJldHVybiAnbWF4JztcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgdGYgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNTFJlZHVjZU9wdGlvbnN9IGZyb20gJy4uL2dyYXBoX2J1aWxkZXInO1xuaW1wb3J0IHtNTE9wZXJhbmR9IGZyb20gJy4uL29wZXJhbmQnO1xuaW1wb3J0IHtTaW5nbGVPdXRwdXRPcGVyYXRpb259IGZyb20gJy4uL29wZXJhdGlvbic7XG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tICcuLi91dGlscyc7XG5cbmFic3RyYWN0IGNsYXNzIFJlZHVjZSBleHRlbmRzIFNpbmdsZU91dHB1dE9wZXJhdGlvbiB7XG4gIHByaXZhdGUgaW5wdXRfOiBNTE9wZXJhbmQ7XG4gIHByaXZhdGUgYXhlc18/OiBudW1iZXJbXTtcbiAgcHJpdmF0ZSBrZWVwRGltZW5zaW9uc18/OiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKGlucHV0OiBNTE9wZXJhbmQsIG9wdGlvbnM6IE1MUmVkdWNlT3B0aW9ucyA9IHt9KSB7XG4gICAgc3VwZXIoaW5wdXQuYnVpbGRlcik7XG4gICAgdXRpbHMudmFsaWRhdGVPcGVyYW5kKGlucHV0KTtcbiAgICB0aGlzLmlucHV0XyA9IGlucHV0O1xuICAgIGlmIChvcHRpb25zLmF4ZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICAgIHV0aWxzLmlzSW50ZWdlckFycmF5KG9wdGlvbnMuYXhlcyksICdUaGUgYXhlcyBwYXJhbWV0ZXIgaXMgaW52YWxpZC4nKTtcbiAgICAgIHRoaXMuYXhlc18gPSBvcHRpb25zLmF4ZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYXhlc18gPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmtlZXBEaW1lbnNpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgICB1dGlscy5pc0Jvb2xlYW4ob3B0aW9ucy5rZWVwRGltZW5zaW9ucyksXG4gICAgICAgICAgJ1RoZSBrZWVwRGltZW5zaW9ucyBwYXJhbWV0ZXIgaXMgbm90IGEgYm9vbGVhbi4nKTtcbiAgICAgIHRoaXMua2VlcERpbWVuc2lvbnNfID0gb3B0aW9ucy5rZWVwRGltZW5zaW9ucztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5rZWVwRGltZW5zaW9uc18gPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBpbnB1dHMoKTogTUxPcGVyYW5kW10ge1xuICAgIHJldHVybiBbdGhpcy5pbnB1dF9dO1xuICB9XG5cbiAgcnVuKGlucHV0VGVuc29yczogTWFwPE1MT3BlcmFuZCwgdGYuVGVuc29yPik6IHRmLlRlbnNvciB7XG4gICAgY29uc3QgaW5wdXQ6IHRmLlRlbnNvciA9IGlucHV0VGVuc29ycy5nZXQodGhpcy5pbnB1dF8pO1xuICAgIC8vIGFjY2VwdHMgYXhpcyByYW5nZSBbLXIsIHIpXG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICB1dGlscy52YWxpZGF0ZUF4ZXModGhpcy5heGVzXywgaW5wdXQucmFuayksXG4gICAgICAgIGBUaGUgYXhlcyBtdXN0IGJlIGluIHJhbmdlIFstJHtpbnB1dC5yYW5rfSwgJHtpbnB1dC5yYW5rfSlgKTtcbiAgICByZXR1cm4gdGhpcy5ydW5PcChpbnB1dCwgdGhpcy5heGVzXywgdGhpcy5rZWVwRGltZW5zaW9uc18pO1xuICB9XG5cbiAgYWJzdHJhY3QgcnVuT3AoaW5wdXQ6IHRmLlRlbnNvciwgYXhlczogbnVtYmVyW10sIGtlZXBEaW1lbnNpb25zOiBib29sZWFuKTpcbiAgICAgIHRmLlRlbnNvcjtcbn1cblxuZXhwb3J0IGNsYXNzIFJlZHVjZUxvZ1N1bUV4cCBleHRlbmRzIFJlZHVjZSB7XG4gIHJ1bk9wKGlucHV0OiB0Zi5UZW5zb3IsIGF4ZXM6IG51bWJlcltdLCBrZWVwRGltZW5zaW9uczogYm9vbGVhbik6IHRmLlRlbnNvciB7XG4gICAgcmV0dXJuIHRmLmxvZ1N1bUV4cChpbnB1dCwgYXhlcywga2VlcERpbWVuc2lvbnMpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSZWR1Y2VNYXggZXh0ZW5kcyBSZWR1Y2Uge1xuICBydW5PcChpbnB1dDogdGYuVGVuc29yLCBheGVzOiBudW1iZXJbXSwga2VlcERpbWVuc2lvbnM6IGJvb2xlYW4pOiB0Zi5UZW5zb3Ige1xuICAgIHJldHVybiB0Zi5tYXgoaW5wdXQsIGF4ZXMsIGtlZXBEaW1lbnNpb25zKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmVkdWNlTWVhbiBleHRlbmRzIFJlZHVjZSB7XG4gIHJ1bk9wKGlucHV0OiB0Zi5UZW5zb3IsIGF4ZXM6IG51bWJlcltdLCBrZWVwRGltZW5zaW9uczogYm9vbGVhbik6IHRmLlRlbnNvciB7XG4gICAgcmV0dXJuIHRmLm1lYW4oaW5wdXQsIGF4ZXMsIGtlZXBEaW1lbnNpb25zKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmVkdWNlTWluIGV4dGVuZHMgUmVkdWNlIHtcbiAgcnVuT3AoaW5wdXQ6IHRmLlRlbnNvciwgYXhlczogbnVtYmVyW10sIGtlZXBEaW1lbnNpb25zOiBib29sZWFuKTogdGYuVGVuc29yIHtcbiAgICByZXR1cm4gdGYubWluKGlucHV0LCBheGVzLCBrZWVwRGltZW5zaW9ucyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJlZHVjZVByb2R1Y3QgZXh0ZW5kcyBSZWR1Y2Uge1xuICBydW5PcChpbnB1dDogdGYuVGVuc29yLCBheGVzOiBudW1iZXJbXSwga2VlcERpbWVuc2lvbnM6IGJvb2xlYW4pOiB0Zi5UZW5zb3Ige1xuICAgIHJldHVybiB0Zi5wcm9kKGlucHV0LCBheGVzLCBrZWVwRGltZW5zaW9ucyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJlZHVjZVN1bSBleHRlbmRzIFJlZHVjZSB7XG4gIHJ1bk9wKGlucHV0OiB0Zi5UZW5zb3IsIGF4ZXM6IG51bWJlcltdLCBrZWVwRGltZW5zaW9uczogYm9vbGVhbik6IHRmLlRlbnNvciB7XG4gICAgcmV0dXJuIHRmLnN1bShpbnB1dCwgYXhlcywga2VlcERpbWVuc2lvbnMpO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyB0ZiBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01MSW50ZXJwb2xhdGlvbk1vZGUsIE1MUmVzYW1wbGVPcHRpb25zfSBmcm9tICcuLi9ncmFwaF9idWlsZGVyJztcbmltcG9ydCB7TUxPcGVyYW5kfSBmcm9tICcuLi9vcGVyYW5kJztcbmltcG9ydCB7U2luZ2xlT3V0cHV0T3BlcmF0aW9ufSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi4vdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgUmVzYW1wbGUgZXh0ZW5kcyBTaW5nbGVPdXRwdXRPcGVyYXRpb24ge1xuICBwcml2YXRlIGlucHV0XzogTUxPcGVyYW5kO1xuICBwcml2YXRlIG1vZGVfOiBNTEludGVycG9sYXRpb25Nb2RlID0gTUxJbnRlcnBvbGF0aW9uTW9kZVsnbmVhcmVzdC1uZWlnaGJvciddO1xuICBwcml2YXRlIHNjYWxlc186IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuICBwcml2YXRlIHNpemVzXzogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG5cbiAgY29uc3RydWN0b3IoaW5wdXQ6IE1MT3BlcmFuZCwgb3B0aW9uczogTUxSZXNhbXBsZU9wdGlvbnMgPSB7fSkge1xuICAgIHN1cGVyKGlucHV0LmJ1aWxkZXIpO1xuICAgIHV0aWxzLnZhbGlkYXRlT3BlcmFuZChpbnB1dCk7XG4gICAgdGhpcy5pbnB1dF8gPSBpbnB1dDtcbiAgICBpZiAob3B0aW9ucy5zY2FsZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgYXJyYXkgPSBvcHRpb25zLnNjYWxlcztcbiAgICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgICBhcnJheSBpbnN0YW5jZW9mIEFycmF5ICYmIGFycmF5LmV2ZXJ5KHYgPT4gdHlwZW9mIHYgPT09ICdudW1iZXInKSAmJlxuICAgICAgICAgICAgICBhcnJheS5sZW5ndGggPT09IDQsXG4gICAgICAgICAgJ1RoZSBzY2FsZXMgcGFyYW1ldGVyIGlzIGludmFsaWQuJyk7XG4gICAgICB0aGlzLnNjYWxlc18gPSBvcHRpb25zLnNjYWxlcztcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuc2l6ZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICAgIHV0aWxzLmlzSW50ZWdlckFycmF5KG9wdGlvbnMuc2l6ZXMpICYmIG9wdGlvbnMuc2l6ZXMubGVuZ3RoID09PSA0LFxuICAgICAgICAgICdUaGUgc2l6ZXMgcGFyYW1ldGVyIGlzIGludmFsaWQuJyk7XG4gICAgICB0aGlzLnNpemVzXyA9IG9wdGlvbnMuc2l6ZXM7XG4gICAgICB0aGlzLnNjYWxlc18gPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgdGhpcy5zY2FsZXNfICE9PSB1bmRlZmluZWQgfHwgdGhpcy5zaXplc18gIT09IHVuZGVmaW5lZCxcbiAgICAgICAgJ1RoZSBzY2FsZXMgb3Igc2l6ZXMgcGFyYW1ldGVyIGlzIG5vdCBwcm92aWVkLicpO1xuICAgIGlmIChvcHRpb25zLm1vZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICAgIG9wdGlvbnMubW9kZSBpbiBNTEludGVycG9sYXRpb25Nb2RlLFxuICAgICAgICAgICdUaGUgbW9kZSBwYXJhbWV0ZXIgaXMgaW52YWxpZC4nKTtcbiAgICAgIHRoaXMubW9kZV8gPSBvcHRpb25zLm1vZGU7XG4gICAgfVxuICB9XG5cbiAgaW5wdXRzKCk6IE1MT3BlcmFuZFtdIHtcbiAgICByZXR1cm4gW3RoaXMuaW5wdXRfXTtcbiAgfVxuXG4gIHJ1bihpbnB1dFRlbnNvcnM6IE1hcDxNTE9wZXJhbmQsIHRmLlRlbnNvcj4pOiB0Zi5UZW5zb3Ige1xuICAgIGxldCBpbnB1dDogdGYuVGVuc29yNEQgPSBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMuaW5wdXRfKSBhcyB0Zi5UZW5zb3I0RDtcbiAgICB1dGlscy5hc3NlcnQoaW5wdXQucmFuayA9PT0gNCwgJ1RoZSBpbnB1dCB0ZW5zb3IgaXMgbm90IDQtRC4nKTtcbiAgICBjb25zdCBzaXplczogW251bWJlciwgbnVtYmVyXSA9IFswLCAwXTtcbiAgICBsZXQgdHJhbnNwb3NlZCA9IGZhbHNlO1xuICAgIGlmICh0aGlzLnNpemVzXyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodGhpcy5zaXplc19bMF0gPT09IGlucHV0LnNoYXBlWzBdICYmXG4gICAgICAgICAgdGhpcy5zaXplc19bMV0gPT09IGlucHV0LnNoYXBlWzFdKSB7XG4gICAgICAgIHNpemVzWzBdID0gdGhpcy5zaXplc19bMl07XG4gICAgICAgIHNpemVzWzFdID0gdGhpcy5zaXplc19bM107XG4gICAgICAgIC8vIGFzc3VtZSBuY2h3IC0+IG5od2NcbiAgICAgICAgaW5wdXQgPSB0Zi50cmFuc3Bvc2UoaW5wdXQsIFswLCAyLCAzLCAxXSk7XG4gICAgICAgIHRyYW5zcG9zZWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICB0aGlzLnNpemVzX1swXSA9PT0gaW5wdXQuc2hhcGVbMF0gJiZcbiAgICAgICAgICB0aGlzLnNpemVzX1szXSA9PT0gaW5wdXQuc2hhcGVbM10pIHtcbiAgICAgICAgLy8gYXNzdW1lIG5od2NcbiAgICAgICAgc2l6ZXNbMF0gPSB0aGlzLnNpemVzX1sxXTtcbiAgICAgICAgc2l6ZXNbMV0gPSB0aGlzLnNpemVzX1syXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICd0Zi5pbWFnZS5yZXNpemUgZG9lc25cXCd0IHN1cHBvcnQgdGhlIHNpemVzIHBhcmFtZXRlci4nKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuc2NhbGVzXyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodGhpcy5zY2FsZXNfWzBdID09PSAxLjAgJiYgdGhpcy5zY2FsZXNfWzFdID09PSAxLjApIHtcbiAgICAgICAgc2l6ZXNbMF0gPSBNYXRoLmZsb29yKGlucHV0LnNoYXBlWzJdICogdGhpcy5zY2FsZXNfWzJdKTtcbiAgICAgICAgc2l6ZXNbMV0gPSBNYXRoLmZsb29yKGlucHV0LnNoYXBlWzNdICogdGhpcy5zY2FsZXNfWzNdKTtcbiAgICAgICAgLy8gYXNzdW1lIG5jaHcgLT4gbmh3Y1xuICAgICAgICBpbnB1dCA9IHRmLnRyYW5zcG9zZShpbnB1dCwgWzAsIDIsIDMsIDFdKTtcbiAgICAgICAgdHJhbnNwb3NlZCA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc2NhbGVzX1swXSA9PT0gMS4wICYmIHRoaXMuc2NhbGVzX1szXSA9PT0gMS4wKSB7XG4gICAgICAgIC8vIGFzc3VtZSBuaHdjXG4gICAgICAgIHNpemVzWzBdID0gTWF0aC5mbG9vcihpbnB1dC5zaGFwZVsxXSAqIHRoaXMuc2NhbGVzX1sxXSk7XG4gICAgICAgIHNpemVzWzFdID0gTWF0aC5mbG9vcihpbnB1dC5zaGFwZVsyXSAqIHRoaXMuc2NhbGVzX1syXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAndGYuaW1hZ2UucmVzaXplIGRvZXNuXFwndCBzdXBwb3J0IHRoZSBzY2FsZXMgcGFyYW1ldGVyLicpO1xuICAgICAgfVxuICAgIH1cbiAgICBsZXQgb3V0cHV0OiB0Zi5UZW5zb3I7XG4gICAgaWYgKHRoaXMubW9kZV8gPT09IE1MSW50ZXJwb2xhdGlvbk1vZGVbJ25lYXJlc3QtbmVpZ2hib3InXSkge1xuICAgICAgb3V0cHV0ID0gdGYuaW1hZ2UucmVzaXplTmVhcmVzdE5laWdoYm9yKGlucHV0LCBzaXplcywgZmFsc2UsIHRydWUpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5tb2RlXyA9PT0gTUxJbnRlcnBvbGF0aW9uTW9kZS5saW5lYXIpIHtcbiAgICAgIG91dHB1dCA9IHRmLmltYWdlLnJlc2l6ZUJpbGluZWFyKGlucHV0LCBzaXplcywgZmFsc2UsIHRydWUpO1xuICAgIH1cbiAgICBpZiAodHJhbnNwb3NlZCkge1xuICAgICAgLy8gbmh3YyAtPiBuY2h3XG4gICAgICBvdXRwdXQgPSB0Zi50cmFuc3Bvc2Uob3V0cHV0LCBbMCwgMywgMSwgMl0pO1xuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0O1xuICB9XG59IiwiaW1wb3J0ICogYXMgdGYgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNTE9wZXJhbmR9IGZyb20gJy4uL29wZXJhbmQnO1xuaW1wb3J0IHtTaW5nbGVPdXRwdXRPcGVyYXRpb259IGZyb20gJy4uL29wZXJhdGlvbic7XG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tICcuLi91dGlscyc7XG5cbmV4cG9ydCBjbGFzcyBSZXNoYXBlIGV4dGVuZHMgU2luZ2xlT3V0cHV0T3BlcmF0aW9uIHtcbiAgcHJpdmF0ZSBpbnB1dF86IE1MT3BlcmFuZDtcbiAgcHJpdmF0ZSBuZXdTaGFwZV86IG51bWJlcltdO1xuXG4gIGNvbnN0cnVjdG9yKGlucHV0OiBNTE9wZXJhbmQsIG5ld1NoYXBlOiBudW1iZXJbXSkge1xuICAgIHN1cGVyKGlucHV0LmJ1aWxkZXIpO1xuICAgIHV0aWxzLnZhbGlkYXRlT3BlcmFuZChpbnB1dCk7XG4gICAgdGhpcy5pbnB1dF8gPSBpbnB1dDtcbiAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgIHV0aWxzLmlzSW50ZWdlckFycmF5KG5ld1NoYXBlKSAmJiBuZXdTaGFwZS5sZW5ndGggIT09IDAsXG4gICAgICAgICdUaGUgbmV3U2hhcGUgcGFyYW1ldGVyIGlzIGludmFsaWQuJyk7XG4gICAgdGhpcy5uZXdTaGFwZV8gPSBuZXdTaGFwZTtcbiAgfVxuXG4gIGlucHV0cygpOiBNTE9wZXJhbmRbXSB7XG4gICAgcmV0dXJuIFt0aGlzLmlucHV0X107XG4gIH1cblxuICBydW4oaW5wdXRUZW5zb3JzOiBNYXA8TUxPcGVyYW5kLCB0Zi5UZW5zb3I+KTogdGYuVGVuc29yIHtcbiAgICBjb25zdCBpbnB1dDogdGYuVGVuc29yID0gaW5wdXRUZW5zb3JzLmdldCh0aGlzLmlucHV0Xyk7XG4gICAgcmV0dXJuIHRmLnJlc2hhcGUoaW5wdXQsIHRoaXMubmV3U2hhcGVfKTtcbiAgfVxufSIsImltcG9ydCAqIGFzIHRmIGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TUxPcGVyYW5kfSBmcm9tICcuLi9vcGVyYW5kJztcbmltcG9ydCB7U2luZ2xlT3V0cHV0T3BlcmF0aW9ufSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi4vdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgU2xpY2UgZXh0ZW5kcyBTaW5nbGVPdXRwdXRPcGVyYXRpb24ge1xuICBwcml2YXRlIGlucHV0XzogTUxPcGVyYW5kO1xuICBwcml2YXRlIHN0YXJ0c186IG51bWJlcltdO1xuICBwcml2YXRlIHNpemVzXzogbnVtYmVyW107XG4gIHByaXZhdGUgYXhlc18/OiBudW1iZXJbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIGlucHV0OiBNTE9wZXJhbmQsIHN0YXJ0czogbnVtYmVyW10sIHNpemVzOiBudW1iZXJbXSwgYXhlcz86IG51bWJlcltdKSB7XG4gICAgc3VwZXIoaW5wdXQuYnVpbGRlcik7XG4gICAgdXRpbHMudmFsaWRhdGVPcGVyYW5kKGlucHV0KTtcbiAgICB0aGlzLmlucHV0XyA9IGlucHV0O1xuICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgdXRpbHMuaXNJbnRlZ2VyQXJyYXkoc3RhcnRzKSwgJ1RoZSBzdGFydHMgcGFyYW1ldGVyIGlzIGludmFsaWQuJyk7XG4gICAgdGhpcy5zdGFydHNfID0gc3RhcnRzO1xuICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgdXRpbHMuaXNJbnRlZ2VyQXJyYXkoc2l6ZXMpICYmIHNpemVzLmV2ZXJ5KHYgPT4gdiA+IDAgfHwgdiA9PT0gLTEpLFxuICAgICAgICAnVGhlIHNpemVzIHBhcmFtZXRlciBpcyBpbnZhbGlkLicpO1xuICAgIHRoaXMuc2l6ZXNfID0gc2l6ZXM7XG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICBzaXplcy5sZW5ndGggPT09IHNpemVzLmxlbmd0aCxcbiAgICAgICAgJ1RoZSBsZW5ndGggb2Ygc2l6ZXMgaXMgbm90IGVxdWFsIHRvIHRoZSBsZW5ndGggb2Ygc2l6ZXMuKSknKTtcbiAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgIGF4ZXMgPT09IHVuZGVmaW5lZCB8fCB1dGlscy5pc0ludGVnZXJBcnJheShheGVzKSxcbiAgICAgICAgJ1RoZSBheGVzIHBhcmFtZXRlciBpcyBpbnZhbGlkLicpO1xuICAgIGlmIChheGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgICBzaXplcy5sZW5ndGggPT09IGF4ZXMubGVuZ3RoLCAnVGhlIGxlbmd0aCBvZiBheGVzIGlzIGludmFsaWQuKSknKTtcbiAgICB9XG4gICAgdGhpcy5heGVzXyA9IGF4ZXM7XG4gIH1cblxuICBpbnB1dHMoKTogTUxPcGVyYW5kW10ge1xuICAgIHJldHVybiBbdGhpcy5pbnB1dF9dO1xuICB9XG5cbiAgcnVuKGlucHV0VGVuc29yczogTWFwPE1MT3BlcmFuZCwgdGYuVGVuc29yPik6IHRmLlRlbnNvciB7XG4gICAgY29uc3QgaW5wdXQ6IHRmLlRlbnNvcjREID0gaW5wdXRUZW5zb3JzLmdldCh0aGlzLmlucHV0XykgYXMgdGYuVGVuc29yNEQ7XG4gICAgY29uc3QgcmFuayA9IGlucHV0LnNoYXBlLmxlbmd0aDtcbiAgICBpZiAodGhpcy5heGVzXyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBhc3N1bWUgYXhlcyBpcyBbMCwgMSwuLi5yLTFdIGlmIGl0IGlzIG5vdCBkZWZpbmVkLlxuICAgICAgdGhpcy5heGVzXyA9IFtdO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByYW5rOyArK2kpIHtcbiAgICAgICAgdGhpcy5heGVzXy5wdXNoKGkpO1xuICAgICAgfVxuICAgIH1cbiAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgIHRoaXMuYXhlc18uZXZlcnkoYXhpcyA9PiBheGlzIDwgcmFuayAmJiBheGlzID49IC1yYW5rKSxcbiAgICAgICAgJ1RoZSB2YWx1ZSBvZiBheGVzIGlzIGludmFsaWQuJyk7XG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICB0aGlzLnN0YXJ0c18ubGVuZ3RoID09PSB0aGlzLmF4ZXNfLmxlbmd0aCxcbiAgICAgICAgJ1RoZSBsZW5ndGggb2Ygc3RhcnRzIGlzIGludmFsaWQuJyk7XG4gICAgdXRpbHMuYXNzZXJ0KFxuICAgICAgICB0aGlzLnNpemVzXy5sZW5ndGggPT09IHRoaXMuYXhlc18ubGVuZ3RoLFxuICAgICAgICAnVGhlIGxlbmd0aCBvZiBzaXplcyBpcyBpbnZhbGlkLicpO1xuXG4gICAgY29uc3QgYmVnaW46IG51bWJlcltdID0gbmV3IEFycmF5KHRoaXMuYXhlc18ubGVuZ3RoKS5maWxsKDApO1xuICAgIGNvbnN0IHNpemU6IG51bWJlcltdID0gbmV3IEFycmF5KHRoaXMuYXhlc18ubGVuZ3RoKS5maWxsKC0xKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuYXhlc18ubGVuZ3RoOyArK2kpIHtcbiAgICAgIGxldCBheGlzID0gdGhpcy5heGVzX1tpXTtcbiAgICAgIGlmIChheGlzIDwgMCkge1xuICAgICAgICBheGlzID0gcmFuayArIGF4aXM7XG4gICAgICB9XG4gICAgICBiZWdpbltheGlzXSA9IHRoaXMuc3RhcnRzX1tpXTtcbiAgICAgIHNpemVbYXhpc10gPSB0aGlzLnNpemVzX1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIHRmLnNsaWNlKGlucHV0LCBiZWdpbiwgc2l6ZSk7XG4gIH1cbn0iLCJpbXBvcnQgKiBhcyB0ZiBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01MT3BlcmFuZH0gZnJvbSAnLi4vb3BlcmFuZCc7XG5pbXBvcnQge1NpbmdsZU91dHB1dE9wZXJhdGlvbn0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJy4uL3V0aWxzJztcblxuZXhwb3J0IGNsYXNzIFNvZnRtYXggZXh0ZW5kcyBTaW5nbGVPdXRwdXRPcGVyYXRpb24ge1xuICBwcml2YXRlIHhfOiBNTE9wZXJhbmQ7XG5cbiAgY29uc3RydWN0b3IoeDogTUxPcGVyYW5kKSB7XG4gICAgc3VwZXIoeC5idWlsZGVyKTtcbiAgICB1dGlscy52YWxpZGF0ZU9wZXJhbmQoeCk7XG4gICAgdGhpcy54XyA9IHg7XG4gIH1cblxuICBpbnB1dHMoKTogTUxPcGVyYW5kW10ge1xuICAgIHJldHVybiBbdGhpcy54X107XG4gIH1cblxuICBydW4oaW5wdXRUZW5zb3JzOiBNYXA8TUxPcGVyYW5kLCB0Zi5UZW5zb3I+KTogdGYuVGVuc29yIHtcbiAgICBjb25zdCB4OiB0Zi5UZW5zb3IgPSBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMueF8pO1xuICAgIGlmICh4LnJhbmsgIT09IDIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIHJhbmsgb2YgeCBwYXJhbWV0ZXIgc2hvdWxkIGJlIDIuJyk7XG4gICAgfVxuICAgIHJldHVybiB0Zi5zb2Z0bWF4KHgpO1xuICB9XG59IiwiaW1wb3J0ICogYXMgdGYgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNTFNwbGl0T3B0aW9uc30gZnJvbSAnLi4vZ3JhcGhfYnVpbGRlcic7XG5pbXBvcnQge01MT3BlcmFuZCwgT3V0cHV0T3BlcmFuZH0gZnJvbSAnLi4vb3BlcmFuZCc7XG5pbXBvcnQge09wZXJhdGlvbn0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJy4uL3V0aWxzJztcblxuZXhwb3J0IGNsYXNzIFNwbGl0IGV4dGVuZHMgT3BlcmF0aW9uIHtcbiAgcHJpdmF0ZSBpbnB1dF86IE1MT3BlcmFuZDtcbiAgcHJpdmF0ZSBzcGxpdHNfOiBudW1iZXJ8bnVtYmVyW107XG4gIHByaXZhdGUgYXhpc18/OiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBpbnB1dDogTUxPcGVyYW5kLCBzcGxpdHM6IG51bWJlcnxudW1iZXJbXSwgb3B0aW9uczogTUxTcGxpdE9wdGlvbnMgPSB7fSkge1xuICAgIHN1cGVyKGlucHV0LmJ1aWxkZXIpO1xuICAgIHV0aWxzLnZhbGlkYXRlT3BlcmFuZChpbnB1dCk7XG4gICAgdGhpcy5pbnB1dF8gPSBpbnB1dDtcbiAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgIHV0aWxzLmlzSW50ZWdlcihzcGxpdHMpIHx8IHV0aWxzLmlzSW50ZWdlckFycmF5KHNwbGl0cyBhcyBudW1iZXJbXSksXG4gICAgICAgICdUaGUgc3BsaXRzIHBhcmFtZXRlciBpcyBpbnZhbGlkLicpO1xuICAgIHRoaXMuc3BsaXRzXyA9IHNwbGl0cztcbiAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgIG9wdGlvbnMuYXhpcyA9PT0gdW5kZWZpbmVkIHx8IHV0aWxzLmlzSW50ZWdlcihvcHRpb25zLmF4aXMpLFxuICAgICAgICAnVGhlIG9wdGlvbnMuYXhpcyBpcyBpbnZhbGlkLicpO1xuICAgIHRoaXMuYXhpc18gPSBvcHRpb25zLmF4aXM7XG5cbiAgICAvLyBQcmVwYXJlIG91dHB1dHMuXG4gICAgY29uc3QgbnVtT3V0cHV0cyA9XG4gICAgICAgIHV0aWxzLmlzSW50ZWdlcihzcGxpdHMpID8gc3BsaXRzIDogKHNwbGl0cyBhcyBudW1iZXJbXSkubGVuZ3RoO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtT3V0cHV0czsgKytpKSB7XG4gICAgICB0aGlzLm91dHB1dHMucHVzaChuZXcgT3V0cHV0T3BlcmFuZCh0aGlzKSk7XG4gICAgfVxuICB9XG5cbiAgaW5wdXRzKCk6IE1MT3BlcmFuZFtdIHtcbiAgICByZXR1cm4gW3RoaXMuaW5wdXRfXTtcbiAgfVxuXG4gIGNvbXB1dGVJbXBsKGlucHV0VGVuc29yczogTWFwPE1MT3BlcmFuZCwgdGYuVGVuc29yPik6IHRmLlRlbnNvcltdIHtcbiAgICBjb25zdCBpbnB1dDogdGYuVGVuc29yID0gaW5wdXRUZW5zb3JzLmdldCh0aGlzLmlucHV0Xyk7XG4gICAgcmV0dXJuIHRmLnNwbGl0KGlucHV0LCB0aGlzLnNwbGl0c18sIHRoaXMuYXhpc18pO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyB0ZiBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01MT3BlcmFuZH0gZnJvbSAnLi4vb3BlcmFuZCc7XG5pbXBvcnQge1NpbmdsZU91dHB1dE9wZXJhdGlvbn0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJy4uL3V0aWxzJztcblxuZXhwb3J0IGNsYXNzIFNxdWVlemUgZXh0ZW5kcyBTaW5nbGVPdXRwdXRPcGVyYXRpb24ge1xuICBwcml2YXRlIGlucHV0XzogTUxPcGVyYW5kO1xuICBwcml2YXRlIGF4ZXNfPzogbnVtYmVyW107XG5cbiAgY29uc3RydWN0b3IoaW5wdXQ6IE1MT3BlcmFuZCwgYXhlcz86IG51bWJlcltdKSB7XG4gICAgc3VwZXIoaW5wdXQuYnVpbGRlcik7XG4gICAgdXRpbHMudmFsaWRhdGVPcGVyYW5kKGlucHV0KTtcbiAgICB0aGlzLmlucHV0XyA9IGlucHV0O1xuICAgIGlmIChheGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHV0aWxzLmFzc2VydChcbiAgICAgICAgICB1dGlscy5pc0ludGVnZXJBcnJheShheGVzKSAmJiBheGVzLmxlbmd0aCAhPT0gMCxcbiAgICAgICAgICAnVGhlIGF4ZXMgcGFyYW1ldGVyIGlzIGludmFsaWQuJyk7XG4gICAgfVxuICAgIHRoaXMuYXhlc18gPSBheGVzO1xuICB9XG5cbiAgaW5wdXRzKCk6IE1MT3BlcmFuZFtdIHtcbiAgICByZXR1cm4gW3RoaXMuaW5wdXRfXTtcbiAgfVxuXG4gIHJ1bihpbnB1dFRlbnNvcnM6IE1hcDxNTE9wZXJhbmQsIHRmLlRlbnNvcj4pOiB0Zi5UZW5zb3Ige1xuICAgIGNvbnN0IGlucHV0OiB0Zi5UZW5zb3IgPSBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMuaW5wdXRfKTtcbiAgICByZXR1cm4gdGYuc3F1ZWV6ZShpbnB1dCwgdGhpcy5heGVzXyk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIHRmIGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TUxPcGVyYW5kfSBmcm9tICcuLi9vcGVyYW5kJztcbmltcG9ydCB7U2luZ2xlT3V0cHV0T3BlcmF0aW9ufSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi4vdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgVHJhbnNwb3NlIGV4dGVuZHMgU2luZ2xlT3V0cHV0T3BlcmF0aW9uIHtcbiAgcHJpdmF0ZSBpbnB1dF86IE1MT3BlcmFuZDtcbiAgcHJpdmF0ZSBwZXJtdXRhdGlvbl8/OiBudW1iZXJbXTtcblxuICBjb25zdHJ1Y3RvcihpbnB1dDogTUxPcGVyYW5kLCBwZXJtdXRhdGlvbj86IG51bWJlcltdKSB7XG4gICAgc3VwZXIoaW5wdXQuYnVpbGRlcik7XG4gICAgdXRpbHMudmFsaWRhdGVPcGVyYW5kKGlucHV0KTtcbiAgICB0aGlzLmlucHV0XyA9IGlucHV0O1xuICAgIGlmIChwZXJtdXRhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB1dGlscy5hc3NlcnQoXG4gICAgICAgICAgdXRpbHMuaXNJbnRlZ2VyQXJyYXkocGVybXV0YXRpb24pICYmIHBlcm11dGF0aW9uLmxlbmd0aCAhPT0gMCxcbiAgICAgICAgICAnVGhlIHBlcm11dGF0aW9uIHBhcmFtZXRlciBpcyBpbnZhbGlkLicpO1xuICAgIH1cbiAgICB0aGlzLnBlcm11dGF0aW9uXyA9IHBlcm11dGF0aW9uO1xuICB9XG5cbiAgaW5wdXRzKCk6IE1MT3BlcmFuZFtdIHtcbiAgICByZXR1cm4gW3RoaXMuaW5wdXRfXTtcbiAgfVxuXG4gIHJ1bihpbnB1dFRlbnNvcnM6IE1hcDxNTE9wZXJhbmQsIHRmLlRlbnNvcj4pOiB0Zi5UZW5zb3Ige1xuICAgIGNvbnN0IGlucHV0OiB0Zi5UZW5zb3IgPSBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMuaW5wdXRfKTtcbiAgICByZXR1cm4gdGYudHJhbnNwb3NlKGlucHV0LCB0aGlzLnBlcm11dGF0aW9uXyk7XG4gIH1cbn0iLCJpbXBvcnQgKiBhcyB0ZiBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01MT3BlcmFuZCwgT3V0cHV0T3BlcmFuZH0gZnJvbSAnLi4vb3BlcmFuZCc7XG5pbXBvcnQge01MT3BlcmF0b3IsIFNpbmdsZU91dHB1dE9wZXJhdGlvbn0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJy4uL3V0aWxzJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFVuYXJ5IGV4dGVuZHMgU2luZ2xlT3V0cHV0T3BlcmF0aW9uIHtcbiAgcHJvdGVjdGVkIHhfOiBNTE9wZXJhbmQ7XG5cbiAgY29uc3RydWN0b3IoeDogTUxPcGVyYW5kKSB7XG4gICAgaWYgKHggIT09IHVuZGVmaW5lZCkge1xuICAgICAgc3VwZXIoeC5idWlsZGVyKTtcbiAgICAgIHV0aWxzLnZhbGlkYXRlT3BlcmFuZCh4KTtcbiAgICAgIHRoaXMueF8gPSB4O1xuICAgIH0gZWxzZSB7XG4gICAgICBzdXBlcih1bmRlZmluZWQpO1xuICAgICAgdGhpcy54XyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBpbnB1dHMoKTogTUxPcGVyYW5kW10ge1xuICAgIHJldHVybiBbdGhpcy54X107XG4gIH1cblxuICBydW4oaW5wdXRUZW5zb3JzOiBNYXA8TUxPcGVyYW5kLCB0Zi5UZW5zb3I+KTogdGYuVGVuc29yIHtcbiAgICBjb25zdCB4OiB0Zi5UZW5zb3IgPSBpbnB1dFRlbnNvcnMuZ2V0KHRoaXMueF8pO1xuICAgIHJldHVybiB0aGlzLnJ1bk9wKHgpO1xuICB9XG5cbiAgYWJzdHJhY3QgcnVuT3AoeDogdGYuVGVuc29yKTogdGYuVGVuc29yO1xufVxuXG5leHBvcnQgY2xhc3MgRXhwIGV4dGVuZHMgVW5hcnkge1xuICBydW5PcCh4OiB0Zi5UZW5zb3IpOiB0Zi5UZW5zb3Ige1xuICAgIHJldHVybiB0Zi5leHAoeCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNxcnQgZXh0ZW5kcyBVbmFyeSB7XG4gIHJ1bk9wKHg6IHRmLlRlbnNvcik6IHRmLlRlbnNvciB7XG4gICAgcmV0dXJuIHRmLnNxcnQoeCk7XG4gIH1cbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFVuYXJ5TUxPcGVyYXRvciBleHRlbmRzIFVuYXJ5IGltcGxlbWVudHMgTUxPcGVyYXRvciB7XG4gIGFwcGx5KHg6IE1MT3BlcmFuZCk6IE91dHB1dE9wZXJhbmQge1xuICAgIHRoaXMuYnVpbGRlcl8gPSB4LmJ1aWxkZXI7XG4gICAgdXRpbHMudmFsaWRhdGVPcGVyYW5kKHgpO1xuICAgIHRoaXMueF8gPSB4O1xuICAgIHRoaXMuY3JlYXRlT3V0cHV0KCk7XG4gICAgcmV0dXJuIHRoaXMub3V0cHV0O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTaWdtb2lkIGV4dGVuZHMgVW5hcnlNTE9wZXJhdG9yIHtcbiAgcnVuT3AoeDogdGYuVGVuc29yKTogdGYuVGVuc29yIHtcbiAgICByZXR1cm4gdGYuc2lnbW9pZCh4KTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVGFuaCBleHRlbmRzIFVuYXJ5TUxPcGVyYXRvciB7XG4gIHJ1bk9wKHg6IHRmLlRlbnNvcik6IHRmLlRlbnNvciB7XG4gICAgcmV0dXJuIHRmLnRhbmgoeCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJlbHUgZXh0ZW5kcyBVbmFyeU1MT3BlcmF0b3Ige1xuICBydW5PcCh4OiB0Zi5UZW5zb3IpOiB0Zi5UZW5zb3Ige1xuICAgIHJldHVybiB0Zi5yZWx1KHgpO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyB0ZiBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtFeHBsaWNpdFBhZGRpbmd9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZS9zcmMvb3BzL2NvbnZfdXRpbCc7XG5cbmltcG9ydCB7TUxBdXRvUGFkLCBNTEJ1ZmZlclZpZXd9IGZyb20gJy4vZ3JhcGhfYnVpbGRlcic7XG5pbXBvcnQge01MT3BlcmFuZCwgTUxPcGVyYW5kRGVzY3JpcHRvciwgTUxPcGVyYW5kVHlwZX0gZnJvbSAnLi9vcGVyYW5kJztcbmltcG9ydCB7QXJyYXlCdWZmZXJWaWV3IGFzIFR5cGVkQXJyYXl9IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0KGV4cHI6IGJvb2xlYW4sIG1zZzogc3RyaW5nKTogdm9pZCB7XG4gIGlmICghZXhwcikge1xuICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0Jvb2xlYW4odmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNJbnRlZ2VyKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIE51bWJlci5pc0ludGVnZXIodmFsdWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNJbnRlZ2VyQXJyYXkoYXJyYXk6IG51bWJlcltdKTogYm9vbGVhbiB7XG4gIHJldHVybiBhcnJheSBpbnN0YW5jZW9mIEFycmF5ICYmIGFycmF5LmV2ZXJ5KHYgPT4gaXNJbnRlZ2VyKHYpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVHlwZWRBcnJheShhcnJheTogTUxCdWZmZXJWaWV3fFdlYkdMVGV4dHVyZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gYXJyYXkgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkgfHwgYXJyYXkgaW5zdGFuY2VvZiBJbnQzMkFycmF5IHx8XG4gICAgICBhcnJheSBpbnN0YW5jZW9mIFVpbnQzMkFycmF5IHx8IGFycmF5IGluc3RhbmNlb2YgSW50MTZBcnJheSB8fFxuICAgICAgYXJyYXkgaW5zdGFuY2VvZiBVaW50MTZBcnJheSB8fCBhcnJheSBpbnN0YW5jZW9mIEludDhBcnJheSB8fFxuICAgICAgYXJyYXkgaW5zdGFuY2VvZiBVaW50OEFycmF5O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHlwZWRBcnJheSh0eXBlOiBNTE9wZXJhbmRUeXBlKTogRmxvYXQzMkFycmF5Q29uc3RydWN0b3J8XG4gICAgSW50MzJBcnJheUNvbnN0cnVjdG9yfFVpbnQzMkFycmF5Q29uc3RydWN0b3J8VWludDE2QXJyYXlDb25zdHJ1Y3RvcnxcbiAgICBJbnQ4QXJyYXlDb25zdHJ1Y3RvcnxVaW50OEFycmF5Q29uc3RydWN0b3Ige1xuICBpZiAodHlwZSA9PT0gJ2Zsb2F0MzInKSB7XG4gICAgcmV0dXJuIEZsb2F0MzJBcnJheTtcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnaW50MzInKSB7XG4gICAgcmV0dXJuIEludDMyQXJyYXk7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3VpbnQzMicpIHtcbiAgICByZXR1cm4gVWludDMyQXJyYXk7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2Zsb2F0MTYnKSB7XG4gICAgcmV0dXJuIFVpbnQxNkFycmF5O1xuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdpbnQ4Jykge1xuICAgIHJldHVybiBJbnQ4QXJyYXk7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3VpbnQ4Jykge1xuICAgIHJldHVybiBVaW50OEFycmF5O1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcignVHlwZSBpcyBub3Qgc3VwcG9ydGVkLicpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbG9uZVR5cGVkQXJyYXkodmFsdWU6IFR5cGVkQXJyYXkpOiBUeXBlZEFycmF5IHtcbiAgbGV0IGFycmF5O1xuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkpIHtcbiAgICBhcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkodmFsdWUubGVuZ3RoKTtcbiAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEludDMyQXJyYXkpIHtcbiAgICBhcnJheSA9IG5ldyBJbnQzMkFycmF5KHZhbHVlLmxlbmd0aCk7XG4gIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBVaW50MzJBcnJheSkge1xuICAgIGFycmF5ID0gbmV3IFVpbnQzMkFycmF5KHZhbHVlLmxlbmd0aCk7XG4gIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBVaW50MTZBcnJheSkge1xuICAgIGFycmF5ID0gbmV3IFVpbnQxNkFycmF5KHZhbHVlLmxlbmd0aCk7XG4gIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBJbnQ4QXJyYXkpIHtcbiAgICBhcnJheSA9IG5ldyBJbnQ4QXJyYXkodmFsdWUubGVuZ3RoKTtcbiAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICBhcnJheSA9IG5ldyBVaW50OEFycmF5KHZhbHVlLmxlbmd0aCk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUeXBlIGlzIG5vdCBzdXBwb3J0ZWQuJyk7XG4gIH1cbiAgYXJyYXkuc2V0KHZhbHVlKTtcbiAgcmV0dXJuIGFycmF5O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGF0YVR5cGUodHlwZTogTUxPcGVyYW5kVHlwZSk6IHRmLkRhdGFUeXBlIHtcbiAgaWYgKHR5cGUgPT09ICdmbG9hdDMyJykge1xuICAgIHJldHVybiAnZmxvYXQzMic7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2ludDMyJykge1xuICAgIHJldHVybiAnaW50MzInO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhlIG9wZXJhbmQgdHlwZSBpcyBub3Qgc3VwcG9ydGVkIGJ5IFRGLmpzLicpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVPcGVyYW5kRGVzY3JpcHRvckZyb21UZW5zb3IodGVuc29yOiB0Zi5UZW5zb3IpOlxuICAgIE1MT3BlcmFuZERlc2NyaXB0b3Ige1xuICBsZXQgdHlwZTogTUxPcGVyYW5kVHlwZTtcbiAgaWYgKHRlbnNvci5kdHlwZSA9PT0gJ2Zsb2F0MzInKSB7XG4gICAgdHlwZSA9IE1MT3BlcmFuZFR5cGUuZmxvYXQzMjtcbiAgfSBlbHNlIGlmICh0ZW5zb3IuZHR5cGUgPT09ICdpbnQzMicpIHtcbiAgICB0eXBlID0gTUxPcGVyYW5kVHlwZS5pbnQzMjtcbiAgfVxuICByZXR1cm4ge3R5cGUsIGRpbWVuc2lvbnM6IHRlbnNvci5zaGFwZX0gYXMgTUxPcGVyYW5kRGVzY3JpcHRvcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlT3BlcmFuZERlc2NyaXB0b3IoZGVzYzogTUxPcGVyYW5kRGVzY3JpcHRvcik6IHZvaWQge1xuICBhc3NlcnQoZGVzYy50eXBlIGluIE1MT3BlcmFuZFR5cGUsICdUaGUgb3BlcmFuZCB0eXBlIGlzIGludmFsaWQuJyk7XG4gIGlmIChkZXNjLmRpbWVuc2lvbnMpIHtcbiAgICBhc3NlcnQoaXNJbnRlZ2VyQXJyYXkoZGVzYy5kaW1lbnNpb25zKSwgJ1RoZSBkaW1lbnNpb25zIGlzIGludmFsaWQuJyk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRHlhbm1pY1NoYXBlKGRpbWVuc2lvbnM6IG51bWJlcltdKTogYm9vbGVhbiB7XG4gIHJldHVybiAhZGltZW5zaW9ucy5ldmVyeSh4ID0+IHggPiAwKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlVHlwZWRBcnJheShcbiAgICB2YWx1ZTogVHlwZWRBcnJheSwgdHlwZTogTUxPcGVyYW5kVHlwZSwgZGltZW5zaW9uczogbnVtYmVyW10pOiB2b2lkIHtcbiAgYXNzZXJ0KGlzVHlwZWRBcnJheSh2YWx1ZSksICdUaGUgdmFsdWUgaXMgbm90IGEgdHlwZWQgYXJyYXkuJyk7XG4gIGFzc2VydCh2YWx1ZSBpbnN0YW5jZW9mIGdldFR5cGVkQXJyYXkodHlwZSksICdUaGUgdHlwZSBvZiB2YWx1ZSBpcyBpbnZhbGlkLicpO1xuICBhc3NlcnQoXG4gICAgICB2YWx1ZS5sZW5ndGggPT09IHNpemVGcm9tRGltZW5zaW9ucyhkaW1lbnNpb25zKSxcbiAgICAgIGB0aGUgdmFsdWUgbGVuZ3RoICR7dmFsdWUubGVuZ3RofSBpcyBpbnZhbGlkLCBzaXplIG9mIGAgK1xuICAgICAgICAgIGBbJHtkaW1lbnNpb25zfV0gJHtzaXplRnJvbURpbWVuc2lvbnMoZGltZW5zaW9ucyl9IGAgK1xuICAgICAgICAgICdpcyBleHBlY3RlZC4nKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlVmFsdWVUeXBlKHZhbHVlOiBudW1iZXIsIHR5cGU6IE1MT3BlcmFuZFR5cGUpOiB2b2lkIHtcbiAgaWYgKHR5cGUgPT09IE1MT3BlcmFuZFR5cGUuaW50MzIpIHtcbiAgICBhc3NlcnQoTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSksICd0aGUgdmFsdWUgaXMgbm90IGFuIGludDMyLicpO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IE1MT3BlcmFuZFR5cGUudWludDMyKSB7XG4gICAgYXNzZXJ0KFxuICAgICAgICBOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKSAmJiB2YWx1ZSA+PSAwLCAndGhlIHZhbHVlIGlzIG5vdCBhbiB1aW50MzIuJyk7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gTUxPcGVyYW5kVHlwZS5pbnQ4KSB7XG4gICAgYXNzZXJ0KFxuICAgICAgICBOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKSAmJiB2YWx1ZSA+PSAtMTI4ICYmIHZhbHVlIDw9IDEyNyxcbiAgICAgICAgJ3RoZSB2YWx1ZSBpcyBub3QgYW4gaW50OC4nKTtcbiAgfSBlbHNlIGlmICh0eXBlID09PSBNTE9wZXJhbmRUeXBlLnVpbnQ4KSB7XG4gICAgYXNzZXJ0KFxuICAgICAgICBOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKSAmJiB2YWx1ZSA+PSAwICYmIHZhbHVlIDw9IDI1NSxcbiAgICAgICAgJ3RoZSB2YWx1ZSBpcyBub3QgYW4gdWludDguJyk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVRlbnNvcihcbiAgICBkZXNjOiBNTE9wZXJhbmREZXNjcmlwdG9yLFxuICAgIHZhbHVlOiBNTEJ1ZmZlclZpZXd8V2ViR0xUZXh0dXJlfG51bWJlcik6IHRmLlRlbnNvciB7XG4gIGNvbnN0IGR0eXBlOiB0Zi5EYXRhVHlwZSA9IGdldERhdGFUeXBlKGRlc2MudHlwZSk7XG4gIGlmIChkZXNjLmRpbWVuc2lvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgIGFzc2VydChcbiAgICAgICAgaXNUeXBlZEFycmF5KHZhbHVlIGFzIE1MQnVmZmVyVmlldyB8IFdlYkdMVGV4dHVyZSksXG4gICAgICAgICdPbmx5IEFycmF5QnVmZmVyVmlldyB2YWx1ZSBpcyBzdXBwb3J0ZWQuJyk7XG4gICAgY29uc3QgYXJyYXkgPSB2YWx1ZSBhcyBUeXBlZEFycmF5O1xuICAgIHZhbGlkYXRlVHlwZWRBcnJheShhcnJheSwgZGVzYy50eXBlLCBkZXNjLmRpbWVuc2lvbnMpO1xuICAgIGNvbnN0IGNsb25lZEFycmF5ID0gY2xvbmVUeXBlZEFycmF5KGFycmF5KTtcbiAgICByZXR1cm4gdGYudGVuc29yKGNsb25lZEFycmF5LCBkZXNjLmRpbWVuc2lvbnMsIGR0eXBlKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgdmFsaWRhdGVWYWx1ZVR5cGUodmFsdWUsIGRlc2MudHlwZSk7XG4gICAgICByZXR1cm4gdGYuc2NhbGFyKHZhbHVlLCBkdHlwZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbGlkYXRlVHlwZWRBcnJheSh2YWx1ZSBhcyBUeXBlZEFycmF5LCBkZXNjLnR5cGUsIGRlc2MuZGltZW5zaW9ucyk7XG4gICAgICByZXR1cm4gdGYuc2NhbGFyKCh2YWx1ZSBhcyBUeXBlZEFycmF5KVswXSwgZHR5cGUpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2l6ZUZyb21EaW1lbnNpb25zKGRpbTogbnVtYmVyW10pOiBudW1iZXIge1xuICBpZiAoZGltID09PSB1bmRlZmluZWQgfHwgKGlzSW50ZWdlckFycmF5KGRpbSkgJiYgZGltLmxlbmd0aCA9PT0gMCkpIHtcbiAgICAvLyBzY2FsYXJcbiAgICByZXR1cm4gMTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZGltLnJlZHVjZShcbiAgICAgICAgKGFjY3VtdWxhdG9yLCBjdXJyZW50VmFsdWUpID0+XG4gICAgICAgICAgICBjdXJyZW50VmFsdWUgPiAwID8gYWNjdW11bGF0b3IgKiBjdXJyZW50VmFsdWUgOiBhY2N1bXVsYXRvcixcbiAgICAgICAgMSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlT3BlcmFuZChpbnB1dDogTUxPcGVyYW5kLCBuYW1lID0gJycpOiB2b2lkIHtcbiAgYXNzZXJ0KFxuICAgICAgaW5wdXQgaW5zdGFuY2VvZiBNTE9wZXJhbmQsIGBUaGUgcGFyYW1ldGVyICR7bmFtZX0gaXMgbm90IGFuIG9wZXJhbmQuYCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZU9wdGlvbmFsT3BlcmFuZChpbnB1dDogTUxPcGVyYW5kLCBuYW1lID0gJycpOiB2b2lkIHtcbiAgYXNzZXJ0KFxuICAgICAgaW5wdXQgPT09IHVuZGVmaW5lZCB8fCBpbnB1dCBpbnN0YW5jZW9mIE1MT3BlcmFuZCxcbiAgICAgIGBUaGUgcGFyYW1ldGVyICR7bmFtZX0gaXMgbm90IGFuIG9wdGlvbmFsIG9wZXJhbmQuYCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUF4ZXMoYXhlczogbnVtYmVyW10sIHJhbms6IG51bWJlcik6IGJvb2xlYW4ge1xuICBpZiAodHlwZW9mIGF4ZXMgIT09ICd1bmRlZmluZWQnICYmIGF4ZXMubGVuZ3RoID4gMCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXhlcy5sZW5ndGg7ICsraSkge1xuICAgICAgaWYgKGF4ZXNbaV0gPj0gcmFuayB8fCBheGVzW2ldIDwgLXJhbmspIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFBhZGRpbmdzKFxuICAgIGlucHV0OiB0Zi5UZW5zb3I0RCwgZmlsdGVyOiB0Zi5UZW5zb3I0RCxcbiAgICBwYWRkaW5nOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgc3RyaWRlczogW251bWJlciwgbnVtYmVyXSxcbiAgICBvdXRwdXRQYWRkaW5nOiBbbnVtYmVyLCBudW1iZXJdLCBkaWxhdGlvbnM6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgYXV0b1BhZDogTUxBdXRvUGFkKTogJ3ZhbGlkJ3wnc2FtZSd8RXhwbGljaXRQYWRkaW5nIHtcbiAgLy8gV2ViTk4gcGFkZGluZzpcbiAgLy8gICBbYmVnaW5uaW5nX2hlaWdodCwgZW5kaW5nX2hlaWdodCwgYmVnaW5uaW5nX3dpZHRoLCBlbmRpbmdfd2lkdGhdXG4gIC8vIHRmLmNvbnYyZCBOSFdDIHNob3VsZCBiZSBpbiB0aGUgZm9sbG93aW5nIGZvcm06XG4gIC8vICAgW1swLCAwXSwgW3BhZF90b3AscGFkX2JvdHRvbV0sIFtwYWRfbGVmdCwgcGFkX3JpZ2h0XSwgWzAsIDBdXVxuICBsZXQgcmVzdWx0UGFkZGluZzogJ3ZhbGlkJ3wnc2FtZSd8RXhwbGljaXRQYWRkaW5nO1xuICBpZiAoYXV0b1BhZCA9PT0gTUxBdXRvUGFkLmV4cGxpY2l0KSB7XG4gICAgaWYgKHBhZGRpbmcuZXZlcnkodiA9PiB2ID09PSAwKSkge1xuICAgICAgcmVzdWx0UGFkZGluZyA9ICd2YWxpZCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdFBhZGRpbmcgPSBbXG4gICAgICAgIFswLCAwXSwgW3BhZGRpbmdbMF0sIHBhZGRpbmdbMV1dLCBbcGFkZGluZ1syXSwgcGFkZGluZ1szXV0sIFswLCAwXVxuICAgICAgXSBhcyBFeHBsaWNpdFBhZGRpbmc7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChhdXRvUGFkID09PSBNTEF1dG9QYWRbJ3NhbWUtdXBwZXInXSkge1xuICAgICAgcmVzdWx0UGFkZGluZyA9ICdzYW1lJztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBleHBsaWNpdCBwYWRkaW5ncyBmb3IgJ3NhbWUtbG93ZXInXG4gICAgICByZXN1bHRQYWRkaW5nID0gW1swLCAwXSwgWzAsIDBdLCBbMCwgMF0sIFswLCAwXV07XG4gICAgICBjb25zdCBvdXRwdXRTaXplcyA9IFswLCAwXTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMjsgKytpKSB7XG4gICAgICAgIG91dHB1dFNpemVzW2ldID0gTWF0aC5jZWlsKGlucHV0LnNoYXBlWzEgKyBpXSAvIHN0cmlkZXNbaV0pO1xuICAgICAgfVxuICAgICAgY29uc3QgdG90YWxQYWRkaW5nOiBbbnVtYmVyLCBudW1iZXJdID0gWzAsIDBdO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAyOyArK2kpIHtcbiAgICAgICAgdG90YWxQYWRkaW5nW2ldID0gc3RyaWRlc1tpXSAqIChvdXRwdXRTaXplc1tpXSAtIDEpICsgb3V0cHV0UGFkZGluZ1tpXSArXG4gICAgICAgICAgICAoKGZpbHRlci5zaGFwZVtpXSAtIDEpICogZGlsYXRpb25zW2ldICsgMSkgLSBpbnB1dC5zaGFwZVsxICsgaV07XG4gICAgICB9XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDI7ICsraSkge1xuICAgICAgICByZXN1bHRQYWRkaW5nW2kgKyAxXVswXSA9XG4gICAgICAgICAgICB0b3RhbFBhZGRpbmdbaV0gLSBNYXRoLmZsb29yKHRvdGFsUGFkZGluZ1tpXSAvIDIpO1xuICAgICAgICByZXN1bHRQYWRkaW5nW2kgKyAxXVsxXSA9IE1hdGguZmxvb3IodG90YWxQYWRkaW5nW2ldIC8gMik7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHRQYWRkaW5nO1xufSJdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file diff --git a/html/tflite-webnn-deeplab/index.html b/html/tflite-webnn-deeplab/index.html index d4df267..1c89c3c 100644 --- a/html/tflite-webnn-deeplab/index.html +++ b/html/tflite-webnn-deeplab/index.html @@ -805,7 +805,7 @@ - +